From e755849e18f22bca699e6cc79bf4086abbf61627 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 22 Jun 2026 17:57:26 +0800 Subject: [PATCH 1/6] Improve README product positioning --- README.md | 39 +++++++++++++++++-- ...026-06-22-17-40-CST-readme-feature-copy.md | 31 +++++++++++++++ ...26-06-22-17-43-CST-readme-resource-copy.md | 29 ++++++++++++++ 3 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 docs/plans/2026-06-22-17-40-CST-readme-feature-copy.md create mode 100644 docs/plans/2026-06-22-17-43-CST-readme-resource-copy.md diff --git a/README.md b/README.md index bdb3f118..2920d048 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,42 @@ **The agent console for tinkerers.** -- Connect your OpenClaw and run multiple agent threads side by side -- Manage your todo lists and data tables (like Notion) through conversation -- Fully open-source: frontend, backend, iOS, and Android +Bricks helps you run AI work across conversations, OpenClaw nodes, and durable workspace resources. + +## What Bricks does today + +- Capture useful information from chat as todos, tables, notes, and highlights +- Keep different topics separated with channels and threads, like Discord +- Connect OpenClaw and route messages to specific agent nodes +- Configure AI model providers, channel instructions, thread instructions, and node tokens +- Automate recurring agent tasks on a schedule +- Fully open source: Flutter app, Node backend, mobile clients, docs, and plugin runtime + +## What you can save + +Bricks keeps useful information available after the chat moves on. + +- **Todo Lists** - Project checklists, follow-up tasks, meeting actions, and homework plans. +- **Tables** - Comparison matrices, research trackers, lead lists, bug triage, and planning data. +- **Notes** - Research summaries, reusable instructions, generated reports, study notes, and specs. +- **Highlights** - Important facts, decisions, quotes, references, and snippets worth keeping. + +## Screenshots + +Screenshots coming soon. + + + +## What's on the roadmap + +- Richer note content, including purpose-specific charts, diagrams, and examples +- Grammar issue collection for review, reuse, and analysis +- Website artifacts for saving generated pages and interactive previews +- Charts for turning structured data into visual summaries +- Motion outputs for animation, timing, and visual storytelling +- GitHub integration for issues, pull requests, and repository workflows + +[Tell us your story or request a feature](https://github.com/askman-dev/bricks/issues/new) ## Documentation diff --git a/docs/plans/2026-06-22-17-40-CST-readme-feature-copy.md b/docs/plans/2026-06-22-17-40-CST-readme-feature-copy.md new file mode 100644 index 00000000..bb4a0c9e --- /dev/null +++ b/docs/plans/2026-06-22-17-40-CST-readme-feature-copy.md @@ -0,0 +1,31 @@ +# README Feature Copy + +## Background + +The README opening currently lists only a few capabilities and does not clearly separate shipped Bricks features from future roadmap ideas. The product positioning line "The agent console for tinkerers." should remain. + +## Goals + +- Keep the opening tagline. +- Add a `What Bricks does today` section for currently implemented product capabilities. +- Add a screenshots area that can receive images later. +- Add a roadmap section that is clearly future-facing. + +## Implementation Plan + +1. Rewrite the README opening bullets under a new `What Bricks does today` heading. +2. Add a `Screenshots` placeholder section without committing image assets. +3. Add a short `What's on the roadmap` section for known future directions. +4. Leave setup and documentation links unchanged. + +## Acceptance Criteria + +- README keeps "The agent console for tinkerers." +- README includes `## What Bricks does today`. +- README includes a screenshot placeholder section. +- README includes a roadmap section separate from shipped features. +- No source code behavior changes. + +## Validation Commands + +- `sed -n '1,140p' README.md` diff --git a/docs/plans/2026-06-22-17-43-CST-readme-resource-copy.md b/docs/plans/2026-06-22-17-43-CST-readme-resource-copy.md new file mode 100644 index 00000000..60cfad98 --- /dev/null +++ b/docs/plans/2026-06-22-17-43-CST-readme-resource-copy.md @@ -0,0 +1,29 @@ +# README Resource Copy + +## Background + +Bricks resources are a differentiating product area because the app turns chat output into durable workspace objects instead of leaving everything inside a linear conversation. The README should explain each resource type with a short description and practical use cases. + +## Goals + +- Add a dedicated resource section to the README. +- Describe each current resource type in product-facing language. +- Include concrete use cases for each resource. +- Keep roadmap-only resource ideas separate from shipped resources. + +## Implementation Plan + +1. Add a `Resources` section after `What Bricks does today`. +2. List Todo Lists, Tables, Notes, and Highlights with descriptions and use cases. +3. Keep the existing screenshot, roadmap, documentation, docs site, and setup sections intact. + +## Acceptance Criteria + +- README explains why resources matter to Bricks. +- README lists each current resource type with use cases. +- README does not present roadmap-only ideas as shipped features. +- No source code behavior changes. + +## Validation Commands + +- `sed -n '1,180p' README.md` From 903bbd2da1d519b0d0196cbc72f170863d9d3b26 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 22 Jun 2026 18:06:18 +0800 Subject: [PATCH 2/6] Migrate docs to tasks lifecycle --- .../change-implementation-plan/SKILL.md | 11 +- AGENTS.md | 8 +- .../2026-05-26-scheduled-agent-tasks.md | 13 - .../2026-05-26-scriptable-agent-pipelines.md | 18 -- docs/code_maps/logic_map.yaml | 96 +++---- ...04-01-07-04-UTC-model-settings-save-fix.md | 24 -- ...026-04-01-07-06-sidebar-navigation-page.md | 28 -- ...04-01-07-10-UTC-is-default-number-style.md | 23 -- ...07-19-UTC-pr77-inline-comments-followup.md | 25 -- ...07-23-UTC-strict-is-default-number-only.md | 20 -- ...UTC-navigation-page-animation-direction.md | 18 -- ...1-08-13-UTC-model-save-failure-bool-fix.md | 33 --- ...-08-14-UTC-model-settings-delete-button.md | 29 --- ...1-08-17-UTC-chat-real-model-integration.md | 25 -- ...8-56-UTC-model-is-default-number-format.md | 22 -- ...09-00-UTC-local-env-gaps-and-validation.md | 19 -- ...22-UTC-backend-is-default-normalization.md | 28 -- docs/plans/2026-04-01-09-45-UTC.md | 26 -- .../2026-04-01-10-52-UTC-libsql-now-fix.md | 18 -- ...26-04-01-10-59-UTC-vercel-log-retrieval.md | 28 -- ...07-UTC-vercel-api-last10-logs-and-skill.md | 30 --- ...39-UTC-agentsmd-api-debug-skill-routing.md | 20 -- ...26-04-01-12-55-UTC-chat-send-no-request.md | 21 -- ...46-UTC-chat-send-session-error-handling.md | 18 -- ...-14-52-UTC-platform-environment-web-fix.md | 18 -- ...37-UTC-session-runtime-config-selection.md | 19 -- ...hub-review-thread-resolver-and-init-env.md | 39 --- ...26-04-01-15-56-UTC-pr91-review-comments.md | 19 -- ...-16-03-UTC-pr92-review-comment-followup.md | 32 --- ...TC-backend-llm-fallback-for-user-config.md | 19 -- ...-16-15-UTC-bash-not-posix-clarification.md | 22 -- ...-26-UTC-pr-review-findings-auto-trigger.md | 24 -- ...-01-16-59-UTC-pr93-conflict-free-branch.md | 20 -- ...TC-llm-chat-root-cause-and-key-handling.md | 23 -- ...-pr-review-thread-auto-resolver-comment.md | 34 --- ...9-24-UTC-chat-ui-navigation-adjustments.md | 27 -- ...-02-56-UTC-oauth-dynamic-preview-return.md | 35 --- ...2-04-38-UTC-github-return-to-validation.md | 19 -- docs/plans/2026-04-02-06-06-UTC.md | 31 --- ...04-02-06-19-UTC-composer-unified-border.md | 18 -- ...26-04-02-07-09-UTC-drawer-top-alignment.md | 21 -- ...-02-07-11-UTC-composer-bar-button-style.md | 20 -- ...TC-ai-provider-smoke-test-secret-if-fix.md | 21 -- ...07-52-UTC-node24-actions-migration-plan.md | 24 -- ...flare-github-app-review-thread-resolver.md | 52 ---- ...026-04-02-09-09-UTC-sidebar-back-button.md | 20 -- ...-40-UTC-github-webhook-cloudflare-skill.md | 35 --- ...-13-25-UTC-sidebar-close-on-back-button.md | 21 -- ...UTC-chat-navigation-drawer-only-cleanup.md | 21 -- ...-02-15-20-UTC-vercel-oauth-log-analysis.md | 33 --- ...15-30-UTC-oauth-cross-origin-token-loss.md | 45 ---- ...-00-10-UTC-oauth-cross-domain-login-fix.md | 33 --- ...03-38-UTC-sidebar-back-button-alignment.md | 26 -- ...03-04-10-UTC-api-key-visual-hint-merged.md | 26 -- ...-03-UTC-multi-agent-channel-arbitration.md | 86 ------ ...annel-thread-session-and-default-skills.md | 97 ------- ...annel-thread-session-and-arbitration-ux.md | 37 --- ...34-UTC-pr117-unimplemented-bot-registry.md | 28 -- ...pr117-review-comment-gap-implementation.md | 30 --- ...TC-pr117-fullstack-review-and-hardening.md | 23 -- ...07-03-01-UTC-navigation-sidebar-buttons.md | 25 -- ...-07-03-22-UTC-channel-button-relocation.md | 24 -- ...-07-03-50-UTC-navigation-agents-sidebar.md | 48 ---- ...4-27-UTC-research-reconnect-sync-button.md | 24 -- ...-31-UTC-remove-reconnect-sync-simulator.md | 25 -- ...-04-35-UTC-chat-history-persistence-fix.md | 19 -- ...11-UTC-backend-chat-history-persistence.md | 22 -- ...UTC-async-chat-transport-rearchitecture.md | 28 -- ...-fix-chat-session-migration-sqlite-cast.md | 25 -- ...hat-history-context-and-persistence-fix.md | 37 --- ...kend-owned-chat-persistence-and-context.md | 30 --- ...move-chat-context-bar-impact-assessment.md | 47 ---- ...39-UTC-remove-simulated-reconnect-entry.md | 29 --- ...026-04-08-02-34-UTC-channel-subsections.md | 73 ------ ...026-04-08-02-40-UTC-code-map-foundation.md | 41 --- ...hat-history-load-window-and-auto-scroll.md | 28 -- ...move-chat-debug-info-into-composer-menu.md | 35 --- ...-03-47-UTC-chat-open-auto-scroll-latest.md | 21 -- ...-UTC-sidebar-channel-click-white-screen.md | 32 --- ...-09-05-48-UTC-chat-interaction-simplify.md | 32 --- ...26-04-09-06-02-UTC-ai-bubble-full-width.md | 22 -- ...10-48-UTC-channel-persistence-hydration.md | 28 -- ...-04-10-01-10-UTC-menu-animation-speedup.md | 20 -- ...2026-04-10-04-39-UTC-channel-management.md | 25 -- ...w-plugin-platform-api-and-settings-copy.md | 34 --- ...14-03-31-UTC-address-pr-review-comments.md | 5 - ...omment-followup-unified-messages-events.md | 5 - ...-UTC-implementation-doc-alignment-check.md | 18 -- ...-UTC-openclaw-gap-audit-and-token-chain.md | 29 --- ...TC-move-openclaw-token-to-settings-item.md | 20 -- ...UTC-node-openclaw-plugin-implementation.md | 33 --- ...04-16-12-00-UTC-branch-db-diff-analysis.md | 21 -- ...12-20-UTC-api-feature-db-impact-recheck.md | 20 -- ...-UTC-main-worktree-feature-logic-review.md | 21 -- ...UTC-plugin-development-architecture-doc.md | 20 -- ...-UTC-node-openclaw-plugin-jwt-hardening.md | 30 --- ...16-22-15-UTC-openclaw-onboarding-enable.md | 29 --- ...7-02-22-UTC-address-pr-review-followups.md | 22 -- ...-UTC-openclaw-channel-plugin-conversion.md | 29 --- ...-07-29-UTC-openclaw-router-default-plan.md | 65 ----- ...29-UTC-request-performance-improvements.md | 244 ------------------ ...-openclaw-message-routing-current-state.md | 55 ---- ...26-04-18-03-19-UTC-ai-message-no-bubble.md | 18 -- ...18-08-10-UTC-channel-rename-persistence.md | 32 --- ...6-04-18-09-29-UTC-ai-markdown-rendering.md | 38 --- ...-chat-stream-order-and-completeness-fix.md | 28 -- ...15-06-UTC-chat-router-button-relocation.md | 24 -- ...15-09-UTC-chat-send-flow-simplification.md | 24 -- ...11-46-UTC-openclaw-history-ordering-fix.md | 19 -- ...-UTC-openclaw-install-instructions-redo.md | 37 --- ...enclaw-install-instructions-branch-redo.md | 32 --- ...20-05-19-UTC-message-order-bug-analysis.md | 98 ------- ...-07-14-UTC-message-order-root-cause-fix.md | 34 --- ...20-07-54-UTC-user-query-delivery-status.md | 22 -- ...-08-57-UTC-controlled-user-query-commit.md | 22 -- ...0-UTC-openclaw-accountid-userid-scoping.md | 15 -- ...-UTC-openclaw-reply-failure-db-analysis.md | 191 -------------- ...TC-platform-ack-scaling-dialect-cleanup.md | 34 --- ...UTC-multi-node-plugin-routing-blueprint.md | 135 ---------- ...-04-20-19-36-UTC-chat-sync-long-polling.md | 36 --- ...12-UTC-multi-node-plugin-implementation.md | 34 --- .../2026-04-21-01-07-UTC-chat-sync-sse.md | 87 ------- ...23-UTC-openclaw-network-retry-hardening.md | 31 --- ...C-thread-channel-router-menu-adjustment.md | 20 -- ...05-36-UTC-openclaw-plugin-refresh-skill.md | 36 --- ...C-chat-header-subsection-switcher-merge.md | 33 --- ...57-UTC-readme-refresh-consolidated-plan.md | 28 -- ...0-UTC-respond-async-delivery-indicators.md | 39 --- ...-12-37-UTC-router-switch-toast-behavior.md | 19 -- ...-43-UTC-router-menu-checkmark-selection.md | 20 -- .../2026-04-21-14-45-UTC-chat-appbar-bg.md | 16 -- ...5-UTC-user-bubble-metadata-context-menu.md | 40 --- ...2-03-03-UTC-agent-bot-sidebar-blueprint.md | 48 ---- ...3-04-UTC-remove-readme-packages-section.md | 23 -- ...3-44-UTC-router-linked-composer-actions.md | 34 --- ...3-UTC-streaming-output-120k-merged-plan.md | 36 --- ...55-UTC-agent-bot-sidebar-implementation.md | 36 --- ...-22-07-20-UTC-chat-agent-ui-adjustments.md | 38 --- ...-UTC-remove-top-active-agents-indicator.md | 23 -- ...-08-08-UTC-openclaw-plugin-publish-plan.md | 93 ------- ...-UTC-openclaw-plugin-publish-prep-skill.md | 46 ---- ...8-41-UTC-rate-limit-global-optimization.md | 47 ---- ...TC-openclaw-plugin-public-release-final.md | 92 ------- ...2026-04-22-09-24-UTC-chat-web-build-fix.md | 23 -- .../2026-04-22-09-49-UTC-pr-chat-ui-check.md | 31 --- ...enclaw-route-actions-and-sidebar-groups.md | 32 --- ...UTC-ios-build-enablement-implementation.md | 154 ----------- ...4-23-03-37-UTC-node-management-token-ui.md | 33 --- ...26-04-23-10-45-WIB-ios-github-login-fix.md | 60 ----- ...7-WIB-node-token-copy-openclaw-commands.md | 68 ----- ...-11-29-WIB-release-api-base-url-default.md | 47 ---- ...6-04-23-14-42-openclaw-package-metadata.md | 31 --- ...23-15-33-openclaw-selected-node-routing.md | 41 --- ...-13-WIB-openclaw-agents-capture-display.md | 77 ------ ...04-24-12-15-dispatch-avatar-placeholder.md | 24 -- ...tch-to-message-bubble-background-branch.md | 34 --- ...-04-26-02-45-UTC-jump-to-latest-message.md | 25 -- ...2-45-dark-theme-semantic-token-refactor.md | 35 --- ...7-39-UTC-message-typography-placeholder.md | 17 -- ...onflict-sync-and-placeholder-adjustment.md | 20 -- ...10-20-UTC-docusaurus-doc-ia-restructure.md | 32 --- ...jump-button-threshold-and-scroll-target.md | 25 -- ...-12-03-UTC-chat-bubble-contrast-spacing.md | 26 -- ...C-dark-composer-visual-unification-todo.md | 78 ------ ...6-12-19-docs-subpath-vercel-integration.md | 37 --- ...3-20-UTC-docusaurus-site-implementation.md | 33 --- ...-05-UTC-move-docusaurus-site-under-apps.md | 29 --- .../2026-04-26-23-24-+08-chat-dark-colors.md | 31 --- ...26-04-27-00-04-+08-pr-branch-sync-skill.md | 22 -- ...00-19-+08-design-system-token-alignment.md | 23 -- ...026-04-27-00-27-+08-design-system-skill.md | 21 -- ...27-00-40-+08-responsive-sidebar-surface.md | 23 -- ...26-04-27-00-42-+08-quiet-composer-focus.md | 19 -- ...-51-+08-composer-action-color-alignment.md | 20 -- ...-13-47-UTC-light-mode-color-adjustments.md | 28 -- ...4-27-17-28-UTC-markdown-table-rendering.md | 26 -- ...8-17-26-+08-bricks-issue-template-skill.md | 26 -- ...49-+08-change-implementation-plan-skill.md | 34 --- ...01-+08-issue-template-background-update.md | 32 --- ...22-UTC-chat-appbar-channel-section-menu.md | 21 -- ...-16-29-UTC-pc-sidebar-inline-navigation.md | 24 -- ...8-desktop-channel-navigation-stays-open.md | 33 --- ...-30-17-51-+08-scope-instructions-config.md | 49 ---- ...3-UTC-default-router-agent-architecture.md | 57 ---- ...openclaw-default-router-agent-benchmark.md | 105 -------- ...-UTC-default-router-builtin-node-coding.md | 36 --- ...9-+08-branch-feature-checklist-analysis.md | 32 --- ...-05-06-22-42-+08-router-strategy-rename.md | 58 ----- ...22-44-+08-post-router-refactor-followup.md | 74 ------ ...fix-ios-photo-library-usage-description.md | 15 -- ...026-05-08-08-43-UTC-composer-focus-keep.md | 22 -- ...09-44-UTC-fix-channel-name-refresh-loss.md | 18 -- ...-13-46-UTC-disable-navigation-tab-swipe.md | 26 -- ...26-05-09-05-45-streaming-scroll-ux-plan.md | 24 -- ...-10-UTC-chat-navigation-swipe-follow-up.md | 21 -- ...-10-40-UTC-agent-loop-internal-tools-p0.md | 64 ----- ...5-15-16-21-+08-chat-scroll-position-gwt.md | 240 ----------------- ...6-05-15-16-54-+08-local-chat-fixture-db.md | 51 ---- ...-evidence-driven-browser-test-env-skill.md | 43 --- ...02-20-+00-todos-tables-highlights-tools.md | 160 ------------ ...16-08-13-+00-highlight-floating-toolbar.md | 105 -------- ...+00-resources-tab-in-navigation-sidebar.md | 73 ------ ...16-17-40-+08-ios-testflight-pr-workflow.md | 47 ---- ...8-+08-mobile-agents-directory-setup-fix.md | 40 --- ...-05-16-22-43-+08-ios-debug-api-base-url.md | 36 --- ...23-21-+08-ios-sandbox-path-without-home.md | 35 --- ...able-tool-error-and-turso-compatibility.md | 99 ------- docs/plans/2026-05-18-17-43-CST-ios-build.md | 50 ---- ...8-22-22-+08-highlight-selection-offsets.md | 35 --- ...50-+08-unified-authenticated-api-client.md | 91 ------- ...1-55-+08-highlight-toolbar-union-ranges.md | 63 ----- ...ighlight-list-and-auth-api-architecture.md | 63 ----- ...5-19-14-27-CST-tool-call-thinking-group.md | 36 --- ...-06-CST-navigation-resources-highlights.md | 35 --- ...-05-19-17-38-CST-subsection-rename-menu.md | 36 --- ...26-05-20-11-13-CST-local-cloud-db-debug.md | 38 --- ...-05-21-10-41-CST-channel-new-ui-harness.md | 46 ---- ...03-CST-evidence-checkpoint-testing-docs.md | 40 --- ...-21-12-09-CST-scope-config-thread-label.md | 61 ----- ...12-38-CST-local-manual-ai-test-env-docs.md | 43 --- ...5-21-14-17-CST-evidence-case-loop-skill.md | 37 --- ...T-channel-dropdown-height-evidence-case.md | 35 --- ...26-05-21-15-49-CST-local-llm-env-config.md | 46 ---- .../2026-05-21-15-55-CST-thread-menu-copy.md | 34 --- ...09-CST-thread-sync-and-thinking-details.md | 41 --- ...-16-43-CST-agent-loop-limit-empty-final.md | 32 --- ...16-48-CST-sidebar-resize-composer-focus.md | 29 --- ...-13-CST-sse-topology-refresh-rate-limit.md | 34 --- ...5-21-17-23-CST-typed-chat-invalidations.md | 44 ---- ...3-CST-agent-loop-empty-final-root-cause.md | 73 ------ ...1-18-06-CST-agent-loop-real-stop-reason.md | 32 --- ...05-21-19-57-CST-thread-auto-name-source.md | 42 --- ...4-CST-scheduled-actions-agent-execution.md | 105 -------- ...026-06-17-child-homework-task-breakdown.md | 19 ++ ...6-06-17-grammar-bug-collection-database.md | 13 + ...7-note-purpose-specific-charts-examples.md | 13 + ...selection-toolbar-translate-and-explain.md | 15 ++ ...-openclaw-message-routing-current-state.md | 2 +- ...-25-11-14-fix-openclaw-agents-500-error.md | 0 ...026-05-26-02-30-resource-batch-add-rows.md | 0 ...026-05-26-10-20-pr-266-review-follow-up.md | 0 ...32-+08-note-content-type-implementation.md | 0 ...026-06-22-17-40-CST-readme-feature-copy.md | 0 ...26-06-22-17-43-CST-readme-resource-copy.md | 0 244 files changed, 122 insertions(+), 8983 deletions(-) delete mode 100644 docs/backlog/2026-05-26-scheduled-agent-tasks.md delete mode 100644 docs/backlog/2026-05-26-scriptable-agent-pipelines.md delete mode 100644 docs/plans/2026-04-01-07-04-UTC-model-settings-save-fix.md delete mode 100644 docs/plans/2026-04-01-07-06-sidebar-navigation-page.md delete mode 100644 docs/plans/2026-04-01-07-10-UTC-is-default-number-style.md delete mode 100644 docs/plans/2026-04-01-07-19-UTC-pr77-inline-comments-followup.md delete mode 100644 docs/plans/2026-04-01-07-23-UTC-strict-is-default-number-only.md delete mode 100644 docs/plans/2026-04-01-08-11-UTC-navigation-page-animation-direction.md delete mode 100644 docs/plans/2026-04-01-08-13-UTC-model-save-failure-bool-fix.md delete mode 100644 docs/plans/2026-04-01-08-14-UTC-model-settings-delete-button.md delete mode 100644 docs/plans/2026-04-01-08-17-UTC-chat-real-model-integration.md delete mode 100644 docs/plans/2026-04-01-08-56-UTC-model-is-default-number-format.md delete mode 100644 docs/plans/2026-04-01-09-00-UTC-local-env-gaps-and-validation.md delete mode 100644 docs/plans/2026-04-01-09-22-UTC-backend-is-default-normalization.md delete mode 100644 docs/plans/2026-04-01-09-45-UTC.md delete mode 100644 docs/plans/2026-04-01-10-52-UTC-libsql-now-fix.md delete mode 100644 docs/plans/2026-04-01-10-59-UTC-vercel-log-retrieval.md delete mode 100644 docs/plans/2026-04-01-11-07-UTC-vercel-api-last10-logs-and-skill.md delete mode 100644 docs/plans/2026-04-01-12-39-UTC-agentsmd-api-debug-skill-routing.md delete mode 100644 docs/plans/2026-04-01-12-55-UTC-chat-send-no-request.md delete mode 100644 docs/plans/2026-04-01-13-46-UTC-chat-send-session-error-handling.md delete mode 100644 docs/plans/2026-04-01-14-52-UTC-platform-environment-web-fix.md delete mode 100644 docs/plans/2026-04-01-15-37-UTC-session-runtime-config-selection.md delete mode 100644 docs/plans/2026-04-01-15-55-UTC-github-review-thread-resolver-and-init-env.md delete mode 100644 docs/plans/2026-04-01-15-56-UTC-pr91-review-comments.md delete mode 100644 docs/plans/2026-04-01-16-03-UTC-pr92-review-comment-followup.md delete mode 100644 docs/plans/2026-04-01-16-07-UTC-backend-llm-fallback-for-user-config.md delete mode 100644 docs/plans/2026-04-01-16-15-UTC-bash-not-posix-clarification.md delete mode 100644 docs/plans/2026-04-01-16-26-UTC-pr-review-findings-auto-trigger.md delete mode 100644 docs/plans/2026-04-01-16-59-UTC-pr93-conflict-free-branch.md delete mode 100644 docs/plans/2026-04-01-18-00-UTC-llm-chat-root-cause-and-key-handling.md delete mode 100644 docs/plans/2026-04-01-18-32-UTC-pr-review-thread-auto-resolver-comment.md delete mode 100644 docs/plans/2026-04-01-19-24-UTC-chat-ui-navigation-adjustments.md delete mode 100644 docs/plans/2026-04-02-02-56-UTC-oauth-dynamic-preview-return.md delete mode 100644 docs/plans/2026-04-02-04-38-UTC-github-return-to-validation.md delete mode 100644 docs/plans/2026-04-02-06-06-UTC.md delete mode 100644 docs/plans/2026-04-02-06-19-UTC-composer-unified-border.md delete mode 100644 docs/plans/2026-04-02-07-09-UTC-drawer-top-alignment.md delete mode 100644 docs/plans/2026-04-02-07-11-UTC-composer-bar-button-style.md delete mode 100644 docs/plans/2026-04-02-07-51-UTC-ai-provider-smoke-test-secret-if-fix.md delete mode 100644 docs/plans/2026-04-02-07-52-UTC-node24-actions-migration-plan.md delete mode 100644 docs/plans/2026-04-02-08-34-UTC-cloudflare-github-app-review-thread-resolver.md delete mode 100644 docs/plans/2026-04-02-09-09-UTC-sidebar-back-button.md delete mode 100644 docs/plans/2026-04-02-09-40-UTC-github-webhook-cloudflare-skill.md delete mode 100644 docs/plans/2026-04-02-13-25-UTC-sidebar-close-on-back-button.md delete mode 100644 docs/plans/2026-04-02-13-30-UTC-chat-navigation-drawer-only-cleanup.md delete mode 100644 docs/plans/2026-04-02-15-20-UTC-vercel-oauth-log-analysis.md delete mode 100644 docs/plans/2026-04-02-15-30-UTC-oauth-cross-origin-token-loss.md delete mode 100644 docs/plans/2026-04-03-00-10-UTC-oauth-cross-domain-login-fix.md delete mode 100644 docs/plans/2026-04-03-03-38-UTC-sidebar-back-button-alignment.md delete mode 100644 docs/plans/2026-04-03-04-10-UTC-api-key-visual-hint-merged.md delete mode 100644 docs/plans/2026-04-03-05-03-UTC-multi-agent-channel-arbitration.md delete mode 100644 docs/plans/2026-04-03-09-26-UTC-async-task-channel-thread-session-and-default-skills.md delete mode 100644 docs/plans/2026-04-04-00-41-UTC-chat-ui-channel-thread-session-and-arbitration-ux.md delete mode 100644 docs/plans/2026-04-04-07-34-UTC-pr117-unimplemented-bot-registry.md delete mode 100644 docs/plans/2026-04-04-08-10-UTC-pr117-review-comment-gap-implementation.md delete mode 100644 docs/plans/2026-04-04-08-28-UTC-pr117-fullstack-review-and-hardening.md delete mode 100644 docs/plans/2026-04-07-03-01-UTC-navigation-sidebar-buttons.md delete mode 100644 docs/plans/2026-04-07-03-22-UTC-channel-button-relocation.md delete mode 100644 docs/plans/2026-04-07-03-50-UTC-navigation-agents-sidebar.md delete mode 100644 docs/plans/2026-04-07-04-27-UTC-research-reconnect-sync-button.md delete mode 100644 docs/plans/2026-04-07-04-31-UTC-remove-reconnect-sync-simulator.md delete mode 100644 docs/plans/2026-04-07-04-35-UTC-chat-history-persistence-fix.md delete mode 100644 docs/plans/2026-04-07-05-11-UTC-backend-chat-history-persistence.md delete mode 100644 docs/plans/2026-04-07-06-07-UTC-async-chat-transport-rearchitecture.md delete mode 100644 docs/plans/2026-04-07-09-04-UTC-fix-chat-session-migration-sqlite-cast.md delete mode 100644 docs/plans/2026-04-07-09-28-UTC-chat-history-context-and-persistence-fix.md delete mode 100644 docs/plans/2026-04-07-09-54-UTC-backend-owned-chat-persistence-and-context.md delete mode 100644 docs/plans/2026-04-07-12-18-UTC-remove-chat-context-bar-impact-assessment.md delete mode 100644 docs/plans/2026-04-07-15-39-UTC-remove-simulated-reconnect-entry.md delete mode 100644 docs/plans/2026-04-08-02-34-UTC-channel-subsections.md delete mode 100644 docs/plans/2026-04-08-02-40-UTC-code-map-foundation.md delete mode 100644 docs/plans/2026-04-08-02-52-UTC-chat-history-load-window-and-auto-scroll.md delete mode 100644 docs/plans/2026-04-09-02-15-UTC-move-chat-debug-info-into-composer-menu.md delete mode 100644 docs/plans/2026-04-09-03-47-UTC-chat-open-auto-scroll-latest.md delete mode 100644 docs/plans/2026-04-09-04-02-UTC-sidebar-channel-click-white-screen.md delete mode 100644 docs/plans/2026-04-09-05-48-UTC-chat-interaction-simplify.md delete mode 100644 docs/plans/2026-04-09-06-02-UTC-ai-bubble-full-width.md delete mode 100644 docs/plans/2026-04-09-10-48-UTC-channel-persistence-hydration.md delete mode 100644 docs/plans/2026-04-10-01-10-UTC-menu-animation-speedup.md delete mode 100644 docs/plans/2026-04-10-04-39-UTC-channel-management.md delete mode 100644 docs/plans/2026-04-14-01-30-UTC-openclaw-plugin-platform-api-and-settings-copy.md delete mode 100644 docs/plans/2026-04-14-03-31-UTC-address-pr-review-comments.md delete mode 100644 docs/plans/2026-04-15-07-21-UTC-comment-followup-unified-messages-events.md delete mode 100644 docs/plans/2026-04-15-16-06-UTC-implementation-doc-alignment-check.md delete mode 100644 docs/plans/2026-04-16-05-00-UTC-openclaw-gap-audit-and-token-chain.md delete mode 100644 docs/plans/2026-04-16-08-47-UTC-move-openclaw-token-to-settings-item.md delete mode 100644 docs/plans/2026-04-16-10-51-UTC-node-openclaw-plugin-implementation.md delete mode 100644 docs/plans/2026-04-16-12-00-UTC-branch-db-diff-analysis.md delete mode 100644 docs/plans/2026-04-16-12-20-UTC-api-feature-db-impact-recheck.md delete mode 100644 docs/plans/2026-04-16-12-40-UTC-main-worktree-feature-logic-review.md delete mode 100644 docs/plans/2026-04-16-13-00-UTC-plugin-development-architecture-doc.md delete mode 100644 docs/plans/2026-04-16-16-00-UTC-node-openclaw-plugin-jwt-hardening.md delete mode 100644 docs/plans/2026-04-16-22-15-UTC-openclaw-onboarding-enable.md delete mode 100644 docs/plans/2026-04-17-02-22-UTC-address-pr-review-followups.md delete mode 100644 docs/plans/2026-04-17-05-52-UTC-openclaw-channel-plugin-conversion.md delete mode 100644 docs/plans/2026-04-17-07-29-UTC-openclaw-router-default-plan.md delete mode 100644 docs/plans/2026-04-17-10-29-UTC-request-performance-improvements.md delete mode 100644 docs/plans/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md delete mode 100644 docs/plans/2026-04-18-03-19-UTC-ai-message-no-bubble.md delete mode 100644 docs/plans/2026-04-18-08-10-UTC-channel-rename-persistence.md delete mode 100644 docs/plans/2026-04-18-09-29-UTC-ai-markdown-rendering.md delete mode 100644 docs/plans/2026-04-18-14-59-UTC-chat-stream-order-and-completeness-fix.md delete mode 100644 docs/plans/2026-04-18-15-06-UTC-chat-router-button-relocation.md delete mode 100644 docs/plans/2026-04-18-15-09-UTC-chat-send-flow-simplification.md delete mode 100644 docs/plans/2026-04-19-11-46-UTC-openclaw-history-ordering-fix.md delete mode 100644 docs/plans/2026-04-19-13-08-UTC-openclaw-install-instructions-redo.md delete mode 100644 docs/plans/2026-04-20-04-36-UTC-openclaw-install-instructions-branch-redo.md delete mode 100644 docs/plans/2026-04-20-05-19-UTC-message-order-bug-analysis.md delete mode 100644 docs/plans/2026-04-20-07-14-UTC-message-order-root-cause-fix.md delete mode 100644 docs/plans/2026-04-20-07-54-UTC-user-query-delivery-status.md delete mode 100644 docs/plans/2026-04-20-08-57-UTC-controlled-user-query-commit.md delete mode 100644 docs/plans/2026-04-20-09-40-UTC-openclaw-accountid-userid-scoping.md delete mode 100644 docs/plans/2026-04-20-10-19-UTC-openclaw-reply-failure-db-analysis.md delete mode 100644 docs/plans/2026-04-20-19-29-UTC-platform-ack-scaling-dialect-cleanup.md delete mode 100644 docs/plans/2026-04-20-19-34-UTC-multi-node-plugin-routing-blueprint.md delete mode 100644 docs/plans/2026-04-20-19-36-UTC-chat-sync-long-polling.md delete mode 100644 docs/plans/2026-04-21-00-12-UTC-multi-node-plugin-implementation.md delete mode 100644 docs/plans/2026-04-21-01-07-UTC-chat-sync-sse.md delete mode 100644 docs/plans/2026-04-21-03-23-UTC-openclaw-network-retry-hardening.md delete mode 100644 docs/plans/2026-04-21-03-37-UTC-thread-channel-router-menu-adjustment.md delete mode 100644 docs/plans/2026-04-21-05-36-UTC-openclaw-plugin-refresh-skill.md delete mode 100644 docs/plans/2026-04-21-06-51-UTC-chat-header-subsection-switcher-merge.md delete mode 100644 docs/plans/2026-04-21-07-57-UTC-readme-refresh-consolidated-plan.md delete mode 100644 docs/plans/2026-04-21-10-20-UTC-respond-async-delivery-indicators.md delete mode 100644 docs/plans/2026-04-21-12-37-UTC-router-switch-toast-behavior.md delete mode 100644 docs/plans/2026-04-21-12-43-UTC-router-menu-checkmark-selection.md delete mode 100644 docs/plans/2026-04-21-14-45-UTC-chat-appbar-bg.md delete mode 100644 docs/plans/2026-04-21-14-45-UTC-user-bubble-metadata-context-menu.md delete mode 100644 docs/plans/2026-04-22-03-03-UTC-agent-bot-sidebar-blueprint.md delete mode 100644 docs/plans/2026-04-22-03-04-UTC-remove-readme-packages-section.md delete mode 100644 docs/plans/2026-04-22-03-44-UTC-router-linked-composer-actions.md delete mode 100644 docs/plans/2026-04-22-03-53-UTC-streaming-output-120k-merged-plan.md delete mode 100644 docs/plans/2026-04-22-03-55-UTC-agent-bot-sidebar-implementation.md delete mode 100644 docs/plans/2026-04-22-07-20-UTC-chat-agent-ui-adjustments.md delete mode 100644 docs/plans/2026-04-22-07-55-UTC-remove-top-active-agents-indicator.md delete mode 100644 docs/plans/2026-04-22-08-08-UTC-openclaw-plugin-publish-plan.md delete mode 100644 docs/plans/2026-04-22-08-22-UTC-openclaw-plugin-publish-prep-skill.md delete mode 100644 docs/plans/2026-04-22-08-41-UTC-rate-limit-global-optimization.md delete mode 100644 docs/plans/2026-04-22-09-22-UTC-openclaw-plugin-public-release-final.md delete mode 100644 docs/plans/2026-04-22-09-24-UTC-chat-web-build-fix.md delete mode 100644 docs/plans/2026-04-22-09-49-UTC-pr-chat-ui-check.md delete mode 100644 docs/plans/2026-04-22-10-19-UTC-openclaw-route-actions-and-sidebar-groups.md delete mode 100644 docs/plans/2026-04-22-19-08-UTC-ios-build-enablement-implementation.md delete mode 100644 docs/plans/2026-04-23-03-37-UTC-node-management-token-ui.md delete mode 100644 docs/plans/2026-04-23-10-45-WIB-ios-github-login-fix.md delete mode 100644 docs/plans/2026-04-23-11-27-WIB-node-token-copy-openclaw-commands.md delete mode 100644 docs/plans/2026-04-23-11-29-WIB-release-api-base-url-default.md delete mode 100644 docs/plans/2026-04-23-14-42-openclaw-package-metadata.md delete mode 100644 docs/plans/2026-04-23-15-33-openclaw-selected-node-routing.md delete mode 100644 docs/plans/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md delete mode 100644 docs/plans/2026-04-24-12-15-dispatch-avatar-placeholder.md delete mode 100644 docs/plans/2026-04-26-00-57-switch-to-message-bubble-background-branch.md delete mode 100644 docs/plans/2026-04-26-02-45-UTC-jump-to-latest-message.md delete mode 100644 docs/plans/2026-04-26-02-45-dark-theme-semantic-token-refactor.md delete mode 100644 docs/plans/2026-04-26-07-39-UTC-message-typography-placeholder.md delete mode 100644 docs/plans/2026-04-26-07-53-UTC-conflict-sync-and-placeholder-adjustment.md delete mode 100644 docs/plans/2026-04-26-10-20-UTC-docusaurus-doc-ia-restructure.md delete mode 100644 docs/plans/2026-04-26-11-08-UTC-jump-button-threshold-and-scroll-target.md delete mode 100644 docs/plans/2026-04-26-12-03-UTC-chat-bubble-contrast-spacing.md delete mode 100644 docs/plans/2026-04-26-12-10-UTC-dark-composer-visual-unification-todo.md delete mode 100644 docs/plans/2026-04-26-12-19-docs-subpath-vercel-integration.md delete mode 100644 docs/plans/2026-04-26-13-20-UTC-docusaurus-site-implementation.md delete mode 100644 docs/plans/2026-04-26-14-05-UTC-move-docusaurus-site-under-apps.md delete mode 100644 docs/plans/2026-04-26-23-24-+08-chat-dark-colors.md delete mode 100644 docs/plans/2026-04-27-00-04-+08-pr-branch-sync-skill.md delete mode 100644 docs/plans/2026-04-27-00-19-+08-design-system-token-alignment.md delete mode 100644 docs/plans/2026-04-27-00-27-+08-design-system-skill.md delete mode 100644 docs/plans/2026-04-27-00-40-+08-responsive-sidebar-surface.md delete mode 100644 docs/plans/2026-04-27-00-42-+08-quiet-composer-focus.md delete mode 100644 docs/plans/2026-04-27-00-51-+08-composer-action-color-alignment.md delete mode 100644 docs/plans/2026-04-27-13-47-UTC-light-mode-color-adjustments.md delete mode 100644 docs/plans/2026-04-27-17-28-UTC-markdown-table-rendering.md delete mode 100644 docs/plans/2026-04-28-17-26-+08-bricks-issue-template-skill.md delete mode 100644 docs/plans/2026-04-28-23-49-+08-change-implementation-plan-skill.md delete mode 100644 docs/plans/2026-04-29-00-01-+08-issue-template-background-update.md delete mode 100644 docs/plans/2026-04-29-16-22-UTC-chat-appbar-channel-section-menu.md delete mode 100644 docs/plans/2026-04-29-16-29-UTC-pc-sidebar-inline-navigation.md delete mode 100644 docs/plans/2026-04-30-17-06-+08-desktop-channel-navigation-stays-open.md delete mode 100644 docs/plans/2026-04-30-17-51-+08-scope-instructions-config.md delete mode 100644 docs/plans/2026-05-06-10-13-UTC-default-router-agent-architecture.md delete mode 100644 docs/plans/2026-05-06-11-03-UTC-openclaw-default-router-agent-benchmark.md delete mode 100644 docs/plans/2026-05-06-11-14-UTC-default-router-builtin-node-coding.md delete mode 100644 docs/plans/2026-05-06-22-09-+08-branch-feature-checklist-analysis.md delete mode 100644 docs/plans/2026-05-06-22-42-+08-router-strategy-rename.md delete mode 100644 docs/plans/2026-05-06-22-44-+08-post-router-refactor-followup.md delete mode 100644 docs/plans/2026-05-07-18-29-fix-ios-photo-library-usage-description.md delete mode 100644 docs/plans/2026-05-08-08-43-UTC-composer-focus-keep.md delete mode 100644 docs/plans/2026-05-08-09-44-UTC-fix-channel-name-refresh-loss.md delete mode 100644 docs/plans/2026-05-08-13-46-UTC-disable-navigation-tab-swipe.md delete mode 100644 docs/plans/2026-05-09-05-45-streaming-scroll-ux-plan.md delete mode 100644 docs/plans/2026-05-09-06-10-UTC-chat-navigation-swipe-follow-up.md delete mode 100644 docs/plans/2026-05-09-10-40-UTC-agent-loop-internal-tools-p0.md delete mode 100644 docs/plans/2026-05-15-16-21-+08-chat-scroll-position-gwt.md delete mode 100644 docs/plans/2026-05-15-16-54-+08-local-chat-fixture-db.md delete mode 100644 docs/plans/2026-05-15-19-27-+08-evidence-driven-browser-test-env-skill.md delete mode 100644 docs/plans/2026-05-16-02-20-+00-todos-tables-highlights-tools.md delete mode 100644 docs/plans/2026-05-16-08-13-+00-highlight-floating-toolbar.md delete mode 100644 docs/plans/2026-05-16-08-20-+00-resources-tab-in-navigation-sidebar.md delete mode 100644 docs/plans/2026-05-16-17-40-+08-ios-testflight-pr-workflow.md delete mode 100644 docs/plans/2026-05-16-17-58-+08-mobile-agents-directory-setup-fix.md delete mode 100644 docs/plans/2026-05-16-22-43-+08-ios-debug-api-base-url.md delete mode 100644 docs/plans/2026-05-16-23-21-+08-ios-sandbox-path-without-home.md delete mode 100644 docs/plans/2026-05-17-00-04-+08-table-tool-error-and-turso-compatibility.md delete mode 100644 docs/plans/2026-05-18-17-43-CST-ios-build.md delete mode 100644 docs/plans/2026-05-18-22-22-+08-highlight-selection-offsets.md delete mode 100644 docs/plans/2026-05-19-10-50-+08-unified-authenticated-api-client.md delete mode 100644 docs/plans/2026-05-19-11-55-+08-highlight-toolbar-union-ranges.md delete mode 100644 docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md delete mode 100644 docs/plans/2026-05-19-14-27-CST-tool-call-thinking-group.md delete mode 100644 docs/plans/2026-05-19-17-06-CST-navigation-resources-highlights.md delete mode 100644 docs/plans/2026-05-19-17-38-CST-subsection-rename-menu.md delete mode 100644 docs/plans/2026-05-20-11-13-CST-local-cloud-db-debug.md delete mode 100644 docs/plans/2026-05-21-10-41-CST-channel-new-ui-harness.md delete mode 100644 docs/plans/2026-05-21-12-03-CST-evidence-checkpoint-testing-docs.md delete mode 100644 docs/plans/2026-05-21-12-09-CST-scope-config-thread-label.md delete mode 100644 docs/plans/2026-05-21-12-38-CST-local-manual-ai-test-env-docs.md delete mode 100644 docs/plans/2026-05-21-14-17-CST-evidence-case-loop-skill.md delete mode 100644 docs/plans/2026-05-21-14-20-CST-channel-dropdown-height-evidence-case.md delete mode 100644 docs/plans/2026-05-21-15-49-CST-local-llm-env-config.md delete mode 100644 docs/plans/2026-05-21-15-55-CST-thread-menu-copy.md delete mode 100644 docs/plans/2026-05-21-16-09-CST-thread-sync-and-thinking-details.md delete mode 100644 docs/plans/2026-05-21-16-43-CST-agent-loop-limit-empty-final.md delete mode 100644 docs/plans/2026-05-21-16-48-CST-sidebar-resize-composer-focus.md delete mode 100644 docs/plans/2026-05-21-17-13-CST-sse-topology-refresh-rate-limit.md delete mode 100644 docs/plans/2026-05-21-17-23-CST-typed-chat-invalidations.md delete mode 100644 docs/plans/2026-05-21-17-53-CST-agent-loop-empty-final-root-cause.md delete mode 100644 docs/plans/2026-05-21-18-06-CST-agent-loop-real-stop-reason.md delete mode 100644 docs/plans/2026-05-21-19-57-CST-thread-auto-name-source.md delete mode 100644 docs/plans/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md create mode 100644 docs/tasks/backlog/2026-06-17-child-homework-task-breakdown.md create mode 100644 docs/tasks/backlog/2026-06-17-grammar-bug-collection-database.md create mode 100644 docs/tasks/backlog/2026-06-17-note-purpose-specific-charts-examples.md create mode 100644 docs/tasks/backlog/2026-06-22-selection-toolbar-translate-and-explain.md rename docs/{plans => tasks/done}/2026-05-25-11-14-fix-openclaw-agents-500-error.md (100%) rename docs/{plans => tasks/done}/2026-05-26-02-30-resource-batch-add-rows.md (100%) rename docs/{plans => tasks/done}/2026-05-26-10-20-pr-266-review-follow-up.md (100%) rename docs/{plans => tasks/done}/2026-06-16-15-32-+08-note-content-type-implementation.md (100%) rename docs/{plans => tasks/done}/2026-06-22-17-40-CST-readme-feature-copy.md (100%) rename docs/{plans => tasks/done}/2026-06-22-17-43-CST-readme-resource-copy.md (100%) diff --git a/.agents/skills/change-implementation-plan/SKILL.md b/.agents/skills/change-implementation-plan/SKILL.md index e6bbaa55..74386fe5 100644 --- a/.agents/skills/change-implementation-plan/SKILL.md +++ b/.agents/skills/change-implementation-plan/SKILL.md @@ -1,6 +1,6 @@ --- name: change-implementation-plan -description: Use when drafting, revising, or persisting an implementation plan for a feature, bug fix, refactor, documentation update, or other repository change. Guides agents to write English plans with Background, Goals, Implementation Plan, Acceptance Criteria, and Validation Commands, and to save every implementation plan under docs/plans/ with a timestamped filename. +description: Use when drafting, revising, or persisting an implementation plan for a feature, bug fix, refactor, documentation update, or other repository change. Guides agents to write English plans with Background, Goals, Implementation Plan, Acceptance Criteria, and Validation Commands, and to save every implementation plan under the appropriate docs/tasks lifecycle folder with a timestamped filename. --- # Change Implementation Plan @@ -11,7 +11,12 @@ This skill is for implementation planning. Do not use it for GitHub issue drafti ## Persistence Rule -Every implementation plan must be saved under `docs/plans/`. +Every implementation plan must be saved under the appropriate `docs/tasks/` lifecycle folder. + +- Use `docs/tasks/backlog/` for planned work that has not started. +- Use `docs/tasks/doing/` for active implementation work. +- Use `docs/tasks/done/` for completed work. +- Use `docs/tasks/trash/` for abandoned or superseded work. Name the file with a 24-hour timestamp prefix: @@ -91,7 +96,7 @@ Write the plan in English using these sections, in this order: Before returning or saving the plan, check: -- The file is saved under `docs/plans/` with a timestamped filename. +- The file is saved under the correct `docs/tasks/` lifecycle folder with a timestamped filename. - The plan includes `Background`, `Goals`, `Implementation Plan`, `Acceptance Criteria`, and `Validation Commands`. - Optional Background subsections are used only when they improve clarity. - Acceptance criteria describe outcomes, not internal implementation steps. diff --git a/AGENTS.md b/AGENTS.md index af47f782..6d97a428 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,9 +6,11 @@ - Run mobile app Flutter tests from the package directory: `cd apps/mobile_chat_app && flutter test` (avoid `flutter test apps/mobile_chat_app` from repo root). - Never pass Markdown files (for example `*.md`) to `dart format` or other Dart source-only tooling commands; target only Dart files/directories. -## Plan persistence -- For each feature or task, create and save a markdown plan file in `docs/plans/`. -- Name plan files with a `YYYY-MM-DD-HH-mm` prefix using 24-hour time (optionally appending a timezone such as `-UTC`). +## Task lifecycle +- For each feature or task, create and save a markdown task file under `docs/tasks/`. +- Use the lifecycle folders: `docs/tasks/backlog/` for planned or not-yet-started work, `docs/tasks/doing/` for active work, `docs/tasks/done/` for completed work, and `docs/tasks/trash/` for abandoned or superseded work. +- Name task files with a `YYYY-MM-DD-HH-mm` prefix using 24-hour time (optionally appending a timezone such as `-UTC`). +- Do not add new files to the legacy plan/backlog folders; use `docs/tasks/` instead. ## Worktree task workflow - The repository may contain a top-level `.worktree/` directory for storing local git worktrees. diff --git a/docs/backlog/2026-05-26-scheduled-agent-tasks.md b/docs/backlog/2026-05-26-scheduled-agent-tasks.md deleted file mode 100644 index 54b6586d..00000000 --- a/docs/backlog/2026-05-26-scheduled-agent-tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -# Scheduled Agent Tasks - -## Confirmed Need - -Users should be able to create scheduled tasks through conversation. - -When a scheduled task is triggered, it should run an Agent workflow. - -## Notes - -- The task creation entry point is conversational. -- The scheduled trigger is responsible for starting the Agent workflow. -- Superseded for implementation details: see `docs/plans/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md`, which is the current source of truth. diff --git a/docs/backlog/2026-05-26-scriptable-agent-pipelines.md b/docs/backlog/2026-05-26-scriptable-agent-pipelines.md deleted file mode 100644 index 7b087f37..00000000 --- a/docs/backlog/2026-05-26-scriptable-agent-pipelines.md +++ /dev/null @@ -1,18 +0,0 @@ -# Scriptable Agent Pipelines - -## Confirmed Need - -Bricks should support scriptable Agent pipelines that can run around a user message or an Agent response. - -The pipeline should be able to execute code, call tools, transform input, and then continue the Agent flow. - -## Example Use Cases - -- Before sending a message, check grammar, rewrite the query in English, and send the improved message to the AI. -- Before sending a message, optimize or enrich the user query. -- Use a framework such as Genkit as a possible way to define AI workflows in TypeScript. - -## Notes - -- The feature is about scriptable hooks or flows, not only prompt templates. -- Exact trigger points, permissions, storage, and runtime model are not decided yet. diff --git a/docs/code_maps/logic_map.yaml b/docs/code_maps/logic_map.yaml index 16e7ae0c..f272ed97 100644 --- a/docs/code_maps/logic_map.yaml +++ b/docs/code_maps/logic_map.yaml @@ -23,10 +23,10 @@ index: - tools/evidence/channel_dropdown_height/run.sh - tools/evidence/channel_dropdown_height/channel_dropdown_flow.mjs doc_index: - - docs/plans/2026-05-20-11-13-CST-local-cloud-db-debug.md - - docs/plans/2026-05-21-10-41-CST-channel-new-ui-harness.md - - docs/plans/2026-05-21-12-03-CST-evidence-checkpoint-testing-docs.md - - docs/plans/2026-05-21-12-38-CST-local-manual-ai-test-env-docs.md + - docs/tasks/done/2026-05-20-11-13-CST-local-cloud-db-debug.md + - docs/tasks/done/2026-05-21-10-41-CST-channel-new-ui-harness.md + - docs/tasks/done/2026-05-21-12-03-CST-evidence-checkpoint-testing-docs.md + - docs/tasks/done/2026-05-21-12-38-CST-local-manual-ai-test-env-docs.md - docs/testing/local-chat-fixture-db.md - docs/testing/evidence-checkpoint-browser-harness.md - docs/testing/local-manual-ai-test-env.md @@ -127,26 +127,26 @@ index: - docs/architecture.md - docs/architecture/system-overview.md - openspec/changes/multi-agent-participation/design.md - - docs/plans/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md - - docs/plans/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md - - docs/plans/2026-04-23-15-33-openclaw-selected-node-routing.md - - docs/plans/2026-04-24-12-15-dispatch-avatar-placeholder.md - - docs/plans/2026-04-26-02-45-UTC-jump-to-latest-message.md - - docs/plans/2026-04-26-02-45-dark-theme-semantic-token-refactor.md + - docs/tasks/done/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md + - docs/tasks/done/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md + - docs/tasks/done/2026-04-23-15-33-openclaw-selected-node-routing.md + - docs/tasks/done/2026-04-24-12-15-dispatch-avatar-placeholder.md + - docs/tasks/done/2026-04-26-02-45-UTC-jump-to-latest-message.md + - docs/tasks/done/2026-04-26-02-45-dark-theme-semantic-token-refactor.md - docs/kb/color-theme-architecture.md - .codex/skills/bricks-design-system/SKILL.md - - docs/plans/2026-04-26-23-24-+08-chat-dark-colors.md - - docs/plans/2026-04-27-00-19-+08-design-system-token-alignment.md - - docs/plans/2026-04-27-00-27-+08-design-system-skill.md - - docs/plans/2026-04-27-17-28-UTC-markdown-table-rendering.md - - docs/plans/2026-05-15-16-21-+08-chat-scroll-position-gwt.md - - docs/plans/2026-05-15-16-54-+08-local-chat-fixture-db.md - - docs/plans/2026-05-16-17-58-+08-mobile-agents-directory-setup-fix.md - - docs/plans/2026-05-16-23-21-+08-ios-sandbox-path-without-home.md - - docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md - - docs/plans/2026-05-19-14-27-CST-tool-call-thinking-group.md - - docs/plans/2026-05-19-17-38-CST-subsection-rename-menu.md - - docs/plans/2026-05-21-10-41-CST-channel-new-ui-harness.md + - docs/tasks/done/2026-04-26-23-24-+08-chat-dark-colors.md + - docs/tasks/done/2026-04-27-00-19-+08-design-system-token-alignment.md + - docs/tasks/done/2026-04-27-00-27-+08-design-system-skill.md + - docs/tasks/done/2026-04-27-17-28-UTC-markdown-table-rendering.md + - docs/tasks/done/2026-05-15-16-21-+08-chat-scroll-position-gwt.md + - docs/tasks/done/2026-05-15-16-54-+08-local-chat-fixture-db.md + - docs/tasks/done/2026-05-16-17-58-+08-mobile-agents-directory-setup-fix.md + - docs/tasks/done/2026-05-16-23-21-+08-ios-sandbox-path-without-home.md + - docs/tasks/done/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md + - docs/tasks/done/2026-05-19-14-27-CST-tool-call-thinking-group.md + - docs/tasks/done/2026-05-19-17-38-CST-subsection-rename-menu.md + - docs/tasks/done/2026-05-21-10-41-CST-channel-new-ui-harness.md - docs/testing/local-chat-fixture-db.md test_index: - apps/mobile_chat_app/test/chat_arbitration_engine_test.dart @@ -285,8 +285,8 @@ index: - apps/node_backend/src/services/chatRouterService.ts - apps/node_backend/src/db/migrations/013_add_instructions_to_chat_scope_settings.sql doc_index: - - docs/plans/2026-04-30-17-51-+08-scope-instructions-config.md - - docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md + - docs/tasks/done/2026-04-30-17-51-+08-scope-instructions-config.md + - docs/tasks/done/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md test_index: - apps/mobile_chat_app/test/chat_history_api_service_test.dart - apps/node_backend/src/services/chatRouterService.test.ts @@ -320,7 +320,7 @@ index: - apps/node_backend/src/services/chatRouterService.ts - apps/node_backend/src/db/migrations/013_add_instructions_to_chat_scope_settings.sql doc_index: - - docs/plans/2026-04-30-17-51-+08-scope-instructions-config.md + - docs/tasks/done/2026-04-30-17-51-+08-scope-instructions-config.md test_index: - apps/mobile_chat_app/test/chat_history_api_service_test.dart - apps/node_backend/src/services/chatRouterService.test.ts @@ -357,7 +357,7 @@ index: - docs/model_settings_plan.md - docs/architecture.md - docs/openclaw_pull_only_integration_dev_doc.md - - docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md + - docs/tasks/done/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md test_index: - apps/mobile_chat_app/test/model_settings_screen_test.dart - apps/mobile_chat_app/test/llm_config_service_test.dart @@ -391,7 +391,7 @@ index: doc_index: - docs/product/overview.md - docs/integrations/openclaw-plugin.md - - docs/plans/2026-04-21-00-12-UTC-multi-node-plugin-implementation.md + - docs/tasks/done/2026-04-21-00-12-UTC-multi-node-plugin-implementation.md test_index: - apps/mobile_chat_app/test/node_settings_screen_test.dart - apps/node_backend/src/routes/config.test.ts @@ -427,7 +427,7 @@ index: - docs/product/overview.md - docs/faq/common-issues.md - docs/architecture.md - - docs/plans/2026-05-19-17-06-CST-navigation-resources-highlights.md + - docs/tasks/done/2026-05-19-17-06-CST-navigation-resources-highlights.md test_index: - apps/mobile_chat_app/test/app_test.dart - apps/mobile_chat_app/test/chat_navigation_page_test.dart @@ -502,11 +502,11 @@ index: - docs/integrations/openclaw-plugin.md - docs/architecture.md - docs/openclaw_pull_only_integration_dev_doc.md - - docs/plans/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md - - docs/plans/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md - - docs/plans/2026-04-23-15-33-openclaw-selected-node-routing.md - - docs/plans/2026-05-06-22-42-+08-router-strategy-rename.md - - docs/plans/2026-05-06-22-44-+08-post-router-refactor-followup.md + - docs/tasks/done/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md + - docs/tasks/done/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md + - docs/tasks/done/2026-04-23-15-33-openclaw-selected-node-routing.md + - docs/tasks/done/2026-05-06-22-42-+08-router-strategy-rename.md + - docs/tasks/done/2026-05-06-22-44-+08-post-router-refactor-followup.md - apps/node_backend/src/routes/platform.test.ts - apps/node_backend/src/routes/config.test.ts - apps/node_backend/src/services/chatRouterService.test.ts @@ -565,7 +565,7 @@ index: - docs/faq/common-issues.md - docs/openclaw_pull_only_integration_dev_doc.md - docs/plugin_development_architecture.md - - docs/plans/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md + - docs/tasks/done/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md - apps/node_openclaw_plugin/README.md - apps/node_openclaw_plugin/openclaw.plugin.json test_index: @@ -601,7 +601,7 @@ index: - docs/intro.md - docs/get-started/quickstart.md - docs/product/overview.md - - docs/plans/2026-04-26-12-19-docs-subpath-vercel-integration.md + - docs/tasks/done/2026-04-26-12-19-docs-subpath-vercel-integration.md test_index: - tools/vercel-build.sh keywords: @@ -629,8 +629,8 @@ index: - apps/mobile_chat_app/lib/features/chat/todo_api_service.dart - apps/mobile_chat_app/lib/services/authenticated_api_client.dart doc_index: - - docs/plans/2026-05-16-02-20-+00-todos-tables-highlights-tools.md - - docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md + - docs/tasks/done/2026-05-16-02-20-+00-todos-tables-highlights-tools.md + - docs/tasks/done/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md test_index: - apps/node_backend/src/services/localAgentLoopService.test.ts keywords: @@ -663,7 +663,7 @@ index: - apps/mobile_chat_app/lib/features/chat/chat_message.dart - apps/mobile_chat_app/lib/services/authenticated_api_client.dart doc_index: - - docs/plans/2026-06-16-15-32-+08-note-content-type-implementation.md + - docs/tasks/done/2026-06-16-15-32-+08-note-content-type-implementation.md - docs/tasks/done/2026-06-12-14-00-+08-note-content-type.md test_index: - apps/node_backend/src/routes/resources.test.ts @@ -703,9 +703,9 @@ index: - apps/mobile_chat_app/lib/features/chat/asset_table_api_service.dart - apps/mobile_chat_app/lib/services/authenticated_api_client.dart doc_index: - - docs/plans/2026-05-16-02-20-+00-todos-tables-highlights-tools.md - - docs/plans/2026-05-17-00-04-+08-table-tool-error-and-turso-compatibility.md - - docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md + - docs/tasks/done/2026-05-16-02-20-+00-todos-tables-highlights-tools.md + - docs/tasks/done/2026-05-17-00-04-+08-table-tool-error-and-turso-compatibility.md + - docs/tasks/done/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md - docs/kb/turso-sqlite-compatibility.md test_index: - apps/node_backend/src/services/localAgentLoopService.test.ts @@ -745,12 +745,12 @@ index: - apps/mobile_chat_app/lib/features/chat/chat_navigation_page.dart - apps/mobile_chat_app/lib/features/chat/widgets/message_list.dart doc_index: - - docs/plans/2026-05-16-02-20-+00-todos-tables-highlights-tools.md - - docs/plans/2026-05-18-22-22-+08-highlight-selection-offsets.md - - docs/plans/2026-05-19-10-50-+08-unified-authenticated-api-client.md - - docs/plans/2026-05-19-11-55-+08-highlight-toolbar-union-ranges.md - - docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md - - docs/plans/2026-05-19-17-06-CST-navigation-resources-highlights.md + - docs/tasks/done/2026-05-16-02-20-+00-todos-tables-highlights-tools.md + - docs/tasks/done/2026-05-18-22-22-+08-highlight-selection-offsets.md + - docs/tasks/done/2026-05-19-10-50-+08-unified-authenticated-api-client.md + - docs/tasks/done/2026-05-19-11-55-+08-highlight-toolbar-union-ranges.md + - docs/tasks/done/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md + - docs/tasks/done/2026-05-19-17-06-CST-navigation-resources-highlights.md - docs/design/text-highlight-floating-toolbar.design.md test_index: - apps/mobile_chat_app/test/message_list_test.dart @@ -806,7 +806,7 @@ index: - apps/node_backend/src/app.ts - vercel.json doc_index: - - docs/plans/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md + - docs/tasks/backlog/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md test_index: - apps/node_backend/src/services/localAgentLoopService.test.ts keywords: diff --git a/docs/plans/2026-04-01-07-04-UTC-model-settings-save-fix.md b/docs/plans/2026-04-01-07-04-UTC-model-settings-save-fix.md deleted file mode 100644 index 9e9abd89..00000000 --- a/docs/plans/2026-04-01-07-04-UTC-model-settings-save-fix.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -The model settings page currently shows a generic "Failed to save model settings" snackbar when saving some valid backend responses. The sample API response includes `is_default: 1` (numeric), while the Flutter parser expects a boolean and can throw at runtime during response hydration. Additionally, users expect the saved config slot name (`config.slot_id`) to track the chosen model name. - -# Goals -1. Make Save succeed for backend responses that represent booleans as numeric values. -2. Ensure persisted `config.slot_id` stays aligned with the selected default model name after save. -3. Keep UI labels for config chips consistent with current model naming. - -# Implementation Plan (phased) -## Phase 1: Robust API response parsing -- Update model config deserialization in `LlmConfigService` to accept boolean-like values (`true/false`, `1/0`, and string variants) for `is_default`. - -## Phase 2: Slot/model alignment -- Add a slot-id normalization helper derived from the selected model name. -- Use normalized slot id in save payload and in local state updates after save. -- Keep fallback behavior stable for malformed/empty model names. - -## Phase 3: Validation -- Run formatting and targeted Flutter checks after bootstrapping via `./tools/init_dev_env.sh`. - -# Acceptance Criteria -- Saving settings with a backend response like `"is_default": 1` no longer triggers the failure snackbar. -- After save, the stored config `slot_id` matches a normalized form of the selected default model (e.g., `gemini-flash-latest` remains the same). -- Config selector labels continue to reflect model names and remain stable after save/reload. diff --git a/docs/plans/2026-04-01-07-06-sidebar-navigation-page.md b/docs/plans/2026-04-01-07-06-sidebar-navigation-page.md deleted file mode 100644 index 5cfcdbdb..00000000 --- a/docs/plans/2026-04-01-07-06-sidebar-navigation-page.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -The current chat navigation uses a narrow slide-in Drawer. The requested behavior is a page-level navigation experience so users can focus on navigation options in a full page, while still being able to return to the chat screen with a back action. - -# Goals -- Replace the narrow Drawer interaction with a full-page navigation screen. -- Keep existing navigation actions (manage agents, session settings, app settings). -- Ensure users can return to the chat conversation via a back button. - -# Implementation Plan (phased) -## Phase 1: Build a dedicated navigation page -- Add a new screen under the chat feature that renders navigation options in a full-page Scaffold. -- Provide a standard AppBar back button for returning to chat. -- Return a typed action result from the page when users pick an actionable menu item. - -## Phase 2: Integrate with chat screen -- Remove Drawer usage from `ChatScreen`. -- Add an AppBar menu button that pushes the new navigation page. -- Handle returned actions in `ChatScreen` and route to existing destination screens. - -## Phase 3: Validate behavior -- Run Flutter workspace bootstrap script. -- Run targeted static analysis/tests for the mobile chat app to confirm no regressions. - -# Acceptance Criteria -- Tapping the chat AppBar menu opens a full-page navigation screen instead of a narrow drawer. -- The navigation page has a back button that returns to the chat conversation. -- Selecting Manage Agents, Session Settings, and Settings still opens the same destination screens. -- `flutter analyze` for the mobile chat app succeeds after the change. diff --git a/docs/plans/2026-04-01-07-10-UTC-is-default-number-style.md b/docs/plans/2026-04-01-07-10-UTC-is-default-number-style.md deleted file mode 100644 index 0991f8f3..00000000 --- a/docs/plans/2026-04-01-07-10-UTC-is-default-number-style.md +++ /dev/null @@ -1,23 +0,0 @@ -# Background -Review feedback requested avoiding broad compatibility coercion for `is_default` and instead using a clear API contract. Current backend responses are number-style (`1`/`0`), so client-side conversion should align with that representation. - -# Goals -1. Use number-style `is_default` in request payloads. -2. Parse `is_default` from number-style response values with strict semantics. -3. Keep internal UI/domain behavior unchanged (still boolean in app state). - -# Implementation Plan (phased) -## Phase 1: Contract alignment in serialization -- Update save payload mapping to send `is_default` as `1` or `0`. - -## Phase 2: Strict deserialization -- Replace permissive boolean parser with a number-style parser dedicated to API contract values. -- Keep a narrow fallback for bool only if required by runtime typing differences. - -## Phase 3: Validation -- Run formatter and app test command after environment bootstrap. - -# Acceptance Criteria -- Save requests send `is_default` as number-style values (`1` or `0`). -- Response parsing no longer relies on generic string coercion for `is_default`. -- Existing app test command still passes. diff --git a/docs/plans/2026-04-01-07-19-UTC-pr77-inline-comments-followup.md b/docs/plans/2026-04-01-07-19-UTC-pr77-inline-comments-followup.md deleted file mode 100644 index c96965ea..00000000 --- a/docs/plans/2026-04-01-07-19-UTC-pr77-inline-comments-followup.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -PR #77 review comments flagged edge cases in slot-id churn and `is_default` parsing strictness. - -# Goals -1. Avoid slot id churn when default model input is empty. -2. Parse `is_default` strictly as 0/1 for number-style contract. -3. Keep UI hint and save behavior aligned for empty model names. - -# Implementation Plan (phased) -## Phase 1: Save-path slot handling -- Preserve existing slot id if default model is blank during save. - -## Phase 2: Strict is_default parsing -- Accept numeric 0/1 only; treat unexpected numeric values as false and log. - -## Phase 3: UI slot synchronization -- Update model `onChanged` logic to keep existing slot when model is blank. - -## Phase 4: Validation -- Run init, format, and targeted app test. - -# Acceptance Criteria -- Clearing model input does not generate timestamp-based slot ids in local state. -- Save uses existing slot id when model input is blank. -- `is_default` parser only treats 1 as true and 0 as false for numeric values. diff --git a/docs/plans/2026-04-01-07-23-UTC-strict-is-default-number-only.md b/docs/plans/2026-04-01-07-23-UTC-strict-is-default-number-only.md deleted file mode 100644 index d6bd29e3..00000000 --- a/docs/plans/2026-04-01-07-23-UTC-strict-is-default-number-only.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -Follow-up review asks to ensure PR #77 inline comments are fully satisfied with a strict number-style `is_default` contract and no permissive fallback behavior. - -# Goals -1. Enforce number-only parsing for `is_default` (0/1). -2. Keep previously fixed slot-id churn protections intact. -3. Validate and commit the follow-up patch. - -# Implementation Plan (phased) -## Phase 1: Parser strictness -- Remove bool fallback from `_parseIsDefaultNumber`. -- Keep explicit 0/1 mapping and debug logging for invalid values. - -## Phase 2: Validation -- Run bootstrap, formatter, and targeted Flutter test. - -# Acceptance Criteria -- `_parseIsDefaultNumber` accepts only numeric values and maps strictly: `1 => true`, `0 => false`. -- Non-0/1 numeric and non-numeric values are treated as false with debug logs. -- Existing app test command passes. diff --git a/docs/plans/2026-04-01-08-11-UTC-navigation-page-animation-direction.md b/docs/plans/2026-04-01-08-11-UTC-navigation-page-animation-direction.md deleted file mode 100644 index e68ed94f..00000000 --- a/docs/plans/2026-04-01-08-11-UTC-navigation-page-animation-direction.md +++ /dev/null @@ -1,18 +0,0 @@ -# Background -Users reported that tapping the top-left button on the chat page opens the `Navigation` page with a right-to-left push animation. They want this specific transition to enter from left to right instead. - -# Goals -- Make the `Navigation` page transition in from the left edge when opened from chat. -- Keep existing destination behavior and returned action handling unchanged. -- Validate that the app still analyzes cleanly after the route change. - -# Implementation Plan (phased) -1. Locate the chat screen route push code that opens `ChatNavigationPage`. -2. Replace the default `MaterialPageRoute` with a custom route transition that slides from `Offset(-1, 0)` to `Offset.zero`. -3. Keep route result typing (`ChatNavigationAction`) intact. -4. Run environment bootstrap and a focused Flutter/Dart check to verify no analyzer regressions. - -# Acceptance Criteria -- When the user taps the top-left navigation button on chat, the `Navigation` page visibly enters from left to right. -- Selecting actions on the `Navigation` page still returns the same `ChatNavigationAction` results and behavior. -- `flutter analyze` for the mobile chat app completes without new issues. diff --git a/docs/plans/2026-04-01-08-13-UTC-model-save-failure-bool-fix.md b/docs/plans/2026-04-01-08-13-UTC-model-save-failure-bool-fix.md deleted file mode 100644 index 2dcb23e5..00000000 --- a/docs/plans/2026-04-01-08-13-UTC-model-save-failure-bool-fix.md +++ /dev/null @@ -1,33 +0,0 @@ -# Background -On the Model Settings screen, changing the default model name and pressing Save currently shows "Failed to save model settings". The mobile client sends `is_default` as numeric `1/0`, while the Node backend route and DB update path expect a boolean value. - -# API Conventions -**Boolean fields at the API level use numeric `0/1`, not JSON `true/false`.** -- Callers (mobile, other clients) MUST send boolean-semantics fields as integer `1` (true) or `0` (false). -- The backend normalizes incoming JSON booleans and string representations (`"true"/"false"`) for backward compatibility, but the canonical wire format is numeric. -- Any new boolean-like fields added to the API should follow the same `0/1` numeric convention. - -# Goals -1. Make model settings save succeed when editing model names. -2. Keep compatibility when reading `is_default` from either boolean or numeric payloads. -3. Add focused test coverage for request payload shape and response parsing. - -> **Note:** Phase 1 below was superseded by follow-up feedback. The chosen wire format is numeric `1/0` (not boolean). The backend now normalizes both formats; see `docs/plans/2026-04-01-08-56-UTC-model-is-default-number-format.md` and `docs/plans/2026-04-01-09-22-UTC-backend-is-default-normalization.md`. - -# Implementation Plan (phased) -## Phase 1: Save payload contract alignment (superseded) -- ~~Update Flutter `LlmConfigService.save` to send `is_default` as a boolean.~~ -- **Actual decision:** Keep mobile sending numeric `1/0`; add route-level normalization on the backend to accept boolean, numeric, and string representations. - -## Phase 2: Defensive response parsing -- Update `is_default` parsing helper to accept booleans and numeric/string equivalents without throwing. - -## Phase 3: Validation -- Add unit tests around `LlmConfigService` save payload and parse behavior. -- Run repository bootstrap and targeted Flutter tests. - -# Acceptance Criteria -- Saving model settings after changing the model name no longer shows the failure snackbar for valid requests. -- Save request payload sends `is_default` as `1` or `0` (numeric). -- Backend accepts `is_default` as boolean, `0/1`, or `"true"`/`"false"` for backward compatibility. -- Parsing handles backend responses with either `true/false` or `1/0` safely. diff --git a/docs/plans/2026-04-01-08-14-UTC-model-settings-delete-button.md b/docs/plans/2026-04-01-08-14-UTC-model-settings-delete-button.md deleted file mode 100644 index 9d4248cf..00000000 --- a/docs/plans/2026-04-01-08-14-UTC-model-settings-delete-button.md +++ /dev/null @@ -1,29 +0,0 @@ -# Background -The model settings page currently provides only a Save action, which makes it impossible to remove an existing model configuration directly from the form actions. - -# Goals -- Add a Delete button on the model settings page. -- Ensure Delete appears to the left and Save appears to the right. -- Implement delete behavior for persisted configs, with safe handling for unsaved configs. -- Keep validation and save behavior unchanged. - -# Implementation Plan (phased) -1. **Service support** - - Add a `deleteConfig` method in `LlmConfigService` that sends `DELETE /api/config/{id}` with auth headers. -2. **UI and interaction** - - Add `_deleteCurrentConfig` method in `ModelSettingsScreen`. - - For persisted configs (`id != null`), prompt for confirmation and call the service delete API. - - For unsaved local configs (`id == null`), remove locally without API call. - - Keep at least one editable config by creating a blank default if all configs are removed. -3. **Action layout** - - Replace the single Save button with a horizontal row: - - Delete button on the left. - - Save button on the right. -4. **Validation checks** - - Run environment bootstrap and at least one Dart/Flutter check command. - -# Acceptance Criteria -- Model settings page shows both actions with Delete on the left and Save on the right. -- Tapping Delete removes the active config (with confirmation for persisted configs). -- Save continues to persist the active config as before. -- Validation command(s) complete successfully (for example: `flutter analyze`, `flutter test`). diff --git a/docs/plans/2026-04-01-08-17-UTC-chat-real-model-integration.md b/docs/plans/2026-04-01-08-17-UTC-chat-real-model-integration.md deleted file mode 100644 index a8043ec9..00000000 --- a/docs/plans/2026-04-01-08-17-UTC-chat-real-model-integration.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -The current chat flow in `agent_core` returns a local stub response (`(agent_core stub) Received: ...`) instead of invoking a real LLM provider. This blocks end-to-end conversational behavior in the app. - -# Goals -- Replace the stub path in `AgentSessionImpl` with real provider HTTP calls. -- Support current configured providers (`anthropic`, `gemini`) with model selection from `AgentSettings`. -- Preserve existing `AgentSessionEvent` behavior (`TextDeltaEvent`, `MessageCompleteEvent`, `AgentErrorEvent`, `RunCompleteEvent`). -- Keep tests passing and add coverage for provider/error handling. - -# Implementation Plan (phased) -1. Add a small provider gateway inside `agent_core` that maps `AgentSettings.provider` to real HTTP APIs. -2. Read provider credentials and endpoints from environment (`String.fromEnvironment`) and fail fast with actionable errors when missing. -3. Update `AgentSessionImpl` to call the gateway and emit deltas + completion text from provider output. -4. Add unit tests for: - - successful provider response mapping - - unsupported provider handling - - missing credentials handling -5. Run project bootstrap and package tests (`./tools/init_dev_env.sh`, `melos exec --scope=agent_core -- dart test`). - -# Acceptance Criteria -- Sending a message through `AgentSessionImpl` attempts a real LLM API call for supported providers instead of echoing the stub text. -- On success, exactly one `MessageCompleteEvent` is emitted with model output text. -- On configuration/provider failures, `AgentErrorEvent` is emitted with useful diagnostic text. -- `RunCompleteEvent` is always emitted and session lifecycle semantics remain unchanged. -- `melos exec --scope=agent_core -- dart test` passes. diff --git a/docs/plans/2026-04-01-08-56-UTC-model-is-default-number-format.md b/docs/plans/2026-04-01-08-56-UTC-model-is-default-number-format.md deleted file mode 100644 index a730d04c..00000000 --- a/docs/plans/2026-04-01-08-56-UTC-model-is-default-number-format.md +++ /dev/null @@ -1,22 +0,0 @@ -# Background -Follow-up feedback requires `is_default` to use number-style values (`0/1`) instead of booleans (`true/false`) in model settings payloads. - -# Goals -1. Restore `is_default` request payload format to `0/1`. -2. Keep save behavior stable for model name edits. -3. Validate the mobile app tests still pass. - -# Implementation Plan (phased) -## Phase 1: Payload format correction -- Update `LlmConfigService.save` to encode `is_default` as numeric `1` or `0`. - -## Phase 2: Parser alignment -- Keep response parsing aligned with number-style contract and avoid boolean-first behavior. - -## Phase 3: Validation -- Run bootstrap and mobile Flutter test suite. - -# Acceptance Criteria -- Save payload sends `is_default` as `1` or `0`. -- Editing model name and saving no longer fails due to payload type mismatch. -- `flutter test` for `apps/mobile_chat_app` passes. diff --git a/docs/plans/2026-04-01-09-00-UTC-local-env-gaps-and-validation.md b/docs/plans/2026-04-01-09-00-UTC-local-env-gaps-and-validation.md deleted file mode 100644 index 566850cc..00000000 --- a/docs/plans/2026-04-01-09-00-UTC-local-env-gaps-and-validation.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -The previous iteration exposed a local tooling gap: workspace guidance and verification used a scoped `melos run ... --scope=...` pattern that is not supported by the installed Melos CLI behavior in this environment. This made reproducible local verification harder. - -# Goals -- Remove local verification friction caused by Melos command mismatch. -- Make init/bootstrap flow provide a reliable `melos` command in common shell paths. -- Document and verify the supported scoped test workflow. - -# Implementation Plan (phased) -1. Update `tools/init_dev_env.sh` to create/update a `melos` shim in `~/.local/bin` (same pattern as `flutter`/`dart`). -2. Update script output to show the supported scoped test command (`melos exec --scope= -- `). -3. Run initialization and verify: - - `melos` is invokable in-session after init. - - scoped package tests succeed via supported Melos syntax. - -# Acceptance Criteria -- Running `./tools/init_dev_env.sh` leaves a working `melos` command accessible via standard shim path setup in the current shell. -- The script’s completion instructions include a valid scoped test invocation pattern. -- Scoped `agent_core` tests pass using the documented command. diff --git a/docs/plans/2026-04-01-09-22-UTC-backend-is-default-normalization.md b/docs/plans/2026-04-01-09-22-UTC-backend-is-default-normalization.md deleted file mode 100644 index 9789abfd..00000000 --- a/docs/plans/2026-04-01-09-22-UTC-backend-is-default-normalization.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -The client is using number-style `is_default` values (`0/1`) per product expectation. The backend route layer currently forwards `is_default` directly, and the service/database layer expects a boolean, which can still cause save failures depending on runtime coercion. - -# API Conventions -**Boolean fields at the API level use numeric `0/1`, not JSON `true/false`.** -- Callers MUST send `is_default` (and any future boolean fields) as integer `1` or `0`. -- The backend normalizes JSON booleans and string forms for backward compatibility only; new clients should always use `0/1`. - -# Goals -1. Ensure backend accepts `0/1` for `is_default` without save failures. -2. Preserve compatibility with boolean payloads. -3. Return clear 400 errors for invalid `is_default` values. - -# Implementation Plan (phased) -## Phase 1: Route-level normalization -- Add a route helper to normalize `is_default` values to boolean. -- Apply normalization in both POST and PUT config handlers. - -## Phase 2: Validation behavior -- Reject unsupported values with HTTP 400 and an explicit error message. - -## Phase 3: Validation -- Run backend type-check and backend tests. - -# Acceptance Criteria -- Requests with `is_default: 1` or `is_default: 0` save successfully. -- Requests with `is_default: true/false` remain supported. -- Invalid values like `is_default: 2` return HTTP 400. diff --git a/docs/plans/2026-04-01-09-45-UTC.md b/docs/plans/2026-04-01-09-45-UTC.md deleted file mode 100644 index 071fe430..00000000 --- a/docs/plans/2026-04-01-09-45-UTC.md +++ /dev/null @@ -1,26 +0,0 @@ -# Plan: PR #82 Copilot-trigger comment workflow (merged) - -## Background -Multiple short-lived plan files were created while validating GitHub token permissions and posting trigger comments to `askman-dev/bricks` PR #82. A single consolidated plan is preferred. - -## Goals -- Keep one merged plan document for the PR #82 comment workflow. -- Provide a Codex skill that teaches how to post a PR comment that triggers Copilot to address review comments. -- Ensure the skill follows Codex skill directory and file conventions. - -## Implementation Plan (phased) -1. Consolidate plan artifacts - - Merge previous plan intent/history into this single file. - - Remove older task-specific plan files. -2. Add Codex skill - - Create a new skill under `.codex/skills/` with required `SKILL.md`. - - Add a reusable script in the skill's `scripts/` folder to post the trigger comment. - - Document exact command usage and fallback from `GH_TOKEN` to `GITHUB_TOKEN`. -3. Validate - - Run skill validation (`quick_validate.py`) against the new skill. - - Run the bundled script help or syntax check to verify command wiring. - -## Acceptance Criteria -- Only one plan file remains for this PR #82 comment workflow. -- A new skill exists under `.codex/skills/` with valid frontmatter and actionable instructions. -- The bundled script can post the Copilot-trigger comment when a valid token is supplied. diff --git a/docs/plans/2026-04-01-10-52-UTC-libsql-now-fix.md b/docs/plans/2026-04-01-10-52-UTC-libsql-now-fix.md deleted file mode 100644 index 787d33ec..00000000 --- a/docs/plans/2026-04-01-10-52-UTC-libsql-now-fix.md +++ /dev/null @@ -1,18 +0,0 @@ -# Background -A production error occurs when updating API config in the Node backend with LibSQL/SQLite: `no such function: NOW`. The update statement in `configService.ts` still uses PostgreSQL-style `NOW()`. - -# Goals -- Replace the non-portable timestamp function with SQLite-compatible SQL. -- Ensure the config update flow succeeds on LibSQL. -- Validate backend code still compiles/tests for the touched area. - -# Implementation Plan (phased) -1. Locate the `updateApiConfig` SQL update statement using `updated_at = NOW()`. -2. Replace `NOW()` with `CURRENT_TIMESTAMP` in that query. -3. Run focused backend validation (`vitest` and/or type-check) to catch regressions. -4. Commit the plan and code change. - -# Acceptance Criteria -- Updating API config no longer fails with `SQL_INPUT_ERROR: no such function: NOW`. -- `apps/node_backend/src/services/configService.ts` uses SQLite-compatible timestamp SQL for `updated_at`. -- Relevant backend validation command(s) complete successfully. diff --git a/docs/plans/2026-04-01-10-59-UTC-vercel-log-retrieval.md b/docs/plans/2026-04-01-10-59-UTC-vercel-log-retrieval.md deleted file mode 100644 index 147c61db..00000000 --- a/docs/plans/2026-04-01-10-59-UTC-vercel-log-retrieval.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -用户提供了一个 Vercel 日志页面链接(`/askman-dev/bricks/logs?...selectedLogId=...`),希望在容器环境中直接拿到对应日志内容。 - -# Goals -1. 尝试通过可用凭据和 API 访问该日志。 -2. 若无法直接按 `selectedLogId` 精确提取,至少拿到同项目的最新可访问构建日志。 -3. 记录可复现命令,便于后续继续排查。 - -# Implementation Plan (phased) -## Phase 1: 识别访问方式与鉴权 -- 验证日志页面是否需要登录重定向。 -- 检查环境变量是否存在 `VERCEL_TOKEN`。 - -## Phase 2: 通过 Vercel API 枚举团队/项目/部署 -- 查询 team(slug: `askman-dev`)。 -- 查询项目 `bricks` 的 `projectId`。 -- 枚举最新部署并提取 deployment uid。 - -## Phase 3: 拉取部署构建日志并检索目标标识 -- 调用 `GET /v3/deployments/{uid}/events` 获取构建日志流。 -- 在最近部署事件中检索 `selectedLogId` 前缀(`qpksf`)。 -- 若无命中,输出可访问日志样本与下一步建议(在 dashboard 中按时间定位 runtime log)。 - -# Acceptance Criteria -- 能确认页面是否登录受限(有明确 HTTP 重定向证据)。 -- 能用 `VERCEL_TOKEN` 成功调用 Vercel API 并返回 `askman-dev/bricks` 项目信息。 -- 能成功获取至少一个 deployment 的 build events 日志。 -- 提供可复现命令(`curl`/`jq`)用于后续继续定位。 diff --git a/docs/plans/2026-04-01-11-07-UTC-vercel-api-last10-logs-and-skill.md b/docs/plans/2026-04-01-11-07-UTC-vercel-api-last10-logs-and-skill.md deleted file mode 100644 index 143c8753..00000000 --- a/docs/plans/2026-04-01-11-07-UTC-vercel-api-last10-logs-and-skill.md +++ /dev/null @@ -1,30 +0,0 @@ -# Background -用户要求我继续执行: -1) 实际拿到按时间排序的最后 10 条 Vercel 日志; -2) 总结一套可复用的方法,用于后续前端报错时快速通过日志补充上下文; -3) 将方法沉淀为一个可触发的 skill。 - -# Goals -1. 使用 `VERCEL_TOKEN` + API 获取 `askman-dev/bricks` 最新部署日志,并按时间倒序提取最后 10 条。 -2. 把可复用步骤脚本化,降低重复操作成本。 -3. 新增 skill,明确触发条件、标准流程和输出格式,支持后续排障。 - -# Implementation Plan (phased) -## Phase 1: 拉取最后 10 条日志 -- 查询 teamId / projectId / 最新 deployment uid。 -- 调用 `GET /v3/deployments/{uid}/events`。 -- 用 `jq` 进行 `sort_by(.created) | reverse | .[:10]` 输出。 - -## Phase 2: 沉淀脚本 -- 新增 `tools/vercel/fetch_latest_deployment_logs.sh`,支持参数化 team/project/limit。 -- 默认输出最近 10 条,时间字段转成 UTC 字符串。 - -## Phase 3: 沉淀 skill -- 新增 `.codex/skills/vercel-api-log-context/SKILL.md`。 -- 写明前端报错场景下的日志排查流程、关键命令、上下文提取规范。 -- 运行 skill 校验工具检查 frontmatter 合法性。 - -# Acceptance Criteria -- 命令能返回 `askman-dev/bricks` 最新 deployment 的最后 10 条日志(按时间倒序)。 -- 新脚本可独立执行并输出结构化 JSON。 -- 新 skill 能描述触发条件、操作步骤、产出模板,且通过基础校验。 diff --git a/docs/plans/2026-04-01-12-39-UTC-agentsmd-api-debug-skill-routing.md b/docs/plans/2026-04-01-12-39-UTC-agentsmd-api-debug-skill-routing.md deleted file mode 100644 index 3d6fc936..00000000 --- a/docs/plans/2026-04-01-12-39-UTC-agentsmd-api-debug-skill-routing.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -The user asked to update the repository-level AGENTS.md guidance so that, when debugging API errors, the agent explicitly attempts to use the `vercel-api-log-context` skill to gather log context. - -# Goals -1. Add a clear instruction in `AGENTS.md` for API/interface error debugging workflows. -2. Ensure the instruction references the existing `vercel-api-log-context` skill by name. -3. Keep the change minimal and easy to discover for future agent runs. - -# Implementation Plan (phased) -## Phase 1: Update repository guidance -- Add a dedicated section in `AGENTS.md` for API debugging behavior. -- Insert an instruction that says to try `vercel-api-log-context` when troubleshooting API errors. - -## Phase 2: Verify formatting and placement -- Confirm the new section is visible in the top-level guidance. -- Confirm wording is imperative and unambiguous. - -# Acceptance Criteria -- `AGENTS.md` includes a section that explicitly instructs agents to try the `vercel-api-log-context` skill during API error debugging. -- The instruction is in the repository root `AGENTS.md` and applies to the full repo scope. diff --git a/docs/plans/2026-04-01-12-55-UTC-chat-send-no-request.md b/docs/plans/2026-04-01-12-55-UTC-chat-send-no-request.md deleted file mode 100644 index 9e719fb8..00000000 --- a/docs/plans/2026-04-01-12-55-UTC-chat-send-no-request.md +++ /dev/null @@ -1,21 +0,0 @@ -# Background -User reports that typing and sending a chat message in the web UI does not produce any corresponding network request in DevTools and no assistant reply is received. During review, test-status notes also needed correction because `flutter test apps/mobile_chat_app` from repo root failed for command-context reasons while package tests pass from the app directory. - -# Goals -- Reproduce or identify the code path that handles chat send actions. -- Determine why no outbound request is being issued. -- Implement a fix so sending a message reliably triggers the backend request. -- Clarify the correct test invocation for `mobile_chat_app` and document accurate validation status. - -# Implementation Plan (phased) -1. Inspect chat UI send handler wiring and state guards in Flutter widgets/view-models. -2. Trace the request pipeline from send action to API client invocation. -3. Fix any gating, early-return, or misconfigured endpoint/client logic preventing request dispatch. -4. Validate package test dependencies in `apps/mobile_chat_app/pubspec.yaml` and re-run tests with both invocation styles (`flutter test apps/mobile_chat_app` and `cd apps/mobile_chat_app && flutter test`). -5. Update PR/reviewer-facing notes to describe the real failure mode and reproducible passing command. - -# Acceptance Criteria -- Sending a message from the chat input invokes the request pipeline (observable in code flow and testable behavior). -- No unconditional/incorrect early-return prevents network dispatch when valid input is provided. -- Validation notes accurately describe root-command failure mode and include the passing package-directory command. -- Relevant checks are listed explicitly (for example: `flutter analyze apps/mobile_chat_app`, `cd apps/mobile_chat_app && flutter test`). diff --git a/docs/plans/2026-04-01-13-46-UTC-chat-send-session-error-handling.md b/docs/plans/2026-04-01-13-46-UTC-chat-send-session-error-handling.md deleted file mode 100644 index de00401d..00000000 --- a/docs/plans/2026-04-01-13-46-UTC-chat-send-session-error-handling.md +++ /dev/null @@ -1,18 +0,0 @@ -# Background -After deploying the prior fix, the user still reports that sending messages yields no response. This indicates session initialization or stream start failures may still be uncaught, leaving the UI without assistant output. - -# Goals -- Ensure chat send flow handles session creation/start errors and surfaces them to the user. -- Prevent the UI from getting stuck in sending/streaming state when async setup fails. -- Keep the behavior observable with clear error text in the assistant message bubble. - -# Implementation Plan (phased) -1. Inspect `_sendMessage` asynchronous flow for unhandled errors in `_sessionForAgent(...).then(...)`. -2. Add explicit error handling (`catchError`) to convert setup failures into assistant-visible error content. -3. Reset `_isSending`/`_isStreaming` flags in that failure path. -4. Run `flutter analyze apps/mobile_chat_app` and `cd apps/mobile_chat_app && flutter test`. - -# Acceptance Criteria -- If session creation/start fails before stream subscription, the assistant placeholder shows `Error: ...`. -- The composer is re-enabled because `_isSending` and `_isStreaming` are reset. -- Static analysis and package tests pass for the touched app package. diff --git a/docs/plans/2026-04-01-14-52-UTC-platform-environment-web-fix.md b/docs/plans/2026-04-01-14-52-UTC-platform-environment-web-fix.md deleted file mode 100644 index 43cee746..00000000 --- a/docs/plans/2026-04-01-14-52-UTC-platform-environment-web-fix.md +++ /dev/null @@ -1,18 +0,0 @@ -# Background -A runtime error still occurs in deployed web builds: `Unsupported operation: Platform._environment`. This indicates `dart:io` environment access is being used on a platform where it is unsupported. - -# Goals -- Remove crash behavior caused by direct `Platform.environment` access on web. -- Keep support for local/server environment variables where available. -- Preserve existing API key/base URL configuration behavior via compile-time defines and runtime environment. - -# Implementation Plan (phased) -1. Refactor `RealModelGateway` default environment initialization to avoid unconditional `Platform.environment` access. -2. Add compile-time (`String.fromEnvironment`) fallbacks for supported config keys. -3. Merge runtime `Platform.environment` values only when available, catching unsupported platform exceptions. -4. Run package analysis/tests to validate no regressions. - -# Acceptance Criteria -- Web runtime no longer throws `Unsupported operation: Platform._environment` when sending messages. -- API key/base URL lookup still works for both compile-time defines and runtime environment maps. -- Relevant analysis/tests pass for touched packages. diff --git a/docs/plans/2026-04-01-15-37-UTC-session-runtime-config-selection.md b/docs/plans/2026-04-01-15-37-UTC-session-runtime-config-selection.md deleted file mode 100644 index d632e9b7..00000000 --- a/docs/plans/2026-04-01-15-37-UTC-session-runtime-config-selection.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -Users need session-scoped model/config selection that can differ from default configuration, especially for parallel conversations and temporary model switches. - -# Goals -- Add session-level (in-memory) runtime selection for config + model in chat. -- Support one config exposing multiple model options. -- Ensure temporary session selection does not mutate persisted default config. - -# Implementation Plan (phased) -1. Extend `LlmConfig` parsing to include available model options from config payload. -2. Add chat runtime state for selected config/model, loaded from default config at startup. -3. Add a chat UI control to switch runtime config/model for the current session only. -4. Rebuild agent sessions when runtime selection changes so subsequent sends use new runtime settings. -5. Run analysis and app tests. - -# Acceptance Criteria -- User can choose config and model in chat without editing saved defaults. -- Selection applies to subsequent messages in current session. -- Reloading app continues to use persisted default unless user switches again. diff --git a/docs/plans/2026-04-01-15-55-UTC-github-review-thread-resolver-and-init-env.md b/docs/plans/2026-04-01-15-55-UTC-github-review-thread-resolver-and-init-env.md deleted file mode 100644 index 7c9e14c5..00000000 --- a/docs/plans/2026-04-01-15-55-UTC-github-review-thread-resolver-and-init-env.md +++ /dev/null @@ -1,39 +0,0 @@ -# Background -We introduced a GitHub PR review-thread resolver skill to support REVIEW_FIXED workflows and avoid redundant Copilot trigger comments. During iteration we also aligned implementation with repository constraints (no Python) and improved environment bootstrap so required CLI dependencies are prepared automatically. - -# Goals -- Provide a reusable skill that can resolve GitHub PR review threads safely. -- Use repository-native tooling (shell script with `curl` + `jq`) instead of Python. -- Ensure bootstrap (`tools/init_dev_env.sh`) installs or validates required commands (`curl`, `jq`) instead of failing late. -- Keep operations auditable via dry-run-first workflow. - -# Implementation Plan (phased) -## Phase 1: Validate GitHub review-thread API behavior -- Query review threads and inspect `id`, `isResolved`, `isOutdated`. -- Validate thread resolution flow via GraphQL mutations (`resolveReviewThread`, and reversibility checks where needed). - -## Phase 2: Implement reusable skill (shell) -- Create `.codex/skills/github-pr-review-thread-resolver/`. -- Add executable script using `curl` + `jq` to: - - page `reviewThreads`, - - filter by mode (`outdated`, `unresolved`, `all`), - - support `--dry-run`, - - resolve selected thread IDs. -- Document usage, safety constraints, and token requirements in `SKILL.md`. - -## Phase 3: Bootstrap dependency hardening -- Update `tools/init_dev_env.sh` to handle `curl`/`jq` as required dependencies. -- Add package-manager detection and automatic installation attempts (`apt-get`, `dnf`, `yum`, `apk`, `pacman`, `brew`). -- Keep explicit manual remediation guidance when auto-install is not possible. - -## Phase 4: Validation and rollout checks -- Run syntax checks for changed shell scripts. -- Execute resolver script in dry-run mode on a real PR for selection visibility. -- Verify init script help output and command-flow integrity. - -# Acceptance Criteria -- A single local skill exists for review-thread resolution in REVIEW_FIXED workflows. -- Skill implementation uses shell tooling only (no Python runtime dependency). -- Resolver supports `--dry-run` and mode-based selection with clear summary output. -- `init_dev_env.sh` proactively attempts to install missing `curl`/`jq` and only fails with actionable guidance if installation cannot be completed. -- Documentation and operational steps are consolidated in one plan file for this change stream. diff --git a/docs/plans/2026-04-01-15-56-UTC-pr91-review-comments.md b/docs/plans/2026-04-01-15-56-UTC-pr91-review-comments.md deleted file mode 100644 index 334f8cd4..00000000 --- a/docs/plans/2026-04-01-15-56-UTC-pr91-review-comments.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -PR #91 received review comments around async error handling, type safety, stream cancellation ordering, and model list normalization. - -# Goals -- Resolve all inline review comments with robust, typed implementations. -- Prevent spinner/deadlock behavior when loading configs fails. -- Normalize and validate model preference parsing to avoid malformed entries. - -# Implementation Plan (phased) -1. Refactor `_loadAgents` to avoid untyped `Future.wait` casts. -2. Add `try/catch` around startup loading and ensure loading flags are cleared on all paths. -3. Await stream subscription cancellation during session reset. -4. Trim/default/normalize/dedupe model values while protecting against empty entries. -5. Run analysis and mobile app tests. - -# Acceptance Criteria -- Review comments on the referenced lines are addressed in code. -- Startup gracefully handles config fetch failures without indefinite loading state. -- Model list parsing does not emit empty/duplicate malformed entries. diff --git a/docs/plans/2026-04-01-16-03-UTC-pr92-review-comment-followup.md b/docs/plans/2026-04-01-16-03-UTC-pr92-review-comment-followup.md deleted file mode 100644 index c07a3e04..00000000 --- a/docs/plans/2026-04-01-16-03-UTC-pr92-review-comment-followup.md +++ /dev/null @@ -1,32 +0,0 @@ -# Background -PR #92 received Copilot review comments covering shell argument parsing, runtime dependency checks, GraphQL error handling, package manager safety/privilege behavior, and skill documentation clarity. - -# Goals -- Address valid review findings in code and skill docs. -- Keep bash-based implementation (non-Python) while improving robustness. -- Resolve review threads after fixes are in place. - -# Implementation Plan (phased) -## Phase 1: Fix `resolve_review_threads.sh` -- Validate `--mode` has a non-empty value before shifting. -- Add explicit `curl` dependency check. -- Harden `graphql_call` with `curl -fsS` and JSON validation. - -## Phase 2: Fix `tools/init_dev_env.sh` -- Handle package installs with root/sudo/doas fallback. -- Improve error guidance when privilege escalation is unavailable. -- Switch pacman install path to `-Syu` to avoid partial-upgrade pattern. - -## Phase 3: Docs alignment -- Update skill prerequisites to mention both `jq` and `curl`. -- Clarify script is bash-based in skill docs. - -## Phase 4: Validate + resolve threads -- Run syntax checks and dry-run command checks. -- Resolve addressed review threads on PR #92. - -# Acceptance Criteria -- All actionable PR #92 review comments are addressed in code/docs. -- Script behavior is more robust for missing args and API failures. -- Init script install behavior handles non-root environments safely. -- Review threads are resolved after updates. diff --git a/docs/plans/2026-04-01-16-07-UTC-backend-llm-fallback-for-user-config.md b/docs/plans/2026-04-01-16-07-UTC-backend-llm-fallback-for-user-config.md deleted file mode 100644 index 6a46536a..00000000 --- a/docs/plans/2026-04-01-16-07-UTC-backend-llm-fallback-for-user-config.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -Users still hit `Missing BRICKS_GEMINI_API_KEY` in chat because direct provider calls depend on process-level environment keys, while user-specific keys are stored in backend configs. - -# Goals -- Allow chat sessions to run through backend user-configured LLM settings when available. -- Remove hard dependency on frontend process environment API keys for normal authenticated chat usage. -- Support session-scoped `configId` + `model` overrides without persisting session state. - -# Implementation Plan (phased) -1. Extend `AgentSettings` with optional backend routing fields (`apiBaseUrl`, `authToken`, `configId`). -2. Add backend chat path in `RealModelGateway` that calls `/api/llm/chat` with auth and optional provider/model/config override. -3. Update mobile chat screen to populate backend routing fields (base URL, token, selected config slot). -4. Update Node backend `/api/llm/chat` + LLM service to accept optional `configId` and resolve runtime config by ID first. -5. Run analyze and tests for affected packages/apps. - -# Acceptance Criteria -- Authenticated chat can succeed without `BRICKS_GEMINI_API_KEY` set in frontend runtime. -- Session model/config overrides are forwarded to backend and do not mutate default config. -- Existing app/package checks pass. diff --git a/docs/plans/2026-04-01-16-15-UTC-bash-not-posix-clarification.md b/docs/plans/2026-04-01-16-15-UTC-bash-not-posix-clarification.md deleted file mode 100644 index f3e9de45..00000000 --- a/docs/plans/2026-04-01-16-15-UTC-bash-not-posix-clarification.md +++ /dev/null @@ -1,22 +0,0 @@ -# Background -A review comment flagged wording mismatch: implementation is bash-specific but some PR narrative used "POSIX shell" language. - -# Goals -- Make repository docs explicit that the resolver script requires bash. -- Avoid implying POSIX `sh` compatibility. - -# Implementation Plan (phased) -## Phase 1: Clarify skill docs -- Add an explicit note in SKILL.md that resolver script requires bash and is not POSIX `sh` compatible. - -## Phase 2: Clarify script header -- Add a short comment near shebang highlighting bash-only features. - -## Phase 3: Validate -- Run `bash -n` on the resolver script. -- Search for remaining "POSIX" references in relevant skill/plan files. - -# Acceptance Criteria -- Skill docs state bash requirement clearly. -- Script itself warns readers that it is bash-only. -- No contradictory POSIX wording remains in skill/plan docs touched by this workflow. diff --git a/docs/plans/2026-04-01-16-26-UTC-pr-review-findings-auto-trigger.md b/docs/plans/2026-04-01-16-26-UTC-pr-review-findings-auto-trigger.md deleted file mode 100644 index c74ea41f..00000000 --- a/docs/plans/2026-04-01-16-26-UTC-pr-review-findings-auto-trigger.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -PR authors currently need to manually add an `@copilot` follow-up comment after a review is submitted with actionable findings. This creates repetitive work and inconsistent timing for starting Copilot-based review-fix workflows. - -# Goals -- Automatically detect `pull_request_review` submissions that should trigger Copilot follow-up. -- Post a single trigger comment per submitted review when that review has comments. -- Prevent duplicate comments during reruns and concurrent executions. -- Emit clear run-time telemetry and actionable error messages. - -# Implementation Plan (phased) -1. Add a dedicated GitHub Actions workflow triggered by `pull_request_review` `submitted` events. -2. Enforce PR-scoped workflow concurrency with `cancel-in-progress: true`. -3. Implement a decision step that: - - validates review state (`commented` or `changes_requested`), - - counts comments for the current review, - - checks existing PR comments for a per-review idempotency marker. -4. Post the default Copilot trigger comment only when all conditions pass, appending an HTML marker keyed by `review_id`. -5. Print structured observability output (PR number, review id/state, comments count, triggered flag, skip reason), and provide permission remediation hints on API failures. - -# Acceptance Criteria -- A single review submission with multiple review comments creates exactly one `@copilot` trigger comment. -- Re-running the same workflow for the same `review_id` does not add a second trigger comment. -- Reviews with zero comments do not create trigger comments. -- If token permissions are insufficient, logs include both the API error and a remediation hint indicating required scopes (`pull_requests: read`, `issues: write`). diff --git a/docs/plans/2026-04-01-16-59-UTC-pr93-conflict-free-branch.md b/docs/plans/2026-04-01-16-59-UTC-pr93-conflict-free-branch.md deleted file mode 100644 index a9bad3c2..00000000 --- a/docs/plans/2026-04-01-16-59-UTC-pr93-conflict-free-branch.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -PR #93 branch has merge conflicts against the current `main` branch, so a conflict-free replacement branch is needed. - -# Goals -- Recreate the PR #93 feature changes on top of the latest `origin/main`. -- Resolve conflicts once in a clean linear history. -- Publish a new branch that can be used to open a fresh no-conflict PR. - -# Implementation Plan (phased) -1. Fetch remote refs and inspect PR #93 commit history. -2. Create a new branch from `origin/main`. -3. Cherry-pick the feature commits from PR #93 (excluding merge commits) and resolve any conflicts. -4. Run targeted tests/checks for changed areas. -5. Commit any conflict-resolution adjustments and push the new branch. - -# Acceptance Criteria -- A new branch exists on remote containing PR #93 functionality. -- `git status` is clean and branch is based on latest `origin/main`. -- Relevant tests for the touched package(s) complete successfully. -- New branch can be used to open a PR without conflicts. diff --git a/docs/plans/2026-04-01-18-00-UTC-llm-chat-root-cause-and-key-handling.md b/docs/plans/2026-04-01-18-00-UTC-llm-chat-root-cause-and-key-handling.md deleted file mode 100644 index 8cd3b306..00000000 --- a/docs/plans/2026-04-01-18-00-UTC-llm-chat-root-cause-and-key-handling.md +++ /dev/null @@ -1,23 +0,0 @@ -# Background -Chat requests failed with opaque backend errors when stored provider keys were not usable at runtime. Earlier iterations introduced multiple plan documents and one defensive runtime rule that could overfit to current provider key shapes. - -# Goals -- Make this the canonical technical plan for this session while acknowledging that earlier same-day plan drafts may remain for historical context. -- Preserve the root-cause fix for decryption mismatch without imposing provider-specific API key pattern assumptions. -- Make encrypted-key detection robust and future-compatible. - -# Implementation Plan (phased) -1. Clearly document the current, canonical plan for this session in this file. -2. Remove runtime rejection logic that guesses whether a provider key is encrypted ciphertext. -3. Version encrypted payload format (`enc:v1:`) and keep backward-compatible legacy decryption. -4. Add explicit `api_key_encrypted` metadata on write paths so reads do not rely on provider key shape assumptions. -5. Enforce a single encryption key source (`ENCRYPTION_KEY`) and fail fast at backend startup when it is missing/empty. -6. Validate via targeted tests and backend type-check. - -# Acceptance Criteria -- This document is clearly marked and used as the canonical plan for this session, even if earlier drafts from the same date remain under `docs/plans/`. -- No provider key prefix/shape assumptions are used to reject runtime config in LLM service. -- Encrypted keys can be detected via explicit metadata and versioned format. -- Legacy encrypted values continue to decrypt. -- Backend startup fails when `ENCRYPTION_KEY` is missing/empty, preventing bad deployments. -- Tests and type-check pass. diff --git a/docs/plans/2026-04-01-18-32-UTC-pr-review-thread-auto-resolver-comment.md b/docs/plans/2026-04-01-18-32-UTC-pr-review-thread-auto-resolver-comment.md deleted file mode 100644 index de033e99..00000000 --- a/docs/plans/2026-04-01-18-32-UTC-pr-review-thread-auto-resolver-comment.md +++ /dev/null @@ -1,34 +0,0 @@ -# Background -The repository has two GitHub workflows related to pull request review automation. The `pr_review_thread_auto_resolver.yml` workflow resolves outdated review threads automatically, but it currently does not leave a human-visible comment after successful resolution. Maintainers want explicit visibility when the automation runs and resolves threads, while avoiding noise when no action is taken. - -# Goals -1. Update the auto resolver workflow so it posts an English PR comment when it successfully resolves one or more review threads. -2. Ensure the comment clearly indicates that the resolutions were performed by automation (robot) using the same personal token that performs the resolve mutations. -3. Ensure no comment is posted when the workflow executes but resolves zero threads. - -# Implementation Plan (phased) -## Phase 1: Review current resolver output contract -- Read `.github/workflows/pr_review_thread_auto_resolver.yml` and the resolver script used by the workflow. -- Confirm what structured output is available for detecting resolved count and listing resolved thread references. - -## Phase 2: Extend workflow with parse + conditional comment -- Capture resolver script output to a log file while keeping console output. -- Parse: - - `resolved_threads=` for resolved count. - - Per-thread lines for `url=` values to surface links to threads resolved by automation. -- Expose parsed values via step outputs. -- Add a conditional `actions/github-script` step that posts a PR comment only when resolved count is greater than zero. -- Use `${{ secrets.GH_TOKEN }}` for that comment action to match the token used for thread resolution. - -## Phase 3: Validate syntax and summarize -- Run YAML lint/inspection check (or targeted sanity check command) to verify workflow file integrity. -- Review diff and ensure behavior matches requirements: comment only on actual resolution actions. - -# Acceptance Criteria -- On runs where at least one review thread is resolved, a PR comment is added in English and includes: - - confirmation that auto resolver succeeded, - - explicit note that resolved status was set by automation, - - references to resolved thread comment URLs when available. -- On runs where zero threads are resolved, no PR comment is created. -- Comment creation uses `${{ secrets.GH_TOKEN }}` (same token identity used for resolve actions). -- Workflow remains valid and runnable in GitHub Actions. diff --git a/docs/plans/2026-04-01-19-24-UTC-chat-ui-navigation-adjustments.md b/docs/plans/2026-04-01-19-24-UTC-chat-ui-navigation-adjustments.md deleted file mode 100644 index 60ea18bb..00000000 --- a/docs/plans/2026-04-01-19-24-UTC-chat-ui-navigation-adjustments.md +++ /dev/null @@ -1,27 +0,0 @@ -# Background -The chat UI currently has a microphone button in the composer row, session settings in the sidebar navigation, and model selection in the app bar. On mobile, swiping in from the left edge can also invoke browser back navigation instead of opening in-app navigation. - -# Goals -1. Remove the voice/microphone button from the composer input row. -2. Add a secondary action row under the input: - - Left: an adjustment button that opens a menu containing: - - 新上下文 (no-op) - - 模型 (opens the existing model selection dialog) - - Agents (no-op) - - Right: send/stop button. -3. Remove "Session Settings" from the sidebar navigation and remove the corresponding page entrypoint from chat navigation flow. -4. Improve left-edge interaction so opening in-app sidebar is preferred and browser-style back navigation is suppressed from the chat root route. - -# Implementation Plan (phased) -1. Update `ComposerBar` to remove the mic button, add a new action row/menu, and move send/stop button to the new row. -2. Wire a new callback from `ChatScreen` into `ComposerBar` to launch the existing runtime model configuration dialog. -3. Replace push-based navigation page with a `Drawer`-based sidebar in `ChatScreen` (opened by AppBar menu button and edge drag), and add `PopScope(canPop: false)` at the chat root to suppress back pop on this screen. -4. Simplify `ChatNavigationPage` action enum and menu list by removing session settings. -5. Remove `SessionSettingsPage` source and its dedicated widget test now that it is no longer reachable from the app navigation. - -# Acceptance Criteria -1. Composer input no longer shows a mic icon; a separate action row appears below input with adjustment-menu left and send/stop right. -2. Tapping adjustment -> 模型 opens the existing session model dialog. -3. Sidebar no longer contains "Session Settings". -4. Chat root route does not pop on back gesture/action (preventing unintended browser-back behavior from app route pop). -5. Flutter widget tests pass for touched chat/navigation components (`flutter test` in `apps/mobile_chat_app`). diff --git a/docs/plans/2026-04-02-02-56-UTC-oauth-dynamic-preview-return.md b/docs/plans/2026-04-02-02-56-UTC-oauth-dynamic-preview-return.md deleted file mode 100644 index 98c3056f..00000000 --- a/docs/plans/2026-04-02-02-56-UTC-oauth-dynamic-preview-return.md +++ /dev/null @@ -1,35 +0,0 @@ -# Background -GitHub OAuth callback URL must stay fixed, but preview deployments run on dynamic Vercel hostnames. Current login flow always redirects to `/` after callback, so users starting on preview URLs cannot reliably return to their originating deployment. - -# Goals -1. Keep existing callback path unchanged. -2. Allow login initiated from preview domains matching `bricks--askman-dev.vercel.app`. -3. Validate the requested start/return URL before redirecting to GitHub. -4. Return users to the validated originating URL after callback. - -# Implementation Plan (phased) -## Phase 1: OAuth return URL validation and state transport -- Add a backend helper that validates `return_to` values using: - - `https` protocol - - host pattern `^bricks-[A-Za-z0-9]+-askman-dev\.vercel\.app$` - - optional allowlist from env for stable first-party domains - - localhost allowances for dev -- On `/auth/github`, accept `return_to` query and validate it. -- Put `{ nonce, returnTo }` inside OAuth `state` payload while continuing CSRF cookie nonce checking. - -## Phase 2: Callback redirect behavior -- Decode `state` in callback. -- Verify nonce against cookie and extract validated `returnTo`. -- Keep callback path unchanged and only alter query/state behavior. -- Update redirect response HTML to navigate to `returnTo` instead of always `/`. - -## Phase 3: Docs and validation -- Update backend API docs and README to document `return_to` behavior and domain constraints. -- Run backend type-check and tests. - -# Acceptance Criteria -1. `GET /api/auth/github?return_to=https://bricks-abc123-askman-dev.vercel.app/` redirects to GitHub with encoded state that includes that return URL. -2. `GET /api/auth/github?return_to=https://evil.example.com/` is rejected with HTTP 400. -3. Callback continues to use the existing path and succeeds when `state.nonce` matches cookie nonce. -4. Successful callback redirects browser to the validated `returnTo` URL. -5. Backend checks (`npm run type-check`, `npm test`) pass. diff --git a/docs/plans/2026-04-02-04-38-UTC-github-return-to-validation.md b/docs/plans/2026-04-02-04-38-UTC-github-return-to-validation.md deleted file mode 100644 index fa76e014..00000000 --- a/docs/plans/2026-04-02-04-38-UTC-github-return-to-validation.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -Users hitting `/api/auth/github` with `return_to=https://bricks.askman.dev/` can receive `{"error":"Invalid return_to URL"}` when `OAUTH_ALLOWED_RETURN_ORIGINS` does not include the production app origin. - -# Goals -- Accept secure first-party `return_to` values that match the configured OAuth callback origin. -- Preserve existing security checks for localhost/protocol restrictions. -- Add regression tests for return URL validation. - -# Implementation Plan (phased) -1. Update `isAllowedReturnTo` in `apps/node_backend/src/routes/auth_return_to.ts` to allow same-origin redirects derived from `GITHUB_CALLBACK_URL`. -2. Keep existing preview-domain and explicit allowlist checks intact. -3. Add unit tests in `apps/node_backend/src/routes/auth_return_to.test.ts` for callback-origin allow, HTTP rejection on non-localhost, and explicit allowlist behavior. -4. Run backend test/lint/type-check commands. - -# Acceptance Criteria -- A `return_to` URL that is HTTPS and matches the origin of `GITHUB_CALLBACK_URL` is accepted. -- Non-HTTPS non-localhost return URLs remain rejected. -- Existing allowlist behavior via `OAUTH_ALLOWED_RETURN_ORIGINS` still works. -- `npm test`, `npm run lint`, and `npm run type-check` pass in `apps/node_backend`. diff --git a/docs/plans/2026-04-02-06-06-UTC.md b/docs/plans/2026-04-02-06-06-UTC.md deleted file mode 100644 index e9b9ada6..00000000 --- a/docs/plans/2026-04-02-06-06-UTC.md +++ /dev/null @@ -1,31 +0,0 @@ -# OAuth state validation fix for preview-domain login callback - -## Background -Users starting the web app from a Vercel preview URL are being redirected to the production OAuth callback host, and the callback can fail with `{"error":"Invalid or missing OAuth state parameter"}` when the nonce cookie is not available on that host. - -## Goals -- Keep CSRF protections for standard same-host OAuth flows. -- Allow callback validation to succeed for cross-domain preview → production callback flows. -- Preserve backwards compatibility for in-flight/legacy OAuth state values. - -## Implementation Plan - -1. Add a short-lived server-side nonce store (`oauth_states` DB table) to hold the OAuth state nonce and `returnTo` URL recorded at flow initiation, so that state is bound to the server rather than a client-side cookie alone. -2. Keep cookie-based nonce validation as the primary check when the cookie is present. -3. Update callback validation logic (`validateOAuthCallbackState`) to accept either: - - cookie nonce match (same-host flows), or - - successful consumption of the nonce from the server-side store when the cookie is absent (cross-domain preview → production flows). -4. When the cookie is absent but a valid DB record is found, use the `returnTo` URL from the database record (not from the state parameter) to prevent open-redirect attacks. -5. Explicitly reject states that are missing from the DB store or whose cookie nonce does not match, to prevent replay/cross-use across accounts or hosts. -6. Add unit tests covering all validation paths: cookie match, cookie mismatch, DB hit, DB miss, legacy hex state, and empty-cookie edge case. - -## Security Notes -- A purely stateless signed-state approach (HMAC without a server-side record) does **not** provide CSRF protection: an attacker can obtain a valid signed state by initiating OAuth themselves, then trick a victim into visiting the callback URL with a different authorization code, logging the victim into the attacker's account. -- The server-side nonce store avoids this because the nonce is one-time use and can only be consumed once at the shared production backend. -- Preview and production deployments share the same Turso database, so a nonce stored by the preview backend is visible to the production callback. - -## Acceptance Criteria -- Starting OAuth from a preview domain and returning to production callback no longer fails solely due to missing `oauth_state` cookie (nonce is found in the shared DB store). -- Same-host OAuth still validates nonce against the cookie (cookie match path). -- CSRF protections are preserved: nonces are one-time use and server-side; an attacker cannot replay a signed-but-stateless state. -- Existing tests pass and new tests cover all validation branches. diff --git a/docs/plans/2026-04-02-06-19-UTC-composer-unified-border.md b/docs/plans/2026-04-02-06-19-UTC-composer-unified-border.md deleted file mode 100644 index 157cdea6..00000000 --- a/docs/plans/2026-04-02-06-19-UTC-composer-unified-border.md +++ /dev/null @@ -1,18 +0,0 @@ -# Background -The current mobile chat composer renders the text input and the tool row (menu + send/stop controls) in separate visual blocks. Product feedback requests a Gemini-like treatment where both regions sit inside one shared rounded border while preserving all current behaviors. - -# Goals -- Keep all existing composer functionality unchanged (menu actions, send/stop logic, mention behavior). -- Update only visual/layout styling so the input and tool row appear inside one unified container border. -- Ensure widget tests continue to pass after layout refactoring. - -# Implementation Plan (phased) -1. Inspect `ComposerBar` structure and identify where the input and tool row are currently split. -2. Refactor `ComposerBar` layout so input + controls are wrapped by a single bordered `Container` with rounded corners. -3. Remove duplicate inner text-field outline styling, replacing it with a borderless field that sits inside the shared container. -4. Run mobile app tests focused on `composer_bar_test.dart` to validate no functional regressions. - -# Acceptance Criteria -- The composer input and bottom tool row render within one rounded rectangular border in the mobile chat UI. -- Menu, send, stop, and mention features behave exactly as before. -- `cd apps/mobile_chat_app && flutter test test/composer_bar_test.dart` passes. diff --git a/docs/plans/2026-04-02-07-09-UTC-drawer-top-alignment.md b/docs/plans/2026-04-02-07-09-UTC-drawer-top-alignment.md deleted file mode 100644 index 5fc30a5b..00000000 --- a/docs/plans/2026-04-02-07-09-UTC-drawer-top-alignment.md +++ /dev/null @@ -1,21 +0,0 @@ -# Background -用户反馈侧边栏展开后,导航内容在竖直方向看起来偏中间,不符合“顶部对齐”的预期。当前 `ChatNavigationPage` 使用 `DrawerHeader`,其默认高度与底部对齐文本会造成顶部留白。 - -# Goals -- 让侧边栏展开后可见内容从顶部开始布局。 -- 保持现有导航项与交互行为不变。 -- 通过现有 Flutter 测试验证无回归。 - -# Implementation Plan (phased) -1. Inspect - - 检查 `ChatNavigationPage` 的布局结构,定位导致顶部大留白的组件。 -2. Implement - - 将默认高度较大的 `DrawerHeader` 替换为更紧凑的顶部标题容器(或调整其布局),确保列表内容从顶部开始。 -3. Validate - - 运行仓库初始化脚本。 - - 在移动端包目录运行相关 Flutter 测试,确认导航项文本与交互测试通过。 - -# Acceptance Criteria -- 打开 Drawer 后,顶部不会出现不必要的大面积空白,导航内容视觉上从顶部开始。 -- `Current Chat`、`Sessions`、`Manage Agents`、`Settings` 仍然可见并保持原有行为。 -- 相关 Flutter 测试通过(例如 `chat_navigation_page_test.dart`)。 diff --git a/docs/plans/2026-04-02-07-11-UTC-composer-bar-button-style.md b/docs/plans/2026-04-02-07-11-UTC-composer-bar-button-style.md deleted file mode 100644 index f85df7b7..00000000 --- a/docs/plans/2026-04-02-07-11-UTC-composer-bar-button-style.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -The chat composer currently renders a horizontal divider line between the text input area and the button row, and the send button uses a larger filled style than the left-side action button. This creates an imbalanced visual hierarchy in the input area. - -# Goals -- Remove the divider above the button row in the composer. -- Make the send button visual size match the left action button. -- Preserve existing send/loading/disabled behavior. - -# Implementation Plan (phased) -1. Inspect `ComposerBar` widget layout and identify the divider and send button implementations. -2. Remove the divider widget between text field and action row. -3. Replace the oversized filled send icon button with a standard `IconButton` so it matches the action button's visual scale. -4. Keep spinner behavior for sending state and keep stop button behavior unchanged. -5. Run focused Flutter tests for the mobile app package. - -# Acceptance Criteria -- In the composer UI, there is no visible dividing line above the action row. -- The send button appears the same size class as the left action icon button. -- Message send action still triggers on send button tap and Enter/send submit. -- Validation command succeeds: `cd apps/mobile_chat_app && flutter test`. diff --git a/docs/plans/2026-04-02-07-51-UTC-ai-provider-smoke-test-secret-if-fix.md b/docs/plans/2026-04-02-07-51-UTC-ai-provider-smoke-test-secret-if-fix.md deleted file mode 100644 index b7418938..00000000 --- a/docs/plans/2026-04-02-07-51-UTC-ai-provider-smoke-test-secret-if-fix.md +++ /dev/null @@ -1,21 +0,0 @@ -# Background -A pull request workflow run reported `.github/workflows/ai_provider_smoke_test.yml` as invalid because the integration test step used `secrets.*` directly in an `if` expression. GitHub Actions does not allow directly referencing `secrets` in `if` conditionals. - -# Goals -- Fix workflow syntax so the file validates. -- Preserve current behavior: only run real-API integration tests when at least one test API key is present. -- Keep the smoke test job stable for pull requests and manual dispatch. - -# Implementation Plan (phased) -## Phase 1: Update workflow conditions -- Add job-level environment variables that map to existing secret values. -- Replace step-level `if` expression to use `env.*` variables instead of `secrets.*`. - -## Phase 2: Validate changes -- Run a local YAML sanity check (structure/format). -- Review the updated workflow lines to ensure no behavior regressions in test execution. - -# Acceptance Criteria -- `.github/workflows/ai_provider_smoke_test.yml` no longer references `secrets.*` directly in an `if` condition. -- Integration step condition evaluates based on environment variables derived from those secrets. -- Workflow remains readable and consistent with existing test setup. diff --git a/docs/plans/2026-04-02-07-52-UTC-node24-actions-migration-plan.md b/docs/plans/2026-04-02-07-52-UTC-node24-actions-migration-plan.md deleted file mode 100644 index 0aa28817..00000000 --- a/docs/plans/2026-04-02-07-52-UTC-node24-actions-migration-plan.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -GitHub Actions is deprecating Node.js 20 for JavaScript-based actions and will default to Node.js 24 starting June 2, 2026. This repository still references `actions/checkout@v4` in multiple workflow files. - -# Goals -- Replace deprecated `actions/checkout@v4` usage with a Node.js 24-compatible release. -- Keep workflow behavior unchanged outside of the action version bump. -- Validate workflow references after the update. - -# Implementation Plan (phased) -## Phase 1: Locate deprecated action references -- Scan `.github/workflows` for `actions/checkout@v4` and record impacted files. - -## Phase 2: Update action versions -- Replace each `actions/checkout@v4` reference with `actions/checkout@v5` in workflow YAML files. -- Leave already-updated or SHA-pinned modern references unchanged. - -## Phase 3: Validate -- Re-scan workflows to ensure no `actions/checkout@v4` references remain. -- Run `git diff --stat` for a concise change summary. - -# Acceptance Criteria -- No workflow file under `.github/workflows` contains `actions/checkout@v4`. -- Updated workflows use `actions/checkout@v5` where `v4` was previously used. -- A repository scan confirms all deprecated references were removed. diff --git a/docs/plans/2026-04-02-08-34-UTC-cloudflare-github-app-review-thread-resolver.md b/docs/plans/2026-04-02-08-34-UTC-cloudflare-github-app-review-thread-resolver.md deleted file mode 100644 index 49f552ff..00000000 --- a/docs/plans/2026-04-02-08-34-UTC-cloudflare-github-app-review-thread-resolver.md +++ /dev/null @@ -1,52 +0,0 @@ -# Plan: Cloudflare GitHub App review-thread resolver - -## Problem - -GitHub Actions workflow runs triggered by `copilot-swe-agent[bot]` remain gated by Copilot workflow approval, so repository-native automation cannot reliably resolve outdated review threads after Copilot finishes a PR iteration. - -## Approach - -Move the resolver outside GitHub Actions and into a GitHub App webhook hosted on Cloudflare Workers. The worker will: - -1. Receive `issue_comment` webhooks directly from GitHub -2. Verify the webhook signature -3. Filter only PR comments created by `copilot-swe-agent[bot]` -4. Use the webhook installation ID to mint an installation token -5. Query review threads and resolve only `isOutdated && !isResolved` threads -6. Optionally post a summary comment back to the PR - -## Files - -| File | Purpose | -|---|---| -| `.github/cloudflare/copilot-review-thread-resolver-worker.mjs` | Single-file Cloudflare Worker to copy into a Worker project | -| `docs/plans/2026-04-02-08-34-UTC-cloudflare-github-app-review-thread-resolver.md` | This plan | - -## GitHub App setup - -- Webhook events: `issue_comment` -- Permissions: - - `Metadata: Read` - - `Pull requests: Write` - - `Issues: Write` - -## Worker secrets - -Required: - -- `GITHUB_WEBHOOK_SECRET` - -Choose one auth mode: - -- GitHub App mode: - - `GITHUB_APP_ID` - - `GITHUB_APP_PRIVATE_KEY` -- Personal token mode: - - `GITHUB_TOKEN` (or `GH_TOKEN`) - -## Notes - -- No filtering by comment body text; identity-only filtering keeps the trigger robust. -- The resolve operation is idempotent because already-resolved or non-outdated threads are skipped. -- The Worker file is intentionally dependency-free so it can be pasted directly into Cloudflare. -- Personal token mode is the fastest path when GitHub App setup is too cumbersome; GitHub App mode remains the cleaner long-term option. diff --git a/docs/plans/2026-04-02-09-09-UTC-sidebar-back-button.md b/docs/plans/2026-04-02-09-09-UTC-sidebar-back-button.md deleted file mode 100644 index ac80f48f..00000000 --- a/docs/plans/2026-04-02-09-09-UTC-sidebar-back-button.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -The chat left sidebar currently shows a plain "Navigation" label at the top. Users expect a back-style control (left arrow) on the left side of this header so they can explicitly close the sidebar panel. - -# Goals -- Add a visible back/close affordance to the left of the "Navigation" title. -- Ensure tapping the control closes the sidebar reliably. -- Keep existing navigation actions and static tiles unchanged. - -# Implementation Plan (phased) -1. Update `ChatNavigationPage` header layout from a single text widget to a row containing: - - a left-arrow `IconButton` for closing, - - the existing "Navigation" title text. -2. Implement a small internal close handler that calls `Navigator.maybePop(context)` so the panel can dismiss without requiring callback wiring. -3. Extend widget tests to verify the back button is rendered and that tapping it pops the route when the page is pushed. - -# Acceptance Criteria -- A left-arrow back button is visible at the top-left of the sidebar, immediately before "Navigation". -- Tapping the back button closes the sidebar/page. -- Existing taps on "Manage Agents" and "Settings" still behave as before. -- Validation command succeeds: `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart`. diff --git a/docs/plans/2026-04-02-09-40-UTC-github-webhook-cloudflare-skill.md b/docs/plans/2026-04-02-09-40-UTC-github-webhook-cloudflare-skill.md deleted file mode 100644 index 0e4ab53c..00000000 --- a/docs/plans/2026-04-02-09-40-UTC-github-webhook-cloudflare-skill.md +++ /dev/null @@ -1,35 +0,0 @@ -# Plan: GitHub webhook / Cloudflare worker skill - -## Background - -This repository now has an external Cloudflare Worker path for GitHub PR automation, but future agents may not discover that capability unless it is documented in the repository's skill system and surfaced in the main agent instructions. - -## Goals - -- Add a Codex skill that explains the repository's GitHub webhook to Cloudflare Worker integration. -- Document where the Worker code lives, how it is deployed, and how the GitHub webhook links to it. -- Make future agents more likely to choose this path when working on Copilot PR automation or external webhook debugging. - -## Implementation Plan - -### Phase 1: Add a repository skill - -- Create `.codex/skills/github-webhook-cloudflare-worker/SKILL.md`. -- Describe the current Worker source, Wrangler project, deployed URL, webhook endpoint, auth modes, and debugging commands. -- Explain when to use `issue_comment`, `pull_request:synchronize`, and `push`. - -### Phase 2: Surface the skill in repository instructions - -- Update `AGENTS.md` with a short note telling agents to use the new skill first when working on Copilot PR automation that must avoid GitHub Actions approval gates. - -### Phase 3: Validate repository references - -- Confirm the skill points to the real repository paths under `.github/cloudflare/`. -- Confirm the documented commands are consistent with the Wrangler project layout. - -## Acceptance Criteria - -- A new skill exists at `.codex/skills/github-webhook-cloudflare-worker/SKILL.md`. -- `AGENTS.md` explicitly points future agents to the new skill. -- The skill explains the relationship between the GitHub repository webhook and the Cloudflare Worker endpoints. -- The skill includes concrete operational commands for checking, deploying, and debugging the Worker. diff --git a/docs/plans/2026-04-02-13-25-UTC-sidebar-close-on-back-button.md b/docs/plans/2026-04-02-13-25-UTC-sidebar-close-on-back-button.md deleted file mode 100644 index 86bba810..00000000 --- a/docs/plans/2026-04-02-13-25-UTC-sidebar-close-on-back-button.md +++ /dev/null @@ -1,21 +0,0 @@ -# Sidebar Close on Back Button - -## Background -In the chat screen drawer navigation, tapping the top-left back arrow currently plays the tap animation but does not close the sidebar in drawer usage. - -## Goals -- Ensure tapping the back arrow closes the open drawer when `ChatNavigationPage` is rendered inside a `Scaffold.drawer`. -- Add widget test coverage for drawer-close behavior. - -> **Note:** An initial approach considered preserving a `Navigator.maybePop` fallback for standalone (non-drawer) usage. After further review this was superseded by the drawer-only cleanup plan (`2026-04-02-13-30-UTC-chat-navigation-drawer-only-cleanup.md`), which removes standalone-route fallback entirely. The implementation reflects the drawer-only direction. - -## Implementation Plan -1. Update `ChatNavigationPage._closeNavigation` to close the drawer via `ScaffoldState.closeDrawer()` (no route-pop fallback). -2. Make `onActionSelected` a required callback; remove `Navigator.pop` fallback for action taps. -3. Add/adjust widget tests in `chat_navigation_page_test.dart` to verify drawer closes after tapping the back arrow and remove obsolete standalone-route tests. -4. Run bootstrap and targeted Flutter tests. - -## Acceptance Criteria -- When the sidebar is open from `Scaffold.drawer`, tapping the back arrow closes the drawer. -- `ChatNavigationPage` no longer contains standalone-route fallback logic. -- `flutter test` for `chat_navigation_page_test.dart` passes. diff --git a/docs/plans/2026-04-02-13-30-UTC-chat-navigation-drawer-only-cleanup.md b/docs/plans/2026-04-02-13-30-UTC-chat-navigation-drawer-only-cleanup.md deleted file mode 100644 index b465aafb..00000000 --- a/docs/plans/2026-04-02-13-30-UTC-chat-navigation-drawer-only-cleanup.md +++ /dev/null @@ -1,21 +0,0 @@ -# Chat Navigation Drawer-Only Cleanup - -## Background -`ChatNavigationPage` historically supported both drawer usage and standalone route usage. Current product interaction is drawer-based from `ChatScreen`, and dual-mode fallback logic introduces ambiguity and legacy behavior. - -## Goals -- Confirm and align `ChatNavigationPage` with current drawer-only interaction. -- Remove standalone-route fallback behavior from navigation page actions. -- Keep current UX behavior unchanged for users in the drawer flow. - -## Implementation Plan (phased) -1. Update `ChatNavigationPage` to require an action callback and remove `Navigator.pop` fallback behavior. -2. Change back-button close logic to drawer-only close behavior (no route-pop fallback). -3. Update widget tests to validate drawer-centric behavior and remove obsolete standalone route tests. -4. Run targeted Flutter tests for the navigation page. - -## Acceptance Criteria -- `ChatNavigationPage` no longer contains standalone-route fallback logic. -- Back button closes the open drawer. -- Action taps still emit expected callbacks. -- `flutter test test/chat_navigation_page_test.dart` passes. diff --git a/docs/plans/2026-04-02-15-20-UTC-vercel-oauth-log-analysis.md b/docs/plans/2026-04-02-15-20-UTC-vercel-oauth-log-analysis.md deleted file mode 100644 index 32920a91..00000000 --- a/docs/plans/2026-04-02-15-20-UTC-vercel-oauth-log-analysis.md +++ /dev/null @@ -1,33 +0,0 @@ -# Background -The user reported a GitHub OAuth login loop in the frontend: the app redirects to GitHub and back, but the user remains unauthenticated. - -A Vercel logs URL was provided: -`https://vercel.com/askman-dev/bricks/logs?selectedLogId=f69tr-1775142530706-f3f1fa322565` - -The task is to inspect the last 10 logs and identify whether the redirect/login issue is visible from logs. - -# Goals -1. Pull recent Vercel deployment logs via API. -2. Check the last 10 events for OAuth/auth callback failures. -3. Correlate findings with the reported frontend behavior. -4. Propose concrete next debugging steps. - -# Implementation Plan (phased) -## Phase 1: Collect logs -- Use `tools/vercel/fetch_latest_deployment_logs.sh 10` to fetch the most recent 10 deployment events. -- Confirm deployment ID and timestamps. - -## Phase 2: Correlate with reported symptom -- Check whether last 10 logs include GitHub OAuth callback entries, token exchange failures, or cookie/session errors. -- If not present, verify if logs are build-time only and identify any build issues affecting auth endpoints. - -## Phase 3: Recommend remediation path -- If auth runtime logs are missing, fetch runtime logs for the target deployment/time window. -- Validate backend callback implementation and session persistence configuration (domain/SameSite/Secure). -- Re-test login flow and verify user state after callback. - -# Acceptance Criteria -- The latest 10 logs are inspected and summarized with UTC timestamps. -- A clear statement is made on whether redirect-loop evidence is visible in those logs. -- At least one plausible root cause is identified from observed log lines. -- Next-step commands are provided to gather missing runtime evidence. diff --git a/docs/plans/2026-04-02-15-30-UTC-oauth-cross-origin-token-loss.md b/docs/plans/2026-04-02-15-30-UTC-oauth-cross-origin-token-loss.md deleted file mode 100644 index 54c7497f..00000000 --- a/docs/plans/2026-04-02-15-30-UTC-oauth-cross-origin-token-loss.md +++ /dev/null @@ -1,45 +0,0 @@ -# Background -The user suspects this sequence in GitHub OAuth web login: -1. Browser starts on `https://bricks.askman.dev`. -2. Redirects to GitHub and back to `https://bricks.askman.dev` callback. -3. Then redirects to `https://bricks-aoqjuy2sr-askman-dev.vercel.app` but appears to lose parameters and lands unauthenticated. - -The task is to validate this hypothesis and identify where auth state is lost. - -# Goals -1. Verify whether `return_to` is preserved in OAuth state. -2. Verify how callback passes auth token back to Flutter web app. -3. Determine whether cross-origin redirects (`bricks.askman.dev` -> `*.vercel.app`) can lose token persistence. -4. Propose a concrete next-step fix strategy. - -# Implementation Plan (phased) -## Phase 1: Confirm return_to propagation -- Inspect backend `/api/auth/github` behavior. -- Trigger a real redirect response and decode `state` payload to confirm `returnTo` value. - -## Phase 2: Confirm token handoff mechanism -- Inspect callback response builder in backend. -- Check whether token is returned in URL params vs browser storage. - -## Phase 3: Cross-origin risk assessment -- Compare callback origin and `returnTo` origin behavior. -- Validate whether `localStorage` write happens on callback origin only. -- Determine impact when final redirect target is a different origin. - -## Phase 4: Remediation path -- Prefer same-origin callback and return target for web login. -- If cross-origin is required, implement explicit token transfer (e.g., fragment/postMessage + one-time exchange), then clear token artifact. -- Add integration checks for preview-domain and custom-domain flows. - -# Acceptance Criteria -- Evidence shows whether state contains the expected `returnTo` URL. -- Evidence shows whether token is delivered via localStorage or URL. -- A clear conclusion states whether cross-origin redirect can explain "returned but still not logged in". -- Next implementation step is actionable and testable. - -# Findings (current investigation) -- Backend includes `returnTo` in OAuth `state` and stores nonce server-side. -- Live redirect test confirmed `state.returnTo = https://bricks-aoqjuy2sr-askman-dev.vercel.app/`. -- Callback success page writes token to `localStorage` key `flutter.auth_token` and then `window.location.replace(redirectTo)`. -- `localStorage` is origin-scoped; therefore token written on `https://bricks.askman.dev` is not available on `https://bricks-aoqjuy2sr-askman-dev.vercel.app`. -- This explains why "no URL params + returned unauthenticated" can happen even when OAuth callback is successful. diff --git a/docs/plans/2026-04-03-00-10-UTC-oauth-cross-domain-login-fix.md b/docs/plans/2026-04-03-00-10-UTC-oauth-cross-domain-login-fix.md deleted file mode 100644 index 140815c2..00000000 --- a/docs/plans/2026-04-03-00-10-UTC-oauth-cross-domain-login-fix.md +++ /dev/null @@ -1,33 +0,0 @@ -# Background -Preview environments use dynamic Vercel subdomains that differ from the custom production domain. -The OAuth flow intentionally redirects across domains, but users can return unauthenticated after GitHub login. - -Current callback behavior writes JWT to callback-origin localStorage and then redirects to `return_to`. -For cross-origin redirects, the destination origin cannot read callback-origin localStorage. - -# Goals -1. Preserve successful login across cross-origin callback → return_to redirects. -2. Keep same-origin behavior unchanged. -3. Avoid leaking token in query parameters sent to servers. -4. Add automated tests for redirect-target generation behavior. - -# Implementation Plan (phased) -## Phase 1: Backend cross-origin redirect token handoff -- Add a helper that builds post-login redirect URLs. -- If callback origin differs from return_to origin, attach JWT in URL fragment (`#auth_token=...`). -- Keep same-origin redirects unchanged. - -## Phase 2: Frontend fragment token consumption -- Add web-only fragment parser to read `auth_token` from location hash. -- Persist token through AuthService startup path. -- Remove consumed token from URL via history.replaceState. - -## Phase 3: Validation -- Add backend unit tests covering same-origin, cross-origin, and existing-fragment cases. -- Run Node backend test suite. - -# Acceptance Criteria -- Cross-origin OAuth redirect includes `#auth_token` fragment. -- Web startup consumes fragment token and login state becomes authenticated. -- Same-origin flow does not append token to URL. -- Backend tests pass with new redirect-target cases. diff --git a/docs/plans/2026-04-03-03-38-UTC-sidebar-back-button-alignment.md b/docs/plans/2026-04-03-03-38-UTC-sidebar-back-button-alignment.md deleted file mode 100644 index b40d9313..00000000 --- a/docs/plans/2026-04-03-03-38-UTC-sidebar-back-button-alignment.md +++ /dev/null @@ -1,26 +0,0 @@ -# Background -The sidebar back button row in the mobile chat app does not align precisely with the parent chat page app bar menu button row. The goal is to make the drawer-open header layout visually and structurally match the parent page header alignment. - -# Goals -- Align the sidebar back button hit area and icon placement to the same horizontal/vertical geometry used by the chat app bar leading menu button. -- Align the sidebar header title baseline and spacing with app bar title conventions. -- Keep behavior unchanged (back button still closes the drawer). - -# Implementation Plan (phased) -## Phase 1: Inspect and normalize header structure -- Update `ChatNavigationPage` header row to mirror app bar-like dimensions (`kToolbarHeight`) and leading slot width. -- Replace ad-hoc paddings with deterministic spacing that matches Material app bar leading/title layout. - -## Phase 2: Style and semantics parity -- Use a back icon style that matches app bar icon sizing and visual weight. -- Apply title text style from `Theme.of(context).textTheme.titleLarge` to align with app bar typography. - -## Phase 3: Validate -- Run formatter for modified Dart file. -- Run targeted Flutter widget test(s) for chat navigation UI behavior. - -# Acceptance Criteria -- When the drawer is open, the back button row appears aligned to the same top-row geometry as the parent chat app bar menu row. -- Back button remains tappable and closes the drawer. -- Existing chat navigation tests pass after the change. -- Validation commands are executed: `./tools/init_dev_env.sh` and `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart`. diff --git a/docs/plans/2026-04-03-04-10-UTC-api-key-visual-hint-merged.md b/docs/plans/2026-04-03-04-10-UTC-api-key-visual-hint-merged.md deleted file mode 100644 index e9b358b8..00000000 --- a/docs/plans/2026-04-03-04-10-UTC-api-key-visual-hint-merged.md +++ /dev/null @@ -1,26 +0,0 @@ -# Background -The Model Settings screen intentionally leaves the API key input empty for persisted configurations so users can save changes without overwriting secrets. This behavior is correct, but users can misread the empty field as "not configured". - -Earlier iterations explored a dedicated `hasStoredApiKey` flag and then a simpler approach using masked `api_key` returned by the backend. The final direction is to keep the simpler model and provide a clear visual cue only. - -# Goals -- Keep existing save semantics unchanged (blank API key input means do not update key). -- Show an in-field parenthesized gray hint when a server-side key exists but is hidden for safety. -- Keep implementation minimal and maintainable. - -# Implementation Plan (phased) -1. Use parsed `config.api_key` (masked from backend) as a display-state indicator. -2. Keep API key text controller empty in form hydration so masked value is never prefilled/submitted. -3. Render `hintText` in API key input when the active config has non-empty `apiKey`. -4. Keep helper text (`Leave blank to keep your existing key`) unchanged. -5. Cover behavior with widget test for persisted config with masked key. - -# Acceptance Criteria -- Persisted configs with a stored key show a one-line parenthesized hint in the API key input. -- No secret value is displayed in the input field. -- Leaving API key blank while editing still preserves existing key. -- Widget tests for model settings screen pass. - -## Validation commands -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/model_settings_screen_test.dart` diff --git a/docs/plans/2026-04-03-05-03-UTC-multi-agent-channel-arbitration.md b/docs/plans/2026-04-03-05-03-UTC-multi-agent-channel-arbitration.md deleted file mode 100644 index c3ea92d2..00000000 --- a/docs/plans/2026-04-03-05-03-UTC-multi-agent-channel-arbitration.md +++ /dev/null @@ -1,86 +0,0 @@ -# Multi-Bot Channel Arbitration Plan - -## Background -We keep concept layers explicit and non-overlapping: -- **Conversation layer**: users interact with Bots. -- **Runtime layer**: Bots run on Agent execution loops. -- **Capability layer**: Skills are callable capabilities/prompts used by agents; Skills are **not** conversation participants. - -Each Bot can be associated with one or more Skills, and one default Skill profile can define the bot's baseline prompt/capability posture. -By baseline, the two default bots are `ask` and `image_generation`. - -This plan stays intentionally narrow: arbitration policy only. -It assumes Channel/Thread/Session identities and asynchronous task transport are defined by companion plans (including optional thread mode where sessions can be channel-scoped). - -## Goals -1. Define a clear arbitration model for selecting one bot per user turn within a channel context. -2. Support both direct mode (single active bot) and arbitration mode (multiple active bots) under one routing pipeline. -3. Use a single LLM judge pass to score all candidate bots for the current message. -4. Route ties and invalid judge output to a configured default bot deterministically. -5. Ensure decisions are observable, auditable, and testable. - -## Implementation Plan (phased) - -### Phase 1: Domain and protocol definition -- Define bot identity schema: - - `bot_id` - - `display_name` - - `default_skill_id` (default prompt/capability profile for this bot) -- Define LLM scoring output schema for each candidate bot: - - `bot_id` - - `score` (0-1) - - `confidence` (0-1) - - `reason` -- Define arbitration result schema: - - `selected_bot_id` - - `selected_score` - - `tie_detected` (boolean) - - `tie_bot_ids` - - `fallback_to_default_bot` (boolean) - - `decision_reason` - - `trace_id` - -### Phase 2: Routing engine behavior -- Implement unified message routing decision stage: - 1. ingest message context, - 2. load active bots for the current channel/thread/session, - 3. run mode check: - - if one active bot => direct dispatch, - - if many active bots => LLM judge arbitration. -- Build one structured LLM prompt that receives: - - user message, - - channel/thread/session context summary, - - candidate bot profiles (including default skill references). -- Parse structured judge output and rank bots by score/confidence. - -### Phase 3: Decision policy -- Select the bot with the highest score/confidence. -- If two or more bots share the same top score, route to `default_bot_id`. -- If judge output is invalid/incomplete, route to `default_bot_id` and mark as fallback. -- Persist per-bot scoring and final decision trace for replay/debugging. - -### Phase 4: Operations and quality -- Add structured logs/metrics: - - arbitration latency, - - average score by bot, - - win rate by bot, - - tie rate, - - default-bot fallback rate. -- Add acceptance tests for: - - single-bot direct routing, - - multi-bot highest-score selection, - - tie => default bot, - - invalid judge output => default bot. - -## Acceptance Criteria -1. In a channel/thread/session with exactly one active bot, each user message is directly dispatched to that bot without arbitration. -2. In a channel/thread/session with two or more active bots, each user message triggers one judge decision that evaluates all candidate bots. -3. The selected responder is always the candidate bot with the highest score. -4. If the top score is tied, the system always routes to the configured default bot. -5. Every arbitration stores a machine-readable decision record with per-bot scores, winner, and trace ID. -6. If arbitration output cannot be parsed, the system falls back to the default bot and records the fallback reason. - -## Validation Commands -- `npm run type-check` -- `npm run test` -- `flutter analyze` (if client integration changes are involved) diff --git a/docs/plans/2026-04-03-09-26-UTC-async-task-channel-thread-session-and-default-skills.md b/docs/plans/2026-04-03-09-26-UTC-async-task-channel-thread-session-and-default-skills.md deleted file mode 100644 index 87b49f15..00000000 --- a/docs/plans/2026-04-03-09-26-UTC-async-task-channel-thread-session-and-default-skills.md +++ /dev/null @@ -1,97 +0,0 @@ -# Async Task Transport + Channel/Thread/Session + Default Bots Baseline Plan - -## Background -Current chat interaction is mostly request/stream-response oriented and does not provide a durable asynchronous task lifecycle under unstable networks. -At the same time, routing concepts need stronger identity boundaries: Channel, Thread, and Session must be first-class entities across backend and client, with Thread created on demand. - -We align semantics as follows: -- users converse with **bots**, -- bots are conversation participants and routable responders, -- each bot can reference one or more **skills**, -- skills provide prompt/capability profiles and callable functions inside agent loops, -- skills are **not** conversation participants. - -This baseline introduces two default bots shared by backend and client: -- `ask` -- `image_generation` - -This plan is complementary to `2026-04-03-05-03-UTC-multi-agent-channel-arbitration.md`: -- This document defines transport, entity identity, and default bot baseline. -- The arbitration document defines how one bot is selected when multiple bots are active. - -## Goals -1. Define an asynchronous task lifecycle contract that survives transient client/network interruptions. -2. Define Channel/Thread/Session entities and stable IDs used by both backend and client. -3. Define a default bot baseline (`ask`, `image_generation`) and how bots bind to skills. -4. Keep scope minimal and implementation-ready without introducing non-essential orchestration features. - -## Implementation Plan (phased) - -### Phase 1: Core entity model (Channel / Thread / Session / Bot) -- Define entity responsibilities and ownership: - - `channel_id`: top-level collaboration/routing scope. - - `thread_id`: optional sub-conversation scope under a channel (created on demand). - - `session_id`: runtime interaction instance bound to either a channel directly or to a thread. - - `bot_id`: conversation participant identity for routing and attribution. -- Define required relationships: - - one channel contains many threads, - - one thread contains many sessions over time when thread mode is used, - - one channel may also own sessions directly without thread creation, - - each user-visible message and task references `channel_id` + `session_id`, and optionally `thread_id`, plus resolved `bot_id`. -- Define default resolution rules: - - if no channel is specified, route to `default_channel_id`. - - if no thread is specified, the session may run at channel scope; create a thread only when thread mode is explicitly requested. - -### Phase 2: Async task lifecycle contract -- Introduce task envelope fields: - - `task_id`, `channel_id`, `session_id`, - - optional `thread_id`, - - `bot_id`, `resolved_skill_id`, - - `created_at`. -- Define minimal state machine: - - `accepted` -> `dispatched` -> (`completed` | `failed` | `cancelled`). -- Define reliability semantics: - - idempotent submission key for safe retries, - - backend acknowledgement on acceptance, - - resumable client sync by cursor/checkpoint for missed updates. -- Define transport behavior: - - pull-based state sync is source of truth, - - push/stream events are optional acceleration only. - -### Phase 3: Default bots baseline and bot-skill binding (backend + client unified) -- Define canonical default bots: - - `ask` - - `image_generation` -- Define bot-skill binding contract (skills are not participants): - - each bot has `default_skill_id`, - - each bot may have additional callable skills, - - skill invocation happens inside the selected bot's agent loop. -- Define default selection policy: - - if bot is selected and no skill override is provided, use bot's `default_skill_id`, - - if requested skill is unavailable/disabled for that bot, fallback to `ask` and record reason. -- Define shared metadata: - - Bot metadata: `bot_id`, `display_name`, `default_skill_id`. - - Skill metadata: `skill_id`, `description`, `input_mode`, `output_mode`, `is_default`. -- Define client UX contract: - - bot switcher controls conversation participants, - - message/task record persists resolved `bot_id` and `resolved_skill_id` for replay and audit. - -### Phase 4: Integration boundaries with arbitration plan -- Keep arbitration as a separate decision stage; do not merge into transport logic. -- Ensure arbitration consumes the same entity IDs and bot registry defined here. -- Ensure fallback semantics are aligned: - - this plan: transport-level/default-skill resolution within selected bot, - - arbitration plan: decision-level default bot fallback. - -## Acceptance Criteria -1. A client can submit a message/task and receive an `accepted` acknowledgement with a durable `task_id`, even if response generation is not finished yet. -2. After simulated network interruption and reconnect, the client can recover missed task/message updates using cursor/checkpoint sync without data loss. -3. Every stored task/message record includes `channel_id`, `session_id`, resolved `bot_id`, and optional `thread_id` when thread mode is used. -4. If no skill override is specified for a selected bot, backend resolves to that bot's `default_skill_id` deterministically. -5. If `image_generation` is requested and available for the selected bot, the task is routed accordingly; if unavailable, fallback to `ask` is recorded. -6. Skills are not treated as conversation participants in routing decisions; bot selection remains the conversation-level decision unit. - -## Validation Commands -- `npm run type-check` -- `npm run test` -- `flutter analyze` diff --git a/docs/plans/2026-04-04-00-41-UTC-chat-ui-channel-thread-session-and-arbitration-ux.md b/docs/plans/2026-04-04-00-41-UTC-chat-ui-channel-thread-session-and-arbitration-ux.md deleted file mode 100644 index a6adbf68..00000000 --- a/docs/plans/2026-04-04-00-41-UTC-chat-ui-channel-thread-session-and-arbitration-ux.md +++ /dev/null @@ -1,37 +0,0 @@ -# Chat UI Channel/Thread/Session + Arbitration UX Plan - -## Background -The chat surface needs to expose channel and sub-thread context in the UI while preserving the existing component structure and minimizing implementation cost. The sidebar navigation should support channel management and the top app bar should support sub-section switching. In parallel, the UI should surface asynchronous task lifecycle and arbitration/direct routing context aligned with the existing architecture plans. - -## Goals -1. Adjust sidebar behavior to full-width drawer and place settings/sessions/new-channel controls on the navigation header row. -2. Show channel list under "Manage Agents" with a default channel and in-list create-channel affordance. -3. Add top-right sub-section selector with "新建子区" and "主区" fixed entries plus user-created entries. -4. Surface channel/thread/session IDs and direct vs arbitration mode in the chat UI. -5. Expose task lifecycle status and routing metadata in message rendering. - -## Implementation Plan (phased) -### Phase 1: Navigation and channel controls -- Expand drawer width to 100% viewport. -- Update `ChatNavigationPage` to include right-side action icons for settings/sessions/new channel. -- Add channel list model and selected channel rendering under "Manage Agents". -- Add "新建频道" button and timestamp-based naming when creating channels. - -### Phase 2: Chat header and sub-section switching -- Add app bar action for sub-section dropdown. -- Include fixed entries (`新建子区`, `主区`) and dynamic user-created sub-sections per channel. -- Maintain active channel + sub-section state locally in chat screen state. - -### Phase 3: Async/arbitration UX alignment -- Add context bar displaying channel/thread/session IDs and direct/arbitration mode. -- Extend chat message view model with task lifecycle fields and routing metadata. -- Render task status, IDs, fallback markers, and recovered-sync markers in message list. -- Add a lightweight reconnect-sync simulation action for UI verification. - -## Acceptance Criteria -1. Sidebar opens as full-width drawer and shows settings/sessions/new-channel actions on the same row. -2. Channel list is visible under "Manage Agents", includes default channel, and supports timestamp channel creation. -3. App bar contains sub-section dropdown with required fixed options and dynamic user-created entries. -4. Message/task UI includes task state (`accepted`, `dispatched`, `completed`, `failed`, `cancelled`) and task IDs. -5. Context bar shows channel/thread/session and routing mode. -6. Existing chat navigation widget tests pass with updated API and channel list expectations. diff --git a/docs/plans/2026-04-04-07-34-UTC-pr117-unimplemented-bot-registry.md b/docs/plans/2026-04-04-07-34-UTC-pr117-unimplemented-bot-registry.md deleted file mode 100644 index 26e1a4e0..00000000 --- a/docs/plans/2026-04-04-07-34-UTC-pr117-unimplemented-bot-registry.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -PR #117 的评论指出:当前实现里 bot/skill 仍是硬编码字符串,缺少类型化的 bot registry 与默认回退规则,属于已识别但未完成的功能。 - -# Goals -1. 为聊天模块补齐类型化 Bot/Skill 元数据模型。 -2. 引入 Bot Registry,统一处理 bot 与默认 skill 解析。 -3. 当请求的 bot 不存在或不可用时,显式回退到默认 `ask` bot。 -4. 将该解析结果接入消息元数据(`resolvedBotId` / `resolvedSkillId` / fallback 标记)。 - -# Implementation Plan (phased) -## Phase 1: Domain model -- 新增 `ChatBot`、`ChatSkill`、`ChatBotRegistry` 与 `ResolvedChatDispatch` 类型。 -- 内置默认 bot:`ask` 与 `image_generation`。 - -## Phase 2: Routing integration -- 在 `ChatScreen` 中用 registry 解析当前请求 bot。 -- 去掉发送流程里对 skill id 的硬编码分支。 - -## Phase 3: Validation -- 新增单元测试覆盖: - - 已注册 bot 的默认 skill 解析; - - 未注册 bot 的默认回退; - - bot 默认 skill 缺失时的安全回退。 - -# Acceptance Criteria -- 当 active agent 是 `image_generation` 时,消息包含 `resolvedSkillId=image_generation.default`。 -- 当 active agent 未注册时,消息落到 `resolvedBotId=ask` 且 `fallbackToDefaultBot=true`。 -- `flutter test` 通过新增与现有测试。 diff --git a/docs/plans/2026-04-04-08-10-UTC-pr117-review-comment-gap-implementation.md b/docs/plans/2026-04-04-08-10-UTC-pr117-review-comment-gap-implementation.md deleted file mode 100644 index f2a6093e..00000000 --- a/docs/plans/2026-04-04-08-10-UTC-pr117-review-comment-gap-implementation.md +++ /dev/null @@ -1,30 +0,0 @@ -# Background -PR #117 的评论指出多项“计划文档已写但代码未实现”的缺口,尤其集中在 bot arbitration、channel/thread/session 语义和 async task 生命周期。需要统一补齐可运行的基础实现,而非零散修补。 - -# Goals -1. 建立可复用的类型化协议:Bot/Arbitration、Channel/Thread/Session、Task/Ack/Checkpoint。 -2. 将上述协议接入 ChatScreen 主流程(发送、路由、恢复同步、上下文展示)。 -3. 增加回归测试,覆盖 tie fallback、default channel 解析和 task ack 状态推进。 - -# Implementation Plan (phased) -## Phase 1: 协议与实体建模 -- 新增 `chat_arbitration.dart`:候选评分、决策结果、tie 检测和默认回退。 -- 新增 `chat_topology.dart`:`ChatChannel`/`ChatThread`/`ChatSessionScope` 及 default channel 解析。 -- 新增 `chat_task_protocol.dart`:task envelope、ack、checkpoint 以及 message 状态推进。 -- 扩展 `ChatMessage` 元数据字段,覆盖 idempotency、acknowledged_at、cursor、tie 相关字段。 - -## Phase 2: 发送链路整合 -- `ChatScreen` 使用 arbitration engine 做统一决策,不再只靠单点布尔分支。 -- 发送时生成 envelope + ack,落盘到消息元数据并展示 cursor。 -- 引入 thread mode 显式开关,仅开启后允许创建子区。 -- 断线恢复模拟改为 checkpoint-aware 行为。 - -## Phase 3: 测试 -- 新增 arbitration engine 测试(最高分选择、tie 回退默认 bot)。 -- 新增 topology + task protocol 测试(default channel、ack 状态推进)。 - -# Acceptance Criteria -- 多候选 bot 场景可输出结构化 arbitration 结果并在 tie 时回退默认 bot。 -- 缺失/非法 channel 请求会解析到默认 channel。 -- 消息在 ack 后具备 `dispatched` 状态与 checkpoint cursor。 -- `flutter test` 覆盖新增测试并通过。 diff --git a/docs/plans/2026-04-04-08-28-UTC-pr117-fullstack-review-and-hardening.md b/docs/plans/2026-04-04-08-28-UTC-pr117-fullstack-review-and-hardening.md deleted file mode 100644 index 3616a3ac..00000000 --- a/docs/plans/2026-04-04-08-28-UTC-pr117-fullstack-review-and-hardening.md +++ /dev/null @@ -1,23 +0,0 @@ -# Background -用户要求基于 PR #117 的需求做一次从需求到实现的全栈审查(后端、架构、数据库、客户端),并把不合理实现做实质修正。 - -# Goals -1. 形成一份可执行的全栈审查结论(需求、后端、架构、数据库、客户端)。 -2. 修复本轮实现中的关键技术债:仲裁打分逻辑不能依赖伪随机/字符串哈希。 -3. 保持当前代码可运行并通过现有测试。 - -# Implementation Plan (phased) -## Phase 1: 评审产物 -- 新增全栈审查文档,按层次列出现状、风险、已修复项、待办项。 - -## Phase 2: 代码硬化 -- 将 `ChatArbitrationEngine` 从“botId 派生分数”改为“参与者概率权重”打分。 -- 更新 ChatScreen 调用契约与测试用例。 - -## Phase 3: 验证 -- 执行格式化与 `flutter test`,确保修改不会破坏现有行为。 - -# Acceptance Criteria -- 审查文档覆盖需求、后端、架构、数据库、客户端五个维度。 -- 仲裁引擎不再使用 botId 推导分数。 -- `flutter test` 全量通过。 diff --git a/docs/plans/2026-04-07-03-01-UTC-navigation-sidebar-buttons.md b/docs/plans/2026-04-07-03-01-UTC-navigation-sidebar-buttons.md deleted file mode 100644 index 41609a7c..00000000 --- a/docs/plans/2026-04-07-03-01-UTC-navigation-sidebar-buttons.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -The chat navigation drawer currently exposes settings and channel creation actions in multiple places, including a three-button row and additional duplicated entries further down the panel. This causes visual clutter and inconsistent action placement. - -# Goals -- Move the Settings entry into the same row as the Navigation title, aligned to the right side. -- Place the New Channel action on that same title row, to the right of Settings, making it the rightmost action. -- Remove the old three-button action row (Settings / Sessions / New Channel). -- Remove the extra New Channel button below “Manage Agents”. -- Keep a section header labeled “频道” in the same vertical area where the removed lower New Channel button used to be, and treat it as the header for the channel list. -- Ensure only one Settings entry remains in the drawer. - -# Implementation Plan (phased) -1. Update `ChatNavigationPage` header layout to include title-row action buttons (Settings + New Channel) on the right. -2. Delete the legacy action row containing Settings / Sessions / New Channel. -3. Remove duplicated lower controls (extra New Channel button and trailing Settings list tile). -4. Add a localized channels section label (`频道`) above the channel list where the lower New Channel button was. -5. Update widget tests to reflect the new UI structure and verify deduplication. - -# Acceptance Criteria -- The drawer shows a single Settings entry, rendered as an icon button on the Navigation title row. -- The drawer title row contains New Channel to the right of Settings (rightmost action). -- No three-button action row is present. -- No New Channel button appears under “Manage Agents”. -- A “频道” section heading appears above the channel list. -- Relevant Flutter widget tests pass. diff --git a/docs/plans/2026-04-07-03-22-UTC-channel-button-relocation.md b/docs/plans/2026-04-07-03-22-UTC-channel-button-relocation.md deleted file mode 100644 index cf74a6fa..00000000 --- a/docs/plans/2026-04-07-03-22-UTC-channel-button-relocation.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -The chat navigation drawer currently places the channel creation action in the top toolbar as an icon-only control. The requested UX is to move this action into the "频道" group header so the action is contextually grouped with channel management and rendered as an icon+text button. - -# Goals -- Move the "新建频道" action from the top-right navigation header into the "频道" section header row. -- Render the relocated action with an icon and text label. -- Keep existing action wiring (`ChatNavigationAction.createChannel`) intact. -- Update widget tests to validate the new location/presentation. - -# Implementation Plan (phased) -1. Update `ChatNavigationPage` layout: - - Remove the top app bar `IconButton` for new-channel. - - Replace the simple "频道" header text with a row containing the section title and a trailing icon+text button. - - Keep spacing and visual hierarchy appropriate for drawer content. -2. Update tests in `chat_navigation_page_test.dart`: - - Replace tooltip assertion for old icon button with assertions for the new text/icon button. - - Ensure expectations still cover the section title and static navigation elements. -3. Run targeted Flutter widget tests for the affected file. - -# Acceptance Criteria -- In the navigation drawer, "新建频道" appears on the same line as the "频道" group title, aligned to the right. -- The "新建频道" control uses icon+text presentation instead of icon-only presentation. -- Tapping "新建频道" still emits `ChatNavigationAction.createChannel`. -- Updated widget tests pass via `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart`. diff --git a/docs/plans/2026-04-07-03-50-UTC-navigation-agents-sidebar.md b/docs/plans/2026-04-07-03-50-UTC-navigation-agents-sidebar.md deleted file mode 100644 index 0d436259..00000000 --- a/docs/plans/2026-04-07-03-50-UTC-navigation-agents-sidebar.md +++ /dev/null @@ -1,48 +0,0 @@ -# Background - -The chat drawer currently exposes a standalone `Manage Agents` action and only supports a non-collapsible channel section. The requested UX requires agent management to move into Settings, and the drawer should show an `Agents` group with collapsible behavior and fallback empty-state guidance. - -# Goals - -- Move `Manage Agents` entry from drawer navigation into Settings, directly below Model Settings. -- Add a collapsible `Agents` section above the channel section in the drawer. -- Show existing agents in the new drawer section, or show `在设置中新建 Agents` when empty. -- Add a config icon+text button on the `Agents` section header that currently shows a toast saying `未开发的功能`. -- Make the channel section collapsible by tapping the section title. - -# Implementation Plan (phased) - -## Phase 1: Drawer data model and UI structure - -1. Extend chat navigation drawer input model to accept agent items. -2. Convert drawer widget to stateful to track expanded/collapsed state for `Agents` and `频道` groups. -3. Remove drawer `Manage Agents` list tile. -4. Render `Agents` section above channel section, with: - - tappable header title to toggle expand/collapse, - - right-side config icon+text button, - - toast on config button tap with `未开发的功能`. -5. Keep channel create button and list behavior under a collapsible channel header. - -## Phase 2: Screen integration - -1. Pass current loaded agent definitions from `ChatScreen` into drawer agent items. -2. Update Settings screen to add `Manage Agents` list tile under `Model Settings`, navigating to `AgentsScreen`. - -## Phase 3: Validation and regression checks - -1. Update/extend widget tests for drawer behavior: - - no standalone `Manage Agents` tile, - - agents header and empty-state text, - - expand/collapse behavior for agents and channels, - - config button shows expected toast. -2. Run targeted Flutter tests. - -# Acceptance Criteria - -- In drawer, `Manage Agents` no longer appears as a standalone list item. -- Drawer shows an `Agents` section above `频道` and displays loaded agents by name. -- When no agents exist, drawer shows `在设置中新建 Agents` in Agents section. -- Tapping `Agents` title toggles section expansion/collapse. -- Agents header config icon+button exists; tapping it shows a snackbar/toast with `未开发的功能`. -- Tapping `频道` title toggles section expansion/collapse. -- Settings screen contains `Manage Agents` item immediately below `Model Settings` and navigates to Agents screen. diff --git a/docs/plans/2026-04-07-04-27-UTC-research-reconnect-sync-button.md b/docs/plans/2026-04-07-04-27-UTC-research-reconnect-sync-button.md deleted file mode 100644 index 69f2c328..00000000 --- a/docs/plans/2026-04-07-04-27-UTC-research-reconnect-sync-button.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -用户询问移动端聊天页面中“模拟断线恢复同步”按钮的用途,需要基于代码路径确认其真实行为与触发条件。 - -# Goals -1. 定位该按钮在 UI 中的挂载位置与点击事件。 -2. 明确按钮触发后的状态变化、同步模拟时序与消息标记效果。 -3. 输出可直接给产品/测试使用的简明说明。 - -# Implementation Plan (phased) -## Phase 1: Code discovery -- 在 `apps/mobile_chat_app/lib/features/chat/chat_screen.dart` 中定位“模拟断线恢复同步”文案与回调函数。 -- 在同目录与 `widgets/message_list.dart` 中追踪恢复标记字段的展示逻辑。 - -## Phase 2: Behavior verification -- 阅读 `_simulateReconnectSync` 具体实现,确认空消息保护、同步中状态、延时、checkpoint 光标回填和 recovered 标记更新逻辑。 -- 对照上下文栏(Context Bar)确认“Syncing…”状态可见性。 - -## Phase 3: Response drafting -- 汇总按钮用途、限制条件与用户可见反馈,形成中文说明。 - -# Acceptance Criteria -- 能说明该按钮是“模拟”用途而非真实网络重连。 -- 能说明仅在已有消息时生效。 -- 能说明点击后可见反馈(顶部 Syncing、消息 Recovered 标记、checkpoint 光标行为)。 diff --git a/docs/plans/2026-04-07-04-31-UTC-remove-reconnect-sync-simulator.md b/docs/plans/2026-04-07-04-31-UTC-remove-reconnect-sync-simulator.md deleted file mode 100644 index c3863c05..00000000 --- a/docs/plans/2026-04-07-04-31-UTC-remove-reconnect-sync-simulator.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -用户要求移除聊天页面“模拟断线恢复同步”按钮,并删除对应模拟恢复能力,避免在正式交互流程中保留调试入口。 - -# Goals -1. 从聊天页面 UI 中移除“模拟断线恢复同步”按钮。 -2. 删除 `_simulateReconnectSync` 相关状态与逻辑实现。 -3. 保持聊天主流程(发送、展示、线程等)不受影响并通过静态检查。 - -# Implementation Plan (phased) -## Phase 1: Remove UI entry -- 删除 `chat_screen.dart` 中底部 `TextButton.icon`(sync 图标 + “模拟断线恢复同步”文案)。 -- 删除仅为该能力服务的同步进度条展示。 - -## Phase 2: Remove simulation logic -- 删除 `_syncingAfterReconnect` 状态字段。 -- 删除 `_simulateReconnectSync()` 方法。 -- 删除 Context Bar 中 `Syncing…` 的条件展示。 - -## Phase 3: Validate -- 运行仓库初始化脚本并执行 Flutter 分析命令,确认无编译/静态检查错误。 - -# Acceptance Criteria -- 界面中不再出现“模拟断线恢复同步”按钮。 -- 代码中不再包含 `_simulateReconnectSync` 与 `_syncingAfterReconnect`。 -- `flutter analyze` 对相关文件通过。 diff --git a/docs/plans/2026-04-07-04-35-UTC-chat-history-persistence-fix.md b/docs/plans/2026-04-07-04-35-UTC-chat-history-persistence-fix.md deleted file mode 100644 index 1c5e039b..00000000 --- a/docs/plans/2026-04-07-04-35-UTC-chat-history-persistence-fix.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -用户反馈在频道里发送消息并收到 AI 回复后,刷新页面会丢失历史对话,导致无法继续在同一上下文聊天。当前 `ChatScreen` 仅将消息保存在内存 `_messages`,没有持久化或启动时恢复流程。 - -# Goals -- 将用户消息和 AI 回复持久化存储。 -- 页面刷新/重启后恢复之前的会话消息。 -- 继续兼容当前频道/线程会话模型,不破坏发送与流式更新行为。 - -# Implementation Plan (phased) -1. 在 `ChatScreen` 引入会话持久化服务(基于 `SharedPreferences`),按当前 scope(channel + thread)保存消息列表。 -2. 在初始化流程完成后加载持久化消息并恢复 `_messages`,同时恢复最近 checkpoint cursor(如有)。 -3. 在消息增删改(append/update/stream completion/error/cancel)后自动触发持久化。 -4. 在切换频道、切换子区、创建频道/子区后,加载目标 scope 对应历史消息。 -5. 添加单元测试覆盖:消息序列化 round-trip、scope key 生成、持久化读写基本行为。 - -# Acceptance Criteria -- 发送消息并收到 AI 回复后刷新页面,消息仍显示,且可继续发送新消息。 -- 切换到不同频道/子区时,能加载对应历史,不与其他 scope 串线。 -- `flutter test`(至少针对 `apps/mobile_chat_app`)通过。 diff --git a/docs/plans/2026-04-07-05-11-UTC-backend-chat-history-persistence.md b/docs/plans/2026-04-07-05-11-UTC-backend-chat-history-persistence.md deleted file mode 100644 index e305ab7e..00000000 --- a/docs/plans/2026-04-07-05-11-UTC-backend-chat-history-persistence.md +++ /dev/null @@ -1,22 +0,0 @@ -# Background -当前刷新后聊天历史丢失问题,上一版通过前端 `SharedPreferences` 持久化修复,但这不满足“后端数据库持久化 + 跨平台加载”的要求。并且频道支持多 Agent 接话,历史必须由服务端统一存储,避免端侧隔离导致上下文不一致。 - -# Goals -- 移除前端本地聊天历史持久化实现。 -- 新增后端数据库会话历史持久化接口(按用户 + 会话 scope)。 -- 聊天页改为从后端加载/保存历史,刷新后可恢复并继续聊天。 -- 保留多 Agent 消息链路(用户消息 + 多 assistant 消息)完整存储。 - -# Implementation Plan (phased) -1. 在 `apps/node_backend` 新增 DB migration 建立 `chat_sessions`(user_id + session_id 唯一,messages JSON,checkpoint cursor,channel/thread metadata)。 -2. 新增 `chatHistoryService` 读写服务与 `routes/chat.ts`,提供鉴权后的 `GET /api/chat/history/:sessionId` 与 `PUT /api/chat/history/:sessionId`。 -3. 在 `app.ts` 注册 `/api/chat` 路由。 -4. 在移动端新增 `ChatHistoryApiService`,通过后端 API 读写历史;删除 `ChatHistoryStore`(shared_preferences)及其测试。 -5. 更新 `ChatScreen`:初始化/切换 scope 时从后端加载;消息变更后上传快照。 -6. 增加后端路由单测与前端 API 服务单测,验证跨平台依赖后端存储。 - -# Acceptance Criteria -- 聊天消息(用户 + 多 Agent 回复)会保存到后端数据库。 -- 刷新页面后可恢复历史并继续聊天,且不依赖前端本地缓存。 -- 同一账号在不同平台登录后,可加载同一 session scope 的历史。 -- `apps/node_backend` 与 `apps/mobile_chat_app` 相关测试通过。 diff --git a/docs/plans/2026-04-07-06-07-UTC-async-chat-transport-rearchitecture.md b/docs/plans/2026-04-07-06-07-UTC-async-chat-transport-rearchitecture.md deleted file mode 100644 index 3f3032c2..00000000 --- a/docs/plans/2026-04-07-06-07-UTC-async-chat-transport-rearchitecture.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -现有实现已经把历史放到后端,但仍是“整段会话快照覆盖”模型,不满足异步对话运输层要求(任务状态机、幂等提交、增量同步、断线恢复 replay)。这会在多 Agent 接话和多端并发写入时带来覆盖风险。 - -# Goals -- 设计并落地面向异步对话的后端权威传输层。 -- 用任务(task)+ 消息日志(message log)替代会话快照覆盖。 -- 支持幂等 task 接收、消息 upsert、按序号增量 sync。 -- 给出可执行迁移方案并在客户端接入新接口。 - -# Implementation Plan (phased) -1. 新增数据库表:`chat_tasks`、`chat_messages`、`chat_sync_checkpoints`,形成 task lifecycle + append/update log + session checkpoint 三层模型。 -2. 后端新增服务与路由: - - `POST /api/chat/tasks/accept`(幂等接收) - - `PUT /api/chat/messages/batch`(消息批量 upsert) - - `GET /api/chat/sync/:sessionId?afterSeq=`(增量拉取) -3. 客户端新增异步聊天 API 服务,接入 `acceptTask` + `upsertMessages` + `sync`。 -4. `ChatScreen` 改造为:发送时上报 task accepted;消息变化时批量 upsert;初始化/切换 scope 时通过 sync 拉取并重建状态。 -5. 迁移策略: - - 先上线双写(保留旧 `chat_sessions` 读路径兼容); - - 稳定后将读切到 `chat_messages`; - - 运行离线 backfill(把 `chat_sessions.messages` 展平成 `chat_messages`); - - 验证完成后下线旧快照写入。 - -# Acceptance Criteria -- 后端具备 task 接收幂等能力和消息日志增量同步能力。 -- 刷新/重连后可用 `afterSeq` 拉取缺失消息,不依赖全量覆盖。 -- 多 Agent 接话消息按服务端序列可重放,历史不会被并发覆盖。 -- `apps/node_backend` 类型检查/测试与 `apps/mobile_chat_app` 相关测试通过。 diff --git a/docs/plans/2026-04-07-09-04-UTC-fix-chat-session-migration-sqlite-cast.md b/docs/plans/2026-04-07-09-04-UTC-fix-chat-session-migration-sqlite-cast.md deleted file mode 100644 index 55d4aa5b..00000000 --- a/docs/plans/2026-04-07-09-04-UTC-fix-chat-session-migration-sqlite-cast.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -A production migration (`006_create_chat_sessions.sql`) fails on Turso/libSQL with `SQL_PARSE_ERROR: bad variable name`. The failing statement includes PostgreSQL cast syntax in a default value (`'[]'::jsonb`), which survives adaptation as `'[]'::TEXT` and is still invalid SQLite syntax. - -# Goals -1. Make migration adaptation robust for PostgreSQL cast syntax (`::type`) when running against SQLite/Turso. -2. Add regression coverage to prevent future migration failures from cast expressions. -3. Validate that migration adapter tests pass. - -# Implementation Plan (phased) -## Phase 1: Adapter fix -- Update `adaptMigrationForSqlite` in `apps/node_backend/src/db/migrate.ts` to remove PostgreSQL `::type` cast fragments during SQLite adaptation. -- Keep existing replacements (`JSONB -> TEXT`, `NOW() -> CURRENT_TIMESTAMP`, etc.) unchanged. - -## Phase 2: Regression tests -- Add a focused unit test in `apps/node_backend/src/db/migrate.test.ts` asserting cast removal behavior for expressions like `'[]'::jsonb`. -- Add/extend integration-like migration fixture test to ensure `006_create_chat_sessions.sql` style SQL is adapted to SQLite-safe output. - -## Phase 3: Verification -- Run the node backend migration adapter unit tests. -- Confirm the adapted SQL no longer contains `::` casts. - -# Acceptance Criteria -- `adaptMigrationForSqlite` output never includes PostgreSQL `::type` casts. -- A test explicitly verifies cast removal for `'[]'::jsonb`-style defaults. -- Relevant tests pass locally with Vitest. diff --git a/docs/plans/2026-04-07-09-28-UTC-chat-history-context-and-persistence-fix.md b/docs/plans/2026-04-07-09-28-UTC-chat-history-context-and-persistence-fix.md deleted file mode 100644 index 6fa65d23..00000000 --- a/docs/plans/2026-04-07-09-28-UTC-chat-history-context-and-persistence-fix.md +++ /dev/null @@ -1,37 +0,0 @@ -# Background -用户反馈了两个问题: -1. 多轮对话中,第二轮推理似乎没有带上前文(`1+3` 后再发 `+5` 未得到 `9`)。 -2. 消息在刷新时可能出现“空气泡”并丢失 AI 最终回复,尤其在 AI 回复完成前刷新。 - -当前实现里,Agent 会在本地会话中维护上下文,但请求模型时只发送了“当前用户消息”;同时消息持久化采用 500ms 防抖,且会先落库一个空内容的流式 assistant 占位消息,导致刷新后看到空泡。 - -# Goals -1. 修复多轮对话上下文组装:模型请求应携带历史消息而非仅当前轮。 -2. 修复刷新导致的消息持久化异常: - - 关键消息(尤其用户消息)立即持久化,减少刷新窗口内丢失。 - - 避免将“空内容 + 流式中”的 assistant 占位消息持久化到历史。 -3. 补充测试覆盖,防止回归。 - -# Implementation Plan (phased) -## Phase 1: 多轮上下文修复 -- 在 `RealModelGateway` 中新增/扩展生成接口,支持传入完整历史消息。 -- 在 `AgentSessionImpl` 中调用网关时传入 `ContextManager.messages`。 -- 后端 `/api/llm/chat` 请求体改为完整 `messages`(包含 system + 历史 user/assistant)。 - -## Phase 2: 持久化时序修复 -- 将聊天持久化分为: - - 立即持久化(用于用户发送、流结束、错误、停止等关键时刻)。 - - 防抖持久化(用于流式增量内容更新)。 -- 持久化前过滤“空内容且仍在 streaming 的 assistant 占位消息”。 -- 在页面 `dispose` 时尝试触发一次立即持久化(best effort)。 - -## Phase 3: 测试与验证 -- 为 `agent_core` 增加测试:验证 `sendMessage` 时网关拿到完整上下文。 -- 为 `mobile_chat_app` 的 `ChatHistoryApiService` 增加测试:验证占位 assistant 消息过滤规则。 -- 运行受影响测试套件。 - -# Acceptance Criteria -1. 在同一会话中发送 `1+3` 后再发送 `+5`,请求模型的 messages 中包含上一轮 user/assistant 历史。 -2. 用户发送后立即刷新,不会出现仅有空内容 assistant 气泡的持久化记录。 -3. 正常完成的 assistant 回复仍可持久化并在刷新后可见。 -4. 新增测试全部通过(例如 `flutter test` 相关用例、`npm test` 相关用例)。 diff --git a/docs/plans/2026-04-07-09-54-UTC-backend-owned-chat-persistence-and-context.md b/docs/plans/2026-04-07-09-54-UTC-backend-owned-chat-persistence-and-context.md deleted file mode 100644 index 248d2d4a..00000000 --- a/docs/plans/2026-04-07-09-54-UTC-backend-owned-chat-persistence-and-context.md +++ /dev/null @@ -1,30 +0,0 @@ -# Background -用户对上一版修复提出进一步要求: -1) 发送后可关闭客户端,后续再次进入仍可看到完整回复; -2) 历史拼接应在后端,便于统一裁剪策略; -3) 存储应由后端完成,不应依赖客户端再次回传整段历史; -4) 评估 accept 与 chat 并行是否必要。 - -# Goals -1. 将单轮问答的落库与生成尽量收敛到后端一次编排中完成。 -2. 在后端按可控策略读取/裁剪历史上下文并用于模型调用。 -3. 前端发送路径改为调用后端编排接口,减少“先客户端算、再客户端回传存储”的依赖。 -4. 保持兼容现有接口,同时为后续精简 `accept` 铺路。 - -# Implementation Plan (phased) -## Phase 1 -- 后端新增 `POST /api/chat/respond`:接收任务信息 + 用户消息,完成:accept(幂等)-> 用户消息落库 -> 读取并裁剪会话历史 -> LLM 生成 -> assistant 落库。 -- 服务层新增按 session 拉取历史消息并裁剪的函数(条数/字符上限)。 - -## Phase 2 -- 前端新增 `ChatHistoryApiService.respond`。 -- 主发送流程 `_sendMessage` 改为调用 `respond` 获取最终文本并更新 UI;保留历史同步机制。 - -## Phase 3 -- 回归执行 Node type-check、Node tests、Flutter 相关测试。 - -# Acceptance Criteria -1. 用户发送消息后,只要请求已被后端接收,即使客户端关闭,后端仍可完成回复并持久化。 -2. 模型请求历史由后端从数据库读取并裁剪,不依赖前端拼接完整历史。 -3. assistant 最终内容由后端写库,刷新后可直接从 history/sync 读到。 -4. 现有测试通过,新增改动无编译错误。 diff --git a/docs/plans/2026-04-07-12-18-UTC-remove-chat-context-bar-impact-assessment.md b/docs/plans/2026-04-07-12-18-UTC-remove-chat-context-bar-impact-assessment.md deleted file mode 100644 index 815316c3..00000000 --- a/docs/plans/2026-04-07-12-18-UTC-remove-chat-context-bar-impact-assessment.md +++ /dev/null @@ -1,47 +0,0 @@ -# Background - -对话页顶部目前展示一排 `Chip`(Channel / Thread / Session / ThreadMode / Mode / Cursor / Seq)。这些信息主要用于调试会话作用域、同步状态和多代理仲裁状态,不属于核心聊天输入输出流程。目标是在真正删除前,先确认影响面与依赖逻辑,避免误伤同步与线程切换能力。 - -> **注意**:`Syncing` Chip 及其关联的内联线性进度条与"模拟断线恢复同步"按钮已在本 PR 中一并移除(同步指示器和调试触发入口均属于调试辅助 UI,不属于核心 context bar 展示信息)。当前剩余 Chip 如上所列。 - -相关实现位于 `apps/mobile_chat_app/lib/features/chat/chat_screen.dart` 的 `_buildContextBar()`,并在 `build()` 的 `body` 中固定插入。同步与游标数据由 `ChatHistoryApiService` 与消息流处理逻辑提供。 - -# Goals - -1. 明确顶部按钮(Chip)各自语义及关联状态字段。 -2. 区分“仅 UI 展示”与“业务逻辑实际依赖”。 -3. 给出删除该排按钮前后需要回归验证的场景。 -4. 识别潜在连带影响(调试可观测性、文案、测试)。 - -# Implementation Plan (phased) - -## Phase 1 - 结构梳理 - -- 定位 `_buildContextBar()` 的调用位置与渲染条件。 -- 追踪各 Chip 绑定字段的写入来源(channel 切换、thread 切换、历史加载、reconnect sync、task ack)。 -- 确认这些字段是否被其他逻辑分支读取,而不只是展示。 - -## Phase 2 - 影响面判定 - -- 将字段按“强依赖逻辑字段”与“纯展示字段”分组: - - 强依赖:`_activeChannelId`、`_activeSubSection`、`_threadModeEnabled`、`_sessionIdForScope`、`_lastSyncedSeq`、`_latestCheckpointCursor`。 - - 纯展示:`_buildContextBar()` 及其 `Chip` 文案本身。 -- 识别和删除动作相邻的 UI:`_syncingAfterReconnect` 线性进度条、`模拟断线恢复同步` 按钮。 -- 明确删除按钮不应影响的路径:发送消息、流式更新、线程切换、历史同步。 - -## Phase 3 - 删除前验证清单(建议) - -- 手动回归: - 1. 主区发送消息并接收流式回复。 - 2. 开启 Thread 模式并切换子区。 - 3. 切换频道后确认 session scope 仍正确重载。 - 4. 通过真实断网/恢复网络(或应用切后台后恢复连接)触发 reconnect sync,确认 `afterSeq` 增量同步仍生效,缺失消息会补齐且不会重复。 -- 自动化补强(当前仓库无直接覆盖): - - 为 `chat_screen` 添加 widget test,至少验证 context bar 可配置隐藏后不影响消息列表与 composer 渲染。 - -# Acceptance Criteria - -1. 影响面说明能逐项映射每个顶部 Chip 对应的状态与写入路径。 -2. 结论明确:删除顶部 Chip 属于 UI 层变更,不应删除其背后状态维护逻辑。 -3. 删除方案包含回归项,且覆盖 channel/thread/sync 三类高风险路径。 -4. 若后续实施删除,需确保页面仍保留必要调试入口(例如开发模式日志或可折叠诊断面板)。 diff --git a/docs/plans/2026-04-07-15-39-UTC-remove-simulated-reconnect-entry.md b/docs/plans/2026-04-07-15-39-UTC-remove-simulated-reconnect-entry.md deleted file mode 100644 index 85a59f9c..00000000 --- a/docs/plans/2026-04-07-15-39-UTC-remove-simulated-reconnect-entry.md +++ /dev/null @@ -1,29 +0,0 @@ -# Background - -聊天页底部存在“模拟断线恢复同步”按钮,用于手动调用增量同步流程。该入口是调试性质功能,不属于用户核心对话流程。 - -本任务根据评审反馈,要求删除该入口,且不保留相关测试代码。 - -# Goals - -1. 删除聊天页中的“模拟断线恢复同步”按钮。 -2. 清理仅为该按钮服务的页面状态与方法。 -3. 不新增、不保留与该模拟入口绑定的测试代码。 - -# Implementation Plan (phased) - -## Phase 1 - UI 与状态清理 - -- 从 `chat_screen.dart` 移除按钮渲染节点。 -- 移除 `_simulateReconnectSync()` 方法。 -- 移除 `_syncingAfterReconnect` 状态及其 UI 绑定(context bar 的 `Syncing…` chip、线性进度条)。 - -## Phase 2 - 编译层验证 - -- 运行静态检查,确认删除后无未使用引用或类型错误。 - -# Acceptance Criteria - -1. 聊天页不再显示“模拟断线恢复同步”按钮。 -2. 页面中不存在 `_simulateReconnectSync` 与 `_syncingAfterReconnect` 的残留引用。 -3. 本次提交不新增与该入口相关的测试代码。 diff --git a/docs/plans/2026-04-08-02-34-UTC-channel-subsections.md b/docs/plans/2026-04-08-02-34-UTC-channel-subsections.md deleted file mode 100644 index 9aa8d9c1..00000000 --- a/docs/plans/2026-04-08-02-34-UTC-channel-subsections.md +++ /dev/null @@ -1,73 +0,0 @@ -# Channel Sub-sections (replace Thread Mode) Plan - -## Background -- The chat entry flow routes authenticated users into `ChatScreen`, where conversation scope is currently encoded by `(channelId, threadId)` and persisted as `session::`. -- In current UI behavior, child conversation areas (子区) are guarded behind a runtime `Thread 模式` toggle (`_threadModeEnabled`). Without enabling it, users cannot create sub-sections. -- The backend and API already carry `threadId` fields, so scope-level message isolation exists at transport/persistence level; however, domain language and UI behavior still expose this as optional "thread mode" instead of always-available channel sub-sections. -- Product direction is to remove mode switching entirely and treat sub-sections as first-class, optional children of a channel (0..N children). - -## Goals -1. Remove all user-facing and stateful "Thread mode" behavior. -2. Keep channel-level chatting available when there are zero sub-sections. -3. Support creating and entering sub-sections, each with independent chat history. -4. Make parent-child relation explicit in client topology: channel knows children; sub-section knows parent. -5. In the chat top-right sub-section menu, render two functional groups: - - Management group (e.g., 回到主区, 新建子区) - - Sub-section list group (navigable) -6. Sort sub-section list by each sub-section’s latest message timestamp descending. - -## Implementation Plan (phased) - -### Phase 1 — Topology/domain model cleanup -- Replace toggle-driven state with explicit scope model: - - main scope is always present per channel; - - child scopes are optional and always creatable. -- Introduce/normalize data structures so: - - channel keeps `subSections` collection; - - sub-section includes `parentChannelId`. -- Keep persistence identity stable (`session::`) while renaming UI/domain terms from thread -> sub-section where possible. - -### Phase 2 — ChatScreen behavior migration -- Remove `_threadModeEnabled` and all toggle branches. -- Update active scope resolution to always use currently selected section (`main` or child). -- Allow creating sub-section regardless of mode. -- Ensure switching channel defaults to `main` unless previous active child remains valid for that channel. - -### Phase 3 — Top-right menu UX restructuring -- Keep existing menu entry point in app bar right action. -- Render menu in two groups: - 1) Management actions (回到主区, 新建子区) - 2) Sub-section navigable items. -- Sort child list by latest message timestamp desc. - - Maintain `lastMessageAt` index per `(channelId, subSectionId)` from in-memory messages and/or loaded history metadata. - - Unmessaged sub-sections fall to the bottom with deterministic tie-breaker (e.g., createdAt desc then id). - -### Phase 4 — Data loading/persistence alignment -- Ensure load/persist calls continue to use scope-derived `sessionId` so each sub-section history is isolated. -- Validate that creating/switching sub-sections clears current list then loads that scope’s history snapshot. -- Confirm backend payload remains compatible (`threadId` can remain wire field short-term, with UI terminology migrated). - -### Phase 5 — Test updates -- Update and/or add widget tests for: - - no-sub-section channel can still send/receive; - - create child sub-section and navigate; - - management group/actions visible; - - list sorted by latest message time desc. -- Update unit tests around topology/scope resolution accordingly. - -## Acceptance Criteria -1. **Zero-child baseline**: In any channel with no child sub-sections, user can directly chat in 主区 without enabling any mode or switch. -2. **Create + isolate history**: After creating a child sub-section and entering it, message history starts as a new isolated scope (does not show 主区 history); returning to 主区 restores 主区 history. -3. **Parent-child awareness**: Channel data can enumerate its child sub-sections; each child sub-section carries its parent channel identity. -4. **Menu grouping**: Top-right sub-section menu shows exactly two functional groups: - - Group A management actions: 回到主区、新建子区 - - Group B child sub-section navigation list -5. **Menu ordering**: Group B sub-section list is ordered by latest message time descending (most recently active first). -6. **No thread toggle**: UI does not expose "开启/关闭 Thread 模式" and logic has no mode-gated behavior for sub-section creation/navigation. -7. **Backward compatibility (short-term)**: Existing backend request contracts continue functioning while client product language reflects 子区 rather than thread mode. -8. **Regression safety**: Existing channel creation/switching and message send flow still work after migration. - -## Validation Commands -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-04-08-02-40-UTC-code-map-foundation.md b/docs/plans/2026-04-08-02-40-UTC-code-map-foundation.md deleted file mode 100644 index 871b6494..00000000 --- a/docs/plans/2026-04-08-02-40-UTC-code-map-foundation.md +++ /dev/null @@ -1,41 +0,0 @@ -# Background - -As the repository grows, AI agents can miss related logic when modifying code, which can leave behind stale code or cause functional regressions. We need a "code map" as a unified entry point that helps human testers, AI testers, and AI engineers quickly locate feature paths and documentation indexes. - -# Goals - -1. Add a feature map YAML file that records the feature list and entry paths. -2. Add a logic map YAML file that records feature-to-code/document indexes and keyword mappings. -3. Add a reusable Codex Skill to guide future maintenance of the code maps. -4. Add a working rule to AGENTS memory requiring code maps to be updated after code changes. - -# Implementation Plan (phased) - -## Phase 1 - Create the code map files - -- Create `docs/code_maps/feature_map.yaml`. -- Create `docs/code_maps/logic_map.yaml`. -- Define a shared schema so both humans and AI can parse the files. - -## Phase 2 - Standardize the maintenance prompt - -- Create `.codex/skills/code-map-maintainer/SKILL.md`. -- Document the trigger conditions, maintenance steps, post-change checkpoints, and output format. - -## Phase 3 - Integrate with Agent memory - -- Update the root `AGENTS.md`: - - Register `code-map-maintainer` in the list of available skills. - - Add a standing rule that code maps must be checked and maintained after code changes. - -## Phase 4 - Basic validation - -- Run YAML parsing validation to ensure the new map files are correctly formatted. - -# Acceptance Criteria - -1. The current phase includes at least two code map YAML files: a feature map (`feature_map.yaml`) and a logic map (`logic_map.yaml`). Additional map files may be added in future phases. -2. The feature map exposes the entry path and validation entry for each feature. -3. The logic map exposes the corresponding code indexes, document indexes, and keywords for each feature, with `feature_id` values that are consistent with the feature map. -4. The repository contains a dedicated skill document for maintaining code maps, and it can be referenced by future tasks. -5. The AGENTS documentation includes an explicit memory rule requiring code map maintenance after code changes. diff --git a/docs/plans/2026-04-08-02-52-UTC-chat-history-load-window-and-auto-scroll.md b/docs/plans/2026-04-08-02-52-UTC-chat-history-load-window-and-auto-scroll.md deleted file mode 100644 index c0613993..00000000 --- a/docs/plans/2026-04-08-02-52-UTC-chat-history-load-window-and-auto-scroll.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -After page refresh, the chat view currently loads the full channel/session history and does not automatically scroll to the latest message. This causes heavy initial rendering for long sessions and makes users manually drag the scroll bar to reach the newest content. - -# Goals -- Limit initial history load to only the latest 100 messages for the active session/channel. -- Ensure the message list defaults to showing the newest message (bottom) after refresh/load. -- Keep behavior compatible with existing incremental sync and persistence paths. - -# Implementation Plan (phased) -## Phase 1: Backend and API client load window -1. Add optional `limit` support to `GET /api/chat/history/:sessionId`. -2. Add optional `limit` support to `syncMessages` service, applying it safely only for full-history requests (`afterSeq == 0`) by selecting the newest N messages then restoring chronological order. -3. Update Flutter `ChatHistoryApiService.load` to send `?limit=100` by default. - -## Phase 2: UI default-to-latest behavior -1. Convert message list widget to stateful with an internal `ScrollController`. -2. Auto-scroll to bottom after first frame and when message count changes. -3. Keep behavior smooth and safe when list is not yet attached. - -## Phase 3: Validation -1. Add/adjust unit test(s) to verify client history request includes the load window. -2. Run repository bootstrap and targeted tests. - -# Acceptance Criteria -- On refresh, history endpoint is requested with a limit of 100 messages. -- UI initially lands at the latest message without manual scrolling. -- Existing chat history API service tests pass after change. -- Validation commands are run and documented (`./tools/init_dev_env.sh`, `cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart`). diff --git a/docs/plans/2026-04-09-02-15-UTC-move-chat-debug-info-into-composer-menu.md b/docs/plans/2026-04-09-02-15-UTC-move-chat-debug-info-into-composer-menu.md deleted file mode 100644 index cb7e0446..00000000 --- a/docs/plans/2026-04-09-02-15-UTC-move-chat-debug-info-into-composer-menu.md +++ /dev/null @@ -1,35 +0,0 @@ -# Background - -用户希望移除聊天页顶部的调试 `Chip`(Channel/子区/Session/Mode/Cursor/Seq)行,避免占用对话主视图空间;同时希望在输入框左下角菜单中新增“信息”入口,点击后以模态窗口展示同一批调试信息。 - -# Goals - -1. 从聊天主界面移除顶部调试 context bar。 -2. 在 Composer 菜单增加“信息”动作项。 -3. 点击“信息”后弹出模态,展示当前 scope 与同步诊断信息。 -4. 不区分环境(开发/生产一致可见菜单入口)。 - -# Implementation Plan (phased) - -## Phase 1 - Composer 菜单扩展 - -- 在 `ComposerMenuAction` 中新增 `info` 枚举值。 -- 在菜单项中新增“信息”按钮。 -- 为 `ComposerBar` 增加 `onShowInfo` 回调并在点击后触发。 - -## Phase 2 - ChatScreen 调整 - -- 移除 `ChatScreen` 中顶部 `_buildContextBar()` 渲染入口。 -- 在 `ChatScreen` 增加 `_showDebugInfoDialog()`,将原 context bar 展示的关键字段以弹窗内容呈现。 -- 通过 `ComposerBar(onShowInfo: ...)` 连接入口与弹窗。 - -## Phase 3 - 校验 - -- 运行 Flutter 测试,确认编译与行为未回归。 - -# Acceptance Criteria - -1. 聊天页不再显示顶部 Channel/子区/Session/Mode/Cursor/Seq 标签行。 -2. 输入框左下角菜单出现“信息”项。 -3. 点击“信息”会弹出模态窗口,并展示当前 Channel、子区、Session、Mode、Cursor、Seq。 -4. 变更后项目测试可通过(至少执行移动端 Flutter tests)。 diff --git a/docs/plans/2026-04-09-03-47-UTC-chat-open-auto-scroll-latest.md b/docs/plans/2026-04-09-03-47-UTC-chat-open-auto-scroll-latest.md deleted file mode 100644 index f9bdd5bf..00000000 --- a/docs/plans/2026-04-09-03-47-UTC-chat-open-auto-scroll-latest.md +++ /dev/null @@ -1,21 +0,0 @@ -# Background -在聊天页面已有历史消息时,用户打开对话后仍需要手动滑动才能看到最新消息,影响阅读与继续对话体验。 - -# Goals -- 进入已有历史的对话后自动定位到底部(最新一条消息)。 -- 当消息列表内容替换但条数不变时,也能触发自动滚动到底部。 -- 保持现有发送与增量更新流程不受影响。 - -# Implementation Plan (phased) -## Phase 1: MessageList 自动滚动触发条件增强 -1. 在 `MessageList` 中新增“最后一条消息签名”对比逻辑,不仅比较 `length`,还比较尾消息内容/时间等关键字段。 -2. 当签名变化时触发 `_scrollToBottom()`,覆盖“长度不变但历史内容已切换”的场景。 - -## Phase 2: 回归验证 -1. 新增/更新 widget 测试,验证列表初次渲染时会定位到最新消息。 -2. 运行 Flutter 相关测试确保改动稳定。 - -# Acceptance Criteria -- 打开有历史消息的对话后,无需手动拖动即可看到最新消息。 -- 在消息总数不变但内容切换后,仍会自动滚到末尾。 -- 相关测试通过(`./tools/init_dev_env.sh`、`cd apps/mobile_chat_app && flutter test test/message_list_test.dart`)。 diff --git a/docs/plans/2026-04-09-04-02-UTC-sidebar-channel-click-white-screen.md b/docs/plans/2026-04-09-04-02-UTC-sidebar-channel-click-white-screen.md deleted file mode 100644 index 70ee5392..00000000 --- a/docs/plans/2026-04-09-04-02-UTC-sidebar-channel-click-white-screen.md +++ /dev/null @@ -1,32 +0,0 @@ -# Sidebar channel click causes white screen investigation and fix - -## Background -点击侧边栏任意频道后页面出现白屏,导航栏、输入框、侧边栏全部消失,说明前端可能触发了未捕获运行时异常,导致根组件渲染中断。 - -## Goals -- 复现“点击侧边栏频道后白屏”的问题。 -- 定位触发白屏的具体代码路径和根因。 -- 提供最小且可靠的修复,并验证关键交互恢复正常。 -- 检查并按需更新代码地图文件。 - -## Implementation Plan (phased) -1. **复现与日志采集** - - 启动应用并稳定复现问题。 - - 采集浏览器控制台/测试输出中的异常堆栈,确定报错文件与组件。 -2. **根因定位** - - 从频道点击事件、路由切换、状态同步链路入手,逐步缩小范围。 - - 审查相关状态字段是否存在空值/类型不一致/越界访问。 -3. **修复实现** - - 在最靠近根因处修复,避免仅在外围做“吞错误”处理。 - - 保证当前频道与其他频道点击路径都可安全渲染。 -4. **验证与回归检查** - - 运行针对性测试/静态检查。 - - 手动验证侧边栏频道切换、页面布局与输入区域可见性。 -5. **文档与代码地图** - - 如涉及功能入口或逻辑索引变化,更新 `docs/code_maps/feature_map.yaml` 与 `docs/code_maps/logic_map.yaml`。 - -## Acceptance Criteria -- 点击侧边栏当前频道与其他频道时,页面不再白屏且主界面元素持续可见。 -- 无新增未捕获运行时异常。 -- 相关测试或检查命令通过。 -- 若变更影响代码地图索引,代码地图已同步更新;若未更新,在总结中说明理由。 diff --git a/docs/plans/2026-04-09-05-48-UTC-chat-interaction-simplify.md b/docs/plans/2026-04-09-05-48-UTC-chat-interaction-simplify.md deleted file mode 100644 index 5124dcd2..00000000 --- a/docs/plans/2026-04-09-05-48-UTC-chat-interaction-simplify.md +++ /dev/null @@ -1,32 +0,0 @@ -# Background -- 当前聊天信息流默认在初始化、切换会话和消息更新时倾向滚动到底部。 -- 该行为会导致发送后用户消息不稳定,以及 AI 流式回复期间视图被持续拉动。 -- 需求要求统一为“以用户消息作为定位锚点”,并对长文本气泡提供 3 行折叠/展开交互。 - -# Goals -- 发送消息后将最新用户消息定位为可见区域第一条,AI 回复显示在其下方。 -- 接收 AI 流式回复时不再把列表拖到底部。 -- 刚打开页面或切换会话时采用与发送一致的定位策略。 -- 消息气泡默认最多展示 3 行,超出显示省略并提供右上角展开/收起按钮;不超出不显示按钮。 - -# Implementation Plan (phased) -1. 调整 `MessageList` 自动滚动策略: - - 定位目标改为“最后一条 user 消息”,若不存在则回退到最后一条消息。 - - 列表变更后先确保尾部元素布局,再将目标消息 `ensureVisible(alignment: 0)` 到顶部。 - - 对同一条流式消息的文本增量更新增加判定,避免重复触发自动定位。 -2. 新增长文本折叠组件: - - 以 3 行为默认上限并开启 `TextOverflow.ellipsis`。 - - 用 `TextPainter` 判断是否溢出,溢出时显示气泡右上角展开/收起按钮。 -3. 更新测试: - - 将自动滚动断言调整为“聚焦用户消息而非到底部”。 - - 新增长文本展开按钮展示测试。 -4. 同步代码地图: - - 更新 `docs/code_maps/feature_map.yaml` 与 `docs/code_maps/logic_map.yaml` 中 chat 会话滚动行为描述与风险提示。 - -# Acceptance Criteria -- 发送用户消息后,消息列表顶部可见项为该用户消息,AI 回复位于其后。 -- AI 流式回复过程中列表不会因增量文本持续自动跳动。 -- 打开已有会话或切换频道/子会话时定位策略与发送后保持一致。 -- 长文本消息默认最多显示 3 行且省略;点击右上角按钮可展开/收起。 -- 短文本消息不显示展开/收起按钮。 -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart` 通过。 diff --git a/docs/plans/2026-04-09-06-02-UTC-ai-bubble-full-width.md b/docs/plans/2026-04-09-06-02-UTC-ai-bubble-full-width.md deleted file mode 100644 index 1a078efe..00000000 --- a/docs/plans/2026-04-09-06-02-UTC-ai-bubble-full-width.md +++ /dev/null @@ -1,22 +0,0 @@ -# Background -- 现有聊天消息气泡对 user 与 assistant 使用统一最大宽度(约 75%)。 -- 新需求要求保持 user 气泡宽度策略不变,同时将 AI 回复气泡扩展为全屏宽度,以提高阅读效率。 - -# Goals -- user 消息气泡继续沿用当前宽度规则(不变)。 -- assistant 消息气泡在消息列表可用宽度内占满整行。 -- 保持既有折叠/展开与自动定位行为不受影响。 - -# Implementation Plan (phased) -1. 在 `MessageList` 中拆分 user/assistant 气泡宽度约束: - - user: 维持 `maxWidth = screen * 0.75`。 - - assistant: 使用整行宽度(依赖列表 padding 留白)。 -2. 增加 widget 测试验证宽度差异: - - 同屏渲染一条 user 与一条 assistant 消息。 - - 断言 assistant 气泡宽度显著大于 user,且接近列表可用宽度。 -3. 运行目标测试确保回归通过。 - -# Acceptance Criteria -- user 消息气泡视觉宽度与改动前一致。 -- assistant 消息气泡占满消息列表内容区域宽度。 -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart` 通过。 diff --git a/docs/plans/2026-04-09-10-48-UTC-channel-persistence-hydration.md b/docs/plans/2026-04-09-10-48-UTC-channel-persistence-hydration.md deleted file mode 100644 index 68196607..00000000 --- a/docs/plans/2026-04-09-10-48-UTC-channel-persistence-hydration.md +++ /dev/null @@ -1,28 +0,0 @@ -# Channel persistence hydration plan - -## Background -Users can create multiple channels in ChatScreen and send messages, but after a page refresh only the default channel is visible in the sidebar. Message history is already persisted server-side by session scope, yet channel/sub-section navigation state is not rehydrated from persisted backend data. - -## Goals -- Ensure channels and sub-sections with persisted chat data are reconstructed on app load. -- Keep default channel behavior intact while merging persisted scopes. -- Minimize schema risk by reusing existing chat task/message tables. - -## Implementation Plan (phased) -1. Backend scope discovery API - - Add a service query that lists distinct `(channel_id, thread_id, session_id)` scopes for the authenticated user ordered by most recent activity. - - Expose a new authenticated route `GET /api/chat/scopes`. -2. Mobile API client support - - Extend `ChatHistoryApiService` with typed scope DTOs and `loadScopes`. -3. ChatScreen hydration - - On startup, fetch scopes, reconstruct channels/sub-sections, and preserve a valid active scope. - - Generate stable fallback display names from channel/sub IDs when explicit names are unavailable. -4. Validation - - Add backend route/service tests and mobile API service tests. - - Run repository bootstrap and targeted test suites. - -## Acceptance Criteria -- After creating channels, sending messages, and refreshing the page, sidebar still shows previously used channels. -- Switching restored channels loads their corresponding session message history. -- `GET /api/chat/scopes` returns authenticated user scopes only, sorted by recent activity. -- Validation commands succeed: `./tools/init_dev_env.sh`, backend tests, and mobile chat API tests. diff --git a/docs/plans/2026-04-10-01-10-UTC-menu-animation-speedup.md b/docs/plans/2026-04-10-01-10-UTC-menu-animation-speedup.md deleted file mode 100644 index d7136926..00000000 --- a/docs/plans/2026-04-10-01-10-UTC-menu-animation-speedup.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -The chat UI currently uses default Flutter popup menu transition settings, which feel slow and start from a full collapsed translation impression. The requested UX is a globally faster menu animation with an iOS-like feel: quick reveal from approximately 80% scale with low starting opacity. - -# Goals -- Speed up popup menu open/close animations in the chat screen and composer bar. -- Use a scale+fade transition profile that starts near 80% size and low opacity, avoiding a "from zero" feel. -- Keep the animation token centralized in the design system so it can be reused across any `PopupMenuButton`. - -# Implementation Plan (phased) -1. Locate global app theme construction and popup menu usage points. -2. Add a shared `AnimationStyle` token (`menuPopupAnimationStyle`) in `BricksTheme` to reduce duration by ~50% and adjust curves for snappy response. -3. Apply `BricksTheme.menuPopupAnimationStyle` directly on each `PopupMenuButton` via its `popUpAnimationStyle` parameter. Note: `PopupMenuThemeData` does not expose a `popUpAnimationStyle` field in the Flutter version used by this project, so the per-button approach is the correct mechanism. -4. Run environment bootstrap and targeted Flutter tests/analyze for the touched package. -5. Review code map files and update only if indexing/entry-path metadata needs to reflect this behavior change. - -# Acceptance Criteria -- Popup menus in the app use a faster transition than before (approximately half duration). -- Popup menus animate with scale+fade (starting around 0.8 scale and low opacity) rather than appearing to start from 0. -- Existing composer popup menu widget tests continue to pass. -- Validation commands are documented and reproducible (`./tools/init_dev_env.sh`, `cd apps/mobile_chat_app && flutter test test/composer_bar_test.dart`). diff --git a/docs/plans/2026-04-10-04-39-UTC-channel-management.md b/docs/plans/2026-04-10-04-39-UTC-channel-management.md deleted file mode 100644 index 8f3b1b43..00000000 --- a/docs/plans/2026-04-10-04-39-UTC-channel-management.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -The chat sidebar currently creates channels with auto-generated names, does not support channel rename/archive actions, and the chat app bar title is hardcoded as "Bricks". - -# Goals -- Require user-provided channel names during creation. -- Ensure channel names are unique. -- Add long-press channel actions in the sidebar for rename and archive. -- Hide archived channels from the sidebar by removing them from the active channel list. -- Show the active channel name in the top app bar title, left-aligned. - -# Implementation Plan (phased) -1. Extend `ChatNavigationPage` to support long-press channel context actions (rename/archive) via callbacks and a popup menu. -2. In `ChatScreen`, replace auto-generated channel creation with a name input dialog and duplicate-name validation. -3. Implement channel rename and archive handlers in `ChatScreen`, including active-channel fallback behavior when archiving. -4. Update app bar title rendering to use the active channel name. -5. Add/adjust widget tests for navigation menu behavior and command dispatch. -6. Run Flutter checks/tests and update code maps if feature/logic entry points changed. - -# Acceptance Criteria -- Long-pressing a channel in the drawer shows actions for rename and archive. -- Renaming a channel updates its displayed name and does not allow duplicates. -- Archiving a channel removes it from the visible channel list. -- Creating a channel requires entering a name and cannot create with duplicate names. -- The app bar title displays the active channel name (left aligned). -- Relevant widget tests pass. diff --git a/docs/plans/2026-04-14-01-30-UTC-openclaw-plugin-platform-api-and-settings-copy.md b/docs/plans/2026-04-14-01-30-UTC-openclaw-plugin-platform-api-and-settings-copy.md deleted file mode 100644 index 064590d2..00000000 --- a/docs/plans/2026-04-14-01-30-UTC-openclaw-plugin-platform-api-and-settings-copy.md +++ /dev/null @@ -1,34 +0,0 @@ -# Background -Bricks needs a production-oriented backend interface contract to support OpenClaw plugin development under a pull-only topology. The current design draft captures architectural intent, but it should be hardened into an implementation-ready development document with explicit API contracts, security boundaries, idempotency semantics, and phased delivery guidance. In parallel, the Settings experience in the mobile app should support one-click copy actions for API URL and API key values to reduce operator friction during plugin setup and debugging. - -# Goals -1. Produce an improved, implementation-ready Bricks × OpenClaw pull-only integration development document. -2. Define clear backend API boundaries (MVP-required vs optional), auth model, delivery semantics, and operational constraints. -3. Add copy actions in settings for API URL and API key. -4. Add/adjust automated tests for the new settings copy actions. -5. Update code maps if feature/doc index or behavior coverage changes. - -# Implementation Plan (phased) -## Phase 1: Documentation hardening -- Create a dedicated integration doc under `docs/` for Bricks platform API + OpenClaw plugin pull-only integration. -- Keep the architecture boundary explicit: Bricks platform vs plugin adapter vs OpenClaw core. -- Add a normative API contract section with request/response shape, error model, idempotency rules, and status code expectations. -- Add implementation sequence, rollout strategy, observability, and security checklist. - -## Phase 2: Settings copy UX -- Update `ModelSettingsScreen` to support copying Base URL (API URL) and API key to clipboard. -- Provide user feedback with snackbars for success/empty value cases. -- Preserve existing API key visibility toggle behavior. - -## Phase 3: Validation and code-map sync -- Run repository bootstrap command before Flutter checks: `./tools/init_dev_env.sh`. -- Run focused widget tests for settings behavior. -- Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` to reflect the new settings behavior and new integration document indexes. - -# Acceptance Criteria -1. A new OpenClaw pull-only integration development document exists under `docs/` and is implementation-ready for backend/API work. -2. Model settings UI exposes a copy action for API URL and a copy action for API key. -3. Tapping copy actions writes expected clipboard values when present and displays user feedback. -4. Existing settings interactions (save/delete/toggle visibility) remain functional. -5. Relevant tests pass (at minimum: `flutter test test/model_settings_screen_test.dart` from `apps/mobile_chat_app`). -6. Code maps are updated to include behavior/doc-index changes introduced by this task. diff --git a/docs/plans/2026-04-14-03-31-UTC-address-pr-review-comments.md b/docs/plans/2026-04-14-03-31-UTC-address-pr-review-comments.md deleted file mode 100644 index 134af00f..00000000 --- a/docs/plans/2026-04-14-03-31-UTC-address-pr-review-comments.md +++ /dev/null @@ -1,5 +0,0 @@ -- [x] Review PR feedback threads and current implementation details in docs/UI tests -- [x] Update OpenClaw integration doc to clarify PATCH semantics, ACK semantics, canonical plugin identity, and error schema/status matrices -- [x] Add widget test for successful non-empty API key copy flow -- [x] Run bootstrap and targeted Flutter tests for modified areas -- [ ] Run final validation (including parallel validation), capture screenshot, and reply to the new PR comment diff --git a/docs/plans/2026-04-15-07-21-UTC-comment-followup-unified-messages-events.md b/docs/plans/2026-04-15-07-21-UTC-comment-followup-unified-messages-events.md deleted file mode 100644 index 16765c20..00000000 --- a/docs/plans/2026-04-15-07-21-UTC-comment-followup-unified-messages-events.md +++ /dev/null @@ -1,5 +0,0 @@ -- [x] Review new PR comments and decide which need action/reply -- [x] Confirm current CI workflow status for this PR branch -- [x] Update integration doc to explicitly state unified messages storage + separate events/outbox -- [x] Validate documentation-only change and run final review validation -- [ ] Reply to actionable PR comment with commit hash and screenshot link diff --git a/docs/plans/2026-04-15-16-06-UTC-implementation-doc-alignment-check.md b/docs/plans/2026-04-15-16-06-UTC-implementation-doc-alignment-check.md deleted file mode 100644 index a86942af..00000000 --- a/docs/plans/2026-04-15-16-06-UTC-implementation-doc-alignment-check.md +++ /dev/null @@ -1,18 +0,0 @@ -## Background -Reviewer feedback requested checking current code implementation and ensuring the OpenClaw pull-only integration document stays aligned with actual backend behavior and boundaries. - -## Goals -1. Verify whether current backend storage patterns conflict with the integration document. -2. Update the document where needed so it clearly distinguishes current implementation status vs target OpenClaw contract. -3. Keep changes minimal and scoped to the feedback. - -## Implementation Plan (phased) -- [x] Inspect current backend chat storage schema and transport services. -- [x] Compare current implementation with the OpenClaw integration document data-model guidance. -- [x] Update `docs/openclaw_pull_only_integration_dev_doc.md` with explicit implementation-alignment notes. -- [ ] Validate changed docs and reply on PR thread with commit reference. - -## Acceptance Criteria -- The document explicitly states that message storage remains unified (not split by message source). -- The document explicitly states that event/outbox persistence is an independent concern and currently a target integration contract. -- PR thread receives a concise follow-up with the commit hash that contains the alignment update. diff --git a/docs/plans/2026-04-16-05-00-UTC-openclaw-gap-audit-and-token-chain.md b/docs/plans/2026-04-16-05-00-UTC-openclaw-gap-audit-and-token-chain.md deleted file mode 100644 index c1549745..00000000 --- a/docs/plans/2026-04-16-05-00-UTC-openclaw-gap-audit-and-token-chain.md +++ /dev/null @@ -1,29 +0,0 @@ -# OpenClaw Gap Audit and Token Chain Validation (Consolidated) - -## Background -The previous iteration produced multiple short plan files and partial implementation updates. This consolidated document merges the current review context and implementation goals into a single artifact. - -## Goals -1. Compare target requirements from post-main docs with current implementation status. -2. Close critical integration gaps for remote OpenClaw/小龙虾 token flow. -3. Ensure the user journey is end-to-end: generate token in Settings -> configure external server -> external server connects back and sends messages. - -## Implementation Plan (phased) -### Phase 1: Gap audit -- Verify target vs implementation for pull-only APIs and auth model. -- Confirm whether Settings currently exposes OpenClaw token issuance. - -### Phase 2: Gap closure -- Add backend token-issuance endpoint for authenticated users. -- Support JWT platform tokens in platform auth middleware. -- Wire Settings UI to request, show, and copy the OpenClaw token bundle. - -### Phase 3: Validation -- Add/extend automated tests for token retrieval and copy behavior. -- Verify backend type-check and platform route tests. - -## Acceptance Criteria -- Settings page can fetch and copy a dedicated OpenClaw token. -- External service can use that token with `X-Bricks-Plugin-Id` against `/api/v1/platform/*`. -- Platform middleware accepts scoped JWT tokens and enforces plugin identity constraints. -- Consolidated planning is captured in one markdown file for this iteration. diff --git a/docs/plans/2026-04-16-08-47-UTC-move-openclaw-token-to-settings-item.md b/docs/plans/2026-04-16-08-47-UTC-move-openclaw-token-to-settings-item.md deleted file mode 100644 index b1809ec7..00000000 --- a/docs/plans/2026-04-16-08-47-UTC-move-openclaw-token-to-settings-item.md +++ /dev/null @@ -1,20 +0,0 @@ -## Background -The PR feedback requests moving the token-generation action out of Model Settings into the top-level Settings page as a dedicated settings item, and renaming the button text to "Openclaw Token". - -## Goals -1. Remove token-generation UI from Model Settings. -2. Add a dedicated "Openclaw Token" settings entry in Settings. -3. Keep token generation/copy behavior working with updated naming. - -## Implementation Plan (phased) -- [x] Locate existing token generation implementation and related widget tests. -- [x] Move token UI/logic from `ModelSettingsScreen` into a dedicated settings flow. -- [x] Add a new settings list item in `SettingsScreen` that navigates to Openclaw token UI. -- [x] Update and add targeted widget tests for the new location and label. -- [x] Run targeted Flutter tests and finalize. - -## Acceptance Criteria -- "Get Xiaolongxia Token" no longer appears in Model Settings. -- Settings page contains a new "Openclaw Token" item. -- Entering that item allows generating a token, viewing token metadata, and copying the token. -- Widget tests cover the new settings entry and token generation/copy flow. diff --git a/docs/plans/2026-04-16-10-51-UTC-node-openclaw-plugin-implementation.md b/docs/plans/2026-04-16-10-51-UTC-node-openclaw-plugin-implementation.md deleted file mode 100644 index c93500d3..00000000 --- a/docs/plans/2026-04-16-10-51-UTC-node-openclaw-plugin-implementation.md +++ /dev/null @@ -1,33 +0,0 @@ -# Background -用户希望“根据文档实现 node_openclaw_plugin”。仓库当前已具备 Bricks 平台侧 pull-only API(`/api/v1/platform/*`)与 token 签发能力,但尚无独立的 Node.js 插件示例/运行时来执行文档中的事件拉取、ACK、消息写回闭环。 - -# Goals -- 新增 `apps/node_openclaw_plugin`,提供最小可运行的 Node.js/TypeScript 插件实现。 -- 按文档实现 pull-only 主循环:拉取事件、去重处理、ACK、消息回写。 -- 提供环境变量与运行说明,便于本地联调。 -- 增加基础单测,覆盖关键状态持久化与处理逻辑。 -- 同步更新代码地图索引,确保新功能可被测试与 AI 检索。 - -# Implementation Plan (phased) -## Phase 1: 项目骨架与客户端 -1. 创建 `apps/node_openclaw_plugin` 包(`package.json`、`tsconfig.json`、`src/`)。 -2. 实现平台 API 客户端:`events` 拉取、`events/ack`、`messages` 创建/更新、`conversations/resolve`。 -3. 定义插件内部类型与错误处理(标准化 HTTP 异常)。 - -## Phase 2: 事件处理与状态持久化 -1. 实现文件状态仓库(`cursor`、`processedEventIds`、`clientToken->messageId` 映射)。 -2. 实现插件运行器:轮询、按 `eventId` 去重、按批 ACK、失败重试边界。 -3. 为 `message.created` 事件实现示例回写逻辑(create + patch)。 -4. 为 `conversation.binding_changed` 增加日志处理分支(MVP noop)。 - -## Phase 3: 文档、测试与代码地图 -1. 添加插件目录 README(环境变量、运行命令、行为说明)。 -2. 编写并运行单测(状态仓库/处理流程)。 -3. 更新 `docs/code_maps/feature_map.yaml` 与 `docs/code_maps/logic_map.yaml`,纳入新插件功能索引。 - -# Acceptance Criteria -- 在 `apps/node_openclaw_plugin` 下可执行 `npm run build`、`npm run test` 并通过。 -- 插件主循环可根据环境变量连接 Bricks API,执行“pull -> process -> ack -> writeback”流程。 -- ACK 请求体不包含 `pluginId`,并使用请求头 `X-Bricks-Plugin-Id`。 -- 本地状态可持久化并在重启后继续使用 cursor 与去重集合。 -- 代码地图已更新,包含 `node_openclaw_plugin` 的入口、代码索引与回归风险。 diff --git a/docs/plans/2026-04-16-12-00-UTC-branch-db-diff-analysis.md b/docs/plans/2026-04-16-12-00-UTC-branch-db-diff-analysis.md deleted file mode 100644 index 7c5b4a95..00000000 --- a/docs/plans/2026-04-16-12-00-UTC-branch-db-diff-analysis.md +++ /dev/null @@ -1,21 +0,0 @@ -# Branch vs main database delta analysis plan - -## Background -A request was made to analyze what database-related changes this working branch introduced relative to `main`. -In this container snapshot, only the `work` local branch exists, so analysis relies on commit inspection and diffs against nearby merge-base candidates. - -## Goals -- Identify whether schema/migration files changed on this branch. -- Identify whether query behavior changed without schema changes. -- Produce a concise, evidence-based summary. - -## Implementation Plan (phased) -1. Inspect available local branches and commit graph to determine compare strategy. -2. Check for changed files under database-related paths (`apps/node_backend/src/db/**`) in branch commits. -3. Review backend service diffs for SQL/query-level behavioral changes. -4. Summarize findings and explicitly call out constraints (missing local `main` ref). - -## Acceptance Criteria -- The response clearly states whether any new migration/schema changes exist. -- If no schema changes exist, query-level data-access changes (if any) are listed. -- The response includes exact commands used and file citations. diff --git a/docs/plans/2026-04-16-12-20-UTC-api-feature-db-impact-recheck.md b/docs/plans/2026-04-16-12-20-UTC-api-feature-db-impact-recheck.md deleted file mode 100644 index 94aa7cf0..00000000 --- a/docs/plans/2026-04-16-12-20-UTC-api-feature-db-impact-recheck.md +++ /dev/null @@ -1,20 +0,0 @@ -# API feature database impact re-check plan - -## Background -The branch introduced platform API capabilities. We need to verify whether the earlier claim of "no database changes" is fully accurate. - -## Goals -- Distinguish schema/migration changes from data-access/query behavior changes. -- Verify changed backend files since the presumed base commit used in prior analysis. -- Produce a correction-ready summary. - -## Implementation Plan (phased) -1. Diff backend files between `5e7d966` and `HEAD` to isolate API-feature changes. -2. Diff database migration path (`apps/node_backend/src/db/**`) over the same range. -3. Inspect changed service code for SQL reads/writes against existing tables. -4. Summarize as: schema impact vs behavior impact. - -## Acceptance Criteria -- Explicitly states whether new migrations/schema files were added. -- Explicitly states whether API changes read/write database tables. -- Includes concrete command evidence and file citations. diff --git a/docs/plans/2026-04-16-12-40-UTC-main-worktree-feature-logic-review.md b/docs/plans/2026-04-16-12-40-UTC-main-worktree-feature-logic-review.md deleted file mode 100644 index 5c7b2a26..00000000 --- a/docs/plans/2026-04-16-12-40-UTC-main-worktree-feature-logic-review.md +++ /dev/null @@ -1,21 +0,0 @@ -# Main worktree comparison review plan (feature-logic oriented) - -## Background -The request is to perform code review against the "main worktree" and summarize logic per changed feature. -In this container snapshot, no separate `main` worktree exists, so we compare against commit `5e7d966` as the closest available main-line baseline. - -## Goals -- Group code changes by feature capability rather than file list only. -- Explain endpoint and UI behavior flows with security and data-access implications. -- Provide a review-ready summary with evidence references. - -## Implementation Plan (phased) -1. Enumerate changed files in `5e7d966..HEAD` and cluster by backend/mobile/test features. -2. Review platform API auth, routing, and service logic to map request → validation → DB access → response. -3. Review mobile settings flow for token generation/display/copy interactions. -4. Cross-check tests that validate new logic and identify untested risk edges. - -## Acceptance Criteria -- Each changed feature has a concise logic description. -- Security boundary (auth + scopes + userId scoping) is explicitly described. -- Database impact is explicitly separated into schema vs query/write behavior. diff --git a/docs/plans/2026-04-16-13-00-UTC-plugin-development-architecture-doc.md b/docs/plans/2026-04-16-13-00-UTC-plugin-development-architecture-doc.md deleted file mode 100644 index d120b5ef..00000000 --- a/docs/plans/2026-04-16-13-00-UTC-plugin-development-architecture-doc.md +++ /dev/null @@ -1,20 +0,0 @@ -# Plugin development architecture document plan - -## Background -A plugin architecture document is requested, and it must clearly show both repository code structure and practical usage. - -## Goals -- Provide a readable architecture document for plugin developers. -- Explain where backend auth/routes/services and mobile token UX live in code. -- Include setup, auth, endpoint usage, and extension guidance. - -## Implementation Plan (phased) -1. Extract plugin-related modules and flows from current backend/mobile code. -2. Write an architecture document with code tree, request flow, and security boundaries. -3. Add step-by-step usage examples for token issuance and platform API calls. -4. Add extension checklist and troubleshooting notes for implementation teams. - -## Acceptance Criteria -- Document includes explicit code structure mapping (path-level). -- Document includes end-to-end usage steps with example requests. -- Document is actionable for new plugin developers without reading all source code first. diff --git a/docs/plans/2026-04-16-16-00-UTC-node-openclaw-plugin-jwt-hardening.md b/docs/plans/2026-04-16-16-00-UTC-node-openclaw-plugin-jwt-hardening.md deleted file mode 100644 index 4dbca7a4..00000000 --- a/docs/plans/2026-04-16-16-00-UTC-node-openclaw-plugin-jwt-hardening.md +++ /dev/null @@ -1,30 +0,0 @@ -# Background -用户反馈上一版 `node_openclaw_plugin` 与目标不一致:需要明确该实现是用于 OpenClaw 对接的插件运行时(而非文档描述中的宽泛 adapter 表述),并且需要在代码层面真正收敛到 JWT token 路径,避免“文档改了但逻辑仍保留静态 key 兼容”的遗留错误资产。 - -# Goals -- 将 `node_openclaw_plugin` 的运行前校验与调用语义收敛为 JWT-only。 -- 修复当前插件与后端平台接口字段不一致导致的消息 patch 失效问题。 -- 修复 ACK 与本地状态持久化顺序问题,避免 ACK 成功但本地状态未落盘。 -- 同步更新 README 与架构文档,消除“adapter/bridge”歧义与静态 key 残留描述。 - -# Implementation Plan (phased) -## Phase 1: JWT-only 运行时约束 -1. 新增 JWT claims 解析与基础校验逻辑(typ/pluginId/userId/exp)。 -2. 在启动配置加载阶段强制校验 token,失败直接退出。 -3. 在运行时使用 token userId 执行消息过滤(避免自触发回环)。 - -## Phase 2: 协议对齐与可靠性修复 -1. 将消息 patch 字段调整为后端当前可识别的 `text`/`metadata`。 -2. 重构 ACK 流程:先持久化 pending ACK,再发送 ACK,成功后提交 cursor。 -3. 为 pending ACK 增加重试入口,确保崩溃恢复后可继续推进 cursor。 - -## Phase 3: 文档与测试收口 -1. 更新 `apps/node_openclaw_plugin/README.md`:明确 OpenClaw 插件运行时 + JWT-only。 -2. 更新 `docs/plugin_development_architecture.md` 代码结构,纳入新插件目录。 -3. 增加测试覆盖 JWT claims 校验与状态仓库新字段兼容。 - -# Acceptance Criteria -- 插件启动时若 token 非合法 JWT claims(缺 typ/pluginId/userId 或过期)会直接失败。 -- 插件向 `PATCH /api/v1/platform/messages/:id` 发送后端可识别字段并能更新文本。 -- ACK 流程具备 pending 持久化,崩溃恢复后可继续 ACK 并推进 cursor。 -- README 不再声明静态 key 支持,且语义明确为 OpenClaw 插件运行时。 diff --git a/docs/plans/2026-04-16-22-15-UTC-openclaw-onboarding-enable.md b/docs/plans/2026-04-16-22-15-UTC-openclaw-onboarding-enable.md deleted file mode 100644 index deaa4742..00000000 --- a/docs/plans/2026-04-16-22-15-UTC-openclaw-onboarding-enable.md +++ /dev/null @@ -1,29 +0,0 @@ -# Background -`apps/node_openclaw_plugin` 目前提供的是 pull-only 运行时示例,但尚未具备 OpenClaw 插件“安装后可在 onboarding/configure 向导中交互写入 channel 配置”的能力。用户希望 channel id 使用 `dev-askman-bricks`,并在配置过程中提示输入 `BRICKS_PLATFORM_TOKEN` 等必填参数,自动写入 `channels.dev-askman-bricks`。 - -# Goals -- 为 `apps/node_openclaw_plugin` 增加可被 OpenClaw 识别的插件元数据(manifest + package metadata)。 -- 增加 channel onboarding hook(`configureInteractive`)以提示用户输入并返回配置。 -- 在 README 中补充“子目录安装 + onboarding 配置”步骤,便于用户把说明交给 AI 自动执行。 -- 同步代码地图索引,反映新增 onboarding 能力与风险点。 - -# Implementation Plan (phased) -## Phase 1: 插件清单与安装发现元数据 -1. 新增 `openclaw.plugin.json`,声明 `channelConfigs.dev-askman-bricks` schema 与 `uiHints`。 -2. 在 `package.json` 中补充 `openclaw.extensions/openclaw.channel/openclaw.install` 元数据,支持子目录与 npm 安装引导。 - -## Phase 2: onboarding 交互配置能力 -1. 新增 OpenClaw 插件入口文件,导出带 `onboarding.configureInteractive(ctx)` 的插件对象。 -2. 在 hook 中通过 `ctx.prompter.input` 询问 `BRICKS_BASE_URL`、`BRICKS_PLUGIN_ID`、`BRICKS_PLATFORM_TOKEN`。 -3. 返回 `{ cfg, accountId }` 以让 OpenClaw 自动写入 `channels.dev-askman-bricks`。 - -## Phase 3: 文档、测试与代码地图 -1. 更新 `apps/node_openclaw_plugin/README.md`,写清子目录安装、onboard/configure 流程、非 install lifecycle 限制。 -2. 运行 TypeScript 构建与测试检查。 -3. 更新 `docs/code_maps/feature_map.yaml` 与 `docs/code_maps/logic_map.yaml`。 - -# Acceptance Criteria -- `apps/node_openclaw_plugin` 包含可通过 OpenClaw 发现的 `openclaw.plugin.json` 与 `openclaw.extensions` 元数据。 -- 安装插件后执行 onboarding/configure 时,向导可提示用户输入 token/base URL/plugin id,并将配置写入 `channels.dev-askman-bricks`。 -- README 明确说明子目录安装步骤与配置命令。 -- 代码地图已覆盖 onboarding 入口与回归风险。 diff --git a/docs/plans/2026-04-17-02-22-UTC-address-pr-review-followups.md b/docs/plans/2026-04-17-02-22-UTC-address-pr-review-followups.md deleted file mode 100644 index 9a698cdf..00000000 --- a/docs/plans/2026-04-17-02-22-UTC-address-pr-review-followups.md +++ /dev/null @@ -1,22 +0,0 @@ -## Background -Recent PR review comments identified contract drift between the OpenClaw integration document and current backend implementation, plus two code issues: insufficient JWT plugin isolation in platform auth middleware and plugin-side event filtering that drops valid user messages. - -## Goals -1. Align integration documentation to the currently implemented API/auth behavior. -2. Enforce strict plugin isolation for JWT platform tokens. -3. Ensure plugin event filtering does not skip valid user-origin events. -4. Keep related tests and code maps synchronized. - -## Implementation Plan (phased) -- [x] Inspect review comments, current backend/plugin implementation, and impacted docs/tests. -- [x] Update integration doc sections for auth model, PATCH contract shape, rawId examples, and current implementation alignment. -- [x] Tighten platform JWT validation to require pluginId claim and header equality. -- [x] Adjust OpenClaw plugin event filter to avoid dropping same-user message.created events. -- [x] Update/add targeted backend and plugin tests for new auth/filtering behavior. -- [x] Run targeted tests and finalize. - -## Acceptance Criteria -- Integration doc reflects current supported auth modes (JWT primary + optional static key fallback) and current MVP message patch contract. -- Middleware rejects platform JWT tokens missing pluginId claim, and still rejects pluginId mismatches. -- Plugin processes message.created events from user senders even when sender.userId equals token userId, while still ignoring assistant/system events. -- Targeted tests pass in `apps/node_backend` and `apps/node_openclaw_plugin`. diff --git a/docs/plans/2026-04-17-05-52-UTC-openclaw-channel-plugin-conversion.md b/docs/plans/2026-04-17-05-52-UTC-openclaw-channel-plugin-conversion.md deleted file mode 100644 index 0795d0a7..00000000 --- a/docs/plans/2026-04-17-05-52-UTC-openclaw-channel-plugin-conversion.md +++ /dev/null @@ -1,29 +0,0 @@ -# Background -`apps/node_openclaw_plugin` currently exposes OpenClaw package metadata and onboarding prompts, but OpenClaw still treats it like a generic plugin instead of a true channel plugin. That leaves `channels.dev-askman-bricks.*` invalid in `openclaw config set`, which blocks narrow channel-only configuration and makes the metadata/runtime contract inconsistent. - -# Goals -- Make `dev-askman-bricks` a real OpenClaw channel from manifest, package metadata, and runtime registration perspectives. -- Keep the existing Bricks pull-only standalone runner intact. -- Restore the intended config surface so `channels.dev-askman-bricks.*` is valid. -- Update targeted docs/tests so the new channel contract is explicit and regression-resistant. - -# Implementation Plan (phased) -## Phase 1: Channel contract alignment -1. Update `apps/node_openclaw_plugin/openclaw.plugin.json` to declare channel ownership (`kind`, `channels`) while preserving `channelConfigs`. -2. Add/adjust package metadata (`openclaw.setupEntry` if needed) so setup/configure surfaces can load the plugin as a channel. - -## Phase 2: Minimal native channel runtime -1. Replace the current onboarding-only extension entry with a real channel entry that calls `api.registerChannel({ plugin })`. -2. Define the smallest viable channel plugin object: metadata, config schema, and setup/config wiring for `channels.dev-askman-bricks`. -3. Add a lightweight setup-only entry for setup/configure flows. - -## Phase 3: Verification and docs -1. Update `apps/node_openclaw_plugin/README.md` to document the channel config path and command flow. -2. Update tests to cover channel registration/config wiring instead of the old onboarding-only object shape. -3. Run package build/tests and local OpenClaw verification, including `openclaw config set channels.dev-askman-bricks.*`. - -# Acceptance Criteria -- OpenClaw accepts `channels.dev-askman-bricks.*` writes for the Bricks plugin. -- `openclaw plugins inspect dev-askman-bricks` shows the plugin as a channel-capability plugin rather than a generic non-capability plugin. -- `apps/node_openclaw_plugin` build/test/type-check continue to pass. -- The README explains how to configure Bricks via the channel config path. diff --git a/docs/plans/2026-04-17-07-29-UTC-openclaw-router-default-plan.md b/docs/plans/2026-04-17-07-29-UTC-openclaw-router-default-plan.md deleted file mode 100644 index 55917bb4..00000000 --- a/docs/plans/2026-04-17-07-29-UTC-openclaw-router-default-plan.md +++ /dev/null @@ -1,65 +0,0 @@ -# Problem -Add a per-scope message router for Bricks chat so each channel and thread can choose between: -- `default`: messages are handled inside Bricks by `/api/chat/respond` and `generateWithUserConfig(...)` -- `openclaw`: user messages are handed off asynchronously through the Bricks platform/OpenClaw plugin path, and plugin-side updates flow back into Bricks UI - -The current codebase does not persist channel/thread settings yet. Chat scopes are inferred from existing traffic, and the mobile UI still assumes `/api/chat/respond` returns assistant text immediately. - -# Proposed approach -## 1. Persist scope router settings -- Add a backend persistence model for scope settings, recommended as a new `chat_scope_settings` table keyed by `(user_id, channel_id, thread_id nullable)`. -- Store a `router` enum/string with allowed values `default` and `openclaw`. -- Resolve the effective router as: - - thread-level override - - else channel-level setting - - else implicit `default` -- Extend chat scope APIs so the mobile app can fetch and update both channel-level and thread-level router settings. - -## 2. Branch backend dispatch by effective router -- Keep `/api/chat/respond` as the main authenticated entrypoint for app-originated sends. -- For `default`, preserve the existing synchronous flow: - - accept task - - persist the user message - - call `generateWithUserConfig(...)` - - persist the assistant message - - return assistant text immediately -- For `openclaw`, change the flow to async handoff: - - accept task - - persist the user message - - skip internal LLM generation - - return an accepted/pending response shape that the UI can track - - let the OpenClaw plugin pull the new user message from the platform events API and write back assistant updates through `/api/v1/platform/messages` - - if the user's plugin/token is not currently active, keep the message pending instead of falling back to `default` - -## 3. Tighten the platform event bridge -- Filter platform events so only eligible user-originated messages from `openclaw`-routed scopes are emitted to plugins. -- Prevent replay/echo loops for plugin-authored assistant messages and platform patch updates. -- Preserve conversation resolution through the existing `(channelId, threadId, sessionId)` mapping. - -## 4. Update the mobile chat UX -- Add router controls for channels and threads in the chat UI/state managed from `chat_screen.dart`. -- Hydrate scope settings from backend instead of treating channels/threads as traffic-derived only. -- Keep current behavior for `default`. -- For `openclaw`, stop assuming an immediate assistant reply: - - show dispatched/pending task state - - rely on existing chat sync/history updates to render plugin-created assistant messages when they arrive - - keep messages pending while OpenClaw is unavailable rather than silently rerouting them - -## 5. Validate end to end -- Backend tests for router resolution, new scope settings APIs, `/api/chat/respond` branching, and platform event filtering. -- Flutter tests for effective-router resolution and async/pending message UX. -- Plugin tests for event handling assumptions if server-side filtering changes. -- Run the existing package build/test commands for touched apps. - -# Todos -1. Add router persistence and scope settings APIs in the backend. -2. Branch `/api/chat/respond` into synchronous `default` handling and asynchronous `openclaw` handoff. -3. Filter platform events and writeback behavior so only OpenClaw-routed user messages are exported and plugin updates do not loop. -4. Add channel/thread router controls and async OpenClaw task handling in the Flutter chat UI. -5. Add/update tests and run repository checks for the touched packages. - -# Notes -- Current scope discovery is traffic-derived via `/api/chat/scopes`; there is no persisted channel/thread settings model yet. -- `ChatHistoryApiService.respond()` and `chat_screen.dart` currently expect immediate assistant text, so OpenClaw requires a contract/UI change rather than a pure config switch. -- Recommended precedence: thread router overrides channel router. -- Confirmed behavior: if a scope is set to `openclaw` and the local plugin/token is not currently available, Bricks should still accept the message and leave it pending until OpenClaw becomes available. There should be no silent fallback to `default`. diff --git a/docs/plans/2026-04-17-10-29-UTC-request-performance-improvements.md b/docs/plans/2026-04-17-10-29-UTC-request-performance-improvements.md deleted file mode 100644 index 0d34acf7..00000000 --- a/docs/plans/2026-04-17-10-29-UTC-request-performance-improvements.md +++ /dev/null @@ -1,244 +0,0 @@ -# Request performance improvements - -## Problem - -The current Bricks request model favors simple polling over request efficiency. -That works for correctness, but it can create too many empty requests and raise -the chance of `429` responses when either: - -- the web client repeatedly polls `/api/chat/sync/:sessionId` -- the OpenClaw plugin repeatedly polls `/api/v1/platform/events` - -We do **not** want to implement the full fix in this task. This document is a -future-work guide for improving request efficiency safely. - -## Current state - -### Web chat sync - -- `apps/mobile_chat_app/lib/features/chat/chat_screen.dart` -- The chat UI polls `/api/chat/sync/:sessionId` every 2 seconds when the active - scope is routed to OpenClaw or when there are pending assistant tasks. -- The current loop is timer-driven, not completion-driven. -- Recent work already reduced one source of 429s by moving `/api/chat/sync/*` - off the coarse global `/api/*` limiter. - -### OpenClaw plugin polling - -- `apps/node_openclaw_plugin/src/pluginRunner.ts` -- The plugin loop is already **end-to-start**: - 1. run a full tick - 2. pull events - 3. ack them - 4. write message updates - 5. then sleep -- Default poll interval is 2000 ms. - -### Backend rate limiting - -- `apps/node_backend/src/app.ts` -- A coarse limiter still applies to most `/api/*` traffic: - - 100 requests / 15 minutes / IP -- That is too small for any route that intentionally polls. -- `/api/chat/sync/*` has already been carved out, but `/api/v1/platform/*` - still deserves its own dedicated policy. - -### Platform routes - -- `apps/node_backend/src/routes/platform.ts` -- Platform routes already have authentication and scope checks, but they do not - yet have a platform-specific limiter or a long-poll contract. - -## Goals - -1. Reduce empty requests. -2. Reduce `429` responses during normal chat/plugin operation. -3. Keep perceived latency low when new messages arrive. -4. Stay compatible with Vercel/serverless constraints. -5. Avoid broad protocol changes until the smaller fixes are validated. - -## Recommended staged plan - -### Stage 1: Improve polling behavior without changing the HTTP contract - -#### Web `/api/chat/sync` - -Move the web client to **completion-based polling**: - -- schedule the next sync **after** the previous request finishes -- do not use fixed periodic ticks as the source of truth - -Add client backoff on failed syncs: - -- success: `2s` -- first failure: `4s` -- second failure: `8s` -- later failures: cap at `10s` - -Reset the delay back to `2s` after any successful response. - -Also: - -- honor `Retry-After` if the backend sends it -- add a small jitter window (for example ±10%) so many clients do not poll in - lockstep -- make sure only one sync loop is active per visible scope/tab - -#### OpenClaw plugin `/api/v1/platform/events` - -The plugin already polls end-to-start, so it is in a better shape than the web -client. The next improvement should be **retry behavior**, not loop shape: - -- treat `429` and retryable `5xx` responses as backoff signals -- use the same capped retry ladder: - - `2s` -> `4s` -> `8s` -> `10s` -- prefer backend-provided `Retry-After` when present - -### Stage 2: Add route-specific backend rate limiting - -#### `/api/chat/sync/*` - -Keep the current approach: - -- do **not** let this route share the generic `/api/*` IP limiter -- keep a route-specific budget keyed by authenticated chat context - -#### `/api/v1/platform/*` - -Add a dedicated limiter for platform traffic instead of sharing the generic IP -bucket. - -Recommended keying: - -- JWT platform token mode: `pluginId:userId` -- static platform key mode: `pluginId:remoteAddress` (or another stable plugin - identity if one is introduced later) - -Recommended behavior: - -- separate read-heavy polling routes from write routes if needed -- return structured `429` errors with retry hints -- avoid adding many new environment variables unless real operations require it - -### Stage 3: Reduce empty responses with long polling - -If Stage 1 and Stage 2 are still not enough, add **short long-poll** behavior. - -#### `/api/chat/sync/:sessionId` - -Allow the server to hold an empty request for up to **10 seconds** before -returning a no-change response. - -Behavior: - -- if new messages already exist, return immediately -- if no new messages exist, wait up to 10 seconds -- return early as soon as new data becomes available -- return an empty/no-change payload only when the wait window expires - -#### `/api/v1/platform/events` - -Apply the same idea to platform event pulls: - -- return immediately when unread events exist -- otherwise hold the request briefly instead of replying empty right away - -Important note: - -- this is a bigger change than client backoff -- validate carefully on Vercel/serverless before rolling it out broadly - -### Stage 4: Consider event-driven transport only if needed - -If polling and long-polling are still not sufficient, then evaluate: - -- Server-Sent Events for chat updates -- Server-Sent Events for platform events -- WebSockets only if truly bidirectional low-latency behavior is needed - -This should come later because it increases operational and protocol -complexity. - -## Detailed implementation notes - -### Web sync scheduler - -Recommended behavior for the next implementation: - -1. start one sync request -2. wait for completion -3. decide the next delay from the outcome -4. schedule exactly one future sync - -Outcome table: - -| Outcome | Next delay | -| --- | --- | -| Success | 2s | -| Retryable failure / 429 | 4s, then 8s, then 10s max | -| `Retry-After` present | use `Retry-After`, capped at a sane upper bound if desired | - -Additional safeguards: - -- ignore stale responses when the user changed channel/thread while the request - was in flight -- cancel timers immediately on scope switch -- consider pausing or widening intervals when the tab is hidden - -### Platform polling - -The plugin loop should remain: - -```text -tick -> sleep -``` - -That is already the right shape. - -Future work should focus on: - -- backend rate-limit symmetry -- retry/backoff -- optional long-poll for empty event pulls - -## Validation plan - -### Functional tests - -- web sync scheduler never runs more than one request at a time -- failure backoff caps at `10s` -- success resets delay to `2s` -- stale scope changes do not reschedule old loops -- platform limiter does not block normal polling traffic - -### Load / soak checks - -- one OpenClaw-routed web tab open for 15+ minutes -- multiple tabs for the same user -- multiple plugin runners against the same backend -- empty queue behavior vs active queue behavior - -### Metrics to watch - -- requests/minute per active session -- requests/minute per active plugin -- `429` count by route -- empty response ratio -- median and p95 latency -- Vercel execution time and timeout behavior for long-poll candidates - -## Recommended implementation order - -1. Web completion-based polling with `2s -> 4s -> 8s -> 10s` capped backoff -2. Platform route-specific limiter and plugin retry/backoff -3. Short long-poll prototype for `/api/chat/sync` -4. Long-poll evaluation for `/api/v1/platform/events` -5. Event-driven transport only if polling remains insufficient - -## Decision log - -- This document intentionally records future work only. -- We are **not** implementing the long-poll / advanced performance changes in - this task. -- Prefer fixed code-level defaults first; only introduce more env config if - production operations actually need it. diff --git a/docs/plans/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md b/docs/plans/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md deleted file mode 100644 index 8412b461..00000000 --- a/docs/plans/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md +++ /dev/null @@ -1,55 +0,0 @@ -# OpenClaw 消息路由与读状态(当前有效基线) - -## Background - -为避免历史方案并存造成误解,本文件统一承接 2026-04-17 这一组 OpenClaw 消息路由调整的阶段性结论。 -此前对应的阶段性计划文档已从 `docs/plans/` 中移除,因此此处不再保留旧文件名列表,避免形成失效引用。 -本文件即为该主题当前唯一保留且持续维护的有效基线。 - -## Goals - -1. 定义 OpenClaw 路由下“已发送未读 / 已读并回复”的**当前**语义与数据形态。 -2. 明确平台事件过滤条件与空事件排查入口。 -3. 给出当前测试覆盖边界与后续补强重点。 - -## Implementation Plan (phased) - -### Phase 1 — 当前行为基线(已生效) -- OpenClaw 异步发送不再持久化 assistant 站位消息行。 -- `respond` 在 OpenClaw 路由下返回 `mode=async`, `state=accepted`, `text=''`。 -- 用户消息通过属性表达状态演进: - - `accepted/dispatched`:已发送待插件消费。 - - 插件 ACK 后更新为 `completed`,并记录 `metadata.pluginReadBy.`。 - -### Phase 2 — 平台事件供给条件(已生效) -`/api/v1/platform/events` 返回事件时,需满足: -- `write_seq > cursor` -- `role = 'user'` -- `task_state IN ('accepted','dispatched')` -- `metadata` 含 `pendingAssistantMessageId` -- 若 JWT 带 `userId`,还需匹配 `msg.user_id = token.userId` - -### Phase 3 — 空事件排查(当前推荐顺序) -1. 核对 cursor 是否已追平。 -2. 核对 JWT `userId` 与消息归属用户是否一致。 -3. 核对消息是否满足 role / task_state / metadata 过滤条件。 -4. 核对插件请求头 `X-Bricks-Plugin-Id` 与 token claim/plugin scope 是否一致。 - -### Phase 4 — 测试覆盖现状与补强方向 -- 当前覆盖是“分段覆盖”: - - 前端 `respond` 状态映射 - - 后端 OpenClaw `respond` 行为 - - 平台鉴权与 userId 透传 - - 平台 events/ack 服务逻辑 -- 尚缺“单用例闭环集成测试”串联: - - `respond -> events -> messages(create/patch) -> ack -> sync` - -## Acceptance Criteria - -1. 仓库仅保留本文件作为 2026-04-17 这一组 OpenClaw 消息路由调整的有效基线。 -2. 旧阶段性文档删除并由本文件统一承接。 -3. 代码地图索引仅指向本文件,不再指向旧文档。 - -### Validation commands - -- `git diff -- docs/plans docs/code_maps/logic_map.yaml` diff --git a/docs/plans/2026-04-18-03-19-UTC-ai-message-no-bubble.md b/docs/plans/2026-04-18-03-19-UTC-ai-message-no-bubble.md deleted file mode 100644 index d69d7260..00000000 --- a/docs/plans/2026-04-18-03-19-UTC-ai-message-no-bubble.md +++ /dev/null @@ -1,18 +0,0 @@ -# Background -The mobile chat message list currently renders both user and assistant messages inside rounded bubble containers. For assistant replies, this consumes horizontal space due to bubble padding and creates a denser layout than desired. - -# Goals -- Remove the bubble visual treatment for assistant messages in the conversation list. -- Reduce horizontal spacing for assistant output so more text fits per line. -- Keep user message bubble style and behavior unchanged. - -# Implementation Plan (phased) -1. Update `MessageList` assistant row rendering to use plain text content without background bubble decoration. -2. Keep user branch on the existing bubble styling path so outgoing message visuals are unchanged. -3. Adjust/add widget tests to verify assistant layout width increases while user bubble constraints remain. - -# Acceptance Criteria -- Assistant messages no longer show a rounded/background bubble container in the message list. -- Assistant messages have less horizontal inset than before and display a wider content area. -- User messages still render with existing bubble style and compact width constraints. -- Validation command passes: `cd apps/mobile_chat_app && flutter test test/message_list_test.dart`. diff --git a/docs/plans/2026-04-18-08-10-UTC-channel-rename-persistence.md b/docs/plans/2026-04-18-08-10-UTC-channel-rename-persistence.md deleted file mode 100644 index 5642d1e6..00000000 --- a/docs/plans/2026-04-18-08-10-UTC-channel-rename-persistence.md +++ /dev/null @@ -1,32 +0,0 @@ -# Channel rename persistence plan - -## Background -用户反馈:在频道列表中将频道改名后,刷新页面会恢复为旧名字。当前前端仅在内存中更新频道名,未将改名结果持久化到后端数据库,因此重新加载后无法恢复用户自定义名称。 - -## Goals -- 让频道改名结果在刷新后保持不变。 -- 将频道自定义名称写入数据库并可按用户读取。 -- 保持现有频道路由与消息存储行为不变,避免影响聊天主链路。 - -## Implementation Plan (phased) -1. **Backend schema & service** - - 新增数据库迁移,创建 `chat_channel_names` 表(按 `user_id + channel_id` 唯一)。 - - 新增后端服务用于查询、写入、删除频道名映射。 -2. **Backend API** - - 在 `/api/chat` 下新增读取/写入频道名接口(`GET /channel-names`、`PUT /channel-names`)。 - - 写入接口支持覆盖更新与删除(传空名或 null 删除)。 -3. **Flutter client integration** - - 在 `ChatHistoryApiService` 增加加载与保存频道名 API 调用。 - - 启动加载时将数据库中的频道名覆盖到已恢复的频道列表。 - - 频道改名时调用保存接口;归档频道时删除该频道名映射。 -4. **Tests** - - 增加/更新 Node backend route tests(新接口行为)。 - - 增加/更新 Flutter service tests(新接口解析与请求体)。 -5. **Code map sync** - - 根据本次行为变更同步更新 `docs/code_maps/feature_map.yaml` 和 `docs/code_maps/logic_map.yaml`。 - -## Acceptance Criteria -- 用户将非默认频道改名后,刷新页面仍显示新名字。 -- 后端数据库存在该用户的频道名映射记录,且重复改名会更新同一条记录。 -- 删除/归档频道时可清理对应频道名映射,不影响其他频道。 -- `apps/node_backend/src/routes/chat.test.ts` 与 `apps/mobile_chat_app/test/chat_history_api_service_test.dart` 相关测试通过。 diff --git a/docs/plans/2026-04-18-09-29-UTC-ai-markdown-rendering.md b/docs/plans/2026-04-18-09-29-UTC-ai-markdown-rendering.md deleted file mode 100644 index 09f4037b..00000000 --- a/docs/plans/2026-04-18-09-29-UTC-ai-markdown-rendering.md +++ /dev/null @@ -1,38 +0,0 @@ -# Background -Users want AI output messages to support markdown-style formatting, with two strict presentation constraints: heading markers (`#`, `##`, etc.) should not increase font size, and heading blocks should not introduce extra top/bottom spacing compared with normal text. The chat message list currently renders assistant messages as plain `Text`, so markdown semantics are not visualized. - -# Goals -1. Render assistant message content with lightweight markdown formatting for headings, inline emphasis, and list indentation. -2. Keep heading typography aligned to body text size while using bold weight only. -3. Avoid extra block margin/padding for heading lines so visual rhythm matches plain paragraphs. -4. Preserve existing user-message rendering and behavior. -5. Add tests covering heading style normalization and list indentation output. - -# Implementation Plan (phased) -## Phase 1: Introduce a lightweight markdown renderer for assistant messages -- Add a `_AssistantMarkdownText` widget in `message_list.dart`. -- Parse assistant text line-by-line into basic block structures: - - heading-like lines beginning with `#`..`######` - - unordered/ordered list lines - - plain paragraph lines -- Render all block text at body font size. - -## Phase 2: Apply style rules requested by product behavior -- Render heading lines with bold font weight only (no larger font size). -- Keep heading vertical spacing equal to normal paragraph spacing (no extra top/bottom margins). -- Render lists with explicit left indentation and optional list markers. -- Add inline emphasis parsing for `**bold**`, `__bold__`, `*italic*`, and `_italic_` without introducing heading-size changes. - -## Phase 3: Validation and regression safety -- Add widget tests in `message_list_test.dart` to confirm: - - heading-like text is rendered with body font size. - - heading-like text has bold weight. - - list items are indented relative to non-list text. -- Run targeted Flutter tests from the package directory. - -# Acceptance Criteria -1. Assistant message containing `# Title` displays as bold text with the same font size as adjacent body text. -2. Heading-like lines do not have extra margins/padding compared to regular lines. -3. Markdown list items render with visible indentation. -4. Existing `MessageList` tests continue to pass. -5. New markdown rendering tests pass under `flutter test` in `apps/mobile_chat_app`. diff --git a/docs/plans/2026-04-18-14-59-UTC-chat-stream-order-and-completeness-fix.md b/docs/plans/2026-04-18-14-59-UTC-chat-stream-order-and-completeness-fix.md deleted file mode 100644 index 7bc1f5ea..00000000 --- a/docs/plans/2026-04-18-14-59-UTC-chat-stream-order-and-completeness-fix.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -- 用户反馈发送消息后会话流顺序异常,截图显示用户与 AI 消息在时间线上错位。 -- 截图中还出现 AI 内容被渲染成用户气泡的迹象,且怀疑存在输出不完整问题。 -- 该问题很可能与异步回包时按列表索引更新消息有关:一旦期间发生同步刷新与重排,旧索引会指向错误消息。 - -# Goals -- 修复会话消息在异步返回与同步刷新并发时的渲染顺序/归属错乱。 -- 修复(或确认并防止)因错位更新导致的 AI 输出不完整或被写入错误消息。 -- 保持现有协议字段和 UI 展示行为不变,仅修复更新定位逻辑。 - -# Implementation Plan (phased) -1. 代码定位与根因确认 - - 检查 `ChatScreen` 发送与回包流程,重点关注 message append、sync merge、respond 回调。 - - 核对是否存在“先存 index,后因 sort/sync 变动导致 index 失效”的路径。 -2. 代码修复 - - 将回包写入逻辑从“按 index 更新”改为“按 messageId 更新(实时查找索引)”。 - - 在成功、失败、缺 token、取消等路径统一使用稳定标识定位消息。 - - 对找不到目标消息的边界情况做安全退出,避免错误覆盖其他消息。 -3. 验证与回归 - - 运行仓库要求的环境初始化脚本。 - - 运行至少覆盖聊天模块的测试命令。 - - 手工检查代码地图是否需要更新;若不需要,在最终说明中给出理由。 - -# Acceptance Criteria -- 当用户连续快速发送消息且期间发生 sync 合并时,AI 回包不会写入错误消息气泡。 -- 不再出现 AI 文本显示在用户气泡中的情况(由错误索引写入导致)。 -- 同一任务的最终文本完整写入对应 assistant 消息,不会因索引漂移而覆盖或截断其他消息。 -- 验证命令可执行并通过(例如:`./tools/init_dev_env.sh`、`cd apps/mobile_chat_app && flutter test`)。 diff --git a/docs/plans/2026-04-18-15-06-UTC-chat-router-button-relocation.md b/docs/plans/2026-04-18-15-06-UTC-chat-router-button-relocation.md deleted file mode 100644 index 2c239226..00000000 --- a/docs/plans/2026-04-18-15-06-UTC-chat-router-button-relocation.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -The chat page currently shows a router switch popup button in the top-right AppBar area. The requested UX is to place the router switch control near the composer controls at the lower-left side, immediately to the left of the existing tune/config button, and to show route-specific icons (including a lobster icon for openclaw). - -# Goals -- Move the router switch button from AppBar actions to the composer action row. -- Place the router button to the left of the existing config/tune button. -- Make the router button icon reflect the currently effective router: - - default route: suitable default routing icon - - openclaw route: lobster icon (🦞) -- Keep button sizing/layout stable regardless of icon type. - -# Implementation Plan (phased) -1. Extend `ComposerBar` API to accept an optional router menu button widget that can be rendered before the config button. -2. In `ChatScreen`, remove the existing AppBar router popup button. -3. In `ChatScreen`, build the router popup button and pass it into `ComposerBar` through the new slot. -4. Implement dynamic icon rendering for router button based on `_effectiveRouterForScope()`, using a fixed-size container so emoji/icon changes do not alter layout. -5. Run formatting and targeted Flutter tests. - -# Acceptance Criteria -- Router popup button no longer appears in top-right AppBar. -- Router popup button appears in composer controls, immediately left of the config/tune button. -- Effective router icon changes with route state (default uses routing icon, openclaw shows 🦞). -- Switching icon does not change button size or row layout. -- Validation commands pass (at minimum: `dart format` on modified files and relevant Flutter test command). diff --git a/docs/plans/2026-04-18-15-09-UTC-chat-send-flow-simplification.md b/docs/plans/2026-04-18-15-09-UTC-chat-send-flow-simplification.md deleted file mode 100644 index 71fdbec1..00000000 --- a/docs/plans/2026-04-18-15-09-UTC-chat-send-flow-simplification.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -- 上一版修复通过 messageId 解决了异步回包写错行的问题,但 `_sendMessage` 内重复定位/更新代码较多,可读性一般。 -- 需求强调“更优雅、可减少代码量”,希望在保证正确性的前提下进一步简化逻辑。 - -# Goals -- 保持“按 messageId 定位更新”这一正确性保障不变。 -- 精简 `_sendMessage` 的分支重复逻辑,减少样板代码。 -- 让 user/assistant messageId 来源更直接,避免通过“append 后再取 index”读取。 - -# Implementation Plan (phased) -1. 抽象公共更新逻辑 - - 增加按 messageId 更新消息的统一 helper,封装 index 查找与 setState 写回。 -2. 简化发送路径 - - 在 append 之前直接生成 user/assistant messageId 并写入消息对象。 - - `respond`、缺 token、失败路径统一调用 helper,减少重复代码。 -3. 验证 - - 运行 `./tools/init_dev_env.sh`。 - - 运行 `cd apps/mobile_chat_app && flutter test`。 - - 检查代码地图是否需更新;若无需更新,在最终说明给出理由。 - -# Acceptance Criteria -- 与上一版一致:不会因 sync/sort 导致 AI 回包写入错误消息。 -- `_sendMessage` 中消息更新逻辑比上一版更集中、更少重复。 -- 测试可通过,且无新的回归行为。 diff --git a/docs/plans/2026-04-19-11-46-UTC-openclaw-history-ordering-fix.md b/docs/plans/2026-04-19-11-46-UTC-openclaw-history-ordering-fix.md deleted file mode 100644 index e7f2d0a3..00000000 --- a/docs/plans/2026-04-19-11-46-UTC-openclaw-history-ordering-fix.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -Users reported incorrect chat history rendering when switching router to OpenClaw for one turn (with no OpenClaw server response yet), then switching back to the default router and sending another message. The delayed or pending OpenClaw assistant message can appear out of expected order in the message list. - -# Goals -- Ensure chat history rendering is consistently ordered by message creation timestamp across mixed router usage. -- Prevent stale/pending OpenClaw task messages from disrupting visual chronology after switching routers. -- Add regression tests that cover unsorted backend payloads and verify stable chronological rendering expectations. - -# Implementation Plan (phased) -1. Inspect chat history hydration and sync merge paths in `chat_screen.dart` and `chat_history_api_service.dart`. -2. Introduce deterministic chronological sorting for history snapshots (especially initial load) using createdAt/timestamp with stable tie-breakers. -3. Add/extend unit tests in mobile chat app history service tests to validate sorting behavior for unsorted message payloads. -4. Run repository bootstrap and targeted Flutter tests for the modified package. -5. Check code maps and update if behavior/indexing expectations changed. - -# Acceptance Criteria -- On history load, messages are ordered by creation time (oldest to newest), with deterministic tie-breakers. -- Mixed default/OpenClaw scenarios with pending and later-delivered messages no longer render in incorrect order. -- `flutter test` for `apps/mobile_chat_app` passes for affected test files. diff --git a/docs/plans/2026-04-19-13-08-UTC-openclaw-install-instructions-redo.md b/docs/plans/2026-04-19-13-08-UTC-openclaw-install-instructions-redo.md deleted file mode 100644 index a18e770a..00000000 --- a/docs/plans/2026-04-19-13-08-UTC-openclaw-install-instructions-redo.md +++ /dev/null @@ -1,37 +0,0 @@ -## Background - -The Openclaw Token settings page currently supports generating and copying only the token value. -For OpenClaw plugin onboarding, users also need a complete instruction payload that includes plugin parameters and an `openclaw.json` channel snippet. - -## Goals - -1. Show install instructions right after token generation. -2. Include `pluginId`, `url`, `scopes`, and `token` in a copyable text payload. -3. Add a one-click copy button for the full install instructions. -4. Keep the existing token copy flow unchanged. - -## Implementation Plan (phased) - -### Phase 1: UI content - -- Add a formatter method that builds a full install instruction string from `PlatformTokenBundle`. -- Render an "Install Instructions" section with: - - concise guidance text, - - a JSON snippet for `channels` in `openclaw.json`, - - parameter lines for `pluginId/url/scopes/token`. - -### Phase 2: Copy action - -- Add `Copy Install Instructions` button. -- Reuse existing clipboard/snackbar helper for consistency. - -### Phase 3: Validation and docs index sync - -- Update widget tests to verify instruction rendering and copy behavior. -- Update code maps for `openclaw_token_settings` smoke checks and risk notes. - -## Acceptance Criteria - -1. After generating token info, install instructions are visible on the page. -2. `Copy Install Instructions` copies the full instruction text and shows success feedback. -3. `Copy Openclaw Token` still copies only the token and continues to pass tests. diff --git a/docs/plans/2026-04-20-04-36-UTC-openclaw-install-instructions-branch-redo.md b/docs/plans/2026-04-20-04-36-UTC-openclaw-install-instructions-branch-redo.md deleted file mode 100644 index 80291158..00000000 --- a/docs/plans/2026-04-20-04-36-UTC-openclaw-install-instructions-branch-redo.md +++ /dev/null @@ -1,32 +0,0 @@ -## Background - -The previous implementation already added OpenClaw install instructions and copy support, but follow-up iteration is required on a new branch and with cleaner test interaction stability. - -## Goals - -1. Continue implementation work on a new branch name. -2. Keep the install-instructions UX behavior unchanged. -3. Improve widget-test reliability by avoiding long fixed-time waits. - -## Implementation Plan (phased) - -### Phase 1: Branch and test refinement - -- Create and use a new working branch for this follow-up. -- Update `openclaw_token_settings_screen_test.dart` to dismiss snackbars deterministically before the second copy action. - -### Phase 2: Validation - -- Run repository bootstrap script. -- Run focused Flutter widget tests for Openclaw token settings. - -### Phase 3: Documentation sync - -- Add this plan artifact for the task record. -- Keep code-map files unchanged if behavior/entry points do not change. - -## Acceptance Criteria - -1. Work is delivered from a non-previous branch. -2. Install-instructions copy behavior and token copy behavior both pass tests. -3. No user-visible behavior regression on Openclaw token settings page. diff --git a/docs/plans/2026-04-20-05-19-UTC-message-order-bug-analysis.md b/docs/plans/2026-04-20-05-19-UTC-message-order-bug-analysis.md deleted file mode 100644 index fd3f4e65..00000000 --- a/docs/plans/2026-04-20-05-19-UTC-message-order-bug-analysis.md +++ /dev/null @@ -1,98 +0,0 @@ -# Background -A message ordering bug is reported for session `session:default:sub-1776598618924-10`: newer messages sometimes render above older messages in the front-end timeline. The task is to use readonly Turso environment variables to inspect persisted data and identify the likely root cause. - -# Goals -1. Connect to the readonly Turso database using the provided environment variables. -2. Inspect message/task records for the target session and verify whether database ordering is stable by creation time. -3. Correlate database ordering behavior with UI symptoms and identify the most likely bug source. -4. Produce actionable remediation guidance (query/index/sort key strategy) and validation checks. - -# Implementation Plan (phased) -## Phase 1: Locate schema and read paths -- Find tables and columns storing messages/events for sessions. -- Find server/client code paths that query and render timeline data. -- Identify current `ORDER BY` strategy and tie-breakers. - -## Phase 2: Database evidence collection -- Connect with `TURSO_DATABASE_URL_READONLY` and `TURSO_AUTH_TOKEN_READONLY`. -- Pull records for `session:default:sub-1776598618924-10` and compare: - - `created_at` order - - insertion/key order (e.g., `id`, `rowid`) - - any event timestamp fields used by UI. -- Detect equal timestamps or mixed precision that can produce nondeterministic ordering. - -## Phase 3: Root-cause analysis and fix proposal -- Determine whether the issue is caused by DB query ordering, merge logic, or front-end sort. -- Propose exact ordering contract (primary + tie-breaker keys) from oldest to newest. -- Add a concise analysis artifact in-repo for maintainers. - -# Acceptance Criteria -- A reproducible data snapshot demonstrates why unstable ordering occurs for the target session. -- The analysis maps symptoms to concrete columns/query behavior in code. -- A clear fix recommendation is documented, including deterministic ordering keys and validation command(s). - -# Investigation Notes (2026-04-20) -- Connected to Turso read-only endpoint using provided in-memory credentials (not persisted to files). -- Session inspected: `session:default:sub-1776598618924-10`. -- Row count: `18`. -- Confirmed same-timestamp collisions in this session: - - `2026-04-19T19:38:10.305` has 2 rows (`write_seq` 1757..1758). - - `2026-04-19T23:41:38.860` has 2 rows (`write_seq` 1764..1765). -- Code-path analysis still identifies a deterministic ordering gap: - - Backend returns messages ordered by monotonic `write_seq`. - - Mobile client discarded `writeSeq` and re-sorted by `createdAt` only. - - When multiple rows share the same `createdAt` (common under async writes / second-level collisions), UI order depends on fallback keys and can drift from actual write order. -- Implemented remediation in app code: - 1. Parse and carry `writeSeq` in `ChatMessage`. - 2. Use `writeSeq` as tie-breaker when `createdAt` is equal. - 3. Added regression test verifying equal-`createdAt` messages keep `writeSeq` order. - -## Direct answers to review questions - -### 1) “How do you confirm there are same-timestamp conflicts?” -- Confirmed from live DB rows in your target session with this grouping query: - - `SELECT created_at, COUNT(*), MIN(write_seq), MAX(write_seq) ... GROUP BY created_at HAVING COUNT(*) > 1`. -- Result shows 2 concrete collision groups: - - `2026-04-19T19:38:10.305` (`write_seq` 1757..1758), - - `2026-04-19T23:41:38.860` (`write_seq` 1764..1765). - -### 2) “Do you read data?” -- Yes. Read directly from Turso with readonly token in-memory and queried `chat_messages` for your session. -- Verification SQL used: - -```sql -SELECT - message_id, - write_seq, - created_at -FROM chat_messages -WHERE session_id = 'session:default:sub-1776598618924-10' -ORDER BY created_at ASC, write_seq ASC; -``` - -Then check collisions: - -```sql -SELECT - created_at, - COUNT(*) AS n -FROM chat_messages -WHERE session_id = 'session:default:sub-1776598618924-10' -GROUP BY created_at -HAVING COUNT(*) > 1 -ORDER BY created_at ASC; -``` - -### 3) “What is the precision of create time? Can it hit this condition?” -- Effective precision in this dataset is mixed: - - some rows are second-level style (e.g. `2026-04-19 11:37:11`), - - some rows are millisecond ISO strings (e.g. `2026-04-19T23:41:38.860`). -- So yes, same-`created_at` condition is real (observed above), and timeline ordering must include deterministic tie-breakers (e.g., `writeSeq`) rather than relying on `createdAt` alone. - -## Screenshot flow re-check -- Re-checked against the provided screenshots: the timeline shows mixed clock representations (`11:37`, `15:41`, `23:41`) and user/assistant blocks that can be affected by inconsistent `created_at` semantics across write paths. -- This means “`createdAt` primary + `writeSeq` only tie-break” is insufficient for some real flows: order can still drift even when timestamps are not exactly equal. -- Updated comparator strategy to: - 1. use `writeSeq` as primary key whenever both messages have it (server-synced rows), - 2. fallback to `createdAt/timestamp` only when `writeSeq` is unavailable. -- Added regression test that reproduces “clock order disagrees with write order” and verifies the list still follows `writeSeq`. diff --git a/docs/plans/2026-04-20-07-14-UTC-message-order-root-cause-fix.md b/docs/plans/2026-04-20-07-14-UTC-message-order-root-cause-fix.md deleted file mode 100644 index fb1ea909..00000000 --- a/docs/plans/2026-04-20-07-14-UTC-message-order-root-cause-fix.md +++ /dev/null @@ -1,34 +0,0 @@ -# Message ordering root-cause fix plan (session:default:sub-1776598618924-10) - -## Background -The UI showed assistant replies before their corresponding user queries for `session:default:sub-1776598618924-10`. -Live Turso rows confirm this is not only a same-timestamp collision problem: -- For the same task IDs, assistant rows have lower `write_seq` than user rows in several pairs. -- The same rows keep immutable `seq_id` order as user -> assistant. -- `created_at` format is mixed (`YYYY-MM-DD HH:MM:SS` and ISO8601 with timezone), indicating inconsistent timestamp sources/parsing. - -## Goals -1. Ensure rendered order follows semantic conversation order (user prompt before assistant reply). -2. Avoid using mutable sync cursor (`write_seq`) as a chronological ordering key. -3. Normalize timestamp parsing for legacy DB values without timezone suffix. -4. Add regression tests that model the DB-observed inversion pattern. - -## Implementation Plan (phased) -1. **Model and mapping updates** - - Add `seqId` to `ChatMessage` and parse from server payload. - - Keep `writeSeq` for sync cursor semantics only. -2. **Ordering logic updates** - - Update comparator: `seqId` primary (when available), then `createdAt/timestamp`, then role/messageId. - - Keep deterministic fallback behavior for mixed/local-only messages. -3. **Timestamp parsing normalization** - - Parse server `createdAt` strings without timezone as UTC to avoid local-time misinterpretation. -4. **Regression tests** - - Add/adjust tests for `seqId` vs `writeSeq` conflict and no-timezone UTC parsing behavior. -5. **Code map sync** - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` to reflect the corrected ordering strategy. - -## Acceptance Criteria -- Given rows where `write_seq` contradicts prompt/reply semantics, rendered order remains user-before-assistant using `seqId`. -- Given `createdAt` in `YYYY-MM-DD HH:MM:SS`, displayed local time reflects UTC-origin input rather than raw local parsing. -- `cd apps/mobile_chat_app && flutter test test/chat_message_sort_test.dart` passes. -- `cd apps/mobile_chat_app && flutter test test/chat_message_test.dart` passes (or equivalent parsing-focused tests). diff --git a/docs/plans/2026-04-20-07-54-UTC-user-query-delivery-status.md b/docs/plans/2026-04-20-07-54-UTC-user-query-delivery-status.md deleted file mode 100644 index a16ae589..00000000 --- a/docs/plans/2026-04-20-07-54-UTC-user-query-delivery-status.md +++ /dev/null @@ -1,22 +0,0 @@ -# Background -Users need clearer visual delivery states on user query bubbles when chat routing can be synchronous (default LLM route) or asynchronous remote routes (OpenClaw and future routers). - -# Goals -- Show no delivery mark for default-route user messages. -- Show OpenClaw-specific status progression on user bubbles: pending/accepted and pulled states as gray lobster, then green check after reply. -- Show generic remote-route status progression on user bubbles: gray check after persistence, green check after reply. -- Keep status logic robust when state updates arrive later through sync/history refresh. - -# Implementation Plan (phased) -1. Extend chat message metadata parsing/storage in mobile app to preserve server `source` metadata and router info from `/api/chat/respond`. -2. Update send flow to propagate router-derived source metadata back onto the local user message after respond acknowledgement. -3. Add delivery-indicator derivation in `MessageList` for user messages based on route type and assistant reply state within the same task. -4. Render visual indicators beside user message timestamps using lobster/check icons and route-specific color rules. -5. Add widget tests to cover default route, OpenClaw pending/completed, and generic remote pending/completed behavior. -6. Sync code maps for chat-session regression coverage updates. - -# Acceptance Criteria -- For default route (`backend.respond`), user bubbles show no delivery status icon. -- For OpenClaw route (`backend.respond.openclaw`), user bubbles show gray lobster before completion and green check after assistant reply completion. -- For other remote routes (`backend.respond.`), user bubbles show gray check before completion and green check after assistant reply completion. -- `flutter test test/message_list_test.dart` passes from `apps/mobile_chat_app`. diff --git a/docs/plans/2026-04-20-08-57-UTC-controlled-user-query-commit.md b/docs/plans/2026-04-20-08-57-UTC-controlled-user-query-commit.md deleted file mode 100644 index 4494bc21..00000000 --- a/docs/plans/2026-04-20-08-57-UTC-controlled-user-query-commit.md +++ /dev/null @@ -1,22 +0,0 @@ -# Background -The chat frontend previously persisted messages by repeatedly upserting the whole in-memory message list. During streaming and state transitions this caused replay writes, write sequence churn, and potential ordering side effects. - -# Goals -1. Stop full-list client-side persistence on every streaming delta or state transition. -2. Rely on the backend `/respond` endpoint for authoritative user-query persistence (the endpoint already upserts the user message before generating a response). -3. Reduce unnecessary historical message upserts to improve write sequence stability and ordering signal quality. - -# Implementation Plan (phased) -1. Remove debounced whole-list persistence (`_persistActiveScopeMessages` / `_doPersistActiveScopeMessages`) from `chat_screen.dart`. -2. Remove the `_persistDebounce` timer and related cleanup. -3. Remove all call sites that trigger whole-list upserts during streaming, message updates, and scope changes. -4. Confirm that the backend `/respond` endpoint already persists the user message (both sync and OpenClaw async paths). -5. Verify that no client-side single-message commit remains — the `/respond` endpoint is the single source of persistence for user queries. -6. Run targeted Dart/Flutter tests and formatting for touched files. -7. Review code-map impact and update maps only if feature/logic/test entry indexing changed. - -# Acceptance Criteria -- Streaming assistant updates no longer trigger full-history upsert requests from the client. -- User message persistence is handled exclusively by the backend `/respond` endpoint (one write per send). -- No client-side duplicate upsert of the user message occurs alongside the `/respond` call. -- Existing chat history API service tests pass for updated behavior. diff --git a/docs/plans/2026-04-20-09-40-UTC-openclaw-accountid-userid-scoping.md b/docs/plans/2026-04-20-09-40-UTC-openclaw-accountid-userid-scoping.md deleted file mode 100644 index 9952ab94..00000000 --- a/docs/plans/2026-04-20-09-40-UTC-openclaw-accountid-userid-scoping.md +++ /dev/null @@ -1,15 +0,0 @@ -# Problem - -The Bricks OpenClaw plugin currently uses a fixed `DEFAULT_ACCOUNT_ID` for its single account slot. When the configured `BRICKS_PLATFORM_TOKEN` changes to a different Bricks user, OpenClaw still sees the same account id, so its internal per-account routing/session scoping can overlap across users. - -# Proposed approach - -- Keep the plugin's flat channel config model as-is. -- Derive the OpenClaw `accountId` from the configured platform token's `userId` claim. -- If the stored `BRICKS_PLUGIN_ID` / `BRICKS_PLATFORM_TOKEN` cannot produce a valid user-scoped identity, surface an explicit error instead of silently falling back to `DEFAULT_ACCOUNT_ID`. -- Do not change the plugin state file layout in this step. - -# Notes - -- This fixes OpenClaw's account-slot scoping only; it does not yet isolate the plugin's own persisted state file. -- Validation for this step is limited to the plugin package checks and local `openclaw status`. diff --git a/docs/plans/2026-04-20-10-19-UTC-openclaw-reply-failure-db-analysis.md b/docs/plans/2026-04-20-10-19-UTC-openclaw-reply-failure-db-analysis.md deleted file mode 100644 index 72132d7c..00000000 --- a/docs/plans/2026-04-20-10-19-UTC-openclaw-reply-failure-db-analysis.md +++ /dev/null @@ -1,191 +0,0 @@ -# OpenClaw reply failure DB analysis - -## Problem - -The current async OpenClaw flow can persist a delayed assistant reply, but the -database model does not express the reply relationship explicitly. Core async -workflow state is also encoded in message metadata (`pendingAssistantMessageId`) -and exported with a text search, which is brittle. - -## Proposed approach - -Keep `chat_messages` as the source of truth for visible conversation history and -preserve `write_seq` ordering for late replies. Normalize the async reply -contract into first-class columns so the backend and plugin do not depend on -metadata string matching for routing or reply linkage. - -Recommended schema direction: - -1. Add `reply_to_message_id` on assistant messages to explicitly link `A1 -> A`. -2. Add `source_message_id` on `chat_tasks` so each async/OpenClaw task records - which user message triggered it. -3. Keep pending async execution state on `chat_tasks` (or a future task-specific - table), rather than encoding a one-to-one future reply id on the message row. -4. Add indexes/constraints so reply linkage stays intra-user and lookup remains - efficient. - -## Todos - -- Confirm the exact schema migration shape for `reply_to_message_id` and - `chat_tasks.source_message_id`. -- Update platform export/create/patch logic to read/write first-class reply - columns instead of metadata-only workflow markers. -- Decide whether transient assistant placeholder rows should remain visible in - `chat_messages` or move to a non-message status path. -- Add tests covering delayed OpenClaw replies, explicit reply references, and - mixed default/OpenClaw ordering. - -## Notes - -- `write_seq` already gives the desired DB ordering for late replies like - `A, B, B reply, A reply`. -- The active client ordering bug is primarily a UI merge issue, not a DB - ordering limitation. -- A separate relation table is possible, but likely overkill for the current - one-reply-per-user-message model. -- `expected_reply_message_id` on `chat_messages` is no longer recommended, - because future branching can produce multiple child replies for a single - source message. -- Runtime evidence from local OpenClaw + platform API: - - Plugin state shows processed event IDs and assistant client-token mappings - for five historical OpenClaw events, so those events reached - `handleMessageCreated(...)`. - - The state file still contains `pendingAck` and the persisted cursor remains - `cur_0`. - - Direct `GET /api/v1/platform/events` with the configured plugin token works, - but direct `POST /api/v1/platform/events/ack` returns `500 INTERNAL_ERROR`. - - Querying events after the pending cursor shows newer events waiting - unprocessed, so the runner is currently blocked on ack retry before it can - fetch subsequent messages. - - Vercel error logs confirm the server-side cause: `ackPlatformEvents()` - emitted PostgreSQL-only SQL that Turso/libSQL rejects with - `SQL_PARSE_ERROR`. - - Implemented fix: keep the existing PostgreSQL `jsonb_set + UNNEST` batch - update for Postgres, and use a Turso/libSQL-specific atomic - `json_patch(json_object(...))` batch update instead. - -## Implementation update - -- `apps/node_openclaw_plugin` no longer replies with the hard-coded - `收到消息:...` echo. -- The runner now resolves Bricks conversation topology, maps it to a stable - OpenClaw session key (`channelId` base session plus `:thread:` when - applicable), and dispatches the inbound turn through OpenClaw's real - `recordInboundSessionAndDispatchReply(...)` pipeline. -- OpenClaw-visible reply payloads are accumulated back into the reserved Bricks - assistant placeholder row, so the user sees one assistant message updated as - OpenClaw produces text/media output. -- The runner persists `clientToken -> messageId` immediately after placeholder - creation so retries reuse the same assistant row if OpenClaw dispatch fails - after the placeholder was already created. -- Validated locally with: - - `cd apps/node_openclaw_plugin && npm test` - - `cd apps/node_openclaw_plugin && npm run type-check` - - `cd apps/node_openclaw_plugin && npm run build` - - a 10-second real runtime smoke start using the user's configured - `~/.openclaw/openclaw.json`, which booted successfully on cursor - `cur_1883`. -- Follow-up lifecycle completion: - - The Bricks channel plugin now implements `gateway.startAccount/stopAccount` - so OpenClaw gateway, not a manually launched shell process, owns the pull - runner lifecycle. - - Verified against real gateway logs in `~/.openclaw/logs/gateway.log`: - - `starting Bricks pull runner` - - `[node_openclaw_plugin] started with cursor: cur_1892` - - `stopping Bricks pull runner` - - `[node_openclaw_plugin] stopped` - - This means “true reply” now comes from the full OpenClaw-managed path: - Bricks event -> gateway-managed plugin runner -> OpenClaw internal - AI/session pipeline -> Bricks message writeback. -- Follow-up rate-limit completion: - - The repeated `429` loop was caused by two problems together: - - authenticated `/api/v1/platform/*` polling still shared the coarse - generic `/api/*` IP limiter (`100 / 15 min / IP`) - - the plugin retried platform failures on a fixed poll interval, so once it - hit `429` it kept hammering the same limit bucket - - Backend fix: - - authenticated platform requests now bypass the generic app limiter - - `apps/node_backend/src/routes/platform.ts` now applies a dedicated - platform limiter with separate read/write budgets, stable structured `429` - responses, and `Retry-After` - - Plugin fix: - - `PlatformHttpError` now captures `Retry-After` - - the runner now treats `429` and retryable platform failures as backoff - signals (`2s -> 4s -> 8s -> 10s`, while preferring backend-provided - `Retry-After` when present) - - Validated with: - - `cd apps/node_backend && npm test -- --run src/app.test.ts src/routes/platform.test.ts` - - `cd apps/node_backend && npm run type-check` - - `cd apps/node_backend && npm run build` - - `cd apps/node_openclaw_plugin && npm test` - - `cd apps/node_openclaw_plugin && npm run type-check` - - `cd apps/node_openclaw_plugin && npm run build` - - real `openclaw gateway restart` plus `~/.openclaw/logs/gateway.log` - sampling, which showed the old runner stop, the new runner restart on - `cur_1892`, and no new sampled `429` lines after the restart -- Follow-up replay/writeback diagnosis: - - The OpenClaw session log for `sessionId=cd08fd10-ef3c-42fa-a8d8-7b06011c0eb3` - shows two runs of the same Bricks user message `msg-1776707308374-8`. - - The earlier run produced a normal assistant reply (`信号非常清晰,我已经收到了...`), - which strongly suggests the original user turn was answered inside OpenClaw. - - A later replay of that same message produced only `\nNO_REPLY`, after - which OpenClaw's embedded runner surfaced the generic visible error - `⚠️ Agent couldn't generate a response. Please try again.` - - This means the observed `payloads=0`/`NO_REPLY` behavior is most likely a - retry artifact after an earlier final Bricks writeback failure, not proof - that the initial model run generated no answer. -- Follow-up plugin hardening: - - The runner now persists accumulated visible reply text to - `clientTokenReplyTextMap` before attempting the platform patch/writeback. - - That lets a later retry recover the original OpenClaw answer even when the - first writeback attempt fails after payload generation. - - Added a regression test covering the sequence “reply generated -> writeback - fails -> reply text remains persisted for retry recovery”. - - Revalidated `apps/node_openclaw_plugin` successfully with: - - `npm test` - - `npm run type-check` - - `npm run build` - - Restarted the local gateway again and verified a fresh Bricks runner start - at `cur_1896` in `~/.openclaw/logs/gateway.log`. -- Latest undeployed live behavior clarification: - - The UI marker `task:accepted · id:...` is an optimistic/local async task - placeholder created by the client before `/api/chat/respond` completes. - - On the async OpenClaw backend path, the server persists the user message and - returns `mode=async/state=accepted`, but it does not persist the plugin - assistant placeholder at that moment. - - The visible assistant row `Node OpenClaw Plugin 正在处理...` is created later - only after the plugin successfully polls the platform event and calls - `/api/v1/platform/messages`. - - During the newest undeployed test, plugin state remained at `cur_1902` and - the runtime log recorded `retryable platform failure; backing off for - 653000ms` at `2026-04-21T02:19:47+08:00`, which means the plugin hit the - remote backend's old limiter before `getEvents(...)` returned newer events. - - Therefore the UI can legitimately show `task:accepted` while showing no - plugin placeholder at all: the app-side async task was created, but the - plugin never reached the event-processing/writeback stage. -- Additional rate-limit caveat: - - `/api/chat/respond` is still subject to the generic `/api/*` IP limiter in - `apps/node_backend/src/app.ts`. - - The current code only exempts `/api/chat/sync/*` and authenticated - `/api/v1/platform/*`; `apps/node_backend/src/routes/chat.ts` does not apply a - dedicated limiter to `/respond`. - - That means repeated manual/browser testing can receive `429 Too Many - Requests` on the initial send path before the async OpenClaw handoff even - starts. - - In that case the limiter rejects the request before the route handler runs, - so the backend does not accept/persist the task through `/api/chat/respond`. -- Follow-up `/api/chat/respond` limiter fix: - - Authenticated `/api/chat/respond` now bypasses the generic `/api/*` IP - limiter in `apps/node_backend/src/app.ts`, just like chat sync/platform - routes already do. - - `apps/node_backend/src/routes/chat.ts` now adds a dedicated route-specific - limiter for `/respond`, keyed by `userId:sessionId`, with a budget of - `120 requests / minute / user-session`. - - Added regression coverage proving: - - authenticated `/api/chat/respond` no longer exhausts the generic IP bucket - - `/api/chat/respond` is still capped per user/session - - different sessions get independent `/respond` limiter buckets - - Revalidated `apps/node_backend` successfully with: - - `npm test -- --run src/app.test.ts src/routes/chat.test.ts src/routes/platform.test.ts` - - `npm run type-check` - - `npm run build` diff --git a/docs/plans/2026-04-20-19-29-UTC-platform-ack-scaling-dialect-cleanup.md b/docs/plans/2026-04-20-19-29-UTC-platform-ack-scaling-dialect-cleanup.md deleted file mode 100644 index d48a157d..00000000 --- a/docs/plans/2026-04-20-19-29-UTC-platform-ack-scaling-dialect-cleanup.md +++ /dev/null @@ -1,34 +0,0 @@ -# Platform ack scaling and dialect cleanup - -## Problem - -Two follow-up issues remain in the platform ack path: - -1. The Turso/libSQL ack update builds a large `OR` predicate with two bind - parameters per acked message and the `/api/v1/platform/events/ack` route - does not currently cap `ackedEventIds`. -2. `platformIntegrationService.ts` re-reads `process.env.TURSO_DATABASE_URL` - even though the DB module already selects the active pool/dialect. - -## Approach - -- Add a clear server-side batch cap for `ackedEventIds`, aligned with the - platform events page-size limit. -- Chunk Turso ack updates into smaller SQL statements so large valid batches do - not build oversized statements. -- Expose DB dialect metadata from the DB module and branch on that instead of - duplicating env-var checks in service code. -- Add/adjust backend tests for route validation, Turso SQL chunking, and - dialect-driven behavior. - -## Validation - -- `cd apps/node_backend && npm test -- --run src/routes/platform.test.ts src/services/platformIntegrationService.test.ts` -- `cd apps/node_backend && npm run type-check` -- `cd apps/node_backend && npm run build` - -## Notes - -- This task is a follow-up to review feedback after the OpenClaw/platform - handoff work already merged. -- The intended PR should be a fresh branch from latest `main`. diff --git a/docs/plans/2026-04-20-19-34-UTC-multi-node-plugin-routing-blueprint.md b/docs/plans/2026-04-20-19-34-UTC-multi-node-plugin-routing-blueprint.md deleted file mode 100644 index c40a1e92..00000000 --- a/docs/plans/2026-04-20-19-34-UTC-multi-node-plugin-routing-blueprint.md +++ /dev/null @@ -1,135 +0,0 @@ -# Background -The current implementation supports issuing a single OpenClaw-oriented platform token from Settings (`Openclaw Token`) and uses `pluginId` as the token-scoping identity. This works for one plugin runtime but does not provide a user-facing concept of multiple target runtimes (“nodes”) such as: -- a local company computer OpenClaw runtime, -- a cloud runtime on AWS, -- and future additional plugin runtimes. - -From code inspection, the current behavior is: -- Mobile app Settings exposes one token generation page and calls `GET /api/config/platform-token?pluginId=<...>` with a default plugin id (`plugin_local_main`). -- Node routing identity in backend platform APIs is `X-Bricks-Plugin-Id` + JWT claim `pluginId` + optional scoped `userId`. -- Chat async persistence stores `resolvedBotId`, `agentName`, `source`, etc. in message metadata, and the UI currently displays assistant attribution using `agentName` (which is currently set to `resolvedBotId`, so it often appears as `ask`). - -The requested enhancement is to add a “Node” layer where each token belongs to one node name, and messages sent to a node are retrievable only by that node’s token (JWT algorithm unchanged). - -# Goals -1. Introduce a first-class **Node** model (display name + stable identity) so users can manage multiple plugin endpoints under Settings. -2. Make platform tokens node-scoped by binding token issuance/verification to a node-owned plugin identity (without changing JWT signing algorithm/protocol family). -3. Ensure message delivery isolation: a token for Node A cannot read/ack/write Node B messages. -4. Add Settings UX for node management: - - “节点” entry point, - - empty-state “create first node” CTA, - - auto-generated default names (`openclaw 1`, `openclaw 2`, …; extensible naming strategy including zodiac labels), - - editable node names, - - copy conveniences under each node. -5. Update chat message attribution so assistant items display **Node Name** instead of generic `ask` when message source is node-delivered. -6. Preserve backward compatibility/migration path for existing single-token users and currently deployed node_openclaw_plugin runtimes. - -# Implementation Plan (phased) -## Phase 0: Domain framing and data model decisions -1. Define Node identity split: - - `node_id` (stable storage identity, immutable), - - `display_name` (editable label shown in UI). -2. Define node-to-plugin binding strategy: - - Option A (recommended): one stable `pluginId` per node persisted server-side. - - Option B: derive pluginId from node_id deterministically. -3. Keep token algorithm unchanged (existing JWT signing/verification), but include `pluginId` corresponding to node binding. -4. Confirm compatibility policy: - - Existing `plugin_local_main` treated as a migrated default node, - - no breaking change for old clients during rollout window. - -## Phase 1: Backend data layer and migration -1. Add DB migration(s) in `apps/node_backend/src/db/migrations/` for node entities, for example: - - `platform_nodes` table: - - `id` (PK), - - `user_id`, - - `node_id` (unique per user), - - `display_name`, - - `plugin_id` (unique per user), - - timestamps, - - optional soft-delete/archive field. -2. Add indexes and constraints: - - uniqueness for `(user_id, node_id)`, `(user_id, plugin_id)`, - - non-empty normalized display_name. -3. Add a migration routine or lazy bootstrap path to create a default node for users without nodes. - -## Phase 2: Backend services and APIs -1. Add `platformNodeService` (or equivalent) in `apps/node_backend/src/services/`: - - list nodes, - - create node with generated default name, - - rename node, - - resolve node by `nodeId` and/or `pluginId`. -2. Extend config routes (`apps/node_backend/src/routes/config.ts`): - - replace/augment `GET /config/platform-token` with node-aware issuance (`nodeId` parameter). - - response includes node metadata (`nodeId`, `nodeName`, `pluginId`, `token`, `scopes`, `baseUrl`, `expiresIn`). -3. Add dedicated node management routes (recommended under `/api/config/nodes` or `/api/platform/nodes`): - - `GET /nodes` list, - - `POST /nodes` create, - - `PATCH /nodes/:nodeId` rename, - - optional `DELETE /nodes/:nodeId` (only if product wants archival/removal now). -4. Ensure token issuance rejects unknown/foreign nodeId and always signs token with node-owned pluginId. - -## Phase 3: Platform auth and isolation guarantees -1. Keep `issuePlatformAccessToken` algorithm unchanged, but enforce that token `pluginId` comes from node binding. -2. Maintain existing middleware checks in `authenticatePlatformApiKey`: - - JWT `pluginId` must match header `X-Bricks-Plugin-Id`. -3. Strengthen platform integration service queries (`platformIntegrationService`) to remain plugin-scoped and user-scoped. -4. Add explicit guard tests for cross-node access attempts: - - token from node A + header for node B => forbidden, - - node A token cannot ACK/patch messages created under node B plugin scope. - -## Phase 4: Mobile app settings UX for Nodes -1. Add a new Settings entry: `节点` (Node Settings). -2. Build node list screen: - - empty state with “创建第一个节点” button, - - populated list with each node card showing name, plugin id summary, copy actions. -3. Create node flow: - - default naming generator (`openclaw 1`, `openclaw 2`, …), - - optional alternative naming strategy hook (zodiac sequence) behind utility/service. -4. Rename flow: - - inline or modal edit with validation. -5. Token actions per node: - - fetch/generate token for selected node, - - copy token, - - copy install instructions with node-specific pluginId/token. -6. Refactor existing `OpenclawTokenSettingsScreen` into node-centric UI or keep as backward-compatible subpage delegated from node details. - -## Phase 5: Chat attribution update (show Node Name instead of ask) -1. Decide attribution source of truth for assistant messages: - - prefer `metadata.nodeName` when source is node-delivered, - - fallback to `agentName` for legacy records. -2. Update server write paths (`chat.ts`, `platformIntegrationService.ts`) to include node metadata (`nodeId`, `nodeName`) when messages originate from platform/plugin pipeline. -3. Update `ChatHistoryApiService._messageFromServerMap` and/or `ChatMessage` mapping to preserve and expose node attribution. -4. Update `MessageList` rendering logic so assistant chip shows node name for node-origin messages (instead of `ask`). -5. Ensure historical compatibility for records without node metadata. - -## Phase 6: Plugin/runtime compatibility (node_openclaw_plugin) -1. Update plugin setup docs and runtime expectations: - - each runtime uses node-specific `BRICKS_PLUGIN_ID` + token. -2. No JWT algorithm changes in plugin claim parser; only values differ by node. -3. Optional: improve plugin logs to include node identity for observability. - -## Phase 7: Tests, regression checks, and docs/code map updates -1. Backend tests: - - route tests for node CRUD and node-scoped token issuance, - - middleware tests for cross-node rejection, - - integration-service tests for plugin/user isolation. -2. Flutter tests: - - settings navigation includes 节点 entry, - - empty-state/create/rename/copy interactions, - - node-aware token instruction rendering, - - message list attribution renders node name. -3. Validation commands: - - `./tools/init_dev_env.sh` - - `cd apps/node_backend && npm test` - - `cd apps/mobile_chat_app && flutter test` - - optional targeted checks: `cd apps/mobile_chat_app && flutter analyze` -4. Update code maps (`docs/code_maps/feature_map.yaml`, `docs/code_maps/logic_map.yaml`) after implementation because feature entry paths, business logic, and tests will change. - -# Acceptance Criteria -1. User can create multiple nodes in Settings, starting from empty-state CTA, and can rename each node with persisted result. -2. Each node can issue/copy its own token and install instructions, and returned token payload clearly indicates node binding. -3. A message addressed to a node is only retrievable/acknowledgeable/updateable by that node’s token scope (pluginId isolation enforced). -4. Existing JWT algorithm/protocol remains unchanged; only claim values (pluginId) reflect node binding. -5. In chat list UI, assistant messages generated via node/plugin path display the corresponding Node Name instead of generic `ask` when node metadata is available. -6. Legacy users with pre-existing single-token setup can continue working via migrated/default node behavior. -7. Automated tests covering node lifecycle, token scoping, and UI attribution pass in CI/local validation commands. diff --git a/docs/plans/2026-04-20-19-36-UTC-chat-sync-long-polling.md b/docs/plans/2026-04-20-19-36-UTC-chat-sync-long-polling.md deleted file mode 100644 index a4c759b1..00000000 --- a/docs/plans/2026-04-20-19-36-UTC-chat-sync-long-polling.md +++ /dev/null @@ -1,36 +0,0 @@ -# Background - -`/api/chat/sync/:sessionId` is currently consumed by fixed-interval short polling from the mobile chat app. When the conversation has pending async tasks (especially OpenClaw routing), this can generate many repeated requests with no new data and hit backend rate limits. - -# Goals - -1. Reduce unnecessary `/api/chat/sync` request frequency while preserving near-real-time updates. -2. Keep backward compatibility for existing clients that do not send long-poll parameters. -3. Add automated coverage for new long-poll behavior. - -# Implementation Plan (phased) - -## Phase 1: Backend long-poll support -- Add optional `waitMs` query parsing to `GET /api/chat/sync/:sessionId`. -- If no messages are available, keep the request open and retry sync checks until either: - - new messages are found, or - - `waitMs` timeout expires. -- Cap `waitMs` with a safe upper bound to avoid runaway request lifetimes. - -## Phase 2: Client sync call upgrade -- Extend `ChatHistoryApiService.sync` to accept optional `waitMs` and append it to sync query parameters. -- Update chat screen sync loop to request long polling (bounded timeout) instead of pure short polling. - -## Phase 3: Validation -- Update Node route tests to cover long-poll query parsing and bounded wait behavior. -- Update Flutter service tests to verify `waitMs` query transmission. -- Run targeted backend and Flutter tests. - -# Acceptance Criteria - -1. Chat sync endpoint accepts `waitMs` and does not block longer than the configured max bound. -2. Mobile chat sync requests include long-poll timeout for active scope polling. -3. Existing sync behavior remains compatible when `waitMs` is omitted. -4. Relevant route/service tests pass: - - `npm test -- src/routes/chat.test.ts` - - `cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart` diff --git a/docs/plans/2026-04-21-00-12-UTC-multi-node-plugin-implementation.md b/docs/plans/2026-04-21-00-12-UTC-multi-node-plugin-implementation.md deleted file mode 100644 index a945e0fd..00000000 --- a/docs/plans/2026-04-21-00-12-UTC-multi-node-plugin-implementation.md +++ /dev/null @@ -1,34 +0,0 @@ -# Background -The repository currently supports issuing one OpenClaw platform token from settings, but lacks a first-class Node model that can bind tokens to specific runtimes (local machine, cloud runtime, etc.). - -# Goals -- Implement node management APIs and persistence in backend. -- Make platform token issuance node-aware while keeping existing JWT algorithm unchanged. -- Add Settings UI for node list/create/rename and node-scoped token copy/install instructions. -- Display node attribution in assistant messages instead of generic ask where node metadata is available. -- Add tests for backend and Flutter changes. - -# Implementation Plan (phased) -## Phase 1: Backend foundation -1. Add DB migration for `platform_nodes`. -2. Add service for CRUD/list + default-name generation. -3. Add `/api/config/nodes` endpoints and node-aware `/api/config/platform-token`. - -## Phase 2: Chat metadata & attribution -1. Extend platform message persistence metadata with `nodeName` using plugin id mapping. -2. Update chat message mapping/rendering fallback to show node name chip. - -## Phase 3: Mobile settings UX -1. Add Node Settings entry in settings screen. -2. Add node list page with empty-state create button, rename, token generation, copy actions. -3. Reuse existing install-instruction format with node-scoped pluginId/token. - -## Phase 4: Validation and docs/index updates -1. Run backend unit tests and mobile flutter tests. -2. Update code maps for new entry points and logic indexes. - -# Acceptance Criteria -- Users can create and rename multiple nodes in settings. -- Platform token can be generated for a specific node and includes node-bound pluginId. -- Assistant message attribution shows node name when available. -- Backend + Flutter tests pass for new behavior. diff --git a/docs/plans/2026-04-21-01-07-UTC-chat-sync-sse.md b/docs/plans/2026-04-21-01-07-UTC-chat-sync-sse.md deleted file mode 100644 index 86307562..00000000 --- a/docs/plans/2026-04-21-01-07-UTC-chat-sync-sse.md +++ /dev/null @@ -1,87 +0,0 @@ -# Replace Long Polling with SSE for Chat Sync - -**Date:** 2026-04-21 01:07 UTC - -## Background - -PR #174 introduced long-polling on `GET /api/chat/sync/:sessionId` (via a `waitMs` query -parameter) to reduce the number of empty short-poll round-trips when multi-agent group -conversations are idle. A review comment on that PR argued—correctly—that SSE (Server-Sent -Events) is a strictly better transport for the same use-case because: - -* A single persistent HTTP connection replaces the repeated TCP/TLS handshake-tear-down cycle - of long-polling. -* The server can push multiple events (one per bot reply) over the same open pipe. -* AI streaming "typewriter" output maps naturally onto SSE frames. -* SSE's `EventSource` reconnect semantics are well-understood and free of the state-management - complexity that long-poll reconnection requires. - -## Goals - -1. Remove long-polling (`waitMs`, the retry loop, `sleep()`) from the sync endpoint. -2. Add a new `GET /api/chat/events/:sessionId` SSE endpoint on the Node.js backend. -3. Replace the Flutter timer-based polling with a persistent SSE stream subscription. -4. Keep the simple (non-long-poll) `GET /api/chat/sync/:sessionId` endpoint intact for - on-demand fetches (e.g. after history load). -5. Update all affected tests. - -## Implementation Plan - -### Phase 1 – Backend (`apps/node_backend/src/routes/chat.ts`) - -* Remove `CHAT_SYNC_LONG_POLL_MAX_WAIT_MS`, `CHAT_SYNC_LONG_POLL_INTERVAL_MS`, `sleep()`. -* Revert the `/sync/:sessionId` handler to a simple single-call `syncMessages` + `res.json`. -* Add `GET /events/:sessionId` handler: - * Rate-limited at 10 new connections / user / session / minute (`eventsLimiter`). - * Sets `Content-Type: text/event-stream`, `Cache-Control: no-cache`, `Connection: keep-alive`. - * Sends `setInterval` keep-alive heartbeat comments every 15 s. - * Polls `syncMessages` every 1 s via `setTimeout`; when new data arrives writes - `data: \n\n` and advances `afterSeq`. - * Cleans up timers on `req.on('close')`. - -### Phase 2 – Flutter service (`apps/mobile_chat_app/lib/features/chat/chat_history_api_service.dart`) - -* Remove `waitMs` parameter from `_syncUri()` and `sync()`. -* Add `_eventsUri(sessionId, afterSeq)` URI helper. -* Add `Stream listenEvents({token, sessionId, afterSeq})` using - `http.Client.send()` for a streaming response, parsing SSE lines into snapshots. - -### Phase 3 – Flutter screen (`apps/mobile_chat_app/lib/features/chat/chat_screen.dart`) - -* Replace `Timer? _syncTimer`, `bool _syncInFlight`, backoff fields with - `StreamSubscription? _sseSubscription`. -* Replace `_cancelSyncPolling` → `_disconnectSse`. -* Replace `_scheduleSync` / `_configureActiveScopeSync` / `_syncActiveScope` with - `_connectSse` / `_configureActiveScopeSync` / `_applySseSnapshot`. -* On SSE stream error or done: reconnect after `_sseReconnectDelay` (3 s) if still mounted - and scope hasn't changed. - -### Phase 4 – Tests - -* **Backend** (`chat.test.ts`): remove long-poll retry test; add SSE streaming test that reads - `response.body` as a `ReadableStream` and asserts a `data:` line with the expected payload. -* **Flutter** (`chat_history_api_service_test.dart`): remove `waitMs` assertion; add two SSE - tests using `_MockStreamedClient` (a `BaseClient` subclass) that controls a - `StreamController>` to emit raw SSE bytes. - -## Acceptance Criteria - -* `GET /api/chat/events/:sessionId` responds with `Content-Type: text/event-stream` and - pushes `data:` frames within ~1 s of new messages being inserted. -* `GET /api/chat/sync/:sessionId` continues to work without `waitMs` (no long-poll loop). -* Flutter app opens one SSE connection per active scope, updates the message list on each - incoming event, and reconnects automatically if the stream drops. -* All existing backend tests pass; new SSE test passes. -* All existing Flutter tests pass; two new SSE stream tests pass. -* `flutter analyze lib/features/chat/` reports no errors in modified files. - -## Validation Commands - -```sh -# Backend -cd apps/node_backend && npm test -- src/routes/chat.test.ts - -# Flutter -cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart -cd apps/mobile_chat_app && flutter analyze lib/features/chat/ -``` diff --git a/docs/plans/2026-04-21-03-23-UTC-openclaw-network-retry-hardening.md b/docs/plans/2026-04-21-03-23-UTC-openclaw-network-retry-hardening.md deleted file mode 100644 index c849a68c..00000000 --- a/docs/plans/2026-04-21-03-23-UTC-openclaw-network-retry-hardening.md +++ /dev/null @@ -1,31 +0,0 @@ -# OpenClaw network retry hardening - -## Problem - -The Bricks OpenClaw plugin runner already survives ordinary tick failures, but -DNS/connectivity failures such as `TypeError: fetch failed` with -`getaddrinfo ENOTFOUND ...` are not currently classified as retryable. That -means the runner keeps looping, but it logs an error every poll interval and -does not enter the same bounded backoff path used for retryable platform HTTP -failures. - -## Approach - -- Keep the runner alive on transient network failures as it already does today. -- Treat pre-response fetch/network failures as retryable runner failures. -- Reuse the existing bounded backoff ladder so DNS/connectivity outages recover - automatically once the network or DNS issue clears. -- Add regression coverage proving both the helper classification and the - `runUntilAbort()` loop behavior. - -## Validation - -- `cd apps/node_openclaw_plugin && npm test` -- `cd apps/node_openclaw_plugin && npm run type-check` -- `cd apps/node_openclaw_plugin && npm run build` - -## Notes - -- This hardening is intentionally narrow: it does not change message dispatch - semantics or state handling, only how the runner classifies and retries - transport-level failures before an HTTP response exists. diff --git a/docs/plans/2026-04-21-03-37-UTC-thread-channel-router-menu-adjustment.md b/docs/plans/2026-04-21-03-37-UTC-thread-channel-router-menu-adjustment.md deleted file mode 100644 index 069e5bea..00000000 --- a/docs/plans/2026-04-21-03-37-UTC-thread-channel-router-menu-adjustment.md +++ /dev/null @@ -1,20 +0,0 @@ -# Thread/Channel Router Menu Adjustment - -## Background -The chat input router menu currently renders both channel-level and thread-level option groups together, which can be confusing when the current conversation scope is channel-only or thread-scoped. - -## Goals -1. For thread conversations, keep the thread router choices focused and visible as exactly: Follow channel, Bricks Default, and OpenClaw. -2. For channel conversations, hide the thread router group entirely. -3. Preserve existing router selection behavior and snackbar feedback. - -## Implementation Plan (phased) -1. Inspect `chat_screen.dart` router-menu rendering to identify where channel and thread sections are always shown. -2. Update menu-building logic to conditionally include the thread section only when viewing a thread conversation. -3. Verify labels and menu values remain unchanged for thread context (Follow channel + concrete routers). -4. Run targeted Flutter tests for chat UI behavior. - -## Acceptance Criteria -1. In channel conversations, the router menu only shows channel router options and no thread router group. -2. In thread conversations, the thread router group appears with exactly three options: Follow channel, Bricks Default, and OpenClaw. -3. Existing compile/test checks continue to pass for the mobile chat app. diff --git a/docs/plans/2026-04-21-05-36-UTC-openclaw-plugin-refresh-skill.md b/docs/plans/2026-04-21-05-36-UTC-openclaw-plugin-refresh-skill.md deleted file mode 100644 index 15eef20c..00000000 --- a/docs/plans/2026-04-21-05-36-UTC-openclaw-plugin-refresh-skill.md +++ /dev/null @@ -1,36 +0,0 @@ -# OpenClaw plugin refresh skill - -## Problem - -This repository already has a repeatable workflow for applying updated local -`apps/node_openclaw_plugin` code to a real OpenClaw install, but there is no -dedicated `.codex/skills` entry that captures the repo-specific safe path, -fast path, config refresh path, and verification steps. - -## Approach - -- Add a new custom skill under `.codex/skills/openclaw-plugin-refresh/`. -- Document the repository-specific facts that matter for this workflow: - - plugin source location - - `dist/*` build requirement - - linked local install path - - gateway-managed runtime behavior - - Node version requirement -- Cover both the safe reinstall workflow and the fast path for existing linked - installs. -- Include the config refresh path and log-based verification steps. -- Surface the new skill from `AGENTS.md` so future agents are more likely to - discover and use it. - -## Validation - -- Review the new skill content against: - - `apps/node_openclaw_plugin/README.md` - - `apps/node_openclaw_plugin/package.json` -- Verify the new skill path appears under `.codex/skills/`. -- Verify `AGENTS.md` points future agents at the new skill. - -## Notes - -- This is a documentation/automation-surface change only; no application code - or runtime behavior should change. diff --git a/docs/plans/2026-04-21-06-51-UTC-chat-header-subsection-switcher-merge.md b/docs/plans/2026-04-21-06-51-UTC-chat-header-subsection-switcher-merge.md deleted file mode 100644 index 2c7f0259..00000000 --- a/docs/plans/2026-04-21-06-51-UTC-chat-header-subsection-switcher-merge.md +++ /dev/null @@ -1,33 +0,0 @@ -# Chat header subsection switcher merge plan - -## Background -- 当前聊天页面将子区切换器放在右上角 actions,标题区域独立显示频道名与 router 小字。 -- 需求要求把子区切换与标题合并:标题后可下拉切换子区,切换后标题区域即时更新。 -- 同时移除标题区域中的 router 第二行小字,并在右侧保留子区控制菜单(改名/存档暂不实现)。 - -## Goals -1. 将子区切换入口移动到左侧标题区域,与频道标题形成同一组件。 -2. 标题区域不再显示 router 信息小字。 -3. 在右上角提供子区控制下拉菜单,包含“分区改名(未实现)”“分区存档(未实现)”。 -4. 保持现有主区/子区切换与历史加载行为不回退。 - -## Implementation Plan (phased) -### Phase 1: Header structure refactor -- 重构 `AppBar.title`,将频道标题与子区下拉按钮组合为一行组件。 -- 下拉菜单保留“回到主区”“新建子区”与动态子区列表,用于直接切换。 -- 抽取切换逻辑为独立方法,避免与 actions 中逻辑重复。 - -### Phase 2: Right-side subsection controls -- 将原右上角切换菜单改为“子区管理”菜单。 -- 菜单包含“分区改名(未实现)”“分区存档(未实现)”,并以禁用态呈现。 - -### Phase 3: Cleanup and validation -- 删除未再使用的 router summary 文本逻辑。 -- 运行 Flutter 测试/检查验证聊天页构建与交互不报错。 -- 根据变更同步检查并更新代码地图文件。 - -## Acceptance Criteria -- 用户在标题右侧下拉可切换主区/子区;切换后标题中的子区文案变化正确。 -- 标题区域不再出现 `Router: ...` 小字。 -- 右上角存在子区控制菜单,显示“分区改名(未实现)”“分区存档(未实现)”。 -- 现有聊天页面测试在当前仓库环境可通过(如 `cd apps/mobile_chat_app && flutter test test/app_test.dart`)。 diff --git a/docs/plans/2026-04-21-07-57-UTC-readme-refresh-consolidated-plan.md b/docs/plans/2026-04-21-07-57-UTC-readme-refresh-consolidated-plan.md deleted file mode 100644 index 3cc42d96..00000000 --- a/docs/plans/2026-04-21-07-57-UTC-readme-refresh-consolidated-plan.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -The README refresh went through multiple iterations. Review feedback requested two final adjustments: (1) use a flowchart-style ASCII diagram instead of a tree layout, and (2) consolidate previously split README planning notes into a single plan document. - -# Goals -1. Keep README aligned with actual packages and current architecture language. -2. Present architecture as a flowchart-style ASCII diagram (not tree-style) above the Packages table. -3. Keep concise README/BUILD separation (README overview; BUILD.md detailed workflows). -4. Replace multiple README plan docs with one consolidated document. - -# Implementation Plan (phased) -## Phase 1: README diagram refinement -- Replace the existing tree-form ASCII with a flowchart-form ASCII block. -- Ensure the flow shows channel routing, channel partitions, plugin nodes, and multi-instance controller relationship. - -## Phase 2: Plan document consolidation -- Create one consolidated README plan document capturing prior goals and current feedback. -- No prior split plan documents were found for this specific README refresh task; cleanup of older split documents is therefore already complete and this step is done. - -## Phase 3: Verification -- Verify diagram placement above the Packages table and readable markdown rendering. -- Verify repository now contains a single consolidated README refresh plan document. -- Confirm code maps are unchanged because this remains a documentation-only update. - -# Acceptance Criteria -- README contains a flowchart-style ASCII diagram in English above the Packages table. -- Diagram expresses relationships among channels, partitions, and OpenClaw plugin nodes. -- Only one consolidated plan document remains for this README refresh task. -- No runtime behavior or code logic is changed. diff --git a/docs/plans/2026-04-21-10-20-UTC-respond-async-delivery-indicators.md b/docs/plans/2026-04-21-10-20-UTC-respond-async-delivery-indicators.md deleted file mode 100644 index 1f43d0b5..00000000 --- a/docs/plans/2026-04-21-10-20-UTC-respond-async-delivery-indicators.md +++ /dev/null @@ -1,39 +0,0 @@ -# Background -The chat flow currently treats default-router `/api/chat/respond` as a synchronous request/response path, and the Flutter UI inserts an optimistic empty assistant placeholder immediately after the user sends a message. Delivery/read indicators for user messages are also tied to older heuristics, which no longer match the latest product behavior for default-router and OpenClaw flows. - -# Goals -1. Make default-router `respond` follow the async transport contract: persist user message first, return quickly, and complete assistant generation/persistence asynchronously. -2. Remove immediate fake assistant placeholder rendering from the client; assistant content should appear only when actual reply content starts arriving from backend sync/SSE. -3. Update user-message delivery indicators to the latest rule: - - show a first check mark when the user query is persisted; - - add a second conversation-status mark when assistant processing/reply starts; - - when the responder is OpenClaw, the second mark must be 🦞 instead of ✓. -4. Ensure sync/SSE wiring still activates for default-router async replies after send. - -# Implementation Plan (phased) -## Phase 1: Backend respond async unification -- Refactor `apps/node_backend/src/routes/chat.ts` `/respond` so both default and OpenClaw return `mode: "async"` after accepted persistence. -- Persist the user message first. -- For default router, schedule background generation + assistant message persistence (accepted/completed/failed state transitions) without blocking HTTP response. -- Add/update route tests to validate default router no longer behaves synchronously. - -## Phase 2: Flutter send-flow and SSE behavior -- Update `apps/mobile_chat_app/lib/features/chat/chat_screen.dart` send flow to stop adding optimistic empty assistant messages. -- Keep user message visible, then rely on SSE/sync snapshots for assistant records. -- Ensure active-scope sync activation includes pending user tasks so default-router async replies are still fetched even without a local assistant placeholder. - -## Phase 3: Delivery indicator behavior -- Update `apps/mobile_chat_app/lib/features/chat/widgets/message_list.dart` delivery indicator model/UI to support two-stage icons. -- Implement first icon (persisted check) and second icon (reply started, with OpenClaw lobster variant). -- Update widget tests in `apps/mobile_chat_app/test/message_list_test.dart` accordingly. - -## Phase 4: Code map and validation -- Run targeted backend + Flutter tests covering changed behavior. -- Review and update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` to reflect behavior changes. - -# Acceptance Criteria -- `POST /api/chat/respond` for default scope responds with async accepted payload without waiting for LLM text generation. -- User message record is persisted before async response is returned. -- Flutter chat does not render an empty/fake assistant placeholder on send. -- User message delivery UI shows two-stage state per latest rules (OpenClaw second icon uses lobster). -- Relevant automated tests pass for backend route behavior and Flutter delivery indicator rendering. diff --git a/docs/plans/2026-04-21-12-37-UTC-router-switch-toast-behavior.md b/docs/plans/2026-04-21-12-37-UTC-router-switch-toast-behavior.md deleted file mode 100644 index 27e371fe..00000000 --- a/docs/plans/2026-04-21-12-37-UTC-router-switch-toast-behavior.md +++ /dev/null @@ -1,19 +0,0 @@ -# Background -The chat composer route switcher (left-side button near the input area) currently shows a success toast whenever channel/thread router changes are saved. Product expectation is to keep the UX silent on success and only notify users when persistence fails. - -# Goals -- Remove success toasts for channel router updates. -- Remove success toasts for thread router updates. -- Preserve existing failure toasts so users are informed when the update fails. - -# Implementation Plan (phased) -1. Locate router save handlers in chat UI and identify success/failure toast branches. -2. Remove only the success snack bars from both channel and thread save flows. -3. Keep error handling and optimistic rollback logic unchanged. -4. Run focused Flutter checks to confirm no analyzer/test regressions. - -# Acceptance Criteria -- Changing channel router does not show a success toast. -- Changing thread router does not show a success toast. -- If saving channel or thread router fails, a failure toast still appears. -- Validation command(s): `./tools/init_dev_env.sh`, then `cd apps/mobile_chat_app && flutter test` (or a focused equivalent if full suite is too slow). diff --git a/docs/plans/2026-04-21-12-43-UTC-router-menu-checkmark-selection.md b/docs/plans/2026-04-21-12-43-UTC-router-menu-checkmark-selection.md deleted file mode 100644 index 8a061a0e..00000000 --- a/docs/plans/2026-04-21-12-43-UTC-router-menu-checkmark-selection.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -The router switch popup now has silent success behavior, but users still need clear visibility into which router option is currently selected. The menu header currently includes both partition type and selected value, which is redundant once selection is visually indicated. - -# Goals -- Show current selection using a checkmark in the popup menu options. -- Reserve left-side checkmark space for every selectable menu item. -- Simplify the menu header line to show only partition type. - -# Implementation Plan (phased) -1. Add reusable menu option rendering with fixed leading checkmark slot. -2. Update channel router menu items to render checkmarks based on current selection. -3. Update thread router menu items to render checkmarks based on explicit thread setting (including Follow channel). -4. Simplify non-selectable header row text for channel/thread sections. -5. Run focused Flutter tests for chat navigation UI regressions. - -# Acceptance Criteria -- In channel context, the active router option shows a checkmark and other options keep aligned left padding. -- In thread context, exactly one of Follow channel / Bricks Default / OpenClaw shows a checkmark. -- Header line displays only `Channel router` or `Thread router` without selected value text. -- Validation command(s): `./tools/init_dev_env.sh`, `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart`. diff --git a/docs/plans/2026-04-21-14-45-UTC-chat-appbar-bg.md b/docs/plans/2026-04-21-14-45-UTC-chat-appbar-bg.md deleted file mode 100644 index 11e85818..00000000 --- a/docs/plans/2026-04-21-14-45-UTC-chat-appbar-bg.md +++ /dev/null @@ -1,16 +0,0 @@ -# Background -用户希望将对话页面顶部 AppBar 的背景色改为与内容区一致,消除顶部与主体区域的视觉色差。 - -# Goals -- 让聊天页 AppBar 背景与内容区(Scaffold 背景)保持一致。 -- 不改变聊天页现有交互行为与布局结构。 - -# Implementation Plan (phased) -1. 定位 `chat_screen.dart` 中聊天页 `AppBar` 的定义位置。 -2. 为 `AppBar` 显式设置与内容区一致的背景色(基于主题的 `scaffoldBackgroundColor`)。 -3. 运行格式化与最小化测试/检查,确认无回归。 - -# Acceptance Criteria -- 打开聊天页时,顶部 AppBar 背景色与内容区背景色一致。 -- 聊天页现有菜单、切换子区、发送消息等功能不受影响。 -- `flutter test`(在 `apps/mobile_chat_app` 目录下执行)通过。 diff --git a/docs/plans/2026-04-21-14-45-UTC-user-bubble-metadata-context-menu.md b/docs/plans/2026-04-21-14-45-UTC-user-bubble-metadata-context-menu.md deleted file mode 100644 index 8d38c5eb..00000000 --- a/docs/plans/2026-04-21-14-45-UTC-user-bubble-metadata-context-menu.md +++ /dev/null @@ -1,40 +0,0 @@ -# Background -The user wants to simplify the message row by removing the metadata line outside user bubbles while preserving all existing metadata information. They also want user-bubble metadata to use delivery checkmarks rather than `task:accepted` text, remove visible task/message IDs from the bubble body, and add a long-press context menu with copy/branch/resend actions plus subtle ID diagnostics in the menu footer. - -# Goals -1. Keep all user-message metadata but move it into the user bubble. -2. Remove visible `id:task-...` text from message rendering. -3. Replace textual accepted-state indication with the existing first ✓ delivery indicator. -4. Place the second delivery indicator immediately after the first inside bubble metadata. -5. Add long-press context menu on user bubbles with: - - Copy (implemented) - - Branch (placeholder) - - Resend (placeholder) - - Bottom two-line light metadata: message id and task id. -6. Keep/extend tests to cover the updated rendering and menu behavior. - -# Implementation Plan (phased) -## Phase 1: Bubble metadata layout -- Update `message_list.dart` to render user metadata row inside the user bubble. -- Remove the external metadata row for user messages. -- Keep assistant rows unchanged. - -## Phase 2: Metadata semantics cleanup -- Stop rendering `task:*` and `id:*` text in the user bubble body. -- Keep timestamp/thread/recovered text and delivery icons together inside bubble metadata. - -## Phase 3: Long-press context menu -- Add a long-press handler for user bubbles. -- Implement context menu actions and footer metadata lines. -- Implement copy action with clipboard support. - -## Phase 4: Validation and map synchronization -- Run mobile app tests for `message_list_test.dart`. -- Update code maps to include the new long-press/context-menu behavior in chat session smoke checks/keywords. - -# Acceptance Criteria -- User message rows no longer show metadata text outside the bubble. -- User bubble contains timestamp/thread metadata and delivery checks. -- `task:accepted` / `id:task-*` are not shown in user bubble text. -- Long-pressing a user bubble shows a menu with Copy/Branch/Resend and footer metadata lines for message/task IDs. -- `flutter test` for message list passes from `apps/mobile_chat_app`. diff --git a/docs/plans/2026-04-22-03-03-UTC-agent-bot-sidebar-blueprint.md b/docs/plans/2026-04-22-03-03-UTC-agent-bot-sidebar-blueprint.md deleted file mode 100644 index f5bbd348..00000000 --- a/docs/plans/2026-04-22-03-03-UTC-agent-bot-sidebar-blueprint.md +++ /dev/null @@ -1,48 +0,0 @@ -# Background -目前移动端聊天侧边栏已有 `Agents` 分组,但其内容仅来自本地 Agent 文件仓库(`AgentsRepository`)读取结果;在未创建任何 Agent 时会显示空状态文案。现有 Agent 定义已包含 `name`、`description`、`model`、`systemPrompt`,与“BOT = system prompt + 模型选项(可选)”方向高度一致,但命名与产品语义仍需统一。 - -# Goals -1. 明确现状:梳理 Agent 在域模型、存储、运行时、UI 侧边栏的现有设计与数据流。 -2. 给出 BOT 概念映射:将“BOT 内核概念”映射为用户可见 `Agent`,并保证兼容既有实现。 -3. 提出可落地改造分期:让侧边栏 `Agents` 分组内置并稳定展示可用 BOT(如文档、问答、问卷、儿童 workbook)。 - -# Implementation Plan (phased) -## Phase 1 - 概念与命名统一(不改协议) -- 在产品与文档层统一术语: - - **用户层名称**:Agent(侧边栏继续显示 Agent) - - **内部设计名称**:BOT(prompt-profile + model-profile 的可运行单元) -- 定义字段映射: - - `bot_id` -> 现有 `AgentDefinition.name` - - `display_name` -> 新增展示名(可选,未配置时回落为 `name`) - - `system_prompt` -> 现有 `systemPrompt` - - `model_profile` -> 现有 `model`(后续可扩展 provider、temperature 等可选项) - -## Phase 2 - 内建 BOT 注册表 -- 新增“内建 BOT 清单”模块(建议在 chat_domain 或 mobile_chat_app feature 层): - - 至少包含:写文档、轻松问答、问卷、儿童 workbook。 -- 启动时合并来源: - - 内建 BOT(只读) - - 用户自建 Agent/BOT(可编辑) -- 侧边栏展示按分组或标记区分(Built-in / Custom)。 - -## Phase 3 - 侧边栏与入口联动 -- `ChatNavigationPage` 的 Agents 分组改为显示“合并后的 Agent 列表”。 -- 空状态逻辑调整:当用户自建为空时仍显示内建 BOT,不再出现“分组空”的主路径体验。 -- “配置”入口从未实现状态接入可用页面: - - 内建 BOT:仅允许复制为自定义版本(避免直接破坏默认模板) - - 自建 BOT:可编辑 system prompt 与模型选项。 - -## Phase 4 - 运行时选择与审计 -- 发送消息时把当前选中 Agent/BOT 的 `bot_id`、`system_prompt_version`、`resolved_model`记录到消息元数据,便于回放与排障。 -- 与现有 `ChatBotRegistry`(ask/image_generation)关系: - - 短期并存:保留 skill 级路由;新增 BOT 层用于 persona/prompt 封装。 - - 中期收敛:把默认 ask 也迁移为内建 BOT 的一个实例。 - -# Acceptance Criteria -1. 新安装或未创建自定义 Agent 的用户,打开侧边栏 `Agents` 分组时可见内建 Agent 列表(至少 4 个)。 -2. 用户可明确区分“内建 Agent”和“自定义 Agent”。 -3. 选择任一 Agent 发送消息后,运行时使用该 Agent 的 system prompt;模型选项未指定时按默认策略回退。 -4. 保持向后兼容:旧 `.md` Agent 文件仍可加载并显示。 -5. 验证命令(开发阶段): - - `./tools/init_dev_env.sh` - - `cd apps/mobile_chat_app && flutter test` diff --git a/docs/plans/2026-04-22-03-04-UTC-remove-readme-packages-section.md b/docs/plans/2026-04-22-03-04-UTC-remove-readme-packages-section.md deleted file mode 100644 index 184bdc1d..00000000 --- a/docs/plans/2026-04-22-03-04-UTC-remove-readme-packages-section.md +++ /dev/null @@ -1,23 +0,0 @@ -# Background -The repository README currently includes a "Packages" section listing package directories and descriptions. The user requested removing the packages section from the README. - -# Goals -- Remove the entire "Packages" section from README content. -- Keep the rest of the README intact and readable. - -# Implementation Plan (phased) -## Phase 1: Inspect current README structure -- Locate the "Packages" heading and the associated table content. - -## Phase 2: Apply documentation update -- Delete the "Packages" section block from the README. -- Verify surrounding sections still flow naturally. - -## Phase 3: Validate and finalize -- Run a quick diff/stat check to confirm only intended docs changes were made. -- Commit the change with a clear message. - -# Acceptance Criteria -- The README no longer contains a "Packages" section heading. -- The package listing table is fully removed. -- Only the expected documentation and plan files are changed for this task. diff --git a/docs/plans/2026-04-22-03-44-UTC-router-linked-composer-actions.md b/docs/plans/2026-04-22-03-44-UTC-router-linked-composer-actions.md deleted file mode 100644 index 57cb1f4a..00000000 --- a/docs/plans/2026-04-22-03-44-UTC-router-linked-composer-actions.md +++ /dev/null @@ -1,34 +0,0 @@ -# Background -The chat composer currently shows a route button and a static configuration button with fixed menu items. Product requirements now require route-aware action buttons: default route should expose the config button with current model visibility, generic non-default routes should hide config by default, and the OpenClaw route should expose dedicated slash-command tooling. - -# Goals -1. Make composer actions dynamically depend on the effective router selection. -2. Update the configuration menu to show the currently effective model under the “模型” item. -3. Remove “Agents” and “新上下文” entries from the configuration menu. -4. Add an OpenClaw slash-command button that inserts selected slash commands into the input box. -5. Keep route-selection behavior intact and covered by widget tests. - -# Implementation Plan (phased) -1. **Composer widget API refactor** - - Replace the single optional `routerAction` slot with a flexible `leadingActions` list. - - Add optional model display text and slash command list support. - - Update menu enum/actions to remove deprecated entries. -2. **Chat screen wiring** - - Build route-dependent leading actions in `ChatScreen` based on `_effectiveRouterForScope()`. - - Preserve existing route picker button. - - For `default` route, render config button only. - - For `openclaw`, render slash command button plus config button. - - For unknown future routes, render no config button by default. -3. **OpenClaw slash command presets** - - Add a curated initial slash command list based on OpenClaw docs and bind selection to composer input insertion. -4. **Tests and map updates** - - Update `composer_bar_test.dart` for API and behavior changes. - - Run Flutter tests from package directory after environment bootstrap. - - Evaluate code map impact and update maps if feature/logic index changed. - -# Acceptance Criteria -- Selecting default route shows the config button with menu item “模型” plus subtitle of the currently selected model. -- Config menu no longer includes “Agents” or “新上下文”. -- Selecting OpenClaw route shows a slash button; picking a slash command inserts command text into the composer input. -- For non-default non-openclaw routes, config button is hidden by default. -- `cd apps/mobile_chat_app && flutter test test/composer_bar_test.dart` passes after `./tools/init_dev_env.sh`. diff --git a/docs/plans/2026-04-22-03-53-UTC-streaming-output-120k-merged-plan.md b/docs/plans/2026-04-22-03-53-UTC-streaming-output-120k-merged-plan.md deleted file mode 100644 index 214bea90..00000000 --- a/docs/plans/2026-04-22-03-53-UTC-streaming-output-120k-merged-plan.md +++ /dev/null @@ -1,36 +0,0 @@ -# Streaming Output 120K Boundary + User-side Incremental Delivery (Merged Plan) - -## Background -The previous plan audited route-level streaming capability and added conservative output limits. Based on follow-up requirements, we now need to merge that planning context with a concrete implementation plan that: -1) raises output boundaries to 120K as the new default budget, and -2) achieves true user-visible incremental output for the default chat router, while preserving the existing `/respond` acceptance flow and SSE architecture. - -This merged plan supersedes and consolidates prior route-audit planning for the same objective. - -## Goals -1. Set output budget defaults and upper bounds to **120K** for model output controls. -2. Keep `/api/chat/respond` request/ack contract unchanged. -3. Keep existing SSE transport shape (`/api/chat/events/:sessionId`) unchanged. -4. Refactor backend default-router generation to stream from the model and persist incremental assistant content so users can see progressive updates via existing SSE polling. -5. Align route docs with the final behavior and boundaries. - -## Implementation Plan (phased) -1. **Boundary normalization to 120K** - - Update LLM route `maxTokens` defaults and upper-bound validation to 120K. - - Update platform message text cap to 120K characters. -2. **Default router true incremental generation** - - Replace single-shot model generation in chat default async pipeline with streaming model generation. - - Persist assistant message progressively (same messageId, growing content, `dispatched` state during stream). - - Finalize the same message with `completed` state after stream ends; preserve failure write-path semantics. -3. **Test adaptation** - - Update route tests for the new 120K thresholds. - - Add assertions that default-router async flow now emits intermediate `dispatched` writes before completion. -4. **Documentation merge** - - Refresh audit/report docs so boundaries and streaming behavior match implementation. - -## Acceptance Criteria -- `POST /api/llm/chat` and `POST /api/llm/chat/stream` enforce 120K default and 120K upper-bound for `maxTokens`. -- `POST /api/chat/respond` validates and propagates 120K-bounded `maxTokens` into default async generation. -- Default router uses model streaming and writes incremental assistant content updates observable through existing `/api/chat/events/:sessionId` flow. -- `POST /api/v1/platform/messages` and `PATCH /api/v1/platform/messages/:messageId` reject payload text beyond 120K. -- Updated route tests pass for changed behavior and thresholds. diff --git a/docs/plans/2026-04-22-03-55-UTC-agent-bot-sidebar-implementation.md b/docs/plans/2026-04-22-03-55-UTC-agent-bot-sidebar-implementation.md deleted file mode 100644 index c2e922eb..00000000 --- a/docs/plans/2026-04-22-03-55-UTC-agent-bot-sidebar-implementation.md +++ /dev/null @@ -1,36 +0,0 @@ -# Background -根据已完成的 Agent/BOT 方案文档,当前需要把“侧边栏 Agent 分组默认可见内建 BOT、并支持配置入口”落地到代码,而不是仅停留在计划层。 - -# Goals -1. 在未创建自定义 Agent 时,侧边栏仍展示内建 Agent(BOT)。 -2. 将“配置”按钮从占位提示改为可执行入口。 -3. 在侧边栏区分内建与自定义 Agent。 - -# Implementation Plan (phased) -## Phase 1 - 内建 BOT 注册 -- 新增 `chat_builtin_agents.dart`,提供 4 个内建 Agent 模板: - - doc-writer - - easy-qa - - survey-designer - - kids-workbook - -## Phase 2 - 合并加载与运行时接入 -- `ChatScreen` 在读取自定义 Agent 后,与内建 Agent 合并。 -- 保持自定义 Agent 优先(同名覆盖内建)。 -- 继续复用现有 `_settingsForAgent`,使 system prompt / model 流程保持兼容。 - -## Phase 3 - 侧边栏展示与配置入口 -- 扩展 `ChatAgentItem` 支持 `description` 与 `isBuiltIn`。 -- 侧边栏 Agent 列表展示来源标签(内建/自定义),内建显示只读图标。 -- 将“配置”按钮行为改为触发 `manageAgents` 动作,接入 `AgentsScreen`。 - -## Phase 4 - 测试与代码地图 -- 更新 `chat_navigation_page_test.dart` 覆盖新交互。 -- 新增 `chat_builtin_agents_test.dart` 覆盖内建模板存在性。 -- 同步更新 `docs/code_maps/feature_map.yaml` 与 `docs/code_maps/logic_map.yaml`。 - -# Acceptance Criteria -1. 侧边栏 Agents 分组在默认安装场景下不为空。 -2. 点击“配置”可进入 Agent 管理流程。 -3. 侧边栏可看到内建/自定义区分信息。 -4. 相关 Flutter 测试通过。 diff --git a/docs/plans/2026-04-22-07-20-UTC-chat-agent-ui-adjustments.md b/docs/plans/2026-04-22-07-20-UTC-chat-agent-ui-adjustments.md deleted file mode 100644 index 722c4ea2..00000000 --- a/docs/plans/2026-04-22-07-20-UTC-chat-agent-ui-adjustments.md +++ /dev/null @@ -1,38 +0,0 @@ -# Chat Agent UI Adjustments Plan - -## Background -The chat UI currently supports `@agent` mention insertion inside the composer text field and shows an Agents section in the sidebar with a group-level configuration button. The requested behavior is to remove composer `@` mention mechanics, associate `@` visibility with router selection in the action row, and update sidebar agent interactions to focus on per-agent prompt preview plus explicit actions. - -## Goals -1. Remove `@` mention parsing/insertion and `@` hint text from the composer input area. -2. Show an `@` marker next to the router action only when the effective route is the default route. -3. Remove the sidebar Agents group-level config button. -4. Make each sidebar agent row open a prompt preview page with two actions: - - 修改配置 (navigates to existing manage-agents configuration page) - - 发起对话 (selects this agent for the current conversation) -5. Keep current chat/channel behavior intact. - -## Implementation Plan (phased) -### Phase 1: Composer behavior and layout -- Refactor `ComposerBar` to remove mention state, filtering, insertion logic, and mention popup rendering. -- Adjust input hint and icon behavior to avoid embedding `@` in text field UX. -- Add a new boolean prop controlling whether an `@` marker is rendered between router and config buttons. - -### Phase 2: Sidebar agent interaction flow -- Extend sidebar agent item model to carry prompt content. -- Remove the Agents header config button. -- Add per-agent tap behavior to open a prompt detail screen. -- Implement prompt detail screen with two bottom actions: 修改配置 and 发起对话. - -### Phase 3: Chat screen wiring and regression checks -- Wire `showRouteAtMarker` to router effective state in `ChatScreen`. -- Wire sidebar callbacks for opening configuration and selecting active agent from prompt detail action. -- Run targeted Dart/Flutter analysis/tests for touched chat widgets. - -## Acceptance Criteria -- Composer input no longer auto-detects `@` mentions and no mention dropdown appears while typing. -- Composer hint text contains no `@` symbol. -- When effective router is default, an `@` marker appears to the right of the router button and left of the config button; it is hidden on non-default router. -- Sidebar Agents section has no header-level config button. -- Tapping an agent in sidebar opens a prompt page that displays prompt text and includes buttons: 修改配置 and 发起对话. -- 修改配置 opens the existing agent configuration flow; 发起对话 sets the active chat agent. diff --git a/docs/plans/2026-04-22-07-55-UTC-remove-top-active-agents-indicator.md b/docs/plans/2026-04-22-07-55-UTC-remove-top-active-agents-indicator.md deleted file mode 100644 index bd52a1d7..00000000 --- a/docs/plans/2026-04-22-07-55-UTC-remove-top-active-agents-indicator.md +++ /dev/null @@ -1,23 +0,0 @@ -# Remove Top Active Agents Indicator Plan - -## Background -After the previous UI adjustment, the chat page still renders a top horizontal participant indicator (`_buildActiveAgentsIndicator`) under the AppBar. Product feedback requests removing this list entirely. - -## Goals -1. Remove the top participant indicator from the chat page UI. -2. Keep chat routing, sending, and sidebar agent interactions unchanged. -3. Ensure code and tests remain healthy after cleanup. - -## Implementation Plan (phased) -### Phase 1: UI cleanup -- Remove AppBar `bottom` usage that mounts `_buildActiveAgentsIndicator`. -- Delete `_buildActiveAgentsIndicator` helper if no longer referenced. - -### Phase 2: Validation -- Run Flutter analyze for `chat_screen.dart`. -- Run focused widget tests to ensure no regressions in chat navigation/composer surfaces. - -## Acceptance Criteria -- Chat page no longer displays the top horizontal active-agent indicator bar. -- AppBar layout remains stable and chat page renders without runtime/layout errors. -- Analysis/tests for touched chat files pass. diff --git a/docs/plans/2026-04-22-08-08-UTC-openclaw-plugin-publish-plan.md b/docs/plans/2026-04-22-08-08-UTC-openclaw-plugin-publish-plan.md deleted file mode 100644 index af6fb50e..00000000 --- a/docs/plans/2026-04-22-08-08-UTC-openclaw-plugin-publish-plan.md +++ /dev/null @@ -1,93 +0,0 @@ -# OpenClaw plugin publish plan - -## Background - -The Bricks OpenClaw plugin currently works as an in-repo local plugin under -`apps/node_openclaw_plugin`, but the goal is to publish it for external -OpenClaw users. - -OpenClaw community plugin discovery works through: - -- `openclaw plugins install ` with **ClawHub first, then npm** -- explicit ClawHub installs via `openclaw plugins install clawhub:` -- local path / linked installs for development only - -ClawHub is the canonical community discovery surface for OpenClaw plugins, but -npm is also a supported install source and automatic fallback. - -## Goals - -- Make the Bricks plugin installable by outside OpenClaw users with a single - command. -- Decide the publish path: npm only vs npm + ClawHub. -- Close the packaging gaps between the current repo-local plugin package and a - real public plugin release. -- Validate the published artifact from a fresh OpenClaw install flow. - -## Implementation Plan - -### Phase 1: Decide the public distribution target - -- Prefer **npm + ClawHub**: - - npm provides a standard public package artifact - - ClawHub improves discoverability and is the canonical community listing -- Pick the final public package name and plugin branding. -- Confirm whether the public plugin id stays `dev-askman-bricks` or should be - renamed before first public release. - -### Phase 2: Make the package publishable - -- Remove `private: true` from `apps/node_openclaw_plugin/package.json`. -- Add public release metadata if missing: - - `license` - - `repository` - - `homepage` - - `bugs` - - optional `keywords` -- Ensure the npm tarball includes built runtime files and manifest files. -- Add/verify `openclaw` package metadata required for packaged plugin - distribution, especially: - - built runtime entrypoints - - compatibility metadata for ClawHub / packaged plugin validation -- Review whether repo-local-only install hints such as `openclaw.install.localPath` - should remain, be adjusted, or be removed for the public package. - -### Phase 3: Make the artifact release-safe - -- Ensure `npm run build` produces the files referenced by package metadata. -- Run plugin validation: - - `cd apps/node_openclaw_plugin && npm test` - - `cd apps/node_openclaw_plugin && npm run type-check` - - `cd apps/node_openclaw_plugin && npm run build` -- Run a local package dry run: - - `npm pack` -- Inspect the tarball contents to confirm `dist/*`, `openclaw.plugin.json`, and - package metadata are present. - -### Phase 4: Publish - -- Publish to npm first: - - `npm publish --access public` -- Publish to ClawHub after npm or directly from source using: - - `clawhub package publish ` - - use `--dry-run` first -- Keep the GitHub repo public and link it from the package metadata/docs. - -### Phase 5: Verify the real external-user flow - -- In a clean OpenClaw profile or clean machine, test: - - `openclaw plugins install ` - - `openclaw plugins inspect ` - - `openclaw plugins enable ` if needed - - `openclaw configure` / channel onboarding for the Bricks config -- Confirm gateway startup and plugin load behavior from logs. -- Confirm the plugin can be updated later via: - - `openclaw plugins update ` - -## Acceptance Criteria - -- External users can install the plugin without cloning this repository. -- `openclaw plugins install ` works from a clean environment. -- The published artifact contains built runtime files and valid OpenClaw plugin - metadata. -- The plugin is discoverable at least on npm, and ideally also on ClawHub. diff --git a/docs/plans/2026-04-22-08-22-UTC-openclaw-plugin-publish-prep-skill.md b/docs/plans/2026-04-22-08-22-UTC-openclaw-plugin-publish-prep-skill.md deleted file mode 100644 index 296bc11f..00000000 --- a/docs/plans/2026-04-22-08-22-UTC-openclaw-plugin-publish-prep-skill.md +++ /dev/null @@ -1,46 +0,0 @@ -# OpenClaw plugin publish prep skill - -## Background - -The user wants a reusable repository-local skill that future Codex runs can use -to prepare `apps/node_openclaw_plugin` for public release. The immediate output -should not be the code changes themselves, but a stable skill that captures the -locked product decisions, the release-prep scope, a PRD-style prompt, and the -manual publish steps that a human operator must execute later. - -## Goals - -- Add a `.codex/skills` entry for OpenClaw plugin public-release preparation. -- Capture the locked product decisions: - - distribution is npm + ClawHub - - plugin id remains `dev-askman-bricks` - - final publish is manual -- Include a PRD-style prompt that can be pasted into Codex. -- Include explicit manual publish and verification commands so the operator does - not forget them. -- Surface the new skill from `AGENTS.md`. - -## Implementation Plan - -### Phase 1: Add the skill - -- Create `.codex/skills/openclaw-plugin-publish-prep/SKILL.md`. -- Document when to use it, what decisions are locked, and what work is in scope. -- Include the PRD-style prompt inside the skill. - -### Phase 2: Surface it in repository guidance - -- Update `AGENTS.md` so future agents know to use the new skill first when the - task is preparing `apps/node_openclaw_plugin` for external release. - -### Phase 3: Keep the human handoff explicit - -- Write the manual npm publish, ClawHub publish, and clean-install verification - steps directly into the skill. - -## Acceptance Criteria - -- A new skill exists at `.codex/skills/openclaw-plugin-publish-prep/SKILL.md`. -- The skill includes a concrete PRD-style prompt. -- The skill explicitly states that final publish remains a manual human step. -- `AGENTS.md` points future agents to the new skill. diff --git a/docs/plans/2026-04-22-08-41-UTC-rate-limit-global-optimization.md b/docs/plans/2026-04-22-08-41-UTC-rate-limit-global-optimization.md deleted file mode 100644 index ff612732..00000000 --- a/docs/plans/2026-04-22-08-41-UTC-rate-limit-global-optimization.md +++ /dev/null @@ -1,47 +0,0 @@ -# Background - -The backend currently applies a coarse global limiter to all `/api/*` routes (`100 requests / 15 minutes / IP`). This can over-throttle authenticated traffic such as `GET /api/config?category=llm`, especially when upstream gateway rate limiting already exists. Chat and platform routes also maintain route-specific limiters, creating mixed and hard-to-reason behavior. - -# Goals - -1. Remove the global `/api/*` limiter. -2. Keep `GET /api/config` without app-layer limiting (rely on gateway). -3. Add config write limiter: `60 requests / minute / user`. -4. Add anonymous auth limiter: `20~30 requests / minute / IP` (implement as `30/min/IP` initial policy). -5. Unify chat and platform route-level limits to `120 requests / minute` to simplify policy while protecting DB from high-frequency bursts. - -# Implementation Plan (phased) - -## Phase 1: App-level routing and limiter wiring -- Remove global limiter middleware from `apps/node_backend/src/app.ts`. -- Add dedicated auth limiter middleware mounted on auth routes only. -- Keep existing routing structure (`/api/auth` and `/api` mounts for auth router). - -## Phase 2: Config route limiter -- In `apps/node_backend/src/routes/config.ts`, introduce a write limiter applied only to `POST/PUT/PATCH/DELETE` handlers. -- Key by authenticated `userId` (fallback to IP if absent for safety). -- Leave `GET /api/config` unthrottled at app layer. - -## Phase 3: Chat + platform policy unification -- Update chat constants so sync/respond/events all use `120 requests/minute`. -- Update platform defaults so read/write/events-stream all use `120 requests/minute`. -- Keep keying strategies unchanged (chat: user+session, platform: plugin+user/IP). - -## Phase 4: Test updates and verification -- Update tests that assumed global limiter behavior. -- Add/adjust tests to validate: - - config GET not blocked by app limiter. - - config writes are limited per-user. - - auth endpoints are rate limited by IP. - - chat/platform still enforce route-level 429 behavior with unified policy defaults. - -## Phase 5: Code map sync -- Review and update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` for policy/index changes related to backend auth and backend chat/platform behavior. - -# Acceptance Criteria - -1. Repeated requests to `/api/config?category=llm` no longer receive the prior global-IP 429 from app-layer limiter under normal authenticated usage. -2. `POST/PUT/DELETE /api/config*` are limited to `60/min/user`. -3. Auth anonymous endpoints are limited to `30/min/IP`. -4. Chat and platform default route limits are each `120/min` across their route-specific limiters. -5. Node backend unit tests pass for updated limiter behavior. diff --git a/docs/plans/2026-04-22-09-22-UTC-openclaw-plugin-public-release-final.md b/docs/plans/2026-04-22-09-22-UTC-openclaw-plugin-public-release-final.md deleted file mode 100644 index 5dbb4559..00000000 --- a/docs/plans/2026-04-22-09-22-UTC-openclaw-plugin-public-release-final.md +++ /dev/null @@ -1,92 +0,0 @@ -# OpenClaw plugin public release final plan - -## Background - -`apps/node_openclaw_plugin` is being prepared for external distribution to -OpenClaw users. Product decisions are finalized: - -- Distribution target: npm + ClawHub -- Canonical OpenClaw plugin id remains: `dev-askman-bricks` -- npm package name for public install: `@askman-dev/bricks-openclaw-plugin` -- Final registry publication is a manual operator step (no auto publish) - -The plugin should be installable through standard OpenClaw package flow without -requiring repository cloning. - -## Goals - -1. Keep package metadata in a publishable state for npm + ClawHub. -2. Keep OpenClaw runtime metadata aligned to built `dist/*` entrypoints for - packaged installs. -3. Keep release-facing documentation aligned to the final public package name - and external install/config/update flow. -4. Keep release validation commands and manual publish handoff explicit. - -## Implementation Plan (phased) - -### Phase 1: Public package metadata and identity - -- Ensure `apps/node_openclaw_plugin/package.json` stays public publishable: - - package name `@askman-dev/bricks-openclaw-plugin` - - no `private: true` - - release metadata (`license`, `repository`, `homepage`, `bugs`, `keywords`) - - packaging controls (`files`, `exports`) -- Keep `apps/node_openclaw_plugin/package-lock.json` root package identity - consistent with `package.json`. - -### Phase 2: OpenClaw packaged-install metadata - -- Preserve plugin/channel identity as `dev-askman-bricks`. -- Keep OpenClaw metadata pointing to built runtime outputs (`dist/*`). -- Keep packaged install preference (`openclaw.install.defaultChoice=package`). -- Preserve native plugin manifest inclusion (`openclaw.plugin.json`) in package - artifact. - -### Phase 3: External-user documentation - -- Keep `apps/node_openclaw_plugin/README.md` aligned to public package flow: - - install: `openclaw plugins install @askman-dev/bricks-openclaw-plugin` - - onboarding/configure steps - - update flow - - troubleshooting notes - - clear separation from local dev-only install workflow - -### Phase 4: Validation and artifact inspection - -Run and record: - -- `cd apps/node_openclaw_plugin && npm test` -- `cd apps/node_openclaw_plugin && npm run type-check` -- `cd apps/node_openclaw_plugin && npm run build` -- `cd apps/node_openclaw_plugin && npm pack` -- inspect tarball contents and confirm: - - `dist/*` - - `openclaw.plugin.json` - - `package.json` - - `README.md` - -### Phase 5: Manual operator handoff (explicit) - -Do not auto-publish from agent flow. Human operator runs: - -- npm publish: - - `cd apps/node_openclaw_plugin && npm publish --access public` -- ClawHub publish: - - `clawhub package publish apps/node_openclaw_plugin --dry-run` - - `clawhub package publish apps/node_openclaw_plugin` -- clean-install verification: - - `openclaw plugins install @askman-dev/bricks-openclaw-plugin` - - `openclaw plugins inspect dev-askman-bricks` - - `openclaw configure` - - `openclaw gateway restart` - - `openclaw plugins update dev-askman-bricks` - -## Acceptance Criteria - -- Public package identity is finalized as - `@askman-dev/bricks-openclaw-plugin`. -- Plugin id remains `dev-askman-bricks`. -- Packaged artifact includes built runtime files and plugin manifest. -- README/install commands match the final public package name. -- Manual npm + ClawHub publication and clean-install verification commands are - explicitly documented. diff --git a/docs/plans/2026-04-22-09-24-UTC-chat-web-build-fix.md b/docs/plans/2026-04-22-09-24-UTC-chat-web-build-fix.md deleted file mode 100644 index e6972d08..00000000 --- a/docs/plans/2026-04-22-09-24-UTC-chat-web-build-fix.md +++ /dev/null @@ -1,23 +0,0 @@ -# Chat web build fix plan - -## Background -The mobile chat app web build currently fails during dart2js compilation with errors in chat navigation and chat screen code. Reported failures include a missing required `prompt` parameter when constructing `ChatAgentItem`, a list type mismatch for mapped agent items, and missing `_openClawSlashCommands` / `_currentComposerModelLabel` members in `_ChatScreenState`. - -## Goals -- Restore a successful web compile for `apps/mobile_chat_app`. -- Ensure chat navigation agent construction matches current model signatures. -- Ensure chat screen references only defined state fields/methods. -- Keep behavior coherent for OpenClaw and non-OpenClaw chat contexts. - -## Implementation Plan (phased) -1. Inspect the relevant Dart files and model definitions to identify signature and type expectations. -2. Patch `chat_navigation_page.dart` to provide required fields and resolve list typing. -3. Patch `chat_screen.dart` to replace/restore missing members for slash commands and composer model labels. -4. Run bootstrap (`./tools/init_dev_env.sh`) and then targeted verification commands from the correct package directory. -5. If functionality changed, evaluate and update code maps; otherwise document why updates are unnecessary. - -## Acceptance Criteria -- `flutter` analysis/build checks for `apps/mobile_chat_app` no longer report the listed compile errors. -- `ChatAgentItem` construction includes required named parameters expected by the current type. -- `_ChatScreenState` has valid references for slash command source and composer model label. -- Any code map update decision is documented in the final report. diff --git a/docs/plans/2026-04-22-09-49-UTC-pr-chat-ui-check.md b/docs/plans/2026-04-22-09-49-UTC-pr-chat-ui-check.md deleted file mode 100644 index b2f9969c..00000000 --- a/docs/plans/2026-04-22-09-49-UTC-pr-chat-ui-check.md +++ /dev/null @@ -1,31 +0,0 @@ -# Background -用户怀疑某个 PR 导致聊天界面相关代码丢失,需要核对并修复两处交互: -1) 对话界面顶部不应展示参与者列表。 -2) 输入框内/前不应出现 @;@ 只与路由选择关联,当选中默认路由时,@ 显示在路由按钮右侧(配置按钮左侧)。 - -# Goals -- 确认当前实现是否满足上述两条要求。 -- 若不满足,完成最小改动修复并补充/更新测试。 -- 运行相关检查,确保改动可验证。 - -# Implementation Plan (phased) -## Phase 1: 代码定位与现状核对 -- 定位聊天页面顶部参与者列表渲染逻辑。 -- 定位输入框与路由选择区域中 @ 相关渲染逻辑。 -- 记录与需求不一致点。 - -## Phase 2: 实现修复 -- 移除/隐藏顶部参与者列表显示。 -- 调整 @ 的展示位置与触发条件: - - 输入框内/前不展示 @。 - - 默认路由选中时,在路由按钮右侧展示 @(且位于配置按钮左侧)。 - -## Phase 3: 验证与收尾 -- 运行格式化/分析/测试(至少覆盖受影响模块)。 -- 检查是否需要更新代码地图(docs/code_maps/*),并据实更新或在最终说明给出理由。 - -# Acceptance Criteria -- 聊天界面顶部不再显示参与者列表。 -- 输入框内及其左侧前缀区域不再出现 @。 -- 仅当路由选择为默认路由时,@ 显示在路由按钮右侧、配置按钮左侧。 -- 相关测试通过,或明确说明受环境限制的检查项。 diff --git a/docs/plans/2026-04-22-10-19-UTC-openclaw-route-actions-and-sidebar-groups.md b/docs/plans/2026-04-22-10-19-UTC-openclaw-route-actions-and-sidebar-groups.md deleted file mode 100644 index cac16b70..00000000 --- a/docs/plans/2026-04-22-10-19-UTC-openclaw-route-actions-and-sidebar-groups.md +++ /dev/null @@ -1,32 +0,0 @@ -# OpenClaw route actions and sidebar groups plan - -## Background -The chat composer and navigation drawer currently do not fully satisfy route-aware interaction requirements. In particular, the `@` action is non-interactive in default route mode, OpenClaw route-specific command presets are not populated, and the sidebar lacks a dedicated Skills group above Agents. - -## Goals -1. Make route-linked composer actions behaviorally correct for `default` and `openclaw` routes. -2. Ensure OpenClaw slash command presets are available from official OpenClaw docs and selectable in UI. -3. Add a Skills section above Agents in the sidebar (empty state for now). -4. Cover the updated behavior with widget tests. -5. Keep code maps aligned with changed user-facing behavior. - -## Implementation Plan (phased) -1. **Composer route actions** - - Add explicit at-menu support in `ComposerBar` with route-specific menu content. - - Wire default route `@` menu to existing agents list. - - Wire OpenClaw `@` menu to a placeholder empty menu item (`待实现`). -2. **OpenClaw slash commands** - - Populate a curated static slash command list in `chat_screen.dart` based on OpenClaw official slash commands documentation. - - Keep current insert-on-select behavior in composer unchanged. -3. **Sidebar grouping** - - Add a Skills section above Agents in `ChatNavigationPage` with an empty-state row. -4. **Validation & docs sync** - - Add/adjust widget tests for composer and navigation groups. - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` to reflect new visible behavior and risks. - -## Acceptance Criteria -- In `openclaw` route, composer shows both `/` slash command action and clickable `@` action; clicking `@` opens a dropdown with `待实现` placeholder. -- In `default` route, composer shows clickable `@` action and dropdown items match available agents used by sidebar Agents section. -- Sidebar shows a Skills section above Agents with empty content state. -- Widget tests pass for the new composer and sidebar behaviors. -- Code maps are updated to reflect the new route/action behavior. diff --git a/docs/plans/2026-04-22-19-08-UTC-ios-build-enablement-implementation.md b/docs/plans/2026-04-22-19-08-UTC-ios-build-enablement-implementation.md deleted file mode 100644 index d1c43e73..00000000 --- a/docs/plans/2026-04-22-19-08-UTC-ios-build-enablement-implementation.md +++ /dev/null @@ -1,154 +0,0 @@ -# iOS build enablement implementation - -## Problem - -`apps/mobile_chat_app` needs a first-class iOS host project. A Flutter app's -Dart code is not sufficient by itself for iOS builds; the Flutter tool also -needs an Xcode project, a Runner target, CocoaPods integration, build -configuration files, and app metadata. If the `ios/` directory is missing, -`flutter build ios` fails structurally before normal compilation even begins. - -## Implementation principles - -- Restore a standard Flutter iOS host project for the app package instead of - inventing a custom layout. -- Keep machine-specific signing data out of committed project files. -- Put shared defaults in versioned xcconfig files and allow local overrides for - device signing. -- Validate simulator, device, and launch-mode behavior separately because they - exercise different parts of the iOS toolchain. - -## Technical approach - -### 1. Restore the iOS host project - -Create the missing `apps/mobile_chat_app/ios/` project using the standard -Flutter iOS structure for the current app package. The restored project needs -the usual Flutter iOS pieces: - -- `ios/Podfile` -- `ios/Runner.xcodeproj` -- `ios/Runner.xcworkspace` -- `ios/Runner/Info.plist` -- `ios/Runner/AppDelegate.swift` -- app assets, storyboards, and the test target scaffold - -This step solves the root structural problem: without the host project, Flutter -cannot invoke Xcode for iOS at all. - -### 2. Define app identity in shared project files - -Set the visible app name and bundle-related settings in the committed iOS -project so every contributor builds the same app identity by default. In this -project that means: - -- the display name should be `Bricks` -- the iOS bundle identifier should resolve from shared build settings - -`Info.plist` should keep using build variables such as -`$(PRODUCT_BUNDLE_IDENTIFIER)` rather than embedding local machine values. - -### 3. Use xcconfig indirection for signing and bundle settings - -The committed Xcode project should not hardcode a contributor's Apple team or -local signing state. Instead: - -- `ios/Flutter/Debug.xcconfig` -- `ios/Flutter/Release.xcconfig` - -should define shared keys such as: - -- `APP_BUNDLE_IDENTIFIER` -- `APP_DEVELOPMENT_TEAM` - -and optionally include a local override file: - -- `#include? "Local.xcconfig"` - -Then `ios/Runner.xcodeproj/project.pbxproj` should read: - -- `PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)"` -- `DEVELOPMENT_TEAM = "$(APP_DEVELOPMENT_TEAM)"` - -This keeps the committed project portable while still allowing local real-device -signing. - -### 4. Keep local signing config out of version control - -If a developer needs real-device deployment, they can create -`ios/Flutter/Local.xcconfig` on their machine with their own team identifier and -any local bundle override. That file is local operational state, not shared -source code, so it should not be committed. - -This split is the cleanest implementation pattern: - -- committed files describe how the project is built -- local override files describe who is signing it on one machine - -### 5. Let Flutter regenerate ephemeral iOS build files - -Generated Flutter iOS files such as these should remain uncommitted: - -- `ios/Flutter/Generated.xcconfig` -- `ios/Flutter/flutter_export_environment.sh` -- `ios/Flutter/ephemeral/` -- `ios/Pods/` -- `ios/.symlinks/` - -They are derived from `flutter pub get`, CocoaPods resolution, and local build -state. The repository should keep only the stable project definition, not the -generated outputs. - -### 6. Validate the build in layers - -Use staged validation rather than jumping directly to device install: - -1. Bootstrap the workspace: - - `./tools/init_dev_env.sh --no-doctor` -2. Verify the iOS project structure with a simulator build: - - `cd apps/mobile_chat_app && flutter build ios --simulator --debug` -3. Verify device compilation without requiring final signing: - - `cd apps/mobile_chat_app && flutter build ios --debug --no-codesign` -4. Verify the app logic still passes tests: - - `cd apps/mobile_chat_app && flutter test` -5. Verify native launch behavior with a release build: - - `cd apps/mobile_chat_app && flutter clean && flutter pub get && flutter build ios --release` - -This order isolates structural issues, Pod integration issues, signing issues, -and runtime launch issues more cleanly. - -## Launch-mode note - -On iOS, a Flutter `debug` build is not equivalent to a normal distributable app -build. A debug build expects Flutter tooling or Xcode to be attached. That -means: - -- `debug` is appropriate for `flutter run` / Xcode debugging -- `release` or `profile` is required for normal home-screen/native launch - -So if an app installs successfully but crashes when launched directly from the -phone, launch mode must be checked before assuming there is an application logic -bug. - -## Commit boundary - -Commit: - -- `apps/mobile_chat_app/.metadata` -- shared files under `apps/mobile_chat_app/ios/` - -Do not commit: - -- `apps/mobile_chat_app/ios/Flutter/Local.xcconfig` -- `apps/mobile_chat_app/ios/Pods/` -- `apps/mobile_chat_app/ios/.symlinks/` -- `apps/mobile_chat_app/ios/Flutter/Generated.xcconfig` -- `apps/mobile_chat_app/ios/Flutter/flutter_export_environment.sh` -- other generated or machine-specific files - -## Result - -The correct implementation is not "copy another app." The correct implementation -is to restore the standard Flutter iOS host project, parameterize signing -through xcconfig indirection, keep local credentials out of Git, and validate -simulator, device, and release launch paths independently. diff --git a/docs/plans/2026-04-23-03-37-UTC-node-management-token-ui.md b/docs/plans/2026-04-23-03-37-UTC-node-management-token-ui.md deleted file mode 100644 index ed2fcb7d..00000000 --- a/docs/plans/2026-04-23-03-37-UTC-node-management-token-ui.md +++ /dev/null @@ -1,33 +0,0 @@ -# Background -The settings area currently exposes both a Node Management entry and a separate Openclaw Token entry. The user asked to verify whether token generation outputs are equivalent and reusable, then remove duplicate token-generation entry points if redundant. The user also requested Node Management UX updates: move the add-node action to the AppBar top-right using icon + text, and switch Node Management copy to English. - -# Goals -1. Verify whether token generation from Node Management and Openclaw Token page uses the same backend/service logic and whether outputs are interchangeable. -2. Remove duplicate Openclaw Token generation entry point from settings if redundant, preserving Node Management flow. -3. Move Node Management “add node” action to AppBar right side with icon + text. -4. Convert Node Management related UI copy to English. -5. Run targeted validation and summarize whether code maps require updates. - -# Implementation Plan (phased) -## Phase 1: Discovery and equivalence audit -- Locate settings route definitions and both token-generation entry points. -- Trace service calls for token generation (API endpoints, payloads, and UI wiring) to confirm equivalence/reuse. -- Record findings in final summary. - -## Phase 2: UI and navigation changes -- Remove/disable Settings list tile that navigates to standalone Openclaw Token page if duplicate. -- Ensure Node Management remains the canonical path to token generation. -- Update Node Management screen AppBar action to include an icon + text add-node button on the right. -- Translate Node Management-related labels/buttons/messages into English. - -## Phase 3: Validation and docs alignment -- Run required bootstrap script and targeted Flutter checks/tests relevant to touched package. -- Review code map files and update if feature entry/logic index changed. -- Prepare concise change notes and verification results. - -# Acceptance Criteria -- Settings no longer offers duplicate Openclaw Token generation entry if Node Management uses the same token generation logic. -- Token generation from Node Management produces output consistent with prior Openclaw token generation behavior (same data shape and intended use). -- Node Management screen shows add action in AppBar top-right with icon + text. -- Node Management visible copy is English. -- Validation commands complete successfully (or limitations are documented). diff --git a/docs/plans/2026-04-23-10-45-WIB-ios-github-login-fix.md b/docs/plans/2026-04-23-10-45-WIB-ios-github-login-fix.md deleted file mode 100644 index 636e5086..00000000 --- a/docs/plans/2026-04-23-10-45-WIB-ios-github-login-fix.md +++ /dev/null @@ -1,60 +0,0 @@ -# iOS GitHub login fix - -## Background - -The Flutter web app can start GitHub OAuth through `/api/auth/github`, and the -backend callback writes the resulting JWT into browser storage before returning to -the app. The iOS build currently compiles the same login screen, but the GitHub -button uses the non-web stub implementation, which returns `null` and produces no -visible action. - -## Goals - -- Make the iOS GitHub button open the existing backend OAuth flow. -- Allow the backend to redirect successful native logins back to the app through a - constrained custom URL scheme. -- Persist the returned JWT through the existing `AuthService` storage path. -- Preserve the current Flutter web OAuth behavior. - -## Implementation Plan (phased) - -### Phase 1: Add native OAuth launch and callback handling - -- Add mobile dependencies for launching browser URLs and listening for app links. -- Add a non-web GitHub OAuth implementation that opens the backend auth URL with a - native `return_to` target. -- Add a native OAuth callback helper that listens for `bricks://auth/github/callback` - links, extracts `auth_token`, and returns it to the login button. -- Surface a visible login failure message instead of silently returning to idle. - -### Phase 2: Configure iOS URL routing - -- Register the `bricks` URL scheme in `ios/Runner/Info.plist`. -- Keep storage identity (`auth_token`) separate from the visible login button label. - -### Phase 3: Update backend return target validation - -- Extend `isAllowedReturnTo` to allow only the expected native callback target: - `bricks://auth/github/callback`. -- Keep web return targets restricted to the existing HTTPS rules. -- Add backend tests for allowed/rejected native callback values. - -### Phase 4: Validate - -- Run `./tools/init_dev_env.sh` before Flutter checks. -- Run `cd apps/mobile_chat_app && flutter test`. -- Run `cd apps/mobile_chat_app && flutter analyze`. -- Run relevant backend tests for auth return target behavior. - -## Acceptance Criteria - -- Tapping "Continue with GitHub" in an iOS build opens the GitHub OAuth browser - flow through the backend. -- A successful OAuth callback to `bricks://auth/github/callback` saves the JWT under - the existing `auth_token` key. -- After token persistence, the app navigates to `ChatScreen`. -- Failed or cancelled login leaves the user on `LoginScreen` with a visible message. -- Web OAuth still starts from `/api/auth/github?return_to=...` and continues to use - the existing browser redirect behavior. -- Backend return URL validation rejects arbitrary non-HTTPS schemes and only allows - the expected native callback target. diff --git a/docs/plans/2026-04-23-11-27-WIB-node-token-copy-openclaw-commands.md b/docs/plans/2026-04-23-11-27-WIB-node-token-copy-openclaw-commands.md deleted file mode 100644 index 7f95156c..00000000 --- a/docs/plans/2026-04-23-11-27-WIB-node-token-copy-openclaw-commands.md +++ /dev/null @@ -1,68 +0,0 @@ -# Node token copy OpenClaw commands - -## Background - -The Nodes settings screen can create node-scoped platform tokens for OpenClaw -plugin installations. Its current copy text is a human-readable summary with -Node, Plugin ID, Base URL, Scopes, and Token fields. Users still need to -manually translate that summary into OpenClaw CLI commands before configuring -the plugin. - -OpenClaw 2026.4.15 supports targeted non-interactive configuration through -`openclaw config set`, which lets users configure only the Bricks channel -without running the broad `openclaw configure` flow. - -## Goals - -- Make the Nodes token copy action produce commands that can be pasted directly - into a shell. -- Configure only `channels.dev-askman-bricks`. -- Preserve the generated token, plugin id, and base URL from the backend token - bundle. -- Keep the copy flow simple and user-observable. - -## Implementation Plan (phased) - -### Phase 1: Command generation - -- Replace the Nodes screen install summary with a shell command block. -- Use: - - `openclaw config set channels.dev-askman-bricks.BRICKS_BASE_URL ...` - - `openclaw config set channels.dev-askman-bricks.BRICKS_PLUGIN_ID ...` - - `openclaw config set channels.dev-askman-bricks.BRICKS_PLATFORM_TOKEN ...` - - `openclaw config validate` - - `openclaw gateway restart` - - `openclaw plugins inspect dev-askman-bricks` -- Quote shell values safely for pasted command execution. - -### Phase 2: UI copy text - -- Keep the generated command block visible after token generation. -- Change the copy button label and success message to reflect that commands are - copied, not generic install information. - -### Phase 3: Tests and validation - -- Update the Nodes settings widget test so token generation shows OpenClaw - commands. -- Add clipboard assertion that the copied text contains executable - `openclaw config set` commands with the generated token bundle values. - -Validation commands: - -```bash -./tools/init_dev_env.sh -cd apps/mobile_chat_app -flutter test test/node_settings_screen_test.dart -flutter analyze -``` - -## Acceptance Criteria - -- After generating a node token, the Nodes screen shows paste-ready OpenClaw - commands. -- Copying the generated instructions writes those commands to the clipboard. -- The commands configure only `channels.dev-askman-bricks`. -- The copied commands include the generated base URL, plugin id, and platform - token. -- The targeted widget test passes. diff --git a/docs/plans/2026-04-23-11-29-WIB-release-api-base-url-default.md b/docs/plans/2026-04-23-11-29-WIB-release-api-base-url-default.md deleted file mode 100644 index 309c9ef5..00000000 --- a/docs/plans/2026-04-23-11-29-WIB-release-api-base-url-default.md +++ /dev/null @@ -1,47 +0,0 @@ -# Release API base URL default - -## Background - -Native app GitHub login and backend-backed chat/config calls use -`LlmConfigService.resolveBaseUrl()` to choose the API server. The existing -non-web default is `http://localhost:3000`, which is useful for local debug builds -but wrong for a release iOS app with a fixed production server. - -## Goals - -- Make release non-web builds default to `https://bricks.askman.dev`. -- Preserve explicit `BRICKS_API_BASE_URL` overrides for all build modes. -- Preserve local `http://localhost:3000` defaults for non-release development builds. -- Keep web behavior unchanged by using `Uri.base.origin`. - -## Implementation Plan (phased) - -### Phase 1: Update base URL resolution - -- Add a stable production API base URL constant. -- Update `resolveBaseUrl()` so precedence is: - 1. `BRICKS_API_BASE_URL` dart-define - 2. Web origin - 3. Native release production URL - 4. Native non-release localhost - -### Phase 2: Add focused tests - -- Add unit coverage for the default native release URL constant and current test-mode - resolution behavior. -- Keep tests independent of real network calls. - -### Phase 3: Validate - -- Run `dart format` on touched Dart files. -- Run targeted Flutter tests for LLM config/base URL behavior. -- Run `flutter analyze`. -- Re-run iOS simulator build because the GitHub OAuth native implementation consumes - this base URL. - -## Acceptance Criteria - -- A release iOS build without `BRICKS_API_BASE_URL` uses `https://bricks.askman.dev`. -- A build with `--dart-define=BRICKS_API_BASE_URL=...` uses the provided value. -- Debug/profile native builds can still use localhost by default. -- Existing web deployment behavior remains unchanged. diff --git a/docs/plans/2026-04-23-14-42-openclaw-package-metadata.md b/docs/plans/2026-04-23-14-42-openclaw-package-metadata.md deleted file mode 100644 index d5c1d68f..00000000 --- a/docs/plans/2026-04-23-14-42-openclaw-package-metadata.md +++ /dev/null @@ -1,31 +0,0 @@ -# Background - -The OpenClaw plugin package at `apps/node_openclaw_plugin/package.json` is missing ClawHub publish metadata under the `openclaw` field. ClawHub rejects the package upload when `openclaw.compat.pluginApi` and `openclaw.build.openclawVersion` are absent. - -# Goals - -1. Add the required OpenClaw publish metadata to the plugin package. -2. Align the metadata with the plugin's current OpenClaw dependency version. -3. Keep the package ready for external ClawHub publishing without changing runtime behavior. - -# Implementation Plan - -## Phase 1 - -Inspect the existing plugin package metadata and confirm the ClawHub-required `openclaw.compat` and `openclaw.build` fields from the OpenClaw docs. - -## Phase 2 - -Update `apps/node_openclaw_plugin/package.json` to add the missing compatibility and build metadata using the current OpenClaw package version as the baseline. - -## Phase 3 - -Run the existing plugin validation commands to ensure the package still builds and its tests continue to pass after the metadata-only change. - -# Acceptance Criteria - -1. `apps/node_openclaw_plugin/package.json` includes `openclaw.compat.pluginApi`. -2. `apps/node_openclaw_plugin/package.json` includes `openclaw.compat.minGatewayVersion`. -3. `apps/node_openclaw_plugin/package.json` includes `openclaw.build.openclawVersion`. -4. `apps/node_openclaw_plugin/package.json` includes `openclaw.build.pluginSdkVersion`. -5. The plugin's existing test, type-check, and build commands still complete successfully. diff --git a/docs/plans/2026-04-23-15-33-openclaw-selected-node-routing.md b/docs/plans/2026-04-23-15-33-openclaw-selected-node-routing.md deleted file mode 100644 index f4e7e436..00000000 --- a/docs/plans/2026-04-23-15-33-openclaw-selected-node-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Background - -The current OpenClaw integration supports multiple platform nodes per user, but OpenClaw-routed chat messages are not addressed to a specific node. Because `/api/v1/platform/events` currently scopes pending user messages only by user identity, multiple OpenClaw nodes can receive and respond to the same chat message. - -# Goals - -1. Route each OpenClaw chat scope to exactly one selected node. -2. Ensure only the targeted node can read and process the pending chat event. -3. Preserve backward compatibility for scopes that do not yet have an explicit node selection. -4. Keep node attribution visible in the chat experience and validated by tests. - -# Implementation Plan - -## Phase 1 - -Extend backend chat scope settings to store an optional `nodeId` for OpenClaw scopes, with migration coverage and route/service updates. - -## Phase 2 - -Update chat respond handling to accept a selected `nodeId`, resolve it to the owning platform node/plugin, and stamp OpenClaw-bound user messages with target node/plugin metadata used by platform event delivery. - -## Phase 3 - -Update platform event and message-write paths so node/plugin isolation is enforced for reads and follow-up writes. - -## Phase 4 - -Update the mobile chat UI to load available platform nodes, let the user choose the active OpenClaw node for the current scope, persist that selection through scope settings, and include it in `/api/chat/respond`. - -## Phase 5 - -Add or update backend and Flutter tests, then update the code maps because routing entry points, persisted scope behavior, and test coverage will change. - -# Acceptance Criteria - -1. OpenClaw chat scopes can persist an optional selected `nodeId` per channel or thread. -2. `/api/chat/respond` forwards OpenClaw work to only the selected node, or the default node when no selection exists. -3. `/api/v1/platform/events` returns a pending chat message only to the targeted node/plugin scope. -4. Platform message writes remain node/plugin-scoped for the targeted conversation flow. -5. The mobile chat UI exposes and persists the active OpenClaw node for the current scope. -6. Validation commands complete successfully: `cd apps/node_backend && npm test`, `./tools/init_dev_env.sh`, and `cd apps/mobile_chat_app && flutter test`. diff --git a/docs/plans/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md b/docs/plans/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md deleted file mode 100644 index 4906c7fe..00000000 --- a/docs/plans/2026-04-23-17-13-WIB-openclaw-agents-capture-display.md +++ /dev/null @@ -1,77 +0,0 @@ -# OpenClaw agents capture and display - -## Background - -The task target is to capture agents available inside OpenClaw and surface them in -the Bricks chat interaction so users can reference them during conversation. - -This work may optionally be isolated in a dedicated local worktree to avoid -interfering with other active task worktrees. - -## Goals - -- Optionally work from the dedicated worktree at `.worktree/openclaw-agents-capture-display`. -- Identify where OpenClaw internal agent metadata can be observed or queried. -- Add a reliable path to persist or expose those agents to the mobile chat app. -- Display the captured agents in the conversation UI in a way users can reference. -- Keep code maps updated if feature entries, business logic, tests, or docs change. - -## Implementation Plan (phased) - -### Phase 1: Requirements intake - -Wait for the detailed product and technical requirements, including expected agent -identity fields, source of truth, refresh behavior, and UI interaction model. - -### Phase 2: Current-flow mapping - -Inspect the OpenClaw plugin, backend platform routes, chat routing logic, and mobile -chat UI to map where agent information should enter and where it should be rendered. - -Findings: - -- The mobile composer already has a route-bound `@` menu. -- The OpenClaw route currently shows a disabled placeholder item in that menu. -- Platform node tokens already bind `userId + pluginId`, and the backend can map - that plugin ID back to a node. -- There is not yet a selected-node router state in this branch, so this change uses - the first/default platform node while keeping the API nodeId-scoped for future - selected-node routing integration. - -### Phase 3: Data contract - -Define or reuse a stable agent data contract that separates display naming from -storage identity. Include any required IDs, labels, source platform metadata, and -reference syntax. - -### Phase 4: Implementation - -Implement the smallest end-to-end path that captures OpenClaw agents and makes them -available in the chat interaction. Keep existing selected-node-routing worktree -changes isolated. - -Implemented path: - -1. Add config `GET /api/config/nodes/:nodeId/agents` for the authenticated mobile - app to read agents for the matching node. -2. For `sourcePlatform=openclaw`, resolve agents on demand via - `openclaw agents list --json` instead of backend persistence. -3. Replace the OpenClaw route `@` placeholder with reported agents and insert an - `@agentId` reference into the composer when selected. - -### Phase 5: Validation - -Run targeted tests from the relevant package directories. For mobile app Flutter -checks, run commands from `apps/mobile_chat_app` as required by `AGENTS.md`. - -## Acceptance Criteria - -- The task uses `.worktree/openclaw-agents-capture-display` and does not modify - other active worktrees. -- OpenClaw agents are captured from the agreed source of truth. -- Users can see and reference captured OpenClaw agents from the conversation - interaction. -- Agent display labels and stable storage IDs are kept separate. -- Existing OpenClaw routing and chat behavior continue to pass targeted tests. -- Code maps are updated if the implementation changes feature entries, logic - indexes, tests, or documentation indexes. diff --git a/docs/plans/2026-04-24-12-15-dispatch-avatar-placeholder.md b/docs/plans/2026-04-24-12-15-dispatch-avatar-placeholder.md deleted file mode 100644 index 7ae46fb5..00000000 --- a/docs/plans/2026-04-24-12-15-dispatch-avatar-placeholder.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -The chat UI currently marks the user message as accepted immediately after `/api/chat/respond` returns, which is correct. However, assistant identity only becomes visible once a real assistant message arrives. For async routers and model streaming, that creates a visible gap where the user knows the task was accepted but cannot yet see which assistant has taken over. - -# Goals -1. Show assistant identity as soon as backend dispatch begins, before assistant text arrives. -2. Keep the user-message acceptance checkmark driven by `/api/chat/respond`. -3. Reuse the existing SSE message pipeline instead of introducing a separate event channel. -4. Preserve stable ordering between the accepted user message and the dispatch placeholder assistant row. - -# Implementation Plan -## Phase 1 -Emit a backend-owned assistant dispatch placeholder using the existing `chat_messages` + SSE flow for both OpenClaw and default-router async execution paths. - -## Phase 2 -Render assistant dispatch placeholders in the mobile chat UI as avatar/header + processing indicator without showing an empty assistant text bubble. - -## Phase 3 -Add regression tests for backend dispatch placeholder emission, frontend ordering, and placeholder rendering behavior. Update code maps because user-visible chat behavior and test indexes change. - -# Acceptance Criteria -1. After `/api/chat/respond` returns, the user message still shows accepted state immediately. -2. Before assistant text is available, SSE can deliver a placeholder assistant row that shows the receiving assistant identity. -3. When the real assistant reply for the same `messageId` arrives, the placeholder becomes a normal assistant message instead of rendering as a separate extra row. -4. Relevant backend and Flutter tests pass. diff --git a/docs/plans/2026-04-26-00-57-switch-to-message-bubble-background-branch.md b/docs/plans/2026-04-26-00-57-switch-to-message-bubble-background-branch.md deleted file mode 100644 index 17a41cd1..00000000 --- a/docs/plans/2026-04-26-00-57-switch-to-message-bubble-background-branch.md +++ /dev/null @@ -1,34 +0,0 @@ -## Background - -The repository needs to be synced with the latest remote `main`, and the existing remote branch for message bubble color changes needs to be identified and checked out locally. - -## Goals - -- Refresh remote refs from `origin`. -- Update local `main` to match `origin/main` without overwriting unrelated local changes. -- Find the remote branch associated with message bubble color changes. -- Switch the workspace to that branch with proper tracking. - -## Implementation Plan - -### Phase 1 - -Fetch and prune remote refs from `origin` to ensure the branch list and `main` pointer are current. - -### Phase 2 - -Identify the message bubble color branch by searching remote branch names and commit subjects, then confirm the intended branch. - -### Phase 3 - -Checkout local `main`, fast-forward it to `origin/main`, and switch to the identified remote branch with tracking. - -## Acceptance Criteria - -- `origin/main` is fetched and local `main` is fast-forwarded to it. -- The remote bubble color branch is identified. -- The current checked-out branch is the local tracking branch for the bubble color change. -- Validation commands: - - `git fetch --all --prune` - - `git status --short --branch` - - `git branch -vv` diff --git a/docs/plans/2026-04-26-02-45-UTC-jump-to-latest-message.md b/docs/plans/2026-04-26-02-45-UTC-jump-to-latest-message.md deleted file mode 100644 index d96fe683..00000000 --- a/docs/plans/2026-04-26-02-45-UTC-jump-to-latest-message.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -The chat UI needs a dedicated “jump to latest message” control above the composer so users can quickly return to the newest content after scrolling upward. - -# Goals -- Add a visible, tappable control that appears when the user is away from the bottom of the message list. -- Scroll directly to the latest message area when the control is tapped. -- Cover behavior with widget tests. - -# Implementation Plan (phased) -1. **Message list behavior** - - Add scroll position tracking in `MessageList`. - - Compute whether the list is far enough from the bottom to show the jump button. - - Add a button overlay near the lower center of the message list. -2. **Interaction** - - Implement animated scroll-to-bottom behavior when the button is tapped. - - Ensure visibility state updates after auto-scroll and manual scroll. -3. **Validation** - - Add widget tests for button visibility and tap-to-jump behavior. - - Run `./tools/init_dev_env.sh` and `cd apps/mobile_chat_app && flutter test test/message_list_test.dart`. - -# Acceptance Criteria -- When the user scrolls up away from the bottom, a downward-arrow jump button appears above the composer area. -- Tapping the button scrolls to the latest message. -- The button hides again when the user is near the bottom. -- `flutter test test/message_list_test.dart` passes in `apps/mobile_chat_app`. diff --git a/docs/plans/2026-04-26-02-45-dark-theme-semantic-token-refactor.md b/docs/plans/2026-04-26-02-45-dark-theme-semantic-token-refactor.md deleted file mode 100644 index ad4a6887..00000000 --- a/docs/plans/2026-04-26-02-45-dark-theme-semantic-token-refactor.md +++ /dev/null @@ -1,35 +0,0 @@ -# Background -The chat UI dark theme currently mixes direct `ColorScheme` fields and hard-coded color values, which causes inconsistent hierarchy across user bubbles, assistant text, composer UI, and metadata. The design direction requires an X-style dark palette with semantic token usage so product surfaces remain neutral while brand blue is reserved for actionable states. - -# Goals -1. Introduce a semantic dark color token set aligned with the provided palette (pure black base, grayscale surfaces, single brand blue, isolated status colors). -2. Ensure chat components consume semantic tokens instead of raw colors or misused `colorScheme.primary` for non-brand surfaces. -3. Update key components (message list + composer) to reflect the new visual hierarchy in dark mode. -4. Keep code-map docs synchronized for changed feature logic/index references. - -# Implementation Plan (phased) -## Phase 1: Token foundation -- Update `packages/design_system/lib/src/tokens.dart` with semantic palette constants (background/surface/border/text/accent/status). -- Expand `packages/design_system/lib/src/chat_colors.dart` semantic fields to cover message/composer/meta/link/badge roles. -- Update `packages/design_system/lib/src/bricks_theme.dart` dark `ColorScheme` to keep Material base semantics minimal and consistent with the new palette. - -## Phase 2: Chat UI migration -- Refactor `apps/mobile_chat_app/lib/features/chat/widgets/message_list.dart` to consume updated `ChatColors` semantics for: - - user bubble/background/text/meta - - assistant text/meta/accent - - badge/pill styling - - markdown inline link color and code/quote container styling -- Refactor `apps/mobile_chat_app/lib/features/chat/widgets/composer_bar.dart` to use semantic composer colors for container, border, placeholder, and send/stop actions. - -## Phase 3: Validation and docs -- Run environment bootstrap and targeted Flutter checks. -- Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` to reflect token/theme and chat widget mapping changes. -- Verify YAML format and summarize regression-smoke focus. - -# Acceptance Criteria -- Dark mode uses black background + grayscale surfaces + single accent blue for interactive emphasis. -- User message bubble no longer uses Material `primary`; it uses semantic message container tokens. -- Meta text (time/thread/handle-like info) uses a unified secondary token. -- Composer default border is subtle, with stronger emphasis only on focus/action states. -- Business widgets avoid raw hex colors and direct color misuse for chat hierarchy. -- Validation commands complete successfully: `./tools/init_dev_env.sh`, `cd apps/mobile_chat_app && flutter analyze`, `npx js-yaml docs/code_maps/feature_map.yaml`, and `npx js-yaml docs/code_maps/logic_map.yaml`. diff --git a/docs/plans/2026-04-26-07-39-UTC-message-typography-placeholder.md b/docs/plans/2026-04-26-07-39-UTC-message-typography-placeholder.md deleted file mode 100644 index 84a3e1b7..00000000 --- a/docs/plans/2026-04-26-07-39-UTC-message-typography-placeholder.md +++ /dev/null @@ -1,17 +0,0 @@ -# Background -User requested two UI token adjustments in chat: increase message body typography and switch placeholder color to a white-family token from the existing design system. - -# Goals -1. Use larger text style for chat message body content. -2. Replace composer placeholder color with an existing design-system white-family semantic color. -3. Validate with focused Flutter tests. - -# Implementation Plan (phased) -1. Update message body text styles in `message_list.dart` from `bodyMedium` to `bodyLarge` (assistant and user message text). -2. Update composer placeholder semantic color in `chat_colors.dart` to use a design-system token from `AppColors` without introducing new values. -3. Run environment bootstrap and targeted tests for chat widgets. - -# Acceptance Criteria -- User and assistant message body text render using `bodyLarge` in chat message list. -- Composer placeholder no longer uses tertiary text; uses the selected white-family design-system token. -- Relevant Flutter widget tests pass. diff --git a/docs/plans/2026-04-26-07-53-UTC-conflict-sync-and-placeholder-adjustment.md b/docs/plans/2026-04-26-07-53-UTC-conflict-sync-and-placeholder-adjustment.md deleted file mode 100644 index c889cca3..00000000 --- a/docs/plans/2026-04-26-07-53-UTC-conflict-sync-and-placeholder-adjustment.md +++ /dev/null @@ -1,20 +0,0 @@ -# Background -The previous change was not accepted. We need to ensure the requested typography/token behavior remains implemented while attempting to sync with latest `main` for conflict resolution. - -# Goals -1. Attempt to sync current branch with latest remote `main`. -2. Keep chat message body on `bodyLarge`. -3. Adjust composer placeholder to the most suitable existing white-family design-system token. -4. Re-run focused tests. - -# Implementation Plan (phased) -1. Run Git remote sync commands and report any environment constraints. -2. Update `ChatColors.composerPlaceholder` to a stronger white-family semantic token from `AppColors`. -3. Verify message typography remains on `bodyLarge`. -4. Run Flutter widget tests in `apps/mobile_chat_app`. - -# Acceptance Criteria -- Sync attempt to remote main is executed and result is documented. -- Message body text style remains `bodyLarge` for user and assistant chat text. -- Placeholder uses an existing white-family design-system token (no new color constants). -- Targeted widget tests pass. diff --git a/docs/plans/2026-04-26-10-20-UTC-docusaurus-doc-ia-restructure.md b/docs/plans/2026-04-26-10-20-UTC-docusaurus-doc-ia-restructure.md deleted file mode 100644 index 3adbbc21..00000000 --- a/docs/plans/2026-04-26-10-20-UTC-docusaurus-doc-ia-restructure.md +++ /dev/null @@ -1,32 +0,0 @@ -# Background - -The repository documentation had strong technical content but weak information architecture for product-facing navigation. The task is to restructure docs into a Docusaurus-friendly layout based only on currently implemented capabilities. - -# Goals - -1. Reorganize documentation entry points into product-first sections. -2. Keep all content grounded in currently implemented repository state. -3. Avoid roadmap, pricing, or operations planning content. - -# Implementation Plan (phased) - -## Phase 1: Entry and navigation -- Update `README.md` to point to a clear docs IA. -- Add `docs/intro.md` as the documentation entry page. - -## Phase 2: Section pages -- Add product overview page under `docs/product/`. -- Add quickstart page under `docs/get-started/`. -- Add OpenClaw integration summary under `docs/integrations/`. -- Add architecture overview page under `docs/architecture/`. -- Add FAQ page under `docs/faq/`. - -## Phase 3: Documentation index alignment -- Update code map `doc_index` references where relevant so new docs are discoverable. - -# Acceptance Criteria - -1. Repository contains a Docusaurus-friendly docs folder structure with entry page and section pages. -2. `README.md` links users to the new docs structure. -3. New pages describe only currently implemented capabilities/workflows. -4. Code map document indexes include newly introduced docs references where relevant. diff --git a/docs/plans/2026-04-26-11-08-UTC-jump-button-threshold-and-scroll-target.md b/docs/plans/2026-04-26-11-08-UTC-jump-button-threshold-and-scroll-target.md deleted file mode 100644 index 60a99942..00000000 --- a/docs/plans/2026-04-26-11-08-UTC-jump-button-threshold-and-scroll-target.md +++ /dev/null @@ -1,25 +0,0 @@ -# Background -The chat message list currently shows the "Jump to latest" button when the user is only a short distance from the latest content, and tapping the button animates to the list max extent. With extra list bottom padding, this can feel too eager and can visually overshoot/rebound when far away. - -# Goals -- Show the jump button only when the user is significantly far from the latest content. -- Update jump animation target so it lands directly at the intended latest-content position without rebound-like behavior. -- Keep or improve existing widget test coverage. - -# Implementation Plan (phased) -1. Update `MessageList` scroll-distance logic: - - Replace fixed reveal threshold with a dynamic threshold based on viewport height (2 screens). - - Compute distance from current offset to the latest-content anchor (max extent minus reserved bottom padding). -2. Update jump action behavior: - - Animate to the latest-content anchor offset instead of absolute max extent. - - Use a duration scaled by distance to keep motion stable over long jumps. -3. Update tests: - - Adjust jump-to-latest assertion to anchor offset behavior. - - Add coverage that button stays hidden when far distance is below the 2-screen threshold. -4. Validate: - - Run repository bootstrap and targeted Flutter widget tests. - -# Acceptance Criteria -- Jump button appears only when distance to latest-content anchor exceeds two full viewport heights. -- Tapping jump button animates directly to the latest-content anchor position (not absolute bottom padding extent). -- Message list widget tests pass, including updated jump behavior checks. diff --git a/docs/plans/2026-04-26-12-03-UTC-chat-bubble-contrast-spacing.md b/docs/plans/2026-04-26-12-03-UTC-chat-bubble-contrast-spacing.md deleted file mode 100644 index b640235c..00000000 --- a/docs/plans/2026-04-26-12-03-UTC-chat-bubble-contrast-spacing.md +++ /dev/null @@ -1,26 +0,0 @@ -# Background -The user requested two dark-mode chat UI adjustments in the mobile chat app: (1) make user message bubbles use a clear white-like color similar to a competitor screenshot, and (2) increase spacing between user and assistant messages. The user also asked why the current color feels visually "weak"/"hazy". - -# Goals -1. Increase visual clarity of user bubbles in dark mode by using a higher-luminance bubble background and preserving text contrast. -2. Increase perceived separation between user turns and assistant turns in the message list. -3. Keep behavior stable and cover the style adjustments with widget tests where practical. - -# Implementation Plan (phased) -## Phase 1: Inspect current tokens and message layout -- Locate chat color tokens and message-list spacing logic in `packages/design_system` and `apps/mobile_chat_app`. - -## Phase 2: Apply visual updates -- Update dark-mode user bubble token(s) to a light surface with strong text contrast. -- Adjust message list spacing rules to increase the gap after user bubbles. -- Tune user bubble metadata color so it remains legible on the lighter bubble. - -## Phase 3: Validate -- Run environment bootstrap: `./tools/init_dev_env.sh`. -- Run targeted widget tests from mobile package directory, focusing on `message_list_test.dart`. -- If needed, update/add tests that assert bubble color and spacing behavior. - -# Acceptance Criteria -- In dark theme, user bubbles render with a light, high-contrast background and readable dark text. -- The vertical gap between a user message block and following assistant content is visibly larger than before. -- Widget tests covering the modified message-list behavior pass (`cd apps/mobile_chat_app && flutter test test/message_list_test.dart`). diff --git a/docs/plans/2026-04-26-12-10-UTC-dark-composer-visual-unification-todo.md b/docs/plans/2026-04-26-12-10-UTC-dark-composer-visual-unification-todo.md deleted file mode 100644 index ff58a8f7..00000000 --- a/docs/plans/2026-04-26-12-10-UTC-dark-composer-visual-unification-todo.md +++ /dev/null @@ -1,78 +0,0 @@ -# Dark Mode Composer Visual Unification — Code-Fit TODO Plan - -## Background -The current dark-mode chat UI already has a design-system foundation (`AppColors`, `ChatColors`) but key composer and status visuals are still inconsistent with a premium minimal style: - -- Accent blue is overused for non-critical controls (e.g., `/`, `@`, send icon, stop button backgrounds). -- Colored emoji (`🦞`) is used as a delivery/status icon in multiple places. -- Agent attribution text/icon color and composer action colors are not separated by semantic intent. -- Composer container sizing/padding leaves a “large console” impression instead of a compact ChatGPT/X-like composer. - -In addition, earlier token-level redundancy/ambiguity has been reduced: - -- Legacy `AppColors` aliases such as `surface2`/`surface3` were removed in favor of explicit surface-layer names. -- `ChatColors` now favors a smaller set of aliases that map back to core surface/text/accent layers. -- `agentAccent` is still overloaded for running/active emphasis and should be narrowed in a later pass. - -## Goals -1. Keep dark mode minimal and premium by converging action icon colors to a white/gray scale. -2. Restrict blue accent to true state/activation semantics only. -3. Remove colorful emoji from production chat/status UI. -4. Reduce composer default visual weight (height/padding/button emphasis) while keeping usability. -5. Land changes in a way that matches existing code structure and tests, avoiding disruptive refactors. - -## Implementation Plan (phased) - -### Phase 1 — Token cleanup and semantic tightening (design system first) -- Keep the current compact token set and avoid reintroducing one-off action-state aliases unless a widget actually consumes them. -- Continue using existing roles where they match current behavior: - - `composerActionIdle` - - `sendIdle` - - `sendActive` - - `agentIdentity` -- Add `statusRunning` / `statusCompleted` only if status UI needs product-specific meaning beyond existing accent/status tokens. -- Map dark defaults to neutral white-gray scale; reserve accent blue only for activated/explicit state cues. - -### Phase 2 — ComposerBar visual convergence -- In `composer_bar.dart`: - - Replace `/` and `@` trigger text colors from `chatColors.agentAccent` to neutral token (`composerActionIdle`). - - Replace config/tune icon, send icon, and stop control with state-driven neutral/active mapping: - - Empty input -> `sendIdle` (neutral) - - Non-empty input -> `sendActive` (clear active cue) - - Disabled -> existing disabled Material state or a new token only if the component needs product-specific disabled styling - - Introduce `ValueListenableBuilder`/controller listener for input non-empty state to drive send visual activation. - - Reduce composer perceived height: - - lower vertical paddings - - slightly smaller action tap target visuals (without violating minimum hit area) - - cap multiline expansion more tightly (e.g., keep `maxLines: 4` unless product requires 5) - -### Phase 3 — Status icon and agent attribution de-colorization -- In `message_list.dart` and `chat_screen.dart`: - - Replace lobster emoji delivery indicators and router emoji entry with monochrome icon(s) (custom glyph or Material icon fallback). - - Move assistant attribution icon/text color to neutral `agentIdentity` token. - - Keep blue only for explicit “running/active route selected” states when needed. - -### Phase 4 — Redundancy hardening and migration safety -- Audit call sites still directly relying on overloaded accent tokens and migrate to existing semantic tokens. -- Do not add component-specific color aliases unless they represent stable product semantics and map to the core surface-layer model. -- Ensure theme extension fallback behavior remains stable for tests running plain `MaterialApp`. - -### Phase 5 — Validation and regression coverage -- Update/add widget tests in `composer_bar_test.dart` and `message_list` related tests to assert: - - neutral default send icon state - - activated send visual state only when input has content - - no lobster emoji rendered in delivery/status UI - - composer menu/actions disabled states remain correct - -## Acceptance Criteria -1. In dark mode, bottom composer action controls use a consistent white/gray hierarchy in idle state. -2. Send control is not permanently highlighted; it visibly enters active state only when input is non-empty. -3. No colorful emoji is used for delivery/router status UI in chat surfaces. -4. Agent name/icon in message attribution no longer uses bright blue in idle identity display. -5. Composer appears visually more compact than before while retaining accessibility and functional parity. -6. Existing composer behavior tests pass; new state-color behavior tests pass. - -## Validation Commands -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/composer_bar_test.dart` -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart` diff --git a/docs/plans/2026-04-26-12-19-docs-subpath-vercel-integration.md b/docs/plans/2026-04-26-12-19-docs-subpath-vercel-integration.md deleted file mode 100644 index 7e6e687a..00000000 --- a/docs/plans/2026-04-26-12-19-docs-subpath-vercel-integration.md +++ /dev/null @@ -1,37 +0,0 @@ -# Background -The repository currently deploys Flutter Web from `apps/mobile_chat_app/build/web` on Vercel, while the Docusaurus docs site is configured at root (`baseUrl: '/'`). We need to mount docs at `/docs/` without breaking existing Flutter SPA routing or API rewrites. - -# Goals -1. Configure Docusaurus so generated links and assets are rooted at `/docs/`. -2. Update Vercel build flow to package docs output under Flutter Web output at `build/web/docs`. -3. Update Vercel rewrites so `/docs` and `/docs/*` are served by Docusaurus, while all other app routes continue to Flutter SPA. -4. Keep API routing (`/api/*`) unchanged. - -# Implementation Plan (phased) -## Phase 1: Docs site config -- Update `apps/docs_site/docusaurus.config.ts`: - - Hardcode `baseUrl: '/docs/'` — no env var needed. - - Keep `routeBasePath: '/'` to preserve docs-only mode semantics. - - Resolve `url` from `DOCS_URL` (optional override) → `VERCEL_PROJECT_PRODUCTION_URL` → `VERCEL_URL` → fail-fast error. No manual configuration required on Vercel. - -## Phase 2: Build pipeline integration -- Update `tools/vercel-build.sh`: - - Add `install_docs_site` and `build_docs_site` helpers. - - Run docs dependency install in `--install-only` mode. - - After Flutter web release build, build docs and copy to `apps/mobile_chat_app/build/web/docs`. - - Ensure copy happens after Flutter build to avoid output overwrite. - -## Phase 3: Vercel route dispatch -- Update `vercel.json` rewrites: - - Keep `/api/:path* -> /api/index` first. - - Add `/docs -> /docs/index.html` and `/docs/:path* -> /docs/index.html` before Flutter fallback. - - Keep catch-all fallback to `/index.html` last. - -## Phase 4: Regression metadata -- Review and update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` if docs entry/routing capabilities are impacted. - -# Acceptance Criteria -1. Running Docusaurus build generates docs site paths under `/docs/` (baseUrl is hardcoded; no env var required). -2. Running `bash ./tools/vercel-build.sh` produces `apps/mobile_chat_app/build/web/docs/index.html`. -3. `vercel.json` rewrites route `/docs` and `/docs/*` to docs index before Flutter fallback. -4. Existing `/api/*` and Flutter fallback routing remain present and ordered correctly. diff --git a/docs/plans/2026-04-26-13-20-UTC-docusaurus-site-implementation.md b/docs/plans/2026-04-26-13-20-UTC-docusaurus-site-implementation.md deleted file mode 100644 index 82b0e45a..00000000 --- a/docs/plans/2026-04-26-13-20-UTC-docusaurus-site-implementation.md +++ /dev/null @@ -1,33 +0,0 @@ -# Background - -The repository documentation was reorganized into a Docusaurus-friendly structure, but it still lacked an executable Docusaurus site and clickable docs links in README. - -# Goals - -1. Convert README docs path listings into clickable Markdown links with valid targets. -2. Add an independent `website/` Docusaurus project that renders docs from repository root `docs/`. -3. Keep existing Flutter, melos, and Vercel project structures untouched. - -# Implementation Plan (phased) - -## Phase 1: README link usability -- Replace code-style docs paths in README with Markdown links. -- Add a short section showing how to run and build the docs site from `website/`. - -## Phase 2: Docusaurus project bootstrap -- Create `website/package.json` with Docusaurus dependencies and npm scripts. -- Add `website/docusaurus.config.ts` with docs source path set to `../docs`. -- Add `website/sidebars.ts` grouped by Introduction, Product, Get Started, Integrations, Architecture, FAQ, and Plans. -- Add basic CSS and ignore files needed for local development. - -## Phase 3: Docs metadata and validation -- Add minimal frontmatter to key docs pages used by sidebar. -- Run `npm install` and `npm run build` under `website/`. -- Review `git diff --name-status` to ensure expected scope. - -# Acceptance Criteria - -1. README docs entries are clickable and point to real files. -2. `cd website && npm run build` succeeds. -3. Sidebar groups map to current docs information architecture. -4. Existing app and backend build structures remain unaffected. diff --git a/docs/plans/2026-04-26-14-05-UTC-move-docusaurus-site-under-apps.md b/docs/plans/2026-04-26-14-05-UTC-move-docusaurus-site-under-apps.md deleted file mode 100644 index 1242a467..00000000 --- a/docs/plans/2026-04-26-14-05-UTC-move-docusaurus-site-under-apps.md +++ /dev/null @@ -1,29 +0,0 @@ -# Background - -The previous implementation created the Docusaurus project at repository root (`website/`), but stakeholder feedback requires the docs site to live under `apps/`. - -# Goals - -1. Relocate the Docusaurus project from `website/` to `apps/docs_site/`. -2. Keep the site functional with docs sourced from repository root `docs/`. -3. Update README run/build instructions to the new location. - -# Implementation Plan (phased) - -## Phase 1: Relocation -- Move `website/` to `apps/docs_site/` with full history-preserving rename. - -## Phase 2: Configuration fixes -- Update Docusaurus docs source path for new directory depth (`../../docs`). -- Update README commands to run from `apps/docs_site`. - -## Phase 3: Validation -- Run `npm install` and `npm run build` from `apps/docs_site`. -- Verify changed file scope with `git diff --name-status`. - -# Acceptance Criteria - -1. No `website/` remains at repo root. -2. `apps/docs_site` contains runnable Docusaurus project. -3. `cd apps/docs_site && npm run build` succeeds. -4. README points to the new docs site location. diff --git a/docs/plans/2026-04-26-23-24-+08-chat-dark-colors.md b/docs/plans/2026-04-26-23-24-+08-chat-dark-colors.md deleted file mode 100644 index 53590be3..00000000 --- a/docs/plans/2026-04-26-23-24-+08-chat-dark-colors.md +++ /dev/null @@ -1,31 +0,0 @@ -# Chat Dark Color Updates - -## Background -The mobile chat screen uses design-system tokens for both its page scaffold background and its bottom composer input. The chat input composer is rendered by `ComposerBar`, which reads `ChatColors.composerBackground`; the dark page scaffold reads `AppColors.backgroundBase` through `BricksTheme.dark()`. - -## Goals -- Identify the existing chat input color path before changing it. -- Change the dark chat composer input background to `#303030`. -- Change the dark page scaffold background to `#212121`. -- Match the observed responsive layering where compact dark chat uses `#000000 -> #212121` and wide dark chat uses `#212121 -> #303030`. -- Reuse a small set of generic background/surface tokens instead of adding component-specific color tokens. - -## Implementation Plan (phased) -1. Trace the chat input widget from `ChatScreen` to `ComposerBar` and confirm it uses `ChatColors.composerBackground`. -2. Use generic `AppColors.surfaceElevated` with `Color(0xFF303030)` for elevated surfaces such as the wide composer. -3. Point dark `ChatColors.composerBackground` to `AppColors.surfaceElevated`. -4. Update `AppColors.backgroundBase` to `Color(0xFF212121)` so dark `scaffoldBackgroundColor` resolves to the requested page background. -5. Use compact dark chat layout to apply `AppColors.backgroundChrome` as the page background and `AppColors.backgroundBase` as the composer background. -6. Keep wide dark chat layout on `AppColors.backgroundBase` for the page and `AppColors.surfaceElevated` for the composer. -7. Use the default surface token for recessed content blocks rather than elevating markdown/code blocks. -8. Run formatting and mobile Flutter analysis. - -## Acceptance Criteria -- In dark mode, the chat input composer background resolves to `#303030`. -- In dark mode, the page scaffold background resolves to `#212121`. -- In compact dark chat, the page background resolves to `#000000` and the composer background resolves to `#212121`. -- In wide dark chat, the page background resolves to `#212121` and the composer background resolves to `#303030`. -- `ComposerBar` uses `chatColors.composerBackground` by default and receives only a compact-layout override when needed. -- The chat AppBar continues to follow `Theme.of(context).scaffoldBackgroundColor`. -- No component-specific input color token is introduced. -- `dart format` and `flutter analyze` complete successfully. diff --git a/docs/plans/2026-04-27-00-04-+08-pr-branch-sync-skill.md b/docs/plans/2026-04-27-00-04-+08-pr-branch-sync-skill.md deleted file mode 100644 index af3dc579..00000000 --- a/docs/plans/2026-04-27-00-04-+08-pr-branch-sync-skill.md +++ /dev/null @@ -1,22 +0,0 @@ -# PR Branch Sync Skill - -## Background -Recent PR work exposed a repeatable workflow: push can fail because network access is restricted or because the remote branch changed after the local branch was created. Codex should preserve remote work, check whether a PR already exists, rebase local changes when the remote branch is newer, push again, and update the PR summary. - -## Goals -- Add a repository-local Codex skill under `.codex/skills/`. -- Capture the PR branch recovery workflow concisely. -- Emphasize preserving remote commits and using `--force-with-lease` only when intentionally rewriting a branch. - -## Implementation Plan (phased) -1. Create `.codex/skills/github-pr-branch-sync/SKILL.md`. -2. Document checks for current branch, existing PR, remote branch existence, and remote-ahead state. -3. Document safe rebase, push, and PR summary update steps. -4. Validate the skill metadata and markdown content by inspecting the created file. - -## Acceptance Criteria -- A new Codex skill exists under `.codex/skills/github-pr-branch-sync/`. -- The skill tells Codex what to do after a failed push. -- The skill includes checks for existing PRs and remote branches. -- The skill instructs Codex to rebase local changes when the remote branch is newer. -- The skill instructs Codex to update the PR summary after pushing. diff --git a/docs/plans/2026-04-27-00-19-+08-design-system-token-alignment.md b/docs/plans/2026-04-27-00-19-+08-design-system-token-alignment.md deleted file mode 100644 index 793f4f87..00000000 --- a/docs/plans/2026-04-27-00-19-+08-design-system-token-alignment.md +++ /dev/null @@ -1,23 +0,0 @@ -# Design System Token Alignment - -## Background -The current color KB emphasizes component-level tokens, while the latest chat dark-mode work uses a smaller surface-layer model inspired by ChatGPT: base/chrome/recessed/elevated surfaces with thin component aliases. Code and documentation need to describe the same model. - -## Goals -- Identify redundant or stale color token definitions. -- Update the color KB so it matches the intended surface-layer-first design. -- Keep useful component aliases where they improve readability. -- Remove unused token definitions that encourage over-specific naming. - -## Implementation Plan (phased) -1. Audit actual token usage in `AppColors`, `ChatColors`, and chat widgets. -2. Remove unused legacy aliases and unused `ChatColors` fields. -3. Revise `docs/kb/color-theme-architecture.md` to define the surface-layer-first rule. -4. Run formatting and Flutter analysis. -5. Check whether code maps need an update because the KB/design-token index changed. - -## Acceptance Criteria -- The KB says to prefer existing surface/text/border/accent/status layers before adding component tokens. -- Code no longer exposes unused `BricksColorTokens`, legacy aliases, or unused `ChatColors` fields. -- Existing chat UI behavior remains unchanged. -- Validation includes `dart format` and `flutter analyze`. diff --git a/docs/plans/2026-04-27-00-27-+08-design-system-skill.md b/docs/plans/2026-04-27-00-27-+08-design-system-skill.md deleted file mode 100644 index c6fb06cb..00000000 --- a/docs/plans/2026-04-27-00-27-+08-design-system-skill.md +++ /dev/null @@ -1,21 +0,0 @@ -# Design System Skill - -## Background -The color/theme KB now defines a surface-layer-first approach. Future Codex runs need a repository-local skill that reminds agents to use that model before modifying UI colors, adding tokens, or changing chat surfaces. - -## Goals -- Add a repository-local design-system skill under `.codex/skills/`. -- Make the skill route agents to `docs/kb/color-theme-architecture.md` before color/theme edits. -- Capture the current token decision rules: reuse core layers first, add component aliases sparingly, and keep docs/code maps aligned. - -## Implementation Plan (phased) -1. Create `.codex/skills/bricks-design-system/SKILL.md`. -2. Document the inspection workflow for token/theme/UI color changes. -3. Include guardrails for redundant tokens, responsive surface roles, and validation. -4. Add the new skill to the relevant code-map documentation index. - -## Acceptance Criteria -- A new Codex skill exists for Bricks design-system work. -- The skill instructs agents to read the color/theme KB before design-token edits. -- The skill encodes the surface-layer-first rule and component-alias criteria. -- The code maps reference the new skill where design-system docs are indexed. diff --git a/docs/plans/2026-04-27-00-40-+08-responsive-sidebar-surface.md b/docs/plans/2026-04-27-00-40-+08-responsive-sidebar-surface.md deleted file mode 100644 index 8c6e1394..00000000 --- a/docs/plans/2026-04-27-00-40-+08-responsive-sidebar-surface.md +++ /dev/null @@ -1,23 +0,0 @@ -# Responsive Sidebar Surface - -## Background -The chat navigation drawer currently expands to the full viewport width and relies on implicit Material/Scaffold background behavior. The desired dark-mode behavior is a black navigation surface on both compact and wide layouts, with compact retaining full-width navigation and wide layouts using a fixed sidebar width so it contrasts with the near-black chat canvas. - -## Goals -- Make the chat navigation drawer background explicit. -- Use black/chrome background for the dark sidebar in compact and wide layouts. -- Keep compact drawer full-width. -- Use a fixed wide-layout drawer width aligned with the ChatGPT-like 260px reference. - -## Implementation Plan (phased) -1. Add responsive drawer width and background role selection in `ChatScreen`. -2. Apply the drawer background to both `Drawer` and the nested navigation content theme so the inner `Scaffold` cannot paint a different surface. -3. Update code maps to capture the sidebar width/surface smoke check. -4. Run formatting, focused navigation tests, Flutter analysis, and code-map YAML validation. - -## Acceptance Criteria -- In dark compact chat, the sidebar drawer is full-width and black. -- In dark wide chat, the sidebar drawer is fixed-width and black. -- In dark wide chat, opening the sidebar creates visible contrast against the `#212121` chat background. -- No new color token is introduced. -- Validation commands pass. diff --git a/docs/plans/2026-04-27-00-42-+08-quiet-composer-focus.md b/docs/plans/2026-04-27-00-42-+08-quiet-composer-focus.md deleted file mode 100644 index 2f2d1a60..00000000 --- a/docs/plans/2026-04-27-00-42-+08-quiet-composer-focus.md +++ /dev/null @@ -1,19 +0,0 @@ -# Quiet Composer Focus Border - -## Background -The chat composer currently switches to a stronger border token when the text field gains focus. The requested visual direction is quieter: focusing the input should not create a highlighted border. - -## Goals -- Keep the composer border visually stable across focused and unfocused states. -- Remove now-unused focus-border color alias if no other widget consumes it. -- Avoid adding new color tokens. - -## Implementation Plan (phased) -1. Change `ComposerBar` to always use `chatColors.composerBorder`. -2. Remove `ChatColors.composerBorderFocus` if it becomes unused. -3. Run formatting and mobile Flutter validation. - -## Acceptance Criteria -- Focusing the composer input does not change the border color. -- `ChatColors` does not expose unused focus-border aliases. -- Validation commands pass. diff --git a/docs/plans/2026-04-27-00-51-+08-composer-action-color-alignment.md b/docs/plans/2026-04-27-00-51-+08-composer-action-color-alignment.md deleted file mode 100644 index fb21e2dc..00000000 --- a/docs/plans/2026-04-27-00-51-+08-composer-action-color-alignment.md +++ /dev/null @@ -1,20 +0,0 @@ -# Composer Action Color Alignment - -## Background -The composer bottom-row controls currently use mixed enabled colors in dark mode: slash, mention, tune, and idle send controls are gray, while active send is near-white. The desired visual direction is that clickable, non-disabled, non-accent controls use the same quiet white-family color unless intentionally highlighted. - -## Goals -- Align dark composer bottom action icon/text colors. -- Reuse the existing `AppColors.textPrimary` token without adding new tokens or hardcoded color values. -- Keep the composer controls quiet and avoid brand-blue emphasis. - -## Implementation Plan (phased) -1. Update dark `ChatColors.composerActionIdle` and `sendIdle` to map to `AppColors.textPrimary`. -2. Keep active send mapped to `AppColors.textPrimary` so enabled controls are visually consistent. -3. Update code-map smoke coverage for composer bottom controls. -4. Run formatting, focused composer tests, and mobile Flutter analysis. - -## Acceptance Criteria -- Slash, mention, tune, and idle send controls use the same dark enabled action color. -- Enabled controls reuse `AppColors.textPrimary`, not brand blue or hardcoded white. -- No new color token is introduced. diff --git a/docs/plans/2026-04-27-13-47-UTC-light-mode-color-adjustments.md b/docs/plans/2026-04-27-13-47-UTC-light-mode-color-adjustments.md deleted file mode 100644 index f93a1f63..00000000 --- a/docs/plans/2026-04-27-13-47-UTC-light-mode-color-adjustments.md +++ /dev/null @@ -1,28 +0,0 @@ -# Background -用户反馈亮色模式仍存在灰蓝倾向,且与目标视觉不一致。需要依据设计手册(`docs/kb/color-theme-architecture.md`)将亮色模式关键区域调整为中性白/黑体系:页面背景、用户消息气泡、以及“定位到最底部”圆形按钮。 - -# Goals -1. 亮色模式页面背景去蓝化,改为中性白系。 -2. 亮色模式用户气泡改为黑底白字,提升对比度并符合视觉要求。 -3. 亮色模式“定位到最新”圆形按钮改为白色系;暗色模式蓝色按钮保持不变。 -4. 不引入业务组件内硬编码色值,优先通过 design system token/主题层实现。 - -# Implementation Plan (phased) -## Phase 1: 主题与语义色调整 -- 在 `ChatColors.light` 中调整 `messageUserBackground` 与 `onMessageUser`,实现亮色模式黑底白字气泡。 -- 在 `BricksTheme.light()` 明确设置亮色 `scaffoldBackgroundColor` 与 `appBarTheme`,去除由 `colorSchemeSeed` 带来的灰蓝背景倾向。 - -## Phase 2: 定位按钮语义色调整 -- 通过 `ChatColors.jumpToLatestBackground` 与 `ChatColors.onJumpToLatest` 统一定义 jump-to-latest 按钮样式,不在消息列表组件内按 `Theme.brightness` 额外分支。 -- 在主题 token 层分别配置亮暗模式取值: - - Light: `jumpToLatestBackground` 为白色系,`onJumpToLatest` 为深色箭头/图标。 - - Dark: 保持现有蓝色主色填充按钮及对应前景色。 - -## Phase 3: 校验 -- 运行格式化和 Flutter 分析命令,确保代码风格与静态检查通过。 - -# Acceptance Criteria -1. 亮色模式聊天页面背景为中性白系,不再呈现灰蓝底感。 -2. 亮色模式右侧用户消息气泡呈现黑底白字,时间与状态图标在气泡上清晰可读。 -3. 亮色模式 jump-to-latest 按钮呈白色系;暗色模式该按钮继续为蓝色。 -4. `cd apps/mobile_chat_app && flutter analyze` 无错误。 diff --git a/docs/plans/2026-04-27-17-28-UTC-markdown-table-rendering.md b/docs/plans/2026-04-27-17-28-UTC-markdown-table-rendering.md deleted file mode 100644 index 6cadaef4..00000000 --- a/docs/plans/2026-04-27-17-28-UTC-markdown-table-rendering.md +++ /dev/null @@ -1,26 +0,0 @@ -# Background -The mobile chat assistant currently supports a lightweight markdown subset (headings, lists, code fences, block quotes, inline styles/links) but does not render markdown table syntax. As a result, table source text is shown literally in messages, which harms readability for structured answers. - -# Goals -- Render GitHub-style markdown tables (`|` row syntax + separator row) as visual table widgets in assistant messages. -- Keep existing markdown features and styles intact. -- Add regression coverage for table rendering in widget tests. - -# Implementation Plan (phased) -## Phase 1: Parser and renderer extension -- Extend `_AssistantMarkdownText` line-walking logic to detect table blocks before paragraph/list parsing. -- Add a `_MarkdownTable` helper that parses a header row + separator row + data rows and normalizes column counts. -- Render parsed tables with Flutter `Table` wrapped in horizontal scroll for narrow screens. - -## Phase 2: Validation and regression tests -- Add widget test coverage to verify table syntax is transformed into a rendered `Table` and cell text appears as expected. -- Ensure literal raw markdown table line text is no longer displayed for parsed table messages. - -## Phase 3: Verification commands -- Initialize repo dev environment with `./tools/init_dev_env.sh`. -- Run targeted mobile app tests from package directory: `cd apps/mobile_chat_app && flutter test test/message_list_test.dart`. - -# Acceptance Criteria -- Assistant messages containing markdown tables render visually as table UI, not literal raw `|`-delimited text. -- Existing markdown behaviors (headings/lists/code/quote) remain functional. -- New widget tests for markdown table rendering pass. diff --git a/docs/plans/2026-04-28-17-26-+08-bricks-issue-template-skill.md b/docs/plans/2026-04-28-17-26-+08-bricks-issue-template-skill.md deleted file mode 100644 index a23c0055..00000000 --- a/docs/plans/2026-04-28-17-26-+08-bricks-issue-template-skill.md +++ /dev/null @@ -1,26 +0,0 @@ -# Bricks Issue Template Skill - -## Background - -The repository has project-specific skills under `.agents/skills/`, but no GitHub issue template was found under `.github/ISSUE_TEMPLATE`. Product requirement discussions still need a consistent structure for issue drafts. - -## Goals - -- Add a repository skill that helps agents draft Bricks GitHub issues using a consistent product-facing structure. -- Include Context, Motivation, Requirement, and Acceptance Criteria sections. -- Require Acceptance Criteria to use GWT form. -- Keep implementation details out of the default issue body unless the user explicitly asks for them. - -## Implementation Plan (phased) - -1. Create `.agents/skills/bricks-issue-template/SKILL.md`. -2. Document the trigger conditions and issue structure. -3. Keep the skill concise and self-contained so it can be loaded cheaply. - -## Acceptance Criteria - -- The new skill exists at `.agents/skills/bricks-issue-template/SKILL.md`. -- The skill frontmatter includes a clear `name` and `description`. -- The skill instructs agents to use Context, Motivation, Requirement, and Acceptance Criteria. -- The skill requires GWT-style acceptance criteria. -- The default issue template avoids implementation suggestions unless requested. diff --git a/docs/plans/2026-04-28-23-49-+08-change-implementation-plan-skill.md b/docs/plans/2026-04-28-23-49-+08-change-implementation-plan-skill.md deleted file mode 100644 index c1466b29..00000000 --- a/docs/plans/2026-04-28-23-49-+08-change-implementation-plan-skill.md +++ /dev/null @@ -1,34 +0,0 @@ -# Change Implementation Plan Skill - -## Background - -The repository requires implementation plans to be persisted under `docs/plans/`, but the desired plan-writing structure has been refined through discussion. - -The plan format should support concise plans for small changes and more structured plans for larger work. `Context`, `Problem`, and `Motivation` should be available as optional Background subsections, not mandatory headings. - -## Goals - -- Add a reusable skill for implementation plan drafting and persistence. -- Require every implementation plan to be saved under `docs/plans/` with a timestamped filename. -- Standardize plan sections while keeping Background subsections optional. -- Keep validation commands in a dedicated section. - -## Implementation Plan - -1. Create `.agents/skills/change-implementation-plan/SKILL.md`. -2. Document the purpose of the skill as implementation planning for repository changes. -3. Define the default plan structure and optional Background subsection rules. -4. Capture persistence and validation-command requirements. - -## Acceptance Criteria - -- The skill exists at `.agents/skills/change-implementation-plan/SKILL.md`. -- The skill name does not include repository-specific branding. -- The skill description explains that it is for implementation plans for repository changes. -- The skill requires plans to be saved under `docs/plans/` with timestamped filenames. -- The skill defines `Context`, `Problem`, and `Motivation` as optional Background subsections. -- The skill requires `Validation Commands` as a dedicated section. - -## Validation Commands - -- `git status --short` diff --git a/docs/plans/2026-04-29-00-01-+08-issue-template-background-update.md b/docs/plans/2026-04-29-00-01-+08-issue-template-background-update.md deleted file mode 100644 index c4d2434a..00000000 --- a/docs/plans/2026-04-29-00-01-+08-issue-template-background-update.md +++ /dev/null @@ -1,32 +0,0 @@ -# Issue Template Background Update - -## Background - -The repository now has a dedicated issue drafting skill at `.agents/skills/bricks-issue-template/SKILL.md`. Its current template uses separate top-level `Context` and `Motivation` sections. - -The implementation plan skill uses a more flexible `Background` section with optional `Context`, `Problem`, and `Motivation` subsections. That structure is a better fit for issue drafting because not every issue needs separate top-level context and motivation sections. - -## Goals - -- Align the issue template's background structure with the plan template's flexible Background model. -- Replace top-level `Context` and `Motivation` issue sections with a single `Background` section. -- Allow `Context`, `Problem`, and `Motivation` as optional Background subsections. -- Preserve the issue template's `Requirement` and GWT-style `Acceptance Criteria` sections. - -## Implementation Plan - -1. Update `.agents/skills/bricks-issue-template/SKILL.md` frontmatter to describe the new Background-based structure. -2. Replace the default issue template's top-level `Context` and `Motivation` sections with `Background`. -3. Document optional `Context`, `Problem`, and `Motivation` subsections under `Background`. -4. Update writing rules and checklist language to reference `Background`. - -## Acceptance Criteria - -- The issue template skill uses `Background`, `Requirement`, and `Acceptance Criteria` as the default top-level issue sections. -- The skill no longer requires top-level `Context` or `Motivation` sections. -- The skill allows optional `Context`, `Problem`, and `Motivation` subsections under `Background`. -- The skill still requires GWT-style acceptance criteria. - -## Validation Commands - -- `git status --short` diff --git a/docs/plans/2026-04-29-16-22-UTC-chat-appbar-channel-section-menu.md b/docs/plans/2026-04-29-16-22-UTC-chat-appbar-channel-section-menu.md deleted file mode 100644 index dc6d05f9..00000000 --- a/docs/plans/2026-04-29-16-22-UTC-chat-appbar-channel-section-menu.md +++ /dev/null @@ -1,21 +0,0 @@ -# Background -The chat screen AppBar currently uses the title dropdown to switch sub-sections and uses a right-side three-dot menu for section management. Product now needs the title dropdown to switch channels, and section switching/management should move into a dedicated AppBar menu near the title. - -# Goals -- Make the AppBar title dropdown switch channels. -- Add a section menu in the AppBar that is left-aligned near the channel title. -- Convert the previous three-dot control into a section-name dropdown with grouped menu content. -- Keep section list synchronized with the active channel after channel switching. - -# Implementation Plan (phased) -1. Update the title PopupMenuButton to list channels and call `_switchChannel`. -2. Replace the right-side three-dot actions menu with an inline section dropdown button rendered next to the channel title. -3. Build section dropdown groups in this order: action items (new sub-section, rename placeholder, archive placeholder), divider, section navigation list. -4. Ensure displayed section label and menu list resolve from `_activeSubSection` and `_activeSubSections` so they refresh naturally after `_switchChannel`. - -# Acceptance Criteria -- Clicking AppBar channel title opens a channel list and selecting one switches active channel. -- A new section dropdown appears near the channel title (not on the right edge). -- Section dropdown shows a function group first, then a divider, then the section list group. -- Existing placeholder actions for section rename/archive remain non-functional and show the existing "功能暂未实现" feedback. -- When channel changes, section label and section list reflect the target channel. diff --git a/docs/plans/2026-04-29-16-29-UTC-pc-sidebar-inline-navigation.md b/docs/plans/2026-04-29-16-29-UTC-pc-sidebar-inline-navigation.md deleted file mode 100644 index b73a91e2..00000000 --- a/docs/plans/2026-04-29-16-29-UTC-pc-sidebar-inline-navigation.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -当前 `ChatScreen` 在 PC/宽屏下点击左上角 navigation 按钮会打开 `Drawer` 浮层。需求是仅修改 PC 行为:打开后显示为常驻左侧边栏,并与右侧对话区并存;折叠后恢复隐藏。移动端行为保持不变。 - -# Goals -- 仅在宽屏(非 compact)下把 navigation 改为“内联侧边栏 + 右侧聊天区”的并存布局。 -- 保持移动端 `Drawer` 交互不变。 -- 保持原有 `ChatNavigationPage` 功能与主题样式一致。 - -# Implementation Plan (phased) -1. 在 `ChatScreen` 新增桌面侧边栏展开状态(默认折叠)。 -2. 提取侧边导航内容构建函数,避免 `Drawer` 与桌面内联侧边栏重复实现。 -3. 构建响应式布局: - - mobile/compact:继续使用 `Scaffold.drawer` + `openDrawer()`。 - - desktop/non-compact:`Scaffold.body` 使用 `Row`,左侧按状态显示固定宽度导航,右侧 `Expanded` 承载聊天区域。 -4. 更新代码地图中 chat_session 的 smoke check/关键词,补充“宽屏侧边栏内联并存”行为。 - -# Acceptance Criteria -- 在宽屏下点击导航按钮后,左侧导航以内联侧边栏形式出现,聊天区被挤到右侧并继续可用。 -- 在宽屏下再次点击导航按钮后,左侧导航隐藏。 -- 在移动端下导航仍通过抽屉浮层打开,不受本次改动影响。 - -# Validation Commands -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart` diff --git a/docs/plans/2026-04-30-17-06-+08-desktop-channel-navigation-stays-open.md b/docs/plans/2026-04-30-17-06-+08-desktop-channel-navigation-stays-open.md deleted file mode 100644 index ad6e5a5d..00000000 --- a/docs/plans/2026-04-30-17-06-+08-desktop-channel-navigation-stays-open.md +++ /dev/null @@ -1,33 +0,0 @@ -# Desktop Channel Navigation Stays Open - -## Background - -The chat navigation page is reused for both compact mobile drawers and wide desktop inline navigation. Channel taps currently request navigation close before switching channels. That is correct on compact screens, where the drawer covers the conversation, but it is not correct on wide screens where the inline navigation pushes the conversation area to the right and should remain available for repeated channel switching. - -## Goals - -- Keep compact drawer behavior unchanged: tapping a channel closes the drawer. -- Keep wide inline navigation open when a channel is selected. -- Preserve existing close behavior for explicit navigation close actions such as the back arrow and settings/actions. -- Cover the behavior with focused widget tests. - -## Implementation Plan - -1. Add an explicit channel-selection close policy to `ChatNavigationPage`. -2. Use the default close-on-channel-select policy for mobile drawer usage. -3. Disable close-on-channel-select for the desktop inline navigation call site. -4. Add widget tests for both default close behavior and desktop-style non-closing channel selection. -5. Update code maps if the navigation behavior index needs to reflect the new wide-screen behavior. - -## Acceptance Criteria - -- On compact/mobile navigation, tapping a channel closes the drawer and switches the selected channel. -- On wide/desktop inline navigation, tapping a channel switches the selected channel without closing the navigation panel. -- The explicit close control still closes wide/desktop inline navigation. -- Existing channel rename/archive behavior is unchanged. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-04-30-17-51-+08-scope-instructions-config.md b/docs/plans/2026-04-30-17-51-+08-scope-instructions-config.md deleted file mode 100644 index 5820b199..00000000 --- a/docs/plans/2026-04-30-17-51-+08-scope-instructions-config.md +++ /dev/null @@ -1,49 +0,0 @@ -# Scope Instructions Config - -## Background - -The chat screen currently has multiple conversation scopes: a channel and, when selected, a sub-section under that channel. A channel can define broad context, while a sub-section can narrow the current topic further. Prompt-style configuration should therefore belong to the active conversation scope model rather than only to channels. - -The entry point should not be placed inside the channel switcher, because the action configures the current chat context and may include both channel-level and sub-section-level settings. A stable action in the conversation area's top-right controls better communicates that this is a configuration action for the current chat view. - -## Goals - -- Add a top-right conversation config action in the chat area. -- Provide a config UI with tabs for channel configuration and current sub-section configuration. -- Allow channel-level `Instructions` to describe the broad context/topic for the channel. -- Allow sub-section-level `Instructions` to describe the narrower context/topic for the current sub-section. -- Hide or disable sub-section configuration when the current sub-section is the main section. -- Apply the relevant instructions to default-route chat requests without replacing the selected Agent prompt. -- Keep OpenClaw routing behavior unchanged. - -## Implementation Plan - -1. Add a conversation config action to the chat app bar's right-side controls, separate from the channel dropdown and sub-section dropdown. -2. Build a configuration dialog or sheet with two tabs: `Channel` and `Current Section`. -3. In the `Channel` tab, show an `Instructions` text field for the active channel with helper copy explaining that it sets context and customizes what target/topic the channel discusses. -4. In the `Current Section` tab, show an `Instructions` text field only when the active section is a sub-section; for the main section, show a non-editable state explaining that main uses channel instructions only. -5. Extend chat scope settings persistence so both `channel` scope rows and `thread`/sub-section scope rows can store optional instructions independently of router and node settings. -6. Hydrate channel and sub-section instructions in the Flutter chat client, save edits optimistically with rollback on failure, and preserve existing router/node configuration when instructions are saved or cleared. -7. Compose runtime default-route prompts from the selected Agent prompt plus active channel instructions plus active sub-section instructions, with sub-section instructions acting as additional narrower context. -8. Add focused backend and Flutter tests for persistence, hydration, request payloads, and prompt composition behavior. -9. Update code maps because this changes chat feature entry points and chat request logic. - -## Acceptance Criteria - -- Given the user is in any chat scope, when they look at the conversation area's top-right controls, then they can open a config action that is not part of the channel dropdown. -- Given the config UI is open, when the active scope is any channel, then the `Channel` tab lets the user edit and save channel `Instructions`. -- Given the config UI is open on the main section, when the user opens the section tab, then section instructions are not editable and the UI indicates that the main section uses channel instructions only. -- Given the config UI is open on a sub-section, when the user opens the section tab, then they can edit and save instructions for that current sub-section. -- Given saved channel instructions exist, when the app reloads, then the channel tab restores the saved value. -- Given saved sub-section instructions exist, when the user returns to that sub-section, then the section tab restores the saved value. -- Given both channel and sub-section instructions exist, when a default-route message is sent from that sub-section, then the request includes Agent prompt context plus both instruction scopes. -- Given only channel instructions exist, when a default-route message is sent from the main section, then the request includes Agent prompt context plus channel instructions. -- Given instructions are cleared, when the user saves and reloads, then the cleared scope no longer contributes prompt context. -- Given a scope uses OpenClaw routing, when instructions are saved or messages are sent, then OpenClaw routing and node selection behavior remains unchanged. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `npm test -- --runInBand` -- `cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-06-10-13-UTC-default-router-agent-architecture.md b/docs/plans/2026-05-06-10-13-UTC-default-router-agent-architecture.md deleted file mode 100644 index ba7c9f01..00000000 --- a/docs/plans/2026-05-06-10-13-UTC-default-router-agent-architecture.md +++ /dev/null @@ -1,57 +0,0 @@ -# Background - -In the current chat routing model, the `openclaw` router can bind to a concrete node (`nodeId`) and carries agent-style semantics through that node. By contrast, the `default` router mostly follows built-in logic (the default branch in `/api/chat/respond`) and is not modeled as a first-class node/agent entity. - -This creates product-level inconsistencies: - -- Channel and thread instructions can be saved, but they are not represented consistently under a unified “router == agent target” model. -- Observability metadata for default routing is not aligned between frontend and backend. -- Future AI-assisted instruction management (inheritance, overrides, auditing) is constrained by the lack of default-router identity. - -The target is to make the default router equivalent to a built-in agent node: always available, no import, no plugin installation. - -# Goals - -1. Model the default router as a built-in virtual node with stable ID and display name. -2. Preserve current UX: every user has it by default, with no plugin setup. -3. Align expressiveness with OpenClaw node routing to support future AI instruction editing for channels/threads. -4. Keep existing OpenClaw routing/plugin behavior intact. - -# Implementation Plan (phased) - -## Phase 1: Domain model alignment (Backend) - -1. Define built-in default node constants (e.g. `node_builtin_default`) and source platform (e.g. `builtin`). -2. Introduce a unified resolved target shape in routing resolution: - - `router` - - `nodeId` - - `nodeKind` (`builtin_default` / `platform_openclaw`) - - `agentName` -3. In `/api/chat/respond`, emit consistent user/assistant metadata (including `targetNodeId/targetNodeName`) for both default and OpenClaw. - -## Phase 2: Config and presentation alignment (Config + Chat UI) - -1. Add a read-only built-in default node to node-list APIs (not renameable or deletable). -2. Present default in the route picker with node-style UI (e.g. “Bricks Default (Built-in)”), while still being always available. -3. Keep existing channel/thread instruction editors; optionally return `resolvedNodeId` from scope-setting reads (built-in node ID for default). - -## Phase 3: Instruction governance - -1. Add explicit inheritance/override semantics: global(agent) → channel → thread. -2. Add service endpoints for AI-assisted instruction edits (default first, then OpenClaw). -3. Add instruction audit metadata (who changed, when, scope, before/after diff summary). - -# Acceptance Criteria - -1. Without any OpenClaw node configured, users can still use default chat and routing resolves to a stable default-node identity. -2. Channel and thread instructions continue to save/read and apply correctly under default routing. -3. Default appears as a built-in node in routing UI without adding install/import steps. -4. OpenClaw routing behavior and plugin flows do not regress. -5. Chat message metadata exposes unified target fields across default/OpenClaw (`targetNodeId/targetNodeName`). - -# Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/node_backend && npm test` -- `cd apps/mobile_chat_app && flutter test` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-06-11-03-UTC-openclaw-default-router-agent-benchmark.md b/docs/plans/2026-05-06-11-03-UTC-openclaw-default-router-agent-benchmark.md deleted file mode 100644 index ad093939..00000000 --- a/docs/plans/2026-05-06-11-03-UTC-openclaw-default-router-agent-benchmark.md +++ /dev/null @@ -1,105 +0,0 @@ -# Background - -You requested that before upgrading Bricks default router into an agent-equivalent node architecture, we should first study OpenClaw (especially OpenClaw + Discord) in depth, including technology choices, architecture, and prompt design, then produce an implementation-ready plan. - -Based on repository/documentation research of `openclaw/openclaw`, this document converts benchmark findings into a practical Bricks migration blueprint. - -# Goals - -1. Extract key OpenClaw mechanisms for control plane, session routing, agent identity, and prompt assembly. -2. Map those findings to current Bricks gaps and define what default router must gain. -3. Produce a phased implementation plan for built-in default-node semantics and AI-governed channel/thread instructions. - -# OpenClaw Findings (fact extraction) - -## 1) Technology choices (control plane + channel plugins) - -- OpenClaw uses a **single long-lived Gateway daemon + typed WebSocket protocol** as a unified control plane. -- All messaging surfaces (including Discord) attach to the Gateway; clients and nodes connect through the same WS surface, separated by role/capability. -- Discord integration follows official gateway + bot token + account-aware config and behaves as a channel plugin surface. - -Implication for Bricks: default router should not remain an `if/else` branch; it should be a first-class routing target inside the control-plane model. - -## 2) Architecture (routing as a first-class object) - -- OpenClaw is driven by **session route metadata + stable agent identity**, not raw provider passthrough. -- Different channels (Discord/Telegram/etc.) converge on consistent `agent::...` semantics. -- Channel ingress and agent execution are decoupled but composable. - -Implication for Bricks: - -- default router needs stable built-in `nodeId/agentId` included in resolved routing. -- scope settings should return resolved target semantics, not only a router string. - -## 3) Prompt design (OpenClaw-owned prompt assembly) - -- OpenClaw uses a **platform-owned system prompt assembly** model, not transparent passthrough. -- Prompt sections are structured with cache-stable prefixes and runtime-dynamic suffixes. -- Workspace bootstrap files (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, etc.) are injected context; sub-agents use smaller prompt modes. - -Implication for Bricks: - -- default router agentization should move to layered prompt assembly: - - agent layer (default built-in) - - channel layer - - thread layer -- explicit governance is required: inheritance, override, truncation, audit. - -## 4) Why OpenClaw + Discord feels “agent-native” - -- Discord is only the ingress/egress surface; the durable layer is agent/session routing inside Gateway. -- What users perceive as editable instructions, continuity, and cross-channel consistency comes from the unified agent abstraction. - -Implication for Bricks: - -- the correct target is “default router as built-in agent node,” not “default emulating a plugin.” - -# Implementation Plan (phased) - -## Phase 1: Default-router node identity (Backend first) - -1. Introduce built-in default node constants: - - `nodeId: node_builtin_default` - - `sourcePlatform: builtin` - - `displayName: Bricks Default` -2. Extend resolved routing output: - - `router`, `nodeId`, `nodeKind`, `agentName`, `sourcePlatform` -3. In `/api/chat/respond`, emit unified metadata for both default/openclaw: - - `targetNodeId`, `targetNodeName`, `targetPluginId?`, `resolvedRouteKind` - -## Phase 2: Scope setting + UI alignment - -1. Add `resolvedNodeId/resolvedNodeName` to scope-setting query responses. -2. Show default as a built-in node in router menus (no install, read-only). -3. For thread-follow-channel mode, return resolved target semantics to avoid ambiguous inheritance. - -## Phase 3: Prompt assembly + instruction governance - -1. Build a layered prompt assembler: - - base system - - built-in agent instructions - - channel instructions - - thread instructions -2. Add AI instruction-edit service paths (default first, OpenClaw later). -3. Add instruction audit fields: `changedBy`, `changedAt`, `scope`, `diffSummary`. - -## Phase 4: OpenClaw interoperability boundaries - -1. Keep built-in default node independent of plugin lifecycle. -2. Keep OpenClaw node behavior on existing plugin path. -3. Standardize observability fields for mixed-router troubleshooting. - -# Acceptance Criteria - -1. With no OpenClaw nodes configured, default remains usable with stable node identity. -2. Channel/thread instructions inherit/override correctly under default and participate in prompt assembly. -3. UI shows default as built-in node with no import/install workflow. -4. OpenClaw async placeholder/backfill path remains unchanged. -5. In mixed routing (default ↔ openclaw), metadata fields remain consistently observable. - -# Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/node_backend && npm test` -- `cd apps/mobile_chat_app && flutter test` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-06-11-14-UTC-default-router-builtin-node-coding.md b/docs/plans/2026-05-06-11-14-UTC-default-router-builtin-node-coding.md deleted file mode 100644 index 5eda81ae..00000000 --- a/docs/plans/2026-05-06-11-14-UTC-default-router-builtin-node-coding.md +++ /dev/null @@ -1,36 +0,0 @@ -# Background - -The request moved from planning to coding: implement built-in agent/node semantics for the default router, not only documentation. - -# Goals - -1. Introduce a stable built-in node identity for default router on backend. -2. Emit unified route-target metadata in `/api/chat/respond` for default and OpenClaw. -3. Validate no regression through focused backend tests. - -# Implementation Plan (phased) - -## Phase 1 -- Add built-in default node constants and helper in `chatRouterService`. - -## Phase 2 -- Unify metadata output in chat respond path: - - `targetNodeId` - - `targetNodeName` - - `targetSourcePlatform` - - `resolvedRouteKind` - -## Phase 3 -- Update and pass related Vitest suites: - - `src/routes/chat.test.ts` - - `src/services/chatRouterService.test.ts` - -# Acceptance Criteria - -1. Default route writes stable `node_builtin_default` metadata. -2. OpenClaw route continues to write real node metadata. -3. Related tests pass. - -# Validation Commands - -- `cd apps/node_backend && npm test -- --run src/routes/chat.test.ts src/services/chatRouterService.test.ts` diff --git a/docs/plans/2026-05-06-22-09-+08-branch-feature-checklist-analysis.md b/docs/plans/2026-05-06-22-09-+08-branch-feature-checklist-analysis.md deleted file mode 100644 index f5504d8d..00000000 --- a/docs/plans/2026-05-06-22-09-+08-branch-feature-checklist-analysis.md +++ /dev/null @@ -1,32 +0,0 @@ -# Branch Feature Checklist Analysis - -## Background - -The current branch needs to be compared with `main` to identify the planned feature scope, determine which implementation pieces already exist, and list the remaining work. - -## Goals - -- Read branch-added plan files and summarize the intended feature scope. -- Compare branch changes against `main`. -- Map planned acceptance criteria to current code and tests. -- Produce a checklist of completed and remaining work without changing feature behavior. - -## Implementation Plan - -1. Fetch `origin/main`, then compare `origin/main...HEAD` to identify changed files and branch-added plans. -2. Read the added plan files under `docs/plans/`. -3. Inspect backend, Flutter, migration, test, and code-map diffs. -4. Report completed, partial, missing, and risky items with concrete file references. - -## Acceptance Criteria - -- The analysis identifies all branch-added plan files. -- The checklist separates completed work from remaining work. -- The checklist calls out implementation risks where code behavior does not meet the plan. -- No product behavior is changed by this analysis task. - -## Validation Commands - -- `git fetch origin main` -- `git diff --name-status origin/main...HEAD` -- `git diff --stat origin/main...HEAD` diff --git a/docs/plans/2026-05-06-22-42-+08-router-strategy-rename.md b/docs/plans/2026-05-06-22-42-+08-router-strategy-rename.md deleted file mode 100644 index f16ed3fa..00000000 --- a/docs/plans/2026-05-06-22-42-+08-router-strategy-rename.md +++ /dev/null @@ -1,58 +0,0 @@ -# Router Strategy Rename - -## Background - -The current chat routing model uses `router: default | openclaw`. This mixes two concepts: dispatch strategy and concrete external platform. `default` currently means Bricks handles the response locally, while `openclaw` means the message is dispatched to a plugin-backed remote node. Future plugin-backed platforms such as Hermes should use the same remote plugin dispatch strategy without adding platform names to the router enum. - -The branch also adds metadata fields for default-router built-in node identity. The next step should simplify those metadata fields while preserving current business behavior. - -## Goals - -- Rename router semantics from platform-specific values to dispatch-strategy values. -- Use `local` for Bricks-managed direct execution and `plugin` for plugin-backed remote dispatch. -- Keep concrete platform identity, such as OpenClaw or future Hermes, on platform node/plugin configuration instead of the router enum. -- Preserve existing default and OpenClaw behavior during migration. -- Remove redundant target metadata fields that duplicate router semantics. - -## Implementation Plan - -1. Define the target router vocabulary: - - Canonical `ChatRouter` values become `local` and `plugin`. - - Legacy input values `default` and `openclaw` remain accepted during migration and normalize to `local` and `plugin`. -2. Update backend router parsing and persistence: - - Normalize `default -> local` and `openclaw -> plugin` at API boundaries. - - Continue to support existing database rows during read/resolve until a migration is applied. - - Add or update migration logic for stored `chat_scope_settings.router` values. -3. Simplify chat respond target metadata: - - Keep `targetNodeId`, `targetNodeName`, and `targetPluginId`. - - Remove `targetSourcePlatform` and `resolvedRouteKind` from newly written metadata. - - Do not add `targetNodeKind` unless a future router maps to multiple target node categories. -4. Keep platform identity in node/plugin records: - - OpenClaw-specific behavior remains attached to platform node/plugin configuration. - - Future Hermes nodes should also use `router: plugin` and differ by plugin/platform metadata, not router enum. -5. Update Flutter router models and API payloads: - - Rename UI enum values to local/plugin semantics. - - Preserve labels such as `Bricks Default` and `OpenClaw` at presentation boundaries. - - Keep thread inheritance behavior unchanged. -6. Update tests and code maps: - - Backend tests should assert `local/plugin` router behavior and metadata shape. - - Flutter tests should assert legacy parsing compatibility and canonical outgoing values. - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` because this changes chat routing business logic and API contracts. - -## Acceptance Criteria - -- Existing saved `default` scope settings resolve as `local` without changing user-visible behavior. -- Existing saved `openclaw` scope settings resolve as `plugin` and still dispatch to the configured OpenClaw node. -- New scope-setting writes use canonical `local` or `plugin` router values. -- Default Bricks chat still responds through local backend execution. -- OpenClaw chat still creates the dispatch placeholder and waits for plugin-backed remote handling. -- Chat message metadata still includes target node identity, but newly written messages no longer include `targetSourcePlatform` or `resolvedRouteKind`. -- Future plugin-backed platforms can reuse `router: plugin` without adding a new router enum value. -- Code maps are updated for the routing contract change. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/node_backend && npm test -- --run src/routes/chat.test.ts src/services/chatRouterService.test.ts` -- `cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart test/chat_topology_and_task_protocol_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-06-22-44-+08-post-router-refactor-followup.md b/docs/plans/2026-05-06-22-44-+08-post-router-refactor-followup.md deleted file mode 100644 index 22c940c6..00000000 --- a/docs/plans/2026-05-06-22-44-+08-post-router-refactor-followup.md +++ /dev/null @@ -1,74 +0,0 @@ -# Post Router Refactor Follow-up - -## Background - -The router model should first be clarified separately so that `router` means dispatch strategy only: `local` for Bricks-managed direct execution and `plugin` for plugin-backed remote dispatch. This plan assumes that router refactor is already complete and does not include the router rename or migration work. - -After that refactor, the remaining feature work is not to add another router kind. The remaining work is to make Bricks local execution and plugin-backed execution share a clearer target model, expose built-in Bricks targets consistently, and prepare instruction governance without coupling those concepts to OpenClaw-specific names. - -## Goals - -- Expose Bricks built-in local targets consistently in backend and frontend. -- Keep plugin platform identity outside the router enum. -- Preserve current local Bricks response behavior and plugin/OpenClaw dispatch behavior. -- Make scope settings and target metadata easier to consume after router semantics are clarified. -- Continue instruction governance work without changing the already implemented channel/thread instructions behavior. - -## Implementation Plan - -1. Define the built-in Bricks target model after router refactor. - - Keep `node_builtin_default` as the stable built-in target id. - - Keep `Bricks Default` as the display name. - - Treat this as the default local execution target, not as a separate router value. - - Add a compact shared type/helper for local target identity if needed. - -2. Normalize target metadata after router refactor. - - Newly written chat message metadata should include `targetNodeId`, `targetNodeName`, and `targetPluginId`. - - Do not reintroduce `targetSourcePlatform`, `resolvedRouteKind`, or `targetNodeKind` unless a later feature creates a real need. - - Ensure local responses write the built-in target id/name and plugin responses write the plugin node id/name/plugin id. - -3. Expose built-in Bricks target in target-selection surfaces. - - Backend node/target listing should make the built-in local target available as a read-only target. - - Frontend route/target menus should present `Bricks Default` as the local target and plugin nodes separately. - - The UI should still label concrete plugin nodes by their display name and plugin platform where useful, for example OpenClaw. - -4. Align scope-setting responses with resolved target semantics. - - Scope-setting reads should keep the persisted router strategy and node id. - - Where the UI needs display-ready information, return or derive the resolved target id/name after thread inheritance and fallback. - - For thread-follow-channel mode, make the effective target unambiguous without storing duplicate thread settings. - -5. Preserve existing instruction behavior and layer future governance on top. - - Channel and section instructions already save, hydrate, and apply to local/default responses. - - Keep that behavior unchanged. - - Add a future-ready prompt assembly boundary for local Bricks execution: base system prompt, selected agent prompt, channel instructions, section instructions. - - Do not apply local prompt assembly to plugin dispatch unless plugin-specific support is explicitly designed. - -6. Add instruction governance as a separate capability. - - Define inheritance/override semantics for local execution: built-in target defaults -> channel -> section. - - Add audit fields or audit events for instruction changes. - - Add AI-assisted instruction edit endpoints only after the storage and audit model is clear. - -7. Update tests and code maps. - - Add backend tests for built-in target listing/read-only behavior and metadata shape. - - Add frontend tests for target menu presentation and legacy hydrated scope behavior after router refactor. - - Add tests for effective target resolution with thread inheritance and missing plugin nodes. - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` because target resolution and chat routing entry points are affected. - -## Acceptance Criteria - -- Bricks local execution still works with no plugin nodes configured. -- Plugin/OpenClaw dispatch still works when a valid plugin node is configured. -- When a plugin node is missing, existing fallback/error behavior remains unchanged. -- New chat message metadata records the actual target id/name/plugin id without redundant route-kind/source-platform fields. -- The built-in Bricks target is visible where users choose or inspect chat targets, but it is read-only and requires no import/install flow. -- Thread-follow-channel target resolution is clear to the UI and does not require duplicated settings. -- Existing channel and section instructions continue to save, hydrate, clear, and apply to local Bricks responses. -- Instruction governance is introduced behind clear storage/audit semantics, not mixed into router naming. -- Code maps are updated after implementation. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/node_backend && npm test -- --run src/routes/chat.test.ts src/routes/config.test.ts src/services/chatRouterService.test.ts` -- `cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart test/chat_topology_and_task_protocol_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-07-18-29-fix-ios-photo-library-usage-description.md b/docs/plans/2026-05-07-18-29-fix-ios-photo-library-usage-description.md deleted file mode 100644 index be739369..00000000 --- a/docs/plans/2026-05-07-18-29-fix-ios-photo-library-usage-description.md +++ /dev/null @@ -1,15 +0,0 @@ -# Background -Apple rejected iOS build 1 (version 0.1.0) for missing `NSPhotoLibraryUsageDescription` in the Runner app Info.plist. - -# Goals -- Add the required privacy usage string so App Store validation passes ITMS-90683. -- Keep the change minimal and user-facing text clear. - -# Implementation Plan (phased) -1. Inspect iOS Runner Info.plist for existing privacy keys. -2. Add `NSPhotoLibraryUsageDescription` with a clear purpose string. -3. Run a lightweight repo check (git diff) to verify only intended files changed. - -# Acceptance Criteria -- `apps/mobile_chat_app/ios/Runner/Info.plist` contains `NSPhotoLibraryUsageDescription` with a non-empty, user-facing explanation. -- Diff contains only the intended privacy key addition and task plan documentation. diff --git a/docs/plans/2026-05-08-08-43-UTC-composer-focus-keep.md b/docs/plans/2026-05-08-08-43-UTC-composer-focus-keep.md deleted file mode 100644 index e7c88455..00000000 --- a/docs/plans/2026-05-08-08-43-UTC-composer-focus-keep.md +++ /dev/null @@ -1,22 +0,0 @@ -# Background -用户反馈聊天输入框在发送消息(点击发送按钮或按回车)后会丢失焦点,导致无法连续输入下一条消息,影响高频对话体验。 - -# Goals -- 修复发送后输入框失焦问题。 -- 保持现有发送逻辑与流式状态控制不被破坏。 -- 增加回归测试,覆盖“不可发送但可继续输入”的行为。 - -# Implementation Plan (phased) -1. 检查 `ComposerBar` 的输入框可用性与提交后状态切换逻辑,定位导致失焦的条件。 -2. 调整输入框 `enabled` 条件,确保发送动作触发后在非流式阶段仍可保持可输入状态。 -3. 新增/更新 widget test,验证在 `onSend == null`(发送不可用)但非流式时输入框仍可编辑。 -4. 运行相关测试命令并记录结果。 - -# Acceptance Criteria -- 点击发送按钮或按回车发送后,输入框仍可保持焦点并继续输入。 -- 在 `isStreaming == false` 时,即便 `onSend == null`,输入框仍可输入文本。 -- 现有 `composer_bar_test` 全部通过。 - -# Validation Commands -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/composer_bar_test.dart` diff --git a/docs/plans/2026-05-08-09-44-UTC-fix-channel-name-refresh-loss.md b/docs/plans/2026-05-08-09-44-UTC-fix-channel-name-refresh-loss.md deleted file mode 100644 index 29ea74dc..00000000 --- a/docs/plans/2026-05-08-09-44-UTC-fix-channel-name-refresh-loss.md +++ /dev/null @@ -1,18 +0,0 @@ -# Background -Users reported that when creating a channel and entering a custom channel name, refreshing the page causes that channel name to be lost. - -# Goals -- Persist the channel display name at channel creation time so a page refresh restores the custom name. -- Keep behavior consistent with channel rename persistence. - -# Implementation Plan (phased) -1. Inspect channel creation flow in `chat_screen.dart` and confirm whether `saveChannelName` is called when creating channels. -2. Update channel creation logic to persist the newly entered name through `ChatHistoryApiService.saveChannelName` when an auth token is available. -3. Run focused static checks/tests relevant to the modified file. - -# Acceptance Criteria -- Creating a channel with a custom name triggers persistence of that name via the chat history API when authenticated. -- After refresh/reload, the channel retains the user-provided name rather than reverting. - -# Validation Commands -- `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart` diff --git a/docs/plans/2026-05-08-13-46-UTC-disable-navigation-tab-swipe.md b/docs/plans/2026-05-08-13-46-UTC-disable-navigation-tab-swipe.md deleted file mode 100644 index a769f823..00000000 --- a/docs/plans/2026-05-08-13-46-UTC-disable-navigation-tab-swipe.md +++ /dev/null @@ -1,26 +0,0 @@ -# Background -The chat navigation panel currently contains two tabs (Channels and Nodes). A horizontal swipe inside the panel switches tabs by default via `TabBarView`, which conflicts with the desired UX for drawer-like navigation. - -# Goals -- Prevent horizontal swipe from switching tabs inside chat navigation. -- Make a right-to-left swipe in the navigation trigger close behavior. -- Preserve existing tab switching via tab taps. -- Add/adjust tests for the new gesture behavior. - -# Implementation Plan (phased) -1. Update `ChatNavigationPage` gesture handling: - - Disable tab paging gestures in `TabBarView`. - - Add a horizontal drag-end handler that closes navigation on right-to-left swipe. -2. Add widget tests: - - Verify horizontal swipe no longer switches tabs. - - Verify right-to-left swipe requests close. -3. Run targeted Flutter tests for `chat_navigation_page_test.dart`. - -# Acceptance Criteria -- Swiping horizontally inside navigation no longer changes active tab. -- Right-to-left swipe on navigation triggers close callback. -- Existing interactions (tab taps, back button, channel tap logic) continue to work. - -# Validation Commands -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart` diff --git a/docs/plans/2026-05-09-05-45-streaming-scroll-ux-plan.md b/docs/plans/2026-05-09-05-45-streaming-scroll-ux-plan.md deleted file mode 100644 index 3bfab457..00000000 --- a/docs/plans/2026-05-09-05-45-streaming-scroll-ux-plan.md +++ /dev/null @@ -1,24 +0,0 @@ -# Background -当前 `MessageList` 在消息列表发生变化时,会重新聚焦“最新用户消息”。在流式输出阶段,若尾消息标识变化(例如 messageId 补齐或快照字段变化),会触发再次滚动,造成可视区域被不断“往上顶”,底部出现大面积空白,影响阅读体验。 - -# Goals -- 发送消息瞬间:自动将“最新用户消息”定位到靠上位置(保持现有对齐策略)。 -- 流式输出阶段:不再因 assistant 增量输出强制滚动。 -- 用户手动滚动后:不被后续 assistant 输出干预。 -- 页面初次加载/刷新后:仍自动定位到最后一个用户问题。 - -# Implementation Plan (phased) -1. 调整 `MessageList.didUpdateWidget` 的自动滚动触发条件。 - - 仅在“新增的尾消息是 user(用户刚发送)”时触发自动聚焦。 - - 保留 `initState` 的初次定位逻辑,用于页面刷新后的自动定位。 -2. 补充/调整 `message_list_test.dart`。 - - 新增测试:assistant 新消息追加时不应改变当前滚动位置。 - - 保留并验证:streaming 同尾增量时不重滚动。 -3. 运行目标测试确保行为符合预期。 - -# Acceptance Criteria -- 当用户发送一条新消息时,列表自动将该用户消息定位到可视区靠上位置。 -- 当 assistant 流式输出持续更新时,列表位置保持不变,除非用户主动点击“Jump to latest”。 -- 页面首次进入(含刷新)时,仍自动定位到最后一个用户消息。 -- 相关 widget tests 通过。 - diff --git a/docs/plans/2026-05-09-06-10-UTC-chat-navigation-swipe-follow-up.md b/docs/plans/2026-05-09-06-10-UTC-chat-navigation-swipe-follow-up.md deleted file mode 100644 index 5f0675d7..00000000 --- a/docs/plans/2026-05-09-06-10-UTC-chat-navigation-swipe-follow-up.md +++ /dev/null @@ -1,21 +0,0 @@ -# Background -The initial drawer swipe update disabled `TabBarView` paging and added swipe-to-close behavior, but review feedback identified two follow-ups: the close direction should respect RTL layouts, and the non-tab-switch test should avoid accidentally proving the drawer-close path instead. - -# Goals -- Make swipe-to-close respect `Directionality`. -- Keep the “no tab switch on swipe” test focused on tab behavior without triggering close. -- Preserve existing drawer close behavior for LTR navigation. - -# Implementation Plan (phased) -1. Update `ChatNavigationPage` drag-end handling to choose the close swipe direction from the current text direction. -2. Refine widget tests to use a non-fling drag for the tab-stability case and assert no close request occurs. -3. Add RTL widget coverage for swipe-to-close. - -# Acceptance Criteria -- In LTR, a right-to-left fling closes navigation. -- In RTL, a left-to-right fling closes navigation. -- A horizontal drag no longer changes tabs and does not request close. - -# Validation Commands -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart` diff --git a/docs/plans/2026-05-09-10-40-UTC-agent-loop-internal-tools-p0.md b/docs/plans/2026-05-09-10-40-UTC-agent-loop-internal-tools-p0.md deleted file mode 100644 index 804545be..00000000 --- a/docs/plans/2026-05-09-10-40-UTC-agent-loop-internal-tools-p0.md +++ /dev/null @@ -1,64 +0,0 @@ -# Background - -Bricks chat backend currently supports async message transport with SSE synchronization and local/plugin routing. We need to start implementing an internal-tool-first agent loop for local routing, while keeping database changes minimal and reusing existing chat task/message persistence. - -# Goals - -1. Introduce a local agent loop service entrypoint for `/api/chat/respond` local route. -2. Define P0 internal tool names: - - `chat.channel.instruction.set` - - `chat.thread.instruction.set` - - `chat.channel.create` - - `chat.thread.create` -3. Implement instruction tools using existing scope-setting persistence. -4. Keep unsupported tools explicit and structured (not silently ignored). -5. Avoid DB schema changes in this phase. - -# Implementation Plan (phased) - -## Phase 1: Add agent-loop service skeleton -- Add a dedicated service module that defines: - - loop result/status contract - - supported tool constants - - tool execution results -- Keep this module independent from route handler internals. - -## Phase 2: Implement internal tool execution -- Implement `chat.channel.instruction.set` and `chat.thread.instruction.set` by calling `upsertChatScopeSetting`. -- Implement `chat.channel.create` and `chat.thread.create` using `upsertChatScopeSetting` with `scopeType` set appropriately. -- Return deterministic structured results for all tools. - -## Phase 3: Integrate local respond path -- Wire local `/api/chat/respond` to use a model-driven agent loop (`streamWithAgentToolsAndUserConfig`) for slash commands, exposing tools defined in `buildAgentTools`. -- Normal (non-slash) messages use the existing `streamWithUserConfig` path for incremental streaming. -- Preserve current async transport behavior and SSE visibility. - -**Note:** `executeInternalToolSequence` and `inferInternalToolCallsFromMessage` are exported from the service but are **not** currently called by the route. The route instead delegates tool selection and execution to the model via `buildAgentTools` / `streamText`. These functions remain available for future explicit or server-side-inferred tool dispatch. - -## Phase 4: Add focused tests -- Add unit tests for tool dispatch and unsupported-tool behavior. - -# Acceptance Criteria - -1. The codebase contains a local agent-loop service with stable contracts and tool names. -2. Two instruction tools persist settings through existing scope-setting service. -3. Unsupported tools return structured `not_implemented` errors. -4. Existing local respond behavior remains functional. -5. No database migration is introduced. - -# Execution Checklist (live status) - -- [x] Added internal tool constants and allowlist service entrypoint. -- [x] Implemented instruction tools: - - `chat.channel.instruction.set` - - `chat.thread.instruction.set` -- [x] Implemented scope-creation tools: - - `chat.channel.create` - - `chat.thread.create` -- [x] Added bounded internal tool sequence execution (`executeInternalToolSequence`) with stop-on-failure behavior. *(exported from service; not currently called by route — reserved for future server-side dispatch)* -- [x] Added inferred internal tool calls from slash-like user commands (`inferInternalToolCallsFromMessage`). *(exported from service; not currently called by route — reserved for future use)* -- [x] Added route/service tests for tool execution, inference, and argument validation. -- [x] Replaced request-driven tool execution with model-driven multi-step think→call→observe→final loop controller. (`buildAgentTools` + `streamWithAgentToolsAndUserConfig` with AI SDK `streamText` tools + `maxSteps`) -- [x] Gated agent tool exposure to slash-command requests only, preventing unintended tool calls during ordinary conversation. -- [x] Add first-class loop controls (`maxSteps`, `maxToolCalls`, `timeout`) to route-level configuration and response metadata. -- [x] Add step-by-step assistant message updates for each loop phase (not only summary message) to maximize SSE observability. (`onStepFinish` writes per-step tool-call messages with bounded `stepMessageId` ≤ 255 chars) diff --git a/docs/plans/2026-05-15-16-21-+08-chat-scroll-position-gwt.md b/docs/plans/2026-05-15-16-21-+08-chat-scroll-position-gwt.md deleted file mode 100644 index 8b70fcc4..00000000 --- a/docs/plans/2026-05-15-16-21-+08-chat-scroll-position-gwt.md +++ /dev/null @@ -1,240 +0,0 @@ -# Chat Scroll Position GWT - -## Background - -The chat message list needs a precise scroll contract for three related cases: -new user messages, assistant streaming updates, and initial entry into a channel -or section with existing history. - -Current branch work tried to prevent assistant streaming from repeatedly moving -the viewport, while still focusing the latest user message after sends and -history entry. The expected behavior is more nuanced: sending a message should -make a one-time decision from the current viewport, not from a persistent -"locked" flag or from whether the user ever scrolled earlier. Historical entry -must also be based only on the initial recent batch, not on an assumption that -all history has been loaded. - -Chinese message rendering introduces an additional test and UX risk. If the -runtime downloads fonts after the first frame, the message layout can change -after the first scroll calculation, which makes scroll positioning appear -correct in tests but wrong after fonts finish loading. This repository does not -currently show an obvious app-level `google_fonts` or explicit runtime font -loader dependency, so the font-download behavior may come from Flutter web, -CanvasKit, or platform fallback behavior. It should be investigated before it is -treated as part of the scroll fix scope. - -## Goals - -- Define user-observable scroll behavior before changing implementation code. -- Preserve the user's reading position whenever the current viewport indicates - the user is still reading older assistant output. -- Anchor new or historical conversation views around the latest relevant user - message when the send-time viewport indicates the user has already reached - the end of the current assistant output. -- Treat initial historical entry as a recent-batch problem: the app initially - loads only the latest 20 messages, and older history is loaded only after user - scroll/pull actions. -- Avoid relying on every history item being loaded, laid out, or mounted. -- Track Chinese runtime font downloads as a scroll-test risk, but do not treat - the font pipeline as committed implementation scope until ownership is known. - -## Implementation Plan - -1. Classify the viewport at the moment of sending. - - Do not model this as a durable locked/unlocked flag. - - The decision depends on the viewport at send time. - - If the current viewport does not show the end of the current assistant - response, preserve the reading position after the follow-up send. - - If the user previously scrolled but the current viewport now shows the end - of the assistant response, anchor the next sent user message near the top - again. - - Keep assistant streaming updates from changing the viewport while the - current viewport is preserving older content. - -2. Define the send-message anchoring behavior. - - When a new conversation starts, or when the send-time viewport shows the - end of the current assistant response, anchor the newly sent user message - near the top of the viewport. - - For long user messages, align so only approximately the final two lines of - the user message remain visible and the earlier text may be above the - viewport. - - When the send-time viewport does not show the end of the current assistant - response, do not scroll after the follow-up message is sent. - -3. Define initial historical entry behavior. - - On channel switch, section switch, or page refresh restore, load the latest - 20 messages as the initial history batch. - - Search only that initial batch for the latest user message. - - If the initial batch contains a user message, anchor the latest user - message near the top of the viewport and show subsequent assistant, tool, - and status messages below it. - - If the initial batch contains no user message, naturally show the end of - the initial batch without applying user-message top anchoring or extra - waiting-space offset. - -4. Add focused regression coverage. - - Verify actual message visibility and placement, not only that scroll - pixels are greater than zero. - - Cover long user messages, assistant streaming updates, send-time viewport - preservation for follow-up sends, and initial history batches with and - without user messages. - - Include a large-history scenario that proves behavior does not depend on - all history being loaded or mounted. - -5. Investigate Chinese font loading as a risk, not as a committed fix. - - Identify whether runtime font downloads are caused by app code, Flutter - web rendering, CanvasKit, or platform fallback behavior. - - If the cause is controlled by this repository, decide whether to use - bundled app fonts or platform/system font fallback. - - If the cause is outside this repository's practical control, keep it as a - known validation risk and avoid adding it as a hard acceptance criterion - for the scroll fix. - - Use Chinese long-message scenarios in visual validation so font-related - layout shifts are visible even if the font pipeline is not solved here. - -6. Update code maps if implementation changes touch feature entry points, - business logic, tests, or documentation indexes. - -## Acceptance Criteria - -### GWT 1: New conversation with a short user message - -Given the user opens a new conversation with no existing messages -When the user sends a short user message -Then the user message is automatically positioned near the top of the viewport -And the area below it is available for assistant streaming output -And assistant streaming updates do not repeatedly change the user message -position - -### GWT 2: New conversation with a long user message - -Given the user opens a new conversation with no existing messages -When the user sends a long, multi-line user message -Then the viewport is positioned around that user message -And earlier text in the message may be above the viewport -And approximately the final two lines of the message remain visible -And the area below remains available for assistant streaming output - -### GWT 3: Follow-up send when the assistant response end is visible - -Given the conversation already has a previous assistant response -And the end of the current assistant response is visible in the conversation -viewport -When the user sends a follow-up message -Then the new user message is automatically positioned near the top of the -viewport -And long follow-up messages follow the same final-two-lines visibility rule -And assistant streaming updates do not repeatedly take over the scroll position - -### GWT 4: Follow-up send while the assistant response end is not visible - -Given the user is reading a previous long assistant response -And at the moment of sending, the viewport does not show the end of that -assistant response -When the user sends a follow-up message while reading -Then the conversation viewport does not automatically scroll to the new user -message -And the current reading position remains stable -And subsequent assistant streaming updates do not disturb the current reading -position - -### GWT 5: Initial history batch contains at least one user message - -Given the user switches channel, switches section, or refreshes into a section -And the section has existing history -And the app initially loads the latest 20 messages -And those 20 messages contain at least one user message -When the initial history batch finishes loading -Then the viewport is positioned at the latest user message within that initial -batch -And that user message is near the top of the viewport -And the user can see assistant, tool, and status messages that follow that user -message -And the behavior is the same whether the full history has fewer than 20, -hundreds, or thousands of messages - -### GWT 6: Initial history batch contains no user message - -Given the user switches channel, switches section, or refreshes into a section -And the section has existing history -And the app initially loads the latest 20 messages -And those 20 messages contain no user message -When the initial history batch finishes loading -Then the viewport does not apply user-message top anchoring -And the viewport naturally shows the end of the initial batch -And the final assistant, tool, or status message is visible near the bottom of -the viewport -And no extra waiting-space offset is forced - -### GWT 7: Initial batch last round contains many assistant, tool, or status messages - -Given the latest 20 loaded messages include a final round started by one user -message -And that user message is followed by multiple assistant, tool, or status -messages -When the initial history batch finishes loading -Then the viewport uses the latest user message in the initial batch as the -anchor -And it does not treat the latest assistant, tool, or status message as the start -of the final round -And the user can review the final question and the subsequent execution flow - -### GWT 8: Very large history - -Given a channel or section has a very large full history, such as hundreds or -thousands of messages -When the user enters that channel or section -Then the app initially loads only the latest 20 messages -And initial positioning is based only on those 20 messages -And the behavior does not depend on all historical messages being loaded, -rendered, laid out, or mounted -And older history participates only after the user explicitly scrolls or pulls -to load more - -### GWT 9: Assistant streaming updates - -Given the viewport has already been positioned by a send-message or initial -history-entry rule -When assistant output is appended or updated during streaming -Then the streaming update itself does not trigger a new user-message anchoring -operation -And changes such as messageId hydration, taskState changes, content deltas, or -tail message field changes do not cause viewport jumps -And only explicit user actions, such as tapping Jump to latest, may move the -viewport to the latest area while the viewport is preserving older content - -### GWT 10: Send-time protection when the assistant response end is not visible - -Given the viewport does not show the end of the current assistant response at -the moment a follow-up message is sent -When follow-up user messages, assistant appends, streaming updates, or tool -status updates occur -Then the app preserves the user's current reading position -And it does not automatically pull the viewport back to the latest message area - -### GWT 11: User scrolled before but has read through to the assistant response end - -Given the user previously scrolled while reading a long assistant response -And the user later scrolls or reads down until the end of that assistant -response is visible -When the user sends a follow-up message -Then the app bases the decision on the current viewport, not on earlier scroll -history -And the new user message is automatically positioned near the top of the -viewport -And the long-message final-two-lines visibility rule applies when relevant - -### Investigation 1: Chinese runtime font downloads - -Given the conversation contains Chinese user and assistant messages -When the chat screen renders in the target runtime -Then record whether font packages are downloaded after the first frame -And identify whether the download is controlled by app code, Flutter web, -CanvasKit, or platform fallback behavior -And do not require the scroll fix to eliminate this download unless ownership -and a reliable fix are confirmed - -## Validation Commands - -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-15-16-54-+08-local-chat-fixture-db.md b/docs/plans/2026-05-15-16-54-+08-local-chat-fixture-db.md deleted file mode 100644 index 8ff76e0c..00000000 --- a/docs/plans/2026-05-15-16-54-+08-local-chat-fixture-db.md +++ /dev/null @@ -1,51 +0,0 @@ -# Local Chat Fixture Database - -## Background - -Chat scroll behavior needs a repeatable local environment that can load realistic -history without depending on GitHub OAuth or a live production database during -every test run. The production data source is Turso/libSQL, and the backend -already supports libSQL through `TURSO_DATABASE_URL`. - -The local test environment should export a safe subset of chat-related data into -a local `file:` libSQL database, run the backend against that file, and provide a -test JWT for Flutter's existing `BRICKS_TEST_TOKEN` quick-login flow. - -## Goals - -- Build a local fixture database from a remote Turso database without storing - remote credentials in the repository. -- Copy only the tables needed to render chat history, scopes, channel names, and - related node/settings context. -- Provide a repeatable way to generate a dev JWT for a fixture user. -- Let Flutter Web load the local backend and use Quick Login instead of GitHub - OAuth. -- Keep exported fixture files out of git. - -## Implementation Plan - -1. Add a backend script that exports a remote Turso/libSQL database subset into - a local `file:` libSQL database. -2. Add a backend script that prints a local dev JWT for a selected fixture user. -3. Add package scripts for export and token generation. -4. Document the local startup flow with environment variables, backend command, - Flutter command, and quick-login usage. -5. Validate that the exported local DB can answer chat history endpoints through - the normal backend code path. - -## Acceptance Criteria - -- The export command reads remote credentials only from environment variables. -- The export command writes a local DB file under a gitignored cache path. -- The export command does not copy API config secrets by default. -- The local backend can run with `TURSO_DATABASE_URL=file:`. -- The token generation command emits a JWT for the selected fixture user using - the local `JWT_SECRET`. -- Flutter can be launched with `BRICKS_TEST_TOKEN` and `BRICKS_API_BASE_URL` - defines and can enter the app through Quick Login. - -## Validation Commands - -- `cd apps/node_backend && npm run type-check` -- `cd apps/node_backend && npm test` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-15-19-27-+08-evidence-driven-browser-test-env-skill.md b/docs/plans/2026-05-15-19-27-+08-evidence-driven-browser-test-env-skill.md deleted file mode 100644 index 3292ef33..00000000 --- a/docs/plans/2026-05-15-19-27-+08-evidence-driven-browser-test-env-skill.md +++ /dev/null @@ -1,43 +0,0 @@ -# Evidence-Driven Browser Test Environment Skill - -## Background - -Some UI defects cannot be validated confidently through unit tests alone. They -depend on realistic data, historical state variety, browser rendering, scroll -position, user-triggered interactions, asynchronous updates, and screenshot -evidence. - -The repository needs a reusable agent skill that tells future agents how to -construct a trustworthy local or CI validation environment before fixing these -types of issues. - -## Goals - -- Add a repository skill that guides data-backed browser validation work. -- Make the workflow explicit about fixture data, local auth bypasses, real - browser interactions, screenshots, and safe persistence rules. -- Keep the skill general enough for future complex UI/data tasks, not only the - current chat scroll issue. - -## Implementation Plan - -1. Create `.agents/skills/evidence-driven-browser-test-env/SKILL.md`. -2. Define clear trigger conditions for data-dependent, browser-rendered, or - interaction-triggered behavior. -3. Document a practical workflow for building local fixture-backed environments. -4. Document evidence requirements and failure checks. -5. Document what should and should not be committed to Git. - -## Acceptance Criteria - -- The new skill exists under `.agents/skills/`. -- The skill describes when to use it and how to validate interaction-triggered - browser behavior. -- The skill explicitly separates safe committed artifacts from local-only or - sensitive artifacts. -- Future agents can use the skill without needing context from this chat. - -## Validation Commands - -- `test -f .agents/skills/evidence-driven-browser-test-env/SKILL.md` -- `sed -n '1,240p' .agents/skills/evidence-driven-browser-test-env/SKILL.md` diff --git a/docs/plans/2026-05-16-02-20-+00-todos-tables-highlights-tools.md b/docs/plans/2026-05-16-02-20-+00-todos-tables-highlights-tools.md deleted file mode 100644 index d82844a6..00000000 --- a/docs/plans/2026-05-16-02-20-+00-todos-tables-highlights-tools.md +++ /dev/null @@ -1,160 +0,0 @@ -# Todos, Asset Tables, Text Highlights – Unified MCP Tool Architecture - -## Background - -### Context - -The platform already has an agent loop (`localAgentLoopService.ts`) with a small set of -internal tools for chat-management actions (channel rename, create, instruction-set, etc.). -The `buildAgentTools()` function returns an AI-SDK-compatible tool registry closed over -`userId`, and `executeInternalTool()` dispatches each named tool to a typed handler. -The pattern is clean and proven; new domains should follow it exactly. - -The Flutter UI shows AI tool-call progress via `agentLoopPhase = 'tool_call_start'` -messages, and renders tool results as Markdown in `_AssistantMarkdownText`. - -### Problem - -Three new user-facing features are needed, none of which have any backend or UI code yet: - -1. **Todo list** – users want to say "create a todo: buy milk" and have the AI call a - tool, storing it persistently. Querying ("show my todos") should return a Markdown list. -2. **Asset tables** – users want AI-driven dynamic tables: add/remove columns, add/update/delete - rows, all via natural language. The JSONB sparse-storage pattern (separate column registry + - `cell_data JSONB` on rows) allows schema changes without touching row data. -3. **Text highlights** – users want to select text in a message bubble, right-click (or - long-press), choose "Highlight", and have that selection persist across reloads. The AI - should be able to answer "what are my highlights?" by calling a `highlight_list` tool. - -### Motivation - -All three features share the same integration surface: Postgres for persistence, typed -service modules, new `INTERNAL_TOOL_*` constants, and Flutter API services. Building them -together under one plan keeps the architecture consistent and avoids ad-hoc divergence. - -## Goals - -- Implement persistent todo-list CRUD entirely via the existing internal-tool infrastructure. -- Implement JSONB-backed asset tables with column-level schema operations (add/remove column) - that are O(1) in row count. -- Implement text-highlight storage and a Flutter context-menu entry that persists selections. -- Expose all three domains via both the AI agent loop (tool calls visible to the user) and - a REST API so the Flutter client can perform direct CRUD without going through the AI. -- Maintain the existing single-file tool registry pattern (`localAgentLoopService.ts`). - -## Implementation Plan - -### Phase 1 – Database Migrations - -1. **`015_create_user_todos.sql`** – `user_todos` table: - ``` - id UUID PK, user_id UUID FK, title TEXT NOT NULL, notes TEXT, - is_completed BOOLEAN DEFAULT FALSE, display_order INT DEFAULT 0, - created_at TIMESTAMP, updated_at TIMESTAMP - ``` - Index on `(user_id, is_completed)`. - -2. **`016_create_asset_tables.sql`** – three tables: - - `asset_tables`: `id UUID PK, user_id UUID FK, resource_id VARCHAR(255), title TEXT, created_at, updated_at` – UNIQUE `(user_id, resource_id)` - - `asset_table_columns`: `id UUID PK, user_id UUID FK, resource_id VARCHAR(255), column_key VARCHAR(255), display_name TEXT, column_order INT DEFAULT 0, created_at, updated_at` – UNIQUE `(user_id, resource_id, column_key)` - - `asset_table_rows`: `id UUID PK, user_id UUID FK, resource_id VARCHAR(255), display_number INT, cell_data JSONB DEFAULT '{}', is_deleted BOOLEAN DEFAULT FALSE, created_at, updated_at` - Index on `(user_id, resource_id)` for all three tables. - -3. **`017_create_text_highlights.sql`** – `text_highlights` table: - ``` - id UUID PK, user_id UUID FK, message_id VARCHAR(255) NOT NULL, - selected_text TEXT NOT NULL, start_offset INT, end_offset INT, - color VARCHAR(32) DEFAULT 'yellow', - created_at TIMESTAMP, updated_at TIMESTAMP - ``` - Index on `(user_id, message_id)`. - -### Phase 2 – Backend Services - -4. **`todoService.ts`** – `createTodo`, `listTodos`, `updateTodo`, `deleteTodo`, - `completeTodo`. Each function takes `userId` as first arg, returns typed DTOs. - -5. **`assetTableService.ts`** – functions: - - `createTable`, `listTables`, `getTable` (with columns + rows joined) - - `addColumn`, `removeColumn` (DELETE from `asset_table_columns`) - - `addRow` (INSERT with cell_data), `updateRow` (JSONB merge UPDATE), - `deleteRow` (soft-delete `is_deleted = true`) - Reading rows always JOINs `asset_table_columns` as the authority for active columns; - `cell_data` keys not in the column registry are silently ignored. - -6. **`textHighlightService.ts`** – `createHighlight`, `listHighlights`, - `listHighlightsByMessageId`, `deleteHighlight`. - -### Phase 3 – Internal Tool Registry - -7. **Add constants** to `localAgentLoopService.ts`: - - Todo: `todo_create`, `todo_list`, `todo_complete`, `todo_update`, `todo_delete` - - Table: `table_create`, `table_list`, `table_get`, `table_add_column`, - `table_remove_column`, `table_add_row`, `table_update_row`, `table_delete_row` - - Highlight: `highlight_list` (read-only; manual create is done from Flutter) - -8. **Extend `executeInternalTool()`** with `switch` cases for every new constant, - delegating to the service functions added in Phase 2. - -9. **Extend `buildAgentTools()`** with AI-SDK tool definitions (description + parametersSchema) - for every new constant. Tool results for todo/table should return data that the model can - format as Markdown for the user. - -### Phase 4 – REST Routes - -10. **`resources.ts`** – Express router at `/api/resources`, authenticated: - - `GET /todos`, `POST /todos`, `PATCH /todos/:id`, `DELETE /todos/:id` - - `GET /tables`, `POST /tables`, `GET /tables/:resourceId`, - `POST /tables/:resourceId/columns`, `DELETE /tables/:resourceId/columns/:columnKey`, - `POST /tables/:resourceId/rows`, `PATCH /tables/:resourceId/rows/:rowId`, - `DELETE /tables/:resourceId/rows/:rowId` - - `GET /highlights`, `POST /highlights`, `DELETE /highlights/:id` - -11. **Register** in `app.ts`: `app.use('/api/resources', resourcesRoutes)`. - -### Phase 5 – Flutter Client - -12. **`todo_api_service.dart`** – service class mirroring the REST surface; - methods: `listTodos`, `createTodo`, `updateTodo`, `completeTodo`, `deleteTodo`. - -13. **`asset_table_api_service.dart`** – `listTables`, `getTable`, `createTable`, - `addColumn`, `removeColumn`, `addRow`, `updateRow`, `deleteRow`. - -14. **`text_highlight_api_service.dart`** – `listHighlights`, `createHighlight`, - `deleteHighlight`. - -15. **Text highlight context menu in `message_list.dart`**: - - Each assistant message bubble wraps content in a `SelectionArea` child. Use - `ContextMenuController` / `AdaptiveTextSelectionToolbar` to intercept the platform - context menu, inject a "Highlight" button. - - On "Highlight": read the selected text + approximate character range, POST to - `/api/resources/highlights`, then call `setState` to add the highlight to an in-memory - map and re-render the message with a `TextSpan(background: highlightColor)`. - - On screen load: `GET /api/resources/highlights` filtered by current channel/session, - populate the in-memory highlight map before first render. - -## Acceptance Criteria - -- User types "add a todo: finish the report" and sees the AI emit a `tool_call_start` bubble - followed by a confirmation message listing the new todo item. -- User types "show my todos" and the AI calls `todo_list`, then responds with a Markdown - checklist of todos. -- User types "create a table called Tasks with columns Name and Status" and the AI calls - `table_create` then `table_add_column` twice; a subsequent "show the Tasks table" - returns a Markdown table. -- User types "add a column Priority to Tasks table" and the AI calls `table_add_column` - with O(1) DB cost (no row UPDATE required). -- User selects text in an assistant message bubble and sees a "Highlight" option in the - context menu. After tapping, the selected text appears with a yellow background. -- After reloading the app (or reopening the channel), the highlight is still visible on - the same message. -- User types "what are my highlights?" and the AI calls `highlight_list`, returning the - stored highlighted texts in a readable list. -- All existing tests pass; no regressions on chat, channel, or agent-loop behaviour. - -## Validation Commands - -- `cd apps/node_backend && npm run build` -- `cd apps/node_backend && npm test` -- `cd apps/mobile_chat_app && flutter analyze` -- `cd apps/mobile_chat_app && flutter test` diff --git a/docs/plans/2026-05-16-08-13-+00-highlight-floating-toolbar.md b/docs/plans/2026-05-16-08-13-+00-highlight-floating-toolbar.md deleted file mode 100644 index ea702ad6..00000000 --- a/docs/plans/2026-05-16-08-13-+00-highlight-floating-toolbar.md +++ /dev/null @@ -1,105 +0,0 @@ -# Highlight Floating Toolbar - -## Background - -### Context - -The text highlight feature has partial infrastructure in place: - -- `TextHighlightApiService` — CRUD API client for highlights (create / delete / list by messageId). -- `HighlightSpan` / `_AssistantMarkdownText` — renders highlights as a semi-transparent yellow background over matching text spans inside assistant messages. -- `MessageList` — accepts `highlights: Map>` and `onHighlight` callback, and inserts a "划线" button into the system `AdaptiveTextSelectionToolbar` when text is selected. - -**However**, `ChatScreen` does not wire up these props — it passes `MessageList(messages: _messages)` with no highlights map and no `onHighlight` callback, so the highlight system is completely disconnected end-to-end. - -### Problem - -1. The `ChatScreen` never loads highlights from the API and never passes them to `MessageList`, so no persisted highlights are ever shown. -2. The current selection toolbar is the platform's default `AdaptiveTextSelectionToolbar`, which is positioned by the OS and visually inconsistent. The custom "划线" entry is appended to the end of whatever system buttons the OS provides. -3. There is no **copy** or **hide** button in the custom toolbar (copy exists in the default system buttons, but is not part of any custom-styled bar). -4. There is no **delete highlight** action — a user cannot remove an existing highlight. -5. Tapping an already-highlighted span does nothing. - -### Motivation - -The user expects a cohesive, discoverable experience: -- Slide-select → custom floating toolbar with 划线 / 复制 / 隐藏. -- Tap an already-highlighted span → floating toolbar with 删除划线 / 复制 / 隐藏. -- Toolbar is visually positioned near the selection (above or below), not in a system default corner. - ---- - -## Goals - -- Wire up the highlight feature end-to-end: load, render, create, and delete highlights. -- Replace the system `AdaptiveTextSelectionToolbar` with a compact custom floating toolbar. -- Add **复制** (copy to clipboard) and **隐藏** (hide/fold message) actions to the toolbar. -- Show **删除划线** instead of **划线** when the selected text is already fully highlighted. -- Allow tapping any highlighted span to trigger the delete toolbar without needing a long-press/drag selection. - ---- - -## Implementation Plan - -### Phase 1 — Wire up ChatScreen - -1. Add `TextHighlightApiService` instance to `_ChatScreenState` (alongside `_chatHistoryApiService`). -2. Add state field `Map> _highlights = {}`. -3. In `_loadMessagesForActiveScope`, after messages are loaded and `_authToken` is available, call `TextHighlightApiService.listHighlights` for every `messageId` in the loaded messages that belongs to an assistant role. Group results into `_highlights` and update via `setState`. Use the same scope-staleness guard pattern already used for message loading. -4. Add `_handleCreateHighlight(String messageId, String selectedText, int? start, int? end)` method — calls `createHighlight`, then calls `listHighlights` for that `messageId` and refreshes `_highlights` via `setState`. -5. Add `_handleDeleteHighlight(String highlightId, String messageId)` method — calls `deleteHighlight`, then refreshes `_highlights` for that messageId. -6. Add `_handleHideMessage(String messageId)` stub — adds the messageId to a `Set _hiddenMessageIds` state field; the message list can filter or collapse those messages (out of scope for this plan; just the stub needed here). -7. Pass `highlights`, `onHighlight`, `onDeleteHighlight`, and `onHideMessage` into the `MessageList` constructor in the `chatContent` build. - -### Phase 2 — Custom floating toolbar - -1. Replace `AdaptiveTextSelectionToolbar.buttonItems` in `MessageList.contextMenuBuilder` with a new private widget `_SelectionToolbar`. -2. `_SelectionToolbar` is a `Material`-wrapped `Row` of `InkWell` text buttons (pill-shaped, compact), using `ChatColors` or `Theme` tokens. -3. Buttons: **划线** (or **删除划线** if already highlighted), **复制**, **隐藏**. -4. Position using `selectableRegionState.contextMenuAnchors.primaryAnchor` (or `secondaryAnchor` if it would be off-screen). -5. To detect **"already highlighted"**: check if `_lastSelectedText` is a substring of any `HighlightSpan.selectedText` in the highlights map for any assistant message that contains the selection. Pass the relevant `highlights` map as a parameter so `contextMenuBuilder` can evaluate it synchronously. -6. **划线** action: call `widget.onHighlight` (existing callback). -7. **删除划线** action: find the matching `HighlightSpan` for the selected text and call a new `widget.onDeleteHighlight` callback. -8. **复制**: call `Clipboard.setData(ClipboardData(text: _lastSelectedText))` then `ContextMenuController.removeAny()`. -9. **隐藏**: call new `widget.onHideMessage` callback with the messageId of the message containing the selection, then dismiss. - -### Phase 3 — Tap-on-highlighted-span - -1. Add `onDeleteHighlight` and `onHideMessage` parameters to `_AssistantMarkdownText`. -2. In `_splitSpanByHighlights`, for each highlighted `TextSpan`, attach a `TapGestureRecognizer` that: - - Locates the `HighlightSpan` matching that text fragment. - - Shows a lightweight `OverlayEntry` positioned at the tap's global offset containing a `_SelectionToolbar` in "delete mode" (showing 删除划线, 复制, 隐藏 for the highlighted text). Dismiss the overlay on second tap or on any other gesture. - -### Phase 4 — MessageList API additions - -Add to `MessageList`'s constructor (and propagate through `_MessageListState` / `_AssistantMarkdownText`): - -``` -onDeleteHighlight: void Function(String highlightId, String messageId)? -onHideMessage: void Function(String messageId)? -``` - -The existing `onHighlight` signature is unchanged. - ---- - -## Acceptance Criteria - -- After sliding to select text in an assistant message, a floating toolbar appears **near the selection** (not in a system corner) with buttons labeled **划线**, **复制**, and **隐藏**. -- Tapping **划线** creates a highlight via the API; the selected text gains a yellow background immediately (optimistic update or reload). -- Tapping **复制** copies the selected text to the clipboard and dismisses the toolbar. -- Tapping **隐藏** invokes the hide callback and dismisses the toolbar. -- When text that is already highlighted is selected, the **划线** button changes to **删除划线**. -- Tapping **删除划线** calls the delete API and removes the yellow background from the affected span. -- Tapping directly on a yellow-highlighted span (without dragging) shows the same toolbar in delete mode. -- After navigating away and back to a conversation, previously created highlights are still rendered. -- The floating toolbar does not appear for user-bubble messages (highlight only applies to assistant messages). - ---- - -## Validation Commands - -```sh -cd apps/mobile_chat_app && flutter analyze -cd apps/mobile_chat_app && flutter test -``` diff --git a/docs/plans/2026-05-16-08-20-+00-resources-tab-in-navigation-sidebar.md b/docs/plans/2026-05-16-08-20-+00-resources-tab-in-navigation-sidebar.md deleted file mode 100644 index e3c2d699..00000000 --- a/docs/plans/2026-05-16-08-20-+00-resources-tab-in-navigation-sidebar.md +++ /dev/null @@ -1,73 +0,0 @@ -# Resources Tab in Navigation Sidebar - -## Background - -### Context - -The chat navigation sidebar (`ChatNavigationPage`) currently has two tabs: **Channels** and **Nodes**. It is mounted inside a `Drawer` (or inline sidebar on desktop) and is the primary navigation surface of the mobile chat app. - -There are already two resource services in the codebase: -- `TodoApiService` – manages todo-lists and their items -- `AssetTableApiService` – manages asset tables (columns + rows) - -Both services return summary objects via their list endpoints: `listTodoLists()` returns `TodoList` (without items) and `listTables()` returns `AssetTableSummary`. - -### Problem - -Users have no way to browse or open their todo-lists and asset tables from the navigation sidebar. There is no entry point for resource discovery in the current two-tab layout. - -### Motivation - -A dedicated **Resources** tab between Channels and Nodes gives users a single place to see all their structured data resources at a glance. Clicking any item opens a preview page, establishing the navigation pattern for richer resource views in future iterations. - -## Goals - -- Add a single **Resources** tab to the navigation sidebar, positioned between Channels and Nodes. -- Display all todo-lists and all asset tables as a flat list (no section headers) in that tab, distinguished by icon. -- Tapping any resource item opens a preview page showing the resource's summary information. -- Load resource summaries during app initialisation alongside the existing platform-node loading. -- Keep the change backward-compatible: existing tests pass with minimal updates. - -## Implementation Plan - -1. **Data models** (`chat_navigation_page.dart`) - - Add `enum ChatResourceType { todoList, assetTable }`. - - Add `class ChatResourceItem` with fields: `id`, `type`, `title`, `notes` (nullable). - -2. **Navigation page – Resources tab** (`chat_navigation_page.dart`) - - Add `resources` parameter (`List`, defaults to `const []`) and optional `onResourceSelected` callback. - - Change `TabController(length: 2)` → `length: 3`. - - Update `TabBar` to show three tabs: **Channels**, **Resources**, **Nodes**. - - Insert a new `ListView` as the middle `TabBarView` child that renders each `ChatResourceItem` with a type-specific icon (`Icons.checklist_outlined` for todo-lists, `Icons.table_chart_outlined` for tables), the title, and an optional subtitle from `notes`. - - On tap: call `onResourceSelected` if provided; otherwise push `_ResourcePreviewPage` internally via `Navigator.of(context).push(...)`. - - Update class doc-comment to mention the new Resources tab. - -3. **Resource preview page** (`chat_navigation_page.dart`) - - Add private `_ResourcePreviewPage` widget (like `_NodeDetailPage`) that receives a `ChatResourceItem` and displays its type icon, title, and notes in a `Scaffold` with `AppBar`. - -4. **Load resources in ChatScreen** (`chat_screen.dart`) - - Import `todo_api_service.dart` and `asset_table_api_service.dart`. - - Add service instances `_todoApiService` and `_assetTableApiService`. - - Add state lists `_todoLists` (type `List`) and `_assetTables` (type `List`). - - Inside `_loadAgents()`, after auth token resolves, load both resource lists best-effort (same pattern as platform nodes) and include them in the final `setState`. - - Build a combined `resources` list in `_buildNavigationContent` and pass it to `ChatNavigationPage`. - -5. **Update tests** (`chat_navigation_page_test.dart`) - - Rename the existing "two tabs" test to verify three tabs (Channels, Resources, Nodes). - - Add a test for Resources tab empty state. - - Add a test for Resources tab showing items (mixed todo-list and table items). - - Add a test verifying tapping a resource opens the preview page. - -## Acceptance Criteria - -- The navigation sidebar shows three tabs: Channels, Resources, Nodes (in that order). -- The Resources tab displays a flat list of all loaded todo-lists (checklist icon) and asset tables (table icon) without section headers. -- Tapping a resource item navigates to a preview page showing the item's title and notes (if present). -- When no resources are loaded the Resources tab shows a "No resources" empty state message. -- Existing Channels and Nodes tab behaviour is unchanged. -- All existing and new widget tests pass. - -## Validation Commands - -- `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-16-17-40-+08-ios-testflight-pr-workflow.md b/docs/plans/2026-05-16-17-40-+08-ios-testflight-pr-workflow.md deleted file mode 100644 index fcc08ba2..00000000 --- a/docs/plans/2026-05-16-17-40-+08-ios-testflight-pr-workflow.md +++ /dev/null @@ -1,47 +0,0 @@ -# iOS TestFlight PR Workflow - -## Background - -The `go-puzzle` repository has a GitHub Actions workflow that builds an iOS IPA, -uploads it to TestFlight, and labels the associated PR after a successful -upload. - -Bricks needs the same release-support workflow for the mobile Flutter app in -this monorepo. The workflow should be limited to pull requests targeting a -designated release branch so it does not run expensive macOS packaging for -every pull request. - -## Goals - -- Add a GitHub Actions workflow that builds and uploads the iOS app to - TestFlight. -- Trigger the expensive build only for PRs whose target branch is - `testflight-beta`. -- Add a `testflight-uploaded` label to the associated PR only after upload - succeeds. -- Keep secrets and signing configuration in GitHub Actions secrets. - -## Implementation Plan - -1. Add `.github/workflows/ios-testflight.yml`. -2. Scope the workflow to same-repository pull requests targeting `testflight-beta` - and manual dispatch. -3. Run Flutter and CocoaPods commands from `apps/mobile_chat_app`. -4. Configure iOS bundle id and team through existing `Release.xcconfig` - variables using GitHub secrets. -5. Use Codemagic CLI tools to fetch signing files and publish the IPA. -6. Create or update the PR label after a successful upload. - -## Acceptance Criteria - -- A PR targeting `testflight-beta` triggers the TestFlight workflow. -- PRs targeting other branches do not run the expensive iOS packaging job. -- A successful TestFlight upload adds `testflight-uploaded` to the associated - PR. -- The workflow can also be run manually through `workflow_dispatch`. -- No App Store Connect credentials, certificate keys, or bundle identifiers are - hardcoded beyond secret names and existing local defaults. - -## Validation Commands - -- `ruby -e 'require "yaml"; YAML.load_file(".github/workflows/ios-testflight.yml"); puts "workflow yaml ok"'` diff --git a/docs/plans/2026-05-16-17-58-+08-mobile-agents-directory-setup-fix.md b/docs/plans/2026-05-16-17-58-+08-mobile-agents-directory-setup-fix.md deleted file mode 100644 index 78c392c0..00000000 --- a/docs/plans/2026-05-16-17-58-+08-mobile-agents-directory-setup-fix.md +++ /dev/null @@ -1,40 +0,0 @@ -# Mobile Agents Directory Setup Fix - -## Background - -After GitHub login on the locally installed iOS app, chat setup fails with: - -`Unsupported operation: agentsDirectory is not supported on this platform.` - -Chat setup creates the local agents repository before loading persisted scopes -and messages. Because `PlatformPathsImpl.agentsDirectory()` only supported -desktop platforms, iOS threw before history hydration could run, making the app -look like the signed-in account had no history. - -## Goals - -- Support mobile sandbox paths for the local agents directory. -- Avoid blocking chat history hydration on iOS/Android. -- Keep desktop and web path behavior unchanged. - -## Implementation Plan - -1. Extend `PlatformPathsImpl` to return iOS sandbox paths under - `Library/Application Support` and `Library/Caches`. -2. Extend Android paths under the app sandbox inferred from `Directory.systemTemp`. -3. Update `PlatformPaths` documentation. -4. Validate with Dart/Flutter analysis and reinstall the iOS app locally. - -## Acceptance Criteria - -- iOS no longer throws `agentsDirectory is not supported on this platform` - during chat setup. -- GitHub-authenticated mobile users can proceed to scope/message hydration after - login. -- Existing desktop path behavior is preserved. - -## Validation Commands - -- `dart format packages/platform_bridge/lib/src/io/platform_paths_io.dart packages/platform_bridge/lib/src/platform_paths.dart` -- `flutter analyze` -- `flutter run --release -d ` diff --git a/docs/plans/2026-05-16-22-43-+08-ios-debug-api-base-url.md b/docs/plans/2026-05-16-22-43-+08-ios-debug-api-base-url.md deleted file mode 100644 index 7380892a..00000000 --- a/docs/plans/2026-05-16-22-43-+08-ios-debug-api-base-url.md +++ /dev/null @@ -1,36 +0,0 @@ -# iOS Debug API Base URL - -## Background - -Local debug builds currently default non-web platforms to `http://localhost:3000`. -That is useful for desktop development, but it is wrong for iOS device testing: -`localhost` points at the phone, not the developer machine or production API. - -For GitHub OAuth and real account history validation on iPhone, iOS debug builds -should use the same production API as release builds unless a developer -explicitly overrides `BRICKS_API_BASE_URL`. - -## Goals - -- Make iOS debug builds default to `https://bricks.askman.dev`. -- Preserve web debug behavior: use the current browser origin. -- Preserve local desktop/other debug behavior: use `http://localhost:3000`. -- Keep `BRICKS_API_BASE_URL` as the highest-priority explicit override. - -## Implementation Plan - -1. Update `LlmConfigService.resolveBaseUrl()`. -2. Add a focused test for iOS debug platform selection. -3. Reinstall the app on the connected iPhone for validation. - -## Acceptance Criteria - -- iOS debug builds use the production API by default. -- Existing local non-web test builds continue to use localhost. -- Developers can still override the API base URL with `BRICKS_API_BASE_URL`. - -## Validation Commands - -- `flutter test test/llm_config_service_test.dart` -- `flutter analyze` -- `flutter run -d ` diff --git a/docs/plans/2026-05-16-23-21-+08-ios-sandbox-path-without-home.md b/docs/plans/2026-05-16-23-21-+08-ios-sandbox-path-without-home.md deleted file mode 100644 index b2d85144..00000000 --- a/docs/plans/2026-05-16-23-21-+08-ios-sandbox-path-without-home.md +++ /dev/null @@ -1,35 +0,0 @@ -# iOS Sandbox Path Without HOME - -## Background - -The iOS debug app can show `Failed to load chat setup: Unsupported operation: HOME environment variable is not available on this platform.` during startup. The mobile platform path implementation added iOS support but still used `Platform.environment['HOME']`, which is not reliable in the iOS app sandbox. - -## Goals - -- Resolve iOS document, cache, and agents directories without reading `HOME`. -- Keep desktop behavior unchanged. -- Preserve Android mobile path behavior. -- Add a small unit test for the mobile temp-directory-to-app-container path logic. -- Keep chat history loading independent from local custom-agent file availability. - -## Implementation Plan - -1. Add a mobile app data directory resolver based on `Directory.systemTemp.path`. -2. Use that resolver for iOS `Documents`, `Library/Caches/bricks`, and `Library/Application Support/bricks/agents`. -3. Keep Android on the same temp-parent resolver it already effectively used. -4. Make startup custom-agent loading best-effort so local file path failures fall back to built-in agents and do not block remote chat setup. -5. Validate the resolver with platform-independent unit tests. - -## Acceptance Criteria - -- iOS path resolution does not call `_requiredEnv('HOME')`. -- `agentsDirectory()` on iOS resolves under the app sandbox `Library/Application Support/bricks/agents`. -- Startup chat setup no longer fails because `HOME` is missing. -- Startup chat setup continues loading scopes, channel names, and active history even if local custom-agent files cannot be read. -- Existing mobile chat API base URL behavior remains unchanged. - -## Validation Commands - -- `cd packages/platform_bridge && dart test` -- `cd apps/mobile_chat_app && flutter test test/llm_config_service_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-17-00-04-+08-table-tool-error-and-turso-compatibility.md b/docs/plans/2026-05-17-00-04-+08-table-tool-error-and-turso-compatibility.md deleted file mode 100644 index 17b0162e..00000000 --- a/docs/plans/2026-05-17-00-04-+08-table-tool-error-and-turso-compatibility.md +++ /dev/null @@ -1,99 +0,0 @@ -# Table Tool Error and Turso Compatibility Fix - -## Background - -The historical chat stream can show a `table_create` tool call stuck in the -"calling" state. Database inspection showed two different failure modes in the -same assistant response: - -- The first `table_create` call returned a normal tool result with - `ok: false` because the model omitted the required `resourceId` argument. -- The second `table_create` call had valid arguments, but no persisted - `tool_call` result row. A direct non-mutating SQL probe showed the underlying - `createTable` query fails on Turso/libSQL because it uses PostgreSQL's - `NOW()` function. - -The UI difference comes from persistence, not from user intent. Business-level -tool failures are persisted as result rows, while thrown tool execution errors -from the AI SDK stream are currently ignored by the backend stream wrapper. - -## Goals - -- Make asset table mutations compatible with the repository's Turso/libSQL - production database. -- Persist tool execution errors so tool starts cannot remain permanently stuck - in `dispatched`. -- Preserve clear UX semantics: started, completed successfully, completed with - business failure, and completed with execution error should be distinguishable - in history. -- Add focused regression coverage for both the SQL compatibility issue and the - missing `tool-error` persistence path. - -## Implementation Plan - -1. Fix Turso-compatible asset table writes. - - Replace PostgreSQL-only timestamp expressions in asset table write paths - with SQL that works under Turso/libSQL. - - Audit nearby table, column, and row mutation queries for other - PostgreSQL-only functions or syntax. - - Keep existing PostgreSQL behavior working if the service is still run with - a PostgreSQL `DATABASE_URL`. - -2. Persist AI SDK tool execution errors. - - Extend the stream event model in `apps/node_backend/src/llm/llm_service.ts` - to handle `tool-error` parts from `result.fullStream`. - - Route tool execution errors through a callback with the same step and call - identity used by `tool-call` start messages. - - Upsert a tool result/error message for the failed step and mark the - matching `:tc::` start message as completed or failed instead - of leaving it `dispatched`. - -3. Recheck step/call identity handling. - - Confirm `onToolCallStart`, `onStepFinish`, and any new error callback use a - single consistent source of step and call indexes. - - Avoid creating synthetic completed rows with IDs that do not match the - original start row. - -4. Update tests. - - Add or extend backend tests for `table_create` against the Turso dialect or - a SQL conversion path that catches SQLite-incompatible expressions. - - Add a stream wrapper test where the SDK emits `tool-call`, then - `tool-error`, then final text, and assert that the persisted history has no - permanently dispatched start row. - - Add a route-level regression test if needed to verify the message IDs and - task states shown to clients. - -5. Validate with realistic data. - - Reproduce the historical `show me a table` scenario locally with a fixture - or test database. - - Confirm the UI/history shows a completed error state rather than a stale - "calling" row if execution fails. - - Confirm a valid `table_create` request creates or updates an asset table in - Turso/libSQL. - -6. Update documentation and maps. - - Keep the Turso compatibility note in `docs/kb/`. - - Update code maps if implementation changes feature entry points, backend - tool logic, or validation indexes. - -## Acceptance Criteria - -- A valid `table_create` call with `resourceId` and `title` succeeds against - Turso/libSQL and leaves an `asset_tables` row. -- A `table_create` execution error is visible in chat history as a completed or - failed tool event, not as an indefinitely "calling" event. -- The first invalid-arguments failure still appears as a normal tool result with - the returned `invalid_args` payload. -- Message ordering remains deterministic for tool start, tool result/error, and - final assistant text. -- Tests cover the Turso SQL compatibility bug and the AI SDK `tool-error` - persistence bug. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/node_backend && npm test -- --run src/services/localAgentLoopService.test.ts` -- `cd apps/node_backend && npm test -- --run src/routes/chat.test.ts` -- `cd apps/node_backend && npm run type-check` -- `cd apps/mobile_chat_app && flutter test` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-18-17-43-CST-ios-build.md b/docs/plans/2026-05-18-17-43-CST-ios-build.md deleted file mode 100644 index 38ba8f15..00000000 --- a/docs/plans/2026-05-18-17-43-CST-ios-build.md +++ /dev/null @@ -1,50 +0,0 @@ -# iOS Build Environment Preparation - -## Background - -The repository contains a Flutter mobile application at `apps/mobile_chat_app`. The task is to install the project dependencies needed locally and build the iOS app. - -## Goals - -- Bootstrap the repository development environment. -- Install Flutter and iOS dependencies for the mobile app. -- Produce or verify an iOS build from the mobile app package directory. - -## Implementation Plan - -### Phase 1: Bootstrap - -- Run `./tools/init_dev_env.sh` from the repository root. -- Inspect dependency files for the mobile app and iOS project. - -### Phase 2: Install Dependencies - -- Run Flutter package resolution from `apps/mobile_chat_app`. -- Install CocoaPods dependencies from the iOS project if required. - -### Phase 3: Build - -- Run the Flutter iOS build from `apps/mobile_chat_app`. -- If signing blocks device builds, retry a simulator-compatible build. - -## Acceptance Criteria - -- Flutter dependencies are resolved for `apps/mobile_chat_app`. -- iOS native dependencies are installed when the iOS project requires them. -- The iOS app build command completes, or any remaining blocker is identified with the exact failing command and reason. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter pub get` -- `cd apps/mobile_chat_app/ios && pod install` -- `cd apps/mobile_chat_app && flutter build ios --no-codesign` - -## Current Outcome - -- Repository bootstrap completed after fixing the local Flutter shim to point at `/Users/admin/.local/tools/flutter/bin/flutter`. -- CocoaPods 1.16.2 is installed through Homebrew. -- `file_picker` was upgraded to a version that no longer emits the desktop default plugin warnings during `flutter pub get`. -- The iOS Podfile now explicitly declares `platform :ios, '13.0'`, removing the CocoaPods platform warning. -- `flutter pub get` and `pod install` complete successfully. -- iOS app build is still blocked by Xcode reporting that iOS 26.5 is not installed as a usable platform/destination, even after downloading the iOS 26.5 Simulator runtime once. A repeated download was stopped because it restarted from 0% and was not making useful progress toward a new build result. diff --git a/docs/plans/2026-05-18-22-22-+08-highlight-selection-offsets.md b/docs/plans/2026-05-18-22-22-+08-highlight-selection-offsets.md deleted file mode 100644 index 4ae387df..00000000 --- a/docs/plans/2026-05-18-22-22-+08-highlight-selection-offsets.md +++ /dev/null @@ -1,35 +0,0 @@ -# Highlight Selection Offsets - -## Background - -PR 255 added highlight creation and deletion through Flutter selection toolbars, but the implementation still identifies highlights by selected text. That is fragile for repeated text, markdown rendering, code blocks, tables, and selections that span multiple rendered blocks. The UI needs to keep the floating toolbar path working while storing enough range information to render a single logical highlight as multiple visual subsegments. - -## Goals - -- Restore a reliable selection toolbar for assistant message highlights. -- Resolve the selected message before creating or deleting a highlight. -- Prefer stored message offsets over text search when rendering highlights. -- Render a logical highlight across markdown paragraphs, code blocks, and table cells as separate visual subsegments. -- Preserve the existing backend API shape while improving client-side behavior for existing highlight records. - -## Implementation Plan - -1. Move highlight selection menu handling from the whole message list to per-assistant-message selection scopes so the selected text is associated with a stable message id. -2. Add message-level selected text resolution that maps rendered selection text back to normalized message offsets when possible, falling back to bounded text search for older or ambiguous cases. -3. Update highlight rendering to use `startOffset` and `endOffset` first, splitting each rendered text run by range intersections instead of searching for matching text inside every span. -4. Apply the same range-splitting path to markdown paragraph text, block quotes, code blocks, and table cell text so one highlight can produce multiple visual subsegments. -5. Add focused widget tests for duplicate text, code block/table/cross-paragraph rendering, and callback offsets. -6. Check whether code maps need updates because this changes feature entry paths and highlight logic. - -## Acceptance Criteria - -- Selecting text in an assistant message shows `划线` in the floating selection toolbar. -- Creating a highlight calls the callback with the selected assistant message id and a non-null range when the selection can be resolved. -- Existing highlights with stored ranges render only at their intended message offsets, even when the same text appears elsewhere. -- A single highlight range can visibly underline multiple rendered pieces when it crosses paragraph, markdown, code, or table boundaries. -- Selecting an existing highlighted range can show `删除划线` and delete the matching highlight without searching other messages first. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart` diff --git a/docs/plans/2026-05-19-10-50-+08-unified-authenticated-api-client.md b/docs/plans/2026-05-19-10-50-+08-unified-authenticated-api-client.md deleted file mode 100644 index 93742ac2..00000000 --- a/docs/plans/2026-05-19-10-50-+08-unified-authenticated-api-client.md +++ /dev/null @@ -1,91 +0,0 @@ -# Unified Authenticated API Client - -## Background - -The mobile chat app currently uses several different authentication patterns for API calls. Some UI code caches an auth token and decides whether actions should run. Some API services require callers to pass `required String token` and manually build `Authorization` headers. Other services call `AuthService.getToken()` internally but still duplicate header construction. - -This makes user actions fragile. A visible action can silently do nothing when the UI token cache is stale, and every service has to reimplement token lookup, authorization header formatting, missing-token handling, and unauthorized response handling. - -The target architecture is a single authenticated HTTP path used by every login-required API call. - -## Goals - -- Move token lookup and `Authorization` header injection out of UI widgets and individual feature services. -- Make UI actions call business operations without checking token state first. -- Use one shared authenticated client for missing-token and unauthorized-response behavior. -- Keep API services focused on business parameters and response parsing. -- Preserve testability by allowing an injected underlying `http.Client`. -- Migrate incrementally, starting with the text highlight flow that exposed the current no-op failure. - -## Implementation Plan - -1. Define the authenticated API boundary. - - Add an authenticated HTTP client or request executor near the auth/API infrastructure. - - The client should fetch the current token through `AuthService.getToken()` for each authenticated request. - - The client should inject `Authorization: Bearer ` and merge any caller-provided headers. - - The client should expose request methods needed by existing services, such as `get`, `post`, `put`, `patch`, and `delete`. - - The client should accept an optional underlying `http.Client` so tests can keep using mock clients. - -2. Standardize auth error semantics. - - Introduce a missing-token error for authenticated requests made without a token. - - Introduce an unauthorized error for HTTP 401 responses. - - Keep the first implementation local to API/service boundaries and avoid forcing global navigation behavior into the client. - - Add tests proving missing token does not become a silent no-op. - -3. Migrate the text highlight application flow first. - - Convert `TextHighlightApiService` so callers no longer pass a token. - - Route create/list/delete highlight requests through the authenticated client. - - Keep highlight-specific request bodies, response parsing, and range logic inside the highlight service. - - Update `ChatScreen` highlight handlers so they invoke the service directly and handle typed auth errors with visible feedback. - - Verify the user-visible flow: select text, show the floating toolbar, click the highlight action, send a network request, and render the highlight after success. - -4. Remove token gating from highlight UI actions. - - Ensure toolbar visibility and action availability are based on selection state and callback wiring, not `_authToken != null`. - - Treat authentication failure as an operation result, not as a reason to suppress the UI action. - - Add a regression test for the previous failure mode where the toolbar was visible but the highlight action performed no request. - -5. Migrate shared chat resource services. - - Convert `TodoApiService` and `AssetTableApiService` to use the authenticated client. - - Remove `required String token` from public methods that only need authentication as transport context. - - Update call sites to pass business inputs only. - - Add focused service tests for authorization header injection and missing-token handling through the shared client. - -6. Migrate chat history operations. - - Convert `ChatHistoryApiService` to the authenticated client. - - Remove duplicated `Authorization` header construction from conversation, message, deletion, metadata, and usage-reporting methods. - - Update `ChatScreen` and related call sites so chat history operations no longer depend on cached token state. - - Keep any UI-level logged-in state only for display, routing, or initial loading decisions. - -7. Migrate settings and LLM configuration APIs. - - Convert `LlmConfigService` from direct `AuthService.getToken()` calls and manual headers to the authenticated client. - - Preserve existing settings error messages while routing auth errors through the shared semantics. - - Add or update tests for settings API calls so they validate behavior through the shared client. - -8. Consolidate UI auth state usage. - - Audit `ChatScreen` and other feature screens for `_authToken`, `authToken`, and token-based action gating. - - Remove cached token reads where the value is only used to call an API. - - Keep explicit auth checks only at application boundaries where they control routing, login state display, or session bootstrap. - -9. Update tests, code maps, and documentation. - - Add authenticated-client unit tests. - - Update feature tests for highlight selection and highlight creation. - - Run the relevant Flutter test suites and analyzer. - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` because this change touches feature entry points, business logic, and tests. - -## Acceptance Criteria - -- Highlight creation no longer depends on `ChatScreen._authToken` being populated before the toolbar action is wired. -- Clicking the highlight action after selecting text sends an authenticated request when a token exists. -- Missing token produces a visible user-facing error instead of a silent no-op. -- Text highlight, todo, asset table, chat history, and LLM configuration services use the same authenticated request path after their migration phases. -- No feature service manually formats `Authorization: Bearer ` after it has been migrated. -- UI code no longer passes raw token strings into migrated services. -- Tests cover authenticated header injection, missing-token behavior, unauthorized-response behavior, and the highlight toolbar action path. -- Code maps are reviewed and updated for the new authenticated API path and affected feature tests. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && PATH=/Users/admin/.local/tools/flutter/bin:$PATH flutter analyze` -- `cd apps/mobile_chat_app && PATH=/Users/admin/.local/tools/flutter/bin:$PATH flutter test test/message_list_test.dart test/highlight_selection_toolbar_web_test.dart` -- `cd apps/mobile_chat_app && PATH=/Users/admin/.local/tools/flutter/bin:$PATH flutter test -d chrome test/highlight_selection_toolbar_web_test.dart` diff --git a/docs/plans/2026-05-19-11-55-+08-highlight-toolbar-union-ranges.md b/docs/plans/2026-05-19-11-55-+08-highlight-toolbar-union-ranges.md deleted file mode 100644 index 6912a9d8..00000000 --- a/docs/plans/2026-05-19-11-55-+08-highlight-toolbar-union-ranges.md +++ /dev/null @@ -1,63 +0,0 @@ -# Highlight Toolbar And Union Ranges - -## Background - -Text highlight creation now works end to end and persisted highlights survive reloads. Two interaction and rendering gaps remain: - -- Tapping an existing highlighted span should show the same compact floating toolbar style used for selected text, with Copy and Delete Highlight actions. -- When a new highlight overlaps or touches an existing highlight, the visual result should behave like the union of those ranges. The current renderer can process overlapping ranges independently and duplicate text fragments. - -Cross-paragraph selection toolbar behavior is explicitly out of scope for this change. - -## Goals - -- Show a compact floating toolbar with `复制` and `删除划线` when the user taps an existing highlighted span. -- Reuse the same floating toolbar visual language and pointer-down action behavior as the selection toolbar. -- Merge overlapping or adjacent highlight ranges before rendering so repeated highlight coverage never duplicates text. -- Keep persisted highlight records compatible with the existing backend API. -- Document the toolbar behavior in a design-md style design note. - -## Implementation Plan - -1. Update highlight tap interaction. - - Replace the old popup menu for tapped highlighted spans with a transparent `showGeneralDialog` overlay. - - Position the overlay near the tap point and clamp it within the viewport. - - Render the same `_SelectionFloatingToolbar` component with `复制` and `删除划线`. - - Trigger copy/delete on pointer down, matching the fixed selection toolbar behavior. - -2. Merge highlight ranges before rendering. - - Convert stored offset highlights and legacy selected-text highlights into `_HighlightRange` values as before. - - Sort ranges by start/end. - - Coalesce overlapping or adjacent ranges into one visual range. - - Preserve a representative highlight id for delete actions and concatenate selected text only for copy fallback. - -3. Strengthen tests. - - Add a widget test for overlapping highlights that verifies text is not duplicated. - - Add a widget test that tapping a highlighted span shows `复制` and `删除划线` and calls the delete callback. - - Keep the existing Chrome selection toolbar tests. - -4. Add design-md documentation. - - Create a small design note under `docs/design/` describing the floating toolbar's trigger states, actions, placement, dismissal, and visual tokens. - - Reference the design note from code maps for the text highlight feature. - -5. Update code maps and validate. - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml`. - - Run Flutter format, analyzer, and focused tests. - - Validate code map YAML. - -## Acceptance Criteria - -- Tapping an existing highlighted span opens a floating toolbar with `复制` and `删除划线`. -- Tapping `复制` from that toolbar copies the highlighted text. -- Tapping `删除划线` invokes the delete callback for the tapped highlight. -- Overlapping, contained, or adjacent highlight records render as one continuous visual highlight without duplicated text. -- Existing non-overlapping highlights still render in the correct positions. -- The design note documents the floating toolbar in a reusable design-md format. - -## Validation Commands - -- `cd apps/mobile_chat_app && PATH=/Users/admin/.local/tools/flutter/bin:$PATH dart format lib/features/chat/widgets/message_list.dart test/message_list_test.dart test/highlight_selection_toolbar_web_test.dart` -- `cd apps/mobile_chat_app && PATH=/Users/admin/.local/tools/flutter/bin:$PATH flutter test test/message_list_test.dart test/highlight_selection_toolbar_web_test.dart` -- `cd apps/mobile_chat_app && PATH=/Users/admin/.local/tools/flutter/bin:$PATH flutter test -d chrome test/highlight_selection_toolbar_web_test.dart` -- `cd apps/mobile_chat_app && PATH=/Users/admin/.local/tools/flutter/bin:$PATH flutter analyze` -- `ruby -e "require 'yaml'; YAML.load_file('docs/code_maps/feature_map.yaml'); YAML.load_file('docs/code_maps/logic_map.yaml'); puts 'code maps yaml ok'"` diff --git a/docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md b/docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md deleted file mode 100644 index 6fdc8ee8..00000000 --- a/docs/plans/2026-05-19-13-02-CST-highlight-list-and-auth-api-architecture.md +++ /dev/null @@ -1,63 +0,0 @@ -# Highlight List Rendering and Authenticated API Architecture - -## Background - -The merged text highlight work made the floating toolbar visible, persisted highlights through the backend, rendered normal stored ranges, and added toolbar actions for existing highlights. Main now has a usable baseline, but two larger follow-up areas remain. - -First, hierarchical Markdown list content can send highlight create requests and receive responses, but the rendered structure does not reliably show the persisted highlight. The current assistant message renderer parses each Markdown list line into a marker and text row, but it does not preserve nested list structure as first-class render metadata. Highlight spans are applied to visible text ranges, while indentation and markers are rendered separately. - -Second, authenticated API calls are not yet architecturally consistent. Text highlight calls now use `AuthenticatedApiClient`, but chat history, todo resources, asset table resources, LLM config, and parts of `ChatScreen` still manually fetch, cache, pass, or format auth tokens. - -## Goals - -- Make text highlights render reliably in hierarchical Markdown list items without losing structure, duplicating text, or depending on selected-text search. -- Represent a logical highlight as one or more visible subsegments when the source range crosses rendered Markdown structures. -- Add regression coverage for nested list highlighting, including persisted highlights after reload-like rendering. -- Move authenticated mobile API calls toward a single `AuthenticatedApiClient` path so UI code no longer formats `Authorization` headers or passes token strings as business parameters. -- Keep the two tracks staged so highlight rendering fixes can ship independently from the broader auth migration. - -## Implementation Plan - -1. Stabilize the highlight renderer for hierarchical lists. - - Add focused widget tests for nested unordered and ordered list content with stored highlight ranges. - - Verify whether failures come from source-offset mapping, list item rendering, or marker/text split boundaries. - - Extend the Markdown block/list metadata so rendered list text keeps source ranges, nesting level, marker identity, and visible text ranges. - - Apply highlight splitting against visible source-backed segments, allowing one persisted highlight to render as multiple subsegments when needed. - - Preserve current behavior for paragraphs, code blocks, tables, overlapping ranges, tapped highlight toolbar, and selection toolbar actions. - -2. Improve highlight selection normalization. - - Normalize selections that include list indentation or markers to a durable visible-text range when the selected text is inside a list item. - - Keep backend payload compatibility with `messageId`, `selectedText`, `startOffset`, `endOffset`, and `color`. - - Avoid creating duplicate visual text when new highlights overlap existing highlight records. - -3. Define the authenticated API migration boundary. - - Treat `AuthenticatedApiClient` as the only transport for logged-in REST APIs in the mobile app. - - Extend it only where needed for migrated services, such as additional HTTP verbs and JSON request helpers. - - Keep auth errors typed through `MissingAuthTokenException` and `UnauthorizedApiException`. - -4. Migrate authenticated API services in low-risk phases. - - First migrate resource services that are close to text highlights: todo lists and asset tables. - - Then migrate chat history calls, which have wider UI impact. - - Then migrate LLM config service away from repeated manual `AuthService.getToken()` calls. - - Finally remove UI-level token plumbing where services no longer require it. - -5. Update documentation and code maps. - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` if feature entry points, highlight logic, tests, or API architecture indexes change. - - Keep the highlight floating toolbar design note aligned if toolbar behavior changes. - -## Acceptance Criteria - -- A stored highlight inside a nested Markdown list item renders visibly at the correct text after widget rebuild. -- Nested list indentation and markers remain visually correct while the highlighted text is rendered once. -- A highlight range that overlaps list structure boundaries is normalized or split so visible list text is highlighted instead of silently disappearing. -- Existing highlight tests for paragraphs, code blocks, tables, overlapping ranges, toolbar copy, and delete behavior continue to pass. -- Migrated services no longer accept `required String token` or manually create `Authorization: Bearer ...` headers. -- UI code does not block migrated API actions only because a cached `_authToken` field is null; missing auth is reported through the service error path. -- Code maps identify the highlight renderer and authenticated API client as regression-sensitive areas. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart test/highlight_selection_toolbar_web_test.dart test/text_highlight_api_service_test.dart` -- `cd apps/mobile_chat_app && flutter test` -- `npx js-yaml docs/code_maps/feature_map.yaml > /dev/null && npx js-yaml docs/code_maps/logic_map.yaml > /dev/null && echo "code maps yaml ok"` diff --git a/docs/plans/2026-05-19-14-27-CST-tool-call-thinking-group.md b/docs/plans/2026-05-19-14-27-CST-tool-call-thinking-group.md deleted file mode 100644 index a17cd8d0..00000000 --- a/docs/plans/2026-05-19-14-27-CST-tool-call-thinking-group.md +++ /dev/null @@ -1,36 +0,0 @@ -# Tool Call Thinking Group - -## Background - -Tool call result messages can render large JSON payloads inline in the chat stream. Users need to know that the assistant is processing, but the raw tool type, arguments, and payload are diagnostic details rather than primary chat content. - -## Goals - -- Collapse adjacent tool call messages into one compact inline status object. -- Visually attach the assistant answer immediately after a tool group to that group by suppressing the repeated assistant header. -- Use the user-facing labels `正在思考 completed/total` while the group is active and `思考过程 completed/total` when the group is complete. -- Do not show tool names, tool types, arguments, or JSON payloads in the outer chat stream. -- Keep non-adjacent tool groups separate. - -## Implementation Plan - -1. Identify agent-loop tool messages in `MessageList`, including tool start and tool result phases. -2. Group only consecutive tool messages during message list rendering. -3. Render a single status row for each group with completed and total counts. -4. When a plain assistant text message immediately follows a tool group, suppress its repeated agent header and let its metadata close the combined visual turn. -5. Keep reasoning and step-text agent-loop phases on their existing rendering path. -6. Add widget tests for active/completed groups, adjacent merging, non-adjacent separation, and header suppression after a tool group. - -## Acceptance Criteria - -- A single in-progress tool displays `正在思考 0/1`. -- A completed tool displays `思考过程 1/1`. -- Adjacent completed tools display one row, for example `思考过程 2/2`. -- Non-adjacent tool calls display separate rows. -- The assistant text immediately after a tool group does not show a duplicate assistant header. -- Raw `Tool: ...` JSON content is not visible in the chat stream for grouped tool calls. - -## Validation Commands - -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-19-17-06-CST-navigation-resources-highlights.md b/docs/plans/2026-05-19-17-06-CST-navigation-resources-highlights.md deleted file mode 100644 index 8bf916fd..00000000 --- a/docs/plans/2026-05-19-17-06-CST-navigation-resources-highlights.md +++ /dev/null @@ -1,35 +0,0 @@ -# Navigation Resources Highlights - -## Background - -The chat navigation drawer has a Resources tab that currently lists todo lists and asset tables. Text highlights are persisted through `/api/resources/highlights` and rendered in assistant messages, but they are not visible from the Resources navigation surface. - -## Goals - -- Show saved text highlights in the chat navigation Resources tab alongside other atomic resources. -- Sort Resources tab items by update time descending across all resource types. -- Add a type filter at the top of the Resources tab. -- Preserve the existing todo-list and asset-table resource behavior. -- Update code maps because the change affects a user-visible navigation entry point and highlight resource behavior. - -## Implementation Plan - -1. Extend the chat navigation resource model with a text-highlight resource type and an `updatedAt` sort key. -2. Update the Resources tab to sort atomic resources by update time descending and expose type filter chips. -3. Feed loaded highlights from `ChatScreen` into the navigation resources collection. -4. Add or update widget tests covering highlight resources, sorting, filtering, and preview behavior. -5. Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml`. - -## Acceptance Criteria - -- Saved highlights appear in the Resources tab after highlights are loaded. -- Resources are not grouped by type; all resource items are shown as atomic rows sorted by newest update time first. -- The Resources tab has a top filter that can narrow the list by resource type. -- Highlight resources use a distinct highlight icon and show the highlighted text as the resource title. -- Tapping a highlight resource opens a preview page identifying it as a text highlight. -- Existing todo-list and asset-table resources still render with their current labels and icons. - -## Validation Commands - -- `cd apps/mobile_chat_app && flutter test test/chat_navigation_page_test.dart` -- `npx js-yaml docs/code_maps/feature_map.yaml > /dev/null && npx js-yaml docs/code_maps/logic_map.yaml > /dev/null && echo "code maps yaml ok"` diff --git a/docs/plans/2026-05-19-17-38-CST-subsection-rename-menu.md b/docs/plans/2026-05-19-17-38-CST-subsection-rename-menu.md deleted file mode 100644 index 01effcf5..00000000 --- a/docs/plans/2026-05-19-17-38-CST-subsection-rename-menu.md +++ /dev/null @@ -1,36 +0,0 @@ -# Subsection Rename Menu - -## Background - -The chat header subsection dropdown currently shows placeholder actions for subsection rename and archive. Users need the menu to be grouped, hide current-section actions while in the main section, and allow a child subsection to be renamed from the dropdown. - -## Goals - -- Rework the subsection dropdown into the requested groups. -- Enable subsection rename for non-main subsections. -- Keep main section immutable from this menu. -- Persist renamed subsection labels through the existing chat naming API shape without breaking channel rename behavior. - -## Implementation Plan - -1. Update the mobile chat header menu builder so the first group contains only "新建子区", the second group appears only for child subsections with a small "当前组" title and rename/archive actions, and the final group lists main plus child subsections. -2. Add a subsection rename dialog using the same validation style as channel rename. -3. Archive child subsections locally from the current channel list and return the user to the main section. -4. Extend chat name persistence to support optional `threadId` while preserving existing channel-only callers. -5. Update code maps and focused tests for API serialization and route behavior. - -## Acceptance Criteria - -- In the main section, the subsection dropdown shows "新建子区" and the section list but does not show "当前组", "改名", or "归档". -- In a child subsection, the dropdown shows "当前组" as a small muted group title above "改名" and "归档". -- Choosing "改名" opens a dialog, validates blank and duplicate names, and updates the subsection label after saving. -- Choosing "归档" removes the current child subsection from the dropdown and switches back to "主区". -- Subsection display names can be saved and loaded with `threadId` without changing existing channel name behavior. - -## Validation Commands - -- `./tools/init_dev_env.sh --flutter-home /Users/admin/.local/tools/flutter --no-doctor` -- `cd apps/mobile_chat_app && dart format lib/features/chat/chat_screen.dart lib/features/chat/chat_history_api_service.dart test/chat_history_api_service_test.dart` -- `cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart` -- `cd apps/node_backend && npm test -- src/routes/chat.test.ts` -- `npx js-yaml docs/code_maps/feature_map.yaml >/dev/null && npx js-yaml docs/code_maps/logic_map.yaml >/dev/null` diff --git a/docs/plans/2026-05-20-11-13-CST-local-cloud-db-debug.md b/docs/plans/2026-05-20-11-13-CST-local-cloud-db-debug.md deleted file mode 100644 index 94dd3d4a..00000000 --- a/docs/plans/2026-05-20-11-13-CST-local-cloud-db-debug.md +++ /dev/null @@ -1,38 +0,0 @@ -# Local Cloud DB Debug Mode - -## Background - -The backend can start with Turso credentials from `.env.local`, but the Express -app middleware always runs migrations before serving requests. That makes local -debug sessions against the production Turso database risky and can also block -simple health checks when the remote migration request times out. - -## Goals - -- Allow local backend requests to skip migrations when `AUTO_MIGRATE=false`. -- Keep the existing migration behavior unchanged when the flag is absent. -- Preserve the existing Flutter test-token quick login flow for local web - testing against a local API. - -## Implementation Plan - -1. Update the Express migration middleware to treat `AUTO_MIGRATE=false` as an - explicit request to skip migrations. -2. Add focused backend coverage for the skip behavior. -3. Validate that the backend can start against Turso and serve `/api/health` - with migrations disabled. - -## Acceptance Criteria - -- A local backend started with `AUTO_MIGRATE=false` serves `/api/health` without - attempting to run migrations. -- Existing request-time migration behavior remains active when - `AUTO_MIGRATE` is not set to `false`. -- Flutter web can be launched with `BRICKS_API_BASE_URL` and - `BRICKS_TEST_TOKEN` from `.env.local`. - -## Validation Commands - -- `npm test -- src/app.test.ts` -- `AUTO_MIGRATE=false npm run dev` -- `curl http://localhost:3010/api/health` diff --git a/docs/plans/2026-05-21-10-41-CST-channel-new-ui-harness.md b/docs/plans/2026-05-21-10-41-CST-channel-new-ui-harness.md deleted file mode 100644 index 70d1c6e3..00000000 --- a/docs/plans/2026-05-21-10-41-CST-channel-new-ui-harness.md +++ /dev/null @@ -1,46 +0,0 @@ -# Channel New UI Evidence Harness - -## Background - -The New Channel flow is user-visible and spans Flutter UI state, authenticated -API calls, and persisted `chat_channel_names` rows. A final screenshot alone is -not enough to diagnose failures because the same symptom can come from local UI -state, API persistence, database writes, or refresh-time hydration. - -## Goals - -- Provide one reusable command that validates the sidebar New Channel flow in a - real browser against the local backend. -- Capture UI, API, and direct Turso database checkpoints so failures identify - the broken layer. -- Store all generated evidence under ignored `.cache/` paths and keep secrets - in `.env.local`. - -## Implementation Plan - -1. Add a `tools/evidence/channel_new_ui_harness/run.sh` entrypoint that loads - `.env.local`, starts the backend and Flutter web server when needed, prepares - local harness dependencies, and runs the browser validation. -2. Add a Playwright-based Node harness that performs Quick Login, opens the - sidebar, creates a unique channel through the New Channel UI, checks API and - Turso rows, reopens the sidebar, refreshes the page, and writes screenshots - plus JSON checkpoint files. -3. Add a README documenting the single-command workflow, required environment - variables, cloud-DB write behavior, evidence layout, and failure diagnosis. - -## Acceptance Criteria - -- Running `tools/evidence/channel_new_ui_harness/run.sh` produces a - `summary.json` under `.cache/evidence/channel-new-ui//`. -- The harness records UI screenshots before creation, after creation, and after - refresh. -- The harness records `/api/chat/channel-names` responses and a direct - `chat_channel_names` query for the generated channel name. -- A passing run proves the New Channel sidebar flow displays immediately, - persists through the API/database layer, survives sidebar reopen, and survives - browser refresh. - -## Validation Commands - -- `tools/evidence/channel_new_ui_harness/run.sh` -- `test -f .cache/evidence/channel-new-ui//summary.json` diff --git a/docs/plans/2026-05-21-12-03-CST-evidence-checkpoint-testing-docs.md b/docs/plans/2026-05-21-12-03-CST-evidence-checkpoint-testing-docs.md deleted file mode 100644 index 40bc95ca..00000000 --- a/docs/plans/2026-05-21-12-03-CST-evidence-checkpoint-testing-docs.md +++ /dev/null @@ -1,40 +0,0 @@ -# Evidence Checkpoint Testing Docs - -## Background - -The channel New UI harness proved useful because it tested the same path a user -uses in the product, while also checking the API and database state behind that -visible result. The reusable lesson is not specific to channels: browser -evidence is most useful when it is paired with scoped data checkpoints and an -explicit test identity. - -## Goals - -- Document the reusable local browser plus API plus database checkpoint pattern. -- Make the fixture-user boundary explicit so cloud database rows are not - confused with rows for a different production user. -- Link the concrete channel New UI harness to the general testing pattern. -- Keep code maps aligned with the new testing documentation. - -## Implementation Plan - -1. Add a reusable testing note under `docs/testing/` that describes the - environment shape, checkpoint layers, artifact naming, and failure reading. -2. Update the channel New UI harness README to link to the general note and - explain that cloud Turso rows are scoped to `FIXTURE_USER_ID`. -3. Update code maps so future agents can discover the general testing note from - the backend/runtime evidence entry. - -## Acceptance Criteria - -- The documentation explains why the harness can write a row that is not visible - to another logged-in production user. -- The documentation describes UI, API, and direct database checkpoints in a - reusable way. -- The channel harness README points to the reusable documentation. -- YAML code maps remain parseable. - -## Validation Commands - -- `npx js-yaml docs/code_maps/feature_map.yaml >/dev/null` -- `npx js-yaml docs/code_maps/logic_map.yaml >/dev/null` diff --git a/docs/plans/2026-05-21-12-09-CST-scope-config-thread-label.md b/docs/plans/2026-05-21-12-09-CST-scope-config-thread-label.md deleted file mode 100644 index 43a3507c..00000000 --- a/docs/plans/2026-05-21-12-09-CST-scope-config-thread-label.md +++ /dev/null @@ -1,61 +0,0 @@ -# Scope Config Thread Label - -## Background - -The chat conversation config dialog currently presents two tabs as `Channel` and -`Section`. The product concept has moved to `Thread`, and the underlying scope -model already uses `thread` for persisted settings. - -## Goals - -- Rename user-facing `Section` labels in the conversation config dialog to - `Thread`. -- Keep the `Instructions` field label fully visible in the dialog. -- Add English `Rename` and `Archive` actions to the top channel dropdown. -- Keep default channels protected from rename and archive actions. -- Rename the Navigation channel creation button to `New Channel`. -- Constrain the top channel dropdown height so long channel lists scroll inside - the menu. -- Keep storage/API scope names unchanged. -- Update code maps so the UI acceptance notes use the current product language. - -## Implementation Plan - -1. Update the scope config dialog tab, hint text, disabled main-scope message, - and save-error wording from section to thread. -2. Add enough top padding around the multiline instruction fields so their - floating labels are not clipped by the tab view. -3. Add a channel dropdown function group before the channel list and route the - actions to the existing channel rename/archive handlers. -4. Disable channel rename/archive menu entries when the active channel is the - default channel. -5. Update the Navigation channels tab create button and its widget test to use - English copy. -6. Add a responsive max-height constraint to the top channel popup menu. -7. Leave existing private implementation names alone unless they directly render - user-facing copy. -8. Update feature and logic code maps for the `Channel / Thread` wording and - channel dropdown management actions. - -## Acceptance Criteria - -- Opening the top-right conversation config dialog shows `Channel` and `Thread` - tabs. -- In the main thread, the thread tab explains that the main thread uses channel - instructions only and cannot be saved. -- In a child thread, the thread tab describes thread-specific narrower context. -- The `Instructions` label is fully visible above both multiline fields. -- The top channel dropdown shows `Rename` and `Archive` actions above the - channel list. -- `Rename` and `Archive` are disabled for the default channel. -- Non-default channel rename and archive actions use the same persistence paths - as the navigation sidebar actions. -- The Navigation channels tab create button reads `New Channel`. -- Long channel dropdown lists stay within a bounded height and scroll inside the - popup. -- Existing persisted channel/thread instruction behavior is unchanged. - -## Validation Commands - -- `./tools/init_dev_env.sh` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-21-12-38-CST-local-manual-ai-test-env-docs.md b/docs/plans/2026-05-21-12-38-CST-local-manual-ai-test-env-docs.md deleted file mode 100644 index 72141c16..00000000 --- a/docs/plans/2026-05-21-12-38-CST-local-manual-ai-test-env-docs.md +++ /dev/null @@ -1,43 +0,0 @@ -# Local Manual AI Test Environment Docs - -## Background - -The local manual test setup proved useful for validating realistic chat behavior -without deploying: the browser runs a local Flutter Web build, the API is local, -the database is cloud Turso, auth uses the fixture test token, and the fixture -user can have a real Gemini configuration created through the local backend. - -## Goals - -- Document the reusable manual test setup for local API plus local Flutter Web - plus cloud Turso. -- Explain how to provide an AI provider token without pasting it into chat. -- Explain the encryption boundary for fixture-user LLM configs written through - the local backend. -- Update the evidence-driven browser-test skill so future agents reuse this - pattern. - -## Implementation Plan - -1. Add a `docs/testing/` guide for launching the local manual AI test - environment. -2. Include environment variables, LLM config creation, startup commands, - verification probes, and shutdown commands. -3. Update the evidence skill with a manual cloud-DB test mode and token-handling - guidance. -4. Update code maps so future agents can discover the guide. - -## Acceptance Criteria - -- A developer can start the local backend and Flutter Web app from the guide. -- The guide keeps provider tokens in `.env.local` and never asks for them in - conversation. -- The guide explains why fixture-user configs may not be visible to a real - production user. -- The guide explains how `ENCRYPTION_KEY` affects local reads of LLM configs - written to cloud Turso. - -## Validation Commands - -- `npx js-yaml docs/code_maps/feature_map.yaml >/dev/null` -- `npx js-yaml docs/code_maps/logic_map.yaml >/dev/null` diff --git a/docs/plans/2026-05-21-14-17-CST-evidence-case-loop-skill.md b/docs/plans/2026-05-21-14-17-CST-evidence-case-loop-skill.md deleted file mode 100644 index 6ef72169..00000000 --- a/docs/plans/2026-05-21-14-17-CST-evidence-case-loop-skill.md +++ /dev/null @@ -1,37 +0,0 @@ -# Evidence Case Loop Skill - -## Background - -The existing `evidence-driven-browser-test-env` skill describes how to gather -browser, API, database, screenshot, and secret-safe evidence. A separate -case-level workflow is useful for stubborn bugs: create a dedicated evidence -case directory, prove the bug with baseline evidence, fix code, then rerun the -same path to prove the fix. - -## Goals - -- Add a concise repo skill for the case-level evidence loop. -- Keep browser startup, screenshots, auth bypass, API/DB checks, and secret - handling delegated to `evidence-driven-browser-test-env`. -- Standardize the per-case directory contract around `AGENTS.md`, `run.sh`, - flow scripts, checkpoint scripts, and `summary.json`. - -## Implementation Plan - -1. Create `.agents/skills/evidence-case-loop/SKILL.md`. -2. Define the skill trigger, dependency boundary, case directory shape, loop - steps, evidence output convention, and final reporting expectations. -3. Keep the skill self-contained and avoid auxiliary README files. - -## Acceptance Criteria - -- The skill clearly says it does not decide when evidence is required. -- The skill explicitly references `evidence-driven-browser-test-env` for - browser/environment mechanics. -- The skill requires baseline-before-fix and rerun-after-fix evidence. -- The skill uses `AGENTS.md`, not `README.md`, as the case contract. - -## Validation Commands - -- `test -f .agents/skills/evidence-case-loop/SKILL.md` -- `sed -n '1,220p' .agents/skills/evidence-case-loop/SKILL.md` diff --git a/docs/plans/2026-05-21-14-20-CST-channel-dropdown-height-evidence-case.md b/docs/plans/2026-05-21-14-20-CST-channel-dropdown-height-evidence-case.md deleted file mode 100644 index bfba3aee..00000000 --- a/docs/plans/2026-05-21-14-20-CST-channel-dropdown-height-evidence-case.md +++ /dev/null @@ -1,35 +0,0 @@ -# Channel Dropdown Height Evidence Case - -## Background - -The top chat channel dropdown can become too tall when many channels exist. The -fix added a popup menu height constraint, but the behavior needs browser -evidence rather than only static code inspection. - -## Goals - -- Add a case-specific evidence harness following `evidence-case-loop`. -- Verify the current implementation with a real Flutter Web browser run. -- Capture screenshots and numeric checkpoints for menu height and internal - scrolling. - -## Implementation Plan - -1. Create `tools/evidence/channel_dropdown_height/` with an `AGENTS.md` - contract, `run.sh` entrypoint, and Playwright flow script. -2. Ensure the fixture user has enough channel names for the menu to overflow. -3. Open the real app, use test login, click the channel dropdown, capture - screenshots, measure popup height from image differences, and verify menu - content scrolls internally. -4. Write evidence to `.cache/evidence/channel-dropdown-height//`. - -## Acceptance Criteria - -- The harness records `summary.json` with named checks. -- The harness captures before/open/after-scroll screenshots. -- The popup height is bounded below the configured threshold. -- A wheel event changes pixels inside the popup without requiring page scroll. - -## Validation Commands - -- `tools/evidence/channel_dropdown_height/run.sh` diff --git a/docs/plans/2026-05-21-15-49-CST-local-llm-env-config.md b/docs/plans/2026-05-21-15-49-CST-local-llm-env-config.md deleted file mode 100644 index 17bc3211..00000000 --- a/docs/plans/2026-05-21-15-49-CST-local-llm-env-config.md +++ /dev/null @@ -1,46 +0,0 @@ -# Local LLM Env Config - -## Background - -Manual local testing should not require writing a local provider key into the -cloud `api_configs` table. The backend currently resolves LLM runtime config -only from user database rows, which makes local model testing risky when the -selected database is shared with a real user. - -## Goals - -- Add an explicit dev/test-only environment fallback for LLM runtime config. -- Keep production behavior unchanged unless the fallback is explicitly enabled. -- Ignore the fallback in production even if the local env variables are - accidentally present. -- Support the current `.env.local` Gemini variables without writing to Turso. -- Cover provider/model/endpoint/key resolution with backend unit tests. - -## Implementation Plan - -1. Add a `LOCAL_LLM_CONFIG_ENABLED=true` gate in `llm_service.ts` plus a - local/dev runtime guard. -2. Resolve local config from generic `LOCAL_LLM_*` variables, with Gemini - aliases for existing local usage. -3. Prefer the local env config before database configs only when enabled. -4. Export a small test-only resolver wrapper and add `llm_service.test.ts`. -5. Update local manual testing docs to use env fallback instead of creating a - fixture-user database config. - -## Acceptance Criteria - -- Without `LOCAL_LLM_CONFIG_ENABLED=true`, LLM config still comes from - `api_configs`. -- In production, LLM config still comes from `api_configs` even if - `LOCAL_LLM_CONFIG_ENABLED=true` is accidentally set. -- With `LOCAL_LLM_CONFIG_ENABLED=true` and `GEMINI_API_KEY`, runtime config uses - the env key/model only when the backend is running in an explicit local/dev - mode and does not need database rows. -- Invalid local endpoints still fail endpoint validation. -- Local manual testing docs no longer recommend writing provider keys to cloud - Turso as the default path. - -## Validation Commands - -- `cd apps/node_backend && npm test -- src/llm/llm_service.test.ts` -- `cd apps/node_backend && npm run type-check` diff --git a/docs/plans/2026-05-21-15-55-CST-thread-menu-copy.md b/docs/plans/2026-05-21-15-55-CST-thread-menu-copy.md deleted file mode 100644 index 17eef12d..00000000 --- a/docs/plans/2026-05-21-15-55-CST-thread-menu-copy.md +++ /dev/null @@ -1,34 +0,0 @@ -# Thread Menu Copy - -## Background - -The chat app bar thread dropdown still uses Chinese copy for the main thread and -new child thread action. The product language now uses `Thread` instead of -section/subsection wording. - -## Goals - -- Change the main thread label from `主区` to `Thread`. -- Change the create child thread menu item from `新建子区` to `New Thread`. -- Change the default channel display name to `Default Channel`. -- Keep thread identity and storage fields unchanged. - -## Implementation Plan - -1. Update user-facing app bar thread dropdown copy in `chat_screen.dart`. -2. Update default channel display-name copy in `chat_screen.dart` and widget - tests. -3. Update code maps so smoke checks match the current product wording. -4. Run Dart formatting and targeted Flutter analysis. - -## Acceptance Criteria - -- The app bar displays `Thread` when the active thread id is `main`. -- The app bar displays the specific thread name when a child thread is active. -- The thread dropdown create action reads `New Thread`. -- The default channel appears as `Default Channel`. - -## Validation Commands - -- `dart format apps/mobile_chat_app/lib/features/chat/chat_screen.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-21-16-09-CST-thread-sync-and-thinking-details.md b/docs/plans/2026-05-21-16-09-CST-thread-sync-and-thinking-details.md deleted file mode 100644 index 40c1cb10..00000000 --- a/docs/plans/2026-05-21-16-09-CST-thread-sync-and-thinking-details.md +++ /dev/null @@ -1,41 +0,0 @@ -# Thread Sync And Thinking Details - -## Background - -Creating a thread through the AI tool persists the new thread on the backend, but the currently open chat screen only refreshes message history. The thread menu can therefore remain stale until the page is refreshed. The agent-loop status UI also currently renders the generic assistant placeholder before the tool-thinking row because the placeholder is inserted first. - -## Goals - -- Refresh chat scope topology after backend message sync so newly created threads appear in the thread menu without a full page refresh. -- Render tool thinking before the generic processing placeholder for the same task. -- Rename completed thinking rows to `完成思考`. -- Make thinking rows clickable and show their details in a modal dialog. -- Convert remaining Chinese Flutter UI action labels to English. -- Remove leading icons from Navigation channel list items. -- Ignore macOS `.DS_Store` files. - -## Implementation Plan - -1. Add `.DS_Store` ignore rules. -2. Add a guarded scope-topology refresh helper in `ChatScreen` and trigger it after SSE snapshots. -3. Update `MessageList` rendering to swap adjacent placeholder/tool-loop rows for the same task. -4. Update agent-loop group labels and add a modal detail view for tool-loop and reasoning rows. -5. Update remaining Chinese UI labels in chat/navigation/composer/model settings. -6. Remove Navigation channel item leading icons. -7. Extend focused widget tests and run Flutter checks from `apps/mobile_chat_app`. - -## Acceptance Criteria - -- After an AI tool creates a thread, the active channel thread menu can show the new thread after sync without a browser refresh. -- A task with both a tool-loop row and a processing placeholder renders the thinking row first. -- Completed tool-loop rows display `完成思考 n/n`. -- Clicking a thinking/completed-thinking row opens a modal with the underlying details. -- Chat, Navigation, composer, highlight, and model settings action labels use English. -- Navigation channel rows do not show leading channel/default icons. -- `.DS_Store` files are ignored by git. - -## Validation Commands - -- `./tools/init_dev_env.sh --no-bootstrap --no-doctor` -- `cd apps/mobile_chat_app && flutter analyze` -- `cd apps/mobile_chat_app && flutter test test/message_list_test.dart` diff --git a/docs/plans/2026-05-21-16-43-CST-agent-loop-limit-empty-final.md b/docs/plans/2026-05-21-16-43-CST-agent-loop-limit-empty-final.md deleted file mode 100644 index 0c8a04d4..00000000 --- a/docs/plans/2026-05-21-16-43-CST-agent-loop-limit-empty-final.md +++ /dev/null @@ -1,32 +0,0 @@ -# Agent Loop Limit Empty Final - -## Background - -A production task reached the internal tool-call budget and persisted an empty completed assistant message. The database showed tool-call rows were present, but the final assistant message had `content_len = 0`. This is more likely a program-level loop termination case than a model intentionally replying with empty text. - -## Goals - -- Increase the default model-driven agent-loop budget to 10 steps and 50 tool calls. -- Never persist an empty completed assistant response after tool calls. -- Make budget termination visible to users with a clear explanation that the internal step or tool-call limit was reached. -- Preserve metadata that explains the stop reason for future debugging. - -## Implementation Plan - -1. Raise default loop limits in `apps/node_backend/src/routes/chat.ts`. -2. Track completed/failed tool calls while processing the agent loop. -3. Before final assistant upsert, convert an empty post-tool final response into a visible failed assistant message with a specific limit reason. -4. Add backend route tests for default limits and empty post-tool final handling. -5. Update code maps for the agent-loop limit behavior. - -## Acceptance Criteria - -- Default respond requests pass `maxSteps: 10` and `maxToolCalls: 50` to the agent loop. -- If tool calls occurred and no final text is produced, the persisted assistant message has non-empty explanatory content. -- If the tool-call or step limit was reached, the message says which internal limit was reached. -- Tests cover the regression that previously wrote an empty completed assistant message. - -## Validation Commands - -- `cd apps/node_backend && npm test -- src/routes/chat.test.ts` -- `cd apps/node_backend && npm run type-check` diff --git a/docs/plans/2026-05-21-16-48-CST-sidebar-resize-composer-focus.md b/docs/plans/2026-05-21-16-48-CST-sidebar-resize-composer-focus.md deleted file mode 100644 index bc88aa38..00000000 --- a/docs/plans/2026-05-21-16-48-CST-sidebar-resize-composer-focus.md +++ /dev/null @@ -1,29 +0,0 @@ -# Sidebar Resize and Composer Focus - -## Background - -The desktop navigation sidebar has an existing resize handle, but the active hit area is too small and can fail to receive drag gestures reliably. The chat composer also used to keep focus after sending a query, but the current streaming state disables the text field and can drop keyboard focus. - -## Goals - -- Make the desktop navigation sidebar width adjustable again through the divider handle. -- Keep the composer text field enabled and focused after sending a query. -- Add focused regression coverage for composer focus behavior. - -## Implementation Plan - -1. Widen the desktop sidebar resize handle hit target and make its gesture behavior opaque. -2. Keep the composer text field enabled during streaming so focus is not dropped. -3. Request composer focus again after submit on the next frame. -4. Update widget tests for streaming-enabled input and post-send focus retention. - -## Acceptance Criteria - -- Dragging the desktop navigation divider changes the sidebar width within the existing min/max bounds. -- Sending a query clears the draft while the composer text field keeps focus. -- The composer remains focusable while a response is streaming. - -## Validation Commands - -- `cd apps/mobile_chat_app && flutter test test/composer_bar_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-21-17-13-CST-sse-topology-refresh-rate-limit.md b/docs/plans/2026-05-21-17-13-CST-sse-topology-refresh-rate-limit.md deleted file mode 100644 index f2faf148..00000000 --- a/docs/plans/2026-05-21-17-13-CST-sse-topology-refresh-rate-limit.md +++ /dev/null @@ -1,34 +0,0 @@ -# SSE Topology Refresh Rate Limit - -## Background - -Manual browser testing showed repeated `429 Too Many Requests` errors for -`/api/chat/scopes`, `/api/chat/channel-names`, and `/api/chat/scope-settings`. -The frontend refreshed scope topology after every SSE snapshot, and each refresh -fans out to three HTTP requests. - -## Goals - -- Keep channel/thread topology updates after tool-created or tool-renamed - scopes. -- Avoid repeated topology refreshes during streaming snapshots. -- Preserve local manual test usability without hitting sync rate limits. - -## Implementation Plan - -1. Detect terminal task snapshots from SSE messages. -2. Refresh topology at most once per completed/failed/cancelled task id. -3. Keep the existing refresh method for manual or future explicit calls. -4. Rebuild the local manual test frontend and verify 429s stop. - -## Acceptance Criteria - -- A streaming task no longer triggers topology refresh on every SSE snapshot. -- A task that reaches a terminal state can still refresh channel/thread lists. -- Local manual testing can stay open without repeatedly hitting the sync rate - limit. - -## Validation Commands - -- `cd apps/mobile_chat_app && flutter analyze` -- `cd apps/mobile_chat_app && flutter build web --debug --dart-define=BRICKS_API_BASE_URL=http://127.0.0.1:3011 --dart-define=BRICKS_TEST_TOKEN="$BRICKS_TEST_TOKEN"` diff --git a/docs/plans/2026-05-21-17-23-CST-typed-chat-invalidations.md b/docs/plans/2026-05-21-17-23-CST-typed-chat-invalidations.md deleted file mode 100644 index 5187b611..00000000 --- a/docs/plans/2026-05-21-17-23-CST-typed-chat-invalidations.md +++ /dev/null @@ -1,44 +0,0 @@ -# Typed Chat Invalidations - -## Background - -The frontend previously refreshed all chat topology endpoints after terminal SSE -task snapshots. That reduced stale channel/thread UI, but it over-fetched -`/api/chat/scopes`, `/api/chat/channel-names`, and `/api/chat/scope-settings` -for ordinary chat replies and could trigger local 429 rate limits. - -## Goals - -- Surface backend tool-driven changes as typed invalidations. -- Let the Flutter client refresh only the affected chat data. -- Keep existing SSE transport shape by carrying invalidations in message - metadata. -- Preserve a coarse fallback for older snapshots that have no invalidation data. - -## Implementation Plan - -1. Add backend invalidation derivation from successful local agent tool results. -2. Persist invalidations on tool-step messages and aggregate them onto final - assistant message metadata. -3. Parse invalidations from server message metadata in Flutter. -4. Replace terminal-task blanket topology refresh with typed invalidation - consumption and targeted endpoint reloads. -5. Add parser tests for SSE invalidations. - -## Acceptance Criteria - -- A channel rename tool call emits `chat.channelNames` and the frontend reloads - channel names only. -- Channel/thread creation emits `chat.scopes`, allowing the frontend to reload - scopes and names as needed. -- Instruction changes emit `chat.scopeSettings` and the frontend reloads scope - settings only. -- Ordinary chat completion without invalidations does not call all topology - endpoints. - -## Validation Commands - -- `cd apps/node_backend && npm test -- src/routes/chat.test.ts` -- `cd apps/node_backend && npm run type-check` -- `cd apps/mobile_chat_app && flutter test test/chat_history_api_service_test.dart` -- `cd apps/mobile_chat_app && flutter analyze` diff --git a/docs/plans/2026-05-21-17-53-CST-agent-loop-empty-final-root-cause.md b/docs/plans/2026-05-21-17-53-CST-agent-loop-empty-final-root-cause.md deleted file mode 100644 index 0a3d97b3..00000000 --- a/docs/plans/2026-05-21-17-53-CST-agent-loop-empty-final-root-cause.md +++ /dev/null @@ -1,73 +0,0 @@ -# Agent Loop Empty Final Root Cause Note - -## Background - -During local manual testing, the message `我有哪些 todo` in -`task-1779354793673-0` showed a failed assistant response: - -`The assistant completed tool calls but did not produce a final answer. Please retry or narrow the request.` - -This note records the confirmed facts and the remaining uncertainty before -changing timeout or stop-reason behavior. - -## Confirmed Facts - -- The task id was `task-1779354793673-0`. -- The user message was written at `2026-05-21T17:13:13.673`. -- The final assistant message was later updated to `task_state = failed`. -- The final metadata had: - - `agentLoopStopReason.type = empty_final_after_tool_calls` - - `toolCallCount = 2` - - `completedToolCallCount = 2` - - `failedToolCallCount = 0` - - `maxToolCalls = 10` - - `stepCount = 1` - - `maxSteps = 10` -- Therefore this incident was not caused by the tool-call limit. -- Therefore this incident was not caused by the step limit. -- Both tool calls were `todo_list`. -- Both tool calls returned successful todo data. -- No provider raw finish reason, abort event, or final-step error was persisted for this task. - -## Root Cause Statement - -The confirmed root cause is: - -The backend completed successful tool calls, but the agent loop ended before a -tool-free final answer was persisted. The current code then converted that state -into `empty_final_after_tool_calls`. - -## Important Uncertainty - -We cannot prove from the current database records that the model itself -intentionally returned an empty final answer. The system did not persist enough -provider/SDK finish metadata to distinguish: - -- the provider returned a tool step and then stopped without final text -- the SDK ended the loop after tool results without another text step -- the AbortController timeout interrupted the loop before final text -- another stream finish/error condition occurred but was not recorded - -The timing makes timeout plausible, because the default loop timeout was 15s and -the task duration was close to that range, but timeout is not proven by the -persisted metadata. - -## Required Fix Direction - -- Do not label all empty post-tool finals as timeout. -- Persist the real stop reason when the SDK/provider exposes it. -- If timeout fires, persist a specific `timeout_reached` stop reason. -- Keep tool-call limit and step limit as separate stop reasons. -- Prefer per-step/model-call timeout semantics instead of one wall-clock timeout - for the whole multi-step tool loop. -- Increase the default timeout from 15s to a safer value such as 60s only as a - mitigation, not as the root-cause proof. - -## Acceptance Criteria - -- Empty final after tools must include a precise persisted stop reason when one - is known. -- Unknown stop reasons must remain marked as unknown/empty-final, not rewritten - as timeout. -- Future investigations can tell whether an incident was caused by timeout, - tool-call limit, step limit, provider finish, or an unclassified empty final. diff --git a/docs/plans/2026-05-21-18-06-CST-agent-loop-real-stop-reason.md b/docs/plans/2026-05-21-18-06-CST-agent-loop-real-stop-reason.md deleted file mode 100644 index 58632caa..00000000 --- a/docs/plans/2026-05-21-18-06-CST-agent-loop-real-stop-reason.md +++ /dev/null @@ -1,32 +0,0 @@ -# Agent Loop Real Stop Reason - -## Background - -The chat agent can complete tool calls and then persist an empty failed assistant response when no final text is produced. A recent production example proved that the failure was not caused by the tool-call limit or step limit, but the stored metadata did not contain enough raw stop information to prove whether the stream timed out, errored, or ended normally with no final text. - -## Goals - -- Increase the per-step agent loop timeout from 15 seconds to 60 seconds. -- Record timeout only when the stream was actually aborted by the timeout path. -- Preserve distinct stop reasons for tool-call limit, step limit, stream errors, SDK finish metadata, and generic empty final responses. -- Keep the timeout scoped to a single model step, while total work remains bounded by max steps and max tool calls. - -## Implementation Plan - -1. Add stream stop metadata to the agent-loop LLM streaming wrapper. -2. Reset the timeout after each completed model step instead of using one whole-loop wall clock. -3. Classify empty post-tool final responses from real stop metadata in the chat route. -4. Add route tests for default timeout configuration and timeout-specific empty-final failure metadata. - -## Acceptance Criteria - -- Default agent-loop requests use `timeoutMs: 60000`. -- A true timeout persists `agentLoopStopReason.type = "timeout_reached"` with `timeoutMs` and `timeoutStepIndex`. -- Tool-call and step limits continue to persist their own stop reason types. -- Empty final responses without timeout or explicit limits remain `empty_final_after_tool_calls`. -- Backend route tests and type checks pass. - -## Validation Commands - -- `cd apps/node_backend && npm test -- src/routes/chat.test.ts` -- `cd apps/node_backend && npm run type-check` diff --git a/docs/plans/2026-05-21-19-57-CST-thread-auto-name-source.md b/docs/plans/2026-05-21-19-57-CST-thread-auto-name-source.md deleted file mode 100644 index f78b3c3a..00000000 --- a/docs/plans/2026-05-21-19-57-CST-thread-auto-name-source.md +++ /dev/null @@ -1,42 +0,0 @@ -# Thread Auto Name Source - -## Background - -Thread display names are stored separately from scope settings in `chat_channel_names`. -New Channels already have a user-entered name, but new Threads can be created -without a display name and then appear as raw thread IDs until a manual rename -or a later refresh path supplies a name. - -## Goals - -- Keep the existing name table model. -- Add source metadata for display names. -- Give unnamed non-main Threads an immediate exact name from the first message. -- After the first assistant reply completes, attempt one generated title for - Threads still named by `first_message_exact`. -- Avoid extra frontend requests and avoid overwriting manual names. - -## Implementation Plan - -1. Extend `chat_channel_names` with `source` and `generated_name_attempted_at`. -2. Add service helpers for exact-name insertion, generation claiming, and - conditional generated-name completion. -3. Invoke the helpers from the backend `/api/chat/respond` async flow. -4. Notify the existing frontend through typed `chat.channelNames` invalidations. -5. Add backend unit coverage and a repeatable evidence harness. - -## Acceptance Criteria - -- Existing UI/API/manual rename paths write `source = manual`. -- For non-main Threads with no name, the first user message inserts - `source = first_message_exact`. -- Only one generated-name attempt can be claimed per Thread. -- A generated name only updates rows still at `source = first_message_exact`. -- Manual names are never overwritten by automatic generation. -- E2E evidence proves exact and generated naming through the real app/API path. - -## Validation Commands - -- `cd apps/node_backend && npm test -- src/routes/chat.test.ts src/services/localAgentLoopService.test.ts` -- `cd apps/node_backend && npm run type-check` -- `tools/evidence/thread_auto_name_source/run.sh` diff --git a/docs/plans/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md b/docs/plans/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md deleted file mode 100644 index 85bd9baf..00000000 --- a/docs/plans/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md +++ /dev/null @@ -1,105 +0,0 @@ -# Scheduled Actions and Agent Execution - -## Background - -### Context - -Bricks already has a conversation-driven Agent loop that can call internal tools, persist chat messages, and update channel/thread resources. The backend is deployed on Vercel as serverless Node functions, so scheduled work should not rely on a long-lived in-process scheduler such as `node-cron`. - -The product direction is to support scheduled AI actions similar to ChatGPT Tasks or Gemini Scheduled actions: users create and manage a scheduled action through conversation, and when the schedule fires Bricks starts normal Agent execution on the user's behalf. - -### Problem - -The schedule layer, the Agent/tool layer, and future scriptable skill runtimes must stay decoupled: - -- Scheduled actions should not be tied directly to Genkit. -- Genkit should be one possible runtime for scriptable skills, not the scheduler runtime. -- Users should manage scheduled actions through conversation tools, not through a separate hidden admin path. -- A scheduled trigger should start ordinary Agent execution so the run can use any available tool or skill. - -### Motivation - -This keeps scheduled actions as a first-class resource while preserving the existing Agent/tool model. It also leaves room for scriptable Agent pipelines later: a scheduled action may trigger a prompt that invokes a skill backed by Genkit, but it may also invoke normal Bricks tools such as todos, resources, channel/thread tools, or future skills. - -## Goals - -- Add scheduled actions as a first-class user resource. -- Let users create, list, update, pause, resume, and delete scheduled actions through Agent tools. -- Use Vercel Cron only as a fixed tick that finds due scheduled actions. -- When an action is due, create a run record and start the existing Agent execution path with the scheduled prompt. -- Keep scheduled actions independent from Genkit and other specific skill runtimes. -- Preserve user identity, channel, and thread context for scheduled executions. -- Make scheduled action execution observable, retryable, and safe against duplicate claims. - -## Implementation Plan - -1. Add the scheduled action storage model. - - Create a migration for `scheduled_actions`. - - Store `user_id`, target `channel_id`, target `thread_id`, `title`, `prompt`, schedule expression, timezone, `next_run_at`, status, and timestamps. - - Use a stable status enum such as `active`, `paused`, and `deleted`. - - Keep display title separate from the schedule identity. - -2. Add scheduled action run tracking. - - Create a migration for `scheduled_action_runs`. - - Record each trigger attempt with `scheduled_action_id`, `user_id`, target scope, scheduled fire time, status, timestamps, error text, and the chat task/message identifiers produced by execution. - - Use run statuses such as `queued`, `running`, `completed`, and `failed`. - - Add enough metadata to inspect what happened after a scheduled trigger. - -3. Implement a scheduled action service. - - Add CRUD helpers for scheduled actions scoped by `user_id`. - - Add due-action querying with a small batch limit. - - Add a claim/lease mechanism so the same due action is not executed twice when multiple cron requests overlap. - - Compute the next run time after each successful claim or completion. - - Keep schedule parsing and timezone handling inside this service boundary. - -4. Expose scheduled action internal tools. - - Add tools such as `scheduled_action_create`, `scheduled_action_list`, `scheduled_action_get`, `scheduled_action_update`, `scheduled_action_pause`, `scheduled_action_resume`, and `scheduled_action_delete`. - - Register them with the existing internal tool mechanism used by the Agent loop. - - The tools write to `scheduled_actions`; the scheduler is not the only writer. - - Tool responses should be concise and structured so the Agent can confirm the action to the user. - -5. Add a scheduler tick endpoint. - - Add a protected backend route such as `GET /api/cron/scheduled-actions`. - - Configure Vercel Cron in the root Vercel configuration to call this path on a fixed cadence. - - The endpoint should query due actions, claim a bounded batch, create `scheduled_action_runs`, and enqueue or start Agent execution for each claimed action. - - The endpoint should return a small operational summary, not user-facing content. - -6. Start normal Agent execution from due actions. - - Convert each due scheduled action into a normal Agent input using the stored `prompt`, `user_id`, `channel_id`, and `thread_id`. - - Persist a scheduled-origin message or task marker so the conversation history shows why the Agent ran. - - Reuse the existing async chat/Agent pipeline rather than adding a separate scheduler-only executor. - - Mark the scheduled action run completed or failed based on the Agent execution result. - -7. Keep skill runtimes pluggable. - - Do not store Genkit-specific fields on `scheduled_actions`. - - If a scheduled prompt should invoke a scriptable pipeline, it should do so through the normal skill/tool selection path. - - Define Genkit-backed skills later as entries in the skill/runtime layer, not as scheduler primitives. - -8. Add UI/API visibility. - - Add REST endpoints for listing and inspecting scheduled actions if the UI needs a management surface. - - The first usable path can remain conversation-first, but the data model should support a future Scheduled Actions screen. - - Show scheduled action results in the target channel/thread as normal conversation output. - -9. Update documentation and code maps. - - Update `docs/backlog/2026-05-26-scheduled-agent-tasks.md` or supersede it with this plan. - - Update `docs/code_maps/feature_map.yaml` and `docs/code_maps/logic_map.yaml` because this change adds feature entry points, business logic, migrations, tools, and scheduled execution. - -## Acceptance Criteria - -- A user can ask Bricks to create a scheduled action through chat, and the Agent calls a scheduled action tool that persists the action. -- A user can list, update, pause, resume, and delete their scheduled actions through chat tools. -- A due scheduled action is claimed once, creates a `scheduled_action_runs` record, and starts normal Agent execution in the configured channel/thread. -- A scheduled action execution can call any normal Agent tool or skill; it is not tied to Genkit. -- Genkit-backed skills, if added later, are invoked through the skill/tool layer rather than through scheduler-specific code. -- Duplicate cron invocations do not execute the same due action twice. -- Scheduled action results are visible in the target conversation context. -- Failed scheduled action runs are recorded with an inspectable failure reason. -- The system remains compatible with Vercel serverless deployment and does not depend on an in-process long-lived scheduler. - -## Validation Commands - -- `cd apps/node_backend && npm test -- src/services/localAgentLoopService.test.ts src/routes/chat.test.ts` -- `cd apps/node_backend && npm test -- src/db/migrate.test.ts` -- `cd apps/node_backend && npm run type-check` -- `npx js-yaml docs/code_maps/feature_map.yaml >/dev/null && npx js-yaml docs/code_maps/logic_map.yaml >/dev/null` -- `git diff --check` diff --git a/docs/tasks/backlog/2026-06-17-child-homework-task-breakdown.md b/docs/tasks/backlog/2026-06-17-child-homework-task-breakdown.md new file mode 100644 index 00000000..abda2146 --- /dev/null +++ b/docs/tasks/backlog/2026-06-17-child-homework-task-breakdown.md @@ -0,0 +1,19 @@ +# Child Homework Task Breakdown + +## Confirmed Need + +Children may have homework across math, English, and other subjects, and the total workload can feel too large to start. + +Bricks should explore a tool or workflow that helps order, split, or reframe homework tasks so the next step feels easier and less overwhelming. + +## User Case + +A child has several homework items from different subjects and does not want to begin because everything feels like too much. + +The platform should help turn that pile of work into a clear, approachable sequence so the child has better emotion and motivation to start. + +## Notes + +- The exact solution is not decided yet. +- Possible directions include ordering tasks, splitting large tasks, redefining tasks into smaller goals, or choosing a first easy step. +- The experience should focus on reducing resistance and helping the child feel ready to begin. diff --git a/docs/tasks/backlog/2026-06-17-grammar-bug-collection-database.md b/docs/tasks/backlog/2026-06-17-grammar-bug-collection-database.md new file mode 100644 index 00000000..0b2c3373 --- /dev/null +++ b/docs/tasks/backlog/2026-06-17-grammar-bug-collection-database.md @@ -0,0 +1,13 @@ +# Grammar Bug Collection Database + +## Confirmed Need + +Bricks should be able to collect grammar bugs found in user input. + +The collected bugs should be saved to the database so they can be reviewed, reused, or analyzed later. + +## Notes + +- Reuse the existing database-backed tool/resource architecture where possible. +- The existing table/resource tool architecture is the expected starting point, rather than introducing a separate storage path. +- Exact capture trigger, review UI, schema, and retention behavior are not decided yet. diff --git a/docs/tasks/backlog/2026-06-17-note-purpose-specific-charts-examples.md b/docs/tasks/backlog/2026-06-17-note-purpose-specific-charts-examples.md new file mode 100644 index 00000000..e5c9277e --- /dev/null +++ b/docs/tasks/backlog/2026-06-17-note-purpose-specific-charts-examples.md @@ -0,0 +1,13 @@ +# Purpose-Specific Charts in Notes + +## Confirmed Need + +Notes should support charts or diagrams that are clearly separated by intended use. + +Each chart or diagram type should be able to include example problems so users can understand when and how to use it. + +## Notes + +- The source request mentioned note content, clearly divided chart purposes, and examples. +- Table sizing and layout control are related context, especially for chart-like tables embedded in notes. +- Exact chart types, editing UI, storage format, and rendering rules are not decided yet. diff --git a/docs/tasks/backlog/2026-06-22-selection-toolbar-translate-and-explain.md b/docs/tasks/backlog/2026-06-22-selection-toolbar-translate-and-explain.md new file mode 100644 index 00000000..cb43927c --- /dev/null +++ b/docs/tasks/backlog/2026-06-22-selection-toolbar-translate-and-explain.md @@ -0,0 +1,15 @@ +# Selection Toolbar Translate and Explain Actions + +## Confirmed Need + +The selection toolbar should support a translate action alongside the existing copy and highlight actions. + +After text is highlighted, the user should also see an explain action. Clicking explain should create a new thread and automatically send a prompt that asks the AI to explain the selected text using the surrounding context. + +## Notes + +- Current toolbar actions include copy and highlight. +- The translate action should be available from the selection toolbar. +- The explain action is tied to highlighted text, not just any empty selection state. +- The explain flow should preserve both the selected text and relevant context so the AI response is useful in the new thread. +- Exact toolbar placement, icon labels, prompt wording, context size, and thread naming behavior are not decided yet. diff --git a/docs/tasks/done/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md b/docs/tasks/done/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md index a89460c2..1fd72377 100644 --- a/docs/tasks/done/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md +++ b/docs/tasks/done/2026-04-18-00-20-UTC-openclaw-message-routing-current-state.md @@ -52,4 +52,4 @@ ### Validation commands -- `git diff -- docs/plans docs/code_maps/logic_map.yaml` +- `git diff -- docs/tasks/done docs/code_maps/logic_map.yaml` diff --git a/docs/plans/2026-05-25-11-14-fix-openclaw-agents-500-error.md b/docs/tasks/done/2026-05-25-11-14-fix-openclaw-agents-500-error.md similarity index 100% rename from docs/plans/2026-05-25-11-14-fix-openclaw-agents-500-error.md rename to docs/tasks/done/2026-05-25-11-14-fix-openclaw-agents-500-error.md diff --git a/docs/plans/2026-05-26-02-30-resource-batch-add-rows.md b/docs/tasks/done/2026-05-26-02-30-resource-batch-add-rows.md similarity index 100% rename from docs/plans/2026-05-26-02-30-resource-batch-add-rows.md rename to docs/tasks/done/2026-05-26-02-30-resource-batch-add-rows.md diff --git a/docs/plans/2026-05-26-10-20-pr-266-review-follow-up.md b/docs/tasks/done/2026-05-26-10-20-pr-266-review-follow-up.md similarity index 100% rename from docs/plans/2026-05-26-10-20-pr-266-review-follow-up.md rename to docs/tasks/done/2026-05-26-10-20-pr-266-review-follow-up.md diff --git a/docs/plans/2026-06-16-15-32-+08-note-content-type-implementation.md b/docs/tasks/done/2026-06-16-15-32-+08-note-content-type-implementation.md similarity index 100% rename from docs/plans/2026-06-16-15-32-+08-note-content-type-implementation.md rename to docs/tasks/done/2026-06-16-15-32-+08-note-content-type-implementation.md diff --git a/docs/plans/2026-06-22-17-40-CST-readme-feature-copy.md b/docs/tasks/done/2026-06-22-17-40-CST-readme-feature-copy.md similarity index 100% rename from docs/plans/2026-06-22-17-40-CST-readme-feature-copy.md rename to docs/tasks/done/2026-06-22-17-40-CST-readme-feature-copy.md diff --git a/docs/plans/2026-06-22-17-43-CST-readme-resource-copy.md b/docs/tasks/done/2026-06-22-17-43-CST-readme-resource-copy.md similarity index 100% rename from docs/plans/2026-06-22-17-43-CST-readme-resource-copy.md rename to docs/tasks/done/2026-06-22-17-43-CST-readme-resource-copy.md From 797eac38240f60880f4a103f437622c5872b1b3a Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 22 Jun 2026 18:13:11 +0800 Subject: [PATCH 3/6] Add README showcase screenshots --- README.md | 10 +++++-- .../showcase/chat-knowledge-organization.png | Bin 0 -> 482304 bytes docs/assets/showcase/resources-highlights.png | Bin 0 -> 559889 bytes docs/tasks/backlog/.gitkeep | 1 + docs/tasks/doing/.gitkeep | 1 + docs/tasks/done/.gitkeep | 1 + ...2-18-07-CST-readme-showcase-screenshots.md | 27 ++++++++++++++++++ docs/tasks/trash/.gitkeep | 1 + 8 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 docs/assets/showcase/chat-knowledge-organization.png create mode 100644 docs/assets/showcase/resources-highlights.png create mode 100644 docs/tasks/backlog/.gitkeep create mode 100644 docs/tasks/doing/.gitkeep create mode 100644 docs/tasks/done/.gitkeep create mode 100644 docs/tasks/done/2026-06-22-18-07-CST-readme-showcase-screenshots.md create mode 100644 docs/tasks/trash/.gitkeep diff --git a/README.md b/README.md index 2920d048..a5826355 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,15 @@ Bricks keeps useful information available after the chat moves on. - **Notes** - Research summaries, reusable instructions, generated reports, study notes, and specs. - **Highlights** - Important facts, decisions, quotes, references, and snippets worth keeping. -## Screenshots +## Showcase -Screenshots coming soon. +### Topic-based agent work - +![Bricks channel and thread workspace](docs/assets/showcase/chat-knowledge-organization.png) + +### Saved highlights and notes + +![Bricks resources for highlights and notes](docs/assets/showcase/resources-highlights.png) ## What's on the roadmap diff --git a/docs/assets/showcase/chat-knowledge-organization.png b/docs/assets/showcase/chat-knowledge-organization.png new file mode 100644 index 0000000000000000000000000000000000000000..b49053fa5d2c869f68179ae1236bf835ca440c9c GIT binary patch literal 482304 zcmeFZWmH_t);8K`kl+CV1PKHQ8ay}z2oT&ILU4EYKyY_$2=4Aq2ol`g-5YP9X}F#2 z{hjlUJMR6?KL6hyqq}N#*;=z|&U$Ljr#n0N@$SRWzJ5WMy~_ZLOINjBLLcGrL*a!O8&uejztI14Bz=CyFn|rsg&Rl%Up5 zN(yr$0ZMgF*>|#bqQ++Ck{%Am${unmh8~uNJVum4f@u71ys!?ejhzfA+^nr^9C_UY zDF5`!3(NohnuU_$PZcLi0ZI*71qxAH2V)8@=6B5RCUS4^^&w{LXy{;W z=VWecL-D&$gDQ3e+|3B4# zm;Af>@5a0e=5EGT8e-NI%)y5n)G#e$$ zZ=tjNEp^!RvHWZPU>E;d0me44X?K9lZ~uk+69DjB##~fXK}uAVLczh-#N5gl0FVq# zRDY(S{EGmnt@IiZMNIh9zASbuuJ9)mCci7nkWZ5Efw+br6soC)D%Kap5gA(0a^~T1 zNL-8+kG-q2bIQVxzNoJT0$Pq4*3v=gd{5B5VWGVYKJY3LV4u{hnB&Z?Vr=jVeHim|8e0V?v)bM7p z3;~35pIwxBi6BpZ?=ka_7o$rOK7Lj$Z*!{h`sd~A27fL)xfZ3Y%$rQPzBP`iAdb6- zh}UId`JFKcKOM|5eRrQyqn>mf9A5-DYV?!<-=c>q_C3G6dE;r3f?F#3pchAggIdi6 zpkpSuSz=&iSH{7utdX!rbYLDP`uu@k4v05IvThjo;P);BW;y0r$wGKMM*_dMc&l1LjWl*RhMY!Fdl? zQ?N7Re4+mdcefdc62eIl6=T{TgfXA@!pMON+1e=Vr77Mqa(z?fV5@hst>}GXmYX<%5XYw- ztd3`a2+Sw|#%w=M3>hR%;pN$taSV`(fQTQK5d}hsUk`x&J!N&L1bk(6HsAp>7G)r~ z?+y$O6BgX=d~TSS;TEE-ODcRXoTWrf!vF0(VW9sjx5|C>xaaOM0HE;42dwDZDzwkf zd8+6kPXa;%K8EjOP{}{P2w<<-4@mkc`~|=o_)@H{7sHNx867KFT}UI-p6itLWk0v) z59JSh8#o)h-vjJC!9&MFI(HH z1oR0%aN#~u`<4W-+JAq4kLkPhAsVh~j?@Pi(|gNm{%kG>xvNYEo4aw(m zfq9ffA&80;wXxqM-`2nv3v*F%4(M%TJHYcq*HJab21^oN&|cv5Dmbe=(BdQ|pV(f@Jq%#8>#VBK?>S$VeTv-+8xmyo_PEhsq;KBrND&Lg#3i^1e!tWPqaIDs^J#0*9CowwMFPfJJY;}=7$1@ zB%GX_?3`HjW}MZFUiA+30v3DIWF_7Tb83ysdnJWM4AaR)w(3F^KH5->$d9!-cN1~u z?se34#EVjk2#cN=K|#65@}fno^0`X6dRt+A47}fLr1r*Xr_lF}ub@}bS2nU?1&K83 z@s&L4wMv&UyRsvCOhL0R%O%To%6ql=>P9UE=4i~d&7WDI*N4|Nnq^J<40pZUeaverA9aY%R8ldwlZBWfem ziO4xm*$h%{Q$l3bQeUyVcTXDIYw(mg%)V8NF8*#FQvAcI);#@ymff<}t@cChiV1k6 zc-QLE=~8u&Q zbei-%<{f4|CKhRG)JD{|D2%AekJ=G(WbIy83lsX8I++d`4ZJI)xdJp!G8-uctiHTU zJm?t=nU#_Gkr>2$wpLs7bIdo)l*t&(jXFdXTe`kZ*7nfN-BTLJQpY2QMmu?D{XL)f z@}8(KEGAi(6mGYk!^~U-&qwyk_cu%VvQ@PhXYh8n} zhG=I@1*s!Otj&(@t1>Zzw~!~$Dc^&;`xF-`2pxCm~^OS z=+l@HSY;?)*hT~iI4UI5c*n&247YA5uir2lxev$!apb#7H?9L)f=5vW@C(QYNYrp{ z=$4sv2v#}BNXdD9c5Xd!l5pZef+Vqjh3gQx3k~vGXiaaJeQ{E8GQOHhVP&l~9PMNK zQuy;U#G7P~ypiM7rcJhuvV+K^3UHyBYNvo>5aY{ROq^V%m9KdzqjNY};a z=H|E~<7dW7^Y-%evM8>#RKxbP%2qLZL4)*3e(z+IIdDo%{wVg_uZCYZcW>Mcftbtt zjr3M8gy_h2A=~P^oms$l-cQfViQKNH9E+@I~UWV;Dk75D!+x=Q7Ji9Bu$$eu$d(uj2swy5RGV__(BLC`J#57BngunJM zanv6vv>_DgYoX2IGO;MGFC9ot_$l+#&?g}l0>+NB%ap7k-&5_ljy&t)rAdsTkfAq2 zHjH3hz4i~5;@x5W4E>d5`n_7JHHVcm%4%6Gj&GNmf?7US7v%D{wb_^VE*e`3sT-;3 zR9;msw~yMbwLNzIlUj9Zic9tE#(O)uaIM5guMW9DCa26R2sd;$ zZS(0Z;J%J3ZzjkBun^gmluzz((NOXfyO)?lDu|b#IMonW4GTz4O?ABcNo>%6DmHW7dA# zpsQzAqB{CikbvLkPV8~p(R4z2ajM3YX3PS}CuDnycG&XpWixyyf^n?7K<-$>i5Mk$pZ!MH1xl_v{*Mq!m#2a#;`^yswo*|znAN7%WxILb_ z8p|8o(YNa4@Wz06RI)Ty$`2-=LmJ^6Nx1f`jK~6RtdP3U4yTj>Avti^dvN2`hQWvHniWsW#f)NZT=N`v z(pomex7^~+G|*Ad29rWbi{HjcCm=HQ>p5{K?l|nsiD)P#s_+~G0B3`+1%h3N8EZ(H z$jSofVR;k)A{;RQ36_I{y#?V&{+0g-M+ZRo^F2HO5Nr-W{JV}EEdBk8fxUmX`71?; z3j#cYUE#vsZrSkvr#31e8{z-tk-1=H01;(TDJfX0Z20@?_bXp_lNXk}G8dCqfu*p~ ze!mb%U>|gUrLa80D4qCn(*^(_43H8NQE`Ji&U}`FFFqTD734hkYL1fS$}w`Y;5>!c=xpdj(<}BUw!k# zqxiXD|AP_!)q+C750wHy-^CqWCi;)>?{{lB?6H6JEdLq_?HwGVFw*UAtn+^%2{;rA zz$Vc@liJ@S3B%F&0g3=?{56>W8vCC}1W}kD;UCV=U;WZ`Az}mY*V83tU;j6=>jwxi z{jVeqkCXy{Ee5a40p9;=F<=AEpa1hU2YaS$0G=>F#m|;ZGx)!nT6hZJegc}`xG>-+`+p;8fIqwp08Rm}!`+DVpQ_%U2Z1RO@;_NJ|60iZt3-cKbnn)Clsq8oGgr8Q4|kLv^4&WF9^0S7XdeFF#IETDr+buDF&9sGaL&~0^?&A2$q ze69aKYzEQmch2`yZ0>{8dG_^Yvtq=YMe!W3;QoW|3j0v`0q8ncV)=*1(vtO(JTQnM zZ-JWI&r|tKlQQfc&L69t_@$GWk_ni!?~pzUq}l>^*JC3&w6xef+g#Ya2J1$nYuH#d@cz2Xn-YR}AGZ^C+3v6|;dg zIBCofhg_*r{nhDcSyND+mbrMR>DNnZfW zU2H9#ORo-`Z5tdqD$)H4MpEADw%nX8OqXg)e8eQ*1Z^$IX4e{UtW?$5?8k`orF{@+ z9U}Nk+A({Gr&ep4t1FMdtkc)QuPC3rQjmNEJ$<=2s_eY)56@DT>EnODyw;EK9}K(_ zHB6$aN^b)_J#KW~suaacH{TV!_<;9D29T!$1fC}(FgrUh`rSCgji1G0c_djgri3%M zDFF5Bx=v3Wm)3kBvIK&S11xiEk2l=K4&KJTLW9cXADP^tk=)QJQog!)8(rQzh}+*Y z>n=q>5H2-C?7Xdhsi*AP1@~+q2dP$|7YgcpV&+zvc4_K5O+z)>TZj7p&TF?Sv-rQS^AIsDuRF2o)JQb1Y& zX4m1Cc_O(5KK`w)N5@RIJLL2I{7;Wy7KfW=!rOd$_nE|t;WDB}pM<^dtcJ$p>)#&_ z3V|7nJC$$uKwJKQZL!L`PPKS$*8_6>U!1Wo-~&z;>!p(_HQwrb-6dxDt~NXD z;8UZ$N3Fs7vkLBF{j_dU&j#KsSga1ImZ&7L<$oI72qq^;o*@PK(#gxFzqZuVJ0fRM zzPC77aU6>SdXv9=>AU)Ks>s0mt%n-U6Y=%K1ITwsnx!(nH#~X3eHZHDSxTUR7Dn|G z^Zy2MD17ng)H}ZPvAO-kkr?=a`$1Pf`s%~rAHLl#w0zJHAg7191FMaV=Yq_=HFjCcM^S0Vt zx3d%3XKSP}&*C~w?;HX?Vqi);seWkXPEpW5!8puAh0V|BHQMnGL)uj6uuf(6(%M3X zG5kn}ydN$Nyhl1whp!AY790kp7GV-a1 z6tw*YU9*B|96tNq`Pg|sDQ!>imBd5*j+&`Jj10hOrG96pTB2`Af7nlp9urQ1J^@Yc zB@E#2>BTDl79xZMj&!}P+}ZQ)_>$#AxDU*7{eo#HnaAmBYwM>w2jd6F%PieDx#VOZ zP%BXEJj3Ba%H*?iUC|jzG7tPEA!9;RW{U~)k5_#h7C#k=727Q^4S%f+(F$IqTs8Yf zzhq8XOcfuEiI?O3RjcECke@8s%$C2CVi<*rdiOHUJEUXfZ9RUd!o0eEJ0z~=+VKl~fPS4HEcTo3ctKFn>IC)OzS9&HC5F{JLi4ew`K$?to& zw%Vkb#Hek+2rZLg80E8R6}OlxiJj#{l>3dEzX%$b#-sXuoqHh&b!zUkwKZfqT3ml? z+i6-UcyXKe7U(Pd1j%=wqWQjYv6;=M5D1`S2?4EenD7fo^E#jI8dDa6JwZutOpB=i zgG8OjI*|Z6zUd|tTkHXO(7xD?x`F%#Wp5jW#dpU^Lp;#{TTjB5>o~&&U~%^u0A7eSV;ti$APJ zk>cvOylF%d)@@xoVT!IGTB$jY97lbP;y2k6i5T?T;QGVMQQR_*O4)0`GtypVSoZuB z>QB=w>xtMQSJm85qQZUw;Iz=t|CGK!SiV$uN%j8WtjFlr=3d?a(Ko1}A}|BR?-8>0 zG^lNBo1m_*&9cTwm=GsSOMR^_U7aJI8)|;8nrHzGn?^oZ4?r(&8bjf-i)d{TTq#paKT_{p7wOyN2Z(b@p2{?oUvx?c}Ei7!u)?mg5dkRoBz} zP;t8_q}*_Z|By}0>J>6wsog*HgQfGKKd)Bq$~C)eb){nk@|i*Fim^FI47FIL_`@Q( zUFcvR&tEq7`Jat1t-eik8ZE|Ig3LYe;c9Bkh1 zftVHsAJ@pjmI$~`;-ZBX4#@eoV?>Pxx39LgcvNY8eaKnkwBX>Wk%LIUZaR|G`dIga1Dsm8Gsy7ic5b`A-&+0S4)+Xyv%LWv zovMX92`1dQ%_>J|;^)%^;f z!+gf~7nt>jm!~i@*l)K^7gHx0U{GIA0{m8g$KeS!uQLD@w(vvzXaF7!fS4mY%c-d} zd^okWAJO!75b=+m7Vm@TCP^2A9 zY-!2c_lrc!JZ5~0ksbz+>=ld_6x5`VS*Fqp`y|oJ+kVsXLK>sXLjch`@8dpPO5=ONxc&cXem8m>0YMY^h5`RBXglqIoM? zNDleRQ@CVRgPI(U8N_?s>;g;+@s))std#`ueRGaHn zbE*7vc*LL{$Lv~v4L;wFfZ6J+yJq<8gDK!u(k)u}&Jzs&8ZBO>PL}rztR7s{oCKdWvhF2NZzC5i&T1RiS{>#&_`9ZF}-z2RH*P zFdNq_rwYikH`8BG*Y~C_OhwJ~H85Wh)41&Afg!auWY|Y7J>BabMB(IA>LlmMz#H|# zO_kfCq%lD(M$;$&9ll54-zf3LE7;*@vPoTWlU(;k+SF)kk_wv!pfuCMjNk&rP~Adg z!0Qt@#_*y3^ja4#26Ob9{JjR5J4ZV;|0g}?{0I_0-f7+;2PztiMXzY785KUzSBzVr z33Qdqgj9bnp8;?W1q&ISjT>B?&7a$F#QM}Xa99m|Zq6M6iu^Q!r@$YnYiV~*iVhkO zd*sLA;_E)Sl5uGl$a)JmUPr{9FFi-bwV2RApQaQpSeQx7^Z)~8)7z)#CT9)Stx<3D zzxxAI9#T}An7u+H5~yBN{Mqe{0=v`sUQib3E{8J6=^Qj zx_pP&c0873+=4qxx%GJwh3_sJwzUed0Vf~B0d#X@)dL|bwi_xCY)Y!3F4V?TX=f#6 zQ7?sAAYNP3JxHDv?M#wsUNH2t-6|?1~e!6I(4crEfM`wzDfkr znBX25YUx`WWn3f*NWc|@7x~K#i1r+Y+~2O2z+l#d1UWVRBTw$x!P~wM?~;WR0FpiY z=iADYTR@=C*$epc9 zEkVp-v6-w|sXQbuo6f-%05lz_?k79a6u#ZxiZ-sO-mkN|JH2SURgc z6?(d>OlYzg>knrx=HjWcf#68IGG}CbWyW&eU}Kt3hEjk>IDgD9a71)4Uo5?BpvzYF zG4jx1R?~D)f5h<&3SJv(QP+?Er3_5aZFRXbU};+SlF!ED=cswULf}r@So?AcY1JOg%dJkV?+o1!2|8m*${ztsK@edo_8iza<*w@OGV0N>9|z_>fUCwU0pELoUFJC7)<4xe6;CBn{$^wjbhF5ss|J^ zFZkWhx;D6Jt zjc(_TZPeB?4jL*DPQ^CGy@vMI6%u}pPM`KR!@#(E()=|f_0&+j;)3h^>W(V2b6od@ zv!y!sT2pA5M)jARcov%?2k$&2HL$z8^9eD}b%Ju+j@Naw+tvv8PJFb`d0-N?v>r95 zZHW!d=}+I*)-hX^yQ|hpxf8ALh3v5){2?G={Ugui!NSE4^wN>I!H@gyuCC4HGfbM3 z!!{l^V!RYhb`zI5U}+}z4Cmd{-R7nrTRO{(IGIcE6qzAYrDM=l?#|s(@79LNdPj-1 z%}R!#)T>)6rRFb46CiqT!7J|XKHff0=1C?U=RrrxTBn-5%|q%HSHQ}~;WtUXskV@u zUB06@Y36g};VT|=JnhqmE9K@IBO)yQJvma?21Tlq(4n7CgkGS>Xt4rpG%^7P_F3GOlv#aVG z*N}~hHCx@`TGx{s-i6^`q~TZ|u`Ms!+TUb3%jSQ=-wxc0j&55nw^f3!n8d|0D^@^1 z91SaN9?l8koh&skhx9V26~!2%$~97)@VUe-j1A+T^o)z>K}nf4TXfVaJi0?h8wbZs z-Y#9rw3j0c&XlguNsu}xcs7Gvi4fN&E(!Pn+{pgfm~PPT>zX`dgk0;Z&~kfFCU&SE~>Y zcf6vbxl#tIAPh|8v6{*?6kdDx-a%D8&y6TPEvY@`m3F&dh{6Z6zlhDlwQa&*IaZ}= zcQ{o)JvwME@@i@dHkwtpnXUS!8ktX-qW|ULnpa0XwuXxt4H^a8?3VFVAJMCaLrPT( z6^AuSeu3S`#)vpD8t0`7fg4ZG2eUn6r!a?4r$$fT$b%#Cs1xq}UJw5mi!K47&wPlY zL3f*>NfiaNRqv5)g!N(_4_n*8&*(&ESLP0&u`?chu>4oi-Lomtmi6HR!Aqz|wdtkE@>c2G)1= z$9%3n#Az&3cOQ9t^r0@#9ZxTF)*QjtrzAwtyS*Wnn>qGbYwuP)hGkxcwDz4E z(XW}%xRia!r?o1AL8YPH?WjqcCKW2_}wj)ttF?!I2=@abQAADKVT*nLd| za`g2Tig@I@(w=ZO`4Q;5`n;~UKrTIYCw-*gyY`49r71GIA-7uVujr}v+54pi&`b7s z!wlf*h)31vR@Ml&pQ4tylb&Cp)UyJ#JGK?RL`x$)r#q+(~n zl;x1fdTxUm?L_dw4L~^TtnYh8_ocX4U)1^*5ii6uErsOO6KzJ-Qq_ z3cBr|jUOL?rcbmZEDTTQ&pXJ~r(3C0{Q8Wiq8D8{TTRbuG-wV77-NH8RXNA*%0j$* zbbQQURwKYi;^k{!f{J^_62~43lKzmdP_XyBz`LQ>rsj}9dlbIiRei%|S`#&{v&+Q6 z_lecppy0WiuQ);X5XCLZh4OgLr^QuN!*#N$wRC4@>GJqQV>|x7b}m{*>olvsL$@%W zCaV|@-&WbCz3&}sR_KL_r2MX_vuestR&Esk|3{Dd3=y}lVfM)|ZeTVW1 z>4KN$zQ{pA=2Q1B2k!D7(h1_dBldqC@de@P;lcBHw8l3X?wXX%A{fZS(EKxyw z-syI{{KewpZ@+~PXD5$!p&-xoTTn&=?aWRAQg$P^P23^(%CUB68SDhFqy0$Cvl-GO zV3{5sk&h2OwbxBSqOeZC@&4>r&3|7+Sm%%*rqu4CYHM;UF9bC*!R~xBtCXijnEE*V z!gjWrq*9B@dZi$V@mf@RkbKHjLVOEPk^jce#34YnF2Lm`mQSZj<`&esY-gm7h z$QgO(X!7fKY{gdJ6#wY~w4x?C^FyZdv6V?Y();#x^Y&(V+q?c(-cAITFH?uX6Er?d zxms{7Fux7Y_UZxOARF@qo#{{W8^NSB`rg;|ruCKwH9LA2_w9EB zf%birGHuj?jZxZ=i$g}WygIoOrTQSN$4k<3cOZCpO0(nbh;T&$lYY0fWp;Jj_^`(3 zs!=A#Y1a;|4`z#P`QY}7vEh@(l}$}z-u>)=ZP81n%4?vOjRN=dba|uP9xcF2uyHy^3s1JNP{!pn~xbfR3IbGt$28K;f ztZfIh5B+A<6C_=sLm+52EnXd8&^7s+8T?8Z)A+P)|!2~srTiR%t{_;&wh*6;suc8a$K@l^^&GF z{bIHraCMuDx1A6#pESsQTyY6Ha*wX-XjlEwME34PCmrh~UccQW(&?b3wUcKMUcu$a zXe6YA&?OaI*790ZVt{|@RK0K(x4ykpE=zogz)90$Nq*^|xpz|fVa)fQWMCUR|K|FY z+q%CE?(N@}-yCP0%d2|x9I8)#IuC8nQWNuJuX1nR)h0B#D>TUrie<08v=+HA@59vu z)M%1jkEguPZyIf3C-u2;TIM1}7mk)q!<|Yczmdn^{gp9V;H*a>xygbumM$qf`ucuZutAa}DhA2k6=&K<^u+L_`h zVd$e~T;$BL$5QVEG@PAcL{@z*+iJD=uPA>T-%T{%g(8YWGWmr?wIKdG2-``@4;=wZ|)L!J2?ckcwsK0Au`#W*UZx7=)ot zZkpfBUFhi{yon;UtddRjw|TMu7BO$n^a|$Hl{U+YTV=NlmA)&kU(ZILxgnA;D zXU$6fwBV{Wse-}MvDO`ex~3hYx1$ac2}s$?9zG5i9S%b=!$P)?wf5}60qmhu3t4=& zA~o9%P%j%Tz~Ho};RT-j{g}RnZ<*%Blu+eZu~x7$I=@I^(%E%eLw;Q)k8UA|7{VuM zBtoY==0<<#ctm*u#%Ot%B%1}t!`3j>O|-d?gT@lCw1#2v7-KR%qt-BE>wbUn8rFh+ z1ro(c&)ma2S4EV#SvvP%^A?hYzhWk&40(yhLr~edrZ0cZFsZm6nAfkHoXoi5)CoCl zO^Le9QzrlTZN`m5@b8!<1ufzY61s3n#Yi%<%!8xy334^q#mKsAX9)gS2*^um*#^{&t`GbaVr~yRZ3oSLLTm+;A=d`3G-7PdUjOF)x!|5RQ zNq?-l1%IZw_k$gXU$ zt4*kQPzZK?UTT4*iB`X?3Fd#Y%+oN;p&?2(^RNKMT!Wmxfq6t_x1IhPliFf z<1(apOe$e&Z6@=C_ud}qS=W`f%{ME993FC|7Kd+Ho1-hVohgf2DN$1|xVmGe~*&pvHqw$N(r%Je!ViOdHwC5!OFQ+R`yT_i|^Y;;#y zhK) zDuD)<6`Qzo2kcg~$%haszR?j0l_lDEn5MWp9p!xH;}WV5)_olo_Q5q}XFf;got4H@ zm0l?b`2^eu=9jr8OAHb??btIN0dA4Hh%1NQFE~r7rZ@P|7AwEb5g@R7+P{;T`9+)z z0fu=H?omsR#2>+K>chhpZtq_V4W8F9HV*9-t_}&!V{?T=y+$uR=NDDmlK4_z4`nc6 zGAxjz*;FfSovUK{6aeAz1Q4quy}7K|Rj89zj=p zK9rG?hFHg`{0&XoL}jx}xoZ%{HVupBa4r3pp%*4NCNOu5&q6##U`s%W2waRNa4=fJ z)PUB(hJ@q2M#4TXI3x3IneotQghM^9L31D~<#JtJq_wZSMdAQ&J+cuJ$aQULhzxV( zurW(kzMQd{dE#<2XexD{D+=a%XespSE!%evCa3BIC?~-U~($;NXrKwM@)0N z-dszXomfzpkOnXbM?a)@dEQHSo@D;j{0&~u{Mr3!T|h4Vv0WxmnKhHiar{1kL=9T; z`Q30@48tm_mU=awsLJq{a!857gfnl9B~#Y(mmEI@cJAU67tm7zdr&`K%baa znwXWZRcVekWDqOnDCwWL+;Kf z6PyCg8p-`b@w~FHbUWlGyj8ctO%?L|q}Ag1Hq?Hjp&erLW9^I1dPt@UqHwBLA5{&G z>w87rgsjD$3T*K;^w10vuEDsJcD<#MhNzhvr{>&xiXX08=OKG>DZSaE zg|}q?`{`z9#}okF%ma04JSWfzNw|50t;~uC2k!MFD%BwCpM$2PSl3PBH*4v{cCK*a zmd`reYNZF@#&5l`r`4Yycve{QaE?c)2fmsM33yh(xLrzTcEA&%PP?e%lk0@blB$pM zRM*7En&1w_o_jW@v##;&5gCKj+kxE2W?1|WPxt61Milcrnn|-kN2_kRcGmiDukpiW zD1U)HV*!;OEYz(lc)Kooce7->Q<&v*GkfJsK0z&=d^eHdarhQ?{!D)Go~s=y8&fa$ zU|MK0k9TcS>P2I_JC|6d0IoR+|MG6XzwMuEzsP}+jLaW9jx?=jKiU3v1Qhvpc1-4I zD*LW^L};3&vR<0EGALT!-ow2bTO#2O#p%11Sgg0Ea&-kAf@m-Hd6zxfE1VzB`^h~Y zd>-#iC!C$iA%~@vVsldsHb0tz^R;G3j%}7_hp!T9$J)Du3M{9D*e!!P$#+;YE7Sz~@F$emGa3`sIr2z1fm2oMdu8K2Ic`DgF3t;F;<0u;PKEuMi9E@A&kn z5U8z5C-t@9-9dkr(bVn;j4z6pW8Lbd z9vE9>bF`JuMu#DpC3bT!<0Omg$IFA6*2+d9i=Xe_>fAa#>5LmD<)3$wlX)7osWc1L zw+MI2ms!p|GHae4f3S7!Z`Ix&7sa}MxF@|@0k186wqHWP;#Xj9y}|{}9}>=mq;?DAXx7 zTw}aiO{m74SR0Oi`S5X=j#@hL^5M7p%H-FZCzA7-dduxPW%=t->pw&x1F)^?)+~ok za?!95^eX;^(9;)|rpHyh8Bb!fuCDGHpPnP7GBZWZb_@9@@!$AhrYDs?d5Cq`HtBWp zBLcE}ApuhcOR|oaqQ<+Y`M;ystB=D6%K0(}N{`JdN9i)G7kE);X8PeBhBHJ4QBO7+ zO`j|D^_Qe0@p)O{m2J5vAcKq;G?8f>;2(dSD8(L}B;Oik6a777m%!?WhjAAv2Sa=p zAyms0Z||nwR(4#X5iUUa%5{o!WZ0bLQ`l$a^Y(f6JPR#SYNFVUT~=1zd|;-w*Tn5wBI?p1kRUFpFfN z-0T^Ql*J@3yR=f-X}m?^FwEM&zwsUh@3(MWTp|V(TAW(7)!NT;9672R+YTCuxQw!2 zc^+4XA~^g_RbI!YQ@YYIWoZV(sEI$3Cad>g1X*HNMq0k^TSwevy>t+wFnc6mKURWv zr%q>~gA8uGOTp#-waKt=cq-~v7CDSM!(lx+ur>yZ)bb$_u;@|7)5xFmIzk7O&feex z4tDS&J{MQwFl!RN02fsa6rJ`Kf!iq-MR@HWG)VY|xK!a{6f?pZR6GoOc<=f{X-z^| zj)ng)W_a8ORi;9+cAZm#dP$tEY*GDOj@|SJlPcFuOKmb23zXf8IW_vh6P1_0a8%b_!z+z&m?U*K!YlIyG+ zJ-e)Dhs|>kS`K)@dIgTwRU?`E?)F=<#=@NVFp|t3AM6B5UO?3 z!5C>7ZP32^reCl1z0UJf@~_)0KMK89vZ-*6-%}U)hH0W!W>+qgdX@43+lU=>^Xc_E zdsBixekxCE?Ga!%1->kOw#u2l>LDQA4l^8mAN+K5?}u{AC!}&i9188)iH1)5>%qB~~jfsu9lE zcQF3iGDU}w5USr*qjIAN6^Q#g>?oZUuP?=}^JWRF)h{B#*cTzjv_+5#!HoVp= z4>XSxUt8d_Ym7hriZEAJX6{@ffYE2zpsO0y4v8G*vy(&V3=dptSR+59XvM`ZU6*GE zACkZ*Vk>swtK$>YJq8`ua(>pk>V%5vf%^j*@zPCa#U zvxsQ0)52w16bj0DG;Yry%8IZH>{oe%nDwvp@TlRH@E>0Xzd0=%G?-*_o#kKzhzmRM zDRP9kknwk#ecxaAZ-HU9HQy(eX2>e=OOo1Ig*;fF4Q?DpV+hsk`xSlD9ov%+qY6BB zgryGZIA(SVnOxBoJ1b-O3hhg&0#tIi0yJ^| zgnYL3;fK^aC<20xfvkniWxAz72LtWBLuW8ZCB0_@zD@01e{eM3t`f0F2)oG(`^x8X z%BJl8la#`3n%QOCjOk+xUOmLXzB^lB7Hs~ z5=)m1<2^uEfDZSmdKWNm$`Dt-Kz2=lO2FWaf4sp1P`^gy z{+fIrH6FfO)U}ohrl59Gjb#51dv6&QW!tq44+v5MDgx3V0@6rIgCZS*gfvJDH6Sfr z3M$>*-Q6W3Il#~z5<@d19YcI4*LB^`bKlSVz4!ILf4)E8y=~_YMw#I}k6Fh$*4o$F z_tm^3kXl++Jw4`Z-pIaX!xo>nvprEtFGOpppS95yI09k0Q&b4FI0`K#%EGAhS~d`f z(Yirf1%3{iDWI_{f+GL;wB^*+(y<5PBH)xPdylAvRvxt0ZSS+R=wJ<9?@*}TO@lcO*_Wd4O5)dN-PTEQ7xnGsqk{GaGQ&(hxgKl-@{v{ zaV)jP+?oDk_f;j1w&k{UkEZE-knMt#q79enH~(aN&2+eqB6XL$IMrBh!lT%@!DRCt&1SFkvUfj2*`i?$6m~I7N}LvrE3UVB;|%bSFn*MFv((lM?tOAX~)uDjmb0<*1!^2HsDzsB+9R%Noj z#FPW&oGZP?_;e;CxBO>T+>9|lVd8IpX*~PI+;Xd-QxZ>9V~|Cv30EaA#ai+Oy?s*H z7tby8fh3}4Ag^y|Pqq^H(ptY7;F-AOpHN6T)v{LZQEWZDtyA$eT4hmpiQ_#ee>LuICVYK@(B zSBlhBM?89*2lY)5^X+*Pd!?&CR8sjn#q;;Q_TlmN8v(+IrUCNn{l2#VCh8@ignxPn zyCJ|Qbs1)Z5y$7F1q6P=JPad~)YN;Yq%h^cpOukNW&$y%?isk}*RV6_t1{2m)aDs8 z=4qXB0(Y5+KT4Ss%?#y`0ossya?>;A*<-*rbe%A56AQuD6M0z=i(`e9mKC z_35k7oBa!l)v~Lln`=_ynAJb}Xe&suJRa0__7AnooCzOS*3qa`A@7|EO(E-8Lno9^V>UST5jvcqKp`;&uJ_xQ zB3|451>#6l)Z^Uk>LS^0Whl408ZapFv_Bd=Xq|Si2*pAY(efLRNy4)=hn-uls!c=h zMEA=HSEJ-TZ7B;y1XS%A-3{ig+s;<-#9^us2l~4GPN`Vd^25}xMu0c8M~K*25Xkc~?bFNaM%G9Vyk zsK4~cT9Volst?VCRqqT$6?o6{q^Iqrk5&@s!Z63iuRnMwr^jbN)l*CMw@(w46nuJ& zIXJZgb7@3Q76ANZKprpiIEQ-b@K45(uY~P=F8|+b$n<$xCV|zM`4EwO`=GDBR+E;G z=k~>(WTaG0?Cb@FLoRbipWCVLJm33JJ+(PGptoPO>Qc1{gl`!#)X9%XW%4-|OjJWv zfT$f)!aa3PFw2emn<#~TiFUB=l}JGabE1L<$W)w*JzHI<(Pp*~*Oynh`Z6~C=6x3| z+)_rBJKhjO;sVX&9QbS_<+x+EjfF6$(9VJPeGj{-evNXe2HOVgs6H8pH1YAk=sVZdK{cLT^5X3s zXa~JgcbMYX4VQbKL%IjP&y2egiE`Sq72Yezdjjg;@dQ5+b*(rm8(Pp~%e+vA z+`{=K+Zk(?rzw|Fz^OOzAqLc&S~7BlNb7)B?e476Tv6>HD=ZJ=w1;;51eVRAgeL=H6Resvvb}N z^2(ofH$bs!v}B@Ykws5Ncbopi=HB*!pP;?*wj#`@my%<$vBmYR@#&}wu34P$8cfC= zI&!m`Ycq+{jZp-}6bfk*aeP6i9du2&jRvDS{)`4~A4-5?lAUfsgcUK=ijQ%*{Rjg z=DulhHKnUo=aFGpGU6#*-%@aW^`3j(_yrK<<&qeuCGt$6=6+vL zcuy0GU-WVw?v)}H`?x>(RIbV$wY=zf|KDcFA}UOq^CL!TQanZ*$Ppy*8mt@FA3+z5f6+yq#2gdTBg5DP*67~CY|Y{(*d@-(z{1;;bui`{px?@Ijjw=SqiyJ zKT_Wi*Yw6&c||iz>+lQj7ujC@j8i^{25lCXw}=BK+Pjt>cbyLf5hA^k&k~_d^P+bS|R3ry%QW$pqD*B&+3O3 zMfFKJP?W3eQi!`ixr+c%Y*NzXhgX52vW53&9)K)=&T`e9+jxOJIN7ISnq9tZV%c!V z7lC^B&PJT#Idmi0tZqDu&}paGit{QRH}btHzlxl{2IaW5G%9=Dv{{fn9E>7hjh;Kt zpK4y$fPBP|h{MqRg93TiukGsY=WidnLsAo7*O(}j#L-Xqn-2G@Ot*a-$YxX8{+^vj zT}DrCc_ta-6Uz+HGo+rJehnxn12*>07}r|PY*@VKm&HuM#H={rVa&jrt|-Lnd(C{a%SF!j6Y3wE&?a6$?d zAa#GcrQ~^JpI(bwm6bv;uNxV>nCz6=jPVXAFt!H}xH_L4W@@^1>OFa`$mRJ2Edpip zw2GTp&q_qK_5Ej2E2W-mbA99F!E}9Txl-DN(QShAfmcD{HTl&x(XraErBCX!oGqT@ zw-a5J5jH7KXp!6HZ3FcS)^|g{uEWKz*2KqHa^wL`B4jSyCVtm`)iJ%W;xw9qpD1Kr z>=`jZLtNf`&3J!+PHdgq)CTkBL;R*@y@**Dw)`pNLM1g7L=w%MQ(aN88HpB}H$U(Kzn6~|vRkGjevJe$CMRYN$V)25Oy zF0d>3VJ@)go_Ydwjfa}V=l8p;re{D6FM0ysws9248d)ud*GLCai>&bS9!JmeLW~Pp ze29vSql*OfmdZF@5RBIFil2xQPhh3Tv+=2Hy&y(AM$Ey8?&LaB8UNLXGILwA6CST} zQ%bJ8=s;$bsC2l4c~U@~(4dcgZ{&Nf)$iHi%p%h{8f+FJW;)XW1g zIewe;s2r`13|(ZvaqzR3=;Ok_v3j2^V~OqxQr)k%sa-V$dtoi0q$3{N^nj<5dcVaM zUtSg!(A#kB+_Ga|pR(9E92UFj9*#o2DXlVrx&_ab_m~}LZN@FVV)dJu+ol(Rhk?zn zTZ{LztG)XOe!#ty6r`8~7$o41HGO|bv0CvdFqKR%#oLZK1CEM3UTn&p213qqAFs*u z{bPY!lfP!P(GmJZ&bU3g6r&qd7{Pf);WAbY^`5!h891vz<0DQiIO_=Yp;bbE@zwP=2rqIrk^M7@N*pg*mBB~57#ITFYV-`XuY!48Llex1SkDLl8 z1>E)X9yb#8k5|1KwrsWfY4Nzg> ztRl{icp=<}lMtp@IF(UJQ}JgJPQph#@wPO)=I4FqNr3a88XR;`w=uFO=6y^zADinS zYY2q?)zvfD0WoW?<)QB7Sbm!Ox0bpS20%OF@UNQ3MZU*rlh(!J($Z4;#m}dWb(egA z9s~GKqAla~*7enee6YFFmDkSsEt}J6=HR{1ht^j?G~Nj%dUaB~?R_Z^SmjV*sh38o zHUn6`Y}!o&gs1%qoB$sf4}~(O9(&Hxol?i9+cqjLYCPYmR=SN3RPWAD+kGPcsINHz z(g~&r9u*WyHSI6r|5^S9ER~(%+6`b;i%Rc46;LlVcFonB;pX0|{CWWJ%O}K1fNEUN zd&Li^{NveM$p|dU557K%qR72zI(WaLs3Lxk!ZSUPyaA2#E$3Q$BcSC)%P$D=_OZdLw(NtG>31GM2o+q%Rvs>>Xz}f z4@Y&}P8VF^DC7-854A@~isO)=TAh>JVOf(RE-}kmkU$(G9OwgyWL28K;HXE$I+x3p zi(T!O)q7ctzY#1y6SVJ{?xRNI$zZvNH%zHx_umV?j1ou={~9jB=!ICiQas^;Y#$D> z+p4(DiQiM<$#_!UQl$w*NHB4Mk48S0qYatBYM9@D*|g+UUQaO@HnubhB+$?prnI9U z78LbztI`gWiLZaMH8bhf*~H4wBtJE;3kg*ly&9?@ZQARfQBjF6RxmJAIoDMxH{WZ@ zf@nDlOcZe3ifvrkhVl_>H++cPJPq2>E4!K$^X*M};J<_s!oEdqKLTpsn=XVE|Lb0x{{74qK zuWZSsFK;lpi_K>>)$yja$t5%eP#i#H#$3A73_NV$?yhN_(D$CnRcrSaJyiP8WFcxH zrOa)-LVqpLS5x?QEy=;G`X_|VR~FD4xLm!s%7mPD5(p1?*d8U1+|&8E!KzV0YeG#< zti{9#IIEus0d4hUy&e6lFtvQxL@ERku^J|-tbB>WQOo)%4pCp^FF$|~4O+UBtNhkQ zp3Ld=F~sXV#iIU@@pwOAAmRDj7{48{rSr_@A}vrKq9_Yj>3DQVV~@1GN5G=kk7ltH`b^&}vDD(p4%} z9b3OfzJ->wuhNIT&}+NCpwO=QSeYQlZ1B+w0hBuZDSa;Oua70euk$!tFXeAOpj=!5 z2wESgikti-T%SqZrf~-!>N!j|x?KwZW-djH?sji3NZ4>e_$4H#2jLLXNifv~ruQBd#%8r;fKL_Aj`O zQoLQoFE&@RPPG<>=>l?81KhRW%h$Gz;PG@ln8e<*}1Eu_QxB3u15p+PGb(UDrIXv$WzInx?z+9ttiTU5!J8~-%aeHaxANwSb8lgctH0`Y{*s&M zcaY0lq9``hqsJ%bJ05ep9Kmt$g3DjG9dDuzldM_$deS{tsG2hSj}JC~Eq>rKo)POMECA1Y@&}*6R&|T-W2%-qu@m4X;s3|NV-=+ z9`R)cwTj<}*{!nWEO){z=NGb*YnrQ_<8}Zpp?(OQ`KDpAr@YjouLgXBpsA*=9!LqH z5FeS-Z~B<2_n`xEF`Nc7O>Ozz*tOW;+g;k;+T?5n^~0ii1{7c;#q%QK*&t*yFaM&$ zvY=6UT$^s>8=R4?@&u)-tG7-I6!S?YE$%!RW^Iwf(+KqFp`d&H$Lt&33hR&J8cERaJUrJ5O%|-UJzyz-&nKBSuvLXKVLchvtUOgn0O%QcaB}DgO(x81?&~$+iL6mXiWb5rjU4@^+L~8rAlqsK=4)w$|x#23t%&Id)WX=oEF>gOE(IL0hp~Y=FGkG5cF&#Kd29^kUCgo=ib_6{CmVd2D^zfW zZ5N1Ao1@8&jUy>s8O!i#=C>b8m}m5wk1ZuBAHF!e=-3%A>Uui{PO$r&DV8jyDR=pW zUgW}S|JP>FRfGT5R-2BI_SK5QgXcd*SQ(S@Giqau^cLLbiN;($4(A@UZ1N%4&ZHm* zT-U}+LONO-uiGGQj!9|V+4dOm!2}MIOVtm4ou7{9rEhDtYult;loG@BSm~tCNKVTX z&GCCe$8^r#;EAg$mr`wwlJXlG>(7*%PQq^^b_tatMA-pcN8+#XMHgXPAMC6ZD>uuNPP&OH+xnKp@7f3*d=JB0m0Qp z2qtQ*mTmTK1%M#V^8V9CVFSVa=a~l{4%_!ovA)7OCi+9fB;qZ=Q0l)GcuEqO!dK$z zM~|>hxWD*%JuTo*Y^V&J)fsiv1ABHQ#(lD zR^uh?I|40;bZ?hyN;{WIAKIU*Lz^RG#ymZHW_c##ABw02UbReloys2ODP58o^Ox8T zM){29Bd_c=L!2~+8Y;8lzXAvx0^EV>o|)v2KWLnoY2WLYyqE@c7MHafDn6?!M9}zD zjUl=r&T(eV!bq-3F&9`}h%ni-n=6WdOki1c#)j?Nr$+j4k(b^VTi}}*oxtRSvyXz; z4Hnjz-bNzK4-(pqG7~xqVt%Z@&QPTfln>q3IDArQlfSG3!VQ*UcPwyDa}4Q9hK9sG zuJt6dacrJqsN(n)IL6;PR5V%FqyrnSyKvh`W6hP<-_uSQ=fCKRkNeHhcpOIpXy6$j z;LPU>E@nV4I>kslAQpi)aG34p?uv3L4~f@vsJzwZvWwf{Hc_g{t;{Oq06OYJW$LXo zEGD)|2T%Lm%e~6loom;!HEG71A}+F19JEbJG&p$T{P`ajn;0f~5(`Wcm$d;>9yUmx z;FM)AtWsW0>hVH2^`MDz3fcDvIICt~ae3P|{M60|m7D@*YmVU|@hRgu74F~un!HYG z=xI4S%_?HeAsj-ibVb0bSyCWC)Y$TM;{eJDJxI-*%D-sIu~L-;Q;YLK0xRzwwzS-I zV43G#&Nu)HB$?I6d{^^B^?A!pyLlVknXsv9bCSA6&RW_m*jTKV0i8z3YyU%-xXN98 zG7iE}>Q((H3cx$RujL=Eom)6KDw#15Dtld_Ub6g=G|{Jz4K(wi{qlfDyUiiD#m1Wg znP4YzWx%19^X2q%$49il4>f4Nv5@N2U($}x4%IQyw%M6<{fQj`w;7upUQ%eRGRqyG(CW(!qTZHH?@Ip% zsWLV>J_#&Qx_-GzbA#Pzb(*QZLm}X=_~4VnBQ?Y%a~E0?&S~PjZJk-+G)1z~h+4AtJrIlca>o z3>JjA9nPrnhE8Tv;-P@}+tFI`^E4Lv# zt%um^f~rJ#&KJ3|NMX2nI$tS;*Cmss0GSMxHk-aDs;q8;&a)fEaa!vGsZ8bV`++H* zqkU?*@(f$UWe|&TLAUN#^!F$gYdJ=tC*~e6Qk&>fE8L9HWM>j{-E-xtHiYIo>-qA2IlwKMSjojpAkpZcbE`J+c&(r6YB~zPN+YH_64b6}IsMGlzleRME zsznm0gB`Z8eR&D^_U+93yI<#1UDsMo#PAH#hTv)r3=rKaS**kzI&gk@2qII!8ZGH6 zT?7SD7znFCtw&<7oItCFHy4upE!Rx~ z-+$qDI7$5KV-A<$C=Uen%6!8D)EK{uz5f30BoZfFBuz7sMWbct-l!fEDOvR_Ld|fN zx%oKN72epTaFy$&7J3#oXB#J$bpd70PodN_2ouEMW&o+#D*^oR*2FsHqbOMbUWF7j(Ex2;9&#_+hvfCn z=AVps>ela`Z?tGfxrmRP033a2PM^w|r20UWRaev-1s-qOp6D`=EI28YYbEgkeKt7$ z#fS&bW4rd!*n2e3`^71N`T&T=^DMH)Vn$wlE$Z7?ZKGX*T30f=Wv77U{F@l-m@%@u z<}z$E?;Jye~m>~WF6S-xhe0sR#g!SSiSO4dhZ!SknyFT86g58~S! z;(x*D0C^Tcj0BnZ;xAVP^x=Q7WWu)oG&Y}}Yv?V#!nmyDHb5)a7 z%Jp<}JyCRup|V8bDFC*o@6K;^l`35Mn$@0G53n8@Wj&4>nYG9`CF`8Z2{m+VUE z)0p@51_Hpp?CRU<9V)1w*>(~n`gDx%dGvc?@78U~xYgpyy?`?__@e`JFZ2^_vKNdOd%>E$(r~R#1 z;fkN%?6e-gAmkQ!^c4y&)zS5WlDS2lq18UJQc3F57jdC*~3(+ z@u4;C#ha z=Q>{3wR3~d)L2G)9`q@nA63JoO8HX3cf&av*WNShHaYdLhyjHTwm%CU)MyZoO>QII zdfR9g4VGlrEsaGKjD3sXaLDVRknG@qb?36vOx}>a)#K#%De8p6v;?nh1sUIT!D2aD z&{qGn&}aCgHz1@j*zA(ZX3+ApCHfn5uT-a-onbw&i_p(2@%yddUSMdl+e+Ho!BHsw z_Ea?9;HY~O#vY;gwZ&{O#R>+BCtoF&J6B;3D*KG$7P1y$kPuCw6bOmpd4d7F{-^Ee zcNGg#@Fk8AMt<|PZLa-1UaDX1yOv_}(umM6qj&SVtrb2QH+YKi{ZAhX99%jW>Q1`t zs(3d^K-V~9xRU4elHE*EXl21^VY~QYVV}dieb2?MJgr{|#-isAgiOS=pryeaHrmqh zhJ|1>*Bom2mgD0$uRnS5bZFblYarv8lm~SGa$mqL(t4pI9vbDRyA+ie#Ckd>AHD6n zCdTx};i}(cL1!@~puM&){KYAYL7jg2>8Pc=J{^v;N*!mVVfXtl*bi`c5!7h4kJM|W zseI1M?hw3?AYo5n$D(qI&@MW3ZOn9ssN%V8JCRia%DBceOrk$OEvn#Ln#cY0=z3QV z2)@=<0c=K9XfOZ+mZZ2M8XYDyv}EDmh}QsZ%^8)gH#WD=(5P~IteE`29V_=`!*4~^ zK0Y8vN8LlyPqLn?b8R(iQ)3?I;K9~zmo(9CMreqiDR7oW-3FuorG$I?=&p50Hl(c& zto=>=g2*r5m(piM(S|-(6XFJ!Det-0JC^@m2iFJ~XHfNY`lXRLea56`AU+NATWTLE z`Is~C=qN0OPZzO0K0&Cp++=N5)u_o%{9lt9dd2+cI%#5Zp_)%aGomWrjg~s1a+b0G z*=+vFg8usP`?U-RZTQ+1#{3+^6i}YIEwF|Eyw#<=LLlh@s(4&`LhfsS#Ocyagxevh zEC3|0C@ZC(SirFTs-o1FbTAXR1>v4 zK2`>y*cvGfe#D~w3;^N()FS-jZcqT(8^CvOB_AKU?HdPCGoGGqF@s5kS-I~q{ZE_y zAJYsZyl=&z+ZV|WG=AZ<0M2W)&{4q6t|zRff3)f~4xcZ0`~0t8hyy&ofXRpMiF>@*^awf)i+wsNr1H=*Rfi$NJyh(VyLHOF(Q_vovpoi~E1` zuK)b4f3ls5|E%FZuf~6D3}GOGR>D`8VtUD_oMeSQ=RB3~ zSCtRqP?g_$qW0zGBSE2lowtf$S`}~Ai=zIBB;5mz3Viv zXxb`|LE6F+VwVz`n3|Y+K6I*p{!{|}btDMW_uKnIZWZ9g|JBtMc>7KzRi5nstGE5< zZ~h;w^MBU%?-uDlcKdfL^dB4gyA}G64gK8;{l|v>ZiW71Lw~nI|39~(H)q(MfWpMV zN-!rd2&0uD-TR^tP(C26vR!EU5&s}B0YldJe}84Xx&KTx>yvuPJJlksat9SEpN46Y>-6Q9fU5BN&zaH!8mHRjM z5BwMH7m0e?1=HWZIwb4sHu-Qt41lIKTa0;&eG_eK#CxjP$z@! z*knZiaK#E`JlQ*`8y}I% z5*yuw(uj@@FJrB>+FkK@Kc<2U!hHX=MHVeXR_f?}!1t*oPgYXrCbr=X{y7_V;(o0N za=w!ocdUt6lEJX3RM$o3VNT8{VBsW^tA%=z?d8CjGnT$H4;h8exQUQP@1`T3#@%lQ zcjqG{r}~#e$=8IXa6xck2kC}H?0XdaiqavED-&OWEB+?7j$reXZ%X5JJ215zFHo&Q z+u-KK1zq7Ge5`MxcDe^5T*WT9>HDL@%9uo9mUIjn1>c^u;a&e8yvE!3F5RB2f~H*z+!P5N@Z< z;TFsv`G5D_r{hRqTdWTxV!k8-mb>OR-Q}3urquaK4{;s~Z%K1}jnIljp=NDVjvBLe z-6d%v|EZVuLD%W}b!E_0oHeK5bD7#q&>I5EN}o5NXZ$Sg0}|hfK}~Bbcx%1%*U=U8 z6~+OV7jt%1XVEI~NEw=VU(R5{fn+b?>zEO#C?dCa3`4uJVc`M5O@&mz_4@%80_X< z-K>1hMk70X+aNF7e0}!HWg)jnE2>orS6|I5+-g0==XT9N7$u-LpK;;vaB)qFXW%sZB&RlD z&q+K2;r{#){Pcb@NGwn~jFN0lT=aHt{F@7?e*d1eE{CYTHR>_|ZI&@}LSts^$o9m; z7e-$fsdJ=PmffS|d9~hF3&7RW@@eh)`8K)^6st>|Aa$2!HE#P!bT?Esr&(7KpIV(F zv!F%$0=y-fAl~bAT97xa+~;gCfx-i|TE4cibj@{Lgm|Y)PW|rHkWiW5Zi8224S1m; zo!a^HrHZSXO44y$OYJ6}_Ib~2Z-ZU>Wt5`FmVRO7obti12)wnc+@*e#>ZQo=I4@4? zagkYqx%gP=qPa=H=1z0ZTFXqjld zB5bOizt+^q;DAbRzyXR{ht`gZ22TvVPLnTdy<2SzGfT!7J+uT{yXYK#Uq4!u4bZvA zX-W^O`F%wQFKWAUFPCdf?A?*ib(i45?9L$^THY3SyPr>%>D z+0$6p0ybyD68avX?sZHc#Pxeb%OI6AAZWo9A5wCV=Qaa0TdR&*hIC;RLOh}*KnV!v;!iDOV9)nAM4xUgF z_maI+#8qH-9yrZQa`EG;5-`HZ?rH9g%MwIDu%si?;eByj)!~q^o44CbbTpJh?(R`k^k%eKMo6Ha|c<}tiG^Ugv~%i(;T zHTJJoph`IdYkwLncJWTLCyfLaCfPOr2M~YqH=THO@MBNRdj=J-hmUgB!gmHoSb3+{|14a;@k ziU#k6<4$1pNp;IDd+>&kv>Pd2=CjV&bqj7&@8~~9yBsdz_0UYIHM#DvG1TJQ>#Lzl z+@~yh+Z;FGbxzEA28gNj5P@cagG2G7QIypi_aDtjal!phtMG%eRI_BrC}vLD+hxBw z=|xKnmP^>OE2?_79}^h)Vji`3XlB^YcjxZsxE`0e*tngGQzh1(j29n6F;)Q8NnauT zaaE3O&%_Z7braY&xBECYb1u4HSuj25lZ)}MV}Zwq0f_387N9+w`{OXEP@h%*JGM8Y zn8<5tPm8MKv{me7DQpIxD$~L?tPXUEM#vN`$oVv3pXKqHQ`n0Inotejt)#ZrT=l|~ ztLB}cji>jejdrIiN9*mDD&|`L&Tc+`llc0OVGYXJJ|4Q1NDQ+nQ@lL{NK$R1+cm6Z zis=bsyh-c&`M_G(SbpjY_8waw-oFwwD%UsNOW)B57|fT3hOwMSB=NaKR!+I}K8QzM zc3`Q;<0%WiJW&f3xp`Y{QqF#<*DZQp^k93YRNgF+clYIt4r`b*qM89XBwZFW-)q|I zqS1;ps}j9)ZMPaNGrI%)-s|(@Q@(>uN4q}ZqDX8+i6(yTPNGb*BWfcU>8;9RMTFmT zbyC6-pRy=*GMD}B@&IM!X5aD9O)*`jL58NO{oa=QH?ILo9vskdn^)1udyGLz(zHpb zB+9Dt81~ju&yzt||0?mhUigP8JS7lzVZ6mVE9sd?c$J$FH3f=UhkjE z)-JdnPD{K}%IDB}tn?PEcrxu!I0eG%RHAp@3{>XO8*e(kO8dh942d`o(>nVql5P2Z z@C=iTACD@8@TZJ6(Ow_dFZJIcROV0O`Gvgjy9({Tm!j(m1;itpyMxy^X7+|+Omui- zZ)3so_A5r1*r~tB`S?9Y&S#4`7``?-Cv&cL*%}zBqtp{FJTE011njGDX%*+6`hK`5 zEX|Fz;+@TOFgu4&8HQ@6=YvJ9{a~Gd2k`X78@ee4E^^JM)QfFlSb81cF#3pJ zT~;f4IW*-P=OQPx`kxObllz?AVP_(B-e&w=KUdZ)8$Uz}ZA0xsctKuA`%DhV1{|PE zv7Ov61ZNc)$08hLt#ybF$H9@hweO1~1fAnXD@&(sOP7eVHx}_X;nRgK*?(vOiu=>(Y(U_WnY)oeGb_3*^L@yBVX(fv=@%l;U?2cu=8R|7U=g4-NKF3DpmBd2Y->a*S+ zhl?u7Vo)NT0n;agA_L-2@4x&N^Hw=h%MhPLgwX9%{NF^S!2Hg~Jmw)akU5v&oXU52 zpsUJt6~V0o)w`G4MT7a)b9s#%7=X*XC=>42_nPyV^|Q%%)dP##*zmFO7IQ|K0mF2( zJrsoSQ=cldof({rgEP(Y*Z2kbEJRK&g}E2ppM;fxTrhy=DNPyVzyzmPU$6c+~mYn84up}eeTB9y5!I;P7gvE z*XN!;8k$3A*z^orFMJ$k6O*@p<)(7P@#oifo54!;n>B@sLEj0jxQj=OgZhU%rrb^! zy*EU+^2u#~H5o2yD2wfXbVOVy9-KvUD}ToL6}ZGJMWDL;bSLT&NN6u6TBCRUiPy~y z5toz*RD)~#he8wiGE)Mku;C4AVS1mi*W_(FFHAY{()T$MQ+zmNe1An@@WHa-B>dq` zcG~Ypif*F3%LWs)HHG;0GiOTibP;BTp3JGuE&|K?vs+K#X>Y%Cu|F}O^?QtQi7vqf z6R_wF?fyx!80w)e3r4nDeWWvc2>MaI;9&q!+~^pfo~3LrEMFSWA(_nuS~6b~l)Tlo zZ9kUgw86%AZpes!;Pfh`K`T#@3@N5;6j$C8>otHPdkTt~bHO)u-C0zKD-i6I#;52V z-YM^5fYI4;iQX+W9{zT;HXbxqL+_Rb#2aWB*Vib!LN$hbO(@8&Me1*k_RrtG$MN3L zEWz~k)~VDP+Vu)AWRrZ!I5Yl43mYtjbQ#UiJg(`<#IzU|9UD9zVX08l!qh5BzFFoz zMu#0h|C;C#>>s@IV1^4O3^d6 z(T;6!JhH$^624~P8>?o%$ThrqN@{qMac=+ilxOWrz{#Rh=Q#=%7&^LLB^+`$n}CVR zmKS4Y&KO++sxe*QwPfF&EZ%-HGh@dVSKfxw=r7W)bX2jh;5>YH4+ltc?td3->U%)_ z83?4L&oJ`Z8AUG(O0=sr`{UT@>lYkM!d`m{gy`B)-^P@~c%5nA?@ew&V9$*k(3##f z*!e8J?$-6;Bb?mbWITC*d~pMen?;v3bKbwsAqqPzGZa5!bUUs+m#!XMa9xZuN5`Xn zfMkd_;8^l()=T0Q)4OXh2lEhPMx#v_b-#=Z%5mCqBJv?rNn{~H_{ahy$64n6!pn2-=dU|{SX`4gd=A4Af@syorjF|6YlnM)l~OU*@}u@O%vLIUez!!TAJ zzH9i9Sz|Hsq|Ei=HiP^(m)}dt41-p8ZtxHzoZ~#z2p0soi$-hFF_W)z@$xt*-G^zx zcG~nM_#=#ebn|=b`}kAbi7$@Z?d0|x;?18^+-$s%+FGDz0)T(Za4?gH@?@9){^6`b zopK&HFR-WKXn7(kYSygAFnI2z(#l9Ul)%X~#%Jy1iflr$4K**GRd^oFI9RH?+L0}; z-b1=1fQAD@DRPyN9&iCZ`ntDpTn9)#k)ws^0s1c-oM&jRk;1sWh~_<(tBWIU#*cdK zDvHT;r}MFUUJlF?nhJ9nYLFim>)B!O6Ot14XE?8&JxQhk=C;y{{&M*+;mSEqAR z^U$M>^7iYfXccR48q#SW6HxK8%v>zJPrwUN^f^#fIiqDp%h;3e<}F4w7xqv`?F9U}kyboZ)8vsxcWu39}$z7o!(;eZ|h1LGq92KYBO%c=W_y=+9B zHcSM}i#lrDmKR+49XNYp6RPXS@6FWK1r%J(Y;99F^`Y;ipsn7Riu)&eIApMha(D0z>Z11x37^W|Y=TUCU@AdcR zYfu`v*2J5mjf>+fO@4=ld2Eo`H{meQ@GF&ey47?=Qjo)75?t1_H$2H>kHrKlWoH4O z2;?7BPwK-y72-Z>LGS~a%Ax@fatrcqilN5NR=osaIDGT@tZjcBU`~@2bW?J26E1L9 z*KjgU6*0a}AHgHnt5*bZ$#xBk%{Tii3=V^}0U<85dY>{>J3Gl`7w%Xq?9F2Jo)ELT zd++t#=CK(!seQE@NL`#x$`ZkBJedlJ? zJ;s=Zg`gn1_?Q5CV=z}s%&H~dejO0fC@N)8`4ZDIM<-;sY@$$K!DY@lewcUvE{@cL zgctT%PRO>t5R(|gMW%nV$!|fVA1^bczCJwIDQ~xpTqCgtJYt@ecVFq<%daw2PrZb$ z!EsD;qrJtT;UwoBv*A`A(~cm+gaTtL>mGS{?#sqKQ|pPcYRR#Sa{=*04?u>kU^5S%#Q+r9(X@g7w9tXMr{jg4??z7&4b@ZE` z?De6*pu+ZNe5XrV(o4^u9PM+VWjvkbYiWlSGPjfQfXN`%woeE&?^;X|6zTS~4mdvi z^7tzf!j^Y@fp0&kPm~ z4@&o^nzkg>389=5qK^2ox<=!!$71|=}#V+K<^e#e2 zLNE;I-BX#d_UfCD`%Rudz0UxuaeyNo7C)z&rs7662JdjNG!GLfQPt1$j<*tjG|Em?Bg1;AFc+sb`ovSapZRjVKGgf4Xnl|srLrVpgGS)jzp2OI+jL{Pa0-Eio zk4H1EJJv-uVXWnY@g1-1xa+A?J==F1ItkWA#4&tlQ^!zprYjq5vjdZ9v(I2L>`3mCkUFmF*QwHgr3Sw6S^JSG_XR_y) zcMIQSw(O*CJdI#Q2ln>;U(qUqG0i<8JjR`-3yU6mWGo=3oxN<0kLzxQ8je0>d{%}P-@fVT32o##I=?l5IX)?ZYR_~wZ5Em$ISK5wOr_5| zGp)%f(?z+08#E8UDEOjF*vpO3{Cm*Um|g-cgI)c-fH;?~dFz3n#Oe@Hy>lops~M(q zoo204bM=-ci%b+%bHF1C}EV@-<3%T8W$Ou!E6NxL7`<#ZDeZFWHaHY8%GriVroA~`c*Mxi|Xz}%}0;ZgcMWylX8Ht*FhTC^DN zU&inZMcod6HPaU=+)9u3rxuv{2R0%%HKroE4y3SCOA$LkHn?_w#$TypKi-x2%W54p z^y>xPNB{Jo#KUN%6POK^U3GOrY_^?Evwkt2?kbbyr}!Ne)n`WL-0k;I=s9{O&d z@2M(@fAGea_$!R;O(;sf{z<>+u@ltjvZn*V8{&6vRM-fHhm7e^0Df&hW*(rKh}G8) zq@29VIDh%^9soS0?9FaZ-0+-xBd-WUh8MG=Y3^IVv*`UAFrI-P#Xq|G_nZ3>Kl&rk z>`R8bpE{t`cY6SGs6CvYzPe}W zIlO4laDtInF>AoreaR-v_yvxD)2>^HK9zDTLkLgkXto8{|lq+zS zVTH9L_FNaEz3<#jG`xQ8xx=)3cEnQ+Z~cr^XavyRendQ`d-7%Ps>4kHkx~k5$a9o! zv(qHq`fh(SlAZUZpzFMth)j}=#PBnxzTEgf;9_&7@ThAqk2&3yq`S@5e{vUt|}H&UyG)rS`L#F z@DZQd6&@*pO8g$sHu?M0%e2vJSgMqp#k5ZtU@0sBrR)l;B6XJdDs5ZYJw!HZ`lqsH z8t!gOUGLp90?FsBF0|hner3p)U7?gws6I5n1#s09r-OIlfwAJpQL5whFf6)e&Aa4$ z(wpIz-H{Q5>-8+iIO;AtjDf}(*SEs@`MR(okNZW4{peB&imzTqqZ1y5kldQVMYF5S zdV%A@`*}dRDX{v}1IChJoc7z>O+drB=3EHI~%{QNQuv|Q_U@4j9b$*`NdT-@# z`>+{jupoU>ST1YoYUEJv6d9E2`Ked%t}w*z{{#JQ)Ba<}`xWPlCq+4SJ$Aie3nRZL zhfifZ&LCe;$K&iEc`+Lj zQfJw?D+xZ2t| zLI_@4aENcQXa{Rzzdrdy(5jv)$m-v^Vd`0=pkTgKDjJRhOB-+D-{A%UR?Yrd(rFCX zHP9>IZOHw@(2$>1&3oa18T+tPfLCPzEG5A2$PKxPj7f1?7+>nGVzPwAG?9(q>jX32 z)zAvJ@0Gf%xGPSlYz?u>UCp61?R`mjIH#p5u5gb0Jjt+*Bwk~(qH+)M$VsA1jS(sZ z11C~U@xe!-q9ThWQtf7ZQ4zb1vobVv!Yq- zx~Y`CPW^dS6jw=>7OhuXrl*#}#ibJn+WSJ|BqOywhIqGeK!2p0;K}mjAROU{jfEh< zSde-sZa%Uz;;tIF>=Mcy6vDFk^R>WC2PtSNT}u3qT!z9N5UnQ2v2#CE&9f(?Le4LK z2!>${oQ0$RiVd253$A>8x`DqtT+}h>ZN4!a2fPNqso4r>Js7zJBz|0w`@^hd+9NDc zuRfPc`3W85US*s5J>~pLoV>p*BH0>eHiz+md#z=dobL^G;u~Yq_B(j2nx{*(!+R5Z>k-@B zk3K+WBt&~Az`=x)C(nbIyVh0tRRz1V?D?GV^eAoCYEgK$x_=uxQ6#|$aBx1ZjPVq{ zx~M}4M8J{*Dmt5lLMnf3kIRZ3eokm1m$}5Zop)a?7bOSvlLpa#)0*R}^@lRH&_&9) zE^WT=e>V#ZFJizXjt`b#x4dGDv@|T^zhUb{)%kw)o9}*C#RrdU({*U~XKLTWS zzay25t(Tb>$e^`e0B6MzDydGPjWD=0OpNfHChH)-f_+p*N(h%)^s z33I`Nfrh`dC0M2I8qQk=EhM>l$ca68`j7^wFYV<0zo!C*2S=?K@;Dyk?GYaVj(3eX z{<2|1DhmQ`^IP(HIAZ9Uw$PYA`V6OO>U@N!zpcZ1H5TX|Q))w3zLK?Zfdo6i~U;a!gMFDNJzd%d`wE zSvu3~eKzLigd7fh;;P2|Jj9SS%~s==e(E<}-~7-UhUOv3 z@_;)kMLPR>e#m?QBNWwg@&C{KSEmesso~NuIrhn~LXl(hYZK+eP6tlBipP7dqm>MUknF}hr?aod9SzgW zcoA~h%0#%pmpi|U3@3`=%pwkv?;N*Cl*9ux%uZU0s#WcEuFQ|g>iBM(zrPHgC{<{g z;yIX_GZF#cHzE`%XgcY>Bn1Tk2s=cw#As& zGP=rW+0E5%#QpsKA*~2Id(|-94F029ZS`SO--w+>mWJKZTFs~{T)r_L8wT!1jg($D;BQVcb6^&R6NO9-V=sjI6KW2Y}dv29>3e) zeH~7G7(AnoRGbt-fEC+=_2h#v#E({BfGI*(Ba}It#t~Xk7v~EL0`TU7M+U3 zP@u;Ft3B{9OoT^2RZUogU(mDb*FHX+YymsjqYG7?VgZ|#s;nqIv}`F{K$kfsMvxE( zv=G?((Lacf9s2kiS*Mnp4DUZ*2e^6OfqsPl zApW0)D^>)ZX;>+B?eU*E9NoA-bFmj2KGK@xa<|0Bycr2l&VTT*?i>vn>%-O^6vx|r_u;rv9pFigx| z2qyLCo8x6q9#AGSX6tV>)lGy+g zBq_8V$N*GCyiRN#uS+oP4lDYsO7n3U5G56N{g6L1YrCuk*d3JAC2rE`v}*0olxQkM z$1?7<$HVBO*ROg$$iB`R{~p2_A{lMr9O}+5naRhYh8y50b9Y!Z`nf9*6*U$ZP^RAK zcu?DbfpuVmY)|l|7`YU~ur>dC8V>oUk5mpwffQSt@}Cf$#tarI8ZKert z{E7kgLE&YbR;G`YW#Mu zX){_{X5I=&iY)rQD0@o{_HR2_!oE{QZHhPuP`5~ma@uW5nl9Fs;90K|zJylNB6-*d ze@I(rxK&iZ8Qu8KNI8GpTY%70lJbG(#3Wk()iJbSp?eDqi`<-$X8b*??QU6R$O#E}9o~6zNBos& zrT$1lL6;x8W7~>zt_jMouVGE9!Z*4Y{<#@HalQBQcoBKIHz{%4_VPR&J4^}d%_Sbj zkm|b-D3+HjfCS@{dFi2z>tg(w;{SD3`;dQ1PX|!8($VWeldZ6xWMqbVq1t69%?*U@ zcHK&!(!ZFJcIQ|Am~v5WSNj71l3@gF$#NZ|-19wG2?Ka@`tKj|>;0r!)dwDA3GH4jv9B05L@0bGpYU_y&2Vp2VZT(jJ zvp-#AxKwX@mo!F?p$TM>I#6vp%?HqwR<2x%+1xuedI!Z-mFCde_9JUvI2H|E(SukL6@d}Co&2GQU}palHaQTE298G;sy zKlR%tiHG+ypDz4Or(RC_>o$t))9d_$pFlc=)Gk`_0xOAHglxdMUE<;R@5@@QHFm46 z;fMB;fngcFC<)W$6#$CA18y0^VfI<|GQ3Dh1UArAfwDyHs;9etrQy*+jc*7P zT`vj|58KAYwNabrlT4~Ec8SG&rBbFSqA-`_s5D~>C6JR!t`eObsGIa+9=DUMV_&l+ z@ZKE2BWrZy9*)mGk=g}EXD77r*1z)(Qsle zp(1tqfG$8@oVUZEgJlxCZRcAVfxk4y{kVaeW%m;rw`lAAKJ93lrZ^_G9GfFknW2CC znP&J3VJ?)-Z6o2#0R8;izyu6NSBkoNEGNBNCAE4ISR zKdO}y;!`fr9o`1c6aqZPfPa9UD6jv`dh5e+3~(p#T;9oWY5{2&*y#yl3OK6gEb%xj z;v3o)t(p>e;H%(kkNK|W^nY%nE;$n<1~Iff+D&SIDbbjY-%nyO{P7`f3>J3Dri<@p z$$l%rI2G}}u(2eneDJYtmE>%Y}Gnup`1z zH!$$xJrgJ5?!g z6PVZg6Yzw}1NXg7)`00oZ}>R?aRz~ZjQOE7eWW|Jdy+d9eZ)!I!{?%&PV#*b1DEvDcH3`A;de=|NcBss9LlcBQL=0LAxT{JZW>WGa45o$1~u; zH**(jg{c_PPr=pEti3mpBTEqGjB_Wd11Ia?c>~;}_@&PW$JQq1A`ey&1@3i$UM`at zX3vhM5V!EwCik1;>+!I@<}lvkdFW<&69h}5W#cpt86vTStde#Yv(5gW=YU-+shZGj zH-pM!myvm*o|Z14*Si7W}mVcn<@XN8^=;^wbes5 zNq>=hG1s^d$Lc#*-&~ed4Apju=-qk>f_ybAZc=)L1;frL$j4oxVY%#t-OrbK^er!F6$wczyy`}TI3Ui1%^vFz^IOl z{O7XkmctL(O@0|61M1xtQV?GzsvSh3ap{2z-OTyP^YDan-$#={_$VxCyEy{YqS01V zFmRZ4H|}gX`1}?)f#KMym#nwXd;n}6rr4cT@N~76s)2cC+q_Qditxc8?saQ;g73L_ zE`Qumu9Fk?MtCx^dN}8T7II#)4I024YX26-5y*F$NO>132N!CPRgxwh_#9{PoAJ%6iX88#k`%+DL;}^zT8G_Z_1D z7dLk&E(8ay)JXG{^jYxvc0;?>@y&-Xi4MZ6?%S1v49MTb1NfEh&yMeqd4#zd^9gR7 zx3VzFKct|5-IkhiJMllH@cqG!kR#7_fEseA+7+cXQ~DT;i7y8rEM*dpOU1D)?$SM9 zTeG&OYh;uiAdlZXk_)7Ou01zIagt%uk~l0iKI6#Q-Cn%_yDJdu+IN7?1>?~sxrsdB zVbD+NUSPK}F{1?oiRhkr8ZP@ znJ|d=BRsq&Sx!&jAk8SKeU@>j&j?riE@~DFke9}}v9_b3P2UQbu;4)dp-5t@~<8J0JBvE6F z3#L@1stgj?7YYu^q5I~ScJGQd&v|M*KfU@8mTuOIhbqTUMt8;{c}s44%p_H zh^41+9xQ76vKM^HUF;u*_4Ti&tM!mOWKItON|xla^-hJ1adAZeOr?yku#U3i7*M zN*3YtM{06bCSZQfjI1;as(9P#$I89j{U#B?->-Ixr`qsiu(=mJ@lQ{_8(`zKQ8Fip z7b_XXz<83x$zipiU39mn^VWkncD2)vznG5W=BflkSnp@_H=h40-H`-+GP9w;yx0}y z1CC>rK9IZVA~nvqjNc%Qcj*IAiA3eRIK13z<<^IO7dJiR`zs4fPY zq7($)gz^WhJs%@nlPzJlau^J&QZuRv#FA>=rDbi&(5pzu&KS8r8H| zeHbJO<8&iZB~_r5Gen_BxI`2)*6IJaPgyvA>&I2`37NO8`~aE30>?2K;>J^<@3c)p znEghBz#(Ji7YUo0E&?aprEVWT;Xa6MxB0Q`8ruGBRgi|n)_j_ttYk}#C{h!G_EN#APbuA;_#q0hs)Z`drsZ3{ z&gr%ry*|9V=jW}Y{Bs^)1bXzbeOLrbxiRl=DbujuyqXLR4nA28g7roc*#}J^9o$YQ z1?iExH*71KztC4u2chvb#;k;Rm7?ssIz5{8PeUt%uHRu{u(&#=p-zDO8w+Eq#FgP6 zGf^rQ(Rq;-5i;=l1%k>mw%|^TInb`K7l!{j_|6thf(LmH6T5j2d8W)aG4Fi3c)hFF zT0U`;N8VZ=R3q8omIzqkUN3pnS+XTug#6h}kwX_!ocy%d+!}_c8wPq=W2&3*A022>A3^wSvC6 z=vb{+``Fd8^Nj(QLiU(!m>PM$1GzfA)+VGK4`={2!ZnHZ_c5Gvr9Z=Gj9y}qD)UL? zA+iE_PK5W}oCbm{o}Wl{;(O-fa(r)#?~>@H8M4B>P$hc1FvXvi#gYQ6Ggq=!^f>u@ zA-k)NKJ6}I1mTcbOe&f3$Zf7|!(u;Xf`uG(*r?H^B6m{6RRvV8a*D#3WSLyWy&)yC-6c`D%sxvfG&i5F8{oEfNnQ z_rI&{FU(iz55vS0G7c5KjG>q=s%;`PZ9gqpG@dINai9>!e9M9ke%@1L^+AqGSgS$6qw`ts3 z4<)FgHf6PoGlNLF{xEYSbpOUxr4{+!!wfWmFaKZQN8u82H`AfismdZ^nP}b&q*Mjg zhT7YN=n6RaPG4ljkojnsrvGf`Nr9C_MrcxYd^_Ya9@5kfc{bDNy?}`{BPXRNJp5Rd zD1s3oSDSsO=y?0VM5Y{#clW8-F>`K(qv@w38P{-RQ;alq1dQ`sqbCL_+af8+^X;K^ zitf476NL=crsPGDS(0*N`gV@|uvqq;@Yk;hsGzx@W*g-aCi)WtI0y7Oos_1Y>xUB; zCyg5QHhLOF?N-`q(lGnKWrN(O2Gkh&X(%ALau<1+^4$ASPLqv#-Tclq5K<+GgPdMm z`a`pvOpXKesB{c}hn({)$w)@HF!fMz+&iZq_fLPF-<}|Mj`t8UGL)nK7}S=o3{x5F z55+mLh!RJeQas$OLQ8D1&{(2y`kCd~nZdB$Vt=wh$Q!kMkJ9ETczd+-qtgCKcrmWX z6x=kw{4k%o=tM=wZ{>1~=CLV;6F<2wt{LFG(#V90!GK);snwB%pPrBNIp3ahD4l4= zMVs2fazbfLcMToWRKW*!R9+#;uTr!LC8!bRi0j#AOklAU^z0xkI2^gi(1E_fd)R#) z*MQ2~@1;=RcpLdQ?9<)C&T`gbZqU)Olk0ZQlUOr@vx%CB=6){1j@jETszt(>F_6Fa zd6BHcA`-+xa*$+!M~yZZ2{HSwLPpDyIp6xa@ntub;{3;HMbYvVf~?utHzP>=Om}uK z5d*^InXm`Te#5G;G8t}zshV)(yXq|UAjrb8hkNRjI>MT8jE|!pZ;55IRoc7k1ej+P zlMeVe=m%1IsFe-dXelEfx%^`EtF zJY76=oMiu@`@n$d>XB(Ava*3BH z9N-8?7(Q+##o3k%jy|tGKg;0ELD#VBqU@V3Am69b1mk;07b93Tz}B#O#^OqEI$3x# zW9*kW;*#7Ra4(o*vD9b}G1mbvGDCR0qCIrxSS6H-@L4MN?ah7bfkiHapoVsQS(1hBev_j|_`?YB&1 z+ennU!gIM@UMeNx*v3de0VLJJ2`cz8h4y(fvY0}AQ>{wIyb!?^{y5? z>R1s)3}Q$)WxN){Y)F$0h=xM^1HxJAL;}E*C+J6|mTIhs1@+Kb!mbXB@3U!5^d`d> zPe^hTmmaRQ*j3|uOp|8Q11#!f(KVNBUk}sKN=uXMk3C~D1Cz;p!F@T?QERH&=bfch z8utU>M0G#t9*C-^NZ>=(-p1S8O&+B-9Vu%;kzNi9`;vjxYD~XU_D;nT#PQ3UEv*5) z?JTBSiB+BT$R0kjq3-_W#g2NuZ>7Q=G0HT>g*}>+IO^n)G~y-ZzXsU~s}sM;HA}3} zp7al7j;Lgi0VC<@W(@MsT{oJ_t}hKU!q#?nih8XvOk_OYJyEF|NmW!lo)IG;ZZBR^ zEYB1e-i~6uy-7N(()+v1AP_ihKI=8tu=r)uk!~Z_TD!MH&(yIDC>(mRg_CfL zz0`yl@>j3`^(6b?-;}}NTSrz#eVA#meo@`mIdn|P-kWk>@%|E!g3^(939VwEMJxBx zlt zDo=8SX;qybyE~n|6u5O?5jyC+_-zlwlmB&KZkmv;M$*mtlD)>j1fp+*-gFE@#Jq6tLq3r(EU@B)&P+!N87cfrTS9BQiO z;fnMYEy;j%kcmmLO+BRx%;?Z?kVtMhB8ueMr-|Xv^1j!NC$=Y&Y1|DeQ=~gDrsW(~!J++Ganw5tTL4;c8_O!Idg`m=lJpEOD29|kp= z#Jed9Lz#|e1}F|6-dF4>6ro^#U@C%Bom5CWY^3?UH&bRFA>mwv_j~%9IKpm5a!Q-fd12-NO^l0QZmD>>-OxS$IWgcy<{h>x(bo^4-4~F z(}`>;an$A{V)x_19`PqJyhetC8#p}?RnC19t#@U>SuE_*GlD}iOBt6luxq?En9A%z zm+{XBeL_27QiF=I<@rE~qwSL6N^S3AkRNSEk`L?$Lg5M zdQ`T2qj++e6Z#|p4VdP&^!ak?Uf20Cy{QE()zr^yjVBy3)4Os84<@CNR`J4A*jlwb z9rT4gbZiXqepN;nQPx=g$X5hTpV)DNkqqJ&c@*gj@hF1S>L5Rq(IGDhL#U*0t0zrD z*BqD^^M^PEpPx2r_w=5=y^|-w<*m!KVbE*p%S)xA_+_{vs`kwvRM%Fun zZf7WABl6GVjM%#lTzH1bdT68DF`bSA8!@yPq3v(jUYWf-V5D3OJx?r#!dCGsDJEXM zRrh#zU|ewtBIho8Z$v-s5gbg1$FVU@8 z)DiYitoGYOgj4}qUWz-4hOw{&)n`mK2vsyp$cR-IdRDimYj$TnI7y417fm#*Sj{Xq znF}UiSh{~;8S1FoqlpK*=~we@%Li1t(=6^;<9EB7U@ty?oZ3s!uT`wqHx294ZDk)? zbN`cwMZo7$9!AK`5;V)T_ruINrW8SO>n-&#M~tFA3>GnSuGSjK6WV8i}mzr;Lv5x30FABD;s^0xPObw@q!eiiSAK5I;d>FEm)AVkXn?XYykFGO&b7(183Tm<(KIVS_3Be*Kp z9t1lW!+ip!C)D;(64WSt@?VB<;qVG*F{ z!Nm;>12^ygbc8_{h&OqNd}a%7lo7LrH1!G*7Y6(uFR#^w|B)2_Uu)>FvWFtae;z)+JQp zkGnbjzo;AtnFPl_t^gi`A&=&hT3KX|zpDhVk_olL51vUtv$m%;vE!C&+U$)B_oBO< zD*igj7jeCa^nT%Vy?RfP&r)6SsH~|xVSC_Awe7J9@c!C#-WKTwQ{i@nJ}J&}a@ z#ej82I7$i$R8UL&sw+u-@Ryr5Fdb6axeRnBX(m-i4eFtz6DkPA>wt!MHq?7CP53>2 zJ40tMqch;+_Nx3)ML8!#I#oN3p)J;gvHkH&F%5O9OJ)OV2G2CxU)KPPZa|hX^^^$z z9fJY-Y)9uO+V`&`h(OsT#qosaYx_Vk{r9K7;sTL04(#g{E3DFB(8XeAk)Egp>qs~< zITcWSKr2e2A)Lkx1=dSZuLmz?{+8ux>vRJNBrKE(=nyOQ zD#LLE!a@0-6mo8v`#G}KD(*j5^}8t_48O0o_uM^K@f|WJ-KU5O2DzN^n+CX-E22Wv z;>JC2X3n$06KzbPK4?XIyo0q?v9CttnY^9v4YyXXVDR}XH#Wx%c;`Bm>BWs6a~AYk zoCkV0h$}vzpAcw`)s-D^?l%KxNn)!eeHECHB+N*b`(OSA(l^insvxj0^IQo*ttNua z5>du{dnaWy7GK4vUJxg?>k=FX9h<%qJ~Hwg#MJp|!FXvyRSoj~>Hf-|u}2_?1E0?B zfe4$1>1Sw&yoqQhgOG_7lAS9S2%pO)J&zxuQ=#x14^5)_Y$lbAC8=UenJracOk%$Z zrojqBrA%m|WK)xgVmz#O^miRV-j^>7V<5;G^hsU79!Dv9j`Oj%*CHlWd=U%Wd< zwnR)w=G`Np{DpI~Jn}B+MO!6)3|p93U7~Q; z=P23{=$v6*l>a>oK&YP=o98d7Owfy7DGeBObvQqH359X*LnT66y*6r}3m2Bn4kA02 z2@RBr;H}LD`ri6@{{G4aVZiE4`J?%=^LA8F@YSJpW?*DH9AH*wq|1ve2Ep-x5iR9# z>d?jUr+#JT8KQ0|wbhCyjZprfE3+sE{Se^P3=$Kj#SJyiVD2%)3pf?%b?&cijv&M-ujV~=A!DSd9z@#Z4| zHNWE3L?G_8_T~*PbAcy!(hWn%eafsS+LliR7u!b>++`kcfIi<3PyAK4+tvqw`#n6W z)=zHKBl%nz*?7HR4!2>>1+HYbTACBbbnCtaubP>i%aF<(Beh~-0q(I=4`L0WfX&`m zz&06y%JWa771Y~)PH3Kv-_)8jQVVu~(A?MZ{lM2nxA8J-^&)0Kn{y(k6DM`mLQW-~ zn#l@+A-7kW_3IdnjDl9X?g&kF`gNHb|5heB)J%Y!US^prbpkPxE0RF4{OFjGc6Ox+ z$t!!=`KjnD8)GR=+p)dy4j`#k;l!G0Acm_2aPfJWSy2wBnZceP`*|p6HP-*V^MTxw z3fAWq4)J?^jQY8aex`||dZIEJdX+d4kX>EgIq_E;0q3B7uw_SZHsI?4drs(ShNq%& zv1YZ2VqzQRDh^h6g<_6M|9g4{PIRf?KM5ij;*G*E&x*XG;>00@18X|dz|L9~UWEvE ztA(S62ZjZ6VF}gYRFTD8=rHZuYuH(bPR8j9{l5NN-%h8p9@)qT2Hzk8@iFdt4V)>t z#x+B?I=@b|rq~ZMDfx8+1NZqcYo>RqHOF7C2=eWp9r{e;mW(UU%3?OO1ynI5G?r`^ zE@k+Z9mHzdOsGqgg$t{z>-8Eun#|h%?9O_O@UOnLBwv@%47_G3h0)<$KIXoMIZ$!o zoYG0Qt6nRGG|j*kAd{J{z2`m_A~7f0FAiVzQh`DQ2%x61PfrEd!lP-4NT^qF-RcOY zDyXvB-%X64_ME($Jfz0z$&Pt90~7YNhTrEpKnWTSPDt;zQ8${zDXj&EnU1{koNCE` zY#c30&yQI z)x;HPq1Jl#yqygo%jq6JxZ{zd)hBO#R~07rFOwq^ASNh+(T zD?0uej?F(|?-c8;hEV!F=X0T&)SZ<(%d zS0iAb`W%W)e<*L?jmBsW4PFo^{aJvPuQ*D-<_j@PxENdYW zD77dyP{Wgxb{~X&ua{?8pS zvHK?0_{I&uEvfc3{<=$k0z*8nR{$I6Jp?`T&wGMcpgJ($hhMPI8v0C~0cB!e15;~t z8~LA#03WCbSgER92gG48QiT(~HT#@^xx(brOXea}hs9RY{vFHx`Tv^~uw7{yR&BGN z9GyS6iR>fsYG&?1y0~^fs)l~ERet0x z^PR6$!V(Xip3#^fVuU0g)5Ku)jQ;lIn>Zp^`9Lv0dlcOp{Sy=VZO zgfpeiBb?T4lUisjXZ;sG(OP>)H=!wvRcEneAAi{OjVM_s9~D}=v1xK?5|X1-Wh84) zd`(^2E<1M-j1KKKldYt^7+k;S;~i=lN@~NV+wNUXnRqbDf0JyCb_AGmSgF9v2=odf) z8@?iw1zdA8{nz4jQkIkKM>moG5OZr4^oDwK&?)zj!u!3~P@E(}zI%{elCK=X(2fu7 zf?wqXd}Eb}(1uRyA=H6zac7NY!pz7Ar~bClSn%j>H2=XS`v1lzf687oUgI(#M74?Q z2q#y$#M*8r#W|4%$rq&XuY_BvhsVxg!wpRQ(q@W9wwD5fw$ylaFJA3?O8TVTL|9*v znG=RT0cQAH1|LKlpf{j?97(tx(utk(<-@l`C?Ej3;$HGjfT8tkexML4cC!5j(^=gx$6|jXyLmP+{We3G z@&m|!K#cC1^a-###3gulbQ{O}QH7sx4Tcsb;mB|_F#x6JeYl2q1glislqi+c_pFf) zy-wXUkL!v78D8u!K&7&R0~#=55h!4>!)anQT`Px!N97pnhRHMHABvC!CL;0TmF?e# zpQ`1;0i79~>fY6%QSnPEth!cgE3SaoZdioKiM=y}c*`k+Q`xN-ElZQ4?X`TZ$rIOy0_dLWk(U+qLjgbQzlaze z&NMTt`O`npF=vUgUhqDUFyZtkj70Qt?FO`)GkU1JT!R+Rl`H+xWm^#2XMl^Dc&+#M ze(VcE1f-_?^6f%mjFJZOE1>+>nR@|S1dqut@M~1RpGNb~8TaB(vX00Gu*0W+V~3!p zZSUH;R~K`O;Rx_GetmW2arY$$B^I;qnAoQW*e+Vu$u=1?aCxm~Qx|G4{9U>s%WvsF zVg9D{WS4xyQ1GvU5on4`;mK7$CCbXxv3#?|)tUD6>|aY`Qtku+pv4pQvc!BNx-1_N zk3&CAIu~F7v)29~sjo1_nK%p+0rwRM_U~y;bjTZbuLxX}iRhosT@d0X0Tg6&Foyns z@`$IawARtAlw7~j0jKmT5$U1`pIxcZ#rkn?Wbaqv)c|hpaVF4C62&IS)A6?_C&tS3 zh8_m8dHGndzryBKZCx%)$zuZh|@|dkp$vWA)FmWoiZkS;kQG;ZuV;e@#ARO z@yzFoAoH2MP1gkvPJS+D?)U+&p3H)`2{e_!F1UkO?5Fed(3#L94Tn41D;C9bir=DW&WEb%w2@Feah^s*olE0 z1+Qne`nHZ9o>RM%yHQ8I88_JisUn58!tve<92LPBH=QVfy3|sQnvZO( z!k;##2L^vJG~yF~6pdFJCN}j{&F|Q_0(^^k%XM4n+i=R@E*|$~VpXB>mCq$w4J>Sg zw`%khsjJ7!O~#kzUFbZ8+;oh|=?~W$eGx=0)d$d8pKGN3dqY|~8_V5}&POk;7H>BQ zvpO9fP*bMl_KwHK`0^EuKErV1|cwhDG7onLc zI~Ab7xZIe;&$hg)Sq!t9ez}pT*{8xp`7e-fTMU4F(eR3hmTlq~TxU|gx|dHWjvF?k zsz4)$WC4aMa1F`JhaN%U+5+QiPam*PfQz5t?SD-rPH`&wfi|daxNo#@Zuq?tdbN*P=aZZ6#0W62i_IEj)*y9g`tY;X(XTY>G$^t2wyP27 zYuJ=5OL9uqA1X#so%DCG@%ET`?ijrh9RlvE!}74qEB|(O=4ZQVB{^! zRuYT;mQH5VGy)J)U8IumWjixQr-!_q1`$0P3fhEw`@&nw=9eo%64RM7WDbxbTMcDOAmCfLRqB5J1`>;v~Ky^zbFH z9@7e2oXKEl8hsc&a)EyeeF6MoPuT68dG3sh7eE6-s^toDqSr}4{|+#md5hIX{GaZD zo)jTHEYLZlXnt&JJG$Mp#s(HMw%H>x_APFYLBw%6$1_ud`?wg+7I-k_T}QUm7$qup zl}b+|PTcX-;2Ze$j!s`%n)F0}XllKmINdNf@6gWmh^XE_l1vrKal>^G%nH-=oQw{u z5kis5Y&IdcHf}J{4>=tzvMDWzw2s}ntq%-*~oR%No?aY z^RxAyc3r{+kIfzd>&V?MU_mmhx0aqPGCJ52h>WXNCUVOj12p8d5gygk$()CDZ| zlfQ5{Tm(z}#;oT=-orXGed$LI?K>XtKej`B=>5_-DH> zSFo7Txi8HV7)+6|prc^WO9n9$_;{4^<6nnp^5D8akHGlcJ}lUw;fk~FKNsOq<%p$V z5I3!w!rP}PdWsvckHx`h%H~R!YjWe7K#T!NfGqc}` zGP%NF{q+oDa!~40&MU$6%f$B+rPdI|S$yrxQmV6pytX^Js!)rC;W6er*Oh8D*kvM< zD`knJ+DlPuz?ua)c1*_C7b@laK>Q@=IqZ?r&6+Es`?2Fh>-SuJkc$InBlnklg^qlK zK-UlP0Ydk>4A6xwkex!fTD|=CNamoxYSI*!6-TD`urVT~gW}6o9&*%%e3M2zQWQLU zbU+^+yXkZYu09LMsPk{s1=a%H{o_x*d#RG!}(s zo(tOYYfdL79R-}1@>ODG_>gR%`rw`*+L6$TVF621WAMiq6zT~%kiBR60Zf}mnsVyO zcqVq7QZ#*zcG0m&FO_=ns>&E!}O6hFPZe-O4C#)x6Lv3#SbWD{NL9HKQHDh8%*AWrjQ zK;M&>e#GcSI`wZ_H7Bn`d#qH}+ydQN3^YCk_{Mw&rn{P(75Aj_Lyu_=a?8b9c2D~Y zgd;tmv1B+)c+a+LN{mz=+7c*3IO0^tBpjlrnF0%hr!#f;%Po~1M3ew1z6HOQ(&tgv zg77W58xgbcNL5$*b1a>yh$sO{Rpj-uXahxBt)(wFXPc?WbUh^vbv%WSUx?Tg0pyVV z3E@w_fHmJP$t6w@kyHGWX@u><`x_sNM~Q^H;K|&+wUA4IX*<2}x;};(3bC`?xczj} zQYfkV1_P>sd=AtD9Zc@)tt(cc*VpNjMf1@~n4f%CQBf3wz^UE$TUJ3n8*HD0JEJNojsYX*s-~BlM$&;_&PJZB14f+AsdYe`#dZMku$O>ozXbp4rM>K@|3%kV zhDFtVZx0BHgM?BFQWgjTii9+R3eq)nOSg2F0*Vp_Al)@XGjvHP2-3}v20e7g%)96D z3H<$EKj<|am~-~od+k;GUiT7T+*hvibm5@25w03703FiRLSk&iVHUZryuvDzcmJ7YC@CUC_?wGi#e zHIng|Vt4b=CQnO@@5+Kf(SmtIaOqkhSKZKjnTF5&wkz<1pRRHo&&ANlAwkj4wGn_W zPi5X4D4~sJZ4M1M)A)UGJIB_#?Rs6qW|P#4dEC)a@=Z^&ywtK17`LK`;j7};F(%ulHSXgyB?wjy~Gm5>LwQw zEH2Vv1<k%3iT6O$A+_b0HL8lbby4Kz`mIDv87}-`$ zs2D+hG~gk2N;TTT#9o-f=6ce3_nyd~ z8$_fJ3x0kZP0lNj_48UkQizUUJzr*!yH|C&dy^A3><0JkBAn7`zh78!P^T`|%C1qc zJc*sR=dtoc54fbvpr3IhSzoQJUCCZFe}B-odSQ}AN}^EF(=Ti4UEOrrg1ruHQ$N;6 zy&>BZ57|ThMtjP>G5L~#@4l%;rMjQ*+7R)xnq4s!;m%Ig01F=(^86JufwD?3!{*ZtEi?qg{4DpVwCw#9l^^J)1=LK8M!s+@2lx?H^ zqX>E-zHh}jZ1V086Qn=VQcFm-5LC=e?P8dat%s798H3z%{S|ulpkVBU&z{dhycdQ) zkvs3Qdy4%ikCYiLFswF#ZyrNMHe7K!2 z1~(=}LrCbNQ;nq^rj8E}qL%^eAf4eETfIBu^1&cMV0pSy$hY*VYN*?x50OK%(U z>?pKE5%&A7n{f<<=IVg|^Nu@X`RCe#?R?i`;WZs!I3(lAWkKipr0LBsVx(C0;rG5- zXV^_1!g+G)d7g){y$h;Xv)^oWV(`J{!B6jXnC|*W>8n9P=eGHib_MJ2uhFex1e6A) z{ObMaR=cmko?(5>N~LVqF?!)dpUkOLSy)` zgXY_{#9kMMT#4|8I<=(I<*~iPjMR@?PB5`%W8UM-5xiSj`iN&@OU;LUUg3s87h$Yx zyUejVT3O%fol ztXoa*j8E>^z6@X(Wc5RNDR8R#@Q{RXpjA*&(k7ehnpuP6A1DdTfQO zYR3uvhw+--wj$XswmICX_EfcDb7MrDg@?HZmwxUd8XljXl07VxY}65%E2#Vy`l2<( z7pg+YM6W1_^<7D>IP#>cEpXfvrSjjn=KAT;d2t9H0chT zg7coTC{2B|o2su{(CK><$F`6Y7qWYXc$Y(JwHdP8Ddp2)F^05^ttX+%C4O&X*CLJacu0udlk%a#C}7mSoTr*I((dypkFh3 zqy-ed22^@mXi=Z5T2ti16<=Y!ErzmvoVZInt%h( zyJ~p%r!Edx4A+t6E(1WjL)5Dy(`Nfp+>Y{Ar(*rKAFa>U@MV5Ah7GcytujdKLnlA% zAFekgvlINrVd~tj%v#N-bXeBLVW?|7%^+vf?scke8kn$B8JSOqemB1l-8!hk?{u)8 zYZ2%xo=4?QGCEH1cfvC7&pn=U9;)csmiOh#q48}~W?YJYi#yOqU^49Emrx;#QdHNs z;!^A{!D(N_VM#toC+04`tq+)}^>C`t1x;pjd6|8hl?x@oMyXyvy&AQB>D_$0l7k*s z5^3$SIB?d7LiaGs+H2#-mlf1>R*28g91FoU(4-N(dluV&Ms%nE1N5c>6FdmFN z)%H?L=K6VAo9UrUaFvv$M^opv4PsnG5LWNt-TQ-awbRPMR_E7iISDJ0+cva(I>eHO zx7pif7H@RZ==W6CY6fhqzN0#lTx>&5c zccnKJ>4$6yUfHyu@;@>y-K>{vUED3S-(KS7QQ5@5mI^g0W{X`Ad2dklC>owZlW)3P z7d};()GcUmFq#h+f}5o8-m)D-uG2iNSjWiqH6099vW4epzlXQY&pn%bm1`Ulu2?t+ zcesE6BFNb9yWrAM*pw<`ra#?c)|Ft%Kkgve!l`B|OO-LOW$OwHkVX@OQ+!{ah!65-r$V6uY(9pUnOqKkDQ`d(_+Rp$&=bxfCiQY_#$+0dIC;e%Tk zMKKoGzP#9yY5FeJ!KGYi>_+dQLtS>a9U+sSSji#ISUZ*CM;cf1B|&G~!3!yNcY9E6-eXVVXp@ZVE}UP5q}$ z+W7mtI2*ndVnm-FZx6@Q95|GI|7EI$*3}>zF`Z$%FEHiK@rlVDFNIfCTzs+@=Mpe{ z>APc|1}Tg04+JuXb&g5Xtziw=`8ul%>h7}hmLl>UE8RJU4F`HU$GM?taGHgSM-BG5 z@F@6YDa058r(;r5WCbz44C4()?qa}RorknXXb>O1{@3>Ui;GfA1K5YCnaS{ZqO7+n9LMe7B%0QaGC%$;sj83&FNm?%bTF6 zE;*OwdAJn<_0N z{Hx=DqB~0t`6ejNYd~wZDQ$dsY8NN)r4nH0@)`{bv$*&!tC3r~` zybu2N1$>~FTw0w8VI98v;!Ar813r<7ls`ntbxV`xADxR+yc=NG0gqU-^P0V<6e0$VduBY3>SgQL{@$!+y&TuC^ade1YW!CvZyAsn3F!v3__$%N&@YA@2Uk~a0HMK z>Jn4i#f02ekf3rGbu~g*C6eeKHNl3QIOEVR8Z~T-UC2&$Wn7#a?J6=NAeYt&03-;b z)`fLuxI;ixD+nw{E2ey{5$gGl5nz*9b7&)rK=FTNtKZRj$f1upu6)!>Zdvnyc#YxC zarb$z7a%Fc1X0uM7H$nYA-c>I;9{G?y^wg00I&+(YF8RS?5upKd~Y6Sef)$Ys>$!- z-o~3V1$xbsthYc=aRVv79W&xU0sKw1xTs+Qfyd8g#^ z)0N-DotVe7ScSbk z9Gc-D+*G4eVdpaFFM7Cqm*zrWw;e5hE>29~*A~v;5vW`TVgh@+_3XbXgy36pfQ$Kx zWI|x`o^;AjxaTBz_~N4ndI*ZfUKR=BLDr^Cj*oWXL5K=vTtjaFOOJEMf!P#0T?zQ#^zC-$DP+Jp+)GZKaT&*3#MK$FgrOPv-Wj))yHJ7j)0$_xRXBdF<6t zo@Mq)@$n`)|4gNLIMG0XR_BhjCco5yLWsgyNM^H^A>)4o{GU&b5@5UvIiKg>L6puV zcniJ)7DD9dGT+~?Y;pli;>+h}|GE9|Gx(SGAr25GhM?EA>&cB-PKrp1IFS-wj(EZ& zQqU{pf1djHk4%9;a}lx1Nt~F>fIt>;NX~SkYBQ@3F-%kpKYj9UX+-3ZQ2b_- zKYq=d3vBJFWC_yWhV$(_6NED2LdS^!{I?k)`XL3zv%j8K+@Nl^Gd!hZWV6aU-SjKC|OeOLUOs`+ak zJe-EW4a0P{t9n(?>A-oagT3k5UW^)~6mb54#tKn*OoOwbjd|JD*% zurcBcRfq+!Z6F`aiz>H`M*~ujp&B=PA>bO>f^wZw09QZ(MlKt`K~oOkQC@3}XVA~c zL>=k@XG)Hq%OGs1+Qk~7TU8Rps@zm=H(|xDo>v4|jyeHhQ9)%_Ga&CW0VmZ(fKwGP zME%SIr;O#M9n|16j%=_6Q(6i@^!9K=Xm{$=CgD=G(M^cn&?f6>xH; z2*sJ`Pl?yKqDugrTMJMs<-4zcJ0FETSmL7jfJ3S40oVrT9);!opkP2);j%Q<;FmFK zrwtHvHo&$68llph4vWt~Sn{PJ7|Ow^SdU{a5d?=&z{PPoK~O4*7@|d<$A^@LW z{MHwiWX-v*#N*La6exoq;US0_15Au&G5VgC78ZB>QUOttnA&}5qr@i>B11u8NBbD` zi}P1)KKkRWq{0d5f#ZtFldEWiM8YX8b8y`^xtbkmFW7(%&~~icol2SM4iV?r*M3vP zC$|;TGq6?9UH(nrK=n#w0bWXPx)chqi(M%>!@dJ1zqi_X;Vtvg_d*_CEMnl`jVXN0pF9l+@-*{h{41mv@!PDRDqsQ(D?3$X+Y7>kgdjA*7|M zn;$qS<#U++_@d*^`QK#wgwQjUf?<8VA$R}8zyt7Eal^v-sDSM5YA8Zm0c`V$S^=k7 zO^~~|!s*t2GkXM3Y0b@oK-XZX$f)^6$EUl>_nG~2xJa&NEeg+Yj6x#W$m{lJ<7XzS zS^-zrIr=F;U-bm|zM++uDNeczCmxJPzzu@OcAF;3lWWcDkH3Eh!UG&>A<$5DV$>ab zyo=jD=ey;Ae97Z6^TME@jktcxPXJ@MZ49K`t(5niCWt-8k8$jd1y!?ga)_S~Akrw6 zpsTz=kvOrHLz(_&3VzdYCcsv_(fbhk+t!!!hxCZCfSpQKCd*mX0^843P7emhPhCK- zP_NriKtkJ^9-JKa$yr9@OxeUuqmbW3f(2ZSC1DgD2a0Y^LTvpaxQWzD)02O5Vs-** zX@F0*JLfNQ;?9r&U2@iCyp*Many%Ai3^os6QI}2BxS?u2Hf?~q;d5Kj)d9`3I5dks zCI*2sv2N`OJM;<#q&yG zaPi#9zy0UO03%DQE+>zxyD$~l@tXACq$ySvT@>J9Y0 z(7Xt+RPi*nL`Ar8_G7@Q32uM}Dx(LKSg{8iEEeu}8X81>4o2eb>leD)9T2uI3w@vD zHj=g3g-tAu_vDJPyNNK&rFXW4SVCfIO|U*!IK`fRd$81#DjDnnk^^^1 z_^E9O`~zvn|KwFWJ_3*Hs_bL`^*BNa!@<=h+u8B!eD*V3-*;#H^9Hlsj|zM|mf@w#zop zc)#yyezOGd(!}j>E*5J=L?W8`ge5$=MTsbFfRZ9SJaTmY<1b)X0L3}3 zGE|a#bGgj~!&vr)sVwRZ2d#EZ^r23(;9#9mL%Ys`%Jt>$Z5^A=YLcD7K+~Pxgiqz} zTAyX^+mek=1?xJ;MXg6?;@)K83h;FGx(E(`^QwOHORd1;bEz}Meu@1?>PKtFuce2{ zKHaXXqu+Px)xKO9`raamPIwnl1p4!tc|35c3%ws9fArCJ&k|-a`si>7sr<~#V<`qI z|6Sn#x<$9~{&;IiTh)E3tD`1!H9V^~DPOPROIPiVa)s1zqF0)WK!GVOn!e`3V<2SL zsIvY%;{>=FpSk6D?$>}#B&QLpF{7ZR9CD%tdlow|fry)M8N8&PZ5H+16XrVKQ0Ql+ zSSQ$ziMd+ROloC#^^8kJ+CwKh;i8zyc-x5D+ns3Z}j`x<&&=i zRP;lWmjZ7fN^(iagvSt84n<<2px*@MgtGsi{KE#~= z%G?BD)xE_9oJ^7JPSn zYmHK;Y^N}%RX@%BY0X9gMV|F@8D0Yaw33I3_knJgAM5)6sPNx5Ob}oE8M8yG_uz|9c}N!OIjufGmAKRht*Ax_ zjEs3mdJN|1PL{8XSWex-4C;Hjl>0~J%1+H#}ps~+=S=C*IqoM zt4^&mreBedsI^J{s`rgrAZr_s@2I5z2}jaa?HVLfu)6ZFcxdkZ)wCV0NPKaW+j7Zf zh=^@N9;UxNhQoGO-z%Eewn!uE$yAX?JV~unEr-E&NYqVOU(#-{C_+6~*FpeaoH?{| z733A-*=(sn=U2Y$K>Cx`>$k;_E(VK1`K*ur@5Oj%n4@uQ{uv9$CiJZs(s}D=f2c{a zfLO%RNH6#;-8%#k#Bd=#3;go?Me1{qC=S(jSmRBtwC7Upicvcm+KBTJnWh1ig{@KVShj=K>-KFLS%5nq7F#H%)j zpOE0+wPJ=Q*t((j7k;@I0Y^+lPll(4e!`VGZ>1mmtS8}>Yi!HhaTDnUGgxE$m2L-< zx2oH4s#|mt6p?6twY_%t?nMagKz6!_FvbT}XC6WC{jq+hEv)VZ0z3 z<6iwFzTxPjlFvi-<5q*U%w?pOD#M(A43z~^!5*F| zqFsy!$au{73*xK6?@ouiPuA!=C zE@~fl-k{f$M|;-%%Olk!I(a59zp1+w!d;Jy!qBfNw5wWE!!WDi4QM;G4l2cIj0K4% zi7y|u)DT_vte!w{yX@U3Sq`db0E$M}0^w_5|LGM~>G9%F(F(mbs#yOzToc_&Wo_G3 zV=y{A>7lzs;-N7~M_OpvJT|ml8SQGa862w)c$QyYL$iR4!J%pk=}EWbw@q^GCa?jI z@2UTC;+VvUy)kG-*W+WZDoKlF5*l7J>8V>}EU}OtDJN=FetK4AJyqK!-b#&V)MMuW zL&*G>)Z=A(E{CnY8iQ)Pf*t((6SX~$-8FnZv{T-ceNXU{iTH%|4a-kcgXA04^LSYvsrOR&o`+1ovMA61)L zt5CIkpUb8c#fg4eyS*XtNUKb2$iCc8Bf|C7_F5Ax#)}z|H%7bL9$?`zrrICliwq{T zcX~+7bqMWqN(?tECf0Mz%AaVC-ihX5$FuE@kI~h^nN@jjz4Kmf7>T#L2xDW;WgDSXQd5` z-(7pBBguO|`L+zUKnk@#*^sBrjhB*-a`Q}$4jI2~m?;xow9C*Si0Hf~EG7(58%BKX zw{N?rQ>M-wqq6fAJ*U$Nr{dm<$Mx4^scnCl>|+i+*g|{1cUcP_WJ9B|-+o%x&XkK5 z{X}5a*g7c7TI;3<@bq&Y%5QRB+(Fi0BQ-p7VBdWve6V5-DiI9)D0@b)<=IKhEjPN$ zNlURab2`U$2=fn&3ypz{8e^Hw$xfwq^=oQN16f)bpT5P-hBzDr364hpjis`WDS5A!^LwFE&5!S@M~V*;IJa6dH%aj|cL!dxtP(y)b1@m(RNVipP`Q zm@gQ!@%#pKntt`8!T1ZKuD2l>+b)UQ%g&YbPaRIJ9#IwV6KjlAYKWaBA=%wHj?sR& z`XLa#O*V&W!`6Slk?61&Fw{Y8KA5A@tL}b3ZLZcZhB26SpypX(FD9}FPT(&=xj#$# z>#$Mz58gZ^fB>YHuM>U#_G|Sh2?7q2y{7bIMO*3HIcO52Q{RRK%g3#dBvVeRd-Wfa zx7L>-#%`iXNex=8)N>8#>x$%x5if)jug=yY-dE|t%zNOTR4=G9RF1>dZ_#Pbp5=<%PN4Y; zhvmPm<8c(X@XQlp?A&3y6^6-f>YI30jZ)U%PBMuHyX4>v8w&>(t+?dYagSzJ<>Oqn zlj1pBtIZ*L*F`F_(Ul1=;X-OxN$fj`%_AXxk&O}`Znu|+NS^IC?6oNhPyM24Mm*bn z4_xxS66VXF;W6!pSLep?7H9|!RIJEt2XogP=2na&Q%_a9OUBY)jKgO0%Z&=~hdsqh zCDnhJ?dQ=QvgVrTCgMG#M-#;!4f+M>Ux2UtNY>!sBCG1@(*fqhGnsMcw~&=woa6Rc z=6|>V{&Sz1Jba+wv!D9@-X}x>=kQYK zJhhijEd_@oQV9Ijare-t zMsHtTdH#5yQDcg$)cR5V{DJ2;gSoMQZEWtnyUmCMo~>eyi5??+&%yBa_iQuKRXdoN z8w5~pjlpe*kA&+4WeFKv6(9FP@vuO*TKGJXdM-p zB!6N>;D1@N{vZOPR4=HveCwA){$G0_jt^3*7d{&Qt&O0e;(5#;)iIbD`NN|Sxe$0e zZ=v74Zuvr01UzwkCq=Hqf~e@-7*EG-5w2j!rrWe?;oEM*!nBAu`0CN&Th0|ZvwVI~Zn4ceDXK=lL-tQpVRw!>XD!taS2E83pSR}@8S1!sg zVtGB3W|zUh&QvxA$whr+Gd#iHEAQ1z$IwAWYFb9-J1yNY;pE~bRN}D{0(nK>6gv;v zh?IZUk4nCC9v>u>k8M{wwGA1)Bz-uv>VaQ2wislNxwLW1{ni&k|10)FGmuD{$xHJ= z?nl(MqQ{oSc3vKMX|h-vrYjIiSvHZm^AMTt%_jXn#(X9QKo#teEc`kX3-D%H`$|{3 z{3S-r^>CtLsn@lBmkY6j?u+7E3!fV|Zd~Lo9zxB+6a+>QIhz$UzBged&+B&g28*c` zt@M%1ACJ0%kLO(CG5fnKGem{eUA_7)i57S%tF@`^oa@22WHU$_^5W_HJ+VD(|9F$z zM+QADWD5i#of{#2w62yKLNi65clI(OmO`sr65IkmoNTNmiU0-GNp(d{FN_gi@;CzYF5@; zC6Udf&X1GbdwQJ$a^T)|p~iHeqX02`W}vwDS@+phK2$_0;P!#aug15I1yHQ<5a8J^_c)=;@7RwVme!ZD*Y!xdaS5mGJg2Gm>>@TQ6H9wZLf0sFZ(=lU z3$x7A|v)!LrL!GgH9*}S>wI|U^Q6LoNpnJi-Cf*SLP z(M!XkW`0Lyy`-Xs26Vt@x7c4M@E1*}YYTqu`)PZ7FW)E6vbj$3_`t1?7c#Ir^b`l^ z7~1$)y|YFlay${X6b<@t%2}3?1ECY7Uq1Ioq5B<<(WZzm$>`T<=Dq$5^;5M@>1)`r zVrbRj%hUeR*q!X{8q)+ij4Zv_Dr_wGJ8b;1%PSU0hVA59kIA78Mx|mu^k;`VRY18J zKupJC)^ra&?e<*?|91c{ z@yZNj5-zK(PN&O0OquM7<2vc807-)q@ePW^{&!bGw8+CU@GnAUc_k|xNIcv(2jNcvlT{$c5~ zoVvbRV|tL}`d-iZQBBVVCQ*#vrnr%;!KSV@^ieD0&`9#->N=-!ot>Sp_HqUA<^Doh zx|->&^3?t6&FRhl<)6FeI_t&{ZHK37^fc$=MCrM2QFK4+oLtWd?Oa{r(~gq)SqB#t zv7OS6MG)CeRyP+^9(w3}BXLqMkhApiZ3$A(G#>4_Q9=Rn9KGwc=4VzxB0Lc;#Phw! zvf;R@w_q($3Q?EZI*@dEteZ4PgZ(b+KJrD1k#g_}XhuAmbGCoNJID|tbQJhJq&#%Y zW8}5_DRFId8QJV;U3V?rBC`s_BAZ`$ENWM-h)~wor30t55?#Kf>gQyI+K!iW)*tPd zdo2zs>IEgAqFXkNnCL^nBF?%jPQ+q|$AW|RC1kiMTD0QeJsrHhvi1n(S{_>`i z4(E4D`RMsgT|-q_$KWzTT`SHX=sg@H5o!fU+YNjP1FnNX{SElJe2h=s(#|ZgVwr+% zoax8|SA6kmzOMD)EB!kio`Zg#UQt2Xe3Qej%j2d_^#*pTS>1O@p3PRADG)h`*5?A)9cx|ckWyz6#u$Hx^u*zZXn5KGn&yQr4dfMPTv|H;ETgI90%LZ@~wvaw9~jk=+7gW`c~&r zgYjmap*(UZV`j1oZk6d6OFfD-tx0tK+1!=#C@Pe1VN&*%_qE~%x7G53XOC)9+hn3y zjqHUTgQ7UKgjEgJ6+WQp`)#ov%|jlN5f801>l}Ip^`layXY!YyJ0R~>|`-CG|8X|psRBe{HjUDbU_i0slMGfh5 zgqD2WGfu6$YaPI`6)cOY^gzH^4Tfk}R67MP_YMfsPu!Y)N^*I<)~Cij$VH?+N)J_$ zUj238D7A@nmkm3<1cS8O_1`uq^u5<@)}?2R%Ubf;PMZC!4OMWl)+lR^<1ONBEi1A* zk1soB=PGdz?@ETt8H##1<07}?(IMW_FAZ7e7+ko-NL2_GrBw$`Tib|o6=Nv;l-_RmZnYOGzJEVWnSZ+kYI-;LM#=JP!oN;~E&#PGS>*icw}jYQunkuA#YxoeI@6}PK1;y6#Q<2c_a(Mr8c#e@APiE5eecXgc_ zyL6ug7}l8C`6x1-X>StRr zHEdgg%WO#oM3vIQ+EG9=YoVgU@<4cQXHn$s{$iOMpNR4bcu>&1iBrxWRFL?;faDWv z`2U42|F*=G-r&B3*vn4OPu_R>Y=#bGe%z_M3>;W%XUatV3v?>CiIq>d*9#gZ&V86$ z2K^h$zlRHT;i_KaLDR@EI)2XCjb5`Pr!IjZIE)V~Pf^vBEXr|bayDjtWC0<9jK zUm(hCQA2{R%NAwU!{wmU;wb12I^o-})hAmH&OKi&{g`b5sFx|w=gSON79$_WbCaJx zF&$NXw9$bsY9=jZ^gHUs9IyJ#&6i(T5YDbsyf;H21n!)F|JmuCWb9EZfSSCs+y$^L zP82|YbIX$@rz{=fN*$AJ05+qPnnPRjXM5Cy(^JskbVXqAXtNsyo)l;4Aul~!_1z5# zh@D3svm}~;M;8N7(gXWGt#f&XycW9lJF=smwtjJy?oC) z82%?@J^3J{EvXZ2oDUkY{4DsE=pxLqV5C696sCgB9ve$h>Er(VtT< z)VBplq4Lf+UiRja(Yk1EXKMGzWsj|z7jqudT=DT0)xqE>{nGZ_LxojY0FW8)ZUlF@ zmCgSUdvdvPx!51XKoIu7@f5#1`I|_+0B0x!6gHc34x~Ie07Wa~A)BC+stcn6IG$hS zoK7_qFIqTd;v+tpr*#+QwOW@i{pN~Yd7$7I0{;TgdQde|+7`_BisaLvHF0t5%z@m* zoHNt){?ksD5=Kx6z*e?7=i?|FgQ~p00q7p9F~kB?5^z4B=A!XMKwe82dD<;hla*T+ zRDBLI<&hsQD)14Zc}2xOn-sqby3l2jD{*(zZ~FnXP$iQrfc}g->Gc~ERwEgoogpg+ zMb@LB7a%$*8^jf^0V3#R{i|CE#AJB%&OP^C7cyhCLB}`w?tUq-{~GpSxIy>h0c$fr3O>FMj`P!Rj%N<{l>naPc)$VNj)T-Uuy=HoQ7&FvRw$Xf z(>r&6#LNkpFEKE7N4!%0Der#JUF+H9DKm#to?#b7JdrhafR>2VP3&Is;mHNXEj8sM zoGw|E7Sc24U{%WEZH2}eN#0aX zhZMw)ooN!*=cJ&J>)+>gX=+J=U+{Uje zsD6-@{{?cQY*88H4T|_?+gp&Sxy0hdpn5F)qAcQN*JiWWfk$T6($&3j8DztQnB8VE z96A`WXg&h^(0s7qzlAe@CycGXcmM^cE}2%idFD4b?i+%>>kwy9&+$R@-Y~gn1z`CK z)`QKb_#Ey4#HRKxo{K|Pu#d`i1gMf31;EI~Kt8zV8##zHqdTIyC6JJK8O-BZyU*dG z2NpCBR5C$B_sT{!ODTED@I)ZKoIDPI(J4rRFfM!MHP5xau0$bu#>m5fQ=PIdpdEcA z{Ow+A(&7{8tcE5vJn2*tJxSUmOQ2_WKrhDXPyw*xDJxZBG(mbzl3dX71`5b(bZ%p5rlQ zmWIcqM*~$2qZb;&)j##z;8~727^>1JD>8)f5_0~`8XjPl3~t$uqgv92+VV6dnsh&5 zOFnbnm3`sy%uMqB<{YYDQ7qBf?`6S7228I*1Z{A5@c*n01b;TzzneJZ$|U2v-5;NV zNB>T*|5`vw1>82;Z(d{_UjwLX^Lv-zDru0gKprjFU8T&#JmBLK;QCmO0J@VmMmq4f zsqJU)ntd%gOL4L)cn$6hj)`G~!+)>t)5 z?rfLL7auVQ#bm7LxW>gMd*7%lFg_KB8PJ*(>G-p~Y9>IvKzE^uaLRi#tf8`IdssQ> zqEBT$bBr@-;IUOBFih1-FW~f+M1ZwaIpyk+@IfL%@GV>JK)%i}%(}O*k=D$rD?tEP zA>>zlu3`)WHsr!kZ;zEuxlJ*!U6scXloypFe}Hzt4s+LQ-@b&;Z-Lq?lH?4-poVU- zqqS#re4MrTul-1=&MAvu8##ii%?##x3z5)df6p^$sHd~D0)15rs@q?2)qgOO&N571 zpX>&itVS}Dm)D)>4T|=M)iT&_(=IAVx&~=9$;?(!jA!{_+t~}haznP}(<7?qQrU)| zlWqRgnD1TFhqKOB;Ha0Kb!WPX{V<*UQ_FDIhZ}1#%6>S;PGTY}>5s=dC@y2rRaeZ9 z4wH`+%!+&m-^)ppyMo6A<5q=b0h3lW(|6?SvZQf3l(Kxl8|#^T?`fLlp;npZunKU+ z1R~xXbaZVpsrY@7yL$BQHSN;L{fZNjNH2UfNV|x2`EOg+gEf*9kBMYBeUTdw1*o^I zg<+Ws15eK|9-P@fBI|krgW&X=Ue6rBgK`rBY987v(vpO>leMEfHgBfX8h-$b=w?I; zgFx-U4$Ve`#?m_gFFXRsWzUNWp(3b4Eys|#2=X+;Zs0=c4U!Vd2f|(-iMIpbrd}om z>{tn?Z;@Ul#hCz7^oNEnu=cvrkCxzmggHl9x93aK3?EqL#h_|R{kP5CV%X&-v&Nst;t#m-m^>EtklkZ$Fq2+aq@G^K z=>GR-*n}R;&B_b*s-NhC(kQ*FK{1{D+|3ct_I(y#8|rxTB1Ing_Ye`v`f9L-&kzsm z7|~S}mO<_S2s^Zyt>@hP(2lieZ8Ilw3`ek53tMNc-ACzxUhWg1E!s@!1i2A>Iejjw zU;*?dmLh?e4lB;^z?{}4gM2d+K*%jv=qaK!t++%OFNV}ark<60ebETGF>YC@Gl4#P zyQS69M?Wvrg}E|Z-F~+W*5BZd>tBOEx=*L;y7L|?KHB?4@0Y*-D=v`MWCCa4z9ZMh z$b~U$B7jTg0|399D@WW-f@?Nqtv zwpGpgXFAFLVYr`GO#gxUkyj66LKwwOC|aXepmD8r`I zL~`qC=9OJ8k^KCQ-N;uO#93GTN3^7zBRm6YfYws?gVbS;m5>!wJHc}?*Y08-!2W!t zO4F=%&L!sFJ6>@2+Fmq;lHRoVVIaFGg?FCtRnxA35ZGl2v7p0a+cwaNZhUZwt^K*= zczDV+)LRnKy`f?WVP7W2`*Ao+Pgu59+bf_F`B;+9@?wd*HgZlO!{wMsVQ>F6(q<0{ zAkEcEZza@cj5rz`l{1V81|yn$plm^BLXK?r?$?7F)2SptRmd-_j)aP9vuKIwRa8$> zS*a3oz;4R&Kr-4jXb&DY=Cc=6Hi0ROQ zIqmi$iOXchiLKHImP6qe0~%@lMA&O=pErK9)L`fT2=mACw~bE<;-!pJn|q!3HKilY z7~DLEYbDR$@>aB#%-$Cw4RfX(e>wE+EaagM|JW9Q#&;0Pt93q%;-$Q>281wD;{2GD zm{Qt4s7!SjH0ROn0R>79VcZ9bpaW|ndyY+> zk)=yTxKgF_WK5i4^d^5A4}!G@#6ZR(tT78N4|QJ9ZRs}_al4YAoCt|DNM!BnQHT26 zJfh-&{78N$-JG<)bXw9EQ&za7Hf-%KJES;RM#*-T^kK9Gq>YUJ5v_vq;e!2D1Vm}C z$aSVQr*&Od_RY{MUXCG;*GT=6?q||I*SW*i6t8ICIuYysWv0a^p#Vjy<5wPj(rQ;- z1ED=1lC6AeWda2YR(44PtbHch_a#pc=Bl<53i3RU4Q5r%d|z&hs!j<~e?eLMW#A2e zs&e`xyGnLgnsOAC&kIJySNxESwP3b!f_Q@{mf9;}jF3=d_>jgnZIH(exewF9cEmfQ zRZiwhfXI4)IR=>rpXLD(%62N71a!_q`}U8_nNOUxYZ9tIuLOmtDYK05$TR1GRirJD zAJj*R5Hg8k_MXsmL3b|siV5MRNV`HwS)Zr&e2|cW52U4zlM4KZJQqLYp!y~_YLiCh z#@@66OXKZVQwD45lDZ2AgDyEnV?5^)*p}Xd$|b!i+DBYRx&*_+$L>i&GfUU#Abl7s zFDPrSV;3m#x$BG$alZg^p)c4;o@Fhm1l$bzF;IeYdWQk}cvm~!Xo=@RJT@d3=tn3$ zn_AW;?^n9XwP6Fl&gqmhxuE%!3&#YY&a&I9nI@eVpkeq%+||7(d^%=(m1R?SZJ4A1 z)}vH-6G{Z{Q$?gkZF4dl#F_b$DLi}wDX%n4J8Kh`a} z&B@7*jmqD#D>~`qVFFX2cr}4PPo6p`7b?wzWRQvQ-cmqDw?oANtlM?w9f+B#jk48d zSX8VB;ZcZa7100mTq)JE(hEt(KAei(X(Hw_`H^y`{tEZp)mH)9atXDlP%ty4Ir!e47T(F1IP4 zIe655>-pO4Q{vSt&c{Lgenhu}zB`9Kw8mf_!M|p@@aU%N3q9iyHo2HU)9rDNb9G8_ z)?>Pm&KKd366`rpma(YtMnYVG3e#K9YUsIK+**xBT+q)TC!a}PEB*ZBq@ly*)k>&A zF0t&q>`4bn9FJT&2GRovPQM2d_6BleLTceJNs4Nocvp~+ z2{FSJS#f%&L$7zlaJflx=UTmj&*Y3Lf|mAIPx}uQ8rVZao>!RQi!Vw>=_v@WKR{>{ zCe^H{%{)Ydva6!=S0CZ3!354jHVVyySe<>Y_aBKO{b;$_5Lt#Y5ey=_(~s?XmKEodpw+hQ+BRvTG}CfOZw- zxSA1Q*X%v(&e>zEEs&{Lq<8JGiu+VAL#r3V)%@gn;Fd6AkiZ42S$Z7Rc_ql-k^3m! z=N=l_FK46~bhYew4XhO-R_^KlQJ2Obt9xP7*z)8Wwq@flT!7FDI_L1(jPzWAy%_Ps z9?Lg>$+_|}_*v-S5m_Pd@Fi7);!Lzb;z>S=#~G2T8HgAC;Go|@_0$_FX;3w=RM8utXr%hd=G-TET{d>#G~`GG^w!r5ttjwAAQ zaxe!w2*Cz0&+axA^77`&r*&o8eg^1RdqGVUL&nHlG5WMf7Vf1563-Twz?n#XQFDNy#65yL#IyHYwhHs?) zrThjSgQ7P*-b=8~v*n=HZ5T(vfXl90N+)S@P=Q?^7$VA~K_pHk{?^i04CFVRVDxVn zu1>mm?yjKO#(vC_8{%S#+zn+U^f6pI?RMbQ7G8BQqe>Yg$#p85MJdTQH~lHjK`bwc zIi$@bW+^1n>UI)Z@QkYo2b|B(`S>ijNW~?7ZN`U^TlF4`cO{Eo&efm?Z!){~gb zbPpJ>`#fU)=ksahi?Euz6lX;*1M)??4|ibtZ=Kd^pW8PVex~x3(^e4WR{O~ULOz7y zX5qd`vJg1hb>^_Nr~*9?9^|P}j>kr?nD-V zPNje?x`4k7WCzSWIbIBDaQ8P$io@+(K+R21!T)3LE#s5}g5?(XjH?(W!d7w?Iy=YQUF&i8x$Z9f1z)?Ux^%ouZyF$EHqTp_o_ zWAy(gA(SM0;^g;^4SxQGe=d3bgyE#W{#FElqZlAK#6L1$Yh7qoaD0UTd9BI*bP0__ z7+yCJf*dQz%Ef#~Wa*ZpzB#Nry6-uZheA6D;JB7Q)&>N^F*m!;xX>uip$fgF0M)H< zaxxTb4zffJWVKGbRY6Tp!8X<#4^$TmY+PJP{B+3;4?n&4uzrZ&W~d=Z6b0>fQ{iMKiDUJ2e1JmH|jD z(-{5A>$!Bq)~S;NR9u-2{HCy8nl5bZt$6F8yvr~-V%#cingt#Hia?PY~aVH;o z3=A0LxMP{EGvf+Eq7nmY3jsT1f8~r&8126$&IXk{TVY%WuLd~MA=F9uLy2pbM;7T2 ze$9j=w}%-@t0$O@o6@lmEQ=};Ko6r>>N--1HT33->$8vSjHt^!xi=}5%NNO8S>Co| zHxR(Cm;f4zNOeN%%Kpke-k&GNfi-bh;1#3Mdl&%t}U-y7Bv-=mB# zbNr6kfuK*|uH7VlnD2~J%C&!hY9zH?7(w~%Id4>+(!f~}ua~k3+y?;l&SHY^G@p3vg9;zRva|-?H6_V*~0j9&BmpBE@3c0EpY-c@ywOT@dtnfE@Qy!fsH_r zu2}~Jt6u<8uJzePQY###N~KM3MZUMK%rO@MA!O{q=O_&fx1$JFD8$aKOx@TW&sl5b z1-P37sG!p}+!YV9iwu`+`GVM-cR{WJQlyuT^!MWIJ5II=BDfQAeH@J_B%imi?a^o`~3fsahX^I5^5wK7? z96Z#`&tDqW^Lq()i8T6W&ZwuSak&`epvEp=R+kKv^H5b4NU<|DtzmYWaa=Ui{ zN&rX?C%V=Ds>gs&0|4rN4kf?pc)+g9Je5xTBzcr_xC1zT$bZoUEODW<&o`nLNq)LR z0Kb6mC3|(;fuZr!``PIn{gkTqJ806p%n;vi@GY4}Ouz^b%N1BJcG*yV9{G(;>ge3s zF#x?89_EE-y{60p!k8w2YHarP-7|7jGD-I@Ks75<)0of;mJTK=9<5!nnOF0zm!~YV zPznmd2eema23WbhHk&c}%0Qi^K&L0n467Db7EQ1VTOCTUZ4DccvdT=!ez+)d%L$N_ z*$7o{aE#%Wfj=d?Px%;j`}Lq=O0=c;I8#_4cQMVvCl(qd7dK;h80rP~8+uUsR&}y^G3KRFjSd#N;=(@ zj*@kYW?H{~==(B@-~1GP+7wd*6&nr%%ojokQC&Vamm@?zBto+(OiqXW*MJCMOSV$I zIa(5tKHzd!EmM3D`z*z^{Hgx@oW6V zRr%ET85e^1mmfDO3%qe`;#<3yzxEnPe>esh#XG4H` zmP089-{n_IiOPQdU)L;I622ZtVJ3muecTTFzv=t@dim~LEoj+5iJVfcmQDgO1SFYQ zT=pvu1HPykuwey2dB+RG{rz8Ykl&DnKm%sHd}l0ctEU7|*+a2o_(dRqYXxn(#yShg zm-CLHE!Kbg{9i$mXVS@lyyhjKBCzpq-vxbpwj$337;)!?<&pN+*CGiG__gYb?UDBq zL4N=D8&x#}$h9U=Wu=;j#b*D@ZRCOU=N$%W=kh7sUTn-H0Q0wX@Yj1xHV+MyS&KUZ zvE~3K^h-t+@j@cUlG=Y%genHkNLNJ`wQ69*5lK2*iPC}7``4a^U7-~{ng=u zg0WKLYI6mOf?!JUE;y5E{_Xi()y?Tb;ZKqGB>+nM46Xi^@D^}~YrvAgq{O|2x+;XX zAMp!vA7GFGh8z8#?Mwf>21DZFCut!-3*-Q(ZxsVom095InE-kMh84m8p>wzeNpd<1 zfQo^x4)!NypeIbg4p5bR(%u=p#Rp{5E_O7x{=z2xzCoUPntY$c^(tRm|7w^1(d+bY z-$c+Dh++&~9H*K8dTsvYg<4PjrUz}R|MLs}z2?Thyz6g2dQ1aOQS0un^|SuzX@{7S(4Omp=AYh3p)Py2s=#4mX2MEn1jODrAa(tMviQ&{ zhG!=PFlvrFW1=*$0Y>lp4A@LwKnEIZrlGm8787Y3^1+ecptJtfumHA@za<;<0C4Y3SXlJ*}|YITfQ#J{V%-W*6AH4OAsnzhOQDaarbr)OBK zu>Y6hM}I5u)WW5kg2<3%FTiLf+wOyttL`kJdUN%BP1BL~4R2zvI^QcOcUWcc1fQ(} z%+`8Ii6+zCww)7m*G;?q$pF?lKLG}zriA_tc0y1@-!c*dpppU&AAXw93@|(QJp&Fa z7Mw1tUGQ9$7+Etf9t>TuS?vx>5&t-}zxyf2be*HXS&^lluoGpv{4Dj+No7%CSJ+tf zcLkw;?EHTm4zhG;Lln@cg?uD9;^uK|*(Ib(_fA};argC|&Z6{FvvQn5t`3~jZsmh~ zS6(K{;-u-cR)aaNF(7$SaqFZ|mDR9f;-4EKi3>CaJNPE?$B}>{ZgigHsKVxCfcUqP zX|9jl;~z9i$Kd3Y{mVir<}8NDFjo{fkjoQ`eeI8M)#e<4m_3?Wt10|u8|EKZ_kRxT z(;x6No-Wz31?!!05^M@CP608V z<@cz_rpJwEDOEF2w#F*BTd`vaQINkIZjVRpBZ}rU!Ade`413_;)biosp;?O>h9Z77 z_2Ikug@pwiXd*#aC}@W(`Ry6pKG86O=C$!FnlUwXH-)R>IUnoKAQ-NH`&bSpK30Ks zU*DZ~+~%kBrjW!C=JqJSS`x>3+{JqXg6t}gecgNk6~e3!>)sy&V~+^K)gp$y=HZU# z;STTKjPMt4`}=2^AYGfnaA`O(0(JJ#s z=Roc;m@Vb{C|+-JJP!M~TQQ}qLDq>6pDTnn(nYX^4cLbutpi=oOJ7f1UyB)rb!LF; z9|)Pp-p=0IAG^0<6fW5(4ywCw4XHQC$!YTk@G6ZGrJj1xl0T1{b<{InXwWl>LgzF9B{x|ngqbT#l$Vm|nnWt` zR>e!47FC(aqJ1%B5C5toXiZ_~0c9qD1C^Cur#FEHbAmE1z`3SgJ&D=q++-*0c(K4( zljKpC`IPzL*o(Db#x_d)Y|-W9Hla3at^J2+4K0z(9ie(Z*&_mWds_41Yt!kT50@jc z30dPi?TfZTn+!u2utN|ihx)U0c&{?)qDnQ7v`esbCb6NPaJrwQH`{4k+*+fblexPRrn0Q(>1x0Q{i3$KS9+)UVQ{DMxF z-X}IVi>Tu@kXxn0Mu06%z%h*Mk%LJd>qp?*^DwtQqw}AIL#1CS+?qzJCOFe_BfEtb z-bEBoi}%^AFT(HIj%<3GzX3u0w}%Iw#Bvo9sHd-TmR%oANC=}uUm1vr3x#GU1g6=aP&^Ad^{r*mA6x*Vs(b&h^ARKmhw1I>uc{jJ6 zy(EwzjLaj&tk9fNwKiqP5A>K$o1DWVk%_S>+~MpRm7T~gC*y@;CL-j(P1jN40R4)f zhG!faO`&~Z3*|e_4tZkSCC8bj1*x)e8uBV4pVgXNsW*Bf;=$;H+-X~;?~f#sC=p}) z_-Ig^CTWnNp7DX!yKnRbW8A}vB@ORF`}nP^h(O3IB9En+Tj~GM0>~*8rqGjBvX{J(n%r z6b+n6S|HUXqi`gXAv3arL5&_=3*`F9W_fGF6ux+5OTXexA{!T3e(F_I{QE5JUH{= z+;s*APe+r~D2V)+xYU&cEQHnX{mc6J?50Ce$+^EOf2=3(SSdEj6q=W)4OYo$N0E*S z_CmQSOHVe~7bZO9jhjx{%8BzaBB4U)?8JqW*f?AuyM2QU5<5h7oCZDT zj=tI2t zHmrZ$;Y5v|?5D^-i@FAhPB;n}cGj5JVGKI(p~ixFZaWj0=5mngU3vQ*Gw=2AsVV6z zrPWy?h$o=Qi=%PG=cGUsqAZ_IyWguBdk&31)3q9b#vp0{ zZlS_mjk>sm2(Z|0Bw7)T%!(h%4CQ_gc7?32N>P}z^mYdEls>2g&l_xwd@$k^(pVi_ zUsd(tolllv4c16QDr3ya53&tVL9O!(S!1e`GBj*C){FS2=6o&$W4pm3D*Z~DB#7s1 zMwc(?{BE8TD&+m8_kK%ITJ(r+BUKphz6_DVJK;#8pxIz6&V*W>F&2 z>YcZcx`&WgJwwG7vX#Kl)d6uTjmGO?CD+4!PTK{G*MXW+K5Q@kh{G=7)B$KN6;7&` zD&Lq!$h5ADd!=&ZE?T_}d(X0Gl5e~lNQa;S`P0tLrDqpd)&d8XkfTI;sE{;QtaIbx zLw2$4cL7O()bmRt9O&?l$L!=ng#){8v)LDz=$DY@D3HMwT%-4r+mP5?Z%x$|X>7Sk z(aKdJLVze%M4z_29ItR$BdbvlE>&Ms0j5l+!rjf`TJ(Bvp+@YR52UODHB3_s=LA=2 zb5uLuYo>v92mQB4GZ4}B z!Mm@sC$Ki1*R@giofm=(r*-wDhidPkhuLf**{RFSIlg`_@TQbK#62A?=L~=r-Vib8 zoe5kpyA@S7K5u;l4%c&0>x}RE_ny?Jqblmpdqq@Tl)DJSg!=5T;)O(?kt(ZMf_^qy zC9&A9TJU|Jl}-Ifu{xZkWQ<5VwFVaPMEqV8WN1Wd(TL0|^pMOD$(%35k_Jw?+4!18 z^Wl{l?ke|4va@;`3l#IrV5_f`byYS=4@!r8D{KQ7A3PDA;+30xSiK-xXlE}?f!tRx zgegc7@B>0ir^vFZLA1r!0!fp-^h&iVx*b|b6SXG?=N;bK>_<=qAEXS!+4Zx#UvO$Y zoR&732UtaLS_=oPr0X;UzUa@2#yuJjFo{;TB?}PBrbc>Gj$0|%@B`!XKq?X?nc@A< z+ng~|^y>0;Nw(8ewRYI=bMl#~6sNced_!6vvkfqrs0=7_+7&*tH^_LWB$vI^?hBStZO7|6t&=?C;XN?6k{C!Sk-K=ak79ltIt}s#=;#;lek8 zyJ|WmVqH=qa*4z=KCVeBfY~=P-#$XK#IxQ}iVKU`PYS5Qm09Z9oAK(AfHf2Y{Nh%1 z^=dg*4KJKCvZX;w54N~SJL#>>H=GE^ntb^wx%PK?os|smBk4tZOC@QSK0i`0hPrEf ziRUJ$^vcbNHAEnp`CARHA_;n0pJS_=V!X{%8}?p_DK!chw+>nN5j108%zdf#7UnCJ z!ay|7cx*tP%9d|K$7;`Ph>P4f)>C?AJ&tGs=U(nO+2}Jg!(A7oCe`7fv`k+qB37oK z!B)3>nOJaG*NxORR^E6)ru0pbUo95CKo8MG=dz9fVg0I1Ck`&RzztDd`t#$DQWDT@ zsM80sDL%?Kc=#ab|N3a*UXDfr%_tZ6!hz9ygiV!nw1n>89~?NuKp1^2XD`_)qTHxR zkgf8i9^E3Xz0V=j=b*M7OxcmmvtHLx&P8Yk9fdGN!Q0cj@hi6UZIu3oHDxCMxk6(x+ScVmcg_ z9x9%}HH92n2gBRfb=oit6GyDkxJ?!cho4^hFfyV<8$fm!SVX;Wf|P-M?l-M#wDde; zhWE|;Go%!egT%7#zyvT+LEP}7C>#FGCA_=q_~RfS`uUb*P~9!Np&D*G}hJ=?m%(sf+M zC(VZrcd;sIl1WYmjqmbExQ?1dA=1=xdXGhKU-qt6eWrdqGc$aLZoKBf!F)iddjvWe zuj0utQ$TZ*{5Pu%nC<4*1jlngs-2;`kvfx&>$CpR)@!7D`i!>DYRVAY9_-5^A8f2o za~?UVVT!)NwuO-u=9&&NSXi{Cv+SXw52|omD1rwhKvPGG^2QYOB_J%V*3*6IF6C{Fu zZRr_8REWX;E>gPdbS3*@t}MFzbAsCBTW*g5ocZ=tcdke7=_lVq<7SzyNS9i}pcb%% zptOG(QX?#gg%s!c5~Wv*-7=AUh#-Uan#fGm`UU1oad64CXltTh-Q+DC4p}W#`%gn3 zddGg*AfB)zGAKzB^ftg8jSm+U+zE9~zI4COqb7_RJy4A>5J(hY)w7A*^d{0gX~*G} zmey;Wes0|`+!~hWr~dUlbfGBuBZ`Hg88NbYfzIM9ilFJt&PaXb`L~Z=XM3$?N?T0j zah_vybT!{&j04&4=8>G%a9<+Cz51E8X&`2h4%{~Ca=?ICja$zrEd0#1Pb$1D^VE(T ztxIG;C_7riJ}kmm+6&u_=;6WHMV0HibY*gM+wS<(Hmg8yJv%yN%>LL}?fe*+vmFuX zNKctY&A_r~w@wRz9LY!O3xRZGXOd8youjxLryZT61+c1hYExmcBLliI=Pw0N=y>=yuzNck09G0USXq)p}?-HdD>MbCEU#a z!>)2)gT1GPPOhv7khVdTNtfW@(754iB*kg?>SMO(R_MRl;V+EB%qI0sapYWXqNE^t z<`yGt5}WNj;dwMj@JNp)m51J{H%6HgAx&EaI{75Pe#F~lOE%6M?Mx<@*Yd~gp2VPK zHDQ67lj~=tXbsufa9-FGAX-6Y^|QyTpLl6w7!4Lujb%*tO9^<5$2qo>cZIN(`GOp| zBei`$ozU>CC4kP(BdLui@16K~HaExEu3ZAF5v1}m%$1f$&os4xv@j>%a6dw)hrC-I zYIx{p(;X{y?yPNYY?CLKQBO+xy$F?vJ$Yy_)71XB-xs2DG0H8>+#F8}6{h?cw}oPh z{u1cq#ev>X&zRZ)Em|SsGu`EnYG?zk*FVL3)uBSl^F~cs9O^G*xji7(PVa0hA`?3J z%i4Yt8B;?p5Qy?+hv4$$(4Lo)v}R zimbD$E;er*uW^OTRT>>?5Q2FQM6vQK{{9<60zAyvafYQ8LpT+T=PQuhv-{dpwgO@m zXnX;VuB$|ymUU6i7M&FAoE)9RSCg51=8JC0eoJkT4gISm8WPQ!e1?1VO zMG7H;xae(95B^c}=)7(pItBn^hTHjpyVWGD8MX|T!r{;YfYX>QFrptQ3%jY&X6!AR5s2AVNErQiqp}U2Q;fwIv?`C>3-aBlJB-yZTn!|J z8EX_)VRUYaGQvB-23=90?5p$&oBeMZ8o4~IobO5$v*m32T7y+yFBo){e6ZP>L~%Ty z|ISn3BAcQkTE~C}+EL>a-RrGUw<-U!CKbEos3^C$RQk>8vShqdJ~3_5+?aZ2Yen$S zP4dt9O$qYHB_?#Jzx(obEG#c5Mbdtm z3@T)?BuhV>R@RRP{WhBDmEwZBYtZK?UIfC-?A}8EM7{Pu&>lWZ@jFjLN+aWlB`T*nwoUl(T2E_V5z<1+L|r z(g+~kJ}K0|shN6@xZv$rEOI-8J>%%6o(O1MuO0abi;!P9 zJgU__lXSAv93{0Rds}5dYPuEj@iILb);;r7IBKrKy0*FBL z`!$Yu(=?*ly8xq~cC5*hm%C-gmP(}^mA5vE9cv1DS#vKEgbs=cddfs&KULEZ2jGpB zcW=*2LE|?7OvyR0ESrRKnx&}3`5}v;QV5NY7cf->l@;DpU!TCmpi-#sa&&efO9;b_jI<65lgi7Qw9C$V1OWr6$50}1F*JC6 z2DRLk`6y6#=+H@wG2&=xK^KDdoYR*B$D66ekvpEHqyl}tD$Bg>etSj+xEExaPzA(J zFkGJ@ro)|;_6V1-V$fjFsLzf+Es=K*tV~J za3kmA)AI4HdH>H~9Wsb=*7?U~A!~Z}ICWC+?4%7Xq0XM}WkQ$PxXCc|L?&0IEM2X& zZQ5lfX$vuEx1*4~tEujC+L75<1cdsACUnP9Y-odc3%C~9%4({K)nWD+06u0Kc`w6+ z?&2%c3Zx>r(+;J%+F%gv!BCTR16MMqk105O$&n2A@z!$u*7SfFf{jfMy2U(uooyk| zWCuA3d@+%z;PhA{zNYSBa}{#j@YG78z>Wzis$Iwcsqeqo_*sih@|>ZeGes`{q)HPCGJbOuWiF zBU|}oKPofr6v#mU*kFp&-UKc@UwnEHTHxrl6W=@9h6fonW{L?h`mvhtagwp=mIZ^e zxPK=9`)c3Wxx?LI-EmJFri{7?Z?AXCZgH@d$`Ch1quaqK1zfGl3|RHCV{j zg<2^T6rBM)G}9iUPJ`G?*5S{^t>tY0c|!Rtdo7g_c_v` zCgWv7hVKO{)%BV#?gb-RB&1Avhf6IKKRqq*Y=B+Q5_=x27o4dY@0VG5)~Tj`@n(WS zd5i2%V|02gh~K|xnpDL`P?wdIg*G-)LJi}izuea!aZh(slnjaXdgdWCb;zE^(1wwh ziK!$@Q=_0}M*wFy8JPydRd_cz=GoyoRS95+<3O%nRDhOa@5aqa+yMuqcCw3Mo*Oh)`mW#_Zllk5Zx&3FZDhd_pk3JRpM_ z&in&oJIRYx_A&4ST5{9`d`w`*5L0hz69>gZxNM^Z`tDeMexo8zA4mSMA+5{ZrpQI_ zMuzmwsEjo_zF=%u5OEH2msHp3NbJ$np7RoVf1>~MsvOY`R#Bp)qNQxZ$ZzBEkBY*7 zJK#au3Wn?P14i(+4mbzKXeD$wky&nfyF9Um2v3Mo(-n3N#Y{$RB@uX{)26*D?aHTN z6*K0}len(O_DHGX2NF(hsLbHFe6)@TkXSE0cbfVVJlqb%7u6UQI5nPT)&?R%Vjs>R zQWK{TO?bnd%5Xa43)e`sEK%HD$*gQcG+W$x=;Wk|s{I-&bSMIp|DkTS?DOYlP!_}@ z7;(pOpM@EQ5}ci|Nfa_WJd(|hw?$z&Zki3opFw{r?J$%U3vrtYogQVRM$93D3YI@A zk1@wbrGq<4WrF!L#x1!xLQ=qdXM{VCAvEFwVLo8K|Ut+u)8y{o}L4y4;wzlPnM zjA1CZ1QCYuf~1%Pz_t{4KsrjP>8Z)Z@prS`PK>7Xc57#&;4lEl`K0m|!k~1FzH}k< z;7vp$6H7Kq>-$x;a?K@X+uWK<1Kryr00bQChzl0HrT9sYHn3#z^C^f0u!<3dG-4Hr z;eGlSirH^tpI77v{*hUzuu(P*A!QFp`@03;p++t4=!^mhPOfBcRX^0cACwC4W>g>; zqbPwlO8oo6UdbcAXN+y@5z19&dtqy?D2=0XTTBeHS~vgRU_5-36u3g+(HSuRdVV}+|%-Veaf{gfOLF$ znc3#^dJG^8kZZPj$`*h5439B*yTs!<&NfW_U(CQg#gmWT-m5b2%~&6?w(sZ-3-AD< z_R(S89bDz6tslE-nqK$gwfvg4CbtCCDRHk@7FrZ_&rBb17qgWjxySQ`q0(|VU2eR0uM*O3;ju{Q>OAREfU4!&iIF7Vp0AL;p$D3n*)HBq zuNWL(6$@rsTaVu!%!s`E2slH>M2L!fGQj&W8VGE3>%7;6PE*7#PT+$M0~c$Ho4a9K z6WL6xVVIM-p<8ExkxKoN#lkWmIq=s!hee%#Y>r{z;YHe7s8bh^aV?E09O%(F8ldSJHjQ;}|SeGFst!3WrysHXAb9!D+3 zxd}TyB>SNuPA6IdX<7Y+{5h)Q8S0j4xyX~*D_0>}LaSZrK11p<uu~y5cf`5j;`~?~p z7k9kD$)4rwadL`2DJiLyrDX~*vk&vs;=ciDk3%r7FQGy__uuxV*xKPXq!#j>XNSs? z6#!uymKv6mx?W#XggJwOha(c0JN&aLSgK^+F!0u4NR~8uAilG^z?N- z6)|=bvdCxxo@HA27QL;-NU6IfzCS*qUeV?Y7X5U`n9f8)h*i6MwOPJ4jb^2Z5gtsT z6%rBBrTkzo!js^RyUkOdA^t8{6{u&Ch5mTlxLhEm&bh0eSRbVNL};PhLM9MyM(&$7z5&VQ+Z}=@fYT~8Ld-U#-&2}u_}?jH!|h+f(Lok3WfvWGERhxIfdM3~8ouIGAx2%_ zrkWr(j^&*!Rvxfle<)U9OB2(Z-XAExyOy&B4>G2)DwN$|Y40d){L=*jhPFKtXdIC) z{Bo*#m*r&I8%`7B-BoDbzy!vq!da-Pl`q4%v=O`kTMG9)SU7V2g&6h|ywY0%MfN0UCChv(A4hdNe=2_t4-65otwb zlLWy40LV_s92SesC3=JFnfggIhJD+d!uzcF&Qxgf@-5xU@wkS=HIP6 zqv~(?^xoU;e?7S^=ndn5|8xdZk~*R?6l`;P%KqKhdy+)j^SIpBi1dK2d5I9b%kDsl zqmSg3P8LcidBYt;rkgswJ}|Y`n~+t$H!VlJ7hH~jwYefT-|-&iZPaMuOCYL$ekoq)9?h`@yy%R{!kObP+Wg6#2pFr6?h*V zG3`1y?OdX;xNP9|SaXR?!f;6+c5hv0yH$-|zK^cZBhs2T0vsgFn*jMpIhq^rhgU}UP4x>5x!&t7FcxzjQ zJLW(Bh7SK3{-Zp?a1nkr?HYm-vx$!BP^p;V>yz*8zbfDm&GtP}ex;O+eVJb1tNl_> zgiq=w(fM+h@>6}^YDF;r0{UR6H@{uJQAAe4HjjVCn!e%6e$F)7{>usK=&9~V0HKz( zIHGha45*ZM{_dUzSMPAZ1)1+V*VY|MOwb#QH|&P*aC7r`9|F}S z!Fqgi8_8fYFA4|{W$ZDUNh4*oo?mrqa+-3yefyt6$_I@nln~#^U3eRLt5a7o;>-SY zT1CZ`Ze{(K#9|!`(`kEgW1~wopg-b*dwc+r0KOZ6#>eDUr(%&%GzJvT#D%f>cB2Nw zJ}De1@IBrC>&3n}H7|xSAw;D$jW7!dwcY4s3r+4Axw<~BXZq3f=l*SIO2UNjyL0ty zLer!N8CguHKWh<`jEpHI<`em;r^V}(wzVnwUf~6?Onm5EP41t}g>iV=#WC*e(D*r| z6k`%1uo5 zQX`vP#I_xcM^%+hssq@zJ=2a`ubJ^iLZ5lEC=fbn6pE+-!Aa?Z0~TUg_i^>-d=gVJ z8Nd3S9Emb3is4U9SE75n2?9jU@t&b&5$!2C#6AS!M1&b);jB_Ru4c+2P&1@JF9xmp zke@Na)PjvVq0#Q(RU6ad_tuf80(R0Gp?GY?CVs)Xg_V^FrLI=XWb-7N(of6@Wwf}P z(T4YzPgw=T(~R9FE%6>3`31d*5K5vEG=m5SybZ^hbdth~&Y!XZZna30?JEv7fy zY6-kw32hk4US3qWRK*B*DL?`XR?vYgp8jBBT5QFh%#~R}j?9audXOz{dvA|ShJL7`EQ|f^*Ede5#*GF&wC~t- zm?(cTs=y^+kCL-M{ihzK4=}EVK!){$H|TAUG?71_!!#c+44%~WyfS=upUKYJ_{3eg z>k#t>#o0rffE~WSV2m_zGLZ2|6`l*_c%O+n_CVu1gf`j-m4)&IRWSeD444yd;INjh zWD>}KyU<(iKT?yg*%2hu>m`W&tUZ!cbADUaSM52`eAs%$+fuHI6A4hdE!cRzg}{tz z!LgOvg;P?{?wubRC9+SEkm$y=8mUY#jIvz7Qlfg2!A0RGo9lZ@$LoHzhU_1Gg}hHK zB(=I$d5xPjxG8fK>S09I{hcl^=+$(p0tbAkN>sYv(;rC^@JN4SlA0kPsIY?2Al&Ji z);AY&;yd*Ksbz6Qv9Zt4f)++lFwwU{M~ZD)gtQC|5sQ8e&P42{yJfLLiXc|k6DoG+ z!xk-kbNVUX`qu%QqCA9Les4MQ4L_Bg$td6*Lu@DaACRxo=CL;mmm)6wz3A>kq49Uz zIO`k{Vh_PS`@6`An+T@dCtCbcTbGTh(Y-(jB%5_lK;5Nwm5}vG;V>L4V4I^XK(5~) zbmCKHstkH>&(K?^Cybf-e3nJdh4)1tqJgqTh0{Rl)_r_;`yuhz-Q-j$rRxiwB#{@u zfmv$2Ic;zWB|4vkkQQy9MHlrVe84#Jo7J_FLPjK3ENs(3%k2RUP~{U`j>qOCR(MA} zth88Xh7EuEl2uU1pnY6uRZcVu@o_5JZ zmMV0I+C31pOP2ffePWY&ne`wmB zElsC>dG_gG#k@v_WeRJqwp=p+ra^x`ly3bd^tG6ilHO=E9ube3UxlF{>($QKGsBxt zdV?t?Yb3**+Wb-j?VA-9>;v9(Q@B+pw>?|*i;QVzu$t4MUFAF6pN%D|3*Bh`@ zdO(`vwn0sOFeL%|;O23gHs$;9)E2z_7z0XNgKDZJK$}8+mc|p-ucfXlVqcIz({4;MrVguT3!Ew-ADTkpdWdC<-}V$Qxs{v!okUD z43PFDx80S+-W;!tOJP`UxO<)bwWoBv_%r)E4x5lD(`#=~w|na<6bu)73I2ZoLzY=R zIHf`704{+BO-#Ugswnbea6a8*>>iuv&$7#$e5E|v&EHx9T0}uZC+>eVLAnE_i7RnW z`MCw@^?hnsRV7AKLn+BHS?BPdK=S4yZY~s1O?9>8MlaN3-3`E;i#!`j0)uYR3fC_7 z7_(J7a>r}sUhdA#&6o(k0mTr|^tyw(VPA;YF9FCbc!&VAh2Jy^>&6s)k+VeEnABtiN9|*V7gAaJcSJUBuM~32zJuChSEnzmd`W z!E)2Nn`HRm%Gw}L2F&@=$0~j{D^Ut3{wWl09wIz`fH>7UUVs6G$Ed+1PKnQGppEX( z@9_x< zdXU@e>*2u#Cxf|49GjC>V&R`33D78ac`J8Ob)`5=$iZXLB;|%vZcH zovn`y!kLjcS?#2cc#X*rhEAo-E%5p%EsoLrq?TbMXH1{Wwf?JYrHNs#LKOoaEZ(A| z1|mA8690FfS6R=_^kjfohhH~JoNci_1-rjfdeo<^lo(X&u*YCJU+xuz$N4!Jmou|J zhE^I7y2&=$@JFSJcgQxVkI zCIVA;g}V@svJlvURP&6dit;Q0sv7r3UlfgTnz^~-J|1bz+=w=*!Q3T|&1S#S>FH^z zYK@h&*Xc&~+oP9|`Q1r#QPM^YZOB^@^nt8z&rWyBwh!j)*{%l4?T=h*UA7Q)dw+TW zBDs8My^$FoHGjB0W~^)tB^hoNvX=*3ZR+Zw(s09on_cAdl)XkXg-o}dddo5CT69ZS zR9Uy%xCb^y!iJ;a6EhHYb-T zvrellE)S=Ckc91xK;sWC$V0 zwVnnv11%N9i{VoUgPbdE-YJ-Wyp#0zEct`u4KON0t8eEVK;v>w2PL@dG81a?THs~4M5H1d77SXF6A}Fssn&!JX-Apl*QH@9zh;t_a zf%{qm*(uhuRdc=}SI0A13j49};!9Tu>+X&Y#Q0-;NNwi@%vaVJ1(8r91$lvD<%KkHqnbVs#&E zh{V!4#3EPwN(xKYSn0lkCIixgx~s!9`GPqaKrAoYu_70h!zo^9!n=Qd5nH)yWcj& z5uE0@?;RFfF`m~r4f2UZlItIl&G{B7-y*!WRyQ~K^QQ7;?wn3q-N?-o=X0HQWLg{5 zzMRbFP8iF%wbIMwMnsU>Q<=hFKmQN=((h?sh7_awBsD!Q@J}6bTwu67wZDi!kWpD8 zP96m>tB~OT#!hi%f@16X!~5sbr_oi)E`yWJwey{_q~;0f*CmRtSnGMvdVdmnWN7_a z>EtR#eq+fEsCOv&u8@8ie?A4n1!zyF0Meg%`^?sxk|(RK-;jHXW%aR zpBJXo-wWO47BM*pXI3iMECHd-7#iQQI)=`&{_{G)Ar-shrF<%W4uv(DLT0&D01{LW z=Njo~e9f7`x^IeXQi9WYPZWquKWP7a=%>{4t7QG5M45%#zzF<~ar*AqVm{8qjJ0NO z5Xy^`(v1&g*Q6u^G0cI_BwU+h78e)C<8J&ugydia^*3>?XbFFzx4uR72hLDzm~ZTC z`JSLcp?cc)JA0{BUcXl|Xiy>PEEUF9zNLxY3_iiwY5Zcbd5uxjY6jWnd(FV+Ss%}t z3h@$^Gq^5pdG3>uC6Of6);X|EGj#HnmA1$6qNnN27hvXjMqai+BLiNwOWb66N;trGX;hA8(%Q%Mif zE3@LEo6;H0$5W{_ijoH5>RiS6<_e;K0&&=-yvu)=W?{O%#564d^r4AMJ9GD za+Jn8=?u6uTtWxleEASf&0uYX$*74e7RMpu$3f(FCc0|VnNzx#@S zeL;fr!Q$Ag1{TDl@1lxi1KV|XR%^mhnXPmv=a$Tk;|r}gX^R(1{NWFeSSNs}Aml8D9uX=rt}!dTK|Xqrl*he; zDZD)|2$fR#DJ8B>!8=HH=>n$v+##~q-hb@y-`MIe`-YRmHqTxT-mUw3k{ZDvW@KyP z7Y_b-^Cmh`0z2q7?ub#jUWd6xG+uO-j%a1&97vpozwwC}Y!`=~AH~OjDdHOwuod!E z6B5~6gtNr4X*`8l-Bt+Y@}va3GWKROP;`6Z{aP))NpSup^DhtSy(%=o091W= zi}O3Q)C}z*K{0PInIALp=F4b%z=G|Qu#(*bocZK;L!jMIveEg*;Nkv;f$z2QR_x3E z36ZTI@y_YU~?2+5zOUjfex@a5#iD`(hlVL?9&6J1*Wy=rj5*>cNJx_ba75h<$ zQ!nM)jp0eFgLi&1tUD3WeB}YF;ayNdZ;Jpg*R2j<)@cE_o!RJB0+WL<^POzIWYFnW zpNP1)7nxZ+)9vQ&6BOE`?L%g_ubA5i8*F#5s68I6PO*^$>Rwn#m^7c}ty7dFIr}6A z&Es9Gycjct z!aE0X1-&AWrFu33^qD-hVAAY>!w^?xk|wTJ8}2JH>TK^#V{{EkSDhJs{vvTn3Z!Ew zmgxXkh@0zc$wv0FUwB)j0UNMGM%Qz#=^yunDdwp78{}qRU7y* zKc#1_v^|%(G*Jq?{q~!jv-*c%C(p>-vMme`pb1oSl@dfAb4AHH-?Gf#=Op0Ae-2)aI8ZhhE z?c&}f8skE#MmN$uHO5>9EJjnBJiGmCI5`HFPLs0IyVtncrGWE`i7bH?iez_sn9nvj z9!3H`P9Dth-&oO_w-CzN0l!Eq^$Lj2y@$L&e77;jQe$^eYs6@D{{OJ|mcdbV+uCR+ z#EB~*?(T%RK-}GpxF-;IfrJnt?(QzcJ%PBpySsZj_APduz0V70bM}4f{|>g-&)U zGUHXamCCaj?P4;)kU+&cn&sv@Lg|D=0P`~cgzvf#J z&%n!n3;P1`donPw4-`<(#gH82HuM%7?P3PJzO|JrItC>O)R014>3LGYi3o(_m@2)- zAbC(*+rK**B~t-_75a~_RRv0A5oK}HVxAa|^dGU&bant=z6&zlm`;`EvsUflh@oOP zkMpsDF@Wb|il%OYQ1{ky`c153%d|`8tmc{~^QB9b-oyDMyI-oTFE=|cn|W{nb};g% zHQt-|4*&T-I!o-pa$;SOP;SCkcB_u%pa=?<U2%eQ1#BK)Vx~Q=$4G70=_v zr(yq1z?*4F*47*I)tZkUL0L^G3>0>rr_AU}yp1~lo_XU7@)PJ@(x9Kcv zw6`S_OSIo+x>3znmWh!`;}UBxY;iuG%{z0y+_jw$jh9OOq9rZz8VJ!sry|3Z5|&E5 zk%Hm|GTl{f6;1XU$b*04E)}n<1=niPhk)AJTHC`0B<1=q_7}1eWqPewhf`T`WpD)- zy~bmhD&CK6oh<-#W5*2ak2v^{5YQM9K%$47ZQHBYWR#%5|GzO8Ui`j5x7t=!dDa1# z-$f?`zRG$&*6DCggprX^8Sr}6-|`H-wpkDdN~dK3wT#E3X_OAk^y~Wo>{{^jo#dwr zQ>a})>JN_rXct~#7Q-%bWPOp%zSxXiC90R~CcdbbyBuEt8!5|WZ z6quc|Di@hJzT|PsR?q;j!50GCotcOSOePy`q1kYKGV|3;iYm))6Ui9X9AGxoU%YMq z9F{5a{4uA^AK^vcZ`8tP4=q^W#}H%3%I~W(FXnXy?3W)SYbCB z2v0@e!O9FLc{_HxP9@$|pi>0%6`$Yltv`aXSro5|8_@8PHigG?Av}+u>Ubum#(Mb; zRTx3$Ou3=??4y^~x&r_sEM~H~fD-q~XPbjU0Kbs~lv+j)pi)Zag2ItWc;yQa8m1Eh z&olC^?_`7C=-Q}dcxd#c(B)+e9r8Hm+pC$b$y+MtI!N?|lRRs7z585aHJiIP5dS*C z&S=;qe|U{^Z>FB795pBi%Q15xfeo!uxxkU%^(^``3V|>Z-UQo3+%u87x13sm^UsNDToG(7?)*9$YWZk|~y#%wdk~p-m<_mO8|X01b(;7xd7F^si2B>!P=_5Xe z$9oY3yw`|1QgN}8G4vTwOr%R=c`LwSQ9OY0NsvWE0naE`t!%MC{s*LTo|6prip!{` zu4#>xMgekg^o4}5%yS&3oI&~x^i{>O)WxsBVc7L#(R7vmxC!_B6;%5M37SZ%JfOU| z!Xzygjl^09_-LX$FOTXcO@)llEBw=I^MhYg0_cvI6X}k(-Vc{?8c90zb(&2sxaH4r zfSx$t#hXl2adH1ToxffG5CxFNJE5<>zmbxVQt5yq0J@(@_C=7vb^^ye-xqnkACret z`J^uQrvZB$09)5w0#j?VoH1rhr|GaeF&LFgFbx!;h_{d>snFrqx5 z4boT~lO80W>dr`p`Dms{G?iSc;5CVUtYWUX{#Hl@z|rk>tVX+C9=ti6t3q^mGK2fw z(*O3Az9b+B`FHslNWUU2!EYFK?$?Y!PIwAArlMe!pY%_G20F3Or^_H+QZ)TTN!ToE zPWTBCNu)&*@_LBtG;rISl}S|@kGu7S^QUAWA^$dGzuyvb!U+O>U!z%Ie*Nz6wsI@y z+rzJnX2dmH46rr_qmokm>>?T)VGrk;1AdY@;Xj^5Gw;;uQDgs#VtyMN@yR@z4``>h z(I}qzx32(*-OGJ7?)N9mhYQt7K;I!b;OIp0Xo0K1z~4@p*t;c-ogw7;|2lUk0T{rC zqb!5e`G5WJKiJ0qMzY_JWdNC4z60xD{r-#p_wj%ry*U8``*?!nv-z8Z{P(B-;p^|0 zpol@><}xA^l>c>D|MM68oq>iii0S;Z7QnBw^8e#O|KEZBe=o+~uYB>CT1WhG^mZ-- zY%hlH@I>HoJ{pK3zR_6!oLf~c^fYSq&E+>bm${A4qv(~C(pYqaD>Djl7N&4P`XgP&O}bJ4gEtdHKRLaXG-cGKa1N_|bOP$q zV+WxzAn?qLKh7PFqEBw!m_RnYD0v89*e*1CDpTGBZr(0{OrZ8XY#(;pUaT#uon3%U)Ri!?Asv}sCfHFS8umOt`lPg7Hqx|N8cnXx zyEk7i@*c(Z)so%xp~J}xF0Cpv$7HGYTs|UID~B(a)b!|V@N~YSITfv5=E-q${IbJU zOH0eE4?~I#uG_wYSQlpV@ro33(gAX*Svi)qnk8wkRap1t3VkQ-F#o81d{BXx?*8f< z0oN`z9P!rpKQ|4fXOqZIr8E?WW zjb>2Nv`{RH%(02MevW$MjRx|(T@!*0OEbYq*}oV##QN#YU*s#$2+eIMH;6-QCK{p~ zaU3rxwJIoyL%q_`oZ_%p%V!DU-i*p)(j7a2uT*g=eldEh(TPGwSK!)A8~sYbgL^Qu zM1}|Xg@q^hB4Me;+m;h>PJAF?|Fj_uaP4in+a=^P;EOOlj@KSxK6qd@Z^{zER)%*YgRgoF9(RThj&15@n8Tmny#Z#AONx z31&a|FtAZ|e&vEwnUGRZ|u3ukH07r3WMjS86n5lq#HtU)4u$p5& zNd+>o+|g&;uqNtN@Gy`-E|BL5SbRu`DnB6%Zy|+L6z-{AZS{7QOeV20noz(qqbrgR z=e5-fx7#_LMN2dnWYR4(4hAjryB4x4{W~uU-7?zEq1aLR#R$U}+z(#w@0Q433fM<* zkV^iZwxn>u27fOA z=VL;zErV0Gl_{pMdEpQ8oNcWA%#LHkmXWtIGRpqEuP$5Oz{B$?|v8& zd~!jeo^JjGnkZ^Qdn!r%x1F2v=Y zb^kU!t@sezCAK?r>%*872I7gTeB7OIwtU&4yBnS@X#Q(^Wlb##0ggu-y~_zvemSGY zS&6Dh6Rv>c56RBr{SsOfv?1qA4fcn-KY}E#ohE$ca^Qe{buaR)u{QVSg8}X+aA?Vn zM8Ki6dAUCpiB9#!Qn^&1-tn45CcZj82(w4Ru_&4y;It8i@)|yUNAQvE6j-~tTp3m3 zc38uQ669{-{LS(I*Lc3k0!nS)N*?l8@Np6aukCi~54JjyuiVk(MTn6!_P$}XCDPk# zd|)sRB}z=(4iTTXaUGxV^wRI>QVEvbH4H#L+k+$n?M>y99L{)04{6uQ651{+cATJ5 zOMO;W&aq+%CW&=JwkH`z(VfV$Hk6FvE!Q8Cnzqhqr$^4$C?_}WjgJKybBIsdERiue z@dn~Dyu|8B@t5S@%tIv!u~saG_wn#(8JoDJ+vz&I`?<~c<{C)+*GHrxk@0zi=(KCK zFi8;!d4#wyFAo3I_W0WRo!@;X84`1%O_+)Q(Jbu`s})oVl==PAp5OxgksYH zoy5aMGVL{&3jMC|e$7!vB~F<_Kg=YJX)K_)Uxy9rwESobti0GL!1KJg%8eh*QV1>H z&5u^%*HuyvJ`{OTaeV^c;I>W(c$J}T0nfz>6vFWst$p(E!l~h~`%bztCIwo^F z$LQ9(=d+AuOBR-zAG{cKv9>jzUut*Q1nacK5-Io8NqY>^#W5N<4K6pi%Xx~)syc$5 z%w^HL_Rgw#fMRU!)oQG{QW98FTna$^`QVg3kcTs9qXHY2k{h*M`d*v?1xRN=%n?uh z(udhA*BeFt>caWr!d0`$EqGPioA|Coc(n;kk31;iuy=1Pur;h#D6d00L=#Viw>g+P zn_ucpWqRW_tkV!`(D_BS-MzL}z54n@;$mogJa>QUqYBy7n+18mo3l^=B(L>`G5POp@OaM?*XWQV%wJBLZbpn~UEv09liP zoifKe^Bgtr)+TBstoss4sxt(*Zorp#GFsmvMWmcnygJ~}sI7KJfXIUs^v*9YdJZS| zLGV7pUn-0avANy$n)Z}j0+6wSbl(fG;=mJ3mRJj6PYWw=&UMG&IlDaUW452HwzGWN z**M)IXuiHrUoaECP;8PXENK7(Bsj@iKlzUZ?kH*0k9z78**fDryt3omF}ur~r5m04 z6B}TUHOuqUtlB-Y4{a_JMM6plSghF@wlW~{2hpGxZ$3!&8)Tv$1lb=>c}_Y<_eAv6 z>lm`j2?_C^$bmM7rVZy>>2`L5f?NR`i zP)O)GEUDkA%Ux>Q2_FzO=xctq`Fz3pgwrwQ^Oc2dd1%#b&)X_~GD?Ny8J2tj9_Zbu ztgeyk0s-WFP*38G7}yU`x7fd{+ka`_8o*UG3P$bw1sH;$yk7c>(%nPxs8oohPt_k{ z9K;8CTYS3<;{-`0dM!lNXkTPdzQFtxkoeIFF&bh9{qq~LRj>M3D%NLQ#1u}EZ zME!V%2ol5Vrgox$7+y4QW!ghwis#!(q{K|v^949CA$sq6m7VIRc%SpGQ<(SJPUs11reT{Ef@7s)4qPI zgIqdindh2F!@;nE5)@e-l2)%?-9Kc=Uaauu5WfD(9fc^5J?Wa7Dl3C;zMT26^-j8j z<|j&V{ff7+I8Y*vpj~^MMQ|5d=($*^fb@8!mBlGBs9B*Jm@>yvB9t)xMDFJyxK4sa&^-sypg+p7DN-!eL)df%=aH)qM@xZ_bEP))Y*{ki<_N0%Ox?*cFQ_ zcf=3@Z|Ss}(v3*|nEdUd0x&lkBAp?b?&r2WN2130dPapTq_)^1 zpN}eRZlHm@ym=|o=GB}rzntQIu|}lP|Ko1ymB}`b(=5r{3~T6O=-VkyC}j|4tdIrL z(dZPt$9UB(-R{}tymE^$3HB%^%gZ4ke>&1Wyl$TpB`N)_oul=nV4z5qtPHfEW$i%* zu#!KIrwZJYM9DLffP9Z)i6mNF32$(=KPc*({91ID96Ey4MYL<5i0RpvCCPB|%{9&m z=LsXX>!m0Q6?A8U^>D?t6;`tYhfR~8IeNm3o}3P`7v{8u5iBC=<4?y0l4cZ{)Pt+y z_8Pqd$RdZc1wF4y=BlEu2>6XDxq_;D)5{(Uv`TX6klsohJR5DuIch^&rGbVw)X(nsRermYGp%OPuu=We-QepE`N#A}ttC5Z@=OJ+%)~$+{%<#VC;<-*clW^- zhP00n1N%&^@?n>Rg&q>?>X>}^biN_TZ+qL6%cG-I7f(ub^x&zcWw%3tEMSLtg2>p? zMM=Q%Q&?jW3Rp%-ZE+E4ry5Y4HflpP-8?bU>`t{u3kek8MF`$F`v6x#Sxu*5eYJ5b z_3}rkEEiX@Mn8D6c#4eyuIELr_2o7Yc1`>^iqZb35DK3xK-+InNAAG>iX^^gKuJRb zIiToB3*cCO&qq-pLXR08VwUVNqW7T?GW}BPx-eYF|I8#0X0jje17b0dvBgXpWd2`1 z(MTR3%`A~{AIK3^A|Sa6Y+@=tbLYY)3U&Yq{QyRgOA}C<_I=7fy0CejNG20vreJQg z9Gcr+a1Imzmep(O(r=kkU`0lmoKHKE2me@VeiCdJlUCN4daEswaW0PoUfC3JiwFny zLw!Goa(o#li{Z$K?%_py;kryC^2pR;z+`oVW%kb!3g@wnV+H4G`N|O<%FQ0|B?Soe zPO)6#)HP=m2zX~tCM+{T*q=H>(E$Gs(Y9wAxv8nC_pq9WLIyJp>|jx9e4hA#0#Rdf zZi8K#lHP+xrYMaam5^(D(0388lTKcb2n2?iY#C6Fzm6S>D_(pnCY!1@U89xs8I!Wg z7?#<*C~)^;x=%4J*A)V{y{hC95N~SYHKM_kzA?`{B8)#;VPax{!))XKMZ-d%-cZ1+ zBS1LacH&S#g6}s4(B#|lGxDcZQ5v4w#7f#D&%0-`tD6 z8K9JedVPd!aH8v6&8-G&CcuM{4vb5l=U}N5Pne3bPb3H0?jB4J0HUg6MbIH*?1_)aCo^1Um5PAJO5cwCkegVwT*!b`D3%@goq>lzo zZ#*8+sq_;1YHo*SZ#e~u2!5J@7sr6;48i|M*jmBx7|}Hz<~|l1tc%H`DXuC16SeH+ zqrMZ60x6ehvoxHq!0R-*MXhy)ig+r2xsr>f&Hs({>$|@ zVZe)!QV##kwK$PNjdz)da?-iNI2bVf5xTYg;k5pX&(a7EkzPCRgZ*QKpE z9x_7RgW0V>nN{)&Rlk$ffiA>+ka$~)#7yNk{q~WYAACSS2&#!^L$jUfYCKA3D6S5C ziU*f)%sDg8*_ymsiq=%#ML|?jwd>td6gVV4`%LU=UzjCRRH0iy36#x+K3Sp}8?-TO z9$(20n@)4CIx>mpoG(3kuUxJDLC8}J7MNQe6nrwYG77oKa5qOYi=swQ3=zQAV3*Db zN05r9A6es-f1`^Xys8+oQFSSIEi z2SX6Hq69fPX~x%RKIKToD^Ib&96iOZ!Q{?I+G8sI zu9@hQGcd#J!3@hTMR>RzyaB2@uzTZ=DU;Z`LypT&7r__!yt0h~kMacd#Ur;{ipMyv z`}g+4(Fd~?u1=@O{Bt)sAt|rLg6lO4-ZVL@{MH-zi)=dFAX$R#1Ly@UL_<4 zeVngQ*(Wz0S{DlRUP+?^`9dPWhlBpzLr@(O6XZ`J;!Q3H`PYY-zhKd{Q*Z9^Q*_k1 zQB;I;3TfU3Z$(AFyTCn7T0X;%J>4iOlQ}2+8!f_wMy0ERC#j%h_vDKrOmD~Vc!lLet zq0P1!#_{rOtK6;?**e^R-JghFQ^UR*L*M`I7g*AnIN7LGCjIQG@%kXDpi*zNXa%$R z-oQ0`sacm<{cHa4NT7vr`X|MLg|CV^9=N@!d`W_sl~;=>oAve2Cq4wdyDO7oEEHL+>Fz6?%9mfB@bgS-pql8eFK>;5WQ2dy>c3K zC`;q;gG-XwG4I;r`e2^PUQdU1f9X#Bs7ymcQcsVbbfBB(YTAmhz&j0-L7Tb_i3-EC zi5!prURsv_RG4C_Frz)-;fGLw(Pkpj*;pHvqBLKtXmwFLcd4(B$xH{XMRl3sMWHlK zinr5(<%<5QU5qzQNiC&{h&R3=yic39?Og__C-;XTIx*0g?SDRe zU7)BzL1JHy{<@sNwOGvexK_ew)pMslJ?}tmdE&;4#s|#asCFwDYytB-+0dcj{S`nK=F;eps6_BWm-}$7I9tw3wVYlWOctY(jMW4hUezKqLptsk7H?;A4^nw(dl+&`g~C&N;een@ zrL#Si$ZrU!V?fU25t>0#9#P45po?_oM<~JfPpjK{MmK)j#?wcO-1L<>*fk-jt->?5PJHU68``YTLOy|9byFT3i$mn2*PSfxJdv5){Lai70Dh$o>A4jU1Y zBXt@U+$xgeI9k4JC+T=gOm{XKC4v22n-(M#%SR%tI}}sWy%`52A&D2pN*CR8uEXIg zOqcl!v|FN;i_}$@&E4R9P?`Ox)T>Pod5C(iQg|qwhqM)M#-3+O`m?gyt(`-z4hf+w zP;>_A=8mInp>z-*do?MjmbuHd+^w2&Ih=%V2s|j)AMMd)7tdYMi(MVG{J1an1KP~1 z(ccO!S9Jf5c8qMxGp8e?7Gh3R)dj2I?lKQo=4K?Fz1%ZZ6zhATIu~!0@ zZH7mws!^Yp)$0Pya)$}pH#1(=gP&0*Xy2ywTnku7wNBm^xXQ&AmDZ`#M$^zxZEykU zq53cnq@Hq)c$gdb#>-_&Qe3-!yl&OhR{CnWMjr}vniZo3=1HqR%;4s{wp0GP#l&CwY7iYqnJzEo)ta=mz1l?Bj)jxPvcA$jnyBxk#6Pssb)iw zS~U}rPL{8Zq8=nM{TU_*6}47J|Gkn2hA2o6==sh}A&y^FhOe~9yTMxTp70oVqh*Mk zz1!{$K9VF%Uaq9%`12RD=k7uG7xQ`*mdC4D-Yc7a+TDE^#&VH(LxBr(J=(*|SwbK! zjpnD`?UtfDt9!d5M5Xx%{rMt@lr(uQNq?<3TRRI9c7{11>JO<>OWJhZ`QBK43*k4N z5-pIoFN@F;7)Hll^492DE`5u|Y`OVZ1=G1N@z>q(m+J~nU_B~so^2ievSNa&WZ$0N z1@S(OdTCtDLd;si`!3x1oov_i+e?(t*-IVa7wGx7BgJj^l6-U7)C4kF?V3APV-Rwh zV{CpJY*sID@Y(*5&QJUQ69@DLp6H(JM*IFlSZ;YY9{U7u3kewcTXP$(?@czZ5!TErMv!J$jn4Ww0aVWfr@WP+#(R$0w{|A>FhLQmUI zoz{jDS1bAlt@kU&_=`5YgqH_JU#77fhyOBRzo^Dv=kmW^B7P1`HT81=?WLFh4&MA} zMt<&ysh^WF<=xdJ^v4nXYiPe*_|i-JK&I2*zjw9#?;-qYXum$Mkp_Ym)Of-@NB)zX z|7pk-%s=J-q|y zTtp>%PHEVkcKUDZ6_rKW)keph5Aktqv1Ng%DG9m%s51U3Jii$fBNoVnx1cKTC$9wF zOO0KDcj@@NF3gl`0JKv~lv zUYr;W5{O!>avvr%U(9W8y6-FEUZhG67dtA{P%3RG%ujY$3#{;df|$Ly-DWl1qMxm{ zjJvWw=5v-v)8!*qE7exGmV}VUMA!Un82|CsNFP#61r!|_NqWfR6j3mqI{D=|->tFA zcDlne()mP_7;A*=rTxha;B@m|XC#wG_oWH$6 zBl)`m7Kq*E>>IuMO@rut-#t!_OS$FR8lk|43Wwb}ojW{km-GdD=fN+Q+CYDt&fwm; z+UefNoc_(`>*YAx)>~D^`V9jbjWd`6h33R#3n4U!LX2YNs@277qshJ6jfZQ2@WG_k zNFYAB&p1wpc3MyGE$yPJ0s=PmiZ11Pms~UeRYhm#vAwR}HJ-=+O(FMzGCY!Bm)?Nce-U8h80k1S2$5!E&X=$tebomfUK zN{nc;o?*B*mp z)c1n;{REU?e{5Me>^}R%^+byfp82DArTn$?$;z8saFT7+@_Hx_qXjgP7D!pWWTf)L z__kuM15JV5-C-otazVvmoSxC+y_(S?*xBKQNRT$kxn43uz1?OIP=G3x@9cyutT%{5 z)uNWCXpv;{D4#TMv!9B``GK-%*{vS~2Qbn?vGi^-jP*ALO!!{{t_~KnhH>b%$@$zb zN4v8`k)w*r8Wf4rB00*EJ`v3h6zQS<$Kw}t&30xrGU_s&XN_dQ5XBrtN zwZU}cE$-88zqIX zLK`I`2$tIi6UFn84+l2UT8CSiwNkAnHRlIi^>Y{UYlyQ*{xsKrdfvAR{ilGitanLW z6E-`7)7+hc78I|xs+NLVmasQoS%SkIj%JoP7GjE2r4H|iCTwOz5$6Nzb4P^+jSlDc zf3h@ZQ%Q6iH|t@}%{^(}k2GpHt-3(=2L+Dq`<7zW$9qI*K`&)9vA>INR3XKHq+5>- zv)%F9R@tZGgz=mUnVc~^e;Sk0wU%VV4R zYqNr%pDGi|34=_RkKYOWn<|G`0xC2SWY&pC zmoxO~^3vMDY+04iv(7wU3k>jw8`A_lRm%W1*I$sAivB@|63{QyD~0r`g6z^fTk4>#FN~e zZ@!iFKk#jN9wQ@OXP=)!)-&Oy_WblCYLA4oMf;p%O zs_pAp6$19_g70;!{kCj@t24vxeJ~TbSSWsl%^@v~db*(BlM#@qK3^w6t6W^%ZZma3 zvb#|3Da^ZNba$n<*)r#7w4OU$tuliBu5!DHI!s_x@-BhT@^f@Uc{cpV*8jMnet$!_ z#ZSm^alPyx(i8N8_m{w(d9t|)?<_a8DfQHW&8(w0)?sT0i(TbBjlVAU= z@EAz}`Z%+*w>I7X;}h&=)%aO&h-sc=1gV;EN3C(c>h5S!7`vgu^rwM;@pix+xqkgLT-MIWo zr~m7DUuLM#1`u4}LZx$A2tK>$XCxwAj=>b3>Nv0?(FNAi%9;^^4>CR{@uJ(sl`6Fz z2CRa7+7jQ!ylw0G7{7g2rJen5l6DywzX-2p_I^KPy<20LNxBitPr|&Rkv+em%ob%EwasRS47*~62bbr; z<7}&UD=){oYxCTwnpRCuPMkLB*XWzPF>5THGG3~G&CmbC3txFC)))}Aa?tL7REETh z@E(tyac*z-d5)Xt;wLnTy}isw(n}}mDm5Fr2jRqt+0fPRuDID1Jd$MR5=>KRs8Sp< zt>!N3`G*tO@)A!xEls3fk4J|>O%;Jp1Bkp%4C*S((CSaxo;TSOhJPO={`O&=Qlr_V z1n2U0JB_LqhW_2ED+1?C%Y&Lm33fj-&Wm}rOZP`D{P|WZ`iG;`jlLMEvuy#L;C)$vhgZE3WC8pB+X>0vzyD}A>gXBOrR@$S zB*C&}I8LFu`;MJKa$wL|8f!nyMP>5}=vf`jv8;V~%d-`4xG`j*(riyCjQ*ZWtRYCS z4no1|2PAa1pzl4duG1;6!0m=oZvtB!CWDc#*gSC4)P6W0 z%-M`?a^3WPy3>`6D_QY(oz02sX`9}1-wq_~=!XsbjI;3s$VarIap-}M-*%(N?*5yl zXNQ#r{P0b)Sv!IdBMN@Q`MCZC0Kp^bu45CdZ;UXzPTV~c=h4b z^UM%D0STMBRqox9(&{~c zhf_*FooMslB4I~ziyg?di-Tt17>_Z#$#ze^U4wq5qGdOt=W}0!u{^SkI7%V&# z2HbfmVoM?;uEeJFAhvlYe| z(tTi#7jgE*uY~HR^Y!^I7i_VLL5>II-Cbv?CLF~*N;#THvo(h}1gZsiw&65URQb*h zubB=mFhMbmn~lu4yn{Y4!xcJ zMx$*rKtIEq_Ki>JmKfE}(1P2k_BF-Y<>aI9DvbCgUc80T2G}+jK@-g1>}CNO@cdpK z#a&_R)1y{tQ?B1n2LhJQ`AV9`X>hVPwCj19<+U!WvZeRb!o{Jv*$iO6w-W$2tMx@rv~v(qinYF(!66M zbNbv?4XcYBEtf8a*v@@*rZ6P7F&MPOgSSwq>?GQ}mNn07c;#!~bT}3*slOz_A25TE zZ|{;Z?!*&IwLTXkidB`X`XavGdPrXR+^22hlM#y?5WqvX6=lRCYr=^MqKKkwC;in> zh|>ad5*frM<68|B7Bk_0`j}e&$`Y`abLO{Wn7YNm+XJ2wsW#)f?g{Mn4ccm%b!FGz zfRHHu2WgANr*v%Q9A`1N_&0+g(qT+>4i(uT>Xh%SGj%`DAcMu*rixC5GEvaQd3>3V z`>MLnj^Rj(IoHh=2G`|yDVSQ%5<|f$wQ6~m^T%cj%ia`2!e{F7SNuR=cMUZtGZ^D+ zBO*_;c3fkxG;wk>;n9<{Ld^nN5YA|C<5V&CLI!R1l>8j62N9B3{>SULGqTh@Mle51 zujKW8cC>}2U{RW#H|87l%ej929;g-^bA}aGob5NMj$LS7XJ5ns{k0dEzB2v?U}g=7FfuG%u2*f1b-{;pXZh;h=j)2+qOzd8*|y#Cms6 z27X~<1&8jjyNEAoS8IwjZuSq4RX;?JUSH`2F-7oV=Qhhhgo`^@tDJ7oj61x3$!g}~ zlY|Chw;mIptMQ^G4X%ewpPnRs0D#27Ef-J@f2HyIQy70_hLBhfj-Jic!Vveq^pCxF z+sU3arrn?o$nll2a@n`qmSA7R+-T}Q)^Gl!`!8M zMlZupN(z%+UQm{E)ep|QTo#Zbl-tw1v`O;NLrr|gvtFv*lCML&=hD4|+o`%*Hx2mr z=jk{eIrBC#z)urmd5~?nTYjq2iXe@X$_QpWyPttQxgM9BHv-B_NjAN2`pFCjb&V>WBqJ!iVuh&>J>y)ehv~44K8hS(gJtnyw>$L3y81Hs1n8}g5oK`XO_Qh&lGAz;o75h=K zN#>WEhtuw~jjpj;;hFlP?ZcUJA$ZHMVlTh550?ICXw&f+Rymgd$WKrLh)M95UIn0Z zNyH}I(#gWVkm5QqJ0!6c?CoIfasjt-WwOJVMB+7Wq3mq2U*JzL(^e+mk{m+BGse^X z1MIvML*#Yyqp}fzs?8s(%HNMCGwJcuc#eOay9J!PxZ%lj@a?vBL$RSqmhc{;c38z# zGuV6OJH*4nFlSbJvRfa`*`%7*2H*>^_lEx$5bNfVJM?`(3Sw5I1HFCh*wbMSw0oZb z-h6glzo5J)+FVH1hqJ_mnqqLK(**9t0_nVebgckT5clF0(T&#A5X`(}ocjju1g?!+ zg&Th$D8iQt5N%>BQITJrzwj5nfbGsWH(uQjp8VeR^7cLrxjwV-Q>I6~*2Ggq2KSe5 z3rDn$4-JmT`Jn|R6?%?!*orCo08*(|mS5Ed+>sWJ5Zp|Az2v;b1zD2ok6zDU`r^wm zsxB)!pObRSTeT)l6jydi#q|S~E;pqnAv|LD@SE??+U&9tq18(d2F+7lFE^B|H*#E= z_NfJK-+u!83>%6uIc;}yPNF#!f$PLz$xO(6Q9{cTfjX$2*>*WW4fcSA+&AhP&=|{5 zQnO~;_Qyr@N_u66_C=^;kM=;5df<<4V$+5xcx<$C;pa^W)#fW>^CV7sjWnz%yQ z1aykhn4sF&upJkBLlm}rTqeG`r?YJ*;_a>ccU*mDhzT+59%K>Y>ZYRcZ{rsxcLY+ix!O#p6-jY&^x!#^^ zcQ6wp`LvGO+qhtt`R&zNG8FBsnHJ7%SBQXV9EOP6siqR1@=DWT%D8-ub>sfn2uUnD zNuVgX+WdV1u7VN=J%gW zAFk&2H>4&>z6_~NP}Sx)kn28}wY}w4XMxmKST513)pc$%z`jG8*29SjariFt>Yud$ zS|bH*(?|#1e_LW+kFKQJ|aY` zPBtR1i}Ir#pwJhJV~Sg*8)MJ&XrlEPv+HF3MqEO~^>F!vn+_E&{gP~~r4yl)tmMyrM zE^3r9SUlO$VEakMmVWZn+kL=a6`hPD@;J#L#GEqLnv`)?EqduD4|h4C7&AOw^o?J| z5o$ohLhyFZGFW0Zsb9GGM4v*e&5G)Dz^BDd?JLh=f75!^M4T=$1nlb~5Yt$>ke2yG zdTJTlSdHr7eK#%KanaSpR9WlPu}xK=E#RU|QZno}*WN>ZJMa1=IWQ|@UFP>q*V8(~ zO`tWe?M`%Q{+p_7Z_@Pf85~b>-^T`|k67{SMXFF!QTbVPi@GuaVTb0b`49}PSWM$? z-aXr$Wpp{?=YlD7V_90Jo(I=?Pi&uzFXBJU!QWmTR1Tk=Z&}98@tRDRIJrMrUm}<3 zbU!5|LES8drKGJ@tDwoU&K30t-E?WypUFHNg!M-VmDa7LF_649s5faHOV3>tv;C?$p%@p?G^sxO*Nx~x2Go7Uz? z8^gQX0?m?KwWHNXmtZk6mo^)qe!qeNJRD*9<|QNru^p1%OBZD4>EhLS6MJaEEHUJ$ zWvAoV?bIY(5?;YN^_)DN`Kgbu4J^LWNq=Z}HGb5l$vkTY&c)=HnyC8k@RppKUAOZE zB3g5c?%pFoDXSDJ$GSQ03-c*)5MFEE@#YIa9d0EQ>Ve+Am|k%OjvaI@l*=f&lyRMr zz{H7sXYryvP%Zw6*Vbd|lYAIWk1R}(jw2bKcm+z0ssm2X=6=kSVmdN+gqIfR9lv2%*#{ir?N`=) z!g4Mf8o6uVZG_g(05kvH8K{(+*dEL@7}gM`j<22Tb^G0uvC@<;Z@HFD*>k&v$6!)U zA4>41#UJ0f-mIF z=3AlwbTrAqay{K5hr$Uph%U69}+&rKu~ zAMdZxVqpBkiWRXz?ghsjr)#UaliON0%~=CQ4=Asvxp`Nt4hC$Ce|!W?r@nmdvd^2dwu5>~8im#! zsN+2DE2(8=+CC)gtM8KpDzy?;J5hxFF!VJX*S z;A($dYP0ddEgi}LOW>32Swwq)*=lrJBhB(ode=&qQptSZ>+0m@G+*@`wXo8bPedoS zZEdF=r-lyOjf=SZRG_))eU9D5+SYe5ABjJ?;TmA5dB8o{B(#OBOiT$-dVTp3zRgm! zJeVx%mLu;bL81OH@Td(iVu;LFAvn&dV< z<25hgSadeloHwQ{dDH6j7(k4YDO~9p=8n`y4`UNd!{SW;=~@}6SPp%u7XHRFC`NEW z1woN+ND%l#rcYxQ2iB@xLk~#kAQFMAok_W^K>_*~&SmXfFx?|p@Goy_&P7Y^jv~&7 zc;vvBVOHy(u|Om(5*A66Y&$rXE7+HMgN>G}=;l*Z*(pyTDa1Cf?@$q>c@WhLgP6uQlpua4*G3_b>&`q?grrZghJd|$`)V*}iK zH>~H=Wpp6B#Sb>#pU9rxSaF!0FbkBSIiV7-;$}4);W-Q96|KKB{;Cdh7-v_zfZs2b zo&;z@K3#wTK#!IFk_fdyH2|-L8u)nol0e zL@$hUbl4Xw*J@ns@@t6FvT@gn)=vBN6cw*)$0q(hALIvtJ?Fbd)6q7y4Rm(2ju&bm zKYo96C1klPR>j|NWhFbFQk8CjGPp&C75 zudR8p{2rd7HX~#2giWwB=;8@;YBmwWs~~ggGuNVZz-YC;_q`P?)**+iruuJ4_bT4H zR=x&2NA17(H)K^cczfZ3nwOP*{0Mx-D9 zlGN9$u>v}T=@+Vo&SCPnEB88Ua zG}@bA7v3j}?fQyc=~?a_aa&&DacKo(oX+aIf2>5v5z_HF^eY9ft$ie6XRw(@xjv0F z@Pw1h<)Qe18gT9 z#MxC!fOvVp;<}>VjV_%DO>Y~pvM92FJ8rwNseI|W}kXeE~dsVhp{ue1ez+b;?egevJu7K+}fL5>ZbjTL}K2qJk zt3FAmn6aPVai8uw0HbbqXVYZ}5x?CXk(8k`f5KC>j#M`?@?-^H+&8Yc$Y0>IwAq-m z%l^n;tv-j7l*Q^{QRnhCQpp7RY1)#DW!8RU#Hu0N|A9(Tqh6e*_1;N{!dR7%U| zompB9@%(;ba{sycu@k8duTlZ17*qy6PxXR@=HFA#p@puP#rfwhmSMkna?gn-lfx|h z>|>()W3HBKh9iwa-W#i+>kRxwQB;|P^6QuDR^kW0CQ`Lkho!$Ly1y5PDcigXT`=CB z)-?E|gF{Ig_b^{;jxfsGh$Jd3W~X5N{A6#M(2P4}i5}@%*D(QIjE5Ouz z7E&WnTJR;(ph_u`#4$pr``Scpn$6PdxaTMGAZ04_UE|UwfUm(Yh0Cpt#Kd_9<{GznEw>n8dBuydMiGX6L#v@2L!4)Z2XX?8hM z!V*E$wh6QYx>93?#abvT&#=waoPEER-NvIgeRceB3}}jIk!UaK;jf7Q6LuMhLzr5% z8@eOVD|jgt>;GJ+>OAhTMkz>ZE(>@oR-fH0f5z=p0$@n)qS4vtPgfz4a;S^!e8-Du zoCtU5+(jc`^I{5T-^*nKUGScny}l*WMlV@JkWf#jgb zp#E3vj$Qv~y6SNsL@AYc^TP~whh;)GK>|)v-s98F3idH?^`B|*i7$hz)|~rMb${mN z6)v4nJHfL_v3YDk+&dky!W#fRDD-M}udTc>-Nf8{7xzjHW14f~o!lV~HpOEYG1u}1 ze21Jb_8R>mN`^@>=a!R}>r4~9lryK4-d_x+;B#~CPlA;M7MeZrmYDqdj_-{cN~(~^qE&-5o)uJ?-!RIm0fnld(=-(d-?83AJVjNgsMMX`tMl-+ zr7DL%ahX2L_*=^8bDkieoPck{5KUHtydA6jVnol#tTngw;Maowsr}*DNA-E?8XtRc z`kGi3v{)4-5{(&eKRCJ_HmidD;4{WS$m9H+nrhagr)JZh~>?v(+m{O!6Kd`SK4#=FAHX3 zdv!-gkCC@@N-4zZ207N*VaeZ5w@VriDO*iw32%mcu2OCaR^3|=Pf)Pw!?*sY_t2QV*X= zu_1K~VHfFAM@!%+&&db82R#7jpWn>SOl zjd2|;)W-?R!s$5;qLX|5jVP0Lvq8veC@D1S-sa=u!R)Jrz(vb1ntr~#c?A(O2)G;N z*z@*4XL?nDlV^=FH`>*-*duN_YJKcW>dY_X&h8L&Us$9c_<}$UTk?=d){#x)uJvohM zm0FRuCS&x^RGG!v8yPEF@FbwcFtVW^?+kV?F*&ad6H@9)Hd!j#_KL*QssoWP3_#Oh z9;am}BDLtByI@WtCbkNljxJQByVTiP@7=mmyP50Hpe-b}45dWvm& z%F3ReW*a0}fies$E{hwnAWXx^j~o;xfavOvHdJ_qWE5=$nJSfj^o1qucnrK%Bqf}4 z4F59S=h*Kn5mmk7Bdcktpw*5np#8sgqg(V8=okahRl!q*f)#i~NoTw|{bhP6L~Qxe zH)?Q041x$gf^`u?yuwFZ#Mb}uOC1hsaQ(mxc+A>&ybNui>ucY}OmKDWD=Mt67IC8u z%nnO=*2;`i&oQt&JiOmGZcAD|HYLqg->S0;?lJGnITY0i+KXqvW$Q^TyJl=MuEHL} zUdI%{_75Rif!lVsz=y@^870(`@))_v{7AEp4Ymn6|IrZP(9gC|4C=!RnG0C{3Qlc^ zN0Bc-e}ji6DGJwT@2FkD}P2{&JIBov;wyq#P!5V zr=;0g)SwnFi+SF%vMK0AumiRJVvli52o@AU!{nH@zv)uh*=BQ=3gnUfzA**O_e<#*6LG z+tJ0fLE&7uhE^^5Uk#5oXNDB#g_f4>*|LtyU5I)jWxMHgs?l=%_H)bxD{AZu_TPf3 z?f$o2f}o^O!J>pN*_dzP8O8g#HySW;W%r!=DK-FSLFtJnS{6q%oQ0MYKc)){Q&D?? zxSTl1j-{N$j|BH&cFrHG%xN{nbeZCnXtdLj2RF+K*Kk6|T713M3RUouZR1^t47FNP z8kZVo-uA2>RUdvCl^`-uybQ|nX(-lhIB714foEK9NN!i|uXsGTKL!t+t>~%F;8W6+ zxTlL>DdX{k8v9MMZUJo$r;jVyTNXS|yYl?^mDGXJ+8}-tf zEW+9#r#zzdEV~e%Eu?~sI!EyelGKIIGCo|ThghtxX6v&9YVol*;u0#HI`oswBBmrs z1@ikc7~~@fO&EeYYO1-^hi5`z+}~fMcyJ~vYxkgAT1?-rTot$t7k}JZ%-Ol#beTJ?mtwWZ`8hi z3Ktw9uw_%kp6pZ^Fv!r9B;EQ6zFid0msS zENKfQ1PQU1qq-)FS=%PDoomC=6~l(5JM7AhC8wFJ?#{75vZ7jxH4}UKfwwUqI@m|J zdMjC$PjM{*2d#<~$Mzd%Jltzt(mhm%Z=v6mHJ+<_$w6aF5nOGrM0XWFj6v`Rs5ZY+F!)cCjp%_xQGS8SSFt{Y_$mOELy)_+Y|0mehq zFckelsbr5-fo;oq0#N@0^zmia`+%z6R&#yqc_Jgdp7xXq>`6xgb$AMGF}syaZ(THX z#N4nhM!mna>kF~TYMDmmuoxqFhZMYeernj{GRoD16{A|%EfT55K|?&NhRY|LUCr+P zO}kvVWb40@^-&0mf6i!aPI=K5PI{RWj`ne(G^mec{DaXP(=RGvS6V7yFRj!oq#~t( zfjBp0K^IqAu1gN}rU=eIHThOOZ!%dD*miI_$ZlY#IBU}sTybTPo3+^vZF^&u$T#TrUr$_a*H zU?KfP1M_+xH%wDxekI_8=fm8I=ZrV&+5Ry5jVa`jXA?JeChS=V5&QN3kqlxg4p(v^ zJ2kn6z_!sBCacbPL%~a_`G%#SvMqQ2h|_wYv(tX6Oq%GuTat@G&93@8rwOTc zka|#dk)Pnz3)y^=LvE3cqog<1!@c*nW9H`j5~ke6DWry?QAQgPuU$$2)~ykio&(^E zL>8R}xeaObJPGiO>TF5!9;e4h6T^cW{@CRSjq7w7`It@|c)>;HvrJ*b%Vsw^z({5w zi^$zlTB;-4%$8fx7e919VIN=<9kqYB-(-^FPGgtJ5T85tL zF?WPSZYTw~1GK&f-_^NfaCrZUYhAmitmHTX-|W-G(kuS~E$i2Qdc8SD@uvglX&~T= z*ixh@RE2)NKx$Yc2N9qU4am8G|3LZsZ}&yQWE@^qpNn+|d8Hmpx)k0yeZ#hKm7nM2 z{05mrc1`PHTDg8@In4d-c@B5M^1P=Sn33Xaa1=LM(zwG=O|QqE4dT;29g_b9aO@eg zl0%=%?kxa>D@WtwIRxEPW#{?JWUXf+@`+J$iA{bUsGIKoOUEM&Qmes2-4UfFl!YzA zDwH7hQ@-uzlZ2e_W)sxk_lpZXY(Ypy2kO%yjFz3^tl&$Wzn&@((gMb?U4GP*46(gD z0~nJ{2r64}urzwb$NBG#Qgc6q<{$6qV}LbMwOrp(<+aAAeTQb0f2IAFE0Rix{hPNP z?I%!-y4_EAP4aeu=&B>mjg=D~>t{`-*Rq43%$%`+lUrhegKMM_f?9~2-;YcUZsaTM zrBW|0#U4R@;&FILuQv$DA4|n_RQ(CP_eORKh5$rj2QhanHaXIp=Cry8{Q87BsXUeE z{uWDtb>=3x0cSbaEwhiyq)#yp^prWVyx8DE?M|aF*Z?NxeM6fuqX8U#lK?&`$&T!J z-qum&I=ONHj!4;j{&KUBNc;5cayUoz*PY*R%Tlu0n<#gb^tujNO3=CL`^5KfSZlpA z-fwh42#2QDn4_ps|3#6^M@C(mxVQ$#bUj|^fjj_mTIOVA7{FuD?Cs&A){{l$OazOK|?LfQmqbgvGHX-U+*g>nn=HKMU&*V8d*!^hmd-%bM1 z+iIUNfc7i??rGNi+=BDH8+}&F`=)3R_S5A)&NVFx*@O4ayJ)}GmR09u{v+-AMmwLy zQ*yfr-7gKii{u|NqD7*W!?l}@tJ6G3`L?GX)cpmUukUHD+#*Q%OgHFH=ojh4eBsq! zx{#+M4M&nxySEyC;f)mESS3*b?|=08`|VGBklXmP#T>2H|QZ zbr?YP#!e5%BR-cNy6xoKG1C4iAgurk4*Osn+KFrZR`ZtA)b^H>6Q$1|CLc6O)YX;6 zXYrz?CVcS3#)uSL{G4GsJ$aFSo^OONN5K`&~?}~?_Fui6S+k}vf z{v@?0l1kFRkF_Y{#|M5(7mP1Ctp3%|*9+oL+KtKnwMJx3}g`2|y1!8)h zM83tb-G43l@0U8+`k@vvy|8D2C``+a9DCuKBE>A7lI53{tujwJJ}2?+jvEb{>-qE} zLdgR!=yyGN+_^sQV1~Y~heiGeFZteYgb_x32N+25-YVywSjX!~Ma6+B){g!D0)JIc zSa6>{ZF<@Xy8q4%Ryl6Jsq)=!wxAydM!ADu&!A08^Yv8k{s9L~wcH%@w&$e(SMU9z z0XuFy{cW~!1%|~fgbvGQgMPG1Aa_y81y`K9%sxCNq?q3U8j_-zA3z9jsf*eyH5)U5 zHlWyO5%wb2wcf-7N)uL|v8nJ3Et!DDgI)RP|7oUM5t zY~{r&)#>J9&URc>ENVW$9<6GUAC2mF2%3x62{>_m0@^JBk4^SsCulj{$NSlB>{1%? zyZac(1Y{t%6HaNny$$CX^>*mD|P0hsXQgkJRV!%&5)E$LNlZD>E6PVC%m&u|c>0*~5sJlRv_k zCgy5$6%ISo{z^5ye>PS*Ein#yB?P)cV0}$9DjVr_m}=P183r=|N{DA#qRW*=a}W;^ zR%cR^17=?919UQ>Yp?2ab0os-;2oaQxsS2y@BKeB7%25ck`=S1Jgf^Y^+7^1WjmFW zIgf$*NLJMc(Cpk?ES-^(3j#UVPg>i)C<(A+3SU3O5+R7%d=a62g}QkYbF&dC;!f?M zwcgflymtTx8)5Y`oR9@LnB1{kB3(jI&~wH}X&bJdIsu0z?3B)f(DR1i$Zs@#K}Nx{ z3*iTeT}$s3@jYpdQ}CZ~)zX4JJHsh=BgHQWqDifee|~SZ6;XopZx_5y1fv7o;1}r1 z+~5!U3|b8|lZ;V)?O7ywxKAo*2Xy-0TPZjy86B>I*w{M zZ{UnAon!%8JEz0sn=urBd@liFTn(7I^>7}ka$$fcymkG(kM~`=%OAyn-~cZ1f^ynG zP2viQK!ogZrq5Gw^{0H(sCOx8gbwBt6IhPz>M_irH@=U&qXK5Y&R@Uvdla)#KQLaA zH=sVdF!*P^4VZJ6o=e8ngxTCy-C&zA06Gn;mjgIT_RhxjV50!qUG2^>AC}D3jL2WA zWFGJTqoa5m^$x|fkEOFJu<1*@EE`Xlf%Omnt*C0n#Qm~MUSksG+Bd8Xv&fv+4R1;u z6+G1f^zOeLz5)TH>5BZ(k^Q1sgEyOOu377m2F|?r+ZlX8*@E9acA->`OqS!FCTTM) zopD87sPZ9|m)|dRralOG-W>grPfg|Buo-(}e(+0Di%Q>fn3max!u%l9bSn~2>1T8y zhZdP(ES*s+M>hTU7=%gwTi1|3aJwA_9Ai(Ex9V;^!XXi;M7hi2)&FzG;d#LI7mhD`>Wx&>3FbFpc(H>c5NsdY8+9Ij1pUeYUDk(4gO|;bSg<*&1qiYRkE0Ga7oa zn03|MmfuyxvElvn_75lXis?2N&r`8G{@{qopvT`E>F}~J|DV31mFo|_;q}vl&Dz&V zYtT{6pHgKX6S6ZBbJVKKk$&tD2PKF#ta%~J*VK>nb8*WNbHWuT)w%(7Jq5TkY3ePhexCDo0 zLoOgp`f}D!VQZf~x?%Ip1TLhpH{y)oWOgYw|NsTi}-H9Kq|I(`KWg7(?6 zbqme#L_H}YcTn(p%NaF%tmz=YMr_ZzmK_&Zzv(8 zv>KlQaQj}?Y(&F7rEJ}sHn{Ce^ubL_hL(23R{)+|jT-TJWc` zc5{A~4<;fSLCURle$5NN6fb&CDg|5+jB5qf*=4s<*x@zLCQX7uFh0kM9G9!hp#HYL z$=U!GJ;2ILoaH+5%7&RwMxnt*E$9z{4eBQYQTX?Hhya036HP~iO6hYREdI4!2f-h5K2B_Jd1YqMQ4OuA%F0pWI8fL{RIkKcdA(yd5q*s6Qfe_s0(XxcpmYr^5{* zL(x5e8*j}0xXT;OiC6lp-SCKhvdlgnhmV^ekpoA`qsWj*SjFW|6ktI({#|j-18=q% zugS>`k4b$RB2a%6O(2Z8`-q09t4KV>C5 zk_}Jhy2%f==XW{YemL^;vl3{pL-vhQsy}j(bTb!M%DKU^6NLsQM#E7egQpr6ux~7C zyQ=|Wp8r5lOJqGoD~G?wC~$-Bkd4RgLu08AFikV{O9A_=r2Ho}gpZiM0tVSXS*s6p z5`c8?Y;DpJw5s0-GJ*1~&pp!x8Z@4~3zLOB>q`;>U$>G|#q*-)Dj)_ZOQr~|bVm)m z6G}W0?_lJBv!pw_B-9RFtK7+N`_MW6w#@F(K${yBYFka1IHL2Ak59YPkti|^4&^s*EnBkLRe(-2PlX3T{pQ~ zcsvERD<^_zL+9~MX5)P08;3MBSS$@yjxjQ>eiNc#wUIJ4wDGw<^6^O8FPyVU=Mha$ z8YjOJ`xSUyf^4OM%XY0o&aENd_q>=#3Yyci?azU>3DM-sQBwP{KuImr`0R$<(OPu+^YR*= z)1bsYt57oySS()SE3#OT)6jVJQ&9cyKE+I#TR&O2Eye*+cT`rHqz+iiSjSmi* zW?kUr57%-@vKN;-<_n{${e*cpxZWncG!M&9J<7-8hqoj5J_2}XW>kYpb1^5JeR{6`Q-l*7CPfxYm$ITLX ztkwm@mBtS~WejAdK*ypROU?w7t!Gw<}lg-g~v17><)*szsRCJHQ~QsH*JpZ9>7k>nCHcdNTgNud#A^uov8kk(>Weq{SAkly^-JxoQKJI_R zrRaezs5pn#&_%ZzK@>J!0p+Ci_IHUK7JCmTuupplBn=`A5Qy10&Y4&db~Ap(V$o;` z*O?PUd@>L6fWeF^cLL@lP*(}{A|J*uYyzKh@dgbgY)rw7LRR7|1#3{O=LMyDz z1{(l@gRY80E`F<*(#$QSIUEwZswW9pEpF%(PzrM8$l(^OyzXPz0gOFR4o&ROAPR3m z2-|2tgBcgKl2=DR;|1N})ME>9+5$E1=2%dQFmW`fF+!5aNlFP+Y9&5rYIlKZYYXNB zw*KEM$FD_-XbxS`*R`wcRo^hixhurgWYQc@bDs@~CB08&KeEH>IjA@^4&_^maBVTr zLA@$rdfih$$nNscnMbA2G`NWcv?gP{d3^d$n-u`O5XON;lA>O(C@f|WY9K(b?*Uni z4Y^r~QdaoFb)N{A6-GCD`ycb7;{V)AZ%N4#wgX%$#>h{1ktOKk&H@Y?Yay?EBh5yH z8!Az1OCsCwFcCKb-Ry=r&-E4SV!c z5*vx(amNinaw!y957L53Z|lPZ0ai&3l9|WlJ_#+dm@b#a?}%Wg<--fDFpX9RQxbOM zibwv)i3xSU7UEYz^SF(t^3-8-62JQqFe-y4=ZAT&Grl@Dfe&N!gSsOgYn;z!i1pZL zux6|M>&7(RwNz22ifeK!m*FbbiuM|z;oi)~skJGZX|p@KLNe!Bif5;2cBZ@4Z){Z@ z#A1KMTPh65DoY?|rq7w#XO(}RM)Oxx=Il8NEr@?3}u$cc(1(qKO$LGBai-%goF z5H;LuC@w8+$Yt`iM_PAKc4ISg=G`E0N7VVgaDyt{=T(4!*gz7|g${x5#u!_`-ysp9 zLwn3gx0bY_6RZnYSyo+E0a2d*?L?IGUisW^->vfL4h--x$p5W;-RB~@Pe1{Ox}%^I$H4FgKPF>| z1ywpd6S^!ye1^i+pEaQ_7zn(#+wYIJd4v!|WmA_bxE#cEf3(xa!Bz#0k2WP61b67- zR+7F|oAYz|xuoppWF(G4NWFx`MxB|1!Ts$+#~TY-tf(`8aEersnhP*}%4s_i{5k*oiy!>=zri940wv3=-9ORL z&}5v$hO)Z4>mFjHD&>IL+h3<(uU)^0)aLZl;A={gz$s=G`3BHpdS5dasr`Td3IQpdy#{)yIoGrSygG zd$frI)&1l&B2TS~_^i5b(scGrJQ4|L^8da#DKA4 z+%*H6J4){37GoEve(x0TSH8t1MWK+2YNVkHYEWnKhel4D!Xc}=dvnv zoz{Nj@c)oAApxlcj24;R34GHXM(1BzFN?ag{w6n(kxz1d@4@1`ic_No zR`;nOU=PF~9{~N?*azDfPpj!@V4mUNv~)>TYAEg<3w;r980iH}64iO#|ASWzWVTk)7cEz<9+>pLe))N-;n_VD?g>5;>ch+{zog)_vb8cMbGq zOP(o|n?=V&jGfgki5z|~e`*>}GWrY`7l(4(ix?j|A!uOJ#Vv7unFewy&l8ZgXZ_vOLTp;Bxqeb`^`e zsCbE~=#kG<<)w&!!kjoXfY>eJ9zAup>eLn@F!aF^Oz8d?QfS&sVrO|U$rB$VP^up9 z{|faNF>mxq`-4)Ot3J*Y3A-Y><=dkL!TiW05y0ee{9T}!8A{yARXAB>=E+Jm-u**md?|K6*U+>UCx+l^n)Q(xkP73C5bOX02NvND|Z$7gs9>t@Go z1OAHX)8<9=i3F@=3;y$4sdgQ)^ZR;P4P$?f>#dfUgj$@h%h}douPmEi2OZeOg_tW6 z4;SAl#XlBiRveI#4T$)}L`NQ-u9M|5=PGntFST+MxYl`3Qr_?{qCk;nBVc zI*sCqa~nY@zrfVW@_rV%Qu4Z*o^=9uU1VWAE~GVhmTmkE!)U>?A+J+Y^eo%jh#aIP zAej7Eq+4t(`3Vx&2Ix@n45Gw5?pkrK_+ndF#DY0Rp3J*1|24(4W6}uuO~~W{spvwN1Gug zTY##1_Q>cEIh%3Dyg`aaJg004DE5#o2INmL-^lIsNQG@MZWsomI= zgh8LszC*LVae}U1aoUobW@vl}FO=pOdL3%gc(mRE-Z8v8j0^d`oowNz^nY=NLha!4 z#t7@aO*AM@6@}n%emnnsQUm+sF}$>|!#luWR08CmWHVrYj3el{Cwn563&h#tN$BN* zzaP>oS=zCP^Oc*DlLRT%7|&Dly|mJ-9Ow3h#lnuEU0;!y@|jKYHfwul5_8$yqwP)B z2l3%~bzqQr<=LF@_3+vA^`DWiE$X#BP<;00sz`pA^m5<-_HzB>U{*NuWzxF2W_Qhw ze{KWZ>@-i~j&^mL^CQ|h?Wrx;irl@aSa50I{sm>!2&34p_h)#@P|36%Sp)LjY^4vY zJ|A+dIj;A=p*6pY1w~9!vh*9npUBLh{Q?;ULw0+qwqZLg72u_xKP@g{vtAf8KGFrT z8})j!(zTuK)6v?@BEd2F9lLD|2ICEi;;SK&wciQdvAc7uw4JnIcqldQ! zHG+`jbwrlr$ZZ$q#!4+LT=nDrh5@nL*3DAwyPxx^aOImN;Zy?YN)!E8!Rkod_Nc0( z4*g`VJ)C~IZt!p}J2KKJKte=TLfJL{{qLiZ6h6HQCe_8X{jMUn^*neaP~x)pgG_K$ zE6fyZAg@r1YqZ^T=W@|R(5p8fG8rSpiuLMGT-o_{9X|s?O!MljnjE=rW@BQ z*(uoo`Ll=1Nr|L3J#lI9ikq`k;Es>d_~2}=CWUsZX>w+5g9MUEf5eejZ`|2X9NAYw zSgid!g6&oYA&+Z}O<(qtO7Bd3^=-9v{Mo=Q!`UYg0Jnj?A1eQH0XgQb;0ejJTwTFz zL}SOTAtIy5SoVObYbitDE`aCwISuQ%1aAJynf$FjSY+C@9SG4 zGuHk$>=Bmg7yi@b-n5X)V-%plguRXE*0EaFfL}wetHh5K$~pMWoA`CdbTKo;Vsi7_ zeVfJT(#pP^p=ws=9;XJ%C!n5h|Fy!FT;m`E?UzQyIalSH zg;EBJB+_h+z1r9{GKrDUlRB9ck&2_g3l$|bn~vORcdl2SXF-&0ER~5q(<{az=wwq& z;-?f^lxM^!EL|NMk)UXWij6Z=bgo1Lj9oAH(}v9L(HDoS&g!AA(hvietL2?TI*ab> z*T}|Z!B~scJoUfIZdkCL%B?W5xA)_RsrTn4f#JpB0Qa&JPh7Sh5t<EXacj%KOq6E~9>o6=j&bC#Gr@dRiPVW042qnjVy*CbjWj#4tf&I|b+4mPYAa8A>LNm9`?keCsqaj4b- zN}JQX1uxiqz0HD=MYwtwICH%zJ@v=YAZbrABUIC1U5{LO(L6(z5O#cGl%B5q@9<)j z)MGl3LKyL=ECS85$!?(#uq;YBb7|i?*d>j~ENh0GXX@8;orseNc_GNulad~|d2-m%%bq7~JntsO;^?v%s2TKy zrCyO}RCzwPc9qSiS@Uh_v$9_Z-W+EvnZ|hYr2aNv9%+?0;!h)tQX=JvslYA0)Phh^ ziX)Dzsap;7kS#P8$e;?5veFb9BM`z$`(hjZeOW~lqZGpNeRFvlQDwZvxX|t$bQ<9x zTEW-~RB}a0r%t|uW`ro_BZ6z(bn*$qWzwYis5*p#ze3a_gD@$m9ODZ!My)9HzkFyv zqdQt`j{WorV`#7-H4uqJLHv!!X11uExW32q8D)U4@LjY90_7CCn=_=EmiMCt!fN3a<42(AR@lZ9Zeug`zaBhabvM5q;Fy#^o8&11NC$Y-h<@tR z?*UeB4@YF@L_=={PaZS1($OPDexM4ibGF>>;Z+=d1Mr;uqvdy_O-ezC?Y!&vaRL zFHDEZ6Z+8RexR}NbnJQgQSP-~tPuDTL#@gXmhtUzH=d>>u1yxrZt~V0hkyu*^PTkIL+(j7G>UL&`jU+W6VIU!OW9^Nl=)h6ri3k=~T zZglOp=ki0eRp7hr)ZSlEq+-LahjK(oJwP1P@=_!VspHCLn()lNG)$Exk$5(3Z8UZV zsT8oDUH>I?OVTcPVP&V$P1@?MW`|uOp7jHzuusCFyBVJ6YSq+{(nP`P!j7nd=D$8KxWKppVQ>>g4!Kbp} z&~O_ulwJCWBXxhUh4(D)F>fw5nv=8*RR^X%(_+~i`3lK7vr@5_f@y=lasMj+ zdssF`pB&7mJ4sp1{rS?$+Zkvc2A>X=Y>ALsd`78ydX4GeI;o~Wff#hV8t0oL99Anr zmySxAF^(E!lpTK7E`|F>Yn3f*YK`+E+z zbF29rzIa?zy2lJWtRX1|k(BrDB^gWeb}BFK_m_VpCLhZAo4$6D-m$88D8?YP!d7ZE zXr(7W*~xuBBVxfx4RGyge!2;(-B~(%$0=A*;1e z!V7IZRxQ-i@p25tvL0RZ1>qbac%yE+$1$gf=zv6uSI%s&INm!MlG`62?)mMhcHEX!3zJIlxwid1I-reI~mzW*!FnltYbsyMFr@mc0uJl>&kB8?Z zvM3-<;o3GVh1u&0YUJuuEv79q^2Z_dn8G}B{xT_MIq2Qgy~&th%Phw2cf*MI1XgMR z(ZTF}O%r}lfZ_K(rZqsJ=|pCS3xoOpzZ5dU8KHv;_pcnMEMlPj<2!0z$U;}>ub2Y_Rc*{<)bsvKpT}aQ;a3PPH*a?W&5-gK zbw&0uY2F7vYQ<%$5w<)9kDr2W^E>rXWarrxuE(liy%8 zf!Knj7#=((=&(L4pz2(J(rAHnDIve{?ZzUwJ5f@&wUgGc9aZe=;GR;n4v$n`=wt>P zez>mN+K=@UxDccPW20AjT!ByUMsVbUwV^Hi z8dzLA89DCXUaO$dKs2{&Yy~Pb;Z}C44EdlNhgqWmb4%Y5wq9PzUiVJ+K+9n5>q$i#_*aNCOWW)S-D{RziIevlc1q zmdXrH<#EnI>A&lPf6Ih_Ui>yGI}x%rR|mfQTR%+lz){l0F{*3Lw;>}rL%2Ne zE4XJP{;Rn7`&|kMs}6O4hUp={X0X@D#6EFKVLpU7Qf`-PH#5H>nwaYCP*y}3opOm` zMHX%Ibc*jGd7s|#a-RyiJ(F3ey^;7rx%lLFmqgXgH`U-g{24X!a-u&|CD+Gf#$|t8 zqbVN5zEro(f_|K;ysgF{~VQH4t*6CNGE*aV74TT2C5 zjc}X%PoYEtcPf4HsXx&y_14J*gtPcA@R0x^D`Z1@(s@=NcX|PYU-9g5b*u~xd=LyoB;m8pa>6ByXYYcyJMjuy zaCOtRB;xTP+-jow(CCbUPr)dF>nq;nG(>9*H~!9bxC!#VcaDEPN^?PGhuy6M=X;6$ z`&l?xw@2+pBY3K`p8G43ZyO}3Z&_J%-scvClW&M?53(dqVm5rCfja*`anF@;X0}3NVU8u zpRONWJ{KD1RFle!>#KB4CYyeq3=_xSRHN~KT|cM5n`IExNQ?Qm_M8%1bu?0QYqICi z{J|8*Ccgx36Hgu!S#eJD`Ja8VvpAr$>&07+#lZUiWH>%(T#hsAPMdk+}+)R zL$Kh%-Q6L$1$TFM4Q{~+?hb*CySz%@?sv{T-S@rwou7QLsa;iT%{Av3V~!~bKJ#I$ znSnX$j`0X{eT(AUhnE{eP+c~kY3BF%I4iXNhF-S-WWbytT)@uSo8*~hZ7F9OU)P!{i3I{&K2iZU|t3KWAn_Q zyzNYvH_`N+;ImM&jsx>r+>;BfQU~>#r>lU5$BohbaBYL#g{9Le`;z(0z0z@wC9myI zjF0T58GKC^52QSR3OVzN19HlBgP@Rh-h$hFJTu*KT`WHYl?4^BO$$!?uVdm5p~IfTb$xC78tfFqHV z{mrM42_t;!$@6xm4vS8FWl?eC`%{8$qBk(TU`9&&V zLjp&c*05vie=elb@E*<$FWJhKE-_Dmd%v?bR@5Y~3g{%dCoYrm6lV4aleK>=xmZ|u zd|sc7eMU_&AQjF>z4gIW+lIk0E=pc*%>AyISPU>%;+Y3ff47byFE<6e5Fqq~Q!BYf zHqfrLFe%f$S}MUtn2{__Zl9h8cgOIALJ?m&S#6}Tm`(i2AY!)2AV#h%6nuM*@OgW2 zb;lontDoc+?l`(u)^6kV)uVbr4Un7Jn@ZsAi! zDS#}dI}oBiaQXu{;8}(SFEK3enRJ^8_k5mRE6ktj=xz?{PGm{6S^Zsi zxJRIh!|y75KQ#L9bYzKWLd6Ju?T~DxcoI?A}neo<95! zzY7upz56J@>lF45sTjK^)2#Im%V-uqo^B?4xf3>q3<4F;DX_PfM`(mWA`zBrRSDOJ z4z90WbL~UncDiL0J{JSYs?`Rp(tab!cMN4(owRFqFE`K*1KQe6)BPhV2x6-O|3NeL2I_#R&`vAG{Rr8XG`I|Rt7WH3y|2X{T(YI|5O zoisQtA-YeH8yrCsleaJrp{Smw(n5<&0B-3L+D+EUgdTnduU_t@ij!5!F^|dAP2YQ< zVx(IpVPHn~!x2qrPLebbQRM|?CS~z9+*GhNie2Q(zU)b>HLOym5y=4WL==#)WA&FH ztAZbvuZ4a-(d3^C-5i;PegpJgr0@2IE-6?o7Kz(lAKyBNnIVRq>F(kFIfMHjUcoQ?KUq8Kp>>E zpUUJSrixp}1Wg>|VliEoId@@^tPo)AP+k7+oEREo21lRp$1YKks^mY;JGy`UYfDjTU;pD;dQ`ZLLPOyrvr~==hYQB9 zxAiBY&ttz&3nzf45arxZBBvw4*OTfxYhwImBZ}`zCqI5=T*-kPayAM6Ie`2FclhVL z;=l6VfBa<_roT!Er~sbr+zJYnQ)bhkP@xkOFl)LwQ*Z~5<|}Y(2Q`&xwx%J=!c6kR z&lbw!LQZjR_(*2^Jf@Djm}RXhk&|WMvRJXvYqdpIb@9;2r?aUulCF7z(wIF7}bZd!0x++@sZmjgM9Z> z2B&C#cP>yEWJD|^ye}w!q@SAbk27P@z zB&H0iiHPW4%mblKCTO9~9hAmpL$2$3%I<;P8smkM-Vpl)^>|AjTVjYV2rQ+ckak+5 z3(GO{!*k3QMs1eKc?FD-w*`G)rPl9?v%vH>VGf5>T3>MJQ;Ajt$K}DIlBh`v+w)h* zSdp;i|C@*MPuuH1_8b}`WHB;?l)Dyl=gDDiVXvRv|B7sMRRy(Zem<`cIA6N$F#((^ z;+>a6?B5#xQ8!l5sTN&nh8N;6^`rA4u;4F{-wO4!TdO@mm!zP-Aj?NKA7Rtejb^yD zq=R=VC<77JxR8^;G`HZ;B3}fdh=Vphe2RFY^@uV7ZQkQA&+m}`EJOf2bh}(HG_hd8 zJ^sHFErNtM6G=dg?+Go|F$pa$_c|jUZ$0K)n{4=>W?+Sf5$IfZUj>0oteMVT6LM-o z7p#1z=M9X4^7-+A9{nfn&yv`1>DAFE``s(X?nLr5l{k=Un-0a%K+)M%W2sCbmCil% zixeybHM$ih$@%6o@LGT^Uba!I|Q+qj21T_yw$tVX?FAF5^z z;Dz+PE-2=$7vG2 zh5z$c|Npp2h`%>Q9JG4O!1p5bpV4SX=Xd|etoh^klGE!$>bI@c4*{BSKe=&SsDPCi zC&tjtha{iM6~dAQ&_5o6kW<6cJLa#w1Bvu2^K5Fn%_AK!vft)X>@Vla_96}ePg$4v zC<4J$)5%OlQ+T$d|2!^<9~^<|1{y3@8+KWvn&-xBab;MqS*M%_og-GO_F$crJQrM` z4$l-s@3~!SX3QM*@pu0By|EHfQR`IDdqhfw{(mRv2*4M3LQXMu*bJ1cIEv| zU;!xK$$ib;bBMuWqc)BA+F4kf`ok&_8DioUWjIa@qRPsBv3l1 zDoNl*6UbN`7O#wdl%W5&r_NXCUeeeq1R-Kcr<3VWm+o#!4AT(QBSum0Bb?Bhukb&w z_qNDp+9x(4I%&pCl8>Z!U(47}f{W91uSI4<61g2s7ao8I01+5Edx=F?Se#3PIXDH( zZ#m@f)MMt1=+aT!}Nj{s-9^&G;^#}UyY95Vdpv%|Z&5_6;vAxPau6d-F4 zOQgjhO@?ceOr);%wI4^lz9 zLO*%`tw2i!c@zL*tI=m1We_nE{_ChO9KtOFWHO3D<6p#vq6v}-)xNOViWJIXH|y=U zw{H~xKIKs+$B6UDD%TbDI3BUHfqeufslwQsVf};}*D}i#_x9+LdAM9Zn!yYK0nSaC zbGfs0EJS?hYMw=ZA#pta#aic;m4>g=7>|-}gGzM{OCmf68IE&`k6WQcM@MFsnDDa1 z2W;3|c{Zc=P%o4n$6hU9vNR4OZ10yFPK8GRNhb1s4kt$whLEB(Az~EweR<&ol3VBK zi5vnf1(c(#DxGkd_lzRRW+SBFA;6X9+y0+cjGeUka-|y!HGJp)h%mRtn0|n5w(aq= z45tWhKqBK47r)*ka~sczn$z=w{?QA+r+IHdsgq{x+~vWTY-gLRJ)aPeHkwOx^!+<~ z(4I6FKt_C=Lpig7Iw`Nib?-t}BE8wB_>BJvqgQo_+-NZJ+AyL>wcwmgskjf#Pl(|o zze^tS1y-RDe#>i{r8ogNQH(4j8%Q@rEtHRvySvh0kw2FCv^9NTF$Ro6geU|0Wk4b? zUm7eFJp~p|4m-Cm$IO3UhfjcW2+*`7qCO}B3G$8H<6MH`=gtGm)?OWozl&@Ipg15k z;nfzJ--tad$2b)KoVD@_HrlQzhiIvUr+^A#H|hVKldnHQsErJi>ALRjG_a?2_(R)4 z=`XbsN=PjPAZv)u-thT1kE86pWRo0!QStZ!$Vm~PFNBC+y#ij>+gZIl3rKpB>`!h9 z8bpF1J@wJ7fpQSFjd|$i`rDRBFRv299WFs~U${yW>K813<*x z{&|V@c{_C-rS0hV!&PpQqv1K1{!Y$JVqXDGybI7Ew&s6=MjEW2R^C5QiMS%n%$4i% zY^%y$0txXH5DgC3*1*$B{xoNj0$Z&B<}QA8yJ8bHlSB<6MH7j$axDbvW%nCy@E!u@ zU93X@|#5aNQ0R^&*o#dVBjPoadhex3EmG^owA^rcn_vcU$u!;Ht z?*8Y?0yJ`(q{uMUcdkuCl!Rvs3ns>6q!GO zbWpcYI~SbZ$ojusA%hg2&1N~^aV_ROjvoi+=%J z{8x!Jb+Ig>_(lJ-HWU(jm|18xH zRMK^tcpa>*UH=_EYO(c5=yUkeEFD}Om z#ZtC! z1>T;KJOGgKVA#5OU4-rjy^GJ)JF-|kw0mI8;NhM|+jPSbYbGuGx6jF68ow!&W%_z; zVm@vLc22lE!X5o}>_1|rw)|aw7=XmUl)%-!P@%2Z{rntp#k)?BsMREAzVTf@^$E94+hPV6}8qX%HAlJNOeVy=`kr<8kyF3I;sh``Y}&D&8yd3RZp^&{361IY)!b8mtz* z8&{i3#kQ&RJ4kx%#=_u;A5tcsF5q)-FlBLnLNQE%ha0s{y^F3Y#cfA(0>f|y_i@Vt zL?n{K!3d+G5i+y!XW#0A|CNdPvk7k+-^iw~ugbAo%*QQo)%X&XeeSYK(_zHHhy-<& zX1UdUmkW!XW6$!YR7AWg7Vagwd+LNF&;qK>hU~9C5G2tCdA{^YsaEhKQ`1yZOkLJ8${BEqdSziag6Y zeWS+o<@lu9{HP9#P04NH9vHV%X}36{2CVD)Wiq{`#}jy>WC-gW+gP!cAK5JS z+g_X3HC>fEeHPE?tDFI&kSu7Lm772|twIau<<=8|g(I4T!NRfw)I`_AsRM;nSD<=K zDlxeoY2Iy1Rj+dUH8R9oO9q-WC|`Isi@hV;BWd^wXaX}u^uDbprg2*DJ}cPr0uv;P zE-)!aEK;F!fa)#Z-O-d>bq^}rO9YEny$H}(&8AHEmAXxnDm`{R05DVaX5XdTg`v3l zc!`0Mxm{1WqPTvN3R<#5c#}{2d7|>>t0x7-0Z@@N9ZN?A9!B7Cx(nYT!622y_4Qb8@B;V*#x$al%;^K%nd3d(t=xR7C{>H~M*+XxbEr4H3 zcvZ(G;^WPIwdzIqC39!F^4L`Lt6kuEUW@nByXE#f(QpE66ksxA#2L2OVxBl*q194V zlQ5R^r_{E*#Owm7^ZU=WGqVau?XK3zS@RiCBref}{4(jmRAE?j>eI7oSr|qUa3Z@r zanMHZ=L`T1XM^vXkF>-umz#N~A%fP@DKgX%`|mh3H$Y%2UU4`;(fyH%21e@OoCzeq zYL$}^H0^`-*zom5^#}Q%#*yhyQ_;|{c^`|N+)osd#TjX$O&{%5DT|lJ$4mqL?}qAk zM`qd6=>ao1`&=!cGHI6JkW zL|%TIN;9$m90IS$%-L~4*$KGzJ6ynZT&_78y&EOlA0hmt`8k^VMZ{%*MLHwX|P=RPDrgutdx`? zr~sV;dQWAS5%u5dw3&Aha&wzxmr?SzA++yF{CT?O6g*&=SW^Z~Z$ZYS{oS)rkedD) zx!Wo;_hFAcHL#-M`&W~$YLgNe_7vy$N_lQdANgvsEiZ@0G*5GTub7a{o5D@`x=;0v zcM-StO2snVn!c!6th7-qA&<7387yxHJBI$eV0j(VmZ*5>I6Liq zsOKM1YGRQK2$e}##%vS~jVXYD3N6|Gb{Gqx3XGjUXkKQ1GNuI47;kSFs@eR6L*hkz zmU7P@iZ0gceBw5D+<5hEaFX`wN0gMNJv*Ef7?xSk^NiYofQRNrTiM1!gV48H)5C>L z9)2w@*Icr`lK4RlF|00#7M{jw`ALN8CHvH=48L#j_`w5(hGLJn(Plp2BYVk#)&$@Y z{3D`b{4C<%ApqYX(fC?#PX%L(CR6qjZO;?V?Nm4+%|gb&8Sj={4=!M z#xWImBZ5KX2o`{A4$vO*<>FE1V5Z4-$!Qsg9TOh9pYT60TOj{s+73R}1`3>I61;*@ z3q&=GwQakR+H?D3K#9PvsIZ3INxA3^ED+dl)IAhM#V%mTQ#{|1H;wS940zlqlz49yqoo@!SVJfg=m7811W)7#6G9-4mVxaQJZ zU$Q|OU~CuwPUpQ^qr>480zbF1()f1WkJJl0L;b7+;6&p(2NR-XM+IT`d#~fa9Q)kQ zq(+wiErkT&O`&+S9@?U^$=?OQTs3COD9!0;wFgS~9yShE2x>}AZu^fUOk!>lxYT^) z)E^ksTYq4e>&jn{hNm1^bsO|s&DXUWZ7N_x3`=lmb{NxiPSrJ5e(V}L=F^a^Qf7@h zhv!u;(3CFLZ`n`#)1Vmy8Nq3VgREgPs#XvqAh0dE7f!&&8STACMit`I_GBqh#c9yD8-uv(@!qQ@XZ>-?=Jv$x_J9TZF**puEf0l z#{{=vV06ME`Pm_K4nr@sS1!EeVwt?BRz4M-dXA5`$Dl5+TT`hvIOr}v>O{jmWH=%e zG*@j~{nlY2Mrt_l!2Ea#)NgBTC=P{PWo*5KFu|Wy%@b+|j!&1J0bC&xY5!NAS8sZx ze4;*8ehr@|cl0Iqmsu!Fr zUTy2dSMyGbryD4fVyoINX$^+CC1~K@sQ8ZM zi~gp`zo90@iY0yIUwL+56vv+T;QSD zVYm_3Q4Np*w`&?w zchI~X>?!IhYC@t7>eB03$&U5&!b9eJw$_=5aV?e~9!`S?E*1#tq~j!!5HK!!s4@7C z>s8z?!o)ppkI7K(sZqU?)~oyTsI<%z9&{+{iDs*9UjxJ^Jh6u^@cF6F+kuXW!djv& zPDY@5;Fndt6P7by?x3jr@{*lALkx-bn2;IJ&|rG%!40bp&E9EPj06FHe~mSH(Q<*A zIYy^jM!x3lD)7K(knw(y6{*AJy<1M~oc{$6-}XI1@8I$vo%yu>;4G!zH2m~|@cEi% zxv6v8R>%pB%Anl!sq4nf@%#yX0PcQhkwVs2ipC;IRH2@HqXP~6$uL}Pwf9Eb_?)Xk z=L`td{=jfJ=RvN+H;E|x{gVggKlkT{cN;3<@g}?XB`QO=e-#}*zxE>qU0L9TK)S!+ zh@CF~d{C*h=GEea+X*VpE@eQFB-UKOp8Pl_EkfM;KUCI2JmNwvqA_z7x}5Q32i8^H z{(+(5L0crGl=!4WF>fEy%M(d4sT8AjyI8yF*2b!xBEqm3tI9D+%yrCVelQ&HObX)q zCq(%%F|;rL<&;Pbx0k32uCLd!l6HVwX0}^;^iYWzD=>Oa()3p<4*C`sDL^e-ilIFNd&WX62-7|(kcUC1q5sQoz{FA4oJu~` zR37J+c+~c`HzH0ZDLed=W&@X1ld7!Qy7oNkceOxtgFh&0Rd!F{Ua6xVm%c$xk)trq z=~x3Y9TOyx1hu3kst9RgOCAASLVutGprxk!sSA#e6$up)eG7(KxlArNjEPVzmXm*s zuKL!lO1^?AYCOGr>S3+kb)%*H^+4ZO96D9_SVVA_%I$ToUKMbdm@MEbo^j`|KU~q* zZ{;Bs`Oa;w^0ahaQ8R>K0PS!bau>(MB3bxejD<>mr-+`kw+B5*f}n?+UGHSRIGZQK zVnyHQfkL^!jYg|`-5XAGOn61(4sl0X_*0k+6?|TtBqEOE3C9|1sR~SgHnKxhEmZLQD@PRG`8-70(((ExQkBWDeeZepM(E@ymN5b*{vC&i( zKWSgI1*V>RU@Uc*l-s^lT~aufcL`s+EZ5jOZje&SrESmQog(iLN1|W5!&KkZRdJ=h z#8+{CBbto!5a{R%OnlcNskV&sr73(<7b|9ySLz6TJ$_q>nCZq$S)yz{oJ z6Wa=59&X-P9wHv0JyBf%Euoc^r8n$R1~5#vZ`0v|ddcchF20 zg!}_>NRD3JqWRy7d3XuX76}@q2m)UO^5H@#p;r%~`LRzV8)#II31JZLwvYS#tSMb=#%PkmvUqa5Gl6nbYpDhSTBIq_kY`XP_(2_&$D& zp>vK=dyczh?d`gL@-SBOR}%LXjMJL)0-E|30L75dR`S?=uE5ZsTe1H$i0AnEY_&N; zZBKs+Xs~2ZxAvye__?fpNy4uaLBw^A;Qe&!dcC6v$O+&zg`I@=$GHgVdm6773=4Bp z{PO7-xA@XRz;Uk(GwNe5=jG2dq4( z@+vz5&Aod7I*XVuUzolzyvhFXWsIiB2<~hbHQbH_&}qiel~i@!emtV-xmMkYTf3`a z`lfQy#K>(9dkYrD8clZgIpHlzPWfoKCn!R(C?@wjy+y#| zbi7S2dYHK{ujn>v_s-)F@t@=rW2cGj2k{i#3jC(<5ApEjH?=Z2S$IxA`Mp{`Gn+XB zwl4c|43#^&zvv_JuMdc*L^N|U{%WUW8Cn-VFx5y;A2BPP8gv>C(@BMjlcB@fY2opHjE1hdWd6s@iYAglFm#RUQlph@|6VgOQly7{CzAq)fvM z>w+I9xQFBzHso#LtC3^>4p#{3bf1?FJURQ_7;)7u7H+7JZPsLY*bQE9&unNSm^(F^ zj>+@xNf>Ng&>`E1IA?n=ON6T^xD51I4OtHLU*zw7H`)WJS4MJp+e_6X%q*4ti7bWl zZ<`cul+Xr}S+|ZG)t+idmu%-h*HQQGVbjz!pQHneY|LAO* zV(ni5Om@tNr_fn4_1z#=U9lXdCyk<16N7xOa2Q;A`k)QS|IAS|1Lw+AYTOc zmr7FVe2g-QV{|o1<(=qp>?e3610{Id|9+ok8Gf${`a|D>LenWrIFpw zCdW~xzF=GjC)K=^XI1H~@ytCA;CLNCJ&!INCv_!Nbw?JrK-1_9Zbq1$7kUm<@N>bZ?|A_?zj$KZfVT zrunof+&NN>K}{V+)9GguKv05~?6>m&8>DU*kKSV}0bn`>E8c2JOd+J+hNur{@1PBY z6Av*9xb`JMkV`PNb5x4qS3uL1oVxv)`bW!cxtPaN@b><)9d2Pw-Cl=2_hiE$^Uvg}Zd2BVupJ_&JE z6ql>Uhj=7ytoDBW%jdCK-r|30`y)0C$&W&bSPt|ppq2H+=;RzQ-}$3QPVu^S?qpmd zi5ta>J;MuqE>ZN`c5SX=9BcCP77R}YK?lr1p$Z-=6R?#c2gaO_i>Jt`*6HA83g5Db zbFOY>WKS=RTfR!bGvRI}rL?3^qDjdS$IGSi=mzyI7SxT0F2CR{l|1gw2Mmz6e6|nNx0evkajQ$$0jg1zq*2A` z&bwV#-E6|Fk+h4AKpv&OKM4jYq9rlYMuXFk1}$**@;JDDWoq7OLOmClat;wmtqhl` zS%j0%SI!o3QGQFs8$vTriMgV%Q!E$bNHGv?h^?sGS|{rC6wFw=QPW04)AtAo`Nt@b zmI;F>r8=oYy8SFFBxfsfTSY`6bm@N3Y8pZQbh>Q?mH|YtaoaITwI<;_x3|AJ2^PSn z?XV0?#7oe*cW4UlULcSIigG&pK+b?DW}oK3HSeY593++yWPl2pU#t1+7>yDb0wA7yMCAgZwN=2{VHg!b+y#}Zx1J+xwus^4}5Y)&L@HXW0G+K^&zYr};#sJEb z%3s>M?Ugo}%a2C|;GN9tO)_!vBNW)L*LZrD-HL)_TjJtbHtQA4ol_Oz?4|4Kl2N!a zF$f}GED+Aip0Dd2o&#!SP^WFv^Fn=)5Pyc;hWKD9>j!mMP>JZL8e;gpqIoZV$D*Tn zaCws?ntljy0zq;}@eF(yI9~ca#Yu~?mzkG+LE4?~wFbZ1t#8X6J#&)uNwKJFM0!DuNK}UE- z=-OZi*&>Ec9W)x@;lcVy*E0a3b9nY?cY_o7Tm#~#9gM$-|8wJD^+eX6(pv2{xz*WV zw{CUJ`4tU;k&LC32m)U0NgrnV0mvwZ8;_OKImY6wauyKBI+*@is1k}8`65>n9GuIzu3{j*r$5+r77=GKQ$xe||8wjYz4fZ>D zmn%DbwZjnLU`awBDIeaBP9qKCpBNiW@aU~aznXUq-|-QBU^ShK2shV%J6o)=DLfEC z5iBg7*Dqt)vBpHgVaz29?T)uVdmIDf<$3%%$QWROy9I|MVt&K$E7K^K>FtZnI9a0T z+UQ2x(q;b9-|=plMrzFf+FHcTui%%V@Cwj`#)yNznnD)pbztzU2B6FN$B>;oacB|r zJP}|;M&We#-RW%>)GjKHs+iZRi_sHTd?WEqSd0(Hh@^Emam$J^?(cT2$3IxFymFkb zwZ}vg2ud{Xj#Bik)jp_mv7o~UUc{JDy7 z(e1s{R$RD|NmfwZSuz_xjx9s&dJ_K9_l(*l&1thres&Xj4UlzXtwh)1G06;jPp1`$ zM(gGeCv*d>4dM*My@v9U*~~U>=l%f>9cuZ%uUJ}%&_5sX5;Os{2f-PsKGeU`9v?|- zG;nQ$k<1T9zkb$lGB(&8A`*D~$oVkoX8zGj&Zr&-0zQGJSH3O+ZBun{kw)Xz{&=G~ zc^)?g)n^Vai#cFdi`oCWE-bfLZoHrJ(#cl2{e z4(Qb!ziQg}mBtZ2D2uD{0*$#^uE9``QNm;Zn{S!&7&y%4vHMx^)ARAyCPm!mBKg$A zRPpQzaZ*7@G|Gdt=5Kqr@8f)?fSKTVh)+Iwie4nTny5l;&Ct7nRAg?5@EBVY>*7vV zEWcA0P(?I5U@riz$GKnd2$!JniX}-0#Q@oUV=B)S!!vR(Kusojr=%*r+>(OA&)=z5 zdRQloyIOjv18O)acO1ynL0O?XJZ7t!;#?>_l&tE7&sDg0GyXd*q23doYw!}!{S*{N;$po!fKEf_o8 zVRVT`VG&An({b`C-x8){TuvGIK=K)+jP_B7)yyLme4qhYN{F*NY`4!%ICGueE8mnu zqs=YQ{e-X?bc+JWOSfOU82E70j5Tpng}y1(IbTU|lT`aqc_M*LM>mfp--))m4TYgG z&#Vx4MEo2}kx#@y&yWpjFrT$13^Z$|l-C~aBaYk~^Gr?^`&hAAi>xe-HfU|E;;#H0 zcsI~1{w%F93QQfCEmnBH-qI%B7e13~D=VO$;o$`S$f_l=;O~takH>D#fU20qrT#JQ z7n_0a)6tAHkI!SgFbEQ&$htjR$yi2>0X~U1ZHX_>VEl5V8+?ExmKMR#CS?+_e7qxr z_me!eO?8X7#09*h-Nf%azKV?&BGwR9Gib!xy#QXzo2($tQW@U#e}Ug%@<_iS1GyhX zCV`+CJ=Mz8laB))t-W%>_tXtSCduy0QN?=~$X4v=D+7nINVs5-7-(EU1&)2Jb+ z<9wv&rGq4jIIMZ4lmmH+Y`0Re78Y_k;>bOLlkT(%mI*SODe{;3FE0Q*q)t=0^n&akPdu#<5g41|?sMOs z+~6FMItN?_cM28UhQgI^!Ty20D)sP%)SY$ig%IZGJF}m(>RRG^>aPn%sIbe|T*3VQ z1;;}&NfhXm3Lb{KT)s`R8l-|^)HWW4mae6Sr)7JWcy#FA#7zcXj3PJgW#(&TF!PuZ zq*jh*w3zD`0QDi|vynuv_e}x?x^!jCv)aOS3Sk?5pOaF7=Yl?OR7o4nQt};<$ODX) zmNY4_WRXAe`e57~t>~B5+tk`^wtivH>*`cBeBrnC?7DG@3TEtnc8KIbs&?NO!7oJJ z=$wQ%?38!X6^16>Z2b0$KfTfUhx;JxVk*bq+q>Jf1{W!Ux?>q>Kd4qn+?$mJV%X*2 z9`|2@*k47ad61v9TPcHjv=bJcQ~)&Qzz$nHLNA2#`vg`CtayPqWL*wOH1)_nx5$yX z8pA6-zZxxTF>0#DGLA@w6&X!_HfdY}CVYiVHocHGr6WKM<%BAfV%1Y7E0-38h5HP6 zcYiRc5qo7eoaro1@rn_z={;VythP6qMq#hQlz!YYc@CzEW2kmQ(nX}SfkQdm;f~ua zgr|G6SSST&oXypCW{lgv!{w!v?vDTkg%@kpABf8nR%%~)Q18SGTm;hwQGlG$G5y=% zDr;+|IKC*X zABXLU@9C8_`6d@ev+odXwJcax|0JkA=FnFW;HE$-A{Ii2lU96XLCZbAp6|Ip^XvT) z>O{!-oxi@$v`1>1A5)czgG5r- zJa2RDcNAjgp)?j#UetZbC&%g*5X)CR&_kkhb}nIDnL*lKOI zYGKM(N%Z<*)`lT>HfoKAD5M{wd2MjkeJ7IX1^^S)&DemNx(_=rf>1y7`GrT#Dft$^ zQt+rNPo^&Pdc)AUSXQ|jI@F#gjx^@|EUMX~*=K*eOB#$fSa^7V z#(@ED?DV`FIS~C&fI;$7HX4ng$L@(V!)(0ssHQ}Br`E=_!qoQFO`J=8PrTBfxM9_E zl0QB+AT}uihtYX`jW|&eTdZyTAe*S@zK6}@u$n5US^j#qMbRT&9tq$JoX>S2YvZb} zk$yfM-10r_k~k`bW=+@<1x1L&WVs!9xNBUE+43g;xMMzSZJ3_~Yo_=huhXLyq0~vm zLRVo&hzW@-(_%N|REHFQaI1hQ{jmOqalvO)PS;VHRDGZLM=%NQYiA7C2k0E*YuS53 zPX(`opF;2a?-qxM80k?~y2E12&f!fb@Z8Y-R8#clEZfij+zT>?=y#eDoG#XiVh}S^ zj;4bdXem1a{l+n_Ur*@ye4{_It9w*`;48_Vy8%>~GAzhaRHLHk*vBcm#w+~DJlI9u zbIt|o=~H7kiv;{Y4|qKeyxcjm8dp!jx8eteHMU zHB8V*ziL`gpfeQ(dBs>^Ml{@uY#2J^0}d?{mbSG^bf2Ox-}g$1pbkm{$lkjb@T{VF z)4h$_y01Sk_V&^s!y_O38GDy4mJ;gZASbEL)lA`72ADjN+4UCrUHXk~8>*h`nlq{DwJquMy$`yFYs=Nz*};Ia?<5?$ z-yFN40(w>hbCIZm38S5BE4E|>yCc8>lhh?ltm9Q{unO+KPy!8i&HiZ>l1KT}13K@X|H z|BXz?^>+&G0RVq8Zin^#XA}Yf78++hr$a|cs%xZ6p~Q9fE1b5O_jDI-#(;_e-M}pZ z-r=)Y>^stc#Z4KVK5Wy{RCcFnL_vKpYHnV_@67t@ z#Un_nZY79A; zWC{hCY*e26zI)hDSTt`2A+WAoP6zA_L*!D3xwT4aNUHo>kYX=KEk=|7a0YXK2oUJ& z?7@q~+H$P264d|Y6g|VA!Ubz-c}aVXTY>KxV6|DUEr_tHDqsbN@}VmGcGb5_k4&R0 z=j1|l*M2+MXh`Q#iIWfKBJ7-Ne};mOzh!PQD|gj(KW03Qm622@V$95Affp=MwotJ% z!|HYjpPW@A2n|6k69Yf6!(;ke=?FU^waUqj(BqC^lZO)7j<&UafVFtTOc*k8@`vWy zNAwVcRz~FHDz93NP$g6IgUhA2(5D@MU9zOh%4TUw&oxf2FYyDDn=bK%l=QUI)^ zdjuGve0utF-P#fjDD$wAVDCQTVA3Uq9*9>o{kZ#Zhv%KCN7TqTEQ!u+Pw)V={F-Qs zWdY2AOCd~E5xna`726b*6yG~ox3{qQMkRBr7v$sO<3Rd#MLokNOYLqZ?|rLefeu?e z?IylUVAlB9otn((&*88*BOUW|hQ622@jqTlXj%WL`~L1PaQ@0s+cwwwyX^+gvuKFh znJAVj@^A;W18fz*9Ku}L-6U^A()wbthw2LSFA4EQah!`YCSCpE;eFeK2;G*W6-b$SqqI z{4tvgvx#VS=%uCm8|!gasy4c^xDOF*62UEBS2579r$zY4>E$VUEdco<%9q!j-`kOV z!(zV{ek=RvO4S9<-FV;8ehv1hepTad?)i4Tc#(AncZ0p9vUflKN%qZpLOSJ6>t(Q6 zH*ZpD@l|=Ak$nYvkd}yu3+;n|Lqi~MS16OlSIo{gNXi#j|M^phpH1YE z>X%4CYe#$!PiQ^g@2*Ais=g53_eGrI3xRCZllZ8c-jVJoYE+RlR(U5F5rS6IyD73q zKRNTQ^&qeCAKT$}^i-xe;p@s&s1idxjv>dzrDUm4MjNAk-S8EU2>=c1$-E;A|Jr?* zVG19nc3u_3HYzL1>%6&;)*k>n!B=Bg3A)>`M zsX@=})-nG&j6;{JYCnOE$@dsUb&aUVG~xay1)4Y(^mUFChMc%lZxM%%;+L_*Ws&lp znT|QLK>-pajI%Dg<-)w;nD^J;U7}_hJd9rXES7L`1WgF^^sPxjg$whRLF9G5aWTel*Cn?f{B6x#WD3ET+Z<-*bYrq<;kT2V2B zJeDYbf(Gqgy!MLAwWzqK7Y>htlF>BmDIwrPKr8IMnmH#w|7wwR+RmXu)cFaj`sU2K z7(H%Ii3;K1>~t1PSdl3bKtUdcB3g{Ira3}u<1WQ`&9ikx;<|=$0B_E{0QV<=oE_-K ziJ_?oMBWj;k^AkA>#9W6umX-IyitvCMa<$>^Id8GkebA-R|rM&?j;yr5Ch_;7SUCX zT>8aOJ;qyB&!Y4^UI@gMJJP5vZ;VUz@gGjg`KV8Nu*8Q8Pb86aQ*dzMnp=P7gy&&a zOc^_HYvUkZt|`jsfXlk!_-~$35EGZ30G;I(8g)H8xMS4(;n9k{hdhrjcbD8E?SpQU zvR_k_Z&-$|^xOlYjrdBP(u_Phf2F~86L)fpT!$pP$OYVks z+4WfJl#W&sOJS7B@v#!iMtx*eh$j#NsUOq~7{Z|uZYMFl6jt#rSwmWDb`v(nc=CyV zy1XEL%Tf4SsUklQ;^59wuQhck1$}av2+Y}}`1W-C`Zbzz-0kOFur2ycCS1HZACFw- zqwS`jD_#{2be9{U0bjj5{c?erlH!Gpt0v3274}D$>I3aJSdpjZ@G3fF zh~b#SimmmhtGK zUeXFS?T^wWfXKJUPk^DMTd7ivs0oRBm zgf#8VFr=AkZPz7nixT}IZh8d5SiYrubOPd|Ec^L`(#pzpVsNSiTzW2t9^m}Myf_L& zxqoF4e=~kJnAUg__luSo=FsiXJ3|_DIa7c1>lXt7v18sE!1+kAw^oeyw@cyRW@DW# zddSNi(|yk!+c%(11)zaOW#>Wlc$!ZOVV2Ar1Z~V@^iN6z3rtU$dS}Nv`3phKRg&4y zx9J^2+`+oIicr*|L8kVXerO4V(8f5<1jN_NlnWQnVN5UzJOy_wHii|@<6DhA5^W&$ zwuMiz+J;y!OV_NQg62Ipd#Iwfkb_`4yP2G!KWJTFw<)OwUCb(K-8l!gw^1zyM1DI7 zt(1A?Pbpzon+g`7Q<{!?(u@OBxhc#q&g`R1Fjn&v$53^u*OoU3uNWVTXt~9dKhgCb z!(b7)5iY7%s;eABHx-3~I)4?xK)_?EuQ%9bo=00?M(#N)YH@(wo4g*GU)o85+|Y-1 z{%)r=CR`xd2M0@5u*h=&^Z|M!%XA~grSQ&xSb?1OzDwCibJnlw4xK6xl=!W?AfdV= zavQNb=M@XqYhLmzQeKn74`mOg-=E(4RTP#p+t-zfb+lKt=MeP#gcKS&70tLQ}xUEg`3K@5YJV9!P!NxM9)G4?+ol*P1dLc zV@0)7S;%byXf76hmnHSkROkAa=p@kY4e}AD=W&}b;&(M*Uv-oV39YMm)Uu;l7muj`k;v(aSHlIwRNhGpAzjQ=KF4u`(;6wX>wvOH=q)IhhXotISYqv)XGd0mJvauVhd40}RLB8s^?HF++> zE&)yieR8Mu5$cC|aZ%_-<*jw8Dui^%a2unLNPg(zq_i`uw|u`<(&$iqP1+rSxLgA> z)`=s{8){x%Doxp%IV7AayLH6eX5l~Fua(!2QH+}`UzLv6l*eNHzSYa>q6{zkd#;;= zao5G5v*CLRqWDYUphUZu1IPBfUy#MAn9I9iZ(+|#nqC-*wQ$@WLNRCWyj5m7HSaIJ z77iigbaYl?8nyzqDdPOCL$o@qE5YOr*PpEmJhYl{xMO$Obx4Oi8sZUtANr_qerw_V zSU_1|q`eh)HQ8-={&Myu4D!^0}E>z}S zyp6f_%=nY7U#Dv$p}#nwxQfiiWM61Vkc98wKDp+a7_j~#e5q=~7lH0pxHh@>5`&bM zs;J84a?lX1(1Kvekwiv$fwok}MJ{%d>L->46qlCZ^v-65Qj_8AGc z96A^Pz}$x;I0j4AKfKa}a!pkCCX>s27Jtb-<4+wE3NyVug=Gqx@?O?2cw?;2AhSZ$ z-QywrRLV7dWbr%OH!0jaW-?`m)RKAmOAKcDXjOMm_y`Q>YF(`weI7b2_EAios8ttu zi$go)eK5*~7k#HX;%asc-n~QwQ8G}K4`R&t9olC-wf<-7qqk1{m&wn6E)Da3OKt+a znZLNDki5SrO09Z*J7HF)G12eZ)x?(CoRK4+;#T zvKg5Mb3oVHkC~{?QNv$pH6)^lb<)n>aLBVqxiaOMme){;@Fyfzee8_fe>EYbeEz{+ zmaxkR8j$r)RU~IibR>*Q^~dL6A@ui`iY)CR==0@pLqta=%Pmw%jKJvx#2 z&fP-FSq}y5iHK#}rwF*mNvcg;H{h_(rQkg9ECCvVW?t?MFPXou%Z1k6Yimk!+?KPE8 z``d>sJn&n^cap@hRhnAc5{i&Kb79-h?h>YDSH3%rd-c%8o&sopR7Iy?!IbPefaL|B z%cPpxL(bW=D2nIyQTlO%W{`^1df!rciS+BM?YwiCehr&Q@>J-EhD#4ZpdQ@+d(+@w z_+sQ=!h=yv{gzi_voEz}@;E|Gsxe!m-*o?Rw!gQ3sTG7C676hhSGTJ*%wh8kvRkRd zgCUm4%h&UsV2yoh!3x|M2@^KiR8r>`Ry^AGfhb`KNi`BG#mgTPaQ8urfG)X%P zJ{tDir*i=R5KlH=TITk3zAqvAY?Uxa&L`$kTLpOB{s>3qXV}!JIXa z68XAnsm3*Tjw%6OLU7;+l}o)STOS$J?kt85gIwUCLpra36tL9l_#}rz6rETbav@*g z8*n{tE%c(6t&t4G zNuco3NBnrsf-hn~oiU6P_e>}X+I|p|+uwN&?lix-?27tBv9LF!mO(~uC~1S;pqcvO z^6=YFP(gebWaX ztR2V(zO0_Q|GWq?2?H~(afVZ!GDx%hD(!znOF(ODaB^%AU^xj!*eLzT^w&EGGEZ}Q z?cvm*Oj)-StRh16pU8o*Sjfn(nmy)t)(s$=hY<{Ygm48eYz8KsfT2{ir>Nm0arVAn zJoE$NuljApAbnK;tT8@|A{>bEG6DE4!9ZnhsT?j5aY}FgmnHTC(YJ*LY6<>iS}t5D z;^lDkh@1ilwJKD48SXkg=1zUm?$xl8pJ#*Z6E((ZLDbdhdE0+xAQqIlS|QSaOV0(G zdk8!vQ;Fx(v_*IwSB`ul>OZb2P1LEkU-mI4oO<~%fDUhU`C34R1gO)4u+VZ`BBgo% z-o-t@YqLULFAo>L)a3-g92!1|l3UieB+mwK{&AwcsOylr;^7AC@mx#|ABd{qVevWv zY%pkmlzz@UBdiYr63OsNM8y^_XlChfm(Bv>WP4jwIT^We#GKY8DSFVZ3FH^l9Z}Eq z`vndmN~iu|rC}1V6z7^@o&viN%uQ6C4V)udjbKlr5;cgkgy4?3_^v`RrWZStChUlq zqn!_T`TKo8{USuJ1B=hnBkn#UudwrRKh?E^odxeorDgceA~_?DB2<#=K2#|wj!6t_ z;cniVUoC^T^%WH#+TD^whCaPFJa{rk*QF&O+SeA6_5G;lR){ln!(p`gxUC_c8hKwi z8%9i7=y2%+nyp16+WzCO7q-^ljhmRNv+kv)g?P%E;#%k%VzqE0`Xu3}q-r+FV zsmROvKKe1PBDn&3b+Dgr8mDoI5o0acEa4yH2nQ(i@h(gs-aXtvuzz}`BPnp*mzen9 z3qj;EoWy`w=#oNLzv+BtMJ-jh%$I&PueLWf4gSs-?N(G?Q}gXP`&@%c285E&JSmj* z?xj|LA}LsSOe(tV03F&z1O4f(RBC2a>dW2VA>L)0^d`PSX)!Pcm`yzSlZ1=;eseTkWKujp>jOJa&34poh<_2svs@IM_V;tru)BbunK+;O1d z&V?O;|J})p`>9hlEdMCtn@~JkN@Mlh4P8Pr1{kizYrc;U$@SRJ4!*{{#|Z)pno%OU zR-frrjYF>7q?$6-o-jOnGcrhc-)d`rB~s=(DpZ>)WDx_3!d?rRIaU9LGqZl>uTpg03Hu z$mmsbZRwo@jw6`oF^U_#ereNy3N{XN8|o^x`TXFJ5(y!r5|&09w;Qye0SGtm2TYbZ~O5MT;sqB5UE$-0|l5 zb^@oB1$u70(d(*f7guTB)JmoirmCCoJV zeTa>=y{UjJ?*kf*q5oIMo}%gTmto#2V_(sJYIVx0#!{xdpf*xtu@IVPAcRe%C>#NE zgw=^~MC?rOg^TxiRD<=F*CeB9wbGgRM#R6&hHo7GYypBkFGKAmbc?TfW+%0z(aK4k zrY6@$H0>9vn(h(bO-%Fi)05GGUz?RqB|av!XOE=~1^v>Ar}5dz#Ju`k=w|jkoCHg| z_KjSGoX&nyy~?7$a@@YAv1uVRLseEL>lV+Cuc9SfhPwXaX8J3UdWV6uicOrEJQ8@S zo&c0EM0aB%p!qdEI?gP*TPhqzlIVyEP%Y`uYU!?%-5r2^t}PWreX37n{&C6S@ajpts`^JM9ElPoOIDzkfLiwvi_I%tPII&+<%U^0b<5*3!@9@>=na*&&TaGF| zY)LJn^u056l>1#8FUR4abt|x#nBe0r=!}0}M)h3;3r0u_?48&|3+i)i>4$R%Cvj(j zif`L^r)34LltHuKxBdT~v-%4+o+=G&#xmC^_V3@AxXR^KSeAA;LMAVir4RQf7xXy_ z%Tsxoa?)|8UgHj^R}N--MRJn2tMs`a4bh}jkY+&^I{5hlciw7+KVTF_RkFA24Jxs~ zQziQ$6h-U3=Thc6q}+T(iWjO_cc;Wau-%!rW4Q{>tU2aDVJ*EBVnr6W5*i$1&N_$? zHY(HGu=8Hv+`vO{JFu51`QA$3hlsZpP#CEh6!3sRY+j)D-zPzJnADn{rTK9)m&(E# zZ6Q^{R&n~D&Y=%rkyPN&N5yLwtl8^6v}cS0!ApLu8JITI^PvM}N(+M-0z$e+7F#p@ zJC04JK-gS#g6i^wIh~h8O{*rYX|^e2G{9)R7@{tgNpw4PMwV#dUonk@D(2T z$IqNWP8efSh?}3x5l%IXKhWehcaAA7`p-jX?_!VLRb<5?&Q-#x3739H)7Vh^XUHIw zvL&+Uyt#Bx$ua5CN(SN2vmX}NP5eP=>^8sCgBm<^f8l%rC1KZnYmK+3M(oVp7S3&@ z>aPgsQQ_(cAdd#8k2>Hb5c(^dQ11ELE!8d=-h$qd#vEHb0UddSn&rIq_a2M&=mww& z1h#{`UacxI2pBhvcQ(h}k#~SmB9_Eh06> zb;D+x+9Y2GfD-jbaVyR;lzujQ$ z-)RvuN-B0v(f+|HbvnBflLln2lRZ||!h25WL{N>6%9NuD3faeSH?r^Qv@w&EFXsJKpyyuTpK+jUL^e==v3`!O4BLF%I@nn#HmMkeSK+4^0JijqkY5q3@ZV35dd6OSoPfT@0aeM(VIkhSW# zWg74>QsJ*`|129@H=TI8g7vctP!OK!;)(XD+_XhgBW(vtJ#)Xm0?lDd{{8QY&Lrdy zC6_6$1)3qBtbX$uC8$h@u1trw692F}ZaHO3y@O|S5?_-rwa4>%0rLsv^gFG8HsB{$ z_6x;05l%N~1y+#7d0{Inl%SZlOYh-qWom5=O{hgD0wl3E(t$0}-co1i^;2spVxJ1Y zw1MEcV!7Nbbb3rFiM4y0L=)zCsN?1LTX`~!)5GTXX7(3a7e65p}D-z!RHX4>{I zO<)t#9oC$?CJ~9B?EgTHB|GFJ@_bZw@#@%JSoy*E9VuKsTKMOeLifz5B(b3mkcU-RH#xF&Po(WDMoSX zuk+NckOB(xEjw%55{}KCnwG*pO2%SGF$xC$l3FEw0(26xCaJ3S z5Ct1|f2!`F_wZyK-lfB7dNw|g!!m7tLu|(s=73a8YCQm(uV{Rs2v?Z=8DGbSV<$FR z#8~l@9{7=+Q3>Kt+pM0S9!g>O3w)XP=A_rJIWl;IYugtD|5WzUd(4EK!_~}?U+XnsAm}nMZcK!N~H(?ye9A_EuSjD%71aZfjg7x19)jE?l zQN(%S>JI&t%+0y0v-~S;G8P#eQYn-vo&caw2_F_X_)bwL713~Q%wj`4;`PxRnY=G* zgP;9ffOCo{cEMIbM=VTo0A6U7`p#Im@%^n&V5lh34pz$ZepLm^o0r`|)C2{}7gIsb zh`DU@?iH-^Sfyr3bAFUR?wp_p9gqtwtGrNOJJhI*N@2SK(sM4NY4NE6=n}(;j)6aq ztHDi?6*M&9IMd3F)tB|lq2?)k}Ir;(|h;k{L`v#CgfMw&TUPaEn7|EC1%4hHYx=zo5S;^5s6nbz@ zZs^lvF*=JdTiL!(MepwkF0ayW@@EN{8J?i3C~X0fX112e)xgKI?-Mi(>zBq~#s*r0KNrm$r+&V_lS~2{;=UQ<52e~VpyyU`baNwY z$@&;Ju{QYLZfsyu^ltI;!s3*=ucc?ZnOKOCKS`sAej)xcp)}WthtdpWiqGiu#YBu8%<(b!7m%%QvGA zO*+aVK-f>CR5{bgI~*s4g3V|`0BFo?o%v`Ple4vqL*Z4fFh^KpVIJ@|c>-ZbakAT1 zHzFch;|zdh<%*ijEx zOKpxGqhc3r5I{9W4vz^?xo4{!Ne3mLmwm>N$jJ*-a&Z23lriO@_D&L8rxDWarMlj8W&j;6ipC( zWUajROe5djf_MF484m;(VwR5qe7}^2N))B-sO?djgLP zUFpUTb z?V@NwMvCD9)sw0SOg|1qZ<2Xv8=Q9W7XPXjbTn6QMcc(NM5;#=T>Te zs?^5hJL}vIK|}s2Z#-D(iW{NtZOTD$ch*s)UF5?vmUXK-<`-bq?;CKF?Hy)Kp;_Sf z=4h>q!IFQU%s6g+_-m1Fj!%RA4^ZyybC)!L;KyD)eM}H7B!26MtW51yrss2o(&qRG zw3Qt!-meBj??;X~#$$I|MIAbhDw%hAEDTRGE8XT)1dyTENR)oBwlwyqG^e#yy?%)-35_KfH|6#KqNwg~cU=oeiPEnB4$A$g_-$e@o?q5h>;tvvuc~E=>mc6I>Y}VC3zF=p1Vd4}l8gZL}%X{?UtX5ZM zX6x5p{EfgE0om+qn--D)AWZ@ZXbL>&i7sKMGT=X`lFTDmkGIb%Y+0iTFO&X$rCrss zigq_d;kYV&wb!OncKw?n@4y4=4tYmVWWyxar=e}r<7uEV-kJjQ7S-;0-6N}g-@3A8 z+4)W7YTa1F7g1BWR3z}r?49p~jrS61tZ!b0qY}<6eSKp5-hj`pAxkN1)a8@y$KDQQ z{GI`HE^ATBcGPHB;9d=%2g)xnrApngrGC@V2;tdx0dG(_G~FlogX>ugyZagWhLX4V zs-U@n_i=jgr+RBEyMhMB1@uZE8(2#3d1r=qJnF*;SVicSo6^;X`*sXbr-RlCo=QD( zhUbNj_54xYZ8Lop#}ST*?*MUw-9Hdg8I&SPHp5n{a5gP!B(*+r)F9QqtTC2PAe6*^ ze0nQn#aZJDgkU(LaAT?}!q_+3g};b_Hy$@aCjmK0bPp!2c5`y4v%2+rqV2;a2JK(l zgwuHecZAaZBs2II1r!TEd@4iEGcrq2?Nw z)oi;wV4$?nYK+8j$`NfrW9^Oma(~^&bkx1*&%b^WqeQ*Fk8DnT>RETJ&~ z$3Z^SuJZX-E85M#?b>Ctd);OhW`R<%;!c`SHXax%eJTN_CG#)`S&l zXMv3dH|9X?6vfb7R82J|V#$2ef*|dMHxw6tym1eW#?!2Ga`vp_Je6X3?RSum-D9N= z7pg-feOSDj9AJ-xu8DrKr3cWg7AA6>kn=>!eA4J*(UaNCvoNU%Xlh%L(F+Zj!P9p~<3@P;>KNF{GZ z0tg6IKEJj#3qgC}8@VSMbR~8Zu?k`w=cs%n#=XoUI-RS@5gIaj%BuSbjng^7VO*a_ z4$?Ga&vYx;h&g|OywGX1BZ<(g4sh_&paeOIY?h6|R$BY6g>C6U)aLbW8CM&d-b5$) zLJnWlLt_KdOhnq>Q)i%TJs=vJes+Qe{A9$#o>bLKCXC*BQ zCIsGZeLy(2pbNTh-n|4mV8)GVu?mvIjzReC}RlWpC~ zl@oLm7ND+lEsLL(M6uqO3YgBbg{AsM;BTGN?sm<}j_qaab6D~$x*Zn*OXZ2OBl;I_ z@;A3q{1OKJLRp===@RB_e=N02&XdrBH)jhJ3^HC4Do zyKStkxi+@KX4vSBC>uE+4%SWDY`^TYkQ>EJMG%hB425FNqu2Al?f+KG)dA4@o+koa zl_*wl-U9m9y~Fn5SC#`-W4Vn&`>;ah1FMGo^*j8TNLUy zU3=bdS^y>B?f%PrUXB$8g%<0qBCNMf19W2#EN>$m}n_?I_ z&vzcfFQ&}5zr;0ksZ&yRT&pZ~D4cHnaWs=#3px2I5=sZe2(ovKr`FJF{ zL1|U(L#OJ)7!=EEJeF{IFdVH$-cw2?sen;W{Ku0G%h@}NxRVCxJtijIwkhxAZ zYp4@4=t@{QtV8}`ErJnxt&+u?^m*YN%h&WPg7{pSN)qbsSj0CAEZFUL3rx2*ml7Fr z?!ERfBTCf~eJJ{x8G`QZ7UbVB(I85V!=#ZIX+GhQR@{cSrPqlCFHfkz9*XedU$GCh zl(-N3dh5g&f|KYzR=sJD8wj&(*=nkkJLR`niQpk^o)5Zdcj_Z!G^s8>x2zxl?d0TX zp%75(PGs>Vunk~8eqF;fK~Wz!er4XPZckU#LIUm$k}+s6^h{qQ3^1#wwXQLweIoZf zSQ%l&q23XRgSmfU>i1?-m%EL#>OSJQc1fAahgGizVBK9|&$Im_KrH$;MU=c2f@6da z?rkG}Cm|AhM`Rh$^?9<}aVzF3xYE>ols2z@YgZ>nv)d@M?&kAU)G;Oeito*t4&2cF zE~}1i0)0M6j?Y6=C~m1yZr8+toMV`dO5%iPIwo8hM4HLJ1S{z$GdD*i}qHA{-7yLv&L zM~c6{`r1vaG3^KTPd}7^Qd=`5DTnPBg8P~W#Qv$K0gQ;|^d74hSH9%q?a{65A=mAZ zQXxvvHi|u*KK^=9briL*K3+(ExBMp>&3Z`zOBvPm;u&R++z}-w*MnQ6 zcE%5$=cv`Azs54P%Fs@uh0aH;J0qZ_!0rwiNxDs0IwYx;US62LRmaAJI=_m!Pi-a! zQ$uTVvkX(+E$d`@C|6_a`Rmr(-8;I~A{Sa2!{SEy=&=EAhgIcT_Nh08}#v8M3E9)MK(J$|~e zN5yLgeKGVHXs#Fmg7^r>UCff>GHqRH)MIQ_O{eCYtxm1hW~Fswqf*tpT|ag&f1yYT zAq31BKpN2rFB1Wm3g(}m5k>f!zKgT_^Ko{ur$Qmp%TH*HE7*lbE|=dlgs8qtwA=kr zL?TA~(V2$DLBSDKy@*ZyNwqR1X3Ej~QI&SBpm9>o4}P3aK`z0D zdJ;?QF<(W<6j0L}LmkK9jJ8%5{{0mJ$pQyO5;LQG%3BF@3uds0$;9n7k>_diQp6h) zuKmsca~t@*o_gsqy|EOwtH3sc8aQ&ROShSqCr!2<%fqP0=icRkj2`P+t z)O-jZ(KaqLI?zqHgM7B*><I)dS&CT zp(Q7R)uJ<&I^ro^(L+sw2U%$NH>EUptMGz3!f^y|RxH?H1VNOSZH-f+N@m?qfXRFY zF6?HO@Ka6WbYIg|fmCFUR2>-K=3?^lpguSl9{rcU*Fho)_|DL?p&wohk-d*Y7Y+Ap zw}-yGB)yX97>m(e|L(k2OpT2>grjcaBWuz}2(jcN)n>i%uHvn1)2p}lJZopZz9mP4 z{YhdDk%IPRBq^Lzwb@eqQ7|w+Q3)p~>pOqE8EAZj-ZE&fjM6Vv2*TZx)9;$6o^Us7 zM>+%4?75B%EQ0&>g9w7ofm&6Mn`G5Z5z{~-EALC9l z6c-iMgDg#tG2x^U_Y1*6;!KS(s$2mvg|=u}c7|Vc@=}qGZd5Mt(i5^J&diza@O=r3jRL2lIhOKVAde~7g>-1QV(`_K&@cMr!7*Q z?!GPkuhGp$Sr->*)YxZYN8)aUrlnTeCV?C7-GtjGA0|Btk2Ubrs(ZZH`v!&cIkHXu z&IN$@i@NE`K$mr~?jQkPKIosH2H0S4G{Pekli%@MO#$}n<0jS!vJ)0}cn5rDbwEMN zl;Ky2zmNstR9WDdRxT`RkmgjpUeZ6VC;xa5mqb?1;$$9l8GdMMY;unalTJf{`=$)^ z{!z{@!X!ROBA|_gcsG)1NYPK=CM(0zCQiYhWF8yxe$gsiHJlZYiOv1zpnw5#(ZjI( zF}e<3z02}DNDS6Aj6OJ&r}~0o)_?}+1GM2W1SB%uF3l^25wuk$3b#6SpG#BqaB%%} zMh)WnX>9RX;V*OiulcIlz#b@9Y1I~VmZZr9k9+!>c&oB{{<7ZvnG&({sjXyOSAM@n zB%7O~@63{X__7z{d0R(Gf^?(ngpt$Ye6?9?dA!VeSiTF8A)u)x|6}IBgE&!e+jU-Q zHx%)x#MOE-qkoj&Jj{#gJA9qpAAlsya`1v$v)eAS&XG@lj$F{LctS6&avLB6rN^4D z&OLZ%8Fj%38pCc4j{d7J`S0goby(kS_}y(2B>ywmOcdXv=dc-jP0Z;Mn;dPG!1swQ zM{tDLI(vs~T#*#}>9ze$u^+%}D7dD7_u;Nd0ZdeCvri*c^GlsBEOo0QS_`8YzZ0AhBk- za77n#7ZLw2mfgS=3@C+a0X0l^K=G{~z=z#@pFd>ilmcVm~Qa)+N8<+T}e zBNlQ9!93XY?*Qk!9Z61R>tRs{N&=+UbR~*ui7-&#aTUJJ3<2(bZNQ@6dBN7fzjmI* zf5YL}lI_0uhFG*qnd)CwhxW608QVsQdO?Wh{SH!Nb~(*=J7Q53c$pyB{Cs&XvVWe1 z|FC6ws^Bkc9wVibhVOpQNT9^hSs-=!PMfTByQaI@Ey*@mj;Gb*jn4yVk9R(>9L#|L zi=)+@9|zpOyku;6n3jal{1Fa$s(ScWAVn6_2-Sa@@<0AH7zf~!6Z@6zI)%d0IYEeh z6?n5^?OJMX)#0qn{x1{xXNpCB$L+~I@KIoOR9WmGc%Y6Ronf~>eHX8&OjNAnBf1J$!_9d0`^P-a( zMgX4sFD~T&@{GbD4x`?W!wvf%Oyhr_vpg9LY7p*l8uh<8+kc(XKVRctzyJSV>HqdJ z|I5z*zxhhv(ZEvrdC3ESnO8`dWGOEd6t42BYLbTHNaeqfEO2YEWoZA?j-phz0ri^n zNkfxFGD4EoUcYcg3*7L$?&xN~ZNK?k9KcfV8v&pT&e1D8JP?_d3W%g^Ta z_RGYS$klcW{;*UcR4fQVm=(o|<+OrLE>lk5c`5hdiFB#<(^ChJ-oz3~!n5O^_o-{y zJY8x{f9+LWBapfqu;q7bU!ieqo^!t0)vok20)jV|A22}QV0|7V7+(~*rS#qiUDyNm zc+oL&(Oxjjm?PiR(Yx9tr|ze)IBaH|cw||}$e7Ltw}!2Np9G_6tcIl{k_HQzJ&!k8 zzb5t6x!ZaS2#9Yd%JHwGZ{jyP&gs0XB`ik0$5|UJ=i2dy2hh0rf&uCqg-}@)cY2^2 z#>VquJ+BZQ;f;q@N)Wo6hC%Bgm-^yQ)v;R!Rr!53kze6o*7^a0jmglY(}(MU_-hc# z!{sn#l8|En#*gl?)OWLC*2v+1TPdp0=amcHz^0GR^l1t}stwgc zR*xM=f`X-f%_^~f0x16veSdTde+C@@wv#FfMH~fKeCCB3lT%nU*2$&YPs((1h>N3W zbYZY_^HfL|OVRXXKR*Jl5cQD)excN`-7Z`?OH>Kqholi{cTWQpclmw~mbym4Az>wF zHtrp0uX`9eR6s|hTy|6SMjU${frzh?x-7@TK(H+FyR|fM23QVu^uK;i`HQ~-yq%=C z)4#^&z&=(bh6Spa0N-Ga+W!6~>aOK#3QD)PkPd?QGo#!MxzMqnUQbVDEIIdVx`dUW z1dMu}Cv$mUp}tlsu;}%rk&n_qj-PQLBCneA?&gpY<9JDlfKUu3Q7^wdZ>`0KxOHTN zxjH{#?^B5yv>C8(?A_$xzY&~A zs3cUPQ&9*Q;;aNZ;kV?%CX$JG29-A(j%zn+4Rol0FSA^0HMn3Cv8xE^~=i`kA0i%nQ~;8czaLCF9pH zGe8Lb%KeBZ@%cuRE7GnAXiW|D%O}9u=vV_4iKy|iV!7xserHV({zDgXrOFb}Qt}48 zj%$zLblLx>!r=vc-rRgR5cbxNhhpU!Z8j@YhxW?|t)UbV1aZ-D(eTJn5|)oVch4)w zBLZfat#jsHY4%N!{p5DAp}j=V0($=x(*a2$ahNJEYGuMvKktU_R@HVdmTA2NIY&|s zcC)Hx@>!RrFnPB+))8TU=JCx%rxY-_9}V0mZ!mkb8})en)4f!@CoO#bb$&4U-~(WB zT~CyhVr+ntTKvO)WtDI;xe6#O#*6@#ra2ZorCcS*&59r{`}-0AIE>X%!-<@~z{&+C{kq>{fGA6X32NcUqZhR1e?|I1c`smp3WRQRG zIZy*@3KOA+3i7avh; zXmEnBLYZbYschu?@7qT5f_UIh?_mTI=icCzSS@DI$FwGWc=7LmbzB41fyh|s1&!k? zSqyFFsR{7+RR|qEipb~gPbgI(QJ6k6mYi~CIL7AK1qqabUS-_pF50)7Y3AG%!0X)1 zitfg8c0EVEo1Q_J&(W2*8{mp$tfeXcM?`n141)W}p%ve^!nf%q6;Gy+^sFlWc>d&& z+HuCjLU7J{F0>{>r!b65zt&P!^2Wqh3XlV#d9DJl`+Q(yH2RvTU9E0X)3$e1XO_2B zr(w|SP@7Lvo`m_T`*Hy~D-3V)2ui{S;edTjXE%+(Za?dA@r|5x4lLO3#1;@6*R_U=UB0zcaA&pw7kNs;uN zSKPf-Wi+j+UN`P62Uwv8>Kp2vp(N9m-hOz$d+;21A;$|Eu~1yTvXK*mJBA-T_?Kw`I&UUsZI50h&)NINrD z^5+0jkMu{0TN)NaqhZm>kovBUmeJ-V6FisA6XAu*9L00`=y%aHjEChZwO%gXm1ROL z$!V;)9O*G4?>8$g(GHipCHXHRs)yGl$m=wDGT93Jmx{Zhht|z#2jdgcV1ZA=5qHu$Ot*aXuZV&Q46nMBgRoINpy^V z6zcXm9#851dE%vE((15L!z$YKc$alGEf#o8XM*~It$LHu(yhz-zO{8yh-BD|5fyTM zMNsu?H~n_p5C|$`a&wr!&HHjuSaYk!fkxP-1I`(RppHG4AK#6qvC>w^B~T>0+-{a7 zG~3T9t~T2cyKHtPlcag*ODtxVS9zRol%0*j2>5`@AAr(&l2)@RYPp9B0t9n1=la^7 zL%3+1zgi~2KVRg9b-vzgxaoTirz4hEu=cq`F*Q+<;2iMccW*v!8XL&*_#IGr|1Ln1 zENpID(330!!k(l34;$B{zqb4Ib`Rav}x zr{nMKa#)g&AnrxT>##|~-qmEfPipT3B?Dl6ZPNKW=II+=Yi=WsipP3*fi5mb-S;83 zb23%z_NsHGswut%dVYKks}CVHfpr)k?7~qAv`-H{;`ER!Z(hcDqV#jvk7PNvD|{?( zF`?5jxxnE6@BC8tubF$tZwt8%c{)O>w=MVH&3SPc)3s^LDe~SG1|BZymE4$>ju8N< zoevvv=I1*i_kmMS!bJsc2yMoXEbOiF<)K@gBWYnJI;HhfeMf1-zLWu}qcsgQU6=jE zEp?qrZGhyuYd*(v8tS$73K@RubTW_s&si*ONUn%yH<*$`|5tZaW?5i`sI*-2tgcHwxF?v5Ilbu{{DkX~ML%T@izO z+3SfcQ@PXDSh_ooJ1jDqX*NIA`wxHSlV`i_s}diPl06>(D+3F!2BaUhGr6Syc_n(j zQ3r!i%(g9;qrNx1J9ODnryl9MLIJWp7ZAL06gMjoZif&;z2AR&9B@FZSVQOK{?IizL-Qot=QtUCa`;0DF$pzW5fI!J_~~w@WivWBg}ORo;gx#8=d^{7M*=UvoAD&UrvDfSW_Pu++g~ z+Xv4-57+GLE8p)iNQFz0>={&YD{n)wK@jytq`DKdFc}jz!8=_C@uBN3MgDy{P)HquH}q!hJa#G3RCw)W1O|?q&wU%!QPlfTnJxdPuIIMI zH#B1(K=_9P`2>Psq;gD0F~0X^VsCl^LMfWU^5hq-I4)+s$T?0fv3Gv99gU#a5cKsp zu~1-Uu}82*EL-0ZU)DZ33uJBjisT>ra0pQE5%ceJP@O~}_bhi8?0Ga1kDK>vr8P7PdWY$p!^-1U=_Mf1B)xzgxYkU?9`TTe_d#yLo>axl2!{PsA(S z1l@-?DA<$7gXtAP@HnD_0PY=43bfv)gvF|R@fHn-9dX(hd{m`|#0X-lVySgMT;(nf zXqW@lv#m~B8zjR_cz2u(&6T1Rs*cFp3wCth;wrCZ4<(SYidB{1`Q9F$kCUDDv?qwZ z<%om=)vhOkPAo($VhWEbvR=LeU}Lgrl}*k^&Pst^n?Dd`^4nD6qIEkal^idW#*qr% zOUw_qfDWSfRCa-Cbvi(>CgA*)FIRIbM9uSk)!Kwt=?Qox;CdrhZ-~j+x;Pqx(Y}a^ zqQiK@Kn3|IpB}M|eA7PzJ?IW?s`fO{korLVxC)UuZa}$DO%$qq{&;;Wrdmclr~xRX z@NWJpC3SRbsW-<8+t*D?-P9u#n&^dRsq=$Q@-;YYT*pK3CUQ;My$Z6+W`B7c%)_H0 z2W?Y5mg_=9MFxOeMBr@W$_wER`8+9xlXU@ZVe4><8)ihk9f!^xADjFu)NuyjF8!I} zb(W|_ni&XVY65*hXi==gb@K!0tZ`a&iO`^0sh^hmV0*f{sb4wobhgbYg=Rjs~PS+Rd|^z^_F;UP-BISo$n(`ZwL#n6IRhC)7_!v$r*g$izeYWb#Ez6?n8Fl5G&@+HE0ZZcYD zdq?;^TrxBmO{NWjGEX1i#p`b7$`!aHB>*fuWWrMaq<6dj4wCf?foGfu6EZ-n!?wZw z*}fhgQC5&~T*Lus9A2&2_LwY})4ri$R%>X5j}*vB%uT-@8ymm(2p5LC*=9#9F|UB# zMfrg>&rqJesr8n=15;&EoM9FpKaVo-LBqPfv3+=`eGUL;Dz`KveATa37kKgD_!5Ba zu{CZ{d*!u#$tw9J;9ADK>2H{gTLn6xv&1M(cTk`W z%_dnk#B(OoI+t!Zo;=z51*-=ldL%jpRf6c1IuYAFx&4u#zG8=Qxa-|vna$2j&Jl6c z@JcLq4Cobdni>AP906?<)roxmYVd*v+$rCy58?k0dv6(4SG#nHZX5!^g9L|QL4&)y zyK8WFcS#6=;0_xI9^BpC2_D?t-AOOr_nh-}ZhzgU@BMXuoH6*30fRx-+VwnDHEYgU zevfBOrGCBNGIqa&8qUGlNYzyxRN@!5KztCAI$(P6xU%%C-(Y)?=!&J&I;cgD5Zu)K zE~MG8xh}owMJ~3KL)%#FHeF|;y##c zmCjL}8K zNGkPs>B5}JY->jJytCjG0&a<{+3XF_ALcb@HVZ?$0ZM>@$igT118LI^i2nxCD$yRBGCdQaje+|7;;F8zu+2=HoPM+%b}c$!|u82 z{sDF6&8pklC+t_WMWsq(c!O;Ct+M$tZ+ECKWo7YtayCM-N{lZON*cdaSoXw}yAwCl zs;{j`zCqonQC7QIM0WA9GV#H*?Wx?!@vnrn;;s(8r>ZEZs0?D`xPNV{vT{e+mcOiM zbAmhCWY=BZ(dgHO+-1G6wX|r|b}jo30(J10##Ji;yKfBg+b3$M`>Tk7{W3{JzrSZ+ zki?mK=D4FH>D&x=DF=2leuL01i+gy0mw;1?rA(hsO9N;&#d*qmb!`*i!_K9By)WY0 zOS1x~ZVLs^djWsqA;f9zX%cCF-f&&q17F{&X-NtDxTTerA8&LY3=G*Aj4tSHk= z<*Q|$?-KPp>3z;}6AAcPEqT)(XIK0}ZWXut!57&XxY&-Phg6DT8)m>raJ&3sq1DK2 z$NO1GGPXv+ko@bUSckuuqu$;cD zC^tWk^t_&4Q>FuxX_t(M#z+pS#2=Ym?N1!ex8*ym0h^j%kOz+p(t`vi-Oj0iWDt%W7=pghCaIU0mf z%IYWKr8F_l=x3=3-G?&hDWx0bE%TPp>gO-XRL+DHeSr5Z)RPpbRqLG_3p+(^i+$p> z-O5M)z-&6=FtMq=)6}I3Q8o;RwK`675YEVap7VNVy znjthrp>p>LB^oAKr;jBH6@}MDv~eEkbr~d^tgJSM)qb+cDo~e=)(vDnh6k?sV5l}J z)Xi)3i`ECiYV$d^yMwYegeJYvmNZwob(Nv_A$Ju+^p7G|lQ623#yM;RnIc6DO8|N0 z@w6+FglF89fZI1l8H++T9SdmsR~JUBJ;wRegtVLn??mw?Y-87#-F=KWu|?+Exd{wc z8MNk{`0--%N8yKxLg@?caZadW`5xa#JO5&bZ&gm$uB7cIdbC}t?RwXDryBd}(k&bT zV=OSS>R>g_w{KLx{HJ6r`a`g&QQb`x;gqbN4MO#RLn~mAFwpjd^{l5|VOfJQHVJMb z&$e~p_HJ4ShuAChPQ|R-GI*}gpHKxw&$HiRvEVDt;)FZ|R2q){2<5SqxuSGRY5N-l zvycGopCD~Ls}P;UA2+R_jj{Nh|EQl#goi*47Vssw)kDYu^@qKR{DZGA;0;ZTBmjpA zO{|v%6%5-Eh=v|Vr%&AqPrHI+zz$a3jk|EdF=l`MscFUSyqJv4_C>6jYya?|g=_n0 zl)Yv%g220L~aKw0mlP9u1ma!@5t448C_IY z)!vQ*R(LzyTFcXDlcC;Gc}z^i=d?b705m#7e{{p$opEyi$J3vNlr4IlqF$?LL5RLW zoJdGiRv2;`dYxra(D#SGJf!G|Fg~G$_zR-Gka)F;Ys}9k%8k1p(mugN1wsK^6t4~! z1haSwlW#|#KK+EvdbC6W!9-QkEb5gjV6cnEI)1cMC zu{B)go6Z9d#KLcZ*Y%-&2VSkJsj(~Vc}K6?P-W+l@0eB)pJ0Q-E=ZhNPavk&P`}(Y zB;K^G=k!VUM;;uWAIF<=Tk}KwBZZ{!aGSa7BU$5?2mntiAMM#*L51nTnnZ zsC7tqlg9DFvO!c>QkTMiPy#wo%i*+IMA$33D}T4Q5g0{x|Hfey7pH%2Hr=0t@;E+$ z^D1AGpZe(5>fyqc+MH=L>P-9bb9!Q!nf(+N=uQ(^0AEt_w-y`@pCc0TCyrDyQ*trK z>u_1Od`gYvM?-_Zd@BZXh>Px8mi8f!o>$rzwf=hABt81A58`4by6 zl9G2vjym$AWl3Vt61FqIW-9uUHAsBKh-3b;Bcl-wYl0TSJ2`J<+CaCg*+j3>Z3^v^ za9Rl_x-uO}+GabwQ8W&X;c;ak^Dc>lYzbq7GF`uE z_JE9FMJwn@O9r_gNL$h74Nj)uQn;v;i6?=`v!ED+56XU!Yo zNf<#UII9;E#a$$5va$G#-~k6zNb~XKh?qWGq0=HRj|Qa#3q~Sgoa%BzRYIfZ?If_ zM*>;31Yqcnj~+e;3pWf2J5ygGQ0vs2rsz+`=h*>Cl$R3n{+pV^6flA9-@K8W4*^J& zpw2@sc$-4iviP(%1GJWJ$tY*_BCq_T=xbWdr#2Npm~YT{|KO4c6vAg3jXcf~XzhaJ zL%UpXP#FmvaU|rGhA_WRvJr+v@L<3usFj146zgmrdQj+#|1A=qR$gmox zWr953OqG1St}lTRndgg}XO#G^(Z{?KDKmh8fr<5I+UnYoC+$eHK*M#o%zO0~QM-=& zthZ@6^as%?UP**K3f5c@di{*Fj%gw;QukXvn|YUNc@NtKA%r?O4OnJFm&2)PA1-Sm z@Tpk2zaU9nP!a-jK3bj^><1BVjtCRe)!_;B?B4L#2)#UE<c6OYP5BYGTSXswh`C|gTXYnz z$U7sh2tvp;Wl{_cNtM7sPGU)c-u1f0C+0UU(bqP;xVj)rK#O)TEMe_{?2_q0^y>(@ zxo(lZzmYcmCJT)G#Z%Vf6FK&mA1$S*t0d=kxputSy8BQ2QBI541clZn39Vh6Vphc(*ijyH4FCIE^5o{LU!C#R#n^w zVXvGw)K%EF1pCfQ`BaLQCGTO;z zM(e`ggP6eJ;|FvbqK_nXT|Oa6ovm0^)FeDwMF|XFdORg~z!wz0&Xp;esi(A#Fooi0BWfw)G^EFDeT+$wFnV(F}_*vW6?Q3h-K>xipX=_JqO4#TFf}Ucr*v;}4B>BzM5Zi5ii^ zJddD5=>?J3)29dY0Wv=H4mgi5&hqwrdWq-|s0n#YTm4oDQSRwg?vn>QD_96g)eU}% zdgW742{0WO1Ot$2Krl{(L9oVRonAYYYneRuJcM;fE%e++)Ru+T+Axpq{-Z3I_g1tM zRDghB6RF8NK5sm6PyZ_%S;uJ7$>3oQowIF1DPZOZZi7`RLRJ0<{%!W^P14qHsdXHCq1|Tp!*laQomUu2--V$VEKkMXKH|U4 znT+G?%o|CUq4$t)*!&0xgTTfT4-05BzpfD@`~D!T62FC@CHWYPmWM$%VP^>~Ab|)= z|3P?^4pJbk!Er~Lki%U=WetIATITIYJJ+QIa3))sWPpIQ5Ew>4XqqCm1bU<;h=(n9q%#o?Q`W3dY`nu)pB9-r)?fxRnij1k`#MbH--F1D9LlID4! zG$5H`0Ei9{Zq4Zgy7$dl3{gR5F8jc7SZ8b6eKiI)4nk(0VNh~gIBRcIohVkj$tt)6 zQv2b4mo=L}FKLYoQGN#zMfdeW%XBuU@6i+%LIL&4!4uv;&^r59!m-R!Fb{4KxYrV; z_&JGu)c_L$c_q6X6v8!c=fTkA-HEQw0(VyMFD&4;(aoQHAED`IOp% zfQ0c?=aTsM(OSd1hKu5K2SHpU-VibBb@{eE9dpxR1?msK3+`%fkj!2o=6dXzze`Yr z5jaEgByKz7K*}=6gr*pi6>l`$uhBv7jL3H)d_D@$&`3M4%!Bl+1uE6N@Q!!hEQy4W z#7WL@CxfbmA><5%qZ*^#i*-}4UIC5PB9L>$%T(3!WVk*|E)PAnLO>|r^xDw|u}61P zoV5H7z)&kD*wx5GJ`*yMzWMe6X&b()7PQs+`z&rLb00c~I=gx=3akFF zJ9F3#F1rJ zj9vtmZBz2-1Vt!(aRxR$#Vyu&G3?+Mqxj^*qAenSgUo^3Ibs$1#?Q#S*TVqKrDr>x zQWL>n<^rsd{L2+B+26#`h| z_ESOc7`YH=GXfFIdsu*DB3Lk3qH1GUfZp`vyYljIwP+vC`S#AoBk!RCNa8O?oqG4l}AkHt7G_CGjJ4eaUsQw14j9Azz=|pzVai(zJKWC6@#HIuJehz#p zk^gdg9@G-Z;dZe50SKE*FdeAyuAOY4JQylO&{#Qr!DSb7Lenn)q3NW}?a}3UzKd_G zfk4t4lKGiJ4(VFV33Us{0j2orz9FC6ZE}s&$KBVGS3~;*aKTyVfPA|S2M14AaryT8 z1J(M@IC6v}Q`V`1)NuiTep+xk zv0u3ua7k!SHG5U{puF+XN4yUsWP~Fd@$WkoVMc?kZ_&s|wc~)$SPUYHn+QNe*p;;M zj&2q@)b*XjF)Hm~OFB4efYRW={xUn&D?<@TkiB*jo9ym(p!`Hoe{FFnlSz~NGAmG3 z;{K2|)A*~N#FPYG0z6gDEf_V4?1pf9(5phe+BRN$22xHh$)=o~>{dM+!*7ZGeEn>% z&?`>>-UkUV%1a-np0!LW;)md&1vw9-@7#!rP z&uv5O5d96tcY6}`X7Y~^2;Qhl(*82@5%xbjxZq%df zD#Zrk%|y6ZPzgO7#P#ulen^l>r}Z-j3XN#Fd+-6`8|w5!@@}D>f-@*T@kjz@!HdK{ z5OpOH(2@4!5169lXdP5YV&`B(e<;!@34lqJ;_MN+Gg1RTcH8Bjo{Yv0AW0iN7wmuM z_Q0NZu_tp*J6_u#5`r`+aBraeP_b`0y=u#6nP4hhN4tdJXcvf&P?d?FHFOm`YCoYx z!!kyf0)d&lmDLUh-mt}{G1GxVtji0pwqD|+ppiblEhjR5N$rQ^l8nUD70T+AEdVXy zO6n`0DXg1;4`~bsYI=64EU^F-8N5)|Clkck@M*#_kxozOP7(1IpSIS!?Nrng@rZYv zccPpuYOLw%7(tIZT0kTDS>!a-6$r{>Hy%BRpN}wz1joKN&E|C>5okqs zlePvFVB~GQF%)@=&oc92b!^GQEF_YxO_K=$d~h1cPwRs^0OWsD6nb|bL}Fxb`6PET zP1t~y%mm){8!)blzsH3+^KZt}wJWe$0;SMB8C{*}SkmQNmdISEWxDhB;vsjPm-xj` zdbhC?rRTNnnjZ&mwj8OhL?A&}XFPU{8dGc_B z&?`Qh_yC?C0(Ao9kc4&$rj1-C6-44m;VIFn>3zq4h`rX)8Fq%ZEl5zF(I=r6!+2^+ z`#{_*(aEa)E2tInR=lryVeQ!fm0;(nBM|5ZhL5J_&b@2!I1)h*zX_0m0X8~!Vn`-K%~ zg9@3C9Q|`y6d61l+Eh~eOBv318h}ipDV46yLzI`6l^(HaFfwxMg2+jxYc?uq?4L`3 z1`GWGmFSMMDI69!Hb7Lb*Z|swv!Ose3S>x)Sbc^_*GAIN$8mMrUpGV??`WwsrasuL zr3|L%y$eVfVN+Tlp+%pCXgU<)!QTV7c#d#UK2h6nFO0(}QW{sY5u9TKW$q4cBn7Cl zC)D(ZT583d7~TZDwF2y!Y?KmqlTK0X|GOi98Xp3iK>3myX zU|<5hv8P~`dV(;u79DJKErMKypUnN!d~4~NND{R9Tv|)1_RG*d^{>ki(5*2A1NlN} zV;Z;B?1WETqtd5uv_J%%4kQH0crg1#x0%Z{8^Ql)fK6%SOvB@0)((E#aisDWHv?7# z!-h#iZTb7tpWlt)zpdI$#95Fat^8hvqV(1vcjVUKWwI#I%}>vVA<+qv^Xd+51DNSO z1V}f3_F43hyFBbrSvZ;Q4`8>hQh6z^6l-lw0dezpXL1^#8Hgq$r`<1#12|NU+|I>w zoiIte5u1SMeb2d^%m&Axch&P9w$+X{EhKTb5m(x{;FsLM$29QoDWKx@=3d!76frAY z_%1xv9hw|;yj6QB_fk1|EUO0_G6YpvTp%8s3yIMCc4B(vktXPzG;3P$c{r*Y z&{*!+Bxut^_F&E;L&9`V-WR{CgF_ytT%~7l{l#IH@WgbsvFyqDknFDy|Bj3k7)W5v zk#aJ(2iT(!@Zk>>0ox`|B~bt=NS(=$x@D2fc6xoHaTQ7TMcVgbL6u!qwIjxCn*|d9 zcSc=D%xY!X1E4QB#YkK#C@XlgmUQgq*|Sl>hpq!K`T_TR4nu-|s)H$Tih7v(xiFye zws8Y%nCpb`pguZoz_l^7G_M@VhV_5Tn3^#;<0+#cp^7C)KVHw7lwbYUIN5Ax`E1u9 zh9Sn&c8$)Yv5n@^u&~C-D07Mz45I4i!apK~ZU%yyxozD~Y+zvM zCd{*7?$!ua$72G5G-~_r^g!|iRM@D?1s{yS_XuNoD>04Nb)SEXHMf38%X7G{)B|K$ z=a^XEb%So8JG+@-E5L~W@^xedfE=qRdu%HozRVW!bP+9k+`T#G_T$T5#o=yWaA~_nGUzT9_?o|Gr@GQE^&*vrEc9$nzJ%oO&#Ixa#P zN#heeF47s`qZ`D`49{Sc1k@5@b2UyyX)fEz_sx}^WR~_q$M1C{)Jino52jT+A1y1t zdP7SLkbq)=vQYOyyTUQPU@qJ9Vf7h%E5)i58G(qKSM?EaTb%AYnD$ZGpDrQuxY%}B zf7Rp<_Xp#P7z8P`OFR}%P$tZEP+XNGxdH1a9f6<4#SL?`DLO`n5N2`{f&I6K7vYgV zQwW320zcjMkA~!bdI2oB9Zu*;$J3Iq7OKYrA`LB-oj81cU!5s|l7dk^pH`2myor*b zNwgr&+`Jcc;})7_=)D{Mb1tOI}Y8F!V^r zjf?!5e{wrzADVNrIgmu-~OD5tneUltYfQQ!$-{d&*W z!ApzScMEqr2R;|_E>vI9d3Trop`J)lzQ?|~2nZpZUZ66Tw4g8d=YpRi$RN6^!WYeVd`scT87cy zj3;i<_#wkW@3*t-1KUdV3WBQJV~HoN4|+EkRMAO%y5GGyJxni8%Xdf$xP)GRk^H8G za!~JivrqpGZ-#xq(Ko(a^8OmH;D*SvJOK%pM_`m^18IkcO|8JJF5C0-H?L+3qlSwJ zZ^wJw{2_57g2Y_u#DQ@mqU6c@o87e=q3e+d^z|QR&B@AGsA?5iqMMzF3_nc_H+t#L zAMan!bGKgP%Mq5{6VkIMdOa5+2r_-##MxOKJxbkrQB_=z^gf*U5f^SOA4-*_FXc#P z!;ZFkZ2(Uk+kE$GzpEfjf%1;?axR>ZSuSI_(gM6XCl`vCBLDPRRz%ZfQu3^c@+_z7 zF1EyY2vPfreANNaFYF)rJ>QiTXfDJ!Ulv%;RjS7Mk0H2T78oiO^|qZL?R5WU`{*<3 zd$)zH81$`?=%^R3G%Xf z@emzMlRneM?>=|~sg&|@G;-O-V4NW@9<7QS1ABAisa&;|G|lKLE;e3&9CLx%I3=axLBR z$#kJ={BIqXcuxvnrLkc?%^FV|iSn)xNeLyuKdf9kkC+oprQ3#QT9 zr2hesG#jKUdbmMGB(}9U7X?4&4X7Qic^PfE9^wS4hs<8BlOhx4*Zmqent2qG!!RbEpp+#RaLvX7WYthhdbk}9= zY@1@CE~j7(!&PI7ujNt40MK1_M#@kOiydR`eO^6H>dN42jP$}({Jc~M#PZp2oblO4SQW;O)*pf@*AUUnGyn4HHNmsWS zb-pzy)d2~!Im&%u0TJUAgZJm02^8>R8wpF}@H@~9+vD@+05Ak#DBDLwlqeaSZ^{1y zH}ert5!URAB5S5_+d3h>!TF}qLmcF*DQrs*cu>Bpp3Wy(qMT-cyUqaA zj30bU-bfNTnfNES_gc%Bbuw*yyj$~DWfdp~N9N!Q%Y=L+g6lGPa#~O%6wYlYC}{yE z+AJ6$00kB_yqdvH=#8`B^kUUOsAdPNe&M=sFiCIHtMoAj` zYl>*uSeX)J40k-o@Yozwqy;%hNGotNRstf5h~25#yMbvU&qca{Y~=`enRdlv$tg#4 zCWBAh9@Zm;CNU@1&FO|>+~#4*N*BH^eHbb}xCh*$-EF_y1(({)5zB@-FSG%*)|Ku4 z{$*M6#_hK&0vmk{n*~$+kuslUI`@bzUP8L33INZDn5q=P5u8qjHw!=yzdm-VJi#$+ zA`lt+hXo<^M7Qx6mi!|(72j z7WAu+HZr_P!A+N^--h7TJ)a_N6o64CO#v4^)b(KDXA#Rb{-p}=;mYr?FP1N%hv*C- zq34%T3f&iWj4uwuuBg1(I(*ZGC4Bg@!G`(=%e6!F!Bss1U2F5V6JtXo3NlxCL5Z z^{onUBTyqcD`nb$u(ott&E*}%$>KEi6)&*Uo6P@UE}-ARuD}v?7=A_X{OgT6Db6gY`T z;Ouj29~rS~XUn%iaLq!&U50U7&;kQ&iD41een#_C1u#9!FSyHtZ2m^T(k=aXQPr*d z0CD4%{o}2|j~&l5BU7c;$4|~wMt$KERg4DT3s!YSVcHI6OJ*z`hP6ts6l^%{SKll- zEM)rf^1>@LZ}Mgh%Sf@50vhtjxAniioBEZ;06X13@(2t14BSg~IIlpryn}D0s|B^V<&csD+JkXh#*35J8#TCB02GWw25H^M z0JZAd821g&Kq5n#lXqD>2BNacDk z?$?_F+@mB7)DZ&Cn0HN6hXd+*9;%x1oOz}WenrO*BaR`J#Y*ePANR}ZPY!2+i$L&| zzYL#24`q#q7^nWtBkWv@S6Kl$_{!QFo>8GTTHiahqZ1y$CNlv~JDP(A(JRpEj1BkZ zYZK1B$uT}tKQEl)i ziClw##|RkhGW)=Sm+OJV_6sx~i?2@Hoi{k{%}_eV6sK(nQ@NgI1DE}(e=Q%xkcntq z4YCH`Xtrrb1U|1Cg{grqdff=*((T6jMzky)Ql}9msol~!W{(TN^+64q@Obq_UJJpWSV#13 z^s0?XPvq+RD)?hD3tpaHTLqt)JB1iOvz{i>0x{sk6AieoT1r#t0hb6MI10oBCA$X| zFc^9CCEuQg35voyk<@lqg*PJKkeQ994R$IbsP4RZ?ZH1k3sh2n&(R~cXZbRgfzwUS zN_*4{t!kDPu~=?Vh2>dbQh5ojbg8VSkdRJXD}ZOZmPO9B4=7SuhUc{bG^lv2XryDg zH}lxmBw$B$n(*ng3#G;+Q<}b2!*S=CpSoaPVQabyj2@Qgif@W{w+zTs4*|W9cDTO_ zw}x-XbUz?^RJEy}#g`@l&IYCiWwkEP;^9F#!4x+#4SeQP;PrTF;nD-fJo;c~nyG4O zIF?``IY*7lU^T#J^D}@7i(gP}R2W^d9?zrG-PUuTUO^Dl05K)V0*dCW4PVV^7jYH5 z#}`S+s~@_YzVlU!FfJK5C2I^l#X}d3vu@vr%0Sph@3z0+!$_U** z^gyb(%V(U4{uWu3+4>0@Lh=W>9Gm$cg~J?Td)IW8#kK>bp;4Ctw=Z=BC9A@ zYB`<*5g7}AXY6r=9AKvWaMGquAfH<;LGG#a`zk=}{=!QA&Xq4W7qqKBJwCO0wk_q- zqE2Z)T8uj%tj_|W03fGn$?tFqtlLAX9wW_Cx7?XTBymt+j;EQ#4KD>y7 z0jXovC{G?^nL?A8) z&^(LT@3F|Z2^++txd2O1!VA)`NRrxQP<2X8=mW0lS|F!I27Ir?KL@>0YcDUtyr*z_ zqR^!YQ&6kfJRm)O!^Hsr?os(g7~h-}<;4ch6%8fOPEfG1+bm~Awp`r{n#}Dowb(p= z^EFLlGU69IvDIo*8)^S$y*;P1bAvd!1}J!x2T!D{&%F+BLz!F`p*uX6bmJtoHPoQw-TjFVB^oc69*t3rj# zb)S?m_5@4nDR+2JRqbQ$O`PQ7nNc4V#=*mtBOqLI7xFB;8fjVNwp`jfiL0UDNZJD| z(=J+?2e#?70kk33%FKv&toJpZ`~8OCAKKUcSI~U7r%|>Se)oH36H2c$c}rj?cK-`N zA z=~~8zJahpybsp^uoU0CWz;`t$66!Tn}JVVP=1~)8i@IeXrB)!r^wjOeQ*=GJTBl0b`DT@X@GeP_?Ff z2e9jzY8*+eX3czJIF3f7?>BAUTQQ3>$y_57liZSebCr^*kzjCqnCw`lg*Y`No5rIG z`$yts3Vm9(~kt%BDTC z24@pn^Iv%*u<2D4jsXb8xb4oAb0@9pFUydp#oqI=k_N}Y!{o_d=`O;XfV-T)>We>5 zzE(~A6CCpX&$n#uGLaoRu5-EbOsEuo3@S7N-o>rVYmKfRTIuF9Ds~q{|Md{{2sx=B z^I)xK%Wy4NMBAa>9df&6p5tnOiVVo+_ouimG);F`1Lo%=7K{LnOBAfe^p9c@S-+<% zb%_{&?0(AVvG0t_XkUJfI6ewMVOxVVLb5zUzW|q-k9!j(Au2_l8R0l=B7nF0derI2 zD8SjUhUKs&=*n+z|z!=H}Iz7)i>trwE z^;@&*`u?;&hKW!wE;%}0Saz#k6*|TV?#KV>JOZ(&8Qfm*VZ*qydqB>1jO&0lnbW88 zFPk z%-l`ht*PM{yIl8*tV-uIq0pKR0?=2{yq z$(?-eev5oC7JBPkMUNuKHf3jrXC-jmt5kXM%_OQdlvNHVU7rwtLKu5oH?lwdxyA&T z82V7DkETtO8~QZd<>5_-M>%a4m9-_j#$($@5p$<6|GWE#wLfB4DM^O2yE6S&7f*tq}pNl328Vx^nCzxXW=r%Tj7IMp%Ng z*6ox9MElUF?Ht2^`wsbo-aJFu56L-q!ZD5wnSo^H5KMX=&_q-f+l{-^z?0oJU%8tZ~K?5vi4yhxiF#MnBGH zq}Xhh*WV4ugP>6W2Y{k*U(;flbf%HBlbXK(n#J;f7v;ZR{?!Ls$^=S%h#l{DMSQ{` zk*)8;W!8;mZx@6^whU(N6TbeYw~8^9a;V}=U&$^5%7Xc6KO7y*S3>>iH@ z;>1;MHxc!!LocpsDnHbO$xgMl-vh=&5>q6(!=;{nvUhho`p$335d5p*u1)|*DgKDt zZ6E*&ZnHo79d8k-*{Jr^{m>`qAzMRktl35zFU{7E@l(Z$x)icF2VMimyk5D$5{}C| zy3`qI0Moj=uaO5n4H4IZWI+kDm#(4*VO#%1WhP1L#~d;FbjAW{tPgM9zlx9l${zo8 zi~DcC6G$Gl4Vh^WJNEOx{qg_lo5WTxRzp@Re%t?x)zJUx*MR>HaqP=)#;yoZ{4btP z|L!;c^Edz98~V??{daHZKQZ+0-q3$y=-<7e|HRP0dqe*}i=metXef--UuzKk@~lSJ zQqW*TLSrxm1!71^Nj0N#pnGUzoJNVI+xJODB1g; zb<>|v=Sx5R-+l$8$pZdLX}ZtDy#KzU`J?0!V0$q=W@GsOke1C}61rI;zmxnw(To4f z2aOteG4vZjj2fW)Z=dFW|IPln7dy?lt+B;_^{jt9&HuibGj@7$Fui~@KL3APE&b=? z{5N6zpO5puKa~Fp|4NCC$`z+ zTw+J=C|98aasXQNPY6H&Qaq_05d6~&C6qy6O=J%(+KY#d;DZFpW4^jZw zf|^+W>B4NtMKr9N0A-`yuI)EH%&Rw(g46X+Y`CnB8aN$HNa&~Jr|wP2mF8zkM<-xi z?yV_h`KuNRO3x%ts|e@48D%q{=fz~D=3g#zu);|u!w@4N7}0WZv0rL(N!XS> zL7*}Jydg|H?AuHEKK(fa{dNrieKbNRxZJiqavWl}wc^^0$9brA3JeB0S6Uu?JZ{Hb zE8SLF3mA`!HHF2H@bFz|i-`p9#}6N^(XjHJy8_CKRQ6Jx8D&#h64IBNaxmXLl*g5u zEQA3Gs8+Nu_>TnC&Y#gfW3!NJn4QO!eYC(!e^Y0H%Q1PwVnc$*ZZrO@ztAc<3gCwA zv(L&rFZ`>CDs}xk!1z1YD8$v#XbL>@8~ifnRjuF z)GDybqY&7Op)5b_d2{}gEb;(Rp7#pVVj6&Cfkm*Jr)ynGdCnFMtAQ7>C@k%70H0rf z5r$+Te?-ELa>9}@XS?PG>HA9pVt|W~aJfG&OW$%CQ;+mXv)A{=XE|*BG~b)J0JPhP z&fXu%{~YJYQ(tbC7~yDl5$-_l3#VECxs8}!g5Wi}94fydg8%l2J{1OqTr{37Rc=X8 zn)8IDVAfcI?@!Y@n-%ILZFg;i0%UxS%!_Cmb$aR?Xl!z6%*l;Szo!FzgbQp_{#ZuR z^v6E*ep-m10Ju-$#%@co8@5`gQu;3b{Ss|{hHpxm=O8t(JngglJL_`b6Un}sBelj# z#wCOiNS3_Gz+;0E_`O(ZGWxG0^YRbkg_mlig;b|`6UO5(6v=7KZK{A?{u@q;oEfOIf!DK%_u|UCfPNC#oG8C@b_LenJggeM7vEu**nY%<3<+e1gZers3m|`cGAo_CLOwttL6czd$>+*&MyfOg~&rVhz_Y! z{rdBrxo*zETvG;Mw=Qg!Jxd z%=+-*iP<-B7S&{6vKePHo<@V`AW!6@=vU0^b5g@==Je>(ZvK?^8~#V)9_i(Ri`x#b zCg?0?c()gyVj4Xi(z~+JM5X775(Zj?j_K9|IoyKc0s_FNjQUgjuqd$bLzu>;4HJ|* zN>8aT385fI@3Rg5<=P@bindetwDrkk$mA?0obK7Pz($e2?U3oA z`r;`@nm%H_m$kpM#;IZ~k=SL5@=JR@@X|>tM|HjWi|3r;VcHj&%(k5zfn_hSa>A}> z@D6iNHbgU6$kC>k1o7`xY?2MNhUq?{g2V=-ZndQrzR;SpS+(2HmzajVy-!jjl~@EdLCG1q_T+)CJg*CrOj=Rsi%_Q z_pIjAeiuDLb{r3xNu~!q#{>aXutOh>vi_)GiOpV|z@HqS0ngA)^_tbxgY%(a#I1pg zmrugGUwj9+4SEv8{_#m9LlYa^0Y=SNSd6~ftj4BXl~%v%DdU>I7t8V0DjqCVY0qmS z%*!i*;@B)=V77TSQsXJ98WXT+}A_TPY~(tM`V&r@Hbn>yrQi>yz@C-POvcs ze8WE0TKSp|bKtT)QYUkJeV$LC*4y2}>L^Fc-b@}hy81yLwk>H`ldFu1ZM?=M!OL96C~dp+a3FsziU2^#y%`&Y#z zbjsScI6;JGn;m-eJgT9VVJn-%FZC6k=>ku87{=fEXr?Gfow zR=4~s-BBB#-LMkrZJOZ`CjnsGB?LbaNjNfwHL!gnahDI;m53f&J_DY+WhnB;A8kp1 z9}CdWJ&*UK(lKE>8**zKQwWe!gT97f8j~4x1&gO>r+;iHci;*M{KzuMd5t4Say;1X3)^pq6}AeFPSSLKe$s4|-Y%g(M5E z`Of=`vbG$T)LJc_&(*vam+(LIj%I=f(#{W^_a@!^uP=UOqYQPSEEDbU5BpNk+Y|Pq zL5G71d|S9YQ|XQ0LT1kD`3W!k-N3% zOexR%StPEm*=CsS8+!^EX9E@@KD1>gi=<{5E^3Qcem@2VUKS}8vRZ9k%`QhVv_2}8 z4uiEzn@S7fntp^wa1#{q3Q`!$WC2FpW*#nAZ|Cxs`GlX_9*(&Oe0ts})!UOa{IJHQ z*1h-Se6HUJzp3W?a8@JtVZPEN^>C?4p6}t&iL&&3%QgnDl!3bM6XtA(Jb%2po+cf) z>v0?}(Q!OK3QYRpX(ckKxwIRsM1A<3Pr5%N>cNy*kRQYrorc@A4gC&2syS z(y(9q7Bd%h-Jn6HavD>-(N{>t~6uj=EL_SH?oO-*!TVb>6n?5mzD2hG zLDpNiMcH@l!lZ&AAxcOJGIUF~bT`r+N)4SdAR!>7(v5_4!_eKWGz{Gg-7&;>ao_Lr z?EUWVAK>7Cb*T!=gonVZ*6tZBvD;(q&bux1+10faZt~xVlP(>xqH%V zGXCq102p8wB6LxnIlS!U*4d-PP)ky#IP3N}9XA+vR=t7tiDv{> zw&)4VEY~0L)FeWH@6j8bc8yLs{!8G!btKg$Nk_}}nu^GeXRpA2Lli0YPp>FaN>{r} z!_TQJEI-2w@_K;Wg0bd9*oN5+Cjs=jdc4VWzbIfo@5t^eOW5LPmxMOG2ny@`t(0Vs z`Gb156?`+E*;(SW(hUC}TbLXl`6DK%B-dplgU-58+-e7xRMn4l9+jvNZ zcKqkBOyMH^cEJR{fuM94TiIu=OYjv=xJGw4QH)Kk_N!WN>l3pC-Z|xB0ly z3s!C;QUOo@GTQk^63IY(S$^$E%Wb8C<%YuG8CRH`pvYa~ETr@G;a6_y-YUMEDBi`H z+`;3sab=A=8KZM-U4z0x4r*pfFMh$L{-{ZH^3%Fp%gcky$)tA5Izp8F z#@lVwu;d1Og}4o8J0s4@nNvS-KOg!oc=^hq-%a?dH!_wOutv}V>%{N7cXf?nR5&>d zB-XWRWxMS68SDonW#iuW43ib;C^h4M6m(zNXKi+xr5QgE?}|=3i>RB|X>Q@~f9`xi zlD?}-xOpG7wL=PKF6j=RL8$^3n={&f78{$!LCw^K_+z2lrOpt`;N++6&G&)AKI<0T z2W+a#dcvh$1|&iC6(bZd<)n8;4%++OgXe%I=C|l&lSt%EBvdBB?Gcd^n2HGdU(=y1 zl^lvLU}nB^4W#}s{T;k4W#|f;`7Vx{6QPF}?RF8w3W5Q4@*9c9Jdg!6u|$hKQOEK& z=YWL9MpNJBtF({!ox6HuxSVfL{lNLbp{xtu&p`T3WQ2ST9{YQO6`O9&{84h}_oz<_ zf}>T2f7Ok8yV(}i3CI;*^B}Y8R7(Q4`w}|m;fk42nTb^h452ThP zbXJf+Gpe|~fSzeIj|r(G2b=*3v^f5mTY9`gMHtEcwMhVv z6}LdMCV7NN@?{Lj!YQH1%Wq`F&|-s z11^>@*nn~;3$N_DHS6o2o}@U4hMfc=<(O|dpooX1bPD5T>6JAE*ml6N=2v-p_kyvi z8~>X3$Skle42UjVSgtCci&&NNX6#fyC3pf2PvX1QB`NL-4kPod{y5d;Rx#<&DSi+K zO4mFDZ+bW0w>GV!pObOwOfeuQqy#Rzu7|$)6n2j1&~PW*QSP!ZJXRo~QfMbXQ*{V>sC<$Jz|8O&yS`@hkS4>ZG{1vr{JOXI@6X=S3QiTNa^553(cwpB8hXyh!m_LZ+9O=2ijN zwoRlx#N_W=eq^UR89ihFR4qCxd`Y%bkX}n=<>cbt5*RhvQTH^tnoOG-eO{wnI5R;) zbgo%{D=0oa0ttgn>g>aQy>G}!y331N%@XFoCubU$D@!>Z8TWdgyM&hodFj;I859hj zVGN<27e9dL(P_5rdCd!H-~M9$({*F{k7|fg!9cW?s|r}Y3;U)**0D^3IhLel-Wx+? zRpO1*N%K0_O?)Laa`jak9mzNReRpzlhwK?^v!l!vGEg6rx7|I*k4IobWvi zt@1rm^;s~{#t*dfJe&^i`1X3sv>k2trRDP;<~mlj@F^f>8wEBSj^s%&2Ye(V zpoIIYHQXIoV_qe_Yl92P;=0e#ip)6*7mgYJO9C+fYG@z?FAu+~S`NUxZE5z&vB0P6 z3&Jk8pV!K3i8M2L@ znSM=)msxXuI;$Qsco0Mom7pTRPp^?Dyv1AyRh@d-P$1Q%Ne-%}di$kQKUFFA`x>Jb zg-%~@2MV(@@h`>VI9x@Y`z%7e<)ip!uR!04KGOkeb?NI2w@qC&LKI*?1#BQp`ZKk5 zu@z|ZLzY9r2$`)u7tf3&bIX`0J!R#2)KCYL0g^);uwk}RTYF(xL9Hk1&D(S7L?_eV zOX-?C_80^Q=vp_?!WYCWf9SJQ>rs5lziOP=huxZ z-5|-{h%##+&9J2#YfB#A(r{?FM)REbj*{?Y0#gybdvn#=nVzduV!7s@EK5=r|MzJP zwNhNeCs%7K-=jrtWYa(Fw_{K|Jv*d%9!mlNj2z3gF3FM}JtTtp%!D|#vDD1C1$hSct=<**Lu zgeOpBi(hf;G_}FHMQ@L?CkhRX>3%8i>z$auc$A$-1P`0qrpU(j>74u|i9>MiK;>s> zyB5n0`f&?rHGSsup{9Wwz&~kdG=H@GCLmwT5Hf?+_&fSNf2<~WxKq!h;3sVsp?$|k zV_9i|OAbNO9q3bnsmB!N+n|Wbb}k&kZMMce&g)UX`#&2z@SVR=%Y>H-)qi!YYfU>} zKwb!Q<+}KB9m6h3CTcF@Y8aS9I|tU}=rVFxzAO4Ue5HA!WbK6R^!4u&4Ot2iTG+?K zoobSxq`p}<^6=zPEW#fqaVJAuqZ3naJ~YK1|K{ru7fde*O7@fvb&~MC4d3+v8iqNjo~J92KRv3ue#rFcYY<19O(&q2(5#EXp2m41cBV2_G@xv|@J#pw* zMn%OBsl_D(BPq3i@X=RD9M_N9)jG&AYS`nuW(Z8}^jbkSM%bT%0+(M0FxNR43KSgM z65ORdRDSn=9Xs~_(&*aMI4ZO<0~G(aLN>tPbk3?=kFD$ z$zQqpB3hGAxGVLb9nPZctxDN!PUoq09r|{A zdpcTSL=A`+oNwvz_2<3FRAcUe76zB1-XkL+S?h7CEox9Sb-s*3uu_>h* z-PO;%=sxCxCvjk|X@bRj(t43|2G1V0T}0*^c}FO3lD(h5-l_Z3%A|3x2AK#5jlroA z)|%kIRV7Ft@rt3V^_=J`UsJI!AtqA(jw+A0HXo=;H-E!b4L)N3BsY-wEC%qL+{8m*%MFD)qd?#_DKZg1=rI9DF_B0vDf3j5u>U#dLzyuHVH-ft2qDQFjt11sW$vN7Mg|k>e4!O6i;|2S$k9UlRDV z-fkyl(93TMyg0?5H?(?j4-9QmV)*<#MGDlapli6JE(HPzNEVbO9P0_Qper2SRbzMk zjZak93+cRP;!Vx4+H(HB2-b8qID8+*ao_{r;ZVLZ8fA0$YMfMS9HA<8o#QWxKk7c^z1L9WbWn^6F*m0;ym0V4sj?WqB~q6Lmgy?Upb^}5g*RDw_VKA zgqH%2t6u>$PQ4f09-jq)exU;Tj5INf}w3ofr@=5S;#vKs&zW^UGZTU zSiGQN;=a69)%fKIQD#CPexEnG&Eh*7EGtgT#K~ucyuXF-3QM%e{NPHuAN<_C16b{z z7Cbe5_HplK2b%wh^J^GUCwdkxuSX8Lm;-^LyFjOnXiBY}n@;{d=N^4li@7t={;1<= zifUxT%*~g6Zh|MEGV^Zf_-PD6mk8rpsM%$>LwMByJdp-N1N;RhzI&+C)Ez{*`f;u) zclW)B5cQ!wrMDuYGs|-?z^2ldvf~|ATJ55Hh^-%&UpqD3p+mT*d#X`*DRjF>X(H6M zZI+CK!(Nb?BI&;Nq3z8D!`axvg;9?)4c@$tU}1Av_)CrSUUUbP{9d5Kb0TNfSJ}{!VC(B75ix6+$bN7*a^UK2 zps&5oK2tG5hj<_Py3@C3zB7)SUvN-uY5xWe(yoFze)qA|x#aa}r}^vKV3U~c4C=|(sx>=?vD%>zmi-qo1?|NW+Py~A?ah_Wa<@y~^)eu-8S zt8<-SfhlC}!ygeGAsT9Go|bkfd8uk(effMR%FD5ggALDgFW|m^&>q$@-XHkk z!5Yi|1*S$^w*(z?M4VZ-DCjvc(QAjDP)+iAgf7d%3vG`(tZeAdi3boWtRwud?_2raC(XCtE&uYpvG& zxx3D7y4NFsA_T=w`hNfvC6o)45|X3eCx9d;pc^gJ2rr$pF@-(19K~WaI2Z46&%qVB zP4pc&Z=Bm4z{CO@(>nK@;DEj@EJ9UWSw_&4zI!dV%K+}U&1w;jRA_DMy!Z2jW-D~e z)(Q2n0PpXfCfwbzM9g12bz|Dme)K26NPmPfy#g+e-gxmy7?v)1mCpihZNjlw;|;L6 z6z7-iWkOM#2#fbH+a+U)O>-$fRncX|&icj}Oplh&;VypTaqF`G)e|L@gsFuPKs4IR zVPLt2k==mIgHg_Tr%c~Jw+uZCG%T*7Ydh|7D~7eK9b!5+*(db@Q8-I0FKxLQXIpTO zXTTl}N_f8L{-5XsMbE>IIX=%~MF<8#CUQ)g4_>?KKUutUsKX1iqX zgu-r#aXKop)|=JoC0Ns#Jr^h%_=*}1Jiw{k*6E!#lkgg+b_#oxO!h;B_y8^a;2i>& zk8DBmqCD{v{4L=#0{#e(2;(yJBgttx7o5>hP$^ydUgA*hFT`^Rr1cud$gb7v>rMIE z?OPyRdh>QbP&SQY{}9Tql1z`T)OVaI^r;kg z`c9lNR|nbveEFn zO+Vg)u%sQQEW{HC<7SVoN>Rs%@a`^@9Qvtd^cq<1HT_`GdGC`Y$O#m-0Ovdj)Bo=N zVn`?#>%?8`Iwlx5*2SDAf8c<%8BsrnQ^b;yUsWydy{3sURI@-Js@A&&dH0n{L$B#`^ze-0}Tt(NlNImqPrQ`uj_6S*Z17`KIX%3 z^AkryADV8;{+jm+Zcx~^EHXR4pAWzs(6QDh?g%o-66qt5^^3oCd+-uXp;eN*Tb;$spo}=WS9!nCHa6Mn+-+Ry2=+D9*~c>d z?L&!GB|PI5aTnEX?Sfm2z~=ptVN43`gd)OS55eL@LggEU1s-@;xvL#}hcPP~(^diN zv`Gy(;fY`4QZ|ya0T=pBUs2h5G|Mo1f#{N2#OL7OAH zIHIS?)ndALrUXi06-y^U3oxDX`AGh^-|Tm>M6^9j32f>ZC%mdeOcGw?@4_4=x9Hb< zVzDCzT|8%xxb zUy;vj^)-QTVi1@9RM#d^E62|F!p@Ga&S(+*?$=JHPUtXDy>6^yIMZX{spz0&;$D2- zUUvfKdIw!u_{?9xX0_-pk+=TM%QKe?wD=4;x7u>mtw<@##8ceWy)aeYV^ruehy5nN zSxBQYJ?^P4Xt{gJ-@DI-$B}Fsa~h4{(AudVIxY6YJ)AVuxwFg zyTV3?w(0H|wd!IdhYw6nVinD?yTfWD;9-5m%pLRYuCkNZ$lJKbO$8zbrBtp&n zelsCGJH01#J>~=u!I`^e;|%Ko^vA2r#qPN zVB7g}bg>LFA>uDrFE8zd*u=Z+2IlX9Al0m1=C5HeUuvN7+4q&P0P!)vk|Gr+$GK+N z3gPJE8_VJUfka=lTh5}4bu({&vU0i8J7hrF4j|>@> zYsHaEiD)6h`t32Mvn96H+vNTVj;rh+ZNDT!QUx4yl&B~oKPQ6zL*f2ng2t(V^saYq z4%FwraP@_~$Gu;1yCVmRNjIyacmdi4$}f@qSeqPVJVdpqObK#(!ztSx5QRyZp_5q7 zk}~5|=i6(cCU8)m{MplT5*})gGavOd#vcN6vFPdGIe7^@;u}^cu^$lunPkyc$f`Q~ zPh(ELl0cnLTy~!M?}?yjD+KVtzJ=<;diA@kDmMQ1K0r_H2aC{db8zs0O;)W9Z+x%?%kuCpEB}Xh{1U_BHxhjkvPV`9jKB~Q&ZSe$i;_as5h!{5grCUbJ&1=)5v}Rs zhV;i)EXgVqS9lY9kt4LX<2S6z*pAqt)hVs{uA}Wur>hWPq-2j4Uf(l|@YvhxU(Ujv}zvij--gtH|eAi^Bt*B&9A1li+2mW&hvB&qPH?cPGhY_F88?XD0 zZs=wHA;f8J-*l)hOl|u2NvEB4(Aj&cp!0D3sUwO?zwW%_x(1m>2F?RkZL=qA+Bvp3TxY!NqOCmNf9qLj z!LlP8uRZzxu53dpD^fuI8oK4eMC?;2_w&k)Z^o^OLwsWqCG%)vGFdn&Xa1P!g8>2< zmPe^UqP(VclvP9jU;#1+sinvkv^(eyQ9Gt3knV%?K@)P#Llo?byEm0xt5FtN*VeUh zff>&8o4gLw14!kS?4bB>!{dTWTScwdeT8(8*LvGTm3V&2)iAz8YXOQf0BV`@7wWoB zyI#@Twn>6+jy9fGXD{P$GCDf+s2ADf8u`IN2F$q&hknaC*vKMZwag^fdVvp;Jq7^k`@r8?V(Nou1 ziSJvqu^hL+|Mv}{^s7k?~yw<;YvjbVQD86V&t%% z|5tg&=zMWk58+wqo8enB3&Mo)eR;|pk#q~vt3C-oJso{mgklAByQbNHSud$wa#H*? zU1%s80O{h(84RUi7r#kA-=vYmE)ei}(^-}wM&|C_3`N5R9^VlSVDN*OeJ#I15u`L) zx+7%W+wHJ1c29Iz3Y>o|P}C>So#yD_NeNgQz!Z1Kvh52pM8>NNn*FB~`LBRdEStWx zfD3G*D7Ef`{=61-s&t_+<6yI18l+lxbP*rh_|Rjzco`V0@ckW483ctY<eh;(5c}Chl)aHgxRl7<8JBN?uB+5_yWX#*)8ED^ za#m!Y(0CnCGJ*ZW-!y#Yr*38~%jCheV;RGXt?_7G?Wlj+CU(%4!uTe~rX(!N4RQ^= z3-Q9OHV&0_rQ|s76v*oz1Uxc^O}AoDGG*WHRY-k@bd>pFH>RpBUnJ7+aTw^FhF%!t zEn(3B1^M&S;Ds>yCpQ<*o$evg%!i=9KRQ^!mK+T<3P6jb8GN85Mf?RJ-N+Txf&pE2 zxS-zBL*^;8LllZsNoB6$zMbRMQ8+fe^qGK&23^ca*7LstX)1J-i_FK|kLG101>Vib zDT|n-p&-@{9;~Ir)Hxsswem0R#uE7b6M~*{#xJ7GVxIh0Trr;@+EGm%3dmd4^(Web5$B{MZq__xg|eHS)Y@)hJbfB<1E{c8u#bqg^8`ZV-y1 z4vSvXyH#kk;4RuKq~JJ6SJIHArp|t^k%3%wV&qxy8>C7pWXSP~5-I8^$dCGQ3cSSGE?awFhbW6-W%R!@YDxOs0 z1=3gGdSz}v+)vh)W0mCm%59FyAjr}*7K>TGOF(D7oxiDD0DS-cuK5wnzCY6uifmro zuVq<2G7sF{FIj71eiF?6#V(JR>qf3I5>m$t!Dj`w=aGPB%0dfpae+5S=l<9kNRo;k0ZetyPQ2U_t8e zUE;%Nw@1ESX9(*hg4|^-@r`wbk4pYin6kLcvx)A3ENTS83Z0^9BAC02KO% z@)LsbWHd1B#$>y+Xn7R!rfF^g56HR|=w;Q)eNoj+T|Vv~3T;vi>D@wepx5qaA2x|Mc3ei%CaQ6-<(2!|~#@qUV8tugGVsbl$g z=*?rhbR0hZ1;7GSFENVmANh+O_xvsX?~#yf`Ij-B;!?7a`Xc|Ybk4U5R9xs{i5N|_ zmZa9@@N?~OIj%)APS{?e`IVy8d!l;|OzS6oiG8)TBW+$V(^VAkC-kK1>N2jSJCFqs z*|C>H`}Zx!m?@Oic20;}Aq=oKc3wT18^hRv65(>_#(wMMG5%VSz~B-T&dGi67@1PF z^iAKXXmPm-(VX9j>(Wa1?0Hf}NGS1PNa% zB>jZ>*j7J0wpFZ5({prpk){>|i^0rv@MOy#L^$mqu=6f#2erZwBS^{t2Sta08pwdiiBT}DWI3m*RbWappQ^d!i(H-LDQ zgYvFs?pM~ATMqi$iR||6B6HI}T=~7Q*!7WuINO95g^Yh0(!PLPork*{Z=PobFT>K-1`;ZJhw5$zowcn9rM_h)nNw}Qoyu3#GXm4YvtU$Q;D$IHepn%=k?wW^WZSgy ztq`CgS8Wct-1_5|%5~3Pe>Lg1?;zOlZ%TANdOsrqx&`d~ z#wy+Pd!rMOwyQ=(ru7xx6erifrH{1riV^33-q?1uSjdrN>1krysH28+5?WFnLHQY!oLDtZf*?0tdu~BM$b3k}R)Irs zFMSk@`R)ugjBN3OcU4GmPjY%WwV501hNiY#KW9{N#?1M}UGV0f?GqGcDjeis09QX&IW&7!yys3JiP!hSnJeA4u5 zdwuspjl+XJfR~x9F+w*NY1m50YP6afe)p3E*g3Z8_FMXfQQqtLiZfHzF8wCYG*}>H zH7l#wbuawqRG_o}ODm=IPzsB%dz!7o9jT86p%&$lzZp$QCL7nl7< zC$?NXAIc8h4Q2SV*uwTjD>Atpk5soHJdSIz6SeC%X0;s~i zJ6Gs};Jg7C{(CI?ujd!K&Xqn3We{U|(l-J>78;5{*lO0joR3Q^s->mxnGB7(Uy&7f z=AX3#(-x@U#yUVajFcHyA4(WuAwUKIYe0L-GzJv0JIuwIK5BB!4HXSECJQ_lStDA# z(o72GUVLsF;czLjU9`a5y?Q+fVR$y$TQO2rI&gCWEA#i8%kL;^)H zH@0gGiP6PKXkTs4P|J#%PD_*_OcOWk;O4+g-H|9GDX_ma0+7lZ^)`CQ(tQ1J0hz-V z8*g}MB2oF496(hbqjI~GOsPfSRZH0IN_(thk_Eo)!*?I}9LwzERBtz5t-A=MCR|^l z6UqLd4$hU|kayOYHsISzK1pWDoq$g5w0&R?-(pp1-2j(T+pJ1(Az{H*_(tf~ZqD~< zhf}P|yWPSQTBvZVefg58Ec&yq)hi{B^KB_0XHIHhk8N`w_g0#`GAAS_r6h^6dbh?&cAA z?BuHrz$ZP=D}91$=ppCQ0ssa5~CvcAj_Ytxp?syV&^9=F`}8IwClyLJ?;a>(rgXBn#16 z3`^xqVI~)F`)l-Q7@c6`9F{L7tp(N|+yyti$@qL5wmz8fK|Y~H+-AW`rsKXVYO8tS zaBz@`3*MeCOgWI7V3Y-KuTh68k}MFV1JXUH$Mhk9!_l)9HRLSv#o}s`U!NXj{G=Pz zQZJryQ`b8GixD05KbI-a82{uTZSya`1-@PEQzRf@)!1YU!bkKK6IH|f zrPEOh8hR11HP~n~IdN%g=_GkUc_mAjzx9dRsbDmk z5)lCboje=e^g*Nh)DH z8!&-ajh}n5>sC6ZLzKg@`nLQzEm^q_idk&lYap0i)}E`&9ZL!s`<>SmtM0I0bBha~ zE#IA7W%oy_II?`L4-COca9X3=$vgp!%ilT71FTd-5M8=wR=(Wx_EXN)Ak>F2f}XyD zywof|*aObzvkJ}P&qX4x{j@|1DcYC){9EZXM5%r)rF1=D#&eSfZ=AiqRna)B#Z@D* z+AN1LOwNX^ez#k=vyC3DLrH=vErtF1{5cB^8{^6R=8pj}O?%zepYpM?#rH33Sdx@S z1RLF@YuIYveVv3HH5rtN)9|})^O6sfa~CS`b3YMQssYywS1=pj|15oQfBlafSbKD{ zfUhQzN*RX3B_9_c1Afo4ap)Q?V9ArzeeT@Ud~*`s zVz0@vERTpXl+?u=o8D-lPIzZCp}N76@p_kn#yCr<)KfQld}XB_`Y{}r-&~GNA$Md= zU~SRw0aYza{#4_@{;y(#`@!<9JL1JV<+HoGr^F%mH9wPa1rFz3q;#K7*_-y9a=9Vi zH>QiY{WS2hbXXIH6KuHOMQ)^;OZMvT0;XfVXGHa&2Bi#ru zUtz6V{`~20Q-OicFt>9DX76Bc23f4vDd9Fhdny><{hsYiF1Xx&yI0Xg3H$)qEmoZE zrE?HYK2^U>Ai2w_6rt{vi5O$>-q^6TQQj=9n+TpH>Ov=TG1)BUAIsHO@pXNaIU7WV z5Y)5JeMkfrq`6Kw_pYSUf#9rk3d&O<-p@Ik%$saF^dFg^DeRDHO|?re7`lDu1-I$^ zQoy1$d&WeuRL>p$sEcQ*LU-`w5?v>gY|8OqxZ(8QX)4M`N-u9weM!}*fIre+GD{juVstDsVHAcOsxZ+zw21$wOSF9 z9kmjY##+WhoDmbf8c<)+!iYPK|v^h=m)(!C{aJ2CJK$}0BWM)x@l z^6ZC`LAH}V^ZnFY(~_D^^4h^*BBT6MKhcq4 z*-RHu@l#)X-nC|TX>F^LS!k#^ue&eT%Tv|Vfn zKfUoX+RcoXFh;us2DeT3@($80i{~K1Bc-3>J~c@DyEJd`D^)S+oyb7AFNLiD5Q*?j zfO0dsVhsep#tkB|XnH;MICHE_i&77p#&dN9N(c`PaTqk5hRV|1^rSZ<`dufjI}IVT zxnr5)zP^XudMxnEs`2#jhSoeT2$wyH?*NH)YH4rBBNcn98LQ~R@!RVUkgUzj&B6P- zr>@?QlK8LK6nGvFf9Oj5!V{XPhY#bIe5*+Fi*KPqY*6JHluT>s$Uj-xx>Z{` zBKP;tjE5@}9@P6=X?5Y>JR=FC7fmZ%lY+5Un8``^^U zDqxomZMv--1au9h>FvU|s`@)e>jVORQvv5WCy8#*lg+8uMT2B3SgH{ z3Y$V&yNss@6oD7ct% zA#0*HT{Aq+UTgMt*Z9Ht+#JjQPw#MAs~AWr9S$clD+S&LX%?PtZ-CC%YSEF?KUTZs zKcg`M#-I+tAt9~}UGr2mo^VI~_Q^w>{M0#`seP8FPHV^Ibp1JI- z$bLb|u2Y@}-=MNNC?Sk9?|v}4Ux<>>jIgFF^JH8!Fw$F`?!fmo{poyDMM6zcd-Q_5 zlR9)R+Tbe=X;NRx3+WHBM#2rCmz%i6?=(S*sbsH|_kw&F&ym8rbpEuvBqZ2gc4b%k zB9wK@KzRh1{*KL+W?4NS?yAKWScEX@1l&B;%jwr?9b}SY`#(3cTZeF1Phm4?ao%)C zmydx#S$M{HfKmM;KfTw4c~y&Uw*b?s>8&ZDT7Y6cwXYElmap#(PV9ya^5mfDkC)-@ z*Qdt&8?^AcW|K&scXE+L0Zo$G%*1{9dA(he`}u8?(X8^ZsK+LIo}f4Za7biJtz4B) zTCfE(wS;SYA1%Sw1$i067enxQ)-1&+)nGhB$;tHJ%iQM}wTi}f^VJOS+;3y0rdiJm z_gl~SG2VVH;P^m{Q%qP8HVLSYq{2|lJ0YvbGC4JRO>*x<2C;!`JA8N1omwQD6AIvh z-{FG5u5`rrF>Kh!S_$@|RHzls#2Hb2KX&jykkt(wj^8LU=^W{CkEXm?w=LUDKLGn0 z$4*g)x}8)0$4CN_i*aY0HCBsg`C z@;z-QOg|n%F(^c#LW^+j4FBfYKQ}DS9)7JgB>39tI;w;e{d8WYLk;OA8&Zc^!`zd8 zFLBZilj5pbV7}c%pfLOkOhibe^m_g&qU5}1KiJFfVgn?%OJv^=XXanA{-rKH z0FuIL_P2jM33hsjZ!2Ud)O!e&J4We=-Y%&Tf5FYiv2tRh$1*wefuW0cP#6T`XK$dlJL z3D`Wug?>Y`r_2KZVAk_%Csu$;p%-3L-^%7urMhtqh;-eO&@xU(KA~AR50_12B%Oc3 zrKO*Rm12+#MMe`TDCNM=4K4`h*3AF*3LMXM{3PES=8)t~@Ei<#FJ?}d2?R0VJyh3~ z#nBUlBv07O$9ci*Yi(@btLByIx2hFvTWz~|5_fmKK*K2z&_}Wu`%oiqS&(%Ps0Ep? z??Wi#CL`iTV9ue|e*^00)K%?Lfx{W(TC2JH_seBqz(;4>p9m5p<6}=qaPj#B@H0T`FI%3RyrnU>;33iCn9N+OH%~Y&Gygt=`#kBVt@-I-s1^ z##vz>wPcjLq47)07at{cTNTWEfN-($)y-q=cT^%On5yF&!6MR~d^7TOMj77x1nx`KdoYhaz zTdya0!nBq-^rp^ctT?#s#f+|X8f}UGLJ@2eaO*8&_Vj%_I_$ZK&+wc?NVR!IeaWKp zTGGIi;5h-eBi=`?5_KujD+Yqjo8ie^HsGh+vz?yA0#1syT*Gu|{{3Ro>=^P4GEIG4j93W2D zY~ANMm+s(i5S8?4LqaLd{Dul%Y}DoI416l-MgX#6j{Svws5$__2vIcVv%hf>AUpd~ zm7W2z&L9WxV0M5`-6?gr!Bdi#uXJQ*PFF%Wl?w(U9mjRj$G)8W$Lu*sk%|dT4Aeh> z)>>@Tti9xNc>rSznKPwXvA@KY zVDPyDDv7-7x1rVK>7X(R5dAnz&7B?7yr-6agXAs`MKc$-A9VCVL08CxD&SI8BT=r` z4+W4_60`bBW6NSE@L+8+?*}fIgsc?&CNRL z?ay0s3_6E%+isN9E)qrnw_OxMA||ck%nY_+i$`4llQ{osN%uZ{R?YqconL-6sqN2Y zpV{1m&8u{#VFI$7K9>g?E-IoQ!>4KGU&ajB zh_HlyWUfLJqfcQ+^jmac1E4jJEyCvyaAJ9VDm-~%S=wt&e8~|+AnoJ7QTocJg`h*T zX(%}14|_Cn_-^8n40#$qlSHQfb*0YW%YLY74y?}g04#pUWeQ~E9JoFL*tFwT*yA%Q zjisI5p!8OgwAU`}ht0M6x~d4NQnm24^7yCW7~+J%CfCQ^8%(amo|yQT#6l{Wi<*tO zg%BvSPEL@rJTQOYsWtrjqF_rP1-W*bVNT(zg35KG`HlCy{e5)ZYH*zAD|+SnNjVS1 z6MJ_{ji_ZO-$XOT<-a;M6*|s)G1b}ddA5>wz#dL(%?xGJtJD+*mZ9vn2IWG+7aB_0 z^-(C9p2&DJnWJ`Nw<7JQxbq#?RT~XiQfD5w0QC{zYCHkLN=5(?W$0+#lHY>_PvO>q zJ#6Aic3&*ucpg~38S9-5e;d7I%`tXvQ(%RdzZbOvwE#mteXncpwho*BWX-V6?cJ0< zc!!&4KI5dYg;=n{g#7J~jpEE}o@+qRx`?X8w@KjUwcqfZk*$ouwjOcT)D9S3F!34~ zt22Hm&7bPHw{L2IBy(^pTLq(Mind?*5e6J_>H?`whU2e#+AUa+lK95SACK(;i?~Y3 zV=UGLIDm-)b^=@|D{W+^1%Ff@P}aK~942Pel}NKJWQ4py;v_6$cQ-6$mIG@GMBq*+ zaCu5Ip`fs+1x^ljZPHErI54W_M)$I7-jW;4Al=m6Bv582V$wSAIDkq|PG9+W*?>b4^iXU6E|3^AKgIjQb^0u&~ z-wu4!SZP6^27~cK;{0g=&xxxzC%nxg4d7lt{-K|Apl*up{5!DvloZ`%8pNv7vkJra zb?KTVzD9<^Mv3e-n(y|nc0?T=4T$;tPq>-Y9KuqQyT;Ga?*C@wf00P_D3|o*GWD(j zTds~Cqqf5Lozn;f#U|e5^as_r-#r1mg%+%SL7PLdo>Ev3C+!AtIZup_)NEqis7%Op zX*Fqnnr`~V#tvD=bxZ%xbpO8$t^PewQ|)5XuXwC~D>~T~EtdQ9L(H9~O(1naK4M2n z@-b<^?PeXIs?wbdxV-&df@wEXH(Riaz;#SJ`pBTT$KfHFsva$f^=IIn<$OT1+)GLE zfw9oFX&@`Z+)B+L=~X1bYGU~jztf3kFB@UIh8q+qUq9Lia~zC?1Q=P%8`JZF}+SGjC|~Kvn-Jln32l{eQH*bySt@ zy8jCZ0-{nWBNjQiq~)^lZ|PS4yVXE&+V(h3eF58qMOA!$i7II zj%_e*nS9%uayY3=gx$c8sNysM6BE_!R-{6HfG%7&}i^5NJ~`gwT*&y|0I)@ zT>NwU8|omzF~#81-gx#=!L4G4@!h3E?&M~_7(sl3$(TG}Q^LJuTcI{u#t*s< zBpi$QGCV77riZ2(6@MZuDDo-d5!wO@dW@(7xH%{jL0FucOAiZO);iD=9bBP4ksJ*; zg^hY5Kl>fl;G3IXM#`=~DV40R16~XjHzcNT7>q<2C7u5HAwiDpiQj`Zp<9pmEU>VX z6Q~*-BQztfcpAPQixhqi>l+iVVs3vnpXiT+%ZQx!q32Edop*bhQX)MZ!nv>vba5}8 zR$g-&sH?1^$Jm02V1ny+qH!PP9_u}Cqt)3zU-SrD>(>>?LM3lfGn%BTV07Cv-ek{5 zC0G~`+?AAr#}MYtbR$bYvIPVl+nYM|{SqXBPY3H!)0R|(YD3@c9U2mv{%BVl7M9Qp zH5_d)*s6J?>ioRzxa{JIhR-$AqCFW}W8zRsmPBgSlzrCQl?J2c`_ zYuvarz^OvdxL-HX+<2BswTBZoa)3yKVsUGULS4RAey zUNXnZYIKoPQU4c}o2Qcrf8KFKx7USkZ~a`HmC(_-{C;=0Fl(9Zu0MDz)e&cnoo?9# ze|7VJx-s&QXsZv<+iD#dj%7sW`+4n$){AIT*zHkUB$4679_Q8JtYsr55N!#)Yt)6_ zUe2E{cDhV9g>mn5P&;VLZ_a@-K6TZiyyX4AIZ_sut>p?b| zzG&F@W3L7~z-h@3<7NFEH&$S)3R)|omkD`Wyp_#xbY9gDjg=i%v-I<){Lpem!|fH{ zANMJ9{;EZZ zh+PSjd)UrIOhl_c*JQ1`{AV0_A!hkht#MbBE-w!B&qu z>KdEPafoG(hDfGN@{$W604Ah2&l8wC9R9f*sh0ns>anq;Y1u^ou*h|{-EmSwz#KZ8sK&7PaqqCyW+wFz4SUx|lMB2%9`AsOv14GYlcR`Wl zCy#aFucu~Nm5Y(oidowqLiR04!Jq82t40+WjytE>S51H8PX3*%YJdgm7!CCO8s$+B z#2bd1wa+=KRiQ7GZ0$h%?dQ$uiR>{@ob0_ojZB&{l1ia5w5V^s>}Pyqm5y5coMap8 z(~Y_`+-_&Z?w5Q5dJQJg@3_>7+?Ms0~g?k@4BGbXm8<*|um+Y@?wtKZ4) zvffJt#lcgFECrx`vnaF+aw|3pTdTdXnJzWfZV{%!f)i{~N>>w?kKrBjHa7+=#V;+z zRtoAben4)KO*}BL1mxhd^0B&$mtVuqr#wnhy$uirQ1aSf>^vYZ-ivQoo;=%$C)jCj)s961T1bB-scXM02P$-QgAeyWqb*vy=pX?5Od#s` z0$cWpk3>f_ow`uZypl>Gt%mUT7Yus=gMH2?mpee3D?Pr7v;$YjP!&FW=2*&tPP5s7 zGiT771d0=I3~t^ptbpq%80F?+L6uT80F+UPj6G6W7D94w_XMMeLCUT!zo4yL#3)k$ zWwqJ1eb$Z}SA*)+xDjtTN1+rR#0J$ z;2?tZo4slN5s~BE5rQ5f5$a7O${eIq`*`2AE{RUBAJVs#wRYUgU>kbW8$o5&hA1$J zTPwpj);fYjr}M@p5K*AAcolSu4O%$v+bw4$I=5BXa-pwx6NOi=Yehj*jn#&>AwXV%jq@Y!jcQ6mH_0 znSD~MHlFItVmwi9ofu9|1wsc0h)u6KYibO^#KeEv@;or&;$TjEh@f@IX^)}Wa&h| zYsqsYTkn=b7wA35=IfNH;4)~?6}RE+ev-};DWgQtd-ZqSxW8e_1vW6`G`qS0G1d@} zZ;$uu>I@GW-E9V@je1!p*J2e+EDCMbza!*bJh&{Z2bU%3w@nVlx;>W=LFhyYOn+1m zW33pCN`#wfDVI+C1^fsxxlt?jkY`JgTZi8UEkrymi$eY%5xhus(k%Q zxju8WVlW;|8l5|rn`S$k+D%Vnzq?4Ez-AdC$=D!VX*s>M(a!m}{eTJ?y~kAo2Q@O5 zkp|oN`V2a`S#mr7q9WrZ-FW&+X&w@(>uljb5?7Zudbv2ob>XCd!P)YH`%m_K;bw%G zlBbBn%TvR$Xq8Wb?7`!OhRYD+PwXtE%LmHJ03sMa^(z(PaXGH4kT2}FJ$SnVhnUXfa)eDLMs8Y1yM$G1DQj6m(NGCY0wd7v_a6%K&Bx zx6ih6;J8O|&sr@%M;Y`!pTZB9DN^>t1No}mewZUUJO)FydS2+>)a6fso8yjwg2D+~ ztw%CPzf$13aKHYM=mRxXtd3KlwkUarAX0vq|J|kT^UPS&xw?$g^1aL*sK6b!l&<&G zj$mJ*RK~d;`L?6Zda71WE5rHF9~H9_&&~H-^~o9fQkKm<5aL#&=_fQWjyeId+SOEVUkpBKHLJxB{ruASj0p357;WH>V zR;J$R)KREzg}Gd!ZiRiU?Oh1FV|!8+`deDk2-7FH<9Dyvjfv&arq8zjEJiD1QVmcK z%1AmTl^(8M5W)K5IGVbe^xo->L{*=hdD`I6m^LX}6j+diUfls?+G~k#t3I5L3trhL zf)FTSZ8@x`mCS7^tbU7P6Td2|E^57U4`3lls~eK{p593(5?>9T8_jG!Yz19J zUG%Xgb06g9-M(N{=30sQa!qb%F^-CE&pAOYuPPib5cEfvoZV^5iYgJx?Lc|F!W3W>OMPX!ZFw9>m}fVfebfWS5dAbf16Vq!0sCl94sO^ed7Hf%JzRrVE=Fb zI6_6bjU1tYqPE6{1_hUO_F{#Q@5Ttx>)AtYY7k_dyf@U%LYHngb4nni2EbI3^hY~1 z+yn65eolUmJTVawC~v`5e#l9k;{o3$kD5~rNUAt~uzSEm*(2b-9*-HzI041WFoCZT z!QLoB>Y3IpaV(Ay=2+7v$O;Au+SAC1bAEimM4f&9`%Bpe#5QX0_^yWSoNO?HMVM;V9NzKx)>TYykA7PkM-#Bv94;mEW>azKptV#JVfZ!%|cNO{Z4Erwoq zSezesTt8`sff^y`jbCgmurexSVS#N_CDw6^mEW=fPR@G$^9{w-DK^}1H_{2FOHc{= zDr_EvgZHNAq2e&J_=~Jn0T&(#6HYK&zQ%-=2oUp%SFm@(_m8kCIk)$Lp*H=wXLG>* zNe&TE1a419WibP!o<2gUSFoN|hePyyBK*#;Ih8_E+u18*#)cNbREbu{h4TsaOgw#u zAijmgpg+mSF%>ti!X4IqJLqexdC=c6<=6R4gk3rFcu4%5sA5N$kJD)=(S}c+&0+C9 zpfPMF-nJJqZi8}X<_z<&INl7tuwcn^*i_qeDeM+g?PFQee3NILCchUGDdfE&o+g8X z(~Zo(Tdn`iQoRYUK@1f<6g81$G2|54&(+k0+`__TT8LOJV!yMihL6hfOOK^i)E~A4 zrP6H(Q&_HlH&iJ8{d6ks*m_2+ZbZ$=1~(*zL5Gy$JDx2V zF3OZiV9>5T8}bitMBcZguPN%H07P(-OREE&cuvzww`-{50L3Rb+{)I=x&vdHr6-el zMvl|~IS6fsxgLF<>;^M~Sfj1YYql0V7ne=M_J$YKg%pMcNWxxNUm!U!FISC)#^%+TcjqPSH$gv6rWgjq< z07v!!?lQC&Io3*&w=`Lh|IiUiy#BH+l!zOMu6~h8GMmrMm{Ys*3+B3nv6s5FKT*%! zq0s8aY6n#4qX(3ChcE1eu}N$enIu9vZ*t2P1jlbG_VcOnwC#RpOK+}4hVc*EKdN8e zw;YwIwck!}qPj+hQZ2F~!3^z9CV$Ak_IG{!TUhCMEZgYxGGte!H(GVW0d~Exe=ZXE z`?RKzMjJi*w4JMo`FW4qt)KMB(td}`p}jIuwn9zmMlRy}+M6tC51GmPhfwHCe;k9V zwtdDbiEdQ2Xw)ycN$MLw9&A*4t1B}Ah<}1yV-ugen4-d;XBpm14J)jk&7Oi>3DAI| z-syMlwxS>#X0;jHh=%OgjEGZ-IH#P=J>4FwN#HvJwC?a2`h#c$q{3+IP=1}Lui_hh z@l>EVk~zq3F(&u;boX^9k)xIp{>9N;aQw(`MLc&mFu+-B(eA8(+<0>=Nv%>^&NnX6 zK3?WJ$zdtBt1nv~`;dNZ7WTROzOTtDSsP5ztvJzF!q*MNqU-5V)fwL;alQ~VUfj2S z$mtV{tu*CkPrJ9?t)7;EoLg)(^SleEh9MSPmPh`4kXEHWy+!@^U>cN<+we!C%MP^+ z{*BOo{uJ3GhGxT|OwR%JUX6UnhhpjZ`B%7|si;FE(>F zV;ZmwfILQjN&3*6=8WmV1LO8cr{2i?(Y`^rb&rt*2LqNrti{koYY(oH;zGwAw3&_e zd1Uz?NXX{1mA!yHRe?gI0*4p_dv!;je)#n5Mw@5D!LEoqp~}REhf>fxKCJtE-J(LE zv&zvEnZnWL#CNfsHIimTLJ^~3{Jhh&4w830>OqpqVEK^ zQ!r*uwq)hwiYSdF_^CHfCop`I$L=VKA>G| z{5ury8zARL5YN}O2lfYh7!pajz_#(IUcLtnbTW-W;`wyFTNimRyxGA<_v?($(V7(~ z{b2Z}u5K-uWuO?n+3P2rTD6+XITVj#DCjsHV)yml2TQ&JH(+N@D-MCw$75^AlG$xd zky)i;Q@Bv{oMEKi82fUv=?-V}89C1>viD>35N;!q?A)sgh`UQSMXZ(?$%f;9?K%H* z8})yC;Ys(#strk?YZp(~Ek~G}(d69_C@99F4e;xJr_Ot?Or!cEp(kcIXb5~6BWe?c zI@FiP8!+MYO3X;efSch_#-keA)H zuw6so=8rcL>ej#ne{5dS0Igw9)NsrP($7b>CbUe>Kz?M$vSM!r7ISmF%ZSkXiXti_ z9+1N&mW6!R?kdqudxnDS=?Ex$gh=ICRN-0#GP zvJvD0D_QmFx6CKbb~=s=w=v=OX8lLkLeCrwKmX-NwFLSigMQ1{LOk(K>WSQanW6N z;%)O1FsydED7(DQ$66V55jc}D{KZ?snbjHCD?5C^{2CIXQVXR?%@6wR@v-Sikm!T@ z^ndbmKe!P8XIJjl<7QT8=G+}yBsE+j#;hAxg97tAN_4pUqGJR_>6gWvF0AQPu>cH) z4Blw51i(YNB)n%CU>WQ?>9al1I*%B1ZrD$XXE7S!JV`F&wdFhE1#ccNN=l6=aAeVB zejUneGloxOc3aD8)4m?tS@))OuntL}I92fPn#KRgC+_?ykcsxK7*UBXh!EVfSOxT` zQAwY9cU5?xaQyvXgtrq5=#+H+U>kkN*Z;r#9KH_ELHLz3`bErNM%zH3iO(f4FH(k! znmk3VGDos1nfc2e2bAARfZzEv!k@gwU;-ZKp@<}J|L2+MKT_8zL}qEY(}SjaiQP)5 z;amc?9fUYvPA2f1L^mMl{|;-qIF^imryrBAbMl+7P%9_(bazy7fagSt`#!!>7G5s% zw^7S~@=g8g@8Eh$VZ)K3gJ8lx7@t!E(3#B*sa>i*!c0a=omn`6VtShFmmlchf)JCt z|G!?4Fh-XWe0Xo>rSkNDWVQeO-~TTUjJPOR zl1g`d(}(fDSNr~}^6<~M`^Ss_U*1%p6hll}I$D_|KjJ)wE?Smvn)E?5!eB5)TBE{E z#AY#uR=u>_?O#928-b-xlJoA_la1b;agrV*&8mm-Q!)^9MoyRni~ju??4$)^8=;d_ zoo@eL=oa{ab#WWU|3-D+jmr^ThSjsT z9xe|bLVyPWtl2YwVYl&SHcKrkz#ny}mt;P@@yO^OkQ3{4Uc;u6j+ij#-l~h^vrknVxuHs1`K&-Twr(~=jQ*zj!!HIBNmq3@eZ)_mH39a%bUFR2zTZJ~p zFRrHi@e4^<`z@Ng^=fo~+&VBK~k@z61o{ z2;zpTo{{rdaeJ6T&6kiYHR_{ImQB5cGe)Fdpc2W1-7m|Bf?$v{($Y-xIY-9IrmVNQWI?v44f0`DC zN<<<2Di7Mrlun@rBkVt1_iH3I{T@c+(=J9{bD|*TpmlA7&qFQCr>uxUynm-akzvri zVzXbf*)^?R+T|`1^wr}A?PZp&Al4q@w!W8-xR<6Lt_%|bsMP{J4=UrulDxg?GEt59 zmXy9|I5)DxH(=&1{X-|iF>G=%``VP|9JhXx-`=C1;4cg5d5Q@XY}{|0SpUZn{}v>` zEK6y5@8%yxtvcLoO}G0Bpi-kjlWwbcG*c>^`-G&#WKD~3M26h?3AOmgNFPLvN(-vU zEU8gW%_fTqEvIIrHgf$iXl#c%BuJklgU!32}wwW?lO~=E6M}9K2 zkr$PJEnrM}ua`e(d#-I9LUU*j_H3d{Ry%eNlej7)cgAx+YG3POz)>h3i<8a9;c=FDy3))ZT`h4XXgr!lr&81u)ogLk`J&mL#VolDF37E(n1m57uk)B zP8?-2ZrYudP$lMjYzR9xph~h+c=7Fn|MPD1s>Ph!AY5uX&|nOBf*m6|#N!)Hyeck( z0II5VjLpfqs`bfSrZOGT2^dlQp&l~yb zw{Q}5NWWCfXL{4S6@i4(E5n{P_Vov`r4`ArHByXp2GT4`nYcF(Y9;Xy+r8|#7(uU& zctXU`HF7Z$>^FTS)l|R^Ag!-bg)kur%vO3ZDCdob-(Gt}uZn2JbWPcx#0;(lQstR? zn$%Smq)&{FhovC*C;r2C7;pe1!c6!M``;a~Cw7oPsVwD(xs%&-{w+fV8U96Jcujf zNNaXehY=%XlbEIiCyVi~IW1~9H=ZE|vV1}8yf6soqZEtNk1+q2E3Y=Cd*pCf^}*)W ze)9VyGD-JG%Ha}PNYPy;WRjTiJl3o}p5);vx?lwQXIo7-cFvan?o)vAxkHQW=D(|! z-KS9#9(AqlP#pO^A3>qb3{MrwBZ%^b9F9vcJbjl9J4skv^)sqYA{}-S z`T3k}Y}8v7sR6ECsYRzf!{0h?zkk=C3O$;xF^#3uC>Q3t`C72hv^OG2p<1Y!ae7NJ z{sZBhOZU}XsYg@&`GP{y8HjV&foQ-FLQb2m2AYHQp6Cc5?={4(eckpTrFOue_U55C zKnK|0Jl)Aq%9`s!1ceRH>-E$ihEne=XOjGh!fQ296Z@@ZK6dT^qD{&DxvCtV#n%r* zer06_N5TBV-D^=%^QE81k#{Z&qvwHGBe)`l=`r5*epmk}8hI`2+IAKqry1jB1zBLT z->+6J#xs(5)a&rBG8)|0j@v9F;cap39ReSi6$@APx{6BJ%)`}V#HYk&aNZGBXG8^Z zVcoojG>1$Z(*r^}J!Jbcz>&42RxC^%7z8VjZzS=WcGa)~VyT2b%Ptf;d6a0m!<1|L z8miXZr@?|u<=wAd&mL94s9vizEwUdun{8&%Y5WZOp;wJ=SKD7MK{a~~)HEkxIrTJ= z#cz(3LNrQuyjhQhqdU`GCtvp(UbN#4lE9D+@eECNC!kzT1Bq2)WXiHVd~zBPm2Eu6 z%Wr2S9KVW|E~~YnMk$dQ2aJ;o+*Ot_if%i%UcNyY3nw9V)yqZbG1rnYR-!o8_2#n< z>eWtxZl}YdrTUu;HCMTLYZIEbJq_o%r8;|joF`KE4$Z>l)}vWJGjbR=lWjv+;64lt;?U#tJ5ZRv2VZc)2F&{%kLR3nRUL3e)rYM@H}3qwz1KVb{uyh#tNkF-_C=F0(af})BW|#(dVXn{{Vtoc?0BI4?nLheh2O{=T$CFX!)qYu&boObSchpyoqdapXNX!Ct@#p45O;bUn^bb zK3DZ0dBe_Q7@}b$9^{LV^CW|YqmT2UxbzBQ=a>-PCS+&Et?c+O5yrDpZ{_+%6vLlw=2vGr@wuxJKt*S7j{ z*#qL^t`E^Xt)F;`ZN^Q;Ckk=PMd}n3)_Q0QIYu7m+*MZRqC;-!$;(svPjj$&cRz(Q zIc$t*qVF*$m#(r*-(5bBe`i}s+^L5uGa5Ey>;lcIkeS`istT=H<+?WWcqgxM1z&U> zx*3~nT{533o6I5eB%AMvA-X&5%&KMMtx5=OSx(6xUWG!lZGlzPH9Tkl!KTGjvH0EX zIZ1=rOp@b5&W`H4Zii9nBMZqCf4En-KdZy{n91IgO3ch2jO@z{>i3GBSY z*>h+tW*fiTlqqJGemeoC98tQ_o>?dCWRSm?8K!9n+d((XdKu|<+s{65kbM0eS6+Vz zp>dU@4LiN>$`{qt%yco#)g$DJSG8hh)Z!puH7i#+dVpwFsRzN;GL=#i_@?Uk&Zwt%MBBGgcM!LokY zB_%Q7O1ef=Vh)TWvp3DUKgz?_tI*pzVA=;t8DU7h;musSGO&bu3uVhA$RG0@#)8|# zTe{|4zbhg$!YlHdkG`gN5{fyh=LEJiCP9lm6cW+HclOBz^aUF4gPuGJI}K)$_90-s zV?VO}M|x!y1&1Ucs&4g<_~f5a2`MV7TWZ@gpb;nMfR&UWN<9S@0d>+}4F{aKst zJc&b$T?$I_w%#^XjdBHq>=fQnpNn+I!F>g>K-`g4AW8a`cWeYDl2R5HvLVAd9fo%T zcn74B-2wQF@S?$luNz#>VbaJ{GvyX!6{ZtbZAuQGxak9w3Y+d+jMR~_8PX610zAgz ztVe1j9g|+@r1LA~q>8hB4zdB#5VBvJTn2e*`x98L2WHQgC?tdgToHDlH7qdUov+cA zv2}YucWP_NbBE%NNGGde(X#25GD)dXub`#(HyunFd*baP#@7s0xN=j~@9*6+G78aj zwgva(cDHwO-AGEx?eYQsEn7T2BCUf%=uuI9IyuD8#MdMikT zb%~-l3cRpvrx?+GVaQaG5mm+bHA4w_=0o3uPdAm?}NggU3&W}Vq2U@20rjBo{dy|?1WNIHd{=UV>A z)`ZSfjv(MI3c$-uVHcroG*Qggo{zL}6iJe?5e_vuj`>6oIo#jrW`O2SBaA>VC0|2C zcE>3Y56j%UBkUFZBjg53l7ic*0l%^^zH*?YV=}^*uo}DdupmfKwjp-?JZbFMx#{}L zx(LON`L8Q;lu|6~ZA>^lv(XAyS^Dx*No>Pk30R-5LNNF4$QlrS74LXzcZi1KXClQr zBv{iS32YbWpEU?btttDDjG|xgI`ZG2h6X{|8k%ym@+RGYI7|Pb)c#&sS$2tltn)8B z>cNu^Y@wl;f|+hEiuyBKXf%b0lw2oPqR@-)B`u)Iy@eO@-gHK7Cs%w2MDnaOQu(!? z79GcY?++q~;pJR92PkE?Ue)EWE%!F)5)@@aSHpNyA?M|%bU`SD>3tnfusf#MXhvg1 zT@VHIZj#GNS89S93na#~PHSF{=WU0f)g!Dp>MdVO(CER6ycTUR;A(me)yz#kqI{F1 zIud+}DA3_N4sXk_z_$0!Xji2lCdv<4H7%C~p%08Gl7bxWN!l}SfiHX2s5|bh5sSV$ z^-Q6Ab0rP92=OPzM0GRfKS8Cto<}9)=dY$emiaYhnIh5Bk#{e~@2b8|eOj;= zeeD&Db#IM&^fZV*(Yrl>tf(QkskF5OdRU5&4JFBAL|*w7^V2|IJ2Y;ddv_l^ho{S6~a7nmi~N&ob6 zR&(x9=qArqZQlyt>ycLvqlHvVp-iqwwlnwSBJUrBm-d}_mOf_rvX{W6A@wm-Nw=ex zio#op@-;$0unq~ILMPIZvNFZXY8Cau%iSXW3Xwoh@5kJc6%a2B?gBIhjzzt17o{|` zRA3w^%WiwDx#Xjs|2fv|ACt%Vu$$vvi1Sti4VPsY-*NbRGdbCV)kRPxUs2Ql#*t~T z{W`{^hdK|>8yV)c{{k^pik?xfM9W1nwl>9{?Fl+#b}XtJ9izT;UW zK%TN{5z-kSE=my3W|*2KLR|D2Lu+NrzO59242_NsNjg?XoZQCfQL9n^cUJl~q}~{(J<1lrZhN%3IwD zV>~8I;~6BWyCQ9EbH6~Va^((p zAOvZnHm+9o2p?Yuv>c4 zsi+t&g&&Z4>%z)~zsNGhmHOBEGF$hLtM6-<=dGvg=V7+GaUW#%X!X z+Yj(LSP?a@q%c{Rp83OVmxz+Y>?&2iHs8aA5iVNIq%H8)ZEq4{iX$MOwbACQFQHkd z`)^ups2lYxH0b6*^y?oQpOBe(___%TD@K}CMcXy~9GcE+>Gxf*XT z-$GNho=DLevr96#XV(*#?Aa4c?fVcprw z9QjphbEF4(o+Gpv;@~CHfaq^&H9V#M?>Yo2a(%p`S@dgAplZoHqF0}ztg9%f)X0Pq z&Ol*h%arUn{jdCtKQ351TZx>O+_)`r=R=PTId|!ZChm;*6TlH@$wzh|V0UNfX*18I z=e=BuEXP=LP##>VDW5RrzCE3I$ISpxIWAY8PEYqv^n!uGoF7|P=&4l~H$+04z+u@_uL7#`}OE#1IwDzgJ>6wahisn%n zZskU$ryuiLhN(wdqJVIWtj$>m7)*{j%A8%2BOirA1DUSxA6dtC?c! z%ljGFVtIepdpb#N$fe;9-{5%#9JaM>p?5I8?a#CBn+ZRPnb%Dss=G&i-CikQDYAi{ z5?lV_H&5oRir-wC7xQqxi6MD;x`d_9Cq~RRr}&$%liB^yqkm9*-!3+WZtfXvgK3ME zk{)Ip#B-}MBbn&g=yd}|RndyN3*K*wCnr(uBG>H5E&i+neO*UQlkUTR1z0jp2s^%b z|6}m*4TUEd*~?h4Qha_}Wp(5#@2tcK59AFnsDghw1wA=wy1!+t03>OdxMj;=3ErDQ ze)(mLCUMF5J{exCB>^RTL)Law?_vp_@LWVn%;oTfwVct{EoAx3+QgX8ktK>Fb9I=w z^~QrXvY8IWrW>eWp*N1ZR)gb~ak*{O^2<>uZ&_VK=eVR`St;Vm6ZWYsh(~gfg)*QK z>pmYju6fXB+w$Icf*h=2;I)g#a>sDM0R8}JbH%~o;%?Rr6L|$ zL7^S*XkzOYuzftCm3*i|pRv?7TKHjejQ=hGG9mFc(nYnIT!w?f=|n1Pg2g_GsicQv z20`(0!_0GG3x9b=XqppwaOwA@HkPl4a!w)~6?W0K#Cu0i=Va7Xty+{^w%!fe1e^Yu zT2rU@-w5sCe6FA~1mV59h~(lcM>Cmb-E=AQK0cWV*OU3#GZV>)Q&O=@cIuUh^Wccsa*8>TU5}fZzlSsEbh7T zF}iNj-yBdX{}6yJHLjptk{aw>XdS7Vcsf++%1csFu55Bww{PF_&<9MmKHC{xL}jtO z^U7wD7{VV$Zfr7hR*L(}l7$zc^K0PYpkI~8>hQT(^17UdJi#8*pE_huyjH+oXpEh< zFP3dmO>6nxB-+qwORH8Lw=X;I83osg>TMOkQZQh_B6qIOc`BG0oVy;H>XrJG-Ez7E z_2jJnQeJOKkN*|Lb7|W+rd`jv;I#cTy39^cZk^xG$_kyf)+5|~&fl9ZlwU#HD1io_& zS283ZulQP`!1Z)S-H?@u=IIO`g_qUNqYf7fymW@8m#6ZX`+D`*y-0y9!6htL?o7gs zLtm&pt&}SNl-_uwb2`h4PZQxhCO+yh3uoFUnsxco*Q!Vl-J2VHmDb_p!?A+1alpAK zoR5ufl)#+YW;_v}R_Ab^hnOTPdvmW7_g5O{cxyRPuS|3G=d?PQ&^A@qv5NOCn(am- zl!xRd#^Ij0^EN$w&!Oei1IFqkQd2y`R1usSIf2H=8u*gxwO%>vMpdZBPpKwkE2Fm& zkO4@H#NKMCL{(bm)9aAlrn$Pw?(;vBe!}hW=yi!%_KD7Po%hM?g0c@)LJoM;r66{$ ze{W2RNgyca@fPSxtoK9?+S(AuceMR-uJOfFvM_2=>u4)<{n7foNNR!GS`TXwY6g$d zhN*)sSpAssfabnw>5+45TXjkTt7~B-$0EWy&!c zX-SWcEgmrVll->(D?A1zHfe{@LUN&Ur{Xt1H^HfqU-J4y&r^{dlRDE&Ynp(VK)hz) zjF6Uoi{RAq`d(?W4tzMhkihhjZFN(uj>X2>Gib)_H1<>FT$S?|oXamY->X(7S1onm z5?-PbADQ*N`3iWd^V6tqgmzd+D<2|>dxYuEFdE`E<0iN~Ulmgs-3k+-7|AN+Q7A6q zEHh189IsM9-g$c5Sf{XTr|0wGTN)*Nef8dTKy#pCpU7~$IlfCYAsBVHyt)`sz~NOo zUCQMb5qivxVkKN}x7K!UFdGPTNTXOrk#h~N+|nvKndV*3&Yl{bqZBF zo=d9JTiO;5J+LkTG=W@W3Nu0i5SPE=Ak>?KF>K5fhSp9eo*2&C~JB zXUEvH$A_IZEY zLO-gVbd{*2qPIykUS!EhZ-l!tq)RUNQC-N%%c`G}P^;}*UZa)ZiuoGbSjCBY#1Z^F z{Na~vocrkLEf$I_LU2Csh_3EWx$2}`#x1cuQuSqmDTep2Yk=G@*I?IfntxQ(1<37Y znB0DOSEAZaNv?g}Z^mVCM(xGg-rTF41Jgb4`~AuAWnD`W3n6uJY~#D^dTOhE`kZ&{ z`85=v`|gRI1PTyTE~rblf9od-U|~BoE=vwbQdf1g8N6b|eg_J(jJ+IS`_pRW+jzX% zb6vbwL1-7L)6he#`T94lK__a3_Os7rrqs4SmkzX{_TpLi^9aKEGMUdh+N6YX_~DRZ zPl5s3*8@nLf6}vR_$Jcdue2aa=ZvhwQf6%g!@Ji=F9q>k6}om!Ex8N)7~hA!Dj?#c z14q=OkEI3eQ&p>^dh594DaIRFL8=M`h0w;mGpx4dAe+coClz@nYs;2Q<-Jdu6E9gT z>R(B>y`zhaJ7v~@I~|@$6MBvk_L*}wHMZ{Q%#oAy$DdAQZp_fA6r5mih~j*_vQg>Y zVS2K?i76|vc6KKtH1L8ydOg2FK{B*0B(}Ofc1$tAa`y9rY4X<|fldeGu=$Yq3(fa< zMZx6gUyYPw{eAB_ll~h9dsNYf)K)_dy#K6`lClcUwlEkWf}-i{5F~+gOY|1I+A+sp&QP z1vVimR^#tRhoEz-6L%VF&dai~Y>ejm8OT-L@NPytlVyCpBhZ9OTv_JPB&|yRqzbK0 zx*r8dBE1W{Zk+3kXWbCyBUO8MyZX)3dtM#Q0RC+-+tU_EB)S@J$U5nB=BAW)eztYO zS2d*OHMiDCEp^(rj~RFBTfbw?e6B(>O*HO|9A5P}=RJ&j=-0_8A-sS~%9c$&|GVC8 zCp`Qt*K^AKm?E`pQ}>nwKu&a1X_`9zd3svgA@yTLBpDnias*N}eI~|7iV6;{6dAW> zyG(J1cHFZoh%0R+i;FAgFBr6ZS98$O9ka&S*)Ac|%^6{F(S(|)* zAg&gk9~kgOxKPhza^{IaAf27TqqMl$d2s_}-on*enx5{p{-l5zlgmW*BO8bSBbqX1 z?p>ii-mBM}Mr3&xgi2Y3#@zg=uz7M#>{ZKaMr27eN=u}18>zTB0SHSAQj%~vt_8)leT18RAG)uZRZ((%PD8YWdRrL&5 zgNtFm1RH-Bzs=y|2uudhnwvo%MHZSeI}Wv3UH3XgKWg#$%SIMmADy598|nUFBTGoF zeW%ec=If5o^|cbk5}prxQ+rr6Ka25tzeySuFn+g081q%cNeVLiy!X{lCoV^*UW$Yh zzYZrmrXMxj6VpAjc^NSDM+k)G&elnKML=2XM+9gA0W{UMKQA{1lZ@%Mx%eOw=$aF>- zofIR3NXEU;GaU11Xz^)6cU1~LUB2~33E}lld&V0_xw^{n38T$(- zzO8m%gRwJ$PDn{(-+}N(Z{*?#CgllO;4U@@agK34hZv@w%{`6}cxH-#h`%5xbkl{}p6mS40&!yT8TEPT_2r4SCrH->71zc%AtaS~7VMIAGq*L22DM*Pg_3{Yp z2l_JyILvK?2EIZWVJg|Kl+j<2v3q5Q)vhyu(JRt!OREA|TALqKP_F0jlBy>Ub+Si@ zi7^WmJm*(*&w{p?d1Elfe17j7Sb>ABfe7xtFGT+d zsprCdUs!wv-{i`Ew@rliI$3ze&c|O3d;Rc;DtCFv8Ut%)oh8EEb+7UEgh+;`brFBP zEhQ$&X??EEIEejl?{kflwI8bko3jAP(_YF8UW8$s85;h|u7p@Lg*$H_@xiGHT3sCo z;5g~sC!h5A$C5zM;?JgZaxvHO%vqCzQiizp*jV$AEK^~NK|#>iczv0*)__Aj-ae>; z!e_K^EheqSbh$ZcI+7H%Cpfzt5fFy0vbHINOIyZAU(h6OV}_oaCI-6lsjS|sxjFxZ zCXjjaV5h`n6V4_6HZ#>p4ewSEhL^KJk?-8?M^Bk}R6(Q@SChn>6UaCPq-B^*XgqhJfKC)ey6%2nHc%WS^zu}JBW9NO z`iQOp@vpmJM5QUtK=rA<2Y8K_yhdu2geq(P`;l!_+)gE{WMa z?MwGJ0#-XpUegXJ5Sx;$cl7?{{z`fc@L_*K8C3|*Yf1Q&)L*jXN^gjA6(LrnsRavPHLQl0B=`_`j@vO zaBi*ctrRw?zA(3L(qRybe}+ZLtFKw)=6ngZET-L+@S8U4kC!)%(3}t5mJZ>+J5#D5 z4D?RBwSIl5Z%}I7H|+PHm9275fb;WcLivd9Q}@U}PY~%6>pEF-g`y+zd}rXPE!(x4 zIThp}{-)sGz&r9y2k)UrrVMZA-~y^`qVWnZ?kbS|u6n2^TctisDF`#d*L(ae2jK`s z`GmE-3QI|E}Gl{gkHbE;7ACD?XquX zjmN_oBQ>6$M0}P4M#qi8JmO4up8Ds`C`Gedt#F=y7%z?L3tp6O~uB#AZcl(m{MS`lvpR+r_ZPB#tP0D;Avj zeC52}entM$@QbkhW}%lm1aww4+C!+1wZNX7!N{LAgq_=9bz6nm@?CsA0+inNHd+=+ z;vx`!MO8w%IqUn@l2zS0ET@lgWG<>U``H&z&7pzKYAXS1D~NR-t<2ur)_RqKUH;~n zqy%(uHPgQa()fKZI-=A^2ZM>PGr66FIs;L@T{UraQA-xf`4|cpM?LLe?!ZzFw-)_x zy60@shIs$^Q?6RA%ZQiW_xPc3 z$5jdIiH!w-zwr4*-y_!nS`rAP66XzzMTaFW&!gbo!@Blf-}y{G);sC)JJuK$;llz(uNseH~0?0<8TH^?aIdkc{o2bUiQ(CE~9t+`oBLhy9Y(Ci#J zY|T8ncXb}qb_pj2QqjSO-;O6w-o~G{OwIHbWTfxO*hUFbMnW@wAHu3qxRVhDQVyoJ zqeRraOLPlA#}n}5`KW^U$q7Vi)l7_Toz!I7bRc*_>2;1fWpl6PRI%{{YG`Y54L$+f zpQT3P?8sbf>fj$Cb8j9YS$*V`+FEX}?Un=?gyL|hQ_Vv{SmT{dncVtA^W)oX7>*S< zN$L7+FXCQE2DPqH`zZS1`6LD3k&#R<{v*8~J7hWrxJz zA(XNRdo<@|f%0COKt@*c*>FN&7HD@1T8^_k#N`Z6{<2h;NtXv)gg`XPr1WJ4?*y1l z3^h+<-e1KOhVzkZ1z~w4j;!VE6Rdm|!6l>o*p}L~6cCj^GrdU=yFIUCpXCSPlf(U2 zOAguRHv(zqL(Q%aKDZ8^wdWz(l`p=9ovbdIO3^iFcD8tMre!K~eQJ~^V zvT?E4)=mF#91^!4)GCK1;SN&%Hlq0>>W`|fdr~bJXShX{_fGl1ae~mx%js#l7kH;8 zgzeL=niwZ0;&w4I;^rAS0r0AqIY zr)^=2v99MIeV#GLYn7`}_Y*J<>({J`!}%C_;|*orEKx9>krf6Qs=q-g`W2}G0-jh&5krgv|&HD8pUQ%r{z2_J1_91RFhSQR81}U;(?dT{1Lo$K_7`?Dp zOhe22RXhTqV6fIoC!$hp^-i}rqPwUe9fvNpTALjEX$hi$8gXa&_QlT3px$vS-S)TA z9jdtFx`hkmhcNtWzPKv(!O1gSn`A?c0#RQI876G5C6IAW84j&2n!ft-%ICuTNJfKx zk^l{@x=Ib!yZ;)H5!G_rqqyg?Qd*BcWtvOneMPlK1~OWax5YQBn_j`({}P5bU7sDJ zgD~8D=+yg^`)K7!8OdR-ruqAdh6-TubRxuXMsL4?F1Ai_h4;>fkt03%lpF^hy59(IH>~M~CRPRd4urM@Nj3 zuXgEq!fd{lUDBxD5gXs((mo274}HsYLzii<)ewF@Y&;svB=E7&6p~_FZ={0fzKb#6 zCJry?NGhnc=SgD+_^VX4=6G$?c)VbebmL7hFXyff4gG=vGhJ2OHMOxsXf;7(pXtgsKSpM?#Ayl&YK^BRZoQsDn#@2#V% z+_wMWErNhZ2nYfak|L!j-JO!sCDPs9ARr*!jYxNQNq2WjcgL3gEpDE3&-b3|fA1LY zIAb^%TQ+;|XRkHadghw*6SJ)MAK%You2Kt(8(=;6V>m|)kRo3|Be7>u+gR_@ z?c#It3h{co5WY7%E1zTP(+z1pZBj~8E1qP6dxFPoXlj`!ir^9x4p6X=* z$nI6qfUiYfaVf_G^WfZf4aMc&hkv^^4#O^M+&`FmkgDaO58LUiWY zNRmRKkA373>afVAHJ*@_w{)&$+41T7xX}@%u(It6PfMm81onHtq}|;tu43xG4?h(DQHxJq7DIRRm@yxQsCB0DHdn$?alU0+hx5}D zT^ZEPb42&GUY8j^B+#AxaZl&*YS%1bg*wJRoup``B8eF}w%OhW@8YQs! zS|5xRMz6vkh#Eg8Y`{FTysv?`w1TJ6dRa}h3YUs>oJwdjCidCg$w_PUDMcRuZ}E@m ztUM1z^Z^?$JKk}dMV?;WUF$_Wg-CqWmk?^~bv0Ra{myle_G9)NEEniTe|^!uM4V&qRKpDKa$6RZ-R6 z(?(TVMK1gl!%n%qVr|-9#c3ATD9_LG$@qS?y@O@4(DWHI%1&{s0y{SFUdcNwRJ#Sq zw$5k_MuOAH76w^U$8ikH<%Z%ds3@FVnS_R+Yd|pN@hVQPzxB9lvRD*akWRB)?KQhB zF5l-8%iy`J=1)$)u7!7Kazbrnk14@#XT}(y$~)w0k42MiLl=pw`#YG8g4H7&!u?OT zqTgcKdY$Y%-s=Ah>z}$~IiGHih0a*cy#yNMNm(K`(ir;mj=jt-HvnzanGid&k`Z4b zIOm6M^*N68NjYo`r@~ifC5ImXLtG+87rEfdMrvrODj0R6_Dk}D~&;T;hY^t1_)>BTeDLVKU3JM zgvwh3v&ckF$nKa2B|4%#0Hr{@MfTOX$~ONCfy*a{AQjW73Ez712{k7Z{*%VrL*JF| zM9E7I#jgpEo(%%uB9tgXR zvH@aYD^V&e<;8HO5jz?Fba}-$zv_jrvI;nCrgbP*tC0$wOWwz%JxY4#>KH2oFvKMTW-WbW1>>|`JvAQWS7+%OXpBDx%Of!H%)nr!Wu_z z>DjsQHlteMsCKf|E`}UI_?{XYONZZ1mfyW>AeHiBF|HxczBpB;T1KFH$-l?uTBX)B z5y0vKKfjRHm9m}Pi@v^G4F%Fub50F|ncdM;RM00h)Ii6r;Dy-h9MyU{u>}nRi&%wf z9?0ox#S5`FN8>Zc)<5ygs?>Aja$i=?I+rFmABh~zLAg4w&XKeaoy1PgeUP_6fsi2# zu>3>_mlwW!!LPQpze{`@fJsXl`BGjAYU`baJzrwCuPzs*=jSL=SeTu=WhW*#P@gb2 z|D*;=;IIs~#lb%?6-VcW&zjjye&lG(62K3iENt|W&+a?qp#23~4j9>VmH z5S)E5p<$N~J2qL& z(Bi{+tI8CP`n9-Rxp`Ev?mZ5AzDOR~TXn*VxQK>EZT={)2+CUI<~I9weLS;)aG?@y z7O{r&GnH5ttBS0`Hk;WELh?EmWm=g5MjDjeQ879u46+x4(cdIpe=c^{EXaG3t2Oi; z(;t2dVl=q&WEoXy1^X^nX5bx$_-IsC?zEHxSj)hg)GId&t>qp*c=j{!DJOq_f0zIv z#RaN~te=cfH}&+mqfK&T0BwWtI-W~~g(1Dh*0|9N`*w4EHv*Rv&1wJ;gM(HYj=`r! zg$%9tHqKVAhEEvzJrt}QO3RJ9eZhmS{U5+Wx zO9xuKV;j#i&~i`@^qQj;X6azy^9>x_g*jVDWKuZ2oGRYl^lZgxpH!kbBuABZ*hfN!mo{4~hcZ9+>8x-v6xDXg?Y`1X^EywUtFgj_} z4YnwaAJWHuxx^_Xx0=qzc5p?3iJCF3l~XshTv=VA>WdS;UQY@{ARwgyHsOmSBoO7( z@3;NC}gG0_kFiZgc^M_V7wJ^A}6|&3VAy)hi+4fFa@! z5;;_es~iqLllG$wo;hBLx|ECE8nJWd+@-K>64BWdl|<(aSzAR@XoIH`UN4wCH2@l< z5-*Kd>CFexa5$Gf3%62n{w$ZL>wNCa0t8;ZdG5?W!;^&H_dF0xEali@S5b-fF70Q1 z$zD9b7xMmkQ!n*tH3g$*1U3fUC!yWQ$sX}M95*MV*Fb#h>JzS?_^VbxIabq|6RxB~ zGrwR#z?-QsAPc7A`9xE7gtWh&99E*z9Z{I({mM2baGOgeJZF7cT^Ws0|KJr4{mChU z+a)A5nqaP`^M1P6)I8!od~AY18c!=Cg0G)e1k^iVzU6CX?cTIe+PnBDX<|`W6q$@2 zMuc#m5jh7al|l^W?nGrKw{bXuuLuRg4yXF9pWfSygfalOO@^XF7GXb085-bZx*UEH zci?58DR#lD-pZl6_Jlp!pD&esA3t1RLX~}LefoLZ!mUrGLLO$G;qlEHgxC+vP+Ku`@7Fht zw;m5mtR`p^%YkTy@DsA}Op?D*^$*Co?}ad7U;GCJo%HcN@jPl-ECbH>8143y8Bq^H zj0zf*P31HmECA*|rTR`oR+nnw&MnY#+FIQdGA!A>4~SIZC0~kERO;M6qzu->rB^u? z6Kv<+0&~#VOX-Xw9lw%??joLvwK6M%!0E2Sm`Q|I2M19DeF@3LnI=))H~Nz>A59=R zAR_U+X*`R|CDZFq@VAq$uKd9~wY(f&J~j1j zm!_K^tDi_FSo5b@4hdijzDpqw!y0~s%L!KMB~nl92*q|Gci*+6323Kmq{)NPJi3R( zKqX%gCJ+#vbx|aJc6*V#(i_TmN4rxIW?5a4O>5#1YLLj6EA=UpUGg|#9wk(qZu&$; zopYxtk%O{6h@pt~K5LbINtx~SW{W5$wO5|>#}qY6O3O{M=#8@<1UmK0_sB?_Nz;_k zx#5G!AoPddw}whqsaBVRxyDT%QG03k#mT8CdwM^o>-o5*Y%HyDaC!`%%M}5XHW112 z2j{g1lHQprG&cjHO(=V{St;G&tnX^PMYl}zWjF75VfVvMlWI$m5pp^fjh5w9qSdyb zXT+K5FF6%i`KGQc_tkYwRvvWaPCs1PPO3#}O=uO>_IwVuG>4W?lMi(kwab@IfkKy2 z5BHrv86OdURO*=%(b! zmV+xbTVxxtIQ@d-c7B{J5Ybq9sPmPqo_3?v2+hK?3khhHEWjI$cM6U*epOd>8IzkH z7UUUIU&y?GuQYE}#Y+>fo*`1~ZPMnb@|@bwNznY5oApxmNp~djC`J53p>wHHh128x(g`x=bzVV{n=kzcTDXP%4 z;rmD(+(1`&CM74*nAK$dQM{Vr%fsNABXo4`NpF9W>5rr3ZV`%<(K%3Wqy?(gQCMbj zW*}OgJDtwK%2o7Xqe6bkm9gl}w|TJocZa53|{Z7A#CLe+=?-L&pO?dlaTCZY|9?WfIv59iBN4@xHSlj-~!;MpeK>rDR5*R-~ zPL{5SdGwDS$}it_#&4)>K@rU^6~)10~v&PG(^uEd(h@#A{U?D#T|-cOPK1)ZymX z(KE^TO}K^kF*UhnHoIcpGe&JGL9#Y`KGF|vor5c@*e*1p-Z7-#{-M0$k#^_3JFTXq;u?6YMQKM3%df;yAnt0;A-A?aJBC6HJAUm z1%VdDCkcp#0G-3F3yb-W6l%2^aiWhNPSuA#!u zI?I}k+Lj0EqE;&t_Zz!AM6Zr74nielmOBEYc%k#l&-6x7fQ79<)L|I+1&FB#SD!B) zuwfqH61omB!`M(emM0mFQ_TkA3p>v6m`uZfIL*d}7`WG~+}=@DnlSg;P?9jON>aglWhX7$wmgz1C-c{A#3>9)%4T%Kn&C zPeNz`~gamyDd@5a-7_Bv?W0SXj9eGrdffxGaqwkjza zEg19W)viflqSCvtQCbO3who>sHi`K}_1;;r!ntD1kA5PbMW^$JLilh=X1K^+CuqB- z8I)o@CjD@pY1Lu-H<|XI$N#M908x$?kPA94wRybXwF>WeP~1M~KMy-x?(`0(>U08T zlPD@998${OI~Ud6NdVx)nLZ7@y@oE7thEGdpT?o;^hD*~r5e>6%}A$V8g@^rWJM!i zKF3x!=Xoju=kEoR!X5MUGc5hx#K(Fj`h@}Q<`8pXgV z_ehjdIyHvPaAHN1bgbNq81 z{uM~S5I_G4r@sQ}uR!|u2>iA8{=(Y%|7^(+A&tZ@Q-~f%<(Cg6D2=2yC7$P(&T@nz z)*TG@(7Uu#2mUzDk6%r&>gNo#(EeEu;0*g=yHTpFiK0&kBffgU>)OYOyTb;-!vOKk z$UP3n%{*GAI&RBZ%j3fkleN%)$HBk$(EsBBkr$%2KO~DUla}7OwbOcT`hNO;G~i-q zQlUWGFd@}`S4=^b#^>Tug{owDjK(1YTnm(UqK9~&y_9xq15|ARa}?O>_L{x% z>5v!XNrRFAwyXR#$tf~N@_cO{xJQI<7u3p^=narNSguDA3q0%z%rOQ=Rwd}d^7jVq z7ToAerfoy+vcEgw1#hIe_&kJIx?f6Ceo6w6MW(tFTeGf*@^B3*UZwEleZ}&KdWl zO4n!-8LfLVP8&XU#g^)dwP52KF-B6!MF1vyTy{bX^B=Oo|4Vu=K_8Z00CLjh6L|~lp|bx?gFNgj7B{o+PVCFVxfF2R24vCB6T7q3Vp~l5q$->V9n)O`RV2<(zwiv^^&C!V0Y~e7;><+HoaGLDbm0duT`wUQCnJ4Foy(G) zW{vn^68JMcrR7HC_i5KWekp1sp2EZuL;MBozNfayDJb*zOf&&{S2Z6=n z+MCIQ<7QHIODtq4@BPsJ_Ln5+!Lbw+`A#D!AtfK4b<~1xJ~4;m*|^QpGCv%5vdJ7daJC3zFyf2=tMK`Rs#W<)w@t2cMP5k6OC{Aiea?llUPS6>db69_ zl9OwlqgdsFEl~U!vY1sU%ZiZed4hkn%hUz5UGVFG;KtD><@Qe73aQk!5r#CQbrev= zS_N9iGlqV-Hen@B!NyZ%>a=wSyqEMMKcCIpzv`M;4f5eB!8y?OpSzHPtl{07eb@L8Llx}BFeOo@a`ctZC-xX zq{Z_&@9yD|jCb+cmuL8vb2byA^K}lV*Ylv7$`<UO@0P5Hj;Q`5u2(+M?-{r>oE zgYypjLm;BGy$-o;Lt5|2XR+dkwLo$QH1fBnJJ>y8>HE1l?VRCW@F?B+m1_|np-&?H zQKL{J)&S@(-9BGt;6u8xoDSl^k8Y~MkQvh+GVh0TROzA-A*BQT=%J{WO)H3t*!^xQ zH(;xMyV^y|ch?+3$^eRndVN{|gIi)U!^i@9eWXAmO6KAwOeW`j7q^(!b#Bze#fMW| zrK@>#rCQs>J8b|kboz{ZsK)6b@ z7tqD}qJ$#efHshWI-YgWD9$N=xHDg`Vp?}7*cD6Si&;~dVj2#F(5Nxk4Ff7R))FcW zZprByN#Ef%W*r~xd6Jks%hLuH@j5v!-RawgL&V#m5#0xpY1y2?!mqDSxRjxwP$LH=Ac$ah2PDNR?EG zj6*)>bTT}pQDX10QnjjU1)SqXwNBvCDt6xw?B^CXM1eMA#EjVh3AlG;Mh~&CM#!cX zJN{*$AwCiPRGna(J;LBJ)u;p zeQ^xbyU5naBkX#H;2n>*B$IXHrE4rtk)Fy&-)FoEM@hw zU)pJ-(SXg-<9)uZHZemIBx^ccvJ;tUmPoDk^z-L#8c1`RITM2iyTMV!XY;dril@7C zvPcZZZlz{O?&R;BWqnZaGuo)v>gwxP*Wz_HLU=rNG%wEFD{149b;CD$x-S+GGQ^R#SMh<3OG6O}$N7_g@ zNx3RQ0c>&g!^28gefXNEnMo0}iEQnd_jugLq+iF;+r(X3u0K62Gno_ZXIVGy7}%L~ zUqhXmc8Zl3#VrI*wLwd$6TDP4r8rzGWlY zvi6lo)M@XX0{tq^>C%F&Y94^AHGbWHe3}e0je2?IGQ;I3?=Qcac-qh)a4Bb%_|osL z9ma`WrmRO_@$`XbQ*=C|6|6pap{`2p_()De0?B=N{9^GZVvx7D zb0oW?*cz?|w87KzE~)<3#tV!&D7s~!Utk0rtFa6Pb+&Ff;uu_%aI-8oD4I$yjSz@3 zC6b?;eR;NvgFoH*xW%_SQPg>3ohU9qF319ZIu+b$yV8N`3pVogFWsn!Mi7803U}#R zZ{!1HjZvc4-_`1;!$lui)uV4;k>D}8yae*C*5r8Wjc*iGCd_3kDKG)=p(x?LX3N22 zvyC3Y7cPzO^Aveh44SmT?oOq%Q^j=3BJM01_lmLm0!89ubHkP_Lqwzp4J$SII+a|` z3k7wH>N{9K#Y3+y=g%asL{P9LA=cmFu$iHsf0pR>y}VPmIoX*P=$DNO`GN9`{l#gr z*~({yS6>kW818JTuS#webSOVYzVUOMHpuKsh1>7!>-G$rnF2k$L$LUwlo^abmCAGk zqvB3ASUl#Hv5Kg&tlpZVv0ombrm5_-C zXVJcdIXlm0*osmQRj(fe5j~2^_QwJ!p+u(wU3R^Gm1!8v0uTLsp-S4N3f_d9mhv~wk?dftt zq0co$C3tUi6I=_>tXBu3CCeGsyP3LcdU|6^%a{>1Qxc!Cd{i7Ac8m=rKf-9gTOm(R zA6&n0>kjT*Z1D{h7^77fj55Eoqc~seAk>+!v-<|?ZS433V)rL&~W>fr-|PsR5*XFU9qLH_(8hwgsf;wSEU-s z@Sc7udJ?1D5+QR$hhB1a{zagwWl0G?Y_1$e#UvfIr7}}k3ZBSGz(M#aFrO){wC`IvQ*n<4N-m=6h^tq z%nCW$h&YEAXeLjPJAO^2KIARzD8If;wH-FCX#G(f-pRsGzwrC3CJNnqqY0IBUkkIZ zcdW7vS>m#`foX1p<6PjBO$G68(-`bxAW;Stn%P<+wVm^_eNlrc1N}{Mh#;uRY zAy@j=ED_5(*QEdsH{bf%6O_{F{ysT#$!87&C6bmOD&i>Zo|&5-tXK8 zYA8bj-X6Z_F3g&vVGPomQWA;5t|$7A`V)b2sP;0(uNS+OJ*2gfTv!z2e! zJ!n#WqPbb)8@iVX$~n~K?`lybo|b=6e*ctB@<*h6rE{AoMWRO`vL9aGCGc2X{65j+ zJ@()c4&$uI_85IaY2}W?6_<9k+hR;@9f|f-;>5HXf^wyYziVqY?5CoXaL^iuvF^))1}D|Li2y<6d1Fi7SuiZutS$??tIPFK>92!9qx8y;CFoyrWTcI0&9V^uS3EAn3Tu zj#pUGinYuxb@n~Wwx`v*j<-%T$*S?*{l4t1-7m4F3Feb_wY|b`^7Qnhhfc=hBXc>; znHhi@O<)&`V6A?@GXSK1QJE2V=-5wApYUctO6d{(yz~q}F59Z2JvwJ8L-pRL`g*JY zC_Dot`p^lq+;bL{QQz0@(M~6aIjs3RESBfv0y?j|7U4ok{-DZq*G&4uKTXwG>^Ua=fFMogD&8p8ZdwNn zu$d<3K+s-hQMuaEsishOGgZ9vrt3=T&EHl~>#2XP4JBs@CuAN8Zt#FWMfGW11l0DwcH9;s2cBMW{q; zt>9nLA#3lCrup!h0^(0GU$lHW?W==&3||}+`?ih0at7`R#08`!K>pS8Be|(!!z+Uf zxw>$WBvI?>>}ifCRIiQ0m}qKt9CW~z`gKTtdHf!NNhj%tfOE&??23*~PhlMxn^=Fo z-}%w+mAZ8Fx3hgTQpw>Zyelds^;in3 zw%-4xf}Suv48?PcRT$4~54$<2h4ZvyN)(+enO9M&NC(`Nm7n*eHg^>{t<6oPXy9fHtE1b_eHG_-@zsTDDYd_d<%%J&QV)uZ$doC>z+Tgz`z~lzjIeG?3RjLdP7GDy&0+JqHc3Mw=KX(G1rudox|<_f)uJQqU7m zOz~Uks_xY4DBvQZ4=vqQpH{jORpt|! zCIm6d3-dTdpak`0w_$Baq#ZO&Lf#(m-5nW{OabUi*=ITd#sK{jq1f}rcwkR0{X$mK zF-cbJN%tqe@Y8CV`0*ZZY{zK1^1O_{l@owHxDY^927dmjJK!RgWOm?r7SHUOhgn;w z-|7JU9(;M$wd;VSzh7gM6pFGt%@6B0p%LE%JXsT0sH6s&2oj{4UjR|Z&AD}bHYac_ z0@%>~Xc)Mop53kLl}?L*1j}wpa%IzBJKb#}JcGgz={ymNdux*PYVxJ1@Q4PYp)s}@ zue1_x2q@o9M#E0qA;q#D?8? z=na~g>-V8_pCKD}z;m6|egmZICHk8VUWhiduvAw(vUZ=9c<;4?xf$v+W+E2Lxq|wU zVU75oo(S&ZlgM~XU4THV-8;$jtu+R2zgop`)LyhZl7{52#$EkM<<~YE0vN-i*V(hR zNZ2erHeZsNSxo06DVDTnG zsX&<7vM^UWNrX7!Q?K?HtL*r&_z0O;MEF=a-_AjOW}n`nXF=+hw^syq`QuX~O7Yir zXBM2>r(1dT6OQA`1CE87PW4HEjW88LJpVi(=otsDiGuV*?EITq*38{0jPg7?gm3nb z?p4@#$v`JXkZ~V~7e4YxthJq4lmL40%i{vR7*;;MLtjljGx_mhdf7&Urq2_Bf#gKf zB8kwB8`srOtxnxTTvIVScEjG|0+Y=C;F(2Tpn&~!kagqL2i9{OTuOBt{|PBU*18ZB zfplnJOYqy$b&CSGkJ++iTK36=_^gz(X#**;W-jC>to(6Hrzi(|>pu^dLs778swZj< zj^(9$SgGEjwE;`Aoykq=3M(#XLMe|e0Zgxv8|VI^;-2)r6XoonLu8J83|&((OP;9K9#3IjJ3rhjt}vc*?C*$UUuCf4n(lmRa`fP7 zKNG~7m4ibn*OtS{I5A$Gn3#aI_JMm;+LbF8|3l|bY@19OjjQV6v8C&uF#QxJ1zY4L zin<@=V+c#$a#*i&WF@~6tlPpIAo6?!-oZqOlOwn1vqH#m+{r4YB zlp(wKxoby;X9ZcVxlR)a-uJ^%mOg0n-lww+*6|r;iRPO$0hq1jJ)suvA#yYK=c=!s zM+xei{p7!oI+U@43mKO3@{xS|DYf3v`L+dhNMb~7onv7)*=3K`jdTYuYC();D( z7K=kiczbB+hsDbwiRVRbw@e;T-Tso>-Kkn8J|(jlf%_Ok8T$>F{Vt4U9VtKT(vzL~ zr`&8&AP&0&>l_3<9C1@t%WBC}Hoer4x4?cGioakip%90y!Guxa#Y}30~U(9>_%+yKZ{HdvZQg`6{rvc z5?jy^p7W_L-yRoYxUueuaz~*-H|@^jk@gL+XeI+$OF$K&-U2JBQq}yk2GA3BKb!m- z=m(wCpfD6(O&2MwTDNVuM}%C#j2yG*^WI`BpRetGp>z*TF7n)W*;JH!8K)8q5p6&pIG^<}SHH8T+@3TizY!$g+Dqns0jND-jG= zHjynnk}aDFGfgF2wT&T`NW7~N?X-Ev0T=6{J-Xy=Z?WM>rm@ytGdx-57S zBVxQ~MoaOaNNwIp!71XQUiRhSW_k9=?6H$kJDVQ1bzIt4A6#7%L&KU4#1B^V*&r==2m(DI|m`gl%)Rt6%rIm5T-o z9~|d!nLwu_)}QPeciTzG7|awWB+Wf{BF_fzN%_z#nU+)^ud>(0f_>8-bPbP8m`_Ji zel|CfS9ciBRq%1+g?nWJFT$#p@Urbe$`lSWSjpuuimFS8jQvs%^XKtUpfcN|@3nva zz`aa*%%Eu$GCZC?N@er?d_}XmdCKg$f1$k?m>*~dh=JJyYrOF$=O7%bjQ}p4H zFAtbcTnpsuGgKt*6E9}ik5MM^JgA4BR-3c?20z8Oeer5HHe2J?qhj{6v=*-?Rq-fg zLSQL%6eNV8)Hab+g~CN*_-x0*He8bcOt9V4S96)uaFWvjVHm8V2mIzuLXCFYH)-4X z9Mhj>f_poAi?19-rCI&(HV-KYdd12k?qO)1q8?%= zKf<_2mLk%Jb8OgDzDbiLhm!{q9?7v`9076NB&!}61MZjv~a`oCFN6)T$B}{C`ZasJtPFUQlFh)?ec4N;{ zC*Aeh(Q+A?sS}tGydbZ-qq5oh&zw)bCRtq+yzMONJ^4c9ZAPaXJtmn$K_?;JU&Q${ zz<@hyNGqu_fUb6j-e97l9Fta6cvv#C2ei_)r}0L-m_mcc3!~zX*9VH6yNzViB^PdN zr>?3?R|*;x+y}N)yjy z)#$_(bKo80qhGs`J5cF8%O;^T@(t{in94)U z1Nk;r#(G4N_zL{iPgFb5G)J3Nk7=mbeBDHkB-b@KDHTME&^3OXP_yb|pf}lyC>qEe zU$01QGpY7*Gb8F+Zl4}lyoni%`oaYDlrWN~jrN4QeO3??^U6D>DP3)1g8ec$4lLDf zf32;9 zce*_EW7}RxkL5ZRM$Mg@fe=Uu%eLbg4X9fH+C#P4a%z7b2J935Wk&9!_W^H4>a2uEli+Dd_LLDds>3k$Yejgsy%8RkTIH8)+ z6@`#d@oaC7qU$z6A6wGx*d|-KI!v~;AAp> z8$wc|WNFnk@#c~rXgjh`_4o`YTsy6MKYS7~M1D2y*7TwB>&?i!>^pBbhX4_fY3>tw z$;=9Q%`+x&7pSli8#&(&|05w7o5k|ts#L}qal25$9r$;BdTWL+y+DDL3a~q zcMEtbOzkT@ZtwEfVx@3vn0OWCG%5)Z-cE0X19mWF`v{py^A5|tge97>4cGk-Mw;Q= z%j!0}#6coUvgB%bRbFGgGbjN>{Eh82%0+czZ`$AQf1Mq`jdI)w)eVcQ`L32hs9Vp( z_qJ+F-1R>9h067O?-ad$r_^hXdX{+KUMG&R7T9*y&o|`W@mDwMmxz$f8wS`kn_;L` znuwQui!XAhrA`n3%Vx{}p2z+zL`uYeq#{CCJb^tTJx3OGDRK&%?M{(qii#Nxbz1;- zxKplt=y3WzJ;$jk$mU-`XHqtd(>NHNKRE6KGt?(~ZD5S6VH3x!S@-r;J+FPHBJS73 z-QGd^631Ouk=ON@CX)w#&lu}@F<&FcKM|Ltu@Ofl#r-_gKEHaqnJ(xwF!VrcKLQ_y zTUmo+0=a$g(JeV}(TGy39a$O8maU+8vb*^8OEuxkc=HiAHJeE22`^^{NUC=f3*&vX zKwfU*WXclm+O7@-9@k=OBeJ1qqp5)_KpVO&UVmTWJBLeau0-)HpR3m+MOjiosv9ZeENhqLpBW(QZRC@pCypYwLACD3Gz}dC!#ttXUfH(khKd#9c?#K zJhMNMRd8o&r^&gFD-l})6@A-;b7{J)=Y ze}DA-fq(|FBrW++&_X(wz~$CTVl+UcR%06taE&wccwFjqOmo&+tw(u(o+17F*-i%- zSoe~RIJ2o5Ips2As@<8&NO_vLt|tnrp)1IdOsAT zZh81WHi~~Ra*gNTk&@zwuxUjBS# zfoBh%b3;1e(FK0_1;X#aMfo}EWMThlb?LX4%n6GCIpXpO73`x4>H6cV52GzwI!)82Qn zwG?PQ|L@l}#RC?KZI$Tg<9`pP$20PxE3e4m47HBWdi5XAKUSx6-#b(>RXyUzNoIe( za|3*-NGSu>ebqX6|9gOxctP%^?3hPpk^JVj}qJMZXEiH&Y?1|GA<6jL~%NQ`s&uqW5sQve;_}zPX1c?2( zg+L&;w{FK>C;!w{+nGbGLte#eI?OD?5Pc~l{qo7n5=@=#{OF8S0`P#20&7Y!1X zs2w&D(XcR4r1X%)o2;x$x8$KOu`KJeR{b{Am9G2iEwQV>b@RO6lJNPWH3NT$ng59I zze4D*5c-dh0RR1K7y2K2@L%_V|FLZT{}4ic2e>ipIyq&ABmGnkW@g$W}jH z?b%}=e*SBzAQ2V}EToP1kht>i@3r|xuWS3AilUxw{|-(Vm0nPQbJQgMuYE^z3y>Vw zF!#TnL%PSkc;6lKsw3Go%&4$l-n4PIBIaV`=`X$y3rNeYSrP*gE_oqR+V{90Tgo8+ zAx-{WLi^8Wg-2nc1t5b-98Nmln*~a4ypWGhnHD-tD(7DYvxmv~1DQ?9)jpE_!dvc_ z@&$%GbSib+^m?w$q!)lPMn-5n`2y78Bm0s8YLLxN)aMb-%6IWt(t&VEVIY*Y0?I(B z)h=mNoO4I95w00|axMocOzGCy==6H?&Pp}b)l>VKVH_%qI9#?7BeO-1zoj_^tB+s# z>jbQRg@41cJ&RH6dL^CI8^54DS~X-eoFniCYG}kd4N2M6aG?>4ril*3;|jxPYlyVo z+zas~bQL~Y>(X*iwVSiKcX>ef(*SC^J;`}tAMRYL<(t6bB1o@Wr%$~oVMGR z1H3aAN^IvYGX|(ufMb0$iBM3tS36Z- z5p<`>b*sa$beUWU7o(}47T?kpLz|OM_hJ>FO@Ii}PGrG$d`D`ug%Ts&>Dor+)Gcht+uPZ~>pt`NFM)eN?SpT*JH~ zE|ardLBoY1bSW!SGJ%;gvBo+wdn5yXPTnhey4-{YS=~TCpKAf~|0sL!s3xNFvRjPCpP&z2mOAx72rT3sHC|wXjN2$^~NC^??HPm3J(t9WYLQU>rX6{_) z-FNSs_n%AGa>4hV@9e#QZGY8cP9kd;@bp0RZ;Qx8D|M~I%A)z!HfZXiq)53nZ;0$Cm ztNg;D>HssltFS$nj(Ks7ThF}gz!ywxY;Nx~9-o8QY-;q3x>*czBo$UE$KB&)Q@K`M zM!_uOKW@&i&lkh4QHq{$R=J-bU{i126V29GkA-~w!l~8SpYgP?>cSj~1CTUznTnr{ z#H$=vD`2I95SzGUu&l51d;hBfX=~X5LDZK$Pt{~0j6n{~;AHAOfHB4lLVbRvym=D% z{`HIE*A@g2ughiLRz21E@lr<0SGc8GlA<8p`7eFx39!+M)tiZkr=es=FN$6~6PWag zJlLHDH$M;LIKmeH z1cC=%qSDrD42)M4I*177QRVeS;rYD$`lfp|q{2cj9YfU|O5041uA>o_znCGJW7?jj z^+KX&_&vryi&zWNOF-J0&u)9iJQ>J*(-hDxxX~SNV*wqYseX;=HsAE>8T9D6xzp`3 zKPM=-6GP_J?P--a9&-zk)60ik`z*f8sORR|60~c3_hiDuXGLDT-0na**QC5k+gOke zA?y^8spL{;DE=NS5sk*D-Lx}I44fL-zXs~leR%o)d>Sh(sR^~WI+kfl%KHRjvR zZ=9Q`Mc>=4n2|wFY|7@Za6Nm{fGL#|y3-&3tZDxAK3_^2Z5S;n?U*am6yh2P!jBkW z;?_bK$D`M`#?fnC+V_>xOr+MdQ&IZmi;5ZSYK0cFtzlngT0*?hPX#g_8G+d4n5?ci z!(m-+LvC8Bc+REl#Q9}R8K2(jWk$%A{8voE-USTqMRmjQTrGBGg0BYodN~>IJfA08 zfwas($Y(-}?;lUJ=+vC@)}sr~{RQ0o?Ss&i{#9_ zYLJc5OYMXz(y&P0)sTsOI+@_@u2&Mp^j`1u9-S-<9TJjz)uKDzb`k2-RRp4?IdBWr ziLb|(gl&e?^<~S&<#qB!)(hrw3*FH-BCYU42cCl*+eS6zZ`A_H5jNCQbGd&K6ApV_ zZ6?zzE1T027WP37W_EC|W!|&=4!X835Ms7Idbl>Xfh6)8=&B4bMJo?vek1+X>u_nm z+VXPeXNkzl8H`nD`{p;tb2^7spJ-_DrzOqkF=>F=8#_kXthb8ZJl1<@3Y3fF=K5u{ zk4cmBhQHfWQ|v|MuF5p%orAQ@{HQ=BPUOh7_3Gd`!kAtK5$~I;9T5k<;R%OFe70MK zxmriMf|36>0OsG56aAw<(dQt;-?c|N_R3B|d7=d@I-`PD|M7rd9N!c zEBQs+LzE&JZy!P9*HpiCrg&t>j5*fz7_9f6AO2T&sF|e1O%hPCg%cB*AdG;J^U}2% z*XJwfT%Ht(RO-&MYw`!W1tbBk)r&qxqpc%TYfrp~39#SRYhg`M23sw}Qx z8jxD=y;rqTXpAtzcE$H6`p@<}+HMVa3!V^PVTRkfvluyKcV$q6jF!RDLwH7m`kHs? zF)sD+X(UT5h;8l|_rj&j<3S<0a$oP~SzrzUeV@Y44KgllfpjCfjx^#LuK~B)3c^gA z31q}x;d=h?H#@ov9E=oHsm;@ZTj*}Lf~;4;RnL(Q%(mjUU@ZcWCEv&{EOCZSMIms$ zLaJ_Q)1k&?UT9G&A5=^+yOIIau%2xn#YZ9Vx8JQA^=INbO`Q zVfA?g-fRWpJxh|q5eALQGGDfGdw#ov#6p{DOP8B8z?FW{#R$ubB^+4M9q*>9rb)~B z|E}pmC}TUKO!69x6imFA6_osE!&BY5|NRyG-+uX@Ep$IX2M>G*chX>6A0(ZKCuQFA z1D=r&8z5hiM1rA!dH3BMjkKz=0oBxpypvU~^Isd~PSr^|2>eLFl^$z4`GjEbRF)421kt1~Tq%Z0IwxSbupRBdqYJO73M?&|eDy?S2|V}sO15}2X(F(7d!Nb+zWd{G(O zSMPU_Gf96jbWmbTk|AhU^-N3>y5s3AEd;dV8 zk4Ap()vjw@a{7osAl+aC{QZb05QQNa;)pG`bqxPw0MjqDIE~|L5rmx$Y}2_v7q- z{shH|jEZ$W`#e2lj>c2J!ZcO#P*DfJkh=V;Euw>t{pZ3`e}+!$%^ne#maDp+EAj$# z_K?1ZF`sh~9o-og{~BVy)_qcdL`f*l`Ic?_9?ZLo*^x+9n4|XM$DNv}A05^IqfNru z?IpdZ`B3RNCEXD>YscRcIuDI{OL};20?r$z0MX=*;Nj&}4~gY|Wg*v@$QH^SFY~mh z_P*zzh&@A6-w0M2UeUX1_gg}*^(&~qA#e7pTo+UVixA3trKY8;8%aQcGHQbzsZ}LT z_f%x6rx*xGIU(yPdw0OVlxda)R|u@GcuzU!B4SSRpFRKo0TVFeGJSWQSLw9GzOfm| zswPy}O^EcGvr~*l4(6bm6aJjf!O}zRD8E|;-E~G+TMx6F8`e%YD`_Ryg07OGPbZUd z{OE@0OS9iS3q8<3YaWMT`nOj3OlrGxN9r7jUw7Hn{Ks-LA_!(A<})na$KSO%P+AAG zd)TqX;+X_!Irij-R*t$?+;Vr+%R9*@@!uLq&|{QU{)8GWjcO(9T&?1_gT1;?7+o1d z%z8(zRgeUw0bla7f{31p-dg+!`Fbd?5QEDMOHbV3iU-_5ie$wNJK7}1E?95y)7$5* z3EiGwxjDw!rxdr0)p(3bFp=4levK|#tYEfF2WABI2~u(zvix5H|6LjSN#gu=j22T* zw)Y~}poxN|FCZNBmt9&!5F-#Ki1AAnXZ&)J8=@E(47@qhLrj7WkH-@Ptt9Q2yMY&M z7TdK`qP>x@m>MbJe(WimqDU{#1VrHx%<4qtSTA1e=5*7Ux&aZ~0@u=ziZvuk#IB58 zY~A`|FqzwaC?n>r0Hg1#vfEyHKO#$?$G+CN7@G4gplc=AM1sfd zBDJ~*^)wmGv5jns$6~Jw+IB)lBW-V}-`01bz#~Q6o9`?oB&6ldG7zoUtgP7rEktU= zZ$XKM6SSB+B0F%x#obu?zZ*V(Q5coo`Y9Coxx@ALe5dY3x|=VvguSy>Z8-IABF8;n z3E0Nx;3o~2sQAnmr9i6FTl3!I5~)>RLM;qAlxM8rYR$_ts?%|~Wgcy)m9$6XSe4n= zd=k#`s!%0CAWJnt$fQha@4IkX6fzxnT#_GqRlcN4kZ^3Ml$gL%@_mUJb3kaT-i)>z zt^kMRX=cymQQ zZD`T$1Oba^uHyQ~d+SHq*SL-DcEuH!pjR6VL>yNbXw;5?E)U8eZuee$u_25h%b*g@ z21col$`KRWl#G^8c)a^H!&RK*!F$!~qEDjPsij}UYjdU|U194I?r~d|KZJNZrrh8! zij1CBfF5=$*bNcJEc!@2P1?S21ob*Hluxi}mUn=Hp&GFLq#F zWkd{6@!$usX%^da)$=&Mh7xqO!|-E9gnL!dgzkwD!@JDx^7*;ol)8cz)E7>+1KeWF zoap2|avGK|SGjaLI<@l)-S(i3L6FelHwk}O9-Q$uBS|ip(Du!JH;2Mkoc5f_l3veM zgV+-u+LWzf%0~=jocA?3wQ4gbg#X`9!RGnohi@MHAKO$Pn-h#+CvNCI9QY-34v@{6 zsoww3F5s@}pJ+0O4SWiS%PC&iOrO2HPn!`!0jW7yNSZHflq=N!1`6RkfI%{~;11i9 z?-U4@$zIg;%VRlk$sJR6EB(jp>C}(`KWqM$d}^kyYz-0e35zmwC7{No8K_sVwLLjF z3$Y;udigJ4Z)V5lrHpr2l*#YhR}#6;3iFJBcy{mhqE?{2s>rS7!D?hV_iuTSbd&|m zqt0#2Hi3l^o(W`d*Y!y)Rm=3RW7YvZhNR?*m5h~zvR}c6W;0tVDH3y_2po8qx5d#e zV-5C9r``2wvFm#!D3_%FR-T*L`Wf>+a`jPa9hn5u|)6P$1>d9a2&P z$kJtj)oOek~Rb5yfw}XP7B0!I$RGQRnpo#`sE7h zo6jCLCU61HQJJaY5iFT1l_cB){j2>u);-7T1&R8#AuRJ9S#A35D%H;L2($}~R4P?= zkxHL`eVEIw_bPyVNkts$En4^FSvV8@z7d~U2VIJx6|obtFNE{3Gxg!8h&LI9(uoJ~ zkqYe}rj2KaxzW>=5*CXn@GQ>H!L0;fb&-+3aTZ>c2I|QnO z|58|Gh>VUZ^F-NRKu_wpPc9u38$!?ZT42MM2NmbnI4bf25;ft(9ibwqROkmo_?i;v z){-3E+as8#LM;2d`_A@BIS6Q6_PQfOs_Y4I{n8vmWYPoE-OlEfx+(K5n~U8`GbV-!iF8NZ~GgurfoOYJ)V|`@K#$u zlT_Q-lw}rO^EDff1uTbZHYBXh(LJLC>y%hHb;`naLqi%x{9!#8xSa0%7B|i&idLF0 zZ)@gf82BHpS1UQ-U?m1-2MEsxX~FqA#jyr%D-vzSNR#!i409h_+HEn$~ETy^$UxM|YyWLa_h9_A&>P0;%l1zdn+in^Tt`+K?0oEBdyEVam2LA_G~D@939*Bon#9 z9S<$K@Y(CZQV{XiheU?TXEBz~m@%hNCj9;v_}T)!KoP&(=wYY~#Jahp@p*yuOIYQ{ zg|>Lu?Cz4+9=()nU}?tF_*>s_UR7+6_NF%`f~CIwUM9?+`dbgXq(6klIvW@woO7?- zd(oYMCx;wt1S?UH$ z8j3^)HFkd0BE~)`10gb2b+qV00nC}fhdB6Z^K8v_J1_?nVh>1x|JmVQI8%djjeCm! zU)o8hXJ=2Zq3nQgzQB)`-JEu1h|^N1Y;}k&SbjvjbC_;jO84(u8Fbq}?vf;Omb$>P zWxeJcVVTwok$d)r(7x&1+skcP1u;?ZAMP-fD}3xHhdcZjt(ei!0+b#ZWVpasL#J3w z)O^skSR~4_Saf?W5^|Ha&8w$*TVc`5?d}t%BY>BaeahKRqkNJi^s<1XDU#^_eSaWy zpxg(3eRlzgQN4?IGK=l+9?;H1Z@S7D#a-5zmzSJH>ZXf*(VSxLuXvNY!j6V~ZDi+~ zg2betcmt;xZ)T~)m00l|ENawws5Fo$NS*Zk=^DsV4k06Fe&{JHkg379W#JfR0ntnu z70$9>y`}^E*O@Op4-xm>FEK|Yw7Hl(3BQqeF9_jc1sS-B7`8==Gk_#cYj$eYCwKpz z)rb~vRTv>cuNLf<$1Cf=vcD-t<#r-dHit&)7wm%QV-D41^OTHgGMXs*RK6pqH1vkV zU!Ma}?2I3$ZmF^`#{?`BqA}OYmhps&LZU!BbDgcqdl7e8H&PoKU1>8sj-$L@N(EWz z&o2&RkeGbAK2{g}1@V8QIR?LsSc~k5lY_!XDUKY>hC$GY)*0YvsjgE zL|BjgxUx$WJ|i2b3en8%;(%D6kh6An4Zjx8saSJCwFeLu%ZOrJGYKCpAblS?A+F%k zIDLSAhZTVQOJ3XGlX&Xic8fin$% zBV~jx5;zz$+MYO!e2Y;{Jg%CDX1glUoqeGkb^WVs@oGka3lJk z0+2hfSv9dYGnrb|2E+FUa^(y)E{2wGL#3x-pA2{BI|s6~d{EC;9j92O+*SRLw>WHn z&!3~D_d(Nomm?*$7RLEiz|HCQG3U68@!p9{tsxMh!_n96AUnuMELz#DEA ztwF+#a@M-DOwWf*771bhygyoRLll{J5?Q64D`MS{&$BK(M;}l5nBBw6#A^!$D0L0A zY;=GD*nFj88GYP$i!>{ll>WUkPx&xQSeoar$|7cr6Zi ziaVxYM4p3fDK^n8)#agb4k3uuVy|(T$5b)<#l`QL0(^-eQ1wprlzY-?(nQaCQM)G9>Ix&5!&G>Y!;#t6evwSRsu1J7XB-HJ&)Z9Mr>}6~9={ zLDJrOpU1&RAT&1A=kpRD;dfL0_YTk#8JwWqi)vTyYfLx^0`f9htgLHHi`|ENM zk*OTpY10amX}%A+r-Ls^4Ll*=>v~H{UWm(Id;xp3f*#79MNFpqksTCs;>9H0*M9i! z?vA`HCS?+i_VJvaVRJr2mGixJlc2s=zun0-ALcb_4c&>HH1wG8vXaNYM{IyMG~vB) zY!(zcLNpv$tn{An1#2QtK(ZkHSVKj=GU$5^)+H!!$8Xk|`1K4w&y(Nstd?|H2-~gy zZ673gN=2`FeM< zB&x1bu|eW^BWZghy!a_t+UaoSBeIlZur^i=jfh`7avL$`TE_mkGgqz$)88I};tkiAP&d7M z*PdrQ(e6k*u;b4pQ(DFEAAEWLyKW;*quQ4}CP&q+RE zE1*%Y`sJFzd)WikgmIK4Td_1LwVhw8bHubknk*X%E`fiJ(tpX`FiwcA7xc@{X+W4j z<>LgJtY73Ch*@t&ppP(TgC%2;C5TURy|G&0cjgR_nHW-BF9tF8z@xc6(iPEE(QOfP9^n zn~Hwb7TGn{I(G8QxO(Jfp-7=&&<*upQ*jdU?UOK}GqQ_5yz71|U2Ea2_5vdX8@v7BMzriePq8^t^?DcD;^3vf=by=ewU4Gp=RlUGg zd1R3{_%*?^i7Nm39!B61@np?$wNjT!Z)A0j(=pUi{0+Sy#R!Nz=lanl^#cF1I;j0? zbuZ!~EcdY&P)p?dXjyp=#lIQI$JapjPDk_Q$;y~Y6TI#z;64EWp;&hId|e@hU>;7L z^svefmxcJF-DOU^g}CV4h{r;0Wng$kG|~U#DWHpeNv+2uVD~<@@#gQXRn4Hp4sImH z?V&&7uuppob4VK3A6KX!4y|<)RBgW%k=D_E9&ZwF4x3DJKQNuRpI{dB`V^d6JXc&) z{G#-oki&kS^;fI!>G!)%(EVvFBVu~G!i<%11UKy?0FOt{UA$LvXrbwtS$6GcOgYBNnhA!?pfn=`x zh0$!GhHo_=aVeDa!HSz_>Y8B8OHv#Dan{vARQ`fD+m)quPl-W}pCT5WSDybeKm4wp zkvQ(NA@wp+m9%1Kba2BMU-Go}8;#G4U*_qn#8%myl-nOD^_xD5Q+CS-g-uR>7O^*C z6>_qVrtn-gCwaYod8$NSTt1G_UDAHG>mZcCy$R$A+mCC?Qh$ayNO_+s&rXI(7Yr-y zcz4zI^4@>JmExylw$@?uWeR5+kz2#GRlI=UrZ_OEIHJRPEs6H0sjLnc^4xhE{u#5; zTbcAmdaTl(Etad{?g*4Mo7^Vn$jD;t(bkn_Xb+@T&dO_dvPN>ae1L5=Yr>o?-qugqpyYdP6gG$hfMC8 znZ<0TC1}dM*&kzkU{`WQ5OZamZ2)M9l2s;($x?QO9&x>DQ*-jTvs6L08FoYZHzP|s zbb2UvO06pM(WOeQo5Vq#uU{-vw&{soqQpZ}Tw-B{c9-QDea>Th1!pXyu&;uNqc5)} zhhD(%oHXC-7jNc7WTp9;Gzj2Jj9Vj_ZBE`r_TpCtr!K^mj4Z2Q3)B49D1MiYd^j9} zvfO`OP*GW{)3d^E>*Uh04|00&Q}BMqYt4v4qW}3_BPU0?*W#ewPD<=D)-O;*QB-R5 zB;%eSC(kfw9P`D>**nSv9*?}0p7P(c__$d;jig!I1s@lIzI%EvXC%wgsgK)?kj@uz zwBy&rpgf6`9y-pXcqPg3^zpC@AHI&PF1w<^WOg2!x5nT-FcINX>$t)4eDdrGTjr8r z7D%Jp#wP!Hq=*$6_BlR(rig3aXxCMfcT&r2E4?XsPdSiH=EsqJg)bd{PyMNT&pT^4~if(JtPB@$Ly67F&#kY zq&yF|eQ5tw;1YLK3-K|>3kfWhtc&VGD3IfQ$YU(2&+c&O`)0fvFh6|_lo$59p@EhP zdi+FVD_sJ;QE!MR`%cS20fW|jE0g2S&~|lfA2`1$D(mC&G3T8cO#4Z1HvW(?fp|Wa)G&)>aekdNb|>}w_V$B z@O1Q4X36zp^rc)MUh;dk%u6_$_B|!%Xl+H{qi#$eX$-I1EKlUuy|_oL&+)E6ebqA} zcP9r^%L!lny8Y}?foajiq)@;Wy16SG(xdP@o!OR!M+9PyJ*X)Q` zix`fGn0l{NC%zEtT1TR2q3P$3_mh;p{cJVEj(qqA>`(B@+zk@9YiPz%mwWPdd=Eli zlB!O$4gEI1WNRisc@Szz$bH!xV>$XMyIF`-GYXs-|K-Y{;-}+TYwRkAOV64L0#tfJ zcETB)wYuO?2fSpAaNix{T32-K4fa>YKfbLNgcKpoUKYzS&@f96ymo_A{BgFTA5{HB z8y{xio~xS^C+wRhl@^5p@&|=lM?5|qq4s0(WhUx%ozzizq!$*sM+2;qbX^;i>#AMob@PP+7a1*aW-7sH6u^ac4{;x9yuM?Q zuGb$i|9a6S#W29}&?S2q0{i=5@?8W66Y6wX?Cf6$lMqhA*qmW=vOaLSa(q4ZaL?|Y zj7G8~XKelp`W{O&c+U31=W9LC>N0g}vbSllgO+0*f~me;83jfmIH3RL2SB)ELP>%k z<+`U_vDe{pee^9qZ`)_mg1#sdV;o)XD2T>-?hi3Pgy?)6(epR zI&T*viI;nBe0?N@?Un@su`4~Uv%G|=%ak3$S|J2Xsn+mxmla$bE@_lc(hhII>Se8^*$VY8egtudI6L3ZSs}F1jGPl=3FMmXnA|+R1p$Mz)P7)lXbG=%?(^Eg#NF@wM8Rc_o zWkwaN{^?C3CGR>~l_{w+rIs07swC^JH(_1xCak454N>#UMb?DMM6GDMOo@o%i;dNj zAHF`Nl0<%D`U!*GGg@CA~G z&U4?n^{XUr-WdfgI9tzpwXIwJ4GDK6WhpH*&IrU1zW3S_DoGuC+O4_G=qUnLhoj1k zMH@8F$P#X9Q(whNrIQS(q1;(>}R>x*OkGWD9#8_bs}}&a>92oMKr} z)VNlnU?co$z7F|WzQZ&%cb{qLe|~}QjL8$vWR*PdX{QR$ep{O$D0A1F)f%8(!B%?p zLN*TY)QLJhxuZ;e)P3rP#0R$SKl#lXBfK!%u{zm2_&2sC&x&q{bqfk4_&Q>33I*G# z-YoIb3qTZ$7t2t{r4ENoIfjOTuc=Bu~f06$Z?r-SoqU@hCx~2YnN25a@ zK{1%>UU2-*8%#*7deW$Wf>l~10NAHUM$s19`6GKn%)*w*Ig{8486UK*58?=M$tp;8 zd#K!sjGAR3cPh(J11QLGh!3HXyFt{f^ZKkE-Jogq9_4S8I+K*}HSGtOfLjybyl;U1 zba!av)m9RomA_ppXAO6CraSa^fP0%p@*2<-NK$^Eb?l<*xvaT}DVvvCKi(hINEI)Y zgtJGrmKVPkUh&+^67)71t5{viwJLk)xsvb=DY-gqoN_V`hPaP)d|KBujAMG*wR&K_ z?024wH$Y*#L;Vbb^6IjN>~imOQjt7T$b}EdIT5|S^~-b`X(smjwK?h~wv&F;-=DQ~ z4olkG0a;B>xXOcBBKBBPVMmeV%R>)o^DX33i2e^{JQI?LgWPMSV5tJ+HLA&9P!z7qoX zZPoIaIAT3JL|OfFa@_3{ub;?u$ zUPryyox)mR@Y{lL((=!70Vn($U*z8FSll*;#8#%7i25B;Z{Bb@(PeB+FjY6Uj|H-h zmSva0^~-A}gH@`nj2Z~>U6a#3ePVs7f@0JSUBjVzF*t`uQ1Y{n+xR<$P^s17CKz;y zjQ#5!>~sMpxz=r!d~dn%)?^x&DgG(v>_hVWLia7eJo-B?)EH8PimKoWLqRF{zfEA+L6K9L^Uj#f+YkuWpy|{F#jzC z>Hj0G)HRLbpyt+ZK@%jYTMaVa?pf-qLBCp9>*k0R%isDLl5?Ok-{uc#`I~`pvN;DB z-uqgUsSB=Ve**ls*90fK@Ar1zV?UO=STDRu4G3}bzH6@SQSkhfBQ>x&N~?V#QnWo* z*TiNRPkd5s>8W4p`t2XajP>OxnHJ?QTU1?}jkVg*Xmi3AJ@dOe_?Uy_7V+ai8q!N@ zTUKvAS{fD_mdHxSV6uvVoPHcLL}bE#TRSy#)W68hD>p8g9y_*YyGyFcjmq-cVgpHG zE{6q39vP6e8}KbtNFu`PU}2~$0r!T}CWvIvd3%VHQ}cT~M`&N(RTWkC?{z7MSPG)1 zp0KLUmxy(g#fL2`+y1qSJc+_@M5k40g%X~OGjO|lmc6uWr>)x`%X`+emOoMBhuMu_ z0TM~6)Unj7hy_u5BR<`Pmz8T~?}W`iGc>gFVtsJrF=`o_{VwLO{sNs*#;l|2SHHi4}R%+Y%Dnm!N zm1Y6(qSx1H*t4l*zZC&MkG@HY_5^k1q(-(_8;|=Xl0WiCn2Re`3h6m5$+em$wE>zc zOdkk*)kSGKiBl~sU6Ld94=Nq&(;)gW@RDji_EY^+Ci$5I=`&Kcgb>^Q+CjKlu)iTl z6lS$!iu0)Py>OjSi+MLi3;@T*_>aJ$NM zdM5QNGoDh0NSR{F_h~(4xkN)DgpE6ZQ)MBz5FY1l_}MoVrDEiFDfi6N+~;0UyC9!N z3w)P3qQrz7g9B`GSfw7e{4_WRX^VI@JZdptSm3H!&P z_GSX$#2q&U?T=l!s(Pi{t&4-HQ1)is);yPv^28z7ur(u%9JJ~cX-Z0AdR^pKhkl;_ zL^ubVmAE-Y3qbDLDE#K6-;w#h&~-GwZZIut)%Q~ile8dgZHD&B#|4H=`{r$NKvmP= z-(jSS63Qp9QoELf5^HOSjRmRS=q4Vq?1}6xwp;*wS`k>vjj5}YW<{l{b;jT7b+wj1 zk^ZqaYAdz+>VeBC%-XWybv&@;4}n9yw%x z{L20Ejo!3eb=Q?lJLT!(|DscFz6K{Po&6Q*U(Nl+AJ<6;a89XOkI%|{;A$nj-MRl!vvK*COyTim$FK6EaWa^2}V3ho9m51#kjpX8I4V6C=t5(nDowCnR&mj*B`>s8b)Pr z8OeIu`>*=^zH1ZbwoxpK`4ZPjMfdQkQh(Up#Dr$ve#t=BBs~-I&yuvi5T;d;cN&1J zt6 zuk-3v$g`^_uGQcl+mHM{OB8zWNVfkP5plU=ZyJo32pU(Yo+<{l`-KmA`6+D-A(Q-Vtu`Mdcvx_bu3{`q}Fx2uN-DismE zxcsg+{glbI)#dY82vl?3z&ve@NcvNdDD*N+GFCKFn6(GoOPJfqPwvG3F7dBitR^(s z&%i$A%l)yI4XIlyQO(twx?P>EZtpkgIU9~0J~Q~aesd(8_X%*Ap|bo+7|-ss27np; zCYZ5MfJ|2$6XB6sln*A$H?DrGg)o^g7^t1Ex#g97m8fbB`AC)tjE5p)p}g+oBKyz= z#NKOC+x?p`331p=GeyU7`)sQA81naRu%*TQp*YNNF=koTV*vK^CWH9e_~ye?$@Mt9 z+@nd~56RNj*CLeYTE!nJ_J*kNPyhSi5W_;>&m*rxuB?rs13sC`@#K92U*bu3M6=$i z{Gr{5=?~B(cKm!4IBRbZJh0l=Q250MJ6>YB@vE~FOdZc%4^ALG&cp~ooVup-o-ez3Z&d{T=(zK)xiXz~pnV{7;}dwfP# z;R1d1vpYe*lMK=bKhJtRk@aZV4}u)c!=+LeGig+^It`8IPRZCP#!nhqb?H3J&(TP_E#_igy#Q{HSrkjUoRD^|QNNAoxI9p~-v!GYrt`#B0Tk;7ov3wn zMRS5jr z!gPvFxWwnwN-p2GH7Kdw6JTa3dR;l1Dl(W^W1Q-HyE;<^u0D{sY+F>*>TOvQ{3}Eo zP$CTy;E?=o%S#i#l5F|DtP3Q>$_F=6X}2ao3IN(KmM>A^ct^OWFWg|EJBd#%snQwk zh8;4=Ll|NH`NIee#!Wh6XJ}Ow6(O1>0V2#aN~o8Qm4Ua!%*K%w7{jgD(!H{q0aK4> z#A4{N4PnD5>ccg()eqx$=SDEAJA<$^`|%PThq_%IkE_{#3zKiMfSY2b@#WS3xGBWX z_`NmA)U(MU6(8>!P}ulHCeo~XjavW%VNB^F(=3yJ!yvw|W)*W^+qRvYsrTFyJI^U| z^aDQ4z*tiT1JIM+WY|EAad zN=LPmMbWIs3wX@k7tGQ-Je(#4A1m#M1k&i$j+~TT#yMfzpz4P50o7AcA=qY`S$
d{&zNK_QTO?Xr#GXW&cR9f77}Za4hi%R+<(psdSv&Iw&? zI!8FVbqg3R>x0MKmbkTY)I1_eo>up!`<0;(h;)D^TI_#(wpVa9Y7@#tqDo5;#;HQB zQ`g<~YwSLcyJ(R4pmAQDBmv{h`$rqd`QQ|ZLT3ypojEuJE453-J zgySfjfSBgA^L=#(vQ!{1B*Vvk7h(-2uv6PQ$W8W50-rc8rJ5r_woxM40{bcSDkM`z z&ccs7r`+~Le=#Of+G*kBf3G3RXK<{e{~K8G&~HK2Xn3V^c3>*0;{dleRqj zmDMV(sf1}vwhBHqb(g&^)C%FVaEgSiNT(p3#+L_kQtsDz5ZCmf6`nR$DX_59xSJXJx|Prpq=bF2!4Id=z2)7#;5Vfnl#>a3MOYE6|~Ky=y(y+iexesL2;y zmC9o{IoKO1b24Yc5w|!1D@=fwr}|+8>Dbk_c9z3M$uapes+y|F9ZR$NM4%dYxOzf& zI+o^+ebds_h_&F-0XTr^MU*!_3<*UX?zj|3gjVn%8YV`<)mg=yhX&)MUIo=qe7AKx z0#LqtW!KCgOlHaD_UPq&pWkQoTjqUdI3p*3Q~FYc#Oa(rWLWB4nPVb^x;eogH}VLm z&vFGUq<~VsX|J(6UTjPYMKxhwTqf;<_h~98Ow`~cS0@C4-yJ_>45UOpZt{cEMruLg zDCx&iP+C^8%Xs<8=`)qEXE!2a9RF-uU;@xCwvY zu5~G{%H~2EO=v9w**nR~(z{PFQ+q==;@Uu!9|y`C!6$ds4_kL+@s3wYdx}w@yL|Gj z1n}kx(y93PAj>CHR+p#R`(LeVKR6oNV5Nn&Od;C@-wH7D2~_|fs(G2 z{I5<1{OK{J;*xg3Up+ARJKn;d!1J|J&)-LX9>`&Co9Br5{^-|<~It1@>31qdJHL zJTgFJx5aF|w%Bu&NysxEydgeU*Cw)Jk-dr>+&7csB-JN66D){Bvh}o_JC7`n`L@lr zE{jIf6GmgfCjvlb8-X&<-f*(Tvs?svM}ln9vsbNNqy2C^Kg9GL7W@OD!U?*u0n z6*go9GogJG*3bzzxpU!XCw_Aa>HA5JkyASK(H}F)E=_8HD@NSukEv|mkf=lh^`HI# zNutN|4@-Z4$A|`q7F#KBUte!R!vXB_SRI=+$eZTE2@uVA$|IvoKRQBRAe%! zAWCvj>sVEdRkjHQDuHIcHnhMQa0FhmA%O2tYWGxetDvFF<4a zW@YI;?0157kZa$%8v1;$0U}OaTp{@N>!D5Unn9|5r`d4P&aGMGrw)U=eusM=D|0=# z_hGD}21Uxz&HC3Ie#y-BBj23o7ydY0vqM{+Veer*^#p`GSfwO^oyN*lNw*AZ@k>17 z1!2bHO+8Bj%qzdn+P6nIBFpnnS8`>JcEuJ>KlGnKLZu1&bjy?F)$y_yb9(7&Tsq?W zo92U7i#_5Fg4YMG8Wj5@Mz?>G;tfZ-ii~BHfsU@H(#_#vIFQE0QOve^7SY2DzXkpJ zLpMYmO|AF1=qB?U*JP`Cs#^RMwWln?8mx(Fyng`79a%H&(#b3Z@hol*&iTZ*hyhm<@-}G;MzZc0C)P6kwBV3OokzSN8T_saB{2 zjvm7bcfd6kz7?_`P*jyoTm$~%j^j_1g1l_a4RC%WqP$dknpT z8ZL<1B~NSuS$L37_HVxd4I)Z-Lp9}YO}9suu}+~0SLMo3wN=(X1~Us6D-&3d-AF?W zkP8F)O-Kfn%#{8D{-KWV)pCZ+kz{Of$)c63pFbSdkesRR7y2C)hpIAYb0GO#>7#zI z--Is|?xB9%7Bfn)P@D=7*gRNa95y9-v zYM2R#oaK&md_?p|%pa7Yyz}I7kJ~1letP)tnPvy)GwYYmU~)sVUR%(!mggXbrv z4ocVrlA*TSyVM+?W&QcFfb;%EAM{~ZX5nHd;vV~KO!>sWz3inwg6R{#=8mXtzNpCZD8@ejc8u$_{MVP{OdIUeXvg|dX6YyJ1MI5maDl*) zB7{8e7`igQCO@Nr4MwA zAAaB7F@r&(&_jRH;Q0zH=Uq@z4CZANmMTdi;Z{$#Dz%XQ%r?XIxjFtn67)t_8;Q$tj>77YNCIwWr{Df-1o_|NN1ZT~r)-hed}Zqy4F6-d;~J~9&mx71p$(howS`JD z<=S}D&peq{&WTtrpaN8KXn%w6$jMSyt82ieX#{7umOK# z^jhLD9pU~z*n7*UxVCg{6qi774G=7W;O_439;A>ELU4D7U?D(ocXto&fk1F~cZb3X zD87~5eZIT9PoFdH-#f+~`~r$%)m(GU*B)6xs-5~U6P^!9kjc?&m1D)2$a4UFd)<7g zvc}9cSIpUulleS@fWpaJx5{+bvL}``IC=y<0I5MzVpI|FM>i$20orJa5A)&6SlqJ5 zWr{T|ZN^i(kVl)~y`-(hs>sC12enr`zPWY00E(=3CoXFAF(eu2lujJ?lEdHu83AaV z+ipR6cN7f@$E*4L2>a%ryWvt0_#11vwk5iIw~IvvmiG?*cE zqAUZIU(plbYnP=`-jx5Qnm~X>M1z_9`H*6*m`cf-iUZ&;vS3q73e1WsP0}XUvvTa( ziLu_4l6*cdCEoo#l(}gq%kiSY`n6BC3F8SW48NClu7`G(9Zbxr8V7o6&c5KBR5#rH zhyC>cWn=Fjdrpjd`cVy%G_dI6L>(IY9g2UZ+D&w0mcFU?=lFYxmfe9c3B=1 z{NjbmX|HQLA&z<9h~JBc%AX@2AuR0!@bAf{HJB7(Gwte`+!QPNHeI9o6=MKfBNO@& zK#Lnym%9RI9?eQqO39BZqm? z&`nI3$&Dy!bduu|0y+KI4=}YPLTgTzO-_Jkc?yqT&TmgQK=*zm z(AT$aOP^s%shE)fV%qLlkR(}^23*8tg?kMZjXOmJt^3dR3_o7>TcC3_fdJ#vc%K&| z;cTh;<>O&BsC>;q=Dk&M8=&hp+wL`1FY=%y4pR4e^^yZf8GAHu%TFiTBQ@D!k)Vzp zx98nKp&y2(Eny`v7alBa0*PEc<&@4?Ek(Zht1kYs2y67O=SZ>$(D7Vw=B+T63hkUg z*N2*z)>jJiaETrTz1)Kv+8xbg1_V90bTufGqz+5xI#<`6c1LeNEZOs1zkO6Iqzl_@gw4b0E3hA=WJmvov{k8u%5DFI+^^5a+0LYu+&l%N$-nJe0 zG;s%e+6+r7LwIylFCH(*cVqKpb^zS>urTfi=fmlE=2hCjd>Uww!{=lfx2?Nyg6z=qO_O@HzJ<=nOKIr~|G1reQ$jpTPFYeeMXYn?)%m z)=<4jnaLv)JtLvNl5lNrAdPz%(DX~E*Q@(LFrv5)WYMIYEL0-S1ZzMuSH0NS*TRUF z%2EOJco=Edx{qaj(T*_Vi7J$IBYdnP#KYeg_ApH`@QVDEd3SLEs%P1&gqpJr|}Mpw|fJ|AU^=wgO2O-Wu$>wt=FgV z5i-lOuv^51(TrBX-V#d+wNcWA44(yDh~sFMg9LnZ;LC!dCGV#Z3_7*L<#Bhw1q!GK zrt8wsASI2j?h3oL=M21}@P22pe0UHek?j(He!^11y-lNB<;0@Z4eu9vJc2&eE+M$= zH;~-Ar8jp>{>s>ej9b(2drts>|Mi6i3^FrhUg-z)h#ePzvsd12RP-!(0`BzZo1;^I z;|B1{t2&`STN01&(TOMjj6LS-MvH{As#;IqA2ny+PQ7*_C*=ts`(>xd{3~wl-R+uN z7FYS?u1XW{lJ(*bBY@ul^%^O89FwfCY)ScOI&o~`S(OEOiqDtL>=CT8{qDt{AH8s0 zLEO~AG1sf+RPl*BO5nFox!>{D)YCIiy+4zN=mxywG4N~WApaE%kOuqRWb)_4ilGM{ za~7E&3nw1lm`B9VvRSm1AC@APn@EpWBV zV&5p2%2+=Rz5 zY@xy>CH>pfvpLl@bV+@jyBad_K%AAi*_cZSm5dGej|X+;fr zdtvDdWO}^>&`snoBj*a3Iyn3GyvI}F4KTkZ1T|Jco!t=MdQ90Mzh#Ne1E1554(AL3 z(ZN+^5w4&@qq5WQENdE$8bk3oKv%OMy4|lmlQVhXo^N+AYsc=Yy=V;$!r}b_7ku+! z70%Vg15(n)?(q1@BJ=N{WGoaGQ5aQs>d$`#OS>HS`+%BjoYw zk1N*5keC?7EZi$&0P&R+5AbAw$!0@#0D0_B`uSs?i)yO*cIW=#%IS+Kr-A39p5*It?+ zrNGf}%tO2kv_RB6!G~tGTcl3k%Ks#l-RPK7e>F~iIKznmSZyPl`MzJ^*=7x|KcuLH z5QWgQDaPchRecIO07G=}My&re#>c;9>|wIN{2(m3IQZX`ySn=Ee~>r7EvzVpOkkf zI=rh?Aoj$sW+P$#_i-i`B}`b^zqEk-I^R49G9*-;+wFn%NP1#EJp{?{t6_n?&<-gayyRnq5iQ` zKgt@*J0>G(a~4`j`rasW&gNYA&xu713*$jG=X*Rw_=3V_8YY1?r?BM0R1f7tep zBV2O^zbmW%GB62vhX~l>Qm;K%YuucPP;@?>@yMmoL@m26RXAE5PJa(p3{?B9PWHFU zsRFLh2y^#u8|MGY>Hf!`$!Y?^xNl3Rq%8hEg8274{kMMrIE?__B-_`<82|Fa|K+~~ zNWKN0^;~{KXM+E?e**jerH`@xe4K&!1Hb=a0ECAxg^-VqfUk-NYZ-HjQP4_~-`d(L zkgxD6_VkqX9X?|h48lF}^0W6I|3g-t#cjIK9^-8$+L_>3yM>vn>n=wf@U`X>ipmO0 z(}j=>gKG?@=>MO-@u!6)fbqCo7y92{_CLG^ydG=U;RH9>E4=iL41upN4|GZNFadiU*Lb^((EQ)o`d^sKaR6QA#4hP;Yq$~f~NL>Bi-;gl{j(e?G5-sxgFrxvf<*CQE18JBy*4@CK?af5$8 zxBDG}E)4jb_=@bmKL@_3#|y1lhtpQ?o}!4k(&^(_j&5JwVDSe4?ttpiMn2}E42ev+ zj42!;ulK1*dwyvY9rQ+MnZJ0rK9O?yJQIdpVzX9*=F{R?@%3myLx#?F`3D=-DybX| z7GnTQ$K7{f+of1$qn2%KghhgSw&T|@G+z$@$((U)4of9h@{x27AT# za{DeThuX~c6^Gf(gNa|h68vhU0Hs$-V-Lr96Gnb=@hpSlN28doSjwu6f%8PY(c!Z`|=PCr*Ndj5kjf-hEPs(gyRS@AL+X}3VF~25v%%Te=5(3r%PiXnR z^55_B9fd#YaBlzb-TB7x^k&G_JBx3}qk=MZEVOXh03d7vOk782F?u{1DDg+yDB?Oi zuIN)&7iB!F3Ebga5#d|Hpq=QnE!fO1N5Mj6s;l)+#`nKF%(w#{ZqGEL-e04*2pRyI zLM8Safp{#dS9rJ0dv`~N$r8j9W0w2GF1s8<`?iTt8c;8yf15%hd(fUo< zjpR+a_H~Q++|}NaeHD#YS$@zQz)XGOTSjYf<6T#gQO0}WQ^=>R&5Ilv0YCDh=^B`Q zhanqfhJQUH!zh8(+O~n+?+!war_|uKd`+_O!|~p9DE+{vid4uAibk)&e0kKIDb%9g z3vp?GEQa@az|8fyA{<iY#c6!{0l~1M!FeeTx zi5s+i`R%>1Y(4v9;P2di8K&JvEtoM7bR#|4f-yZl^obG;gcEzgXqDA z<{yY);XvFpMWCt}`ue(MF@8DQ)enG*LaxRhz<@^`g3D8H%l=}+*+KJOCeXw8zA#w{ z>@|mD`vQ|0T8mFVdDgj>TM|br$e#P-A1k!l>?FfDpq(|EE+k_vpOk-LCL^RykOKE- zu_D;CP-UhufjD~)+gJ4Op$bI=uG&6Gj`9b~SVq1@rU%U<6|wQxbQFJ9`->Gf9Xh%1 zeWr9t?ul+F&b7y_Wjb#=ld0ls6`fI#J^X2LGNLIdAAgWrXHW#-*T^VCowV4 zB`00^OYk&kV^>H?qlPYj-I~I6W1(oquY>O~X_zCEpr@9qLr{WJ)75t^_l;J2K^JJuJQsB6|AajlvQKui24fYWEZ6BAlM zxYg}j*uLhwV@XGckEi;|B3B+S66Trf#KhXRn}NkWvFz&kT?|Lz zF~cJ&kP$szg_->od;XSo`G2FUYyR>Jo$ zcNpp|)_gb4Pz;+LLr%lRjsRs1wL--+jaYF+I-A9&_R1Q5`?E0-%PEVjsY=7vg6rI( zeo@yJ=QH(=HjiT6i5}0G-^Cl6Io^6z#$e9AkmUCyT9GSk#8g5I;n;|SH)tGO^8dA&uOWy0Z6VDf7%dFRQP_tqj{lndn!=x zdqUr{ev@dkgcv8}Y^3WPcyQphD#wr#&#W~$Va%iWbhcQRgh9$HNyuW9d**i+ue||Tc4d{jF#1{UST!%5~iO2!d1ek$F2eBExuFORrIu{wAo5o=`bTC6L9_7@px!;->@$b zsD%+buzolkkwEVi<_|sAm3pU}xm(TJ)$a0up*N5&l@4f6XYUuttt5$cNfHNof0evKZH z@2-#!tkjrI2Yl7p=~OAm6W(e64kI~CUh%q}xH%Ch=p^@jj8!j^ms;p^3^kV|yZT8| zwIsE`d#Ww`3KlYt64DB_UR=p7e#bIZq#R!q|5pC~M8Iokd;1wQM19^9d;`#2&G zU>sx8U7jJ0MrWrB&05Sefh~?{gGGRq05;=P0rrVC#sp0gi_RDIwwqMn<~*C}ij+Et z5d z&9d_oXaXsR$qzIw5hC@Bc>aI?X%~;KS=-eHg z$jilakA>bp*vTgxDs@YML(vHH-K3tG@QRvrJ{3{kp)^E?-61SNjl)yh5F-ZPlyqch zK`_YqqyfIy_oCTKBe8=u1&f_1Bup|fj*p{>dl;u{J9T5Z$XK5ZqZ}Kxz#N#7{5R?Q zkzEBiC&shoDJ7y%Z{gwc*U_Sl7o^H*!Wu@CO>USMzA?$Ol}i+v1!IDV?mq=or)XZ9 zKOq9RxC?LF`5$u7QZG}!s??b>wf2^Vs2jr!jZTrrbLt%QZv1yKS*hXnBN%}~(^)El z7YHLMTuSv^bDyqLUFzlf6quNzto|gLBdOd3Pnq%TC}6(X2;o7`iy{`a47D~ZPHR;a z<|MP*<6J)xk0EDb<*ScTJFVfstqA2e?R3vt055#(wh~$ah92i3zP1^Q4exG|`J&9A z++a^LKuIxP2~2WP>Ho;b1WDY-Es)E250-IKFZtf@-Pqu%n)2vX$N-q|%P2G;PIZ(#9ChY^udeNT=#)I$elL;qUCoxd2za;;?_MW9 z^`lTWmgzS0XJGk=w<$1#TE=UABwv3RP6>q)oJ;^BNF}B2t`+INV}NezU=0$3UpIJe zdEf4fdgaPzfr&k(B;mR~^+rXyW`yLFiQfIryw#<4nYOZUw-pYHQTf;_)1!34{*Sde7fl%okG19>W{LRrqA&HiaL)C z6w749!lVBhSd&HPaZt2iIIVta^4$k@Q|ecQ>7 zZ-I$R$!G<~z#|_fL(^#8m?;zADGPaCCxrGY!5}D4ef*uP)??6=p^(andVM;RA)mx( zvL}V{+poowsr&3OVOY}hfhf*pHKVsC6e0MUw~JnLHd1fii2r2b@7LlBPazW3wI1cu5+kp^XtIyY=%MI}Jto z>m}9;m8TA(>YIe7^T_U*RiW0U7kdG*hG6 zd^A?5b;rA#2!qlSWV_-uHDNYzVk_m-m(L{kV%aYdmFjQIAQEV+Fu)}6Hh*pc)RMxA;g=Q!dZ29sJN;oQ->PBp9JNeBUT*SQ{hb1yO154XI4puK&u%`#(u?PZeb%PXJi zv;63N=?9HgTX?!^UlB7TI^hN!4@JD;`C=&BD(b7*TY~L8a*bR~54x7ABa^cFlxV~$ z9SxK0tmOtT6-zl8GLGj)tA`rA;UCS*!(nP>A^UGHoBeeWygQzu$X69R!b8KUTEqJ# zMOnG9@S*Y>H3c#b)hSrx&Ij|Wmz;g3N~w+Ud*dHP`*H+OUJUu^>iL4zRKr59wntCu zK;h7ri8O)xj{aDqVnoJ!<)=lD-(Cx30@X5=o168LVpWl1jFOS~Z zB?D0j)q&bqyIOYwf>(TrA>Oo85 zEV;XboB-@-YqT}_xK!>4Or>Mt>6ABzF|oPK0YSQg9+x`pfg#ydMnN=}KMaZceu?D@ zrSMsO1H1jRTwKp2p}t;~dkZE%@{touE;s(?@!7`A8?*=fXoqQxT7Tvd=F zg#gtzegA9TEJNMQcZMzTc#X#6@E}uhyu4OXL{ZiPzpGs(;yyqOxKTxKfyS0?AoKK@MT9}vlbW>`29Om!UG2CA%u?itu7CZ z)$g5_&FsqnPYbFFv>gg=nx}Jfy*BrYd@28#TtVY(GK`=U4ch3Ybjbn2yK47r8m&|= zn>QV&BlI1nQ8LN0x^*AhO*W7(Qh3~Ggl>=Pq^B<$z-v^P8>|P}NS7Cg0zLi`k7|J9 z87<6t0u$qfXnX){^LAB-eAC%-4#4B~3X}0xiYT@Bc{+@v#gY=6PGEoAG4w6F&SGq; zoX;sr>@j7k2xS-@u`O_FI5Pt=Th*g9ZIj_LnqG^GW|`F_K~MLq`_01MKC(&9=Ua-%#su`Xl8gUL&A*g>cmaI)}qcqTZYqv(EZf$hNa&@-V?9X0_)#N#E4~ zecFAO3m0KVr0i9VxTy0#IHDH!4IC3yvYi~Dr#A`L4KyF~_pv~8y^pYIfClta&3V9SXtKzH)=oum0cysPZP|>~G6Uo!56~AkDdz96^!p8_VT- z80YuiAx0(gFC~`W145OSOgkPX0WZfE0LIHL&gx==OSS6w;Z~!%Y~XP*Q?P@_l{dwb zx8jH1mIZA}BYz2f{%Sw+DpWP0=V=byPfL-WyWjTRdb$G_$4#hrxFOZV>}|A7xP2Cc-Y)utnJ^o)y{T9%M)d$CI&Q!8ewvNzTu| zc_jv6%d#v+({n(Q#5Oavi0xTyLT|Bf!JUzA?{xR|TC77}L@1MqScBD~f=ngO7~Z4W zoU=(o1N*-!j3<3s%#X#3d+W(Y`Q-83vCnZ_#3o*yXV4!_FB?E#9yd!k8)|&<;%UDu z*CvJb(BN&yfDCCIt@I20>4rN*H1mE0lX6hqWUWXvq*m`rd$N{bl^RfKWoG*N7UzU= z6<>r<+f}m->nuZDHhVLeO2|0Rw}rEwkHHl9u{F$t;u@fb3M}!--AuWOT!r* z-BJ-$k?O`&Mm=>kyS^ki=_h`k;cVvfo+q`;iCcgB6a9(5ui0O{pD7Eky2%@!^T&9_YB_pG%<3%!^H4t#fq&o-Mk+YSl&I(1wXD z*jiN~Rykmvm3MQt4H*G1{53&u=Ai;VT+S8-u-=*qB9EDs@~p+5x$gDLD5DWdbvV&m zeF9z_ZR4||DlfHmylao-Iq1RaFGn8{4)wCj9erc$`U z{OSdLymDa?>4e_sOP+d%;41n?A$cRoBo9M+#m=?Zt4yL1q`?Qn%?Z*x57<3$S=fFTQf)g<&9=SLy(*!~hV9>pW?Y)|$5enO zEaYVx5&C)h65n)lsi5x6#5)#%w!-lU=*2OLD^htNAd3`(GvCTVGGsF^|cKZnb(C`o+RF;8?@N0*Hd zmt^|dS3dg%&(E&ENxZn0CxBRZ5_dIf0XX4jbia2~-TXx^4R@;D?p2}!HVJn73$bqty9S&VjI$%lX9s*$X@PsA3VHouc_*FHU*vHFsgLoKc65stOl zj6%sB4?QnOWos!AdGc`_S-ej4{f#_w{RPY3t47R_+k8=xIx`F{IW2>)T-mTiW__W_ z$u_Y&%NNQ=1qz^I|27D~%LU>sz?fPK5?SNN=cL&z=pssKO%Zp1w#%wz%zNz!}}KWlmfr9y*!ivqX| z3?a8Mu4ayDbKuCZ70T-_Osn#0Llq7G{q4U^hk?oQeh)_7cn>orWIc?95}`8G9tl49 z4i|*Gh)A4+*{A=q(u_*;r2*xrHvAy{xknZwCz4o?6b!;f9L}P#{ZbO^_V`Ag^y3MV zMfz@lum@8IR3q#wNKw1wvF6pF#_MZTW)n79vYWdZWcOo9)z^f&$NO*;=;{loimd0s z;Y3_NkYc}PND!++%ZK1E#o6{}^O_7H5;uWsbB#*0J z*iHVv4Q{o`??Xi&rzXvxk(bS`?Eetfl69A=PR8wfU2BmbVtZK*bXmWmW%_J4C*UeX z5nuFgS1*`sY7|%iBaM-wC?6A?m2(R&y27F*PYb#aM>j^4uY@bL;6i zEnWBMXgG^|l>1D@+I*r2QanB=ETBA{%lKmH}X|$<&ZGjMv-J=ZMdy& ziS`For#+UK1KXvJIyN~=u96iy(d|0a*jmHRE>s5KAw0!29~jM9rc@r>qUx7lx&fV3 zHt|=Y*$C@Z4-Q2N7TyNg`!T46wh)=(YGG6$bSVdOw_suRFbfnVnS-4wgqOP-+@Cca z0*%Lq4gxJ1V2LZ$HbuZrCw(I4MROrNLv$GTE}rcH?4REDiBl90gMA4OMeC+|FZ-no z_dXI!u2kvjqr%S!b*tP584n$6lAz9Nn{w=cI@jbP_XeVFMk;)Lc?;w&uC7~^yzg=^ z2j!1HcW5V2f0an?*OmVfgc&;h5R(A&-cP39^JmQ3VFrJ^19_iN47AW_RGjXgp;`Q( zGmlw3OFJP%qi8I-ZgpPg9=-D&W_OF|<nqRfANX8L5| za$fj*qdLIB=3*}E`dAiYI*P4t4IkiUXa`~%lwqFhh7+yJkW)xMdh_|%_sT!!4xq-7 zLJi8Imx$r{u>6xV;_kLyq2N#Z$0WGmIsI^bcpW#+4I+k^851`88W6%zMs*kfBk!ns z6Vc&ON)bHx8ibGxp3VU_kMf?HS9n^m#jx6U{amifSup2Xg>2P2)%Fe^cIb;pTi~j} z3Yt|gD_J_qub$)V$8 zFgljlmougw9Ng%f9n3O%CnznGfZj7G7*?a0x!TT=LHgoXK9Fu!i-#3xdfaMR9E_Fg zF8(C-X+Dz{evf3$zfa?aUoR|X`&M2RI$brj2Vx6gogNbRe}NgdEC2X{EoFhP!i@#g zVY*$EpgKxgx#9~9lxzzon3;FCpb%^%Z?aHV~5gbK58$Go6sA7>g zA9bwlb7VQ=?7e&wKhOns^)a}+o|AEIeY(Ip3v1MOtHy#8#=ApP!hi&6kHQLO9I7!WMqK!Qy6utw(hm!q1il1F+{nK0J8`^rY zEX{TS@nSpL;O=(kfVzZiQr~rFhvlyBUMkE~Xr%e**EXzS>6B4v$$cLmkPm@D*b!x0 zcUEVk=*pmFJM6R9?NevJ(zMmbqR<_dO4~#+a1z7g?L~0?4=d_&8SmJtYPew6aqDh` zC+!)QgPEdEK9AQA)o}Tll)C;L0z8X6K;pWQNW(!}=Ci_|#zL9dqD^?# zVsy3z&$vPtOP1+V7bbhVXSW3MdpRd?V%MTo>7dfII12OxIv_GhEDxuhy`FWRKVR`& zKjmOuYTQR*z^cAGaK0jzGO9C!3jm-&s@Z+>BLCjBm{1mdxoOHuL4+pSK|}EP76YD} zXt_H}xF#q-t!^smgxB>k_`ZIiL)adl8IEG*Ot+F$!9q8C3-&=Rt4Sns4OOX?ezeLFCP%b!RBoQV?}hm)%2J!d+xLk5{6w@fI;X?&hKi!&@yMWz0GWwUarxUd^c*jP}d@pE$DKj zl*}r{50`<}Pf>0(W)ef9{nK0Ny!haVwzX<2Br-t> zGno{7F$V(QmUI1Kr;s0N0lDt=Z}6!=*PvCM%ZsL~u@V>*j}n%Yunss#kbB{>tMU?q zpO0kI68TDQl&z3BA)OiB8=q!Y-F!6+muk;1O=t537|7R0`BjY;XTDp$+OuK5d1m`D z0&aLlOmd=gABd(LdAG?x|WA~{i+I@Hop4KI3lk*t*Ijgs3MoFHCH z0Hd(2EkFuU>4)iC19fu5>@4e384pCFz5vm~mxk-M1Y_&70l_;TiG%xT6UcQlnRG+h z3wyd-ldD?Xj~dCofEXq+Nlwy8o*wNL;^Nx6Tl0pHX`eKFN;rKE1i*RIm+^xv^)v3@ zuo`W1aBLE4KOPTXRvIqDA5>AI7d#AlI3l8T z#u35QvWEY({&-_i)x)%!DCjr+>0N&|XJWO#?CJ773#m^)M1TX=kBXjB%>rqJa*boa zy>#M3?3DACo;ra~b$tMCkxH#;3du^dp_^nV%wUE0baQgk%5G)PEs%f!r*7OHC@WZP zXX1cG_iz-nl=lcB(ba)IKJjP7IB-PKE9cx$PbVE2KMhxPmKwuDqlQ{YVx5le|2kh0 zDa_k3;E?=A*Xoea+?BI%SJpfxl=nwZ9?>LW5GXGO0Jb@hLo$l)UtI%O#R9CqgiNdIrM&r6Vyx?O+^{I|qdc+vvv& z8)xjfJ^jYge6J_*@(Ref>n!Yy)X*mG&`%u@NHsJHV4j(UnUK2mr3pGpqUHW8LuIFKWPBUG?ni?~^k=XAjP&_$dkqO8R~#ldpa2li zA`X&<8qKn?es+b-EfX2v?)0d^ zPaU??WWa%=e&9e&uBE#RYHBV!e+tKm7r8##z87)2N!KCfOpG_bi8MTw~$OjsGl{lhNRir~|5%w@{$r-Nd*SO{S z^pHvVbWvX)A>5osJ6VNyz`3LpS0y;PrawZCId6zO{9%v-Wtw6#;Ne3zm4_l|^_30Y z<3_ti1EqX%xEoD%qmwOo4vYH`POHOPFWtG!U@Oxzt!Of8>*HS4$@H4sc%eSu)56WQ z?WsyvRU`t?!?1K=*wR%bfD!s?F%8p8qSyrs>>@t@KBIpJLZYz1Vd?`3{q=G4Sz67{uHuE4WNbr32tDujIt+MU_yb0qc6}fp!##$Vcayp=J@uG6 zw`O5x0H_@u6MKnQ07s&3tH;$x1e)de-mdt|AXo;5J!gvH!}l)eK{kiNvUx0fyEw*X zKb2TdBde}zrtvy7k;xTJd-$T#;^f{26AmJX7Q<0Im3bt;!0hLv^Rm61-iiFhjGQBog{4*&ZzSM)3n313U^m{0e{ptU>RQYjL1VEL0VL+xoWVH%~IJ zM`T*KJ9ft~~f7 zMY;)s-4a7YKpp4;#7zBuw)s8UQbf_P)>2T-*9?)pBfY6CJ6cmJ(5<7uGaNq5fkRL> znUA*OcB!k;b-?cL2g%!4Jm{wTXHgZ)g;lkH>6KN@2s1;uDn9EjAb9EoMLGuacN(sa;1`Z0_#X ze(>~LYs)7;tw5t>HfsBTpAi#{sBX9ZaR}#4xl*d(UuV^|tH;lBzTHoJt8-hykYOc4 z>xaSt%4A>PA4PI1S&Oq-Y+;odKYC@Le)rtEY9SiAiaz&3KEwiAw{);H!mnzbY_I3A zd|97HRR0kRi4))`{NUvB6`GR)kXQ0p@n&zQVi(~bWLs|U-hbOv3UHq(2!noq9ENkn zcID>{JOXIJCg{dnXiNfoDloyYWL#Ljkl%W(#@iS6crXXJk9X{&SyN1nx=ah(oS2VF zr(K%$n=PMyu`hiR8iLCn*6Cm)az2{S_sy_FgbSLCz`tAK`;&)p$DqP+u@RLcW&^IG z#12h3@e2k0hd(-N_qbKcc#F+`5GE$7-Un8}!@FR;tk7*(M9Gt_nfy6d>8T5yta#|3 z1cl+!_&ZZ(oXV`tGQ}k)(KxoAq9DV@WV%|n#zvzID4n8UjwZdMoDALbqa72GEHC{n z{(~R_O$Rn6&CbwG<*Y2=DAFy}N>ID1b@EIXERVNdDa`u5 z6qQ;ZvmuIippt!XrWX{3;vg=tU*CC%PwCJFgghxgJp_}ARyReAB!6BYV|u2y`_JY9 zkx!i5AUjM|aAk{B(Xfb=>uSCDw1JF)TYLx~IFe--#mhodhEIq>EbgLw_}TDlv@dYn z7cs@ZO;jbAe$eAZwE-89Q4Rq!zGk@{LSaa?6GR}5SyUBDxm$d$hEJ>w^l1f$!Y-$3 zoOrg3_RB=j31!=JRBHA0o>AT~02gthe?>cF4%O1i{q9wdsL0x={4Hf!D?2l-j# zQ5l0mH(@Aq2EH#zo@LOi6D6CpO=#*bFoXR@CoM*i7U#6e? zQKWBUq4~l;=C+jdHzE1poulVUFgL629;Y2vhyEFz+Wl9g;gBk?dH_kcKQRhYCi~YC z!2JzsG3-ZlQr-+z2Yy~SW7fTI)insoEWn=1S5d#iDP4aJF=j^^C{K^$L}1t3wX>HX zuRkaB>uUn&-an1M&3v~2GAny$TUKlvSBU5e0A%FJ;=Um_hmBzl4BR0XAdEv4y`$22 ziP19@#}euZGxidCZr;3b&){Wy(dK&cfa2{EA)?Dt<8)p$`H^b^4wkIvyvaNCy)A-? zUW(~0;LYr7HlV`3xvg*)X2r@@h_rP9^lc(Nn~uH}6TkrDE`Cs}4Nr5K*B$QLcYcR+ zzw&E^n-Le9u7)h2L&8UiDB;3cmJ>XHbHM4wG7lcn{@BcOzzXy~N zpH^Yoz-fgAk8F$P&njAl^rjjefd&DXZc|)W@%%}tSfwgxeldixi23+z@HyQWY;_RL z*ZxV}S!K&N&(0K#{Nk#C83i|uVAtbp#gg{K_W`gNw{CuoBe26`a zFb{5L5Z}v|C0q@39lp9^E21JXC}Kgi2L=-keTxV8pSZg7_5Ci)$z%w{0y;CMQc^3L z_vaAUVX+S1up`MNNFnPMbhG2T0z>Zch*02^BN!9%x+NJ~1KRS(xeTK0T#Mf=o@B^Mb@H2>ux84kiSA7D@Z zS5gMPmodyAO6z=!cHRb*ztSr`TXR5gOoWlOnOeueTQh_i)@9S=x&>+IdcKF5Vy$(={_77r$2vW{7bIWBB3eG5fS&g%+8&dJ@;2McBcb;#W41W>5$CkkIoU8FlTpiZ5M3p((TQ{oi^wA}U}J=dkQB5&PGBIVpL5v((-CxxcXO`F zP3|y}Xs*mLsQ#+7vDl$x0?&TLtc-l-T2NL#^$KaSl+nPDNQEQL-MfcBN3G;acE_8M zgd)*CLXfZdw}|CACJa5Lq5U14+30ebC(6MoT8?wl)QnE&BdFR(ewPE=_$0n7;hK6~ z|6iC~#35oXijD92c#bf9V&;?ZU-(Rp$fFc)mSDo^`-mND3zzz=< zz4%oxaqMmR@H;g)8l#bWoCKGqw6SO-q{nN^*>Xd>X;5{CX=XAqF8BZpO-z76xn?>< z+`$~~Pxi>o%GpDEd=IR}9H-6d5Qs9e=O z4BZ5_XXxOBb5*aL^t1rtf#2svz-WT73Em@gSp8vHH@8!~1m-3l{+@cIY>*$iBMGw& zG|)xJ$>Ato4$3eTR<8$pf_9=3cvYGl5jN5?cri99!1%_^!;FGXWj<3Wp_6}&pzxU^ z;Xi>ce1pBkefeBkw3reGv~8GsfK9flWYHEZZ*zXuhm5M`Ik9B^Du`s5`U)vXtc~+yN;)C+T{jP zrmC~N(NO^2SZ$&wMDUx5j3R<+9?ggx`s+a_zFLbs_5ua<$$U9E#k&|HyllW!&clG` zF2NVgS)pGz_pc zrK%zmam7nu(ioy9HSx_D(k_-Y#nOH~_9UiE&p6+C-h<}+w0Bg0P&XnCnF*=T=PJ6f z5z%h_S%r)A#Ud^052eG4xNfM9T>G6&o(x9ag&ct8a8Kp6j1cVf8K&{vikjPLykAQK z`AV6t>%Bf*ETHDHSsw3=O!m&F8F??K&3p0lh^|DvAo?9378|?sdCeE+ke9@I6Qcs{x{rORh?O@uQgTD`m$ zt5`uEZy1sOz|#);CW3aSzTL2WVDp|PO67O?0?s;k`l=}v&k`@fb|DS&bqV-5nyS?K zcv&VWVmFFDl*ALQGY=igOcQiTEaph%u~IxM@X|?CnMM}3mIP?+Ne*90Zu#EVeda5W zzb=$XKU;2=0Nj`J$pqYnw>+-43omzu#uWexfobiRN~3oA!yFYk#lgWVCCU4JnxXK8 zdxfS2kwY#vJ*F$-Jyjii7Nhv@G;-nqrZOqG040^ntFjIKo*#foc>+kuW;^KK#}&$s z_#z-I59y~1IHhNL-RNDNY`2tAX(lya46G{AWDF)NhAktkgo&9n`MBC0=;3)FA zccLb5hil+lr*T_0jc_*tM&e9oHw!--z&HAq*8hjIw+^eaYuCLe2m*q1N~<)8Al;2L zNP~d1ba!_%LAtw<4naanx>Hi=?#?}U)_V7P-gocy?e%_tao{m^PUn5!V_f6B&g*yX z6S=6#m6UIgwscKjC;@NgE1nu?0C1vrhG34SaeMWEgxGe`<0N+wGW+>HHR*Ic#R~tv z@=whojvi58+;{J$I>Ecfi4t+u2I7HMFeWz!ZjjYHWf8)7b}P&4rMm}(tq&B`AmD~X zurd0vxBpqcGhz32yj$!MJw+eu?8$2h%znqik?2<}#oYOALwi0}I*@5GI z7-NxSZL>Tq#f za8cxBxwJc~6JSg(mIoUU+P|YwYc5MX>#>Uy$TdE=0$M;pD;J?%uHnrOO7YYEqczCpVXrb1Pg+ZD@#|Hvq{EQ zaKXC`yriVPvC_YTX+nkB8Y{Pel^t*G13ItCVwHT5E2_}$k7RIDX}H7oD?@2R^^J~n z(!1tz#|Rx>dapY#hiFhT(fiQMwy`m9ie#6WPE^3;xm^(Vo^RKh)x3|TQx0<6o{7|8 z33G=k*(kIsit>L-+(e_E{&*>z7Q_P@YfGzcoPE?EF^()b9Z#*xnV#HnqSSfVm1IDj z1ErGD@u*N&o^2vz@3nnD9GBzYTV?)rA@YENdO(8zy`s3V6(zGrC-flY~(`N6AV){zSs^+yM5+a~SkxpAeqPQ{)JIPBGE` z9lRL&h3}4!qnIvf9WYde!!qfKMED?j(&9=a^{v8^j`TOfepB8n2LP-2&`BOYoSHjF^i~A#$y3z4h-{KdJACJENNH;?b^UhaCOU+C&vG?~Sop+- zy#WDup|5XCI7o4^VgSMu54Nd%lDu4pCk!Me#I4P{kAXu=KICz*PAS{o1sVd^*>9Q6 zKEcws07aKN8_8_z_#BrwQ)P!9VZS#&`a$gl@uN!#I?ng}TV_T;ODra0in?H`e3?1H z3$j^J4sIA=FfXNv@2dRTP5#MGu1rq-TDTS}JK&9NFg zhClok1g5^0$-tlqRm9k45WzhQm=SVHbQdP%v5hq*{cz!DAsv6QGamD3ay_9DzX2-@ z6)f5O$k%gmC=Xl}EgF9k`&`{Hc_~@6+P#$av&!j04B@j+zKf{2Wn#pqMVCK59Y*N} zzMtLxNjzI0{n8GRz}I1vp~eRt4%Vr9L~IyAXSlJ#T`;L?HFnQ$^5)BssFe=8m4>mq zLDubW^1;yeF^7qgWM~F+G5lnuPkkg9jk+^XKOpU+yfJarz5?| zYLeaF#`u)uFzz&xn0pORrm{=5ZmZKrnV{k~<4Ef-L5kpO}=3iGE=wu8xM z_P3o#u4`)vMTz(VmVj$VLeZ^)KOw4T!Z_Pt21O4c$_c|`>}{KLTJlJ+UGEVS4aLq* z@INEa8TtxC>j2Ft*TH)kFlhh#2RWD9K2aAQt~YaVZ?iA_F&3Nv{%snIVI$L@Fdw1n zHL8LqJlp9it)mnWp^x%qe0Wcm-Ol%8{7xQ%LmKV3#uU?}YbA^`A#lh3Sq4&UfYr>Kd*c=`BQrlJhwqET~ zh)$=&7FY9e5qE$7JdFP``PcOHnQT8OzL+XnrPOvgUQtGLS!&*1Y&E<=>UsL+m~lrin27U8%G5Di7ydd2Xo(Ck#FU~8(pjcwoN z_itVDH*<0z^&A(MwyZ}2T{?Z^o(vBMdsvkWmqh3*cQ)w8<65r1YPVUQUoMlApH-(| z>hA76DcA9HMbnWHe(iI6cOOJbEwil@%jIC|`XzWnsN#+Wwj({@d>J{O}~$vd3iz( zR(I@;+m`IO@h`f@Zav?LzfWzMj0>qWzi!9 z_BYI3_!%MFXgcqWKYRvqthAby$U+$3(`}&|iHe^H8wctgClQVA4{d(-k`pDtb0y_X zFBuHhFkKRKY7A9iwfyhi9;1N_d5V6MlZ}k9Zyzx%JYM+b;Z&cI&y((t<@MKSp0a|( zsyC(d9R*Nqc;2mgJmjrf9CvxWM_M#llL`R{%iHB)5CNySK14_B_f~`W@ zR2ZnLSrKZlEBGUTu`Rgk=4+pkK!-?nkafUveX+B;ZZKabZh zH3lYN4O3hdCM=vDE`?8ZKJ+@-HL3o1_C;OZ2({x3rT^sL<|WP_^*Erji-JU z@DaV9)lzM#FJ+oZjW@u7frDF0dHbc>f*;OgGHdbZk9&^^-HcYt^J&<liB>UGd+f=d}3PI=l0Pm^9(Is5=}IFUO!=RVvNOCv8d-zhux2m+1WtARTOf zhIss+Ch&iiOaEiA-KT;QXigPF>D^qm70!xTdN>W8>z9=|h2}{gpsdht)+68=jGeO1 z0LN`jxDz~j%zjj~s14)cR7wWzS=V(eAXPb|gRw>g)Wv^Yi2tv+qDK-9Q_Lgw$Ebz( zO{I3_vEueb9(SI{4TDCbv(J)YG%4O2s1#SFk`ZX{ZYo#uI0iXdPy>j9wnX=_b3{sA z=8_j)zi)F)JV>&@AHkf^hB*eXgG4Y}Iier`hqgifmr+lw^8P-a8E$Jja~>DYD=%nR z?QnnWjr>oKksqE)t(Ix{NvM%5|J;=L+o1p7X*s@+9Gp+RM-B>tzX4+~TZOc~fI+if z;lxO$Fh*^WMx|6u!N#mb93P#-;TmPqY(y>8P21xPr}#qyW^=;6mh1i1Mwe}H{bnNi zgLDdCfAE&?mEB)sv>uD#Er0O)e8z!HTFv;gd9`%0#jBm1f(LTzY+CU{Aj%ev-2TVd z`{oOGHaMwxh5{PJe8sYloJAn}85_)A%^i|%U^PNEf3#@DGK+>%cN|$>OK0mn@a6)z z%|c8vi{)qkHdwMJ@K*obz4!Mk1f>C8K;C=;Qok=AXS1y2uqHwYj5?2#lFu;Scj05Z zMVc1E$)<71yb_1zfm!{Tr|>o-nJ^wSUM)>^o|kao+nfUJWrzXJ+V*7e2SEDW%roe1 zlI3?k^d8Ia7XT+~)pX78t`vsg(AK|{4!+&HTxZc;#@uizx9rGrNJ_I-!a5_G|!Utc7%p6XD z3QAgseM%jvR%QAlv#rLxi`JzONCqtOh#~{1u!#pi9Q*QGMvsP?`NnJF+z$idVYfx+ zdc9T90ozr9k@I=}GKBd}3R`JjxZV~!RV2KCEOjO6{}eWcP6D^T)G9a3bAr+pibKcq zva|B92Mw@in8YA(L-m#m*+5duV{EyV)Z=&k%-;;=keGOo=Oa8bVKc#5WpoQmd?7*v zF{=_n4d?7m^FMlM|F+g0s$m8zz>=+wT!zG$Y*t_}SK~4yio+joob-Hy&eav*(DBE0 zx7;t&^FFwLgq~avF}B`Hf{U3CfPmvb+t_-9$PBVCWrh>H12b?}TcB9j>ZQt;6dpcOPO3{iW62fD#!jQ3;Wwkq(-vKPB%W1=DTyvSY9_aT7}Y0VGNxH&@V`3 zx16Qt)Vl%CAz)RMDm5x0^~JM>aW=%?@Za55qv&T)zcL<5&%4wss$nr1Lyym*Q?7!e zkUY&^b6EG|2Z;w3i@rR((#E13)Yl8yRQmas6B@hlq4g6sz?~p`mi-@h7PPKgWvi(&bJ9AU>cPE~BmFm~j z_h85R`&#?|`i1N%RQI1r0#^LJ->JCdF^3r-}{ zJKU2c%6Xn1u2c=n%4cy1#0E0C0p=6CK!0uluWn{NYql;Fzy`CP~tN zC-~+Cryg~lbaeY6RyYKa@(kTLIAlOC@c}?*SZq(#l384eZO~4h!chZqSB|ZrREk_c z%|Se5bE_aDYoFJ3bjj<%f*|9MFoGfgv@i@8`DxZ$6r2-tW5s7w+g9+g8ciUAb*O&Q zWCg!Z1B}#c0U{cEWD+}ov62d{jC#n1|;O_1}Fm&|e{Ta=?t#5WFkWc@V_h z2m2D@l%oBH2&BgHPRw++DX$6TWn_K?AyPk^)wrTuSG;egx{yFtCr(8%tW7|iAAHt! z?Kb|D3Ry0VP76`Z~ zGlS;P@f>D^+hi%ezZ1yBl#`_j5!zDesg_8AfTtXLm9_lMW5-CdpF5*WU5Y`oHd=eh zjgfe=Ox;i0i10FLK^Y*Y<^BB<0{Yyp%(OoJ6=R&bgMHz^{tSM1&I@&Hpp&T1^b8? zfwusvFF75%NgvA#7Ux2qTGOr%1c7nxAWQ=;u@r-`dpWyuQA*mPI@%kHJ*FNi!O{>I&n7vOQaqw@|{6H1HQBr06-c3mj#( zCv&*FB5qQH>IXIJKHNQxh|qV0B~uGAnfaDq6)li?mCb3o5yN&5KU;6 zLu%5W1e&Rqf9X$Ghr>H0XNME`MpMduwl%30s;~5#EVdof_LW#=Ffw(4$PM}`eF)elF=%Fz`q4cMszURT!K!aeDOYGzx8p#U7d@F z+x=7dM=@D`G~6}*QW227om;=;8pZ}x7c-Cdt&#Qr3IY3Xs>lDmqWK)YLf3~AsK|V0 zH1FJTE!|LM__;6l2%AoY9d3Lmm4G?_tK}V`s@ffdP z$gnqEDwLZnQ?1#QpbJX6)B&AM;&tLX+np5O2QA3^>m5c~?J9bYv$JWX3IR`Y$z-8n zzMIm<`OARMIY7Xz0TBu&GDZ*STH5_F0kjYxQ?O5hOp`^s-OcDgWrA0j4;H|gHCOT8 z{?pPMC`Ipp=aXMf!VtI;QGi@N$9zLhGHo@VdGXFTL4j7G34bu1bCAvz z9sYS%V!=Sw_Dp{1{>j=I;nY`vyfQvTEKy9btg#-&bTPl1mCHly>FDs{eys7pmQSI! zFA>AVN?y8=0p0ndj0dSjmkKz;h9%Rn1lGEVCQ-AkE=eW($2#tPWe@XnCX9Ge{eN@A z@J8yChShxqN#^hjPhiEWq{UshIZ0Qe-6GVeHcG?pf!G1G`y*}v$p1>(6L(17O>ZhV zGc_9s`0U?KVos^p*E`HPKEk+o{3+TiloHeCs+~xczk)TS4iiGmXB$iFj!h$yOjg>d zbX(}FC7;VkQ)_eg!WW)o0es10E3i@`XxnnUw&Z3OYFFX-E=>?&ZDvXwYp zTstesZ5x=@@Uqh%E9C{S4~u9~Ma~`FN<+mb1^J;{A9xPsqWzbZCo~#qA zHTE3|YA2zpF(tF=7YBhZ`??}DJvzIFA;TimerxfJW0?D&ipu}NF9HMP=xhK>(G!aO z=5;*(_RB6pm1+N%5Z6N>iqPHvjwIz5BvmPWSs(PAK%~}eGHPx+!}88>?U(|tM*2Tk4<8?}RJ=>=n7M_5y3ECIJfh>G?g3<=tXYjhoJ`FRh zl1!kLuxd&l>!1DNsZ(D^S_do@rD_c?0CDTR#wDlMy1)2DWm9V31sh;Uf)0jD>NIGl zvlh3J2Dy85T@lPOF< z4cYsXGNnT?djJ_FMV{OP$y!gkj0T?zSXVXs9&KN6cEDIU``xM)`#V6A$-Zebz^RCX zd%E^i657DO)XmJ6&B<<0h=#CrI@=lFCdjrG=eYgkG78I8EfsqNQi7Y zm&N=GT;pS;5*D>}TKzzjSnAQRpPcOM*_x2YZt_HhO|^Fnh>DPT!NpmHZs z=&?S*P&WLD`?HYW67~3SW*;hO^S*zA6KKRKVagGgpX`e>h*E92inrZhAgfOcjyZKc zWc#;k5YNXGmi_Uiu4M9Si5`DIP4omHmKQws96;Kb7`-b6@8=Mg6LdaKSKb72z4>9} zyN9$)M)izsMy;6jF6D~>W8E`&9<&q$=#OeWJH#|v+$q{Yv&_1Z+x2sAuAauCG5k23lb&dz zLvv*Wc0|YPPLx6_AqN~#LPK#FgzSumqy8{rxy;sih&OnEwQ~AI{^`KO|6b_-Ws>B- zNXh?v2KS+UbvT3M{dhK#Nv_TPI#(yv^HqZ_VL5m@ATA344#|Qwe@7DWimma7*Cgsu zKwj|KvP2NG3tpd5Wgk*Ownt0Q29vmT0ztAmhU6EH%6ZiF44~>dSgA=~?{6zV9!I!< zAYn1{t+ygJmP`;fnb+>c+Ca3H3)&TXBfJ2e>eu`!i`ia#dhJuBH9QrluZ=5*6dq$H zz~0@UtQTZ>gH;+Y_5X zZNFKlC7>+nI&8CoxlUGFeC2WtibDI{`Pvi^7e-f3%x;9OTy`2gY+W(0QN+BKm$BH~ zs8~%I!F!892f4m(ho=Qmh$v>O!C6X$pJ0SP!yTcC2<-mb7d=ttcO`gOiFjfk@lIg6 zwNm)87ValHrGm^h8vjVV%3_5c8nc$$x67v%u6?z>ZMhdC*KjKTjYKb0)VYfTqa0uva_a2uMmnj0NHAO3jX7Tq1;{QsuC|I2YX*anV- z8@Qf-nv8wJINMwdNDn2R>-pCDaGw&7G%8jw6upd_x;giqiq(Xufj;(+f;j+Mgake( zr9qnnO($3T9id^~i`4x9zPVdY*3T0Y97Yt7_FkHCqY=>b%WM5Y5jqZtc{CEsoj)CB zyuTTbF6T|;X`<08Hon$Hs=hp0al34j?dqG{1aexP9%eam&6CEFTtJALXwXM^)I$al zFgoSF&egmVVMaLL%Z{b_;CzYXNCm#p;EP3%n@67rGm_e}`SK-Ge1Fv*zjf4X-NE}K z9cLd(S$rw0*0Xr=D!Ei1QIK#Q)m??uhTHA}V038wk47C=q<(&>1croes&GPK9RAQI zv5UeDsZ892$33Jkm4PbDoUZzG~ zEU6IiuI+a(ks2~y0cA#~rL^X$-OV}iECc;n>9u`rw}T^W<|AYKJ8GHrY^J|N!5=6>%F@R(jR>ZI=T|U1%=oLbOxWlpJaYM|Y+0y>r?oqT>g<86zlUoG&K@gD= zU&n_KzK#!5EORKqh1=n@S^1d!f2xk8$wCq58y!-Bedayr!RKTLAd8M_U9tVsi=bFO2xufD zQ2u)nkg7qP^^ioZ@KQ3KKEzB+wmoD`p9%u&uGZalEInQ3VU>g@+8HKRogY#3A#VGa zN91i7-cbGN&BA2Kgf^nnr{_QW*7}nC`r_#Hg9UcMDfE1Q!Hvarmjf`~8}n|Yq&+B1T&J}d{bz8rop`HXu%(UW#saT?_a6J|GFZ)gncZ^XjQ)oR_O78#-G&A zrUEuj%k#gNWto6@J$Oj}}Olu&OeqeDtS{9{wDj7q`+I*qS zMN1t&()Wd;x?<$i|Jd^823%aE9htdY`CWjKY7ZT;I^F+%Ab-BAUi3NoB^anSu_*5f zk%t%9XubRricLpzP-!_x+xLYtX87hv;_pj~&ms9E;F(72dVpETus=2%pu_{@RDrD`e+vzsl!FRo1*-?uMhxa$SUB%3$o*r%r#79|AzyC(G z_E<@s19w4@Y;(`ra(DO(SsZ`S&yLb$*s$|00YV3Vw04Z#&JOhmPK19NNU!8G_)p$z zvHyYxg1iJ6TN0zb zgyI+iTJXd{F`vo>5-UAEUxVwJ+x6Yl!KqLaUgtBxUTWauQ>hPS>i!v-0qCM~RpC}U zDuYGMZ&Qy78$i2^*Yxe)SheZd3)9KQuRP6D!40e+kT=^X2s)jIU8mQGlFzv zGv)0gOs(4vH&HIf$SJT-=gD+N#5Xh7;!*I?^}anI?6d>Q5Abc;G5tlx!|}@QQSox_ znHNntt9R~qTowzBX&}M*C7=2CmrpCLMhVLca#0AF<W z*!k|b^&XI}O*SSEj=Hlv!a~+&2G9Gf$ejmx>9tzEG&=6kP$p|6)Dd#<3M^od_+co?3j z;oa)`yN%cMV3bSA%a%#$GG6 zYHQIdS0(109{|#KdvQOJZmxdJN5gI+?X+3eBCV7uaLjN&DT=xvkL7eed<#Mp?M$?u z!aTj!?Kvm@{&{qnBAy;y8zjXRxlZ;)iYR0SI&2IPCv&>JiO6_MP=9Xye0v(FWQHYP z%E%=(7>3(8U^K33jc)d5jWM)rLO%CE!HypCj7hv)`@2{%kgv-k4BAa zPRC1c_mIkFZ@ITH2}tvpPd)|&oRJoOW_myKP2owx!H>4TwZwn_!34A*b_NW;C)S|T znCXv%$umzFsJ;effMFP9_u&}VSk;B3Qg~ZQ93bdcb;{u^bDkH$n1Li-IbfQv zKD`F}!dS8cVXpPe^!F!kWEoZL30NvJZfjBKz5No6d8zr{T;85A)Lfl>)mDvs!5Pk1 z{M!wO?4!MEDLsn~IH>_QxGMholRU}zOuptun+eyt!qL+eMzD( z_B^K`!*jM{7*7vA8FX1sx%U6iyl@f=e<2l9ApK6y8%+|#hEc7ALphguu!2Cyo_VU5 z5*r9i5t2>kvkTmwG82(WX34&GFmt21Cckg%7|YXKCDR1^o=H#UJ^6ez2w(8Q5Xj?o zU;Ug+7GLehU15a>x^Z#*{|7?Pb^_|@N>5VO(Xf9WA!Cw zb#*X=j0_PGmI@z+9MX&N$p}Y!7#{JR_7(9PSY299(U3hIHo>@hL0rl^eQr+oTy~hx z`%Ul@rJ`o=`=tbmfGFOi{%kWu+S0cRnS;7ML(f-nf6j6xXLtB@&s|>sqI@po&T}>v zsVsj}*Koa(c2ZgG5}|tkV&0?vgQQm*ZovAW&U?_NQa#9U&wk;sH&3oBB`~9)ao3w{ z+SbZTx1L2RJz+R?&yWsZHlPOW*e%EWN=P;C1l-=argB79;#)L3?PQRwRE_#Q0RTbI z-zobZZzPi;gs1H+sB{FsWelc^gk*Fq^IJ|{?uo&tE~lKv%IVf|wpO%UE=$pVtnn8r z7d=reQt(?5cgx3@MdCvyk0RJ0PhuKOs_g50$9Ei~Ohx-3xDh2dK5g~m(+e(h5&45Y z+YO+3ZdUcbiMTRa+h(1})Llv3uteK$xOoGc)g!BIb7JLn|0jra)LT&4y;tfkiA-@z z!3$QtNsYx+EklFFtt*}0fmBRweIC~*o>n~-^rj_&D@y+4Ee^&5A@eu>IIl}`52*@Y zrABE^hg|M4XPxMFpr*3zc!*spd>?vO1EeN88sv>(N^{!Y<46hGWlWJzv*Ah6Qsv*o z?sz{GNgCXCN<@Qs0g*cM1zh!Sm$mO#Hc~VW!V>7Qu6CC*&hl4&QrNrirC@j6d`t^eD)6@pNrnMNQk{<+^?l zLepCk&dc5cjJo?jhisQQ1GBAJ=BFHcNr4d_?^1tl+a%t_F>)-Ex2F)iI!ian-Nr8K ztt-il%HH30z3ocSd3s0xlXSMj=ZQ&lhUYcSIxz{{p0SG{gK+Q7KklITH=34lH**I~ zJ8DM9^5};`WbcNAne~&K`^a)y!i?QlsY+y(Nc@J#{c;a_qK6q=N^a)%d2dAcZZ}tY zfZa9gx(P^oqLO@v^0BQLIX{2GSw&trs9DT8g}NVa6+}NaexnasZr-%RWg)J^Uh|gG zseFw@qT76uJBZT1=M?2a{*&PRfJ!c{?5#lapI1?@a=Ig-M=LDi&*(})b*gdHJaQUW zc%%xBcVC^FuTSgAgf&u{4!@k0$u>VNre{DS_>J&0&aqU1U-qdul`y4ZoVc_AF1-d3 z&4-$AqE#dQWG5Q6t`R-=cL*QiP>@v7gM}biBGvbQ*n2*AM-qn}Q?dJc|FwSn^}_%c z&L8p`j;y*Ye*@N^p!^mU&*yDiYIf&2V@hVSfxI zQvw%bJ?3$KUBzB{e$^I4nkRMN@e*=H!B%}WotJ~IKwC7q}1~BAtFEg&< zGMezuGwLCj3+)htsJYKNULS5c{2w-JXvHN`MBzuaUo7R;h!{cZ$~!adoEAcFC>Ak(1b|u)K1)+>}5nD2%y93O|UWuD*~zYG!ib$n7l zwtMG0i06rVFOPeI_oiyB?8N&#(CJdj@l~)6mn@i6fTf2clmp2NPrfdF3t_Wb6e9I% zg7RIhDmHEx(@napiq6a{+pxtr0Ow2)dJG&n;^nKuGxntsDRav6G^eG!?+1-xB%a?& znK`K(Mo77j$icGzpI46n0cISfRkJvrLH&LGylwT0+2UGTx7#k5L7N`i*K!MX>KbvF z)|R@Mw`0el(-28}<=ID5z~O1ecYA+xuqDHW^WCtYZMm18`0CbU0D#x#CrhSj6~9?EpRwJ67X9`&U-zqHFkIB71yvDr z&JWo(EN9F{X8h*8et5*PGi{X#kgD=w>*eyG;8@5$cON2T`21wJT*YQ~(Pcxc-5q%i zWWkWrb{j{Yz$HJ!rY&wS)Y_rhp1Hq_?zi;G-o==5^bKC3B%kvk*Kn9e_w;f;B8U zU8X5#)q00|WXaTc6i8SopXKW==0?!C-AAY8$JXInv>nvX_dZO=Els6NL-_l}ZWhnQ zyfB!dbGYSG|2W9?c%EupIiIgF9n=6xSI>)6z2|@@NJR92E_*0>IC_Pr+x~Y}5>%FW zPT^}oy8T%g9>>OA#2Q_LmK6ojlHGp82D8yLU4#628v-@pDwi!)w})wKR>eZG8pGCy z(fRz z>*zVc*x2US$A(R|vXX#?a(abjPp+HN>H)cI&+e4RUJ=<2{rxit~mO$UO< zvZWXY*UlPTgBrCe4)3;|PE>XBjR|>IZe*%R1{%8KWp=2iDH2{|=e{9yzujLhRx9E2|Gxw1sy_I72V6KDtMt0&TFyaN>FSOM1Z_BpN#V1(9xrlKx zZS<#tl6gG$CbGUJr!cs95DXJIVQD7hEO6J4Tyfgs>kvPLSYf60Z~d?q!HD!|h89y@(BppeBqQ)!3S+-s-K@SW_*+g34tg(?G^ zY0q{OBFL|LU{qu!?X(&=IawbRMvG&}iR?x4Ey&1toKqQ0t2>I$PaLigMJB-_o>u&H zuT(hFT((lAl*c)GMQ-p^)B80gC5`*~K=QgX3*B*Q>u--v5wz`JIdsZyO;xX?^HI`R zbi-ftbGS&0&Y_yQ$A-_3yT~ZvQZWZj*tlvL4&)tn$;)PME_}g{s2xsXj-)^G}ch_KN{XkQw^J4T(`7Ep1Z)0lIGd#PEU)39x zo~91ciC1d*Dn-ZmyedZ+-JBms^hdX+ON1>nSfNP#bUf&=@+#D#y?*~yGyJs&MRlRS zjXShdw|fPt6oqUrR}LbQ$N5bzE>eUG7>N9_UtREvXtS@|aUe z|09saVRFo}J@!?6qJDj_3r|Nxi_1a&nav5OXG*9pJ+{D~A1cw*5h0Yas4jlTGhuLW zq6Q^Xdm&J5+h;<&enL-0LLY87_?bMV4X;6;;q%O)f`1qN9>|bRLWc=<5>-qntSzNzHOL4~6(MoBwKL$ddimkdWLW0CFOvF6o_#-(YV7Bvnl;<#of| zGxKdet^N=BGfOuMDbF;i6P&v-kA~>FhlluX=pREbdDZf3R@~mv$6k9_ zL}^(vsBXA1)-1#l*vV)IQd*-x|9%${&0q_JWF$2?*00=Tq6yN1eAMGOsXs zr99h|*_j?OOwclI$(Nm4^aUm5jgqa;+@I5WweK%| zi8D;j^=_=UUNkT3C&rGRpjm-W`p9lAkU^botA_mX+_iK?&T%)lqirUa5V|HXW^dP{ zb77gL-(xV_sxvo!@B6Xi%i{{l`_=164X3j)z4>}pNBx5A$?5KBSDZmezzqP9jJ?+u zu(iYc7^TR7?sK`l@!}nf5e=5EK)i?kRyOs^q^0_hCiV@Iq!37KDLq6*w~q=v=gJv< zx{_wOL#+glanUdL_v!!}yWyC#D79405_^a3Hn(8k(!nHqhjbFKGx6vQd6!uHVj) zkeoihglv~5luKq8<~dI%ZYNg^RPRt!qgwmKV@tRf&LjGidz{f%&sw@}4@=(-hngrl!lJXOD7&66o$ffF;poq6 zTD5k6!I<$r9KCTPJ`*+~&1z-uJ<|=W)mt+)y)?%nju<1)$_N~?{*ygjy3rAcs^o9E zxmtnotPIY|^985-`!Oz7Vx(YA^WMqX)2s|`EexlU_`%6QvXf?X?_ht3!4%>Z!++Jm z|0suHeZV&Ddw;tl7Z-p3L<5gczi1bb)WaFTx!(Ldi@;5|g3aJXx9nAl%alpB-bo58EB+TN1=2c~A`~w+(1tN+lYJ1?5UkG9S z74vZYaHQ^+Ss#wc4rX02ya$Ml-V^pA#narMWSE;e?Ubt9#VVuu2e^*;;4P(X`$qO3 zJnK3t9PRFhASb`Si8J@ufbx5)uDx^ad8=%Ri158RD^{j6>6s?FxVN}T9m$7cC8Szz ze97)OI#n7oMXp=*clpJ{rq|j!gBA9i%fzLcTDHAi=0|^cL}SPAZJr~mR-&0_p_&P_2?TPHW8`Q$I zNl+qgq)l|Gn>dr-U9Lb)D~VnFJ6_&?5k1+;4tt|?p?m9BdU=(gqa-gsv=yK=(aL?m zlU`4>u@+pl8$G)A9QRYE{{$S7n%VXGoRvxMmuZumNG;lO>N(Epe9ftZH0o%{{p3000HZ3L z$bx6|hzQQM3Z;kVC#ui9`>mgjQ0}&TU8?m~>*}`s?3+)fWW@~|BaJ9yWHgzwa8Y$( z>YcUFudo~+a0BVz;R)M+7g}gaVEB;M7T=Fb$|nRwPi1}hPkIMd3ibTlwjyn37dl>w zMa43lCW&g7Is8abasCOoq>Y5*0kHG<_F{XZ78#@%KEg-=O>J8}4_Q z-tAHFU^!Mpb-V9Ujm5!Kc`FN8Qaa9k`!DJ!hc#Qb8rG(a%q_zO@4S8{&pSASB+K=mz+nur90Mh z*cziiToF>!(Q477cq~)3iyGdRMslg+JeTs!71B22X?FJ@KL5#Flg-zv{lbGmGrYRsFqalbMJhS#h25OH zPPhy<<1iJL=3Jzq4KMLi&fS@n70hlrF|6Gxn*ZLC{t7Gv@lm?7fzNN2Pyz z4C|4rzhN1l;b2t;J@VrKjn$&tiiQQmm}tG*x18i3%7iHBQfq4bm^=@?@j@B+Ip|W5 zB$@8jiirQb`WoB%1&s$=7gi{iRE1AN_xHdyt#U?qZXR*?u^-{0g5gz(!pTONmBv;IZ8bgOkW*VKzQL$2-l8j0n0RKBqp-fglpJfz#^aVJ2-A zRB?GqE=z4SCzNO;1&mzc`^(Qs?_XpPSUUYka$-=|9ZYK-*{3+{lR=qK39mTI58&;9cM9Zg=TEslcku`KE+fB{?tukn`RCEWCG4|)> zI9hw>q;`azj=1#`yc5q`{1DVAtcTalhS>j#EB)v^4$e)=-Ys> z(ux^L+0}v!y&Fi6ZV#OQlZLKtM$SOPIs!_;u1loq-4Rt4ud4Vs#~L~}Hvtb4F8ACu zgsqKN)Ouq$>reQK+d|QtIXHW`a|4`Extk+h18x0uZnIitJK>}GbDIyA2-3g@azYAY<3va`tk&`!{CVh;X0UdY<7g1u{7bapX6xulOBO_mM9!Xw=q@ zwHRzw6<%CZzE7^zDK|?zCL1``_bm*7SBvMq#iR9v(5RI4w@bc8A!b%JL zmE^Z;VU+qtfLJ(uZ^u{dfsOs)dJCaOD3q5|w!Qw*C_xnTku5GF8E<_<%KL94R6P&hZQ9>p_KILOF5b zbpk8Y32((m_m1L>81${*cEcP7HDr2dhciuNl6QQy4us+pW66#nP$Q?2^hkUcCKh~A zLmC^s5RkN9u^tqa&~Px2GqzAI$M5##6$r~t$;%ma(Z@6h=MOJAb34^?OwhIZ2vqk_GhDkhe7azHEpDg&8ZMo{?YUMB$%b74C$d z@38ETkm}B7-~H)JxjQY9FZ(=fbSceqgp$BOBzk3aZTn8{VLcV)=+m1_twddN=^9~f zZ7!?L>eie48${9_f;dn1yD(Y(Ce_Vb`_$`Dt}pS9@>?~T-NIhljnWO&UgkK1Otd{Z z#E~sR8!pToTm;NCE`M)<{M8BZ83+@Qhm9)Q-TGhby=8P2-Ln20B?eJq#N8d@3ULo{ z&muj?(Qr4@37C_=RNz~SH}5v$GD#uK^DEbXVA6V5bF+}eEkQZa!3*Ar{rkSJ7`7R^;}_yF^DK>|1II{F%W}BQ)goIM>H#LMV8Pm z5Y;&H!zZ-Q2YYuaoU$-*)P0xPGZLWujStu+>72DZiV4eEah2!GPhm5B?_O7kw#-8pUB&5$&0)bgqS?5pE9nk z>b_WvR@LcW0E&K#;(BdR*+gL!{VZs3hUqHQew%$fU$y;&v?tEE(7ffHJ|t90&z++& zK^*{NsKsTY!^z2WM#)$#9rQd=-aaDawE^P2xR+V)f|Ss`%K-ns-*&W&sJVv*>S4HL zqOS6up2LS27!)|SeQ9O)wPgkg5}&QfS|9}M6#Sfacs?fXLd7ZaiNb(FQ%09B)k>6; zuEY1bKTWD@do6Xdd0LEou-*`vJtr4Ps3{W?4On{;O!q7rxA<^oDjWv1m?n5{t zSt_1+v=ApwDK{EBS}ct~c|!YfyR=>W#U}!+JBmx5+zC9(QMkR9&frMHePu!Nvc^l( zg>M{VX9^XzO!VrZyf7)B+O1H7uFrtJhKlB>Mf=|O>pk*XmRIHXJ-ok%5-!}_cRtA4 zAaxwnbE$~ldcwTa(1mk|l7yR*x%h={w~c-@TDI+xl)D~Jd6E)i~X0r;y>Gqu<&0+ zP$|viC+oQm-%nw19|~XCx~k$+hFXRY=&WpLzm+iRF2Xrcn;qS=Sy=le0L29l^Y(#+ zD3=Yh!;&YU+N(2b!(KyetRIWoE~Co9PCk8C#F{F=zd$;Ol~En8kd1rE)8&0ko~%DY zq^rG}TG6@PHgdf|QQ&Qt-%aj0LZcgoO>X;i*kNYJ)A_x+W37Z|L#n^s6 zOfX4cF$<4D$xAsk;!kFVR1lmo<~JIC&ArW01hIF==COSke?tigZ!s|>RG!~));_JI z$L@OUQoH)olTgVeX>2P@Ra-)e=PT&AY8DMfc#=umQr4mGbq6^<@Lmkw=r{-l&20v3 zgdBWZ3EthFF>0r81ZoZHoX%+7k=HMsJWoXth<4IylQ)A>Dp^FZfw%z>Z;hU@a_QL+ z$Q@aON}}o#W5tt;;M?Rfk+fuwxQfa##xXlVS_KPD6CX+2PtDwf))6!b{gpizoF1h3 z{R2puf|kJV=vVdSGOxQBGk!I+hmu#TAeIJ4 zQ%}o=)CetTX(W2J61}H)yHixiJF;0_K5S$`KD7f4Z4J6qdRzo2yrTcP&u+%wV}+4r zuo=XsReSHeRlS1m0RFBV8+u0CPRd6dwp-t@l$pH3E4%}zj~ls6JR@i=F}cU>ZGC7! zPC$v(uTNc%|jBMnN;&Fjqqp-4OVJC3vq5g zsC(_?Ot3jHpAywfX=`&hXgt6R;yjzS)^S@%PCBod#$r4qWe)-CeZ&6V;<`W_i5~TL zCK)@;msAMt@4)#KX~I36UqMrB2FJxB*)N9U2u0OAvXX}cVh-(x+dn(!|Fyzjeqn`& z5<(ChVfR#!c@o_JJ&dBJWPRVkh|Z^QS@G&i5Co50dhhQvlX6H5P@^Uwy2b11k5TA^Am)BV!5n8U~X=TSynIq9r96PMC zHppe*gBPS!m>BqiGakT?bVZzn>fL_0(jILngg{;vn!OM+p@7%MI|y4+)-5X@m(;Ny zbsVSA>hR}}I$BiKfg8F=!x1w~xyX--Q63!w^<&EhUjN*S*^1IJ}Rx*ET3(sJE zvWZUxs-`)V51c``vzFR<2i>qzzZpJ9wqa=^(UsS3hJ&OIo4JjLZ z{5u(r!cUeq{xRESJ3-rLTEx&MLExYKukh_YpbAz|uuPz1ZHCln1dz=nYq?fibcS8- zatHEv55UGK3vH&V@}Bj6@yD=7-owlT593dmnKzZh6D>r@BZolvldXc51`kI1NXrt4 zfNmhXU~ZQ~G;Tlog}-D>q52j62q?!4E2_Jh9e@`jir;VJ`YVqMYo6h3mYstE%b z#Y$#J4F=rNib2dv6S*)td-KyjWF7xnoV}UwFcc6Vs+82xE<2Bvu0yW3;chFQRK6m3 z^mhkYnaS;e?cK*%jIKkH5m7W6jb6Yz{kB5~hFCFUI~uOkIR1SSW4>?yL-)bWxZwap zku*i>1cxUK@x*(6N3%P?q5Ml`HY5RDG(Iuxs`))IBcp*RPGz3qEYsPQRVH#Pzfbn` zYs#!s82g{=5WzHzq^z2!)m<;+vlr3G)E>SI3B+TFr)U&MA8qFkwu@c%Ngk#hF$mU( z5bOD7Q?T~Uqi*V%|8W09Eon<2#WxLgsmf+$EO1&ANkZy zqay&u_!B;nLIk0t+qG5^%?=G>r!qQ%$cSNTzfQ43g+N?yK-oV^Qb1ChyP&FoeRh9c z5RG6SjUNkAk0MoZ)8nsk>5Y!|&O2C%u4|jK7-~$!CCz0aJ@T`mdAI+3sWemy3Kl_w zae2;!oZG&nmtb7e_0JtY0N7`NKg*6F*X0f1^a?syG2(L~JuvgC3*?IX-D4a0> zE2ijUj`A}hPUMX{QSO7Fv-KWLX>|_H=40bYt3awZ%+q}s^dNBuF$72l**1icO-mts zNTVv;TRI%p{(f;u8rn1H&te>H{TeF0p68OCa4c1Z2Jgbb0rMNNs=F&#y3|HIq9&}a z9iM2g3hsy7yj4X7&YHgj1Z!|mL$Y1~Ld6@`x4VYvNbL%(fbyhF+LW6LDl%>gw-J`u zBBN)~9n@|7biIJ;Yfm8sVOuF!aA6)U7s-BsW7`OuZqPn{#-**mKWb%Se!5VEcUSMy zHOrx6JRF1;yK;-NW!W9Pa$TQ^>b=eYd&cy)0<5nfHwmgggugz_Ax3NZ4Ka9@;H}hM zd>QeYV70@$z64v(#VS=|TA58fzwm$9j93j30LBarr_MR_P;}B3uOI;W$vvrAU z;A)ges`uft-^qam2$%T8pIWHsfeJO+T1}nRm*o6*{dt@84jT*4p5SZ&;RINO*t;ag z56LEDkUh(DDY{7rg{6W`u0p7>s}EYVK-fG}{2JjI@O^{F=DkRWom2$pJ=N(#s!5}bobPzFzb(g;LmE}ovc z9+PKzb2;wm3%$wKzrP{YaX4D0TelZxXsPD0Q`iZ}EuGa3^0ZG z4@0}m@>o0A=#v+Ut#++CqKT+J>gZ=^%}6kD{kk}CyuyQvUoo*o>Q?XLR*UOw>J6U! z?yToC+k#rM@tSVP=pNB*xwt20wlkCAn=}aNH#J?1(z9bLevD5$|Bl<|&-) z1`9I6)zSksS4{}SPgrCqlzn7l<*e;K9XNs;K7|wAgtu(LTJx>-2~c9PdpmdgA8INh zU}uUvFvjxFzCSG=B_cvaN__p)RAz9zr8m_ry|Sb04st)x<`Yf!#OByr(< zh+&BFhjLHx+A}q4W~bWA!wDwe;Afx-iw8L-&SO{mCR*3gn09I-C2R%00 zX;o9)@6o*H9d^wF za-8UR0x3OvXGRn`fMf4YBG`mf?9FV=yGku{ckx!6*foc|rFzEPE zz9JZ*7iD@7K_Z`)j{kilcNUMh=5<+u*1cRRWA^o2sLBlPng=l%EvAU0lS-{B)O>Tu? zTWdHKYtV+p3DPIi;$9XD4aX4SOYuZJwKUjHeq>7dtiMM&BOW@#YyOKa< z3sled?acB0`Bhr|T8IgQh7#^HwI1gyxKt)r))MxBhE^s?E9}2?oBzGR3&O*YK#@qwTnffUfvApBW}1;+VaYax;G1o!YNC9f4q5f;`oG4$RN;mU;cK%F9MZ zE*J(RqbRyB=Oe4ui;_Gi0jSYYpwe2F&Us}=iQBa|EB=pMGDSw`)(KMLtA7cIP? zTJKoDCB4z(!^Mc@SP$5sYTllFj6>4l^i8z4dqDGFk= z4*1{*wI>*7QOJHoHp_6lIUWM>wuTqJ@WHw$up41oNm#c%glQZEV-8T22{X zM*woa*c5Qh`>##D7gC0>YwAFpqP09)*DDW+?;m@+(Wn_I(91n^zB^{#v6VGpN%PTy zJWsW(l(p+A+w2McIkU~8VPXO|bl7vXV1=*uDi(-gxcr{baubL_6N^+u?}PXRgzv^E z(?^7s{B+uQ5$9#kN3oI=R6z{lR=tocGz!=%3!)F8@CbX)hfSUM3LG0i#JGQ1uRU}Y z8%sCe9yP(SK_y$WiSn>;P@Y1(`C-O4fPjFigwqyK+cH7IUwHA2jO{^<_4Fl7|5}@| zTzfxQmb@;8o1jvXQQF2fK{{GEq$%QIy5E#+FRzel!BMuH#qxV<kk z6j+Uc;O3I`r8IJza-U7oM z7nB(Hmi(?cACE&YnTo9gY&!=M`cbKMFl^4K%{eTVzf>bo=N>YqmbG_(NafBRYWW26 z6Jct+7=Vj**O-H5_0gs=Kp8n$wi=W4a;w1bmi2F9*%IF=;j>rhbofx5;*2JUmQMuP ztCfC*gtW#tlU<-Jm-3Cy(}J?71M;Y5S&k70!aOz#}D-4i9EwBDpJ)0(lF^|214=Y z2-(ouae-ktTk2Y#`UUA0!_uvqe-1Rh|2Uez9B7KlF~j*kx^)p1A=Y#CUhm6ISM*QG z!Xrz0CR4juz4-n6YLtR1YO;^^&chReAQh!!BW=-q26(Hux0I*nkv%z%-TT!NyKLBro}* zh4b0jZljHfH%V&w=R{Ii|$qGZT z@t5}HN^E=E&K;xH@JqhtQ5duvIP#Q1qH;7N0T$*^@NLWE{n424V1Ndd6zw*gIFs}# zcfD}To-An3czc+h$*`(kbFL2xwcQOog{7i>IzJY^R6H9H?y8ur*7wasRy}Xv#FX}J z85xo!5*6G5wEUNS?w1^NSZS7pbHP6M8!*Ky zg~)LjZAU74y9KQ_>6ZH=fNwuC&Tk95_Im#%mJWRdPFv@`Q4Y8%$Ak1%4{z7GBXm@I zVT$dAn=6?d6IK!t6{xw7kde$I>AqeN>$=h;4T&JB(b?DsJv|h{ zx$(6hH3!pNnr zWpk$|u8OZWMVL7dTybjMxF#xuS$nixxUI5jiIk~0`>Y18nB7j0bHoEE6o(cx^ zyZ5GtrZmVd?8Vx%SI|P;knd^@5Cj1iqMClo#ajvP*?2m8g86pwBkqyTCKR?I&@hU_ z#}DOjTUmx|Sa(Or9}!H|sx?a;WW{ zKRWAHSq@C5{YGK`lCivylHhskmZL7!7?*tl2%i#IVfXeq^yH-_!5&U%1`Yd8Jn5f_7cY7KZ#WvC%Sn=D01(yf$>R6J#Www~0GYf~k+?EtV zNFoJTFa4b7)T$FRAHReO}2^6(Lp9_;?NAtduCC9?kbd1Xf< z(!eQAy}`VGDTG$BG8AZM^W+k4kg?G#W?*2f3cR#1rHRfVAC4^0V#^1Yyewm@d^bC) z0%6AE@K|1N5?B2Q>Q@bQzdUQfp_Z=jo5+lLBF+LTuh#)7$(D?419$=fb(*P1BSPX6 z7S)O~$KjoVy&^|&s#L(s{2}7X_XAHJKg2nf0hvE^!huoyvN@ZqEyrL5bU7SPu>&Dm zt@hdXmQh}QXwT-muRO!oZoN*$hdt}kncvlW(d_8G8?2nD;nbifz!#Oa2G7e)D5PG4 z*Ky|0SOC&6L@={_G$hf}K%><)^t2s^CnI8ND@25Z#|QrkMlF^`bNM`|Ww8%dqH@CN z+8EUD$2?#)8E=F2>MIXmHyv930hu^-w&&L!0kfFyk^Sa7@kmNs?23_r1gv+>;k$kx z@YS9!_oJHE$4)Lu+0IwrznXe_DDgDJ5LP+pvdV^?&Pvt->bvw{e^^Z!&bDs2yeDFY zqx9&|s0A>|;td*?$!*S`t?Rl=B>Bw?Bw`Fh2&d#Q8n2N#Mn!aB~e(D8y3J zg(?!m9Rg}J8`7<6u5clpZ~^rNyGac$JuB z_E7(XZRVYzcNiD5Obm33?C=R2T(W^_!>>e zPW<-DE;sd!A*{6ZW#L?|o)4ZF^1khi>MpEw5YVBfdsyQMWe|jE=Y@)GzP!0h49&4- z^Sp2(g&_`=s&=0;fi6JV3gN;kBKw_~>KR1$kmY{FI9O&sOYD{u8&Fn0My~d|Ay*c! zdwd(`b&~oe&#u9S!{|)nhMhlbv#!RxP|PbeP!iB7qKI?Q8g)t78$J72VkU5xxXY^; zl%QUcN1Q<}`)@TiV35k^_4hVFh_1LnDWkj(P^-iN^;72IT*U;S1D93Rbx>CNl_33z zmy2SVBs&$G)|rV-3VV?%hSG@M)%&>$^lB6)j56h;w7wynKsMP{*o0$7(SOMU*pbkW4`GW zZSpZ)FxBYgn%Mo| z0iB@&uhL#>Ufy4OKR{f6UfzC5? z$NpqF!IbO1#AE-}J1n3{^brh^1~(9$iw*!w04@4x?TUxkKy0&6eyKIbk~6eS3a<}i z!)|+g73@$?@7PAZ>PgG=%?P`xAozScqjH2lq~-YuZoTXMmz*+J-NXSSz31hJWAgz4 z&!*8!OjnD(&sT@dPL31m#;LehIx9t5&4KUUn-^IIA>#^e5z-dwifAV&32`jCH@d21 zIc=B))X-09iJB^YnFxcBL5p1-aOy}QfBBs)I9}_`@CXh9XlSVc=!Cp-7PzGk89fW*z zRqPU@6Xxr9Lx&$zWDrpA3Ri!6yAh*Ibh?w~g|<2G9~?yw9?f#Y{x$63AH}v18nyVQ z@i4N+RE}4qC;ai(Pw3ag#!vSv&*K~`?w?ATJp7!;7-ob|$hLm!0@e-55iozMM_UFJi}^Y5U}kQf!Ov&G6cFSDrj-MGf1KSo;R z&vo;fRfgXEBI4SLR?KXNcf}BX@?UBVAQ^B*i;AzytpEeF3oI3~J83{0dcpxOUo%vI z8QI2GdOBNyUVrVEEdi5875wAbJ(1G!S_PuhBValc*vi~3+vNNa=*5y`6Cvvd(<&2Y zN!95TI5wHEv6O#oo_Id4`^!3*O3M@8m{- z2_oTV@CeN%MR&_U>;&!c%xdEM?)V!Q)`h{B@ern#OWI=XS{*Qrt1g=B<&X1dI#tGX z5pKXqqU>GVX=bJC%4&k^IJ$b7*RA|SJO#oJ#e6BiWNgjT93IYLK0AgfjQfn@e(g{wOYxciA%l`peY#X zDezUz=;1cyJGVsy^o`KI-(w@7i@U!jBBs1U-yXJ(T(N2M#y{mnv0_A;Q963j1`NhUF<(0*7G7-QxmM4$>OZ}xQCZS( zW5GPl^EKgYgTU_dn)IgqXV*8TU3_%UNBr&kuvE9yOSQIZ>bhosef<`ibUwT>(i% zTCx_PS$Swx6Jzmu`uGJ&_!o-qSvPvBowk+8P!i4Vndt|$G;q1AO4v>*>W|%qJN)) z9*psC?RQo#D0zCoX>dd%bZX8<@z}d<0^loYl%Ln3>)vye6310pEcC~CLw4b79+pRE zZr9$v+4{|Pb%1`ts!*E#kj86Mw3O7)2Zf_?H&=Nw)l0af@?`NTRt=m=n@IR z3x3lBw6BvH`o?DMgcvjef*Js-RYKlzUOThj-i`CxZL``fVi^meClHMEQcdma7 zX*+O)gbjmj5?^T+V+zqTL_xVJZF3EADVbKGb4 zW>irT@7R7rkrPv4zb6vEKdiqfkeWHhD)>#)M3t7Gi^ajD_c?h9Fv~zaAInnJeaE+b z3)MWV3QRl{$Q~u$v6lqohf-SkQg;@I-aQBk_`=%Mz;Eqhbh1?K?IbqkFE^rjpQ3xr zMuNypZohrCjl*T0Hyt_F#zYu)w|rt>kak4{j6-sVGz-*2RHmWQ69^w(xts%qtlINf zYRIpP{t}bbnsRQZKF8P$@t>TQZIXqJJ-w@dCRKMeQIKxc6??H}9XfdMbkP$oMgVkU z)z{A|@Y8qLN*+r7T~u9vtlK21_TCBLc0(vK`l82ee9_~=AuZ%X=Of7?Z*CJVHCQhl zfY2J9%$LNmb#NH&{c`7MknbzYHic%ldU$e8n4>rjJ^c9|zcLXcr8&-#Bylx;~fKmM1TMZ%zZ#8z=sB@?R0<&#cN74Uv|8KHY0 zo-7`-@cS&XrRdJV;LgBNKm@Rq2+eo=lmirFJPs#wNrJDeZE?(;0HQB43!3gta1>Rz zKDzQ6^~pcOi~_>#4&@*q$K_9jEkKc7q2!7C6i;mEaIj1lIB3=l2PM&1Q(QocK`k?$ zwnz0R8~va;DbG1*Od6cj5ttD>q?=<_+DzFkHEILF|Jo12-&zo=Jy{*2?sV{&Ip|~% zPwRYVz|2bol*d&B&Pb5AGoSS>x0-BAxNVyj+9x{U^n6G$~K@1at(4E=t=z}L=0mGP@pfv zc9>VZp-I9Bg4B5chUp@(4WXqkzr%lCRo8N#+Zch3o{hzQGh<#0;Y;>X0$%FjiS

p~?|9ODzxPb|ghhCqE>n1m3;x@{ep?KNQ-uuzNc8)hYPfQgkMq`!c`Kx)nU z(nTaMp5H0FQ@?MMyJK z<5U~UB^xoz{eISgs_1Ri2!|%%&@?OI72(+A>x8DS#)CoYr6|>40OLF;)?$5P(tc@jAB1 zs()xoEB2c$7N4yQg2hvl>%e&cLRPLHoPYun69=o$4P(u!wZP4utUsR{XW?{Fj&c0q zn_AbdaU7}Wd4YL*sv5!<$MnyScMkdQG+87j4Mm|Mhs{_k1c45=`$taVrQ&VY#b!4Y z5I-zHrtQ~=#YP2z5FKEyUL#K{9ASn3vr6?I`Pxj)VVaA*xQEDV@FEVn{|>W=dJ|L_kR$mvqI@*FwOThShKTC3PF6At(`=ay+tJ(wmZtS% zbV<{?ZEDD3zuof}rT8m2%OsI?TsVIb2&ik~@}|BE%1|5P(jVJ&jIGH%v9;*k9HZ*9 z4CMQ)Qp$-@DMb61Ylw6#5y}N6g!Sr`Q%@kscUZfoyy__ptbNSiq#PF5Cs4OJ#Wlkh!yrig+%^ zr@&onSIe>x`zxi`%C3_uK;=Z352m2iu&|~?LGKAAWW@3g;Sm%M+GB1m`G#W9iPdBx zsu?=LcFp_WR@71S8+F zEtVc~NllE}3?zTP&`mH%yf-?_F7W(|Nc`@MGoyo|CeyLJ+k<63qWv>l8YhA@KkwM4 zz^4kx+LaS{e9yg;Y&Y56h?fuw_^JpI(2K2qV~Lb)UC)vNVZQ3&(7(W;|CBTCQ*=#3 zbYDWi&NA1xd6%+)X)yQ#@|}3X^tgGvu_w_a6}@8`a*&u*Xs}#K8tHgF@OtKmL%g?F zVEj>cc`{%_cVnnkbJiJ|b%A5Wv#=jqWu(GzBsaXU>FyU@U*DHXK6=y`fclSqg_Gp+ zlY&YFHeSfeA0k=^N%SYh-(?jqtd3bURH#UTA4MLmHWOI`jX^l1=+rB|=bJ_ouF&j1S-TU7V}t628`XP3whB zKqb~4ru8KQar*TtKx{0gr@}4W%KNtp{A#c_syFZ2kGTJy%XsOl|MMroZXrQ^*UpC$}iNp|j zee9w}^4^1Q5*G1#e&lf2os7wqNh=t2zRjpm0w&%J0|`-(37$f+=+%T5YEI-&hzjJx zU9WcE)dss>l|TGR%~y$Fsj11kyhoBzu#_T$v}YcklaVK zf(BSeBqU`(o#5B4nliWJq3Sz6Qyf0|Uk2hN#;JOu5d?B<#=|ODv*)bff{$QZrH7|X zQe8GVG)c+7R?2&sUv5sv+W>Om|8Z0Q`q=-{T<3H_Ge9DE4)uwZyh?^r$=LTA~ zw0~LDFJCYl0$^+9Kqw)6{(tkKs4x#`ZRLK(sV;%7Vt<9S{MS881un4{gV5#WEC1)) z_&;yz-+wYNe_0~s17e@4{@0)3ObTdWkIw&|M{<199a$oBKdAcB8im$ z^=JG)M3n#g3;1)Xg59DoL8sB3+~I$BGhe z%ZQ%{I9;Rw7L40u|6yDnxb2aUXgC5ktPXqgevEa*R17-Iag2?J~R&6f`yo-Af6~cc(Q~m3i;z7Oa zsY})uM+&7*N3+sgBLV{Z35&qH1L*@C4gp@!K|%IwzyO_=UxS2bWl#jZ46r4p6D~E%U;R@4jCmx1VQExM<^_1HE&aT=RF*}F@rVpW zA#fg##%1Mpd=TEBZpJpjtpIIM5^7H7^%U}oHoG~7;Dua9O9^36Jvz!~R|K}s#M0+r zC$?nv3T$+TW;Y%;kzIxwcDf$N^#SD6&j6|l(v#ZU)p>cQyl5A^b8rA+BLmP|7wTOfFU#(vy2(}u^}p=4)=;Q`fE58k zJM-^DZI>c?z--1P9uv8#)AOUq-UB|@&fVEwgjRL*jP?NdJcHA4G zn?>qJE@q|k3LZ~ju6)HHNBb_!IAa=VKLb%LbiZ_R&v9rUW^A*EdB@1EEa!9l8goSS zS|IyMkFHB&J`i^eCu#@iZq*r`KV**LK0*NI$_1|F&3!iuG4$0Ck3KI1-yu(s-=V@3Bxk-B{-7F9abu!lJAOj_Qp*f0I~zC^xY!*Ie-@w&1n?O z$h6d%xB~kIgcRGK$u8Q5EieEs@op=U7)-A9E(32zW~^onwqVs32r%YJf#FJh@ElMn zT?%Q4fQv#-Y0y}cN#$N*X)1cMp1(}MdIh)!4ztc#%r&IMl%4?i$bn5dI%9wAFGZ|L z?+rCRt6!Nd^msl_eLnzW>&nuWDD~zNBmBCNCW{HGU2#!$Ap(YH8`4^>6(UFEGz4BK zjs2bgx4MMWUtMh6?&0+Qq*W8_R&y3o0={rtn+beq5l}b**xjY)BbyL0{v0z_@;67^ z_OjFxp#B_x^wm=ZmBU)Ueg!zribFEJaRANu>j|L4)0}%f-+0jsn28qccqXI(b5#@v zz;EyEES)_D5qX#g_|%^R9*FC^a)b?Js3T1Se9^bd|9VJWL9vY|04h=A%4>bI;F$1} z`vkxur5gsIOf(sh6L!)u@=#l3LaXG0-m<>Dl30HWm8;}pZL$#atp%WM85fY{k}RuO%+uw7`rrt^yI%~|hD!v)VJur%(vV4sKC@)DCU>40FCJbIIP>+?qh>s#u=>jk0B zd}w_2>#_bRvm%y#AR*3qpN3nWdT+@28fp|chrTU1{c0Fs7lo}ONz>QQB#?0B!Fy3s zc8+848arFoc-oVZ9=|+8!V29kNi_&F4w>pTl)P(rfqlc)OO`qY-;1WFKAan6ApW=1 z^blUjs{+enp{2vM$rOBG|9CZ{enWK*cY>dTXW7C>i_pmW8%+-|`N71b{k$l71B<jjNK#LmfxxjrwjNA}S<%PjNeMBQSZ($5cqRct7_f`UoMX#-@hf=b z7cg15@FiMeo_$gi^M-s|%DxG&@yfXuhIoIh5=AD7Rfu4! zABNbq!4i6Zv_cA zbG&Xey>HNBa$Z+cGy6EJ6S6!*Od2j$pNN-T;*Ku-E&VP>gbwVD4tLO@hSsv?9a1v@ z$CFddm<3DIo+fmO@R+4TKQrb?8r0S1*Oyyyx?^i2 z{8>bvoRV?cjs>5gQi1$I{|>wLn!6m=@yZh5TD>$;2XvFB8Ft%|80Bw(zO%yG>ULJd z%@`b!`&V$|-G1S2YU4@8@m0hNceKiW&eo%_WNUy=c&^eo!quqtxB4!T$7Q*zJ5U)O z1O7)*z(vgTHDs?93BDRW?=6DIZ)g0+GivQfw!C&SfDsoN_t_rk`&@!|(lq-TO2t79 zr|n33xUu2*;AH;gTHPP?C2Q_G{SF9*1F=KrAw=%ND8;&7T98*0BLa#+;o3zv#%Uf{ z01|ktfk`pA3-(QiUOw~hev!eUL8@?mE6Qtx0~(-|fw;T%t5x70RYSBp%oAT;lX^&dCO@cw)?XW>V; z3&i?$gKBwxn|#s&z#Ksi;3%C>jB@-;JeaQCfe6HecRo!(8s}sGau(i$suU*uOAh#t z6HPFwH-T5-Oi>n%VjjlZVn@}ChYqEyGg_rGJ;;7bRF&gC)kvUxGj`0k?FpFt+3WuJ zxDS3Qe@K81`{ZI+i;CZ0Lrg%^DFrdNP~ zrz(ftf=8I|h7^LN2!Mx=%{v@qwfue~&I#b6ashdP0#cYG%HyloxfvazY7rSlPp2Ib zU+)Iz6gsJ#sXx~d1E=C-+ZD&cEh6$?aD?<$OKy*||)vkb9vK<(LAD`3!jNTK>AaJY#412bwY1P%$aI7|x+k`TQt0UpSdCs%o-8j`7~-9w`P=&k zJJ0CYy;*YEA+Yx<&oo~m^?JQFEUnsv6Tia!`09u4R{saBR36N;lTv|aC6%$`mZSrz z0(5)LHui6K6|Pqr)ofSAK>G%;-wFAXx5P0K1t}(5);-RwuHPX#7$cc<;haIyXTUf$R_CY{Mf_s}Ke zK*tJ~900GRTXNC`(cZ|bbKhtg)2SHM5r6Q-uLTla*ZU)<-6%PMoB_sWrRtQAuqQb` zDUS1=0X^Y16~c4iR9*4nuxhEcRHM@oh;%p3eyMuqSB*~5SG0z>gZii~w#r8m8KBx{ ze^|*6zC_ieFYIhQ^2!NeYWapWn34mZ%MHv!U^z4CmP_^#Jp|^IG&P~#0WyJTjuF1Q ziTFZwEIVVlh_iz#XBhRHS8+4b#S6+@e$s`T__aq+;AV#X-I_3ef0CpxtedCl0F6l6 zk?$j29Fu}okTua_+Wk7foD*I%-L96{Fy4!a(;@B+@EZfQV=Zo`> zOfHL?ACvYvoUKpWJP|oA_3`TELg6^_8VCsPTRo~`nS#TKe1S%=BcMV57V-0Q-`58% zGS|H>N(B!QUJL3$*MKwl`G?_@#%S0~vyv8#t8$ccPRNbCH8L^9v=(Tkh8vGtS!r#8 zu8p>rT4=+EfjNy0Wh|h79REX7XWr(fu{KUyhEVrtwF>l9mQ-AsJ|g1f&;2Yv2Uq__ z>j*pBH7&oXtLM6+uVaHnjZ7qQ+10GH{YaEBZ)sq2UtH1l0dV2Sd;nh**d#{f2oGxBs;PXq?vB@QuTuzrgh7WWWXGiAE9v&89_T{a z7LG|v!gr8#k3Y}bR+RfpmC7a*`$9-MTIV7mDi*i2%WYo7E?p~MP33b_*0n*t`OU$y z$4aEBL#NpAR@>EtF^|0Gst9fdG-x7U8_TG^%6U@(7e9DApfh5|LTSl3*0BDTaPyEm z72ABf9H*Nz&Fd^+Uu^W|E)3*{>Mfrq6x-EAfcLSx0$*@pbXa2e!0FDkruNN&N`VY} zUk%5kF8`g{RF)I4Lvs*6wmIxl(kkuhq!Ps{>l1{^u!t4|y0HDR;!0WB-5DU^3|1*t zFWmNXPsaARS#tXInmK|R5bVTIDx&zp#BcD|!f*|VRIeBu$Vb{Dea;)IxWc0goEz~t z>x!$o4BOH=sm%x9c42F0Z(9JcF=IXn62=<_UaFGP)pqx>$%L=3F`5%y9FaN(eld6B z>{3OF?z+AloO9}J$1Hej8MN|=V^&@I=8RLeu&OHB;7QpRmzNd@c0L-tBhpKluXT!` z_7dt>xuNO{FBl9>Z|#`H?OaFUzx{S!YHq6aIeJGNCDsLSI|O3`$V8SaiIdc&-80&r z;`d1)e=rYyGtBtg2utcgUU9Vq?3d!yaz#`$(!UkB)Cqlv!U=P_WfHqljgwiCVO4@0 ziy0^!aA4B6hjcQG6QaL3$-<=Htju9letXq5bBdN_f$L{}fLQwz&MZ>{2_Y{!R8 z{R%XNLjTk8WGv+Dagafhl10VnT!$`%-tgutt$IrIisQ4+%>@?ymjmq-z6C&*_&&FL zg#A)$(3kh?R6{cvi(*g2hE|#2Roe4|m_TNzFhnA^3)CAz)@VI~p*|s!rL_K;+oC@XoOsm=m+M48@LrlICcUD>H$gPAVO1loR0*!?9b1h9`s+@F{(cCVE=H(NbJy85!P z6mKTDbSbbBYt>jzko3D|Ag-o)Q5(|-x~UVw_~c8~>HsdgUoIx{SBSql?9UE6tkGib zeV6pM!FUA;Pwo?2yigx*(PUjYW0BY8pdIw{hzNi!5Q8rFmm<2ulhRRt0pxAdfoZy< zEdn__#4H^l(e&hon_Y`&txGx7g;qV^w*0Y;NhCmyjWsCnuuC?@C>ZV!D~U=i6-!MR zpRC_)8cR^*{>8?9Grv3+`+%eOyxDnd#0(!|q_1DI(!6XA!XO#}zy<6vd!_RO7LW0Q z=(cuWM*t*#-kjZby^BJ2tPWoT?MLsWD4OS)A}!GuxHWLlhO0mL@m+cHWV$$Uf{i{x zI&T3YHNkfB(r*PcK!i$PVw9;~y6lmaSuv6@TJs8-a9`u;7N-X*D>c^mr&s3j3!3)< zHYC4X$*4%Hl6ikRnQ^B>d4 zz}-2ycqsGqGgdcpFX)H0OKXgu{K8#HG%hT6!RMKD^v2+|d8&AB^W*sd(|7MZ_GKua zA|i}&psSR9mjuvru9-ooc1#nJ<$TX=uu0x}bE=KPJDIoqq1oP5}9XqZy459Sh=b4PKS&^ z2NbA|s7sLvuU_hhkmCD)FU=c>!<5~Q0k+GA1r%SQWJ35-8n4oy@9%HX^ah-7Vhh>| z9@Inz-a$vla(Y4xTS8K+LyfLxkbP}y`z;h@1+Jv4JZo2~QX}N^oGeyMnrGST0D?&* zc=(6|t0lvn2RK;X-j*@J_prA;c5hPJp+QZDmX+l$Nip$TsSiV5%gvar7Sv6y>=l|M zNC+U=h5?c0RIfxg;dEz7R~`|d9-`_MgU+K1Byryes5u|>3I{qbvedL)0J4H#a@Qwv ziv1RgdOi)3Ti^G=xW>t7pXkTGGduSJZ1!r1fRwJK{<|XV z)T9}aO+TG}JfHQP^e6VMl625#!bRK3qw;V?9s!0i`Oyx}C{pjX`uU2+;V3vAQQJ*_ z?yXZmP<#(g`#+4mXH--D(>5AZKt;d`(oqCKK$I5gAPNYCs&s-#6GDje8mhvLRHX@_ zNfjxfhZayNp@j|sLO`T{L|9u%K7T&qAvbU2 z^j@*e9N^wQ=V|7>aT$e}BzeNDzSHbhLP_~c3?9ABOyujNdvuCM=R)1HNW?Bg8=G^{5Wr^AuVSkrqdK+j%!ZAb$?dT zfV1d)B-iK>Y4%;-$U_jf^mQA-r?Ghcic^a9g=5Dh20C5tKcg|uEy0o=h0S%$ooiL^ zwu^WkY;t%cDGdIUI(+WEM6CDKyqOn?eOIjI*Pdvv$oDkW(9BL{8=b>~uV&AbFEjP%Atj_+34UZMSZ@n%!eZBlGjzRqBF{@=_Tg+9}LPj84k1+ zu{IA^u$=_J9yst1+=C6p{DfUIgxq^`L|ZpRQl1s(mV=c6?`-!A3d0S>I>vWQ^T9h zdAag&i*KFf#yN}~vN$-o^w~4|v_4w=yoJMUE7Oq4yw~16JQiK4MMYlB zE_r=P@wlMFK*3p4oV|^s)b9+-Y3I-8AKQYb{-M;D9X~w?FaFa8NX6dvR_0W;6uY>* zHXCj=+(zeTC#~N@dkbVgmipRPIe=~;E`8zEVW{)3U4nUjQCo1OIDCKe_}US@*;gQT ziOU+~rq~SE=w{pTGjeJB^TilC7mR+bFATjqqQsUePZ1k=uCi@=Y%z_Yow0DFgA$<@q^4$N5^Y!TtlR zE|tM{WylLLnI#5m6QlGYIMYbNcEt;Wb~U3{(8|~0Ht%k%SzpCS`J!Gpi&CD&O|3Eo z8Wfq~*Q&$SY1)0hxSsMsT8ZxTdeyc8Sw!LajqpY5zKw6UugyPtvv~L3bN>7`P@m1W z+gIoLY-@AhgW~UD->%bQ-INWe+8LEV=YLxpr~Zp>`mfp}3j-DOd8C=^k?@E`xE`Yl z@S8U*->JOqxO+u%jnjVL#dSsQa54?xJ-CuD$1xlHdO`t4I29wgWM2j=$2U#$;2!N; z@ji}MXgOLzH$9~s?eu-VsSpyz5W_Bin5@o&T8k-7cz09b{K^5B|6dpB{1FXv(fmy$ z-@Wi0j>9`YBGf+g%FA3$2KefnK4fe5VZ%{Rz3%kRngai_+^?_CYfY^2<6xeK(a*o; zvP*A2eV-7y6-M^J;d-7>I!rT5NfGV{+%B*ThzE$7k$ylo&J_bumC@UebGBx*pS;7# z+$-Lgp?p`D5lnripC{$tiEA+S*Rk_TvWQfO=h`|K`I|g^s(N{0KM+!7IvvTO(7!F_ zJMML5s7#CJvi#(ai%Fi#twTzG9&Y}8_r5(N;OHIhVadt2?*>MiIpL)PkJ@^H=8Np* zTb;ul$=-^l&MuoTf8=lq!W#nTuBU!IsVnjV+rCZ6dw9GDsD@I}{0`e|!C_nfd_OC8 z)G@?ZX+=upEZ*^Y8!qy2vn(N4t@dI<(P1tiJ-Qh}tMuT_VV~Du<*L%L0qqyt8S6v* zhW&rWJUj0p^3~}<_>*@bhg633%8g$Q(3X~X+|yC)7vJh3%Q@10ayO%qJ&b~q3HVI8 zH}AP5Iu~#8b9q)%sK4!2#AMcx?OtE9UhfbPczY4yYl zw98mC?lTUS*_5}R%1nBVUQMTr@52+{=@UcQ2mbupcbsA70hEl3cd^IcJCD`Me&q@` zEsCY3j#W3uLbROk?02UV?)_7F^#TL3vMomipKmoeL$&HyfNaOHGCl`V~oC>|I1&&2?|57H60Hgm8h!8hnD(L zaXY>T5|fhgm*itF_z1mk{7|eh8kgPnVXsUoZu`~YyQ6PHGDBx0Js-+Ta+I1^dWF9e zZfoMFy~`ZhAkjr*&kFX}Yl&_Z!9_oPz&GN4b8D=lj9RCQ@miR0Eqq^MrkVZw`ejVw zW`o-DO&V+P8zmoZi&Z2mFz=RK5U=n_@OM_ZRb8xPq_KG7w;O-PIcCH6LN=p`HKWIA zN9oTn29MO@lIUQEHY2WJmK!SON>Ck(blAX9=M11A`l|fAf~~3LmSY&shd%wgA2v#b{j}ocahid@y^`aIKfaSJ z1^#8Vm7ic+{b`Q>1n(^J=7*8k4F(@6a|QrLHn=Glv`4&6uDz1ko#yup`@dY1^^0?( z_ufi4x1D39yX_H1-5_eyrAl!%8Ir$pj+=jKw}s2FdgzsQV;$~x@e*Ux8r}5#<9m~y z%LAl`MFi-HAq#!L-cv&vs`Kjp)$CWUF)=ZBiz{7u?YVh5P}+0t$_-AYZD5SL#x_;w zp5>-2lo?�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 z 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

@#sWzDgWwvL2sTnHso5F(VIJMDVG|R+~ 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 X((3kzl_wD%@TVZ7DqSl1DBynpM=i*T literal 0 HcmV?d00001 diff --git a/docs/assets/showcase/resources-highlights.png b/docs/assets/showcase/resources-highlights.png new file mode 100644 index 0000000000000000000000000000000000000000..475ffbdebee034b50341915fcae726a2fd6c3d5e GIT binary patch literal 559889 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%0AFRUebqD1v(#Kmh|g^& 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

Y|%a|53sTM{-2!0Jl~AOcN;WTQVRzwRVp z6;?1fsye~IKh^k0xPkKy$ZfETolqhu9P60l83i`_26W!&282d*1BJF-xIiU`U}Q@d2ZQ@{NI;71bf zu6H5l64wuVZ?u*lgZOY|Dl|HJ=Uz7#R2)cUPsk>Fn5l zTdg=@72EV;8Q435N%0nJo3Wx*cqC+-c`4LhzYo8u5q;hFGpF@<&Gz5WZo8Rwntfz+JW{7d}8p^n`_^1&~MX-M_ ziGAHT$;UO$a4xu@v;AWI>3YxeEw6FaBh_du88teTv$b)`A({TEN4Ls);m~HW$+Q+S zkU2aA89TeQ@|F1|vR&Kl@`B{I`2a;_htVms^{iiu!^vhSK}P7W&gUL%$Be8U3MF(0 zr{oaFrF8R(j+Bb_+Z3mm3;W|c#~cJZ1ldS1I9K-86vh(FO0uBN=U+ScZGsEf7UymN z7rRJdFeaet$Nf1?L3t9bU4rQw&owY9)yNOELM0DsF!7t^jz zUJ4-1>poYeGne^(j~OW5g$aueM~FebQ3aA1@2~QMo-Z_6m7T8vO66LT!wHoPcbD6L z1m%gP84Q^}etZKwqVKVnfd5JS>f8FKSa!JZl5_T7jWClt!V;6Nr_KIanB4L03e5r~ z0tj~NjGxsl!qM4Rw?C^Z%&fCHZhf6YY^e14Tp1ioocj35zq!^}raDJ3tm1`62}{ht zHN-yC)dRlX(lhQD48iT zcw2oURd7Y^&t;bi2vU%c4{$2YF5&3>P#EVDju(A}QPK1}(!{$X(VIuKqHy;Q=QwrF zOTt=Ke>mt7IaSy$GML&yuLS_}mx2IQDtC?a+_ zM}L+#^=GJ51h~q(rT_gyfR`tjRkmwzUmX{f!E$xdfWTz9Q01Xk6gkwXlqkwoj-nWE z7uU*Z*sBrY!f&HMxkkXIr$GepYYdG%<4MfM1=6F$?1c2RpOas2=GIK+gQ6KS8h3+< z=PL?%+gt2sRgE8}<h?*M5@WUN<6dj!-ZPRcwM;yieSQB+*9ti$Kks6Psv$` z#0#fwzAc<9Gt;@a>42w;20Y#8Y?Gln^y&2WO+QiV+qAl1(J=J}D|+$+yj?Fe<#r`3 zkb~a|eW8Hrj`P(#?=DBQ0~5aOR~b-XBi9v#f!!)}`8s|{@sC~nF^Qkmn-+UJW7hrm zZUaAXy&*_xNxXH4>B!N}Ft}!?m+(#YZmHsSgx(HsRSw!;f2Urr^GBl9gWnv%G5n(>)$Iei>XTUP*0Lf_%GjH z@3_VtR6|X?N8Y8l$x`kT%*`QYE>jT zCNZ-v7X86LjR6s{=LpBi=Djp=$F+3ds`ORoy>#PJ=e={%THPt)#nHSH_or1xzvLyW z)_AM-8#tZT;HYfBWjk4W zi(Y6s-c7aMbX1HAL8d^c&d-dan&|x&eCG?xodt))v0kPTtmiY;qX z>OGM=!}J42G;va#7jA9IdKWuzmCcWn%7w4p(dK6f&r95+6gMAp86!@e?YQbT(@2!m z3x5W$ZX#)XCJ#)N&dHod)Q&h_I2a^hn>=Y;K|vGDIkeE(#wdDs23^Hrz$;B^r?Jvd z`Q6su->L5=mnQ_69LdemOb^+An;ef1oQ$57kJq%xzrV->FG2(2`EtXIOsO#)HC<(h z)=;e=`>+4R0ttNokLWoxmA_eIO^?rNm ze52PguV~v08Nc69JdO@g9C-m~O!BS$>Vb!cU;lN--iQ!DAdtpGBVJqbUq0?HR~Ll= z8kZD{QKz8%uLpa7J}E`uGrN)wXR5}3U+fz*=d`V{~B!M(R4yBgO#gu_#r3OQZ1>4KRpWFmo~zS4=BKhe8m|FA!;=Bw83 zj`wG}>78<~)PJcrnccoOR*+ZtdyScZwcMLuFR3Q~?|pi|Hv<+Bv5~=Z7MJug>;PRQgP$7XtI)w)&IJT_xn~t zUe_>`{^wQ}zrRR|dBq)&|7|-8g75C?Fm=xM-|ni*Mi`ff$Y0BIOL7sAE^NOXD!twa z#E~nIFdheHhw}lWg9~Da#K$F7tvF5}CPDxHcM-H85+kAyPqq4KK|+=Pv9rK4LW2~h zM-%BI%qsl*>OAl)yno&6We!8?f8Oi=|KCVZfYoEIUQOIp`nTEq)9C-bsQ>-gf1jMc zf2@PPFAT{*=%mGeZp?qahyP!{rK!AcZLf=Viu!-p*8g(F|GfU+8~z?1r{U6w)fWF> zYxn=U@IU|dL+{;?5s%zWt^T>j|DVtQkGqkAdp~YIZKR_G|2}U2yao_|KSMlU^yAn+ z9u!Wg8mBv4qAH2Mn`r+x?_YtiQ~s!0P9swj|9xowV+DHP0jI>mOJKtU+&1Nga{h^R^0IBuy=DiF%TNDNH{Qp`q z12~Y*msfVfVH<s_&LQcu8FU?czNaaEg}W6vRaU_FO50BZ*7EHoy#(XT!pLMWY6BN%N)t&AfOMt-_`A_ z1rLQx$>X>hJ<}?68;i*K){m&&cj%OZrL7j4NS%9&m2n;i0D*Z40=^FZ7-MaJ`kG}r zWi;t$lUpot5L37BPc&U^hidlZWbV@D@P($6WO8uL^UbmWkK?3nN-EF79GE=g?U>AP zx6Yl{OfCI0hd7dPBr7eCTXov~CLzk>TP$lpY`Oc=+k~(}$q0Yk$scx;g&6;9AV!eg z&?7oHs_e|xTwwJXKVyg5rP@3u4nEga_uNDk4M%8B6He_$rT zvEMS1eBcxV8iQW?o=mQK7~^1ZJ%3q=C&1M7c-YBK%8+1weOh~yo3r9H-N@Y!I zm^F-u6=}Y5j<6ToIUl6mBEiZw;Qlf@dL*&-YJaE205nfidMvdsoU^0^~sJ z^e6xHp=xih*h!yLg`qQdyTJmhhRkUFm{hvi%JpL%cQno2??W=@Qo2I^CHxp4S3V1k zQiT@(%OmWj^{HA407KQZ9qhB=DmE)52jLUqf7lyI5d! zmi%~oYSR5KH91nMNcHg8u-dkPk)rm?2pc3g|;3?<Y zUmp}^Ivb81SmU^~c|> zHs7Rr<#{{WoK05K(60fd7?%vF+tXDkWsM6O8q{zM=3L3t#*`yv?N!M{E!$wnG0uhB zJE9WV(hA6qP8Il+$76Wk=u(oom(MT-gJV*Ri4=)6Qne(N)}1dAm)o7vIr&tnvy)%v zw9hn;g7M+}yrL$4oW-}ZAJhy}e~}YEtV(ay$`d|f`tICzGOKQKa=0U!u05)82+yLr z#C)+x?4Av`!{&Gh7duTx+HtX~&H#w3`Y?~;cHg%Q$EJrXW8b|#hNl*ZP9+fE`}<#! z?QuG`l0&w8cx-%OFuhb5%H*bTIGIfT!@8H|_uE>yp!XYQc)}}w3KAeCCOMWw$(?beb@oIhZtK<`@RQl@UW^|!<8L5ApRlF zWV(EgV-=RG_3m`Q$RG?BlOR+-O9&-O*X~xSYf+8|Y5SDwO@8%YCPYhP4%>&F#ECpe z{e#uCyWZRkqx7xtnf>Z5)A@5*Ef3*H3?W!fmD$#WSU_he!*=H;cAi-Bn|Qt$5^8+x zE2#k*8EM%5cW~kooJ6NB){sJ<49<)K7Y8%f3@9In>>Es`3kX5$ww6Tdmi?YC!m3fI z0cFhjc}Q32a|!}s#Z3m?R*urKZXx?pu3sZL&!osV;(gaKK@ga1 zc@R_lEhX^>=%#!BMT7MQ8POWn#Ui-0FMFdUQ^vd>Y2&v4-u`K;ZSM#J#0_wtw{4o6 zm;(E^ozw2s^>%}x0ahgJp( zC-+%W#Aigwk%P&4_EGKgHZl)NA1gK5$vr)S@1gDUKaH&$@Qar2c1J`z-(FKA(*oAw z_4~uJhN;^X6mH(*BN!k|wfQh1{y)Ws-a4Qb{Ijjroe5DhKP%f`!Cj$E_a#xl3%{YO zl^Qu5_6fDq|6w7xEC@gYo#Y>Zq>I9~RzZ~X5fykvOeS#(_W4YH;rEIE!}4CH!>lU2 z>R0?-9@DKB#os?rE_islxQK1yTv=>O6ATDvM>TZJL0H)&z8Xr9WJB72jz`xw0#~aozWOGB~Aj$VMip=$-9;08+W9W%`GLvcas>k0h^*zsGQ6c)$NSm^dM8 zd3)7cWqD5&$FqzB#sM!MF2xX2BRlRH(nS{W9{XHCW%d0t$NxKw#D)H7q3Q6Yaz7!y z=Ivn&RiQ}4Cb#45rLp}-S+8&D)ij1%HB{}-ba21;=LQAf9juJC%Vg?#wc=Rk`Sww* z!A;Q55n`orRfy_xnP?Xpi!O*Zy8R8>T zsP(osNcRM>7TYv)`)Ni-VxcyZzX=fRc6rgIH(IOJ*t71mFq70j+tA-Nv+vWVT)q1EAyQ(b%aBRsxzC`=pV? z&rWUC2)PMJgked(PiO6ST;Z84$>WhTC5q|fT(+Ba{&F4H*t!~2ww`2_Qe9|GmRBw< z=RG#OZ}Qwfj*AeYMISQ zV)MHskR1kk`)`R7*N{Pn3LVPXgWy7wix|UQlm^RQrzMosEL6*9J?_}qtIpTQP_Bn< z`C7&8>eH+Eq}bWUxVEwI%zH{sdZ(g69k^f&=I_7D)V5@O0u7y_Tx|CK4_j{;7S$KF zeM=7=BQQt}jUuJeAcCZTAO=Al-8|d>eLu(Z zet5s~VILfO)?RB}=XL(hi-E_E7b`H4@m}Pge6YZn)BFEQ`2UqWzHr7yg1ozf;B#lY zc|a-koh(LHGnkw)_t(&46eM|2{zlgGB1#YR)3OFTr`(@hDiYG94(`hT!Ee-X#0^yIp?j-Tzkd)-i>Dz!|GiUV%H3H`Whd>KwSIQhWbqDMA>y zPBj;32sZ_lHLcw_mtd}Xx$H`U!ef<%g*Bh<3!LK$**Ew5h4O66>Sk#O0%SAQc;{s2 z^@?)dmWG}FyMT2i5bQPKLbkNBf+%=~3RmH3=2XXtHwP_#o-_P6PEr;+!EyAk1+2+U zeMVW!ZvCtB_RG~2lL7G$K#4*ipPdT)&o;|%&^&E~S~gxx=j*`m$PUdz=_i;^SHW<1 z?}?<#X5sH+&t-PlOQ%DX*6#9)l^_Iz`BS?TeMj>w@;4 zJ3V6vdzpb>@&{g9Bfnx8sb}HMOlhC)eMFCW zJwx&g+(+g35c=VAuOo)|z_zx`A4*f|5VVSUJ|w68O78PA5xP?&>F6)zuH$^;ptpOO zP+8@K;>6$IJ~eK3^N@+3-Ht6c&)IPjL5~-1uCXm2T*YL)r?KOV-&|?Q1*(@(2==3( zpcBI%mZSn9d4=gUc6r&p=e^|oI#6~a*VUxzi%z)$%I+xOsz-xRru*26HregVnm0uE zco2V7N0xy>4K4aF#s+(?a=1W+?0);C-^#M$HYw_llG7>OM*fm7ot>?B@H*1113$_0 zV61?((9P*Gb^A%MFTcy0tya2w8xdoe%>dVVq;TEMzeby;oXSlgOsHuk9zLYl#zPp* zF7uU*|K+`y8@qLF3(w5d|kgaUZdeAq*@y+*9|c&Mh8<%1)dp#qgr zTTm!TNH+D2CLkdQ8F|ip|K_7?vwu6E+~UEk#i2iBEN7QZVCZp?h5RRjNXI2$X-k(8 zR_0V`=;w;G)|_|5$Unf_)*Dkrp*(vKQfddlRd!k2nDgY=;* z)#1adE`vzJR@7j@2Z~1_q>WEgd&u$XD7kBtzIto;-C!MoTT_HNqGMBCh89Elm(NN2 z%!I6^Py@Uq_(<-3yj8*(>oRk@MrFv+pSsJZ%sBmo zHCf~7XFMLZT9?t!mE;9*R^z~N#T0y5sZj$I2bW%sQR>il*+<*so8#p-&^*Q=?6F0P zMbukbHHUv%?HpFsrSShsFaJ*_dJ+O%a3J^Bye+5;H#L+t*A(n!6NoOsPo&tLtxS~@ zzcdiaW3!j|n;Ul3!|t6EX{f>?no3PABO)I0+4@HEw~h1X3$maFHXe}?sf3!n=}MOx z*)>*dEtkO2*4V??&kJ|2T&jGRdDFU;I3bZnc)au3zF+TEsop7}bLspuc0j%cp{8<~ zDXrD|(&_?V*x9#S|LpiH9@t0_{*^U@Ge8yeCrbu1ju)G0*CuWeQ{%ui7DyL4w%ny{ z>8K{K)BVTeS3%53=(f1ma)BVa$r|hprPa)q3I()-EqlsUxgNe%w)+}8Y>vtjzetL# z<9lS4HLUt4?Z*L2kM?)vg94z*Zh)PYBjs9qB0T9%kQp4oke<{a>CV$*LDe`?y)``Z z(kItN)n+n3&RvjCMDjz6OpRe$-qr+XWC@=3+wXm{D_-K;OWzsYVL`&)p;~E(!&iY7 zzqSN=GzczEzVT)M{SfAX4!p@oG#k|hyb+Wyx|>3`DlSPjd4I4GcSco6pkWF3UX|_6 zs{kXQ&&;vX8^|op?kiwG(hHy^qFU76-_uAm^zh8N87FBj@MTXY8MUU;SgKy_$j|WR zw7J43T`jKtBz1>%W%e=RBdSfco)$kCRW>s;z3!0tdyDWemo{y9@{iSh;FVaZejGH* z7wTU5<>_i08gKUG1Kx}hp#g!o{XRr1Yl0zSVXd_?Sv-8A0PgY*L@>WJcu?f!}qGRnXUcCktX(W^6NrWC4NkCg>s}o zhe~8_lb4Bj+cIn$#*~mBNXR{iM?jKpF!56_{O?_X7mzP=VO8JQiQ;q!xp69X@X$hu zYHDj2oYo@h)BB~ByVa>tN3qTps%bdRu1ec8R)v5@+bU&@S`vxz%%~c-!3>jqo9ZI)5Z7} z)O9O-kd@O{we@MQMdJ>4nA{Z3{Si#(X4u>`GDKd@9nHD+d>0j{{abonlhGf0x@NvhA^Nt-a)3CX z;!gVde45r0V)q_2YBsNG%Oqy%x3IurgF(2CU#e$_*FCiM58LoL_*0Wu(;A1x&!Y5t zz%fCOLkBv|phqT1>s91=(6HetGjF1R5jI|eMY-CRRJ$u{lp?2KW5esq(%sqLD5Tda zz22}BF$JM3?0nV`b^~0>bZN9 ztNv(vWXf?>+(x1%{NlvVvU%#h1lqdKA92sGS=JcEkQfrBci($t&8pwIJiLHv>aJZ( zNPVOEs*Pvx`h6<4bGWgOhx-DYb_c*AgxCafTF&FtzZ9Lg&$}{$lgV`erDi}8o+CT! zLVjvQmFpH;Z9S1Ze5`Un16ycSxYw3N$iaGcVy$s)WTVkU9Ho^?b38(V4O;6x<`wha zc=*9Ng*7G%xG}cU0y}x0n8N>`BoD>M(=;@1*_*<^0{PaAA0?FNXKs>3&WaSxcO+cb z%)8klgIazHPer7Tk2QDDE;F_-%-pg}vIZlDfu+Ox+xkfIc~omcNBwUBpUqkD>s-by z&?hPoj{^REQ_1alK5t#4tPV>|E1nNPWH=uXF0=8r<*Iv9ek;S1ku!K(r?R7e)_r}T zuS`b$r0kZqrcy_zmrmxVqt)3=%VZ}=8w!C{5;^UnvwIs5uC7Oy$tU4^GFwXhuu#6A zO^mG02JQODoa!$NqK(YpJ^53rNEA?8hcIUQ&{2!>+4bMob`fBrzK~ZZy`E`hPoCI|1GgarQ<3Z+w@&YsSZh{+cgT5!h ze=VFTA6ljqcH|zlj}W_Ab(qD9&ho6~__p=Gt3IY8K6kcIxij?HnDZv1)!?ayc*(Si zubyfd`>H!Ckg~zd=Wb(SqM7;E`J2Z5QK70P4`|uk8QB@dMOY2>ROYfEFbsNcwk+@h z6Q#zsGFhg5B7&?3X5EYch3210eVxm_rW#Hsc-smw$8KYVlW&mdJnyyK#P^4#mK|w3 z-^h_)3scp2%(qbJ(Ba*HTb9fBho-yb8W2SB`eyn&K-0AiWejgk=QyvnMxVE5B{{*m zm^yblR;&u2=`7G5xomIHZXPq>553lwotZ#A|D#2L4DG%nmcyY*5lDD+0hLWO9Wu-I zK2POvsb#}#OInH6m3hUWdHFYdmQ^@KpDi@ zwG5cQeN2T%`k+4Wa|nWAwAez%W~3xsiuyd%K1oDKrRDq%^WKn^uxgnlQijSFGuLQ# zUosp;0~3hg6|;Snhu&rqEAgw^8V~UJWqlepLRkLLjBfmK&?fJLIX1qaxXd`VbMIIr zbk9bw;)$<|!_Cth<63LdG2X6*B!;Y-aIVv)=@MmI45Xv8YcfV|%wePD^uB5kt4FhG&=*^cIjq(sM}bmT@fQOKwiVcvz}1)Fr^s zEDp$uP0S9p9Jzm}Y`C5f@3dbLg=w1Mx7+BkMYIZ(3P5kZh!CVca<mvC7_GzBb zI?;UjR{8078d`~!LQ%U?kI{}Gfnl@XA^N={^H9gFNqCfKCDPc3zrJjpAmtG1SsAUt zD6j3l+Qas3Ek2C%cE*>G?bo>mQ+z((KK6nU)NfDc<{mj>7w%Mm)dz6&LMyq_<)1GUf0TNW*@lVD}fhkwiTQn1=F1=cQctg2;{DUdIQ4JoZ;|KfPxc zSwCHmC!hBvkk+rHD7Pz)gW`YJ7zmeWhAu(F9%ZH?`307j!~1!7>V^(i1SLO+%)DBu zJNtE4d)M&O$7n#~6lL4zt}sH0j{^fC>SP_d$&!9BnQIPDzQWw>5hRuCbdDQ|Znqua zsb$loaEA$g(V>2_(F*x69jic_FOCwq9~@*xafM5@%KX>`@;G2QqWiFgS|PMs+!vqH z26YMkF+hl}ix87Z-8QHsw5J7W6G6=tD$K7(W`9%QqyR(R%){Xe%}T=xcFdTIZ0fnaCOG@V^CGTh6;=C@ zTu!F5#eOB@?HFg|k-`qiUv`l6^y8zLn~Oj>aawzoB8d z0i*y7-R5h_VFS%Y^oD;zKfg1b~l zGxV^p){~7%#pQeVXR4H4gn)o%37XtV`)TA##EUi2@isxtJ<@~og{~cAzNH2Q%-7== zh(EzKU!`4bMp$bw&#f{%hek~MaHc|;Yi(o9^;0|YP?n5Y^& z^xlZGH{Cvcu*AxBRdM`hkohll-(6$%%I}t`x;%fplw<%wrJN}qA3+c7t1h6Lt=nbg zjr(K|-xR<88S>F@NCqn#c%zTDp(MPoX2JVgu5$&kENG2l_sy?TXRtryKb9t0(t7v) zmY+)kuePXxL7DOI`$F2*;?9K2(hCuek7RBbB(Dy~A|;?+20{k%k#GWhzoRtQMp0f_ z9<)gb$msKk@?4CM1)_{d0fMQ5HGNec@DHsyfejEpc&H|jTHZ8imvXuk;pLO%Zse$N z8nw4>qRK$%Kh1}Jjq_U1jfjpM6HS&|&v5as2)vy6T4NN@YO!WP$qc_f(7g7Q2js9c zaf{^jV)2cWdZiD`^yDV#aIX3=5<=cYX5(KKa^)+`Cr?gGF%^~TQRK_8>L@6gnPIcd z#JgDl%6Szv#R7ZoLOQX3@#jN~^>x8>AjC{6YT(^gH_F39-upB~E%+5M z`~oo_VLL(|@e-H+;~su*U~BlL93S=9v;-(&wFA+&cv-V^-}rSS>*s*80J;O(bHl%@ zxvy4-TPwK>>%3rWbkH6Q*gj_t@hIraGmhU&uFrGhE> z?+V|4o2I+aZ2p+l%^w>fz^@GuVA^IU6L$eg!i9_(@)GV8s|zT|z%#PnY|guX5iSFA zobxN3CDz#cR-V;`3Y;(D7i^DkuDW(*sng$;^-p`?dOiTkyz#~b3*X~q$luE^*N)*k zeEE2;MLw8MNK4jkPt7CW{B<_f=yI>AiD50|bbuz?cqa5-{+{>?;vo~i3&CJLj)J{D z?QE(td!PZfT^l&q0=OGYd~L>mFz2t4_b1ilV3~~n>@@g(=yA$!_Q8#h$$8f|Du-b2 zV5$X*_*xCGyR_ijKj60FB_7hb{V223&odRvV`ec7%@?(%`(fH7tCZjq6y-fH9UmXJ zzlXQQso+?KO)dCJH_e&VsH##GZbhE@N;xTJ}uK|g&(j9Vv1>qyYZt0^t%192pQg%n|n6klg zUy}PAJwDYWuSx`5U`gsp^-13?A=lB-E@uGiwhO zF4LC38Ytv?zqa#DGdrM}z=wR+vM!VhobQcWXz$#yf?-TZ2M%nT#- zxmvZYSv$(??C?dQp#oEE3t+zge#^>xi-}_&t>d7VFBllT5)-v(JhO+kOTC#>#G*BX zTg)*J)*)LtCduyYsNwuQ1_-Suo#|E{w(XQ#ZJ19z!_JUG7uP;ryR!+5;Ts>9!LG^k zd6{_5j451Xy;BgNO!-TLl#JqP zVHZeHQ>5p=zR$)*nz-Zp{UHPK??DrS7Z=^``+R;|Wz()?u!WlB>MewjW8TVQFov3m zqm{UYX|?I~&ljjfxgtZ{N(`y9vEeD@?U+5cU+9M$2cn4RNi6DIp?2x*C0pEsKX5TV zBKs;q2zV9)`kb0?`4jGPDUb>dCd5+B6CO0c_6e~+1N@#w9?YVXVj zI7LKuwa=h+qx-<(6EHG|O~H9KGPSue`<|;nR&zIrX1rm>JuIL4!lWG_1h$GQnx6Fm znWe;C%rv^D8EyF#yoi8EGMptr2sx6&PeEm>0%q7zBon?FZz|GD__Ro1`|qrV$vz%e zq2O^o$7j!@@QmSrW>aolEjZF4%k(mEq@CWlcfB9%_-*wE(r1Uxh1;<*dRvT>lhTV0 zJaq8m1f(g-W;0WtDST6gOE7wWv1{>wd6`oWmgM?ulZ0)5vmVKkGT`rBsY)er&q7~8 z+O5uh8=P7gh9tm8&zzJA3$segG3BgMe+ripaSCsvU2T^FS(SZ(yiZ{UmtSNYY6Bdq zCNF1gz&TlNP!#nn&lKE|ney8fT?E~0>iNrHBMba_anQ_Jx0IuBEdKHhKow9$w3EA2 zn!(tVX!O2J*Ellv?^cp_3OA3EIHSvyPOtoS=4CM;t7F%8r+DoGi;yrlDwrU zb6Fca*<4r(W%rGQrqv%&V@G|vp{sTHT#EYr4RV2{1o5F6G>l(22XlAOW; zl90n<-J$$sKdEYlSQawKUG~O)mgvsF_Q{)u=RQw8V_|{O2w#X4-cYB8+pW5%YR!!g z%oz#N=GL9YAasjOt~9|~|J6L*t^7EJ9n zu{FEdqa^Q!WwwSASa)tW`g+>{eKx$P+PeznPzFa%t;kimH|o4jk7U%+rZ^}v8Brs4 z^Xg?|!XKkI2h;LpdxHUl zE7acXy1V*F7E}Bsm)M0GIC3oiZ9kMA93uYwaNBp@=N5)@mie+Wl<@@N9_2;H?lp~T z-vKk1>z~ddSuWWKaMEehnBvh>mZ~ z86B|R=pNaY`s|!mZ4xVW#WMyW^aoN~y)atC)HWj>wA^4^7%}IN_MpvU1IBfD2Ca{K zF5la&NdsBy6j|*R`rgeX*m>4rL0sCpjGOPM0OkZQL?m3`Ehc6~JLW&{AyV;Hf`%el z>klIk?_to!m)@!z`gbEsok71fH+n>^}rr7DOh!C}{?s#*^+12O8r@cdv4Pu|S2XMkVfK`k&aHECRAZssghg2O;$ z(GEl1fj2ZAA|$(fE%de;RxB(8I|3yD*@qXO?PFBJ2VUx*yVYJqFWU1Y_ek(h`#TX> z)Eh2C9+6UZ6qFL=rD#Nh_NOhp)LReCvgn2xrg6)%Omb^MzlC?*BQCKsTPG~E5q9xK zo{*nZ(WFr>k8!M4zS!xi@yM`P)QM%<$K>&EBDcUBA0M|9Nm?l=R zq~iORCeQIK{(!g#V)4f2&s*?@ULzG5eEl!!#dD||NIP;!L2{%F8J-; z!-${+t6OGq4_d3{+fNmWl;3h=5fUXyI4)afg_POHvxL208Z{aXteh&fD8v`#ON;B^ zv8-jQHILH*4y~ONR;*N5!k%Sdua8H!f+_?S*aL!EPM<@?l)x#sHxXBWTJgsGxlZ(h1?UmFErul*$?ASs5_G9&2hIhPCZhHTnQOR29T zgARo{SR(Qos#)}xpt*p`2)h?VF9zX6;TF$k4 z_N`?zPC|I=)}21er|iwIFU@2g_Ub{talJd=2n{j}E|u9URZh?+p0-ejsRm}@Pyn@aSYmTikPRxNsmbNd%bSQC_}J86F0CL!;S;`YYu7-G<2V)@m_Am zM*8UAw-4XR#d(FFJ8U=KW!P11G+}(SD#L~!O+Pe|vnrq7Q1({=#q>Du?{rwv+%f%M!=*r^wLfF)0BKlh+})N$^R zUmapRn5&)(C{6@HvL6N7MHw5X(%t^y;h>e(D;Zhe6Q}xPygqE$#Cq zS$+xV_l^9e%)2<&bKb{GOlKT zcD^Mt3+mMyrZoVW%iOLe$AzWKLuL|Q2N{Od-{Z8Tg|r$j$28FygFM^}ARl^^y~tR; zILc-{v-`K@@7u^3tKi7j}oL+pJ3$tGl)+J2NrE1mn@F($8_B4^)Q zg@$c3!oTS?2;m;ib6m?CR$=aSmz2w?;iG8=l`hXxa_R84yH)nGQ7BNHg?K0s)%zI9hy@WEWg6$6Ya7q`Hw1UwVuGF<=8OzbZPg=teVi_xi{qmL{ zX#~yVATOV?C|p(^zL(LAjkZv)0=w+7Rfvfpu91>>sMBYe&M{_Jy7wFHA_2C#G92if zXjSBq%B56FgX;Lx1*&$$yEK**XzW91dfvB1T_Ok;nNB!{Q=H$t>jJ}k0Wfqxyj~oE zi|wEL^xyLS2f1+jp@8KbMIsLDMS;5ee}TOnhh0;;&H~4D^)hi0_pA!M66a21Ia%2! zu6OvTAVjPC{3uNoB)!T;W&AP7ss=l~xv8D*{Mm~#99Z6ymC!Y{)P%(%07Zb2r;z|2 z%^qvQ0N&80KQBAF)6RK&fsvi z$rj6{Oq{C?{doy*>&)6y_2dJKl7KgaLi9Hoc@cQzLv_TjOPbx6BTnulz+;ux@0Q$m zJLL?8gArPZSCJY6ZAf{-F3E<0R*C>eut4387j)&xUeomAKcQ&xSU$CpzNtbsz?)b4 zlV(?GiRmFJc&cLk`Dg<%!wE`DNsgl5;9a`{{|w-kn0c;^4rc+v+g8)Z894*yLQnjy z@g>f3Bk~%QRqvO?C&2?JuHEXEL^Z=Dq&%py-YMB}aqSkSzzOzAW$kN&-l(G<=a%EO zaio2zFqbDVSFidC3u$98riq2|U_~11%pJeE08K^))%p{}!))}eTAD!6%)8~|M$qNXLSi$NKR?eew~5)GwDx3crU{qLI_C0cfNB+-m;eub!;t_sSOdm zgQf91zOr66i~an9;n$IIV&&WW`>}FD;fT(N*YYy|Hwz%$D7rd>Z@(d~^u1{gL!hgE zmK}b*j8Nx8=&LY=Mz_p!vk|zH*CmI=qZ9u~*uRgUfeJ{X?E3QwDb{tacB=cx6x6dZt0LC>dL(;e|1XHZeteOp>~RV0&PFt=p0<;Jaw<)y;uhv1^Oq=pGvs? z5-n$QQxj)c^+)>Z?meCR`I`CQHFc5Fj~gyuTYH0AKk`!)a|`0nsf|8e6-c{0+CoMA zohp4gpqLNH{&Y9f`GCxn0bnZ(_jI80a<6t3>hJbPeS2@#A@sWZtf)>N2qFLR?z?W0 z!^njO?L*1CK;A~R!_ile9GV@TwJ|yoBy7|e3*h+l-^L2;z24PYSCZZ=%-3uNkPpTT z$9=*0UPQeqd-oJrSl?E4@I z)v?c)yA9ZIy;2%S)~6SB8FQi|S`zQSHDH?~c7@+0l0C=*nB`|L=k{Zbu7~8Mp2*@U z%fbrh8%**gFrE<%k0plkxz0bWsNR7>_j z7kjEIfa~LZDU6<}iJ`jjhVM2WP~Gb~$^{Y-HUPU$MBMWB7c8+Qrb3>cyGANZOwzZQeY{KUG zr6t18#5L(E3_JJS_ONGh?s4MxPK^|x#j>@Tq-V0~=_IU`{-F0nvxNMj0dq2G`;X$M zz3C~iN7Vq)mdcfF2(`ub!@Z}}qsoj%w*{WLu)8Mt1&siZwB}oY@E3l$ez5jO18{YS z*c<9Ab>|KSeW!OkjWy%4p5BX7@d41;&+Dvjx!8=V?4*8M&vXUFuuG(+)mYmP);P{s z_w7D5^-J$hX*O-PFzEKhYzXMo42K*TZyW+*|A5qAjorDr;<-R-Ld1-lx1_c$tI|a$ z%As!Ltjxkk$X(R(d<=#G|m` z)7sIzaf7GSyxW$b@$~Rwp7p>q4t+$p>)4+tv}uImYb>P^`#3vFZZn<3=DKyBU)KdI z0mOH-T;zB5Qr4#IgT%9Z%kYac_hBMleza`m6wx&$?6Bre*HdtJjHokIUiO<6AFXrr zCu0CM4GhtMIB=(E}?j#@7Sh=dE%*kQQbo?TC}JrqK@bRM38y90hp^ z^4*$?ljEx#X>Yih+!FSHc=+FB)Vf*@mV9i+=#8W850?p3b$m$47KV-VveMwpa*E_fDY-K-N6@lm3`D z1&y0B@%z3FM2D6+2Vls6bb)BbE}`*{;~QKp2{e#HIp4Dhy;nIpqS#a*ZXwbb{c8;H zhtD}8{@3+p(3vQgb^bLJuG!wQ9F1ViQ=t%RvEpvmKhsu{ORUaiovBb}e~V?RmpG8^ zVzSDhJ%^yh66m}!bEBO@V@9$V{I;5}j&CggwPyp@{o5`7R;P{^Vs2sGY6=^4I?h%7 zrn=g{*1X{mAM_YvY%ZtylW|?*Zl7HZuw`)23X$O3>ehi77@l{#!S$YF`3vLWjkt~h zM-$;z>F~*r%5NRjTFKHrfK~J}?~qoo`on9=&@-|)qJs}F(Xy&*R3hE4YNtmYlU#w% zi=m73`;YwE4$!4%E>^mL-=@*_A}C7!gD;6s8&#G-tEgHUuI8N3@0Z!q@xxB6@G~I9 z1oU!fcn^4cxh8&BQR`2hjns;Ah09UXfJurSGH1tsc8}3|SS(RhijD^n9F*7EFHWqj zc>);Nt0L3uFe@6<8UY3S#0#Cqb4_n<@e1Al_y$|OQ6@Z>C}8(xUG4SDR?p=;8A%dg zO(k&~qo{8dP!$J!@Z^CG!6CThyFup{lPD~_@?}56A5F}8xu4Ol7XW!8*}Sx-^TREQ zUxhC|%`LcagPU!DF z`Sn5bx8ud274Ec3CgveWMBPqp=(?A^`fcKE`Y)bGyH>fz&7W!Cub*{^cmU3QEx)LX z{}>E5+l`ld$V+a0_mFT35wbKin7J{LU@bTJ6|ipac)W^gs@Q72YIt&JK5=)%VxO&2 zg2{#HcFYD(f1LX3SKoBS5;FUe?hVIUMMq}`?Dyo0u(iA?xMKG~VqA>=4qB9mECzEI z2qUj*Ffgg52KVfU?n- zF02JF5ZDY-|E@`oULM9VTj7?C20q4P$-5irV7bUuAS&N>+YAIG3{`H{?4fAH$(Y7) zxhz>VkK+q{eLQtb(^U8G;T9m|!UiW2(@#Im*#?+Ww_(FX{Cz6y>Qo1IfUdTh7PAD| z%cFK%xp&!cLbWMlFUpJ4m#A|sb#ji!b-zBHCrS^xy7=S8PtVt=EGgHy{0_7Y{%yljd{Z2z_?q7T zB>^7WVKKKTK7uibG=aD9a7TXlAPtIUSb^D2+T9(Q%QZiW-Uygy)oR@iaVRF~Bl__t zL##WZ-zf7QHF8UoB#Z0b>*C!`K95AMM)m1UK~J+v?zjT3gh#sjjQ8o%*hV|=&2)tN zslU7gE)u@Hy59}6SKpYVDR`0Ivp_HrVw@pdXm(%f1)-H zFvL^&#J>9=PyNP!2v)!JU}mzWWxaUJYP!aIT@CE2GfFAF2DD06=1+25%?kgyrw7U$ zmLtl2JGzqHybF)r!;bS6zyD~K-0{xcfnl#sEL1MrLfH#|bTOVsY{>A-Uv1nXWlB@2 ztxCE~Jt4rjAhVq$*t_B*>!!qP-|HD$c0;|r_|FL+1T{0PRRd;uFMRSG{yCZ>#(af8 z4H7bjOYgz6q{9$eqoguj=gIgFJN?~QDYm@!?$6#m3^&{4^4=R>%!(MQI1FgV?I=Ys zp1^WZC)T+bYEErz&2oRvKS>&ZM-)IgP06nfB+ZYU^s^nUoVgsQ%;ia_@pu15KbA2PmE>#vM5gn3bxQV`dJU-C&-Nmc==Z71Nsb%B5u9^J@a5|e zbGk3WLcBbM44iq{J+hq%{yQ>mXZum5vF70=mh{_}%G_BU2t&H)i!Uz}Nd__l*$kC$f!fgzB-~EWFznuPi)X_&@MP&71|NM2b}Ey;)9$Vi|A_O(BmK zUbH@E7MigSPr6Z>cq;QJ=YZY!bR&5t&7n%;tubz$C-1JYn^kiSNC5Z90OE39Qg$Cn&A1rqlcRo7BnT$ zHpV)%fY&e&`a89)R(X|WCm&#cWT@?$8{sS_YtCWB3p$l82&an1In)uCgThE~!S;(E zyv(a=KK~xmKzighGdKJR`~923*HH~cT^vY5B`eKr|stV&MfCoHIZw?Mou>#DObLJeLqFVAk21yusH zsk*bjctv0%3}G}&8fnq4G;0JSS8Sjjdew>#Sa;*>D@UU9gn=Hi=SF`!A!=Jab6uI! z%!Zd`na_iy^1QN$c2i4vfm`*Kz|!k@2p$T~r=kL>EYwVIlW(5NZw5v!m8# z907fw2;>_zVDj`}p({$vu#f9k(c33*m;%gZqCilaqFUlY5=DJ|x*W4@eAtsL-oy3F z|0OUGFC~E8)+zK|d7FhX+H_oXorxQ|y3%XXGo~!t3dU8WP+9EJP?(yo(MKCU66s=> z{oHf8s9LrmXk0%)uKL(W{dSr72gS)-FGyYSJ}!{Zq0?7>+Saf+ylJ#eBwC>v={#24 zpNBqfB$-RVlCAeX8NgE~u%zsjC^vtAbrja7IC#CnO>NX315y6HtcAQGPrL}<;&OW)h23v|9v;f$(lmK z9AG=lG@h3F8=L89e8pVwH&~TxEl1PMdsiyb9bxtWfWf;~++-pBM5Me}d%27T;&y#Y zN~A4w1#LHubImm1ZKRzp)zkvJz)kp%P=(W3GiyC0jerLwGZ-~Q$tK-?5?$dM0&12I zC-1gi!82Vgz+M-G1yAUi`0Qvbate^GAt=sgN#@iN)_ZtG~W=!=3%5&j|iR$dk5pf)Df1xsB9$9m*&`BnYSE={<< z9 z%kT%ackq5vuql-Iy(#!n8L8Ks_MK~gxuIuH3nRR;LG~{!n2qwH7~{$y4{%1c@oE&? zSRn?5HnuTS*`=>q(v-|KeGiNH_Sxox6>kPPF6nuD_Rl_1>PTJvM!Dtk!TI3&FiRZo#S zi}nStz34vsPjuiV-}3!fk~su-mNbtfDhPT^aks7e$l9+ETG>r!M@f{C8|A(&X*w0> zNn09)KmpIYgJjphpxs0!lT~`34OF(sMM`uauh#;bn_zoY%g_J30U(QaQL}5TjJ4(Z znskX*>4J7~giD5pL*l&YhWpO$^`yVy`3L#1zqNEvO_F$HQ!diruJESYLPcKqmlRkDmt~`5^q#oct$YGVL}j)U+;k6$r3v}0x3@hu z@8u~C6{+1f$pX<0-3cSl@-+01&U^!3r-*&UEw3OT#f?^4`fCmtqTZ-?$toN(@hgazE#$itD(PNl_OH%B8gxm#6V!g5V*7t;)TX_T|T=7VEsPr&FFK;Pl zRtydGY`cj1%7yxP4LDhk@;?B30me1_%U#}apEyDCB!%CCHz5Epsf5_JA|EOclco?J z0QNM1bm5?c;9KsiMGN_lqo-JU7>u{D`pm8o?|ZTpMt@BMBrTF^ZM}nx^8kr=+`_ekZ3bGz*H4-yVn* z{|ar&p-(l}Np1|j+U*Q#+*kln3+*<9CHXOGBNLK6A+O#@P}rwtVi-ziRjS2~A6iQ& zkX2?^%HiX=Lx{I8_MR=0g|Ry@ziIlA8HV{;S%HsOQg}K_v40-u)&zKsn!Rz!G!6*e zf1W(x^D1!O3fiLY6yN7`Y-H7iBB1Woou{R<&s%A$xQ_RoVQTF{}fieZZG_{aYwJ{-mFOP%SVc;)`Z>!+*;uTT`d)r z;H3&t5SMHuvwUxaa8F?J%KQ0q$}Hp95wSSP^s+80A#+7J+Il^|G&r;eT8YxH@%eOQ zPi{pDCUJZb!ZDxpKi;#wEROdSf78F;-{{zL$RV#X zjLqc9k`6vy;=rocckf##$SdfOrPZVyir(-`nsKN#wj10^Th}3J56i6#6L)x5d1zln z)|F#ip}J`hM#^l7OH3uz>-SN>-!!D7*B#2gTse&7!oWc> zPUo_XVbhmom$O|QwV zF3Y8&T*kuS199toIr3CZWb(r=R2A+y@m2E-osLkluKd(lG^g8^nYAZDY`4p3mrv(| zXw=&YPy5}RVbra|NuArl>P|!o_cV1{l&Ciw;)|r0yVB9Nb_v{PZoM4vk}kP%EgE$w zG&HPv>xcsFu)^lcPZWO992jN|qhgEXE~}uo1$G%VEDY>os+P3hmi`jniptmk(z(Pn z1wX*vg-M;VjUD*X9ql0RXWaX*s&dMp`GWF;;92UbMZ+rsUVy+l%;FB>Aw((pc=IB; z#d0%(&gNBAAuO6%{`r+jeh=%=>;Z2UQC)Y#$-%}wsG%Dg8^7~St85&BCmdcA#q5yP zPH~4%MwA3TUOd%vGH8Zu3*w}Jz#+(Ir#UA(cN9c~+~nBsybg~<0!Z8N!N@A<7ibQ2 ziyG$vw{w?t{c6OAYGp$q(QdI@vk42jDpK{R?Rq6T$ciD}x2IVtTyJ{J8-sx>-)CvB zxq# z9=}+|5J3I|@O6yBuo%T=Kn%;zS3i>iUZY?`P(pk^$fOPfEQ>}?s$Rv%-9P~nBVmv3 zYguj<3vs<9uB0TO(;l95uB=c@-Sc|7)Jog(3wK4J>P-?RQDg#oa6Mzt0Ttq)$!V@N z(5!Xk?Afzto}pzAd)LZhFMCdDdhaJ@=Rqwo6jedm1h^@_q}V-#Zu%R7I4Nf(z1gkT zV})^QP|uOs+fy<+v6Uq6pUn2ifOHfNRC+L#w-dGcxKyiUMhI)e%2)y!d}f@d?Vssm zG8lX=E@W8V4}vlIEA-tWqofSm{*W(Nu8qtY4+@zY$`t+@fmW7$p@yMwmHkiI?&Two z)n`Pq$mvR2Yc7;(%2TX{Cp8QeJVMzJsg(z8N-#BUV#GS=qaSz6CuEIfj2Ca!iJRV@ z&+DSkNG|T#A0igASuQQ)NGw_7N|agoasXpA2^HI?i2<=$@sWt%zYFA&DN*fzcy-Jg zrhz~tlO8vI_gIo|IqTaMfIQ}w?(eKdlcmP!I>=Uds|KpTEC?g+B&zx<=c|~3(0htZ zjl)W29qS-E6r{Y4Hrc1;P4D9~hniM8y{HH+gZ;fN65ee<>#Le0-z9mZPui@No zGvCa7_jjvi?q5$8P|ee)&)L29-fORAl{FqqXdmt6^yQeI$n@8RGz|l!gWwa_jVgZ~ zP3MweVCTmm^gYD^>Di*K*^`5j-%^6(>G zu;b_eiBcJokE!$>t7VqDp#(BL^*(r3hVP$WF~oon)zT>DX%G)9L_8@C@P59svaXPV z_UQXGjW5l!=n-HYLXBtT#$TOoi}#!Q`h2qIcYYYfG+oNDUI`&&l_^{CX*PO+aB&Sz zOxo_lcEp7TGOmR-GATZLq?V140n}#8-m57+FLVI>*bE~%Mpz7h`(>eG0E86sz#8ch z=qnZdeN<$S-|YlBS(ns zXTz?j3IhICP;qE4y>H1``zuwo2zFD?9|5SrXwvK-@gYW}PZ%ghpk&OVQak~eO()`O zGd-B!ec;SbW@j(^AnB;<00tk^8?L0jObf6@Ta*`&qU5okDq?s|yQXjDkgeK$!yO2& zHdv)wZ1~`HqE^J8h4u#fXiji+&`!95Fe`UlmM4PuS7`j{$GUq;aLLB>yzP4d{DLhL z-QW+xdRBD|e5q(pxi^vszaXBw8dK~DYhE4w$R1Qj|4;0u%Ms24q(IiALztVkpu^TR zgoMW9Hr5iHblGOuYr9})>0FQ33I+>)`D6F@&y|Mm3cqm0Wv7$SqU)=dj!r=jqliLS zLGIZ7ZSEYdiY&V7Oj%%9uID>vh4Yvm8+6I=0GX#(n2+$5Eq4q5xDFybx7(NRE4+BV zjAD2;;E@8su#))xjL(>YzjvK;LRNVp5$je={^99mRKwm7jA!d~SfhS(%=CUk-=T^| z|4|i`$n5NcNCeh0-jfmwEdi#-@)Oj9?5k6e0fyTTo19kIn2m$qD_vV~F#YavJz$JC zN6g1xp~1FUqx zk@59`GtAv)dE0yz`yLE0Vl;0`=Tf^&-J*$rbdfPJw&C{4MWZbOm>@`gA{#HbODa0= zyNiT2ua1Xb!kQ8Oar7IryG~Q^?X-b!WTF0CThS9?;zFDCwLdno1%KokQe33PV23#4 z4mQx$O)Hd!iT|aGvyVHPaI;uy2;)W*F`TR1JN& z3ju5cg9wXEKAiy7;aw`#{NVX-JIMalPLh=9c3REXsCwI&%@HCmmkSZ*0?1D)3k35O z%hA3zY-<71U4m&%5y}(TQ}n_clp(fyLEv^3ROoDgGO zcPwmt=S!aYe!CdLvkKHS6>d|aQmSIQgA@Q2eLw;|EayIv2ya61?qtz)^$7Kj#%?T~ z;qs1e&;4*KAdbwb0t)x;Kw!ls^#Xp)BbByc!##8CAtbg~cKwaieDSw%9Ory1&`<82 zJLN1gF6SUM9VyyWD%OX1c5E7VArSMr#@_*w|J=~{(&TG?uqXL+QM2UhnYS=yPfi|| z+9}}Yha*hmd4M4P1kiQUTfa-E(`@rCkk0(s<#@Uvz`ADb=Y)Tbe*PGETv>>_%pwoS zqqevea|0tJ*E4N`Cf5sq#;81?->--bk&gx-vh7bimm5PnCMyf_O4%>nZ7tF%Tmi0k zXJ%c1SXw5`&iH<_mF~iNZ&miVT*NQs)8(60r*&kjWy7wcIhVN4cjw!{?=Q0aMWQfG zeD6-yWaf>=%-0KM+{fD>-y472HKDIGNplKld!Kl{<8qw0T(`KfiCby34ZJl5?>8sz zC!I=vNZcn{F8A`%lbh8wkG9sp$7Pd7U=JGj^uK|9Mub;8oYS<-E>E3*wntJnagQP0 z@Fk-U78fNgU@6y}j7{fEy1wUq@OE}cW%u&z)S^_X@=jdx7mqD=%6zl88gqlP*g7oC zlyTmNfI%h9n92U=_5j^PZja}0%;%}ld_BDShaXbjzzDgqDDpKIvjalRrHZyv(}^JI zTE=Q-B+&0RBFNwv(0rSm`N<@u^w(@Q3s7ND04M}g$?{9HYKMWVCQ~Svlt^~Z>8!f> zfNs)vIcE8DvY2(5A0o_hA2azrUxmC|ndAV&V`vXkE`{PP;+aN8x2B^ZDzMogIDBD) zzDW2MbQI^e$NkBkOM^x$IK1l`2ET&QBx#^ehIHdBv@ozKSOkz7+&3*VNW-zEjU*Cp z4mW&NJFl%ea@%Jm5-B@fu#vOTWkD*@Zk~FbZ!FSNEr$fK=gY5rqsexp4UhL6>|Y(` z2lJf_{k~K$yPiKCR>&#S>=6gTVPdEiZjX8q9qIAS5&2$lx^3lA^l18tu7sgYR9IjGB955pj!Qogf0<9@ zyn$s9vW$qX*n$0;D-zMpboCu`^7Ip+!z)YTk~Oa)Uc*|9;5fSdr7}tja`){#zb?)i2 z1t7F-rb_38&pNN&cJ$*Klt%Z4)nOvi>|)4ANnV)YrlRk5RO;_BR2Wz+8$~ zUfn4NA{|~>g9#)Gg?pyUn#H?Cy6Jup&s)#P?2ig6sfhx8OQp8SQ%x4Ry^;CAVo_Mp zMy&7V0uL2kd0oW2KL@9X+2SeHeMzOE@UGn(-ih^XRn)$dw&<*i{sb(!{hJi41zfOL z4CVYi0a1Wgpx6W@?dkYShy%&nrSc11i+56kxv$P*b1a~t%h+fU>DZ1oC%OcG;VblO zsw^INhqJ!{&4Q;-BpQdSJ*o-!o2lqIl|~n9pZ8kQWOuRFB4mr`iQ}k+E_c3{%z_{; zEC$;G?47p3*B7P4F`w58S%x8DpaD{Q4^Rn1ej~+b%lh@zUC}?u-+@yk`iRa_?eZ3n}4SkU;?r z#00NOEfK)|Zj)t4VEx+h{p#O!N6(wjb$UwM?dHS$8^`F{9;PC?v<$umH;&tElcgM^ z4(rf+6qbj-#SO-i7O9R~DzS!IL=5uu7@}n4wk7GfJqmMT0iEU@ym(Ku)=mf77`s`d4>A#JPSGx0H6m`f;dGY$M1Fgm6@2sZ^Xi5vh`Iq|eT;SHFe70D7EJk$-*hx|pOU zSRBK$o*fqqBCxFAr&Go_@3lD9#sMCEhXA1Ai-s}ioPuS5cLfhd{x$o7q0zJ4OQ4sO z;2Ri2AwKqUe`M;9AMivB3+Kc!Jvd((84x>{dojw^Joj<+&lw$U*B*gNdWRgmpT{qV zbHHK4*Op;A!AtB_EMEd`f6PhZSMK#;VM0-NkAPrd7a#LwE56 zpjL^I>cg!Oe}1HEePIOTo_Pf0wrR3Y%G~w`#YQ?=l^fKcWBdQz;K1$CNQ4u$r83DW zJtbBa;MOCK0WTee*dS;7OKznirCEefzFPIR8;EOS`?D8_nHVnuZupBFtM1p*1=p1ups_ARTIzyR zbP5g8R#F?3&EGJjI&e8|81#NG$7@=)C5uF22z-c!x1!pNmV&~v2dN5)tO$aTK5P6n zmtj9=7Z9k6U*YmG2b+qZ0;UWCzhL~FA_7cNelU6<%YujXn9Vqbu&*{bW(UGXN+C&T z+3ujO^;Lm`rBFGWoDj|scW!xNFhJhZQ@|K#wZFxPu&uN|9eF86905wSBDc9RD5Q+C zVysepGUUnyX_Xb{JH4oS$oCa7?xQ6}_CQ2@$_cV5AMx959W+p-O zLo@?jYfl;(hf`i}SRz8D+Wi#?8GOxVwe0zsy*kt&$Jz^V8_+r))U4fpi{jDuUA|@* zbRu9>*@qx^v0cYD#fbfWfvZ2I{k0K^RusdrRJBxKwnT*`EcDw7PhS|S=knE%P704f z!fS)mTG^q&4WI;#WW{+LK;yE>-t=67v-UTwLv1|_eXk?QFwBfCvL03t=Y+&31Cwin z33Tal3&(<$UN{y1TU|Bc{hu{Y>~fvP?_%+=Zl3yMfUHQ8QY@zc`nlWX@7)%VGYA2% zLzuSyy-}=G2weU=@ySeP6Fi6WNln_tD%3Q*fzN6;-;m(d`RtJ$gg9NE(?y>Y5x$zp zWNs0^LgX7@4@`XS+Ca0oOnt5J74x*js%z8i*V4Y(SGzE-=cHZi^!%JhbYpOh&b5Dx zouzozSra%C#?T3<{~Pfp9NF!dJp{|w0*X@We;(>CBMjicL?j9K{9_i};YAxe1c)(` z8F;E7jEVtuWd=4Fb!x25PviO-=Jc^h+FM!yqIdGlNB;)XF z-ah-Xf{eZs|4ZbAiTR_~T?Ob`=+-knYI8G!aIfW80SNIJ1QhW@%V@O2gfoOgG!h{S zXcDC=Y12*-Z0JJu#(Yl z#DWVA?nSIC_UgDx+94?dO}lazX<5W4cucn_&7o7uhXENBGlrr7E8K+x&k z0%vpq_~J;ed%XKCB|{?h0A36yrL}hZkf5}N%h%gczY6ym`tbz!t8Y=M&9&_}1I`Y{ zxX~)3>j4Kxkkap#{iGY}o$g5wez?EYprph6Ad>Mt7h)4cQAy>}Od-vvz1|&?`22cD z0s93(NX~XOr5>UR$3{EdP4_>hyw~Wru=%SMtIdb+YS3LE~p=3FOluYfM{=InC^s)yv&P4mFyiXT;41Hp1C@Pa|7!G)KGL zCaIX{?~9NyG}BLABrC>QwXEq8{yxs@*IhjL#o136!qmKdAmlhNXwk9p__jimaHCfb z+JY2~yQlSs9dBTiOP6FgvW1zBDGH3<=5d_&s6)Ib?YwUrJUtklp>So02R!!7v8#S% zSEOOHbK~`h_~qqGbAx1=J-0R?zf>{qv%UrVmTP`_Jin~{{W%{hZW?1-Px|SrN|$$o zBVd_v(2sh_G=j0m)qzgV+c$BpE)JoUrPd0NO+iE6p6^ao*NHi3W>hh+t^9Yi^c`lk6geLKS1ZB2U?pNRYw_eq5?OU=jc3dNsnc_EmkC9oXz{npE? zxO#8R_tE1yL;|P=5`c`f?~RJTZ#Q-?nq=lL(U)yMu_OF;yk>(X!FEi`^cY)&o+Et8 zfJY8&{ECuJknQ8{{TOzdjz?NvWkcV-xy`1;*#vkGrr*IxGU`FWbKpm_wLco8Uskh+ zf`>A2(bR}We8N}mK2JP9^rBu@*P8E`IbY2gj?K{Jp?yU_TT%JZ`_&-GQ=C9ojKXwhhfT}2>0~sHA8)Vtl`vk7`AZxr($E)@!3lq?!!FfM-Tg$+$#8* zg{=hGbCQ;BdR~r*^5hLpLK=tIBZqL?Z4ZAZ_9xOK^y|{BM_=qp@-sp(>Y+l2{hK{_ z$@BOUu8KCg^~EdKre~fd{nIAc_%%?K`o2iK3>`#bw>C0OxA~qUR+iQycGfUzL2+^t z#H1mWcGtV3Lo`0xjp4y;) zgE`!+co?rMQkOJ*8bz3U7_ZvWjblaOc+zg(u0w@Qn2JRj+w(oXb;c~ZIYU3RQ>JF= z_QASCWx3N9&wH1^Y5EKu-B=GG)N-8X_hOSlJjSy-*c^*Cl*=H>K7HgnR5{(7+|p>f zFYlsKtRm<}_BxErLYA)Ka76an^6bNYy~oM6FvdG~ncKrmZCqyUWT@HT9D>&Sh&y01 zc+6q=1v#?)wCe<&{Lk`bS4J!v9ZG}W_F3}HZjVu*ofd{=*Nw><>}H;Pg+T8@4hdaf z+rlMD=Cm6?h%%5#k-D(ny3~)@uB7YQ$=?oqg`GZk(8#n}-Wy=Ge-Jw@_vC#wFGXhg zHPX;fWoVW2i)nBVo0R7q&UPq-#jGwr@j>fn>NYXg43l}6F2w!WvhJ!uI3MT;g$cEasDayd1Kz+RlqNNcq0CiJ4G;Y9%B3*ki&rl)!#2*A1U;pu( z=A?EOFahaPJIqKAP5Nm>p2x;oUHzK@KY=pB#`fO!Q*RhuYZ_%v2#zQN zsG3XZ&OP^Lr4j}1&mM6NxyYY*cx3*L>v%ljr-O(UL-^PecyC+v zbxHDs>sM_T)c%&U;RIA?yhL zQI+yF{PK~5o*KBpIHq9tXp~4`n`GRy)C^=2TDe5(T%1NJit_}zkBv%1doR6V7bKGL z$~D`GPWo=48Am-hb}crsF#J8!2FlBKxZJ}Sqy!}_$fT8q+ZSUPg=qx&N&bv$KEI^T zc8!K-nFzLiNX>gR0ir!~4@*qRP64Ea3&HI2b^HSfFg-XCh@K3zSF~42q?tLmo)?`# z#&LNSQQsMWM-!{WPg3*Gi%uQk6X6~}NZ^zZWdo5-U>+nTq@kFT`heEz3e(gF^9zfWSY9T27ouKRgQ6wr}jl@&bwN4;d&X|HvnK z#C3=VgHmryIGllI0<=p+1C=gV{AQHnrPjo0^b1(xvjbtiV0KZfRms8WC~u%y6Qvhe z5FK6vbc@PQ@EFa7e6>v04t^QjKR*rD4If&@G0NaK$Bk`B{$tr&o|g2E

TR8VU5r+FqY= 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 p%L&@)cId0Yj-86d>Q-db8f-gfT3oMrM%dq# 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%0DC{ZDJdiWFhRzEH^D2q6L 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 J>P6pw{9hl0UGV?_ literal 0 HcmV?d00001 diff --git a/docs/tasks/backlog/.gitkeep b/docs/tasks/backlog/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/docs/tasks/backlog/.gitkeep @@ -0,0 +1 @@ + diff --git a/docs/tasks/doing/.gitkeep b/docs/tasks/doing/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/docs/tasks/doing/.gitkeep @@ -0,0 +1 @@ + diff --git a/docs/tasks/done/.gitkeep b/docs/tasks/done/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/docs/tasks/done/.gitkeep @@ -0,0 +1 @@ + diff --git a/docs/tasks/done/2026-06-22-18-07-CST-readme-showcase-screenshots.md b/docs/tasks/done/2026-06-22-18-07-CST-readme-showcase-screenshots.md new file mode 100644 index 00000000..966d7fcf --- /dev/null +++ b/docs/tasks/done/2026-06-22-18-07-CST-readme-showcase-screenshots.md @@ -0,0 +1,27 @@ +# README Showcase Screenshots + +## Background + +The README had a placeholder screenshot section. Two product screenshots are available and should be stored in the repository with stable filenames so they render in GitHub Markdown. + +## Goals + +- Copy the screenshots into a repo-owned asset directory. +- Render both screenshots in the README showcase section. +- Use descriptive filenames and alt text. + +## Implementation Plan + +1. Copy the chat/channel screenshot to `docs/assets/showcase/chat-knowledge-organization.png`. +2. Copy the resources/highlights screenshot to `docs/assets/showcase/resources-highlights.png`. +3. Replace the README screenshot placeholder with a showcase section. + +## Acceptance Criteria + +- README renders both screenshots through relative repository paths. +- Screenshot filenames describe the product surface they show. +- No app behavior changes are made. + +## Validation Commands + +- `sed -n '1,90p' README.md` diff --git a/docs/tasks/trash/.gitkeep b/docs/tasks/trash/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/docs/tasks/trash/.gitkeep @@ -0,0 +1 @@ + From bc058e2e77a31f2dc46ed8df1580d18eb1218ed2 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 22 Jun 2026 18:25:31 +0800 Subject: [PATCH 4/6] Ignore Antigravity CLI and opsx skill files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 51b439e0..7ab4caae 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ .history .cache/ .idea/ +.antigravitycli/ +.agents/skills/source-command-opsx-*/ # IntelliJ/Melos generated files *.iml From c161e31c634b562c6f713a79311df6c74dd134c9 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 22 Jun 2026 18:37:18 +0800 Subject: [PATCH 5/6] Preserve migrated backlog source link --- docs/tasks/backlog/2026-05-26-scheduled-agent-tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tasks/backlog/2026-05-26-scheduled-agent-tasks.md b/docs/tasks/backlog/2026-05-26-scheduled-agent-tasks.md index 04353fa7..eb8a12d8 100644 --- a/docs/tasks/backlog/2026-05-26-scheduled-agent-tasks.md +++ b/docs/tasks/backlog/2026-05-26-scheduled-agent-tasks.md @@ -10,4 +10,4 @@ When a scheduled task is triggered, it should run an Agent workflow. - The task creation entry point is conversational. - The scheduled trigger is responsible for starting the Agent workflow. -- Implementation details are not decided yet. +- Superseded for implementation details: see `docs/tasks/backlog/2026-05-26-18-34-CST-scheduled-actions-agent-execution.md`, which is the current source of truth. From 1cbf2a2f45e6f410fd028703674df94485d9e496 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 22 Jun 2026 18:57:14 +0800 Subject: [PATCH 6/6] Fix docs sidebar task links --- apps/docs_site/sidebars.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/docs_site/sidebars.ts b/apps/docs_site/sidebars.ts index bf353c44..1bec5b6c 100644 --- a/apps/docs_site/sidebars.ts +++ b/apps/docs_site/sidebars.ts @@ -34,11 +34,11 @@ const sidebars: SidebarsConfig = { }, { type: 'category', - label: 'Plans', + label: 'Tasks', items: [ - 'plans/2026-04-26-10-20-UTC-docusaurus-doc-ia-restructure', - 'plans/2026-04-21-07-57-UTC-readme-refresh-consolidated-plan', - 'plans/2026-04-08-02-40-UTC-code-map-foundation', + 'tasks/done/2026-04-26-10-20-UTC-docusaurus-doc-ia-restructure', + 'tasks/done/2026-04-21-07-57-UTC-readme-refresh-consolidated-plan', + 'tasks/done/2026-04-08-02-40-UTC-code-map-foundation', ], }, ],

=Tnfu2c$Mib#%L3?_z1*&8;hm+Lhz)V#Ry%CnVD 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⪼A9I|$rb-P^Qw5=qtcz%cDcasaHrL> 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