From b34b8ca672ffa8e89b0ade7ba3925a49968b738e Mon Sep 17 00:00:00 2001 From: ducoterra Date: Thu, 15 Oct 2026 08:33:12 -0400 Subject: [PATCH] phase: 182_verbatim_show_text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Phase 182 — final verification pass (all 8 tasks already complete; this was verification + docs + one defect fix).** - Verified: `app/rag/verbatim.py` (locator grammar, `splitlines()` slice, line-boundary cap, `resolve_answer_blocks`), `SHOW_TEXT_TOOL` + `shown_texts`, `SHOW_TEXT_CLAUSE`, `done.answer_text` (9 fields, key dropped when empty) + `ChatMessageRecord.answer_text` (≤50, 600 000-char cap counted in the 8 M budget), `verbatim.js` + 4 `{verbatim:true}` renderers, `Containerfile` minify step, `.env.example` 3 vars. - `uv run python -c "…answer_text, show_text_max_chars, show_text_max_blocks"` → `True 12000 5`; each negative refuses startup naming its field; `0` accepted as inert ✅ - `bash .agents/validate.sh` → **validation OK**: 4320 unit+integration tests green, `TOTAL 6849 17 → 99%` (gate app/ >90% OK), `ruff check .` "All checks passed!", `pyright` 0 errors (re-run after my edits, 08:28). - E2E, each in isolation `--no-cov`: `test_verbatim_show_text.py` 13 passed (panel bytes == `documents.content`, server caption, clipboard == server string, `/document.html?source=…&path=…`, honest unresolved state, reload+share, `show_image` regression, flag-off app) ✅; green: `test_answer_images` `test_harness_aligned_tools` `test_agent_document_tools` `test_markdown_tables` `test_markdown_inline_links_images` `test_svg_document_preview` `test_smoke` `test_document_viewer` `test_markdown_blockquotes` `test_chat_persistence` `test_thinking_timeline` `test_chat_rag` `test_settings_mobile_value_width`. - **Defect found & fixed (pre-existing, not phase 182):** `tests/e2e/test_admin_settings_panel.py::test_admin_sees_groups_and_source_badges` failed — its whole-page `assert "reese" not in page.content()` tripped on the shell's onboarding chips, which follow the newest saved chats in the one shared E2E DB (a leftover `reeselink.json` question from a tool suite). Scoped the strict sweep to `.settings-shell` and kept a whole-page `reese:reese` credential needle → 12 passed with the leftovers still present. - Docs: README fixed 2 inconsistencies — Quick Start omitted the **required** `BOR_ADMIN_PASSWORD`/`BOR_SESSION_SECRET` (the app fail-loud refuses boot) and the broken anchor `#chat--` → `#chat-`; full re-read of README (1816 lines) + AGENTS confirmed the phase-182 feature/settings/log/UI-contract text matches the code, and every `.env.example` var + every `Settings` field is documented. - Notable: kept `resolve_answer_blocks` synchronous on the SSE terminal path (bounded indexed SELECTs, matching the existing `query_log` precedent and the phase's documented fence-lookup bound); no live-infra changes made. - Next pending phase: none — `todo/` holds only 182 (its 8 task files are in `complete/`; the harness commits + moves `00_phase.md`). --- .agents/PLAN.md | 38 +- .../182_verbatim_show_text/00_phase.md | 0 .../01_settings_and_kill_switch.md | 0 .../02_verbatim_resolver_module.md | 0 .../03_show_text_tool.md | 0 .../04_prompt_teaching_clause.md | 0 .../05_done_frame_and_persistence.md | 0 .../06_markdown_locator_and_panel_css.md | 0 .../07_hydration_and_copy_buttons.md | 0 .../08_e2e_and_docs_pass.md | 0 .../182_verbatim_show_text__00_phase.a1.err | 0 .../182_verbatim_show_text__00_phase.a1.md | 1 + ..._verbatim_show_text__00_phase.a1.md.status | 1 + ...2_verbatim_show_text__00_phase.a1.validate | 143 ++ .../182_verbatim_show_text__00_phase.a2.err | 0 .../182_verbatim_show_text__00_phase.a2.md | 10 + ..._verbatim_show_text__00_phase.a2.md.status | 1 + ...2_verbatim_show_text__00_phase.a2.validate | 143 ++ ...w_text__01_settings_and_kill_switch.a1.err | 0 ...ow_text__01_settings_and_kill_switch.a1.md | 19 + ...__01_settings_and_kill_switch.a1.md.status | 1 + ...t__01_settings_and_kill_switch.a1.validate | 139 ++ ...w_text__02_verbatim_resolver_module.a1.err | 0 ...ow_text__02_verbatim_resolver_module.a1.md | 21 + ...__02_verbatim_resolver_module.a1.md.status | 1 + ...t__02_verbatim_resolver_module.a1.validate | 141 ++ ...rbatim_show_text__03_show_text_tool.a1.err | 0 ...erbatim_show_text__03_show_text_tool.a1.md | 9 + ..._show_text__03_show_text_tool.a1.md.status | 1 + ...m_show_text__03_show_text_tool.a1.validate | 141 ++ ...how_text__04_prompt_teaching_clause.a1.err | 0 ...show_text__04_prompt_teaching_clause.a1.md | 15 + ...xt__04_prompt_teaching_clause.a1.md.status | 1 + ...ext__04_prompt_teaching_clause.a1.validate | 141 ++ ...text__05_done_frame_and_persistence.a1.err | 0 ..._text__05_done_frame_and_persistence.a1.md | 20 + ...05_done_frame_and_persistence.a1.md.status | 1 + ..._05_done_frame_and_persistence.a1.validate | 142 ++ ...__06_markdown_locator_and_panel_css.a1.err | 0 ...t__06_markdown_locator_and_panel_css.a1.md | 24 + ...arkdown_locator_and_panel_css.a1.md.status | 1 + ...markdown_locator_and_panel_css.a1.validate | 142 ++ ...text__07_hydration_and_copy_buttons.a1.err | 0 ..._text__07_hydration_and_copy_buttons.a1.md | 25 + ...07_hydration_and_copy_buttons.a1.md.status | 1 + ..._07_hydration_and_copy_buttons.a1.validate | 143 ++ ...tim_show_text__08_e2e_and_docs_pass.a1.err | 0 ...atim_show_text__08_e2e_and_docs_pass.a1.md | 32 + ...ow_text__08_e2e_and_docs_pass.a1.md.status | 1 + ...how_text__08_e2e_and_docs_pass.a1.validate | 143 ++ .../166_pre_answer_window_1280.png | Bin 70822 -> 69542 bytes .../screenshots/doc_modal_scrollbar_1280.png | Bin 43770 -> 43362 bytes .env.example | 3 + AGENTS.md | 30 +- Containerfile | 1 + README.md | 179 ++- app/api/admin_settings.py | 10 +- app/api/chat.py | 99 +- app/config.py | 57 + app/core/settings_catalog.py | 7 + app/rag/agent.py | 305 +++- app/rag/prompts.py | 112 +- app/rag/verbatim.py | 520 ++++++ app/schemas.py | 131 +- frontend/assets/app.js | 145 +- frontend/assets/markdown.js | 144 +- frontend/assets/shared.js | 50 +- frontend/assets/styles.css | 294 ++++ frontend/assets/verbatim.js | 531 ++++++ frontend/index.html | 6 + frontend/shared.html | 14 +- tests/conftest.py | 13 + tests/e2e/conftest.py | 12 + tests/e2e/mock_llm.py | 404 ++++- tests/e2e/test_admin_settings_panel.py | 18 +- tests/e2e/test_answer_images.py | 17 +- tests/e2e/test_settings_mobile_value_width.py | 4 +- tests/e2e/test_verbatim_show_text.py | 1428 +++++++++++++++++ tests/integration/test_admin_settings_api.py | 131 +- tests/integration/test_admin_settings_live.py | 71 +- tests/integration/test_agent_tools.py | 14 +- tests/integration/test_chat_api.py | 426 ++++- tests/integration/test_chats_api.py | 114 ++ tests/integration/test_kb_overview_api.py | 6 + .../test_read_line_ranges_handbook.py | 8 +- tests/unit/test_agent.py | 602 ++++++- tests/unit/test_chat_gate.py | 160 +- tests/unit/test_chat_persistence.py | 8 +- tests/unit/test_config.py | 70 + tests/unit/test_document_viewer.py | 5 +- tests/unit/test_frontend_edit_message.py | 78 +- tests/unit/test_frontend_scroll.py | 6 +- tests/unit/test_frontend_verbatim_blocks.py | 867 ++++++++++ tests/unit/test_frontend_verbatim_css.py | 465 ++++++ tests/unit/test_frontend_verbatim_markdown.py | 636 ++++++++ tests/unit/test_image_chips_and_answers.py | 44 +- tests/unit/test_no_empty_answer_bubble.py | 11 +- tests/unit/test_prompt_lock.py | 50 + tests/unit/test_prompts.py | 175 ++ tests/unit/test_save_chat_ui.py | 43 +- tests/unit/test_schemas.py | 106 ++ tests/unit/test_settings_catalog.py | 39 + tests/unit/test_shared_page.py | 39 +- tests/unit/test_verbatim_resolver.py | 705 ++++++++ 104 files changed, 10852 insertions(+), 203 deletions(-) rename .agents/phases/{todo => complete}/182_verbatim_show_text/00_phase.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/01_settings_and_kill_switch.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/02_verbatim_resolver_module.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/03_show_text_tool.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/04_prompt_teaching_clause.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/05_done_frame_and_persistence.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/06_markdown_locator_and_panel_css.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/07_hydration_and_copy_buttons.md (100%) rename .agents/phases/{todo => complete}/182_verbatim_show_text/08_e2e_and_docs_pass.md (100%) create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.validate create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.err create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md.status create mode 100644 .agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.validate create mode 100644 app/rag/verbatim.py create mode 100644 frontend/assets/verbatim.js create mode 100644 tests/e2e/test_verbatim_show_text.py create mode 100644 tests/unit/test_frontend_verbatim_blocks.py create mode 100644 tests/unit/test_frontend_verbatim_css.py create mode 100644 tests/unit/test_frontend_verbatim_markdown.py create mode 100644 tests/unit/test_verbatim_resolver.py diff --git a/.agents/PLAN.md b/.agents/PLAN.md index 8c7cefa..6e892f6 100644 --- a/.agents/PLAN.md +++ b/.agents/PLAN.md @@ -84,6 +84,25 @@ A15 — `thinking`, `tool`, unlimited tool rounds under never-truncated contract is unchanged; the `read`-tool cap is the only exception, owner-permitted 2026-09-10. +Phase 182 (verbatim text display, owner chat 2026-10-14) adds +**`show_text(path, offset?, limit?)` as the fifth agent tool** — offered +only when `BOR_ANSWER_TEXT=1` (the default), gated exactly like +`show_image`, with its own `` clause and its own kill switch — and +the **additive `done.answer_text`** field above. The new settings are +`BOR_ANSWER_TEXT` (master switch, ON), `BOR_SHOW_TEXT_MAX_CHARS` (per-block +budget, 12 000) and `BOR_SHOW_TEXT_MAX_BLOCKS` (per-answer budget, 5), all +following the `agent_max_rounds` pattern (`0` inert, negative refuses +startup). The principle in one sentence: **the model points, the server +supplies the bytes** — a ` ```bor source/path 12-40 ` fence or a +`show_text` call names a location (canonical locator `source/path` or +`source/path#start-end`, 1-based and inclusive), and the displayed text is +sliced from `documents.content` server-side, so what the user copies is the +knowledge base, never a re-typed approximation. **A1–A6 and A15 are +otherwise +UNCHANGED:** no new SSE event type, no new table or column, no new model, +endpoint or transport, no change to retrieval, the honesty gate, the +persona text or the embedding dimension. + --- ## 3. High-Level Architecture @@ -129,7 +148,9 @@ POST /api/chat {message, history?} (auth: require_user) → cosine top-100 ∪ FTS top-30 → RRF fuse (k=60) [A7] ├─ HIGH (cosine ≥ 0.62 OR fts_hits > 0): │ persona + + + full top-2 - │ + → agent loop (ls/read/grep; round-capped + │ + → agent loop (ls/read/grep, plus show_image when + │ BOR_ANSWER_IMAGES=1 and show_text when BOR_ANSWER_TEXT=1 — the two + │ "show the user an artifact" tools, gated independently; round-capped │ BOR_AGENT_MAX_ROUNDS=10, 0 = tools off) → turbo streamed └─ LOW (A8): DEFLECT_MODE prompt (weak titles only, no tools, byte-identical direct-stream path) → turbo streamed @@ -139,7 +160,15 @@ POST /api/chat {message, history?} (auth: require_user) SSE frames (`data: \n\n`): `thinking` (before first delta) → `tool` (grounded turns, one per model call) → `retry` (pre-first-frame restarts) → `delta` (answer tokens) → `done` `{deflected, sources[], -suggestions[], budget_exhausted?}` (terminal). Failure: `error` (terminal — no `done`, no +suggestions[], budget_exhausted?, answer_text[]?}` (terminal). **Phase 182 +extends the `done` frame ADDITIVELY** — `answer_text` is the list of +server-resolved verbatim blocks (`locator`, `source`, `path`, `start`, +`end`, `total_lines`, `text`, `format`, `truncated`) the answer displayed; +there is **no eighth event type**, the key is OMITTED when no block was +displayed, and with `BOR_ANSWER_TEXT=0` it is absent on every turn (the +frame is then byte-identical to pre-phase). The same array persists on the +saved chat record, so restore and the anonymous shared page re-render the +panels from the server's bytes. Failure: `error` (terminal — no `done`, no `query_log` row; a pre-stream DB outage is a plain 503 JSON). A `tools=None` request never emits a `tool` frame; a round-capped turn whose final reply carries no visible content answers with the budget @@ -273,8 +302,11 @@ scripts.…`, and tests all honor it. question=… embed_ms=… top_score=… fts_hits=… summary_hits=… tuning=N kb_chars=N history_msgs=N threshold=… deflected=… sources=… thinking_chars=… tool_calls=N rounds=N cap_hit=0|1 total_ms=… - retries=N scaffold_stripped=N + retries=N scaffold_stripped=N verbatim_blocks=N ``` + (`verbatim_blocks=` — phase 182 — is the count of verbatim display blocks + actually SENT on the `done` frame, `0` on every turn without them, + deflected included.) (`sources=` = retrieval + agent-read docs, deduped; `tool_calls=` executed only; a cancelled turn writes neither line nor `query_log` row.) diff --git a/.agents/phases/todo/182_verbatim_show_text/00_phase.md b/.agents/phases/complete/182_verbatim_show_text/00_phase.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/00_phase.md rename to .agents/phases/complete/182_verbatim_show_text/00_phase.md diff --git a/.agents/phases/todo/182_verbatim_show_text/01_settings_and_kill_switch.md b/.agents/phases/complete/182_verbatim_show_text/01_settings_and_kill_switch.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/01_settings_and_kill_switch.md rename to .agents/phases/complete/182_verbatim_show_text/01_settings_and_kill_switch.md diff --git a/.agents/phases/todo/182_verbatim_show_text/02_verbatim_resolver_module.md b/.agents/phases/complete/182_verbatim_show_text/02_verbatim_resolver_module.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/02_verbatim_resolver_module.md rename to .agents/phases/complete/182_verbatim_show_text/02_verbatim_resolver_module.md diff --git a/.agents/phases/todo/182_verbatim_show_text/03_show_text_tool.md b/.agents/phases/complete/182_verbatim_show_text/03_show_text_tool.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/03_show_text_tool.md rename to .agents/phases/complete/182_verbatim_show_text/03_show_text_tool.md diff --git a/.agents/phases/todo/182_verbatim_show_text/04_prompt_teaching_clause.md b/.agents/phases/complete/182_verbatim_show_text/04_prompt_teaching_clause.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/04_prompt_teaching_clause.md rename to .agents/phases/complete/182_verbatim_show_text/04_prompt_teaching_clause.md diff --git a/.agents/phases/todo/182_verbatim_show_text/05_done_frame_and_persistence.md b/.agents/phases/complete/182_verbatim_show_text/05_done_frame_and_persistence.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/05_done_frame_and_persistence.md rename to .agents/phases/complete/182_verbatim_show_text/05_done_frame_and_persistence.md diff --git a/.agents/phases/todo/182_verbatim_show_text/06_markdown_locator_and_panel_css.md b/.agents/phases/complete/182_verbatim_show_text/06_markdown_locator_and_panel_css.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/06_markdown_locator_and_panel_css.md rename to .agents/phases/complete/182_verbatim_show_text/06_markdown_locator_and_panel_css.md diff --git a/.agents/phases/todo/182_verbatim_show_text/07_hydration_and_copy_buttons.md b/.agents/phases/complete/182_verbatim_show_text/07_hydration_and_copy_buttons.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/07_hydration_and_copy_buttons.md rename to .agents/phases/complete/182_verbatim_show_text/07_hydration_and_copy_buttons.md diff --git a/.agents/phases/todo/182_verbatim_show_text/08_e2e_and_docs_pass.md b/.agents/phases/complete/182_verbatim_show_text/08_e2e_and_docs_pass.md similarity index 100% rename from .agents/phases/todo/182_verbatim_show_text/08_e2e_and_docs_pass.md rename to .agents/phases/complete/182_verbatim_show_text/08_e2e_and_docs_pass.md diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md new file mode 100644 index 0000000..428828c --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md @@ -0,0 +1 @@ +(no final assistant message — see the .err log) diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md.status new file mode 100644 index 0000000..65a791b --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.md.status @@ -0,0 +1 @@ +error: no final assistant text diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.validate new file mode 100644 index 0000000..04830a0 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a1.validate @@ -0,0 +1,143 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 4%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 9%] +........................................................................ [ 11%] +........................................................................ [ 12%] +........................................................................ [ 14%] +........................................................................ [ 16%] +........................................................................ [ 17%] +........................................................................ [ 19%] +........................................................................ [ 20%] +........................................................................ [ 22%] +........................................................................ [ 24%] +........................................................................ [ 25%] +........................................................................ [ 27%] +........................................................................ [ 28%] +........................................................................ [ 30%] +........................................................................ [ 32%] +........................................................................ [ 33%] +........................................................................ [ 35%] +........................................................................ [ 36%] +........................................................................ [ 38%] +........................................................................ [ 40%] +........................................................................ [ 41%] +........................................................................ [ 43%] +........................................................................ [ 44%] +........................................................................ [ 46%] +........................................................................ [ 48%] +........................................................................ [ 49%] +........................................................................ [ 51%] +........................................................................ [ 53%] +........................................................................ [ 54%] +........................................................................ [ 56%] +........................................................................ [ 57%] +........................................................................ [ 59%] +........................................................................ [ 61%] +........................................................................ [ 62%] +........................................................................ [ 64%] +........................................................................ [ 65%] +........................................................................ [ 67%] +........................................................................ [ 69%] +........................................................................ [ 70%] +........................................................................ [ 72%] +........................................................................ [ 73%] +........................................................................ [ 75%] +........................................................................ [ 77%] +........................................................................ [ 78%] +........................................................................ [ 80%] +........................................................................ [ 81%] +........................................................................ [ 83%] +........................................................................ [ 85%] +........................................................................ [ 86%] +........................................................................ [ 88%] +........................................................................ [ 89%] +........................................................................ [ 91%] +........................................................................ [ 93%] +........................................................................ [ 94%] +........................................................................ [ 96%] +........................................................................ [ 97%] +........................................................................ [ 99%] +................... [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 292 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 494 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 162 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/rag/verbatim.py 160 0 100% +app/schemas.py 549 0 100% +-------------------------------------------------- +TOTAL 6849 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md new file mode 100644 index 0000000..7a6e811 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md @@ -0,0 +1,10 @@ +**Phase 182 — final verification pass (all 8 tasks already complete; this was verification + docs + one defect fix).** + +- Verified: `app/rag/verbatim.py` (locator grammar, `splitlines()` slice, line-boundary cap, `resolve_answer_blocks`), `SHOW_TEXT_TOOL` + `shown_texts`, `SHOW_TEXT_CLAUSE`, `done.answer_text` (9 fields, key dropped when empty) + `ChatMessageRecord.answer_text` (≤50, 600 000-char cap counted in the 8 M budget), `verbatim.js` + 4 `{verbatim:true}` renderers, `Containerfile` minify step, `.env.example` 3 vars. +- `uv run python -c "…answer_text, show_text_max_chars, show_text_max_blocks"` → `True 12000 5`; each negative refuses startup naming its field; `0` accepted as inert ✅ +- `bash .agents/validate.sh` → **validation OK**: 4320 unit+integration tests green, `TOTAL 6849 17 → 99%` (gate app/ >90% OK), `ruff check .` "All checks passed!", `pyright` 0 errors (re-run after my edits, 08:28). +- E2E, each in isolation `--no-cov`: `test_verbatim_show_text.py` 13 passed (panel bytes == `documents.content`, server caption, clipboard == server string, `/document.html?source=…&path=…`, honest unresolved state, reload+share, `show_image` regression, flag-off app) ✅; green: `test_answer_images` `test_harness_aligned_tools` `test_agent_document_tools` `test_markdown_tables` `test_markdown_inline_links_images` `test_svg_document_preview` `test_smoke` `test_document_viewer` `test_markdown_blockquotes` `test_chat_persistence` `test_thinking_timeline` `test_chat_rag` `test_settings_mobile_value_width`. +- **Defect found & fixed (pre-existing, not phase 182):** `tests/e2e/test_admin_settings_panel.py::test_admin_sees_groups_and_source_badges` failed — its whole-page `assert "reese" not in page.content()` tripped on the shell's onboarding chips, which follow the newest saved chats in the one shared E2E DB (a leftover `reeselink.json` question from a tool suite). Scoped the strict sweep to `.settings-shell` and kept a whole-page `reese:reese` credential needle → 12 passed with the leftovers still present. +- Docs: README fixed 2 inconsistencies — Quick Start omitted the **required** `BOR_ADMIN_PASSWORD`/`BOR_SESSION_SECRET` (the app fail-loud refuses boot) and the broken anchor `#chat--` → `#chat-`; full re-read of README (1816 lines) + AGENTS confirmed the phase-182 feature/settings/log/UI-contract text matches the code, and every `.env.example` var + every `Settings` field is documented. +- Notable: kept `resolve_answer_blocks` synchronous on the SSE terminal path (bounded indexed SELECTs, matching the existing `query_log` precedent and the phase's documented fence-lookup bound); no live-infra changes made. +- Next pending phase: none — `todo/` holds only 182 (its 8 task files are in `complete/`; the harness commits + moves `00_phase.md`). diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.validate new file mode 100644 index 0000000..04830a0 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__00_phase.a2.validate @@ -0,0 +1,143 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 4%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 9%] +........................................................................ [ 11%] +........................................................................ [ 12%] +........................................................................ [ 14%] +........................................................................ [ 16%] +........................................................................ [ 17%] +........................................................................ [ 19%] +........................................................................ [ 20%] +........................................................................ [ 22%] +........................................................................ [ 24%] +........................................................................ [ 25%] +........................................................................ [ 27%] +........................................................................ [ 28%] +........................................................................ [ 30%] +........................................................................ [ 32%] +........................................................................ [ 33%] +........................................................................ [ 35%] +........................................................................ [ 36%] +........................................................................ [ 38%] +........................................................................ [ 40%] +........................................................................ [ 41%] +........................................................................ [ 43%] +........................................................................ [ 44%] +........................................................................ [ 46%] +........................................................................ [ 48%] +........................................................................ [ 49%] +........................................................................ [ 51%] +........................................................................ [ 53%] +........................................................................ [ 54%] +........................................................................ [ 56%] +........................................................................ [ 57%] +........................................................................ [ 59%] +........................................................................ [ 61%] +........................................................................ [ 62%] +........................................................................ [ 64%] +........................................................................ [ 65%] +........................................................................ [ 67%] +........................................................................ [ 69%] +........................................................................ [ 70%] +........................................................................ [ 72%] +........................................................................ [ 73%] +........................................................................ [ 75%] +........................................................................ [ 77%] +........................................................................ [ 78%] +........................................................................ [ 80%] +........................................................................ [ 81%] +........................................................................ [ 83%] +........................................................................ [ 85%] +........................................................................ [ 86%] +........................................................................ [ 88%] +........................................................................ [ 89%] +........................................................................ [ 91%] +........................................................................ [ 93%] +........................................................................ [ 94%] +........................................................................ [ 96%] +........................................................................ [ 97%] +........................................................................ [ 99%] +................... [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 292 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 494 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 162 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/rag/verbatim.py 160 0 100% +app/schemas.py 549 0 100% +-------------------------------------------------- +TOTAL 6849 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md new file mode 100644 index 0000000..22d3422 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md @@ -0,0 +1,19 @@ +**Implemented (task 01 — settings + kill switch, inert)** +- `app/config.py`: `answer_text: bool = True` (master switch, default ON, docstring names the env var + the exact off-state), `show_text_max_chars: int = 12_000`, `show_text_max_blocks: int = 5`, plus two `@field_validator`s (`…_non_negative`) that fail startup naming the field; `0` accepted as inert. +- `app/core/settings_catalog.py`: three `SettingMeta` rows in the `Agent tools` group (`Answer text` / `Show text max chars` / `Show text max blocks`), plain — not secret, not restart-required, overridable. +- `.env.example`: `BOR_ANSWER_TEXT=true`, `BOR_SHOW_TEXT_MAX_CHARS=12000`, `BOR_SHOW_TEXT_MAX_BLOCKS=5` in the agent-tools block with the `0`/negative semantics (dotenv-parsed and verified). +- Tests: 5 new unit cases (`test_config.py`: defaults, env overrides, `0` inert, each negative refuses naming the field), 2 new catalogue pins (row group/label/flags + annotation/defaults), 1 new integration row-contract (`GET` shape, raw PUT → live, `0` storable, negative → 422 storing nothing, DELETE → default, anon 403), 1 new live-apply test (`_save` + `invalidate_settings()` → resolves without restart, reset returns defaults). No consumer reads the fields — no app behavior touched. +- Stale-doc fix in previously-completed work: hard-coded "78 items/rows/settings" prose (already wrong at 79) made generic in `app/api/admin_settings.py`, `tests/integration/test_admin_settings_api.py`, `tests/e2e/test_admin_settings_panel.py`, `tests/e2e/test_settings_mobile_value_width.py`. + +**Gates (all green)** +- `uv run pytest` → **4274 passed** (unit + integration). +- `uv run pytest --cov=app --cov-report=term-missing` → **TOTAL 99%**; `app/config.py` 100%, `app/core/settings_catalog.py` 100%, `app/api/admin_settings.py` 100%. +- `uv run ruff check .` → All checks passed; `uv run pyright` → 0 errors. +- `uv run pytest tests/e2e/test_admin_settings_panel.py -v --no-cov` → 12 passed in isolation (the generated panel renders the three new rows). +- Criteria checks: `get_settings()` prints `True 12000 5`; `BOR_SHOW_TEXT_MAX_CHARS=-1` / `BOR_SHOW_TEXT_MAX_BLOCKS=-1` each raise naming their field. + +**Docs**: README env table — three new rows in *Agent tools* (ON-by-default rationale, line-boundary truncation, `0` = inert, negative refuses startup). No AGENTS.md change needed (it carries no env table; rule 5's verbatim-panel UI contract belongs to the phase's later/final task). + +**Notable decisions**: budgets use the `>= 0` family (`0` = inert) rather than `> 0`, per LOCKED A8; block-cap error text is `must be >= 0 (blocks)`. No new consumers, no schemas/agent/prompts/frontend touched. + +**Next pending task**: `.agents/phases/todo/182_verbatim_show_text/02_verbatim_resolver_module.md`. diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.validate new file mode 100644 index 0000000..467fd90 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__01_settings_and_kill_switch.a1.validate @@ -0,0 +1,139 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 5%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 10%] +........................................................................ [ 11%] +........................................................................ [ 13%] +........................................................................ [ 15%] +........................................................................ [ 16%] +........................................................................ [ 18%] +........................................................................ [ 20%] +........................................................................ [ 21%] +........................................................................ [ 23%] +........................................................................ [ 25%] +........................................................................ [ 26%] +........................................................................ [ 28%] +........................................................................ [ 30%] +........................................................................ [ 32%] +........................................................................ [ 33%] +........................................................................ [ 35%] +........................................................................ [ 37%] +........................................................................ [ 38%] +........................................................................ [ 40%] +........................................................................ [ 42%] +........................................................................ [ 43%] +........................................................................ [ 45%] +........................................................................ [ 47%] +........................................................................ [ 48%] +........................................................................ [ 50%] +........................................................................ [ 52%] +........................................................................ [ 53%] +........................................................................ [ 55%] +........................................................................ [ 57%] +........................................................................ [ 58%] +........................................................................ [ 60%] +........................................................................ [ 62%] +........................................................................ [ 64%] +........................................................................ [ 65%] +........................................................................ [ 67%] +........................................................................ [ 69%] +........................................................................ [ 70%] +........................................................................ [ 72%] +........................................................................ [ 74%] +........................................................................ [ 75%] +........................................................................ [ 77%] +........................................................................ [ 79%] +........................................................................ [ 80%] +........................................................................ [ 82%] +........................................................................ [ 84%] +........................................................................ [ 85%] +........................................................................ [ 87%] +........................................................................ [ 89%] +........................................................................ [ 90%] +........................................................................ [ 92%] +........................................................................ [ 94%] +........................................................................ [ 96%] +........................................................................ [ 97%] +........................................................................ [ 99%] +.......................... [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 280 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 454 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 156 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/schemas.py 533 0 100% +-------------------------------------------------- +TOTAL 6615 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md new file mode 100644 index 0000000..4c3682d --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md @@ -0,0 +1,21 @@ +All gates green. Final report: + +**Implemented** +- `app/rag/verbatim.py` (new, inert — nothing imports it yet): `LOCATOR_LANG`, frozen `VerbatimBlock` / `SliceResult`, `canonical_locator` (tolerant `source/path` + ` `/`:`/`#`/`#L` + `12-40`/`12–40`/`L12-L40`/bare `12` → one canonical `source/path#start-end`, refuses no-source, empty, non-positive/reversed/non-numeric bounds, trailing junk, leading `bor`), `fences_in` (order-preserving, first-occurrence dedupe, bare `` ```bor `` not swallowed, unclosed fence yields nothing, body discarded), `slice_lines` (`read`/`grep`-identical 1-based semantics, clamping, `past_end` + true total), `cap_slice` (line-boundary cut + shared `TRUNCATION_MARKER`, mid-line exception documented, `cap<=0` raises), `document_by_identity` (bare first-slash `(source, path)` lookup, no agent import), `block_for` (refuses missing/image/past-end; canonical locator incl. cap-derived range), `resolve_answer_blocks` (kill switches first, fences-then-unlocated-shown order, fence wins dedupe, block-budget truncation). +- One-way import rule enforced: no `app.rag.agent` import (AST test + clean `grep -n import`). +- `tests/unit/test_verbatim_resolver.py`: 79 tests (grammar, fences, slicing, capping, identity, block, resolver fusion, every kill-switch combination, AST import rule), house style — detached `Document` rows + stand-in session like `tests/unit/test_agent.py`. + +**Verification** +- `uv run pytest tests/unit/test_verbatim_resolver.py -v` → 78→79 passed; `--cov=app.rag.verbatim` → **100%** +- `uv run pytest --cov=app --cov-report=term-missing` → **4353 passed**, TOTAL **99%** (>90%) +- `uv run ruff check .` → All checks passed; `uv run pyright` → 0 errors +- `python -c "…canonical_locator('homelab/a.md#L12-L40')"` → `homelab/a.md#12-40` ✓ + +**Docs**: no doc impact (task states nothing user-visible yet; the module is unwired — tasks 03/05 hook it in, phase's final pass re-checks README/AGENTS). + +**Notes/deviations** +- Mid-session the repo was replayed under this run (HEAD now `814a400` phase 181, task 01 complete, `app/services/answer_text.py` superseded): I implemented the current task file's `app/rag/verbatim.py` spec against the live tree; earlier stale-tree work was discarded and left untouched. +- `canonical_locator` refuses a range on a whitespace-bearing identity (documented grammar limit) and keeps one defensive non-numeric-bound guard (tested via monkeypatched grammar) so the parser stays total. +- No live-infrastructure actions taken. + +**Next pending task**: `.agents/phases/todo/182_verbatim_show_text/03_show_text_tool.md` diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.validate new file mode 100644 index 0000000..e26c41b --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__02_verbatim_resolver_module.a1.validate @@ -0,0 +1,141 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 4%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 9%] +........................................................................ [ 11%] +........................................................................ [ 13%] +........................................................................ [ 14%] +........................................................................ [ 16%] +........................................................................ [ 18%] +........................................................................ [ 19%] +........................................................................ [ 21%] +........................................................................ [ 23%] +........................................................................ [ 24%] +........................................................................ [ 26%] +........................................................................ [ 28%] +........................................................................ [ 29%] +........................................................................ [ 31%] +........................................................................ [ 33%] +........................................................................ [ 34%] +........................................................................ [ 36%] +........................................................................ [ 38%] +........................................................................ [ 39%] +........................................................................ [ 41%] +........................................................................ [ 43%] +........................................................................ [ 44%] +........................................................................ [ 46%] +........................................................................ [ 47%] +........................................................................ [ 49%] +........................................................................ [ 51%] +........................................................................ [ 52%] +........................................................................ [ 54%] +........................................................................ [ 56%] +........................................................................ [ 57%] +........................................................................ [ 59%] +........................................................................ [ 61%] +........................................................................ [ 62%] +........................................................................ [ 64%] +........................................................................ [ 66%] +........................................................................ [ 67%] +........................................................................ [ 69%] +........................................................................ [ 71%] +........................................................................ [ 72%] +........................................................................ [ 74%] +........................................................................ [ 76%] +........................................................................ [ 77%] +........................................................................ [ 79%] +........................................................................ [ 81%] +........................................................................ [ 82%] +........................................................................ [ 84%] +........................................................................ [ 86%] +........................................................................ [ 87%] +........................................................................ [ 89%] +........................................................................ [ 90%] +........................................................................ [ 92%] +........................................................................ [ 94%] +........................................................................ [ 95%] +........................................................................ [ 97%] +........................................................................ [ 99%] +................................. [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 280 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 454 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 156 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/rag/verbatim.py 155 0 100% +app/schemas.py 533 0 100% +-------------------------------------------------- +TOTAL 6770 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md new file mode 100644 index 0000000..593e656 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md @@ -0,0 +1,9 @@ +**Task 03 complete — `show_text` agent tool.** + +- `app/rag/agent.py`: `SHOW_TEXT_TOOL` (exact task copy, after `SHOW_IMAGE_TOOL`), `agent_tools()` appends it when `answer_text` (offer order `ls, read, grep, show_image, show_text`; base three + pre-phase offers byte-identical), `AgentHolder.shown_texts`, and the `_execute_tool` branch in the exact 8-step order (path → flag-off `UNKNOWN_TOOL` → `_resolve_path` → A6 image refusal → reused `_read_range_args`/`BAD_RANGE_ARGS`/`OFFSET_PAST_END` → block budget before the work → `block_for` + canonical-locator dedupe → success result with the `read`/`show_image` header contract, `_origin_lines`, server-clamped `lines:` extent, `SHOWN_TEXT_TRUNCATION_NOTICE` on cap); module docstring extended with the A1–A3/A6 contract. +- `SHOW_TEXT_*` refusals: 4 constants, each used by exactly one branch (agent.py:2248/2265/2286/2310). +- Tests: +18 in `tests/unit/test_agent.py` (`-k show_text`: 18 passed) — offer matrix, tool-definition contract, refusal-copy pins, whole/ranged/capped shows, origin lines, 10 refusal cases with counting assertions, scripted-turn wiring (2nd line `Document …`, `lines: 3-5 of 5` matching the slice). +- Deliberate offer-array pin updates (each commented): `test_chat_gate.py`, `test_image_chips_and_answers.py`, `test_agent.py`, `test_chat_api.py`, `test_agent_tools.py`, `test_read_line_ranges_handbook.py`, e2e `test_answer_images.py`; leak-guard env pins added to `tests/conftest.py` + `tests/e2e/conftest.py` (`BOR_ANSWER_TEXT`/`_MAX_CHARS`/`_MAX_BLOCKS` code defaults). +- `README.md`: `show_text` row in the agent-tools table, new “Verbatim text display (phase 182)” section, cross-ref in the image table (settings rows already documented by task 01). No `chat_api.py`/`chat.js`/template touched. +- Gates: `uv run pytest` → **4371 passed**; coverage `app/` **99%** TOTAL (agent.py 99%, only pre-existing line 1312 missing; verbatim.py 100%); ruff + pyright clean; E2E in isolation: `test_answer_images.py` 5 passed, plus `agent_document_tools`/`harness_aligned_tools`/`tool_budget_telemetry`/`read_truncation_cap`/`search_tool_scope` all green. +- No git index/history mutations; phase stays in `todo/` (tasks 04–06 remain). diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.validate new file mode 100644 index 0000000..5e9119a --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__03_show_text_tool.a1.validate @@ -0,0 +1,141 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 4%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 9%] +........................................................................ [ 11%] +........................................................................ [ 13%] +........................................................................ [ 14%] +........................................................................ [ 16%] +........................................................................ [ 18%] +........................................................................ [ 19%] +........................................................................ [ 21%] +........................................................................ [ 23%] +........................................................................ [ 24%] +........................................................................ [ 26%] +........................................................................ [ 28%] +........................................................................ [ 29%] +........................................................................ [ 31%] +........................................................................ [ 32%] +........................................................................ [ 34%] +........................................................................ [ 36%] +........................................................................ [ 37%] +........................................................................ [ 39%] +........................................................................ [ 41%] +........................................................................ [ 42%] +........................................................................ [ 44%] +........................................................................ [ 46%] +........................................................................ [ 47%] +........................................................................ [ 49%] +........................................................................ [ 51%] +........................................................................ [ 52%] +........................................................................ [ 54%] +........................................................................ [ 56%] +........................................................................ [ 57%] +........................................................................ [ 59%] +........................................................................ [ 60%] +........................................................................ [ 62%] +........................................................................ [ 64%] +........................................................................ [ 65%] +........................................................................ [ 67%] +........................................................................ [ 69%] +........................................................................ [ 70%] +........................................................................ [ 72%] +........................................................................ [ 74%] +........................................................................ [ 75%] +........................................................................ [ 77%] +........................................................................ [ 79%] +........................................................................ [ 80%] +........................................................................ [ 82%] +........................................................................ [ 84%] +........................................................................ [ 85%] +........................................................................ [ 87%] +........................................................................ [ 88%] +........................................................................ [ 90%] +........................................................................ [ 92%] +........................................................................ [ 93%] +........................................................................ [ 95%] +........................................................................ [ 97%] +........................................................................ [ 98%] +................................................... [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 280 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 494 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 156 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/rag/verbatim.py 155 0 100% +app/schemas.py 533 0 100% +-------------------------------------------------- +TOTAL 6810 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md new file mode 100644 index 0000000..d8ca008 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md @@ -0,0 +1,15 @@ +**Task 04 complete — `SHOW_TEXT_CLAUSE` taught, gated, byte-identical when off.** + +- `app/rag/prompts.py`: new `SHOW_TEXT_CLAUSE` (locked 7-part copy: display contract → SEE/COPY/RUN → do-NOT-retype → ` ```bor [range] ` with EMPTY body → server owns the numbers → refuse out loud → `show_image` pointer) + module-docstring paragraph. +- `build_high_prompt(show_text=…)`: clause rides INSIDE `` after `SHOW_IMAGE_CLAUSE` via one "section minus final `` + clauses + tag" mechanism; `TOOLS_SECTION` untouched; all 4 flag combos pinned. +- `app/api/chat.py`: grounded `TurnPlan` passes `show_text=settings.answer_text` beside `show_image`. +- Tests: +7 in `test_prompts.py` (locked sentence order, byte-identity when off, inside-`` placement, clause composition, deflect never carries `show_text`/`bor`), +2 sha/composition locks in `test_prompt_lock.py`, +1 grounded integration pin in `test_chat_api.py` (clause **and** tool offered together: 3 tools off / 4 on). +- Fixed pre-existing fallout of task 03 in prompt-reconstruction pins: `test_kb_overview_api.py` (×2), `test_image_chips_and_answers.py`. +- **Defect fixed (deviation, deliberate):** `tests/e2e/mock_llm.py`'s SHOW_IMAGE flow gated on the loose `"show_image" in system`, which the locked text clause now matches → phase-124 toggle-off E2E failed. Tightened to `_SHOW_IMAGE_CLAUSE_MARKER` (a sentence only the image clause carries); intent unchanged, ON app fires exactly as before. Mock triggers for phase 182 still deferred to task 08. +- Env note: a **stale `mock_llm` uvicorn from Oct 14 held port 8901** and served old mock code; killed it (test-double artifact, not live infra). + +Gates: `uv run pytest --cov=app --cov-report=term-missing` → **4381 passed**, `app/` **99 %** (`prompts.py` 100 %). `uv run ruff check .` → clean; `uv run pyright` → 0 errors. E2E in isolation `--no-cov`: `test_answer_images.py`, `test_harness_aligned_tools.py`, `test_agent_document_tools.py`, `test_markdown_tables.py` all green. Criterion one-liner: `show_text=True` → `True`, default → `False`. + +Docs: README "Verbatim text display (phase 182)" gained a *What the prompt teaches* bullet (copy-from-display rule + `bor` fence syntax + omit-the-range rule) and the off-state bullet now names the absent clause; SEE/COPY/RUN wording aligned. No AGENTS.md change (its rule-5 UI list lands with tasks 06/08). + +Next pending task: `.agents/phases/todo/182_verbatim_show_text/05_done_frame_and_persistence.md`. diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.validate new file mode 100644 index 0000000..f133ad6 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__04_prompt_teaching_clause.a1.validate @@ -0,0 +1,141 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 4%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 9%] +........................................................................ [ 11%] +........................................................................ [ 13%] +........................................................................ [ 14%] +........................................................................ [ 16%] +........................................................................ [ 18%] +........................................................................ [ 19%] +........................................................................ [ 21%] +........................................................................ [ 23%] +........................................................................ [ 24%] +........................................................................ [ 26%] +........................................................................ [ 27%] +........................................................................ [ 29%] +........................................................................ [ 31%] +........................................................................ [ 32%] +........................................................................ [ 34%] +........................................................................ [ 36%] +........................................................................ [ 37%] +........................................................................ [ 39%] +........................................................................ [ 41%] +........................................................................ [ 42%] +........................................................................ [ 44%] +........................................................................ [ 46%] +........................................................................ [ 47%] +........................................................................ [ 49%] +........................................................................ [ 50%] +........................................................................ [ 52%] +........................................................................ [ 54%] +........................................................................ [ 55%] +........................................................................ [ 57%] +........................................................................ [ 59%] +........................................................................ [ 60%] +........................................................................ [ 62%] +........................................................................ [ 64%] +........................................................................ [ 65%] +........................................................................ [ 67%] +........................................................................ [ 69%] +........................................................................ [ 70%] +........................................................................ [ 72%] +........................................................................ [ 73%] +........................................................................ [ 75%] +........................................................................ [ 77%] +........................................................................ [ 78%] +........................................................................ [ 80%] +........................................................................ [ 82%] +........................................................................ [ 83%] +........................................................................ [ 85%] +........................................................................ [ 87%] +........................................................................ [ 88%] +........................................................................ [ 90%] +........................................................................ [ 92%] +........................................................................ [ 93%] +........................................................................ [ 95%] +........................................................................ [ 96%] +........................................................................ [ 98%] +............................................................. [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 280 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 494 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 162 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/rag/verbatim.py 155 0 100% +app/schemas.py 533 0 100% +-------------------------------------------------- +TOTAL 6816 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md new file mode 100644 index 0000000..a2e0ab8 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md @@ -0,0 +1,20 @@ +**Task 05 complete — all gates green.** + +**Implemented** +- `app/schemas.py`: new `VerbatimBlockRef` (source/path/title/start_line/end_line/total_lines/text≤600 000/truncated/locator≤2100); `ChatDoneEvent.answer_text` + serializer POPs the key when `None`/empty (absent, never `null`/`[]`); `ChatMessage.answer_text` (cap 50) dropped by `_drop_image_when_absent`; docstrings in the `answer_image` style incl. the two deliberate differences (list + inline bytes, A4). +- `app/api/chat.py`: `visible_parts` accumulator beside `content_chars` (same post-filter pieces, never `thinking`); done-time `resolve_answer_blocks(...)` in a short-lived session, **skipped entirely on deflected turns** (D9), degrading to no-blocks + a named log line if the KB drops mid-answer; `answer_text=blocks or None`; per-turn line gains `verbatim_blocks=%d`; module docstring paragraph. +- Defect fixes in task 02's `app/rag/verbatim.py` (found by the new frame tests): `cap_slice` under-counted a slice ending on a blank line (`splitlines()`), so the caption lied by one line **and** the locator mismatched the same range resolved by `show_text`, making one block paint twice; dedupe now keys on the resolved locator as well as the written canonical; fence scan stops once `show_text_max_blocks` blocks are in (bounded lookups on the loop). +- `README.md`: `done.answer_text` wire contract + deflected/off semantics, payload-limit rows; `AGENTS.md` rule 10: `verbatim_blocks=N`. + +**Gates** +- `uv run pytest` → exit 0 (4398 collected); `uv run pytest --cov=app --cov-report=term-missing` → `app/schemas.py` 100 %, `app/rag/verbatim.py` 100 %, `app/api/chat.py` 99 % (only pre-existing miss: the SEC-14-04 concurrency 503 pre-check), TOTAL 99 %. +- `uv run ruff check .` clean; `uv run pyright` 0 errors. +- E2E in isolation (`--no-cov`, exit 0): `test_answer_images.py`, `test_harness_aligned_tools.py`+`test_agent_document_tools.py`+`test_markdown_tables.py`, `test_chat_persistence.py`/`test_share_chat.py`/`test_chat_rag.py`. +- New tests: 3 gate unit + field-order pin, 8 chat-API integration (tool block, fence-only, fence+tool dedupe, max_blocks=2 order, byte-identity, `answer_text=False`, deflected, resolution-failure degradation), 4 chats-API persistence, 6 schema, 2 resolver defect pins. +- Byte budget (phase-167 audit): observed `api method=POST path=/api/chat status=200 bytes=1272 enc=identity stream=1` on a `show_text` turn; worst-case frame (5 × 12 000-char blocks + long paths) ≈ 65 KB ≈ 25 % of the 256 KB budget — no concern. + +**Deviations to note** +1. `_require_within_total_budget` now also sums block bytes (task work-item 5 said existing validators don't change): `POST/PUT /api/chats` is anonymous (phase 55) and `answer_text[].text` carries the 600 000 cap, so without this the 8 000 000 SEC-05 invariant gains an unbounded second byte channel. Tightening only — no legitimate record (5 × 12 000 = 60 KB) is affected; pinned by `test_saved_chat_total_budget_counts_verbatim_block_text`. +2. The `verbatim.py` fixes above touch task 02's module (behaviour bug, not a spec change) — pinned in `tests/unit/test_verbatim_resolver.py`. + +**Next pending task:** `.agents/phases/todo/182_verbatim_show_text/06_markdown_locator_and_panel_css.md`. diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.validate new file mode 100644 index 0000000..32241a8 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__05_done_frame_and_persistence.a1.validate @@ -0,0 +1,142 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 4%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 9%] +........................................................................ [ 11%] +........................................................................ [ 13%] +........................................................................ [ 14%] +........................................................................ [ 16%] +........................................................................ [ 17%] +........................................................................ [ 19%] +........................................................................ [ 21%] +........................................................................ [ 22%] +........................................................................ [ 24%] +........................................................................ [ 26%] +........................................................................ [ 27%] +........................................................................ [ 29%] +........................................................................ [ 31%] +........................................................................ [ 32%] +........................................................................ [ 34%] +........................................................................ [ 35%] +........................................................................ [ 37%] +........................................................................ [ 39%] +........................................................................ [ 40%] +........................................................................ [ 42%] +........................................................................ [ 44%] +........................................................................ [ 45%] +........................................................................ [ 47%] +........................................................................ [ 49%] +........................................................................ [ 50%] +........................................................................ [ 52%] +........................................................................ [ 53%] +........................................................................ [ 55%] +........................................................................ [ 57%] +........................................................................ [ 58%] +........................................................................ [ 60%] +........................................................................ [ 62%] +........................................................................ [ 63%] +........................................................................ [ 65%] +........................................................................ [ 66%] +........................................................................ [ 68%] +........................................................................ [ 70%] +........................................................................ [ 71%] +........................................................................ [ 73%] +........................................................................ [ 75%] +........................................................................ [ 76%] +........................................................................ [ 78%] +........................................................................ [ 80%] +........................................................................ [ 81%] +........................................................................ [ 83%] +........................................................................ [ 84%] +........................................................................ [ 86%] +........................................................................ [ 88%] +........................................................................ [ 89%] +........................................................................ [ 91%] +........................................................................ [ 93%] +........................................................................ [ 94%] +........................................................................ [ 96%] +........................................................................ [ 98%] +........................................................................ [ 99%] +............... [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 292 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 494 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 162 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/rag/verbatim.py 160 0 100% +app/schemas.py 549 0 100% +-------------------------------------------------- +TOTAL 6849 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md new file mode 100644 index 0000000..d75bcf3 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md @@ -0,0 +1,24 @@ +**Task 06 complete — all gates green.** + +**Implemented** +- `frontend/assets/markdown.js`: `renderMarkdown(md, opts)` (2nd optional arg, `opts && opts.verbatim === true` the only truthy path); new step-0 verbatim pass BEFORE the fence pass using the pinned regex; body/info line/closer dropped, `\u0000VERBATIMn\u0000` placeholder restored as `
` + `verbatim-caption` + `role="status"` “Retrieving the exact text…”, everything through `escapeHtml`; unparseable locator returned byte-for-byte to the fence pass; new local `borLocator()` (client mirror of `app.rag.verbatim.canonical_locator`); paragraph guard gained the placeholder clause (pre-phase guard text untouched); header comment rewritten. +- `frontend/assets/styles.css`: one labelled phase-182 region — `.verbatim`, sticky `.verbatim-head`, clipped `.verbatim-caption`, text `.verbatim-badge` (`--ok`, `text-transform: none`), `.verbatim-body` (`max-height: min(40rem,70vh)`, `overflow:auto`, `white-space: pre`, `tab-size: 2`, `overflow-wrap: normal`), `user-select: none` `.verbatim-lines` gutter, `.verbatim-pending`/`.verbatim-state`, `.verbatim-unresolved` (badge hidden), `.code-block` + `.code-block-copy`/`.verbatim-copy` (pill, 3px focus ring, ellipsis label, `.copied`); palette vars only, nothing animates; `.code-block-copy`/`.verbatim-copy` lifted to 44px in the ≤640 block. +- New tests: `tests/unit/test_frontend_verbatim_markdown.py` (22: source pins + node behavioral + JS↔Python parity table + 400-case deterministic fuzz), `tests/unit/test_frontend_verbatim_css.py` (20). + +**Gates** +- `uv run pytest` → **4449 passed**; `uv run pytest --cov=app --cov-report=term-missing` → **TOTAL 99%** (`app/rag/verbatim.py` 100%, no new `app/` code); `uv run ruff check .` → All checks passed; `uv run pyright` → 0 errors. +- New files in isolation: `uv run pytest tests/unit/test_frontend_verbatim_markdown.py tests/unit/test_frontend_verbatim_css.py -v` green. +- E2E in isolation (`--no-cov`): `test_markdown_tables.py`, `test_markdown_blockquotes.py`, `test_markdown_inline_links_images.py`, `test_document_viewer.py`, `test_answer_images.py`, `test_thinking_display.py`, `test_background_no_motion.py` all green. +- Live browser check against the served app: `{verbatim:true}` → `data-bor-locator="homelab/a.md#12-40"`, no `GARBAGE` in the HTML and none in the painted DOM; sticky head, 70vh-capped scroll body, `user-select: none` gutter, badge `VERBATIM`, copy pill 32px desktop → 44px at 375px. + +**Docs**: README — new chat-section paragraph (opt-in pass + pass order) and a “The client never paints the model’s copy” bullet in §Verbatim text display; AGENTS.md rule 5 — the verbatim-panel contract (“verbatim-and-badged OR plainly the model’s”). + +**Decisions / deviations** +1. Criterion #2’s “OFF returns the ordinary `
`”: a ` ```bor  ` info string has *never* matched the fence rule (`/```(\w*)\n/`), so OFF is escaped prose — pinned byte-identical to pre-phase; a bare ` ```bor ` fence still yields `
`. Widening the fence rule was rejected (it would change every existing call site, violating the byte-identity mandate).
+2. Implemented the pinned regex verbatim: `(?![\s\S])` covers a fence open exactly at end-of-input (info line typed, body not yet streamed); a half-typed *body* renders as ordinary text until its closer arrives — same as every incomplete fence today. Documented in header + code comment.
+3. Added the `VERBATIM`-placeholder clause to the paragraph guard so the restored `
` isn’t wrapped in `

`; the pre-phase guard string is untouched (phase-180 pin stays green). +4. Went beyond the task’s testing note by pinning locator parity in a unit test (table + deterministic fuzz) — parity is hydration-critical and checkable without a browser. +5. Dropped `scrollbar-color` from `.verbatim-body`: `test_prose_word_wrap.py` pins scrollbar theming as modal-only (phase 116). +6. Fixed a stale pin in `tests/unit/test_document_viewer.py` (`function renderMarkdown(md)` → `function renderMarkdown(md`), broken by the new signature. + +**Next pending task**: `182_verbatim_show_text/07_hydration_and_copy_buttons.md` (opts the three answer renderers in, adds `verbatim.js` hydration + Copy buttons). diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.validate new file mode 100644 index 0000000..2254383 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__06_markdown_locator_and_panel_css.a1.validate @@ -0,0 +1,142 @@ +........................................................................ [ 1%] +........................................................................ [ 3%] +........................................................................ [ 4%] +........................................................................ [ 6%] +........................................................................ [ 8%] +........................................................................ [ 9%] +........................................................................ [ 11%] +........................................................................ [ 12%] +........................................................................ [ 14%] +........................................................................ [ 16%] +........................................................................ [ 17%] +........................................................................ [ 19%] +........................................................................ [ 21%] +........................................................................ [ 22%] +........................................................................ [ 24%] +........................................................................ [ 25%] +........................................................................ [ 27%] +........................................................................ [ 29%] +........................................................................ [ 30%] +........................................................................ [ 32%] +........................................................................ [ 33%] +........................................................................ [ 35%] +........................................................................ [ 37%] +........................................................................ [ 38%] +........................................................................ [ 40%] +........................................................................ [ 42%] +........................................................................ [ 43%] +........................................................................ [ 45%] +........................................................................ [ 46%] +........................................................................ [ 48%] +........................................................................ [ 50%] +........................................................................ [ 51%] +........................................................................ [ 53%] +........................................................................ [ 55%] +........................................................................ [ 56%] +........................................................................ [ 58%] +........................................................................ [ 59%] +........................................................................ [ 61%] +........................................................................ [ 63%] +........................................................................ [ 64%] +........................................................................ [ 66%] +........................................................................ [ 67%] +........................................................................ [ 69%] +........................................................................ [ 71%] +........................................................................ [ 72%] +........................................................................ [ 74%] +........................................................................ [ 76%] +........................................................................ [ 77%] +........................................................................ [ 79%] +........................................................................ [ 80%] +........................................................................ [ 82%] +........................................................................ [ 84%] +........................................................................ [ 85%] +........................................................................ [ 87%] +........................................................................ [ 89%] +........................................................................ [ 90%] +........................................................................ [ 92%] +........................................................................ [ 93%] +........................................................................ [ 95%] +........................................................................ [ 97%] +........................................................................ [ 98%] +......................................................... [100%] +=============================== warnings summary =============================== +.venv/lib/python3.13/site-packages/fastapi/testclient.py:1 + /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.13.13-final-0 _______________ + +Name Stmts Miss Cover +-------------------------------------------------- +app/__init__.py 1 0 100% +app/api/__init__.py 0 0 100% +app/api/admin_settings.py 114 0 100% +app/api/auth.py 52 0 100% +app/api/chat.py 292 1 99% +app/api/chat_images.py 52 0 100% +app/api/chats.py 111 0 100% +app/api/config.py 13 0 100% +app/api/doc_drafts.py 99 0 100% +app/api/docs.py 239 1 99% +app/api/git_sources.py 259 0 100% +app/api/health.py 10 0 100% +app/api/steering.py 42 0 100% +app/api/suggestions.py 33 0 100% +app/api/sync.py 204 0 100% +app/api/tokens.py 40 0 100% +app/api/ui_settings.py 55 0 100% +app/config.py 304 0 100% +app/core/__init__.py 0 0 100% +app/core/auth.py 45 0 100% +app/core/caching.py 124 0 100% +app/core/compression.py 59 0 100% +app/core/debugging.py 29 2 93% +app/core/docs_push.py 43 0 100% +app/core/errors.py 5 0 100% +app/core/http_cache.py 22 0 100% +app/core/logging.py 13 0 100% +app/core/rate_limit.py 44 0 100% +app/core/response_budget.py 63 0 100% +app/core/security_headers.py 20 0 100% +app/core/settings_catalog.py 18 0 100% +app/core/settings_migrate.py 32 0 100% +app/core/settings_overlay.py 111 0 100% +app/core/theming.py 40 0 100% +app/core/tokens.py 44 0 100% +app/db.py 22 0 100% +app/main.py 105 0 100% +app/models.py 141 0 100% +app/rag/__init__.py 0 0 100% +app/rag/agent.py 494 1 99% +app/rag/archive_upload.py 134 0 100% +app/rag/chunker.py 220 4 98% +app/rag/doc_dates.py 18 0 100% +app/rag/folder_summaries.py 134 0 100% +app/rag/git_sources.py 77 0 100% +app/rag/importer.py 855 4 99% +app/rag/llm.py 253 1 99% +app/rag/md_images.py 63 0 100% +app/rag/overview.py 78 0 100% +app/rag/pdf.py 192 0 100% +app/rag/prompts.py 162 0 100% +app/rag/retriever.py 252 3 99% +app/rag/scaffolding.py 55 0 100% +app/rag/source_removal.py 41 0 100% +app/rag/sources_meta.py 16 0 100% +app/rag/suggestions.py 27 0 100% +app/rag/summarizer.py 58 0 100% +app/rag/svg_text.py 111 0 100% +app/rag/verbatim.py 160 0 100% +app/schemas.py 549 0 100% +-------------------------------------------------- +TOTAL 6849 17 99% +coverage gate: app/ 99% (>90%) OK +All checks passed! +0 errors, 0 warnings, 0 informations +WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414). +Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest` + +validation OK diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md new file mode 100644 index 0000000..3d0be18 --- /dev/null +++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md @@ -0,0 +1,25 @@ +All gates are green. Final state of the work: + +## What landed (task 07 — hydration, panels, Copy buttons) + +**New client — `frontend/assets/verbatim.js`** (531 lines, classic script, globals like `markdown.js`) +- `buildVerbatimPanel(block, opts)` → sticky `.verbatim-head` (`.verbatim-caption` `source/path · lines 12–40 of 210` / `… · all 210 lines`, `.verbatim-badge` `VERBATIM`, `.verbatim-open`, `.verbatim-copy` `Copy N lines from `), `.verbatim-body` = `ol.verbatim-lines` gutter + `pre.verbatim-text` (`pre.textContent = block.text`), `.verbatim-more` on a capped block; root `role="group"` + `aria-label` + `data-bor-locator` = the **server's** locator. +- `hydrateVerbatim` (exact canonical-locator `===`, else exactly one block on the same `source/path`, else the pinned unresolved sentence — never throws, idempotent because only `.verbatim-pending` is touched), `appendUnlocatedVerbatim` (the `answer_image` band), `settleVerbatimPlaceholders`, `enhanceAnswerCodeBlocks` (`.code-block` + Copy, **no badge**, idempotent), `copyTextWithFallback`. +- **No second locator grammar** (no `borLocator`, no range regex, no `parseInt`) — pinned as the phase's drift guard. All `createElement`/`textContent`, all `addEventListener`, zero `innerHTML`. + +**Wiring** — `index.html` + `shared.html` load it after `markdown.js`; `Containerfile` minifies it without `--bundle`. `app.js`: both live answer renderers opt in, the `done` handler runs image → hydrate → unlocated → Copy-settle → sources, `answer_text: ev.answer_text || undefined` joins the save point, the restore path re-renders + hydrates from `m.answer_text`, five terminal settle sites (`error` frame, 300 s guard, its abort surface, Stop, the failed-turn funnel), `VERBATIM_LINK_OPTS` (`documentUrl(…, "/")` + `openDocumentModal`), and the share copy now **delegates** to the one clipboard helper. `shared.js`: same three globals + a plain `/document.html` href, no modal. `styles.css`: extended only inside the labelled phase-182 region (`.verbatim-body` flex row, `.verbatim-text`, `.verbatim-open`, `.verbatim-more`, 44 px mobile link) — palette variables only. + +## Verification +- `uv run pytest tests/unit tests/integration` → **4483 passed**; `--cov=app` → **TOTAL 99 %** (>90 %). +- `ruff check .` → all checks passed; `pyright` → **0 errors**. +- New `tests/unit/test_frontend_verbatim_blocks.py`: **34 tests** (source pins + a node half that runs caption/gutter/match/block-guard logic against the real file). +- Stale pins reconciled (byte-pin `PINNED_RUN_TURN` regenerated, 3 brain-restore shapes, the task-06 call-site test rewritten as *only the answer renderers opted in*, the share-copy internals re-pinned at their new home, `shared.html` script order, `renderMarkdown(finalText, { verbatim: true })`). +- Playwright regression pass: smoke, share_chat, chat_answer_clusters, chat_persistence, prose_word_wrap, no_empty_box, save_share_ux, failed_turn_retry, answer_images, long_answers, reasoning_bubble, edit_and_resend, chat_error_honesty — all green. +- Real-browser sanity check (throwaway script, not committed): caption/badge/gutter/Copy at 1280 px and 375 px, gutter stays put while the body scrolls sideways, **clipboard equals the server string exactly**, `Copy`→`Copied`, plain code block copies with no badge, unresolved shows the sentence with no badge/body/`

`, no page overflow at 375 px, 44 px tap targets, 3 px `:focus-visible` ring.
+
+**Docs**: README (panel anatomy, the hydration rule, unresolved/settle behaviour, Copy-on-every-settled-block, parity, the shared-page exception, renderer opt-in count) and AGENTS rule 5's UI contract line.
+
+## Notes
+- Nothing committed and nothing staged — child passes never touch the index/history; the harness makes the one atomic phase commit.
+- Environment gotcha worth knowing: a stray `python -m http.server` on port 8123 makes every E2E suite fail with `404`/`Sign-in failed (HTTP 501)`; I killed the one my own throwaway check left behind.
+- For task 08's E2E, the behaviours already pinned at source level that want browser assertions: exactly one `.verbatim` per locator after a reload, clipboard equality, the unresolved copy, nothing at *Retrieving the exact text…* after `slow_llm`/always-fail, the appended unlocated block above the source clusters, and shared-page parity with no other controls.
diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md.status
new file mode 100644
index 0000000..9766475
--- /dev/null
+++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.md.status
@@ -0,0 +1 @@
+ok
diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.validate
new file mode 100644
index 0000000..04830a0
--- /dev/null
+++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__07_hydration_and_copy_buttons.a1.validate
@@ -0,0 +1,143 @@
+........................................................................ [  1%]
+........................................................................ [  3%]
+........................................................................ [  4%]
+........................................................................ [  6%]
+........................................................................ [  8%]
+........................................................................ [  9%]
+........................................................................ [ 11%]
+........................................................................ [ 12%]
+........................................................................ [ 14%]
+........................................................................ [ 16%]
+........................................................................ [ 17%]
+........................................................................ [ 19%]
+........................................................................ [ 20%]
+........................................................................ [ 22%]
+........................................................................ [ 24%]
+........................................................................ [ 25%]
+........................................................................ [ 27%]
+........................................................................ [ 28%]
+........................................................................ [ 30%]
+........................................................................ [ 32%]
+........................................................................ [ 33%]
+........................................................................ [ 35%]
+........................................................................ [ 36%]
+........................................................................ [ 38%]
+........................................................................ [ 40%]
+........................................................................ [ 41%]
+........................................................................ [ 43%]
+........................................................................ [ 44%]
+........................................................................ [ 46%]
+........................................................................ [ 48%]
+........................................................................ [ 49%]
+........................................................................ [ 51%]
+........................................................................ [ 53%]
+........................................................................ [ 54%]
+........................................................................ [ 56%]
+........................................................................ [ 57%]
+........................................................................ [ 59%]
+........................................................................ [ 61%]
+........................................................................ [ 62%]
+........................................................................ [ 64%]
+........................................................................ [ 65%]
+........................................................................ [ 67%]
+........................................................................ [ 69%]
+........................................................................ [ 70%]
+........................................................................ [ 72%]
+........................................................................ [ 73%]
+........................................................................ [ 75%]
+........................................................................ [ 77%]
+........................................................................ [ 78%]
+........................................................................ [ 80%]
+........................................................................ [ 81%]
+........................................................................ [ 83%]
+........................................................................ [ 85%]
+........................................................................ [ 86%]
+........................................................................ [ 88%]
+........................................................................ [ 89%]
+........................................................................ [ 91%]
+........................................................................ [ 93%]
+........................................................................ [ 94%]
+........................................................................ [ 96%]
+........................................................................ [ 97%]
+........................................................................ [ 99%]
+...................                                                      [100%]
+=============================== warnings summary ===============================
+.venv/lib/python3.13/site-packages/fastapi/testclient.py:1
+  /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
+    from starlette.testclient import TestClient as TestClient  # noqa
+
+-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
+================================ tests coverage ================================
+_______________ coverage: platform linux, python 3.13.13-final-0 _______________
+
+Name                           Stmts   Miss  Cover
+--------------------------------------------------
+app/__init__.py                    1      0   100%
+app/api/__init__.py                0      0   100%
+app/api/admin_settings.py        114      0   100%
+app/api/auth.py                   52      0   100%
+app/api/chat.py                  292      1    99%
+app/api/chat_images.py            52      0   100%
+app/api/chats.py                 111      0   100%
+app/api/config.py                 13      0   100%
+app/api/doc_drafts.py             99      0   100%
+app/api/docs.py                  239      1    99%
+app/api/git_sources.py           259      0   100%
+app/api/health.py                 10      0   100%
+app/api/steering.py               42      0   100%
+app/api/suggestions.py            33      0   100%
+app/api/sync.py                  204      0   100%
+app/api/tokens.py                 40      0   100%
+app/api/ui_settings.py            55      0   100%
+app/config.py                    304      0   100%
+app/core/__init__.py               0      0   100%
+app/core/auth.py                  45      0   100%
+app/core/caching.py              124      0   100%
+app/core/compression.py           59      0   100%
+app/core/debugging.py             29      2    93%
+app/core/docs_push.py             43      0   100%
+app/core/errors.py                 5      0   100%
+app/core/http_cache.py            22      0   100%
+app/core/logging.py               13      0   100%
+app/core/rate_limit.py            44      0   100%
+app/core/response_budget.py       63      0   100%
+app/core/security_headers.py      20      0   100%
+app/core/settings_catalog.py      18      0   100%
+app/core/settings_migrate.py      32      0   100%
+app/core/settings_overlay.py     111      0   100%
+app/core/theming.py               40      0   100%
+app/core/tokens.py                44      0   100%
+app/db.py                         22      0   100%
+app/main.py                      105      0   100%
+app/models.py                    141      0   100%
+app/rag/__init__.py                0      0   100%
+app/rag/agent.py                 494      1    99%
+app/rag/archive_upload.py        134      0   100%
+app/rag/chunker.py               220      4    98%
+app/rag/doc_dates.py              18      0   100%
+app/rag/folder_summaries.py      134      0   100%
+app/rag/git_sources.py            77      0   100%
+app/rag/importer.py              855      4    99%
+app/rag/llm.py                   253      1    99%
+app/rag/md_images.py              63      0   100%
+app/rag/overview.py               78      0   100%
+app/rag/pdf.py                   192      0   100%
+app/rag/prompts.py               162      0   100%
+app/rag/retriever.py             252      3    99%
+app/rag/scaffolding.py            55      0   100%
+app/rag/source_removal.py         41      0   100%
+app/rag/sources_meta.py           16      0   100%
+app/rag/suggestions.py            27      0   100%
+app/rag/summarizer.py             58      0   100%
+app/rag/svg_text.py              111      0   100%
+app/rag/verbatim.py              160      0   100%
+app/schemas.py                   549      0   100%
+--------------------------------------------------
+TOTAL                           6849     17    99%
+coverage gate: app/ 99% (>90%) OK
+All checks passed!
+0 errors, 0 warnings, 0 informations
+WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414).
+Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest`
+
+validation OK
diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.err b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.err
new file mode 100644
index 0000000..e69de29
diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md
new file mode 100644
index 0000000..441b0c3
--- /dev/null
+++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md
@@ -0,0 +1,32 @@
+**Task 08 complete.** Everything is verified green; nothing staged or committed (the pipeline owns the commit and the task-file move).
+
+## Delivered
+
+| File | Change |
+|---|---|
+| `tests/e2e/test_verbatim_show_text.py` | **new**, 1 428 lines — the phase's dedicated Playwright suite (13 specs) |
+| `tests/e2e/mock_llm.py` | +402 lines — the three scripted `show_text` branches, the corrupted-fence-body generator, the fixture doc-picker, module docstring |
+| `.agents/PLAN.md` | §4 fifth tool + additive `done.answer_text`, §9 `verbatim_blocks=N`, revisions paragraph incl. the explicit **A1–A6 / A15 otherwise UNCHANGED** statement |
+| `README.md` | two precision fixes to the `BOR_ANSWER_TEXT=0` wording (server surface is pre-phase; the client's never-paint-the-model's-copy rule is flag-independent) |
+
+Suite coverage: tool flow with a deliberately corrupted model fence, server-bytes/caption/gutter/badge/viewer link, five-tool offer + one executed call, in-page SSE tap (`≤7` event types, `answer_text` inside `done`), append path above the source clusters, clipboard byte-equality for `.verbatim-copy` and `.code-block-copy`, standalone fence with zero tool calls, honest state for a hallucinated locator, wrong range corrected to the server's extent, `OFFSET_PAST_END` refusal, reload + **`/history` → `/?chat=` (local storage cleared, so the pass cannot be vacuous)** + anonymous shared page, image regression + `show_text`-on-image refusal naming `show_image`, 390 px scroll/44 px controls, and App B (`BOR_ANSWER_TEXT=false`).
+
+## Gates
+
+| Gate | Result |
+|---|---|
+| `pytest tests/e2e/test_verbatim_show_text.py --no-cov` (isolated) | **13 passed** in 28 s |
+| Regression sweep (all 14 named suites + phase 180's, isolated) | **14/14 rc=0**, no edits to existing specs |
+| `pytest --cov=app` (unit + integration) | all pass, `app/` coverage **99%** (17 missed / 6 849) |
+| `ruff check .` | All checks passed |
+| `pyright` | 0 errors |
+| Phase-116 trigger discipline | 41 triggers: no containment involving a new phrase; no other suite contains one |
+| **Mutation check (suite has teeth)** | 5/5 caught: drop the live `{verbatim:true}` opt-in · Copy writes wrong string · honest sentence muted · append path no-op'd · panel body swapped for the title |
+
+## Flagged (per operating rule 3 — not silently deviated)
+
+1. **App B fence rendering.** Task 08's bullet expects a ` ```bor ` fence with the flag off to render as an ordinary `
` block. That contradicts the contract locked by task 07 and recorded in `AGENTS.md` rule 5 ("an unresolvable locator painting the pinned sentence… with no badge, no body and **none of the model's bytes**"). I asserted the **locked** behavior (honest sentence + Copy on the ordinary block) and corrected the README wording; pre-phase `
` for a `bor` body would re-open the drift incident.
+2. **One existing mock branch was NOT byte-identical.** Phase 182's `SHOW_TEXT_CLAUSE` ends "For an image use `show_image` instead.", so phase 124's gate `if "show_image" not in system` now also matches a text-clause-only prompt and the image flow fired on `BOR_ANSWER_IMAGES=0` apps. Tightened to `_SHOW_IMAGE_CLAUSE_MARKER = "displays a standalone image document"` (a sentence only the image clause carries, `prompts.py:394`); `test_answer_images.py` green.
+3. **Trigger constant names** are public (`SHOW_TEXT_TRIGGER`, `SHOW_TEXT_INLINE_TRIGGER`, `SHOW_TEXT_MISSING_TRIGGER`) rather than the task's `_FENCE_ONLY_TRIGGER`/`_BAD_LOCATOR_TRIGGER`, matching the mock's convention for constants suites import; semantics, phrases and flow order are exactly as specified. `_SHOW_TEXT_CONFIRM_MARKER` keeps its task name.
+
+Incident note for transparency: an earlier shell-quoting mistake of mine silently stripped `{ verbatim: true }` from `app.js:4363`; it was restored and the file is byte-verified (md5 `33a584f3…`), with the full suite, the E2E suite and the mutation harness all re-run against the restored tree.
diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md.status b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md.status
new file mode 100644
index 0000000..9766475
--- /dev/null
+++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.md.status
@@ -0,0 +1 @@
+ok
diff --git a/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.validate b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.validate
new file mode 100644
index 0000000..04830a0
--- /dev/null
+++ b/.agents/reports/182_verbatim_show_text/182_verbatim_show_text__08_e2e_and_docs_pass.a1.validate
@@ -0,0 +1,143 @@
+........................................................................ [  1%]
+........................................................................ [  3%]
+........................................................................ [  4%]
+........................................................................ [  6%]
+........................................................................ [  8%]
+........................................................................ [  9%]
+........................................................................ [ 11%]
+........................................................................ [ 12%]
+........................................................................ [ 14%]
+........................................................................ [ 16%]
+........................................................................ [ 17%]
+........................................................................ [ 19%]
+........................................................................ [ 20%]
+........................................................................ [ 22%]
+........................................................................ [ 24%]
+........................................................................ [ 25%]
+........................................................................ [ 27%]
+........................................................................ [ 28%]
+........................................................................ [ 30%]
+........................................................................ [ 32%]
+........................................................................ [ 33%]
+........................................................................ [ 35%]
+........................................................................ [ 36%]
+........................................................................ [ 38%]
+........................................................................ [ 40%]
+........................................................................ [ 41%]
+........................................................................ [ 43%]
+........................................................................ [ 44%]
+........................................................................ [ 46%]
+........................................................................ [ 48%]
+........................................................................ [ 49%]
+........................................................................ [ 51%]
+........................................................................ [ 53%]
+........................................................................ [ 54%]
+........................................................................ [ 56%]
+........................................................................ [ 57%]
+........................................................................ [ 59%]
+........................................................................ [ 61%]
+........................................................................ [ 62%]
+........................................................................ [ 64%]
+........................................................................ [ 65%]
+........................................................................ [ 67%]
+........................................................................ [ 69%]
+........................................................................ [ 70%]
+........................................................................ [ 72%]
+........................................................................ [ 73%]
+........................................................................ [ 75%]
+........................................................................ [ 77%]
+........................................................................ [ 78%]
+........................................................................ [ 80%]
+........................................................................ [ 81%]
+........................................................................ [ 83%]
+........................................................................ [ 85%]
+........................................................................ [ 86%]
+........................................................................ [ 88%]
+........................................................................ [ 89%]
+........................................................................ [ 91%]
+........................................................................ [ 93%]
+........................................................................ [ 94%]
+........................................................................ [ 96%]
+........................................................................ [ 97%]
+........................................................................ [ 99%]
+...................                                                      [100%]
+=============================== warnings summary ===============================
+.venv/lib/python3.13/site-packages/fastapi/testclient.py:1
+  /var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
+    from starlette.testclient import TestClient as TestClient  # noqa
+
+-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
+================================ tests coverage ================================
+_______________ coverage: platform linux, python 3.13.13-final-0 _______________
+
+Name                           Stmts   Miss  Cover
+--------------------------------------------------
+app/__init__.py                    1      0   100%
+app/api/__init__.py                0      0   100%
+app/api/admin_settings.py        114      0   100%
+app/api/auth.py                   52      0   100%
+app/api/chat.py                  292      1    99%
+app/api/chat_images.py            52      0   100%
+app/api/chats.py                 111      0   100%
+app/api/config.py                 13      0   100%
+app/api/doc_drafts.py             99      0   100%
+app/api/docs.py                  239      1    99%
+app/api/git_sources.py           259      0   100%
+app/api/health.py                 10      0   100%
+app/api/steering.py               42      0   100%
+app/api/suggestions.py            33      0   100%
+app/api/sync.py                  204      0   100%
+app/api/tokens.py                 40      0   100%
+app/api/ui_settings.py            55      0   100%
+app/config.py                    304      0   100%
+app/core/__init__.py               0      0   100%
+app/core/auth.py                  45      0   100%
+app/core/caching.py              124      0   100%
+app/core/compression.py           59      0   100%
+app/core/debugging.py             29      2    93%
+app/core/docs_push.py             43      0   100%
+app/core/errors.py                 5      0   100%
+app/core/http_cache.py            22      0   100%
+app/core/logging.py               13      0   100%
+app/core/rate_limit.py            44      0   100%
+app/core/response_budget.py       63      0   100%
+app/core/security_headers.py      20      0   100%
+app/core/settings_catalog.py      18      0   100%
+app/core/settings_migrate.py      32      0   100%
+app/core/settings_overlay.py     111      0   100%
+app/core/theming.py               40      0   100%
+app/core/tokens.py                44      0   100%
+app/db.py                         22      0   100%
+app/main.py                      105      0   100%
+app/models.py                    141      0   100%
+app/rag/__init__.py                0      0   100%
+app/rag/agent.py                 494      1    99%
+app/rag/archive_upload.py        134      0   100%
+app/rag/chunker.py               220      4    98%
+app/rag/doc_dates.py              18      0   100%
+app/rag/folder_summaries.py      134      0   100%
+app/rag/git_sources.py            77      0   100%
+app/rag/importer.py              855      4    99%
+app/rag/llm.py                   253      1    99%
+app/rag/md_images.py              63      0   100%
+app/rag/overview.py               78      0   100%
+app/rag/pdf.py                   192      0   100%
+app/rag/prompts.py               162      0   100%
+app/rag/retriever.py             252      3    99%
+app/rag/scaffolding.py            55      0   100%
+app/rag/source_removal.py         41      0   100%
+app/rag/sources_meta.py           16      0   100%
+app/rag/suggestions.py            27      0   100%
+app/rag/summarizer.py             58      0   100%
+app/rag/svg_text.py              111      0   100%
+app/rag/verbatim.py              160      0   100%
+app/schemas.py                   549      0   100%
+--------------------------------------------------
+TOTAL                           6849     17    99%
+coverage gate: app/ 99% (>90%) OK
+All checks passed!
+0 errors, 0 warnings, 0 informations
+WARNING: there is a new pyright version available (v1.1.411 -> v1.1.414).
+Please install the new version or set PYRIGHT_PYTHON_FORCE_VERSION to `latest`
+
+validation OK
diff --git a/.agents/screenshots/166_pre_answer_window_1280.png b/.agents/screenshots/166_pre_answer_window_1280.png
index f12f6fb8699ca98f59c4d5d7d8c972d42ea644a3..350bd53b235b9c29e8bf29854601f49b1408a3d0 100644
GIT binary patch
literal 69542
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

diff --git a/.agents/screenshots/doc_modal_scrollbar_1280.png b/.agents/screenshots/doc_modal_scrollbar_1280.png
index 3792c88f1df7d39766450fcda940b2a25cbfbfec..88bff57b4bdcf5bcf2ddf2ea3adfe18443231f3d 100644
GIT binary patch
literal 43362
zcmX_{cRX8v^#6mFqI9A)+p5~MX68G6m8WWu}30e#U@6T+A|0e
zikhMJ=68L*-|sK~ZLXabQ##BxOasd
z_}e}*CiVRuO;e@aQex@Y)Tme6;CaA!>9#)=0|U!AL)ku|T}Z-Vyq(~$
zU)s1QRQQRG%%9@YH&gnWAXP%JS1+^B!gpi0#O|{u_^o}nRIAlB+3lV_zsdL?ca~`=
z!zh7Afj}DV3vPFp-B^|%99=X4Bv$t8L$*C-^Goc-UWm;%uV*Pilz0ByVSJblO4<>=
z*v`D0$CQxI3c7WA(PB`F33H1*lCT>d1(cT
zi*2`P24tOaiIvS82@oadX>|XB)50cW&6H{4B-7E@!khIW3+hW@o-OYjAHQX~I&z7E
z|I{-@0tD)G%u-Lkt8REpxlg36X(l-CRV30xRaIoWOoOcXKF#zx&dJQ4XJ_}$UGS})
z#N$=HOHd@m%T`cGT8pREW|&I4Ak2?=S9`KG}g(P^{;n<2F3iuMS$+o#cTLV#QW0JG2E_A
z5!*S9ZK{s$Kt6O4fAScVNnP8sGzQ07YV*Vl(=f;UcuMK?l;SF=Q{N;&iLD`ASyTyY
zUZTeiPskLRkpzM4ZaO9MZ^%&dQ__1zNU(Cdf_f~!Zn54C0Bu(89vJxtgii5r<9%tN
z??V^Pj3_`M4sOY0-xY#(QroV{t0lh=h`qaV>-KmjsQMji2WUude$PXgN5W0Dr~`82
zpXeh-&^@HAllPoER*>fvy-~Ha%<@*sQ;M~Lpjp9JkI$}waywStJogv$c3^|rz9xqw
zTlAn#!Q{G)YHRQyrYokA6uL7m&NV+lt=k3!`g&Qzo#^a@
zTcr4V+Wb-UVT_eM^(SQW0xtHO^@n;;ib2_=&Y!+%vU`;d?O9YJWT3CUz29fM!)dU3
zQ%W5CI&1zRY#GO%EG2zS*-lM=ya?oZoO~2#SDomAXZ0c>g{iJ@s)G=l-v&!TpkxN-
zYf{{nY58B&(j|C2dXnH;nX9n5P2Qv3J0QYQcb!ipi3FgUrQ;<}4{3PVZ
z_90l%yl4`_UMLFKYT8tBoQe=wFU*{udd)4s;W_ApV}Z5qC^AYegC=nYoOnqRHcbni}nD=fN1E@Rr~)-O4Q=8UHApfPl$gw4pI1?w~CBXCw8}4@fmc
z5{BovqC18YGA+wSBs9fz@=N!rtE)#vMmCtDOP+XodV=HQ7Z@1Ym6S-6)#$=v<0^;b
z!Pnoh$KIwIdDGiUq_D0ouN{UXJ(5ggafywhWBel=A9NvVMX#~d3<+O(mML^cz#~Fl
zvE4z@E$3~5n6w6pgl?SK{)m&Tq(vb0ON{NGY8S+?(bCXln+Zdj8X6j=Ua9l*3YzHY
z>4Cx4^N(XYhB4}i(%9gZ_m}sgxVX4T_^MG}Lp{BGGnq=~jqO85LDRMU`m_CZqoWxQ5^l3
z_9!M6!N_jb%Y282b0#lSihp)$KP-lRhA>%>zl-3fmb+T<)3PRE1T0*FthyHAm6vzq
zo$TxT_LcFv*+dIuyah6VC#6ClhIb2t2PC^)N2(kr_t>O+;F9R_@*z97I=4#bw2@L6
z;#fUV5c1tZYss}#DXot{m`<88F4ovFyQkbYKvnBr(vw8ye&
zy(bCrF6W!AU)f~b%1nQ_Q!F_S5rX~2QFvtpWjM~abxT*mNUlilU{zNZk6vZC{L9)?
z{G(K9MK*CI#EfGIAGa2_*l5#f!tkoXYG6;Ft^F|z-XnPoji{880O_@lrM#6h*kxx+
zAltriFS@9)2vmJX5Z>{_haDX5`LZ`vLE-D?f&#HThqY72-2D7sDgTPDe>xbYUPj|k
zx+*Y71N{f$ij0iV0?9j|YWrbjcSLA&P#&RWLqzi~Cy}e>(?cB#E4}xx3_?Tp#!fy_
zHa(PTU=kxM9qgLZ2^&~T+47rCZA6-mdH&#$)swf{eSdRw_5sC=57pcL3^|m|*xNRU
zBZ`JioawTtA8AB?OhV^KO!uDGQsy3(fnU!~e04>8wfL$3;Db@PbhZ60=zGUeXz0Y%
zYx887n$<6F<=ULs_fn!?DswJ*ba!?}+h09nh3<;ds*0b)AFt|CR$Zg2^K5zhs`x?W
zgOQg8EO$Y|D5TyFa-iB@(Y0(6W@4v*1k+(A)Q*reWI#B^VXT_BfM|EZ+fgE!c$H6A
z>*Zo2!FYP3CJUvxif2b(yH-|GR-icxkaCZr*07&sS%@U%?jO;O#PF?DPsevqfL(Y_`JZ-
zJINId#SXrI2A;sEs{0pp9;2Q0?;9km?ZCvzKHRhbgTqaoBlJ)K$i1I-5bYsEVd22y
zFn6N9K7VV>TKS({AL%M6cz(O+5S3rz^t&sb;f8oAIl5YB6?ddRCS@Iugu%M`_#V_7
zaG$wkZmLB_d43f(sT<*t7hY*qdAF485gHPNuX19mtEn>{9UbjX6h5yuoL5-&&mQURjQh{Gv2uldzN6-V#glf9_apEsx@Kj5520uA3kyY6
z>=Kc_myG;zkGJobNPFXyONC!Yeyj9B5bTHT4=1Z(1*k0jd14#5BiE2LOq1~AhXAC>
zI8}HvP21SG*ixpl1qMq*8&4Fypc?J$PRX4fmY%x`L#;YS{EK44V}{way41yuOz@Sl
z0XF3$^0G#${yNUf_}U6{%5%L%^TxvDT~pFal16$ruA|y>g?n&t1Yv}z~4;e
zla0<}n`%Q?H|$v0xUz7WJ_NkqWWHxTn$3vFBP<}qW0hqTp$3z^X@;rUIt6czyo-F_
z-T6!J2sT>T^ux4QelD&|l1D)jg@Dz-Pm4PoQ}3y4058HqVYidU*59%Zt!dzM?F~@h
z%wLuS{UMhkK$&f{u8Z;eNFz{KBdQ8D%6NkGf~U`Tqi5wGz=P8<+z?8nxfK``M{-T{
zJ&B;rAyP#prl>b*&bU?w5c;s<4f7Id6`K`9R3bu*$$`Eel|>J&zr
zif3SmpM5UAlT5-h7{r%E(xg-35o-D?V@ZoC-@rwz&N#0^diag3Mn;0G+PPgBiRF^+
zO{kI>wkmh!BwgC8vegEqUtMD2X=HCL9xK-tY-@O_x7fJk&94FWCz{Hu#yYiwdFo8*
zYP4-qzJc|7ofZ|3wPNtFy#doe%;?n$%it};CnC+CdKu2gU!C1BmChsiJ9so4JxF1Z
z@m?PKwU&~-ZQgQn$R^{d&70!}?MsuwUFB2t9K=YImUiDpKg=HWiWbLR*)0=`TK3)k
zJIXJvw=tNL-O%v%TZS(XC4dFrEbt+>ACKq)7P75ooB3v}vm{K;Z|Ch@Tg->umCa
zpLVZLlX;GiqGlMiFBC
z4mfHg&vWj~KDuy7ilV+@^%#=RGX3|f#DW|4R!Frwhi7i?H6Q-GHGuIjG>E*NB(Omv
zOC(rmXpPsu|Dvl|aQZm}J!VR!qe>|mb2e5&LKpekFhyX&3Pgx1fd+ZAt;B_=Zun&f
zJ)5zO+RJ051;=Ct))ccF2r+#yLuyOb)*GXTCYNetbN&@?d;$4V+X_S!lX#JS;y-&tPJD?npW0YVl?)Y3w%tnq*H(8U0nbucF~i
z!c(DbWyN}?q?k)2zs7b%#tOd&9dv$q%7?AjufbCeoScJ`WGlq%b_pe_GdP(PGaMR-
zyP?9Xz7z7=3{qdMS|<%=iq{)~OlgL*zCYL(BxptPK|4Rj?ay>@@Rq#e#3n8>{-$eYzo3ieEJr6G-OfHX~fRp
z(QeGQ`Uh;sUZyu>kZ0TzhGoYvKvf{_AFE!cN+7NqMbw#AJCT>igmyB-`j*@^oTD*o
z|9%^KNkG6M=hTUv0(sI4Wfz%PNR>#ZcSsl5l~>6^%LFLfi8qoag$+vY9f6j{%W~ok
zXwttZDP_gEZvMH%K;0%wxNU9srp>|laU%aRxKgBV~m_Ghq3Ga1dPO0fS&*5swqA3!GVnD8n
zRiME~(6-{)B2}NiJ<0aoVZ4F@0^846u;Xc~fcUtd0F3^r78ER!&>v>vQzeFnjxkkm@Ung7`nxQ3>
z7{51oh(xHG|2z`eMpUExF~j9X
zTzZ|*HvNtEHd13a4!(mH4q*CBu!|Ki__JxS{SZ?bedpi>1FvJHMFkBK>OB$3phuhT
z^%cQMRw3Gl-84{Pc!6&i$&FrZjesp_4`sbDpO(rV`#%;?Jp1Eje^C{v%^1e72+f;_&d*C9l9N5N
zpm0z5?Q31Z38SoIL@KKFHl>ut-dbH(Lt>xtsNl$c4xIpuYD
zX7wIs@)xO3Du=-uf;^?&kn|hU8f)I|vSV&44N;xJJ%menHgI(37V4+KrbA>9hO?_z
zv{hQSSoDEgM)3YCPt2&2nRWQeIO0(FOU*5r6ylm`u4uK;^#Rqyp@h8KVrN0mV
zYL8*v?NWQSg4OdBYFiT+?pj?no~KKyC_2p-XvguUOXzifU1Gjf(Ku|K!GcTP-rzM~
ze{Vhe(JI}IufPvgo1fx~XdNYHP6P_I=pzm7iVQ0a+x;g0S%|$_%qrL*Vi
zHJtk$EJ@6>&)>Eze*ediH?T%+X>gj>3yY;uA>9^77(Rh!#rsfGqV9JUpDskzU^L5I
zwGA>fZxvptCPJtbWd>%%|y%ao7JslcsjaTpBk;o@*JV`L|*i
zab!7vZNtkqp)YaV<1c6or3iX?dD01Mpr>v>O^_Y+@5zv{c3Be#lL9&Vc$!uc3@4qC
zD%TiD03*WlP)7F240u7>ef?_vDe0safgDiSi~6SlRg}F9lC8+%qcA-~7Bh~U(7X0T
zQ?rM)?o{?YB=e#<|g0k9tz2(ylWqJ-uK039Y407eTffb%i
z=wuy+*=DB^F>SaRAd%4ZhOjdH9O)dCva2*YyH(Zq`st+EkNH~M7YoyuE4{ZW0%-A)
z*OS>cNIS(bbjM#lom@vgD=gLgwY4?y+ivfT$als-|HlG2Uy}_b{rXQIX$r!d5`>zv
zpC{USY51z-QT5X0N?XXBW64U5UM2Xx*vHoPbk_#S`aW6W0@zqcLLYj`h$Qam33V8F
zDMI&}z2ZgO?89&7|AI9F`@RHm3QBB$&9m_z4fZuruVW|l2)
zS&P-{z1K*i9vA$S>f*qB(+uJU+Oq!Hq^y!WeAWRVa>>L1qw4C+=nj4Jr?6LI7iS$J
z9-TC3B3COW7u*~UR*&{SE5sCVHalNp8U^qK{b^mmN8I~`-SL{%hu?n%AI@gGBxwzD~E$C_K={;l07PrDA
z8N%Y`e>n0hQ@{-}mwU1&@o|>#BIK!_5`={R`S4x6xT4H=$_YM6+Vz3_{!lXGR$H@wUj2Lb&5t*^rx~i%Y)r7~Jd-lJqE67;`Ej>m^
zJ$J@k$sW&TTy*RAc8xLD<;z_hI7)H`3`Xks_C%*$1ES=OlxBF2(&fvMn_VzyIa48b
zMPLeS;>_fEwTx-sMCg;!3i5Z^X21>Z`Q}}|Y#LjTou7{*wzA)0785Ny+VqumjEt;2
zp%IUMt?qm*)>}S7PVH|jBS`7>HrDKau2XeNLSAO%RUT>;7S&fo#FJo$k=eDj
z_j|28uS3fBor+b+=OCbKArE<<^Xwh|NbadHs?@W!x3&g+7Uzph2M73TK?rAJ3-y))
z=+S>n`TOlIM@B{=G(u!+BocwpQ&MX3;5hp}N*eC8hRJe&c;n0dzZ_ZBt=<^uFFyhq
z-H`te12#8j-k*|a*;DnO5aHUO;9>Wty%>{RM^{%v>%3V|Hy{5b0}~4`G=&sLD8H|I
z$O?)(yD;u}Wy`d=LWY)g%Xh7St88o`S$QWY7*
z?@V$ZTC3AMak;Y(O8pdMxm@;(8GX7D9LKHMw7Om&J@qv#>JkVvFyw1e^6s(0YVHnN
z30cgrFY&|9F@Y2}U!E88wPRlVdFlgnmC{NyOS18)Vi@JL_xWi`A)>T!#%AG{k4+c6h!tn@h?Eph!Zt15rVC|W&f+OdQb*HfOS9IDB81Jjyo!xAk`
zdwZ|WSV(dZ9r`r?O={J<7IKZ(X-~_fC6(Kpdmf~FtrV%S1@2T$I>9d9!}HL#^|NSQ
z7{M{sC*v<({Av#tP?q6_I+L*R
zc#_f(fvS{YBM3^;GQ
z#vW@sHD0D~>bo$pm?rwJImC0!#CtPaDejR*9jR(^C0*)81U;L4z`+rV!(;cqJ^k{>
zYoW&*!P}^6J%}UbaC>p1axO;Mh?1W5V4&?9%)-}jLSoV(?w9tmW(T{!!#SPg+C;_T
zcP{my!-Yg7x=t->WJZ4shhum9*Fq;ntW5M9Q&~|CEDn0ou1XbI`ROF8E!+nSuW`1tso>NbBtoEpKyFFs!NU7xVU?CvleuVb;|
zZK!I3ks;W#En1TKZuU&@v0_-C)M6S2XQYl5g4B%|5g!=K5x4%v;(J>G*2r;OV8o2ZiG}@#z_52@g+3)!h`oF`~r^*Cc4+`U5b9t%aL}5Q6X<@C;H`2b&zN9nS3hYZ(2?NZDNRLfe`E01wm?y`wt7%;odP2{GC6c#aT43_i$;SRr0h
zIDCn|N^n(C!uHGVr|rVFZVE$ko{Ceaag(`pubco~<~F+3uW)`cs&A6_*%N2D*j{EC
z6&2;bw^qAaQV%?k<=eI<(Ab<`%g=uN0YMs905!B+dn8vaG4_FG^O&I16(HRHySK=UkB}u>UYGj6x{QTVDnm9Z){<(I;u{LODDbX~jwy?0!nb@>H<&VBOxXTc3aGLA
z{XGh*65}$9;=Awm4FWx_y>(-au+GG3?`e#~;g&bSUsJqHR8tP@*^X{HGZHU5-6Kq%
zvG%$*HysDr%5Pg%r+YX3n{pSf{SyhmbFmuG-D@H3G#(5T5G?dTG*D@Tf*hWTQSN#1
z^X$QTQ4DHZW>MXd4@so!$8;?Z-|NIqE?m1r(o}tMukZN%6DB^~jbe&!;zQe}p$6ps
zlDUS$*|;U{Cp`GfK93Hd4IyN^K9*oQM4TN~|8NqQV~
zLY&nrv4#6Snj~}ilc%jclJYjlf3YPDwS2h!*YTZl7U05FS#R;B*AFVQ-2I*W#PZiI
zOL
z`^8(}P_>+obLc7;GOqboa=bpgGZlPx*LP59(g6eBiLMzezX4*gxw^J{SbXQ8mdWfj
z=aIMw1E}NE+|4((Vnc#1^{|xV`;f~{ni?}i*M{D!E)6`@gvv6g4|7V)ltjrVuh1nI
zsj}e39*3Rd4JsBo6|5p>e7IwpXK%;2nu*DDv0=s97=w)At?4>1)P6$egiT+XeR#@V
z@&FgB`!wxr?*FlX71?UrV_>!aBB0)&3)@?>*I;#DE9-bEXXT?&anhAZwO;QGEE@jB
zWgmBu%;f8}$4;CwK}VY%ewKman-?BIjFXG+<9buuZ50*mlL)nLo+2
zu{bo5LAs;@XEa^!Sy6{)U|?7##;{4>v4P94MhBm7$1;HYF+Pbj!QU3AhNu7g4rPugE2D)8(aJ>I?00{rSL$X$-6{xqoIiABWNY1eud0
z9LQ!EVX>&eu1*p77>jAbIPERDPKZ^1^d-(xDo*AI1RsC&MHdPGT;4vZW%0{2)X?aC
zWb-mTH`9=D68ka3h2+H&J%9jDab`V$PD;300|7mtBn;5v?qQViMmGdkI+x;rFzo+y`@_!0-sqd|iJNdbCZU!men;!sLaql5t`%};=I{08V0x~Q)?GYCrBfm57LUO|DmVZW<3%<(q
zb3;RMadviV%K9W4E?&0XCsQ!uT+6G^2!xsy%)yDvK-{vkVfx}DkFEcZYljkXU@X%z
zMs{nQGqz#vyE+XG&7+{hJahS}m*?wZb_4X2j^1lpDiiKOhr46q;^Ot|<=wp8=^i6D
zRCXjIjLRDKXCr_LGgG?%dg}o}kki3w
z?QKh2NH_asY0h-G&ROC7?c0nvmJS0)OO;gH4flRI@6C257Mrg)Sg-iv*>?Y47$rk0
zn-oyo+u4IS-!1Y1qTg7#^{0v5qX;mP8}7HVt*Jl)qLoy~Cf_Z1Ca9c{efF>I8W0vn
z4_Smr_zqC|*SNFLWLT8+U(1ReUUdkur&lCTT
z@%;LxK@--rZ6+ykVxB-eV%b423CB!hU}F>?=|p?dtgOyN%Oo7}Bao3U7i}@exsF)<
zwBW*t;TNlSYEy=L3o5O}pFFVdA`foIPPq{{z(+>oW463l$Y^*1CL|0TnQJ6ttdI=2kRMAI9TF59mh5?2Ic?0%c(prto%l0t7bYfc~uT#5W3#UU-C)nd|%A_s={#4-pT&#kVST(Gq=_rJP-sfn!Ao!Rhxhkt4yzDn
zjp1C{1rn>(v0Iu?XK|BGw7DY2{-2vSntItTxU0ac6?3Y
zUo%n&YiyWjSYewO9}kGuQi$Wt|1nicZU`M9*ZVt;x>CD(}O
zKScWqpEyHcZ?&`rYi;3;B~mXFP5^_YxF#p&+(OQ2qGXDmB$X5vsXo?pcZ6FdpcL8E
z)eBUvglybPwL00mtMs2DR-Q<@*UY?crg!9=(2iF*qLp
zK83%{AV_-+zj7TQS>16g7Kr6)&8_YPgse}3v!zd^^=WVV$xh95FZSwR&MJK358X%J
z$BOHPMMXu$#l_COw?rS&byq{d}-XL-0|%4@Q5f6DTr&veu&o^JY#+A&h*lotkPfJ}2jUpuQ!?=GyD4zMKhJN;V;)L+7<;L?Z`EpM|dYz03~a7SH^C
z%-g^3#yP^p5(L3?4@0->m^|LdQu6X^JKDIshFq|&>%#yP
z^J;JZNKwhpYnb5oVM1(@yV3f^_bo}#8y@A-)sP7J3!NgML2QX19R*n1mxg=>V=ZvJ
z@)44{N)r!s{^Kv2zR9(B-LxSU82(NWaC-A5lp-`93`T8BQtEvuVkoA)^rh0u^H|Jn
zBE?kwOXijsMcU9bmQkb`xOIp*&j|uiWN&7iX1i;NdUO2!dt^$A@~^~+artDUsvl29
zsn-UC2A+H+yO3$V?s6AGBB1)(7IM)N*X)#v{b8ct&3gZ%a`(#^89|crucD8stwJtn
zO6j}DHI><|1>?mv<7403X2{(c8rb`XzR=I4eIv!?S*x2ewjqs2A8>??gzUK0{?A3=
z__2{1laitL@1LWqaT{Zrnc=#rm~k56MyKkVCf!IxdFA-BBRt=*>gua?-&ca_>NFu0
z)AF;f!}nQ%1{#F7Rxpf?vL_-t7x@7ycvxJ59FE$H{l;<|Y@{IMuEkJ2dT<(#!JG*Q
zn~O{q)F$+1Kknebx_i!XEKZiQUrF=6J5w2RKe2Z5{ln0UUKrd)@J`w%4gTmS3H|fq
z43o~Oz06782S~%L!SPu8)jjH}SaZtXy)_Q_r>3HmZx$ijLey!oCYd_(BC+ZU{|QkC
zuD5Gtd03dFhZ?xK9AD}^m?C*m4Ml}+s~1{lKOUCEP_;>o{yfLa+HfCO$xD3Rp#SBs
zKakPl)b`l6ivG%fQq`>=Tm4;cBFOJ6z1X$L{`4^Di-YscyEB*EAAZ_3{;d=f&2)F$
z4|5-J8kA#bA2lLYd39L{OBeK>p4{(08|w6@IlaAdWT|9I_cJ;AQ)t}h-ExgVG~gBd
z#tR1CJUF?)l`|ll{jtn8_}R)2&{LZq$h~X-L0l014Y4mtVF^;)0&ZTEPd754{~>(p
zr?OX|cgb8hok21CRIL}77!-3;_=?)oH0?GrL-pVHWlo>G@(8`KoSEw%6k^uN=`PN3
zp)arv$?+5bT*$@Gm)nedW(2s0t*dYCg|7e!nyD=}zI$)}{kF?O`;y`R+yV6TIqj8@
zTCEFM3UV`!x-zvTOY!>Of0$jh>lnl*Og?kZRp{cVm5%8LlPN%f3jACyk-xk658=Fi
zF*!gW)=j7)rMc`V13<4T=nG`u?8W;++_siK`J4!?F)hG7vRl2FlfjmZwHbyH&!xhFah}
z5CN#S3|^*P!ToGpcU@j5Fj6;+4#FRDcWeWJ
z(+qfLl2!6}S-mj`%Xp7)RgJzTwcaWB@_@x1Df>o3BL|R&t`h>^%zprf|HDNgT8=k#d_C*Ecq=bUEIr-=OYbhh=i{i>nyI
z=B*ua&Q8^5wM_nx1<d?!`f1ezDVD^#H_GQ&amMd~D5RRxFC|WJaaq%EW>=oe|}(
z^A`ko(z!aF%vNV%e*V^*$IOcvlg?&HePN2u4~(0)Lmsu=Gq{`oYk43L+uLPgN~rT(
z%`1Ce^Ol@%min>nV78fUf8V-0lV~Cpj98M69b|KooV1Dy{@Z8L6j1w3eZ6i&o|D!z
zV3{k&kWD1upjxNkOxnv~J_<~o$})1NqTkftvGnXnPR}e5SiiAnXU9l1HX|Ar`jFxF
z?KL@%C3SQY)JoUYbrZnv*mXS2dlm0Fo2`UB*_#yYm$MaX1#&vc*^2%zzb2e!nsex7
z*6=J&N#g!hyK4R7xH~~Jp{vChTx)w2N5K3y>|#%uExYe*I7h(2tUfV_WjlHi?%sEF
zdSp24=Q@HJ!};f!${u8f;f&pT$>GjjmG=Ej|DG!;g`d@pCP3&XJoOzDh-W9;8OIyw
zqM|{er)x7|$GgkJfZ&%10P65EOH%u|Q*#KwV4p`7?3?;5=WXKDJ%>?M02$
z(PtaM!LQ+_&Xf#Uws6;vk>N5MwHS#Q7qQ!C$3%_f?>&F<7Tdl1
z%pxyo(Oj$w=B)*{xRtT$5yK_*Yi@hBi}?2S*$7q#
z_TZCk;igY#Uk9Fr3F(Jf%5!+{4B}tzq0xF#Xe#6i3;lvfL&g|GxYwi
zm6Q~@2zrx7|NXAWNKNd)a~b>*Y-eHwrJk6ym_9pG@%u51NrlzV4!(;Uu8Z~G9R=Vd
z9`sekO&a9nD#&n|Jyv};*2dX_ni6xzC`l|sYG*5nMYQtEa2<`!l-ri)(y)l4{)-@n+I4%^_&);iJv>o_55uOp0r3
z*s~+ivm&4@l|YR;VdRm)k2V_lPF>A8WByT
zt0q8m|Mci+k{Z|RP(~QPe}gLAfroj!77ZIiOr(an7^LS$3C+(rO}Y4)v&pasx=BAI
z3SVWvy?(qgY3>4)5$LC!v2;hf!()x-vl0D`2ifLc&3fTBtAf>l?tbE!BT&qBDECtR
zBQT;qVCOeCZ#Y_o-Sub8q%-#2Z0l#UAVU+wi2`S0xpnuKzZHl1sq1CO>j2?p;6NxN
zBa8RY&@@!95VbwTABEBNb+iH%TiT$+$BHBGh&+qF(PbZSII6!dcQ7LXarFFERA3q~
zVU2^=d96n&DLa27u(=we!C8
zWohq~TKILXQtRe&S7#@;(db4c@t-VhjNHZ=yT`Qk&zJ-Fl9UWT$>*3zMJ`AW`wGkHh|(^6Oy3{e1u7RIv%D6rkH^zqYgmjgwK?H4f2-
z&{a5P?nXB?2LkUjve@I_;=7&HmI~Eq>!baeIL(+d#^dO^lI1vTvTSW(=FI#pO_j2cvJP
z=Hm7z3IO{
zRbocC)OcH5(G6R~Apk*RgHA_&uwT98F?zlT56(aR_rhNFw_@AJX|E18?D?ijy%$OE
zrLo9lrF}&o9!A_BctOpmIyS8?R5OEgZmON%>aLy&*xv4whp5*KG$Gt8ecf4QT2+{WZSP?7@jzP&Ul1ctSg
z7({)uLHG+x0i5%ig6vlN{dyAPl}kcw;)v`9V-z(mikl<2fzM!!;A5HCmkw4K4n2yW
zcy_%J_C@(^koGPM%;*LNf6pc)XGW|n
zx4($EM)a7A#-1F(MvW?IO@p_4fy&nW3V#WY08dS4u`yo**1spoo*3*bjNRKf^(LO~
z$!zS9CiOL_q0>Gy-&BhIMnfE{CR`)fe)wJ#Eff9)0|PSpHx)^_JUDyWOo0&2a6dat
z(IC;|-?Hp(ppE|8ngwj`)o(EK4l#MI4JgJ7A{9%^|S81b0aUU{Lig_4}!AxfCprf0W4ccjvQ
zweczCtZbmMr#4BW3q{0Ww8o9?=#O_n9S*gn#KN7ytL`oH_4dP+%^wXlM+wz8UqUl$
zeRu3gijH{z$ik;=N2$i?F5*5Hn|L+LA5XdNPm9|2irgIH}^SxR0bO*TG-Inc9_rd}cwTe6PwCQJl1hjh}^;rxI?uKonrDSu8363`5)3!fK<1_#}!)_+09N(C9?v>P(Am%$+RHSot+azU)|qqoqDJnX{4+v!5i<
z!Gc)x1c&K*FL25m1$-9NTPG(YQVnw?$j`5{{YRfpTqQDQl+tG|I*S+@
zRcl2QL#+4w>O(wi>8Jw{
znx0+0K?A9WJ>87pM?~q^^gqH_CbTb?TVb_kOLoc6{yW(H>abGF7lTU_0IWPw&RIU#!#$PoRUU>t;W&
zX7;%EFF&{cu)eiKhv#b)?dXOxh3SUAokQNm>1^BsCHC*q9|`0B_r2hb~}AOc02
zGNpv5B#8Tq)baj`=b@HLJj%dzHA=Vy`!}WTp8Glj6P=iW{w!dG5(!(S(t
z?{|LdKpEKz?i?xutE|pOqvXFH(fyi(Kj_}NZ&0IHW1lQOy0((KmCb4*yYInly>o4z
z_<6>pgZt!oS%jHCi54ETckrrsB=5nT1B(Tc#ZtjOLfe@X(oQnBy!{kiD-c8
zZW5YKn?r@MTaiMGbq>Kthl>!WvT)Pl66!$~OrmFP^y@gj?<3;%e6yubR(ID?G||kR
z`U#1_vgYqgc2XT0%67S}?RM>fZ&*ZadX}t&NH(bsTfYxB)m|6LL9~*;NevP)!mQ1`6w
zfCp&Tz6UU%&aMQTJ`f_8=uupr-w%JWB<{bbdyuR9`T5%g@X+{E7RQ>|YMuO_4co@6
zdF^jM>HuF+eQHu4O$Q2eY$YMMHLYUrB5fZ+I}_43+cuVc(xGve=>E5`OCDHnl!+e0
z1{J8C>OdpBBW9ov=p
zUN!Le%F}46vHJ9I$bl{DP`Ry`$4uUBK5T!=eOZZV*DN^j*z-90TjiKd>fJ0MlR5!<
zZfIq`^yQW4I|W?&^>^#(@QbSdE|2rbv!i!{|f>e9pnz$3~zlLe`hhx^`lzu
zlHW=usp@!byB}<*uWk%{O+^|Ty|9R3=`|p9HpYlb=;2t33{`LBGX&_(l
zXhPyq&xHIwCPg$VfzK;6Wi%AmDl9wr@P;yfg4&mcRfL1yB}DS|?`lO-Rhsw9EV8nV
zb_oK*a{A+zrm;5(!(u!$Po>LI(<>p|xYd=XZ(8KlKWk&hw9z@n$HQ>g4#W;(MI|V?
zxgR=}avVWBgQt7b`i_$RYjwyNAtmf!#d2d;G4%K7C$GW0#5c*(;04Xb_Rh75TnXXy
zR_XZl+EXu-y5#oT;{9K*R*NfQ7&;_;BqkP3H~|MXQFKC`LS=Q~o|G#*e&1y4hd9>e
zd99xld^iwXBP2udLEqpXBDp7a?-xSy(;Yc{&n^YnAb-%jzf()
zy*LX-(Odst7l3g!5=JQJ*%iEas()AGbLO_nm(q`VdT~G<9amq%E@yOOjIDY~+j&5M
zYezoHlSAtvrd!AmlVTBA%wuk$Q3$m&(STG#F(N0~jH5wg_CURK(Xo1Yu?}1x!6kfD
zKT_TV$klLNre43fNUiGe4U&W)f1n`P<;*WQTw$x(sBNsB{jkEM%%IfnTT^>V3_;vp
zXWe_H(jIXMqCgDVPp|s7fuJNQFD)s}9KR>+{4xV9^aVl}TMn-kAf9yWz>Sz*6
zy0S4bKm?W|LJ18U;B#Ph+BzT(%=NB&rI3
zO<|NM50#uK4L+xa2bX-;bB#)=JUdS9&f9mgWJCe{FrURattMBEm%<@d0UJ7Tv+U3&
z6_7zF{QK7?Eo=Ju|55kWaZx_u`tTAWk|H1-f{K82H-dyBAi{z)N($25C|^WL5s_}`
zl9ul7T6*bRx|`oD==Yq@Ilpt>&-?!O{<-*a8p47CX?zOht-$vp^W
zI)|lxUQ;D^KUr>?>SD>}(x6G9F9FEYF;Oh`K`mr_mlgSN=k9{jH+(M!_x&Lx5`pcN
z`f$GF&8j<_t!ifnO95nKsH$`tPqJA>Oy!{TbGKS3ljrB@gGKII@)C0n7kqA2<~WN$@d&P3M6gky5vXb{GK#)7WCPMP{=yl>*jUm}M!&XmQ%0RmP`9
zwJ9gbv@bo;=>rQi0J$`Ye$jw0R%A8~i&Hn=k4%eAUAW|Slk*q-^*gOkFNaZlb;=WgwSpL7#v8QGgjR+ER8g$KPQS46yW)${6A`@MD<8Y=hxXKGZg
zYi*}%wo7tsRng~4WP=ti^Y+73e0IwW`ps^jPQKOWF9E{3NCo>n$@b-AjiON(g!+Kt
z3~g7YUj}-f!ghvSUAkb*Hz9|oiOsIsq(8=}7>B+WuX+uYv!^TEo@CE9jm&)8j?2_P
zU})q=cKL|u<#fnz7_|nY&%_MvOF_HkEybg|v&$t##LQ|MLysHQ(v4~^25o!PIiR$Y
zkLC9qGgJ@f2NXT;Y^?sE_Ax&pa{!?`jmPh?I4HjA18Iu()w#(GN#BC4I$)J*X!b)NiAo5^C6<8^q#V%SkQ*bx^0k|ms!@9OD>PV4XUHN;t{$YX
zK7O_wEFCYsVQTh>d8cMrx3qwciSox|&4aj6j6^~$Ty%=PbxpQ?gHgLsd52MF;|GYr
z)MSkv;Ij&Dev>n$ATPfJ7%`#uM^>?n8te;9q0aE)e!KR&a1b&K7Buh-LiRM2UNMpaosfF-$F%
z-d8BXP{%bms95Zd9&Qu2`5#h6f2m=RS8}&UvGABj7&w;`@TTMu1BC{1;*n
zW~AaweBMk2*0T{$UkSr%A+Y+;kb4*e0FU9Tu!dO_(KY_ngh1(j%$S4th3yY
zWhw1Dg1H(Ds!nd-IU~(-o$K!TYB|>5B21Of3Q&6#tsM~X;-!Pe@scZWzu~ss0v^k~
z9COVp#5dLtXk)a6?0%sgy${G2J+9bf4>VN5=c27zOG*2>aD7h5jfcvPtLqX^q
zAT&Z+eh`~xj-~lkF!5!2Nk2^eUfml6(}jM?FRA=ii&g$zu=lxq0MD9nw3V69kVm3X
zxOwTQQ7g4;CBMZ)?BPW6Ny`m@Ea4ia7{1rr+gpMADoJm+&RdsKsDyVldCm4YE@5V)
zuIpT2h~)3KTP;*+giq}205T)~_C}>S>q3pcIv}D}zHiKQ49gqJQX7ZmK)Z@X#jHIV
zQgf(AjSDmnH`;5nGA#V%`Ka9I0;T(fS%>|0c9!{a%NC>PyZPsiL7JR5yUG9V{;kqH
z#{Sz`$IsrCVgs!9Apr5xX|WA5PL&r8vf^r4I94{N_G-`Sx*P7B^gjF93C)WW@eGER
z1@8^(dTN6d3T!WhM0?NT&Qen|h565zN_*Fz7qKVjhghfdS!?6w6*>Lgs;IgahkP57RjOjZ#V(D)+ZNhtq3mv4T_0tgcse3_Ca|qQ
zgK#PoGmRXL%2$Nrn!?s{pTBn9Q~DG#xWGuz9H^RO(H
zX#!i`D$>ypDIjeveTUPAm+@o2Uv_{!ueq3BEz0S-V@CvsL&lxW_kPxJfz$V|Y(Hh<
zj$0HDAzf%)dkBMvTLRu3Z@ypeazoEp+=dl>MwIJCBp(~R^R70!uFL+AZMU#8f>W&0
zy9i~|c^ZW(lqAj(4uEjgAbW-;&a{jg`>gnbIJ?Krl5L@usQHw;odEfbC0mR3f7w!~~g0^RyKPo8tc7)w0foi;@xV;y>
z>?w=1`9oAamXY$s95&*xFzj#^X7&nh#b{A?L&JqFD#t;)Q&^7UtCeWM?+U
zH>+LO!_+eS+yPdcn)7CQ(W9_5-ZftUbh)V5+^~T2=cK-T;L0X=I3WY5!K)o?mS#Gk
zDw^fXXS@3cu3fZsMjh7c6`ra!SmV*0-oWE{V2`BgPxl_dC|E{`k=>_xEh~xP_);tbGv3
z#6-&ks}fOd5)$oH9V|w-(Aai@jSbh~_0l{5a6O2(3oNA(2(5icVZOI@erQ%TICw5`
zq#)~4jmWJk(NTdntPUF+1c}NM_X74(6jT{KQ@W+{%#6w&lD=x&m98YT{;L5*TBdfi4veUw<=JNV2N0^_T=
z#2s~aY&wIP&j22~s=REZuSh4{Q*%^BJv%37a)9!&wp~C5
zt}L#kU`7ss8PVDMxCz{OQ&S~kXXafCya%raUvB}#xp_(3!%V7fMJJl5Svn|P&Ptuo
zMmqPHqLSs{6Cr?$ig#L!Y%P4nLIQl?f#*ycl>-VIBEYZC6
z9;a*i5$8;NqfYu+p+8gAxUg?VAH18|hZXV$!6YU^K(o8DLq)Xg5SF8CG1{AC&U4|5sdA!5!u1}sA-GhD5LDA4DY)uTpC
zm%7gD#mWl8N}BwO@7qH%Ir_>m7@0IhX3mo?S)P>}ht5K?>J%uB)9HgE4jS;86cANP
zhLfVMo9^dT}jO_(C>PhQ_BP)&0`t0*d}vwyH^#w(dFt5ukYDpP&FArxy!<8ikAE-mJ5
zF=a+X|2xA77B(Q>1RvbwLF@g-Ra*5tMI-K;3=34p=CW{`gU$Do?3PmSgPt-+QcEREDg!57tFIOjZ9G}>s
zRua64tQ~@I@jN9n&bEMlGwQB9X=BJ4W^+B7$qEwMNNT`Sjyl=@La6&ri%m;&z5&Pn
zIPy-lkQ|CtXNWy9LPx~Ku8M>hZ5ToDQ?TxsM3?gX09!gJ`_QjGCqzw)KqM`5Y)QvX
zsfvW2#=ulWyj2I=OiCrojO6kS?{+m}=QZE0mebtU93n=WI9b0~ruy@2oZbA|J~SD`
zjvI7PHL%pIA24I4D8a__-Nm}chRmwzOj|o@08`w!G>iqQy$n4b=sQoH8V9sR9UxLR51D{
zjjpNvp#tsaGsLSDsBI3}zyXr?lK^*7X8nm$%0SfaekuIbXPaU7Ln^oF52nABsH4Jw3_FQ@xd!F5aPc*vH<9IUl`Q?H_Zw`-MBKdOXrOyqt&|ekor-86!OPhPT!l=VhbQm-9N|*&@_yCbAPtwY*Fop9-3U@&UKQ4t
z7w!MFQ0Q^C^gMK)T}e|ETKRdpSuW=rst_7aU(FoF`w{D_Qn*egZkGNLAk95v-vya=
z_x@W9F)sbjG%n`H!=cp~_g?2z!O|}PBqo>G5&;Q1CNfN5d^+hn^6|G|*bmjTi=vTE
zzr)5c4AhAu6svC``5GbTGx+%hie`>$zxnBeWhGB%-yZrAcTvVvXnla?gg28bl_YE6
z5{gRN@4~BEVyv6-W>%F-ip+*v*JBD*dXy#i0srW`afM#vXSSLXrb7KEX$*Gbn(C1S
zWSIvd$7_Y76*{XBIh!7b_5P;rP;@jDXlxcmx%p!kbyaV6t6Do4Gs1S^$LjGeJ*kwMX0Riw4QvAH##_
zHhBcXHH;lDGtNtazo$RaYEqlLQ#p^Iu5Orekx~o1U(tWx&zcaUHpJ7P1i_Oc5!@2w
zY|Do>A<>~WBnI|E%R?#9=;csTQnoXnd=RhA@#a}w9ZLQA6nE8JP7Z(EFkF}1WkXk=
zQPeVM=6jU%QVlbkQ$Gck94L?NOw|7a(%am(I~ycDMXD9;ZB}d
zN1fbyAZ)9huzt6z+3`b3(ZMlRk+eJw8uQ7%lWJoP-^h|fsZGUXzKaZBq`0+p+2{*B
z+RY-?$Jqd}XTCxAfbUp1jxKNbUaU&rV>=~fx8K6uf#J>x@=8il^72&S_z+p2$s1#s
zhaW9Ivi62-b``Vs2B5|gV?D_djuX#Pl^@P~)s~`~lX*wF=97SeeNG4Qi?ZnU>&r*ePz5W;3Kfk>eLD*8213cC8Cf(!3?|__%BBp~Pjn5OL|-
z5M%8?`x>*LAqk?-Fe^5?0?DBb)LjoXOXcEU^VwbkbX12@$zN8|H8qqH9nwG6*Cz;^
zy@@>@pdbJ~U#8m(!B22Jyn#Dc8=ee=$*LjB6h|J%ujJs;3&ArGl-u5}?Q@jMy_|3vTep-l(4`w{Kxn6h`%Wzco}r*Z3t`i{MZW
zR#WzH<;kzN%`O~E_z$-&UFh`Ty}Nrm?}?V@*}`;;mr{Y!gnal>??M>t5u`TLG_*SJ
zzC~x-qh2Js6f)1bfzmC7N5h8+zOm|KtVAKqemj
zQw?r|L}9$Knj?Uued$Gl$;AigaV&7+&|>heF}q!#zup%y@KT0-_a(oHMB4TiaH|{r
zc#_jE4vC3sep++YAaS@{@>skBksMA86Y4b4Pm=TNHptfEk@bHz{PICr0uqz0l05Z&
zPDgMX37|b@DkJ5ol8qqccLrIM@JC;9Wy;Vizz<&DPg5!`uwUyp<<`0E(n?}_g?=+Q
z;UnD*Ty*{7gar1ETwveMZXs76U{y0<U}VQja|f%;m4~$!?QPXnfI)A0AIlPk(VU_o@!um(wqe
z7e9naAV4x6D1TO%GDQemN%u0AqTr@_dMjDJ+|yj%XQjWAkNBD-4gl>11+56^YbDF&
zY>YX7TE!plFj1_MpB}owYTD0LVK8#=n2@hO{Km#gq@?PsKEI)_HNTHK9nhDU(U1=$
zf`MGbRn37fRiQ)GKko}-NbBE*q*)GaU?##bfHorToHp_XlOl2U^y#GDIga>D^6kO<
zXe;y(h5MtTdv$uXF#}86gZ;wDmqAOoii!eemW6dKr72%zsTGCQTlCs@Sj|xfF2X2y
z{K(csCQM5R@R|u4K|ZPwK=?HHXNNA`EJ_%_PhOqBBmzFed!AMYO4Z&~Bagi~fnJOJ
z4<|$5ZEv04Tep9u&==r7Bt54?UNvZCB9M7{sr>T;gx}W01li87*68E_s66rLrzi5O
z0fn_p>VE*O`3-UEk?8M)QP8me1i17#*|=cz*y#jv4Pd6ja-1t?V?0cMH+-DHr3T)M*cgepSTo&Cnx0
zvc65f0OzU;y%
z1hmLsY6*Vdyuze^EmbYM8F8w2{WyM0e-P`we-Z0{Fzv0H|AN~$u6P*`ems;v-Sclr
ze?ClO{=JtHRS#L27roOJ3LmmF$aDy~LeoR$8UI^3f7P`s)z`k)eekUp0gu
z^>0)D7BS63`Pk&DYHz?8Kr#qO?XKS4G-l!!!}9X&i0gODe}hbK2}`iz%FK8TT-^(K
ze}Ixef|U31sx)pAHSnV9qQNQG{-+jM-cAfEP0ieC?GEXE0NmDNMqX>x$8tXV;5Fm)
zkH4mgpAt@9mS)@&7c6?R47T)h0zD_~hso60?Us8L#ZI#UH6J5s`H{<97hm9uUXF~|
z^ms<)H1e*ck-4CbL2{l)HQ0eY3CGb5a1`-ya
zre@5qql$l;DETQH;7!SlW8Ta&Vg*w6q5DYN+wa%kz{VkMj<&4gv6>dA7uu=rZC!=Q
zDYBEsh`5%_u!jdw9`6FAY6&8jAo7yfb
zDH?V7VkfO91Kl9iRO10KwTTN;mSTt|FuKMx;WqHHB{;xxQds;>JQxN-Cwm*Nn=6vk
zKyPBb1s%I^%rvX&crh9X(Tv%2umtnZVw#aTPz#Tom~~RQ0}|>oDlFGrQ@%ng7f4K~
zGh5uZTU0k5r6|#@@i;(CU2b`wYdf&P(0p+R6g;ihMz#qbQhL_kqH#al2K$Z%8yCZ$
z|K*o|X4-pvG>!c({7MWZdp|^~so-ajbhukWQ7;
zhV#-p_jTuNss0%0GkvzYAb-ZXH+c?b=8tlUd7TWzoPEdyMFHhigk>Gb>8NRGz5gjS
zTpw*&w&0B~HmK@y_JsjxL!p|04f$6hZ*Y#seh#5grCnN$^$
zb6pDLn_3%43qE(rQq3u{wtKNkSj2h&ExUyks8SmDV?8z662|Iu>5cyhk1CU}YgPSx
zkE=(^ZM*5KoYL#4HSKp
zg10W8#C_4CV!b4^`m6xnk|`?y1VEw^dYz{0fLO$yl395RxtZJk{_uV-W1roTdVF?&
zvxjwW!V{OKi=mAsaA$9v;AxEQ#o-A82Gew$v|lex(=cg#><8Mg9VC)9;FQj;<$3P9
zS)tf8%~Cq?ZQ2zoy~2``l2T5mX<6iYYFyF#k};8OheEd=
z@;imSvQ}#;DkjTrWq>cg4_9ms9@fmI#VI9Gdgl)Vj@%Gg#e3cz#6=mlAEanvac(MkWQBu#?tx)b@2)2dwviASP}UD$o1u
z>^K~}Ss*TxDj$8&3uwjKj5_WM#HV?JEP21rfJB#&MNToS;M5QZ52ynox!Yl^<3?eR
zC{S%GGw+OO)J>ECTOfx3qr{9)&ig(`rwTTu=iRsqHjntc9miHaH{c_I$Vp
z&UXAuKK-x-vc3C8FP$noSSw7F!XK-DJJLLuFw5JXYuT(Gx3~nVG0_&~@49$~2mM^e*OKrdJ}m7D^rxh(>P>^cd8#Fpm9G+B=D30
zd}p-X#jc9IoetbW{GXH~-!>EAc*4H5!*-LCe>?_7h*cb@0<
zl!89e@O*V+7U(g-?ZdUfmirJzgQgLJUT^&F;4z{7bi70+6+@|}
zUvC;LDrYdD>a3N^bXB=MgF{Vt7LKF#!|@(x)<9MZX#wCt{tUnZM3`6Y!-RlvLtfb`
z6H5f1Hew&>GZjm=1d(W2)wMCi78&K~7{|Mpg#0Kd;H2UuiSw+^B=GEsb6?VSREPfX
z!6wm=ONuwkD>E7`FpO7-(2J-_a|kwhOZt1#f#yNLI@G?xy)yzN5tXBtM~&miD1$!F
zf1w`CO^yf?VbaQ`YMteAq84+X59j~MEB#wo+Ku^
zz;#^L_u&cQHn|E{p`4AUcB&Q>@BleZspv;crjzih}-V?
zoyF`Tj{UpxCY!G{HJ7sY)83PiBURIZ%3Cs+K1G0AGM3UooGh)Lho~&X4n!ueR|hj}
zyBaFMWHigGP`Cl4G^iX_T0=Az8m+_o?jx(50~Gw>8{3^+JpmWW-agGai-|TmcMiQ8
zA9K%AxxOPJ&%6srm8NsOWH~1RNwetK$y$fNB&OzN0frNq={hDtaofQT*fXKEUkyO=
zAhkhn%Kf14)w^5k591_e5DsQ!dwC%|Og9F}?M|s2)6vh)c6;JocAlLo0(#CR
zHc*0^xk;1WoKWDjJ=>&OIMFL|sIoi55bu_>8iMtCY)m7WpgE8#E7T1L;XUVh|CU!e
z6Y^>$*-`~@A!fVyNOW_u!g2P^JqNIH%F^HXg|JxGbex%q$#lzgsXIFDA90YCuNuY|
zJ<>D(2WTN^^bPO!h>7vM{rMHdiJ!!MTIgkhRJQx3)gJkI%+L5jNg2Pz0HJ`3EMC)0
z>y24|*8Y;AZ_C3#|LkX~#SkaYB{N{=ZwPJT(1>c~0Zou8pzysslog(NDid*|YgNRh
zllzp;R5F7~^85g0Iispca&>OowA1j0vNxJaVu
zEt97*eSZ}s__g|I*8e7rlQ?sh-yqUA-7Fv{GN`axXNlC$g9piZXOfq9B6f#Zv%Eb4
zOoYAjpI0^2?!-qcUr)hsqw!cybZ^LM&3IKl*DbX1GPI;5TEj;r=S$}&G9y*3mB&=`
zs!K(D7l&fSU1s#8Mwt#kg-$h>vujFjASs(4nRS^Cn-WVX+T!
z^1;fmCBnRfqd*rq&xwdKCX|gNeLwIHf=!f&#^GjG?vn#V+Kb|`j*YS<>e#1#BjMp;
zqn`4`y-ue&rJ_!k?&c4m@<4$nqw~eQE`rLHqi4d<(9m?O*SZ2gqYML9XKyE+Os}-@>O?dqIRU$f&H+G;{-y#GWyU+-1`kZ0KYrwZ;kr%!{Gw{iKo}
zWkr#ce$MTs7G~}uvvT`Qq%@kD1|zzBr8%4m#_jWIOmnk*S7Cj*0&F70>o>ItLIz#Z
zVUOIiHMpkS<^s|1g?nZFwM|F^7kTEWEMs0ia+pxD6lA(+cgPMOjc<(@M&M(ZMY$#r
zu*mFja=R5u#hh}ys*-Cc&y&3QRFwwbJPbASxkk+eW#5OVEV1PWBQ+P>rwIPs&${dH*Iz`;uA4LnQ>$oGJFlczR&IaNHf&2+
zSd7ce%}_TeQO_*bb3~6KA<*eQL9m%2-f_X5<^oM?REBnaNOT9o9&ayYy@6UP^;w>u
z3@C~*QmcA@WQEXpp5;gBLx%=<6yJCaT|{-}t68?BJR!MX5vUrrQ?fp8_I99)mzjz6
z;%)!WR)L|nlX~?`QLD*mF)o=JKHquO$}-ge9BRF0H4J#uQWRV3Tkd0-FCKAEy2iVM
zX;K*L09U^?|4i2{WO~=WeC3x4Vex(z9%3)!-!%q#9Gb0#3E|+%Rsy|+L>ufqapJcNWnl%cX7K@Um
zyO~q(E889lW)>F~F=mVUf`Ls0e>5gw-1s?5I`H}2viZx85)BH;?+_~^y)flMwM-xB
z%B0tC?~=Dsx<20~3k+SCkW`B#ScVp6RAP{2-gRw5amA8wkMD3%dh^q4YUO%<9l+$CB!
zRM+Z}s8r%sc9D~lkuR#{BmJyiLb9tE09ZX1!qjw~7ko%`UXpz~+MNU5wII)w$q>=<
zs;+rk+v2@RF!WJXTs2rI*Sj>Oh+LU!_BW(O$`#qqrK2{6}NK-I%V=8(WOirerDrY@I%HBAaLgLv|
zb|cGGKWOPEf>rd{<4uzA4pzc=r?YK79Z&7HE#Rwa$rpZcHM}{?N1ZXF{Lb75yNluof5J@G;Av+AGiPKhC_u)@0u3F+zW6C~9~+GG@K3bTCJ
z@lNJ+>MY!|v1O`RqYtCs+gvy=i5&GxBC;zsrU-aeQXg?w>ab)o>=0SRBz+ci{3t=c
zL!rHLm%NS$JJ2AgsyznSd>t(y^+mDYVXNbXY)b3IAi1_9weF6vV@{$t&un1|m?q9o{zv{Sk_
z)lNTaP+puS-FG2tG$0|DPL`sk&hV)@ZY@KxBE(-Z-oK{~v>kI6$EyiqHI2IBCi5(H
z5kYL~d5SbCD7b|JRxGyj_zjgU1)4{yevK-S@a)l@cAuNNTF4s$^2O2*CkjjRc5|iQeUJVb|TD0cn07=OtXDA-fs5G7eoP<
zaVJ0U5x?`6vd##04`t@0TF75oyh>g>7`L=EUh3yRxFdJ*>rz>$TwAD^E^TtEEfoU}
z#JDtyhq_~hN==8_F9y6&(1uBHLRcx6MXxCi3VT*g5K%b7a(%$Q
z&)m$Ech|^{y98_XfogvcqBqey*2?=?^7>~(P0ImtKFnm!^SOkkGEfpbcEXvgCIYiAENNmq;h{T8iY3=
zg62V9p?{-oD!`}t1y|b6whRqV0llU{Vjl-xR-eeixsp0Ori5^XR+hgUFoU9IOxthPT@x7QR
zvvs5vc8WGHg`#QBCd$}rh@KBBgS28B_anc6hO)wXxQ0qa
z-A?e7Cvd0_QNVUR?EGMni
zaq8U-Xec`;6Fdk8Jp&2Cm)%d*8j*gIj;w3?dE`JE4gdQHhm;cIZ+tP!UX-G4zpFWH
z5bsEs6QC^52Qn2{EKFqY@l>mR2amE4Rz9(6B{9@d~=Brn8K3#6oQs5qa-Cp6g4w}xb@Jb;sIcWYHyC*$%Jt-{2B!lZ*tGmRwq
zX4cR@E@LZcV6hC-*m0b4UTTiE;OtLI(rk$keclrBT%W3^t(uHg%;u@|3YtUT}ds@MI(z1R>*9U3EQ<4WUr6)3eFye7qI^`@A
zNp~Yg)jxR^#ZNQawa~t}SHqx^mBLa6p^?(jhPJ3rTJ(U}OLwaGQSWv@`6^SBKA@$x
zo9j0Ng*Nkx`xd3WJ}+5F;sa=C%Jx!FT~{7x
z!;8Y{L&Yp>_El^4hc9PNH|Z^(1v;)Zjaz?7u^Y+CKL!Lxr`a|Jo?VecxMu%L@+Y>Y
zrzRi5^v)K?L0WKA1d*XF_z4<&asea>aWAIK^15(KIq)gj#fNQ9oq11`{437iJ?A$G
z4YFKTfA~sC$+~;gIB%-v(v`+7f!uVSWnipTP=Uxu?BHmw;|EJ&q4afjh_z;|V4)+t
zW^2}8Er@*oRpXp_(LM;9<)NW!I_~yh*q;;S7TkZtJy@F;H2^flGeggJnDdHkpOnmF
z2Lb`&fbx@7N4R?_z_~90%+!!9&E|-|<6?IVhyFgbNOq!Q>Wk=93Hsx{x8I0%v+RSW
ztQv4lgNil^k%@gMW3X`Zw=|78VlcNKw&IJP$d0eW{=rAhuR80O8xEw-sn0YkwK#yu
z759EtBhm!UGe@upLg3knQkaUpi+s$Tu&045nM%p3y5>CY8M#kDg!23Vct+L&Y{eISVAAR5kzof$2nq6G<02)LSV~PQ+(Am*
z)T8P&x8jbc?5u?3@!7@ssb}RX`$`woB%NvrpvgC3InlXI%4zZgOvCrrW^y+D9*M%
z3w&IRy_H#+2P;{h4VXA2?f|j5XA70%$oZ5_-9L(A(C@^@6GYr88A+4#aKc6%Z^ScF?oA7Q_+Y+wE5~}MPI-p?kFlB>7bXD2a4*EN&{
zm{aD|d0d6|EyeJQmL#ct9qw-%s9m(LO{l>R#KuU5aNQA(_
z`8aFKfP(bs=|<^PBoH82$rwnDwQeR0q?E@yP6TczJzG^#ZmtE8{Z!NPDEn~t?I2VQ
zP>?sofYAT>;yHX2G(X~C3;>>i(QNV~Mv4-}I>O&2_?Uc@(7*V2!x+defhOyexE&vD
z&smx*FPihC`(W%)970MXT#=%M5PsZ42%pY8XYY+GB*!%7|FXM%IrnUZ!%%qO3bart
z`+#)&cG*)}2;Q@c&(kBw!oJdf!%?gxpqCY*>_NdRM)|GHDyG;04&s1(b^N$UuN8I^
z5B-aCD}>@x%R1g40064dv_5~_0N;n<_m~{uP6%xtLmMy+ZqqT~ea`p%{7
zkrt{rhldOpwU_H_&BdO-?_40y@rDG3&-|vRL>J(~aIhm;e(@=L@eL8C6(6!NuYhB|
z##XIiL*J!!N)m`niS2K#T&FJTT$LbpSJ;@imoO4V;1ysMdGC`*Y(2%?KU{Ut%lX>-
z>}1m~05Hy$s|eXGUN5$OPZrzTOG}5KID8E#vO05Ye9Duha(XU$jWLLvwy!WdyEw`F
z)bKUnp8^FrRKgs?fR2UC%p7pAiA75=3mzyYA%sZPNrc*mly%m>^B%;4=v21oqYhP+
ze|yLHUE(W*Krbd1Gm+NozC591bzKHqD+pz$TgjB6$6CLi-`n^ePzc1U==+hI921jP
zot`QkJVBoZZS5z7-&;sv(Y!WMl}t?*s;vzmdjKtZB7ua=$bR{V>2qg+hX*M7v2r!O
zevsWN!8D@O_iI?3GST<`gFfzAKmNBD>+yP|g0Gi;gxQ-;mUnOFVWR_7f$jKfWR={F
zhC#<`L%}V(U{ZDjxUz)o-rrZ6pP8kHSa4J6%nD|nQ4P^p`0
zS=EXG1S%o&IbPS?H2eTr|66u_?eNKX?ifDXvdNHbi^_LD|AFums;;w`Q~}=9MMFZ0A_H8Bb)r?S6u1x9Wb2LW7k#}3Jnukg
z@Z@8W{;Tfr?|o?y4O(`&gh2o?7Wd}(mA_i2Ax4UXlS~VL*}Q47QZ_X){~hw1Bk~X<
zv{o9NY;@$9ZoF}d1Q2}d5UbiQiSMZ8?nf?6_5DhST+An($_}ZJ>Y+H1&nz;
z>r*X_-4kz(Z{`2}#hsDQm6MJ`eB+*eZujrpLr#t97k%_%e8QTu`15x=<^e!aXN~=6
zs;0@)L+$HlOj~DpVCCSxXS4WmJEGbj@YM5`=*nxdh@eScAq1p
z_Yn3KYGsPHLq1<9Z!=4)nKNJb#RN4`UBtA$&MSM`TnQIve?50d(e+%8unGsa#n1X}
zpWZh%4Daee`pdny)0c3IpP#&t)5b(SinCvi?NE~h^S(f@-C0E_#gWcwk6)RoEhGFV
zwp}|p8Cu$b_7z;Gv9?z2ofU;FmG9NeHX3{-aR-118M4t>TYI~Zjf;BO(cZjGIbA71
ziX0vZ?|KP}w{7Sk7ArIKSDov%c5koidkm)6uD>>+*qfo;ky&E
z|HL^zI~9WQjp*n9{3Q~YM=uAI7JK3IQ@`4xr
z{McmdwK4WuYt63^x^-o*A)`+)uI%A7dKqsu+corvmiaIE3CF-Ic|kQASptNXz7-{TT@FLMpOZi!wM
zp#HaF%(5RS-9An+*JaS+FKA%!lgwI|zd>3Xaq9LD;Eb_5f7X+)RDaP}=zkGc5_kq)
z^xifiQ0+BV4I(p5t%q!|7roVWgK7zE)~NMLuWt83`xk8Y>PWbYYD;lr
zeZ|QfgCI|)J4Dac&B8XKaGB9T0K38GQ6L*`W(Q
zqo)*NoEEgvCjTZlS$nVQTKo68*|CuLFMyJ>d5pHk8}k7r5BZfg_3^R<>W@ZFQ96SBukEXy22U4#{tT-_o#(D$jO>8*}c#a*Gng
zmc`&t1JbY?lxCsGio61pr|0m|10G6a@cTvx(G#Iv0q?$+P8dxSMw!lj21RrE(`+7IGhx38wuMaKTAHz7Q_*a~-t>LVmZ&V9@s?
zE$Q^@Al%P3$=KW(YTz5dVJ-mNvVPB}tFD@-`L8|t&jcwtGYMy{LE=@FdCss73bGDyBl>+O${Sw$>ooJySZ1t
zEy6pN9EM#v78x+QFakU;LC*UbtDi{pzCdDLu*Q{LH0cv2coW1-+5RB%Mxapi@sp4~
z^-8|-w@ohZp0la)=!*y~?qlF2!>+-e=Cm(2n?B8rG~cKtpwX{xSU-?qK~8^2kx2+B
zrRk#P7C6nJjITLhKPn!}
z{{19n;Kj8k`xaRX#D?O(f-e8XZDQ12b&7#hu83XuUl8q;P&jx`^@j6zQT31|h^ziF
zQC>#>{KO_?{tRa|F|dYb)uNPQi)nWdhNX|1|`G_T4~+e66G
z(~Yp}*3QR*WtE@dx=*|+n?-8hTn`x9yoIM2fBbgH=nq0Ny+2)P033SXkgFd1FZVav
zdfEQz)K(#ZL(1uxKSOK>uLmW_=TC(^8z^|!kaCDKcu)U6!wmKG>%Y%4^T#UB{cC{#
zf^>CCI~MF2u)MX6;#cM`k~K`rYKF-x3qTLu!R9m>w0
z%wF*?j-{;?*hy7d32Eo=p}mjjx`%RIfNCv{8%~Su$-}MQ+sMgKi$Zi{CH5;BO)q?i
zrWV6J79wLs6j^6XO%f
zADXm2E%z2(F!y<@t%NN{@LrIr{aKLwIw)`PU&L$g8{u)xWq&gE-+!Ll6b%Q5JCc|z
zwm{y!O9}_Ht@oX+yb<*g-8$D3W19T}ons&qECbF}b=(E#OA+}xg#KC>ap*|%|G!D4
z|G$61PJxuSxsjzpjvo%c75R7Z_yZD`P_X;paJ7nhxrLhLQy*SK-TyT;CK&%?m85?|
za{+?uKkX>yJ`h^@JI>?&tSVT4K8SPu3rtV`W6$V7gZ`R|8-Hr<#rX?Y|97~v9Zn(N
zCnScJ;g1oerJxI~w)=23Z}~rl8*g3xz5_Mr?6~&Uyeg&sz{mf)T`1co{YmRcha5EG
z@V5NdY#`ym+MI+e446FqeCj{Tq{CN~pbvj6QM^_M#LQZFW3NGPI8za7>Xqc_dQP7z
zscXq5d9<&$clONVS+?3MO$B5-Ta`DU-mlc2Hma~`1X5JOu+8=nnfcMo!d1^J$rz}$
z3Ssz@fRCEX?!RgMZt-krgnEX1KXOT
z+gidtg{+1K(1q7g;9#5wI^TIU?;08zBy|;gvMI*|%X=732%{mVuvY{6H$2EdQ1}|s
zzj@pGREtdU|B^wQ7N|wm=9S%AOc3?Q0r`)^82-#Eq?_XShwt*0_)oC(pQiBt=;r(#
zBm5^EvSqyY`H)o^gf)26I(Hy@zU{
z7Xbz77JBapfdB#q2q6L@B@jwzinN4gOyHg1%)Q@yGxwkO?)x)4=j^@eZ?Cn^S!Yw4
zQ2xwA|04?i4XyqZz~2nu|6z*9V~bu=&@Wx>Nro?tVoWrh^-oX(zi)E^MGU}@dUSm4%d4giBKZES
z1$<#Wd6aEGH{!ih@v6p&#`#12dtP|W4;(7mev?yYbU==RG@#713&(CWZV3H>;QzLz
z|0>4^Nr=Uxtmb0UnI#oo5aST@oFD9A=j$UH0#&RNjXDz}&QQ;Oxl;
z-qnGV$Iju;`~-Rr=RIKwR?m-)w^p{GKQ7m4b#>EIzQ~=r3VHt09wmAMio6SYvp8Q8
zxr31*ydo=Pdg<8F(J|qz%i>);LexIrSJZV*haX}luCdV^rBEKxzwe*bp_Y?4gXd&a
zTc@;uhQFiqOaZ`Cn{(%+m5miJ1Y(>Me{%7s5$%q4Qql
zPm8xWimJkedmE<2{{S_h73*m5-x_`c4WGW2J~U;X@i5YgT)C8-$9+2NS7#-oEv;qc
zrRBICe!eX;KK_A>EE!_0E%tX1m`<9I(`TA#1-yULde4(p?$tsZs_hGfmQUNaJJUJN
zsHv$`8WT7Y*b;X#uM_XLIwM;D-0c7J=2VqT!=7+dcz+JLkxaD|s6v@B-1U#G#p7Rv
zp1)1eanYD^DM-CH=2mrPDh6_l)wH@P>nbX2#OL5ToO8
z0yb9J{Zg8tL!guJW(`|6BXxLKg({aK%;hK+L!g85B`nf{f>(L-D_xqQe3AKd5ijL*
zALt#Y0=zU_kgfw*!r&GK&R)|~Q%YtJ&V&QLQT&+FIjDU8m=!QodXb{R-~X$(6ki4v
z0gHwUe2dZQS}!To4TZbA-@z#Ei&T|{>=PSO%>t_*ya8w|)(KLiPdF6Qd7yjNFg@Sm
zl)iH#N(5nt1vfs7bB7K7b{22q^(NBinCw14}A+{|rVi)6;nRQWX38
z+M{+pDZhx&-5!66nJN(O4U|Zb3~rtYJ&&`+@A5PU3=!jxlocHe-@QP})|U0O()
z-wrU11CxgGCYJM7s)2v}kTHLzQb`TiBMFQ$|C7DT2%y9l0YP?fo(<+aauv;g
zaFrEnkaR6j3!Kdf;wU%xr+NP3H#slvT>wIo?X+I~Uz1t;(o~;12MEW-@#VX0`Xl!<
zUIvx3$pI^;RCu4!|2vO=I3|%Jd`9dlhV2fpLfdv^^~jh{K1DRj=M8Uy%KCuRrabvP
zljkqBS&xg^P{i>`!e%gEstN=Z0gN)u0mb*~s9bCCrisef8Q^x7AqZUfS3YK;6zwVJ
zRfK`0nI!?TSjxlpO?N<~+zY}Sz&`^8Gt92z&oz($7i5QD8vF}_1Tlx_<;4y3S^$FQ
zXgl{hXp1cO2UQHz)q>Z6DPzszW($82Ph<&apaCo*APUO_V(hBud~MRwn1Q~BY+5_T
z!aG&|15sO
zSRL4=!b<>{S!E7)3{p6KG<_;(e|v(-Yo6vdm{te}7SPIP;kT%@oACh;3u9Z9(J3xf
zZf*`>J^)Or`*|l-Is$!bfM+ia^ZV=+)pZc#K*2ZefGYbZpSJlk(&P^HtgRjO9$S%B
z>rIqF>qDT~!czK8;g@9O>Z;rf<>5ubGokpPmeyt#D
z5Vr$(%Y7^~-=Au~ftp;FE~9fzROY_;dB9Jr3#DnFycqsEI*N=#eQIuYU!3!e4cwU7
zlc<~v)752aY67ex3e2pDTzuG#?u(%kpa+t(H#qx<@V
z1DAKcRuQERy?+C>&pSb(?k++fHrJ-7wGW&V_-H{OL*@QDwjQ*VEuUBaMp;=Z5^2IC
z1gd&wGO|1`zIm}AXU@Z4b}Bv(IM~?|u%v40x0?PTP-uuZfj`s@*97C>dH;MHL)U?<
zS>WB2D05$)UeR)KVO?lAaTN$FI`RupPf5EC_gs{NEX%$LA4Xd17vS%=@iTm+lDSNS
z(8Cv=CLQdOM#438ISEtO1=(qUeZV`vK~?u)8(vK0_}bJ?
zaXVq_-jlKrikHHea#sW9Ty($Ubg@5W54~&Bx=b8Hq<|xBSiL4}`#YQ7$6bd)q3Y`D
zNvz{otfHc#8x|fRNp}1YDl2=niS|k7+}zw)l_d|v$JQ1HygR{_cO4w$?=G78IXHiO
zO-_`N;nkEXpn@ol!KZAkoqPO={3vJ`vBGcLUC)_qrN-T|-OU}+lK_LkR{rGN{v)I0GP$qZCP2m+j-0bY^{QUgVl0zaQn4~_s
znq_<&Fa~4YQ=HeQDweFm!dzU0`gO*}#`yX9_0dW)QC*^zaPx-`bFy=FOteQ-cCMB>
z)ub3NEd#Vq>-zOPPdY6h&=S-^VI
z^D_a9scZ3hP8#4D&-46=)6wvu!Lndw_k_}ttq$3@{39C|qsC>o!$>5K)pk^g=&*z9
zwG@vjjy;vs{#RH7tOA5<A(nw1y3
zyT#HiUL&(xxBn{oC1Pai0>esz??;_PEgH|Te%lbFoP0{)-jIhMD^pUslm)6bqBf2<
z3PINQ(>qX(IiH)8>!-U*4B8b1V9TnaASTa0R)0zs)~b}DE1>CEU~|rKXz`N#qN!GP
zq2gM(sZO({@ehyIl)|ruDXCieHT2Y*E@NW-dARVn?ekFv95mpa4!Th0mU$Mfg<@GJ
zUS*3U!3=H24CV#R`>}lD-0aMic6D{dGK~j%n0u+<$l3wNA>BSWM{xo}8g5^7^n#s6UWtDj_2dr}#;`VK^KH|&t;Jp$T4Yvhf
zte!nALjVXG>GCvGZW%nQNr|g9n?G>G&K1;NK&q74C=}qq{%XM@kT@6Tnz;GVcrq(g
z(V{Rwub)9n7@+S>VKc$~ovxmTW@vFf1ym~Jz
zT&u#_&-;D;4KtDs9NXH`-gbeBG&U3FpVUXDuT*g*~$6{_8!
zb4f*Ryt)0BXV(Obz|!1sR`gmLW=Jt6XJqY-9@qQw7mOHRt_
ztK-C;y6TdjwVHIr0sOuD5+id
zdYi$7xj`VgLUbl;hSpFhX`bYvTuGw-*3a+X(I3^$W$>L)zfREQZUO&T+v_SOW%t%I
z?{CPkC5uP(Wnjic0y1d1)fxQ4+&BCjm$w(}`VH|?(au7ztefOp!?1CDYZ6U-U)0*j
z6YA5`Ioa9WJ;~GKH3$TMQIU);F_s2Yt(KOv?xhwjK5AWQt7?6P{syje+zzCpdjiy6
zipo(&-n+S&>qbV8x_;Y_P2E|iRzPTNlaL(t9c5FNd!0FY4%sW#JWW~;>a<$TJnh`l
zG9loSEv>OdSwwD@dA6_uLvEXC>V1LOLjDjYZitUq#o)xkJ3rERw8b`g+aex?kYk?{7Ii-c?a;
zyEoq;@$DHSsH0y~^gy^t;LvqboGI_L=ezuv;k9~FgHKv;S8$oVxix1+e);ZVTI=wF
zL))n2$uIS6QVOjK2U3snfl%e44i}2c+yS~SSSH|$u;=cXOc1?rx}RjcICj?rh+`g}
z#*U98&x$HdJEb>a8nZ44@*wnHituT{VydKNaAPkvg53gwzT9J!N<61cLu
ztjoWB>!ZWm^~Bvep7l;;(s$;<>G=tU{?d81Zv2=cvjy2HI>q_e_xFNl&^G@5GG9o`
z^Ssgzm+Y=Fth8KRj^-Ab=%Xpp{{b(6!MdJ2sWodyXJRTb7B*zpC^r-KzkOBz&WyQbUT#j0UT8poG2GZ`HG>3Z
z`mwua*4-Nbjpv65&dHlAtUbdt)-(rTB%8CgoY!~3zDOqvyU#cr&P$;r*m>mp&qt(_
z;(>D5mZ3;8IK;LoJ2$&N@TrISsc31*8{2Aal8d0=T-p=rR*4E{n#l`eRRKgxeD_ez
z_}8z_{cG{1zU7-Mv#*2whxU2D*x6>rB-JfXvSOyuu%=)aJ(I9hCAJek&i*zTn9&|u
zBEN7gtqG~6&
zm!&Eze^b!X@-vWIl-V}+w)8R#zA{>#aATtO;Av3~>qb^@`og_(3Vk91mT%>?E4Y4>
zISpj1dAJ4w$waWl+r7@DHPpwq+?I7kLv)ZXq`i0LFb#oo{oPWkKl+u$-3`6m+-
z<2qh!3`nf@eYC2G*ebu>YSWRGnYa8@0r2Dw3A@>*a=*kiH0zTrlhn=KFJFMzeP?H<
zuYQ9S$ehz0BMmYXg#!mi-ZWPZqE&f5f|5eIt!9^O#W#yj63SuZ_mKek8)8PUNVD56
zD;uZ2tx_u_-KWywNsB;49o*9hz_Xu^qyo))qcUtqX!m4t`N)RlMpXNJH*bgeoZxP-
z&%HE7*98J?ax5{`@Z>-@n#8v@PHP#N9zY&dfza6zahH#w#-eC-p#v}E3T%LUILV)O
zY*A&#q0*!(^SFFfgLJ%6!J3|NCd@z%{nQwBU)+PRS%Lp(wA|cfDs}=Cu5pUtsq@z@
z{GAbZbgftG%`UtWM?m3mLc11L{}f#plhIgf25|g#$0OqBQU_vdg;sl=kZ7t#b?pra
zkGgI4;P#!K$hjXfGXS4?oIx90Vp|)oOdjGhUmZcA$m|C$DG`WV_#)BZBP}R=bnC0<
zUh)t6c2w5V`XgdV)A?B@R0pcRdsah#Chb1(g64qRXzevRNPZc_^?K|txV7plswCM?~9roqVaS!gC
zkyJ4K_OpitNSXVFy++(O&T6A+JnFhnlRn}ogPBc6lle1_21Cb*30*$OTN3EmaqM<9
zU-~Jc;)A}f1|vNeJqQG1)O`NT5CozHR%vct
zq6QYb3gv<4?sy_ROg%h`9C6S|FGGduY=4#zrSG9
zgFau4aKKc)%wt?p~9>c;U@bm!|0)Ku5cm$USzthrqS
zgXilJ7IyaFgs!BXBqPQ)5am
zoVOh7Mg#gRdE2ci{d+mL`hbL;^&vX*`G;aRO--ReyBuoJRQV85beB$xe;Duh+SpgF
z;r7dB5o05^+m~q`d5=Um+&OyRAE_yMy71;g^=>1+ni6sVHFl|3#q?BFUYi@hR=lgjTLc`-k?2S
zdhyFRk#cyMeJ=w@=O?tYsO54T?{3?T(2UQ*_57u;ZLAG$em>zWv<5{mqy$i=8MI?t
zTJOC;&kZZqZF3mEdvb&O3TS+3H>ll#EWPvmPHUi2VuCtdd~weIo=P8L{WvY^wqBAt
z;cO)oa(p60ZJHQKbyHEvfy}tH^_wGkevgXLR4XTvhyc-mW`$rEVkeFn;vBTl2013J
z5k=o_vr2(L=}V-5oiG7g``PZzq4&f)%xxBQf`bM>E=JVWZqxRJMC!Xs<+@R5v44g}
zY~rXu-B%MhKSzBS^#ImZWjM0cc|QxQ3(g=W`DAtdS1UIsbI
zq$_OJ+xrfa5-o$3Jj>ro{v>f2y7LxVfSkmDL4?SsOG<+?WN1J`ays5q9`5_gPnWja
z-YeeGtNwK1j`8gFT35HkoET^!>J2#pjKn&(TfK{3HifAKS+Lej_6Sa;oe;`s^(+
zFJ&*}JE@sB?+`XXZD|U%ezb~r3}DBYtm2tYe@a-}Sn1f?HSxT)0(INNTTb({5C|7~
zZPY1So;h&AHyg(V{B^-5?UmpQ`wc3YS0l~}evk$t=U(L^lwK+p7ggW8A+KW9SnvJq
z`9b|Qt&gLxTwL_hZxm?gb~4$#6Q@6_38IUj`&;|Dr&u}BOzWpD)TANU!c7A+wmJ|ey{*ke^wkT}!_DP;twjvSV=)KIr`~)eT=h-$dxJNcW
zrWU;S_ltU3DNW=fmk1nJw!hq6TwL7G&NemcSl;c=k<|G3)G+{biNSbnP+Ul8
zgid%iL2AH7R2Wuas?GHw
z_To%#+S;V8IkrUIPq(*YXLt5bf9{_~NqE?p=)4Ph;A>TEmRca=Hc<;Dgbl2ZyHtL<
zhp(_~HnF#N;bMhyh+4IH{)nnQomwWPva+*tu%5_!Sm~s4Ujy~)W?z=(;;s2uI`EdT
z#hjd6?qs2ANEy!m`Ll6%i8D@ro%B6;XE~w^mRsgosbmbX0ymr6mhN5w7WP9{RmCY5vQY&nee;e=3VhTP^e4tMmP74PWpph6N2jYf@P$B&#%St-c+b=`Y+-dLHw?;^U1k59X_Eu~eD@)A`
z+RGjqGjhC>R2ZtLuW&BfDJ560Jr{lXjeb)iw9hB_isaHDz7uIg#Ptkrm?JYLN9wXc
zBl#*OlQM3#9pH)&HWwK7uS?FLb%Q=P
ze}CZg{J;((In(E}1LY
z1W8}sBA}l6<%@}$+PlaIt3Wky%0G49&rIg`c+8PP^cSQ~Oe`VIo<}=xx|SN-wzgiH
z6ovC=x7btyGl^zkqc;a}L7eHPHm1wa4gv-vF$35CR3eF53x=V2pTo3bKSEMcgZkgr
zxgNcNsn~rzdKP*uyzm9F6!)|@b@ejWCl7p4+~7LQcVo)zYyeXE&6a1Inm?`}PYRy6
zFBBB{Ljn>0xS?9;daZSy5NkOTZOUf`#;sV-fIv52=oz}1ORTJPgs<*^qi&zJ_VVS-
z%*0m-gU^@e7&0d4WY-gu!ZY3>D#v{pXroi&Q8AcyBPQd?3KN6D;gGtZfV+3^Hd!Ns
zj+=>7jWt#-xb^WScucIe)>2>kXj6H4NrT)!{AnV?Y1hYxo4!3FWQ@$lvI&=OBIyU*
zAoV!zRnhWyKghF*mWfipX4>D5kmmliZj&b3>-ilYH-2wo@}g5w
zv<~WPn5u%Day4VVamUp7w6rwSuVxC>nNKI{%q!u#-d`NKmK=<++_1xPv%JZm|1fnZWTTQdTwLF1%bsyX4aIs@7nOoIF7OkzlCN=jyzz>E}?-l!5hu~
ztF>9U&hJ9xQvTeBWYkJ9{-W_P*8LXg?%EM-5g=D<&$Y2@LFG*Zfmt+}4GI1?h;zElm?)Qb!+Yx^td*CoBAp
z^mbvygqKMlv$#xQs&I8vYbxv+zS_Q=*tctSXv=0GU6)A@B{B3{y7u(5a=5Gnv>>kG
z)oOJw|2YYUo-G6FsGA6R2^C?+*2$bQwy`a-cJi`iv3u|r$@~-AA6D#;Vead=W|CA9
zmT7M1yNdaN-7jfV>K08QS9U4gADEff6wgoFNoPdLMB%zS&>q9BD5T~{!QI3pT{63v
z#r5&I`x?%V3abrsbw6s^8x;}g3@}wiX0>_7>%;61-0_mblG1#bMC@{0-$UMM`7=-P%IlZfdaN!`>f_?S&`ZanYlMObCw
z02~(;_4A3^RD;10T5n<72|Fq&t&IEe%z1sl4jf_m33TI{;vI~%{*+M3-S&BA*1@tP
zk49#VX2sPJuKfGWZ3d^=vi=oeJ?8beOI7Nl9O70=#N6=m$QvK=N@I^U>|Q@W>TsvX
zosx;-!GBJVx6oLSbIow6QE|go$t~G9)&5*rJr6iZOD|Iznwpp)X4$kd4fjQW&C;uz
zOeBM+bUoa@9<|tY#fP74Yef6!3X6(}NFVF%O|J2N^dBkv9K6v{Tagd?!rHU!dm&L^l2e#leMRmq6Xt{{>s`#&3
zBWOH*^PTFsRM@sb@b_@+p4o?2RgJ|TNK(>Y!;%yXU2b6$jP+oN0ykVdK{$wbd7O`a
zPso}5#Nv|lu6ZC$Sb_$^f_Iuh!3h_SnkfIOsAT#+ioxYHE-=VpIckoTfWiN}o99%d
zCKR{yA!Kd+poFQUmAbhPrc^YL+ry=8G%5V@p}3(qJT|!jd=-a>Z@K^Y`3`qi_Gf&3
zWpC(2)U&4OrCa~LH*+={c@zI`*k9iOj2xTVE9pXPl&fe@fwET8>7QHGL=-g^rkj|X
zyTpBveMq}gx76VI#$@@~$C#Q2+)_q5iGeqxQB1hzo26+UVCpmFxrtAV=5)33#9RF=
zqL=%dAz|r9YA;FQI$xt;WOFr#4?n}=RTA^FO-kMkZ))UsOjanDjK1QzSd7QhmuSG5
za;{0*c|XplGs{)@5(a~Dd>vPDH3{v=2@B0zQ+DYvy{dFL^8YMg(1=j}s!}VBTmjdE
zFB0gJa4&F`QC3>w6}OAIcC!@tB2}7;>c+0DnM2YvN%Z7}qn#=g?tkulaFrCrF)j09=sfEAZ6ieD-;FURd}1n4`V
zi~}37*_DcHILH{1)$J$s(o1zDXTY8xz4oF`%dR*7ShM8)ePTf%OD?OxrX=}QJ_{lO!v
z&qpNvwd(J+Pk7a*1a1Ze|E!%7T3E^JZZaawxeW>{zfNHk?&qjwkH$EgDjbw+0s_gQ2=h95cW
z`7-)0d3$kn^*{VnE5g-PhKqRO2Jhr9Gv&o({J2CsA!Y
zQ=#-u?G>QrEW-TdfUj)lAMRxJ`cv+bIJKjtx#(8SUQP^HJDq?2sPz&eE5Ndup|;;N
zc}I2ZOBQD_;xMF
z8bUI~(pS)(Q?i>L0R?!^xCJYYV(ZLF;kJRhj~+I3vNVn%{u{YyZncivUKv_TAbh|&hWj{5>OvyT
z{*3w?FE0%KS#hqK>Wrh3`yCN8*lYIV{4h-?yn41bze#;(H3dT;mJn!+0>A87q>(C|
zo_^26_rXiBk0VgX(X~APvd5Meumfg51w~Q-)OkOEd)y?G2Ir9gB;B
zqaQ1n=%78llk6Pgh_W*0J^2y|#c&BlH^%uKg-T(eHURAbPg70nQb%NjP*Nc7Bd*KL
z*ucP8f2jLXa@*xIEZZ(yj&i3CEi&McSbwWb)QhRgaX4$H7
zS#_P>PknlJ|091Okl_L;K#PGs6%6JK)Y(RYZEb1d8{MLgMrWOSlUtbeE%w=gGe3Hk
zIX8EgjqN>yNJWVg#KN_()Oks-y@*k;XBqV3hy&Q=d7?|Ea9Nqf$U9sYCI+jaOVP`4
zJ(aSVkWirt6!D<(eA-%Pfhv(be?nlDgs!b!aQ#9r&v$J;nc3Yyqsj4x56gPyqbBG*
zJ6+!8{F5vHH)h|vw6u#@?EBvGk_z3bp^3d+0g|)!Wlp(Ry9k{^LO>IuZemxwuDOj^QX@xm
zr=J`uZq$zQ_|KGbr?9bQy49s8wyP)bhVDJ=TInoK65#X27*y$v1r)^L%p7^9$9(aY
z3=9mg>Ts1usO%lLshEnEot_xJppu74wM6%3x5f^3qoNmq8%X>WV64yB=%}UhKL61o
z&yo+3ny}`6>2SmJy1n~{g-IoBNf{fi7_)C<#O;8VLTj4KFS2FaHm4e!wzs?ZOcy)H
z|8h%e3gr5X{L#2kwNW?81su@xzUTNbT332$xbAoEsKu^8inBH(V_RVGr(t1Kke$>&f
zfL@N0`&5Ghbf7JgCWe`>b%snl1BS~NcKFBAf97aM7*XD|R_49bw_3kDpdRg7KkYZa
z)u{Hn{g`}a=_86juY%6&U
z_LNz^&@EGjPcO$+xfb6Ri9S1R_C2nf^w`29a^0u=w@`RX|Lkkic1qW;xHldx!6$1u
zLzmLYbjrMgIEb6Q^uLU!=hJ@w{aKO;7FTq*;5{H`H|>i@hEp~U2;%59p@Mg#UCeiw
z(w+PH1VsfKPs?Du;cKO`gs|p;rxgEb(zieDdc5-0)zuOmrrIiQjA^=b12sH()0R~3
zDzei)MrYIh_2C=#h7QMsf3I1G9ev+T&-AG3P(GNdaU-pOS+&8<$~-*0M>{0Mo41My3
zxZ86=%kb&m$@yErxl9Upvbq;XTKF)iLTqsy`+SS$U}|^5Yd-97Re%z-ZlFP$cF2_M
z`ebIapZtYe`qi^c8Mm2iDd$`&8Z9kt)w7-67{1_gTwk!_MrFHS=&>Jh0!+F>BIIPq
z4QKR_@Q|%G%E8uHUc0rVLx{5P+TXmVT~?taaWthUW}jEiGp02ZQtz&8x74S>8~j4=
zf#Em3MlZ9kL1zJ*FHGD{2OqCf({o#;Y$ov~AA7Gs_g$G~oE=176Cp
zxLMO4Qg%jP&-It4Kq=yId^r~;P`9OWJccM(UY8B{i(isf^&{A))#$2HrWnL6>RioG
zET6YQA|^v%y1FoI99^L`Ka6V3)0uAHU+_NDS`visen+?{udwFC?yXb4w?>zWRS*K#
z=_e5*pu7v=9Px?<+o?99FMr%K+XXLe;84I!6nVT=?|woiB232h>+3fr>vcgU1`nNb
z{M~`X5o^Wm(Ng8^zmEAGW>rhqIR*@~~o|sz4l>O&q-JUwNp(=f<<)$}>0F
zeIDRLpGFu1f=(+}{y3=WWxy|l-~e%f}O=p88Lx_ElJ7Du(MFxg3~>2nUVCdPP56DPjCzlcS^!r
z?^AkoadALv3V+11JPITfW?`2J=ue^HzEaXu*aVQ@oL`&ml$xV7n2DW<8a%$Q`_$f>
z%1$D#G!f$!_qpUMk6mD9XqTI_br28f>iOfXR+x7M;@a}3VYp(ghsW3BJ+tt`1J$#aRAXDa
zNDqS5s5imVe_VXB)J~(o42#1&i+8&c^Rz!KrPMQO@|MQ6hE^%e&}~m9<9ME=S!;a=
z7&}GK;763FsJrVZ1+e@*0))7Xx-fq)by&EM`JCR1b{<^VK={N772)xr<6Zk)3mlq%I)+O=*
zGVvRynRF-SW7b+Zum6Z<)xl(TRaBv6K|_|ZEYa6*1MiWR?MGfCA_zgt*=)ilCtJxz
zSwPQBtj_&yfwCj)SavrzJm>3!A7SP~7jJQsumPjlsxsh0xN>gXO6w5geQL+o7fJd%
zZLH1wKB0>pJ_Jfx;JR1zCMg}$Vpp07BDXcvYK+xUL~=_ve^&m{)^q?
zspbLaSE$uZQKzb+boze_RN8Nh&X&<|V?nIB)?e~fH1-h!!GgVU$2DRY9
zok0H!6~1zE1y`Bh(Nt>~n{n6z3X!m&I>OmufxD0YUXLNB*c35{KB=xP
zEYvvI{Kzh5+-cRTRMYp%F*jS;F+Q{*{hIRDUIq+tx@c<6x#aZ|N0CM%W1BZ7>L{do
z!iYkDbz(Niwb)v5Pez1B_W0U_?_2NuoXPufWnb*ISVF&(L=|)-IRUa3!{e3kZw@LD
zj>Jub#qg9*N*XFcvfbSGv}zPLYe!v%LnAI;x#1)Q6ErG%Df|8z^R+7Z%*szIfb5I8
z@#bIO;|yp;RnPE69-pCmnXa!?i*K9P!AEb4TUHmgv`jTkH|y~cJH?vUzu>}pb&hO-
zI#B|)t&x7Zf4oKZ-=d;1u2DW+DX?Q+f#DNlc>FN7G1=jpjkL71eBtC$TdS#OXZw@R
z#XR+d(~@@P`rM<{2qTIrwg;>GnF(6zdGc4%_GOx%geRaLejMF-uVvLl~+~q
z_aP4e?Wnq(<$Xo6kYo``GCMn|Y1dU`%T#>Rm#cb)HMM#;vJI$UUf;c8-h^T>%!FC_
zSTt(INX!3;E))@4_;
zZb)EyGUPu0-VgEf9N(k?sM!gc0|KGhf9r8H-D-}uc(dzD*fAD^xgOs{t_wYO2@-;p
z0UfFYi3B|M-=_#Gl#kus$}kFNY5F}N_`z+wiU?3xbzjv|n=?xNL4^A}+I^E=(tqK2^U5(pyq)@Zx=wfXOG2ctT?F7mMDyorycR
z8?~PS^_eFVD~Nc6wV7FZ8A2c{U=ChCm9Iz$KA0YM%yEvBc*$b7_3`}a5qw5<-Umi)
zwkOE_d~mQC<}mjRs#}!*`~Pn9+a~}&DC^VS!V$}eh=kxX$W}`M-!Xo<052u)i@ATS
zyX+>Ai-+}DEKmHTZ?Y3>d9b;QKH5|~?t}366(qtb`HSrdDkBMrML!?e1kOFnz?~$r
zEiNuwhit13vrH)n=7%3p4xBggvO^{$M6zMGkrwh*3_k4+-gHmhMwjOeiVg_j;Xslu
zy8^p(^5Y`k6<||MkUx~e+9&Y|3Fs9e6+#aHX+IrAq+wRFk*e<%L;0X7`@su|8bx}!
z?(pR@4?RE~<_8XtKdp?{ELRPG6e385wfNq1i@P}$xSWm4*5C`>Q&@7YckIszU0NA7
z;R)!7Wm63~m@ZzLk=|M2_V{%D;gk7GP2mGs@?=tjT>>g>szG0&80ztVs$Hn9tZ&5`
zw~$0`u7^(g^^H3+b4$EF9Lh_x@Qf_e3h)0~_4@Ze1$iw?!2*rEEiF1jZ&R61~g@e5-LKygi*)jW-%6*jppnp>90@zu^jm9jVbIrKmpkjD`h
z0QTVWG!IA`oKh~o{$-RMoBd^^2bW=nz)TGchFAGDD%^5zYoDGF5zUNH$g3bra>)UY_z{Om*WRh*W(Q6Kk3h)WwGsU^
zh6zXshk$U}2sW>Gmh@TCC+_ElpV$JI0r~*OVpwUZ!RnF?Ka|WxeN$3W>=3OJ-8ayK
zrUuqOT`P`~dTMW3ib{hV>rOIzB)v_J_c!=L*Q*HOXQ4gGg1xC?Zj%*2E#g*e?5a%e
zlN>zvqdj_s{8QOAfB7&(y5F)C`igexgE4WstHEqZFLpGw;zc$iY%zzv7t1!Al3K(b
z)^@;Eq~Nb|cCx#LK5IP(ba#;XO-;T4Oj^-|SmqagvvGDQ{^~+LN+Q>O7iO+loV>2m
zKW^jAp&DxCv8xvy_yO*B_byv0PuOS0G8jx)NT{p~Hd*Uz1SksY<^IfrNe}e&1NW(o
z`e}#rQIjrbhQ85b*NT_dzH1VSVP)2Hn>$Lv)!r>`sK0-&9?udX8FbxK?6or5j?4Tt
ztsMWcDn7Kl!z2O_@$R{M=Re@bnFN7q(*8YtjTU8|2qBb>EOmDOfj
zW*8I%#G;egR+%Il9Lmq3$K2#F_7BvT9G!s~I?Da9)u9LM#mxSOw++
z^)05@Ezo_}B6iv7mc4-h+|6=zjVpLn8DV6(>#KJ>#
z-2*k7^Lx*$CJk0(l+>YZnW07#IM+TcvHM*Zn6U8-w70KxKHk?{O0a#u;E*NLe*>K!
z$-Pq%XnJ9w%ktak!o#%Qo2%zQuq5G)abea=2=r#ojVx7L$=qPnjDEX>XV`~NFIXMO
z-}XIgi!x5EGY6+GtE8mq{6V#UI2CeL{lVM*AlFs&>N%qVEeK+B!P)T_Zhg;FNbffI
zm0+}?lSiGkz^PfCBY<2O3mE7l;y;zp)5SS_mp8N|NJ)uMaL4rKm&X3X)sJS3_KYx$
zo!VBUg+BGyv&Pj{b%KzPa`_!$t*8Hqm@l%33;+C|E4AU-
z*n_#8+CJr~?rFB!mgchmu>GAsJ6ACh)SmpzAl*IC_W3v?V0Y*rYw8snhu?$>O24kR
zru$&|?L2xLE^K#Un;)IOL7=Jj4Yt{rJX+d}=Ub0vey4%5PN~{Hh`g-&dHzX6syKYd
zO76Gw7uJTIxplL3>i>51e8+w@LSFwr7wsF1kC)s7t*GuPogeX0?2gK#MKusplK1(!
zZf5S>_Vc>(;QUx^Y?s>3mmt%d|GmB-i%7tK3jBG#vtVwElOM=1vOE9IBl8`_sH3>l
zc%w%&jRLc~Y)6!^+(F{@buo7O7{IVsHZiegGX%=W8l2w_M1>*nWYbSm?DX$|`TE-t
zBJ7Fl9Mw&HiM{(DRC6j{1l7XVktk|kb73eH3M;di3C8X}E&$Q0T|Cv5Q)4AU9m*ku<*x)X>3+MVrf9#_o+Q`YUI{os>8nc)|fuq9j;x1
z4^dlahz+KKH>Rb68VZ+2H%5@B*6d9Io%P^=y6iF?$>_$VWLDPCk;7889fHC_BReKw
z2(
z&-)OS@A39vu%O>Hb6V<1&oPKu`nIOluMA_4oBCHTi3o5liZdRpSdVy!^s~SV%^}e1
zG*42UYt^(T=5}_J#?EfPIeg>>|Jg#PC+rOHh4jz$R1M>@C*SFV%PPbmsU2@iO>rx&
z)OFX!J<7{#YZX|{4XimHuh!qZzGn>P)cKudoO=&hS;@vJ7hY;%G(IAvtD~-bcpIGy
z`c!U6CSC6|jPqFfSb5~7MID*{DB{W$kj_0<-rp%{4Oa}8-nIY1(Wlb~_om5C%QqPh
zTeezwOeh#m=^PeOAxxQNeaXH<5GXaZeE4m4sZWGu*xlK?`rPzKW;=;G=55BuqJv$@
zCCv6bdar@vUQRRw@+E0`*9ojYYf5&DkEZMuo!aQLd|tUM#1xR(>`{1m==F7Z=V@PD
z<5op;c`i^nbB`x4piaWheC@j2n||L@FUs~MuhQ&~wRdw7KPmpJ&2Q8g&SX{VWUr>y
zyHm0ciBZW=0RqLzPxOS9ve$WzaB|>94ZOe+A?e
z8}%q#g|tl+zp+0ZRdzMOs~I*!X?fQxkKLOYxg~x%-Cz^-XjsYsjGDy#z1(mW@>`ZY
zBZKpz_RB#T98U4>{6x#Zem#A^D>r-~T@ml3(xIltudB2jt1aerdSxcqqoAY7sqbsA
zSj&*ppZ8aILjXL->GWHxzouOJjileH{IXLDCN4k!He>sSq^HeVIPAS;d!Pod-`7MQ
zvJ*Mt`v;8xZkrPxf1j11AKfLcE%(gXNiTHe_FoowsmEPU#8N>UbT+MNzX^K%Q+{Ri
z&}X56;IL>}m0w=&YS40tL-5gEODczf+_TY7oa3myS4(R)K!M086BIMqFEhT7YgUsg
zX6dr<1+v-D-W^q(6E@*wa*>JebP-dks`GWWrAA`aGn&qhZUc2dCc^P3Nd01O+S%Uj
z;2`Som5lmDLt}mYZ^nQ3yazcs!4?)uKHZ;@c#9hC<$>L$!80%No(5m|l+)Yu;*G+r
zD#hh~d?)MwS%Bm5MxElxY%~C{%g_#em7A+o6E5vBOqKw+SQ35dd4M`NRrW5TEIf3~
zCgA{FUP;*}S7(X8q3Fnl0>XG;*%)lPCGBZbUtuZS)2n*8kOWBQ;UFKFX#I^LGIg4=>)I;7U=EmJhNT@8Q!$!T%dvYH|(YS@h8b3
zc=IMFK&70v=f*VSvYdwIHNyrRrN07P3rT_MxNTf6&ibD+t_ox`?8AzJ*?uEK?OV>kdkUwVU^^~?}F7jP(e8#<)Se#SF*xwJRGlIMi
zA+&zt)yKInU-a(jg`JcZuOB1nc;sBiq7#(9ye_TD@g4`8@`SWeg$9vaMvM9f0sg)4
z_A*YWbbsORQ>J0>J-Bltd0|w~w|E2tASskqv99-WzmYH*i?@b|e@9O{B2Yo_nt?LQ
zW|hC){Cs!ZWnZbPP07Z7_uUv_5XT6RSCaGwuFFekvfSeOho@ywWgj7saKp@b6F<8h
zP^=Ro#k+P?NKx}7BdNgUumO)({26N#4fx8>^B;r!0n_tgmffh;U5&i^a2h~P@
zgq34<7&(S7JcJO<+?j0-7mVTc`D`MK6lKW`-mDo^l?5%NWihphx)c){As;LS3F)6M?53T_#gCH
zYmb!Hh5*+iv{*#hb5NO-HLt562pHjL8n?bZP83r!NNmbPptj$WdYU&|cIzhHCu=kk
zzW1hD2DdZTIP_N&e41NB&&%%x7F?@kGbM&;+6F}mJKG&xwhH)DPY9Ro(_Q1R4r}~F
z$L(Y%Kfi_UB7~!niMV2Y0Xx7HzDDmlR6GdATYD7R0jL;Wvp)ehM>ZX|9^cbYWce_o
z?NQqcyyy5GQnDbk(uwDnc@O66GOk2;oy%wwQen>T%H~*AL68mcV6~v$$p6P$B#@co
ztUOSQscXsTqX9*rIhC~l(@bl6yw!4GWxh?S1h7hA3=hWc_;6GYCL|O@+C<&40y#-!
zdNi%(1g|Gns!^f2eVZ|gR+;MzK?zk*~Xfx
z(b5Xs@Xt!E)dbiI04RMGw!&9#k#-IU9_V%^mBX2fy!tXB?`c#Ya$S|C4}NRUFBHNqhD7%kn9|Sy*{!SAKj3bY%L!%gzM#lEG{p
z=WhACDxuK?qK;SlE&!!qL8n?2#F;~erfr&-&{-dLZEUP{XwlM&g$_oDT
zF5@@38-2PDkz{J57B!B~ee{vu^WG5~dTsK@;oHa2^psOm)w34dL*sB8bXfZ_3G&@-
zQoKkHecZu;KHJr6zcH-phd}vFyVi(pObRE*H!kP&2a^NmlFq<&l@_B+87{M};I+~L=b7M1H(3ii#uNszz?D3Ff1bXw+rm)Z
zq+8_=>)j>g)BQW>T!V9B6-<0_iK2R>#Vhyv$wWf)+}~HmdHU
zaKvdyHZy77u`jFCrjh_m0fK*3FyA6-4hUXS}mE`0UD7xKZ}?kYO-V<-=OpB9>M_BWdR!gqhhEO-M+
z+Qt&e^Mk6=vdKk0%a7Y*JesyU*XCgJ`H0z$H0!Wq)PZpzV851|{NxgQaNhH;^=Pds
zwkB+4*UymGpa|0DH00@Ju4#SQi3$Ekl)`NPDT9<{S_TdmdH^{t!es~+b;e-XA{dU0rDu@l^MOd3q=4Bp
z!z2_DT7^dFqoRSUeQi`UGiS5W8BP#KRYyaqT#<)Y;3;K^YrOVqp~GA~!xXNMjehGd
zL(R~D4Pk2u(}N!^S~YrEf50uZQUvj!*e$Yh32zqvd#wKEsDlIcqEMm6cE2tq3w+nx
zBwwT_pSuFx>SBiDD9lpYUxP{4vdS)|rlz_ek(~)&^!+WYD@Gc=RAQy^4}R1E_JE7C
z8~t8QVTv2cD{RS^jashcH0=zyWR}E%ZB{UO?Sp8F!?T3&D%?kZ04@E|;KN2?klv19
zcT$180~Y71xVNDgFmyA;k1aoIQkt>Ct@h7*^FGWY6u`L6pUzjPxJXK;=FOIgFSf?;
z3i-35=0~E;x2lvHP`@Vh&h|S~t5pDFn}AFnde1Y;`mn!^OG#5$_Qt$Yx{5NgU*Km_HfAY$
z_^N+RyQ1OM2TjHRpg90843U^{)UVBv^_byO4i?(pbYc=W7xsNqmHWiabxO7x&p>pJ
z-k*W=H>bWG!`EhB3cVdn>pESARgJgQ7IA5Z-}M4|<@=a;!TzA&<;CIq6%|EAJZzrzvP1lUpnSCRPElQm&qHTT9p@2?f8n+5x2`Am7$
zEDwb4A1xziQ<78t)`uSJ=?`uI%^u3s!%t4AcPc=aC)6?ShI8EL%2#!HWRr8s(W^xP
zn&)a^yfjl0^sWv}Al(dk*_H9#sCH)SYS(d+o-%S~4F>gwPOFx95Nd#)>?9yFmOcn5
z)HzFr?X5^R`(Y^@e1V13e;rj%1Bf+)Vit8TP@Ue)DlfU;dv_+FDM!m`_qOg{h+fTc
zK0*l^?Q=>lt)%#`317L;c_V109q1KL|9dSs$9rIT=`T9S{2<3SHRx8mSmQ#ZsWp#x
z_pM;p#_yyPRNc74)Z5E37GXz8TPXj|(_`*cBj%ZjfD=G%;B1W{fM@DSc@zHxm-5ap
zmbD(?&v(e)B<-BQeKXQmtmNrzK|&oM+NaIHJU}GZw>S;ocI30v+{xT()wX&(;)j_h
zmC+$XI_P~bvhmg))$+#r97g?E%g6vi097E5%yg^%9h`K}`GM6m*LMki?^gtElx<1^
z#!^4QMAM^2M^<{IurV(-t8SDm1Ha}@62W>Iq?w}2^#2YtZ@KeO-q@it=#0pg2)*1@
z^vNrVQ;4NOop(!3yqP1lk!;lfS6NeJk3ABLWmYDy%-z-2Rrzy)tsNf2ddv7p_|9sv
z^z%Fwq5>378V0;rYZy&I?F9EaU~(-DzfqGrQ_;MhZ(MFQ+eEAgo*LGG_?HFeG0o91
zD;I|CssMc?{lZ19Pz_&iw(hNe)mN~=d-_{C*yp5@WLvHW-pMSjSrT{My`JW3C*_sJ
ztGv6NKBFDE_Te(id*Pw|)dGPP1nc3T-0}@Zy}gwgOVmEvaUjHTq%i&LL=xzZ-22-8
z^h|M))puU3W#J#?-MvJ9;0IA<%L+TmMz!D8QrP|h>{;ODQ0Zp2MxxY5ayU>(-!P!aetFSEFB3fD*
ztRv>Ed2a3_qH!)(*`F}|{N`ry^F4J*#{rRqFxnWtH{IHZ)+WzCKgaM>HQ{H!bHm+3
z&0JWPzN$$wK3&4By!rdh8|m1-K&Bi)IeWv~jDX_KiDA&cdb8_R}i
zEAr+aktZvJ={99qVQha&CJ=
zFs^q^2XF3+^)G%=8qc)hQ9YpG20=FUP5m)B@YwlrG1wiM0_MbB&^tT!m_GcQ=`om=JZ3#>;L2E@bgi}bSUYZ|*;=Bu{s~dNh
zg)`0S|C^3B{MTxo2MRg>tzP2}t56VdxYz>xaGC5M*0<@%b!HL|CIk(%1SY8-zd&A#
zvmX-=IE!Xp3uBD_gxVVsl_8uQrCD)F1XKn|az4kD5yNfr?pK;jT2qbP_lARsw|{ZK;oH-y@7pl=&%uyDe=f+{*7%k4aQ*le|etRHsRbc5?RM7fW^J
zAxr#y+`F|nsAUs$)b-miI@c@%ps~UqB+~Ibv{7Mjw$(2}ValY7ZzTSBy4}t$E%5I9
z!0c~r`y(6Hi>W2X&Jiu5EJYgSZ192tTu#2zr`&36vxXof(zWVZH;5>lxQ9VA#L<~3
z2fB8t`T&XSut5LsKR^C)YAo>o7(hukj{rj_dY*02=AY
z@ZlC_u6bAjZc(d^zv{g9q%xyO!q|$ORz#D|O`wk5YxKjIjR${P;_8CU=6A>R^6Xr9
z-Gh~6%}l#tl`p$?H`r1>D*-Z>h
z`&G}RB*;=h7v_>suq^qd)0gFbVY42P$q6UsC+KA125e``{-i(mBQE@=;
zB+rP^>kyFEfS7PdCY~eo8)Da@Tgojo?`=3PbUxTQk;s3s{5pKY)N^Mg6J<*4X(@8J
zH%(|zbCD7gHNM0i~-o$C=*0<|o^GSTyZe>u8
zv}yT6@~dKu(x}5^oF}xHr)rXxPx`k25nl%Zy!OUydTyCf
zNK_~?qSB>3T)141So%}D!0R#MFl>db*DH>^PB(mr(_&9yIu9iMOBX$D!QxmU`-CCU
z8*gK?)<<@Cq|))Z+H}dPOW(2>j!Y{;`tpM-C0Ik$MUmO57x}S~h>U~ndH3Dn#&NFk
zw4p}lc8An37GHMHdV|N@ZCsi+;?a@kb30y99?;4h0_Z~3+8^)UHmaok47nMvV6$&3
z+Q0lnHk$59hlp$*Zte)LR-RPZyuDobeUR_1ZDl~Ue~L@ile!XSpRcBO-rHVPb}ff>
zMzc&OQ@P2}2$yw`QPKy_Wy0!;$BffcC!Bf{r9%M5>+Yo*o
z3IC8<=fmXow$ipnA8*&6e=|=;x09wDHP}l@TEoJazTG=$Y@WYWEuCFq1rS|kRmTov
zt3n*N-1@G%aZ5!ABk3TQ8fI>Wtym3`(H%!}C)*eqNfmHc!uL1WyPNvPmhIcLOXTfX
zbZuXk%4K|T+8fG6XI5duF3^9d&uy#{HC2BWZ#z7H+2DRwihy&!p5NH<;bw7+?Fbja
zg>g>Hc#HzPxU+7!)Y(z6#&DVzt>b*O9hMxE)lum{HFDi(8p^1CN#Po1EIkAhx2)%p()Vf#iqzunbW1KquV)&;*H
z)m=H>#Dsv2x0&iiVP3WJI4GyXdRa~0P_9Zo!E;KPRepFa^%8~gTkRI@WGH8xwdH=l
z>R{>(2FI;#^{ah;N=Ju73mvFArDMS`>6<3O9Mpvy3bRWpMGsgN2fG}OX6}(i%oQPu
z-|5pRj|H(74O#c*`u1L?nLFNxFz1m^Ae}qNoDVR?t5t(z7Vby>lx;B+tO7rhByJBp
z?_EmI7Fp_3i~&GQ`k|f?Efsa+>^=Hy-b~9x3G;Wu`pHp!(-rLs=M{wn=MOixF%FGd
zw&VO5>io#Q?0!uoDM-t4n@7X89)l1Ql6Ry@B-#3oidF&B7e+laEy4RQ$f9npD%)-Z
zKA+lUsnOoB*YhCqUtpMR2ft%4J{93
zqIki|JM@{ANgLNrO5{*tRtEx#>J(Zj0HNgmaY9(kGn$ru01avtDv3QvOCLe|F6F9!
z$*!CtI_QT6_dOO^ufk?gC`bnI<}D9bS6|D6EoA5%Y+)*Ev1koMo-Bp`*MTIT^A&!~
za^r~IvHlKM?66_8Xj~Pg^XiM%c`a*yT^F9_Y`T;u-v`!5I*0T-jk7DdulCqNUiz`G
zcwuE*>Tr35`uV8hl>rUZMD_@R?Q>_<+9#MW5vDY`GM&(^&ysHPW!j}Lzr4If8N$T#
znaSxZPzDiNvwS^^W7$>eAWAz841GE2V?N8SSpC^qTmY3gnZb2;OqRx6D8*doC=#(&
z>oAw1TX+45V1bbyPl6QIDcmRg<@q-
zRR&zW*~a~b?QkQtm80zWn0(OnhKPB$!W5SHrS?5ROv&beMtS%JS<#aoX_lR6
zXYAtcxcz)0rDj*d=)=@HYrxdOZlc=1uRXJVXb)iFkrf+8WqoY)j*E#)2Wb?D_5FDr
z`(b^6(CP|a#5k@BFUPuX5wqMf@o|!U`DJ)#4rOj~|H#86o6c^f(DmM!J{QK3keHag
zeC=06BT@qd073lwt4X7;@;BKn;%`nkEUo}_8m!EMY0Poh>SfOXbwvAi8-YY%ZxdD+
zu)R7HF=K(<(iBFmWnd+})PakT85$iXT1Rdfk9-ILFJ8LlQx;_Dh==u2$GeWlUcUD>
z=>3Vgt{xDWGi+Uu5NiH@{ypiYy1y^4Ma
zM?otdy`ONt96xXNfGZ|}rE&>{)l3JmhsM!%ZI+f+LAxcTcfNT>UwNO6B{m^kD-s5M~~$&%WE
z*m_1XVi>~;ux|Db-H9GJWL1?ZyNo94h{_aI5wbNWzFOWWJVl$j;xNzVquG(B&6rKN!B|e&Hfnn%-B6%6p`o6P
z>Tw&VVi}J|eD*5904wV!l~twJCO?hAf@Gz_I?KL2G08!n`~&%UZ4;!+0C&huLS{lA
z0Cs;S{^kOMh1h5v-Ho~atEz$V)k|P)vw7R3v-38H^{b@3FrQ$cCcOCNhe3bnd(3Oa
zr3?|sr#{NuO)|k0>ORiIXw6lgp-zR!`AVL**4^TPUYr9C<18LFW<_iC4rSTY$WCMyA6v|dN4~{{GNDchzqWS)
z?@WG6>GjRR0>KE!x9CeWCWQMt8h-WziL!J8nl?w<9rcSVcH_8U=t}!Xa^)gdsN}Vv
z`9W<*Q%1sE^LKm$-V~BPIfF?IE{6(S<1eaVFDZ1h-8}3YB+;^LQ7*nfBvVO!KI4@F)zGJ>(KRNfHmDK-$4*8{ve|-s|Lfv(VV!b#C4)CFX7X8?aFhJW+7<@Aua9zZRf#RBHS9hH&J
zGydsqbkQ~kj`^*?l}pxYGhO@k?VAaMtI+UxJ#`wMNrd%uYO*ai?@qXfG=oD^*~uYb
zYt1Yqbc*b~2};!gKC&TAF=bY}+HBX&CIQ2Q`*@AQ`B{0GM6Lsq2LywqPM^whcF5k#
z8p5*q-YSklC|2>bY&c~7_%~-jcEfDKHab@^<`?!BB-uOyU>&^1(VwI_kd@rsj{Nfh
zic#EONBSyR?XD+9J75=wC?riTJ4>}`%53#R+bDIMEGO5dR6Jh=Kh#JXcSD2-C0p`N
zRDcX6NShbh5Sy4Vh|U({@=VIV6=nIJDCY?_`V|vD2o^oTqJL1xDOFE>^kg{h&$#VP
zT+JeWj|J{}+^@QH_&_`@#DFv}WiXL_Qo)l!TSMcZ4bho-Rha*K*>VI(JjGpL$oP2D
z$!(2o2SDN$^*T>dL0mzwWafE7C$XN1H`go493fgqJLfm
z0tAHi?y8SQ@3ixN`wCfCm|qSC@Xo~|6x5azvy{$wAkh{YxBE(Uc?#g;*N61{1eQ64
z6$`&y_pT|Pu%B;cj{X3mmFOE#&Y!ORPqG!2RG+G>jPWCuge3FTc>-AzqzfVGAaO3m
zJ$39!|B6j|@oAuSgnb(d?}lkh3oOz);HY@emu9z4PISzwk?sNsT^biexj5!=r(^Q*
z5p{A@lGRZF)|Lz8O^DxsOi^v0QE!0egtRi2SEVXAdt)C)W41T*+Y54;&!q2u`f+M~
zr^uUZe`v1gmK8sq=7IU~CZsg#MJ{Cy#
zdy%@-ZeG1o6k%Qz=20W^T(?9tcls>m@=%qmoI5|c;Xa&Cgj@|NU}#e
zL(+zVq^BRGX{$G0A9X%CVw4lH$8uD|iFs6PKzcZ{v;pEk=)B#M>!r=jU(bSM(sbSK
zf1#$nrqrd#m~dTdJ|$8>S}SV){!=>*8|9<>?rOX6PchEN_B?7JtsTiEMWCHsd0h4<
z#^Z5D{?qXr!hN>btwrLxkuu@!Hg5IQa$o}nR&^04OoY$cn*~(Md|7vpB#jRK3)ycY
zF3uCD6l&LLd#IiCjT{+PTt5F(S~_H0mOwc_Fc`r`4pto?XyrQ3Rt&!rJ#HT5-u!2KBfo&y|
zi*tS;KP)=JN)Y~}&GIYT*JM2-BW0|rcYB6}YDOmWBokT9113GvyBAjKSlVbzY!`B3
zEe|padpURV^xJ7WgrnuvhT}g>F90Yc^5>xZm{XLE8Q*pvoun@`FU=H1h#VK?A?b*l%m
zJX^9?)sKH`+qE{e#1SoEthB6+AihTY(J;zRJBnNB$gwm;Dv(~b!q744r-=l~>V2w(LuqjeAJ1+9F`P02sr1CNk6sLX&@0GdXQ;o%D?vt?pRa_+IPG?m~1FSeLy&oRt&R3SSX6eq{G4i*{=mq?3ak
zRTEuj3kSFK-o*$cMUT={j@Wg@$~+!{19>xY{pyB@&&=7LF5y}R^^3>Qbd<(#jeCZnYQ~_^n>smAyz^r=3|hHbCtfA
zA1NRaWL9XKI~!6rr^#Ec6C*-v#Ks@6KFr9-%rwF<-Qy*6s=8A>K`NLUUkXo1`dU&@
z#cfb1pXvRrB|Y6_*cMMLd|4|NxuD%8lXJOX(;Q(+3GX-;b>mxXkcdu-a(WUf`&E4+
z02Bo#>C_3y*&rJ!WG(o6nPQ8xc0N3>-hTlAnn&rAWuNC>x~xWjGoTzMd_eWkE4qa*
z=KfH6i3|{Hh0^2mX{hw|JqmH9l}g{{@Z
zIIVKr!qQTO>A_XRE9HZJjpRrE@HizvN{3mB>{Qc8g-IZihCN07cUeq~pBm&s&B=^+
zLm8N_6DvP*Igi(L-WR_k{taJ6N_;#J+dwm4S+i&KX;bjLMMVs#MA%eWW@Q!v$`3*S
z+Bp7F?$w>!iqC9pc$hhw?SP6xTK|tU&4hd0*R58hydKi~Nv2mDSL-4=sKj<25SS!%
z75$X()|8%DjO|+WiySM<3mDnyaPugrbM0iF$=Esg!h>&i99*M}2ph@g6;&)v?_r3?KZqWSkwwe1l1&
z#ZBpccz-6NOX;7hc<-cQJ8s^7Vz$BO8PokBDgGuWHiiwhDjgrP*P%
zSj7o-?3h->IlLKO(?5(6s;~q+Jl1rn{jPw|VS)K)xa{w(d_;VdrH2(yaDZs~HR$j?
z)$ah`J>YMEgGf^vi(R?JZAgR9xB0vR{Er8TmHlyx+>jQZPtQJR^i*QSefg`u|6N+`
z{ofrJ3A_%xc$~yBkgK|OVZCtuVh!@?7EX1!3;MMdDT!xx>+I(wNfI-XEP~N1r@|h1
z?O&hwa4Na=4*c+jT*eV&y7HiE`oV$fJb3tg!bqv=pK9RbtyP{_)WqaFOD6a2ii)$UhEWEtn+o<~fVB9+_&Rd2QQ27r+l2%Er`%x>BJekpkx|=I&k2>;54<
zgnJszyGf(lI&Y96T6H$j?j*PIlJC}UnDb#6!d<2R;4XM`z;Ww!2v44wqfm#s*%DXi
z9gA-lYp4~O|EPBtcdhOoIN`^1t|CwI=5O@l_pij
z@AaNLsHC4i1*rPsHI+4_3303uu{+;NM6y+b@&i77s=sl=Uu-HRCNbdSgLBEB@FMX$
zEKF{=5V*La4FR5*{R7+xLWcJsoE
z>Mt%QZ%@Tf+@N26O+CAD1Mr02K8sQ`?2q91rKy%Aa()u#HMXgClD4Cvpr{8P15eET
z$6#N<0~TUQMh~PL>iPLepYHh7`dm|~=74X+r@(!Pu9Uuhc|gDriBH2VJl@fkaz=@r
z$M?4m()lNFi~u*-e2$wyM2EDF8&}n%xX0Hw
z4jAXz$ik9GWM<{~Nci~ASrB}g9@{x^x_y%mcTHHVMI0o;M$ioJNg3!kH)SfYIyJ3_
z=fO|ksa1YkEFZnxFnxGV<0Biz3RIK4D^pPjt==~qAxGUb#lrn;G4USG}0?Ek09NcO6V_Kroi|60q
zPP?&QahsM#_f3&h;{I()D|mWA_34Yxc#*ds>f+AieJ=68t!?nm{Y&66PGcMoDT!&i
z#ZrSi{4e*Qc9rY&M3bw_&MjQ0#G7F?oYSXV*y23xytgE;$n`wKGrKPw@2%c-4OIk1$yf)D85$*6R{>Wl9gK~F&>iV(Fvt=EA?rc#iGSv(2u>2lc
zuP6@?_=mVs&F+;Mp4|>bac`0=$jujeiLp
zo_`4)g#W7iZ&RN3+W#;<{_ih1^zi<2#yPnf;(5zX)vZp~@3axJu6T*+s!F~&YuL$~
zN^WDU%a~en+$)+*Z(Nzd;JwEX)M$6%PHaR6Ij7*2t8>!sIDD-+Jrns!u50_C#)|rG
z!sF|2*>UHZ^u7tz$~RdE$LmNmWe_M{JnhPc*AY$zDewdp|!p*PSdEv+BARr(|V
zSv1vNNZy!H1%eo01;q2p7PV6B$Gh&61Ha?m4|u$mq1ee-jZQUUn*>qe`z6sd)sR%Xad0i-L5@_V$(JBVM2GP1
z7fK!I6>=m@@0|sPr_BwYpujkNC2cnh5YYQo16#OF`BCuYf?ioUxyY3IWw4l}DLOfZ
z-Ry$jjbmQ`=m9fmc;QQRQ9w@4`MAu8Hy^>;;7bSi6ENR>pnhTO{-jPuR%G@EP<*~X
z!XWZ~C(dK_&Xa6&r3eqXf8dEsYmm^)SCc}iW#pyv23IlT&&#nc^KQBqi>!Y
z1GHDvNsffJCf$j`&o_dn0yK}#7}1HQdnav?_LKM*sMyK-DuVvS0ut6MKt=*5AORal
zX^Lea;4d92zQz6?YPI<=6gF8e~V5VD(Au1%wRD
zwhKN4hi+WDF`1NaTxdVZo+tKV-+X`i&DXJHqn{eVoyE>6K@C&5C*6(~G)5B00+
zINP8zi__{0Fb^L-RGOU+GmPn18gpE&OwTL|_y5s3-@6GEDr74C&4hpi#(;(oy)f2`
zIi?`SV3i`T{-(x|pv`Yg!iTvSUMEm)-L}lwr2{QLA7vLUGKm6fRN;bF_VR^p0K0zp=;#1rGR6@HRQKG_5)3CYuRng*wX7YOVGHTCSi*=wK9)x~x+M1YNX6
z%_46O&PTf*yD~}|FZP3Ff~AK@_7SZ~z}8E~^}LW7Z*SJ-x7n5^?f0FH+b!l@Hoj4-
zi%fi&CY4#ap{l8%srerIwdl*Bw%wS9d39##R*gHk8Nith9EH#C6zd%=uy!2*zVwNj
zVU+$!=}kX7G)>Ng0m^h+e-UNBI2+=)y`(=ek*3VrPRkYu7Tz}<(?`!EVPy!pUfcG<
z!6nuYAh-ucbjpqPk$kMbB!e)}2v|-wdX!Nt+XMd*6cmNPly+9H{Q@Ku%Xuxk`mue{
zdKl1Y8n9na41wzPpC9Ia+?+>QK4(_GQWPk9RM63yCdI$JRu>W5U4q7xua>Whplx^i
zRd6N*{a*2{(R#kNS|-wYURH4Br{l8DO6BW7C_<88TY|^_Bw?M*ub8iSEl}%q6ND{Gr-
zk{S#Gnf-&pwLv53mM;vH9`50YsZ^!;qpIV$vc~8eDqyO5PqcFziybzUyxb0b>i!d-z#cLFBJQMHDQB)M?1=la9UlmNwUV1fD08m3MP~
zS2#bJ#J%&4b)?wTaR?_RF>a4q&2e|GR&QqX<$H>5u5!O{veU|eL#y;_ygD(OcR6Z^
zbj0A-c>>`Mhd`OfQpebN0AK{lNV0$%f4H|kkafLN_#opbMWyvJN6F+uf}ge?i2onu
z9q(43tQ4WMipQNcW1qMi017GSdh#6W
zc6%t7ULn1(wRrm$m_kSpm)Ao|MT3eMuy;CWg|UFHZ#t0`Rpoz|B0;VUgpnWcFXW2?
z<2*pQ-hncw@v2?`u`83E<>7fPi;ub(f>iA}WmWC4L&gaglqoLV2qqxzSNXjif}p4R~P;Ov$z73<2prmNBg@=lj-+M^%_Q9C!9gC=)LmQXo}61
zzBrN3W%3|EQRhKgj!jGN)8|Jo=i5|kD{4>*j$#I?Pj)AqaZGb+uaHU!9nCvZHy!nh
zfN0)stUFoRa)2~cSKT`EAiMk+yF(`sX+IanOzV2MB<$!*%ijb4eos0Wp385t1-D^5
zj^>)4(=f{|d$>8*o}VNk3iLUK|I~YnemHTi8+9}$Z@f}xi!wiv?RgJ0g^;|XYpvPU
z#y5p`781%~6#kkv{mL}&OX7l?_5Apg5FzY#qb}t(t`tznVux^M01%-NT<#L@6xnRk
z^A#zJjlH$M2}ab?JZQ#o^NQm#fm$7x^?K2KgMRy`OGpoq5gFdGpD;1DPEy`+xE7H}
zcOIo(`_a_FDvu}N*e9UEqqo}|h>iIoweK89jRdgn1CQ*g-Ew%}{){8xI%yJ@!Id!rki$6QkGpwfSDK&OY
zD)VWOs@nGYOMR*NZT02AQ)$gEc}lu>`vQa0cqkXPsTmQ{eHXzo2Al2>TE7E+PWL!T=qJ}B_~@aHjP$z_3`QtLyU$ZCXng~F=ufENT=
z4Em&5)SbZGURehov@K{B<0at9W%(uX?1J%D9KJwCCopQ&%7&ARa1rc-*3x-`4MGanMm(G@&^z?U)Na??2bs+d9GIOMwdw%-!e8f_JM`+
z>3&k#0PajmUyc_)RVvZ*Ouuo3gahFCq&ih~2%ztZvi+uaT#l0hfoDI^lqj6u!mcw=
z-pKqUrmwFbbwJKHiP!!asCXzXqP>`-LznmzpWmk)5R3h@4#s((Q{TbO7u~z#2tNqp
zy=K7QGihpZ4~Ikw&M)WlnDgAj+Uy-4n51Y_z7#$gHjK7EDjf76XUM`4n^rME^=x@q
zaqLLE-6Kh37vmawaK{*CM5}ar3LVO|U2qp0UpJLgrL(P6Fsn$Z>D&&2srOt{-*D~$
zZ__X9@S0d*!yD!QWy)`+@{l9YkK$Q@r1W
zr`-D{+pCD_iZH8a+P)h^4D4ELXFE_A92fM0ET`{a$AXu#zxO^LI
zK67VkCfuapr7;<6!p>5!A=!Inaz
z`m{b!mW)ujb8jb6I(W!02?ejfwy>I4?kCL!lre!!w7h=9K0HdF0~22Uq4^rADZF&0
zxL5W9ol_2xv(h&O3_#b%AeVU|>S=|`Mi*a-(=YXtym$VoDSLII<$ofqw0
zwH>UnC7>cZa4xo690^<0=Lz56kmewz6X=6q0dqT~-F%MD_0#?9qP+d3bb-}*QQMCW
zKy>c-4WH)NC^Mwn`nRn3(FKjWeDsWC3DAsbfda92+Z$aftg%@?x6$OjbkCtZsiuBM
zXb#bn3yg*$
z;z98SW#f^-&ry#}1#Fl1EI$bgeDnTR@KJ&C1r0ePVKx5wSlz~PSXFry9h?MA0YZDwOEKo6Z9JI?Bo-iH&c0guv{Pen`Ebn`kv#`@sj5d?RC=hvO4IG&^>I5uRR
z-~R2JH(2}(@4rO89@NPBmUz72#T@lh;dW4af7Vhoa2pR4#t)B85{wlP|jjdS4GQF!pRcob22c5JZj@!`Hnc4-ok
zSN<4o@MO>tC&8Gvi(&774XQbsJ_CwMl4ZyS>-r4^w)PayhHQg0N=n71H9cDCNppd{`y7!0ZVdeIV9{7+xv|X5uCfpIS
z^P;%>dEa$uFw+F-%iR-6u*@5S!&$kPwt9h$*km`*Z__SkOLNq*nEJxFsaj2VoG
z!brLOC06vYkyr6?YE#pwNghl*;gTnV<>v-=MIjrN(?JkomHTlNuwjhj&M;U-zA}BjF(}suUswTYe!ryH
zbXOkc>PM7|pzmLoUqL~p;D+=p@ynSGg$SK>qL|TIGw99)&Bm>Euh6KqspW$Bq$5!3*>&xvy
zP*f}e6{B3Rh`b*1!|Ax5aw&XyG+PH%WC~`}ssVKq>h(Eo@w-RyJfb|Q<83P*@_#Ps
z?PRd)*qc%LM~OL|9Q|1zGX3LDF0|I;&5=fRTth$(hdyu+EP6~lTDG_BhzI)aZw{84)xJXHM`dw$@YMn#G9j5l@8v*3Zqtb3v_rmrD(t1coW{FL?fd*+kAI*bL`0QEGoZZ#u
z6|8!d<$>qh8<@L8pR3RyB}}q-jEkC?B78)qeZUe}$7H4O#CGdvM11$!0Z*#PJj*EG
zGhY$A09f6=Z?wl_$P|KZEdO>NrH;emGI!@o7wyiw$OZr%xG~&{Eki?XcT}u7yg=vq
zv!e{+I7mPE@2P6u7rGqoCCjinICTDxzxH9fB!;v`#z{cbgdt#iK%)~%GDR9DUk_5kja--+|51rq@gUOwL~;d*UULJ=+x>xK7IPcnpN_YO}$dThF;il
zq!=(~_HBFo68yId2h|#n0fuK_zxB`<$~Rb~Rcq!wrBvfn0;+-oQZ-!aI9S40>z6Bs|wxQdENqfhwr;%x!Kw84G`5?~~
zgokPY@FB0X@Y0}FmVzm%4SJ`OiL?ciQ%7cNlZD@^ZI#NgQ@!MEhEhprA|0P-PQo9*
zM8WjBvLCQR3XS_)TmT)e>KlF|@V>4!(%WrxOEMTuO;`f_+^BK7!>(8aKO!k@VQEjD
zuC_4#KsCJ}CFp6Z54OdFUuZN}uTiJ1@&+(6z`iXNI7UczQZV%^D~CTt7a5Ce2MfBK
zOp|Zh@g#|`jYppVZ+u6yhjOsW*|B``rYf*=&ci%|nu;+`w{Nno0H92}PFNMObO20T
zI;3h>QI`K1(xXRd!|(goLU5QE`g{7r#AR0ci2x_vcEE=EM<3+Hxvi=jD&
zM=c>vA`brx2S?iFU>C*J;M!JlxEu>9%Ow;n|Roq@sn+
za2}HoExR!gso|*!KI}_SXJfG6n?f}D3^xev>02*pfhlDFR
z)@+2txB__yn;jYfCB23Z<`Ier*z$RiOfV%mU2v-xw3ZUYiHem$)`fEi65T8~8$JYa-ISMaSEAP=c
z&ISR6%)MmRReOE=m3~#_l)g8$%u;sxKX}JKh^G$$cXOgpI^-k4g&iclRgzEKRUn$d
zFPX38oVv+TBE}
zlPXBzn?G}XhpwUE?=0F2;klw~lkPlA$#JYQ;sJ&ROPT!=DcwW0LWD^o2S8p|U-YMr
zAApr!<^VE``>4D@cw4ye0gwX+_Mf}2S=;<*yVE+-QlNCXy^_fUTHrNUAzK!`8`Uo1oEm9|NRwZy14a-AGE)MSS{Ah%`mOY?f4solQ@uLwxPsZJBNw(l
zIof4)!3EY^tRQ$rkl*D1BSyoW*_mB^Tn2E5-B*KwY#}Blj2o;h$5*RPTqYLysVGX<
z8)yKMTY=|mFVIi{i326FOZSAYIDpty_)imX!;~cbJ~ll&V_mdP==RhR5N~7~C||8i
zzOwznI-8u7SAE{QxP#~?jk$zeyItc-u_y>FETy>s5NRJ#XB#FkAWKl$NuS&e
z7Jp*1^zVR$QZkaZbexE$VtqhkDNcYq3~X{_6(8z+LO}jdyJ9E{!t*4-A2V7$dAJ$E
zu7#aZl+&_aua^^KH%}Zg!mcCpcW<*8*HW^Zg*)Xp-$_??
zgH#j^d(~FYptftJ^k5d?C6)0!j{&b$Fn7FuunJWAi)Aah^+%vQkklA9re~HD>gYXX
zRjtIS=V(3@*e*dO%4+^mu)sEiqhj(L=@T4HH{5)Xx$?@_6+oA$db|9ZMhK
zigGfwxI0w9Ce7iYs;1=^1Z8x|TN>ouR&DOb5XMF|N3v)fuK;aeymk
za}wAb$g^Xp<=k}|_mRA3V;6lMT`lg~K6vRvB~M(}2%R81C;2Gx;K3hX!_V!E6n!9!
zE)zjW&5vP?#w{a~BFyr3U0VrPUDrOo3f?Sx0Dl1zbIu1*b{?4G335_X>Ox_8?x>dG
zTmBD5+FSvVIN1-PY|fRuZk5@+(3|X6wjsDuGF^d%Vg2ukdy>-dTg~_)Q19>2689->Xy#29_?-(2gg|z#^7$xs#ALYOE8Wf89UO8bk1KWacN(gdmNNS=x
zUBg7HJECAMM
zjSJGip;rdS50<$IzZ
zAx-8$_WSMGCg78g!SROEj>@V!qG0qW95ztZ-tT_lh$qK#%ez~>!xm~&>jf|E!
z&^`r^#-kHWdbTf8@l%5}F3rxB{2Ftz&u8iX!Rtt{>x=jx6fIFlA8j4Xd63Ezcg5xn?kegjE=CV$L8R!*D~7*VMQ489;k*H8
zBbk}oR>n9`5nkBjrh|#G3DPJ2-0~f2>Zv_*FE479RAM56Gss8Ss9>d^V@*WF1e
zO}Kj8VDcIAB{@CWya~!Wya-D?GQ+BoRW2P{1$%qTTW@fe0O-y6bC+9Ng{Lf3u9*)N
zhTz*O;&n`h(C%_hHl_G5$LAFlRg{%!S#ljb#Z~&;`|0QS-`|#&(ni$%sJT?W-B7zv
zSk6LvKzjE|>GM~_;*9i-*EUy=FL}g$u^9-sN7ve7>|Q$}f1irD)XwJ=0plz*#~*Wq
zUEe=e%loZ2r|rGT|Df`^P04S7wMnXH4G+xZT;}pLed@twKAd-_x|;LKeU|%QBWb-U
zBydmg^(v6Q1hN!wa^jPc@+uA|woF6{UIpJ9ehk4c`KZEjC}3tHMQTz?^2Mp8hF(sY
zGbJWR?S-#UW4$Bl^!~cGGI~eX9{5<>^tQmJSv>0bWqdvgm2r&`_4jpg-v^!UUvs7t
z=Q$BU-o*h*O2TaDsORZ?b*6vnv{Z+Q;mI=X>(+GqG9M+OEloU7arv_F1buQGLwkC$
zC-b8CfLgZCkb`-P*oyhP>xh{f#$P((IytQ=8CTR-hz6g@?R$fHNra?wjx?;z&;V_!I5hFbDv<)%(?+
zhy?FpwRErH@JHX1dq`4#4?hG*Hos8N@-0
zd<^tu#Q7YkGPlk1MpJI3tqy%l=s*p)ce@I&Yu{aV@`olyd^|ZyFImMQmhh0iU%{tv
z$+kvz%r+%Q3(5p`v@x(x7tg4~Tlo^J&tNK-ym@QV5c68`hs!gGT;|
znzFccG&7MyaySt~vv`{m_i5Rr6`3kM`dv)Ks_~Q
z+#P?P1)q;HHx2xU1DBl{TeVu7vxBVfCX#m7&W?xu_5OSO
z!NdpUb@Bl4<|*Yna1VpG
z@A(%Vh7tQ)7%{l-ulViEZI+tczvXSnXDPc~ioxCEmhtyypn;o?H~*A={tU|1Bwnh5
z-|_K?*mKK~=WIWog0J3P_y@T9__xZe?*upA%wM;lzKgqD%+}(cJ@N8PbD|zZmN3eWqe(@~u|KYXxF5ScxaLYW?n&cFD2Y^j~1Zr^S+?J=$4)9c)
z3ek8pxN~^##KEfoh3J}j>GffH#L422D~(a2QP;(f{C>Z7RwVR@d=H{JpFa}TZPfXK
zSdPHm%gOQE9vask-8jmB-^^=;4iS=;py63{?Od1@AuP_
z1T`b$x5;tGno+l?JQXXrX?F}3&I$^?Lq$9+)ql)u7B3U&gHB}{A#ZGVkZI#5{i{>l
zME37(&l#S5I`G=yfjtB*ezD@75);CPcP{#W{b#Qh+)KzJPm)ba1=
z<1Q6bsrQIoPSRzmDXkkJ46lsERWu{ax(Btn@txR07VJ`3!T*@)w0i2~NeYrLK1?t|
zKF?4c*j<9tHuzp#VX)>k3KV2s5SCEa@23ezTkz46c=FIby^S+cV$lk1>!~|5zF%dk
z%`QL5sv=vfZX=;3{_+WqPXxsTKR65^PBVu$T{d
z&sq3t(VXHizq_94mILAEf1liH`tIvedHf{eQ;45^dkjUtYSQV;e%IGd%Z6cI;w%W>
zEt9`@ZiFzJV^gb6%iaiPG=GJYSO*`BgQW)d7fdkzBYv-wvgN0
z>@Rpz?D2mFyA|f)DcTY59k2$t&*8>;*7xvAe!Vz5gSXNDpQE6JbCGe<*G^yfJL+N$
z?vDQgWdDhC6Uu%%1(Y^@(=1;&(}n+Ux$nL-HnE*KX<{llm!YRcw7dO-f&Q~sg#YZ-
z?LlAso%xaTXH871Av5{n(Pk;`-Ug
zXfokfz@MXfgR4%gXjXzS^shM`Zs4lm+P8tI5J<7XD)d%ij8TUUO)5kRh@i$!Io{P-2IdeQ|^g-LJAhn$ybUP
zvUtr04g_=)a>M%gNpTZB4KelEM31~wvn^ylD@qbk&2mJgww`})!bj6F^-v%SU=S$*GJ77Os{0
z@BWiTWPNfvlK)@ey8n-DUF}cs>-6j1nwU`^NH`l&7XRsGR&OccX8`af-qPUhzy8hl
z8~>~!_y4-Nz<=)KJ2Ou;H>~dbUGmCh-4Go92iexVa5^5p-}rmrX7HaC`d{DS-Loux
z;lB>WyMHFFi{yWOliJSpV$dLXc)U$sfp7j=x{i2`zgsS7)^_rII6b@H5@yf;50n27
zI{v?zgYPsUPlyqBPd)3IDB4zsQU&}S3wC2%4NZdl!P|eQ#yodo3);Un?qo)t@O9wy
z=3^luN0q9ySHeGzS2|Zq=9Bx9hTKqp8XuVQp)n%x(
z(ZAJ?%B*ZRCCsyb@KVgw2AMGrOun3tB&ya1?iRI7LzvzQN_+K1@0)Q3UuTzq5UX+1
zpDog}I9ue_`uP<*ds28v2BmdH2D1Z-k^|k35bTZYt>LNxzXK<7l4_DK|Mq}s>LI0|P3u3len!tqyT4iR644c*
z!qbao_OD(W)JBxflysaV_my^xZ}g}wgDHwscsvv-;v2W@#u;ik>GE!x>3(xu#*})s
z8d+VX#cCNq6BDzX*AqJfx=?IN2GGs2m43OZF>TKj^Z3Z`mcr=6(4w)^1k
z(pWsr&wQbT`cTUwzx?5pD45@+L-Y8T4CQb=6OewmO%ML!p*`fk{29WZ(fl>8{^8EQ
z4}MhodHAQ_=K@S9T=@u=Y>BF&VCqoH-VXr)YVCy)dlqqi4w5}Njr5eG`lo@ulOAQ0
zDcZC{Y=Vxi|MGS8i7A=Ei}JgJ7^P2z*2I|$wEmI;WMSm&`SI@?bD9XKJe|v5I#8k}
zAybwFQ8g7i{+h>>%fql|++G3;GrKEQ1cd3+rk$kR^a75bu+h{n!lxj5yz<@G_b*OV
zQqEn`q4c2WL1;1<;fp6Joi7(ceFLO`a`gaTa{kV-3FWdsQ;q+R6TCvP9rG7^Q!XqL
zJ5ge`*YA`lGAR$qSsZlEd{ADMd=kQEJaPN&OW8n3r`ldx2;6oLGZRDOEeU4yWe1Ck
z-I|erou5rgI~tL&=$|)a;QZ@T3Reoojw)YD^a~P2O<%c!mwI>HI<7HzRey=y)Hq-|
z&D{S&&*FB&ArSqG75$#9{vQCyvNwYBFgUrrju}@1g|wa?U30%VdRR)kDP6Z)AUw^XlPZnr{c$a?H=&us>WGXyRrln|Jon>HcqAsB55ovbl$B{00R*d^D8C
zbPA5ow_KQzcpMD0&H^7jN4MinM#p-kT0T-=Wuw5JkA`d0$*23Xl-XGm$|(+X0+qtw
ziRF}S6K6xEG4(r?%|9hqRZA5^cY$JR4i{NfFR~spSrMk3&^emlv{zqj-ehJ{&d7YlZ4;L4gepSUvmv65bEczzn)vP
zUPP=pkggoIld;Jl-0mTaG5*05-m@4}Ih0#Rbb=cXmE;*HfhXd|jnNpZ&)%`8HDQvq
zGI87YDd9k&Bj~k=*hy*TaK53{;JP4-G7C*eLmUif8~pDk_q}*%9mEAF6dx8EbEghm
zG#_~g%atsDOw<660lvX=jRFPj&imYdIdyBG%(B8}Zyyq;Z$qe-@w_vz9`AOK*H%~e
zj*^;Dj}uvi{`M(qL3m;&U>rUI2b}9x{rU*FlddW6rK&AWc6KeB(|}?=q>Eq5Ow3px
zGh3kAC|aP@YMw4K;c)If#@Uw2ItqT?IW|n`2vlJ4`_2daeB-m%X(8Zy%O-z%&L#}l
zn*LIcu{y{I%L<(i%w*%)f!{nhc&zdHCB>N(SPq~!^FZ}?j#1$Dcfu4Y4?RBo@_&Dc
zuK~3KB_)bUPAs`TpJ=@`F}1xeUa;_LcqOynKNli{ilQ}Sc|!&Anf)}C(z?MkuDf>K
z^!e@C!mCjh1A|VQgl5x$)E`Bgk1yY}tDduq?Vg8?4QF_}Z;k?^?sog;`hRp0C5tl`
zcXYnKq4QR~BY!AgtDx$jc>E_$O?!2lga9olJP=?~e4ytuP_*_y4cO&v7eLUqre{im
z(mzq+hi)pJV$yCcCh2oBXosYnvqR~Sz7v;z@pI<&Y&sXCTnS(|{WQYmMNWS+94uC$CQL)*+ggo9eziW@5dlUA^|n;7Z9XQKD?^hj|l_tHCy7Jvn%Cr|pC03x^K
zCeSCZ55N-BhWmdD>!0$ZDMyvr0YkY@ZLPzA|9rN7&Crb9>cXLRvMBREtzyMEG9u^d
zNj+9dFqutWm$_%gI&BF-_yhHNs~D~(UbKavePNN|E~6
zU(;{YF24cyolbht=q`Ad>R}`x;e(y(2Wk@nmB9JC->ls_{y~-W9o(hnIMIBRCvnt|
z3UCloQ?UM0LZH*SxRAx^Y0s`P_N
z>CdnK?kc{VG$uS~;H;sH=qh!}B=Udso59=looy7w2g>>$4)#z2gjN8q{|b93)o_qT
z-tm3TSm~YzkS^3GO?&OYW&g=sKPFLaFucn5yavERtA_n?8BZ805FeM`=6lnuM+*pO0}_x`Vl-2
z2tKAwgDR7CxZUsM3f(4v9O2WuppmPC=jmfpZQ?eY
z3J?S3%gaRx@Hl`N8~c)L_q)VWNi85*d!@ZdwVN0e+UDU9HP8qTIA6j*pY@9jyJ)bF
zyz&(@pXaXuTZ+j{EGgima!u>0J{VpigE=wp`>u9_lt467Uo?uAmLEOu(I9?eoc61~&TdUV&>goua(cloH
z3uVf>8=@3Y|M@DX(R7G3$(7$4*Zu7uLgLwvu8K
zeS^IlMa95+!xbVQ=A60GX|*9RcwC`q2i@iq9Wtya%Jvf}$=@Gt=dovi1IF~xVf7u3
zY~PQMZ+Z(iPTI?atje=eFAIhMgA^5U(+>~f@e@hil1_j@9s4Bfad(GaT%0?7r@T}e
zg^6Fwqh2v))1za|F#7iLY5a4StuIY_>2M1Jv0saHGkMc8VhJXkqa|hR_xD-KM)Y<@@O{!
zJKPs_0Q1^6R4&=$rhySb=yTtS
zi{UOVq-QS{78b_G#|aDUY8~E}=KWv2a`L!(4$R5vwY#;}rXnFOUhcVFL}aV}2q&*6
z-)>fYgD+nlYxSu&Itr?Ej~Uf;tzt)bkGZyE$mzq@s{3c7U@thg*VpFOyB`jgpwZ}Z
zl$5-DMT}d2!4q|k67aPpe#Z1b@93v1{7D-^0R``AUP02+XWG)MU&@IxGBOGa3qzq$
zf@>4jTeqw{khcH`n`;FhPF3Tr8Q00hMMcT;E}ovAPEMk0JI>CMJ1dioU0q%EGc%E0
z*R^y*li!>b3^e!J18CoUs`t2y`FwOW-{~bXm%KKvh1-wAds7tL;(6C(%REN;Q;N<~
z0%V8}UR+%4Y~IP1T7W|J0p26>$v17d439sabIOM2i_%y?8xc`uaxzFcC#Y#-3YWxhUk4eF2{M!L
zLXL}^-QL^XHjxZo3uQ%vqY{eYuqP>}WO$I+q&lQfzlF=?=@An_)|`~d3h(`){=s06
zQoks^xO=)qJnfLsM76-Mmk|A7@oLdK5?*##N7$nzl7
z&5Ng*1-QPiN1_%O3oBb88
z(hvX&zp%HoO?DFHqMDH3+oCLg?RZvNt}IygwB?3liyQeWUWtE$IF5zZyt8bu&wDG$
zCTzLlsJ>5zcq{X6roIn$$M2&uFx0Z^q_v=PXR9s=7uQ6+J#GOB4dtP(MXJ3rA3g5s
zI2d`Rf5JtNvHAG(@K)}zx+(){_Q+#nFHW_OwX}bQm>^tr
z%A98psVCRhvJv>MhRC7kIM$1tW?#TG(2}}8$DU^j=5ZI@WpoNa-rC3FlJfQj;ImE?unCSj*E51=v?hJ;a0Y-tzewCxQq;wF6cHH%Ra9n!(pRtV*4;yIE|3J_bpe)o
zi=h$@gIsQs2Inq{2{R}O+c`a3k~Z4eVe>9+yeJOEs*mZ{Y~?!Hn2oA^B33?ofEv7W
zez;H!-W#xO7M*5gc5%#(OGHtK*~3geC^Ybqn`|?_&1dM5<@`j+^^@du+3sRYHP3rE
z7lWlGaoJUWyi16kAII>{9IXtZy}iu^P;*K(f%VciC?8*b^6wa9Oc+Yy_Q
z$u18CR2w?U7*ckm7)#V3j%rcB
zV-BX^5!R1_!g)#|Z(d!Zo>=?*wr?VgO)=-!R7vjf7pF$m#btur%?4n{nh-ix3P;m_
z7_p+j=R=XT>iR1yW66d>d}TmK<(po@wtZTZbdalU9GVyV9e=4`ykDGgAaAdpG!QIp
zrJ7ZG17iH{tu3Z-%#)>}E`j*Cf2Y!dbMj56k?`fvVPsza#*OnQv&w$ZDgD|Kp2seP
zC!`r`vp>TxG)0!an@};H;&|}zoFIxH&AaGL;4l^#$kQwk=)Nz2bF{4KX)h{ycNWcW
z+}vxQH#KhlhBXz@>SEVo80?Rw9)Dh58q`q5+*jg}&&mpv9tss#1W0nNMMm5|rkaR`
zO0P}_qP27FWO83Q=c#65TtgcB9tSsmDC6T8+C2g4`8e
zy8^z0ii<1K#+RU~9Qn<=W*T`Cdq`@6@uH4lNal~M?STPerT6YGoE$TlJ7TRXiS%(1
zE9Gz#VnkOoKGDzchNTSf0qr1mF*fO;1ya}{5oU%U|I{~LF
z4e_%!w!-L`q&;u!Ddh0pTrTm6NYiDBCbPN5h4vGeg0F)C^zkaEiU*!Ex7~ah1bneHaBhZHFxj8f9HyN7dKXw|9*6W!<FB|{T=UX*T=1`OIGz?|0}Yg|Ok-rvxG-xmPs&s{r`(rqNXpGn7+!uUuLyY#
zeA!V(hal%QvD<-TLX;YEepyE0+huoL)R-4UDxyvk<+Ic?;=%>x6QIn@Sqso;{~F;~
z(_kgt&cTtIPE#CDdd2@!E|L4a<6orecFSmb5nY25Shk
zUQi3#ZKxGtqUCY7qk3Q*lA=-yBvz9JZI~+aqN$wx*n9BDguB`JjrOV!O`#9Gkde<_
zTsmtF|CuwUzmFlh_3x5
zc~aoI%$&sFugEhJoVs77)IS-K@l_WR@gK4Uph`mC3(TWkp?>`DRVqWWsEI-_INYq+
zTUhu>hq*SP-6to=DP+3sZGxGq+UHh=ONNd_dUL*Qv-l
zVBTVp8Fl^e7sj1xBgFn#%=cB<@b;=IMX&>qn&M^aQM!-(sNl@`lXQIHV^Ak4vIVIp
zN#0xKrS#s4Igj@+?)J>|_Hx*p+9$r@HKnyqe6K}skeb)lX8QEOlm7nxlR>^kiS;;Q
z7|?B`92{JXb!|^O-BR7vVO(Oz9v4)s6@g|;B0zC>i-QTuDmUfignJ?yqQ#rbbL)~W
zL==yIVYlnWwMoDlXX~x{vr%gjo6e?T@~4s$qBrNF
z8*VK=d5;N#siHr7z#?q4XBw*%Pc#urAJ>?60A<5!;_W!S&8Ov>S9BKxMeoJ43@2ql
zAp2kj7EQ5W24T7yZ^xJC0||!Nzv|H5XRVQvXn9K#-P+>8M1g>?VPF}R@&l4B55qRl^hfd6~Zt+4w;Y6tYQ{Z#^v=7R_rg2
zj0iJ11M?+5I>n^SrCn=FrmP#tJ>ZR-K2z)`WN*=UHCj*g?%7@|d4J=Cy}ca=C#Nw4
zlBBr}y$BRCZWd}$Gu3aWWI1BzW_KQwOzD?n
z4GFiuBd-D_bCT)a$?Y~2*-MalzvZh->f~_R`Y+2(Y$cC=YejgvE*D@mQTGLCKt5zw
zxPy^4$&L`amZ@L4YG70C`kW;(n=C~6$0AbQ}z5s6x87L*mpjSlS9~F!f
zJ0hVGT17U5*q%%DUIo;&obi!dP6g1n4&qx)@S+(hZqhHj#O69bW0<33jsWUTjwDVv
z*ZbV%0gTmRPFj+?A=O?h{b05xed6^syUQ#`K$Y_kuguAb!bgk4y||{GS*LlQj_@LG
zwaYYb(7cPF0!AW-?yP*TVvAm#qoQn8QIfGQby6QZ)VQqFHC
GFaHaO`PmNu

diff --git a/.env.example b/.env.example
index 09bfa99..ab8186f 100644
--- a/.env.example
+++ b/.env.example
@@ -104,6 +104,9 @@ BOR_NAME_HIT_BONUS=0.005          # selection-time bonus a name-hit doc's best f
 # --- Agent document tools (grounded turns may extend context: ls / read / grep) ---
 # BOR_AGENT_MAX_ROUNDS=10   # hard cap on agent tool rounds per turn (0 = no tools); every tool result carries the model's remaining count (phase 160)
 # BOR_READ_MAX_CHARS=128000      # cap on a `read` result (chars); over-cap reads truncate + a notice that teaches the grep -> read(offset, limit) workflow (phase 95, rewritten phase 131)
+BOR_ANSWER_TEXT=true              # verbatim file display (phase 182): the master switch, ON by default (an answer's code block must never silently differ from the file). false = the escape hatch — the `show_text` tool is not offered, its  teaching clause is absent, ```bor locator fences are not resolved, and the done frame carries no `answer_text` key (every byte-identity contract is exactly pre-phase)
+BOR_SHOW_TEXT_MAX_CHARS=12000     # per-block char budget for ONE displayed verbatim slice (phase 182); the slice is cut at a LINE BOUNDARY + the shared […truncated…] marker and the caption's line range shrinks to what is actually shown; 0 = inert (no block displays), negative fails startup naming the field
+BOR_SHOW_TEXT_MAX_BLOCKS=5        # per-answer cap on displayed verbatim blocks (phase 182), counted in answer order; 0 = inert (no block displays), negative fails startup naming the field
 
 # --- Import scope (A9 default; ANY well-formed extension is allowed) ---
 # Comma-separated file extensions (lowercase, no dot) the importer reads.
diff --git a/AGENTS.md b/AGENTS.md
index 1340e38..0ffeb2f 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -47,7 +47,30 @@
    in-flight row (`role="status"`) / alert + Retry row
    (`role="alert"`, a real `