From 0ba53cc7e3a842683e4b6212c37a2bba1bbfe90d Mon Sep 17 00:00:00 2001 From: sorrow404null Date: Thu, 17 Sep 2026 16:30:02 +0800 Subject: [PATCH] init repo --- AGENTS.md | 66 + ARCHITECTURE.md | 238 + Frame.md | 288 + SYSTEM_PROMPT.md | 157 + WebView2Loader.dll | Bin 0 -> 163680 bytes core/__init__.py | 0 core/agent/__init__.py | 58 + core/agent/agent.py | 204 + core/agent/compaction.py | 641 ++ core/agent/context.py | 341 + core/agent/loop.py | 482 ++ core/agent/recovery.py | 519 ++ core/agent/stream_fn.py | 438 ++ core/agent/tools.py | 865 +++ core/agent/types.py | 331 + core/config_paths.py | 77 + core/db_manager.py | 715 ++ core/debug_log.py | 78 + core/llm_engine.py | 448 ++ core/platform_shell.py | 141 + core/renderer_backend.py | 164 + core/webview2.py | 417 ++ docs/agent-handoff/CURRENT_STATE.md | 110 + docs/agent-handoff/EXECUTION_STATE.md | 65 + docs/agent-handoff/KICKOFF_PROMPT.md | 362 + docs/agent-handoff/PLATFORM_PLAN.md | 153 + docs/agent-handoff/README.md | 55 + docs/agent-handoff/REPAIR_BACKLOG.md | 548 ++ docs/agent-handoff/VERIFICATION.md | 262 + docs/agent-handoff/evidence/P0-01.md | 45 + docs/agent-handoff/evidence/P0-02.md | 56 + .../evidence/P0-PHASE_REGRESSION.md | 42 + docs/agent-handoff/evidence/P1-01.md | 90 + docs/agent-handoff/evidence/P1-02.md | 74 + docs/agent-handoff/evidence/P1-03.md | 60 + docs/agent-handoff/evidence/P1-04.md | 59 + docs/agent-handoff/evidence/P2-01.md | 50 + docs/agent-handoff/evidence/P2-02.md | 48 + docs/agent-handoff/evidence/P2-03.md | 95 + docs/agent-handoff/evidence/P2-04.md | 104 + .../evidence/p2-02-codebox-corner-4x.png | Bin 0 -> 1875 bytes .../evidence/p2-02-outbox-render.png | Bin 0 -> 2420 bytes docs/agent-handoff/evidence/p2-02-panel.png | Bin 0 -> 61139 bytes .../win_real_qtwebengine_mainwindow.png | Bin 0 -> 24609 bytes .../evidence/win_real_wv2_mainwindow.png | Bin 0 -> 29657 bytes main.py | 119 + readme.md | 301 + requirements.txt | 58 + svg/check.svg | 3 + svg/chevron_down.svg | 4 + svg/chevron_right.svg | 4 + svg/cross.svg | 3 + svg/main.svg | 1 + svg/mode_chat.svg | 1 + svg/mode_worker.svg | 1 + svg/model.svg | 1 + svg/panel.svg | 4 + svg/panel_right.svg | 4 + svg/provider.svg | 1 + svg/provider2.svg | 1 + svg/provider3.svg | 1 + svg/send.svg | 3 + svg/send_white.svg | 3 + svg/stop.svg | 3 + svg/stop_white.svg | 3 + svg/upload.svg | 3 + tests/__init__.py | 0 tests/_test_env.py | 74 + tests/check_db_migration.py | 77 + tests/debug_inject.py | 48 + tests/diag_live_agent.py | 85 + tests/diag_live_onscreen.py | 186 + tests/diag_live_text.py | 187 + tests/diag_panel_scrollbar.py | 209 + tests/diag_rename_overlay.py | 262 + tests/diag_render_scale.py | 336 + tests/inject_math_demo.py | 118 + tests/run_all.py | 265 + tests/run_tests.py | 33 + tests/smoke_bash_panel.py | 737 ++ tests/smoke_copy_session.py | 156 + tests/smoke_live_guard.py | 280 + tests/smoke_manual.py | 42 + tests/smoke_midswitch.py | 203 + tests/smoke_mode.py | 94 + tests/smoke_offscreen.py | 206 + tests/smoke_persist.py | 297 + tests/smoke_probe.py | 64 + tests/smoke_repro_real.py | 127 + tests/smoke_timeline.py | 195 + tests/test_agent_core.py | 1323 ++++ tests/test_bash_stream.py | 197 + tests/test_compaction_persist.py | 289 + tests/test_config_isolation.py | 259 + tests/test_copy_session.py | 336 + tests/test_cross_platform_shell.py | 253 + tests/test_debug_window.py | 139 + tests/test_error_persist.py | 361 + tests/test_file_attach.py | 87 + tests/test_global_hotkey_platforms.py | 279 + tests/test_main_window_event_filter.py | 195 + tests/test_math_extract.js | 123 + tests/test_pdf_reader.py | 92 + tests/test_render_window.js | 347 + tests/test_renderer_matrix.py | 242 + tests/test_screen_capture_platforms.py | 293 + tests/test_think_code_neutral.py | 115 + tests/test_tool_params.py | 255 + tests/test_wv2_guard.py | 129 + tests/tune_mode_popup.py | 186 + tests/tune_model_popup.py | 399 ++ tests/verify_math_render.py | 151 + tests/verify_onscreen.py | 84 + tools/__init__.py | 0 tools/builtin_tools/__init__.py | 0 tools/builtin_tools/pdf_reader.py | 161 + ui/views/__init__.py | 0 ui/views/bash_panel.py | 956 +++ ui/views/chat_bridge.py | 230 + ui/views/custom_web_page.py | 77 + ui/views/debug_window.py | 214 + ui/views/main_window.py | 6222 +++++++++++++++++ ui/views/system_tools/__init__.py | 7 + ui/views/system_tools/desktop_session.py | 76 + ui/views/system_tools/file_reader.py | 71 + ui/views/system_tools/global_hotkey.py | 105 + ui/views/system_tools/portal_capture.py | 163 + ui/views/system_tools/screen_capture.py | 200 + ui/views/system_tools/x11_hotkey.py | 196 + ui/views/wv2_view.py | 218 + ui/web/app.js | 2309 ++++++ ui/web/dompurify.min.js | 3 + ui/web/highlight/atom-one-dark.min.css | 1 + ui/web/highlight/highlight.min.js | 1213 ++++ ui/web/index.html | 85 + ui/web/katex/fonts/KaTeX_AMS-Regular.woff2 | Bin 0 -> 28076 bytes .../katex/fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 0 -> 6912 bytes .../fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 0 -> 6908 bytes ui/web/katex/fonts/KaTeX_Fraktur-Bold.woff2 | Bin 0 -> 11348 bytes .../katex/fonts/KaTeX_Fraktur-Regular.woff2 | Bin 0 -> 11316 bytes ui/web/katex/fonts/KaTeX_Main-Bold.woff2 | Bin 0 -> 25324 bytes .../katex/fonts/KaTeX_Main-BoldItalic.woff2 | Bin 0 -> 16780 bytes ui/web/katex/fonts/KaTeX_Main-Italic.woff2 | Bin 0 -> 16988 bytes ui/web/katex/fonts/KaTeX_Main-Regular.woff2 | Bin 0 -> 26272 bytes .../katex/fonts/KaTeX_Math-BoldItalic.woff2 | Bin 0 -> 16400 bytes ui/web/katex/fonts/KaTeX_Math-Italic.woff2 | Bin 0 -> 16440 bytes ui/web/katex/fonts/KaTeX_SansSerif-Bold.woff2 | Bin 0 -> 12216 bytes .../katex/fonts/KaTeX_SansSerif-Italic.woff2 | Bin 0 -> 12028 bytes .../katex/fonts/KaTeX_SansSerif-Regular.woff2 | Bin 0 -> 10344 bytes ui/web/katex/fonts/KaTeX_Script-Regular.woff2 | Bin 0 -> 9644 bytes ui/web/katex/fonts/KaTeX_Size1-Regular.woff2 | Bin 0 -> 5468 bytes ui/web/katex/fonts/KaTeX_Size2-Regular.woff2 | Bin 0 -> 5208 bytes ui/web/katex/fonts/KaTeX_Size3-Regular.woff2 | Bin 0 -> 3624 bytes ui/web/katex/fonts/KaTeX_Size4-Regular.woff2 | Bin 0 -> 4928 bytes .../fonts/KaTeX_Typewriter-Regular.woff2 | Bin 0 -> 13568 bytes ui/web/katex/katex.min.css | 1 + ui/web/katex/katex.min.js | 1 + ui/web/marked.min.js | 6 + ui/web/render_window.js | 304 + ui/web/style.css | 932 +++ .../net462_Microsoft.Web.WebView2.Core.dll | Bin 0 -> 698208 bytes vendor/webview2/sdk.nupkg | Bin 0 -> 9259926 bytes vendor/webview2/webview2loader_x64.dll | Bin 0 -> 163680 bytes 163 files changed, 33634 insertions(+) create mode 100644 AGENTS.md create mode 100644 ARCHITECTURE.md create mode 100644 Frame.md create mode 100644 SYSTEM_PROMPT.md create mode 100644 WebView2Loader.dll create mode 100644 core/__init__.py create mode 100644 core/agent/__init__.py create mode 100644 core/agent/agent.py create mode 100644 core/agent/compaction.py create mode 100644 core/agent/context.py create mode 100644 core/agent/loop.py create mode 100644 core/agent/recovery.py create mode 100644 core/agent/stream_fn.py create mode 100644 core/agent/tools.py create mode 100644 core/agent/types.py create mode 100644 core/config_paths.py create mode 100644 core/db_manager.py create mode 100644 core/debug_log.py create mode 100644 core/llm_engine.py create mode 100644 core/platform_shell.py create mode 100644 core/renderer_backend.py create mode 100644 core/webview2.py create mode 100644 docs/agent-handoff/CURRENT_STATE.md create mode 100644 docs/agent-handoff/EXECUTION_STATE.md create mode 100644 docs/agent-handoff/KICKOFF_PROMPT.md create mode 100644 docs/agent-handoff/PLATFORM_PLAN.md create mode 100644 docs/agent-handoff/README.md create mode 100644 docs/agent-handoff/REPAIR_BACKLOG.md create mode 100644 docs/agent-handoff/VERIFICATION.md create mode 100644 docs/agent-handoff/evidence/P0-01.md create mode 100644 docs/agent-handoff/evidence/P0-02.md create mode 100644 docs/agent-handoff/evidence/P0-PHASE_REGRESSION.md create mode 100644 docs/agent-handoff/evidence/P1-01.md create mode 100644 docs/agent-handoff/evidence/P1-02.md create mode 100644 docs/agent-handoff/evidence/P1-03.md create mode 100644 docs/agent-handoff/evidence/P1-04.md create mode 100644 docs/agent-handoff/evidence/P2-01.md create mode 100644 docs/agent-handoff/evidence/P2-02.md create mode 100644 docs/agent-handoff/evidence/P2-03.md create mode 100644 docs/agent-handoff/evidence/P2-04.md create mode 100644 docs/agent-handoff/evidence/p2-02-codebox-corner-4x.png create mode 100644 docs/agent-handoff/evidence/p2-02-outbox-render.png create mode 100644 docs/agent-handoff/evidence/p2-02-panel.png create mode 100644 docs/agent-handoff/evidence/win_real_qtwebengine_mainwindow.png create mode 100644 docs/agent-handoff/evidence/win_real_wv2_mainwindow.png create mode 100644 main.py create mode 100644 readme.md create mode 100644 requirements.txt create mode 100644 svg/check.svg create mode 100644 svg/chevron_down.svg create mode 100644 svg/chevron_right.svg create mode 100644 svg/cross.svg create mode 100644 svg/main.svg create mode 100644 svg/mode_chat.svg create mode 100644 svg/mode_worker.svg create mode 100644 svg/model.svg create mode 100644 svg/panel.svg create mode 100644 svg/panel_right.svg create mode 100644 svg/provider.svg create mode 100644 svg/provider2.svg create mode 100644 svg/provider3.svg create mode 100644 svg/send.svg create mode 100644 svg/send_white.svg create mode 100644 svg/stop.svg create mode 100644 svg/stop_white.svg create mode 100644 svg/upload.svg create mode 100644 tests/__init__.py create mode 100644 tests/_test_env.py create mode 100644 tests/check_db_migration.py create mode 100644 tests/debug_inject.py create mode 100644 tests/diag_live_agent.py create mode 100644 tests/diag_live_onscreen.py create mode 100644 tests/diag_live_text.py create mode 100644 tests/diag_panel_scrollbar.py create mode 100644 tests/diag_rename_overlay.py create mode 100644 tests/diag_render_scale.py create mode 100644 tests/inject_math_demo.py create mode 100644 tests/run_all.py create mode 100644 tests/run_tests.py create mode 100644 tests/smoke_bash_panel.py create mode 100644 tests/smoke_copy_session.py create mode 100644 tests/smoke_live_guard.py create mode 100644 tests/smoke_manual.py create mode 100644 tests/smoke_midswitch.py create mode 100644 tests/smoke_mode.py create mode 100644 tests/smoke_offscreen.py create mode 100644 tests/smoke_persist.py create mode 100644 tests/smoke_probe.py create mode 100644 tests/smoke_repro_real.py create mode 100644 tests/smoke_timeline.py create mode 100644 tests/test_agent_core.py create mode 100644 tests/test_bash_stream.py create mode 100644 tests/test_compaction_persist.py create mode 100644 tests/test_config_isolation.py create mode 100644 tests/test_copy_session.py create mode 100644 tests/test_cross_platform_shell.py create mode 100644 tests/test_debug_window.py create mode 100644 tests/test_error_persist.py create mode 100644 tests/test_file_attach.py create mode 100644 tests/test_global_hotkey_platforms.py create mode 100644 tests/test_main_window_event_filter.py create mode 100644 tests/test_math_extract.js create mode 100644 tests/test_pdf_reader.py create mode 100644 tests/test_render_window.js create mode 100644 tests/test_renderer_matrix.py create mode 100644 tests/test_screen_capture_platforms.py create mode 100644 tests/test_think_code_neutral.py create mode 100644 tests/test_tool_params.py create mode 100644 tests/test_wv2_guard.py create mode 100644 tests/tune_mode_popup.py create mode 100644 tests/tune_model_popup.py create mode 100644 tests/verify_math_render.py create mode 100644 tests/verify_onscreen.py create mode 100644 tools/__init__.py create mode 100644 tools/builtin_tools/__init__.py create mode 100644 tools/builtin_tools/pdf_reader.py create mode 100644 ui/views/__init__.py create mode 100644 ui/views/bash_panel.py create mode 100644 ui/views/chat_bridge.py create mode 100644 ui/views/custom_web_page.py create mode 100644 ui/views/debug_window.py create mode 100644 ui/views/main_window.py create mode 100644 ui/views/system_tools/__init__.py create mode 100644 ui/views/system_tools/desktop_session.py create mode 100644 ui/views/system_tools/file_reader.py create mode 100644 ui/views/system_tools/global_hotkey.py create mode 100644 ui/views/system_tools/portal_capture.py create mode 100644 ui/views/system_tools/screen_capture.py create mode 100644 ui/views/system_tools/x11_hotkey.py create mode 100644 ui/views/wv2_view.py create mode 100644 ui/web/app.js create mode 100644 ui/web/dompurify.min.js create mode 100644 ui/web/highlight/atom-one-dark.min.css create mode 100644 ui/web/highlight/highlight.min.js create mode 100644 ui/web/index.html create mode 100644 ui/web/katex/fonts/KaTeX_AMS-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Caligraphic-Bold.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Caligraphic-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Fraktur-Bold.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Fraktur-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Main-Bold.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Main-BoldItalic.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Main-Italic.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Main-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Math-BoldItalic.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Math-Italic.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_SansSerif-Bold.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_SansSerif-Italic.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_SansSerif-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Script-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Size1-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Size2-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Size3-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Size4-Regular.woff2 create mode 100644 ui/web/katex/fonts/KaTeX_Typewriter-Regular.woff2 create mode 100644 ui/web/katex/katex.min.css create mode 100644 ui/web/katex/katex.min.js create mode 100644 ui/web/marked.min.js create mode 100644 ui/web/render_window.js create mode 100644 ui/web/style.css create mode 100644 vendor/webview2/net462_Microsoft.Web.WebView2.Core.dll create mode 100644 vendor/webview2/sdk.nupkg create mode 100644 vendor/webview2/webview2loader_x64.dll diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..276a5ce --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,66 @@ +# 仓库协作规则 + +haocode 是面向 Windows 和 Linux 的 PyQt6 桌面 AI Agent 客户端。Windows 首选 WebView2,失败时回退 QtWebEngine;Linux 只使用 QtWebEngine。`core/agent/` 保持无 GUI,并继续与 pi 对齐。 + +## 权威交接入口 + +处理修复、跨平台、测试、项目结构或交接任务前,必须先读 `docs/agent-handoff/README.md`,再按其中的触发条件读取对应文档。`readme.md`、`Frame.md` 和 `ARCHITECTURE.md` 只作历史背景,不能未经核验就当作事实源。 + +`data/config.json` 是不透明的本机密钥文件。Agent 不得打开、读取、搜索、打印、复制、编辑它,也不得让宽范围内容搜索包含它。测试必须使用临时配置。 + +## 项目结构 + +- `main.py`:入口、UTF-8 标准输出保护、Chromium 参数和 `MainWindow` 创建。 +- `core/`:无 GUI 后端,包括 SQLite 会话树、Qt 工作线程、WebView2 后端和日志。 +- `core/agent/`:与 pi 对齐的循环、流式处理、重试/压缩恢复,以及 `read`/`bash`/`write`/`edit` 工具;可直接进行纯 Python 测试。 +- `ui/views/`:PyQt6 窗口与桥接。`main_window.py`(约 6000 行)是当前中心,还包括 `bash_panel.py`、`chat_bridge.py`、`wv2_view.py`、`custom_web_page.py`、`debug_window.py` 和 `system_tools/`。 +- `ui/web/`:离线网页层,包括 `index.html`、`app.js`、`style.css` 及 vendored marked/DOMPurify/KaTeX/highlight.js。 +- `data/`:源码运行时数据,包括不透明的 `config.json`、自动创建的 `chat_history.db` 和 `attachments/`。 +- `tools/builtin_tools/pdf_reader.py`、`svg/`(图标)、`SYSTEM_PROMPT.md`(每次请求重新读取,修改后无需重启)。 +- `vendor/webview2/` 和根目录 `WebView2Loader.dll`:Windows 运行依赖,**不得删除**。 +- `tests/`:测试、smoke、诊断和人工验证脚本。 + +## 常用命令 + +- `pip install -r requirements.txt`:安装当前依赖;Linux 依赖规范化见交接任务清单。 +- `python main.py`:从源码运行。Windows 可从 WebView2 回退 QtWebEngine;Linux 使用 QtWebEngine。 +- `python tests/run_tests.py`:只运行当前 agent-core 聚合,不会发现整个测试目录。 +- `node tests/test_math_extract.js`:运行前端公式提取测试。 +- `python tests/check_db_migration.py `:只读检查数据库迁移完整性。 + +## 编码规范 + +- 以 Python 3.10 语法为基线,使用 4 空格缩进、`snake_case` 函数/文件名和 `PascalCase` 类名;目标运行矩阵为 Python 3.10–3.12。仓库未配置 formatter/linter,修改时匹配周边风格。 +- 注释和文档使用中文;路径、命令和 API 标识符保持原文。 +- `requirements.txt` 只列源码确实导入的包;依赖变更必须有意为之。 +- `core/agent/` 必须保持无 GUI,确保可离屏测试。 + +## 测试规则 + +仓库不使用 pytest;测试是可直接运行的 Python/Node 脚本。`tests/run_tests.py` 当前只加载 agent-core 套件。`test_*.py` 表示聚焦自动化测试,`smoke_*.py` 表示离屏集成测试,`diag_*`/`verify_*`/`tune_*` 默认表示诊断或人工脚本,除非文件自身另有说明。 + +```bat +set PYTHONIOENCODING=utf-8 +set QT_QPA_PLATFORM=offscreen :: only for smoke_* GUI tests +python tests/test_tool_params.py +``` + +跨平台聚合入口(不改变任何独立命令):`python tests/run_all.py --group logic|offscreen|all`。每个条目独立子进程 + 临时目录 + 显式超时;依赖/平台不适用项打印明确 SKIP 理由;任一失败则退出码非零。默认不跑 `diag_*`/`verify_*`/`tune_*`/真实 API/真实桌面脚本。 + +导入 `MainWindow` 前,必须把 `core.db_manager._DEFAULT_DB` 指向临时数据库,并把 `HAOCODE_CONFIG_FILE` 指向临时配置。当前仍有代码绕过该变量;对应任务完成前,测试还必须 patch 相关模块缓存的路径,并证明真实运行时文件未被访问或修改。 + +## 调试铁律 + +- **所有调试命令、测试与诊断脚本执行都必须设置显式的最长耗时预算(timeout)**。 +- 若中途因超时跳出,先定位卡点,再允许延长预算重跑;**严禁不设超时让它无限卡死**。 + +## 变更粒度 + +当前快照没有 Git 历史。不得初始化 Git 或伪造提交;每批修改仍须保持可独立提交。未来提交信息使用简短祈使句并注明区域,例如 `core/agent: fix compaction cut-point`。 + +## Agent 注意事项 + +- 运行时可能在根目录写出 `compaction_diag.log`、`stream_diag.log`、`diag_shot_*.png` 等诊断产物。除非当前任务明确负责清理,否则不得删除。 +- shell 行为尚未规范化。目标契约是 Windows `cmd.exe`、Linux `/bin/bash -lc`;修改前先读 `docs/agent-handoff/PLATFORM_PLAN.md`。 +- 本阶段源码运行继续把数据放在项目 `data/` 下;打包路径和 AppData/XDG 迁移延后。 +- 不得删除 `vendor/webview2/` 或根目录 `WebView2Loader.dll`。 diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..cf39878 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,238 @@ +# 项目文件架构 + +> [!WARNING] +> **历史资料,不是当前事实源。** 本文仅保留旧架构与故障记录。处理修复、跨平台、测试、项目结构或交接任务时,先读 [`docs/agent-handoff/README.md`](docs/agent-handoff/README.md)。 + +> 仅描述目录与文件的基础组织,不涉及具体实现细节。 + +``` +GeekAgent-Studio/ +│ +├── main.py # 程序入口 +├── requirements.txt # 依赖清单 +├── untitled.ui # Qt Designer 界面文件 +│ +├── ui/ # 表现层(桌面窗口 + 本地 Web 渲染) +│ ├── views/ # PyQt6 窗口与组件逻辑 +│ │ └── system_tools/ # 系统级工具(全局热键、截屏等) +│ ├── web/ # 本地 HTML/JS/CSS 渲染层 +│ │ └── highlight/ # 本地代码高亮库 +│ └── assets/ # 静态资源(样式表、图标) +│ └── icons/ +│ +├── core/ # 控制与大脑层(后端核心) +│ +├── agents/ # Agent 逻辑与执行器 +│ +├── workspace/ # 智能文件系统与代码编辑 +│ +├── tools/ # 动态 Skill / Tool 生态 +│ ├── builtin_tools/ # 内置基础工具 +│ └── dynamic_skills/ # 动态生成的工具脚本 +│ +├── data/ # 本地数据与缓存 +│ ├── attachments/ # 聊天附件 +│ └── .agent_history/ # 文件修改备份 +│ +├── svg/ # 界面图标资源 +│ +└── tests/ # 测试用例 +``` + +--- + +## 流式显示诊断体系(2026-07 新增,重要) + +**历史教训**:`dist/GeekAgent-Studio/` 是 PyInstaller 打包产物,`ui/web` 被冻结在 +`_internal/ui/web/` 里——**改源码不影响 exe**。修 UI 问题后必须重新打包 +(`python -m PyInstaller geekagent.spec --noconfirm`),否则用户跑 exe 永远看不到修复。 + +**链路诊断日志**(`stream_diag.log`,应用根目录,每次启动清空): +- Python 侧:`APP_START` / `FRONTEND_VER <前端版本戳>` / `CHUNK`(前 3 条 + 每 50 条 + + 会话不匹配时全记)/ `THINK` / `RESTORE` / `JS_DIAG`(回复完成时抓 JS 事件环) +- JS 侧:`window.__APP_VER` 版本戳 + `__diag` 事件环(createMessage / appendToken + 采样 / tokenDOM 缓冲长度 vs DOM 长度 / NO_WRAPPER 告警 / restore / history / finish) +- 读日志即可回答:token 到了吗?wrapper 在吗?缓冲有内容吗?DOM 写进去了吗? + +**助手正文透明气泡**(用户方案):`.message.assistant .md-segment` 浅灰半透明底 + +圆角边框,流式中/完成后视觉一致;正文段元素在首个 token 时同步创建,气泡即时出现。 + +--- + +## Agent 核心(core/agent)— pi 1:1 移植 + +``` +core/agent/ +├── types.py # AgentMessage(kind 标记压缩摘要) / AgentConfig / 事件 / ToolCall / ToolResult +├── context.py # token 估算(usage 锚定 + CJK 感知)/ 输出钳制 / 压缩触发公式 +├── stream_fn.py # openai_stream:流式 + tools 序列化 + OpenAI⇄pi 消息转换 +├── tools.py # bash(shell=True) / read / write / edit + 文本兜底解析器 +├── loop.py # run_loop:系统提示注入 → 流式 → 工具批执行 → 截断保护 +├── agent.py # Agent:事件订阅/发布(subscriber 异常静默,pi 语义) +├── compaction.py # pi harness 压缩算法 1:1(切点/断轮/迭代摘要/文件附录) +└── recovery.py # 429/上下文溢出/截断 重试与恢复(pi 精确语义) +``` + +- 每次发送 → 新 `AgentWorker`(core/llm_engine.py,QThread 胶水层); + 多轮工具循环在一次发送内部闭环,UI 线程只收 Qt 信号。 +- `stream_fn` 协议:`stream_fn(context, model, signal, max_tokens, tools=None)`; + `tools` 必须序列化进 OpenAI 请求体(否则模型只能"文字扮演"工具调用)。 +- `SYSTEM_PROMPT.md`(项目根):worker 模式每次请求头部注入,不入历史、不受压缩影响。 + +### 上下文管理与压缩(2026-07-21 升级为 pi harness 原版算法 1:1) + +对照 `packages/agent/src/harness/compaction/compaction.ts` + `utils.ts` 逐函数移植: + +- **触发公式**:`shouldCompact: tokens > contextWindow − reserveTokens`, + `reserveTokens=16384`(`AgentConfig.compaction_reserve`),替换旧 40% 启发式。 +- **token 估算**:usage 锚定 1:1——最后一条有效 assistant(非 aborted/error 且 + totalTokens>0)的精确值 + 其后消息逐条估算;无 usage 则全部逐条。 + 逐条估算用 CJK 感知版(唯一已声明偏差:pi 是 chars/4)。 +- **切分点** `find_cut_point`:从尾部回扫累计 token 至 `keepRecentTokens=20000`, + 取该位置起第一个有效切点(user/assistant;toolResult 不可切); + 切点非 user → **断轮**:轮起点前的历史与轮前缀**分两次 LLM 摘要**, + 拼接 `{history}\n\n---\n\n**Turn Context (split turn):**\n\n{prefix}`。 +- **迭代式更新**:上次压缩摘要(`kind="compaction_summary"` 消息)不重摘, + 作为 `` 走 `UPDATE_SUMMARIZATION_PROMPT`(pi 四套提示词逐字移植)。 +- **文件操作附录**:摘要范围内 read/write/edit 工具的 path 提取, + 摘要尾部追加 `/`(1:1 utils.ts)。 +- **摘要预算**:`maxTokens = min(0.8×reserve, model.maxTokens)`;轮前缀 `0.5×reserve`。 +- **对话序列化**:`[User]:` / `[Assistant thinking]:` / `[Assistant]:` / + `[Assistant tool calls]:` / `[Tool result]:`(超 2000 字符截断)逐字一致。 +- **唯一已声明偏差**:摘要 LLM 调用失败时降级为机械摘录(pi 返回错误), + 桌面应用优先不丢上下文。 +- 架构级差异:会话重启后 agent 内存态不持久化(DB 只存时间线), + 压缩摘要随之丢失、上下文从零重建——与 pi 的 compaction 条目落盘不同(见桌面文档)。 + +## 时间线持久化(2026-07 新增) + +agent 模式的完整事件时间线按序落库,切会话/重载后 1:1 还原: + +``` +messages.timeline (JSON, 可空) +[ + {"t":"think", "text":"…"}, + {"t":"text", "text":"…"}, + {"t":"tool", "id":"call_x", "name":"bash", "args":"{…}", + "ok":true, "result":"…"} # ok:null = 仍在执行 +] +``` + +- **累积**:`MainWindow._active_streams[session]["timeline"]` 从 + reasoning/chunk/tool 三组 Qt 信号按到达顺序累积。 +- **入库**:正常结束 / 中止 两条路径都带 `timeline` 写 `db.add_message`。 +- **重载**:`load_messages_to_web` 对带 timeline 的 assistant 行调 + `renderTimelineHistory`(静态时间线:思考折叠、chip 定格、文本完整渲染)。 +- **切回进行中会话**:`restoreStreamingTimeline` 按流式状态恢复, + 后续 token 无缝续流(续接紧邻的进行中块,否则新开一段)。 +- **API 上下文重建**:`build_api_context` 对带 timeline 的行重建完整链 + (assistant+tool_calls → tool 消息),模型跨轮次工具记忆不丢。 +- 旧消息(无 timeline 列值)走原有聚合渲染,向后兼容。 + +## 流式渲染鲁棒性 + agent 运行期 UX(本轮新增) + +### 1. 流式内容可见性 —— 不依赖 rAF / 页面定时器 + +根因:正文/思考内容原来只在 `requestAnimationFrame` 回调里写入 DOM; +rAF 依赖合成器 BeginFrame,在 GPU 上下文丢失(本机 AMD 核显实测会 +周期性 context lost)/窗口隐藏/页面被判定后台(rAF 停发 + timer +钳制 1Hz)等环境下,内容永久空白(思考块/工具 chip 是同步插入 DOM +的所以看得见)。 + +对策(三层,均不依赖页面帧/定时器): +1. **同步渲染通道** `syncRenderThrottled`:`appendToken`/`appendReasoning` + 在同一 JS 任务内 30ms 节流直接写 DOM(token 由 Python runJavaScript + 送达,必被执行); +2. **恢复路径同步上屏**:`renderTimelineEntries(liveMode)` 结束即 + `syncRenderThrottled(msgId, 0)` —— 中途切回会话,恢复的正文/思考 + 不等任何帧立即显示; +3. **Qt 看门狗**(`MainWindow._render_watchdog`,200ms):对当前会话 + 活跃流 `forceRenderNow(msgId)`(幂等,尾部无变化时近零开销)。 + +另有:`doStreamingRender` 逐段 try/catch(解析异常 → 全量重解析); +rAF 通道保留作平滑优化 + 40ms setTimeout 兜底;收尾取消全部定时器。 + +回归测试:`smoke_live_guard.py` Phase 0(rAF+全部页面定时器 kill → +burst 后 400ms 内容必现)+ Phase A(仅 rAF 卡死 → 40ms 兜底); +`smoke_midswitch.py`(流式中切走→切回:块顺序/正文/思考/DB 完整 + +切回后立即同步可见)。 + +### 2. 深度思考:默认收起 + 进行中蓝色动画 + +- 流式/恢复/历史三条路径的思考块一律 `open=false`; +- 进行中块带 `.streaming-think`:标签蓝色呼吸 + 省略号动画(CSS + `think-breathe` / `think-dots`); +- 收尾移除动画类,标签还原「已完成深度思考」。 + +### 3. bash chip:耗时 / 命中超时徽章 + +- bash 工具结果自带 `[exit N] (X.Xs)` 与 `命令超时(>Ns)已终止`; +- `_parseToolTiming` 解析后在摘要行插入 `⏱ X.Xs`(灰)与 + `⏱ 超时 Ns`(红)徽章 —— 收起状态也能看到; +- 实时(toolExecutionFinished)与恢复/历史(buildToolChip)两条路径同逻辑。 + +### 4. 工具结果:展开必显示 + 长结果尾部预览 + 展开按钮 + +- 修复旧 bug:`toolExecutionFinished` 原来只在 `chip.open` 时写结果, + 收起状态下执行完 → 事后展开为空;现在无条件写入; +- 结果 > 4000 字:默认只显示尾部 4000 字(前缀 `…`),正文上方出现 + 「⬆ 展开完整输出(共 N 字)」按钮,再点收起;`chip.__fullResult` 存全文; +- 信号链路扩容:`tool_execution_finished` 携带 `text[:20000]`(原 800); +- API 回灌限制:`build_api_context` 重建 tool 消息时截断 4000 字, + 防止长输出撑爆模型上下文。 + +--- + +## 流式正文不显示:深度调试与根因(2026-07) + +### 现象链 +旧版(逐 token 全量 innerHTML 同步重绘)正文可见但乱序 → 时间线重构后(缓冲+rAF 增量渲染)正文流式期不显示,结束后/切回后可见。 + +### 诊断数据(用户环境 stream_diag.log,前端 v2) +- `FRONTEND_VER 20260721-v2` ✓ 最新前端在跑 +- CHUNK/THINK 逐 token 到达 UI 线程,会话匹配 ✓ +- JS_DIAG 完成时刻环形缓冲 = 思考事件以 ~95/s 流入 → **JS 线程活着,token 在被处理** +- 结论:不是 JS 没跑,是**屏幕没有把 DOM 变化画出来** + +### 根因(本机复现) +AMD 核显 GPU 上下文周期性丢失: +- 带 `--enable-gpu-rasterization --ignore-gpu-blocklist`(旧默认)离屏实测: + 连续 `SharedImageStub: context already lost` 错误 → **页面 JS 处理/Qt 定时器全部停摆** +- 加 `--disable-gpu` 后同样代码 100% 正常(真实消息内容回放探针 b/d 双满) +- 用户屏幕上的部分停摆:DOM 已写入,但 GPU 光栅化产物无法合成上屏 → 正文不可见 + +### 修复 +1. **main.py 默认改为 `--disable-gpu`**(全 CPU 软渲染,彻底绕开 GPU 上下文丢失; + 旧 GPU 模式保留为 `HAOCODE_RENDER=gpu`) +2. 保留双保险渲染通道(同步节流渲染 + 200ms Qt 看门狗 forceRenderNow) +3. v3 探针:`probeStream()` 每 2s 写入 `PROBE` 日志(缓冲长度/DOM 长度/offsetHeight/opacity/display), + `dumpDiag` 改为按类型摘要 —— 若再异常可一次性定位断点 + +### 最终根因(2026-07-21 v7,推翻上述 GPU 主因结论) +人肉 debug(token 级日志 + 屏幕截图 + 逐层盒模型探针 + 页面内对照/克隆实验)锁定: + +**Chromium 布局失效 bug:空 `.md-segment` 先入文档 → 匹配 `:empty{display:none}` +→ 30ms 后写入内容 → 引擎未重新触发布局 → 盒永久 0x0(正文不可见)。** + +证据链: +1. token 日志:正文 `段buf` 与 `dom`(textContent)同步增长(71c 全在 DOM),但 `h=0` +2. 像素分析 `diag_shot_*.png`:完成时刻屏幕上也无正文(切会话才可见 = DB 重渲路径) +3. 逐层探针:seg 的祖先链全部存活(reply-content w=119/h=75),唯 seg 子树 w=0/h=0 +4. 对照实验:同容器新建的 `.md-segment`(带内容)h=24 正常;原始流式段 h=0 +5. 克隆实验:原节点的**完整克隆 h=24**;把原节点**重新 appendChild 一次即恢复 h=24** + —— 纯布局状态腐坏,与 CSS 规则无关 + +为什么切会话重渲正常:`renderTimelineHistory` 创建节点时**先填充 innerHTML 再插入**, +从不以空节点进文档,`:empty` 从未匹配。 + +### v7 修复(真正根因) +1. **appendToken / renderTimelineEntries(live)**:新正文段先 `mdStateOf + renderMarkdownStreaming` + 同步渲染、**带内容再 insertBefore**(永不空节点入文档) +2. `.md-stable/.md-tail`:`display:contents` → `block`(规避 contents 布局风险,加内层边距补偿) +3. 周期性流式截图改为 `HAOCODE_SHOT=1` 可选 —— 实测 `QWidget.grab()` 强制出帧会 + 阻塞渲染器主线程 1-2s,会干扰正文 token 处理(诊断干扰项) +4. 保留 `--disable-gpu` 默认(对离屏测试环境仍有必要)与双通道渲染 + 看门狗 +5. 新增 `tests/verify_onscreen.py`:**真实窗口真实布局**验证(offscreen 无布局, + 此类 bug 离屏测不出来;本 bug 即由此漏检 3 轮) +6. v6 起 JS 端带渲染器主线程心跳(dt>1.5s 告警)+ finish 后正文段体检日志 + diff --git a/Frame.md b/Frame.md new file mode 100644 index 0000000..d48e4a7 --- /dev/null +++ b/Frame.md @@ -0,0 +1,288 @@ +# Frame —— haocode 逐目录 / 逐文件说明 + +> 本文件是 `readme.md` 的下钻版:**每个文件夹、每个文件到底负责什么**, +> 以及关键的类 / 函数名(方便直接搜索定位)。 +> 阅读建议:先看 `readme.md` 的架构总览,再回来看这里的目录细节。 + +--- + +## 0. 一眼看清分层 + +| 层 | 目录 | 职责 | 能否单独跑 | +|---|---|---|---| +| 入口 | `main.py` | 环境准备 → QApplication → MainWindow | — | +| 表现层 | `ui/views/` | PyQt6 窗口、控件、事件编排 | 需 GUI | +| 渲染层 | `ui/web/` | HTML/JS/CSS(离线三库:marked / dompurify / KaTeX + highlight.js) | 浏览器可单独开 | +| 引擎层 | `core/llm_engine.py` | 把 agent 核心包成 Qt 线程,发信号给 UI | 需 PyQt6 | +| Agent 核心 | `core/agent/` | 与 pi 1:1 的循环 / 流式 / 重试 / 压缩 / 工具 | ✅ 纯 Python 可测 | +| 存储层 | `core/db_manager.py` | SQLite:会话树、消息、压缩标记、附件 | ✅ 纯 Python 可测 | +| 外部集成 | `core/webview2.py`、`vendor/webview2/` | WebView2 原生子窗口 + .NET SDK | 需 Windows | +| 资源 | `svg/`、`ui/web/katex|highlight`、`data/` | 图标 / 前端库 / 配置 | — | + +--- + +## 1. 根目录文件 + +| 文件 | 说明 | +|---|---| +| `main.py` (111 行) | **程序入口**。① 顶部先做 stdout/stderr UTF-8 保护(打包成 exe 后 GBK 环境遇 emoji 会崩,见 readme 第六节);② 设置 `QTWEBENGINE_CHROMIUM_FLAGS`(默认 `--disable-gpu` 全 CPU 软渲染,规避 AMD 核显 GPU 上下文丢失导致"DOM 变了但屏幕不刷新");③ `QApplication` + 字体的 DPI/pointSize 防御;④ `MainWindow()` + `show()` + `app.exec()`。 | +| `SYSTEM_PROMPT.md` (~3400 tokens) | **agent 系统提示词**。0 身份 / 1 运行环境(含 §1.1 cmd.exe 陷阱表)/ 2 可用工具 / 3 工具参数与执行语义(read、bash、write、edit 四条铁律、执行顺序与并发)/ 4 调用方式 / 5 失败与异常处理(错误串→动作对照表)/ 6 工作方式 / 7 安全红线 / 8 会话与上下文。**每次请求由 `load_system_prompt()` 重新读取,改完不用重启**;只在 `enable_tools=True`(worker 模式)时注入,且**不进历史、不参与压缩**。 | +| `requirements.txt` | 依赖清单(只列代码真实 import 的包,AST 扫描核对过)。 | +| `haocode.spec` | **PyInstaller 打包配置**(onedir)。关键点:把 `ui/web`、`svg`、`vendor/webview2`、`SYSTEM_PROMPT.md`、`data/config.json`、`WebView2Loader.dll` 收集进 `_internal/`(因为代码里普遍用 `dirname(__file__)` 上溯定位项目根,冻结后根 = `_internal`);**刻意不含** `data/chat_history.db` 与 `data/attachments/`;`console=False`;带 `runtime_hooks`。 | +| `pyi_rth_trace.py` | 打包**运行时钩子**:把冻结版 stdout/stderr 重定向到 exe 同级 `haocode.log`(GUI 版没有控制台,没有它启动异常会完全静默)。 | +| `WebView2Loader.dll` | WebView2 加载器,供"以工作目录为基准"的兜底加载路径使用(首选路径是 `vendor/webview2/webview2loader_x64.dll`)。 | +| `ARCHITECTURE.md` / `readme_our.md` / `黑边两现象分析报告.md` | **历史文档**(早期架构、早期设计稿、窗口缩放黑边问题分析)。其中提到的 `agents/`、`workspace/`、`ui/assets/`、`untitled.ui` 等目录/文件**已在交接版移除**,最新结构以 `readme.md` + 本文件为准。 | +| `_out.txt` / `_t0.txt` | 文本示例文件(按交接要求保留)。 | + +--- + +## 2. `core/` —— 后端核心 + +### 2.1 `core/db_manager.py` (715 行) —— SQLite 存储层 + +**表结构** + +```sql +sessions(id, title, created_at, updated_at, has_messages, sort_order, is_starred, + current_leaf_msg_id, mode) -- mode: 'chat' | 'worker' | NULL(未发过消息) +messages(id, session_id, role, content, reasoning, is_ignored, created_at, + attachment_metadata, parent_id, timeline, usage, + stop_reason, error_message) +``` + +- **会话是链表树**:`messages.parent_id` 指向上一条,`sessions.current_leaf_msg_id` 记录当前叶子。 + `get_message_chain()` 从叶子向上回溯再反转 → 得到"当前激活时间线"(绕开所有废弃分支)。 +- `role` 取值:`user` / `assistant` / `system` / **`compaction`**(压缩标记行,`content` 是摘要)。 +- `timeline`:assistant 行的**事件时间线 JSON**(`{"t":"think"|"text"|"tool", ...}`), + 工具条目形如 `{"t":"tool","id","name","args","ok","result"}`;`ok=None` 表示开始了但没拿到结果。 +- `usage`:本轮精确 token 用量(`{"input","output","cacheRead",...}`),供显示与压缩估算做**锚点**。 +- `stop_reason` / `error_message`:失败轮次标记(`'error'`),NULL = 正常行。 + +**关键方法** + +| 方法 | 作用 | +|---|---| +| `add_message(...)` | 插一条消息并把会话叶子前推(`stop_reason`/`error_message` 为可选新参数) | +| `get_message_chain(session_id)` | 取当前激活链(含环检测保护) | +| `get_branch_info(parent_id)` | 某父节点下的所有子分支(UI 的 `1/3` 分支切换) | +| `update_session_leaf(session_id, leaf)` | 手动改叶子(分支切换、错误回退用) | +| `insert_compaction_mark(session_id, summary, cut_before_id, first_retained_id, meta)` | 插压缩标记行 | +| `copy_session(...)` | 整会话深拷贝:消息 id 重映射、parent 重连、**附件物理复制改名**、标题 `(副本 N)` 递增 | +| `_upgrade_schema(cursor)` | 旧库自动补列。⚠️ **注意**:旧的 `upgraded=True` 分支会触发"链表化重构"(把树按时间拍平成线性链)→ 新增列**绝不能**置这个标志(源码里有警告注释) | +| 冻结态库路径(文件头) | `sys.frozen` 时优先 `exe/../../data/chat_history.db`(存在才共用),否则 `exe 同级/data/chat_history.db` | + +### 2.2 `core/llm_engine.py` (446 行) —— 引擎层(Qt 线程桥) + +| 名字 | 说明 | +|---|---| +| `load_system_prompt()` / `_load_config()` / `_provider_info()` | 读 `SYSTEM_PROMPT.md`、`data/config.json`(缺失返回兜底短提示词 / 空配置) | +| `AgentWorker(QThread)` | **worker 模式**:组装 `AgentConfig`(model / system_prompt / tools / retry=3 次 2s×2)→ `agent.set_stream_fn(openai_stream)` → `AgentRunner(agent, summarize_fn=..., 回调...)` → `runner.run(last_user)`。信号:`chunk_received` / `reasoning_received` / `tool_execution_started|updated|timed|finished` / `context_compacted` / `compaction_started` / `retry_scheduled` / `retry_finished` / `usage_updated` / `error_occurred` / `finished` | +| `_bridge(event)` | `AgentEvent` → Qt 信号(在工作线程内 emit,跨线程 queued 投递) | +| `_make_summarize_fn(model)` | 压缩用的**非流式** LLM 调用(`prompt_text, system_prompt, max_tokens → str`) | +| `ChatWorker(QThread)` | **chat 模式**:单次流式,无工具、无重试、无压缩(快速问答) | +| `TitleWorker(QThread)` | 会话自动命名 | +| `abort()` / `cancel()` | 中断:置 `AbortSignal` → agent 循环在 chunk 边界收尾为 `stop_reason="aborted"` | + +### 2.3 `core/webview2.py` (406 行) —— WebView2 集成 + +| 名字 | 说明 | +|---|---| +| `get_environment(app)` | 返回 WebView2 环境或 `None`(None → UI 侧回落 QtWebEngine)。**两道守卫**:① `_wv2_allowed_here()` 无头/测试环境直接不启用;② `acquire_instance_lock()` 抢不到单实例锁(已有实例在跑)就跳过,**并且跳过 `taskkill`**(否则会把正在运行的兄弟实例的浏览器进程杀掉 → 它的 controller 变 disposed → **DOM 正常但视觉层永久空白**,这就是历史 T0 事故) | +| `acquire_instance_lock()` | `msvcrt.locking` 锁 `data/app_instance.lock`(`HAOCODE_INSTANCE_LOCK_FILE` 可覆盖路径,供测试隔离);返回 True=唯一实例 / False=已有实例 / None=平台不支持 | +| `Wv2Session` | 一个 WebView2 实例:创建 controller、找子窗口 hwnd(`find_child`)、`set_bounds`/`set_visible`/`navigate`/`execute_js`/`close` | +| `_pump_wait(op, app, timeout)` | 等待异步 COM 操作时泵 Qt 事件(避免 UI 卡死) | +| 环境变量 | `HAOCODE_FORCE_QTWEBENGINE=1` 强制回落;`QT_QPA_PLATFORM=offscreen` 自动不启用 WebView2 | + +### 2.4 `core/debug_log.py` (78 行) —— 调试事件总线 + +`debug_log(msg, tag)` 写内存环形缓冲 + 落盘;`poll_debug_cmd()` 取调试窗口输入的命令; +`autostart_debug_window(cfg)` 按 `config.json: debug_window_autostart` 决定是否开调试窗口。 + +### 2.5 `core/agent/` —— pi 1:1 agent 核心(9 文件) + +| 文件 | 行数 | 关键名字 | 说明 | +|---|---|---|---| +| `types.py` | 331 | `AgentMessage` `ToolCall` `AgentConfig` `ModelConfig` `RetryConfig` `AgentEvent` `AbortSignal` `new_id` | 全部数据结构(dataclass)。`AgentMessage` 含 `content/reasoning/tool_calls/stop_reason/error_message/usage/timestamp` | +| `agent.py` | 204 | `Agent`(`subscribe`/`prompt`/`continue_`/`steer`/`follow_up`/`abort`/`set_stream_fn`) | agent 对象:状态机 + 事件订阅 + 输入队列(steering=轮中插话,followUp=队列尾续跑) | +| `loop.py` | 482 | `run_loop` `_stream_turn` `execute_tool_calls` `_execute_parallel` `_execute_sequential` `_should_terminate_batch` | **主循环**:注入 system prompt → 输出预算钳制 → 流式一轮 → 工具批(含 length 截断保护:参数可能残缺则一律不执行)→ 轮末钩子(`prepare_next_turn` / `should_stop_after_turn`)→ 停止判定 | +| `stream_fn.py` | 438 | `openai_stream` `to_openai_messages` `from_openai_messages` `classify_error` `_parse_tool_call` `_pick_reasoning` `_pick_usage` | OpenAI 兼容流式调用(180s 超时、SDK 层 `max_retries=0`——重试统一交给 recovery 层)+ 异常分类(rate_limit/timeout/connection/server_error/overload/auth/overflow)+ 工具调用增量拼装(JSON 解析失败兜底 `{}` + 保留 raw) | +| `recovery.py` | 519 | `AgentRunner`(`run` `pre_prompt_compaction` `compact_if_needed` `_handle_post_agent_run` `_prepare_retry` `_remove_last_bad_assistant` `_do_compaction`)、`is_context_overflow` `is_retryable_assistant_error` `is_recoverable_length` `compute_retry_delay_ms` `compact_diag_log` | **三路决策**:① 上下文溢出 → 压缩恢复(只试一次)② 可重试错误(429/5xx/超时/断连…且非配额耗尽)→ 移除坏消息 + 退避(2s→4s→8s,最多 3 次)③ 否则停。另含**轮中主动压缩** `compact_if_needed`(单条巨型工具输出不再依赖"失败一次"再兜底;同 run 连败 2 次即止损) | +| `compaction.py` | 637 | `compact_context` `should_compact` `CompactionSettings` `find_cut_point(s)` `serialize_conversation` `FileOperations` | 上下文压缩:按 pi harness 原版算法找**有效切点**(不切开工具调用对)→ 摘要化前半段 → 保留尾巴 → 产出切点 id(供 UI 落库成 `compaction` 标记行) | +| `context.py` | 341 | `estimate_context_tokens` `estimate_message_tokens` `calculate_context_tokens` `_find_last_usage` `clamp_max_tokens_to_context` `clamp_outputs_to_context` | token 计量与预算钳制:优先用**最近一次真实 usage 做锚点**,无锚点才按字符估算(含图片按比例计) | +| `tools.py` | 873 | `tool_read` `tool_bash` `tool_write` `tool_edit` `default_tools` `prepare_tool_call` `parse_text_tool_calls` | 四个工具的实现与参数校验。`tool_bash` 用「Popen + 读线程 + 队列」实现**实时输出**(`on_update`)、每秒读秒(`on_timer`)、超时 `taskkill /F /T` 杀进程树、50KB 截断;`tool_edit` 按「原文件快照定位 + 唯一匹配 + 非重叠 + 全有或全无」改文件 | + +--- + +## 3. `ui/` —— 表现层 + +### 3.1 `ui/views/main_window.py` (6019 行) —— 主窗口(全项目核心) + +单文件承载了绝大部分 UI 与编排逻辑,按区块读: + +| 区块(搜关键字) | 说明 | +|---|---| +| `MainWindow.__init__` | 组装:DBManager、左侧栏、聊天区、工具栏、输入区、右侧任务面板、调试窗口 autostart、全局热键 | +| `setup_ui()` | 三栏布局 `main_layout = [sidebar | chat_area | bash_panel]`;顶部工具栏(`历史` 按钮) | +| `setup_stylesheet()` | 全量 QSS(`#sidebar` / `#right_sidebar` / `#bl_*` / `#top_tool_btn` / 气泡…) | +| `get_svg_path()` / 侧边栏折叠动画 | `sidebarWidth` 属性 + `QPropertyAnimation`;窗口过窄时自动折叠 | +| 输入区与附件 | `_on_image_pasted` / `_on_files_dropped` / `_on_long_text_pasted` / `AttachmentPreviewOverlay`(独立顶层窗口,避免被 WebView 遮挡) | +| `send_message()` | ① 若本会话在生成 → 走**中断**分支;② 建 `_active_streams[session_id]` 流状态;③ 落库用户消息;④ 起 `AgentWorker`/`ChatWorker` 并接线全部信号 | +| `_active_streams` | 每会话流式状态:`msg_id / parent_id / previous_leaf_id / content / reasoning / timeline / tl_kind / usage / worker` | +| `on_chunk_received` / `on_reasoning_received` | 累积正文/思考 + 维护时间线(`t:text` / `t:think` 分段)+ 定时刷新上下文标签 | +| `_on_tool_started/updated/timed/finished` | 工具事件 → 时间线条目 + 前端 chip + 右侧任务面板转发 | +| `_on_context_compacted` | 压缩完成 → 同一气泡原地定格(摘要全文)→ **插 `compaction` 标记行入库** | +| `on_reply_finished` | 正常收尾:三维全空则不入库;否则落库 assistant 行(正文/思考/时间线/usage),叶子前推 | +| `on_error` → `_persist_failed_stream` | **失败轮次也入库**(对照 pi:`message_end` 无条件持久化)——本轮已完成的工具结果/正文/思考全部保留,尾部追加 `> ⚠️ [本轮中断] …`(并额外作为一条 timeline 文本条目,因为带 timeline 的行回放不读 content);完全空的一轮才 `is_ignored=1` 只留痕不回放 | +| `_persist_interrupted_stream` | 用户主动中断:有内容则入库,全空则回退叶子 | +| `build_api_context(session_id)` | **DB → API 上下文**:处理压缩标记(标记之前只发摘要)、附件转 base64(图片走视觉接口)、回放 assistant 的 timeline(重建 `tool_calls` + `tool` 结果,结果截断 4000 字)、跳过 `is_ignored` 与全空行、孤儿工具补合成结果、错误行照常回放 | +| `load_messages_to_web(session_id)` | 切会话:清空前端 → 按链渲染历史(含时间线回放)→ 刷新右侧面板 | +| 模式切换 | `mode_switch` 配置 + `chat`/`worker` 两种 worker;`sessions.mode` 锁定已发过消息的会话模式 | +| 右侧面板接线 | `bash_panel.set_session(...)` + 四个 tool 事件转发(仅当前会话) | +| 关闭清理 | `closeEvent`:中断所有 worker、持久化进行中的回复、清理后台任务 | + +### 3.2 `ui/views/bash_panel.py` (944 行) —— 右侧任务面板 + +| 名字 | 说明 | +|---|---| +| `BashPanel(QWidget)` | 外壳:宽 260 / 收起 52(`panelWidth` 属性 + 260ms InOutCubic 动画);**开关按钮在栏内**(收起态=栏正中 34×34;展开态=标题行右上角 28×28,两按钮分居 QStackedWidget 两页,任何时刻只有一个可见) | +| `_ResizeHandle` | 左边缘 4px 拖拽调宽(最小 200px),松手把宽度写入 `config.json: bash_panel_width`,下次展开自动恢复 | +| `_Section` | 一栏 = 头部行(24px **硬固定**)+ `body`(滚动区 + 提示语);折叠只收 `body` 的高度 | +| `_layout_targets()` | 两栏折叠/展开的统一布局策略:**层从顶部堆叠,余量只由"展开着的已完成"吸收;已完成收起时余量进 `spacer` 空白占位**(避免头部被顶到面板底部) | +| `BashLayer` | 一层 = 一次 bash 执行:头部(状态点/名称/耗时/状态标签/命令预览/箭头)+ 展开后「参数」「输出」两块;运行中实时输出(200KB 上限,超出标注)、完成后显示**进入上下文的原文**、压缩切点之前的层标「已出上下文」 | +| 常量 | `PANEL_W_DEFAULT/MIN/MAX`、`FOLD_MS=200`、`FOLD_STEP=16`、`LAYER_LIMIT=30`、`LIVE_BUF_CAP=200KB`、`_SPLIT_ORIENTATION`(Vertical,改 Horizontal 即左右并排) | + +### 3.3 `ui/views/` 其余文件 + +| 文件 | 行数 | 说明 | +|---|---|---| +| `chat_bridge.py` | 188 | `ChatBridge(QObject)`:**Python → JS 单向桥**(QWebChannel)。每个方法 = 一个前端函数:`create_message` / `append_token` / `append_reasoning` / `finish_message` / `tool_execution_started|updated|timed|finished` / `restore_streaming_timeline` / `render_timeline_history` / `show_note` / `show_error` / `compaction_started` / `compaction_finished`。用 `json.dumps` 转义全部文本,杜绝注入 | +| `wv2_view.py` | 217 | `WebView2View(QWidget)`:把 WebView2 原生子窗口包成"看起来像 QWebEngineView"的控件——提供 `page()`(`_PageShim.runJavaScript`)、`setUrl`、`grab`、`attach_bridge`、`sync_bounds`(父窗口移动/缩放时同步原生子窗口位置),从而让上层渲染代码**两条渲染路径共用一套调用** | +| `custom_web_page.py` | 65 | `CustomWebPage(QWebEnginePage)`:QtWebEngine 回落路径,`acceptNavigationRequest` 限制只允许本地 file:// | +| `debug_window.py` | 214 | `DebugWindow(QWidget)`:两个页签「对话消息 / 应用日志」+ 命令输入框;`_TailReader` 增量读日志文件 | + +### 3.4 `ui/views/system_tools/` + +| 文件 | 说明 | +|---|---| +| `file_reader.py` | `read_text_file(path, max_bytes)`:文本/代码文件读取;带**二进制黑名单**(Word/Excel/PPT/压缩包/可执行/媒体),PDF 不在黑名单里(交给 `tools/builtin_tools/pdf_reader.py`) | +| `global_hotkey.py` | `GlobalHotkeyThread(QThread)`:`RegisterHotKey` 注册全局热键(默认 Ctrl+Shift+S 截屏),失败只打印不影响主流程 | +| `screen_capture.py` | `ScreenCaptureOverlay(QWidget)`:全屏遮罩框选区域 → 截屏 → 转成图片附件(`screenshot_captured` 信号) | + +### 3.5 `ui/web/` —— 本地渲染层(完全离线) + +| 文件 | 行数 | 说明 | +|---|---|---| +| `index.html` | 82 | 页面骨架 + 引入本地 `marked` / `dompurify` / `highlight` / `katex`(无任何 CDN) | +| `app.js` | 2111 | **前端全部逻辑**:`createMessage` / `appendToken`(稳定前缀增量渲染 + rAF 批量)/ `updateMessage` / `finishMessage` / 时间线渲染(思考块、工具 chip、压缩气泡)/ `marked.parse` 统一拦截点(先抽公式占位符再渲染,最后 KaTeX 回填)/ 自动滚动与"贴底"判定 / 分支切换 `1/3` | +| `style.css` | 902 | 全部样式:气泡(assistant 85% 宽、透明正文)、思考块、工具 chip、紧凑模式、公式块、错误提示条 | +| `marked.min.js` / `dompurify.min.js` | — | Markdown 渲染 + HTML 消毒 | +| `highlight/` | — | highlight.js + atom-one-dark 主题 | +| `katex/` | — | KaTeX 0.16.11(js + css + woff2 字体) | + +--- + +## 4. `tools/` + +| 文件 | 说明 | +|---|---| +| `builtin_tools/pdf_reader.py` | **PDF 专用解析**(`extract_pdf_text` / `extract_pdf_images`),基于 PyMuPDF。被 `ui/views/main_window.py` 直接 import(文本模式抽文字、图片模式抽内嵌图片为 PNG 再送视觉接口),并有专门的 `PDFExtractWorker` 线程避免大文件卡 UI | +| `__init__.py` / `builtin_tools/__init__.py` | 包结构标记(**必须保留**,主窗口按 `tools.builtin_tools.pdf_reader` 路径 import) | + +> 交接版已删除该目录下**全空且零引用**的 `registry.py` / `conda_env.py` / `file_ops.py` / `web_search.py`。 + +--- + +## 5. `svg/` —— 图标(18 个) + +`panel.svg`(左侧栏开关)/ `panel_right.svg`(右侧任务面板开关)/ `chevron_down|right.svg`(弹窗箭头)/ +`mode_chat.svg` / `mode_worker.svg`(模式)/ `model.svg` / `provider*.svg`(模型弹窗)/ `send*.svg` / `stop*.svg` / +`upload.svg` / `cross.svg` / `check.svg` / `main.svg`。全部经 `MainWindow.get_svg_path()` 按项目根解析。 + +--- + +## 6. `data/` —— 运行时数据 + +| 文件 | 说明 | +|---|---| +| `config.json` | 供应商/模型/开关(**交接版已清空 api_key**)。关键键:`providers`、`default_provider/model`、`temperature`、`debug_window_autostart`、`mode_switch`、`webview_backend`,运行中还会被写入 `bash_panel_width`(面板宽度记忆) | +| `chat_history.db` | 聊天主库(**交接版不含**,首次运行自动创建空库 + 初始对话) | +| `attachments/` | 附件目录(图片/PDF,**交接版不含**;运行时按 `<项目根>/data/attachments/` 存放) | + +--- + +## 7. `vendor/webview2/` + +WebView2 的 .NET SDK(随仓库提供,不走 pip): +`net462_Microsoft.Web.WebView2.Core.dll`(`clr.AddReference` 加载)、`webview2loader_x64.dll`(loader)、`sdk.nupkg`(原始包)。 + +--- + +## 8. `tests/` —— 测试与调试工具 + +### 8.1 正式测试套件(交接后应保持全绿) + +| 文件 | 内容 | +|---|---| +| `run_tests.py` | **离线 harness**(自带用例收集 + pytest stub),跑 `test_agent_core.py` | +| `test_agent_core.py` | agent 核心:流式增量、工具批、重试、压缩、读秒、超时杀树 | +| `test_tool_params.py` | 四个工具的参数校验与错误串(35 项) | +| `test_compaction_persist.py` | 压缩标记入库 + 上下文截断行为 | +| `test_copy_session.py` | 会话复制(消息/分支/附件深拷贝/标题递增/叶子)(54 项) | +| `test_bash_stream.py` | bash 实时输出、每秒读秒、超时杀进程树、50KB 截断、非零退出 | +| `test_error_persist.py` | **失败轮次入库 + 回放取舍**(T1–T9,含旧库迁移不得破坏分支的安全用例) | +| `test_wv2_guard.py` | WebView2 双守卫(无头环境 / 跨进程单实例锁) | +| `test_debug_window.py` | 调试窗口事件与日志 | +| `test_think_code_neutral.py` | 思考块/代码块内容中性化 | +| `test_file_attach.py` / `test_pdf_reader.py` | 附件类型判定 / PDF 文本与图片解析 | +| `test_math_extract.js` | 前端公式提取逻辑(Node 运行,39 项) | +| `smoke_offscreen.py` | 主窗口离屏冒烟(8 项) | +| `smoke_mode.py` | chat ↔ worker 模式切换(16 项) | +| `smoke_copy_session.py` | 复制会话 UI 全链路 | +| `smoke_bash_panel.py` | 右侧任务面板全链路(含折叠动画/布局策略/拖拽调宽,116 项) | +| `check_db_migration.py` | 只读工具:校验库迁移后旧数据 100% 原样(消息数/父指针/叶子/分支点逐项比对) | + +### 8.2 真机 / 真 API 工具(按需使用,不属于回归) + +`smoke_live_guard.py`、`smoke_midswitch.py`、`smoke_persist.py`、`smoke_probe.py`、`smoke_repro_real.py`、 +`smoke_timeline.py`、`smoke_manual.py`、`diag_live_agent.py`、`diag_live_onscreen.py`、`diag_live_text.py`、 +`verify_onscreen.py`、`verify_math_render.py`、`inject_math_demo.py`、`debug_inject.py`、 +`tune_mode_popup.py`、`tune_model_popup.py`(两个弹窗调参工具)。 + +### 8.3 写测试的两条铁律 + +1. 不得污染真实库:测试开始时把 `core.db_manager._DEFAULT_DB` 指向临时文件(**必须在 import MainWindow 之前**) +2. 不得污染真实配置:把 `HAOCODE_CONFIG_FILE` 指向临时文件(会写 `config.json` 的功能) + +> 交接版已清除 81 个开发期临时物(`_tmp*` 脚本 / `_tmp_resize_vis/` 截图 / `_tmp_*.log`)。 + +--- + +## 9. 一次提问的完整生命周期(把上面所有文件串起来) + +``` +① 用户输入(ui/views/main_window.py: send_message) + └─ 落库 user 行(core/db_manager.add_message)→ 建 _active_streams[sid] 流状态 + +② 组装上下文(main_window.build_api_context) + └─ 取当前激活链 → 压缩标记截断 → 附件转 base64 → timeline 回放成 tool_calls/tool 消息 + +③ 起引擎(core/llm_engine.AgentWorker.run) + └─ AgentConfig(model, system_prompt=SYSTEM_PROMPT.md, tools=default_tools(), retry=3×2s) + + AgentRunner(summarize_fn=..., on_retry_* / on_compaction_* 回调) + +④ agent 核心(core/agent/loop.run_loop) + ├─ 轮首/轮中压缩检查(recovery.compact_if_needed → compaction.compact_context) + ├─ 流式一轮(stream_fn.openai_stream:text/reasoning/toolcall 增量 + usage + stop_reason) + ├─ 出错 → recovery._handle_post_agent_run:溢出→压缩重试 / 可重试→退避重试 / 否则停 + └─ 有 tool_calls → execute_tool_calls(tools.py 的四个工具,并行/串行按批次规则) + +⑤ 事件回流 UI(llm_engine._bridge → Qt 信号 → main_window 的 on_* 处理器) + └─ chat_bridge 调前端 app.js:增量渲染 / 时间线 chip / 思考块 / 读秒 / 压缩气泡 + └─ 同时转发给 bash_panel(右侧任务面板实时更新) + +⑥ 收尾落库(main_window.on_reply_finished 或 on_error→_persist_failed_stream) + └─ assistant 行 = 正文 + 思考 + timeline(工具) + usage(+stop_reason),叶子前推 + └─ 压缩发生 → 另插 role='compaction' 标记行 + +⑦ 下一次提问回到 ②,此时模型能看到上一轮的正文、工具调用与结果(失败轮次亦然) +``` diff --git a/SYSTEM_PROMPT.md b/SYSTEM_PROMPT.md new file mode 100644 index 0000000..7bdba14 --- /dev/null +++ b/SYSTEM_PROMPT.md @@ -0,0 +1,157 @@ +# haocode Agent 系统提示词 + +## 0. 身份 + +你是 **haocode**(worker 模式)的本地智能体,运行在用户本机的 PyQt6 桌面应用内, +通过内嵌浏览器界面与用户对话。你具备代码理解与修改能力,并能调用工具直接操作 +本机文件与 shell。你的目标是把用户交代的任务**真正做完**(改文件、跑命令、验证结果), +而不是只给出建议或描述该怎么做。 + +- 回答语言:**简体中文**;代码、命令、路径、标识符保持原文。 +- 你在一个多轮循环里工作:可以连续调用工具、观察结果、再决定下一步, + 直到任务完成或确实需要用户决策为止。 + +## 1. 运行环境 + +- 当前工作目录:**haocode 项目根目录**。所有相对路径都相对它解析; + 每条 bash 命令都以它作为工作目录启动。 +- Python:直接用 `python`(3.10 环境,PyQt6、openai 已装)。 +- 前端是本地网页(`ui/web/`),改动前端文件后需重启应用才生效。 + +{{SHELL_PLATFORM_SECTION}} + +## 2. 可用工具 + +| 工具 | 用途 | 关键约束 | +|---|---|---| +| `read` | 读取**文本**文件(带行号) | 单次 ≤2000 行 / 50KB;大文件用 `offset`/`limit` 分页;**不要用于图片或二进制** | +| `bash` | 执行 shell 命令 | 默认 120 秒超时(上限 600);输出 50KB 截断;**同批有它则整批串行** | +| `write` | 新建或**完整覆盖**文件 | 自动创建父目录;原子写入;只用于新建或整体重写 | +| `edit` | 精确文本替换 | `oldText` 必须与**原文件**逐字符一致且唯一;各条区间不得重叠;**整批全有或全无** | + +看文件优先用 `read`(不要用 `cat`);探查目录、搜索内容用 `bash`(`ls`、`grep`)。 + +## 3. 工具参数与执行语义 + +### 3.1 read + +| 参数 | 类型 | 必填 | 默认 | 说明 | +|---|---|---|---|---| +| `path` | string | ✅ | — | 文件路径(相对路径基于项目根) | +| `offset` | integer | | 1 | 起始行号,**从 1 开始** | +| `limit` | integer | | 2000 | 最多读取行数,**上限 2000**(传更大按 2000) | + +输出格式:每行 `%6d\t原文`,即「6 位右对齐行号 + TAB + 原始内容」,末尾附 +`[已显示 a–b 行,共 N 行](还有 M 行未显示,用 offset=X 继续)`。 + +- 只读文本(UTF-8,非法字节被替换为 �)。**读图片或二进制只会得到乱码,不会报错**。 +- 文件可能超过 2000 行时:先用小 `limit` 看结构,再用 `offset` 分页读到目标位置。 +- ⚠️ **把读到的内容用作 `edit` 的 `oldText` 时,必须去掉行号与 TAB 前缀**,只保留文件原文。 + +### 3.2 bash + +| 参数 | 类型 | 必填 | 默认 | 说明 | +|---|---|---|---|---| +| `command` | string | ✅ | — | 要执行的命令(平台 shell 语法见第 1.1 节) | +| `timeout` | number | | 120 | 超时秒数,**上限 600**(传更大按 600) | + +- 返回值:`$ 命令` + stdout + `[stderr]` + `[exit N] (耗时)`;**退出码非 0 时结果视为失败**。 +- 超时:到期会**杀掉整棵进程树**并返回 `命令超时(>Ns)已终止`。 + 长任务(全量测试、构建、下载)请显式传 `timeout`;短查询不必传。 +- 输出超过 50KB 会被截断 → 用 `-n` / `head` 或更精确的命令收窄输出后再逐步放宽。 +- 需要等待的场景直接跑命令并设好 `timeout`,不要用反复 `sleep` 试探。 + +### 3.3 write + +| 参数 | 类型 | 必填 | 说明 | +|---|---|---|---| +| `path` | string | ✅ | 目标文件路径;父目录自动创建 | +| `content` | string | ✅ | 完整文件内容(覆盖写,**不是追加**) | + +- 只用于**新建文件**或**整体重写**;局部改动一律用 `edit`(避免丢掉未读到的内容)。 +- 写入是原子的(临时文件 + 替换),不会留下半截文件。 +- 覆盖已存在文件前,先确认你确实要丢弃它原有的其余内容。 + +### 3.4 edit + +| 参数 | 类型 | 必填 | 说明 | +|---|---|---|---| +| `path` | string | ✅ | 目标文件路径 | +| `edits` | array | ✅ | 替换列表,每项 `{oldText, newText}`;`oldText` 必填,`newText` 省略视为删除 | + +四条铁律: + +1. `oldText` 必须与文件原文**逐字符完全一致**(含空格、缩进、换行),且在**原文件**中**唯一**。 +2. 每条 edit 都对照**原始文件**定位,**不是**「上一条改完之后」的结果 → **不要**写重叠或嵌套的 + edit;同一处或相邻的多处改动请**合并进同一条** edit。 +3. `oldText` 尽量**短但保证唯一**;**不要**用一大段未改动的内容去「连接」两处相距很远的改动。 +4. 一次调用传入全部 edit(`edits[]`),**不要**为同一个文件连续发多次 `edit`。 + +- 整批是**全有或全无**:任何一条未命中、不唯一或区间重叠 → 文件一个字节都不会被修改。 +- 删除文本就把 `newText` 写成 `""`;要改多个文件就分多次调用(不同 `path`)。 + +### 3.5 执行顺序与并发 + +- 同一批里只要有一个 `bash`,**整批串行**执行(bash 是 sequential 工具)。 +- `read` / `write` / `edit` 会**并发**执行 → **同一批次内不要对同一个文件发多个 `edit`/`write`** + (先后顺序不保证)。 +- 无依赖的多个动作尽量放在同一批连续调用(减少往返);有依赖关系时再分轮次。 + +## 4. 工具调用方式 + +- 通过 **function calling**(请求里的 `tools` 参数)调用工具。**只有 function call 会被执行。** +- **严禁**在正文里写 `...`、`...` 之类的伪工具调用—— + 那些只是文本,`write`/`edit` 绝不会被执行。 +- 参数必须是**正确的 JSON 类型**:`offset`/`limit`/`timeout` 传数字(不要传 `"10"`); + `edits` 传数组(不要传 JSON 字符串);不要给用不到的参数传 `null`。 +- 一次需要多个动作就连续发多次 function call,**全部完成后再**统一总结。 + +## 5. 工具失败与异常处理 + +| 工具返回 | 含义与你的动作 | +|---|---| +| `文件不存在: <绝对路径>` | 路径写错了。用 `bash` 的 `ls` 确认真实路径,**不要猜** | +| `path 不能为空` / `command 不能为空` | 参数缺失,补齐后重试 | +| `[起始行 offset=N 超出文件范围,该文件共 M 行]` | 用 M 以内的 offset 重读 | +| `[文件为空(0 行)]` | 文件确实为空 → 用 `write` | +| `命令超时(>Ns)已终止` | 收窄命令范围,或显式传更大的 `timeout`(≤600)后重试 | +| `参数校验失败: …;收到的参数: …` | 按提示修正类型/必填项(注意别传数字字符串) | +| `第 i 条 edit 匹配到 N 处(要求唯一)` | 加长 `oldText` 上下文使其唯一 | +| `第 i 条 edit 未找到匹配文本` | 先 `read` 确认原文;检查是否把行号+TAB 前缀带进了 `oldText` | +| `edits[i] 与 edits[j] 区域重叠` | 合并成一条 edit,或改成互不相交的改动 | +| `工具调用 X 未执行(length):…` | 上一轮回复被输出长度截断 → 缩短回答或拆分步骤重试 | +| `操作已中止 (Operation aborted)` | 用户主动中止 → 停止动作,简要说明当前进度 | + +连续两次同样的失败就**停下来向用户说明卡点**,不要用相似命令反复硬试。 + +## 6. 工作方式 + +1. **先看清再动手**:改代码前先 `read` / `bash` 确认现状;不凭空猜路径、函数名、行号。 +2. **小步快跑**:一次做一个明确改动;改完立刻用 `bash` 验证(编译、测试、脚本)。 +3. **验证要真实**:说「已完成」之前必须有工具输出作证据(命令结果 / 测试结果)。 +4. **推荐流程**:定位(`grep` / `ls`)→ 精读(`read`)→ 改动(`edit` / `write`)→ 验证(`bash`)。 +5. **范围克制**:只做用户要求的事;不顺手重构、不批量格式化、不改无关文件。 +6. **不谎报**:没跑过的命令不说「已运行」;没读到的内容不说「文件里是…」;失败就照实说失败。 +7. **输出克制**:结论先行、简洁;长内容用列表/表格;不复述用户原话;涉及文件时写清路径。 +8. **连续行动**:一个任务需要多步就直接连续调用工具,中间不必停下来征求同意。 +9. **该停就停**:遇到破坏性操作、路径歧义、多种方案取舍等需要用户决策的情况,先问再做。 + +## 7. 安全红线(必须遵守) + +- **禁止**删除或覆盖项目外的文件;**禁止** `rm -rf`、`del /s`、格式化等破坏性命令 + (除非用户在本轮明确要求并给出路径)。 +- **禁止**读取或输出 `data/config.json` 中的 API 密钥等敏感内容 + (可以确认文件存在,但不要展示内容)。 +- **禁止**在当前 Python 环境安装或卸载包;**禁止**修改系统目录、注册表、环境变量。 +- 网络请求只允许用户已配置的 API 端点;不要主动上传数据或抓取外部内容。 +- 涉及用户数据(`data/*.db`)默认只读;除用户明确要求,不要写入或迁移数据。 + +## 8. 会话与上下文 + +- **上下文可能被自动压缩**:压缩后你看到的是摘要加最近若干轮。以摘要为准继续, + 不要假装记得已被压缩掉的细节;需要时重新用工具查证。 +- **输出可能被截断**:若收到「未执行(length)」类提示,说明上一轮输出触达长度上限, + 请缩短回答或把任务拆成更小的步骤。 +- **工具调用与结果会留在历史里**:不要重复已经做过的探查,也不要凭「上一轮我大概做过什么」 + 下结论而不看返回结果。 +- 用户可能随时中止(`操作已中止`):如实说明当前进度,不要继续动作。 diff --git a/WebView2Loader.dll b/WebView2Loader.dll new file mode 100644 index 0000000000000000000000000000000000000000..965aed4e5e448a9920a53fdae3d774df4a8f8e44 GIT binary patch literal 163680 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 z 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 literal 0 HcmV?d00001 diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/agent/__init__.py b/core/agent/__init__.py new file mode 100644 index 0000000..ed8d8d0 --- /dev/null +++ b/core/agent/__init__.py @@ -0,0 +1,58 @@ +""" +core/agent —— pi agent 核心框架的 Python 1:1 重构 +================================================== +模块对照(pi-main → 本包): + packages/agent/src/types.ts → types.py 数据模型(消息/事件/工具/配置) + packages/agent/src/agent-loop.ts → loop.py 核心循环(runLoop 1:1) + packages/agent/src/agent.ts → agent.py Agent 状态机(prompt/steer/followUp/abort) + packages/ai/src/api/*.ts → stream_fn.py OpenAI 兼容流式(vLLM)+ 输出预算钳制 + packages/ai/src/api/simple-options→ context.py token 估算 + clampMaxTokensToContext + packages/agent/src/compaction.ts → compaction.py 上下文压缩(切分/摘要/替换) + agent-session.ts 后置恢复逻辑 → recovery.py 重试退避 + 溢出/截断压缩恢复 + packages/agent/src/tools/*.ts → tools.py 工具管线 + 内置 read/bash/write/edit + +使用示例(最小闭环): + from core.agent import Agent, AgentConfig, ModelConfig + from core.agent.stream_fn import openai_stream + from core.agent.recovery import AgentRunner + from core.agent.tools import default_tools + + cfg = AgentConfig(model=ModelConfig(...), tools=default_tools()) + agent = Agent(cfg) + agent.set_stream_fn(openai_stream) + runner = AgentRunner(agent) + result = runner.run("你好") +""" +from .types import (AgentConfig, AgentError, AgentEvent, AgentMessage, + AgentState, AgentTool, AgentToolResult, AbortSignal, + AssistantMessageEvent, ModelConfig, RetryConfig, RunResult, + ToolCall, new_id) +from .agent import Agent +from .context import (CONTEXT_SAFETY_TOKENS, calculate_context_tokens, + clamp_max_tokens_to_context, + estimate_context_tokens, estimate_message_tokens, + should_compact) +from .compaction import (CompactionSettings, + DEFAULT_COMPACTION_SETTINGS, compact_context, + find_cut_point, prepare_compaction) +from .recovery import (AgentRunner, compute_retry_delay_ms, find_last_assistant, + is_context_overflow, is_recoverable_length, + is_retryable_assistant_error) +from .stream_fn import (classify_error, from_openai_messages, openai_stream, + to_openai_messages) +from .tools import default_tools + +# 🆕 版本记录:核心框架为 pi (badlogic/pi-mono) 0.81.x 时代的 Python 移植, +# 2026-09 对齐 pi 0.85.1 的估算/锚定/钳制/重试语义(P0/P1/P2/M1/M2/M3)。 +__version__ = "1.0.0 (pi 0.81.x port, aligned 0.85.1 semantics)" +__all__ = [ + "Agent", "AgentConfig", "AgentError", "AgentEvent", "AgentMessage", + "AgentRunner", "AgentState", "AgentTool", "AgentToolResult", + "AbortSignal", "AssistantMessageEvent", "CONTEXT_SAFETY_TOKENS", + "ModelConfig", "RetryConfig", "RunResult", "ToolCall", + "clamp_max_tokens_to_context", "calculate_context_tokens", "classify_error", "compact_context", + "compute_retry_delay_ms", "default_tools", "estimate_context_tokens", + "find_last_assistant", "find_cut_point", "is_context_overflow", + "is_recoverable_length", "is_retryable_assistant_error", "new_id", + "openai_stream", "should_compact", "to_openai_messages", +] diff --git a/core/agent/agent.py b/core/agent/agent.py new file mode 100644 index 0000000..e4760d2 --- /dev/null +++ b/core/agent/agent.py @@ -0,0 +1,204 @@ +""" +core/agent/agent.py +=================== +🌟 pi Agent 状态机的 Python 1:1 移植 + +对照 pi-main 源码:packages/agent/src/agent.ts (592 行) + class Agent { + state: AgentState # messages / isStreaming / error + config: AgentConfig + private listeners: Set + subscribe(cb) => unsubscribe # 事件订阅(TUI/Qt 都靠它) + prompt(message | text) => Promise # 追加 user 消息并跑一轮 run-to-settle + continue() => Promise # 从当前上下文继续(不能以 assistant 结尾) + steer(text) # 中途注入(turn 边界消费) + followUp(text) # 停止后注入(agent 停止时消费 → 续跑) + abort() # 中止当前 run(下一边界生效) + } + +关键语义(与 pi 完全一致): + 1. steering 在「循环开始前」和「每个 turn 结束后」被消费 + (one-at-a-time 每次取 1 条;"all" 一次取光) + 2. followUp 只在「run 即将结束」时被外层循环消费 → 触发续跑 + 3. abort 不抛异常:信号置位 → 当前流/工具在下一检查点收尾 → + 助手消息 stop_reason="aborted" → agent_end + 4. 同一个 Agent 实例可反复 prompt(state.messages 持续累积 = 会话记忆) +""" +from __future__ import annotations + +import threading +from typing import Any, Callable, List, Optional, Union + +from .loop import run_loop +from .types import (AgentConfig, AgentError, AgentEvent, AgentMessage, + AgentState, AbortSignal, RunResult, new_id) + + +class Agent: + def __init__(self, config: AgentConfig): + self.config = config + self.state = AgentState() + self._listeners: List[Callable[[AgentEvent], None]] = [] + self._steering_queue: List[AgentMessage] = [] + self._follow_up_queue: List[AgentMessage] = [] + self._lock = threading.Lock() + self._active_signal: Optional[AbortSignal] = None + + # ------------------------------------------------------------------ + # 事件订阅 —— 对照 agent.ts subscribe() + # ------------------------------------------------------------------ + def subscribe(self, cb: Callable[[AgentEvent], None]) -> Callable[[], None]: + self._listeners.append(cb) + + def unsubscribe(): + try: + self._listeners.remove(cb) + except ValueError: + pass + + return unsubscribe + + def _emit(self, event: AgentEvent): + for cb in list(self._listeners): + try: + cb(event) + except Exception: + # 监听器异常不打断循环(pi 同款宽容策略) + pass + + # ------------------------------------------------------------------ + # 队列操作 —— 对照 agent.ts 的 getSteeringMessages / getFollowUpMessages + # ------------------------------------------------------------------ + def _take_steering(self) -> List[AgentMessage]: + mode = self.config.steering_mode + with self._lock: + if not self._steering_queue: + return [] + if mode == "all": + out = self._steering_queue[:] + self._steering_queue.clear() + else: # one-at-a-time(pi 默认) + out = [self._steering_queue.pop(0)] + return out + + def _take_follow_ups(self) -> List[AgentMessage]: + mode = self.config.follow_up_mode + with self._lock: + if not self._follow_up_queue: + return [] + if mode == "all": + out = self._follow_up_queue[:] + self._follow_up_queue.clear() + else: + out = [self._follow_up_queue.pop(0)] + return out + + def has_queued(self) -> bool: + with self._lock: + return bool(self._steering_queue or self._follow_up_queue) + + # ------------------------------------------------------------------ + # 用户入口 —— 对照 agent.ts prompt / steer / followUp / abort + # ------------------------------------------------------------------ + def prompt(self, message: Union[str, AgentMessage]) -> RunResult: + """追加一条 user 消息并运行到 settle(同步阻塞,跑在调用线程上)""" + if self.state.is_streaming: + raise AgentError(message="Agent 正在运行中,不能并发 prompt(请先 abort)", + kind="unknown") + if isinstance(message, str): + message = AgentMessage(role="user", content=message) + if message.role != "user": + raise AgentError(message="prompt 只接受 user 消息", kind="unknown") + self.state.messages.append(message) + return self._run(new_message=message) + + def continue_(self) -> RunResult: + """ + 对照 agent.ts continue() / runAgentLoopContinue 前置检查: + - 上下文不能为空 + - 不能以 assistant 消息结尾 + """ + if self.state.is_streaming: + raise AgentError(message="Agent 正在运行中", kind="unknown") + if not self.state.messages: + raise AgentError(message="上下文为空,无法 continue", kind="unknown") + if self.state.messages[-1].role == "assistant": + raise AgentError( + message="不能以 assistant 消息结尾来 continue(应先注入 user/toolResult)", + kind="unknown") + return self._run(new_message=None) + + def steer(self, text: str): + """中途注入:在当前 run 的 turn 边界被消费(pi steering)""" + with self._lock: + self._steering_queue.append(AgentMessage(role="user", content=text)) + + def follow_up(self, text: str): + """停止后注入:run 即将结束时被外层循环消费 → 自动续跑(pi followUp)""" + with self._lock: + self._follow_up_queue.append(AgentMessage(role="user", content=text)) + + def abort(self): + """ + 中止当前 run。 + 对照 pi: 置位 AbortSignal;当前流在 chunk 边界关闭, + 工具在检查点返回 "Operation aborted",助手消息以 "aborted" 收尾。 + """ + sig = self._active_signal + if sig is not None: + sig.abort("aborted") + with self._lock: + # 与 pi 一致:未消费的队列消息保留,下次 run 生效 + pass + + # ------------------------------------------------------------------ + # 内部:一次 run(同步) + # ------------------------------------------------------------------ + def _run(self, new_message: Optional[AgentMessage]) -> RunResult: + signal = AbortSignal() + self._active_signal = signal + self.state.is_streaming = True + self.state.error = None + try: + result = run_loop(self, new_message, signal, self._make_stream_fn()) + except AgentError: + raise + except Exception as e: + self.state.error = AgentError(message=f"循环异常: {e}", kind="unknown") + self._emit(AgentEvent(type="agent_end", stop_reason="error", + error=self.state.error)) + result = RunResult(stop_reason="error", error=self.state.error) + finally: + self.state.is_streaming = False + self.state.streaming_message = None + self.state.streaming_delta = {} + self._active_signal = None + return result + + def _finish_run(self, new_messages: List[AgentMessage], stop_reason: str, + error: Optional[AgentError]): + """循环收尾回调(loop 层调用)""" + if error is not None: + self.state.error = error + # 本轮新消息已在循环中逐条 append 进 state.messages;此处仅记录收尾 + self._last_run = (new_messages, stop_reason) + + # ------------------------------------------------------------------ + # 流函数(由 AgentWorker 注入具体 provider 实现;默认报错) + # ------------------------------------------------------------------ + def set_stream_fn(self, stream_fn: Callable): + """ + stream_fn(context, model, signal, max_tokens, tools=None) -> Iterator[(kind, payload)] + 对照 pi 的 streamFn 注入点(agentLoopConfig.streamFn)。 + tools 参数 = 本轮可用的 AgentTool 列表,需序列化进 provider 请求。 + """ + self._stream_fn = stream_fn + + def _make_stream_fn(self) -> Callable: + fn = getattr(self, "_stream_fn", None) + if fn is None: + def _missing(context, model, signal, max_tokens, tools=None): + raise AgentError(message="未配置 stream_fn", kind="unknown") + yield # pragma: no cover + return _missing + return fn diff --git a/core/agent/compaction.py b/core/agent/compaction.py new file mode 100644 index 0000000..01cd9bb --- /dev/null +++ b/core/agent/compaction.py @@ -0,0 +1,641 @@ +""" +core/agent/compaction.py +======================== +🌟 pi 上下文压缩算法的 Python 1:1 移植(harness 原版算法) + +对照 pi-main 源码(逐函数对应): + packages/agent/src/harness/compaction/compaction.ts + DEFAULT_COMPACTION_SETTINGS -> CompactionSettings / DEFAULT_COMPACTION_SETTINGS + shouldCompact -> 见 context.py: should_compact(同一公式) + estimateTokens / estimateContextTokens -> context.py(usage 锚定,CJK 感知见说明) + findValidCutPoints / findCutPoint -> find_valid_cut_points / find_cut_point + findTurnStartIndex -> find_turn_start + prepareCompaction -> prepare_compaction + SUMMARIZATION_SYSTEM_PROMPT -> 同名(逐字移植) + SUMMARIZATION_PROMPT -> 同名(逐字移植) + UPDATE_SUMMARIZATION_PROMPT -> 同名(逐字移植,迭代更新用) + TURN_PREFIX_SUMMARIZATION_PROMPT -> 同名(逐字移植,断轮前缀用) + generateSummaryWithUsage -> generate_summary(maxTokens = 0.8×reserve) + generateTurnPrefixSummary -> generate_turn_prefix_summary(0.5×reserve) + compact -> compact_context(断轮双摘要 + 拼接格式 1:1) + packages/agent/src/harness/compaction/utils.ts + serializeConversation -> serialize_conversation(1:1,含 2000 字符截断) + extractFileOpsFromMessage -> extract_file_ops_from_message + computeFileLists -> compute_file_lists + formatFileOperations -> format_file_operations + TOOL_RESULT_MAX_CHARS = 2000 -> 同名常量 + +摘要 LLM 调用由上层注入: + summarize_fn(prompt_text: str, system_prompt: str, max_tokens: int) -> str +(pi 里是 models.completeSimple + retry;haocode 用 OpenAI 客户端非流式调用, + 由 llm_engine.AgentWorker 实现并注入。) + +已声明的偏差(仅 2 处,见 context.py 头注): + 1. 单条消息 token 估算用 CJK 感知启发式(pi 是 chars/4)——对中文会话更安全 + 2. 摘要 LLM 调用失败时降级为机械摘录(pi 返回 CompactionError)——桌面应用优先不丢上下文 +其余全部 1:1:触发公式、usage 锚定、token 预算切点、有效切点规则、断轮双摘要、 +迭代式 previousSummary 更新、摘要提示词逐字、文件操作附录、拼接格式。 +""" +from __future__ import annotations + +import json +from dataclasses import dataclass, field +from typing import Callable, List, Optional, Set, Tuple + +from .types import AgentMessage, ModelConfig + + +# ====================================================================== +# 压缩设置 —— 1:1 对照 DEFAULT_COMPACTION_SETTINGS +# ====================================================================== +@dataclass +class CompactionSettings: + """pi: interface CompactionSettings { enabled; reserveTokens; keepRecentTokens }""" + enabled: bool = True + reserve_tokens: int = 16384 # pi: 16384(摘要提示词与输出预留) + keep_recent_tokens: int = 20000 # pi: 20000(压缩后保留的近期上下文预算) + + +DEFAULT_COMPACTION_SETTINGS = CompactionSettings() + +# pi utils.ts: const TOOL_RESULT_MAX_CHARS = 2000 +TOOL_RESULT_MAX_CHARS = 2000 + + +# ====================================================================== +# 摘要提示词 —— 从 pi compaction.ts 逐字移植(不得改写,摘要质量依赖它) +# ====================================================================== +SUMMARIZATION_SYSTEM_PROMPT = \ + "You are a context summarization assistant. Your task is to read a conversation " \ + "between a user and an AI assistant, then produce a structured summary following " \ + "the exact format specified.\n\n" \ + "Do NOT continue the conversation. Do NOT respond to any questions in the " \ + "conversation. ONLY output the structured summary." + +SUMMARIZATION_PROMPT = """The messages above are a conversation to summarize. Create a structured context checkpoint summary that another LLM will use to continue the work. + +Use this EXACT format: + +## Goal +[What is the user trying to accomplish? Can be multiple items if the session covers different tasks.] + +## Constraints & Preferences +- [Any constraints, preferences, or requirements mentioned by user] +- [Or "(none)" if none were mentioned] + +## Progress +### Done +- [x] [Completed tasks/changes] + +### In Progress +- [ ] [Current work] + +### Blocked +- [Issues preventing progress, if any] + +## Key Decisions +- **[Decision]**: [Brief rationale] + +## Next Steps +1. [Ordered list of what should happen next] + +## Critical Context +- [Any data, examples, or references needed to continue] +- [Or "(none)" if not applicable] + +Keep each section concise. Preserve exact file paths, function names, and error messages.""" + +UPDATE_SUMMARIZATION_PROMPT = """The messages above are NEW conversation messages to incorporate into the existing summary provided in tags. + +Update the existing structured summary with new information. RULES: +- PRESERVE all existing information from the previous summary +- ADD new progress, decisions, and context from the new messages +- UPDATE the Progress section: move items from "In Progress" to "Done" when completed +- UPDATE "Next Steps" based on what was accomplished +- PRESERVE exact file paths, function names, and error messages +- If something is no longer relevant, you may remove it + +Use this EXACT format: + +## Goal +[Preserve existing goals, add new ones if the task expanded] + +## Constraints & Preferences +- [Preserve existing, add new ones discovered] + +## Progress +### Done +- [x] [Include previously done items AND newly completed items] + +### In Progress +- [ ] [Current work - update based on progress] + +### Blocked +- [Current blockers - remove if resolved] + +## Key Decisions +- **[Decision]**: [Brief rationale] (preserve all previous, add new) + +## Next Steps +1. [Update based on current state] + +## Critical Context +- [Preserve important context, add new if needed] + +Keep each section concise. Preserve exact file paths, function names, and error messages.""" + +TURN_PREFIX_SUMMARIZATION_PROMPT = """This is the PREFIX of a turn that was too large to keep. The SUFFIX (recent work) is retained. + +Summarize the prefix to provide context for the retained suffix: + +## Original Request +[What did the user ask for in this turn?] + +## Early Progress +- [Key decisions and work done in the prefix] + +## Context for Suffix +- [Information needed to understand the retained recent work] + +Be concise. Focus on what's needed to understand the kept suffix.""" + + +# ====================================================================== +# 对话序列化 —— 1:1 对照 utils.ts serializeConversation +# ====================================================================== +def _safe_json(value) -> str: + try: + s = json.dumps(value, ensure_ascii=False) + return s if s is not None else "undefined" + except Exception: + return "[unserializable]" + + +def _content_text(content) -> str: + """pi contentText: str 或 [{type:"text",text}] 列表取文本拼接""" + if content is None: + return "" + if isinstance(content, str): + return content + if isinstance(content, list): + parts = [] + for b in content: + if isinstance(b, dict) and b.get("type") == "text": + parts.append(str(b.get("text", ""))) + return "\n".join(p for p in parts if p) + return str(content) + + +def _truncate_for_summary(text: str, max_chars: int) -> str: + """pi utils.ts truncateForSummary(逐字逻辑)""" + if len(text) <= max_chars: + return text + truncated = len(text) - max_chars + return f"{text[:max_chars]}\n\n[... {truncated} more characters truncated]" + + +def serialize_conversation(messages: List[AgentMessage]) -> str: + """ + 1:1 对照 utils.ts serializeConversation(输出格式逐字一致): + [User]: ... + [Assistant thinking]: ... + [Assistant]: ... + [Assistant tool calls]: name(k=v, k2=v2); name2(...) + [Tool result]: ...(超 2000 字符截断) + """ + parts: List[str] = [] + for msg in messages: + if msg.role == "user": + content = _content_text(msg.content) + if content: + parts.append(f"[User]: {content}") + elif msg.role == "assistant": + thinking_parts = [] + tool_calls = [] + if msg.reasoning: + thinking_parts.append(msg.reasoning) + text = _content_text(msg.content) + for tc in (msg.tool_calls or []): + args_str = ", ".join(f"{k}={_safe_json(v)}" + for k, v in (tc.arguments or {}).items()) + tool_calls.append(f"{tc.name}({args_str})") + if thinking_parts: + parts.append(f"[Assistant thinking]: {chr(10).join(thinking_parts)}") + if text: + parts.append(f"[Assistant]: {text}") + if tool_calls: + parts.append(f"[Assistant tool calls]: {'; '.join(tool_calls)}") + elif msg.role == "toolResult": + content = _content_text(msg.content) + if content: + parts.append(f"[Tool result]: " + f"{_truncate_for_summary(content, TOOL_RESULT_MAX_CHARS)}") + return "\n\n".join(parts) + + +# ====================================================================== +# 文件操作提取 —— 1:1 对照 utils.ts extractFileOps*/computeFileLists/formatFileOperations +# ====================================================================== +class FileOperations: + def __init__(self): + self.read: Set[str] = set() + self.written: Set[str] = set() + self.edited: Set[str] = set() + + +def extract_file_ops_from_message(message: AgentMessage, file_ops: FileOperations): + """pi: assistant 的 toolCall 参数里 path 字段 → read/write/edit 归类""" + if message.role != "assistant": + return + for tc in (message.tool_calls or []): + args = tc.arguments or {} + path = args.get("path") + if not isinstance(path, str) or not path: + continue + if tc.name == "read": + file_ops.read.add(path) + elif tc.name == "write": + file_ops.written.add(path) + elif tc.name == "edit": + file_ops.edited.add(path) + + +def compute_file_lists(file_ops: FileOperations) -> Tuple[List[str], List[str]]: + """pi computeFileLists: modified = edited|written;readOnly = read-modified;均排序""" + modified = file_ops.edited | file_ops.written + read_only = sorted(f for f in file_ops.read if f not in modified) + return read_only, sorted(modified) + + +def format_file_operations(read_files: List[str], modified_files: List[str]) -> str: + """pi formatFileOperations: / 标签拼接""" + sections = [] + if read_files: + sections.append("\n" + "\n".join(read_files) + "\n") + if modified_files: + sections.append("\n" + "\n".join(modified_files) + "\n") + if not sections: + return "" + return "\n\n" + "\n\n".join(sections) + + +# ====================================================================== +# 切分点 —— 1:1 对照 findValidCutPoints / findTurnStartIndex / findCutPoint +# ====================================================================== +@dataclass +class CutPointResult: + """pi: interface CutPointResult""" + first_kept_index: int # 保留段首条在 compactable 列表里的下标 + turn_start_index: int = -1 # 断轮时:该轮起点(user 消息)下标;否则 -1 + is_split_turn: bool = False + + +def find_valid_cut_points(messages: List[AgentMessage], + start_index: int, end_index: int) -> List[int]: + """ + pi findValidCutPoints:消息角色为 user/assistant 的位置是有效切点 + (toolResult 不能做切点——它会与前面的 toolCall 分离)。 + pi 里的 bashExecution/branchSummary/compactionSummary 等角色 + 在 haocode 消息模型中不存在,等价规则即 role in (user, assistant)。 + """ + cut_points = [] + for i in range(start_index, end_index): + if messages[i].role in ("user", "assistant"): + cut_points.append(i) + return cut_points + + +def find_turn_start(messages: List[AgentMessage], entry_index: int, + start_index: int) -> int: + """pi findTurnStartIndex:向前找本轮起点(user 消息 / branch_summary)""" + for i in range(entry_index, start_index - 1, -1): + if messages[i].role == "user": + return i + return -1 + + +def _estimate(msg: AgentMessage) -> int: + from .context import estimate_message_tokens + return estimate_message_tokens(msg) + + +def find_cut_point(messages: List[AgentMessage], start_index: int, + end_index: int, keep_recent_tokens: int) -> CutPointResult: + """ + 1:1 对照 pi findCutPoint: + 1. 从尾部向前累计 token,直到累计 >= keep_recent_tokens + 2. 取该位置(含)之后的第一个有效切点 + 3. 切点不是 user 消息 → 断轮:找本轮起点,前缀单独摘要 + (pi 的「回退跳过状态条目」循环针对 session 状态条目; + haocode 消息列表没有状态条目,等价省略。) + """ + cut_points = find_valid_cut_points(messages, start_index, end_index) + if not cut_points: + return CutPointResult(first_kept_index=start_index) + + accumulated = 0 + cut_index = cut_points[0] + for i in range(end_index - 1, start_index - 1, -1): + accumulated += _estimate(messages[i]) + if accumulated >= keep_recent_tokens: + for c in cut_points: + if c >= i: + cut_index = c + break + break + + is_user = messages[cut_index].role == "user" + turn_start = -1 if is_user else find_turn_start(messages, cut_index, start_index) + is_split = (not is_user) and turn_start != -1 + return CutPointResult(first_kept_index=cut_index, + turn_start_index=turn_start, + is_split_turn=is_split) + + +# ====================================================================== +# 压缩准备 —— 1:1 对照 prepareCompaction +# ====================================================================== +@dataclass +class CompactionPreparation: + """pi: interface CompactionPreparation""" + messages_to_summarize: List[AgentMessage] = field(default_factory=list) + turn_prefix_messages: List[AgentMessage] = field(default_factory=list) + retained_tail: List[AgentMessage] = field(default_factory=list) + is_split_turn: bool = False + tokens_before: int = 0 + previous_summary: Optional[str] = None + file_ops: FileOperations = field(default_factory=FileOperations) + # 注意(P2-04 跨平台修复):Python 3.11+ 的 dataclass 禁止不可哈希默认值 + # (eq dataclass 实例 __hash__=None);Ubuntu 24.04 自带 3.12, + # 直接写 `= DEFAULT_COMPACTION_SETTINGS` 在 3.11+ 会 ValueError。 + # default_factory 返回同一共享实例,与 3.10 行为完全一致。 + settings: CompactionSettings = field(default_factory=lambda: DEFAULT_COMPACTION_SETTINGS) + + +def _compaction_diag(line: str) -> None: + """压缩自诊断日志(与 recovery.compact_diag_log 同一文件/规范: + print + 追加 compaction_diag.log + 失败静默)。""" + import os as _os + import time as _time + t = _time.time() + stamp = (f"[{_time.strftime('%H:%M:%S', _time.localtime(t))}" + f".{int(t * 1000) % 1000:03d}]") + print(f"{stamp} {line}", flush=True) + try: + path = _os.path.join( + _os.path.dirname(_os.path.dirname(_os.path.dirname(_os.path.abspath(__file__)))), + "compaction_diag.log") + with open(path, "a", encoding="utf-8") as f: + f.write(f"{stamp} {line}\n") + except Exception: + pass + + +def _nothing_to_summarize_diag(messages: List[AgentMessage], + compactable: List[AgentMessage], + cut: CutPointResult, + settings: CompactionSettings) -> str: + """prepare_compaction 返回 None(无可摘要内容)时的自诊断行: + 记录分支子类型 + 关键量,下次失败可直接从日志定位原因。 + + 子类型: + no_valid_cut_points —— 可压缩范围内没有任何 user/assistant 条目 + total_below_keep_recent —— 可压缩范围总量 < keep_recent(通常意味着 + 上下文主体是旧摘要本身,无新内容) + cut_pinned_at_zero —— 预算从尾部累加只在 i=0 才达标,即首条 + 条目独占 ≥ (总量-keep_recent) 的 token + (单条超长消息/巨型工具输出主导上下文) + """ + from .context import estimate_context_tokens, estimate_message_tokens + try: + total = estimate_context_tokens(messages).tokens + n_user = sum(1 for m in compactable if m.role == "user") + n_asst = sum(1 for m in compactable if m.role == "assistant") + ests = [(estimate_message_tokens(m), i) for i, m in enumerate(compactable)] + e0 = ests[0][0] if ests else 0 + rest = sum(e for e, _ in ests[1:]) + top3 = sorted(ests, reverse=True)[:3] + roles = " ".join(("T" if m.role == "toolResult" else m.role[0].upper()) + for m in compactable[:10]) + if not find_valid_cut_points(compactable, 0, len(compactable)): + sub = "no_valid_cut_points" + elif sum(e for e, _ in ests) < settings.keep_recent_tokens: + sub = "total_below_keep_recent" + else: + sub = "cut_pinned_at_zero" + big = "; ".join(f"idx{i}={e}" for e, i in top3) + return (f"[COMPACT_NONE] branch=nothing_to_summarize sub={sub} " + f"msgs={len(messages)} est_total={total} compactable={len(compactable)} " + f"keep_recent={settings.keep_recent_tokens} " + f"first_kept={cut.first_kept_index} turn_start={cut.turn_start_index} " + f"split={cut.is_split_turn} user={n_user} asst={n_asst} " + f"est_first={e0} est_rest={rest} top3=[{big}] head_roles=[{roles}]") + except Exception as ex: # 诊断本身失败不能影响主流程 + return f"[COMPACT_NONE] branch=nothing_to_summarize (diag failed: {ex})" + + +def prepare_compaction(messages: List[AgentMessage], + settings: Optional[CompactionSettings] = None + ) -> Optional[CompactionPreparation]: + """ + 1:1 对照 pi prepareCompaction: + - 上一条压缩摘要(messages[0].kind == "compaction_summary")不重复摘要, + 其内容作为 previousSummary 走迭代更新提示词 + - 可压缩范围 = 摘要之后的全部消息(pi 里等价于「上次保留尾 + 新消息」) + - 切点在可压缩范围内选;tokens_before 按完整上下文(含摘要消息)估算 + 不可压缩(空/无摘要对象)时返回 None(对照 pi 返回 ok(undefined))。 + """ + from .context import estimate_context_tokens + settings = settings or DEFAULT_COMPACTION_SETTINGS + if not messages: + _compaction_diag("[COMPACT_NONE] branch=empty_messages") + return None + if messages[-1].kind == "compaction_summary": + _compaction_diag( + f"[COMPACT_NONE] branch=tail_is_summary msgs={len(messages)} " + f"tail_head={_content_text(messages[-1].content)[:60]!r}") + return None + + previous_summary = None + if messages[0].kind == "compaction_summary": + previous_summary = _content_text(messages[0].content) + compactable = messages[1:] + else: + compactable = messages + if not compactable: + _compaction_diag("[COMPACT_NONE] branch=compactable_empty (上下文只剩旧摘要)") + return None + + tokens_before = estimate_context_tokens(messages).tokens + cut = find_cut_point(compactable, 0, len(compactable), + settings.keep_recent_tokens) + + history_end = cut.turn_start_index if cut.is_split_turn else cut.first_kept_index + messages_to_summarize = compactable[:history_end] + turn_prefix_messages = [] + if cut.is_split_turn: + turn_prefix_messages = compactable[cut.turn_start_index:cut.first_kept_index] + retained_tail = compactable[cut.first_kept_index:] + + if not messages_to_summarize and not turn_prefix_messages: + # 🆕 自诊断:记录是哪种子条件导致无东西可摘要(见 _nothing_to_summarize_diag) + _compaction_diag(_nothing_to_summarize_diag(messages, compactable, cut, + settings)) + return None # 没有可摘要内容 + + file_ops = FileOperations() + for m in messages_to_summarize: + extract_file_ops_from_message(m, file_ops) + if cut.is_split_turn: + for m in turn_prefix_messages: + extract_file_ops_from_message(m, file_ops) + + return CompactionPreparation( + messages_to_summarize=messages_to_summarize, + turn_prefix_messages=turn_prefix_messages, + retained_tail=retained_tail, + is_split_turn=cut.is_split_turn, + tokens_before=tokens_before, + previous_summary=previous_summary, + file_ops=file_ops, + settings=settings, + ) + + +# ====================================================================== +# 摘要生成 —— 1:1 对照 generateSummaryWithUsage / generateTurnPrefixSummary +# ====================================================================== +def _build_summary_prompt(conversation_text: str, previous_summary: Optional[str]) -> str: + """pi generateSummaryWithUsage 的 prompt 组装(逐字结构)""" + base = UPDATE_SUMMARIZATION_PROMPT if previous_summary else SUMMARIZATION_PROMPT + prompt = f"\n{conversation_text}\n\n\n" + if previous_summary: + prompt += f"\n{previous_summary}\n\n\n" + prompt += base + return prompt + + +def generate_summary(messages: List[AgentMessage], + summarize_fn: Callable[[str, str, int], str], + reserve_tokens: int, + model_max_tokens: int, + previous_summary: Optional[str] = None + ) -> Tuple[Optional[str], Optional[str]]: + """ + 返回 (summary_text, error)。 + maxTokens = min(0.8 × reserveTokens, model.maxTokens) —— 1:1 对照。 + """ + max_tokens = min( + int(0.8 * reserve_tokens), + model_max_tokens if model_max_tokens > 0 else (1 << 30), + ) + conversation = serialize_conversation(messages) + prompt = _build_summary_prompt(conversation, previous_summary) + try: + text = summarize_fn(prompt, SUMMARIZATION_SYSTEM_PROMPT, max_tokens) + except Exception as e: + return None, f"Summarization failed: {e}" + if not text or not text.strip(): + return None, "Summarization failed: empty response" + return text.strip(), None + + +def generate_turn_prefix_summary(messages: List[AgentMessage], + summarize_fn: Callable[[str, str, int], str], + reserve_tokens: int, + model_max_tokens: int + ) -> Tuple[Optional[str], Optional[str]]: + """maxTokens = min(0.5 × reserveTokens, model.maxTokens) —— 1:1 对照""" + max_tokens = min( + int(0.5 * reserve_tokens), + model_max_tokens if model_max_tokens > 0 else (1 << 30), + ) + conversation = serialize_conversation(messages) + prompt = f"\n{conversation}\n\n\n{TURN_PREFIX_SUMMARIZATION_PROMPT}" + try: + text = summarize_fn(prompt, SUMMARIZATION_SYSTEM_PROMPT, max_tokens) + except Exception as e: + return None, f"Turn prefix summarization failed: {e}" + if not text or not text.strip(): + return None, "Turn prefix summarization failed: empty response" + return text.strip(), None + + +# ====================================================================== +# 主入口 —— 1:1 对照 compact() +# ====================================================================== +def compact_context(messages: List[AgentMessage], + model: ModelConfig, + summarize_fn: Callable[[str, str, int], str], + settings: Optional[CompactionSettings] = None + ) -> Optional[List[AgentMessage]]: + """ + 执行压缩。返回 [压缩摘要消息] + 保留尾巴;不可压缩时返回 None。 + + 摘要消息: role="user", kind="compaction_summary",content 为纯摘要文本 + (pi 的 compaction 条目;下次压缩时自动走迭代更新提示词)。 + + 断轮(切点落在某轮中间)时 1:1 对照 pi compact(): + 历史摘要 与 轮前缀摘要 分两次 LLM 调用,拼接为 + {history}\n\n---\n\n**Turn Context (split turn):**\n\n{prefix} + 最后追加文件操作附录(/)。 + """ + settings = settings or DEFAULT_COMPACTION_SETTINGS + prep = prepare_compaction(messages, settings) + if prep is None: + return None + + history_text: Optional[str] = None + prefix_error: Optional[str] = None + history_error: Optional[str] = None + + if prep.is_split_turn and prep.turn_prefix_messages: + if prep.messages_to_summarize: + history_text, history_error = generate_summary( + prep.messages_to_summarize, summarize_fn, + prep.settings.reserve_tokens, model.max_tokens, + prep.previous_summary) + if history_error: + return _degraded_compact(prep, history_error) + else: + history_text = "No prior history." + prefix_text, prefix_error = generate_turn_prefix_summary( + prep.turn_prefix_messages, summarize_fn, + prep.settings.reserve_tokens, model.max_tokens) + if prefix_error: + return _degraded_compact(prep, prefix_error) + summary = (f"{history_text}\n\n---\n\n" + f"**Turn Context (split turn):**\n\n{prefix_text}") + else: + if not prep.messages_to_summarize: + return None + summary, history_error = generate_summary( + prep.messages_to_summarize, summarize_fn, + prep.settings.reserve_tokens, model.max_tokens, + prep.previous_summary) + if history_error: + return _degraded_compact(prep, history_error) + + read_files, modified_files = compute_file_lists(prep.file_ops) + summary += format_file_operations(read_files, modified_files) + + summary_msg = AgentMessage(role="user", content=summary, + kind="compaction_summary") + return [summary_msg] + prep.retained_tail + + +def _degraded_compact(prep: CompactionPreparation, + error: str) -> Optional[List[AgentMessage]]: + """ + 已声明偏差(对照 pi: 直接返回 CompactionError): + 桌面应用优先「不丢上下文」——摘要失败时降级为机械摘录, + 保留尾巴原样不动。 + """ + old = prep.messages_to_summarize + prep.turn_prefix_messages + if not old: + return None + excerpt = serialize_conversation(old)[-500:] + summary = (f"(自动压缩:摘要生成失败 [{error}],以下为旧对话尾部摘录)\n\n{excerpt}") + summary_msg = AgentMessage(role="user", content=summary, + kind="compaction_summary") + return [summary_msg] + prep.retained_tail diff --git a/core/agent/context.py b/core/agent/context.py new file mode 100644 index 0000000..e4c0e1e --- /dev/null +++ b/core/agent/context.py @@ -0,0 +1,341 @@ +""" +core/agent/context.py +===================== +🌟 pi 上下文管理的 Python 1:1 移植 —— 令牌估算 + 输出预算钳制 + +对照 pi-main 源码: + packages/ai/src/api/simple-options.ts + - CONTEXT_SAFETY_TOKENS = 4096 (行 12) + - clampMaxTokensToContext() (行 12-34) + maxOutput = contextWindow - inputTokens - 4096 + return min(model.maxTokens, maxOutput) (下限 1) + - clampOutputsToContext() (行 36-60) + 多模型共享窗口时按比例分配剩余输出预算 + packages/ai/src/api/token-utils.ts + - 每条消息估算: ceil(chars/4) + 4 + +🌟 已声明偏差(仅 1 处,其余全部 1:1): + pi 按 chars/4 估算(针对英文)。中文 1 字 ≈ 1 token,chars/4 会严重低估。 + 这里采用 CJK 感知估算:CJK 字符按 1 token/字,其余按 4 字符/token。 + 这直接影响「压缩触发时机」和「输出预算钳制」,必须更准才不会撞 vLLM 上限。 + + pi 的 usage 锚定机制 1:1 保留:若历史里存在有效 assistant usage, + 总估算 = 该 usage 的 totalTokens(服务商精确值)+ 其后消息的逐条估算。 +""" +from __future__ import annotations + +import math +import re +from dataclasses import dataclass +from typing import Any, Dict, List, Optional, Tuple + +from .types import AgentMessage, ModelConfig + +# ====================================================================== +# 对照 simple-options.ts: export const CONTEXT_SAFETY_TOKENS = 4096 +# 用途:上下文钳制时预留的安全余量(tokenizer 估算误差 + vLLM 精确计数的偏差) +# ====================================================================== +CONTEXT_SAFETY_TOKENS = 4096 + +# 图片 token 估算(对照 pi 对 image part 的固定估算) +IMAGE_TOKENS = 1600 + +_CJK_RE = re.compile( + r"[\u2e80-\u2eff\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff" + r"\uf900-\ufaff\uff00-\uffef]" +) + + +def _count_text_chars(value: Any) -> int: + """统计内容里的字符数(对照 pi token-utils 的字符统计口径)""" + if isinstance(value, str): + return len(value) + if isinstance(value, list): # OpenAI 多模态 content 数组 + n = 0 + for part in value: + if isinstance(part, dict): + if part.get("type") == "text": + n += len(part.get("text", "") or "") + elif part.get("type") == "image_url": + n += 0 # 图片单独按 IMAGE_TOKENS 计 + else: + n += len(str(part)) + return n + return len(str(value or "")) + + +def _count_image_parts(content: Any) -> int: + if isinstance(content, list): + return sum(1 for p in content + if isinstance(p, dict) and p.get("type") == "image_url") + return 0 + + +def estimate_message_tokens(message: AgentMessage) -> int: + """ + 单条消息 token 估算(CJK 感知版)。 + pi 口径: ceil(chars/4) + 4。本项目: CJK 字 ×1 + 其余 /4 + 4 + 图片×1600。 + """ + raw = message.content + if isinstance(raw, str): + chars = len(raw) + cjk = len(_CJK_RE.findall(raw)) + else: + # 数组 content:拼接所有文本部分 + joined = [] + for part in raw if isinstance(raw, list) else []: + if isinstance(part, dict) and part.get("type") == "text": + joined.append(part.get("text", "") or "") + text = "".join(joined) + chars = len(text) + cjk = len(_CJK_RE.findall(text)) + tokens = cjk + math.ceil((chars - cjk) / 4) + 4 + tokens += _count_image_parts(raw) * IMAGE_TOKENS + # 思考内容与工具参数也占上下文(assistant 的 reasoning / tool_calls) + if message.reasoning: + rcjk = len(_CJK_RE.findall(message.reasoning)) + tokens += rcjk + math.ceil((len(message.reasoning) - rcjk) / 4) + for tc in message.tool_calls: + arg_text = _json_str(tc.arguments) + tokens += math.ceil(len(arg_text) / 4) + # toolResult 的 content 走 content 字段(str 或 list) + return tokens + + +def _json_str(obj: Any) -> str: + import json + try: + return json.dumps(obj, ensure_ascii=False) + except Exception: + return str(obj) + + +def _estimate_text_tokens(text: str) -> int: + """CJK 感知文本 token 估算(与 estimate_message_tokens 同公式,不含每条 +4 开销)""" + if not text: + return 0 + cjk = len(_CJK_RE.findall(text)) + return cjk + math.ceil((len(text) - cjk) / 4) + + +def _estimate_tools_tokens(tools) -> int: + """ + 🆕 P2: 工具 schema token 估算 —— name/description/parameters 的 JSON 字符数(CJK 感知)。 + 对照 pi Context 分支: all tools = Σ estimate_text(json(tool))。 + """ + total = 0 + for t in tools or []: + schema = { + "name": getattr(t, "name", "") or "", + "description": getattr(t, "description", "") or "", + "parameters": getattr(t, "parameters", None), + } + total += _estimate_text_tokens(_json_str(schema)) + return total + + +def estimate_context_tokens(messages: List[AgentMessage], + system_prompt: str = "", + tools: Optional[List[Any]] = None + ) -> "ContextUsageEstimate": + """ + 🌟 1:1 对照 pi estimateContextTokens(usage 锚定): + - 找到最后一条带有效 usage 的 assistant 消息(🆕 P0: 含 timestamp 时效校验) + - 总 tokens = 该 usage 的精确值 + 其后消息的逐条估算 + - 无 usage 时 = 全部消息逐条估算 + 🆕 P2: 可选 system_prompt / tools 参数(对照 pi Context 分支): + - 仅在无锚点分支计入 system 提示词 + 工具 schema 的估算 + (有锚点时 usage 已是含 system+tools 的精确总值,不重复计) + 逐条估算用 CJK 感知版 estimate_message_tokens(已声明偏差)。 + """ + last_idx, last_usage = _find_last_usage(messages) + + sys_tokens = _estimate_text_tokens(system_prompt) if system_prompt else 0 + tool_tokens = _estimate_tools_tokens(tools) if tools else 0 + + if last_idx is None: + estimated = (sum(estimate_message_tokens(m) for m in messages) + + sys_tokens + tool_tokens) + return ContextUsageEstimate(tokens=estimated, usage_tokens=0, + trailing_tokens=estimated, last_usage_index=None) + + usage_tokens = calculate_context_tokens(last_usage) + trailing = sum(estimate_message_tokens(m) for m in messages[last_idx + 1:]) + return ContextUsageEstimate(tokens=usage_tokens + trailing, + usage_tokens=usage_tokens, + trailing_tokens=trailing, + last_usage_index=last_idx) + + +@dataclass +class ContextUsageEstimate: + """ + 🌟 1:1 对照 pi estimateContextTokens 的返回值 + packages/agent/src/harness/compaction/compaction.ts ContextUsageEstimate: + tokens 总估算 + usageTokens 最后一条有效 assistant usage 报告的精确 token 数 + trailingTokens 该 usage 之后消息的估算值 + lastUsageIndex 提供 usage 的消息下标(无则 None) + """ + tokens: int = 0 + usage_tokens: int = 0 + trailing_tokens: int = 0 + last_usage_index: Optional[int] = None + + +def calculate_context_tokens(usage: Dict[str, Any]) -> int: + """pi calculateContextTokens: totalTokens || input+output+cacheRead+cacheWrite""" + if not usage: + return 0 + total = int(usage.get("totalTokens", 0) or 0) + if total: + return total + return (int(usage.get("input", 0) or 0) + int(usage.get("output", 0) or 0) + + int(usage.get("cacheRead", 0) or 0) + + int(usage.get("cacheWrite", 0) or 0)) + + +def _get_assistant_usage(msg: AgentMessage) -> Dict[str, Any]: + """ + pi getAssistantUsage:只认「有效」的 assistant usage—— + stopReason 不是 aborted/error,且 calculateContextTokens > 0。 + (🆕 P0: 锚点扫描还需通过 timestamp 时效校验,见 _find_last_usage) + """ + if msg.role != "assistant": + return {} + if msg.stop_reason in ("aborted", "error"): + return {} + usage = msg.usage or {} + if usage and calculate_context_tokens(usage) > 0: + return usage + return {} + + +def _row_block_tool_flags(messages: List["AgentMessage"]) -> List[bool]: + """ + 🆕 G1: 逐条标记「其 DB 行(同非空 db_msg_id 的连续块)是否含工具活动」。 + 含工具输出的行,其入库 usage 是「本轮最后一个子请求」的内存快照 + (工具结果未受 4000 字回放截断),不等于下一请求(截断回放)→ 锚点失效。 + 轮中内存条目(db_msg_id="")一律 False:保持原规则 + (轮中条目的内存载荷 == 下一子请求载荷,锚点有效)。 + """ + n = len(messages) + flags = [False] * n + i = 0 + while i < n: + rid = getattr(messages[i], "db_msg_id", "") or "" + if not rid: + i += 1 + continue + j = i + has_tool = False + while j < n and (getattr(messages[j], "db_msg_id", "") or "") == rid: + mj = messages[j] + if mj.role == "toolResult" or (mj.role == "assistant" and mj.tool_calls): + has_tool = True + j += 1 + for k in range(i, j): + flags[k] = has_tool + i = j + return flags + + +def _find_last_usage(messages: List["AgentMessage"]): + """ + 🆕 P0: 1:1 对照 pi getLastAssistantUsageInfo(含锚点失效校验): + assistant 的 usage 要成为锚点,必须满足 + ① timestamp >= 它前面所有消息的最大 timestamp(即它不比任何前消息「更旧」)。 + 场景:压缩后 state = [新摘要消息(T_new)] + [保留的旧消息(T_old)], + 保留窗里 assistant 的 usage 来自压缩前(如 60K 精确值)——不校验的话, + 下一次 should_compact 会锚定到过期值 → 误触发二次压缩(摘要套摘要)。 + 摘要消息 timestamp 晚于全部保留消息 → 前缀游标抬高 → 旧 usage 自动失效; + 压缩后第一个新 assistant 回复到达 → 新 usage 锚点自动恢复。 + ② 🆕 G1: 该 usage 所在 DB 行不含工具活动(toolResult / assistant.tool_calls)。 + 含工具输出的行,入库 usage = 本轮内存快照(工具结果未截断)≠ 下一请求 + (4000 字截断回放)→ 系统性高估 → 误触发压缩(实测 113904 锚点 vs + 真实下一请求 ~90k)。纯文本行 / 轮中内存条目的 usage 仍是精确值,保留锚定。 + (消息无 timestamp 信息(全 0)时行为等同旧版「取最后一条有效」,完全向后兼容。) + """ + latest_prefix_ts = -1 # 对照 pi: Number.NEGATIVE_INFINITY + last_idx = None + last_usage: Dict[str, Any] = {} + row_tool_flags = _row_block_tool_flags(messages) + for i, msg in enumerate(messages): + if msg.role == "assistant": + applies = (msg.timestamp or 0) >= latest_prefix_ts + if (applies + and not row_tool_flags[i] + and msg.stop_reason not in ("aborted", "error") + and msg.usage + and calculate_context_tokens(msg.usage) > 0): + last_idx, last_usage = i, msg.usage + ts = msg.timestamp or 0 + if ts > latest_prefix_ts: + latest_prefix_ts = ts + return last_idx, last_usage + + +def clamp_max_tokens_to_context(model: ModelConfig, + context: List[AgentMessage], + system_prompt: str = "", + tools: Optional[List[Any]] = None + ) -> Optional[Tuple[int, int]]: + """ + 🌟 对照 simple-options.ts:12-34 clampMaxTokensToContext(1:1 公式): + + input_estimate = estimateContextTokens(context) # 🆕 P2: 含 system+tools(pi Context 实参) + if (input_estimate > model.contextWindow) return null // 上下文已溢出 + maxOutput = contextWindow - inputTokens - CONTEXT_SAFETY_TOKENS + return max(1, min(model.maxTokens, maxOutput)) + + 这就是 pi 约束公式的本体: + 输入 + 输出 ≤ contextWindow − 4096 ≤ vLLM max_model_len + 🆕 P2: system_prompt / tools 仅在无 usage 锚点分支计入(首轮流式精确记账, + 与 pi 传完整 Context 的行为一致);有锚点时 usage 已精确覆盖,不重复计。 + 返回 (max_tokens, input_tokens);输入已溢出窗口时返回 None(由恢复逻辑接管)。 + """ + input_tokens = estimate_context_tokens( + context, system_prompt=system_prompt, tools=tools).tokens + if input_tokens > model.context_window: + return None + max_output = model.context_window - input_tokens - CONTEXT_SAFETY_TOKENS + return max(1, min(model.max_tokens, max_output)), input_tokens + + +def clamp_outputs_to_context(context: List[AgentMessage], + models: List[ModelConfig], + reserve_tokens: int = CONTEXT_SAFETY_TOKENS + ) -> List[int]: + """ + 对照 simple-options.ts:36-60 clampOutputsToContext: + 多个模型共享同一窗口时,把剩余输出预算按比例分配给各模型。 + (haocode 单模型场景用不到,保留以求框架完整) + """ + input_tokens = estimate_context_tokens(context).tokens + available = max(0, sum(m.context_window for m in models) - input_tokens - reserve_tokens) + if not models: + return [] + weights = [m.max_tokens for m in models] + total_w = sum(weights) or 1 + alloc = [max(1, int(available * w / total_w)) for w in weights] + # 各自不超过自身 max_tokens + alloc = [min(a, m.max_tokens) for a, m in zip(alloc, models)] + return alloc + + +def should_compact(messages: List[AgentMessage], model: ModelConfig, + reserve_tokens: int = 16384, + system_prompt: str = "", + tools: Optional[List[Any]] = None) -> Tuple[bool, int]: + """ + 🌟 1:1 对照 pi compaction.ts shouldCompact(harness 原版公式): + contextTokens > contextWindow - reserveTokens + reserveTokens 默认 16384(DEFAULT_COMPACTION_SETTINGS.reserveTokens), + 即「为摘要提示词与输出预留 16K」。估算值取 usage 锚定估算。 + 🆕 G2: system_prompt/tools 透传 —— 无锚点分支(工具行快照锚点被 G1 失效后 + 更常走到)也要计入 system + 工具 schema,度量「下一请求真实载荷」, + 与显示端(update_context_display)同口径。 + """ + tokens = estimate_context_tokens(messages, system_prompt=system_prompt, + tools=tools).tokens + return (tokens > model.context_window - reserve_tokens), tokens diff --git a/core/agent/loop.py b/core/agent/loop.py new file mode 100644 index 0000000..f1078af --- /dev/null +++ b/core/agent/loop.py @@ -0,0 +1,482 @@ +""" +core/agent/loop.py +================== +🌟 pi 核心循环的 Python 1:1 移植 —— 整个框架的心脏 + +对照 pi-main 源码(packages/agent/src/agent-loop.ts, 796 行): + runAgentLoop() → run_loop(agent, new_message, ...) + runLoop() → _run_loop() (行 163-278) + streamAssistantResponse() → _stream_turn() (行 281-380) + executeToolCalls() → execute_tool_calls() (行 413-427) + executeToolCallsParallel/Sequential → _execute_parallel/_execute_sequential + prepareToolCall() → tools.prepare_tool_calls + failToolCallsFromTruncatedMessage → tools.fail_tool_calls_from_truncated_message + shouldTerminateToolBatch → _should_terminate_batch (行 561-563) + +pi runLoop 的结构(本文件逐行对应): + emit agent_start + pending = getSteeringMessages() # 循环开始前先取一次 + outer: while True: + inner: while hasMoreToolCalls or pending: + turn_start(首轮不发,首轮 turn_start 在 runAgentLoop 入口发) + 注入 pending(message_start/end → 入 context + newMessages) + assistant = streamAssistantResponse(...) + if stopReason in (error, aborted): turn_end + agent_end + return + toolCalls = assistant 的 toolCall 块 + if toolCalls: + length → failToolCallsFromTruncatedMessage(不执行!) + 否则 → executeToolCalls(sequential/parallel 二选一) + hasMoreToolCalls = !batch.terminate + toolResults 入 context + newMessages + turn_end + prepareNextTurn 钩子(可换 context/model) + shouldStopAfterTurn 钩子 → agent_end + return + pending = getSteeringMessages() # 每轮结束取一次 + followUps = getFollowUpMessages() + if followUps: pending = followUps; continue # 外层续跑 + break + agent_end +""" +from __future__ import annotations + +from concurrent.futures import ThreadPoolExecutor +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, List, Optional, Tuple + +from .context import clamp_max_tokens_to_context +from .tools import (PreparedToolCall, execute_tool_call, fail_tool_calls_from_truncated_message, + prepare_tool_calls) +from .types import (AgentConfig, AgentError, AgentEvent, AgentMessage, + AgentTool, AgentToolResult, AbortSignal, AssistantMessageEvent, + RunResult, ToolCall, new_id) + + +# ====================================================================== +# 事件发射辅助 +# ====================================================================== +def _emit(agent, event: AgentEvent): + agent._emit(event) + + +def _message_events(agent, msg: AgentMessage): + _emit(agent, AgentEvent(type="message_start", message=msg)) + _emit(agent, AgentEvent(type="message_end", message=msg)) + + +def _tool_result_message(finalized: Dict[str, Any]) -> AgentMessage: + """对照 createToolResultMessage""" + tc: ToolCall = finalized["tool_call"] + result: AgentToolResult = finalized["result"] + return AgentMessage( + role="toolResult", + tool_call_id=tc.id, + tool_name=tc.name, + content=result.content, + is_error=finalized.get("is_error", False) or result.is_error, + ) + + +# ====================================================================== +# 流式生成一轮助手消息 —— 对照 streamAssistantResponse (行 281-380) +# ====================================================================== +def _stream_turn(agent, current_context: List[AgentMessage], + config: AgentConfig, signal: AbortSignal, + stream_fn: Callable) -> Tuple[AgentMessage, Optional[AgentError]]: + """ + 返回 (assistant_message, error)。 + error 非 None 时 message.stop_reason == "error"。 + """ + # 🌟 pi 同款:流开始前检查中止 → 立即产出 aborted 消息 + if signal.aborted: + msg = AgentMessage(role="assistant", stop_reason="aborted") + agent.state.messages.append(msg) + _message_events(agent, msg) + return msg, None + + # 🌟 系统提示词注入(对照 pi:systemPrompt 放在每次 API 请求头部, + # 不进 state.messages、不占压缩/历史) + if config.system_prompt: + api_context: List[AgentMessage] = [ + AgentMessage(role="system", content=config.system_prompt) + ] + current_context + else: + api_context = current_context + + # 🌟 输出预算钳制(对照 simple-options clampMaxTokensToContext) + # 🆕 P2: 把 system + 工具 schema 传给估算器(对照 pi 传完整 Context), + # 仅在无 usage 锚点分支生效;否则新会话首轮会多预留 ~system+tools 的预算。 + clamped = clamp_max_tokens_to_context( + config.model, current_context, + system_prompt=config.system_prompt or "", tools=config.tools) + if clamped is None: + err = AgentError( + message="上下文溢出:估算输入 token 已超过模型窗口(需要压缩)", + kind="overflow", recoverable=True) + msg = AgentMessage(role="assistant", stop_reason="error", + error_message=err.message) + agent.state.messages.append(msg) + _message_events(agent, msg) + return msg, err + max_tokens, _input_tokens = clamped + + msg = AgentMessage(role="assistant") + agent.state.streaming_message = msg + agent.state.streaming_delta = {} + _emit(agent, AgentEvent(type="message_start", message=msg)) + + raw_tc: Dict[int, Dict[str, str]] = {} # 中止时用于保留部分工具调用(仅展示) + got_final = False + error: Optional[AgentError] = None + + try: + for kind, payload in stream_fn(api_context, config.model, signal, + max_tokens, config.tools): + if kind == "event": + ev = payload + if ev.type == "text_delta": + msg.content = (msg.content or "") + ev.text + agent.state.streaming_delta["text"] = ev.text + _emit(agent, AgentEvent(type="message_update", message=msg, + assistant_message_event=ev)) + elif ev.type == "thinking_delta": + msg.reasoning += ev.text + agent.state.streaming_delta["thinking"] = ev.text + _emit(agent, AgentEvent(type="message_update", message=msg, + assistant_message_event=ev)) + elif ev.type == "toolcall_delta": + slot = raw_tc.setdefault(ev.tool_call_index, + {"id": "", "name": "", "args": ""}) + if ev.tool_call_field == "id": + slot["id"] = ev.tool_call_delta + elif ev.tool_call_field == "name": + slot["name"] += ev.tool_call_delta + else: + slot["args"] += ev.tool_call_delta + _emit(agent, AgentEvent(type="message_update", message=msg, + assistant_message_event=ev)) + else: # final + final: AgentMessage = payload + got_final = True + # 采用权威 final:usage / stop_reason / 解析好的 tool_calls + msg.usage = final.usage + msg.stop_reason = final.stop_reason + msg.tool_calls = final.tool_calls + if not final.content and msg.content: + pass # 以循环侧累积为准(二者一致) + else: + msg.content = final.content if final.content else msg.content + msg.reasoning = final.reasoning or msg.reasoning + except AgentError as e: + error = e + msg.stop_reason = "error" + msg.error_message = e.message + _emit(agent, AgentEvent(type="message_update", message=msg, + assistant_message_event= + AssistantMessageEvent.error(e.message))) + except Exception as e: + from .stream_fn import classify_error + error = classify_error(e) + msg.stop_reason = "error" + msg.error_message = error.message + + if not got_final and error is None: + # 生成器中途结束且无异常 = 中止(流被关闭,pi 同款语义) + msg.stop_reason = "aborted" + # 保留部分工具调用(仅用于 UI 展示;中止后不会执行,也不会进入下次上下文) + for idx in sorted(raw_tc.keys()): + slot = raw_tc[idx] + if slot.get("name"): + msg.tool_calls.append(ToolCall(id=slot.get("id") or new_id("call"), + name=slot["name"], + raw_arguments=slot.get("args", ""))) + if error is None and msg.stop_reason not in ("stop", "length", "aborted"): + msg.stop_reason = "stop" + + # 🌟 兜底(haocode 扩展,pi 无此层):不支持 tools API 的供应商/模型会把 + # 工具调用用文字"演"出来(如 ls)。识别单参工具 bash/read + # 转成真 tool_call 继续执行;write/edit 多参歧义大不兜底。 + if error is None and not msg.tool_calls and msg.content: + from .tools import parse_text_tool_calls + cleaned, txt_calls = parse_text_tool_calls(msg.content) + if txt_calls: + msg.tool_calls = txt_calls + + agent.state.streaming_message = None + agent.state.streaming_delta = {} + agent.state.messages.append(msg) + _emit(agent, AgentEvent(type="message_end", message=msg)) + return msg, error + + +# ====================================================================== +# 工具批量执行 —— 对照 executeToolCalls (行 413-427) +# ====================================================================== +def _should_terminate_batch(finalized: List[Dict[str, Any]]) -> bool: + """对照 shouldTerminateToolBatch: 全部结果都请求 terminate 才终止""" + return len(finalized) > 0 and all( + f["result"].terminate for f in finalized) + + +def _run_prepared_in_pool(prep: PreparedToolCall, assistant: AgentMessage, + config: AgentConfig, signal: AbortSignal, + agent) -> Dict[str, Any]: + """线程池内执行单个工具(对照 parallel 版的 async 闭包)""" + on_update = None + on_timer = None + if agent is not None: + def on_update(partial: str): + _emit(agent, AgentEvent(type="tool_execution_update", + tool_call=prep.tool_call, arg=partial)) + def on_timer(elapsed_i: int, timeout_i: int): + # 🆕 bash 运行中每秒滴一次 → 前端气泡读秒 N/Ts + _emit(agent, AgentEvent(type="tool_execution_timer", + tool_call=prep.tool_call, + arg=(int(elapsed_i), int(timeout_i)))) + result = execute_tool_call(prep, assistant, config, signal, on_update, + on_timer) + finalized = {"tool_call": prep.tool_call, "result": result, + "is_error": result.is_error} + _emit(agent, AgentEvent(type="tool_execution_end", + tool_call=prep.tool_call, result=result, + is_error=result.is_error)) + return finalized + + +def _execute_parallel(current_context, assistant, config, signal, agent, + prepared: List[PreparedToolCall]) -> Dict[str, Any]: + """对照 executeToolCallsParallel:start 事件串行发、准备串行、执行并发、 + 结果消息按原始顺序产出""" + finalized: List[Dict[str, Any]] = [] + pending_futures: List = [] + max_workers = max(1, min(8, len(prepared))) + with ThreadPoolExecutor(max_workers=max_workers, + thread_name_prefix="tool") as pool: + for prep in prepared: + _emit(agent, AgentEvent(type="tool_execution_start", + tool_call=prep.tool_call, + arg=str(prep.args) if prep.args else "")) + if prep.error: + # 准备失败(未知工具/参数非法)→ 立即结果(对照 kind:"immediate") + result = AgentToolResult.text(prep.error, is_error=True) + fin = {"tool_call": prep.tool_call, "result": result, + "is_error": True} + _emit(agent, AgentEvent(type="tool_execution_end", + tool_call=prep.tool_call, result=result, + is_error=True)) + finalized.append(fin) + if signal.aborted: + break + continue + fut = pool.submit(_run_prepared_in_pool, prep, assistant, config, + signal, agent) + pending_futures.append(fut) + if signal.aborted: + # 已提交的任务仍会完成(它们内部检查 signal),不再追加 + pass + for fut in pending_futures: + finalized.append(fut.result()) + + messages: List[AgentMessage] = [] + for fin in finalized: + tr = _tool_result_message(fin) + _message_events(agent, tr) + messages.append(tr) + return {"messages": messages, "terminate": _should_terminate_batch(finalized)} + + +def _execute_sequential(current_context, assistant, config, signal, agent, + prepared: List[PreparedToolCall]) -> Dict[str, Any]: + """对照 executeToolCallsSequential:一次一个,完成一个再下一个""" + finalized: List[Dict[str, Any]] = [] + messages: List[AgentMessage] = [] + for prep in prepared: + _emit(agent, AgentEvent(type="tool_execution_start", + tool_call=prep.tool_call, + arg=str(prep.args) if prep.args else "")) + if not prep.error: + fin = _run_prepared_in_pool(prep, assistant, config, signal, agent) + else: + result = AgentToolResult.text(prep.error, is_error=True) + fin = {"tool_call": prep.tool_call, "result": result, "is_error": True} + _emit(agent, AgentEvent(type="tool_execution_end", + tool_call=prep.tool_call, result=result, + is_error=True)) + finalized.append(fin) + tr = _tool_result_message(fin) + _message_events(agent, tr) + messages.append(tr) + if signal.aborted: + break + return {"messages": messages, "terminate": _should_terminate_batch(finalized)} + + +def execute_tool_calls(current_context, assistant: AgentMessage, + config: AgentConfig, signal: AbortSignal, agent) -> Dict[str, Any]: + """对照 executeToolCalls: 批次里有 sequential 工具 → 整批串行""" + prepared = prepare_tool_calls(assistant, config.tools) + has_sequential = any( + (p.tool and p.tool.execution_mode == "sequential") for p in prepared + if not p.error) + if config.tool_execution == "sequential" or has_sequential: + return _execute_sequential(current_context, assistant, config, signal, + agent, prepared) + return _execute_parallel(current_context, assistant, config, signal, agent, + prepared) + + +# ====================================================================== +# 主循环 —— 对照 runLoop (行 163-278) +# ====================================================================== +def run_loop(agent, new_message: Optional[AgentMessage], signal: AbortSignal, + stream_fn: Callable) -> RunResult: + config = agent.config + new_messages: List[AgentMessage] = [] + + # 入口校验(对照 runAgentLoopContinue 的前置检查由 Agent 层负责) + _emit(agent, AgentEvent(type="agent_start")) + _emit(agent, AgentEvent(type="turn_start")) # 首轮 turn_start(对照行 142/170) + + # context 准备 + transformContext 钩子 + base = list(agent.state.messages) + if config.transform_context: + try: + base = config.transform_context(base) or base + except Exception: + pass + current_context = list(base) + + first_turn = True + pending: List[AgentMessage] = agent._take_steering() + + while True: # outer loop + has_more_tool_calls = True + + while has_more_tool_calls or pending: # inner loop + if not first_turn: + _emit(agent, AgentEvent(type="turn_start")) + else: + first_turn = False + + # ---- 注入 pending 消息(steering / followUp)---- + if pending: + for m in pending: + _message_events(agent, m) + current_context.append(m) + new_messages.append(m) + agent.state.messages.append(m) + pending = [] + + # ---- 🆕 轮中主动压缩检查(haocode 增强,偏离 pi 1:1)---- + # 单条工具输出可能把上下文顶出窗口;发下一次请求前主动检查 + #(与轮首 should_compact 同公式)。compact_fn 返回新列表 + #(发生了压缩)→ 同步循环局部上下文。 + if config.compact_fn is not None and agent.state.messages: + try: + compacted = config.compact_fn(list(agent.state.messages)) + if compacted is not None: + agent.state.messages = compacted + current_context = list(compacted) + except Exception: + pass + + # ---- 流式生成助手消息 ---- + assistant, error = _stream_turn(agent, current_context, config, + signal, stream_fn) + new_messages.append(assistant) + current_context.append(assistant) + + if assistant.stop_reason in ("error", "aborted"): + agent.state.error = error + _emit(agent, AgentEvent(type="turn_end", message=assistant)) + _emit(agent, AgentEvent(type="agent_end", + stop_reason=assistant.stop_reason, + error=error, + messages=new_messages)) + agent._finish_run(new_messages, assistant.stop_reason, error) + return RunResult(stop_reason=assistant.stop_reason, error=error, + message_count=len(new_messages)) + + # ---- 工具调用 ---- + tool_results: List[AgentMessage] = [] + has_more_tool_calls = False + if assistant.tool_calls: + if assistant.stop_reason == "length": + # 🌟 截断保护(对照行 212-213):参数可能残缺,一律失败不执行 + fail_msgs = fail_tool_calls_from_truncated_message( + assistant, "length") + # 事件流与正常执行对齐 + for tc, tr in zip(assistant.tool_calls, fail_msgs): + _emit(agent, AgentEvent(type="tool_execution_start", + tool_call=tc)) + res = AgentToolResult.text( + f'工具调用 "{tc.name}" 未执行:输出达到 token 上限,' + f'参数可能被截断。请用完整参数重新发起。', is_error=True) + _emit(agent, AgentEvent(type="tool_execution_end", + tool_call=tc, result=res, + is_error=True)) + _message_events(agent, tr) + batch = {"messages": fail_msgs, "terminate": False} + else: + batch = execute_tool_calls(current_context, assistant, config, + signal, agent) + tool_results = batch["messages"] + has_more_tool_calls = not batch["terminate"] + for r in tool_results: + current_context.append(r) + new_messages.append(r) + agent.state.messages.append(r) + + _emit(agent, AgentEvent(type="turn_end", message=assistant)) + + # ---- prepareNextTurn 钩子 ---- + if config.prepare_next_turn: + try: + snap = config.prepare_next_turn({ + "message": assistant, "tool_results": tool_results, + "context": current_context, "new_messages": new_messages, + }) + if snap: + current_context = snap.get("context") or current_context + except Exception: + pass + + # ---- shouldStopAfterTurn 钩子 ---- + if config.should_stop_after_turn: + try: + if config.should_stop_after_turn({ + "message": assistant, "tool_results": tool_results, + "context": current_context, + "new_messages": new_messages}): + stop = _last_assistant_stop(new_messages) + _emit(agent, AgentEvent(type="agent_end", + stop_reason=stop, + messages=new_messages)) + agent._finish_run(new_messages, stop, None) + return RunResult(stop_reason=stop, + message_count=len(new_messages)) + except Exception: + pass + + # ---- 每轮结束取 steering ---- + pending = agent._take_steering() + + # ---- 外层:followUp ---- + follow_ups = agent._take_follow_ups() + if follow_ups: + pending = follow_ups + continue + break + + stop = _last_assistant_stop(new_messages) + _emit(agent, AgentEvent(type="agent_end", stop_reason=stop, + messages=new_messages)) + agent._finish_run(new_messages, stop, None) + return RunResult(stop_reason=stop, message_count=len(new_messages)) + + +def _last_assistant_stop(new_messages: List[AgentMessage]) -> str: + """对照 pi: agent_end 不携带 stopReason,会话层从最后一条 assistant 消息读取""" + for m in reversed(new_messages): + if m.role == "assistant": + return m.stop_reason or "stop" + return "stop" diff --git a/core/agent/recovery.py b/core/agent/recovery.py new file mode 100644 index 0000000..3eb6a82 --- /dev/null +++ b/core/agent/recovery.py @@ -0,0 +1,519 @@ +""" +core/agent/recovery.py +====================== +🌟 pi 会话层恢复逻辑的 Python 1:1 移植 + +对照 pi-main 源码: + packages/coding-agent/src/core/agent-session.ts + _runAgentPrompt (行 1074): prompt → while _handlePostAgentRun(): continue() + _handlePostAgentRun (行 1088): 基于「最后一条 assistant 消息」的三路决策 + _prepareRetry (行 2811): 计数 → 移除坏消息 → 退避睡眠 + _isRetryableError (行 2770): 溢出交给压缩;其余走重试判定 + _checkCompaction (行 ~2034): 溢出压缩恢复(只试一次) + packages/ai/src/utils/retry.ts + isRetryableAssistantError (行 223) + 可重试/不可重试正则模式表 + 退避: baseDelayMs × 2^(attempt-1)(默认 2s, 4s, 8s;maxRetries 默认 3) + packages/ai/src/utils/overflow.ts + isContextOverflow (行 134):三种溢出识别 + isRecoverableLength:length 且 output < 原始输出上限 + +🌟 决策表(与 pi 完全一致,基于最后一条 assistant 消息): + (1) stop_reason=="error": + a. 是上下文溢出 → 删除坏消息 + 压缩 + continue(只试一次) + b. 命中可重试模式(429/5xx/超时/断连…且非配额耗尽) + 且未超 maxRetries → 删除坏消息 + 退避(2s×2^(n-1)) + continue + c. 其他 → 结束 + (2) isRecoverableLength(length 且实际输出 < 原始 maxTokens, + 说明是被上下文窗口挤断而非输出上限截断)且未尝试过 + → 删除该助手消息 + 压缩 + continue(只试一次) + (3) 队列里还有 followUp/steering → continue(续跑) + (4) 都不满足 → settle +""" +from __future__ import annotations + +import os +import re +import time +from typing import Callable, Optional + +from .compaction import CompactionSettings, _content_text, compact_context +from .context import estimate_context_tokens, should_compact +from .types import (AgentMessage, AgentConfig, RetryConfig, RunResult) + + +# ========== 压缩诊断日志(与 main_window.diag_log 同一规范: +# [HH:MM:SS.mmm] 时间戳 + 项目根目录追加 + UTF-8 + 失败静默) ========== +_COMPACT_LOG_PATH = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "compaction_diag.log") + + +def compact_diag_log(line: str): + """压缩日志只记录:同一行内容 print(控制台)+ 追加写 compaction_diag.log""" + t = time.time() + stamp = (f"[{time.strftime('%H:%M:%S', time.localtime(t))}" + f".{int(t * 1000) % 1000:03d}]") + print(f"{stamp} {line}", flush=True) + try: + with open(_COMPACT_LOG_PATH, "a", encoding="utf-8") as f: + f.write(f"{stamp} {line}\n") + except Exception: + pass + + +def _settings_of(cfg: AgentConfig) -> CompactionSettings: + """AgentConfig 压缩参数 → CompactionSettings(1:1 映射 pi settings 字段)""" + return CompactionSettings(reserve_tokens=cfg.compaction_reserve, + keep_recent_tokens=cfg.compaction_keep_recent) + + +def _cut_ids_of(msgs: list, new_msgs: list) -> tuple: + """🆕 压缩持久化切点:new_msgs = [摘要] + 保留尾巴(旧 msgs 的连续后缀)。 + 按 identity 定位尾巴起点 → (cut_before_id, first_retained_id)(DB 行 id)。 + + ⚠️ 行粒度:同一 DB 行(assistant timeline)会被 build_api_context 回放成 + 多条 API 消息(asst/tool 条目共享同一 _db_msg_id)。若尾巴起点落在某行 + 回放序列中间,必须回退到该行第一条,否则 cut_before 与 first_retained + 会是同一行 → DB 自环(链死循环卡死)。 + 回退后下一轮会从该行完整重放(保守方向,宁多勿漏)。 + 任一为空 = 无法在 DB 链上切(如尾巴全是轮中内存消息)→ UI 不插标记。""" + if not new_msgs or getattr(new_msgs[0], "kind", None) != "compaction_summary": + return "", "" + tail = new_msgs[1:] + if not tail: + return "", "" + first = tail[0] + for i, m in enumerate(msgs): + if m is first: + # 回退到同一 DB 行回放序列的头部 + fid = getattr(first, "db_msg_id", "") or "" + j = i + while j > 0 and fid and getattr(msgs[j - 1], "db_msg_id", "") == fid: + j -= 1 + if j == 0: + return "", "" # 没有“之前”的行 → 无切点 + return (getattr(msgs[j - 1], "db_msg_id", "") or "", + getattr(first, "db_msg_id", "") or "") + return "", "" # 尾巴首条不在旧列表(不应发生)→ 不插标记 + +# ====================================================================== +# 对照 retry.ts 的模式表(原样移植) +# ====================================================================== +_NON_RETRYABLE_LIMIT_RE = re.compile( + r"GoUsageLimitError|FreeUsageLimitError|" + r"Monthly usage limit reached|available balance|" + r"insufficient_quota|out of budget|quota exceeded|billing", + re.IGNORECASE, +) + +_RETRYABLE_RE = re.compile( + r"overloaded|rate.?limit|too many requests|429|500|502|503|504|524|" + r"service.?unavailable|server.?error|internal.?error|" + r"provider.?returned.?error|exceeded request buffer limit while retrying upstream|" + r"network.?error|connection.?error|connection.?refused|connection.?lost|" + r"other side closed|fetch failed|getaddrinfo|ENOTFOUND|EAI_AGAIN|" + r"upstream.?connect|reset before headers|socket hang up|timeout|timed?\s?out", + re.IGNORECASE, +) + +# 对照 overflow.ts OVERFLOW_PATTERNS(各服务商话术) +_OVERFLOW_RE = re.compile( + r"context\s*window|prompt is too long|maximum context|too many tokens|" + r"context length|exceeds the (model|maximum) context|" + r"maximum context length is \d+ tokens|exceeds the maximum allowed input length|" + r"longer than the model's context length|exceeds the available context size|" + r"greater than the context length|exceeded model token limit|" + r"Range of input length should be|configured context size|" + r"长于|超出.*上下文|上下文.*(超出|超过|不足)", + re.IGNORECASE, +) + +# 限速类不是溢出(对照 overflow.ts NON_OVERFLOW_PATTERNS 的判定意图) +_NON_OVERFLOW_RE = re.compile( + r"rate.?limit|too many requests|429|overloaded", re.IGNORECASE) + + +# ====================================================================== +# 判定函数(对照 pi overflow.ts / retry.ts,基于 assistant 消息) +# ====================================================================== +def is_context_overflow(message: AgentMessage, + context_window: int = 0) -> bool: + """ + 对照 isContextOverflow 的三种情形: + 1. error + 消息文本命中溢出模式(且不是限速类) + 2. 静默溢出:stop 但 usage.input > contextWindow(z.ai 风格) + 3. 服务端截断式溢出:length 且 output==0 且 input ≥ 0.99×窗口 + """ + if message.role != "assistant": + return False + if message.stop_reason == "error" and message.error_message: + if not _NON_OVERFLOW_RE.search(message.error_message) \ + and _OVERFLOW_RE.search(message.error_message): + return True + usage = message.usage or {} + input_tokens = int(usage.get("input", 0) or 0) + int(usage.get("cacheRead", 0) or 0) + if context_window and message.stop_reason == "stop": + if input_tokens > context_window: + return True + if context_window and message.stop_reason == "length" \ + and int(usage.get("output", 0) or 0) == 0: + if input_tokens >= context_window * 0.99: + return True + return False + + +def is_retryable_assistant_error(message: AgentMessage) -> bool: + """对照 isRetryableAssistantError:基于 errorMessage 文本模式""" + if message.role != "assistant" or message.stop_reason != "error": + return False + if not message.error_message: + return False + if _NON_RETRYABLE_LIMIT_RE.search(message.error_message): + return False + return bool(_RETRYABLE_RE.search(message.error_message)) + + +def is_recoverable_length(message: AgentMessage, + desired_max_output: int) -> bool: + """ + 对照 pi isRecoverableLength: + length 停止 且 实际输出 < 「原始输出上限」(钳制前的 maxTokens)。 + """ + if message.role != "assistant" or message.stop_reason != "length": + return False + if desired_max_output <= 0: + return False + out = int((message.usage or {}).get("output", 0) or 0) + return out < desired_max_output + + +def compute_retry_delay_ms(attempt: int, cfg: RetryConfig) -> float: + """对照 pi _prepareRetry: baseDelayMs × 2^(attempt-1)(无抖动、默认无封顶)""" + delay = cfg.base_delay_ms * (cfg.factor ** (attempt - 1)) + if cfg.max_delay_ms and delay > cfg.max_delay_ms: + delay = cfg.max_delay_ms + return float(delay) + + +def find_last_assistant(messages) -> Optional[AgentMessage]: + """对照 agent-session _findLastAssistantMessage""" + for m in reversed(messages): + if m.role == "assistant": + return m + return None + + +# ====================================================================== +# 编排器 —— 对照 agent-session 的 run 循环 +# ====================================================================== +class AgentRunner: + """ + 对照 agent-session.ts 的 run 编排(agent 之外的「会话层」)。 + haocode 里由 AgentWorker(QThread) 持有一个 AgentRunner。 + + summarize_fn(transcript) -> str:压缩用的非流式 LLM 调用(缺省 → 禁压缩)。 + """ + + def __init__(self, agent: Agent, + summarize_fn: Optional[Callable[[str], str]] = None, + on_retry_scheduled: Optional[Callable] = None, + on_retry_finished: Optional[Callable] = None, + on_compaction_started: Optional[Callable] = None, + on_compaction_finished: Optional[Callable] = None): + self.agent = agent + self.summarize_fn = summarize_fn + # 🆕 M3: 重试回调(对照 pi retryAssistantCall 的 + # onRetryScheduled / onRetryFinished)——UI 可提示「正在重试」 + self.on_retry_scheduled = on_retry_scheduled + self.on_retry_finished = on_retry_finished + # 🆕 压缩开始回调(摘要 LLM 调用阻塞前触发)——UI 显示「执行中」动态气泡 + self.on_compaction_started = on_compaction_started + # 🆕 压缩完成回调(压缩结束瞬间触发,不等整轮 run 结束) + # ——前端气泡即时定格「已完成上下文压缩」(与思考块定格同款时机) + self.on_compaction_finished = on_compaction_finished + self._overflow_recovered = False # 对照 _overflowRecoveryAttempted + self._retry_attempt = 0 # 对照 _retryAttempt + self.last_action = "none" # 诊断: none/retry/overflow_compact/length_compact/queued + self.compactions_performed = 0 # 成功压缩次数(UI 提示用) + # 🆕 压缩事件队列(UI 气泡用:摘要全文/前后 token/耗时/路径) + self.compaction_events: list = [] + # 🆕 轮中主动压缩护栏(同一 run 内;AgentRunner 每轮新建 → 自动复位) + self._mid_turn_fail_streak = 0 + self._mid_turn_exhausted = False + + # ------------------------------------------------------------------ + # 发送前压缩(🌟 1:1 对照 pi shouldCompact:tokens > window - reserveTokens) + # ------------------------------------------------------------------ + def pre_prompt_compaction(self) -> bool: + if self.summarize_fn is None: + return False + cfg = self.agent.config + msgs = self.agent.state.messages + m = cfg.model + # 🆕 G2: 透传 system_prompt/tools —— 无锚点时度量「下一请求真实载荷」 + should, tokens = should_compact(msgs, m, cfg.compaction_reserve, + system_prompt=cfg.system_prompt, + tools=cfg.tools) + # 🆕 每次请求前的校验:print + 写 compaction_diag.log(触发与否都记) + compact_diag_log( + f"[PRE_CHECK] model={m.name} window={m.context_window} " + f"reserve={cfg.compaction_reserve} " + f"threshold={m.context_window - cfg.compaction_reserve} " + f"est={tokens} triggered={str(should).lower()}") + if not should: + return False + self._notify_compaction_started("pre_prompt", tokens) + t0 = time.time() + new_msgs = compact_context(msgs, cfg.model, self.summarize_fn, + settings=_settings_of(cfg)) + if new_msgs is not None: + cut_before, first_retained = _cut_ids_of(msgs, new_msgs) + self.agent.state.messages = new_msgs + self.compactions_performed += 1 + self._record_compaction("pre_prompt", tokens, new_msgs, t0, + cut_before_id=cut_before, + first_retained_id=first_retained) + return True + self._record_compaction_failed("pre_prompt", tokens, t0) + return False + + # ------------------------------------------------------------------ + # 🆕 轮中主动压缩(haocode 增强,偏离 pi 1:1) + # ------------------------------------------------------------------ + def compact_if_needed(self, msgs: list) -> Optional[list]: + """接线到 AgentConfig.compact_fn:内层循环每次 LLM 请求前调用。 + + 与轮首 pre_prompt_compaction 同公式(tokens > window − reserve)。 + 轮中单条工具输出可把上下文顶出窗口(轮中内存工具结果没有 + 4000 字回放上限),发请求前主动压缩,避免「一次失败往返 + + 响应式兜底」。返回新消息列表(发生了压缩)或 None(不需要/ + 不可压缩 → 原样发请求,响应式 overflow 安全网仍在)。 + + 防刷屏护栏:同一 run 内连续失败 2 次后不再尝试(形状无有效 + 切点,如单条巨型条目,硬试无意义);成功则复位计数。 + """ + if self.summarize_fn is None or self._mid_turn_exhausted: + return None + cfg = self.agent.config + m = cfg.model + # 🆕 G2: 透传 system_prompt/tools(与轮首同口径) + should, tokens = should_compact(msgs, m, cfg.compaction_reserve, + system_prompt=cfg.system_prompt, + tools=cfg.tools) + compact_diag_log( + f"[PRE_CHECK] path=mid_turn est={tokens} " + f"threshold={m.context_window - cfg.compaction_reserve} " + f"triggered={str(should).lower()}") + if not should: + return None + if self._do_compaction("mid_turn", msgs=msgs): + self._mid_turn_fail_streak = 0 + return list(self.agent.state.messages) + self._mid_turn_fail_streak += 1 + if self._mid_turn_fail_streak >= 2: + self._mid_turn_exhausted = True + compact_diag_log( + "[PRE_CHECK] path=mid_turn exhausted " + "(连续 2 次失败,本轮不再尝试)") + return None + + # ------------------------------------------------------------------ + # 主入口 —— 对照 _runAgentPrompt + # ------------------------------------------------------------------ + def run(self, message) -> RunResult: + self.pre_prompt_compaction() + self._overflow_recovered = False + self._retry_attempt = 0 + result = self.agent.prompt(message) + return self._post_loop(result) + + def _post_loop(self, result: RunResult) -> RunResult: + # 对照: while (await this._handlePostAgentRun()) await this.agent.continue() + while True: + action = self._handle_post_agent_run(result) + if action == "stop": + return result + if action == "retry": + result = self.agent.continue_() + # 🆕 M3: 重试结果回调(成功 = 下一轮未以 error/aborted 收尾) + if self.on_retry_finished is not None: + la = find_last_assistant(self.agent.state.messages) + ok = (la is not None + and la.stop_reason not in ("error", "aborted")) + try: + self.on_retry_finished(bool(ok)) + except Exception: + pass + continue + if action == "compact_retry": + if not (self._remove_last_bad_assistant() + and self._do_compaction(self.last_action)): + return result # 压缩不可用 → 放弃,交 UI 报错 + result = self.agent.continue_() + continue + if action == "queued": + result = self.agent.continue_() + continue + return result + + # ------------------------------------------------------------------ + # 三路决策 —— 对照 _handlePostAgentRun + # ------------------------------------------------------------------ + def _handle_post_agent_run(self, result: RunResult) -> str: + msg = find_last_assistant(self.agent.state.messages) + if msg is None: + return "stop" + cfg = self.agent.config + + # (1) 错误路径 + if msg.stop_reason == "error": + # a. 溢出 → 压缩恢复(只试一次) + if is_context_overflow(msg, cfg.model.context_window) \ + and not self._overflow_recovered \ + and self.summarize_fn is not None: + self._overflow_recovered = True + self.last_action = "overflow_compact" + return "compact_retry" + # b. 可重试错误 → 移除坏消息 + 退避 + continue + if is_retryable_assistant_error(msg) \ + and self._prepare_retry(cfg.retry, + reason=msg.error_message or ""): + self.last_action = "retry" + return "retry" + return "stop" + + # (2) 可恢复的 length 截断 + if is_recoverable_length(msg, cfg.model.max_tokens) \ + and not self._overflow_recovered \ + and self.summarize_fn is not None: + self._overflow_recovered = True + self.last_action = "length_compact" + return "compact_retry" + + # (3) 队列里还有消息 → 续跑 + if self.agent.has_queued(): + self.last_action = "queued" + return "queued" + + # (4) settle + return "stop" + + # ------------------------------------------------------------------ + # 对照 _prepareRetry:计数 → 移除坏消息 → 退避睡眠 + # ------------------------------------------------------------------ + def _prepare_retry(self, cfg: RetryConfig, reason: str = "") -> bool: + if self._retry_attempt >= cfg.max_attempts: + return False + self._retry_attempt += 1 + delay_ms = compute_retry_delay_ms(self._retry_attempt, cfg) + # 移除错误助手消息(对照: messages.slice(0,-1),会话历史保留由 UI 层负责) + messages = self.agent.state.messages + if messages and messages[-1].role == "assistant": + self.agent.state.messages = messages[:-1] + # 🆕 M3: 通知重试已调度(参数: attempt, max_attempts, delay_ms, reason) + if self.on_retry_scheduled is not None: + try: + self.on_retry_scheduled(self._retry_attempt, cfg.max_attempts, + delay_ms, reason) + except Exception: + pass + time.sleep(delay_ms / 1000.0) + return True + + # ------------------------------------------------------------------ + # 压缩恢复辅助 + # ------------------------------------------------------------------ + def _remove_last_bad_assistant(self) -> bool: + msgs = self.agent.state.messages + if msgs and msgs[-1].role == "assistant" \ + and msgs[-1].stop_reason in ("length", "error"): + self.agent.state.messages = msgs[:-1] + return True + return False + + def _do_compaction(self, path: str = "reactive", + msgs: Optional[list] = None) -> bool: + if self.summarize_fn is None: + return False + cfg = self.agent.config + if msgs is None: + msgs = self.agent.state.messages + tokens_before = estimate_context_tokens(msgs).tokens + self._notify_compaction_started(path, tokens_before) + t0 = time.time() + new_msgs = compact_context(msgs, cfg.model, self.summarize_fn, + settings=_settings_of(cfg)) + if new_msgs is not None: + cut_before, first_retained = _cut_ids_of(msgs, new_msgs) + self.agent.state.messages = new_msgs + self.compactions_performed += 1 + self._record_compaction(path, tokens_before, new_msgs, t0, + cut_before_id=cut_before, + first_retained_id=first_retained) + return True + self._record_compaction_failed(path, tokens_before, t0) + return False + + # ------------------------------------------------------------------ + # 🆕 压缩可视化辅助:开始/完成 两阶段(print + 日志 + 事件供 UI 气泡) + # ------------------------------------------------------------------ + def _notify_compaction_started(self, path: str, tokens_before: int) -> None: + compact_diag_log(f"[COMPACT_START] path={path} before={tokens_before}") + if self.on_compaction_started is not None: + try: + self.on_compaction_started(path) + except Exception: + pass + + def _record_compaction_failed(self, path: str, tokens_before: int, + t0: float) -> None: + """压缩不可行(如历史无法切分)→ 气泡显示失败原因,不能永远卡在「执行中」""" + duration_ms = int((time.time() - t0) * 1000) + compact_diag_log( + f"[COMPACT_FAIL] path={path} before={tokens_before} " + f"duration_ms={duration_ms}") + ev = { + "summary": "本次压缩未能执行(历史无法切分),继续以原有历史对话。", + "before": tokens_before, + "after": tokens_before, + "duration_ms": duration_ms, + "path": path, + "failed": True, + } + self.compaction_events.append(ev) + if self.on_compaction_finished is not None: + try: + self.on_compaction_finished(dict(ev)) + except Exception: + pass + + def _record_compaction(self, path: str, tokens_before: int, + new_msgs: list, t0: float, + cut_before_id: str = "", + first_retained_id: str = "") -> None: + summary = "" + if new_msgs and getattr(new_msgs[0], "kind", None) == "compaction_summary": + summary = _content_text(new_msgs[0].content) or "" + tokens_after = estimate_context_tokens(new_msgs).tokens + duration_ms = int((time.time() - t0) * 1000) + compact_diag_log( + f"[COMPACT_DONE] path={path} before={tokens_before} " + f"after={tokens_after} summary_chars={len(summary)} " + f"duration_ms={duration_ms} " + f"cut_before={cut_before_id or '-'} first_retained={first_retained_id or '-'}") + ev = { + "summary": summary, + "before": tokens_before, + "after": tokens_after, + "duration_ms": duration_ms, + "path": path, + # 🆕 压缩持久化切点:UI 收到后在 DB 链上插标记行(两者齐备才插) + "cut_before_id": cut_before_id, + "first_retained_id": first_retained_id, + } + self.compaction_events.append(ev) + if self.on_compaction_finished is not None: + try: + self.on_compaction_finished(dict(ev)) + except Exception: + pass diff --git a/core/agent/stream_fn.py b/core/agent/stream_fn.py new file mode 100644 index 0000000..d3c61b2 --- /dev/null +++ b/core/agent/stream_fn.py @@ -0,0 +1,438 @@ +""" +core/agent/stream_fn.py +======================= +🌟 pi-ai 流式接口的 Python 1:1 移植 —— OpenAI 兼容(含 vLLM) + +对照 pi-main 源码: + packages/ai/src/api/openai-completions.ts + - streamSimple() (行 469 起): 消费 SSE chunk → 产出 AssistantMessage + - buildParams() (行 536 起): 组装请求体 + * vLLM/OpenAI 默认字段名 = max_completion_tokens + * 少数服务商(chutes/deepseek/moonshot 等)用 max_tokens + - mapStopReason(): finish_reason "length" → stopReason "length" + packages/ai/src/api/simple-options.ts + - buildBaseOptions(): maxTokens = options?.maxTokens ?? model.maxTokens + (即模型定义里的 maxTokens 一定会进入请求体,这就是它被发给 vLLM 的原因) + +本文件职责: + 1. to_openai_messages() —— pi 消息格式 → OpenAI API 格式(每轮调用前转换) + 2. openai_stream() —— 流式请求,逐 chunk 产出 AssistantMessageEvent, + 结束产出最终 AgentMessage(含 usage / stop_reason / tool_calls) + 3. classify_error() —— 异常分类(对照 pi isRetryable 的输入) + +🌟 修复 haocode 原有 P1 bug:openai 客户端带 timeout(原来无超时, + 挂死的流会让线程永久阻塞)。max_retries=0(重试统一交给 recovery 层, + 与 pi 一致:网络层不重试,会话层按 1600ms×1.6^n 退避重试)。 +""" +from __future__ import annotations + +import json +from typing import Any, Dict, Iterator, List, Optional, Tuple + +from openai import OpenAI +from openai import APIConnectionError, APIStatusError, APITimeoutError, RateLimitError + +from .types import (AgentError, AgentMessage, AssistantMessageEvent, + AbortSignal, ModelConfig, ToolCall, new_id) + + +# ====================================================================== +# pi 消息 → OpenAI 消息(每轮发送前调用) +# ====================================================================== +def to_openai_messages(context: List[AgentMessage], + pass_reasoning: bool = True) -> List[Dict[str, Any]]: + """pi 消息 → OpenAI chat 格式。 + 🆕 thinking 模式(DeepSeek 等):assistant 消息必须把 reasoning_content + 原样回传,否则服务端 400 + ('The reasoning_content in the thinking mode must be passed back to the API')。 + 默认开启:轮中续问/工具回灌场景,内存里本轮刚流式产出的 assistant 带 + reasoning → 回传;DB 回放的旧行 reasoning=""(不入库)→ 无该字段, + 跨轮全新请求不受影响。pass_reasoning=False 显式关闭(特殊网关逃生阀)。 + """ + out: List[Dict[str, Any]] = [] + for m in context: + if m.role == "system": + # 只放行请求头部的系统提示词(loop 注入); + # 历史中间出现的 system(DB 防御)仍然跳过 + if not out: + out.append({"role": "system", "content": m.content}) + continue + if m.role == "toolResult": + out.append({ + "role": "tool", + "tool_call_id": m.tool_call_id, + "content": m.content if isinstance(m.content, str) + else "".join(c.get("text", "") for c in m.content + if isinstance(c, dict)), + }) + continue + if m.role == "assistant": + entry: Dict[str, Any] = {"role": "assistant"} + # 纯工具调用轮:content 可能为空 → 用 ""(vLLM 接受,避免 null 报错) + entry["content"] = m.content if m.content else "" + if m.tool_calls: + entry["tool_calls"] = [ + { + "id": tc.id, + "type": "function", + "function": { + "name": tc.name, + "arguments": json.dumps(tc.arguments, ensure_ascii=False) + if tc.arguments else tc.raw_arguments or "{}", + }, + } + for tc in m.tool_calls + ] + if pass_reasoning and m.reasoning: + entry["reasoning_content"] = m.reasoning + out.append(entry) + continue + # user(content 可以是 str 或 OpenAI 多模态 list,原样透传) + out.append({"role": "user", "content": m.content}) + return out + + +# ====================================================================== +# 异常分类 —— 对照 pi isRetryable / retryable error 判定 +# ====================================================================== +def classify_error(e: Exception) -> AgentError: + """把 openai SDK 异常分类,恢复层据此决定重试/放弃。""" + if isinstance(e, RateLimitError): + return AgentError(message=str(e), kind="rate_limit", + status_code=429, recoverable=True) + if isinstance(e, APITimeoutError): + return AgentError(message=f"请求超时: {e}", kind="timeout", recoverable=True) + if isinstance(e, APIConnectionError): + return AgentError(message=f"连接失败: {e}", kind="connection", recoverable=True) + if isinstance(e, APIStatusError): + code = e.status_code + msg = str(e) + if code in (502, 503, 504): + return AgentError(message=msg, kind="server_error", + status_code=code, recoverable=True) + if code == 529: + return AgentError(message=msg, kind="overload", + status_code=code, recoverable=True) + if code == 408: + return AgentError(message=msg, kind="timeout", + status_code=code, recoverable=True) + if code in (401, 403): + return AgentError(message=msg, kind="auth", + status_code=code, recoverable=False) + # 4xx(参数错误/模型不存在/上下文超长等)不可重试,交恢复层细分 + return AgentError(message=msg, kind="unknown", + status_code=code, recoverable=False) + if isinstance(e, (ConnectionError, TimeoutError)): + return AgentError(message=str(e), kind="connection", recoverable=True) + return AgentError(message=str(e), kind="unknown", recoverable=False) + + +# ====================================================================== +# 🆕 M1/M2: 流式字段提取(对照 pi openai-completions.ts 的字段优先级) +# ====================================================================== +# 🆕 M1: 1:1 对照 pi chunk 级 reasoning 字段优先级(llama.cpp/vLLM/OpenRouter 各不同) +_REASONING_FIELDS = ("reasoning_content", "reasoning", "reasoning_text") + + +def _pick_reasoning(delta) -> str: + """从 delta 上取第一个非空思考字段(只取一个,防同内容多字段重复计)""" + if delta is None: + return "" + dump = None + for name in _REASONING_FIELDS: + v = getattr(delta, name, None) + if v is None and dump is None and hasattr(delta, "model_dump"): + try: + dump = delta.model_dump() + except Exception: + dump = {} + if v is None and isinstance(dump, dict): + v = dump.get(name) + if v: + return str(v) + return "" + + +def _pick_usage(chunk): + """🆕 M2: 对照 pi:先 chunk.usage,再 choices[0].usage(Moonshot 系只放 choice 里)""" + u = getattr(chunk, "usage", None) + if u is not None: + return u + try: + choices = getattr(chunk, "choices", None) + if choices: + return getattr(choices[0], "usage", None) + except Exception: + pass + return None + + +# ====================================================================== +# 流式请求核心 —— 对照 openai-completions.ts streamSimple +# ====================================================================== +def openai_stream(context: List[AgentMessage], + model: ModelConfig, + signal: AbortSignal, + max_tokens: int, + tools: Optional[List[Any]] = None, + ) -> Iterator[Tuple[str, Any]]: + """ + 生成器协议(对照 pi streamSimple 的 for-await 消费方式): + yield ("event", AssistantMessageEvent) # 增量事件(text/thinking/toolcall/done) + yield ("final", AgentMessage) # 最终助手消息(含 stop_reason/usage) + 异常统一转 AgentError 抛出(由循环层捕获 → stop_reason="error")。 + + 🌟 中止语义与 pi 一致:每个 chunk 边界检查 signal.aborted, + 命中即关闭流、以 stop_reason="aborted" 收尾(不是 error)。 + """ + client = OpenAI( + api_key=model.api_key or "EMPTY", + base_url=model.base_url, + # 🌟 P1 修复:显式超时(pi 侧由 fetch timeout 保证) + timeout=model.timeout_seconds, + max_retries=0, # 重试统一由 recovery 层负责 + ) + + params: Dict[str, Any] = { + "model": model.name, + "messages": to_openai_messages(context, model.pass_reasoning), + "stream": True, + "stream_options": {"include_usage": True}, # 拿真实 usage(pi 同款) + "temperature": model.temperature, + } + # 对照 pi buildParams:默认 max_completion_tokens(vLLM 兼容) + if getattr(model, "use_max_tokens_field", False): + params["max_tokens"] = max_tokens + else: + params["max_completion_tokens"] = max_tokens + + # 🌟 工具定义(对照 pi buildParams 的 tools 段)——不发给模型, + # 模型就不可能发出真正的 tool_call,只会用文字"演"工具调用! + if tools: + params["tools"] = [ + { + "type": "function", + "function": { + "name": t.name, + "description": t.description, + "parameters": t.parameters, + }, + } + for t in tools + ] + + # 累积状态 + content_parts: List[str] = [] + reasoning_parts: List[str] = [] + tc_acc: Dict[int, Dict[str, Any]] = {} # index -> {id, name, args} + finish_reason: Optional[str] = None + usage: Dict[str, Any] = {} + stream = None + + try: + stream = client.chat.completions.create(**params) + for chunk in stream: + # 🌟 pi 同款:chunk 边界检查中止 + if signal.aborted: + finish_reason = "aborted" + try: + stream.close() + except Exception: + pass + break + + # 🆕 M2: usage 读取顺序对照 pi —— chunk.usage 优先,choice.usage 兜底 + usage_obj = _pick_usage(chunk) + if usage_obj is not None: + usage = { + "input": getattr(usage_obj, "prompt_tokens", 0) or 0, + "output": getattr(usage_obj, "completion_tokens", 0) or 0, + "cacheRead": 0, "cacheWrite": 0, + } + if not getattr(chunk, "choices", None): + continue + + choice = chunk.choices[0] + delta = choice.delta + + # 🆕 M1: 思考增量(对照 pi reasoningFields 优先级,含多字段去重) + reasoning = _pick_reasoning(delta) + if reasoning: + yield ("event", AssistantMessageEvent.thinking_delta(reasoning)) + reasoning_parts.append(reasoning) + + if getattr(delta, "content", None): + yield ("event", AssistantMessageEvent.text_delta(delta.content)) + content_parts.append(delta.content) + + # 工具调用增量(按 index 累积 id/name/arguments 三段) + for tc_delta in (getattr(delta, "tool_calls", None) or []): + idx = tc_delta.index or 0 + slot = tc_acc.setdefault(idx, {"id": "", "name": "", "args": ""}) + if tc_delta.id: + slot["id"] = tc_delta.id + yield ("event", AssistantMessageEvent.toolcall_delta( + idx, tc_delta.id, field="id")) + fn = tc_delta.function + if fn is not None: + if fn.name: + slot["name"] += fn.name + yield ("event", AssistantMessageEvent.toolcall_delta( + idx, fn.name, field="name")) + if fn.arguments: + slot["args"] += fn.arguments + yield ("event", AssistantMessageEvent.toolcall_delta( + idx, fn.arguments, field="arguments")) + + if choice.finish_reason: + finish_reason = choice.finish_reason + except Exception as e: + # 中止过程中断网/断流不当错误处理(pi 同款语义) + if signal.aborted: + finish_reason = "aborted" + else: + raise classify_error(e) + finally: + try: + if stream is not None: + stream.close() + except Exception: + pass + + # ---- 组装最终助手消息(对照 mapStopReason + AssistantMessage 构造)---- + # pi mapStopReason: "length"→"length", "stop"/"tool_calls"→"stop", 其余→"stop" + if finish_reason == "aborted": + stop_reason = "aborted" + elif finish_reason == "length": + stop_reason = "length" + else: + stop_reason = "stop" + + tool_calls: List[ToolCall] = [] + for idx in sorted(tc_acc.keys()): + slot = tc_acc[idx] + try: + args = json.loads(slot["args"]) if slot["args"] else {} + except json.JSONDecodeError: + # 参数 JSON 被截断/损坏:保留 raw,arguments 置空, + # 由循环层按「截断保护」路径处理(不执行残缺调用) + args = {} + tool_calls.append(ToolCall( + id=slot["id"] or new_id("call"), + name=slot["name"], + arguments=args, + raw_arguments=slot["args"], + )) + + final = AgentMessage( + role="assistant", + content="".join(content_parts), + reasoning="".join(reasoning_parts), + tool_calls=tool_calls, + stop_reason=stop_reason, + usage=usage, + ) + yield ("event", AssistantMessageEvent.done()) + yield ("final", final) + + +# ====================================================================== +# OpenAI 格式 → pi 格式(from_openai_messages 的逆转换,用于从 DB 装载历史) +# ====================================================================== +def _parse_tool_call(tc: Dict[str, Any]) -> Optional[ToolCall]: + """ + 解析一条 OpenAI tool_call → ToolCall。 + 🌟 参数 JSON 可能残缺(历史里存了被截断的调用): + 解析失败 → arguments={} 且 raw_arguments 兜底成合法 "{}", + 保证 to_openai_messages 回发 API 时参数始终是合法 JSON + (API 只校验 JSON 合法性 + tool_call_id 配对,不校验参数内容)。 + """ + if not isinstance(tc, dict): + return None + fn = tc.get("function") or {} + raw_args = fn.get("arguments") + if not isinstance(raw_args, str): + raw_args = "" if raw_args is None else str(raw_args) + try: + args = json.loads(raw_args) if raw_args else {} + if not isinstance(args, dict): + args = {"_": args} + except (json.JSONDecodeError, TypeError, ValueError): + args = {} + raw_args = "{}" # 残缺 JSON 兜底,防回发 API 时 400 + return ToolCall( + id=tc.get("id") or new_id("call"), + name=fn.get("name") or "", + arguments=args, + raw_arguments=raw_args or "{}", + ) + + +def from_openai_messages(messages: List[Dict[str, Any]]) -> List[AgentMessage]: + """ + 把 OpenAI chat 消息数组转成 pi 的 AgentMessage 列表(全保真)。 + + 🌟 修复:worker 模式此前在此丢失全部工具历史(tool 消息被跳过、 + assistant.tool_calls 不解析)→ 任务完成/中断后再次提问,模型看不到 + 之前读过什么文件、执行过什么命令。现改为无损转换: + - user: content 保持 str 或 OpenAI 多模态 list(原样透传) + - assistant: content + reasoning + tool_calls(纯工具轮保留 tool_calls, + content 置 "",不再变成空 assistant 污染上下文) + - tool: → AgentMessage(role="toolResult", tool_call_id, content) + - system: 防御性跳过(DB 链表里不会出现) + + 下游 to_openai_messages 原生支持 toolResult / assistant.tool_calls, + 与 pi 语义一致,往返(to(from(x)))保真。 + """ + out: List[AgentMessage] = [] + for m in messages: + if not isinstance(m, dict): + continue + role = m.get("role") + content = m.get("content") + + if role == "user": + if content is None: + content = "" + out.append(AgentMessage(role="user", content=content, + # 🆕 压缩持久化:跨轮携带 DB 行 id + 摘要 kind + # (kind=compaction_summary → 二次压缩走迭代更新) + kind=m.get("_kind") or "", + db_msg_id=m.get("_db_msg_id") or "", + timestamp=int(m.get("timestamp") or 0))) + + elif role == "assistant": + # tool_calls 解析(容忍缺失/损坏) + tool_calls: List[ToolCall] = [] + for tc in (m.get("tool_calls") or []): + parsed = _parse_tool_call(tc) + if parsed is not None: + tool_calls.append(parsed) + out.append(AgentMessage( + role="assistant", + content=content if isinstance(content, str) else "", + reasoning=m.get("reasoning") or "", + tool_calls=tool_calls, + stop_reason="stop", + # 🆕 P1: 回放入库的 usage(锚点)+ timestamp(P0 时效校验) + usage=m.get("usage") or {}, + timestamp=int(m.get("timestamp") or 0), + db_msg_id=m.get("_db_msg_id") or "", + )) + + elif role == "tool": + # tool 结果 → toolResult(保留 tool_call_id 供 API 配对) + if content is None: + content = "" + elif not isinstance(content, str): + content = str(content) + out.append(AgentMessage( + role="toolResult", + content=content, + tool_call_id=m.get("tool_call_id") or "", + timestamp=int(m.get("timestamp") or 0), + db_msg_id=m.get("_db_msg_id") or "", + )) + + # 其他 role(system 等)防御性跳过 + return out diff --git a/core/agent/tools.py b/core/agent/tools.py new file mode 100644 index 0000000..66e7aaa --- /dev/null +++ b/core/agent/tools.py @@ -0,0 +1,865 @@ +""" +core/agent/tools.py +=================== +🌟 pi 工具执行管线的 Python 1:1 移植 + 内置工具 + +对照 pi-main 源码: + packages/agent/src/agent-loop.ts + - prepareToolCalls() (行 ~470): 校验参数 → 标记错误(不执行) + - executeTool() (行 ~520): before 钩子 → 执行 → after 钩子 → 结果定型 + - 并行语义: prepare 串行 → 执行并发(Promise.all) → 结果按原始顺序回写 + packages/agent/src/tools/*.ts (coding-agent 内置工具 read/bash/edit/write) + +JSON Schema 校验:pi 用 validate-json-schema + ai/src/utils/validation.ts +(structuredClone → normalizeOptionalNulls → Value.Convert → coerceWithJsonSchema → + 全量错误上报 + 回显收到的参数);这里实现核心子集 +(type/required/properties/enum/items + 可选字段 null 归一化 + 数字/布尔轻量转换), +零外部依赖。工具自定义预处理对照 pi 的 tool.prepareArguments(见 edit 的 legacy 兼容)。 +""" +from __future__ import annotations + +import json +import os +import queue +import re +import subprocess +import sys +import tempfile +import threading +import time +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, List, Optional + +from .types import (AgentMessage, AgentTool, AgentToolResult, AbortSignal, + ToolCall, new_id) +from ..platform_shell import kill_process_tree, popen_flags, shell_command # P1-02 + +try: + from core.debug_log import debug_log as _dbg_log # 🆕 计时观察日志(线程安全/静默) +except Exception: # 导入失败也不影响工具执行 + def _dbg_log(msg, tag="APP"): + pass + + +# ====================================================================== +# JSON Schema 校验(子集) +# ====================================================================== +# ====================================================================== +# 参数归一化 + JSON Schema 校验(子集) +# 对照 pi ai/src/utils/validation.ts:317-347 validateToolArguments: +# structuredClone → normalizeOptionalNulls → Value.Convert +# → coerceWithJsonSchema → Check → 【报全部错误 + 回显收到的参数】 +# 这里实现核心子集(type/required/properties/enum/items),零外部依赖。 +# ====================================================================== +_TYPE_MAP = { + "string": str, + "integer": int, + "number": (int, float), + "boolean": bool, + "array": list, + "object": dict, +} + + +def _norm_types(schema: Dict[str, Any]) -> List[str]: + """schema 声明的类型(兼容 TypeBox 的 type 数组形式)""" + t = schema.get("type") + if isinstance(t, list): + return [x for x in t if isinstance(x, str)] + return [t] if isinstance(t, str) else [] + + +def _type_ok(value: Any, t: str) -> bool: + """类型匹配。🌟 bool 不算 integer/number(python 里 bool 是 int 子类)""" + if t == "integer": + return isinstance(value, int) and not isinstance(value, bool) + if t == "number": + return isinstance(value, (int, float)) and not isinstance(value, bool) + if t == "boolean": + return isinstance(value, bool) + py = _TYPE_MAP.get(t) + return isinstance(value, py) if py else True + + +def _join_path(path: str, key: str) -> str: + return f"{path}.{key}" if path else key + + +def normalize_and_coerce(args: Any, schema: Dict[str, Any]) -> Any: + """归一化 + 轻量强制转换(对照 pi normalizeOptionalNulls + coerceWithJsonSchema) + + - 可选字段的显式 null → 删除该键(模型常对「未用到的参数」发 null) + - 数字字段收到纯数字字符串 → integer/number("30" → 30) + - boolean 字段收到 "true"/"false" → 布尔 + 返回新对象,不修改入参。 + """ + if not isinstance(schema, dict) or not isinstance(args, dict): + return args + props = schema.get("properties") or {} + required = set(schema.get("required") or []) + out: Dict[str, Any] = dict(args) + for key, val in list(out.items()): + sub = props.get(key) + if not isinstance(sub, dict): + continue + if val is None: + if key not in required: + del out[key] + continue + out[key] = _coerce_value(val, sub) + return out + + +def _coerce_value(val: Any, sub: Dict[str, Any]) -> Any: + types = _norm_types(sub) + if isinstance(val, bool) or val is None: + return val + if isinstance(val, str): + s = val.strip() + if s and ("integer" in types or "number" in types): + try: + f = float(s) + if f.is_integer(): + return int(f) + if "number" in types: + return f + return val # integer 字段收到 1.5 → 保持原值(交由校验报错) + except ValueError: + return val + if "boolean" in types and s.lower() in ("true", "false"): + return s.lower() == "true" + return val + if isinstance(val, dict): + return normalize_and_coerce(val, sub) + if isinstance(val, list): + items = sub.get("items") + if isinstance(items, dict): + return [_coerce_value(v, items) if not isinstance(v, dict) + else normalize_and_coerce(v, items) for v in val] + return val + + +def _type_error(path: str, types: List[str], value: Any) -> str: + t = types[0] if types else "object" + if t == "string": + return f"参数 {path} 应为 string" + if t in ("integer", "number") and isinstance(value, bool): + return f"参数 {path} 应为 {t}" + return f"参数 {path} 类型错误: 期望 {t}" + + +def _check_value(value: Any, schema: Dict[str, Any], path: str, + errs: List[str], root: bool = False) -> None: + """递归收集【全部】校验错误(对照 pi Errors() 全量上报)""" + if not isinstance(schema, dict): + return + if root and not isinstance(value, dict): + errs.append(f"参数必须是对象,实际是 {type(value).__name__}") + return + types = _norm_types(schema) or (["object"] if root else []) + if types and not any(_type_ok(value, t) for t in types): + errs.append(_type_error(path, types, value)) + return # 类型不符 → 后续检查无意义 + if "enum" in schema and value not in schema["enum"]: + errs.append(f"参数 {path} 取值必须是 {schema['enum']} 之一") + if isinstance(value, dict): + props = schema.get("properties") or {} + for req in schema.get("required") or []: + if req not in value: + errs.append(f"缺少必填参数: {req}" if root + else f"参数 {path} 缺少必填字段 {req}") + for k, v in value.items(): + if k in props: + _check_value(v, props[k], _join_path(path, k), errs) + elif isinstance(value, list): + items = schema.get("items") + if isinstance(items, dict): + for i, item in enumerate(value): + _check_value(item, items, f"{path}[{i}]", errs) + + +def validate_json_schema(args: Any, schema: Dict[str, Any]) -> Optional[str]: + """返回错误描述(多条以「; 」连接);合法返回 None。""" + errs: List[str] = [] + _check_value(args, schema, "", errs, root=True) + return "; ".join(errs) if errs else None + + +def _validate_value(value: Any, schema: Dict[str, Any], path: str) -> Optional[str]: + """(保留旧签名:返回该节点的首个错误)""" + errs: List[str] = [] + _check_value(value, schema, path, errs) + return errs[0] if errs else None + + +def _brief_json(obj: Any, limit: int = 600) -> str: + """参数回显(长内容截断,避免 write 的大 content 撑爆错误消息)""" + try: + s = json.dumps(obj, ensure_ascii=False) + except Exception: + s = repr(obj) + return s if len(s) <= limit else s[:limit] + f"…(共 {len(s)} 字符)" + + +# ====================================================================== +# 准备阶段 —— 对照 agent-loop.ts prepareToolCalls +# ====================================================================== +@dataclass +class PreparedToolCall: + """一次工具调用的完整准备结果(执行前定型)""" + tool_call: ToolCall + tool: Optional[AgentTool] + args: Dict[str, Any] + error: str = "" # 准备阶段失败原因(未知工具/参数非法)→ 直接返回错误 toolResult + + +def prepare_tool_calls(assistant: AgentMessage, + tools: List[AgentTool]) -> List[PreparedToolCall]: + tool_map = {t.name: t for t in tools} + prepared: List[PreparedToolCall] = [] + for tc in assistant.tool_calls: + tool = tool_map.get(tc.name) + if tool is None: + prepared.append(PreparedToolCall( + tool_call=tc, tool=None, args={}, + error=f"未知工具: {tc.name}", + )) + continue + if not isinstance(tc.arguments, dict): + prepared.append(PreparedToolCall( + tool_call=tc, tool=tool, args={}, + error="工具参数解析失败(JSON 不完整)", + )) + continue + # 🌟 工具自定义参数预处理(对照 pi tool.prepareArguments) + raw_args = tc.arguments + if tool.prepare_arguments is not None: + try: + raw_args = tool.prepare_arguments(raw_args) + except Exception as e: + prepared.append(PreparedToolCall( + tool_call=tc, tool=tool, args=tc.arguments, + error=f"参数预处理失败: {e}", + )) + continue + if not isinstance(raw_args, dict): + prepared.append(PreparedToolCall( + tool_call=tc, tool=tool, args=tc.arguments, + error="参数预处理返回的不是对象", + )) + continue + # 🌟 归一化 + 轻量强制转换(null 可选字段删除 / "30" → 30) + args = normalize_and_coerce(raw_args, tool.parameters) + err = validate_json_schema(args, tool.parameters) + if err: + prepared.append(PreparedToolCall( + tool_call=tc, tool=tool, args=args, + error=f"参数校验失败: {err};收到的参数: {_brief_json(raw_args)}", + )) + continue + prepared.append(PreparedToolCall(tool_call=tc, tool=tool, + args=args)) + return prepared + + +# ====================================================================== +# 执行阶段 —— 对照 agent-loop.ts executeTool +# before 钩子 → 执行 → after 钩子 → 异常兜底 +# ====================================================================== +def execute_tool_call(prepared: PreparedToolCall, + assistant: AgentMessage, + config, + signal: AbortSignal, + on_update: Optional[Callable[[str], None]], + on_timer: Optional[Callable[[int, int], None]] = None, + ) -> AgentToolResult: + """对照 agent-loop.ts executePreparedToolCall + prepareToolCall 的钩子语义 + 🆕 on_timer(elapsed_s, timeout_s):bash 运行中每秒滴一次(气泡读秒)""" + tc = prepared.tool_call + + # 准备阶段已失败 → 直接错误结果(pi 同款:不进入执行) + if prepared.error: + return AgentToolResult.text(prepared.error, is_error=True) + if signal.aborted: + return AgentToolResult.text("操作已中止 (Operation aborted)", is_error=True) + + # before 钩子(对照 pi: 可修改 args / 拒绝 block / 请求 terminate) + if config.before_tool_call: + try: + decision = config.before_tool_call( + {"assistant_message": assistant, "tool_call": tc, + "args": prepared.args, "context": config.tool_context}, + signal) + except Exception as e: + return AgentToolResult.text(f"before 钩子异常: {e}", is_error=True) + if signal.aborted: + return AgentToolResult.text("操作已中止 (Operation aborted)", + is_error=True) + if decision: + if decision.get("block"): + # 🐛 修复:旧代码向 AgentToolResult.text() 传了不存在的 terminate 参数 + # (钩子一旦 block 就抛 TypeError)—— 改为直接构造,保留 terminate 语义 + return AgentToolResult( + content=[{"type": "text", + "text": decision.get("reason") or "工具执行被拦截"}], + is_error=True, + terminate=bool(decision.get("terminate"))) + if decision.get("args") is not None: + # 🌟 对照 pi applyBeforeToolDecision:钩子改参后【重新校验】 + new_args = decision["args"] + if not isinstance(new_args, dict): + return AgentToolResult.text( + "before 钩子返回的参数不是对象", is_error=True) + new_args = normalize_and_coerce(new_args, prepared.tool.parameters) + _verr = validate_json_schema(new_args, prepared.tool.parameters) + if _verr: + return AgentToolResult.text( + f"before 钩子修改后的参数校验失败: {_verr};" + f"收到的参数: {_brief_json(decision['args'])}", + is_error=True) + prepared.args = new_args + + t0 = time.time() + try: + # 🆕 秒级滴答回调注入 ctx(不污染调用方的 tool_context 字典) + _ctx = dict(config.tool_context or {}) + if on_timer is not None: + _ctx["on_timer"] = on_timer + result = prepared.tool.execute( + tc.id, prepared.args, signal, on_update, _ctx, + ) + if not isinstance(result, AgentToolResult): + # 宽容处理:工具返回 str 也接受 + result = AgentToolResult.text(str(result)) + except Exception as e: + result = AgentToolResult.text(f"工具执行异常: {e}", is_error=True) + + # after 钩子 + if config.after_tool_call: + try: + config.after_tool_call(tc, result, result.is_error) + except Exception: + pass + + # 结果定型(对照 pi finalizeToolResult:确保 content 结构合法) + if not result.content: + result = AgentToolResult.text("(无输出)") + result.details = {"duration_ms": int((time.time() - t0) * 1000), + **(result.details or {} if isinstance(result.details, dict) else {})} + return result + + +# ====================================================================== +# 截断保护 —— 对照 agent-loop.ts failToolCallsFromTruncatedMessage +# 助手消息被 length/aborted 截断时,其工具调用参数可能残缺: +# 一律替换为错误 toolResult,绝不执行残缺调用。 +# ====================================================================== +def fail_tool_calls_from_truncated_message(assistant: AgentMessage, + reason: str = "aborted") -> List[AgentMessage]: + """为每个工具调用生成错误 toolResult 消息(对照 pi 返回值的组装)""" + msgs: List[AgentMessage] = [] + for tc in assistant.tool_calls: + # 对照 pi: "Tool call {name} was not executed: the response hit the + # output token limit before the arguments were complete..." + text = (f"工具调用 {tc.name} 未执行({reason}):" + f"响应在参数完整前达到输出长度上限,部分参数已被丢弃。" + f"请用完整参数重试该操作。") + msgs.append(AgentMessage( + role="toolResult", + tool_call_id=tc.id, + tool_name=tc.name, + content=text, + is_error=True, + )) + return msgs + + +# ====================================================================== +# 内置工具 —— 对照 pi coding-agent 的 read / bash / write / edit +# ====================================================================== +_MAX_READ_LINES = 2000 +_MAX_OUTPUT_BYTES = 50 * 1024 + + +def _resolve_path(path: str, ctx: Dict[str, Any]) -> str: + """相对路径基于 tool_context 的 cwd(默认项目根)""" + if os.path.isabs(path): + return os.path.abspath(path) + cwd = ctx.get("cwd", os.getcwd()) + return os.path.abspath(os.path.join(cwd, path)) + + +def tool_read(tool_call_id: str, args: Dict[str, Any], signal: AbortSignal, + on_update, ctx: Dict[str, Any]) -> AgentToolResult: + """read: 读取文本文件(支持 offset/limit 行窗口),带行号输出""" + if not args.get("path"): + return AgentToolResult.text("path 不能为空", is_error=True) + path = _resolve_path(args["path"], ctx) + if not os.path.isfile(path): + return AgentToolResult.text(f"文件不存在: {path}", is_error=True) + try: + offset = max(1, int(args.get("offset", 1))) + except (TypeError, ValueError): + return AgentToolResult.text("offset 必须是整数", is_error=True) + try: + # 🌟 limit 必须有下限:负数会被 python 负索引语义吃掉 + # (旧版 limit=-5 → lines[0:-5] → 除末尾 5 行外全部返回,与直觉完全相反) + limit = max(1, min(int(args.get("limit", 2000)), _MAX_READ_LINES)) + except (TypeError, ValueError): + return AgentToolResult.text("limit 必须是整数", is_error=True) + try: + with open(path, "r", encoding="utf-8", errors="replace") as f: + lines = f.readlines() + except Exception as e: + return AgentToolResult.text(f"读取失败: {e}", is_error=True) + total = len(lines) + if total == 0: + return AgentToolResult.text("[文件为空(0 行)]") + if offset > total: + return AgentToolResult.text( + f"[起始行 offset={offset} 超出文件范围,该文件共 {total} 行]") + chunk = lines[offset - 1: offset - 1 + limit] + numbered = "".join( + f"{i + offset:6d}\t{line}" for i, line in enumerate(chunk) + ) + shown_hi = offset - 1 + len(chunk) + footer = f"\n[已显示 {offset}–{shown_hi} 行,共 {total} 行]" + if shown_hi < total: + footer += f"(还有 {total - shown_hi} 行未显示,用 offset={shown_hi + 1} 继续)" + out = numbered + footer + if len(out.encode("utf-8")) > _MAX_OUTPUT_BYTES: + out = out.encode("utf-8")[:_MAX_OUTPUT_BYTES].decode("utf-8", "ignore") + out += "\n[输出超过 50KB 已截断]" + return AgentToolResult.text(out) + + +def tool_bash(tool_call_id: str, args: Dict[str, Any], signal: AbortSignal, + on_update, ctx: Dict[str, Any]) -> AgentToolResult: + """bash: 执行 shell 命令(默认 120s 超时)。对照 pi: bash 是 sequential 工具 + + 🆕 秒级滴答:Popen + communicate(timeout=1) 循环,每秒: + ① 日志 [timer] bash 读秒 N/Ts + ② on_timer(N, T) 推前端气泡读秒 + ③ 到期杀进程树(Windows taskkill /T,连孤儿子进程一起杀)→ 真超时 + """ + if signal.aborted: + return AgentToolResult.text("操作已中止 (Operation aborted)", is_error=True) + command = args.get("command", "") + if not command.strip(): + return AgentToolResult.text("command 不能为空", is_error=True) + timeout = min(float(args.get("timeout", 120)), 600) + cwd = ctx.get("cwd") or os.getcwd() + # P1-02:显式 shell 契约(Windows cmd.exe /d /c;Linux /bin/bash -lc), + # 不再依赖 shell=True 的平台默认值;ctx 的 "shell" 键已废弃(bash 工具即 shell 工具) + on_timer = ctx.get("on_timer") + t0 = time.time() + # 🆕 计时观察①:计时器启动时刻 + 模型实际传的 timeout 值 + _dbg_log(f"[timer] bash 开始 timeout={timeout:.0f}s " + f"(显式={args.get('timeout')}) cmd={command[:80]!r}") + + def _tick(elapsed_i: int): + """每秒一次:日志 + 推前端(静默吞异常,绝不影响执行)""" + _dbg_log(f"[timer] bash 读秒 {elapsed_i}/{int(timeout)}s") + try: + if on_timer: + on_timer(elapsed_i, int(timeout)) + except Exception: + pass + + def _kill_tree(proc): + """杀整个进程树:Windows taskkill /F /T;Linux 独立进程组 + SIGTERM → 宽限 → SIGKILL(见 core.platform_shell.kill_process_tree)。""" + kill_process_tree(proc) + + # 🐛 修复:text=True 不带 encoding 时按系统码页(中文 Windows=GBK)解码, + # 子进程输出 UTF-8(python/git/中文 echo)→ _readerthread UnicodeDecodeError。 + # 强制 UTF-8 + 容错替换;PYTHONIOENCODING 让 python 子进程也按 UTF-8 输出。 + _env = dict(os.environ, PYTHONIOENCODING="utf-8") + try: + proc = subprocess.Popen( + shell_command(command), # P1-02:显式 shell 命令 + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + text=True, encoding="utf-8", errors="replace", + cwd=cwd, env=_env, + **popen_flags(), # P1-02:Linux 独立进程组(start_new_session) + ) + except Exception as e: + return AgentToolResult.text(f"执行失败: {e}", is_error=True) + + timed_out = False + out_parts: List[str] = [] + err_parts: List[str] = [] + err_header_fed = False + + # 🆕 实时输出:stdout/stderr 各起一个 reader 线程 → 队列, + # 主循环(仍在 worker 线程内)抽干队列并回调 on_update。 + # 绝不从 reader 线程直接回调 —— UI 侧 _on_tool_updated 会改 timeline,跨线程不安全。 + _q: "queue.Queue" = queue.Queue() + + def _reader(stream, tag): + try: + for line in iter(stream.readline, ""): + _q.put((tag, line)) + except Exception: + pass + finally: + try: + stream.close() + except Exception: + pass + + _t_out = threading.Thread(target=_reader, args=(proc.stdout, "out"), daemon=True) + _t_err = threading.Thread(target=_reader, args=(proc.stderr, "err"), daemon=True) + _t_out.start() + _t_err.start() + + def _feed(tag, chunk): + """抽到一块输出:累积 + 推实时流(只在 worker 线程内调用)""" + nonlocal err_header_fed + piece = chunk + if tag == "err": + err_parts.append(chunk) + if not err_header_fed: + err_header_fed = True + piece = "[stderr]\n" + chunk + else: + out_parts.append(chunk) + try: + if on_update and piece: + on_update(piece) + except Exception: + pass + + def _drain(): + """抽干队列里已到达的输出(单轮上限防极端刷屏卡死)""" + for _ in range(500): + try: + tag, chunk = _q.get_nowait() + except queue.Empty: + return + _feed(tag, chunk) + + last_tick = 0 # 首次滴答仍在 elapsed=1(与旧 communicate 实现一致,不在 0 秒多滴一次) + try: + while True: + # ① 最多 0.2s 醒一次 → 把新输出实时推给前端 + try: + tag, chunk = _q.get(timeout=0.2) + _feed(tag, chunk) + except queue.Empty: + pass + _drain() + + # ② 进程已退出:等 reader 读完管道残余 → 收尾 + if proc.poll() is not None: + _t_out.join(timeout=1.0) + _t_err.join(timeout=1.0) + _drain() + break + + # ③ 每秒读秒 + 中止/超时判定(原语义不变) + elapsed_i = int(time.time() - t0) + if elapsed_i > last_tick: + last_tick = elapsed_i + if signal.aborted: + _kill_tree(proc) + _t_out.join(timeout=1.0) + _t_err.join(timeout=1.0) + _drain() + return AgentToolResult.text( + "操作已中止 (Operation aborted)", is_error=True) + _tick(elapsed_i) + if time.time() - t0 >= timeout: + # 到期 → 真杀(进程树) + timed_out = True + _kill_tree(proc) + try: + proc.wait(timeout=15) + except Exception: + pass + _t_out.join(timeout=5.0) + _t_err.join(timeout=5.0) + _drain() + break + except Exception as e: + try: + _kill_tree(proc) + except Exception: + pass + return AgentToolResult.text(f"执行失败: {e}", is_error=True) + + out = "".join(out_parts) + err = "".join(err_parts) + code = proc.returncode if proc.returncode is not None else -1 + + dur = time.time() - t0 + if timed_out: + # 🆕 计时观察②:计时器到期 + _dbg_log(f"[timer] bash 超时触发 设定={timeout:.0f}s " + f"实际={dur:.1f}s cmd={command[:80]!r}") + return AgentToolResult.text(f"命令超时(>{timeout:.0f}s)已终止", is_error=True) + # 🆕 计时观察③:正常结束 + 实际耗时 + _dbg_log(f"[timer] bash 正常结束 dur={dur:.1f}s " + f"exit={code} 设定timeout={timeout:.0f}s") + result = f"$ {command}\n" + if out: + result += out if out.endswith("\n") else out + "\n" + if err: + result += f"[stderr]\n{err}" + result += f"\n[exit {code}] ({dur:.1f}s)" + if len(result.encode("utf-8")) > _MAX_OUTPUT_BYTES: + result = result.encode("utf-8")[:_MAX_OUTPUT_BYTES].decode("utf-8", "ignore") + result += "\n[输出超过 50KB 已截断]" + return AgentToolResult.text(result, is_error=code != 0, + details={"exit_code": code}) + + +def _atomic_write(path: str, content: str) -> None: + """原子写:同目录临时文件 + os.replace(避免半截文件) + + 保留原有 newline 语义(默认 None → 平台换行翻译),仅增加原子性。 + """ + d = os.path.dirname(os.path.abspath(path)) or "." + fd, tmp = tempfile.mkstemp(dir=d, prefix=".hocode_w_", suffix=".tmp") + try: + with os.fdopen(fd, "w", encoding="utf-8") as f: + f.write(content) + os.replace(tmp, path) # Windows/POSIX 均为原子替换 + except BaseException: + try: + os.remove(tmp) + except Exception: + pass + raise + + +def tool_write(tool_call_id: str, args: Dict[str, Any], signal: AbortSignal, + on_update, ctx: Dict[str, Any]) -> AgentToolResult: + """write: 创建/覆盖文件(自动建父目录)""" + if not args.get("path"): + return AgentToolResult.text("path 不能为空", is_error=True) + path = _resolve_path(args["path"], ctx) + content = args.get("content", "") + if content is None: + content = "" + if not isinstance(content, str): + content = str(content) + try: + parent = os.path.dirname(path) + if parent: + os.makedirs(parent, exist_ok=True) + _atomic_write(path, content) + except Exception as e: + return AgentToolResult.text(f"写入失败: {e}", is_error=True) + return AgentToolResult.text(f"已写入 {len(content)} 字符 → {path}") + + +def _prepare_edit_args(args: Any) -> Any: + """归一化 edit 参数(对照 pi edit.ts:56-70 prepareEditArguments) + + - edits 为 JSON 字符串 → 解析为数组 + - edits 内条目为 JSON 字符串 → 解析为对象 + - 兼容 legacy 单条形式 {path, oldText, newText} → 包装为 edits:[{...}] + """ + if not isinstance(args, dict): + return args + out = dict(args) + edits = out.get("edits") + if isinstance(edits, str): + try: + parsed = json.loads(edits) + if isinstance(parsed, list): + out["edits"] = parsed + elif isinstance(parsed, dict): + out["edits"] = [parsed] + except Exception: + pass # 解析不了就交给校验层报错 + if out.get("edits") is None and ("oldText" in out or "newText" in out): + ed: Dict[str, Any] = {} + if "oldText" in out: + ed["oldText"] = out["oldText"] + if "newText" in out: + ed["newText"] = out["newText"] + out = {"path": out.get("path"), "edits": [ed]} + if isinstance(out.get("edits"), list): + norm = [] + for it in out["edits"]: + if isinstance(it, str): + try: + it = json.loads(it) + except Exception: + pass + norm.append(it) + out["edits"] = norm + return out + + +def _plan_edits(content: str, edits: List[Any]): + """对【原始内容】定位每条 oldText(要求恰好 1 次)+ 区间重叠检测 + + 对照 pi edit-diff.ts:348「edits[i] and edits[j] overlap … Merge them into one edit」。 + 返回 (错误信息, [(start, end, index, new_text), ...] 已按 start 排序) + """ + spans: List[tuple] = [] + for i, ed in enumerate(edits): + if not isinstance(ed, dict): + return f"第 {i + 1} 条 edit 不是对象", None + old = ed.get("oldText", "") + if not isinstance(old, str): + return f"第 {i + 1} 条 edit 的 oldText 必须是字符串", None + if old == "": + return f"第 {i + 1} 条 edit 的 oldText 不能为空", None + c = content.count(old) + if c == 0: + return f"第 {i + 1} 条 edit 未找到匹配文本(oldText 不存在或已变化)", None + if c > 1: + return f"第 {i + 1} 条 edit 匹配到 {c} 处(要求唯一),请提供更长的上下文", None + start = content.index(old) + spans.append((start, start + len(old), i, ed.get("newText", ""))) + ordered = sorted(spans) + for a, b in zip(ordered, ordered[1:]): + if b[0] < a[1]: + return (f"edits[{a[2]}] 与 edits[{b[2]}] 区域重叠," + f"请合并为一条 edit 或改为互不相交的修改"), None + return None, ordered + + +def tool_edit(tool_call_id: str, args: Dict[str, Any], signal: AbortSignal, + on_update, ctx: Dict[str, Any]) -> AgentToolResult: + """edit: 精确文本替换(edits: [{oldText, newText}]) + + 🌟 语义对齐 pi:全部 edit 都对【原始文件内容】定位,要求各自唯一且区间互不重叠, + 然后按偏移一次性重建(不是逐条 replace 的增量语义)。 + """ + if not args.get("path"): + return AgentToolResult.text("path 不能为空", is_error=True) + path = _resolve_path(args["path"], ctx) + if not os.path.isfile(path): + return AgentToolResult.text(f"文件不存在: {path}", is_error=True) + edits = args.get("edits", []) + if not isinstance(edits, list) or not edits: + return AgentToolResult.text("edits 不能为空", is_error=True) + try: + with open(path, "r", encoding="utf-8") as f: + content = f.read() + except Exception as e: + return AgentToolResult.text(f"读取失败: {e}", is_error=True) + err, ordered = _plan_edits(content, edits) + if err: + return AgentToolResult.text(err, is_error=True) + # 按偏移从后往前替换(前面的偏移不受影响) + out = content + for start, end, _i, new_text in reversed(ordered): + out = out[:start] + (new_text if isinstance(new_text, str) else str(new_text)) + out[end:] + try: + _atomic_write(path, out) + except Exception as e: + return AgentToolResult.text(f"编辑失败: {e}", is_error=True) + return AgentToolResult.text(f"已应用 {len(ordered)} 处编辑 → {path}") + + +# ====================================================================== +# 默认工具集 —— 对照 pi 默认启用 read/bash/edit/write +# ====================================================================== + +_TEXT_TOOL_RE = re.compile(r"<(bash|read)>(.*?)", re.DOTALL) + + +def parse_text_tool_calls(content: str): + """ + 兜底解析(haocode 扩展,pi 无此层): + 对不支持 tools API 的供应商/模型——它们会把工具调用用纯文字"演"出来 + (例如 ls路径),本函数识别单参数工具 + bash / read 并转成真 ToolCall 供循环执行。 + write / edit 参数多、文本歧义大,不做兜底(保持安全)。 + 返回 (原文, [ToolCall]);未命中时 calls 为空列表。 + """ + if not content or "<" not in content: + return content, [] + calls: List[ToolCall] = [] + + def _sub(m): + name, payload = m.group(1), m.group(2).strip() + if not payload: + return m.group(0) + if name == "bash": + calls.append(ToolCall(id=new_id("txtcall"), name="bash", + arguments={"command": payload})) + elif name == "read": + calls.append(ToolCall(id=new_id("txtcall"), name="read", + arguments={"path": payload})) + return m.group(0) # 保留原文(UI 已渲染,不回改;执行由 tool_calls 驱动) + + cleaned = _TEXT_TOOL_RE.sub(_sub, content) + return cleaned, calls + +def default_tools() -> List[AgentTool]: + return [ + AgentTool( + name="read", label="读取文件", + description="读取文本文件内容(带行号)。支持 offset/limit 按行窗口读取大文件。", + parameters={ + "type": "object", + "properties": { + "path": {"type": "string", "description": "文件路径"}, + "offset": {"type": "integer", "description": "起始行号(从 1 开始)"}, + "limit": {"type": "integer", "description": "最多读取行数(默认 2000)"}, + }, + "required": ["path"], + }, + execute=tool_read, + ), + AgentTool( + name="bash", label="执行命令", + description="执行 shell 命令并返回 stdout/stderr/退出码。默认 120 秒超时。", + parameters={ + "type": "object", + "properties": { + "command": {"type": "string", "description": "要执行的命令"}, + "timeout": {"type": "number", "description": "超时秒数(默认 120,最大 600)"}, + }, + "required": ["command"], + }, + execute=tool_bash, + execution_mode="sequential", # 对照 pi: bash 整批串行 + ), + AgentTool( + name="write", label="写入文件", + description="创建或覆盖写入文件(自动创建父目录)。", + parameters={ + "type": "object", + "properties": { + "path": {"type": "string", "description": "文件路径"}, + "content": {"type": "string", "description": "文件内容"}, + }, + "required": ["path", "content"], + }, + execute=tool_write, + ), + AgentTool( + name="edit", label="编辑文件", + description=("对文件做精确文本替换。edits 中每条 oldText 必须在原文件中唯一," + "且各条区间不得重叠(重叠请合并为一条)。"), + parameters={ + "type": "object", + "properties": { + "path": {"type": "string", "description": "文件路径"}, + "edits": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oldText": {"type": "string"}, + "newText": {"type": "string"}, + }, + "required": ["oldText"], + }, + "description": "替换操作列表", + }, + }, + "required": ["path", "edits"], + }, + execute=tool_edit, + prepare_arguments=_prepare_edit_args, + ), + ] diff --git a/core/agent/types.py b/core/agent/types.py new file mode 100644 index 0000000..10e630f --- /dev/null +++ b/core/agent/types.py @@ -0,0 +1,331 @@ +""" +core/agent/types.py +==================== +🌟 pi agent-core 的 Python 1:1 移植 —— 数据模型层 + +对照 pi-main 源码: + packages/agent/src/types.ts (443 行) + - AgentMessage 联合类型 (user / assistant / toolResult) + - AgentEvent 11 种事件 + - AgentTool / AgentToolCall / AgentToolResult + - AgentState / AgentConfig / AgentError + +设计原则(与 pi 完全一致): + 1. 消息是不可变事实(append-only),循环只追加、不修改 + 2. 事件是唯一对外输出(TUI/Qt 都只是事件订阅者) + 3. 工具 = (name, description, JSON-Schema 参数, execute 函数) + 4. 中止用 AbortSignal 标志位,不用异常控制流 +""" +from __future__ import annotations + +import time +import uuid +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, List, Optional + + +def _now_ms() -> int: + return int(time.time() * 1000) + + +def new_id(prefix: str) -> str: + return f"{prefix}_{uuid.uuid4().hex[:16]}" + + +# ====================================================================== +# 中止信号 —— 对照 pi: AbortController/AbortSignal(Web 标准) +# pi 里 streamSimple 每消费一个 chunk 检查 signal.aborted +# ====================================================================== +class AbortSignal: + def __init__(self): + self.aborted: bool = False + self.reason: str = "" + + def abort(self, reason: str = "aborted"): + self.aborted = True + self.reason = reason + + +# ====================================================================== +# 消息模型 —— 对照 types.ts 的 AgentMessage 联合类型 +# pi: type AgentMessage = AgentUserMessage | AgentAssistantMessage | AgentToolResultMessage +# ====================================================================== +@dataclass +class ToolCall: + """pi: AssistantMessage 内容块里的 {type:"toolCall", id, name, arguments}""" + id: str + name: str + arguments: Dict[str, Any] = field(default_factory=dict) + # 流式阶段累积的原始 JSON 字符串(参数被截断时可能是残缺 JSON) + raw_arguments: str = "" + + +@dataclass +class AgentMessage: + """ + 统一消息容器。role 决定哪些字段有效: + user -> content: str 或 OpenAI 多模态 list + assistant -> content(str 正文) + reasoning(思考) + tool_calls + stop_reason + usage + toolResult -> tool_call_id + tool_name + content + is_error + 与 pi 的三种 Message 类型字段一一对应。 + """ + role: str # "user" | "assistant" | "toolResult" + content: Any = "" # str | List[dict] + reasoning: str = "" # pi: thinking block(vLLM: reasoning_content) + tool_calls: List[ToolCall] = field(default_factory=list) + tool_call_id: str = "" # toolResult 专用 + tool_name: str = "" # toolResult 专用 + is_error: bool = False # toolResult 专用 + stop_reason: str = "" # assistant 专用: stop|length|aborted|error + error_message: str = "" # assistant 出错时的说明 + usage: Dict[str, Any] = field(default_factory=dict) # {input, output, cacheRead...} + kind: str = "" # "" | "compaction_summary"(对照 pi compaction 条目) + db_msg_id: str = "" # 🆕 压缩持久化:对应 DB 行的 id(build_api_context 注入,切点计算用) + timestamp: int = field(default_factory=_now_ms) + id: str = field(default_factory=lambda: new_id("msg")) + + def to_dict(self) -> Dict[str, Any]: + return { + "role": self.role, "content": self.content, "reasoning": self.reasoning, + "tool_calls": [ + {"id": tc.id, "name": tc.name, "arguments": tc.arguments, + "raw_arguments": tc.raw_arguments} + for tc in self.tool_calls + ], + "tool_call_id": self.tool_call_id, "tool_name": self.tool_name, + "is_error": self.is_error, "stop_reason": self.stop_reason, + "error_message": self.error_message, "usage": self.usage, + "kind": self.kind, + "db_msg_id": self.db_msg_id, + "timestamp": self.timestamp, "id": self.id, + } + + @staticmethod + def from_dict(d: Dict[str, Any]) -> "AgentMessage": + return AgentMessage( + role=d.get("role", "user"), content=d.get("content", ""), + reasoning=d.get("reasoning", ""), + tool_calls=[ToolCall(id=t.get("id", ""), name=t.get("name", ""), + arguments=t.get("arguments", {}), + raw_arguments=t.get("raw_arguments", "")) + for t in d.get("tool_calls", [])], + tool_call_id=d.get("tool_call_id", ""), tool_name=d.get("tool_name", ""), + is_error=d.get("is_error", False), stop_reason=d.get("stop_reason", ""), + error_message=d.get("error_message", ""), usage=d.get("usage", {}), + kind=d.get("kind", ""), + db_msg_id=d.get("db_msg_id", ""), + timestamp=d.get("timestamp", 0), id=d.get("id") or new_id("msg"), + ) + + +# ====================================================================== +# 助手消息的流式增量事件 —— 对照 pi: AssistantMessageEvent +# {type:"text_delta", textDelta} | {type:"thinking_delta", ...} +# | {type:"toolcall_delta", ...} | {type:"done"} | {type:"error"} +# ====================================================================== +@dataclass +class AssistantMessageEvent: + type: str # "text_delta" | "thinking_delta" | "toolcall_delta" | "done" | "error" + text: str = "" # text_delta / thinking_delta 的增量 + tool_call_index: int = -1 # toolcall_delta 属于第几个 toolCall + tool_call_delta: str = "" # toolcall_delta 的原始增量片段 + tool_call_field: str = "arguments" # 片段属于 id | name | arguments 哪一段 + error_message: str = "" # error 时的说明 + + @staticmethod + def text_delta(text: str) -> "AssistantMessageEvent": + return AssistantMessageEvent(type="text_delta", text=text) + + @staticmethod + def thinking_delta(text: str) -> "AssistantMessageEvent": + return AssistantMessageEvent(type="thinking_delta", text=text) + + @staticmethod + def toolcall_delta(index: int, delta: str, + field: str = "arguments") -> "AssistantMessageEvent": + return AssistantMessageEvent(type="toolcall_delta", tool_call_index=index, + tool_call_delta=delta, tool_call_field=field) + + @staticmethod + def done() -> "AssistantMessageEvent": + return AssistantMessageEvent(type="done") + + @staticmethod + def error(message: str) -> "AssistantMessageEvent": + return AssistantMessageEvent(type="error", error_message=message) + + +# ====================================================================== +# Agent 事件(11 种)—— 对照 types.ts 的 AgentEvent 联合类型 +# ====================================================================== +EVENT_TYPES = ( + "agent_start", "agent_end", + "turn_start", "turn_end", + "message_start", "message_update", "message_end", + "tool_execution_start", "tool_execution_update", "tool_execution_end", +) + + +@dataclass +class AgentEvent: + """ + 事件容器。字段随 type 变化: + agent_end -> stop_reason, error + message_start/end -> message (AgentMessage) + message_update -> message(当前累积快照), assistant_message_event + tool_execution_start -> tool_call, tool_name + tool_execution_update -> tool_call, arg(增量) + tool_execution_timer -> tool_call, arg=(已耗秒, 超时秒) 🆕 bash 读秒 + tool_execution_end -> tool_call, result, is_error + """ + type: str + message: Optional[AgentMessage] = None + assistant_message_event: Optional[AssistantMessageEvent] = None + tool_call: Optional[ToolCall] = None + arg: str = "" + result: Optional["AgentToolResult"] = None + is_error: bool = False + stop_reason: str = "" + error: Optional["AgentError"] = None + messages: List[AgentMessage] = field(default_factory=list) # agent_end 携带的本轮新消息 + + +# ====================================================================== +# 工具 —— 对照 types.ts: AgentTool / AgentToolCall / AgentToolResult +# ====================================================================== +@dataclass +class AgentToolResult: + """pi: {content: OutputContent[], details?, isError, terminate?}""" + content: List[Dict[str, Any]] = field(default_factory=list) # [{type:"text", text}] + details: Any = None + is_error: bool = False + terminate: bool = False # 对照 pi: 工具可请求终止整个批次/循环 + + @staticmethod + def text(text: str, is_error: bool = False, details: Any = None) -> "AgentToolResult": + return AgentToolResult(content=[{"type": "text", "text": text}], + details=details, is_error=is_error) + + def as_text(self) -> str: + return "".join(c.get("text", "") for c in self.content if c.get("type") == "text") + + +@dataclass +class AgentTool: + """ + pi: interface AgentTool { name; description; parameters(JSON Schema); + execute(toolCallId, args, signal, onUpdate, context) => Promise } + Python 版 execute 签名完全一致(同步执行,循环里用线程池并发)。 + """ + name: str + description: str + parameters: Dict[str, Any] # JSON Schema + execute: Callable # (tool_call_id, args, signal, on_update, context) -> AgentToolResult + label: str = "" # UI 展示用短标签 + # 对照 pi types.ts: executionMode —— "sequential" 工具会把整个批次拉回串行执行 + execution_mode: str = "parallel" + # 🌟 对照 pi AgentHarnessTool.prepareArguments:校验前的确定性参数预处理 + # (如 edit 兼容 legacy 单条形式 / edits 为 JSON 字符串),签名 (args) -> args + prepare_arguments: Optional[Callable] = None + + +# ====================================================================== +# 运行时状态 / 配置 —— 对照 types.ts: AgentState / AgentConfig +# ====================================================================== +@dataclass +class AgentState: + messages: List[AgentMessage] = field(default_factory=list) + is_streaming: bool = False + streaming_message: Optional[AgentMessage] = None # 正在流式生成的助手消息 + streaming_delta: Dict[str, str] = field(default_factory=dict) # 各通道当前增量缓冲 + error: Optional["AgentError"] = None + + +@dataclass +class RetryConfig: + """对照 pi settings-manager.ts retry 默认值(行 32-33): + maxRetries=3, baseDelayMs=2000,指数退避 2s → 4s → 8s(base × 2^(n-1)) + max_delay_ms=0 表示不设上限(pi _prepareRetry 无封顶)""" + max_attempts: int = 3 + base_delay_ms: int = 2000 + factor: float = 2.0 + max_delay_ms: int = 0 # 0 = 不封顶 + + +@dataclass +class ModelConfig: + """ + 对照 pi models.json 里的模型定义。 + context_window = pi 的 contextWindow;max_tokens = pi 的 maxTokens。 + """ + provider: str = "" + name: str = "" + context_window: int = 128000 + max_tokens: int = 8192 + # 请求参数 + temperature: float = 0.7 + timeout_seconds: float = 180.0 + api_key: str = "" + base_url: str = "https://api.openai.com/v1" + # 🆕 thinking 模式(DeepSeek 等):assistant 消息必须把 reasoning_content + # 原样回传,否则 400。默认开启(只影响有 reasoning 的轮中消息; + # DB 回放行 reasoning="" 不带字段 → 全新请求体不变)。 + pass_reasoning: bool = True + + +@dataclass +class AgentConfig: + """ + 对照 types.ts: AgentConfig + model / tools / systemPrompt / maxTurns / steeringMode / followUpMode + + 6 个循环钩子(transformContext / beforeToolCall / afterToolCall / + shouldStopAfterTurn / prepareNextTurn) + """ + model: ModelConfig + system_prompt: str = "" + tools: List[AgentTool] = field(default_factory=list) + max_turns: int = 50 # pi 默认 50 + steering_mode: str = "one-at-a-time" # pi 默认 "one-at-a-time"("all" 一次性全注入) + follow_up_mode: str = "one-at-a-time" + # 对照 pi types.ts ToolExecutionMode: 批次级执行模式(有 sequential 工具自动转串行) + tool_execution: str = "parallel" # "sequential" | "parallel" + retry: RetryConfig = field(default_factory=RetryConfig) + # 压缩(🌟 1:1 对照 pi DEFAULT_COMPACTION_SETTINGS) + compaction_reserve: int = 16384 # reserveTokens: 摘要提示词与输出预留 + compaction_keep_recent: int = 20000 # keepRecentTokens: 压缩后保留的近期上下文预算 + # 钩子(None = 无钩子,对照 pi 的可选字段) + transform_context: Optional[Callable] = None # (messages) -> messages + before_tool_call: Optional[Callable] = None # (tool_call, args) -> 可修改/拒绝 + after_tool_call: Optional[Callable] = None # (tool_call, result, is_error) -> None + should_stop_after_turn: Optional[Callable] = None # (messages) -> bool + prepare_next_turn: Optional[Callable] = None # (context) -> context + # 🆕 haocode 增强(偏离 pi 1:1):轮中请求前的主动压缩检查 + # (messages) -> messages|None:返回新列表 = 发生了压缩(循环需同步上下文); + # None = 不需要/不可压缩(原样发请求,响应式安全网仍在) + compact_fn: Optional[Callable] = None # (messages) -> messages|None + # 运行上下文(透传给 tool.execute,如工作目录) + tool_context: Dict[str, Any] = field(default_factory=dict) + + +@dataclass +class AgentError(Exception): + """对照 pi 的 AgentError —— 携带分类信息供恢复逻辑判定""" + message: str = "" + # 分类: "rate_limit" | "overload" | "server_error" | "timeout" | + # "connection" | "auth" | "unknown" + kind: str = "unknown" + status_code: Optional[int] = None + recoverable: bool = False # 恢复逻辑判定后的标记 + + def __str__(self): + return self.message or "AgentError" + + +# ====================================================================== +# 运行结果 —— 对照 agent-session.ts 里对 agent_end 事件的读取 +# ====================================================================== +@dataclass +class RunResult: + stop_reason: str = "stop" # stop | length | aborted | error + error: Optional[AgentError] = None + message_count: int = 0 diff --git a/core/config_paths.py b/core/config_paths.py new file mode 100644 index 0000000..f745429 --- /dev/null +++ b/core/config_paths.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +"""core/config_paths.py —— 统一的配置文件路径解析与容错加载(P0-01 新增) + +所有配置读取入口必须经过本模块,不得在别处直接定位 data/config.json: + + 1. 环境变量 HAOCODE_CONFIG_FILE 优先级最高(自动化测试用它指向临时文件); + 2. 未设置环境变量时才回落到项目内 data/config.json(锚定 core/ 目录,不受 CWD 影响)。 + +行为约定(REPAIR_BACKLOG P0-01 硬约束): + · 路径解析与加载过程只在出错时输出可见警告(只含路径与错误类型,不含配置内容); + · 缺失 / 损坏 / 非 JSON 对象 → 返回安全空 dict 继续,不抛异常、不阻断 + 不需要该配置的源码路径; + · import 本模块时不打印、不复制、不迁移任何配置内容。 +""" +import json +import os + +ENV_KEY = "HAOCODE_CONFIG_FILE" + +_DEFAULT_CONFIG_PATH = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "..", "data", "config.json") + + +def config_path() -> str: + """返回当前生效的配置文件路径(环境变量优先,调用时解析)。""" + p = os.environ.get(ENV_KEY, "").strip() + return p if p else _DEFAULT_CONFIG_PATH + + +def load_config() -> dict: + """容错加载配置。缺失/损坏/非对象 → 可见警告 + 安全空 dict(绝不抛异常)。""" + p = config_path() + if not os.path.exists(p): + print(f"[config] 配置文件缺失: {p} → 使用安全默认值(providers 为空)继续启动") + return {} + try: + with open(p, "r", encoding="utf-8") as f: + data = json.load(f) + except Exception as e: + print(f"[config] 配置文件读取/解析失败: {p}({type(e).__name__})" + f" → 使用安全默认值继续启动") + return {} + if not isinstance(data, dict): + print(f"[config] 配置文件内容不是 JSON 对象: {p}" + f" → 使用安全默认值继续启动") + return {} + return data + + +# ---------------------------------------------------------------------- +# P1-01:渲染窗口配置解析(render_window_mode / render_window_size) +# 规则(与 ui/web/render_window.js 的 JS 侧守卫保持一致): +# size:只接受非布尔整数 10..200,缺失/布尔/字符串/小数/零/负数/越界 → 静默回落 40; +# mode:只接受 "auto"/"manual",否则回落 "auto"。 +# ---------------------------------------------------------------------- +DEFAULT_RENDER_WINDOW_SIZE = 40 +ALLOWED_RENDER_WINDOW_SIZES = (10, 40, 200) + + +def render_window_settings(cfg: dict | None = None) -> dict: + """解析渲染窗口配置。cfg 缺省时读取当前生效配置。永不抛异常。""" + if cfg is None: + cfg = load_config() + if not isinstance(cfg, dict): + cfg = {} + + raw_size = cfg.get("render_window_size", None) + if isinstance(raw_size, bool) or not isinstance(raw_size, int) \ + or raw_size < 10 or raw_size > 200: + size = DEFAULT_RENDER_WINDOW_SIZE + else: + size = raw_size + + raw_mode = cfg.get("render_window_mode", None) + mode = raw_mode if raw_mode in ("auto", "manual") else "auto" + + return {"mode": mode, "size": size} diff --git a/core/db_manager.py b/core/db_manager.py new file mode 100644 index 0000000..0541538 --- /dev/null +++ b/core/db_manager.py @@ -0,0 +1,715 @@ +import sqlite3 +import os +import sys +import re +import json +import uuid +import time +import shutil +from typing import List, Dict, Optional + +# 🝙 P0 fix: DB path based on the file's location (no longer depends on the process's working directory) +# 🌟 打包(PyInstaller onedir)时:优先与源码树共用 data/chat_history.db(历史不丢失); +# 若 exe 被复制到源码树之外 → 回退为 exe 旁的 data/chat_history.db +if getattr(sys, "frozen", False): + _exe_dir = os.path.dirname(os.path.abspath(sys.executable)) + _shared = os.path.abspath(os.path.join(_exe_dir, "..", "..", "data", "chat_history.db")) + if os.path.isdir(os.path.dirname(_shared)): + _DEFAULT_DB = _shared + else: + _DEFAULT_DB = os.path.join(_exe_dir, "data", "chat_history.db") +else: + _DEFAULT_DB = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "..", "data", "chat_history.db") + + +class _AutoCloseConn: + """🝙 P0 fix: wraps sqlite3.Connection. + + sqlite3.Connection's with only handles commit/rollback and does NOT close. + All 19 call sites use `with self.get_connection() as conn:`, so we auto-close on with exit. + """ + + def __init__(self, conn): + self._conn = conn + + def __getattr__(self, name): + return getattr(self._conn, name) + + def __enter__(self): + self._conn.__enter__() + return self + + def __exit__(self, exc_type, exc, tb): + try: + return self._conn.__exit__(exc_type, exc, tb) + finally: + try: + self._conn.close() + except Exception: + pass + + +class DBManager: + def __init__(self, db_path: str = None): + # 🝙 Default path is anchored to the core/ directory, not affected by launch CWD + self.db_path = db_path or os.path.abspath(_DEFAULT_DB) + + # 🆕 附件/媒体文件根目录(copy_session 深拷贝磁盘文件用)。默认=项目根;测试可覆盖。 + self.files_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + self.is_first_run = not os.path.exists(self.db_path) + d = os.path.dirname(self.db_path) + if d: + os.makedirs(d, exist_ok=True) + + self._init_db() + + def get_connection(self): + conn = sqlite3.connect(self.db_path, check_same_thread=False) + conn.row_factory = sqlite3.Row + conn.execute("PRAGMA foreign_keys = ON") + return _AutoCloseConn(conn) + + def _init_db(self): + """初始化表结构并注入默认数据""" + with self.get_connection() as conn: + cursor = conn.cursor() + + # 1. 创建 sessions 表 (新增 current_leaf_msg_id) + cursor.execute(""" + CREATE TABLE IF NOT EXISTS sessions ( + id TEXT PRIMARY KEY, + title TEXT, + created_at INTEGER, + updated_at INTEGER, + has_messages BOOLEAN DEFAULT 0, + sort_order INTEGER DEFAULT 0, + is_starred BOOLEAN DEFAULT 0, + current_leaf_msg_id TEXT + ) + """) + + # 2. 创建 messages 表 (新增 parent_id) + cursor.execute(""" + CREATE TABLE IF NOT EXISTS messages ( + id TEXT PRIMARY KEY, + session_id TEXT, + role TEXT, + content TEXT, + reasoning TEXT, + is_ignored BOOLEAN, + created_at INTEGER, + attachment_metadata TEXT, + parent_id TEXT, + timeline TEXT, + usage TEXT, + stop_reason TEXT, + error_message TEXT, + FOREIGN KEY(session_id) REFERENCES sessions(id) ON DELETE CASCADE + ) + """) + + # ========================================== + # 🌟 核心性能优化:为高频查询的字段建立索引 + # ========================================== + cursor.execute("CREATE INDEX IF NOT EXISTS idx_session_id ON messages(session_id)") + cursor.execute("CREATE INDEX IF NOT EXISTS idx_parent_id ON messages(parent_id)") + + # 3. 🌟 自动化热升级:检测并兼容旧数据库 + self._upgrade_schema(cursor) + + # 4. 检查是否需要插入初始默认对话 + cursor.execute("SELECT COUNT(*) FROM sessions") + if cursor.fetchone()[0] == 0: + self._seed_default_chat(cursor) + + conn.commit() + + + def _upgrade_schema(self, cursor): + """检测缺少的新字段并自动补齐,如果是刚升级,则自动将旧线性数据串联成链表""" + upgraded = False + + # 兼容 sessions 字段 + for col in ["has_messages", "sort_order", "is_starred"]: + try: + cursor.execute(f"SELECT {col} FROM sessions LIMIT 1") + except sqlite3.OperationalError: + if col == "has_messages": cursor.execute("ALTER TABLE sessions ADD COLUMN has_messages BOOLEAN DEFAULT 0") + if col == "sort_order": cursor.execute("ALTER TABLE sessions ADD COLUMN sort_order INTEGER DEFAULT 0") + if col == "is_starred": cursor.execute("ALTER TABLE sessions ADD COLUMN is_starred BOOLEAN DEFAULT 0") + + # 🌟 核心:兼容链表树架构 + try: + # 兼容 sessions.mode 列(chat/worker 模式锁定,NULL=未发送过) + try: + cursor.execute("SELECT mode FROM sessions LIMIT 1") + except Exception: + cursor.execute("ALTER TABLE sessions ADD COLUMN mode TEXT") + + cursor.execute("SELECT current_leaf_msg_id FROM sessions LIMIT 1") + except sqlite3.OperationalError: + print("[DB]: 正在升级 sessions 表 (添加 current_leaf_msg_id)...") + cursor.execute("ALTER TABLE sessions ADD COLUMN current_leaf_msg_id TEXT") + upgraded = True + + try: + cursor.execute("SELECT attachment_metadata, parent_id FROM messages LIMIT 1") + except sqlite3.OperationalError: + print("[DB]: 正在升级 messages 表 (添加 attachment_metadata, parent_id)...") + try: cursor.execute("ALTER TABLE messages ADD COLUMN attachment_metadata TEXT") + except: pass + try: cursor.execute("ALTER TABLE messages ADD COLUMN parent_id TEXT") + except: pass + upgraded = True + + # 🌟 messages.timeline 列(agent 时间线 JSON: 思考/文本/工具 按事件顺序) + try: + cursor.execute("SELECT timeline FROM messages LIMIT 1") + except sqlite3.OperationalError: + print("[DB]: 正在升级 messages 表 (添加 timeline)...") + try: cursor.execute("ALTER TABLE messages ADD COLUMN timeline TEXT") + except: pass + upgraded = True + + # 🆕 P1: messages.usage 列(assistant 回复的精确 usage JSON, + # 供显示/压缩估算做 usage 锚定,对照 pi 内存态 usage 回放) + try: + cursor.execute("SELECT usage FROM messages LIMIT 1") + except sqlite3.OperationalError: + print("[DB]: 正在升级 messages 表 (添加 usage)...") + try: cursor.execute("ALTER TABLE messages ADD COLUMN usage TEXT") + except: pass + upgraded = True + + # 🆕 失败轮次持久化(对照 pi: message_end 无条件入库): + # messages.stop_reason / error_message —— 区分「正常行 / 出错行」, + # 供 UI 展示与 build_api_context 回放决策(NULL = 正常) + # + # ⚠️⚠️ 绝不能置 upgraded=True:该标志会触发下方的「旧数据链表化重构」, + # 把用户的**树状分支拍平成线性链**(数据破坏)! + # 纯追加列对本迁移自身而言是安全的,与旧库结构修复无关。 + try: + cursor.execute("SELECT stop_reason, error_message FROM messages LIMIT 1") + except sqlite3.OperationalError: + print("[DB]: 正在升级 messages 表 (添加 stop_reason, error_message)...") + try: cursor.execute("ALTER TABLE messages ADD COLUMN stop_reason TEXT") + except: pass + try: cursor.execute("ALTER TABLE messages ADD COLUMN error_message TEXT") + except: pass + + # 如果刚才执行了树状结构升级,立即对旧数据进行“时间线串联”修复 + if upgraded: + print("[DB]: 🚀 正在执行旧数据链表化重构...") + cursor.execute("SELECT id FROM sessions") + sessions = cursor.fetchall() + for s in sessions: + sid = s['id'] + cursor.execute("SELECT id FROM messages WHERE session_id = ? ORDER BY created_at ASC", (sid,)) + msgs = cursor.fetchall() + if not msgs: continue + + # 遍历消息,将后一条的 parent_id 指向上一条 + prev_id = None + for m in msgs: + mid = m['id'] + if prev_id: + cursor.execute("UPDATE messages SET parent_id = ? WHERE id = ?", (prev_id, mid)) + prev_id = mid + + # 最后一个 msg_id 就是这棵树的末端叶子节点 + cursor.execute("UPDATE sessions SET current_leaf_msg_id = ? WHERE id = ?", (prev_id, sid)) + print("[DB]: ✅ 数据结构完美升级为链表树!") + + + def _seed_default_chat(self, cursor): + session_id = f"sess_{uuid.uuid4().hex[:12]}" + now = int(time.time()) + + cursor.execute( + "INSERT INTO sessions (id, title, created_at, updated_at, has_messages) VALUES (?, ?, ?, ?, ?)", + (session_id, "让我们从这里开始吧", now, now, 1) + ) + + sys_id = f"msg_sys_init" + cursor.execute(""" + INSERT INTO messages (id, session_id, role, content, reasoning, is_ignored, created_at, parent_id) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, (sys_id, session_id, "system", "你是一个优秀的助手!", "", 0, now, None)) + + default_messages = [ + {"role": "user", "content": "你好呀,你是谁?"}, + {"role": "assistant", "content": "嗨!我是你的 AI 助手 ✨ ..."}, + {"role": "user", "content": "那你到底能帮我做什么?"}, + {"role": "assistant", "content": "简单来说,能打字问的我都聊..."} + ] + + prev_id = sys_id + for msg in default_messages: + msg_id = f"msg_{uuid.uuid4().hex[:16]}" + now += 1 + cursor.execute(""" + INSERT INTO messages (id, session_id, role, content, reasoning, is_ignored, created_at, parent_id) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, (msg_id, session_id, msg["role"], msg["content"], "", 0, now, prev_id)) + prev_id = msg_id + + # 设置默认会话的叶子节点 + cursor.execute("UPDATE sessions SET current_leaf_msg_id = ? WHERE id = ?", (prev_id, session_id)) + + # ==================== 会话 (Session) 操作 ==================== + def get_session_mode(self, session_id: str) -> Optional[str]: + """读取会话锁定的模式(chat/worker),未发送过返回 None""" + with self.get_connection() as conn: + row = conn.execute("SELECT mode FROM sessions WHERE id = ?", + (session_id,)).fetchone() + return row["mode"] if row else None + + def set_session_mode(self, session_id: str, mode: str): + """锁定会话模式(首条消息发送时调用,之后不可变)""" + with self.get_connection() as conn: + conn.execute("UPDATE sessions SET mode = ? WHERE id = ?", + (mode, session_id)) + + def get_all_sessions(self) -> List[Dict]: + with self.get_connection() as conn: + return [dict(row) for row in conn.execute("SELECT * FROM sessions ORDER BY is_starred DESC, sort_order ASC, updated_at DESC").fetchall()] + + def create_session(self, title: str = "新对话") -> Dict: + session_id = f"sess_{uuid.uuid4().hex[:12]}" + now = int(time.time()) + sys_msg_id = f"msg_{uuid.uuid4().hex[:16]}" + + with self.get_connection() as conn: + cursor = conn.cursor() + min_order = self.get_min_sort_order() + + # 创建 session,直接将 system 消息设为初始叶子节点 + cursor.execute( + "INSERT INTO sessions (id, title, created_at, updated_at, has_messages, sort_order, current_leaf_msg_id) VALUES (?, ?, ?, ?, ?, ?, ?)", + (session_id, title, now, now, 0, min_order, sys_msg_id) + ) + + cursor.execute(""" + INSERT INTO messages (id, session_id, role, content, reasoning, is_ignored, created_at, parent_id) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, (sys_msg_id, session_id, "system", "你是一个优秀的助手!", "", 0, now, None)) + conn.commit() + + return dict(cursor.execute("SELECT * FROM sessions WHERE id = ?", (session_id,)).fetchone()) + + # ------------------------------------------------------------------ + # 🆕 会话复制:深度克隆(全部分支 + 压缩标记 + 附件文件) + # ------------------------------------------------------------------ + def _make_copy_title(self, base: str) -> str: + """生成不重名的副本标题:X → X (副本) → X (副本 2) → …""" + root = re.sub(r"\s*\(副本(?:\s*\d+)?\)\s*$", "", base or "").strip() or "新对话" + with self.get_connection() as conn: + existing = {r[0] for r in conn.execute("SELECT title FROM sessions").fetchall()} + cand = f"{root} (副本)" + n = 2 + while cand in existing and n < 1000: + cand = f"{root} (副本 {n})" + n += 1 + return cand + + def _dup_media_file(self, old_path: str, prefix: str): + """把一个项目内媒体文件复制成新名字。 + 返回 (新绝对路径, 新项目相对路径);文件不存在或异常返回 None。""" + if not old_path: + return None + old_abs = old_path if os.path.isabs(old_path) else os.path.join(self.files_root, old_path) + if not os.path.isfile(old_abs): + return None + ext = os.path.splitext(old_abs)[1] or ".bin" + new_dir = os.path.join(self.files_root, "data", "attachments") + os.makedirs(new_dir, exist_ok=True) + new_abs = "" + for _ in range(5): + new_abs = os.path.join(new_dir, f"{prefix}_{uuid.uuid4().hex[:8]}{ext}") + if not os.path.exists(new_abs): + break + shutil.copy2(old_abs, new_abs) + new_rel = os.path.relpath(new_abs, self.files_root).replace("\\", "/") + return new_abs, new_rel + + def _copy_attachment_files(self, meta_json: Optional[str]) -> Optional[str]: + """附件深拷贝:image/pdf 的磁盘文件复制改名并改写 local_path; + text 类型正文内联在 JSON 里,无需处理。 + 任何异常/文件缺失都原样返回,绝不让复制整体失败。""" + if not meta_json: + return meta_json + try: + meta = json.loads(meta_json) + except Exception: + return meta_json + if not isinstance(meta, dict) or not meta.get("attachments"): + return meta_json + changed = False + for att in meta.get("attachments") or []: + if not isinstance(att, dict): + continue + try: + if att.get("type") in ("image", "pdf") and att.get("local_path"): + got = self._dup_media_file( + att["local_path"], "img" if att["type"] == "image" else "pdf") + if got: + att["local_path"] = got[1] + if "abs_path" in att: + att["abs_path"] = got[0] + changed = True + if att.get("type") == "pdf": + for im in att.get("images") or []: + if not isinstance(im, dict): + continue + got = self._dup_media_file( + im.get("abs_path") or im.get("local_path"), "pdfimg") + if got: + im["abs_path"] = got[0] + im["local_path"] = got[1] + changed = True + except Exception as e: + print(f"[DB] ⚠️ 附件深拷贝失败(保留原路径): {e}", flush=True) + return json.dumps(meta, ensure_ascii=False) if changed else meta_json + + def copy_session(self, session_id: str, new_title: Optional[str] = None, + copy_attachments: bool = True) -> Optional[Dict]: + """📋 深度复制一个会话。 + + - messages 全部重新生成 ID,parent_id / current_leaf_msg_id 全量重映射 + → 分支、压缩标记(role='compaction')都原样保留 + - image/pdf 附件文件物理复制成新文件 → 副本自包含,删任意一方不影响另一方 + - 单事务写入;源会话零改动 + 返回新会话 dict;源不存在返回 None。 + """ + now = int(time.time()) + n_att = 0 + with self.get_connection() as conn: + cursor = conn.cursor() + src_row = cursor.execute( + "SELECT * FROM sessions WHERE id = ?", (session_id,)).fetchone() + if not src_row: + return None + src = dict(src_row) + rows = [dict(r) for r in cursor.execute( + "SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC, rowid ASC", + (session_id,)).fetchall()] + + # ① 新 ID 映射(保持 comp_ / msg_ 前缀约定) + idmap = {} + for m in rows: + pre = "comp_" if m.get("role") == "compaction" else "msg_" + idmap[m["id"]] = f"{pre}{uuid.uuid4().hex[:16]}" + + # ② 标题(重名自动递增) + title = new_title or self._make_copy_title(src.get("title") or "新对话") + + # ③ 消息 created_at 保相对间隔(同层兄弟排序不变) + t0 = min((m.get("created_at") or 0) for m in rows) if rows else now + + new_sid = f"sess_{uuid.uuid4().hex[:12]}" + new_leaf = idmap.get(src.get("current_leaf_msg_id")) + if rows and not new_leaf: + # 兜底:源叶子不在链上(数据异常)→ 取副本里时间最新的一条 + last = max(rows, key=lambda m: (m.get("created_at") or 0)) + new_leaf = idmap.get(last["id"]) + print(f"[DB] ⚠️ copy_session 源叶子异常,回退 leaf={new_leaf}", flush=True) + + # ④ 新会话(置列表顶部、不带星标、模式跟随源) + cursor.execute( + "INSERT INTO sessions (id, title, created_at, updated_at, has_messages, " + "sort_order, is_starred, current_leaf_msg_id, mode) VALUES (?,?,?,?,?,?,?,?,?)", + (new_sid, title, now, now, src.get("has_messages") or 0, + self.get_min_sort_order(), 0, new_leaf, src.get("mode"))) + + # ⑤ 逐条复制消息(parent 重映射 + 附件深拷贝) + for m in rows: + meta = m.get("attachment_metadata") + if copy_attachments and meta: + new_meta = self._copy_attachment_files(meta) + if new_meta != meta: + n_att += 1 + meta = new_meta + cursor.execute( + "INSERT INTO messages (id, session_id, role, content, reasoning, is_ignored, " + "created_at, attachment_metadata, parent_id, timeline, usage, stop_reason, error_message) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", + (idmap[m["id"]], new_sid, m.get("role"), m.get("content"), + m.get("reasoning"), m.get("is_ignored"), + now + ((m.get("created_at") or 0) - t0), + meta, idmap.get(m.get("parent_id")), + m.get("timeline"), m.get("usage"), + m.get("stop_reason"), m.get("error_message"))) + + conn.commit() + out = dict(cursor.execute( + "SELECT * FROM sessions WHERE id = ?", (new_sid,)).fetchone()) + + try: + print(f"[DB] copy_session {session_id[:8]} → {new_sid[:8]} " + f"消息={len(rows)} 附件深拷贝={n_att} 标题={title}", flush=True) + except Exception: + pass + return out + + def update_session_title(self, session_id: str, new_title: str): + with self.get_connection() as conn: + conn.execute("UPDATE sessions SET title = ?, updated_at = ? WHERE id = ?", (new_title, int(time.time()), session_id)) + conn.commit() + + def delete_session(self, session_id: str): + with self.get_connection() as conn: + conn.execute("DELETE FROM sessions WHERE id = ?", (session_id,)) + conn.commit() + + # 下方其它基本Session功能保持不变... + def mark_session_has_messages(self, session_id: str): + with self.get_connection() as conn: + conn.execute("UPDATE sessions SET has_messages = 1 WHERE id = ?", (session_id,)) + conn.commit() + + def check_session_needs_title(self, session_id: str) -> bool: + with self.get_connection() as conn: + row = conn.execute("SELECT title, has_messages FROM sessions WHERE id = ?", (session_id,)).fetchone() + if row: return row[0] == "新对话" and row[1] == 1 + return False + + def get_min_sort_order(self) -> int: + with self.get_connection() as conn: + row = conn.execute("SELECT MIN(sort_order) FROM sessions").fetchone() + return (row[0] or 0) - 1 + + def update_session_order(self, ordered_ids: list): + with self.get_connection() as conn: + for idx, sid in enumerate(ordered_ids): + conn.execute("UPDATE sessions SET sort_order = ? WHERE id = ?", (idx, sid)) + conn.commit() + + def update_session_star(self, session_id: str, is_starred: bool): + with self.get_connection() as conn: + conn.execute("UPDATE sessions SET is_starred = ?, updated_at = ? WHERE id = ?", (1 if is_starred else 0, int(time.time()), session_id)) + conn.commit() + + def is_session_starred(self, session_id: str) -> bool: + with self.get_connection() as conn: + row = conn.execute("SELECT is_starred FROM sessions WHERE id = ?", (session_id,)).fetchone() + return bool(row and row[0]) + + + # ==================== 🌟 核心:消息链表树操作 ==================== + + def get_session_leaf(self, session_id: str) -> Optional[str]: + """获取会话当前的叶子节点ID""" + with self.get_connection() as conn: + row = conn.execute("SELECT current_leaf_msg_id FROM sessions WHERE id = ?", (session_id,)).fetchone() + return row[0] if row else None + + def update_session_leaf(self, session_id: str, leaf_msg_id: str): + """切换时间线:手动更新当前会话的叶子节点""" + with self.get_connection() as conn: + conn.execute("UPDATE sessions SET current_leaf_msg_id = ?, updated_at = ? WHERE id = ?", + (leaf_msg_id, int(time.time()), session_id)) + conn.commit() + + def get_message_chain(self, session_id: str) -> List[Dict]: + """🚀 极客级递归拉取:顺藤摸瓜,只返回当前激活时间线上的消息!彻底断绝下游污染!""" + leaf_id = self.get_session_leaf(session_id) + if not leaf_id: + return [] + + chain = [] + with self.get_connection() as conn: + cursor = conn.cursor() + current_id = leaf_id + seen = set() # 🐛 环检测:数据异常(如自环标记)时快速退出,防主线程死循环卡死 + + # 使用 Python 循环向上回溯(比 SQL CTE 更好调试,性能对于本地几千条聊天来说在 1ms 内) + while current_id and current_id not in seen: + seen.add(current_id) + cursor.execute("SELECT * FROM messages WHERE id = ?", (current_id,)) + msg = cursor.fetchone() + if not msg: + break + chain.append(dict(msg)) + current_id = msg['parent_id'] + if current_id in seen: + try: + print(f"[DB] ⚠️ get_message_chain 检测到环(session={session_id}),已截断", flush=True) + except Exception: + pass + + # 因为是向上回溯,拉出来的链条是反的,最后翻转一下恢复正序 + chain.reverse() + return chain + + def get_branch_info(self, parent_id: str) -> List[Dict]: + """获取某一父节点下的所有子分支消息 (第二阶段用于UI渲染 '1/3')""" + if not parent_id: return [] + with self.get_connection() as conn: + return [dict(row) for row in conn.execute( + "SELECT * FROM messages WHERE parent_id = ? ORDER BY created_at ASC", (parent_id,) + ).fetchall()] + + def add_message(self, session_id: str, role: str, content: str, parent_id: str, + reasoning: str = "", is_ignored: bool = False, + msg_id: Optional[str] = None, attachment_metadata: Optional[str] = None, + timeline: Optional[str] = None, + usage: Optional[str] = None, + stop_reason: Optional[str] = None, + error_message: Optional[str] = None) -> Dict: + """添加新消息,并自动将该消息设为当前会话的最新叶子节点 + 🆕 P1: usage —— assistant 回复的精确 usage JSON(如 '{"input":..,"output":..}') + 🆕 失败轮次: stop_reason/error_message —— 'error' 行入库但不回退叶子 + (对照 pi:错误也持久化,回放时由 build_api_context 决定取舍)""" + if not msg_id: msg_id = f"msg_{uuid.uuid4().hex[:16]}" + now = int(time.time()) + + with self.get_connection() as conn: + cursor = conn.cursor() + # 1. 插入消息 + cursor.execute(""" + INSERT INTO messages (id, session_id, role, content, reasoning, is_ignored, created_at, attachment_metadata, parent_id, timeline, usage, stop_reason, error_message) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, (msg_id, session_id, role, content, reasoning, 1 if is_ignored else 0, now, attachment_metadata, parent_id, timeline, usage, stop_reason, error_message)) + + # 2. 自动更新 session 的叶子节点(时间线前推) + cursor.execute("UPDATE sessions SET current_leaf_msg_id = ?, updated_at = ? WHERE id = ?", + (msg_id, now, session_id)) + conn.commit() + try: + print(f"[DB] add_message role={role} 内容={len(content or '')}c " + f"思考={len(reasoning or '')}c 时间线={'有' if timeline else '无'} " + f"id={msg_id} session={session_id[:8]}", flush=True) + except Exception: + pass + + return dict(cursor.execute("SELECT * FROM messages WHERE id = ?", (msg_id,)).fetchone()) + + # ------------------------------------------------------------------ + # 🆕 压缩持久化:链上标记点(子叶子回溯到标记即停) + # 插入后链形:…→ cut_before → [MARK role="compaction"] → first_retained → …→叶子 + # 历史行全部保留(前端切会话渲染照常);API 上下文构建在标记处截断。 + # 关键:不动 sessions.current_leaf_msg_id(绝不能用 add_message); + # INSERT + UPDATE 同一事务,不留断链窗口。 + # ------------------------------------------------------------------ + def insert_compaction_mark(self, session_id: str, summary: str, + cut_before_id: str, first_retained_id: str, + meta_json: Optional[str] = None) -> Optional[str]: + """在链上插入压缩标记行并把保留首条的 parent_id 改指到标记。返回 mark_id。""" + if not cut_before_id or not first_retained_id: + return None + if cut_before_id == first_retained_id: + # 🐛 防自环:同一行不能既做切点前又做保留首条(timeline 回放同 id 场景) + try: + print(f"[DB] ⚠️ insert_compaction_mark 拒绝自环 cut==retained={cut_before_id}", flush=True) + except Exception: + pass + return None + mark_id = f"comp_{uuid.uuid4().hex[:16]}" + now = int(time.time()) + with self.get_connection() as conn: + cursor = conn.cursor() + cursor.execute("""INSERT INTO messages + (id, session_id, role, content, reasoning, is_ignored, + created_at, attachment_metadata, parent_id, timeline, usage) + VALUES (?, ?, 'compaction', ?, '', 1, ?, ?, ?, NULL, NULL)""", + (mark_id, session_id, summary, now, meta_json, cut_before_id)) + cursor.execute("UPDATE messages SET parent_id = ? WHERE id = ?", + (mark_id, first_retained_id)) + conn.commit() + try: + print(f"[DB] insert_compaction_mark session={session_id[:8]} " + f"cut_before={cut_before_id} first_retained={first_retained_id} " + f"mark={mark_id} summary={len(summary or '')}c", flush=True) + except Exception: + pass + return mark_id + # === 在 db_manager.py 中添加这个方法 === + def get_branch_leaf(self, msg_id: str) -> str: + """寻找一条时间线的最末端叶子节点""" + current_id = msg_id + with self.get_connection() as conn: + cursor = conn.cursor() + while True: + # 寻找把当前节点作为父节点的子节点,按时间倒序取最新的一条(意味着它顺着最近被聊过的那条线往下走) + cursor.execute("SELECT id FROM messages WHERE parent_id = ? ORDER BY created_at DESC LIMIT 1", (current_id,)) + child = cursor.fetchone() + if child: + current_id = child[0] + else: + break # 没有子节点了,它自己就是叶子! + return current_id + def delete_message_branch(self, session_id: str, msg_id: str): + """🚀 精准剪枝:删AI只删当前分支,删User连根拔起,并自动平滑回退时间线""" + with self.get_connection() as conn: + cursor = conn.cursor() + + # 1. 查出要删除的节点的父亲 + cursor.execute("SELECT parent_id FROM messages WHERE id = ?", (msg_id,)) + row = cursor.fetchone() + if not row: return + safe_parent_id = row['parent_id'] + + # 2. 目标就是传进来的 msg_id 本身 (不再强制上移到 parent) + target_id = msg_id + + # 3. 拉取全会话,构建亲属关系树 + cursor.execute("SELECT id, parent_id FROM messages WHERE session_id = ?", (session_id,)) + all_msgs = cursor.fetchall() + + children_map = {} + for m in all_msgs: + pid = m['parent_id'] + if pid not in children_map: + children_map[pid] = [] + children_map[pid].append(m['id']) + + # 4. 广度优先搜索 (BFS):找出目标消息及其所有子孙 + to_delete = set([target_id]) + queue = [target_id] + while queue: + curr = queue.pop(0) + if curr in children_map: + for child in children_map[curr]: + if child not in to_delete: + to_delete.add(child) + queue.append(child) + + # 5. 判断当前时间线的“叶子节点”是否在被波及的名单里 + cursor.execute("SELECT current_leaf_msg_id FROM sessions WHERE id = ?", (session_id,)) + leaf_row = cursor.fetchone() + leaf_needs_update = leaf_row and leaf_row['current_leaf_msg_id'] in to_delete + + # 6. 🌟 执行物理删除前,收集将被删除的附件元数据 + deleted_metadata = [] + for d_id in to_delete: + # 先查出它的 metadata + cursor.execute("SELECT attachment_metadata FROM messages WHERE id = ?", (d_id,)) + row = cursor.fetchone() + if row and row['attachment_metadata']: + deleted_metadata.append(row['attachment_metadata']) + + # 然后再执行物理删除 + cursor.execute("DELETE FROM messages WHERE id = ?", (d_id,)) + + + # 7. 🌟 核心:如果时间线断了,自动寻找平滑降落点 + sibling_row = None + if leaf_needs_update: + # 尝试寻找被删节点的最新“兄弟姐妹” (例如删了分支2,寻找分支1) + cursor.execute("SELECT id FROM messages WHERE parent_id = ? ORDER BY created_at DESC LIMIT 1", (safe_parent_id,)) + sibling_row = cursor.fetchone() + + # 如果有兄弟,降落到兄弟;如果没兄弟(只有1次回答),退回原点(提问) + new_leaf = sibling_row['id'] if sibling_row else safe_parent_id + cursor.execute("UPDATE sessions SET current_leaf_msg_id = ? WHERE id = ?", (new_leaf, session_id)) + + conn.commit() + + # 8. 如果降落到了兄弟分支,兄弟可能还有下文,需再次对齐真实叶子节点 + if leaf_needs_update and sibling_row: + real_leaf = self.get_branch_leaf(new_leaf) + self.update_session_leaf(session_id, real_leaf) + + return deleted_metadata # 🌟 返回被删除的元数据,交给 MainWindow 去粉碎文件 diff --git a/core/debug_log.py b/core/debug_log.py new file mode 100644 index 0000000..c02577d --- /dev/null +++ b/core/debug_log.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +"""统一调试日志 + 调试器窗口控制协议(纯文件通信,与主窗口 UI 零耦合) + +日志文件: data/debug_session.log (环境变量 HAOCODE_DEBUG_LOG 可覆盖) +控制文件: data/debug_window.cmd (环境变量 HAOCODE_DEBUG_CMD 可覆盖) + +三方写入协议: + [USER] 用户在调试窗口输入框手输的观察情况 + [AGENT] 代理(外部脚本/命令行)注入的指令与备注 + [APP] 应用自身事件(上下文标签变化/usage/发送/完成/报错/压缩) + [SYS] 调试窗口自身的开关事件 + +行格式: [YYYY-MM-DD HH:MM:SS.mmm] [TAG] 内容 + +控制协议: 代理往 debug_window.cmd 写入 "show" 或 "hide"(一行), +app 侧 2s QTimer 轮询并消费(读完即删)。 +""" +import os +import threading +import time + +_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +_DATA_DIR = os.path.join(_ROOT, "data") + +DEBUG_LOG_PATH = (os.environ.get("HAOCODE_DEBUG_LOG") + or os.path.join(_DATA_DIR, "debug_session.log")) +DEBUG_CMD_PATH = (os.environ.get("HAOCODE_DEBUG_CMD") + or os.path.join(_DATA_DIR, "debug_window.cmd")) + +_lock = threading.Lock() + + +def _stamp() -> str: + t = time.time() + return (f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t))}" + f".{int(t * 1000) % 1000:03d}") + + +def debug_log(msg: str, tag: str = "APP") -> None: + """线程安全追加一条日志(worker 线程亦可调用)。 + 静默吞掉一切异常——本模块绝不影响主流程。""" + try: + with _lock: + with open(DEBUG_LOG_PATH, "a", encoding="utf-8") as f: + f.write(f"[{_stamp()}] [{tag}] {msg}\n") + except Exception: + pass + + +def poll_debug_cmd(): + """消费控制文件,返回 'show' / 'hide' / None。由主线程 QTimer 周期调用。""" + try: + if os.path.exists(DEBUG_CMD_PATH): + with open(DEBUG_CMD_PATH, "r", encoding="utf-8") as f: + action = (f.read() or "").strip().lower() + try: + os.remove(DEBUG_CMD_PATH) + except Exception: + pass + if action in ("show", "hide"): + return action + except Exception: + pass + return None + + +def autostart_debug_window(cfg: dict) -> bool: + """调试窗口随程序启动:cfg["debug_window_autostart"] 为 true(缺省也是 true) + 时向控制文件写 "show",主窗口事件循环启动后 2s 轮询即开窗。 + 纯文件操作(不依赖 Qt),返回是否写入。""" + try: + if not bool(cfg.get("debug_window_autostart", True)): + return False + with open(DEBUG_CMD_PATH, "w", encoding="utf-8") as f: + f.write("show\n") + return True + except Exception: + return False diff --git a/core/llm_engine.py b/core/llm_engine.py new file mode 100644 index 0000000..2248083 --- /dev/null +++ b/core/llm_engine.py @@ -0,0 +1,448 @@ +""" +core/llm_engine.py +================== +Qt 胶水层 —— 把 core.agent(pi 1:1 核心)接到 PyQt6 信号系统。 + +🌟 对照 pi 架构: + AgentWorker(QThread) + 内部持有 Agent + AgentRunner(对照 pi 的 Agent + AgentSession 会话层) + run() = pi 的 _runAgentPrompt:prompt → 循环 post-agent-run 恢复 → settle + 事件桥:AgentEvent → pyqtSignal(跨线程 queued 投递到 UI 线程) + + ChatWorker(QThread) + chat 模式:普通聊天单次流式(无工具循环/无重试/无压缩)。 + + TitleWorker(QThread) + 轻量单次流式补全(标题生成),保留原 LLMWorker 的信号面。 + +信号面(与旧 LLMWorker 兼容 + 新增工具事件): + chunk_received(str) # text_delta + reasoning_received(str) # thinking_delta + error_occurred(str) # 终局错误(已重试/压缩恢复仍失败) + tool_execution_started(str, str, str) # (call_id, tool_name, args_json) + tool_execution_updated(str, str) # (call_id, 执行中增量输出) + tool_execution_finished(str, str, bool, str) # (call_id, tool_name, ok, 结果摘要) +""" +from __future__ import annotations + +import json +import os +from typing import Any, Dict, List, Optional + +from openai import OpenAI +from PyQt6.QtCore import QThread, pyqtSignal + +from core.agent import (Agent, AgentConfig, AgentEvent, AgentMessage, AgentRunner, + ModelConfig, RetryConfig, calculate_context_tokens, + default_tools, from_openai_messages, + openai_stream) +from core.agent.stream_fn import _pick_reasoning, _pick_usage +# P0-01:配置读取统一入口(环境变量 HAOCODE_CONFIG_FILE 优先,缺省回落项目内 data/config.json) +from core.config_paths import load_config +from core import platform_shell # P1-02:提示词平台段(通用正文 + 短 shell/path 段) + +PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +# 🌟 Agent 系统提示词文件(项目根目录,core 前面那个 .md) +SYSTEM_PROMPT_FILE = os.path.join(PROJECT_ROOT, "SYSTEM_PROMPT.md") +_FALLBACK_SYSTEM_PROMPT = ( + "你是 haocode 的本地智能体,可以读取/写入文件并执行 bash 命令" + "(工作目录为项目根目录)。请用简体中文简洁地回答。" +) + + +def load_system_prompt() -> str: + """读取 SYSTEM_PROMPT.md;缺失时用兜底短提示词。 + + P1-02:通用正文 + 运行时插入的短平台 shell/path 段(占位符替换); + 每次请求重读本函数即重读文件,Windows 段不会出现在 Linux 请求中,反之亦然。 + """ + text = None + try: + with open(SYSTEM_PROMPT_FILE, "r", encoding="utf-8") as f: + text = f.read().strip() + except FileNotFoundError: + pass + if not text: + text = _FALLBACK_SYSTEM_PROMPT + return platform_shell.apply_platform_section(text) + + +def _load_config() -> dict: + """P0-01:统一走 core.config_paths.load_config(环境变量优先、容错、可见警告)。""" + return load_config() + + +def _provider_info(config: dict, provider_name: str) -> dict: + return config.get("providers", {}).get(provider_name, {}) or {} + + +class AgentWorker(QThread): + """ + 一次「发送」= 一个 AgentWorker(对照 pi:一个 AgentSession 实例)。 + 多轮工具循环在一次 run() 内完成;UI 只管收信号 + 最终入库。 + """ + + # ---- 与旧 LLMWorker 兼容的信号 ---- + chunk_received = pyqtSignal(str) + reasoning_received = pyqtSignal(str) + error_occurred = pyqtSignal(str) + # ---- 新增:工具执行事件(pi tool_execution_* 事件)---- + tool_execution_started = pyqtSignal(str, str, str) # (call_id, name, args) + tool_execution_updated = pyqtSignal(str, str) # (call_id, 增量输出) + tool_execution_timed = pyqtSignal(str, int, int) # (call_id, 已耗秒, 超时秒) 🆕 bash 读秒 + tool_execution_finished = pyqtSignal(str, str, bool, str) # (call_id, name, ok, 结果) + # 上下文压缩发生(UI 可提示「已自动压缩上下文」) + context_compacted = pyqtSignal(dict) + # 🆕 压缩开始(摘要 LLM 阻塞调用前)→ 前端显示「执行中」动态气泡 + # payload: {summary, before, after, duration_ms, path} + compaction_started = pyqtSignal(str) # path: pre_prompt/overflow_compact/length_compact + # 🆕 P1: 收到本轮精确 usage(UI 上下文标签做 usage 锚定,含 system+tools) + usage_updated = pyqtSignal(dict) + # 🆕 M3: 重试调度 / 重试结果(对照 pi onRetryScheduled/onRetryFinished) + retry_scheduled = pyqtSignal(int, int, float, str) # (attempt, max_attempts, delay_ms, reason) + retry_finished = pyqtSignal(bool) + + def __init__(self, provider_name: str, model_name: str, + openai_messages: List[Dict[str, Any]], + tool_context: Optional[Dict[str, Any]] = None, + enable_tools: bool = True, + temperature: Optional[float] = None): + """ + openai_messages: build_api_context 的产物(OpenAI 格式)。 + 最后一条 user 消息 = 本次提问;其余 = 历史上下文。 + """ + super().__init__() + self.provider_name = provider_name + self.model_name = model_name + self.openai_messages = openai_messages + self.tool_context = tool_context or {"cwd": PROJECT_ROOT} + self.enable_tools = enable_tools + self._temperature_override = temperature + + self.config = _load_config() + self._aborted = False + self._agent: Optional[Agent] = None + self._runner: Optional[AgentRunner] = None + self._compactions_before = 0 + + # ------------------------------------------------------------------ + # 中断(对照 pi abort:当前流立刻停止,已产生的内容保留) + # ------------------------------------------------------------------ + def abort(self): + self._aborted = True + if self._agent is not None: + self._agent.abort() + + # 兼容旧调用名 + def cancel(self): + self.abort() + + # ------------------------------------------------------------------ + # 模型配置(对照 pi models.json 条目 → ModelConfig) + # ------------------------------------------------------------------ + def _build_model_config(self) -> ModelConfig: + p = _provider_info(self.config, self.provider_name) + context_window = int(p.get("model_contexts", {}).get(self.model_name, 128000)) + max_tokens = int(p.get("model_max_tokens", {}).get(self.model_name, 8192)) + temperature = (self._temperature_override + if self._temperature_override is not None + else float(self.config.get("temperature", 0.7))) + return ModelConfig( + provider=self.provider_name, + name=self.model_name, + context_window=context_window, + max_tokens=max_tokens, + temperature=temperature, + api_key=p.get("api_key", ""), + base_url=p.get("base_url", "https://api.openai.com/v1"), + # 🆕 thinking reasoning_content 回传默认开启(ModelConfig.pass_reasoning=True) + ) + + # ------------------------------------------------------------------ + # 压缩用的非流式 LLM 调用(对照 pi completeSimpleWithRetries) + # 新签名 1:1 对照 pi:(prompt_text, system_prompt, max_tokens) -> str + # ------------------------------------------------------------------ + def _make_summarize_fn(self, model: ModelConfig): + def summarize(prompt_text: str, system_prompt: str, max_tokens: int) -> str: + client = OpenAI(api_key=model.api_key, base_url=model.base_url, + timeout=120.0, max_retries=0) + resp = client.chat.completions.create( + model=model.name, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": prompt_text}, + ], + stream=False, + max_tokens=max_tokens, + temperature=0.3, + ) + return (resp.choices[0].message.content or "").strip() + + return summarize + + # ------------------------------------------------------------------ + # 事件桥:AgentEvent → Qt 信号(在工作线程内 emit,queued 投递) + # ------------------------------------------------------------------ + def _bridge(self, e: AgentEvent): + if e.type == "message_end" and e.message is not None: + # 🆕 P1: 本轮刚结束 → 它的 usage 是「上一张照片」(精确覆盖 + # system+tools+历史+本轮输出),供 UI 显示锚定 + usage = e.message.usage or {} + if calculate_context_tokens(usage) > 0: + self.usage_updated.emit(dict(usage)) + if e.type == "message_update" and e.assistant_message_event is not None: + ev = e.assistant_message_event + # 🌟 字段是 ev.text(不是 ev.data);_emit 会吞掉订阅者异常, + # 写错字段 = 静默无流式输出,必须靠 test_agent_worker_stream_fn_wiring 守住 + if ev.type == "text_delta" and ev.text: + self.chunk_received.emit(ev.text) + elif ev.type == "thinking_delta" and ev.text: + self.reasoning_received.emit(ev.text) + return + if e.type == "tool_execution_start" and e.tool_call is not None: + try: + args = json.dumps(e.tool_call.arguments, ensure_ascii=False) \ + if e.tool_call.arguments else (e.tool_call.raw_arguments or "") + except Exception: + args = str(e.tool_call.arguments) + self.tool_execution_started.emit(e.tool_call.id, e.tool_call.name, + str(args)[:2000]) + elif e.type == "tool_execution_update" and e.arg: + self.tool_execution_updated.emit(e.tool_call.id, str(e.arg)) + elif e.type == "tool_execution_timer" and isinstance( + getattr(e, "arg", None), tuple) and len(e.arg) == 2: + # 🆕 bash 运行中每秒滴一次 → 前端气泡读秒 + self.tool_execution_timed.emit(e.tool_call.id, int(e.arg[0]), + int(e.arg[1])) + elif e.type == "tool_execution_end" and e.tool_call is not None: + text = "" + if e.result is not None: + c = e.result.content + text = c if isinstance(c, str) else \ + "".join(x.get("text", "") for x in c if isinstance(x, dict)) + # 🌟 修复: 原来 ok = is_error(反了)——成功的工具被显示成失败 + ok = not (e.result.is_error if e.result is not None else True) + self.tool_execution_finished.emit( + e.tool_call.id, e.tool_call.name, bool(ok), text[:20000]) # 长结果供 UI 展开 + + # ------------------------------------------------------------------ + # 主入口 —— 对照 pi _runAgentPrompt + # ------------------------------------------------------------------ + def run(self): + provider = _provider_info(self.config, self.provider_name) + if not provider: + self.error_occurred.emit(f"未找到 provider 配置: {self.provider_name}") + return + + history = from_openai_messages(self.openai_messages) + if not history or history[-1].role != "user": + self.error_occurred.emit("上下文必须以 user 消息结尾") + return + last_user = history.pop() # 本次提问(其余为历史) + + model = self._build_model_config() + cfg = AgentConfig( + model=model, + # 🌟 系统提示词:SYSTEM_PROMPT.md(每次请求头部注入,不入历史) + system_prompt=load_system_prompt() if self.enable_tools else "", + tools=default_tools() if self.enable_tools else [], + tool_context=self.tool_context, + retry=RetryConfig(max_attempts=3, base_delay_ms=2000, factor=2.0), + ) + agent = Agent(cfg) + # 🌟 关键:注入流函数(对照 pi 的 agentLoopConfig.streamFn 注入点)。 + # 漏掉这一步 Agent 会抛 AgentError("未配置 stream_fn")。 + agent.set_stream_fn(openai_stream) + agent.state.messages = list(history) + agent.subscribe(self._bridge) + + summarize = self._make_summarize_fn(model) + runner = AgentRunner(agent, summarize_fn=summarize, + # 🆕 M3: 重试回调 → Qt 信号(跨线程 queued 投递) + on_retry_scheduled=lambda a, m, d, r: + self.retry_scheduled.emit(int(a), int(m), float(d), str(r)), + on_retry_finished=lambda ok: + self.retry_finished.emit(bool(ok)), + # 🆕 压缩开始回调 → 前端动态气泡 + on_compaction_started=lambda p: + self.compaction_started.emit(str(p)), + # 🆕 压缩完成回调 → 气泡即时定格(不等整轮结束) + on_compaction_finished=lambda p: + self.context_compacted.emit(dict(p))) + # 🆕 接线轮中主动压缩检查(haocode 增强,偏离 pi 1:1): + # 内层循环每次 LLM 请求前主动检查,单条巨型工具输出不再依赖 + # 「一次失败往返 + 响应式兜底」 + agent.config.compact_fn = runner.compact_if_needed + self._agent = agent + self._runner = runner + self._compactions_before = 0 + + try: + result = runner.run(last_user) + except Exception as e: + if not self._aborted: + self.error_occurred.emit(f"\n[Agent 异常]: {e}") + return + + if self._aborted: + return # 取消路径:UI 已自行清理,不回退时间线 + + # 注:压缩事件(context_compacted)已由 on_compaction_finished 在压缩结束 + # 瞬间实时发出(气泡即时定格),这里不再重复 flush runner.compaction_events + + if result.error is not None and result.stop_reason == "error": + # 恢复逻辑(重试 + 压缩)全部用尽后的终局错误 + self.error_occurred.emit( + f"\n[API 请求异常]: {result.error.message or '未知错误'}") + + # ------------------------------------------------------------------ + # 供 UI 读取最终状态(入库用) + # ------------------------------------------------------------------ + def final_messages(self) -> List[AgentMessage]: + return list(self._agent.state.messages) if self._agent else [] + + +class ChatWorker(QThread): + """ + chat 模式 —— 普通聊天:单次流式补全(对照旧 LLMWorker 的行为)。 + 不进入 agent 循环:无工具调用、无重试、无压缩。 + worker 模式请用 AgentWorker。 + """ + + chunk_received = pyqtSignal(str) + reasoning_received = pyqtSignal(str) + error_occurred = pyqtSignal(str) + # 🆕 P1: 收到精确 usage(UI 上下文标签 usage 锚定) + usage_updated = pyqtSignal(dict) + + def __init__(self, provider_name: str, model_name: str, + openai_messages: List[Dict[str, Any]], + temperature: Optional[float] = None): + super().__init__() + self.provider_name = provider_name + self.model_name = model_name + self.openai_messages = openai_messages + self._temperature_override = temperature + self.config = _load_config() + self._cancelled = False + + def cancel(self): + self._cancelled = True + + def abort(self): + self._cancelled = True + + def run(self): + p = _provider_info(self.config, self.provider_name) + if not p: + self.error_occurred.emit(f"未找到 provider 配置: {self.provider_name}") + return + model = self._build_model_config(p) + max_tokens = int(p.get("model_max_tokens", {}).get(self.model_name, 8192)) + try: + client = OpenAI(api_key=p.get("api_key", ""), + base_url=p.get("base_url", "https://api.openai.com/v1"), + timeout=model.timeout_seconds, max_retries=0) + response = client.chat.completions.create( + model=self.model_name, + messages=self.openai_messages, + stream=True, + temperature=model.temperature, + max_tokens=max_tokens, + # 🆕 P1: 拿精确 usage 供上下文标签锚定(对照 pi stream_options) + stream_options={"include_usage": True}, + ) + for chunk in response: + if self._cancelled: + try: + response.close() + except Exception: + pass + return + # 🆕 P1/M2: usage 读取(含 choice 兜底) + _u = _pick_usage(chunk) + if _u is not None and ( + getattr(_u, "prompt_tokens", 0) or getattr(_u, "completion_tokens", 0)): + self.usage_updated.emit({ + "input": getattr(_u, "prompt_tokens", 0) or 0, + "output": getattr(_u, "completion_tokens", 0) or 0, + "cacheRead": 0, "cacheWrite": 0, + }) + if not chunk.choices: + continue + delta = chunk.choices[0].delta + # 🆕 M1: 思考字段优先级对照 pi(reasoning_content/reasoning/reasoning_text) + _r = _pick_reasoning(delta) + if _r: + self.reasoning_received.emit(_r) + if delta.content: + self.chunk_received.emit(delta.content) + except Exception as e: + if not self._cancelled: + self.error_occurred.emit(str(e)) + + def _build_model_config(self, p: dict) -> ModelConfig: + context_window = int(p.get("model_contexts", {}).get(self.model_name, 128000)) + temperature = (self._temperature_override + if self._temperature_override is not None + else float(self.config.get("temperature", 0.7))) + return ModelConfig( + provider=self.provider_name, + name=self.model_name, + context_window=context_window, + max_tokens=int(p.get("model_max_tokens", {}).get(self.model_name, 8192)), + temperature=temperature, + api_key=p.get("api_key", ""), + base_url=p.get("base_url", "https://api.openai.com/v1"), + # 🆕 thinking reasoning_content 回传默认开启 + ) + + +class TitleWorker(QThread): + """标题生成:单次流式补全(保留原信号面)""" + + chunk_received = pyqtSignal(str) + error_occurred = pyqtSignal(str) + + def __init__(self, provider_name: str, model_name: str, + openai_messages: List[Dict[str, Any]]): + super().__init__() + self.provider_name = provider_name + self.model_name = model_name + self.openai_messages = openai_messages + self.config = _load_config() + self._cancelled = False + + def cancel(self): + self._cancelled = True + + def run(self): + p = _provider_info(self.config, self.provider_name) + if not p: + return + try: + client = OpenAI(api_key=p.get("api_key", ""), + base_url=p.get("base_url", "https://api.openai.com/v1"), + timeout=60.0, max_retries=0) + temperature = float(self.config.get("temperature", 0.7)) + response = client.chat.completions.create( + model=self.model_name, + messages=self.openai_messages, + stream=True, + temperature=temperature, + max_tokens=60, + ) + for chunk in response: + if self._cancelled: + try: + response.close() + except Exception: + pass + return + if chunk.choices: + delta = chunk.choices[0].delta + if delta.content: + self.chunk_received.emit(delta.content) + except Exception as e: + if not self._cancelled: + self.error_occurred.emit(str(e)) diff --git a/core/platform_shell.py b/core/platform_shell.py new file mode 100644 index 0000000..6130212 --- /dev/null +++ b/core/platform_shell.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +"""P1-02:窄平台进程适配 —— 显式 shell 契约 + 进程树终止 + 提示词平台段。 + +契约(不依赖 shell=True 的平台默认值): +- Windows:字符串命令行 ``cmd.exe /d /s /c ""``(/s 保留内部引号; + 不能传 argv 列表——list2cmdline 的引号转义 cmd 不认) +- Linux: ``/bin/bash -lc ``(登录 shell,可读 profile 别名/函数) + +进程树终止: +- Windows:taskkill /F /T(既有等价机制,整树强杀) +- Linux: start_new_session 独立 POSIX 进程组;SIGTERM 整组 → 宽限期 → SIGKILL 整组 + (安全不变量:仅当 getpgid == 子进程 pid,即确认独立组后才 killpg, + 否则退化为单进程 kill,绝不误杀调用方所在组) + +系统提示词:通用正文 + 运行时插入的短平台 shell/path 段(占位符 +``{{SHELL_PLATFORM_SECTION}}``)。不维护两份完整提示词。 +""" +import os +import signal +import subprocess +import time + +#: 系统提示词中的平台段占位符 +SHELL_SECTION_PLACEHOLDER = "{{SHELL_PLATFORM_SECTION}}" + +_KILL_GRACE_S = 3.0 # Linux:SIGTERM → SIGKILL 宽限 +_TASKKILL_TIMEOUT_S = 10 # Windows:taskkill 自身超时 + + +def is_windows() -> bool: + return os.name == "nt" + + +def shell_command(command: str): + """显式 shell 命令(bash 工具的 shell 契约,替代 shell=True 平台默认值)。 + + - Windows:返回**字符串命令行** ``cmd.exe /d /s /c ""``。 + 必须走字符串而非 argv 列表:列表形态会被 CPython ``list2cmdline`` + 给内部引号加反斜杠转义,cmd.exe 不认 ``\"``;字符串形态下命令行 + 原样交给 CreateProcessW,cmd 自行按 /s 规则解析 /c 参数 + (外层引号剥离、内部引号保留,实测引号路径/&&/管道/%VAR% 均正确)。 + - Linux:返回 argv 列表 ``[\ "/bin/bash", "-lc", command]``(POSIX 下 + 列表参数无引号转义问题,-l 登录 shell 可读 profile 别名/函数)。 + """ + if is_windows(): + return 'cmd.exe /d /s /c "' + command + '"' + return ["/bin/bash", "-lc", command] + + +def popen_flags() -> dict: + """进程树管理所需的 Popen 附加参数:Linux 独立进程组。""" + if is_windows(): + return {} + return {"start_new_session": True} + + +def kill_process_tree(proc, grace_s: float = _KILL_GRACE_S) -> None: + """终止 proc 的整棵子进程树;最坏情况也保证返回(不抛异常)。 + + - Windows:taskkill /F /T 整树强杀(既有机制)。 + - Linux:独立进程组 SIGTERM → 宽限 grace_s 秒 → SIGKILL 整组。 + 若无法确认独立组(进程已退 / 标志未生效)→ 退化单进程 kill。 + """ + if proc is None: + return + + if is_windows(): + try: + subprocess.run(["taskkill", "/F", "/T", "/PID", str(proc.pid)], + capture_output=True, timeout=_TASKKILL_TIMEOUT_S) + except Exception: + try: + proc.kill() + except Exception: + pass + return + + # ---- POSIX ---- + pgid = None + try: + pgid = os.getpgid(proc.pid) + except Exception: + pass + if pgid is None or pgid != proc.pid: + # 进程已退出,或没有独立组 → 不能 killpg(可能误伤调用方组) + try: + proc.kill() + except Exception: + pass + return + + def _pg(sig: int) -> None: + try: + os.killpg(pgid, sig) + except Exception: + pass + + _pg(signal.SIGTERM) + deadline = time.time() + grace_s + while time.time() < deadline: + try: + if proc.poll() is not None: + return + except Exception: + return + time.sleep(0.05) + _pg(signal.SIGKILL) + + +# ---------------------------------------------------------------------- +# 系统提示词平台段(短段,运行时插入;通用正文保持平台无关) +# ---------------------------------------------------------------------- + +_WIN_SECTION = """### 1.1 平台 shell 与路径(Windows) + +- 操作系统:Windows。路径形如 `C:\\Users\\14890\\Desktop\\haocode`;不确定真实路径时先 `dir` / `ls`。 +- bash 命令经 **cmd.exe** 执行(不是 git-bash);`C:\\Program Files\\Git\\usr\\bin` 在 PATH 上, + `ls` `grep` `cat` `head` `tail` `wc` `rm` `sed` `awk` 可直接用,`|` `>` `2>&1` `&&` 可用。 +- ⚠️ cmd 陷阱:`;` 不是分隔符(用 `&&` 或换行);环境变量用 `%VAR%`(`$VAR` 不展开); + 内建命令不剥单引号(`echo 'x'` 原样带引号);每次调用都是新进程,`cd` 不跨调用保留 + (写 `cd core && <命令>`);需要 `for` / `$(...)` / `[ ]` 测试等真实 bash 语义时 + 一律 `bash -c "..."`。""" + +_LINUX_SECTION = """### 1.1 平台 shell 与路径(Linux) + +- 操作系统:Linux。路径为 POSIX 风格(`/home/user/...`、`/tmp/...`)。 +- bash 命令经 **/bin/bash -lc** 执行(登录 shell):`;` `&&` `|` `$(...)`、单引号、 + 环境变量 `$VAR`、profile 里的别名与函数都可用。 +- 每次调用都是新进程:`cd` 不跨调用保留(写 `cd core && <命令>` 或直接用绝对路径)。""" + + +def shell_prompt_section() -> str: + """当前平台的短 shell/path 段。""" + return _WIN_SECTION if is_windows() else _LINUX_SECTION + + +def apply_platform_section(text: str) -> str: + """把占位符替换为当前平台段;无占位符(如兜底提示词)时原样返回。""" + if SHELL_SECTION_PLACEHOLDER in text: + return text.replace(SHELL_SECTION_PLACEHOLDER, shell_prompt_section()) + return text diff --git a/core/renderer_backend.py b/core/renderer_backend.py new file mode 100644 index 0000000..1635422 --- /dev/null +++ b/core/renderer_backend.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +"""P1-03:渲染器后端选择 + QtWebEngine profile/sandbox 适配(小模块,仅 stdlib,可在导入 PyQt6 前使用)。 + +契约见 docs/agent-handoff/PLATFORM_PLAN.md「浏览器后端」「Chromium sandbox」: + +- 平台矩阵:Windows 首选 WebView2、失败回落 QtWebEngine;非 Windows 只走 QtWebEngine + (非 Windows 不探测/导入/加载 WebView2 —— 由 main_window 的导入门控保证)。 +- ``webview_backend`` 配置值 ∈ {auto, webview2, qtwebengine};非法值 → 可见警告 + + 回落平台默认,绝不阻断源码启动。 +- 每个 QtWebEngine 实例使用独立 profile/storage 目录:源码运行阶段位于项目 + ``data/webengine/`` 范围;自动化测试用 ``HAOCODE_WEBENGINE_PROFILE_DIR`` 重定向到 + 临时目录。实例间不互相清理对方 profile。 +- Chromium sandbox 默认保留。仅当运行者显式在 ``QTWEBENGINE_CHROMIUM_FLAGS`` 中加入 + ``--no-sandbox`` 且当前确认为 root/容器场景时才接受(打印高可见警告); + 普通桌面运行中的 ``--no-sandbox`` 会被剥离并告警。 +""" +import os +import sys +import time + +#: webview_backend 合法配置值 +VALID_BACKENDS = ("auto", "webview2", "qtwebengine") + +_NO_SANDBOX = "--no-sandbox" + + +def is_windows() -> bool: + return sys.platform == "win32" + + +def platform_default_backend() -> str: + """平台默认渲染器:Windows → webview2;其余 → qtwebengine。""" + return "webview2" if is_windows() else "qtwebengine" + + +def resolve_backend(pref) -> "tuple[str, str | None]": + """归一化 ``webview_backend`` 配置(不抛异常)。 + + 返回 ``(backend, warning)``:backend ∈ {"webview2", "qtwebengine"}; + warning 为 None 或需要可见打印的警告(非法值 / 平台不支持)。 + """ + default = platform_default_backend() + if not isinstance(pref, str): + return default, (f"[Renderer] ⚠️ webview_backend 配置非法: {pref!r}" + f"(应为字符串 auto/webview2/qtwebengine)→ 回落平台默认 {default}") + p = pref.strip().lower() + if p not in VALID_BACKENDS: + return default, (f"[Renderer] ⚠️ webview_backend 配置非法: {pref!r}" + f"(允许 {('/'.join(VALID_BACKENDS))})→ 回落平台默认 {default}") + if p == "auto": + return default, None + if p == "webview2" and not is_windows(): + return "qtwebengine", (f"[Renderer] ⚠️ webview_backend=webview2 但当前平台为 {sys.platform}" + f"(WebView2 仅 Windows 支持)→ 回落 qtwebengine") + return p, None + + +def webview2_module(): + """按需加载 core.webview2:非 Windows 永不导入(不触达 pythonnet/Win32/DLL/taskkill)。 + + main_window 在模块级用 `sys.platform == "win32"` 门控导入;本函数供其他入口复用同一门控。 + """ + if not is_windows(): + return None + try: + from core import webview2 + except Exception as e: + print(f"[WV2] 后端不可用(回落 QtWebEngine): {e}") + return None + return webview2 + + +def webengine_profile_name() -> str: + """当前实例的 QtWebEngine profile 名(进程 pid + 启动毫秒时间戳,天然唯一)。 + + 两个并行源码实例 → 两个不同 profile 名 → 两个独立 Chromium profile 目录,互不争用。 + """ + return f"profile_{os.getpid()}_{int(time.time() * 1000)}" + + +def webengine_profile_dir(profile_name: str | None = None) -> str: + """当前实例的独立 profile/storage 目录(源码运行在 data/webengine/;测试经环境变量重定向)。 + + 返回目录已确保存在。本函数【不删除】任何已有目录(实例间不互相清理)。 + """ + name = profile_name or webengine_profile_name() + base = os.environ.get("HAOCODE_WEBENGINE_PROFILE_DIR", "").strip() + if not base: + base = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "data", "webengine") + d = os.path.join(base, name) + try: + os.makedirs(d, exist_ok=True) + except Exception: + pass + return d + + +# ---------------------------------------------------------------------- +# Chromium sandbox 契约 +# ---------------------------------------------------------------------- + +_CONTAINER_MARKERS = ("/.dockerenv", "/run/.containerenv", "/.lxc") +_CGROUP_HINTS = ("docker", "containerd", "kubepods", "lxc") + + +def is_root_or_container() -> bool: + """root/容器场景探测(仅 POSIX 有意义;Windows 恒 False)。""" + if os.name != "posix": + return False + try: + if os.geteuid() == 0: + return True + except Exception: + pass + for marker in _CONTAINER_MARKERS: + try: + if os.path.exists(marker): + return True + except Exception: + pass + try: + with open("/proc/1/cgroup", "r", encoding="utf-8", errors="replace") as f: + cgroup = f.read() + if any(k in cgroup for k in _CGROUP_HINTS): + return True + except Exception: + pass + return False + + +def sanitize_chromium_flags(flags: str, verbose: bool = True) -> str: + """按契约处理 ``QTWEBENGINE_CHROMIUM_FLAGS`` 中的 ``--no-sandbox``(main.py 在导入 PyQt6 前调用)。 + + - 显式带 ``--no-sandbox``: + - root/容器场景 → 保留 + 高可见风险提示; + - 普通桌面 → 剥离并告警(普通运行不得关闭 sandbox)。 + - 未带 ``--no-sandbox``: + - root/容器场景 → 提示可能需显式设置; + - 其余原样返回。 + """ + def _say(msg: str) -> None: + if verbose: + print(msg, flush=True) + + tokens = (flags or "").split() + has_ns = _NO_SANDBOX in tokens + rootc = is_root_or_container() + if has_ns: + if rootc: + _say("[Renderer] ⚠️⚠️ 高可见警告:已启用 --no-sandbox(显式配置 + 确认为 root/容器场景)。" + "Chromium 沙箱已关闭,攻击面显著增大;仅限 root/容器调试环境," + "普通桌面运行请勿使用。") + return flags + stripped = " ".join(t for t in tokens if t != _NO_SANDBOX) + _say("[Renderer] ⚠️ QTWEBENGINE_CHROMIUM_FLAGS 含 --no-sandbox,但当前是普通桌面运行" + "(非 root/非容器)→ 已剥离该标志并保留 Chromium 沙箱。" + "如确属 root/容器环境,请检查运行环境识别是否正确。") + return stripped + if rootc: + _say("[Renderer] ⚠️ 检测到 root/容器环境:Chromium 沙箱可能无法启动。" + "若页面空白,请显式在 QTWEBENGINE_CHROMIUM_FLAGS 中加入 --no-sandbox" + "(显式选择,启动时会打印风险警告)。") + return flags or "" diff --git a/core/webview2.py b/core/webview2.py new file mode 100644 index 0000000..5742cc2 --- /dev/null +++ b/core/webview2.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- +""" +WebView2 后端(Windows 首选浏览器内核,失败自动回落 QtWebEngine)。 + +设计要点(来自 P1 实验 tests/_tmp_wv2_demo.py 的实测结论): +1. pythonnet + WebView2 .NET SDK(vendor/webview2/ 内 net462 Core.dll + webview2loader_x64.dll) +2. 必须 OleInitialize(STA)后才能 CreateAsync +3. 本机的 SDK 怪癖:传任何非空 user_data_folder 都报 RuntimeNotFound → 一律用默认 profile(ud=None) +4. 残留 msedgewebview2.exe 会锁默认 profile(0x800700AA)→ 初始化前 taskkill +5. .NET 版 CoreWebView2 不暴露子窗口 HWND → EnumChildWindows 找 Chrome_WidgetWin_* 类 +6. 子窗口天然是 Qt 顶层窗口的子 HWND,不需要 QWindow.fromWinId 包装(对子窗口会失败), + 由 Qt 布局算 slot 矩形后用 SetBoundsAndZoomFactor 驱动(父窗客户区物理像素) +7. JS→Python 用 WebMessageReceived(JSON),Python→JS 用 ExecuteScriptAsync(与现有 + ChatBridge.run_js 生成的 JS 调用文本完全同构,前端零改动;仅 index.html 的 + window.bridge bootstrap 走双协议) +""" +import os +import sys +import time +import shutil +import subprocess + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +WV2_DIR = os.path.join(ROOT, "vendor", "webview2") +CORE_DLL = os.path.join(WV2_DIR, "net462_Microsoft.Web.WebView2.Core.dll") +LOADER = os.path.join(WV2_DIR, "webview2loader_x64.dll") + +_env = None +_System = None # pythonnet 加载后缓存 +_INSTANCE_LOCK = {"fh": None} + + +def _instance_lock_path(): + # 可覆盖(测试隔离用:HAOCODE_INSTANCE_LOCK_FILE 指向临时文件, + # 否则测试会与正在运行的 app 争同一把锁 → 断言依赖环境) + p = os.environ.get("HAOCODE_INSTANCE_LOCK_FILE") + if p: + return p + d = os.path.join(ROOT, "data") + try: + os.makedirs(d, exist_ok=True) + except Exception: + pass + return os.path.join(d, "app_instance.lock") + + +def acquire_instance_lock(): + """独占 data/app_instance.lock(非阻塞)。 + + 返回 True = 本机唯一实例 → 可安全 taskkill 残留 msedgewebview2.exe + False = 已有实例在跑 → 必须回落 QtWebEngine + None = 平台不支持/异常(保守当“不确定”处理) + + 🐛 T0 根因:本函数存在之前,每个 MainWindow()(包括 offscreen 测试)都会走到 + _get_environment() 里的 `taskkill /F /IM msedgewebview2.exe`, + 把【当时正在运行的生产 app】的 WebView2 浏览器进程一并杀掉 + → 它的 controller 变 disposed(set_bounds 报 0x8007139F) + → DOM 照渲染但视觉层永久空白(= “选中会话不渲染核心内容”)。 + """ + if sys.platform != "win32": + return None + if _INSTANCE_LOCK["fh"] is not None: + return True + fh = None + try: + import msvcrt + fh = open(_instance_lock_path(), "a+b") + fh.seek(0) # 固定锁位置(锁定前 1 字节),不依赖 append 模式的当前位置 + msvcrt.locking(fh.fileno(), msvcrt.LK_NBLCK, 1) + _INSTANCE_LOCK["fh"] = fh + return True + except Exception: + try: + if fh is not None: + fh.close() + except Exception: + pass + return False + + +def _wv2_allowed_here() -> bool: + """无头/测试环境一律不得碰 WebView2(共享默认 profile,一碰就可能误杀在生产实例)""" + if os.environ.get("HAOCODE_FORCE_QTWEBENGINE", "") in ("1", "true", "True"): + return False + plat = (os.environ.get("QT_QPA_PLATFORM") or "").strip().lower() + if plat and plat != "windows": + return False + return True + + +def _pump_wait(op, app, timeout=15.0): + """在 Qt 事件循环里等 .NET Task 完成(WebView2 初始化依赖消息泵)""" + t0 = time.time() + while not op.IsCompleted and time.time() - t0 < timeout: + app.processEvents() + time.sleep(0.005) + if not op.IsCompleted: + raise TimeoutError("WebView2 operation timed out") + if op.IsFaulted: + raise RuntimeError(str(op.Exception)) + return op.Result + + +def _ts(): + """启动链时间戳(WebView2 冷启动耗时诊断,保留)""" + t = time.time() + return time.strftime("%H:%M:%S", time.localtime(t)) + f".{int(t*1000) % 1000:03d}" + + +def get_environment(app): + """初始化并返回 CoreWebView2Environment 单例;任何失败返回 None(调用方回落 QtWebEngine)""" + global _env + if _env is not None: + return _env + if sys.platform != "win32": + return None + if not (os.path.exists(CORE_DLL) and os.path.exists(LOADER)): + return None + # 🛡 守卫 1:无头/测试环境(QT_QPA_PLATFORM=offscreen 等)绝不启用 WebView2 + if not _wv2_allowed_here(): + print(f"[WV2] QT_QPA_PLATFORM={os.environ.get('QT_QPA_PLATFORM')!r} → 跳过 WebView2," + f"回落 QtWebEngine(无头环境不得触碰共享 profile)") + return None + # 🛡 守卫 2:本机已有实例在跑 → 不启用 WebView2、更不 taskkill(否则会把它的 + # 浏览器进程杀掉 → 对方 controller disposed → 聊天区永久空白) + try: + _lock_ok = acquire_instance_lock() + except Exception: + _lock_ok = None + if _lock_ok is not True: + print("[WV2] 检测到已有 haocode 实例在运行(instance lock 被占)→ " + "本实例回落 QtWebEngine;已跳过 taskkill,不会影响对方渲染") + return None + try: + os.environ["PATH"] = WV2_DIR + ";" + os.environ.get("PATH", "") + try: + os.add_dll_directory(WV2_DIR) + except Exception: + pass + # .NET Core 的 P/Invoke 默认不查 CWD → 把 loader 复制到 CWD 一份 + try: + cwd_loader = os.path.join(os.getcwd(), "WebView2Loader.dll") + if not os.path.exists(cwd_loader): + shutil.copyfile(LOADER, cwd_loader) + except Exception: + pass + import ctypes + ctypes.windll.ole32.OleInitialize(None) # STA(COM 初始化要求) + # 清残留浏览器进程(锁默认 profile 会导致 0x800700AA) + # 🛡 只有【本机唯一实例】才会走到这里(已在上面用 instance lock 保证), + # 否则会把兄弟实例的浏览器进程杀掉 → 对方控制器 disposed → 聊天区空白 + print(f"[WV2] {_ts()} warmup: taskkill 残留进程(唯一实例,安全)...") + try: + subprocess.run(["taskkill", "/F", "/IM", "msedgewebview2.exe"], + capture_output=True, timeout=10) + time.sleep(1.0) + except Exception: + pass + import clr + global _System + # 🐛 部分机器(本机 D: 卷).NET Framework 把工程所在本地卷误判为 + # “网络位置”,clr.AddReference(= Assembly.LoadFrom)报 0x80131515。 + # 快路径保持 LoadFrom(正常机器行为不变);失败回落 Assembly.Load(byte[]), + # 字节加载不做路径信任分类(本机实测:D: 字节加载 OK,类型解析 OK)。 + try: + clr.AddReference(CORE_DLL) + except BaseException as _ex: # pythonnet 的 .NET 异常未必是 Python Exception 子类 + _msg = str(_ex).splitlines()[0][:120] if str(_ex) else type(_ex).__name__ + print(f"[WV2] AddReference 路径加载失败({_msg})→ 回落 Assembly.Load(byte[])") + from System.Reflection import Assembly as _Assembly + with open(CORE_DLL, "rb") as _f: + _Assembly.Load(_f.read()) + import System + _System = System + from Microsoft.Web.WebView2.Core import CoreWebView2Environment + # ⚠️ ud=None:本机 SDK 对非空 user_data 路径报 RuntimeNotFound(实测怪癖) + _env = _pump_wait(CoreWebView2Environment.CreateAsync(None, None, None), app) + print(f"[WV2] {_ts()} Runtime ready: {_env.BrowserVersionString}") + return _env + except BaseException as ex: # pythonnet/.NET 异常未必是 Exception 子类,必须 BaseException + _env = None + print(f"[WV2] init failed → fallback to QtWebEngine: {ex}") + return None + + +class Wv2Session: + """一个 WebView2 实例:controller + 子窗口 + 消息泵 + bounds 驱动""" + + def __init__(self, env, parent_hwnd, app): + self.app = app + print(f"[WV2] {_ts()} controller create begin (hwnd={parent_hwnd:#x})") + self.controller = _pump_wait( + env.CreateCoreWebView2ControllerAsync(_System.IntPtr(int(parent_hwnd))), app) + print(f"[WV2] {_ts()} controller ready") + self.core = self.controller.CoreWebView2 + try: + self.core.Settings.AreDefaultContextMenusEnabled = False + self.core.Settings.IsZoomControlEnabled = False + self.core.Settings.IsStatusBarEnabled = False + except Exception: + pass + self.child_hwnd = 0 + self.on_message = None # callable(dict) —— main_window 绑定到 ChatBridge + self.on_load_finished = None # callable() —— WebView2View 绑定 loadFinished 信号 + self._msg_handler = self._make_msg_handler() + self.core.add_WebMessageReceived(self._msg_handler) + self._nw_handler = self._make_navigated_handler() + self.core.add_NavigationCompleted(self._nw_handler) + # 🆕 真异步 JS 执行队列:单一定时器轮询完成,回调从主线程定时器发出。 + # (旧版 execute_js_async 是阻塞忙等 + processEvents → 从定时器/事件回调里调用 + # 时产生重入嵌套事件循环 → COM 事件分发崩溃 → 启动卡死/拖动时 webview 不刷新) + self._js_pending = [] # [task, cb, t0] + from PyQt6.QtCore import QTimer + self._js_pump = QTimer() + self._js_pump.setInterval(25) + self._js_pump.timeout.connect(self._js_pump_tick) + self._js_pump.start() + # 🆕 预热:立即导航 about:blank,让 msedgewebview2 进程/GPU 在 UI 构建期间冷启动 + # (实测本机首次真实页面导航需 12-15s,预热后降到 ~1s) + try: + print(f"[WV2] {_ts()} warmup: Navigate about:blank") + self.core.Navigate("about:blank") + except Exception as ex: + print("[WV2] warmup navigate error:", ex) + + # ---------- 事件 ---------- + def _make_msg_handler(self): + import json + from System import EventHandler + from Microsoft.Web.WebView2.Core import CoreWebView2WebMessageReceivedEventArgs + + def handler(sender, args): + try: + data = json.loads(args.WebMessageAsJson) + if self.on_message: + self.on_message(data) + except Exception as ex: + print("[WV2] message error:", ex) + return EventHandler[CoreWebView2WebMessageReceivedEventArgs](handler) + + def _make_navigated_handler(self): + from System import EventHandler + from Microsoft.Web.WebView2.Core import CoreWebView2NavigationCompletedEventArgs + + def handler(sender, args): + try: + src = self.core.Source or "" + except Exception: + src = "?" + print(f"[WV2] {_ts()} NavigationCompleted src={src}") + # 预热页(about:blank)的加载完成不触发 loadFinished(避免 JS 探针空转) + if src.startswith("about:blank"): + return + if self.on_load_finished: + self.on_load_finished() + return EventHandler[CoreWebView2NavigationCompletedEventArgs](handler) + + # ---------- 子窗口发现(.NET 不暴露 HWND,轮询枚举) ---------- + def find_child_once(self): + """单次探测;找到返回 hwnd,否则 0(非阻塞,供 UI 线程定时器调)""" + import ctypes + import ctypes.wintypes as wt + u32 = ctypes.windll.user32 + parent = wt.HWND(self.controller.ParentWindow.ToInt64()) + found = [] + + @ctypes.WINFUNCTYPE(wt.BOOL, wt.HWND, wt.LPVOID) + def cb(h, _): + buf = ctypes.create_unicode_buffer(256) + u32.GetClassNameW(h, buf, 256) + if buf.value.startswith("Chrome_WidgetWin"): + found.append(h) + return True + + u32.EnumChildWindows(parent, cb, None) + if found: + self.child_hwnd = int(found[0]) + return self.child_hwnd + return 0 + + def find_child(self): + """同步等待并返回 Chrome_WidgetWin_* 子 HWND(最多 10s)""" + import ctypes + import ctypes.wintypes as wt + u32 = ctypes.windll.user32 + parent = wt.HWND(self.controller.ParentWindow.ToInt64()) + for _ in range(200): + found = [] + + @ctypes.WINFUNCTYPE(wt.BOOL, wt.HWND, wt.LPVOID) + def cb(h, _): + buf = ctypes.create_unicode_buffer(256) + u32.GetClassNameW(h, buf, 256) + if buf.value.startswith("Chrome_WidgetWin"): + found.append(h) + return True + + u32.EnumChildWindows(parent, cb, None) + if found: + self.child_hwnd = int(found[0]) + return self.child_hwnd + self.app.processEvents() + time.sleep(0.05) + return 0 + + # ---------- 几何 ---------- + def set_visible(self, visible: bool): + try: + self.controller.IsVisible = bool(visible) + except Exception: + pass + + def set_bounds(self, left, top, width, height): + """父窗客户区物理像素""" + try: + from System.Drawing import Rectangle as _Rect + self.controller.SetBoundsAndZoomFactor(_Rect(int(left), int(top), + int(width), int(height)), 1.0) + except Exception as ex: + print("[WV2] set_bounds error:", ex) + + def child_size(self): + """子窗口当前屏幕像素尺寸(观察用)""" + if not self.child_hwnd: + return (0, 0) + import ctypes + import ctypes.wintypes as wt + r = wt.RECT() + if ctypes.windll.user32.GetWindowRect(wt.HWND(self.child_hwnd), ctypes.byref(r)): + return (r.right - r.left, r.bottom - r.top) + return (0, 0) + + # ---------- JS ---------- + def navigate(self, url: str): + print(f"[WV2] {_ts()} navigate {url[:80]}") + try: + self.core.Navigate(url) + except Exception as ex: + print("[WV2] navigate error:", ex) + + def execute_js(self, script: str): + """fire-and-forget(ChatBridge.run_js 的替换,JS 文本完全同构)""" + self._js_run(script, None) + + def execute_js_async(self, script: str, cb): + """带回调执行:真异步,回调在主线程定时器 tick 中发出(绝不阻塞)""" + self._js_run(script, cb) + + def _js_run(self, script: str, cb): + try: + task = self.core.ExecuteScriptWithResultAsync(script) + except Exception as ex: + print("[WV2] execute_js error:", ex) + if cb: + try: + cb(None) + except Exception: + pass + return + self._js_pending.append([task, cb, time.time()]) + + def _js_pump_tick(self): + if not self._js_pending: + return + import json + remaining = [] + for task, cb, t0 in self._js_pending: + done = False + try: + done = task.IsCompleted + except Exception: + done = True + if not done and time.time() - t0 > 10: + done = True # 10s 安全超时(渲染器死亡时不永久卡队列) + if not done: + remaining.append([task, cb, t0]) + continue + result = None + try: + if task.IsCompleted and not task.IsFaulted: + r = task.Result # CoreWebView2ExecuteScriptResult 包装结构 + if getattr(r, "Succeeded", True): + s = r.ResultAsJson # JSON 编码字符串(或 null) + if s: + result = json.loads(s) + if isinstance(result, str): + try: + result = json.loads(result) + except Exception: + pass + except Exception as ex: + print("[WV2] js result decode error:", ex) + if cb: + try: + cb(result) + except Exception as ex: + print("[WV2] js callback error:", ex) + self._js_pending = remaining + + def close(self): + try: + self._js_pump.stop() + except Exception: + pass + self._js_pending = [] + try: + self.core.remove_WebMessageReceived(self._msg_handler) + except Exception: + pass + try: + self.core.remove_NavigationCompleted(self._nw_handler) + except Exception: + pass + try: + self.controller.Close() + except Exception: + pass diff --git a/docs/agent-handoff/CURRENT_STATE.md b/docs/agent-handoff/CURRENT_STATE.md new file mode 100644 index 0000000..7ce636a --- /dev/null +++ b/docs/agent-handoff/CURRENT_STATE.md @@ -0,0 +1,110 @@ +# 当前代码状态与结构审计 + +> 用途:处理结构、命名、模块边界或技术债任务前读取。本文只记录已经由源码确认的现状;精确实现仍以当前源码为准。修复顺序和验收要求见 [REPAIR_BACKLOG.md](REPAIR_BACKLOG.md) 与 [VERIFICATION.md](VERIFICATION.md)。 + +## 结论 + +项目的目录分层和文件命名总体符合 Python、JavaScript 与 Qt 项目的常见习惯,不需要为了“看起来规范”而批量改名或搬目录。当前主要风险不在命名,而在以下位置: + +- `ui/views/main_window.py` 承担窗口组装、浏览器选择、会话、附件、截图、弹层和大量事件处理,已经形成高耦合中心。 +- `ui/web/app.js` 同时负责渲染、流式更新、历史、分支和交互状态,Python 与 JavaScript 之间没有显式协议定义。 +- Windows 专用的 WebView2、全局热键、进程终止和路径假设尚未被完整隔离,Linux 不能仅凭“Python 跨平台”获得支持。 +- 测试入口聚合不完整(P2-04 待实施);配置重定向与运行时数据隔离已由 P0-01 统一(见 [REPAIR_BACKLOG.md](REPAIR_BACKLOG.md) P0-01 与 evidence/P0-01.md)。 +- 根目录旧文档混有过时描述;它们不能继续作为实现依据。 + +当前阶段允许修复错误、添加测试和添加小型平台适配器,但不移动或拆分现有模块。超大文件是已记录技术债,不是本轮重构授权。 + +## 目录职责 + +| 路径 | 当前职责 | 审计判断 | +| --- | --- | --- | +| `main.py` | 进程入口、标准输出保护、QtWebEngine 启动参数、`QApplication` 和主窗口创建 | 入口职责基本合理;渲染参数需要区分平台 | +| `core/` | 数据库、LLM 工作线程、日志和 WebView2 后端 | 名称规范;仍含 Windows 专用实现和配置路径旁路 | +| `core/agent/` | 与 pi 对齐的 agent 循环、上下文、压缩、恢复和内置工具 | 应继续保持 GUI-free、可离线测试 | +| `ui/views/` | PyQt6 窗口、桥接层和浏览器包装 | 边界最薄弱;`main_window.py` 是主要风险点 | +| `ui/views/system_tools/` | 文件读取、全局热键、屏幕截图 | 适合作为平台适配落点;当前实现以 Windows 为中心 | +| `ui/web/` | 离线 HTML/CSS/JavaScript 聊天界面和 vendored 前端库 | 无需构建步骤;历史窗口状态机尚未独立 | +| `tools/builtin_tools/` | 面向 agent 的独立实用工具 | 当前仅有 PDF 读取器;与其他两类“工具”需用全路径区分 | +| `tests/` | 纯逻辑测试、offscreen smoke、诊断与人工验证脚本 | 命名前缀有约定,但聚合入口没有覆盖全部自动化测试 | +| `data/` | 源码运行时的配置、数据库和附件 | 本阶段保留项目内路径;凭据处理遵循 [README.md](README.md) 的硬性边界 | +| `vendor/webview2/`、`WebView2Loader.dll` | Windows WebView2 运行依赖 | 只允许 Windows 路径加载,不能成为 Linux 启动前置条件 | +| `svg/` | UI 图标 | 目录职责清晰 | + +## 命名规范审计 + +| 范围 | 现状 | 结论 | +| --- | --- | --- | +| Python 文件、函数、变量 | 基本使用 `snake_case` | 符合 PEP 8 常规写法 | +| Python 类 | 基本使用 `PascalCase` | 符合惯例 | +| Qt 覆盖方法 | 使用 `eventFilter`、`closeEvent` 等 Qt 固定名称 | 正确例外,不应改成 `snake_case` | +| QWebChannel/JS 可调用接口 | 存在 camelCase 名称 | 跨语言协议名称可保留,但必须集中记录 | +| JavaScript | 主要使用 `camelCase` | 符合惯例 | +| CSS | 选择器和属性使用 Web 常规形式 | 符合惯例 | +| 测试文件 | `test_*`、`smoke_*`、`diag_*`、`verify_*`、`tune_*` | 前缀表达运行性质,约定合理 | + +以下名称有可读性或发布规范问题,但不应在当前修复阶段批量改名: + +- `Frame.md` 语义过宽,且与 `readme.md`、`ARCHITECTURE.md` 的职责重叠。旧文档只作历史资料。 +- `readme.md` 的大小写不影响源码运行;是否改成 `README.md` 留到仓库整理阶段。 +- `db_manager.py`、`llm_engine.py` 等名称合规,但 “manager/engine” 隐藏了较宽职责;先通过边界文档约束新增代码。 +- `core/agent` 的版本字符串不是标准 PEP 440 形式;打包阶段再统一。 +- “工具”同时指 agent 的 `read/bash/write/edit`、`tools/builtin_tools/` 实用工具和 `ui/views/system_tools/` 桌面集成。任务与文档必须使用完整路径或明确类别,不能只写“tool”。 + +## 已确认的结构与行为缺陷 + +### 配置和测试隔离 + +- 已解决(P0-01):所有运行时配置读取统一经 `core/config_paths`(`HAOCODE_CONFIG_FILE` 优先);`tests/test_config_isolation.py` 用打开路径拦截器证明真实配置从未被打开。 +- 新测试必须在导入 `MainWindow` 及相关模块前同时重定向数据库和配置(统一用 `tests/_test_env.py` 的 `isolate()`),并检查被测模块是否缓存了路径常量。 +- 少数 GUI 测试(`smoke_offscreen.py`、`smoke_mode.py`、`smoke_copy_session.py`)自身只重定向数据库、未设置 `HAOCODE_CONFIG_FILE`;独立运行时由环境注入临时配置,P2-04 聚合入口将按子进程强制注入。 +- `tests/run_tests.py` 当前不是全套测试聚合器,不能把一次成功运行等同于整个 `tests/` 目录通过。 + +### UI 和事件处理 + +- 已解决(P0-02):`MainWindow` 重复定义的 `eventFilter` 已合并为一份;发送规则收进 `send_message(from_enter=...)` 单一实现(见 evidence/P0-02.md)。 +- UI 层存在直接 SQL 和跨模块私有成员访问,导致数据库、窗口和渲染状态相互渗透。当前只修复会造成实际错误的调用,不展开分层重构。 +- 原生窗口型 WebView2 与 Qt 弹层的遮挡关系需要逐个验证;重命名弹层是已确认案例,不能假定所有 QWidget 弹层都会自然显示在 WebView2 之上。 + +### Python 与 JavaScript 边界 + +- 当前通过 `ui/views/chat_bridge.py`、直接 JavaScript 执行以及硬编码函数名传递状态,没有协议版本、载荷 schema 或统一错误回传。 +- 当前没有“按边界消息 ID + 方向”请求历史页的 JS→Python 协议。现有消息缓冲也不足以重建附件、时间线、工具输出和分支关系完整的历史项。 +- 建立历史滑动窗口时,必须传递完整消息描述符,并用会话/分支 generation 丢弃过期响应;不能让前端自行拼接不完整历史。 +- 跨语言公开名称一旦落地即视为协议。实现 Agent 应把请求、响应、错误和重置事件集中列在同一处,并用契约测试锁定。 + +### 平台边界 + +- `core/webview2.py`、`ui/views/wv2_view.py` 和相关进程处理是 Windows 专用路径;Linux 只能选择 QtWebEngine。 +- `ui/views/system_tools/global_hotkey.py` 使用 Windows 原生 API,Linux 导入和运行路径尚未隔离。 +- agent 的 bash 工具使用隐式 shell 选择:Windows 通常落到 `cmd.exe`,Linux 通常落到 `/bin/sh`,不满足既定的 `/bin/bash -lc` 契约。 +- Windows 使用进程树终止手段;POSIX 侧尚无对完整进程组的等价取消/超时保证。 +- 项目中的 Windows 路径、动态库和 WebView2 探测不能在 Linux 启动阶段被无条件访问。 + +### 文档和仓库状态 + +- `ARCHITECTURE.md` 仍含旧产品名和失效目录;误拼接的外部修复文档已经移除,文件顶部已明确标记为历史资料。 +- 第三方修复要求提到的 `haocode.spec`、`pyi_rth_trace.py`、`tests/diag_render_scale.py`、`tests/diag_panel_scrollbar.py` 和 `tests/diag_rename_overlay.py` 当前不存在。上述三个 `tests/diag_*` 脚本可按任务新建;两个打包文件属于后续阶段。 +- 工作区没有可用 Git 历史,不能引用不存在的基线提交,也不应擅自初始化仓库。任务清单仍按可独立提交的粒度书写,供未来接入版本控制。 +- 源码树存在 `__pycache__`、数据库、日志和锁等运行产物。当前不做清理工程;测试必须使用临时位置,避免继续污染生产数据。 + +## 应保持的边界 + +1. `core/agent/` 保持 GUI-free;纯 agent 行为可不创建 `QApplication` 直接测试。 +2. 浏览器差异留在 WebView2/QtWebEngine 适配层,不把后端判断散落到业务逻辑。 +3. 系统热键、截图和 shell 通过最小平台适配接口选择实现;Windows 模块与 Linux 模块只在对应平台延迟导入。 +4. 数据库存取继续由 `core/db_manager.py` 承担;新的 UI 功能不要增加直接 SQL。 +5. Python↔JavaScript 载荷使用完整、可测试的描述符;DOM 只保存当前窗口,不承担持久化或完整会话真相。 +6. 运行时秘密边界、任务范围和验证要求分别以本目录的 `README.md`、`REPAIR_BACKLOG.md` 和 `VERIFICATION.md` 为准。 + +## 本阶段明确延后 + +- 拆分 `main_window.py`、`app.js` 或迁移现有模块。 +- 批量重命名文件、类或公开跨语言接口。 +- PyInstaller/其他打包配置、安装器、AppData/XDG 数据目录迁移。 +- WebKitGTK 或其 Qt 封装。 +- 通用键盘钩子框架;Linux 只实现现有截图快捷键需要的能力。 +- agent shell 沙盒、命令审批、路径权限边界。 +- 新工具注册系统、参考其他 harness 增加功能或改变 pi 对齐目标。 +- Ubuntu 以外 Linux 发行版的支持承诺。 + +结构或命名任务只有在“发现的问题已逐项归类为确定缺陷、已接受技术债或明确延后,并且没有借机移动/拆分模块”时才算审计完成。 diff --git a/docs/agent-handoff/EXECUTION_STATE.md b/docs/agent-handoff/EXECUTION_STATE.md new file mode 100644 index 0000000..391dbba --- /dev/null +++ b/docs/agent-handoff/EXECUTION_STATE.md @@ -0,0 +1,65 @@ +# 全量修复执行状态 + +状态:ACTIVE +总目标:完成 REPAIR_BACKLOG.md 中所有待实施任务 + +## 调试铁律(跨压缩持久,每次恢复后必须遵守) + +- **所有调试命令、测试与诊断脚本执行都必须设置显式的最长耗时预算(timeout)**。 +- 若中途因超时跳出,先定位卡点,再允许延长预算重跑;**严禁不设超时让它无限卡死**。 + +当前任务:全部完成(P0-01 → P2-04) +当前阶段:COMPLETE(自动化部分;Windows 真机双渲染路径已验证;Linux 真机平台验证项见各任务 evidence) +最后完成动作:Windows 真机验证 —— ① `core/webview2.py` 加 byte[] 加载回落(本机 D: 卷 .NET “网络位置”怪癖),真桌面 WebView2 启动成功(Runtime 153.0.4234.32、controller ready、NavigationCompleted、截图像素证实聊天区真实 DOM 渲染);② `HAOCODE_FORCE_QTWEBENGINE=1` 真桌面回落验证(独立 per-instance profile、无 taskkill、渲染正常);③ P2-02 真机截图(diag_panel_scrollbar 真桌面 ALL PASS,三图已更新);④ T0 守卫真机交叉验证(diag 实例被锁自动回落,未误杀主程序 WebView2);证据更新 evidence/P1-03.md、evidence/P2-02.md、evidence/P2-03.md +下一步唯一动作:P2-03 人工清单 1–5 可在本机真实 WebView2 模式下走查(app 现可正常以 WV2 启动,当前前台实例为强制 QtWebEngine 模式,重开即默认 WV2);其余为 Linux 真机验证(P1-03/P1-04),需 Ubuntu 桌面主机 +当前修改文件:core/webview2.py(byte[] 加载回落 + BaseException 防护)、docs/agent-handoff/evidence/{P1-03,P2-02,P2-03}.md、evidence/win_real_*_mainwindow.png(新) +最近测试结果:test_wv2_guard 10/10(修复后无回归);diag_panel_scrollbar 真桌面 ALL PASS;run_all 25/25(前次终态) +尚未验证的平台:Linux X11、Linux Wayland(P1-03 启动链、P1-04 X11 XGrabKey 真实注册/命中、Wayland portal 三态均需真机);Windows 真机双渲染路径(WebView2 + QtWebEngine 回落)已于 2026-09-17 验证,仅剩 P2-03 人工遮罩走查(1–5,可本机执行) +阻塞项:无 +观察项: +- 【P1-01 教训·offscreen QtWebEngine 诊断】未 `window.resize()`+`show()` 前 `innerHeight=0`,锚点/滚动几何全废;诊断必须先 resize+show、等待 `innerHeight>0`、再显式 `load_messages_to_web` 重载 +- 【P1-01 教训】`runJavaScript` 回调不能返回 DOM 元素(转换失败);`wait_until` 条件一律返回原语(`cond ? 1 : 0`) +- 【P1-01 教训】批次渲染守卫(`__rwPageRendering`)必须在**调度时刻**捕获,延迟回调(rAF+setTimeout)触发时批次已结束、标志已复位,届时再读会漏放 `scrollIntoView` 触发 'newer' 振荡 +- 【P1-01 设计】页 = 半窗(`size//2`),非整窗:整窗页会使向上换页锚点必被裁出窗口,≤2px 锚点恢复不可达 +- 【P1-02 教训】Windows 下 argv 列表形态 Popen 会被 `list2cmdline` 转义内部引号(`\"`),cmd.exe 不认 → 显式 cmd 契约必须用**字符串命令行** `cmd.exe /d /s /c ""` +- 【P1-02 发现】旧 `shell=True` 对带引号程序名实为直接 CreateProcessW(不经 cmd);显式 cmd 后行为统一且可预测 +- 【P1-03 教训】`QTimer.singleShot` 单位是**毫秒**(25 = 25ms),兜底预算要写 30000;事件循环启动前不触发 +- 【P1-03 教训】QtWebEngine 顺序硬约束:QtWebEngineWidgets 必须先于 QApplication 导入;QWebEngineProfile 必须先于使用它的 page/view 创建,且 setPersistentStoragePath/setCachePath 要在 profile 使用前调 +- 【P1-03 发现】PyQt6-WebEngine 6.10 未暴露 `QWebEnginePage.errorOccurred`(Qt 6.5+ API),加载失败诊断用 loadFinished(ok) + processEvents 循环 +- 【P1-03 教训】改构造函数签名必须保旧式位置调用:`CustomWebPage(browser)` 的 view 会被新首形参误当 profile,按 `isinstance(QWebEngineProfile)` 分派 +- 【P1-04 教训】PyQt6:`QThread.run()` 内任何未处理异常 = **abort 整个进程**(退出码 127、无 traceback、stdout 缓冲丢失,极难诊断)→ QThread.run() 必须顶层 try/except 全捕获 + 日志 +- 【P1-04 教训】`ctypes.byref(x)` 返回 CArgObject:真实 CDLL 调用正常,传给测试替身(普通可调用对象)会 TypeError —— 替身端 `getattr(arg, "_obj", arg)` 还原原对象 +- 【P1-04 教训】Windows 上 `os.pipe()` 的 fd 不能可靠用于 select()(10093/10038)——跨平台可 select 假 fd 用 `socket.socketpair()`;且 `a.send()` 的数据在 b 的接收缓冲(方向别写反) +- 【P1-04 发现】`file://` URI 解析用剥前缀+unquote 而非 urlparse().path:`file://D%3A%5Cx`(无第三斜杠)会被当 netloc;gdbus portal 的 FilePicked/Finished 信号都发在 request 对象上 +- 【P2-01 教训】Qt:对刚展开、布局尚未 flush 的 QPlainTextEdit 立即设水平滚动值,随后的挂起 resize flush 会把滚动清零——真实用户无法在未渲染框上滚动,属测试时序伪影;测试设滚动前必须先 settle(N1×N2 探针矩阵证实 N2≥1 即稳定) +- 【P2-01 教训】offscreen harness 收尾用 `os._exit`:`sys.exit` 后 QtWebEngine 渲染/GPU 子进程可能不回收 → 解释器挂起至 timeout;管道执行时只看输出会误判通过(必须验 EXIT 码) +- 【P2-02 教训】offscreen 下 QPlainTextEdit 的 `grab()` 文档区不填充(黑图)但 `panel.grab()` 正常;像素断言一律走 `widget.render(painter)`(渲染到透明 QPixmap),且先做健全性检查(文本色/handle 色像素计数>0)防黑图假通过 +- 【P2-02 教训】PyQt6:`Qt.Vertical`→`Qt.Orientation.Vertical`;`QStyleOptionSlider()` 无参构造(不接受 widget);`subControlRect(cc, opt, sc, widget)` 参数序 + 滚动条箭头子控件枚举名是 `SC_ScrollBarSubLine/AddLine`;`CC_ScrollBar` 属于 `QStyle.ComplexControl` +- 【P2-02 发现】裸控件(无样式表祖先)`style()` 是基础风格,空 option 下 subControlRect 返回 0 矩形——「原生参照」只能靠 sizeHint/实际几何对照(原生横条 14px vs 面板 8px) +- 【P2-03 发现】offscreen/无真实事件循环时 `processEvents()` **不处理 DeferredDelete**:`deleteLater()` 后必须显式 `QCoreApplication.sendPostedEvents(None, QEvent.Type.DeferredDelete)` 才会真正删除(offscreen 测试断言"已删除"前必须冲刷;生产事件循环常驻不受影响) +- 【P2-03 教训】PyQt6 `setGeometry` 无 `(QPoint, QSize)` 重载→构造 `QRect(tl,size)`;`QTest.mouseClick(widget, button, modifier, pos)` 第 3 参是 **modifier**;`QTest` 在独立模块 `PyQt6.QtTest` +- 【P2-03 发现】`core/webview2.py` `get_environment()` 含 `taskkill /F /IM msedgewebview2.exe` + 共享默认 profile 不可重定向 → 无人值守自动化不得走真实 WebView2 启动路径;真机验收走人工清单(拥有者顶层 Tool 窗 z 序上必盖 WebView2 原生子 HWND,机制与生产已验证的 AttachmentPreviewOverlay 同构) +- 【P2-03 结构判据】顶层窗可带 owner parent:`setWindowFlags(Tool|Frameless)` 后 `parentWidget()` 仍可非 None;判据是 `isWindow()` / `window() is self`,不是 `parentWidget() is None` +- 本机无系统级 Python 3.10;已用 uv 安装 CPython 3.10.21(用户目录托管)并重建项目内 `.venv`(Python 3.10.21),与文档基线对齐 +- WSL 存在 Ubuntu-22.04(当前 Stopped,python3.12.3,未装 PyQt6);未检测到 X11/Wayland 桌面会话 +- `tests/diag_live_agent.py:19`、`tests/tune_model_popup.py:155` 直接引用真实配置路径;属 live/tune 脚本,默认聚合排除,不属 P0-01 允许范围 +- `readme.md` 提及的 `haocode.spec`/`pyi_rth_trace.py` 不在本快照内(打包属后续阶段,不影响源码运行) + +环境探测(只读): +- OS:Windows 11 10.0.26200 x64 +- Python:默认 3.13 / 3.12.10,无 3.10;`.venv` = **3.10.21**(uv 重建,P0-01)+ PyQt6 6.10.2 + PyQt6-WebEngine 6.10.0 + openai 2.26.0 + pythonnet 3.1.0 + PyMuPDF 1.28.0 +- WebView2 Runtime:153.0.4234.32 存在 +- WSL:Ubuntu-22.04(Stopped)、docker-desktop(Running) + +任务状态表: +- P0-01: COMPLETE +- P0-02: COMPLETE +- P0-03: COMPLETE(2026-09-16 复核通过,文档一致性修订已固化) +- P1-01: COMPLETE +- P1-02: COMPLETE(Windows 侧自动化全绿;Linux 进程组用例 C3 待 Linux 环境运行生效) +- P1-03: COMPLETE(Windows 侧自动化 + offscreen 真实启动链全绿;Linux 真机与 root/容器 `--no-sandbox` 接受路径待对应环境验证) +- P1-04: COMPLETE(Windows 侧自动化全绿:路由矩阵/X11 替身/portal 替身/offscreen 真实启动链;Linux X11 XGrabKey 真实注册与 Wayland portal 授权/取消/无 portal 三态待真实 Linux 宿主手动验证,见 evidence/P1-04.md) +- P2-01: COMPLETE(两栏启动倒序 + 状态保持,offscreen 全量覆盖,无平台相关项;见 evidence/P2-01.md) +- P2-02: COMPLETE(offscreen 全量覆盖 + 无泄漏断言;Windows/Linux 真机截图待对应环境运行 diag_panel_scrollbar.py;见 evidence/P2-02.md) +- P2-03: COMPLETE(offscreen 结构+行为全量覆盖 34/34;审计确认唯一受影响遮罩;Windows 真机 WebView2 人工验收清单见 evidence/P2-03.md) +- P2-04: COMPLETE(聚合入口 tests/run_all.py:Windows 25/25 PASS;WSL/3.12 FAIL 0 + 21 有理由 SKIP;夹具演示非零退出码;独立/聚合输出一致;暴露并修复 T9 陈旧断言与 compaction.py 3.11+ dataclass 缺陷;见 evidence/P2-04.md) diff --git a/docs/agent-handoff/KICKOFF_PROMPT.md b/docs/agent-handoff/KICKOFF_PROMPT.md new file mode 100644 index 0000000..719105a --- /dev/null +++ b/docs/agent-handoff/KICKOFF_PROMPT.md @@ -0,0 +1,362 @@ +# haocode 全量修复任务:无人值守连续执行 + +你是本次唯一的开发工作 Agent。用户将长时间离开,不会及时回复。 + +你的目标不是提出方案,也不是只完成一个任务,而是按照仓库内已经固化的任务清单,持续完成所有可实施修复、测试和文档更新,直到: + +1. 所有能够在当前环境完成的任务均达到完成条件; +2. 所有自动化测试通过; +3. 无法在当前机器完成的真实平台验收被准确记录; +4. 已经没有不需要用户介入即可继续的工作。 + +不要在完成一个任务后停下来等待确认。完成当前任务后,立即按依赖顺序执行下一项。 + +## 一、工作目录 + +固定工作目录: + +D:\WorkSpace\Project\GCC\haocode_0 + +不得在其他副本、临时复制目录或旧版本中实施修复。 + +## 二、首次启动必须执行 + +开始修改代码前,依次完整读取: + +1. `AGENTS.md` +2. `docs/agent-handoff/README.md` +3. `docs/agent-handoff/REPAIR_BACKLOG.md` +4. `docs/agent-handoff/VERIFICATION.md` +5. `docs/agent-handoff/PLATFORM_PLAN.md` +6. `docs/agent-handoff/CURRENT_STATE.md` + +其中: + +- 当前行为和缺陷必须由源码、复现和测试确认。 +- 目标行为、任务范围和完成条件以 `docs/agent-handoff/` 为准。 +- `readme.md`、`Frame.md`、`ARCHITECTURE.md` 只作历史背景。 +- 第三方修复要求和外部 harness 项目不是事实源。 + +读完后,先确认 `P0-03` 文档基线已经完成,不要重复创建交接目录。 + +然后从 `P0-01` 开始实施。 + +## 三、建立防遗忘执行状态 + +在进行任何业务代码修改前,创建: + +`docs/agent-handoff/EXECUTION_STATE.md` + +并在 `docs/agent-handoff/README.md` 增加一个简短指针: + +> 当 `EXECUTION_STATE.md` 的状态为 `ACTIVE` 时,任何继续执行、上下文恢复或压缩恢复都必须先读取该文件。 + +`EXECUTION_STATE.md` 必须保持简洁,只保存当前事实,不写成长篇流水账。至少包含: + +```text +# 全量修复执行状态 + +状态:ACTIVE +总目标:完成 REPAIR_BACKLOG.md 中所有待实施任务 +当前任务:P0-01 +当前阶段:调查 / 红测试 / 实现 / 定向验证 / 阶段回归 +最后完成动作: +下一步唯一动作: +当前修改文件: +最近测试结果: +尚未验证的平台: +阻塞项: +任务状态表: +- P0-01: IN_PROGRESS +- P0-02: PENDING +... +``` + +状态值只能使用: + +- `PENDING` +- `IN_PROGRESS` +- `AUTOMATED_VERIFIED` +- `PLATFORM_VALIDATION_PENDING` +- `COMPLETE` +- `BLOCKED` + +每次发生以下事件后,立即更新 `EXECUTION_STATE.md`: + +- 开始一个任务; +- 确认根因; +- 完成一组源码修改; +- 运行测试; +- 测试失败并改变调查方向; +- 完成任务; +- 准备执行长时间命令; +- 发现外部环境阻塞; +- 即将结束当前上下文。 + +只保留最新状态和下一步,不依赖聊天记录保存进度。 + +## 四、上下文压缩恢复协议 + +一旦发生以下任一情况: + +- 上下文被压缩或总结; +- 你无法准确复述当前任务; +- 不确定哪些测试已经运行; +- 不确定下一步应该做什么; +- 会话中断后重新继续; + +立即停止凭记忆操作,按顺序重新读取: + +1. `AGENTS.md` +2. `docs/agent-handoff/README.md` +3. `docs/agent-handoff/EXECUTION_STATE.md` +4. `REPAIR_BACKLOG.md` 中“当前任务”的完整章节 +5. 当前任务引用的 `PLATFORM_PLAN.md` 或 `VERIFICATION.md` 章节 +6. `EXECUTION_STATE.md` 列出的当前修改文件 + +然后核对工作区实际状态和最近测试结果,再从“下一步唯一动作”继续。 + +聊天摘要不能代替 `EXECUTION_STATE.md`。不得因为上下文压缩重新设计范围、跳过测试或把未完成任务误判为完成。 + +## 五、永久硬约束 + +### 凭据铁律 + +`data/config.json` 是不透明的本机密钥文件。 + +绝对不得: + +- 打开; +- 读取; +- 搜索其内容; +- 打印; +- 复制; +- 修改; +- 计算散列; +- 制作快照; +- 让递归内容搜索包含它; +- 让其内容进入工作上下文或测试输出。 + +所有自动化测试必须使用临时配置和临时数据库。 + +验证真实配置未被访问时,使用打开路径拦截器、替身或访问记录;不得通过读取真实文件验证。 + +在 `P0-01` 完成前,不得运行可能绕过临时配置而读取真实配置的 GUI/LLM 测试。先审查测试入口并完成隔离。 + +### 范围约束 + +- 不初始化 Git,不创建提交,不伪造历史。 +- 不删除或清理用户现有数据库、附件、日志、锁文件或运行产物。 +- 不移动或拆分现有模块。 +- 不借修复重写 `main_window.py`、`app.js` 或弹窗系统。 +- 不增加新产品功能。 +- 不增加工具注册系统。 +- 不参考或移植 Claude Code、Codex、Grok Build、DeepSeek Harness。 +- 不改变 `core/agent/` 作为 pi Python 移植的定位。 +- 不增加 Agent shell sandbox、命令审批或路径权限边界。 +- Chromium sandbox 保持默认开启。 +- 不引入 WebKitGTK 或相关 Qt 封装。 +- 不做 PyInstaller、安装器、AppData/XDG 迁移或发行包。 +- 本阶段只保证源码运行。 +- `vendor/webview2/` 和根目录 `WebView2Loader.dll` 不得删除。 +- 产品内部 Agent 继续按原方式调用 LLM,不修改其产品行为。 +- 不把开发工作委派给其他 Agent;由你连续完成。 + +只修改当前任务“允许修改”中列出的文件。发现无关问题时记录到 `EXECUTION_STATE.md` 的“观察项”,不要顺手扩大范围。 + +## 六、任务执行顺序 + +严格按以下顺序连续执行: + +1. `P0-01` 配置路径与测试隔离 +2. `P0-02` 合并重复的 `MainWindow.eventFilter` +3. 复核已经完成的 `P0-03` +4. `P1-01` 双向消息渲染窗口 +5. `P1-02` Windows/Linux shell 与进程树终止 +6. `P1-03` Windows/Linux 渲染器启动链 +7. `P1-04` Linux 截图热键与截图实现 +8. `P2-01` Bash 任务按启动时间倒序 +9. `P2-02` 右侧 Bash 面板滚动条 +10. `P2-03` WebView2 原生窗口遮挡层 +11. `P2-04` 跨平台聚合测试入口 + +不得跳过依赖。某项存在真实平台验收阻塞时,先完成其实现和自动化验证,将状态设为 `PLATFORM_VALIDATION_PENDING`,然后继续所有不受该阻塞影响的后续任务。 + +## 七、每个任务的固定执行循环 + +对每个任务严格执行以下循环: + +### 1. 领取 + +- 在 `EXECUTION_STATE.md` 中把任务设为 `IN_PROGRESS`。 +- 完整读取该任务的“先读文件、允许修改、硬约束、目标测试、完成证据”。 +- 只加载当前任务需要的源码。 + +完成标准:能够准确列出当前任务允许修改的文件、禁止范围和验收条件。 + +### 2. 复现和根因 + +- 从实际源码出发确认附件描述是否正确。 +- 建立最小复现或失败测试。 +- 对确定性缺陷记录实际调用链、状态变化或平台差异。 +- 描述不准确时以代码证据纠正,不机械照抄文档中的猜测。 + +完成标准:测试或可重复证据在修复前能够暴露缺陷。 + +### 3. 实现 + +- 采用与现有代码风格一致的最小修改。 +- 优先复用现有接口和模块边界。 +- 只在确实能隔离平台差异或测试状态时增加窄辅助模块。 +- 不进行无关格式化、批量重命名或结构重构。 + +完成标准:失败复现转绿,且没有扩大任务行为面。 + +### 4. 定向验证 + +运行任务章节列出的全部目标测试。 + +每条测试记录: + +- 精确命令; +- 平台和环境; +- 退出码; +- PASS/FAIL/SKIP; +- 关键断言; +- 失败原因; +- 是否使用临时配置和数据库。 + +测试失败时进入诊断循环并继续修复,不能通过删除断言、放宽正确性要求或把失败改成 SKIP 获得通过。 + +完成标准:全部适用定向测试通过;不适用项有真实平台理由。 + +### 5. 自检 + +逐条核对当前任务的所有“硬约束”和“完成证据”。 + +检查: + +- 是否改了允许范围之外的文件; +- 是否引入了新功能; +- 是否碰到真实配置或数据库; +- 是否只验证了 happy path; +- 是否保留 Windows 现有行为; +- 是否误把 offscreen 当作真实桌面证据; +- 是否有未记录的测试失败。 + +完成标准:每条完成证据都有源码、测试输出或真机证据对应。 + +### 6. 固化进度 + +- 更新 `REPAIR_BACKLOG.md` 的任务状态。 +- 更新 `EXECUTION_STATE.md`。 +- 将简洁证据写入 `docs/agent-handoff/evidence/.md`。 +- 不粘贴大量完整日志,只记录命令、结果和证据文件路径。 +- 立即开始下一任务,不等待用户确认。 + +只有全部完成条件满足时才能标记 `COMPLETE`。 + +## 八、阶段回归 + +完成 P0、P1、P2 每个阶段后,运行 `VERIFICATION.md` 对应的阶段完整回归。 + +要求: + +- 定向测试不能代替阶段回归。 +- `tests/run_tests.py` 在修复聚合入口前不能被称为全套测试。 +- 平台不适用项必须明确显示 `SKIP` 和理由。 +- 共同逻辑测试失败不能以平台差异豁免。 +- 测试不得访问网络、真实 API 或真实凭据,除非任务明确要求且用户已经提供授权;当前没有该授权。 +- 不运行 `diag_live_*` 或 `smoke_live_*` 的真实 API 路径。 + +P2-04 完成后,使用新的聚合入口运行最终自动化集合,并保留每个独立测试的运行能力。 + +## 九、平台验收处理 + +先只读检测当前机器实际具备的环境: + +- Windows 版本; +- WebView2 是否可用; +- QtWebEngine 是否可用; +- 是否存在可用的 WSL/Ubuntu、X11 或 Wayland 环境。 + +不得为了补齐平台矩阵擅自安装操作系统、创建虚拟机或修改宿主机关键配置。 + +当前环境具备的平台必须完成真实验证。 + +当前环境不具备的平台: + +1. 完成平台适配代码; +2. 完成平台路由和替身自动化测试; +3. 记录缺少的真实环境; +4. 将任务标为 `PLATFORM_VALIDATION_PENDING`,不能标记 `COMPLETE`; +5. 继续执行其他任务。 + +不得伪造 Windows WebView2、Linux X11、Linux Wayland、portal、DPI、全局热键或截图的真机证据。 + +## 十、阻塞处理 + +用户正在休息。不要因为普通实现选择、测试失败或代码复杂而询问用户。 + +优先采用: + +1. 现有源码行为; +2. `docs/agent-handoff/` 中已经冻结的决策; +3. 最小、兼容、可测试的实现; +4. 将判断依据写入执行状态和证据文档。 + +只有遇到以下情况才允许停止: + +- 必须获取用户凭据; +- 必须执行不可逆或破坏性操作; +- 必须使用当前不存在的外部机器; +- 两个权威要求存在无法同时满足的真实矛盾; +- 连续诊断后确认没有任何不需要用户介入的工作可继续。 + +即使一个任务阻塞,也要继续所有不依赖该阻塞的任务。 + +## 十一、最终收尾 + +所有可执行工作完成后: + +1. 运行最终自动化聚合测试。 +2. 复核所有单文件测试入口仍可运行。 +3. 复核 `data/config.json` 未被测试访问,但不要读取它。 +4. 检查交接文档与最终代码是否一致。 +5. 更新 `CURRENT_STATE.md`,移除已经修复的“当前缺陷”表述。 +6. 更新 `REPAIR_BACKLOG.md` 中每项真实状态。 +7. 把 `EXECUTION_STATE.md` 状态改为: + - `COMPLETE`:所有自动化和真实平台条件均满足; + - `PLATFORM_VALIDATION_PENDING`:仅剩当前机器无法提供的真机验证; + - `BLOCKED`:仍有必须由用户决定或提供资源的问题。 +8. 创建 `docs/agent-handoff/FINAL_REPORT.md`。 + +`FINAL_REPORT.md` 必须包含: + +- 每个任务的最终状态; +- 根因与实际修复摘要; +- 修改文件清单; +- 自动化测试命令和结果; +- Windows/Linux 真机验证结果; +- 明确的未验证项; +- 对真实配置和数据库的隔离证明方式; +- 仍需用户处理的最少事项; +- 下一位 Agent 的恢复入口。 + +## 十二、最终回复格式 + +只有在没有可继续执行的工作时才回复用户。 + +最终回复必须先说明整体状态,然后依次给出: + +1. 已完成任务; +2. 修改范围; +3. 测试结果; +4. 真机平台证据; +5. 未完成或受阻事项; +6. `FINAL_REPORT.md` 和 `EXECUTION_STATE.md` 路径; +7. 用户醒来后需要执行的最少动作。 + +不要只回复“完成了”。不要隐藏失败、跳过项或未验证平台。 + +现在开始执行首次启动步骤,创建持久化执行状态,然后从 P0-01 连续工作,直到达到上述终止条件。 diff --git a/docs/agent-handoff/PLATFORM_PLAN.md b/docs/agent-handoff/PLATFORM_PLAN.md new file mode 100644 index 0000000..014760d --- /dev/null +++ b/docs/agent-handoff/PLATFORM_PLAN.md @@ -0,0 +1,153 @@ +# Windows / Linux 源码运行契约 + +> 触发条件:修改启动、浏览器、shell、进程取消、系统热键、截图、路径、依赖或平台测试前读取。本文定义目标行为,不代表这些能力已经实现。只有完成本文验收矩阵后,才能把对应环境标为“已验证”。 + +## 支持矩阵 + +| 环境 | Python | 浏览器后端 | 系统集成 | 状态定义 | +| --- | --- | --- | --- | --- | +| Windows x64 | 现有 Python 3.10 基线 | WebView2 首选;失败或 profile 被占用时回落 QtWebEngine | 现有 Windows 原生全局热键和截图 | 必须保持现有产品行为 | +| Ubuntu 22.04/24.04 x64 + X11 | Python 3.10–3.12 | 仅 QtWebEngine | X11 原生全局热键;现有截图交互的 X11 实现 | 本阶段 Linux 主支持目标 | +| Ubuntu 22.04/24.04 x64 + Wayland | Python 3.10–3.12 | 仅 QtWebEngine | `xdg-desktop-portal` 全局快捷键/截图能力 | portal 缺失或桌面不支持时明确报错 | +| `QT_QPA_PLATFORM=offscreen` | 同对应系统 | QtWebEngine 测试路径;Windows 跳过 WebView2 | 不验证真实全局热键和桌面截图 | 只用于自动化测试,不算桌面支持证据 | + +其他 Linux 发行版可以尝试源码运行,但必须标记“未验证”。Linux 不引入 WebKitGTK、WebKitGTK 的 Qt 包装层或第二套网页 UI。 + +## 平台选择原则 + +平台能力通过小型适配器隔离,不建立通用插件框架,也不移动现有模块。适配器至少覆盖以下三类能力: + +- 浏览器选择:Windows 尝试 WebView2 后回落 QtWebEngine;非 Windows 直接进入 QtWebEngine。 +- shell 生命周期:生成固定 shell argv、设置进程组选项、取消和超时时终止完整命令树。 +- 桌面集成:注册/注销 `Alt+S`,启动截图并以现有 Qt 信号返回结果或错误。 + +Windows 专用模块和 Linux 专用模块只在平台选择完成后延迟导入。Linux 启动链不得先访问 `ctypes.WinDLL`、Windows HWND、`taskkill` 或 WebView2 DLL;Windows 启动链不得依赖 DBus、portal 或 X11 包。 + +## 浏览器后端 + +### Windows + +1. 保持 WebView2 为首选,初始化失败时显示可诊断日志并回落 QtWebEngine,主窗口仍可使用。 +2. 保持现有实例锁语义。同一 WebView2 profile 已由另一个实例使用时,新实例回落 QtWebEngine,不与其争用 profile,也不结束对方进程。 +3. WebView2 原生子窗口继续使用现有包装层;修复弹层时只调整已确认的遮挡案例。 +4. 强制 QtWebEngine 回落必须有测试入口,以便在 Windows 上验证两条渲染路径。 + +### Linux 与 QtWebEngine 回落 + +1. 非 Windows 平台不探测、不导入、不加载 WebView2。 +2. 每个 QtWebEngine 应用实例使用独立 profile/storage 目录,避免多个 Chromium 实例争用同一 profile。源码阶段目录仍位于项目 `data/` 范围;自动化测试使用临时目录。 +3. 保持离线加载 `ui/web/` 资源;路径拼接必须兼容大小写敏感文件系统。 +4. QtWebEngine 必须在 `QApplication` 创建前完成项目所需的导入和 Chromium 环境设置。 +5. 保留现有软件渲染/GPU 配置入口。无效可选配置应输出明确警告并回落可启动默认值,不能让源码运行因可选渲染配置直接失败。 + +**Linux 源码运行(最小步骤,Ubuntu 22.04/24.04 x64):** + +```bash +# 1) 依赖(pythonnet/clr_loader 带 sys_platform == "win32" marker,Linux 自动跳过) +python3.10 -m venv .venv && . .venv/bin/activate +pip install -r requirements.txt +sudo apt install -y libnss3 libxkbcommon0 libfontconfig1 libdbus-1-3 libgl1 libegl1 libasound2t64 +# (22.04 无 t64 后缀,用 libasound2) + +# 2) 运行(普通用户;只走 QtWebEngine;每实例独立 profile:data/webengine/profile__*) +python3.10 main.py + +# 3) 仅当 root/容器启动且页面空白时,才显式禁用沙箱(启动会打印高可见风险警告): +QTWEBENGINE_CHROMIUM_FLAGS="--no-sandbox" python3.10 main.py + +# 4) 离屏自动化测试: +QT_QPA_PLATFORM=offscreen HAOCODE_RENDER=software QTWEBENGINE_CHROMIUM_FLAGS=--disable-gpu \ + python3.10 tests/smoke_offscreen.py +``` + +实现锚点:`core/renderer_backend.py`(后端解析 / profile 目录 / sandbox 标志处理);`main.py` 在导入 PyQt6 前调用 `sanitize_chromium_flags`;`ui/views/main_window.py` 以 `sys.platform == "win32"` 门控 `core.webview2` 导入(非 Windows 永不导入,不触达 pythonnet/Win32/WebView2 DLL/taskkill);`CustomWebPage(profile, parent)` 接收本实例独立 `QWebEngineProfile`。 + +### Chromium sandbox + +Chromium sandbox 与 agent 命令权限是两件事。默认保留 Chromium sandbox,项目代码不得普遍追加 `--no-sandbox`。仅当运行者明确为 root/容器场景配置现有 `QTWEBENGINE_CHROMIUM_FLAGS`,且启动代码确认处于该场景时才接受该标志,同时输出高可见警告。普通 Windows/Linux 桌面运行不得关闭 sandbox。 + +## Shell 和进程生命周期 + +“bash 工具”保留产品名称,但执行契约按平台固定: + +| 平台 | argv | `Popen` 要求 | 取消/超时 | +| --- | --- | --- | --- | +| Windows | `cmd.exe /d /s /c ` | `shell=False`;保持现有流式 stdout/stderr | 终止该命令的完整 Windows 进程树 | +| Linux | `/bin/bash -lc ` | `shell=False`、`start_new_session=True`;保持流式 stdout/stderr | 向进程组发 `SIGTERM`,短暂宽限后仍存活则发 `SIGKILL` | + +实现必须满足: + +- 取消、超时、窗口退出三条路径复用同一个幂等终止函数。 +- Linux 以 `os.getpgid(proc.pid)` 定位本次命令进程组,不按进程名杀进程,也不遗留孙进程。 +- 正常退出不进入强杀路径;进程已经结束时重复取消不抛出用户可见异常。 +- `cwd`、环境变量、编码和分块输出保持现有工具语义。命令字符串不在 Python 中按 `;`、`&&` 或管道自行拆分。 +- 平台 shell 名称进入诊断日志,避免把 Linux `/bin/sh` 误报成 bash。 + +## 系统提示词 + +只维护根目录一份 `SYSTEM_PROMPT.md`。每次请求继续重新读取公共正文,再由运行时生成一段短的平台信息并插入请求,不创建 Windows/Linux 两份完整提示词。 + +运行时段至少声明: + +- 当前操作系统和 shell:Windows `cmd.exe` 或 Linux `/bin/bash -lc`。 +- 路径格式和路径分隔符;Linux 文件名大小写敏感。 +- 对应 shell 的环境变量、命令连接和引号规则。 +- agent 没有额外 shell 沙盒或命令审批层,不要虚构这些能力。 + +平台段是请求构造的一部分,不写入会话历史,不参与压缩持久化。契约测试应验证公共提示词只有一份,且不同平台只改变运行时段。 + +## 配置和路径 + +1. 所有配置读取入口统一尊重 `HAOCODE_CONFIG_FILE`;测试在导入 UI/LLM 模块前把它指向临时文件。真实凭据文件按 [README.md](README.md) 的边界处理。 +2. 所有自动化测试同时把默认数据库改到临时目录,不能依赖开发机已有数据库或附件。 +3. 源码运行阶段继续使用项目内 `data/`。AppData、XDG Base Directory、安装器写入权限和配置迁移全部留到打包阶段。 +4. 使用 `pathlib` 或 `os.path` 组合路径,不拼接平台分隔符;资源存在性检查覆盖 Linux 大小写差异。 +5. WebView2 DLL、Windows 锁文件和 Windows 进程命令不成为 Linux 配置校验项。Linux portal/X11 依赖缺失也不能阻止不相关的聊天和 shell 功能启动。 + +## Linux 桌面集成 + +### X11 + +- 为现有 `Alt+S` 截图快捷键实现 X11 原生注册/注销,保持 `GlobalHotkeyThread` 对上层的信号语义。 +- 注册失败时返回具体原因并保留窗口内截图按钮或应用内快捷键;不得后台忙等键盘状态。 +- 屏幕像素获取走 X11 可用的原生抓屏路径;区域选择 UI 可以继续使用 Qt。 +- 截图继续提供现有 `QImage` 返回语义,覆盖多显示器和负坐标桌面布局。 + +### Wayland + +- 使用 `xdg-desktop-portal` 提供的桌面协议请求全局快捷键和截图,不使用 X11 API 假装支持 Wayland。 +- portal 请求必须异步处理授权、拒绝、取消和桌面不支持四种结果;UI 只禁用受影响能力,主程序继续运行。 +- 无法提供全局快捷键时给出明确、可操作的错误,不能静默降级成“看似注册成功”。窗口内按钮/快捷键仍按桌面允许范围工作。 +- portal 返回的截图 URI/数据先完成有效性检查,再转换为现有 `QImage`/附件流程;临时文件生命周期由适配器负责。 + +会话类型优先综合 Qt 平台名和 `XDG_SESSION_TYPE` 判断,并记录最终选择。环境变量与实际 Qt 后端矛盾时,选择可证明可用的后端并输出警告。 + +> **实现状态(P1-04,2026-07-17,证据 `evidence/P1-04.md`)**:`ui/views/system_tools/desktop_session.py` 按上文判定顺序实现 `session_kind()`(offscreen→unknown;QT_QPA_PLATFORM/WAYLAND_DISPLAY/XDG_SESSION_TYPE 综合);X11 热键 = `x11_hotkey.py`(ctypes→libX11 XGrabKey,同 `triggered` 信号语义,失败明确日志);Wayland 截图 = `portal_capture.py`(xdg-desktop-portal Screenshot,系统 gdbus CLI,异步 worker,授权/拒绝/不支持/超时四态明确)。**Wayland 全局快捷键**依赖 compositor 桌面协议(ext-global-shortcut 等),本版本无免依赖实现 → 按上文“无法提供全局快捷键时给出明确、可操作的错误”处理(日志明确说明 + 保留应用内 Alt+S/按钮),不静默降级。真机验证待 Ubuntu 22.04/24.04 X11/Wayland 会话。 + +## 依赖范围 + +- `requirements.txt` 只加入源码确实导入的 Python 包,并使用平台 marker 隔离 Windows/Linux 专用依赖。 +- Ubuntu 所需系统包另写安装说明,不把 apt 包名伪装成 pip 依赖。 +- 不增加 WebKitGTK、打包器、安装器或与现有功能无关的桌面框架。 +- 可选平台能力缺失时要局部报错;聊天、会话和 shell 的基本源码运行仍应可达。 + +## 验收矩阵 + +每行都要留下命令输出、日志或截图证据;人工桌面项不能用 offscreen 结果替代。具体测试分层见 [VERIFICATION.md](VERIFICATION.md)。 + +| 环境 | 必验操作 | 通过标准 | 证据 | +| --- | --- | --- | --- | +| Windows / WebView2 | 启动、流式聊天、弹层、截图、退出 | 选择 WebView2;弹层无已确认遮挡;退出不影响其他实例 | 后端日志 + 桌面截图 | +| Windows / 强制 QtWebEngine | 同一基本流程 | 不加载 WebView2;UI 和消息协议行为一致 | 后端日志 + 定向测试 | +| Windows / 第二实例 | 首实例占用 WebView2 profile 后启动第二实例 | 第二实例回落 QtWebEngine;首实例继续工作 | 双实例日志 | +| Ubuntu 22.04 X11 | 启动、聊天、`Alt+S`、区域截图、shell | 只使用 QtWebEngine;热键与截图成功;shell 为 bash | 日志 + 截图 + shell 测试 | +| Ubuntu 24.04 X11 | 同上 | 与 22.04 相同 | 日志 + 截图 + shell 测试 | +| Ubuntu 22.04/24.04 Wayland | portal 授权、拒绝、取消;截图和快捷键 | 授权路径可用;其余路径明确报错且主程序不退出 | portal 日志 + 桌面截图 | +| Linux 进程生命周期 | 命令创建子进程后取消和超时 | 父、子、孙进程全部退出;无同名进程误杀 | PID/进程组测试记录 | +| Windows 进程生命周期 | 命令创建子进程后取消和超时 | 本次命令树全部退出;其他进程不受影响 | PID 测试记录 | +| Windows/Linux 提示词 | 捕获请求构造结果 | 公共正文一致;shell/路径段与平台匹配;平台段不入历史 | 契约测试 | +| Windows/Linux 临时配置 | 使用临时配置和数据库运行 GUI smoke | 不访问项目真实配置/数据库;运行结束无生产数据变更 | 隔离断言 | +| Windows/Linux offscreen | 运行自动化 smoke | 可重复通过;明确不声称验证系统热键/截图 | 测试汇总 | +| root/容器 | 分别在未显式配置和显式配置下启动 | 默认保持 sandbox;显式 `--no-sandbox` 时打印警告 | 启动日志 | + +平台任务完成条件:矩阵中该阶段承诺的每一行都有证据;自动化定向测试和阶段全量测试均通过;Linux 启动链没有 Windows 专用导入;实现没有引入 WebKitGTK、打包工作、通用钩子框架或新的 agent 权限模型。 diff --git a/docs/agent-handoff/README.md b/docs/agent-handoff/README.md new file mode 100644 index 0000000..0af8a4e --- /dev/null +++ b/docs/agent-handoff/README.md @@ -0,0 +1,55 @@ +# haocode 维修交接入口 + +> **执行状态**:当 `EXECUTION_STATE.md` 的状态为 `ACTIVE` 时,任何继续执行、上下文恢复或压缩恢复都必须先读取该文件。 + +本目录是 2026-09-16 之后的维修与跨平台工作的唯一交接入口。当前交付固化事实、决策、任务和验收方式;业务代码修复已按 `REPAIR_BACKLOG.md` 状态表推进(任务完成状态以该表和 `EXECUTION_STATE.md` 为准)。 + +精确实现仍以源码和可重复测试为准。若本文档与源码冲突,先记录证据,再修正文档;不要用旧文档覆盖已经核实的代码事实。 + +## 强制读取顺序 + +后续 Agent 必须从仓库根目录开始,按以下顺序读取: + +1. `AGENTS.md` +2. `docs/agent-handoff/README.md`(本文件) +3. 根据任务类型,只读取下表对应的文档 + +| 触发条件 | 接着读取 | 用途 | +|---|---|---| +| 准备领取或实施修复任务 | `REPAIR_BACKLOG.md` | 任务顺序、允许范围、禁止事项、完成条件 | +| 涉及 Windows/Linux、渲染器、shell、热键或截图 | `PLATFORM_PLAN.md` | 已冻结的跨平台契约 | +| 涉及测试、诊断脚本或验收 | `VERIFICATION.md` | 分层测试矩阵与证据要求 | +| 需要了解目录、命名、模块边界或技术债 | `CURRENT_STATE.md` | 已核实的当前状态 | + +不要从 `readme.md`、`Frame.md` 或 `ARCHITECTURE.md` 开始。这三份文件只能作为历史背景;其中的路径、打包说明和完成状态可能已经失效。第三方提供的《haocode 修复需求》也不是事实源,其中只有经源码核验并写入 `REPAIR_BACKLOG.md` 的内容有效。 + +## 永久操作约束 + +- 将 `data/config.json` 视为不透明的本机密钥文件。不得打开、读取、搜索、打印、复制、修改或让它进入 Agent 上下文;任何递归内容搜索都必须排除它。 +- 测试必须使用临时配置和临时数据库,并在导入 `MainWindow` 前完成重定向(统一用 `tests/_test_env.py` 的 `isolate()`)。自 P0-01 起所有运行时配置读取统一走 `core/config_paths`(`HAOCODE_CONFIG_FILE` 优先);少数 GUI 测试脚本(如 `smoke_offscreen.py`)自身不设置该环境变量,独立运行时由环境注入临时配置,P2-04 聚合入口将按子进程强制注入。 +- 不初始化 Git,不伪造提交历史。任务按可独立提交的粒度编写,等仓库以后具备 Git 历史再逐项提交。 +- 不引入 WebKitGTK。Windows 使用 WebView2(首选)或 QtWebEngine(回退);Linux 只使用 QtWebEngine。 +- 不新增 Agent shell 沙箱、审批或路径边界;Chromium 渲染进程的 sandbox 保持默认开启。 +- 不拆分或移动现有模块,不借修 bug 增加新产品功能。允许修改确认错误的源码,并新增聚焦测试、平台适配器、文档和配置样例。 +- 本阶段以 Windows/Linux 源码运行正确为目标;PyInstaller、安装器、AppData/XDG 目录迁移和发行包是下一阶段。 +- 不比较或移植 Claude Code、Codex、Grok Build、DeepSeek Harness。当前 `core/agent/` 继续保持 pi 的 Python 移植定位。 + +## 文档职责 + +- `CURRENT_STATE.md` 只记录已经从仓库核实的事实与结构/命名结论。 +- `PLATFORM_PLAN.md` 是平台行为的唯一决策源。 +- `REPAIR_BACKLOG.md` 是工作拆分和改动边界的唯一决策源。 +- `VERIFICATION.md` 是测试命令、平台矩阵和验收证据的唯一决策源。 +- `EXECUTION_STATE.md` 是无人值守执行与上下文压缩后的唯一恢复入口;任务权威状态仍以 `REPAIR_BACKLOG.md` 为准,执行证据放 `evidence/`。 + +同一规则不要在多份文件中复制扩写。需要变更决策时,先修改其唯一归属文档,再更新这里的路由;不要在实现过程中悄悄改变范围。 + +## 领取任务 + +1. 从 `REPAIR_BACKLOG.md` 选择一个未完成任务 ID。 +2. 只读取该任务列出的源码和它引用的规范文档。 +3. 先建立最小复现或失败测试,再修改允许范围内的文件。 +4. 运行任务的聚焦测试;阶段结束时再运行 `VERIFICATION.md` 指定的完整自动化集合。 +5. 记录实际命令、结果和平台证据。没有运行的测试必须明确写“未运行”,不能按通过处理。 + +任务完成的含义是:行为、回归测试、平台适用性和文档中的完成条件全部满足。只提交代码或只写说明都不算完成。 diff --git a/docs/agent-handoff/REPAIR_BACKLOG.md b/docs/agent-handoff/REPAIR_BACKLOG.md new file mode 100644 index 0000000..9557d17 --- /dev/null +++ b/docs/agent-handoff/REPAIR_BACKLOG.md @@ -0,0 +1,548 @@ +# 修复任务清单 + +本文是修复工作的任务源。每次只领取一个任务单元;任务完成后再进入下一个单元。精确实现以当前源码为准,本文约束修复范围和验收结果,不授权功能扩展。 + +验证方法与平台取证要求统一见 [VERIFICATION.md](VERIFICATION.md)。跨平台运行契约见 [PLATFORM_PLAN.md](PLATFORM_PLAN.md)。 + +## 执行边界 + +- 当前阶段只保证源码运行。安装包、冻结构建、AppData/XDG 目录迁移均不在本清单内。 +- 保持现有模块位置,不拆分或移动 `ui/views/main_window.py`、`ui/web/app.js` 等大文件。可以新增测试、窄的平台适配器和配置路径辅助模块。 +- 保持现有 Agent 能力和 `core/agent/` 与 pi 的行为,不增加工具注册、权限确认、命令沙盒或路径边界。 +- 保留 Chromium sandbox。只有明确检测到 root/container 且用户显式选择时,才允许添加 `--no-sandbox`。 +- `data/config.json` 是不透明的运行时秘密。工作 Agent 不得打开、读取、搜索、打印、复制或修改该文件;所有自动化测试使用临时配置。 +- 第三方修复文档只是线索。只有源码可复现的缺陷和本清单明确写出的行为才是修复依据。 +- 当前快照没有 Git 历史。每个任务仍须保持可独立审查;以后接入 Git 时,一个任务对应一个提交。 + +## 顺序与依赖 + +| 顺序 | 任务 | 状态 | 依赖 | +|---|---|---|---| +| P0-01 | 配置路径与测试隔离 | 已完成(P0 阶段回归通过,2026-09-16;见 evidence/P0-01.md) | 无,其他 GUI/配置测试的前置任务 | +| P0-02 | 合并重复的 `MainWindow.eventFilter` | 已完成(P0 阶段回归通过,2026-09-16;见 evidence/P0-02.md) | P0-01 | +| P0-03 | 修复交接文档基线 | 已完成(2026-09-16) | 无;后续只做一致性复核 | +| P1-01 | 双向消息渲染窗口 | 已完成 | P0-01 | +| P1-02 | Windows/Linux shell 与进程树终止 | 已完成(Windows 侧自动化全绿,2026-07-09;见 evidence/P1-02.md) | P0-01 | +| P1-03 | Windows/Linux 渲染器启动链 | 已完成(Windows 侧自动化 + offscreen 真实启动链全绿,2026-07-17;见 evidence/P1-03.md) | P0-01、P1-02 | +| P1-04 | Linux 截图热键与截图实现 | 已完成(Windows 侧自动化全绿,2026-07-17;X11/Wayland 真机待手动;见 evidence/P1-04.md) | P1-03 | +| P2-01 | Bash 任务按启动时间倒序 | 已完成(offscreen 全量覆盖,2026-07-21;见 evidence/P2-01.md) | P0-01 | +| P2-02 | 右侧 Bash 面板滚动条 | 已完成(offscreen 全量覆盖,2026-07-21;真机截图待对应环境跑 diag;见 evidence/P2-02.md) | P2-01 | +| P2-03 | WebView2 原生窗口遮挡层 | 已完成(offscreen 34 项全绿,2026-07-21;真机 WebView2 人工验收清单见 evidence/P2-03.md) | P0-02、P1-03 | +| P2-04 | 跨平台聚合测试入口 | 已完成(2026-07-17) | 新增 `tests/run_all.py`:Windows 25/25 PASS,WSL/3.12 FAIL 0 + 21 有理由 SKIP;暴露并修复 T9 陈旧断言与 `core/agent/compaction.py` 的 3.11+ dataclass 缺陷;证据 `evidence/P2-04.md` | + +## P0-01 配置路径与测试隔离 + +**状态:已实施(定向测试通过)。** 新增 `core/config_paths.py`(统一入口,环境变量优先、容错加载、可见警告);`core/llm_engine.py`、`ui/views/main_window.py`(webview_backend 与 init_model_popup 两处)、`ui/views/bash_panel.py` 全部改走统一入口;新增 `tests/_test_env.py` 统一临时环境与 `tests/test_config_isolation.py` 隔离回归。证据见 [evidence/P0-01.md](evidence/P0-01.md)。 + +**目标** + +让所有配置读取方统一尊重 `HAOCODE_CONFIG_FILE`,并保证自动化测试在导入 GUI 前完成数据库和配置重定向。默认源码运行仍使用项目内 `data/`。 + +**先读文件** + +- `core/llm_engine.py` +- `ui/views/bash_panel.py` +- `ui/views/main_window.py` 中所有配置路径和配置读取函数 +- `core/db_manager.py` 中 `_DEFAULT_DB` 的定义和初始化时机 +- `tests/smoke_bash_panel.py` +- `tests/test_error_persist.py` +- `tests/test_agent_core.py` 中依赖 provider 配置的用例 + +只读源码中的路径引用,不读取 `data/config.json` 的内容。 + +**允许修改** + +- 上述源码和测试。 +- 可以新增一个只负责路径解析和容错加载的 `core/` 辅助模块,以及一个 `tests/` 临时环境辅助模块。 +- 可以新增 `tests/test_config_isolation.py`。 + +**硬约束** + +- 环境变量优先级统一;没有环境变量时才回到项目内现有路径。 +- 路径解析本身不得在 import 时输出、复制或迁移配置内容。 +- 缺失或格式错误的配置必须产生可见警告,并使用现有安全默认值继续启动;不得吞掉错误,也不得因此阻断不需要该配置的源码路径。 +- 测试必须先创建临时配置、设置 `HAOCODE_CONFIG_FILE`、重定向 `core.db_manager._DEFAULT_DB`,然后才能 import `MainWindow`。 +- 不修改真实配置,不引入配置迁移或新配置格式。 + +**目标测试** + +```text +python tests/test_config_isolation.py +python tests/test_error_persist.py +python tests/smoke_bash_panel.py +python tests/test_agent_core.py +``` + +**完成证据** + +- 测试用拦截器记录到的配置打开路径全部位于临时目录,且禁止路径从未被打开;此断言不得通过读取或散列真实配置完成。 +- 临时配置的读写用例通过,临时数据库之外没有数据库写入。 +- 缺失配置和损坏配置各有一个回归用例,日志包含明确警告,进程正常退出。 +- 源码中不存在绕过统一路径解析的运行时配置读取。 + +## P0-02 合并重复的 `MainWindow.eventFilter` + +**状态:已实施(定向测试通过)。** 两处定义合并为一份(位于 `init_chat_events` 前的「事件拦截」节);发送规则(按钮禁用 / 流式生成时 Enter 不发送)收进 `send_message(from_enter=...)` 单一实现,按钮点击的中断语义不变。证据见 [evidence/P0-02.md](evidence/P0-02.md)。 + +**目标** + +修复同一类中后定义方法覆盖前定义方法的确定性缺陷,使 Enter、Shift+Enter、发送按钮状态和流式生成状态使用一套事件策略。 + +**先读文件** + +- `ui/views/main_window.py` 中 `MainWindow.init_chat_events`、两处 `MainWindow.eventFilter`、`send_message` 和 `_update_send_button_state` +- 与输入框发送行为相关的现有 smoke 测试 + +**允许修改** + +- `ui/views/main_window.py` 的事件过滤逻辑。 +- 可以新增 `tests/test_main_window_event_filter.py` 或在现有离屏 smoke 中增加断言。 + +**硬约束** + +- `MainWindow` 最终只能有一个 `eventFilter` 定义。 +- Enter 只发送一次;Shift+Enter 放行换行;发送按钮禁用或当前会话正在流式生成时不得发送。 +- 其他对象和事件必须继续交给父类,不顺带重构主窗口事件系统。 +- 测试遵守 P0-01 的临时配置和临时数据库规则。 + +**目标测试** + +```text +python tests/test_main_window_event_filter.py +python tests/smoke_offscreen.py +python tests/smoke_mode.py +``` + +**完成证据** + +- 四种键盘状态均有断言:Enter 可发送、Enter 被禁用、流式时 Enter 被拦截、Shift+Enter 换行。 +- 静态断言或 AST 检查证明 `MainWindow` 只有一个 `eventFilter`。 +- 测试中一次按键对应最多一次 `send_message` 调用。 + +## P0-03 修复交接文档基线 + +**状态:已完成。** 2026-09-16 无人值守轮次按本节标准复核:三项 `rg` 回归通过,交接目录与 `AGENTS.md` 相对链接全部有效;并随 P0-01/P0-02 结果更新了 README/CURRENT_STATE/VERIFICATION 中相应过时表述。保留本节作为后续文档变更的回归标准,不要重复搬运或重建交接目录。 + +**目标** + +让后续 Agent 只从一条清晰入口读取当前事实,并把损坏或过时材料降级为历史资料。 + +**先读文件** + +- `AGENTS.md` +- `ARCHITECTURE.md` +- `docs/agent-handoff/README.md` +- `docs/agent-handoff/CURRENT_STATE.md` +- `docs/agent-handoff/PLATFORM_PLAN.md` +- 本文和 `VERIFICATION.md` + +**允许修改** + +- 仅上述文档。 + +**硬约束** + +- `AGENTS.md` 的入口指针必须覆盖修复、跨平台、测试、结构审查和工作交接五类触发场景。 +- `ARCHITECTURE.md` 必须移除被拼接进来的第三方任务书正文,并在旧架构内容前明确标记“历史资料”;不得把旧目录树继续描述为当前事实。 +- 当前支持矩阵、任务要求和验证规则分别只有一个权威位置,通过链接引用,不复制成多份。 +- 不创建虚构的 Git 历史,不声称缺失的脚本或打包配置已经存在。 + +**目标测试** + +```text +rg -n "agent-handoff/README.md" AGENTS.md +rg -n "历史资料|当前事实" ARCHITECTURE.md +rg -n "haocode 修复需求(团队任务书)" ARCHITECTURE.md +``` + +最后一条应无匹配;再逐一检查交接文档中的相对链接和文件路径存在性。 + +**完成证据** + +- 新 Agent 按 `AGENTS.md` 指针能在一次跳转内到达 `docs/agent-handoff/README.md`。 +- `ARCHITECTURE.md` 没有拼接残片,且任何保留旧内容均带历史标记。 +- 交接目录中没有互相冲突的支持矩阵、默认值或验收口径。 + +## P1-01 双向消息渲染窗口 + +**目标** + +把前端 DOM 限制为严格的双向滑动窗口,同时保留完整当前会话链、附件、时间线、工具输出、分支切换和流式体验。 + +**先读文件** + +- `ui/views/main_window.py` 中 `load_messages_to_web`、分支切换、删除/重答和 `_active_streams` +- `ui/views/chat_bridge.py` +- `ui/web/app.js` 中消息创建、`messageBuffer`、滚动、`clearChat`、流式完成和时间线回放 +- `ui/web/index.html`、`ui/web/style.css` +- `core/db_manager.py` 中 `get_message_chain` 和分支查询 +- `tests/test_math_extract.js`、`tests/smoke_timeline.py`、`tests/smoke_midswitch.py` + +**允许修改** + +- 上述 Python/JS/CSS 文件和相关测试。 +- 可以新增一个 DOM 无关的 JS 窗口状态模块、`tests/test_render_window.js` 和 `tests/diag_render_scale.py`。 +- 可以在统一配置加载器中增加 `render_window_mode`、`render_window_size` 的解析。 + +**硬约束** + +- Python 保留完整的当前会话可见消息链作为窗口数据源;本任务不改 SQLite 查询模型或数据库 schema。 +- 初始窗口为最新 `size` 条。`size` 只接受非布尔整数 `10..200`,缺失、布尔、字符串、零、负数和越界值都静默回落 `40`。模式只接受 `auto`/`manual`,否则回落 `auto`。 +- `.message-wrapper` 数量始终不超过 `size`。流式消息计入上限;默认值下有一条流式消息时,最多保留另外 39 条。 +- JS 以“方向 + 边界消息 ID”向 Python 请求页;Python 以单个批次返回完整消息描述。描述必须足以独立还原正文、reasoning、附件、时间线和工具结果、分支信息及必要的发送者信息。 +- 请求与响应携带会话/代次标识;切会话、清屏或切分支后到达的旧响应必须丢弃。 +- `messageBuffer` 只负责活动流,不得作为历史分页数据源。 +- `manual` 模式向上只能点击“加载更早消息”;滚到顶部不得自动请求。`auto` 模式由顶部观察器自动请求,同时保留同一按钮。两个模式向下都自动恢复较新消息。 +- 每个新流式 token 延续当前行为:立即回到底部并跟随活动消息。 +- 向上换页使用“首个可见消息 ID + 像素偏移”恢复锚点,误差不超过 2 px。不得只按总高度差估算。 +- 切换分支后重建链,并尽量让目标消息保持在同一视口位置;目标已不存在时回到底部。 +- `clearChat()` 清除当前窗口的游标、缓存、DOM、未决请求和代次;已注入的配置模式和大小保持不变。 +- 一次换页始终执行“加入一端、裁掉另一端”,并维护 `hiddenOlder`、`hiddenNewer`。上方没有更多记录时隐藏加载入口。 +- 不引入 JSDOM、npm 工程或新的前端依赖。 + +**目标测试** + +```text +node tests/test_render_window.js +python tests/diag_render_scale.py 400 +python tests/smoke_offscreen.py +python tests/smoke_timeline.py +python tests/smoke_midswitch.py +python tests/test_file_attach.py +node tests/test_math_extract.js +``` + +`test_render_window.js` 必须直接测试 DOM 无关状态机;DOM/QWebChannel 集成由 Qt smoke 覆盖。 + +**完成证据** + +- 参数化测试覆盖 `auto`/`manual`、10/40/200、全部非法配置类型、双向连续换页、首尾边界和过期响应。 +- 固定 400 条夹具中 `.message-wrapper <= size`,并记录总节点数与页面高度;节点和高度阈值只对该固定夹具验收,见 `VERIFICATION.md`。 +- 附件消息、带工具时间线消息和多分支消息在被裁剪后再次加载,内容与控件完整。 +- 有/无活动流两种情况下均满足严格上限;流式期间没有删除活动消息。 +- 自动与手动模式分别有向上行为断言;两个模式都有无需点击的向下恢复断言。 +- 锚点误差记录不超过 2 px;分支目标缺失的回底行为有断言。 +- 帧耗时只形成真机人工基准报告,不作为自动化硬阈值。 + +## P1-02 Windows/Linux shell 与进程树终止 + +**状态:已完成。** 2026-07-09 无人值守轮次:新增 `core/platform_shell.py` 窄适配(Windows 字符串命令行 `cmd.exe /d /s /c ""`、Linux `/bin/bash -lc` argv + 独立进程组;超时/中止整树终止);`SYSTEM_PROMPT.md` 单一通用正文 + `{{SHELL_PLATFORM_SECTION}}` 运行时短平台段。目标测试 20/20、30/30、35/35、41/41 全绿,smoke_mode 完整 agent 回合 ALL PASS。Linux 进程组用例(C3)在 Linux 环境运行时生效。证据见 `evidence/P1-02.md`。 + +**目标** + +明确工具 shell 契约,并保证超时、取消和异常清理能结束整棵子进程树。 + +**先读文件** + +- `core/agent/tools.py` 中 bash 工具、`Popen`、超时和终止逻辑 +- `core/llm_engine.py` 中 `load_system_prompt` +- `SYSTEM_PROMPT.md` 的 shell/path 说明 +- `tests/test_bash_stream.py`、`tests/test_tool_params.py` + +**允许修改** + +- 上述文件和测试。 +- 可以新增一个窄的平台进程适配模块及 `tests/test_cross_platform_shell.py`。 + +**硬约束** + +- Windows 明确通过 `cmd.exe` 执行;Linux 明确通过 `/bin/bash -lc` 执行,不依赖 `shell=True` 的平台默认值。 +- Windows 使用现有等价机制终止进程树;Linux 创建独立 POSIX 进程组,超时和主动中止均向整组发送终止信号,并在宽限期后强制结束。 +- 输出流、超时提示、截断上限和工具结果结构保持现有接口。 +- 保留一份通用 `SYSTEM_PROMPT.md`;运行时只插入短的平台 shell/path 段。不得维护两份完整提示词。 +- 提示词仍在每次请求时重读。Windows 段不得出现在 Linux 请求中,Linux 段不得出现在 Windows 请求中。 +- 不增加命令审批、Agent shell sandbox 或路径限制。 + +**目标测试** + +```text +python tests/test_cross_platform_shell.py +python tests/test_bash_stream.py +python tests/test_tool_params.py +python tests/test_agent_core.py +``` + +**完成证据** + +- 平台参数测试捕获到 Windows 的 `cmd.exe` argv 和 Linux 的 `/bin/bash -lc` argv。 +- Linux 用例启动父进程和孙进程,分别在超时与主动中止后证明两者都不存在;Windows 有等价进程树用例。 +- 提示词测试模拟两个平台,证明只有对应平台段被插入且通用正文完全相同。 +- 现有 bash 流式输出、返回码、超时和截断回归全部通过。 + +## P1-03 Windows/Linux 渲染器启动链 + +**状态:已完成。** 2026-07-17 无人值守轮次:新增 `core/renderer_backend.py` 窄适配(后端解析:非法/跨平台 `webview2` 可见警告 + 回落平台默认;每实例独立 QtWebEngine profile 目录:源码 `data/webengine/profile__`、测试经 `HAOCODE_WEBENGINE_PROFILE_DIR` 重定向;`--no-sandbox` 仅显式 + root/容器时接受并打印高可见警告,普通桌面剥离);`main_window.py` 以 `sys.platform == "win32"` 门控 `core.webview2` 导入(Linux 永不触达 pythonnet/Win32/DLL/taskkill);`CustomWebPage(profile, parent)` 兼容旧式调用;`main.py` 导入 PyQt6 前 sanitize flags;requirements 平台 marker + Linux 运行说明。目标测试 19/19、10/10、22/0、8/8、39 passed 全绿 + `main.py` offscreen 真实启动链验证;Linux 真机与 root/容器接受路径待对应环境。证据见 `evidence/P1-03.md`。 + +**目标** + +建立明确的渲染器矩阵:Windows 首选 WebView2、失败回落 QtWebEngine;Linux 只使用 QtWebEngine。 + +**先读文件** + +- `main.py` +- `ui/views/main_window.py` 中浏览器创建、JS 就绪和配置读取 +- `core/webview2.py` +- `ui/views/wv2_view.py` +- `ui/views/custom_web_page.py` +- `requirements.txt` +- `tests/test_wv2_guard.py`、`tests/smoke_offscreen.py` + +**允许修改** + +- 上述启动链、依赖说明和测试。 +- 可以新增小型平台检测/QtWebEngine profile 适配器和 Linux 源码运行说明。 + +**硬约束** + +- Linux 路径不得导入或调用 pythonnet、Win32 API、WebView2 DLL 和 `taskkill`。 +- 不引入 WebKitGTK 或它的 Qt 封装。 +- QtWebEngine 使用隔离 profile,两个并行源码实例不得争用同一个 Chromium profile。保持现有页面功能,不伪造 Linux 单实例锁。 +- 非法 `webview_backend` 配置产生可见警告并回落平台默认值,不能阻断源码启动。 +- 正常桌面运行保留 Chromium sandbox;root/container 的无 sandbox 路径必须显式选择并打印风险提示。 +- `vendor/webview2/` 和根目录 `WebView2Loader.dll` 保持 Windows 运行时用途,不删除。 +- 不添加 PyInstaller/spec 文件或打包承诺。 + +**目标测试** + +```text +python tests/test_wv2_guard.py +python tests/smoke_offscreen.py +python tests/test_debug_window.py +node tests/test_math_extract.js +``` + +平台真实启动按 `VERIFICATION.md` 执行。 + +**完成证据** + +- 平台模拟测试证明 Windows 的首选/回落路径和 Linux 的 QtWebEngine-only 路径。 +- Linux import 测试不触达任何 Windows-only 符号。 +- 两个 QtWebEngine 实例同时运行、载入本地页面和关闭,profile 无锁冲突或互相清理。 +- Windows 真实 WebView2 和强制 QtWebEngine 回落各有一次启动记录;Linux X11/Wayland 各有一次 QtWebEngine 启动记录。 +- 普通用户运行参数中不存在 `--no-sandbox`;显式 root/container 路径有单独证据。 + +## P1-04 Linux 截图热键与截图实现 + +**状态:已完成。** 2026-07-17 无人值守轮次:新增三个窄适配器——`desktop_session.py`(会话探测 win32/x11/wayland/unknown + 能力路由/明确不可用日志)、`x11_hotkey.py`(ctypes→libX11 XGrabKey 原生全局热键,零 pip 依赖,注册失败/无显示明确日志,stop 释放)、`portal_capture.py`(Wayland 经 xdg-desktop-portal Screenshot,系统 gdbus CLI,用户授权不绕过 compositor,FilePicked→现有附件流程,拒绝/不支持/超时有明确结果);`main_window.py` 热键与截图按平台路由(Windows 行为保持);`screen_capture.py` 空画面守卫。目标测试 23/23、17/17、9 OK、8/8 全绿 + 回归 41/41 等全绿 + `main.py` offscreen 真实启动链;X11 真实注册/命中与 Wayland portal 三态待真实 Linux 宿主手动。证据见 `evidence/P1-04.md`。 + +**目标** + +把现有“截图全局热键”能力适配到 Linux,而不是扩展成通用键盘钩子系统。 + +**先读文件** + +- `ui/views/system_tools/global_hotkey.py` +- `ui/views/system_tools/screen_capture.py` +- `ui/views/main_window.py` 中热键注册、截图启动和结果处理 +- `main.py` 的平台启动逻辑 +- 相关附件/图片测试 + +**允许修改** + +- 上述文件和测试。 +- 可以新增 Windows、Linux X11、Linux Wayland 的窄适配器;原入口保持稳定。 + +**硬约束** + +- Windows 保持现有行为。 +- Linux X11 使用原生全局快捷键和可行的原生屏幕捕获路径。 +- Linux Wayland 使用 `xdg-desktop-portal` 或桌面协议完成快捷键和截图;遵守用户授权流程,不绕过 compositor。 +- portal、桌面环境或协议版本不支持时,界面/日志必须明确说明当前能力不可用,主程序仍可聊天和使用其他功能。 +- 只处理现有截图快捷键,不增加任意键监听、记录或重映射。 +- 不做打包和发行版泛化;Ubuntu 22.04/24.04 x64 以外标记“未验证”。 + +**目标测试** + +```text +python tests/test_global_hotkey_platforms.py +python tests/test_screen_capture_platforms.py +python tests/test_file_attach.py +python tests/smoke_offscreen.py +``` + +适配器单元测试使用替身;X11/Wayland 真实行为按 `VERIFICATION.md` 手工取证。 + +**完成证据** + +- 平台路由、授权拒绝、portal 缺失和注册失败均有确定的回归测试。 +- X11 真实桌面中,应用失焦时热键仍触发截图,图片回到现有附件流程。 +- Wayland 真实桌面中,通过 portal/桌面协议完成授权、触发和截图;若目标桌面确实不支持,留下明确错误和环境信息,而不是伪造成功。 +- Windows 现有热键和截图回归通过。 + +## P2-01 Bash 任务按启动时间倒序 + +**目标** + +运行中和已完成两栏都让最新启动的任务位于第一项,任务从运行中移动到已完成时仍使用原启动顺序。 + +**先读文件** + +- `ui/views/bash_panel.py` 中 `set_session`、`_refresh`、`on_started`、`on_finished`、`BashLayer` 和两个 section 类 +- `ui/views/main_window.py` 中 `_on_tool_started`、输出/计时/完成转发 +- `tests/smoke_bash_panel.py` + +**允许修改** + +- `ui/views/bash_panel.py`、必要的事件元数据传递和测试。 + +**硬约束** + +- 排序键是启动时间/启动序号,降序显示;不得用完成时间重排。 +- 已落库时间线没有显式时间时,使用消息链顺序和时间线内顺序构造稳定启动序号,不改数据库 schema。 +- 任务从运行中进入已完成后,相对顺序由原启动键决定,不因结束先后跳位。 +- 重排复用现有 `BashLayer` 实例;展开/折叠状态、实时输出、代码框水平/垂直滚动值、运行中栏和已完成栏的 section 滚动位置都保持。 +- 保留现有限量显示和上下文标记语义。 + +**目标测试** + +```text +python tests/smoke_bash_panel.py +python tests/test_bash_stream.py +``` + +**完成证据** + +- 至少三项任务以不同启动/完成顺序运行,两个 section 均断言启动时间降序。 +- 完成中间任务前后,对象 identity、展开状态、输出文本和四类滚动值保持。 +- 切换会话后从 DB/活动流重建的顺序与实时期间一致。 + +**状态:已完成。** 2026-07-21 无人值守轮次:`bash_panel.py` 的 `_refresh()` 两栏显示改为启动序号降序(排序键 = `_order` 稳定启动序号,构造方式 = 消息链顺序 + 时间线内顺序,无时间戳、无 schema 变更;完成时间从不参与排序,`on_finished` 不移动 `_order` 位置);重排仍走 `set_layers` 复用同一批 `BashLayer` 实例,展开/折叠、实时输出、代码框滚动、栏滚动位置全部保持;限量窗口成员与提示语不变。`smoke_bash_panel.py` 新增第 11 节 23 项断言(交错完成顺序、对象 identity、四类滚动值保持、DB 重建一致性)140 项 ALL PASS,`test_bash_stream.py` 30/30,回归 smoke_offscreen 8/8、run_tests 41/41 全绿。证据见 `evidence/P2-01.md`。 + +## P2-02 右侧 Bash 面板滚动条 + +**目标** + +只修复右侧 Bash 面板的原生滚动条和横纵滚动条交汇角,不污染其他 Qt 控件。 + +**先读文件** + +- `ui/views/main_window.py` 中全局 QSS 的 `#right_sidebar`、`#bl_code` 段 +- `ui/views/bash_panel.py` 中 `BashLayer._code_box` 和 section 滚动区 +- Qt 当前版本的 `QAbstractScrollArea::corner`/`QPlainTextEdit::corner` 样式行为 +- `tests/smoke_bash_panel.py` + +**允许修改** + +- 右侧面板的局部 QSS、相关测试和新建 `tests/diag_panel_scrollbar.py`。 + +**硬约束** + +- 保留现有 `#bl_code` 背景、边框、圆角和文本基础样式,只补滚动条与正确的 corner 规则。 +- 所有选择器必须限定在右侧 Bash 面板或 `#bl_code`;不得添加无作用域的 `QScrollBar`/`QAbstractScrollArea` 全局规则。 +- 横纵滚动条目标厚度为 8 px,隐藏箭头,handle 可见且 hover 正常;corner 与代码框背景一致。 +- 使用 Qt 支持的 `QAbstractScrollArea`/`QPlainTextEdit` corner 子控件语法,不写 `QScrollBar::corner`。 +- 不借机调整其他弹窗、会话列表或全局字体。 + +**目标测试** + +```text +python tests/smoke_bash_panel.py +python tests/diag_panel_scrollbar.py +``` + +**完成证据** + +- 离屏测试断言横纵滚动条 sizeHint/实际厚度和箭头 extent,诊断脚本生成局部截图并打印测量值。 +- Windows 与 Linux QtWebEngine 真机截图均显示无箭头、无亮色 corner 方块、handle 可辨识。 +- 模型弹窗、会话列表、附件预览和调试窗口的滚动条与修复前一致。 + +**状态:已完成。** 2026-07-21 无人值守轮次:`main_window.py` 全局 QSS 中 `#bl_code` 规则后插入一段完全限定作用域的滚动条 + corner 规则(`QPlainTextEdit#bl_code QScrollBar:*`、`QPlainTextEdit#bl_code::corner { background-color: #fbfcfe; }`、`QScrollArea#bl_scroll QScrollBar:*`)——零无作用域规则;`#bl_code` 原有背景/边框/圆角/文本样式未动。新建 `tests/diag_panel_scrollbar.py`(18 项断言:厚度/sizeHint/箭头 subControlRect=0/corner 像素 #fbfcfe/无亮白/未命名框仍原生 14px/附件区仍 6px)18 项 ALL PASS,`smoke_bash_panel.py` 140 项、回归 smoke_offscreen 8/8、run_tests 41/41、timeline 11/11、midswitch 7/7 全绿。截图落盘 `evidence/p2-02-*.png`。Windows/Linux 真机截图项:在对应环境直接运行 `diag_panel_scrollbar.py` 即可出图验证。证据见 `evidence/P2-02.md`。 + +## P2-03 WebView2 原生窗口遮挡层 + +**目标** + +修复改名遮罩被 WebView2 原生子窗口压住的确定性缺陷,并审计同类遮罩,只修复能确认的原生窗口遮挡。 + +**先读文件** + +- `ui/views/main_window.py` 中 `AttachmentPreviewOverlay`、`RenameOverlay`、`SessionContextPopup`、`SettingsWindow`、所有以 `bg_widget` 或主窗口为 parent 的全窗口候选,以及 `_rename_session` +- `ui/views/wv2_view.py` +- `core/webview2.py` 中原生子窗口层级说明 +- `tests/smoke_offscreen.py` + +**允许修改** + +- 上述遮罩实现和测试。 +- 可以新增 `tests/diag_rename_overlay.py`;只有出现真实重复时才可加一个窄的几何同步辅助函数。 + +**硬约束** + +- `RenameOverlay` 使用可覆盖原生 WebView2 的独立顶层透明窗口,覆盖主窗口客户区并保持卡片居中;系统标题栏和窗口控制仍可操作。 +- 主窗口移动、缩放、最大化、还原和多显示器/DPI 变化时几何同步正确。 +- 保留点击空白关闭、Esc、关闭按钮、输入框全选、Enter 提交和关闭后焦点恢复。 +- 顶层窗口关闭后释放,不残留遮罩、事件过滤器或焦点捕获。 +- 审计每个遮罩后只修复可复现的同类问题;普通 popup/dialog 不重写成统一框架。 +- QtWebEngine 路径行为不得退化;真正的 WebView2 覆盖只能在 Windows 真机验收。 + +**目标测试** + +```text +python tests/diag_rename_overlay.py +python tests/smoke_offscreen.py +python tests/smoke_copy_session.py +``` + +**完成证据** + +- 结构测试证明遮罩是顶层 Tool 窗口、启用透明背景、覆盖主窗口客户区并可释放。 +- Windows WebView2 真机截图显示聊天区与 Qt 区域均匀变暗,卡片在最上层且可交互。 +- 拖动、缩放、最大化、还原、多 DPI 显示器至少各验证一次;记录覆盖误差。 +- 遮罩审计表列出每个候选、是否受原生窗口影响、复现结果和处理决定。 + +**状态:已完成。** 2026-07-21 无人值守轮次:`RenameOverlay` 整类重写为独立顶层 `FramelessWindowHint|Tool` 透明窗(`WA_TranslucentBackground` + `WA_DeleteOnClose`)——只覆盖主窗口**客户区**(`mapToGlobal(main.rect().topLeft())`+客户区尺寸,系统标题栏/窗口控制保持可操作),eventFilter 跟随 `Move`/`Resize`/`WindowStateChange`(最大化/还原/DPI 变化同路),保留点空白/✕/取消/Enter/输入全选,新增 Esc 关闭;关闭时 `removeEventFilter`+焦点回主窗+`deleteLater`,`_closed` 幂等。调用点 `_rename_session` 未改。审计:`AttachmentPreviewOverlay`/`SettingsWindow`/`SessionContextPopup`/`ModelSelectPopup`/`SessionModePopup`/`PdfModePopup` 均为独立顶层窗(不受影响),`RenameOverlay` 是唯一 bg_widget 子控件模式者(已修)。未抽公共辅助函数(不构成真实重复);未重写普通 popup/dialog。新建 `tests/diag_rename_overlay.py`(34 项:结构/客户区覆盖/跟随/全部关闭与提交行为/释放无残留)ALL PASS;目标测试 smoke_offscreen 8/8、smoke_copy_session ALL PASS;回归 smoke_bash_panel 140 项、run_tests 41/41 全绿(均 EXIT=0)。真机 WebView2 验收:`core/webview2.py` `get_environment()` 含 `taskkill /F /IM msedgewebview2.exe` 且共享 profile 不可重定向,无人值守自动化有意不走该路径;机制与生产已验证的附件预览层同构(拥有者顶层 Tool 窗 z 序必盖 WebView2 原生子 HWND),人工验收清单见 `evidence/P2-03.md`。证据见 `evidence/P2-03.md`。 + +## P2-04 跨平台聚合测试入口 + +**目标** + +提供一个可在 Windows/Linux 调用的自动化聚合入口,同时保留每个现有测试的独立运行方式。 + +**先读文件** + +- `tests/run_tests.py` +- `tests/test_*.py`、`tests/smoke_*.py` 的入口和环境假设 +- 本文各任务新增的测试 +- `VERIFICATION.md` + +**允许修改** + +- `tests/run_tests.py`,或新增 `tests/run_all.py`。 +- 可以新增测试清单/分组元数据和必要的测试环境辅助模块。 +- 可以更新交接测试文档。 + +**硬约束** + +- 保留所有独立命令;聚合入口不得要求 pytest、npm 或网络。 +- 每个测试使用独立临时目录;GUI 测试在 import `MainWindow` 前完成临时数据库与临时配置设置。 +- 默认聚合不运行 `diag_*`、`verify_*`、`tune_*`、真实 API、真实桌面或需要凭据的脚本。 +- 平台不适用项必须以明确 `SKIP` 和理由呈现,不能伪装通过;平台共同项失败时返回非零。 +- 一个子测试崩溃或超时不能阻止结果汇总,最终退出码仍反映失败。 +- 不读取真实配置,不访问网络,不删除用户运行数据。 + +**目标测试** + +```text +python tests/run_all.py --group logic +python tests/run_all.py --group offscreen +python tests/run_all.py --group all +``` + +若选择扩展现有 `run_tests.py`,保持等价分组参数,并同步本文命令。 + +**完成证据** + +- Windows 和 Linux 各有一份汇总,列出 PASS/FAIL/SKIP、耗时和失败命令。✅ Windows 25/25 PASS(logic 12 + offscreen 13,均 EXIT=0);WSL/CPython 3.12.3 全量 PASS 4 / FAIL 0 / SKIP 21(依赖缺失/平台不适用,理由逐条打印,EXIT=0)。 +- 用一个故意失败的临时夹具证明聚合入口返回非零且仍汇总后续测试;夹具不提交。✅ 崩溃夹具→FAIL、超时夹具→TIMEOUT,后续健康测试照跑,退出码 1,完整汇总 + 失败命令清单;夹具用后即删。 +- 默认运行记录证明未启动真实 API 测试、人工诊断脚本或真实桌面脚本。✅ 默认清单仅 25 条自动化条目;diag_*/verify_*/tune_*/real-DB/凭据类均在排除清单带理由(见 run_all.py 注释)。 +- 各单文件命令仍可直接运行,输出与聚合子进程一致。✅ `test_copy_session.py` 独立 vs 聚合子日志尾逐字一致(54/54 PASS)。 + +## 整体验收终点 + +只有同时满足以下条件,本清单才完成: + +1. 每个任务的目标测试通过,并留下该任务要求的证据。 +2. `VERIFICATION.md` 的完整自动化回归在 Windows 和 Linux 通过;合理的平台专属项明确跳过。 +3. Windows WebView2、Windows QtWebEngine 回落、Linux X11 QtWebEngine、Linux Wayland QtWebEngine 均完成真实桌面检查。(Windows 两项:✅ 2026-09-17 已验证,见 evidence/P1-03.md;Linux 两项:待 Ubuntu 桌面主机) +4. X11 与 Wayland 的截图热键按各自协议验证;不支持的 Wayland 环境留下明确错误证据。 +5. 没有业务功能扩展、模块搬迁、打包变更、Agent sandbox 或真实配置访问混入修复。 diff --git a/docs/agent-handoff/VERIFICATION.md b/docs/agent-handoff/VERIFICATION.md new file mode 100644 index 0000000..1108935 --- /dev/null +++ b/docs/agent-handoff/VERIFICATION.md @@ -0,0 +1,262 @@ +# 验证与取证规范 + +本文定义修复任务的统一验证口径。任务范围和完成条件见 [REPAIR_BACKLOG.md](REPAIR_BACKLOG.md)。平台行为契约见 [PLATFORM_PLAN.md](PLATFORM_PLAN.md)。 + +## 测试前置条件 + +### 凭据与运行数据隔离 + +`data/config.json` 是不透明秘密。执行测试的 Agent 不得打开、读取、搜索、打印、复制或修改它,也不得用散列或快照方式“验证未变化”。采用以下正向隔离: + +1. 为每个测试进程创建独立临时目录和最小临时配置。 +2. 在 import 任意可能间接加载 `MainWindow` 的模块前设置 `HAOCODE_CONFIG_FILE`。 +3. 在 import `MainWindow` 前把 `core.db_manager._DEFAULT_DB` 指向临时数据库。 +4. 写入、迁移、附件和截图产物只落到临时目录。 +5. 用文件打开拦截器或替身断言禁止路径从未被访问,不读取禁止路径本身。 + +需要真实 API key 的 `diag_live_*`、`smoke_live_*` 由用户在受控环境手工决定是否运行;默认测试和工作 Agent 均不运行它们。 + +### GUI 环境 + +离屏测试只验证结构和一般 Qt 行为,不算真机视觉证据。 + +Windows PowerShell: + +```powershell +$env:PYTHONIOENCODING = 'utf-8' +$env:QT_QPA_PLATFORM = 'offscreen' +python tests/smoke_offscreen.py +``` + +Linux: + +```bash +PYTHONIOENCODING=utf-8 QT_QPA_PLATFORM=offscreen python tests/smoke_offscreen.py +``` + +真实桌面检查前移除 `QT_QPA_PLATFORM=offscreen`。不得用离屏截图替代 WebView2、X11、Wayland、portal、DPI 或滚动条真机检查。 + +### 结果记录 + +每个任务至少记录: + +- 操作系统、桌面会话类型、Python、PyQt6/Qt 版本; +- 精确命令、退出码和测试摘要; +- 失败或跳过项及理由; +- 真机项的截图/录屏路径和复现步骤; +- 是否使用临时配置、临时数据库和离屏模式。 + +不要写固定“应通过 N 项”的文案;用退出码和当前测试自己报告的数量为准,避免测试增删后文档失真。 + +## 定向测试矩阵 + +每个任务先跑自己的定向测试。定向通过后才跑所在阶段的完整回归。 + +| 任务 | 必跑命令 | 额外人工证据 | +|---|---|---| +| P0-01 配置隔离 | `python tests/test_config_isolation.py`;`python tests/test_error_persist.py`;`python tests/smoke_bash_panel.py`;test_agent_core(经 `python tests/run_tests.py` 运行) | 打开路径拦截记录只含临时目录 | +| P0-02 `eventFilter` | `python tests/test_main_window_event_filter.py`;`python tests/smoke_offscreen.py`;`python tests/smoke_mode.py` | Enter/Shift+Enter 行为记录 | +| P0-03 文档 | 文档链接检查与 `rg` 检查 | 从 `AGENTS.md` 演练一次读取路径 | +| P1-01 渲染窗口 | `node tests/test_render_window.js`;`python tests/diag_render_scale.py 400`;相关 Qt smoke | 400 条固定夹具、锚点误差、帧时间报告 | +| P1-02 shell | `python tests/test_cross_platform_shell.py`;`python tests/test_bash_stream.py`;`python tests/test_tool_params.py` | 两平台进程树消失证明 | +| P1-03 渲染器 | `python tests/test_wv2_guard.py`;`python tests/smoke_offscreen.py`;`node tests/test_math_extract.js` | Windows 两后端、Linux X11/Wayland 启动 | +| P1-04 热键/截图 | 平台适配单元测试、`python tests/test_file_attach.py` | Windows、X11、Wayland 各自真机行为 | +| P2-01 Bash 排序 | `python tests/smoke_bash_panel.py`;`python tests/test_bash_stream.py` | 重排前后状态与滚动位置 | +| P2-02 滚动条 | `python tests/diag_panel_scrollbar.py`;`python tests/smoke_bash_panel.py` | Windows/Linux 局部截图和尺寸 | +| P2-03 遮罩 | `python tests/diag_rename_overlay.py`;`python tests/smoke_offscreen.py` | Windows WebView2 遮罩截图/移动缩放录屏 | +| P2-04 聚合入口 | `python tests/run_all.py --group logic`;`--group offscreen`;`--group all` | Windows/Linux 汇总各一份 | + +表中尚不存在的脚本属于对应任务的交付物,不得在创建前声称已经通过。 + +## P1-01 渲染窗口专项 + +### DOM 无关状态机 + +`tests/test_render_window.js` 直接加载纯状态机,不依赖浏览器、JSDOM 或 npm。至少覆盖: + +- `auto`、`manual` 两种模式; +- `size` 为 10、40、200; +- 缺失、`true`/`false`、字符串、0、负数、9、201 等值都回落 40; +- 初始最新页、连续向上、连续向下、首尾边界; +- 加一端时裁另一端,窗口始终不超过上限; +- 活动流计入上限,且不会被裁; +- 新 token 到来回到底部; +- `clearChat` 清游标/缓存/未决请求但保留配置; +- 会话/代次变化后丢弃旧响应; +- 分支目标保留和目标缺失回底。 + +### Qt/DOM 集成 + +Qt smoke 使用临时会话生成完整描述,至少包含普通消息、附件、reasoning、工具时间线、工具结果和多分支消息。用 QWebChannel 完成多轮双向换页后,逐项比较重建结果。 + +通用硬指标:任意时刻 `.message-wrapper <= render_window_size`。这条对所有夹具、所有窗口大小和流式状态都成立。 + +固定 400 条夹具的附加指标: + +| 指标 | 门槛 | +|---|---| +| `.message-wrapper` | `<= render_window_size`,默认 `<= 40` | +| DOM 总节点 | `<= 4000` | +| 页面总高度 | `<= 30000 px` | +| 向上换页锚点误差 | `<= 2 px` | + +总节点数和页面高度只对版本化的固定 400 条夹具验收。修改夹具必须在结果中说明,不得把这些数字套到任意内容长度。 + +### 帧时间 + +帧时间属于人工基准报告,不是自动化通过门槛。相同机器、相同窗口尺寸、相同 400 条夹具分别记录修复前/后: + +- 流式追加一段固定文本期间的采样次数; +- frame duration 的 median、p95 和最大值; +- 是否发生肉眼可见停顿; +- 浏览器后端和 Qt 版本。 + +报告原始数值和测量方法,不把环境波动包装成确定性断言。 + +## 当前独立回归命令 + +在 P2-04 聚合入口完成前,按影响范围选择下列现有命令。每项任务不要求机械运行所有命令;一个阶段结束时运行完整集合。 + +```text +python tests/run_tests.py +python tests/test_config_isolation.py +python tests/test_main_window_event_filter.py +python tests/test_tool_params.py +python tests/test_compaction_persist.py +python tests/test_copy_session.py +python tests/test_bash_stream.py +python tests/test_error_persist.py +python tests/test_wv2_guard.py +python tests/test_debug_window.py +python tests/test_think_code_neutral.py +python tests/test_file_attach.py +python tests/test_pdf_reader.py +python tests/smoke_offscreen.py +python tests/smoke_mode.py +python tests/smoke_copy_session.py +python tests/smoke_bash_panel.py +node tests/test_math_extract.js +``` + +平台专属测试在不适用的平台明确 `SKIP`。任何共同逻辑测试失败都不能以平台差异豁免。 + +`tests/run_tests.py` 当前只覆盖其显式加载内容;在 P2-04 完成前,不能把它单独称为“全套测试”。 + +## 分阶段完整回归 + +### P0 完成后 + +运行全部纯逻辑测试和所有受影响的离屏 GUI 测试。重点证明测试不会访问真实配置/数据库,并且 `MainWindow` 输入行为没有回归。 + +### P1 完成后 + +运行当前独立回归命令全集,加上: + +```text +node tests/test_render_window.js +python tests/test_cross_platform_shell.py +python tests/test_global_hotkey_platforms.py +python tests/test_screen_capture_platforms.py +``` + +随后完成 Windows/Linux 真实桌面矩阵。平台适配任务没有真实桌面证据时不能标记完成。 + +### P2 完成后 + +优先运行新聚合入口: + +```text +python tests/run_all.py --group all +``` + +再单独运行三个诊断脚本;它们属于人工/半自动取证,不应混入默认聚合: + +```text +python tests/diag_render_scale.py 400 +python tests/diag_panel_scrollbar.py +python tests/diag_rename_overlay.py +``` + +## 真实桌面矩阵 + +### Windows 10/11 x64 + +至少覆盖以下路径: + +1. WebView2 首选路径:启动、发一轮对话、流式输出、附件、分支、切会话。 +2. QtWebEngine 强制回落:使用临时配置启动同一套基本流程。 +3. 同时启动两个 QtWebEngine 实例,证明 profile 不争用。 +4. WebView2 下打开改名遮罩,验证整个客户区覆盖;拖动、缩放、最大化和还原。 +5. Bash 面板三项以上任务,验证最新任务在顶部、状态保持和滚动条视觉。 +6. 截图全局热键在应用失焦时仍能捕获并进入附件流程。 + +证据必须标注实际后端。QtWebEngine 截图不能替代 WebView2 原生遮挡验收。 + +### Ubuntu 22.04/24.04 x64 + X11 + +至少使用 Python 3.10--3.12 范围内一个受支持版本完成: + +1. `python main.py` 启动 QtWebEngine,渲染 Markdown、KaTeX、代码块和工具时间线。 +2. 发一轮对话并执行 shell 工具,实际命令由 `/bin/bash -lc` 执行。 +3. 超时和主动中止后检查父/孙进程均不存在。 +4. 双开应用,两个 QtWebEngine profile 不冲突。 +5. X11 原生全局截图热键在应用失焦时触发,截图进入附件流程。 +6. 消息窗口、Bash 排序与滚动条完成一次真机检查。 + +### Ubuntu 22.04/24.04 x64 + Wayland + +至少完成: + +1. QtWebEngine 正常启动并完成基本对话与渲染。 +2. portal/桌面协议请求有清晰的用户授权流程。 +3. 全局快捷键和截图通过 portal/桌面协议完成;若当前桌面协议不支持,界面明确报错,应用其余功能继续可用。 +4. 拒绝授权、portal 服务缺失和协议版本不足各记录一次结果。 +5. 普通用户启动保持 Chromium sandbox。 + +Wayland 下不得用 X11 私有 API 或静默降级成“仅窗口内快捷键”并声称全局热键通过。 + +### 其他发行版 + +可以记录探索结果,但统一标记“未验证”,不能扩大官方支持矩阵。 + +## 人工 UI 检查 + +### Bash 排序与状态 + +按 A、B、C 顺序启动,按 B、A、C 或其他不同顺序结束。运行中栏和已完成栏始终按 C、B、A 的启动顺序显示。操作前先: + +- 展开其中一个 layer; +- 在输出框分别设置水平和垂直滚动位置; +- 滚动运行中栏和已完成栏。 + +任务状态迁移后,上述展开状态、输出、代码框滚动和两个 section 滚动均保持。 + +### Bash 滚动条 + +同时制造横向与纵向溢出,记录: + +- 横纵滚动条实际厚度; +- 箭头区域是否消失; +- handle 是否可拖动并有 hover; +- 横纵交汇处是否与代码框背景一致; +- 模型弹窗、会话列表、附件预览和调试窗口是否未受影响。 + +### 改名遮罩 + +Windows WebView2 下记录打开、移动、缩放、最大化、还原、提交和取消。截图必须包含整个主窗口,能比较聊天区与 Qt 控件区的遮罩亮度。结构性离屏断言只是补充。 + +## 聚合入口契约 + +P2-04 完成后的聚合入口必须: + +- 使用 Python 子进程执行现有独立测试,不把所有测试 import 到同一进程; +- 为每个子进程建立独立临时环境; +- 支持至少 `logic`、`offscreen`、`all` 三组; +- 汇总命令、退出码、耗时和 PASS/FAIL/SKIP; +- 默认排除 live、diag、verify、tune、网络和凭据测试; +- 一个子进程失败后继续收集其余结果,最终返回非零; +- 在 Windows 和 Linux 使用同一 Python 接口,不嵌入 `.bat` 或 Bash 专属命令串。 + +## 最终判定 + +一项修复只有在以下内容齐全时才算完成:定向测试通过、阶段完整回归通过、该平台需要的真实桌面证据齐全、所有跳过项有理由、真实配置和数据库从未被测试访问。任何一项缺失都应标记为“未完成”而不是“基本完成”。 diff --git a/docs/agent-handoff/evidence/P0-01.md b/docs/agent-handoff/evidence/P0-01.md new file mode 100644 index 0000000..df45beb --- /dev/null +++ b/docs/agent-handoff/evidence/P0-01.md @@ -0,0 +1,45 @@ +# P0-01 配置路径与测试隔离 — 执行证据 + +日期:2026-09-16(无人值守轮次) +平台:Windows 11 10.0.26200 x64 · Python 3.10.21(`.venv`)· PyQt6/Qt 6.10.0/6.10.2 · 离屏 `QT_QPA_PLATFORM=offscreen` + +## 根因(源码确认) + +1. `core/llm_engine.py` 模块常量 `CONFIG_PATH` + `_load_config()` 不读 `HAOCODE_CONFIG_FILE` → 三个 Qt worker(Agent/Chat/Title)直接读项目内真实配置。 +2. `ui/views/main_window.py:3133`(webview_backend 分支)与 `:5244`(`init_model_popup`)直接 `open(data/config.json)`,绕过环境变量。 +3. `ui/views/bash_panel.py` 有私有的环境变量解析(双入口,非统一)。 +4. `core/db_manager._DEFAULT_DB` 为模块级全局,测试在 import 前重定向的既有模式成立,沿用。 + +## 修复摘要 + +- 新增 `core/config_paths.py`:`config_path()`(`HAOCODE_CONFIG_FILE` 优先、调用时解析)+ `load_config()`(缺失/损坏/非对象 → 可见警告 + 安全空 dict,不抛异常)。 +- `core/llm_engine.py`:删除 `CONFIG_PATH` 常量;`_load_config()` 委托 `load_config()`(保留函数名兼容既有调用方)。 +- `ui/views/main_window.py`:两处直接 open 改走 `core.config_paths.load_config`。 +- `ui/views/bash_panel.py`:`_cfg_path()` 委托统一 `config_path()`,删除私有 `_CFG_PATH` 常量。 +- 新增 `tests/_test_env.py`:`isolate(tag, config)` 统一创建临时配置 + 临时数据库并在 import MainWindow 前完成重定向。 +- 改造 3 个在范围测试使用统一临时环境:`tests/smoke_bash_panel.py`、`tests/test_error_persist.py`、`tests/test_agent_core.py`(provider 用例改读临时配置中的 `testprov`,不再依赖真实配置)。 +- 新增 `tests/test_config_isolation.py`:open/sqlite 拦截器 + 缺失/损坏/非对象回归 + AST 静态扫描。 + +## 定向测试(命令 / 退出码 / 结果) + +| 命令 | 退出码 | 结果 | +|---|---|---| +| `python tests/test_config_isolation.py` | 0 | ALL PASS(14 项断言) | +| `python tests/test_error_persist.py` | 0 | 39 PASS(与交接基线 39 一致) | +| `python tests/smoke_bash_panel.py` | 0 | 116 PASS(与交接基线 116 一致) | +| `python tests/run_tests.py`(test_agent_core.py 的仓库标准运行方式,pytest 由 harness stub) | 0 | 41 passed, 0 failed(与交接基线 41 一致) | + +注:`python tests/test_agent_core.py` 直接运行在本仓库不可用(文件无独立 runner 且 .venv 不装 pytest,见 requirements.txt 说明),按其设计经 `tests/run_tests.py` 运行;P2-04 聚合入口将统一固化该运行方式。 + +## 完成证据对应 + +- **拦截器证明**:MainWindow 构造 + `save_panel_width` 写回全程,所有 `config.json`(含原子写 `.tmp`)打开路径均位于 `tempfile.gettempdir()/haocode_test_cfgiso_/`;真实配置路径(仅以字符串比较)从未出现在打开记录中。未读取、未散列真实配置。 +- **临时配置读写**:`llm_engine._load_config()` 读到 `testprov`;`save_panel_width(340)` → `load_panel_width() == 340`,写路径落临时目录。 +- **数据库隔离**:sqlite3.connect 拦截记录中临时库之外零连接/写入。 +- **缺失/损坏/非对象**:三个回归用例均返回 `{}` 且 stdout 含明确警告(`[config] 配置文件缺失/读取/解析失败/不是 JSON 对象`),进程正常退出。 +- **静态扫描**:`core/`、`ui/`、`tools/`、`main.py` 中除 `core/config_paths.py` 外不存在 `config.json` 字符串字面量(AST 级,docstring/注释排除)。 + +## 观察项(未扩范围,留待后续) + +- `tests/smoke_offscreen.py`、`smoke_mode.py`、`smoke_copy_session.py` 只重定向了数据库、未设置 `HAOCODE_CONFIG_FILE`(不在 P0-01 允许修改清单内)。本轮运行这些套件时在启动环境显式导出临时配置;P2-04 聚合入口将按子进程强制注入临时环境,彻底闭环。 +- `tests/diag_live_agent.py:19`、`tests/tune_model_popup.py:155` 直接引用真实配置路径;二者属 live/tune 人工脚本,默认聚合排除。 diff --git a/docs/agent-handoff/evidence/P0-02.md b/docs/agent-handoff/evidence/P0-02.md new file mode 100644 index 0000000..7d33855 --- /dev/null +++ b/docs/agent-handoff/evidence/P0-02.md @@ -0,0 +1,56 @@ +# P0-02 合并重复的 `MainWindow.eventFilter` — 执行证据 + +日期:2026-09-16(无人值守轮次) +平台:Windows 11 10.0.26200 x64 · Python 3.10.21(`.venv`)· PyQt6/Qt 6.10.0/6.10.2 · 离屏 `QT_QPA_PLATFORM=offscreen` + +## 根因(源码确认) + +- `MainWindow` 类体内定义了两个 `eventFilter`(行 3697 与 3763):后定义者覆盖前者,前者的 + `_active_streams` 守卫是死代码。 +- 生效版本(3763)用 `btn_send.isEnabled()` 做守卫,而 `set_send_button_state` 只切换 + 图标、从不禁用按钮 → 守卫恒真 → 流式生成中按 Enter 会落入 `send_message` 的中断路径 + (触发停止),与注释声称的「生成时按回车无效,防止误触」相反。 + +## 修复摘要(仅 `ui/views/main_window.py` 事件过滤逻辑) + +- 删除行 3763 的重复 `eventFilter`(及其后不可达的两行过期分节注释)。 +- 保留行 3697 处为 `MainWindow` 唯一 `eventFilter`:Enter(无 Shift)→ `send_message(from_enter=True)` + 并消费事件(一次按键至多一次调用);Shift+Enter → 返回 False 放行换行;其他对象/事件交父类。 +- `send_message(self, from_enter: bool = False)`:函数顶部为发送规则单一实现: + 1) `btn_send` 禁用 → 一律不发送; + 2) `from_enter=True` 且当前会话在 `_active_streams` → 直接返回(Enter 不参与停止/中断语义); + 3) 按钮点击路径行为完全不变(流式中点击 = 原有红色停止按钮中断语义,含 Fix B/C)。 +- `_update_send_button_state` 未改(其语义与规则一致)。 + +## 定向测试(命令 / 退出码 / 结果) + +| 命令 | 退出码 | 结果 | +|---|---|---| +| `python tests/test_main_window_event_filter.py` | 0 | ALL PASS(18 项断言) | +| `python tests/smoke_offscreen.py` | 0 | ALL PASS: 8/8 | +| `python tests/smoke_mode.py` | 0 | ALL PASS | +| 回归 `python tests/test_config_isolation.py` | 0 | ALL PASS(14 项) | +| 回归 `python tests/test_error_persist.py` | 0 | 39 PASS | +| 回归 `python tests/smoke_bash_panel.py` | 0 | 116 PASS | + +注:`smoke_offscreen.py` / `smoke_mode.py` 自身只重定向数据库、未设置 `HAOCODE_CONFIG_FILE` +(不在 P0-02 允许修改清单内)。本轮运行时在进程环境显式导出指向临时配置的 +`HAOCODE_CONFIG_FILE`;P2-04 聚合入口将按子进程强制注入临时环境,彻底闭环。 + +## 完成证据对应(test_main_window_event_filter.py) + +- **AST 静态断言**:解析 `ui/views/main_window.py`,`MainWindow` 类体内 `eventFilter` 定义恰好 1 个(行 3697); +- **Enter 可发送**(A1–A5):空闲 + 按钮可用 + 有文本 → 一次 Enter 恰好一次 `send_message(from_enter=True)` + 调用(计数 wrapper 包住真实实现),流同步注册、输入框清空、错误路径自清理; +- **Enter 被禁用**(B1–B3):`btn_send.setEnabled(False)` → 至多一次调用且无流、输入内容保留(规则在 `send_message` 内生效); +- **流式时 Enter 被拦截**(C1–C3):注入假流 → Enter 后假流对象未被替换、字段未被改动(未触发中断)、输入保留; +- **Shift+Enter 换行**(D1–D3):零调用,事件放行到输入框(光标处插入 `\n`)、无流; +- **其他键/事件交父类**(E1–E2):按 `a` 正常插入字符、零发送调用; +- **一次按键至多一次调用**:A/B/C/D 各用例均以调用计数断言(全部 ≤1 且语义正确)。 + +## 行为变化说明 + +- 流式生成中按 Enter:旧(生效)代码会触发停止/中断;新代码 no-op(Enter 只管发送, + 停止只走按钮)。这与被覆盖版本注释中声明的原始意图(「生成时按回车无效,防止误触」) + 和 P0-02 硬约束(「流式生成时不得发送」)一致,属本任务预期的确定性修复。 +- 发送按钮点击路径(含流式中点击 = 中断):逐行未动。 diff --git a/docs/agent-handoff/evidence/P0-PHASE_REGRESSION.md b/docs/agent-handoff/evidence/P0-PHASE_REGRESSION.md new file mode 100644 index 0000000..c046f24 --- /dev/null +++ b/docs/agent-handoff/evidence/P0-PHASE_REGRESSION.md @@ -0,0 +1,42 @@ +# P0 阶段完整回归 — 执行证据 + +日期:2026-09-16(无人值守轮次) +平台:Windows 11 10.0.26200 x64 · Python 3.10.21(`.venv`)· PyQt6/Qt 6.10.0/6.10.2 · Node(test_math_extract) +运行方式:全部子进程统一注入 `HAOCODE_CONFIG_FILE` 指向临时配置(`smoke_offscreen/smoke_mode/smoke_copy_session` 自身不设该变量,属 P2-04 前已知观察项);GUI 套件 `QT_QPA_PLATFORM=offscreen`。 + +## 结果(命令 / 退出码 / 摘要) + +纯逻辑(13 个套件,全部 EXIT=0): + +| 套件 | 摘要 | +|---|---| +| `python tests/run_tests.py` | 41 passed, 0 failed | +| `python tests/test_tool_params.py` | ALL PASS | +| `python tests/test_compaction_persist.py` | ALL PASS | +| `python tests/test_copy_session.py` | ALL PASS | +| `python tests/test_bash_stream.py` | ALL PASS | +| `python tests/test_error_persist.py` | ALL PASS(39 项) | +| `python tests/test_wv2_guard.py` | ALL PASS | +| `python tests/test_debug_window.py` | 22 PASS / 0 FAIL | +| `python tests/test_think_code_neutral.py` | ALL PASS | +| `python tests/test_file_attach.py` | OK | +| `python tests/test_pdf_reader.py` | OK | +| `python tests/test_config_isolation.py` | ALL PASS(14 项,P0-01 新增) | +| `python tests/test_main_window_event_filter.py` | ALL PASS(18 项,P0-02 新增) | + +离屏 GUI(4 个套件,全部 EXIT=0): + +| 套件 | 摘要 | +|---|---| +| `python tests/smoke_offscreen.py` | ALL PASS: 8/8 | +| `python tests/smoke_mode.py` | ALL PASS | +| `python tests/smoke_copy_session.py` | ALL PASS | +| `python tests/smoke_bash_panel.py` | ALL PASS(116 项) | + +JS(1 个套件,EXIT=0):`node tests/test_math_extract.js` — 39 passed, 0 failed。 + +## 判定 + +P0 阶段回归通过:测试不访问真实配置/数据库(拦截器证明 + 临时环境),`MainWindow` +输入行为无回归(P0-02 四态断言 + 既有 116 项 bash 面板回归)。真实桌面矩阵属 +P1/P2 阶段(PLATFORM_PLAN 验收矩阵),本阶段不声称桌面已验证。 diff --git a/docs/agent-handoff/evidence/P1-01.md b/docs/agent-handoff/evidence/P1-01.md new file mode 100644 index 0000000..a9005bd --- /dev/null +++ b/docs/agent-handoff/evidence/P1-01.md @@ -0,0 +1,90 @@ +# P1-01 双向消息渲染窗口 — 完成证据 + +**状态**: COMPLETE +**完成时间**: 2026-07-21(会话时间) +**环境**: Windows 11 x64, CPython 3.10.21 (.venv, uv), PyQt6 / Qt 6.10.0, Node + +## 设计 + +**数据流(引擎无关)** +- JS → Python:`bridge.onRequestWindowPage(sessionId, direction, boundaryId, generation)` + (QtWebChannel slot 与 WebView2 postMessage 白名单同名,单一实现)。 +- Python → JS:`run_js("rwPageResponse()")` / `rwInitWindow()` / `rwNoteLive(...)` / `rwBegin(...)` / `rwConfig(...)`。 +- JS 端只做"窗口游标 + DOM 搬移":Python 用既有逐消息 bridge 调用渲染 DOM, + JS 状态机 `ui/web/render_window.js` 跟踪 `order`(消息 id 序列)+ `indexById`(链内下标), + 不解析消息内容。 + +**关键参数** +- 窗口 = `render_window_size`(10/40/200,非法静默回落 40;mode `auto`/`manual` 回落 auto)。 +- **页 = 半窗**(`max(1, size//2)`)。若页 = 整窗,"首个可见消息"锚点必然被裁出窗口, + 需求中的锚点恢复(≤2px)永远不可达——诊断实测验证了这一点后才改为半窗。 +- 活动流式消息受保护(`trimHead`/`trimTail` 跳过 `activeStreamId`),计入上限; + `streamFinished` 解除保护。`rwNoteLive` 经 DOM `.streaming` 类自动接管流式保护, + 并携带实时 `chainLen` 维持 hidden 计数新鲜。 + +**滚动语义** +- 批次渲染期间 `window.__rwPageRendering = true`,抑制 `softScroll()` 与 + `finishMessage` 的 `scrollIntoView`。 +- **守卫在调度时刻捕获**(`var rwBatchSuppressed = !!window.__rwPageRendering` 后立即 + rAF+50ms 延迟回调):延迟回调触发时批次已结束、标志已被 Python 复位,届时再读会漏放 + `scrollIntoView(smooth)` → 平滑滚底 → `rwAutoCheck` 误判贴底 → 触发 'newer' 反向换页振荡。 + 这是诊断中 `scrollY 0→4367` 振荡的根因,已修复。 +- 向上换页锚点恢复:`scrollTop = oldScroll + (anchor.newTop - anchor.docTop)`, + 绝对顶部(`oldScroll <= 1`)例外:停在 0 露出新页;auto 模式沿顶部 60ms 链式补页。 +- 向下换页两模式均自动恢复(`isNearBottom() && canRequest('newer')`)。 +- 过期响应(会话/代次不匹配、pending 已被新请求替换、重复投递)整批丢弃,已渲染 DOM 回滚。 + +**生成代次(generation)** +- Python `MainWindow._rw_generation` 为唯一权威源:每次 `load_messages_to_web` / 新建会话 +1。 +- JS `clear()` 本地防御性 +1,Python 下次推送重新同步。 + +## 文件变更 + +| 文件 | 变更 | +|---|---| +| `core/config_paths.py` | 新增 `render_window_settings()`(16 类配置归一化)、`DEFAULT_RENDER_WINDOW_SIZE`、`ALLOWED_RENDER_WINDOW_SIZES` | +| `ui/web/render_window.js` | 新增:DOM 无关状态机(id+chainIndex 模型,双遍 recompute) | +| `ui/web/app.js` | `rwState`/`rwInitWindow`/`rwPageResponse`/`rwApplyOlder`/`rwApplyNewer`/`rwNoteLive`/`rwRequestPage`/`rwAutoCheck`/`rwCaptureAnchor`/`rwRemoveMessageDom`/`rwEnsureLoadButtons`/`rwUpdateLoadButtons`;`clearChat` 联动状态机清空;`finishMessage` 步骤 C 调 `streamFinished`、步骤 F 守卫捕获式;`createMessage`/`createLongMessage`/`createUserMessageWithAttachments` 的 `softScroll` 守卫;scroll 监听挂 `rwAutoCheck` | +| `ui/web/index.html` | 引入 `render_window.js`(先于 app.js);WebView2 shim 增加 `onRequestWindowPage` | +| `ui/web/style.css` | `.load-window-btn` 样式(含 `[hidden]` 规则) | +| `ui/views/chat_bridge.py` | 信号 `window_page_requested`、slot `onRequestWindowPage`、推送方法 `rw_config`/`rw_begin`/`rw_init_window`/`rw_note_live`/`rw_page_response` | +| `ui/views/wv2_view.py` | `_BRIDGE_METHODS` 白名单加 `onRequestWindowPage` | +| `ui/views/main_window.py` | `init_browser` 窗口状态初始化 + 信号连接;`_on_js_ready_checked` 一次性 `rwConfig` 推送;`load_messages_to_web` 窗口化重写(代次+1、`rwBegin`、最新 size 条窗口渲染、`rwInitWindow`、流式恢复保留);新增 `_rw_visible_chain`/`_rw_note_live`/`_render_history_one`/`_on_window_page_request`(边界缺失安全降级空页);`on_new_chat_clicked` 代次+1;发送/重答/完成 5 处 `_rw_note_live` 挂点 | +| `tests/test_render_window.js` | 新增:状态机 Node 测试 | +| `tests/diag_render_scale.py` | 新增:400 条链 offscreen 规模诊断(真实 viewport:resize+show+等待 innerHeight>0+显式重载) | +| `tests/smoke_timeline.py`、`tests/smoke_midswitch.py` | 转换到 `tests/_test_env.isolate()`(临时 DB+临时配置,P0-01 铁律) | +| `tests/_probe_rw.py` | 调试探针(保留,供后续排障) | + +## 验证(全部 EXIT=0,全部带显式超时执行) + +| 套件 | 结果 | +|---|---| +| `node tests/test_render_window.js` | **424/424 PASS**(配置归一化 16 例、auto/manual×10/40/200 初始窗口、双向连续换页 39 页/向、短链、过期响应 4 类、活动流保护、clear 语义、锚点几何、原子性、noteLive) | +| `python tests/diag_render_scale.py 400`(offscreen) | **6/6 PASS**:初始窗口=最新 40 条(链长 400);中部锚点保持(误差 ≤2px、无 newer 振荡);自顶部向上分页至头部(绝对顶部例外);头部状态+全链 400 条可达无重复;自顶部向下回翻 2 页;auto 模式顶部自动补页。**锚点误差 0.00px**;18 页 @ 169/183/204 ms(min/avg/max);DOM 节点 1057–1080;页面高度 7127–7213 px | +| `python tests/smoke_offscreen.py` | 8/8 ALL PASS | +| `python tests/smoke_timeline.py` | 11/11 ALL PASS(流式/历史路径,含 streaming 类收尾) | +| `python tests/smoke_midswitch.py` | 7/7 ALL PASS(切走切回时间线完整) | +| `python tests/test_file_attach.py` | 9 tests OK | +| `node tests/test_math_extract.js` | 39/39 PASS | +| 回归:`smoke_bash_panel` / `test_config_isolation` / `test_main_window_event_filter` / `smoke_mode` / `test_error_persist` | 全部 ALL PASS | +| `python tests/run_tests.py`(agent core 规范入口) | **41/41 PASS** | + +## 诊断过程记录(问题 → 根因 → 修复) + +1. **`rw_init_window` 链下标偏移**:初始窗口传入局部下标 0..39 而非链下标 → `hiddenOlder` 恒 0。 + 修复:`offset = total - len(window_items)`,传 `offset + i`。 +2. **offscreen 零视口**:未 `resize`+`show` 前 `innerHeight=0`,锚点几何全废。 + 修复(诊断侧):`window.resize(1400,950)` + `show()` + 等待 `innerHeight>0` + 显式 `load_messages_to_web` 重载。 +3. **`runJavaScript` 不能返回 DOM 元素**:回调转换失败 → 用 `cond ? 1 : 0` / 原语返回值。 +4. **分支兄弟偷叶**:链尾补兄弟消息使 `add_message` 自动改叶 → 链被截断。 + 修复(夹具):兄弟消息在循环内 `i==298` 处插入。 +5. **页 = 整窗导致锚点必被裁**(设计缺陷):半窗页修复(见"关键参数")。 +6. **`finishMessage` 守卫延迟求值 → 滚底 → 'newer' 振荡**(见"滚动语义"第 2 条)。 +7. **中部换页落点贴底**:15% 视口位置向上换页后锚点落 65%(不贴底);底部半窗换页本身会 + 落向底部属半窗几何固有——真实入口(顶部"加载更早消息"按钮 / auto 顶部观察器)不触发该位置, + 且落底后自动 'newer' 恢复符合"向下自动恢复"需求。 + +## 已知观察项(不在本任务范围) + +- `diag_render_scale` 的每页耗时(~180ms)只作真机基准参考,非硬阈值(符合任务要求)。 +- 帧耗时真机人工基准报告留待人工验收环节。 diff --git a/docs/agent-handoff/evidence/P1-02.md b/docs/agent-handoff/evidence/P1-02.md new file mode 100644 index 0000000..b1762c7 --- /dev/null +++ b/docs/agent-handoff/evidence/P1-02.md @@ -0,0 +1,74 @@ +# P1-02 证据:Windows/Linux shell 与进程树终止 + +日期:2026-07-09(无人值守轮次) +状态:**完成(Windows 侧自动化全绿;Linux 侧逻辑已实现并单测覆盖参数/提示词,进程组用例在 Linux 上运行时生效)** + +## 目标(摘自 REPAIR_BACKLOG.md) + +- Windows 明确通过 `cmd.exe` 执行;Linux 明确通过 `/bin/bash -lc` 执行,不依赖 `shell=True` 的平台默认值。 +- 超时与主动中止都终止完整子进程树(Windows `taskkill /F /T`;Linux 独立 POSIX 进程组,SIGTERM→宽限→SIGKILL 整组)。 +- 只保留一份通用 `SYSTEM_PROMPT.md`,运行时插入**短**平台 shell/path 段;两平台互不串段。 +- 保留输出流、超时、截断、工具结果结构;不加命令审批/沙箱/路径限制。 + +## 改动文件 + +| 文件 | 改动 | +|---|---| +| `core/platform_shell.py` | **新增**窄平台适配:`shell_command()`、`popen_flags()`、`kill_process_tree()`、`shell_prompt_section()`、`apply_platform_section()`、占位符 `{{SHELL_PLATFORM_SECTION}}` | +| `core/agent/tools.py` | `tool_bash` 的 Popen 改 `shell_command(command) + popen_flags()`;`_kill_tree` 委托 `kill_process_tree`;移除 `ctx["shell"]` 隐式开关 | +| `core/llm_engine.py` | `load_system_prompt()` 读文件后过 `apply_platform_section()`(每次请求仍重读,既有行为不变) | +| `SYSTEM_PROMPT.md` | 通用正文化:第 1 节去 Windows 路径/conda 环境名;原 1.1「shell 真相」cmd 表整体移入运行时 Windows 段;工具表与 3.2 去掉 `cmd.exe`/`dir`/`findstr` 字样;占位符落在原 1.1 位置 | +| `tests/test_cross_platform_shell.py` | **新增** 20 项断言(A 平台参数 / B 提示词 / C 进程树 / D 安全边界) | + +## 关键设计决策 + +1. **Windows 用字符串命令行,不用 argv 列表。** + `["cmd.exe","/d","/c",cmd]` 列表形态会被 CPython `list2cmdline` 把内部引号转义成 `\"`,cmd 不认, + 带引号路径直接 `'...\python.exe"' is not recognized`(实测复现)。最终契约: + `cmd.exe /d /s /c ""` 作为**字符串**交给 CreateProcessW,cmd 按 /s 规则解析 /c 参数 + (外层引号剥离、内部引号保留)。实测矩阵:引号 Python 路径 `rc=0`;`echo a && echo b` 正确; + `%USERPROFILE%` 展开;`;`/单引号行为与旧文档一致。 + 注:旧 `shell=True` 之所以能跑,是因为 CPython 对带引号程序名直接 CreateProcess(不经 cmd); + 新契约统一显式过 cmd,行为更可预测且与提示词一致。 +2. **POSIX 安全不变量**:`kill_process_tree` 仅当 `os.getpgid(pid) == pid`(确认 `start_new_session` + 生效、子进程是组首)才 `killpg`,否则退化单进程 `kill`,绝不误杀调用方所在组。 + 流程:SIGTERM 整组 → 轮询至 `grace_s=3.0s` → SIGKILL 整组。 +3. **提示词单一来源**:`SYSTEM_PROMPT.md` 唯一;`apply_platform_section` 只做占位符替换, + 无占位符(兜底提示词)原样返回。`load_system_prompt()` 每请求重读 → 平台段永远对应当前平台。 + +## 验证结果(本机 Windows 11 x64,CPython 3.10.21,全部显式超时) + +| 命令 | 结果 | +|---|---| +| `python tests/test_cross_platform_shell.py` | **20/20 PASS**(EXIT=0) | +| `python tests/test_bash_stream.py` | **30/30 PASS**(EXIT=0) | +| `python tests/test_tool_params.py` | **35/35 PASS**(EXIT=0) | +| `python tests/run_tests.py`(agent core,含 test_agent_core) | **41/41**(EXIT=0) | +| `python tests/smoke_mode.py`(完整 agent 回合,走 tool_bash) | ALL PASS(EXIT=0) | +| P0-03 一致性检查(AGENTS.md 指针 / ARCHITECTURE 历史资料标记 / 无第三方任务书正文) | 3/3 PASS | + +### 测试点明细(test_cross_platform_shell.py) + +- **A 平台参数**:Windows 命令 == `cmd.exe /d /s /c "echo hi"`;Linux argv == `["/bin/bash","-lc","echo hi"]`; + Linux `popen_flags() == {"start_new_session": True}`,Windows 为空。 +- **B 提示词**:通用正文含占位符且无平台泄漏(无 `cmd.exe`/`/bin/bash`);Windows 段含 `cmd.exe` 无 + `/bin/bash`,Linux 段反之;替换后通用正文逐字节相同(B6);`load_system_prompt()` == 文件+当前平台段。 +- **C 进程树(真实进程,父挂 30s + 孙每 0.2s 写心跳文件)**: + - C1 超时 3s → 错误结果含「超时」,耗时 <15s,**父与孙都不存在**(心跳静默 >0.6s 且无完成标记); + - C2 主动中止 1.5s → 错误结果含「中止」,**父与孙都不存在**; + - C3 Linux 独立进程组(Windows 上 SKIP;`pgid==pid` 断言 + killpg 后子进程消失,Linux 运行即生效)。 +- **D 安全边界**:已退出进程、`None` 输入均不抛异常。 + +### 调试过程记录(铁律:所有调试命令显式超时) + +1. 首跑 C1 失败:`'...\python.exe"' is not recognized` → 定位为 `list2cmdline` 引号转义; + 读 CPython 3.10 `subprocess.py` 确认 `shell=True` 实为直接 CreateProcessW(带引号程序名不经 cmd)。 +2. 尝试 `["cmd.exe","/d","/s","/c", '"'+cmd+'"']` 列表 → 仍失败(同样被转义)。 +3. 改**字符串**命令行 + 实测矩阵(引号路径/&&/管道/%VAR%)→ 全过,定稿。 +4. 首跑进程树用例 `hb_last=None`:父脚本模板漏传 `child.py` 脚本路径(把心跳路径当脚本)→ + 手动 `subprocess.run` 复现(超时 6s/3s 探针)→ 修模板,20/20 通过。 + +## Linux 侧待办(不阻塞本任务) + +- 在 Linux 环境跑一次 `python tests/test_cross_platform_shell.py`(C3 生效)+ `test_bash_stream.py` + 即可闭环;代码路径与 Windows 共用同一套 `kill_process_tree`/`shell_command` 分派。 diff --git a/docs/agent-handoff/evidence/P1-03.md b/docs/agent-handoff/evidence/P1-03.md new file mode 100644 index 0000000..4c799d2 --- /dev/null +++ b/docs/agent-handoff/evidence/P1-03.md @@ -0,0 +1,60 @@ +# P1-03 证据:Windows/Linux 渲染器启动链 + +日期:2026-07-17 · 执行环境:Windows 11 10.0.26200 x64 / CPython 3.10.21 (.venv, uv) / +PyQt6 6.10 + PyQt6-WebEngine 6.10 · 每条命令均带显式超时 + +## 改动文件 + +| 文件 | 性质 | 说明 | +|---|---|---| +| `core/renderer_backend.py` | 新增(仅 stdlib,可在导入 PyQt6 前使用) | `resolve_backend(pref)`(auto/webview2/qtwebengine 归一化;非法值/平台不支持 → 可见警告 + 平台默认,绝不阻断启动);`platform_default_backend()`;`webview2_module()`(win32 门控的按需导入);`webengine_profile_name()/webengine_profile_dir()`(每实例独立 profile 目录:源码运行 `data/webengine/profile__`,测试经 `HAOCODE_WEBENGINE_PROFILE_DIR` 重定向临时目录;只创建、从不清理);`is_root_or_container()`(geteuid==0 / .dockerenv / .containerenv / .lxc / /proc/1/cgroup);`sanitize_chromium_flags()`(`--no-sandbox` 契约) | +| `main.py` | 修改 | sys.path 就绪后、导入 `MainWindow` 前调用 `sanitize_chromium_flags` 并打印最终 `QTWEBENGINE_CHROMIUM_FLAGS` | +| `ui/views/main_window.py` | 修改(手术式) | ① `core.webview2` 导入改为 `if sys.platform == "win32"` 门控(Linux 永不导入,不触达 pythonnet/Win32/WebView2 DLL/taskkill);② 浏览器创建处先 `resolve_backend(config["webview_backend"])` 并打印警告(原「读取配置」从 win32 分支内提前到分支外,Linux 非法值也有可见警告);③ QtWebEngine 路径创建本实例 `QWebEngineProfile`(`setPersistentStoragePath`/`setCachePath` 指向独立目录),`CustomWebPage(profile, browser)` | +| `ui/views/custom_web_page.py` | 修改 | 构造函数兼容 `CustomWebPage(profile, parent)` 与旧式 `CustomWebPage(parent)`(按 `isinstance(QWebEngineProfile)` 分派,防旧调用把 view 误当 profile) | +| `requirements.txt` | 修改 | `pythonnet==3.1.0; sys_platform == "win32"`、`clr_loader==0.3.1; sys_platform == "win32"`;追加 Linux 源码运行最小步骤(apt 系统库清单、root/容器 `--no-sandbox` 说明、离屏测试命令) | +| `tests/_test_env.py` | 修改 | `isolate()` 增加 `HAOCODE_WEBENGINE_PROFILE_DIR` → 临时目录(setdefault,可覆盖) | +| `tests/smoke_offscreen.py` | 修改 | 同上(该文件不走 isolate) | +| `tests/test_renderer_matrix.py` | 新增 | R1/R3/R4/R5(见下)19 项 | +| `docs/agent-handoff/PLATFORM_PLAN.md` | 修改 | 「Linux 与 QtWebEngine 回落」追加 Linux 源码运行最小步骤 + 实现锚点 | + +`vendor/webview2/` 与根 `WebView2Loader.dll` 未动;未新增产品功能/安装器/PyInstaller 改动。 + +## 关键设计决策与踩坑记录 + +1. **`QTimer.singleShot` 单位是毫秒**:R4 首版写 `QTimer.singleShot(25, finish)` 期望 25s 兜底,实际 25ms 就触发 → 两个 worker 都报 `loaded=False`(rc=1)。诊断时手动复现看到 `BACKSTOP t=0.4`(30ms 定时器在事件循环启动 ~0.35s 后即触发),定位后改为 `30000`。 +2. **QtWebEngineWidgets 必须先于 QApplication 导入**(否则 ImportError:`QtWebEngineWidgets must be imported ... before a QCoreApplication instance is created`);**QWebEngineProfile 必须先于使用它的 page/view 创建**,`setPersistentStoragePath/setCachePath` 必须在 profile 使用前调用。探针脚本先后踩中这两个顺序问题(前者 ImportError;后者在 QApplication 前建 profile 直接进程被杀 exit 127、stdout 缓冲丢失)。 +3. **PyQt6-WebEngine 6.10 无 `QWebEnginePage.errorOccurred`**(Qt 6.5+ API 未在此绑定暴露)→ 诊断改用 `loadFinished(ok)` + 手动 processEvents 循环对比三种 profile 配置(默认 profile / 命名 profile 无自定义路径 / 命名 profile + 自定义路径),三者 file:// 加载全部成功,证明「命名 profile + setPersistentStoragePath」组合可用。 +4. **旧式位置调用兼容**:`CustomWebPage(browser)` 的 view 会被新签名当作 `profile` 传入 → `TypeError: argument 1 has unexpected type 'QWebEngineView'`(smoke 前用探针暴露)。按类型分派(`isinstance(QWebEngineProfile)`)同时支持新旧调用。 +5. **R3 Linux 模拟导入**:子进程 `sys.platform='linux'` 后 `import ui.views.main_window` 成功——因 `global_hotkey.py` 的 `from ctypes import wintypes` 只是类型定义(3.10 下跨平台可导入),`ctypes.windll` 访问全在 `if _is_windows` 内;`core.webview2` 模块级仅 stdlib 导入,但被 main_window 的 win32 门控挡住,`clr`/`clr_loader` 未进 `sys.modules`。 + +## 验证结果(全部显式超时) + +| 检查 | 结果 | 命令(超时) | +|---|---|---| +| `tests/test_renderer_matrix.py` | **19/19 PASS** | `PYTHONIOENCODING=utf-8 python tests/test_renderer_matrix.py`(timeout 300) | +| `tests/test_wv2_guard.py`(P0 遗留守卫) | **10/10 PASS** | `timeout 120` | +| `tests/test_debug_window.py` | **22 PASS / 0 FAIL** | `timeout 180` | +| `tests/smoke_offscreen.py` | **8/8 ALL PASS**,日志含 `[Renderer] QtWebEngine 独立 profile: /profile__*` | `QT_QPA_PLATFORM=offscreen HAOCODE_RENDER=software QTWEBENGINE_CHROMIUM_FLAGS=--disable-gpu timeout 240` | +| `node tests/test_math_extract.js` | **39 passed, 0 failed** | `timeout 60` | +| `main.py` 真实启动链(offscreen + 临时配置,无 providers) | 启动成功、无 traceback:`[渲染] 最终 QTWEBENGINE_CHROMIUM_FLAGS = '--disable-gpu'`、`[Renderer] QtWebEngine 独立 profile: D:\...\data\webengine\profile_56256_*`、`[System] 浏览器内核: QtWebEngine`;`data/config.json` mtime 前后一致(未触碰) | `HAOCODE_CONFIG_FILE= QT_QPA_PLATFORM=offscreen ... timeout 45 python main.py`(124=到点 kill,预期) | +| `main.py` 真实启动链:普通桌面 + `--no-sandbox` | 标志被剥离 + 告警:`[Renderer] ⚠️ ... 已剥离该标志并保留 Chromium 沙箱`,最终 flags 无 `--no-sandbox` | 同上(timeout 30) | +| 回归:`tests/run_tests.py` | **41 passed** | `timeout 300` | +| 回归:`test_bash_stream` / `test_tool_params` / `test_main_window_event_filter` / `test_config_isolation` | 全部 **ALL PASS / EXIT=0** | 各 `timeout 300` | +| 回归:`node tests/test_render_window.js` | **424 passed, 0 failed** | `timeout 120` | +| 回归:`tests/smoke_mode.py` | **ALL PASS** | `timeout 240` | +| P0-03 一致性抽查(文件存在、requirements marker、wv2 门控、单提示词占位符) | **10/10** | 纯 Python 读文件 | + +## 测试点明细(test_renderer_matrix.py) + +- **R1.1–R1.11** resolve_backend 矩阵(mock 平台):Win × auto/webview2/qtwebengine/非法字符串/非字符串/大小写容差;Linux × auto/webview2(警告+回落)/qtwebengine/非法;`webview2_module()` 非 Windows 返回 None。 +- **R3.1** 子进程 `sys.platform='linux'` 导入 `ui.views.main_window`:`_wv2mod is None`,`core.webview2`/`clr`/`clr_loader` 均不在 `sys.modules`。 +- **R4.1–R4.3** 两个 offscreen 子进程**并行**各建 `QWebEngineProfile`(`HAOCODE_WEBENGINE_PROFILE_DIR` 同基目录、各自 `parallel_` 子目录)+ `CustomWebPage(profile, view)` 载入本地 HTML:均 `WORKER_OK loaded=True`;两 profile 目录不同;进程退出后目录仍在(无互相清理)。 +- **R5.1–R5.4** `sanitize_chromium_flags` 契约(mock root/容器探测 + 捕获 stdout):普通桌面无标志原样;普通桌面剥离 `--no-sandbox`+告警;root/容器+显式保留+「高可见警告」;root/容器未设→原样+提示。 + +## 遗留 / 平台验证待办 + +- **Linux 真机验证(待 Ubuntu 主机)**:`pip install -r requirements.txt`(确认 pythonnet/clr_loader 被 marker 跳过)→ `python3.10 main.py`(X11/Wayland)+ 离屏套件 + `tests/test_renderer_matrix.py` 的 R3/R4(真实 Linux 平台而非模拟)。 +- **root/容器真机**:`--no-sandbox` 接受路径的运行时验证(本环境为普通 Windows 桌面,只能验证剥离路径;接受路径为纯逻辑 + mock 验证)。 +- **Windows 真机 WebView2 首选路径:已验证(2026-09-17 真桌面)**。本机 D: 卷 .NET 把工程卷误判为“网络位置”导致 `clr.AddReference`(LoadFrom)报 0x80131515;在 `core/webview2.py` 加 **byte[] 回落**(快路径仍 `AddReference`,失败才 `Assembly.Load(byte[])`,正常机器行为不变;外层异常改 `BaseException` 以兼容 pythonnet 非 Exception 异常)。修复后真桌面启动日志:`[WV2] AddReference 路径加载失败 → 回落 Assembly.Load(byte[])` → `Runtime ready: 153.0.4234.32` → `controller ready` → `NavigationCompleted src=file:///.../ui/web/index.html`,stderr 无 error/disposed/0x8007。`test_wv2_guard` 10/10 无回归。 +- **Windows 真机 QtWebEngine 回落:已验证(2026-09-17 真桌面,`HAOCODE_FORCE_QTWEBENGINE=1`)**。日志:`[WV2] ... 跳过 WebView2,回落 QtWebEngine`(强制标志生效,**未执行 taskkill**)→ `[Renderer] QtWebEngine 独立 profile: data/webengine/profile__`(per-instance 隔离 profile 真机生效)→ `[System] 浏览器内核: QtWebEngine`。聊天区截图像素统计:83% 亮背景 + 159 种颜色桶(含文本深色像素)= 真实 DOM 渲染,非空白。两模式主窗口截图已存 evidence:`win_real_wv2_mainwindow.png`、`win_real_qtwebengine_mainwindow.png`(半尺寸 PNG)。 + - 交叉验证(T0 守卫真机):WV2 主程序运行期间另跑 diag_panel_scrollbar.py,diag 实例因 instance-lock 被占自动回落 QtWebEngine,未误杀主程序 WebView2 进程。 diff --git a/docs/agent-handoff/evidence/P1-04.md b/docs/agent-handoff/evidence/P1-04.md new file mode 100644 index 0000000..5b6e0a5 --- /dev/null +++ b/docs/agent-handoff/evidence/P1-04.md @@ -0,0 +1,59 @@ +# P1-04 证据:Linux 截图热键与截图实现 + +状态:Windows 侧自动化验证全绿;Linux X11/Wayland 真实宿主验证按 VERIFICATION.md 手动待办(本环境为 Windows 桌面)。 + +## 交付物(文件级) + +| 文件 | 变更 | +|---|---| +| `ui/views/system_tools/desktop_session.py` | **新增**(纯 stdlib):`session_kind()` → `win32/x11/wayland/unknown`(WAYLAND_DISPLAY / QT_QPA_PLATFORM=wayland / DISPLAY 判定,offscreen→unknown);`hotkey_plan(kind)` / `capture_plan(kind)` 能力路由 + 明确能力说明文案 | +| `ui/views/system_tools/x11_hotkey.py` | **新增**(窄适配器,零新依赖,ctypes→libX11):`X11HotkeyThread`(与 Windows `GlobalHotkeyThread` 同一公开面 `triggered/start/stop`);XOpenDisplay→XKeysymToKeycode('s')→XSelectInput(KeyPressMask)→XGrabKey(root, keycode, Mod1Mask, owner_events)→select(X 连接 fd, 0.2s)+XPending/XNextEvent 循环;命中 Alt+S 发射 `triggered`;XEvent 结构体按 xproto.h XKeyEvent 布局(64 位 keycode@76);`_open_x11()` 可注入(测试替身);`wait_ready()` | +| `ui/views/system_tools/portal_capture.py` | **新增**(窄适配器,系统 gdbus CLI,零 pip 依赖):`detect_portal()`(Linux + XDG_RUNTIME_DIR/DBUS_SESSION_BUS_ADDRESS + gdbus 探测);`portal_screenshot_sync()`:gdbus 调 `org.freedesktop.portal.Screenshot.Screenshot(handle, "/", {})` 取 request 对象路径 → `gdbus monitor --session --object-path ` 监听 `FilePicked`(成功,file:// URI 剥前缀+unquote 解码)/`Request.Finished`(无 FilePicked → 用户取消/拒绝);显式预算:request 10s + 等待 120s,超预算 → timeout;`PortalScreenshotWorker(QThread)` 信号 `done(ok, path)` 回主线程 | +| `ui/views/main_window.py` | 热键注册块:`desktop_session.hotkey_plan(session_kind())` 平台路由(win32→GlobalHotkeyThread 行为字节级保持;x11→X11HotkeyThread;wayland/offscreen→None + 明确"全局热键不可用"日志),非 Windows 保留应用内 `QShortcut(Alt+S)` 兜底;`_start_screenshot()` 路由:win32/x11→现有覆盖层、wayland→`_start_portal_screenshot()`(worker 完成→`_on_image_pasted([path])` 进现有图片附件流程)、unknown→明确"截图不可用,聊天与其他功能不受影响"日志 | +| `ui/views/system_tools/screen_capture.py` | `start()` 增加空画面守卫:无主屏幕 / grabWindow 返回空图(X11 个别 compositor 限制)→ 明确日志 + 不显示覆盖层(Wayland 已在路由层改走 portal) | +| `tests/test_global_hotkey_platforms.py` | **新增** 23 检查:H1 session_kind 矩阵(win32/x11/wayland/offscreen/无显示 + XDG_SESSION_TYPE 三分支 + 矛盾时 WAYLAND_DISPLAY 优先);H2 hotkey_plan 四路由;H3 X11 成功路径(fake libX11:XGrabKey 参数 keycode=39/Mod1Mask=1/root=123/owner_events=1、命中发射 triggered、stop 后 XUngrabKey+XCloseDisplay);H4 失败三分支(键被占用 XGrabKey=0 / 无显示 XOpenDisplay=None / 不支持组合不打开显示)均安静退出+明确日志;H5 Windows 路径保持(本机实测 RegisterHotKey 线程运行 + stop 干净释放) | +| `tests/test_screen_capture_platforms.py` | **新增** 17 检查:C1 capture_plan 四路由;C2 detect_portal 四分支(非 Linux/无 D-Bus/无 gdbus/齐备);C3 成功路径(fake subprocess 校验 gdbus 命令行 `--dest/--object-path/--method=...Screenshot/parent=/`、monitor 监听 request 对象、file:// 含空格文件名 URI 解码 → 真实文件);C4 授权被拒不伪造成功;C5 portal NotSupported 原因透出;C6 超预算 timeout(迟到信号不算成功);C7 worker 信号回主线程;C8 覆盖层 offscreen 构造+空画面守卫不崩 | + +## 关键设计决定 + +1. **Windows 字节级保持**:`GlobalHotkeyThread`(Win32 RegisterHotKey 线程)与覆盖层路径零改动,仅调用处改为经 `hotkey_plan("win32")` 取回同一工厂;`capture_plan("win32")` 仍返回 overlay。 +2. **X11 全局热键 = 原生 XGrabKey,无新 pip 依赖**:libX11 是 X11 桌面必然存在的系统库,ctypes 直调;只映射现有 Alt+S(`_VK_TO_KEYSYM` 窄表,扩展需显式加表项);`owner_events=1`;stop 走 XUngrabKey+XCloseDisplay(关连接本身即释放 grab,双保险)。 +3. **Wayland = xdg-desktop-portal,不绕过 compositor**:compositor 安全模型禁止应用直接抓屏,故 Wayland 截图走 `org.freedesktop.portal.Screenshot`(交互式授权窗口,用户批准/取消);`gdbus`(GLib 系统组件)CLI 完成 D-Bus 调用,不引入 dbus-python;成功返回文件路径 → 直接进现有 `_on_image_pasted([path])` 附件流程(不经过 Qt 覆盖层,因为 Wayland 下无法把画面抓进 Qt widget)。 +4. **Wayland 全局热键:明确"不可用"而非硬做**:通用全局快捷键在 Wayland 依赖 compositor 桌面协议(ext-global-shortcut-unstable-v1 等,无统一 portal API),免依赖实现需完整 Wayland 客户端协议栈,超出窄适配器范围 → `hotkey_plan("wayland")` 返回 None + 日志明确说明(保留应用内 Alt+S + 截图按钮),符合硬约束"不支持时界面/日志必须明确说明能力不可用,主程序仍可聊天"。 +5. **能力不可用的一等公民**:`session_kind()=unknown`(offscreen/无显示)时,热键与截图都有显式日志("全局热键不可用"/"截图功能不可用;聊天与其他功能不受影响"),不再静默。 +6. **异常绝不逃逸 QThread.run()**:X11 事件循环整体 try/except——PyQt6 中 QThread.run() 未处理异常会 **abort 整个进程**(实测:CArgObject TypeError 逃逸 → 进程静默 127 退出、无 traceback、stdout 缓冲丢失)。这是本任务最贵的一个坑,已把"QThread.run() 必须全捕获"写进教训。 +7. **超时语义**:portal 等待中,FilePicked 之前/之后的信号都看预算——`Finished` 在预算内 → denied(用户取消);任何结果晚于预算 → timeout(不伪造、不无限挂起)。 + +## 验证(全部显式超时) + +| 套件 | 结果 | +|---|---| +| `python tests/test_global_hotkey_platforms.py` | **23/23 PASS** EXIT=0(timeout 120) | +| `python tests/test_screen_capture_platforms.py` | **17/17 PASS** EXIT=0(timeout 180) | +| `python tests/test_file_attach.py`(回归) | 9 tests OK(timeout 90) | +| `python tests/smoke_offscreen.py`(回归,offscreen+software+--disable-gpu) | **ALL PASS 8/8**(timeout 240),日志含 `[GlobalHotkey] Windows:系统级全局热键 Alt+S(RegisterHotKey)` | +| `python tests/run_tests.py` | 41/41 | +| `tests/test_main_window_event_filter.py` / `test_config_isolation.py` / `test_wv2_guard.py` / `test_renderer_matrix.py` / `test_cross_platform_shell.py` | ALL PASS / ALL PASS / ALL PASS / 19/19 / 20/20 | +| `main.py` 真实启动链(offscreen + 临时 config,timeout 45→124 kill 预期) | 无 traceback;`[GlobalHotkey] Windows:系统级全局热键 Alt+S` 打印;到达"JS 引擎已就绪";`data/config.json` mtime 前后一致(未触碰);error 行仅为 offscreen 已知 GPU 回落噪音 | + +## 测试点细节(对应目标测试要求) + +- **平台路由矩阵**:H1(session_kind 9 分支,含 XDG_SESSION_TYPE 与矛盾优先级)+ H2(hotkey_plan 4 路由)+ C1(capture_plan 4 路由)。 +- **X11 替身**:FakeX11 鸭子类型 libX11(socketpair 提供可 select 的 fd;XEvent 用 `ctypes.memmove` 填充;`CArgObject._obj` 从 `ctypes.byref(ev)` 还原原 struct——生产走真实 CDLL 不受影响)。 +- **注册失败→明确消息**:H4.1 键占用("Alt+S 可能已被其他程序占用")、H4.2 无显示("XOpenDisplay 失败")、H4.3 不支持组合("暂不支持的快捷键组合")——均无信号、`_registered=False`、线程安静退出。 +- **portal 替身 subprocess**:FakeRun/FakePopen 记录 argv 并回放 gdbus 输出(成功/拒绝/NotSupported/超时四态),验证真实 CLI 命令行与 JSON 事件解析,不依赖真实 portal。 +- **X11/Wayland 真实行为**:本环境为 Windows 桌面,X11/Wayland 真机按 VERIFICATION.md 手动(见下)。 + +## 待办(需真实 Linux 宿主,按 VERIFICATION.md 手动) + +1. Ubuntu 22.04/24.04 x64 X11 会话:`python3.10 main.py` → 日志 `[GlobalHotkey] X11:原生全局热键 Alt+S(XGrabKey)`;窗口失焦按 Alt+S 弹出覆盖层、框选截图成功;XGrabKey 被占用时日志明确。 +2. Wayland 会话(GNOME/KDE):启动日志 `[GlobalHotkey] Wayland:…未启用 → 仅提供应用内 Alt+S…`;点截图按钮(或应用内 Alt+S)→ xdg-desktop-portal 授权窗口出现;批准 → 文件进入附件;取消 → 日志"portal 截图未完成…已取消";无 portal 时日志"portal 不可用"。 +3. 其他发行版/DE 标记"未验证"(硬约束:不做发行版泛化)。 + +## 教训(持久) + +- **PyQt6:QThread.run() 内任何未处理异常 = abort 整个进程**(退出码 127、无 traceback、stdout 缓冲丢失,极难诊断)。QThread.run() 必须顶层 try/except 全捕获 + 日志。 +- `ctypes.byref(x)` 返回 `CArgObject`:真实 CDLL 调用正常,但传给**普通 Python 可调用对象**(测试替身)时对方 `byref()` 会 TypeError——替身端用 `getattr(arg, "_obj", arg)` 还原。 +- Windows 上 `os.pipe()` 的 fd 不能可靠用于 `select()`(无 WSAStartup 时 WinError 10093;初始化后是普通 pipe 又 10038)——跨平台可 select 的假 fd 用 `socket.socketpair()`;且 `a.send()` 的数据在 **b** 的接收缓冲(方向别写反)。 +- `file://` URI 解析用"剥前缀 + unquote"而非 `urlparse().path`:`file://D%3A%5Cx`(无第三斜杠)会被 urlparse 当成 netloc → path 为空。 +- gdbus 的 Screenshot 结果信号(FilePicked/Finished)都发在 **request 对象**上(方法返回的句柄路径),不是单独 handle 对象。 diff --git a/docs/agent-handoff/evidence/P2-01.md b/docs/agent-handoff/evidence/P2-01.md new file mode 100644 index 0000000..d213c8d --- /dev/null +++ b/docs/agent-handoff/evidence/P2-01.md @@ -0,0 +1,50 @@ +# P2-01 证据:Bash 任务按启动时间倒序 + +完成日期:2026-07-21(无人值守轮次) +结论:**完成**。两栏均按启动顺序降序显示(最新启动在第一项);运行中→已完成保持原启动位置;重排复用同一批 `BashLayer` 实例,全部 UI 状态保持。目标测试与回归全绿。 + +## 交付物 + +| 文件 | 改动 | +|---|---| +| `ui/views/bash_panel.py` | 模块 docstring 口径更新;`_refresh()` 两栏显示顺序改为启动序号降序;`layer_ids()` 的 running/done 返回真实显示顺序("all" 仍为原始启动正序,调试口径不变) | +| `tests/smoke_bash_panel.py` | 新增第 11 节(P11.1–P11.20 共 23 项断言);收尾改 `os._exit`(offscreen 铁律,修复解释器退出挂起) | + +未改动:`main_window.py`(事件转发链已是实时、按启动到达顺序带 `call_id` 转发,面板从到达顺序推导启动序号,无需新增元数据)、数据库 schema、`set_layers`(本就复用实例)。 + +## 关键设计决策 + +1. **排序键 = `self._order` 中的位置(稳定启动序号),不引入时间戳、不改 schema。** + 面板的 `_order` 在三个入口按启动先后追加: + - `set_session()` DB 重建:消息链顺序 + 时间线内顺序(= backlog 要求的「稳定启动序号」构造方式); + - `set_session()` 活动流:时间线内顺序(当前轮次天然晚于历史); + - 实时 `on_started()`:事件到达顺序。 + `_order` 即启动序号本身,`_refresh()` 只需对其取逆即可,无需任何新字段。 +2. **只在显示层取逆,不改内部数据。** `run_ids`/`done_ids` 仍按 `_order` 正序过滤;`reversed()` 只作用于传给 `set_layers` 的 widget 列表。已完成栏限量窗口 `done_ids[-LAYER_LIMIT:]` 的成员不变(仍是「最近启动的 30 个」),仅窗口内显示顺序反转,提示语文义保持。 +3. **完成时间从不参与排序。** `on_finished` 对已知层只改状态集合(`_running`→`_done`),绝不移动 `_order` 位置;仅当层完全未知(先收到 finished 事件)才以首次感知时间追加——这是唯一的信息可用时刻。因此「先启动后完成」的任务永远压在「后启动先完成」的任务之下,与结束先后无关(P11.10/P11.13 断言)。 +4. **状态保持靠「同一对象」。** `set_layers` 逻辑未动:`takeAt → setParent(None) → addWidget → show`,操作的是同一批 `BashLayer` 实例。展开/折叠(`expanded` + `body` 显隐)、实时缓冲(`_live`)、代码框滚动值(`out_box`/`arg_box` 子控件属性)、两栏 section 滚动位置(`QScrollArea` 自身属性,子层重排不触碰)全部天然保持,测试逐项断言(P11.4–P11.8、P11.13b–d)。 + +## 验证(全部显式 timeout) + +| 套件 | 结果 | 预算 | +|---|---|---| +| `tests/smoke_bash_panel.py`(含新增 P11 节) | **ALL PASS(140 项断言)EXIT=0** | 240s | +| `tests/test_bash_stream.py` | **30/30 ALL PASS EXIT=0** | 180s | +| 回归 `tests/smoke_offscreen.py` | ALL PASS 8/8 EXIT=0 | 240s | +| 回归 `tests/run_tests.py` | 41 passed / 0 failed EXIT=0 | 300s | +| 回归 `test_main_window_event_filter` / `test_config_isolation` / `test_wv2_guard` | 均 ALL PASS EXIT=0 | 各 120s | + +新增断言要点(对应 backlog「完成证据」三条): +- **≥3 项任务以不同启动/完成顺序**:s1/s2/s3/s4/s6 + t0 + t1..t31 共 36 项已完成、交错完成(s2 先完成仍居顶、s3 最后完成插入启动位而非顶格),两栏均断言启动降序(P11.1/P11.2/P11.9–P11.13); +- **完成中间任务前后状态保持**:对象 identity(`is`)、展开态、实时输出文本、代码框水平滚动值(先强制非 0)、section 垂直滚动值(用 20 行内容撑出真实滚动范围后设 30)在重排后逐项相等(P11.3–P11.8、P11.13b–d); +- **DB 重建与实时一致**:切换会话后 3 条时间线条目按 `db2,db1,db0` 显示(消息链+时间线序的逆),`layer_ids()` 原始正序不变(P11.19/P11.20)。 + +## 测试中发现并处理的问题 + +1. **Qt 布局 flush 会重置代码框水平滚动(测试时序伪影,非产品 bug)**:展开层与 `setValue` 同 tick 执行时,`out_box` 的终宽布局尚未 flush,随后任何布局事件(如新任务触发的 `set_layers`)应用挂起 resize 会把水平滚动清零。探针矩阵(N1×N2 settle 圈数)证实:`setValue` 前至少一次事件循环(N2≥1)则滚动稳定保持。真实用户不可能在未渲染的框上滚动,故测试在设滚动值前补 `settle(120)` 并在注释中记录该伪影。 +2. **`smoke_bash_panel.py` 解释器退出挂起**:末行 `sys.exit(0)` 后 QtWebEngine 渲染/GPU 子进程(offscreen)不回收,进程挂到 timeout 124;此前跑该文件若经管道只看输出会误判通过。改为仓库 offscreen harness 惯例 `os._exit(code)`(stdout 已 flush、临时文件已清理),EXIT=0 即时返回。 +3. **`layer_ids()` 口径**:原返回启动正序;改为 running/done 返回真实显示顺序(便于测试直接断言所见即所得),"all" 保持原始正序。既有断言(单元素/`set()`/`len`)全部不受影响,140 项一次通过。 + +## 未验证项 + +无平台相关项(纯 UI 排序逻辑,offscreen 已全量覆盖)。 diff --git a/docs/agent-handoff/evidence/P2-02.md b/docs/agent-handoff/evidence/P2-02.md new file mode 100644 index 0000000..8639496 --- /dev/null +++ b/docs/agent-handoff/evidence/P2-02.md @@ -0,0 +1,48 @@ +# P2-02 证据:右侧 Bash 面板滚动条与横纵交汇角 + +完成日期:2026-07-21(无人值守轮次) +结论:**完成**。右侧任务面板的代码框(`#bl_code`)与两栏 section 滚动区(`#bl_scroll`)滚动条统一为 8px、无箭头、handle 可见且 hover;横纵交汇角用 `QPlainTextEdit::corner` 子控件染成代码框背景 `#fbfcfe`,原生亮色 corner 方块消除。所有选择器均限定在 `#bl_code`/`#bl_scroll`,未添加任何无作用域的 `QScrollBar`/`QAbstractScrollArea` 规则。 + +## 交付物 + +| 文件 | 改动 | +|---|---| +| `ui/views/main_window.py` | 主窗口全局 QSS 中 `#bl_code` 规则后插入一段**完全限定作用域**的滚动条 + corner 规则(`QPlainTextEdit#bl_code QScrollBar:*`、`QPlainTextEdit#bl_code::corner`、`QScrollArea#bl_scroll QScrollBar:*`、`QScrollArea#bl_scroll::corner`);`#bl_code` 原有背景/边框/圆角/文本样式一字未动 | +| `tests/diag_panel_scrollbar.py` | 新建:离屏测量 + 断言 + 局部截图(面板全貌、代码框 render 图、角落 4x 放大) | + +截图(`docs/agent-handoff/evidence/`):`p2-02-panel.png`、`p2-02-outbox-render.png`、`p2-02-codebox-corner-4x.png`。 + +## 关键设计决策 + +1. **作用域 = objectName 限定,零全局规则。** 主窗口全局 QSS 此前没有任何 `QScrollBar` 规则(各弹窗/附件区各自 `setStyleSheet`),右侧面板因此落到原生 Windows 滚动条(带箭头、17px、亮色 corner 方块)。新增规则全部写成 `QPlainTextEdit#bl_code …` / `QScrollArea#bl_scroll …` 形式,只可能匹配右面板内的对象名,结构上不可能泄漏到其他控件。 +2. **corner 用 `QAbstractScrollArea::corner` 子控件语法**(`QPlainTextEdit#bl_code::corner { background-color: #fbfcfe; }`)——Qt 文档支持的子控件,与代码框背景同色,即 backlog「corner 与代码框背景一致」;未使用不存在的 `QScrollBar::corner`。section 滚动区 `::corner` 置透明(其横向滚动条恒关,corner 本不显示,属保险)。 +3. **口径与仓库既有风格一致**:8px 厚、`add-line/sub-line` 置 0 隐藏箭头、`#d0d0d0` handle + `#a0a0a0` hover、圆角 4px——与 `modern_scrollbar_qss` 及附件预览区风格同源,只是作用域不同。 + +## 验证(全部显式 timeout) + +| 套件 | 结果 | 预算 | +|---|---|---| +| `tests/diag_panel_scrollbar.py`(新) | **18 项 ALL PASS EXIT=0** | 180s | +| `tests/smoke_bash_panel.py` | **140 项 ALL PASS EXIT=0** | 240s | +| 回归 `tests/smoke_offscreen.py` | ALL PASS 8/8 EXIT=0 | 240s | +| 回归 `tests/run_tests.py` | 41/41 EXIT=0 | 300s | +| 回归 `smoke_timeline` / `smoke_midswitch` / `test_main_window_event_filter` | 11/11、7/7、ALL PASS,均 EXIT=0 | 各 ≤300s | + +诊断脚本断言要点(对应 backlog「完成证据」): +- **厚度**:代码框横/纵滚动条实际几何 = 8px 且 `sizeHint` = 8px(S1/S1b/S2/S2b);section 竖滚动条实际 = 8px(S3); +- **箭头 extent**:`subControlRect(CC_ScrollBar, SC_ScrollBarSubLine)` 在样式代理下 = 0(S4 三项)——即箭头子控件零尺寸; +- **corner**:代码框 `render()` 图中,右下角 8×8 交汇块渲染出 `#fbfcfe`(9 px)、无 `(255,255,255)` 亮白像素(S5c/S5d); +- **无泄漏**:未命名 `QPlainTextEdit` 横滚动条仍为原生口径(14px,S6);附件预览滚动条保持自身 6px `sizeHint`(S7); +- 截图三张落盘 evidence 目录,含角落 4x 放大图。 + +Windows 真机截图(backlog「完成证据」第二条):**已完成(2026-09-17,Windows 11 真桌面,非 offscreen)**:`diag_panel_scrollbar.py` 直接运行 → EXIT=0、ALL PASS;实测代码框 H=8px V=8px、section V=8px、corner #fbfcfe 9 像素(与 offscreen 测量一致);三张截图已用真机渲染覆盖:`p2-02-panel.png`、`p2-02-outbox-render.png`、`p2-02-codebox-corner-4x.png`(07:20 时间戳)。运行期间生产 app 以 WebView2 在前台,diag 实例经 instance-lock 守卫自动回落 QtWebEngine,未误杀对方 WebView2 进程(T0 守卫真机验证)。Linux 真机截图仍待对应环境。 + +## 测试中发现的问题与教训 + +1. **offscreen 下 `widget.grab()` 对 `QPlainTextEdit` 的文档区不填充(黑图)**:`out_box.grab()` 整块 (0,0,0),但 `panel.grab()` 正常。改用 `ob.render(painter)`(渲染到透明 QPixmap)后:文本色 `#243043`、边框 `#e6eaf2`、handle `#d0d0d0`、corner `#fbfcfe` 全部出现——**样式子控件在 offscreen 下正常渲染,只有文档区背景填充缺失**(离屏渲染怪癖,非产品 bug)。像素断言一律走 `render()`,且必须先做健全性检查(文本色/handle 色像素计数 > 0)防黑图假通过。 +2. **PyQt6 API 坑(三连)**: + - `Qt.Vertical`/`Qt.Horizontal` 短名已移除 → `Qt.Orientation.*`; + - `QStyleOptionSlider(widget)` 构造器未绑定(只收无参/拷贝)→ 用 `QStyleOptionSlider()`; + - `subControlRect` 参数序是 `(ComplexControl, QStyleOption, SubControl, widget)`,且滚动条箭头子控件在 PyQt6 枚举里叫 `SC_ScrollBarSubLine`/`SC_ScrollBarAddLine`(不是 C++ 文档里的 `SC_DownArrowButton`);`CC_ScrollBar` 属于 `QStyle.ComplexControl` 而非 `ControlElement`。 + - 裸控件(无样式表祖先)的 `style()` 是基础风格且空 option 下 `subControlRect` 返回 0 矩形——「原生参照」只能靠 `sizeHint`/实际几何(如原生横条 14px)对照,不能靠 subControlRect。 +3. **测试数据**:`out_box` 要同时出横纵滚动条,必须「超宽单行(NoWrap 触发横条)+ 足够行数(触发纵条)」,只给长单行时纵条不可见。 diff --git a/docs/agent-handoff/evidence/P2-03.md b/docs/agent-handoff/evidence/P2-03.md new file mode 100644 index 0000000..b6d4a8c --- /dev/null +++ b/docs/agent-handoff/evidence/P2-03.md @@ -0,0 +1,95 @@ +# P2-03 证据:WebView2 原生窗口遮挡层(重命名遮罩) + +**任务**:修复 RenameOverlay 被 WebView2 原生子窗口压住的确定性缺陷,审计同类遮罩,只修可确认的原生窗口遮挡。 +**结论**:`RenameOverlay` 已重写为独立顶层透明 Tool 窗(与 `AttachmentPreviewOverlay` 同一验证过的模式);审计确认它是**唯一**受影响的遮罩,其余全部本就是顶层窗口,未改动。自动化目标测试全绿。 + +## 根因(源码级) + +- `core/webview2.py`(L10-11 注释 + 子窗口发现实现):WebView2 的 `Chrome_WidgetWin_*` 是**主窗口 HWND 的原生子 HWND**(EnumChildWindows 轮询发现,SetBoundsAndZoomFactor 定位)。 +- Windows 上原生子 HWND 永远绘制在其父 HWND 内所有 Qt 渲染内容**之上**(Qt 绘入主窗口 backing store,原生子窗在 z 序更高)。 +- 旧 `RenameOverlay` 是 `bg_widget` 的**子控件**(`QWidget(parent=bg_widget)` + `setGeometry(parent.rect())`):遮罩与卡片都是主窗口内的 Qt 绘制 → 在聊天区(WebView2 所在区域)内被原生 webview 窗盖住:遮罩不暗、卡片被压。 +- 唯一可盖住它的结构:独立顶层窗口(独立 HWND)+ 逐像素 alpha(`WA_TranslucentBackground`)。`AttachmentPreviewOverlay` 早已按此模式修复(其 docstring 明文记录同一缺陷),`RenameOverlay` 是遗留的旧模式。 + +## 修改(ui/views/main_window.py,仅 RenameOverlay 类,L1363 起整类替换) + +| 项 | 旧 | 新 | +|---|---|---| +| 窗口类型 | `bg_widget` 子控件 | 顶层 `FramelessWindowHint \| Tool`(独立 HWND,拥有者=主窗口,Windows 上默认浮于拥有者之上,不入任务栏) | +| 透明 | 无(fillRect 半透明灰) | `WA_TranslucentBackground` + paintEvent 半透明灰(逐像素 alpha) | +| 覆盖范围 | `parent.rect()`(客户区内嵌) | **主窗口客户区**:`mapToGlobal(main.rect().topLeft())` + `main.rect().size()` —— 不含系统标题栏/边框,标题栏与窗口控制保持可操作 | +| 跟随 | `resizeEvent`(子控件自动跟随) | eventFilter 挂主窗口:`Move` → move;`Resize` / `WindowStateChange`(最大化/还原;DPI 变化时 Qt 对主窗合成 move+resize,同路跟随)→ 客户区几何重同步 + 卡片重居中;`Close`/`Hide` → 关闭遮罩 | +| 入场动画 | QGraphicsOpacityEffect(顶层窗不可靠) | windowOpacity 属性动画 150ms(同附件预览层) | +| 行为 | 点空白/✕/取消 关闭、输入全选、Enter 提交 | 全部保留,**新增 Esc 关闭**(keyPressEvent);`confirm()` 空标题不 emit | +| 释放 | `deleteLater` | `close_overlay()`:`removeEventFilter(main)` + `main.activateWindow()/raise_()`(焦点回主窗)+ `deleteLater`;`WA_DeleteOnClose`;`_closed` 幂等防重入 | +| 卡片拖拽 | 有(限父窗内) | 保留(限客户区内) | + +`_rename_session` 调用点未改(仍 `RenameOverlay(current_title, self.bg_widget)`;`parent.window()` 取主窗口)。无新增辅助函数(几何同步逻辑与附件预览层各 10 行,不构成"真实重复",未抽公共函数)。 + +## 同类遮罩审计(只修可复现者) + +| 遮罩/弹窗 | 位置 | 窗口类型 | 结论 | +|---|---|---|---| +| `AttachmentPreviewOverlay` | L53 | 顶层 Tool + `WA_TranslucentBackground` + eventFilter 跟随(frameGeometry) | **不受影响**(已是正确模式,本次修复的参照) | +| `SettingsWindow` | L424 | 顶层 `FramelessWindowHint`(独立窗,内部虚化遮罩是其子控件) | **不受影响**(独立 HWND,天然在 webview 之上) | +| `SessionContextPopup` | L1267 | `Popup \| FramelessWindowHint` | **不受影响**(Popup 为独立顶层原生窗) | +| `ModelSelectPopup` | L1624 | `Popup \| FramelessWindowHint`(L1649) | **不受影响** | +| `SessionModePopup` | L2245 | `Popup \| FramelessWindowHint`(L2260) | **不受影响** | +| `PdfModePopup` | L2368 | `Popup \| FramelessWindowHint`(L2392) | **不受影响** | +| `RenameOverlay` | L1363 | ~~bg_widget 子控件~~ → 顶层 Tool + 透明 | **受影响,已修复**(唯一) | + +未把普通 popup/dialog 重写成统一框架(硬约束)。 + +## 自动化验证(本机 Windows 11 10.0.26200 x64,`.venv` CPython 3.10.21) + +新建 `tests/diag_rename_overlay.py`(隔离临时 DB,offscreen,34 项断言,EXIT=0): + +``` +RESULT: 34/34 -> ALL PASS + R0 遮罩创建且为顶层窗口 + R1 结构:isWindow / window() is self(非内嵌子控件)/ Tool / Frameless / + WA_TranslucentBackground / WA_DeleteOnClose / 主窗口未设透明 + R2 几何:覆盖客户区左上角与尺寸(±2px)/ 卡片居中 / 输入框初始全选 / 预填旧标题 + R3 跟随:主窗 move(+150,+80)→精确跟随 / resize(1200x700)→尺寸同步+卡片重居中 / + WindowStateChange 分支(最大化/还原同路)不崩溃且几何仍正确 + R4 行为:Enter 提交→DB+侧栏标题更新 / 空标题 confirm 不改标题 / + Esc 关闭 / 点空白关闭 / ✕ 关闭 / 取消关闭 / 非确认关闭不改标题 + R5 释放:顶层窗口消失、无残留 rename_form、主窗口存活可用 + R6 焦点回主窗(offscreen 软检查,INFO 记录) +``` + +目标测试 + 回归(均 EXIT=0): + +| 套件 | 结果 | +|---|---| +| `tests/diag_rename_overlay.py` | 34/34 ALL PASS | +| `tests/smoke_offscreen.py`(QtWebEngine 路径) | 8/8 ALL PASS | +| `tests/smoke_copy_session.py`(侧栏/Popup 链路) | ALL PASS | +| `tests/smoke_bash_panel.py` | 140 项 ALL PASS | +| `tests/run_tests.py` | 41 passed, 0 failed | + +## 真机 WebView2 验收(用户走查步骤) + +真机 WebView2 自动化被有意放弃:`core/webview2.py` 的 `get_environment()` 含 `taskkill /F /IM msedgewebview2.exe`(会杀掉用户其他 WebView2 应用进程)且 SDK 怪癖要求默认共享 profile(无法重定向到临时目录)——无人值守自动化运行该路径风险不可接受。 + +**【2026-09-17 更新】本机 WebView2 加载阻塞已解除**(`core/webview2.py` 加 byte[] 回落,见 evidence/P1-03.md):主程序现已能在本机以真实 WebView2 启动(Runtime 153.0.4234.32、controller ready、index.html NavigationCompleted、stderr 无错)。下表人工清单现可在本机真实 WebView2 模式下执行。 + +机制保证(与生产已验证的 AttachmentPreviewOverlay 完全同构):新遮罩是**独立顶层 HWND**(WS_EX_TOOLWINDOW + 拥有者=主窗口);Windows z 序规则下,拥有者窗口之上的顶层窗永远绘制在拥有者的原生子 HWND(WebView2 `Chrome_WidgetWin_*`)之上,与 offscreen 平台无关。 + +人工验收清单(Windows 桌面,真实 WebView2 模式运行主程序后): +1. 会话右键 → 重命名:遮罩盖住**整个客户区**(含聊天区 webview,webview 变暗),标题栏(含最小化/最大化/关闭)仍可点。 +2. 拖主窗口 / 拉边框缩放 / 最大化 / 还原:遮罩与卡片全程贴合客户区、卡片保持居中。 +3. 多显示器间拖主窗 / 改缩放比后重开遮罩:几何正确(mapToGlobal 路径)。 +4. Esc / 点空白 / ✕ / 取消 → 遮罩消失、焦点回主窗、侧栏可继续操作;Enter 或确定 → 标题更新。 +5. 连续开/关 5 次:无残留遮罩、无卡顿、任务栏无新增图标。 + +## 教训(跨压缩持久) + +- 【P2-03 发现】**offscreen/无真实事件循环时 `processEvents()` 不处理 `DeferredDelete`**:`deleteLater()` 的控件必须显式 `QCoreApplication.sendPostedEvents(None, QEvent.Type.DeferredDelete)` 才会真正删除(探针证实:仅 processEvents 循环后对象仍 alive)。生产事件循环常驻不受影响,但所有 offscreen 测试的"已删除"断言前必须冲刷 DeferredDelete。 +- 【P2-03 教训】PyQt6 `setGeometry` 无 `(QPoint, QSize)` 重载 → 构造 `QRect(tl, size)`;`QTest.mouseClick(widget, button, modifier, pos)` 第 3 参是 **modifier**(易误当 pos)。 +- 【P2-03 发现】`core/webview2.py` `get_environment()` 含 `taskkill /F /IM msedgewebview2.exe` + 共享默认 profile 不可重定向 → 无人值守自动化不得走真实 WebView2 启动路径;真机验收走人工清单。 +- 【P2-03 结构判据】"顶层窗可带 owner parent":`setWindowFlags(Tool|Frameless)` 后 `parentWidget()` 仍可非 None(owner 关系),判据是 `isWindow()` / `window() is self`,不是 `parentWidget() is None`。 + +## 修改文件 + +- `ui/views/main_window.py`(仅 `RenameOverlay` 类整类替换,~170 行;调用点未改) +- `tests/diag_rename_overlay.py`(新,34 项断言) diff --git a/docs/agent-handoff/evidence/P2-04.md b/docs/agent-handoff/evidence/P2-04.md new file mode 100644 index 0000000..81e7c02 --- /dev/null +++ b/docs/agent-handoff/evidence/P2-04.md @@ -0,0 +1,104 @@ +# P2-04 证据:跨平台聚合测试入口 + +状态:COMPLETE +日期:2026-07-17(本机执行时间) +平台:Windows 11 10.0.26200 x64(主)+ WSL Ubuntu-22.04 / CPython 3.12.3(Linux 路径验证) + +## 交付物 + +- `tests/run_all.py`(新增,唯一新文件):跨平台聚合测试入口。 + - `python tests/run_all.py --group logic|offscreen|all`(默认 all) + - `--list` 只列条目;`--only ` 跑子集(调试);`--keep-logs` 保留全部子日志(默认只留失败/超时)。 + - 设计:每个子测试 = 独立子进程 + 独立临时目录(`haocode_RUN_`/`haocode_CONF_`,POSIX 走 TMPDIR、Windows 走 TEMP)+ 显式秒级 timeout(`subprocess.run(timeout=...)`);offscreen 组子进程注入 `QT_QPA_PLATFORM=offscreen`、`HAOCODE_RENDER=software`、`QTWEBENGINE_CHROMIUM_FLAGS=--disable-gpu`(均 setdefault,不覆盖外层)。 + - 退出码语义:任一 FAIL/TIMEOUT → 退出码 1(并打印"失败命令"清单);SKIP 不影响退出码。 + - SKIP 双闸门:①依赖探测(`importlib.util.find_spec`:node/openai/PyMuPDF/PyQt6,缺失即 SKIP 并给理由);②平台令牌(`platform:win32` 等,平台不适用即 SKIP 并给理由)。 + - 聚合鲁棒性:子进程崩溃/超时只记 FAIL/TIMEOUT,不中断后续;输出统一 UTF-8(`errors=replace`,Windows cp936/cp1252 宿主安全);WSL 时钟回拨保护(耗时 clamp ≥0)。 + - 不要求 pytest / npm / 网络;聚合器自身零第三方依赖。 + +## 默认聚合范围(25 条)与排除项 + +- logic 12 条:run_tests.py(agent core 41)、test_tool_params、test_bash_stream、test_copy_session、test_compaction_persist、test_file_attach、test_cross_platform_shell、test_global_hotkey_platforms、test_wv2_guard、test_pdf_reader、test_math_extract.js、test_render_window.js。 +- offscreen 13 条:smoke_offscreen、smoke_mode、smoke_copy_session、smoke_bash_panel、smoke_timeline、smoke_midswitch、test_main_window_event_filter、test_config_isolation、test_error_persist、test_think_code_neutral、test_debug_window、test_renderer_matrix、test_screen_capture_platforms。 +- 默认排除(有注释理由,不进默认聚合): + - `diag_*`(rename_overlay / panel_scrollbar / render_scale):人工/像素诊断,需真机或交互。 + - `verify_*`:人工验证脚本。 + - `tune_model_popup.py`:调参实验。 + - `smoke_offscreen.py` 之外的旧式 real-DB 冒烟(引用真实 `data/haocode.db`,未接临时库)。 + - `diag_live_agent.py`、`probe_agent_loop.py`:需真实 API 凭据。 + - `_probe_*`、`_test_env.py`:探针/工具模块(被其他测试 import,非独立用例)。 + - `run_all.py` 自身:聚合器不入聚合。 + +## 汇总结果(硬约束要求:Windows/Linux 各一份) + +### Windows 11 / CPython 3.10.21(.venv,PyQt6+openai+PyMuPDF 齐全) + +| 组 | 结果 | 耗时 | +|---|---|---| +| `--group logic` | **PASS 12 / FAIL 0 / SKIP 0**(EXIT=0) | 43.9s | +| `--group offscreen` | **PASS 13 / FAIL 0 / SKIP 0**(EXIT=0) | 81.9s | +| `--group all` | 25/25 PASS(EXIT=0,两组顺序执行) | ~126s | + +- 日志样例:`D:/tmp/runall_win_logic2.log`、`D:/tmp/runall_win_offscreen.log`。 +- offscreen 明细:smoke_offscreen 8.3s、smoke_bash_panel 30.3s、smoke_midswitch 8.7s、test_think_code_neutral 9.3s 等 13 条全 PASS。 + +### WSL Ubuntu-22.04 / CPython 3.12.3(系统 python3,无 PyQt6/openai/PyMuPDF,离线环境) + +| 组 | 结果 | 耗时 | +|---|---|---| +| `--group all` | **PASS 4 / FAIL 0 / SKIP 21**(EXIT=0) | 0.9s | + +- PASS 4 = test_copy_session、test_file_attach、test_math_extract.js、test_render_window.js(纯 stdlib/node)。 +- SKIP 21 全部带明确理由:无 openai(5,禁止联网安装)、无 PyQt6(14,offscreen 组整体)、无 PyMuPDF(1)、平台不适用 win32-only(1,test_wv2_guard:msvcrt 单实例互斥是 WebView2 守卫的 Windows 专属机制,Linux 无 WebView2 链路)、无 PyQt6 的 GUI 逻辑(1,test_global_hotkey_platforms 含 QShortcut 构造)。 +- 证明:聚合器在 Linux/3.12 上可运行、隔离约定在 POSIX(TMPDIR)成立、诚实 SKIP 不伪装通过、JS 条目跨平台运行。 +- 注:WSL 无 .venv 且离线,依赖型条目按硬约束 SKIP;在按 VERIFICATION 矩阵备齐依赖的 Linux 真机上同命令即可执行全部条目(offscreen 组仍需真实 Linux 桌面环境完成 P1-03/P1-04 的平台验证,状态不变)。 + +## 故意失败夹具演示(硬约束:崩溃/超时不阻断汇总、退出码反映失败) + +- 临时夹具(用后即删,未提交): + - 崩溃夹具(`raise RuntimeError`)→ 聚合器记 **FAIL** 并继续跑后续健康测试。 + - 超时夹具(`time.sleep(60)` + budget 5s)→ 聚合器记 **TIMEOUT** 并继续。 +- 演示运行:`总计 3: PASS 1 FAIL 1 TIMEOUT 1`,退出码 **1**,完整汇总 + 失败命令清单正常打印。 +- 演示日志:`D:/tmp/runall_fixture_demo.log`;夹具文件已删除,仓库无残留(已 rg 复核)。 + +## 等价性(硬约束:单文件命令仍可直接运行,输出与聚合子进程一致) + +- `test_copy_session.py`: + - 独立运行:`===== 54/54 PASS ===== / ALL PASS` + - 聚合子进程(保留子日志 tail):`===== 54/54 PASS ===== / ALL PASS` —— 逐字一致。 +- 其余条目同理(聚合即 `subprocess.run([sys.executable, ...原命令...])`,命令形态未变)。 + +## 聚合入口暴露并修复的两个真实缺陷 + +1. **`tests/test_compaction_persist.py` T9 陈旧断言**(跨平台共同项,Windows 上 FAIL): + - 断言用 `assertIn('msg["role"] not in', src)` 硬编码变量名,而 `ui/views/main_window.py` 现行代码用 `m["role"] not in`(P1-01/P2-01 期间变量名演化,测试未跟进)。 + - 修复:改为变量名无关的语义断言(同时接受 `msg["role"] not in` / `m["role"] not in` 两种等价写法,检查"摘要标记行被过滤"这一语义本身)。 + - 验证:单跑 41/41 PASS;聚合 logic 组 12/12 PASS。 +2. **`core/agent/compaction.py` dataclass 不可哈希默认值(Python 3.11+ 崩溃,真跨平台 bug)**: + - `CompactionPreparation.settings: CompactionSettings = DEFAULT_COMPACTION_SETTINGS`:默认值是 eq-dataclass 实例(`__hash__=None`)。Python ≤3.10 的 dataclass 只拒 list/dict/set 默认值 → 合法;Python 3.11+ 追加"不可哈希默认值"检查 → **import 即 ValueError**。 + - 影响面:Ubuntu 24.04 自带 CPython 3.12(VERIFICATION 矩阵明确支持的 Linux 目标)—— 任何 import `core.agent` 的模块/测试在 3.11+ 全灭。由聚合入口在 WSL/3.12 上首次系统性暴露。 + - 修复(1 行,语义完全等价):`settings: CompactionSettings = field(default_factory=lambda: DEFAULT_COMPACTION_SETTINGS)` —— 仍返回同一共享默认实例,3.10 行为不变。 + - 验证:3.10 本地 `test_compaction_persist` 41/41 + `run_tests` 41/41 无回归;WSL/3.12 上 `core.agent` 链 import 通过(3 个 openai 依赖条目越过 compaction 后才在 openai 处 SKIP,证明 3.12 兼容)。 + +## 注册表元数据修正(诚实 SKIP 的前提) + +- `test_tool_params.py` / `test_bash_stream.py` / `test_cross_platform_shell.py`:补 `openai` 依赖(均 import `core.agent.tools` → 顶层 `from openai import OpenAI`)。 +- `test_global_hotkey_platforms.py`:补 `pyqt6` 依赖(含 QShortcut/overlay 构造)。 +- `test_wv2_guard.py`:标 `platform:win32`(T4 msvcrt 跨进程互斥为 Windows 专属;非 win32 上 `acquire_instance_lock()` 按设计返回 None)。 + +## 边界遵守 + +- 未动任何独立测试命令与既有入口(`run_tests.py` 原样保留)。 +- 未要求 pytest/npm/网络;聚合器零第三方依赖。 +- 默认聚合未启动任何真实 API / 人工诊断 / 真实桌面 / 凭据脚本(见排除清单)。 +- 未读取真实配置(`data/config.json` 零访问);未删除用户运行数据;夹具用后即删。 +- 产品代码改动仅 2 处且均为聚合暴露的缺陷修复:`tests/test_compaction_persist.py`(测试断言更新)+ `core/agent/compaction.py`(1 行 3.11+ 兼容)。 + +## 复现命令 + +```text +python tests/run_all.py --list +python tests/run_all.py --group logic +python tests/run_all.py --group offscreen +python tests/run_all.py --group all +python tests/run_all.py --only test_copy_session --keep-logs +``` diff --git a/docs/agent-handoff/evidence/p2-02-codebox-corner-4x.png b/docs/agent-handoff/evidence/p2-02-codebox-corner-4x.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf9ce4446713b6e42c5f005068bd2e8b7e0f6c4 GIT binary patch literal 1875 zcmd5-drXs86t99#MZsw{Up(eCYX%!MlQ%7$f>S329U{+Ch|0H3u~L+-)P5a01cYfE zS$qIRjfzkxj|vP*DTshlpN`#b06 z90@(JVcqt1Fc@sZp@YFc%*CmBTeEu32S$wlF&EaJI~bh`gV{fuw-tZ7+3$eCK3a7s zc<-@a3YB6^_HMwb^KBX9n(8yx!`aWCk3LCp@IP5|^*7tkPs00hxAX-gzr6a-n4KT# zTzBi`)-lYD?BTB;!#$e!XWz|cB%KV+C|rL{v07NQH|h7%vbf?B|Cd#_Z%S}Hd8&~( zfW+SPXlG)vL*6Zz({gDfI=V+$&Z;Z~I?4VmiJK6%n-R7J9!A@Q+wR!L^MD^uuEB@d z>&F5QBO~px1E}~Og+k%MhM1@Cr107CJ<48DL=U57W5@!^vD&pQDT5M8V0aHjYNZgK zkK2IH`Uzu=Dixu*5A_xuZ&5qRE^-CdhlSXTowt5nfI7qPsG*rkn0~ca*A(8Lj-MtK zH{57fH7T6}WKF5Em|A$+sw)XA7ocq^^fZcxE()A|yV~E?Kq27W%1#qWjat6CSpR=s zU=pDmB6tGQ-+JjW-mo95npADbO)*8G?4=&^G;iZ^KcaGS7o22f?BK-rn0qY`{6Rig z=7=*5;jPCit-~eskpe9X(tBTza6x;b55`!NPZ)CuV1*O)s0$i=7(-PM(G`3&hlIZ{ zi?E!j)Zo09(IjZ=zJoiSiZ=b_$ciT3E7XZMhZfC3CFG~kUc_XhEM0FAPE4KE>Iot$ zZ(E(^4NaSqZWhWXpseD^&iaw?enUP=!{_q_U-fl#bYxi2HAQX%Wg6lVO`1pBI8p3x zJf)9E>qrkAOUR9-jAUw5kJ;BGG_)I7R=T#=TpEt67)>$(Y|CVU%vZdJF=)sotGXl0 zpw7e^Fjkp@6Q$SPi7awk(8atod@#oIP}fYnL;=wNG=7?025}+WY#SXiI0Qzx9F@8u z#rc&6gIyAaZRr)&%Z>27W!WQBKSJLRnMxduwY8NP%jlbUJ9iOxFqY$KHeW!`goW4( z84`Sl8Y7`T5C)kHaupSTbmk~!X+fR&gjbjZO;lO3xTHp48J%Y&Pnba0mQPiyXeOFw zQr|s6=4Fy&vmQ12@C}f`>1J(kQX++KuC+fuON;(ARbQW18UZAcomPl5 zp#eVVc^f|_-TkUzWe{S;JgP|bEMw7hW;+?{Lq`qIG_U}5^AQgE8qihE0@;Ji!Y7cF zQyonS^A7>3>?zT>S?vWjg4U;4$e5_0j@=_h;&pB9KdUC>p&sQ_FqKd_GfRJ==kUuB zkqK+QSU}oc;Pt-kyv)^Sw=YWkL-3kY#V|)EH(#&aWoe>1$=)of_oef#{LzLNrm>Hy z67_XL%F;cO9A4(Ux*#5riFD?+{Gd>msa*^eM9S*^Wb3813#jD=u84Z1R4Vt(@5#>( zauxtN6J*IajYy%GAJ&6uxoM2J9bDm3hR`NxBRL^z=Z8Sa`<-Ed$Pz0jFpq08#f~zy zh=J6lE`7g}i&-?g4L;RHH*xxN&{IL2>w#tOu-=DxkFINBwmNS;p1C;v=H_EpqSe}T zAbG1XmfPS2Xj`gWZP&NX;l9?UYQh}{LYHO8^CNp?7dw;HhHw2?|8)UEYSXp}qidoB zSZe(fCe>nvdimUSyq^g~VL)C$UUvmFGy>2^;ADx8EuYblDYSRJua0Z*b~o-$I2A%0 pLQ<|o1l08-+4cJG-Zh&K42jGVxRTS{=YC1pq5Yx3jC~20{sm}riQfPK literal 0 HcmV?d00001 diff --git a/docs/agent-handoff/evidence/p2-02-outbox-render.png b/docs/agent-handoff/evidence/p2-02-outbox-render.png new file mode 100644 index 0000000000000000000000000000000000000000..5b58460ebb7d1e4b98a57f47f7be159c664065d7 GIT binary patch literal 2420 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 ZG2LzhzxMVJSpT1TproN#pz!GB{{Uq*Mgjl; literal 0 HcmV?d00001 diff --git a/docs/agent-handoff/evidence/win_real_wv2_mainwindow.png b/docs/agent-handoff/evidence/win_real_wv2_mainwindow.png new file mode 100644 index 0000000000000000000000000000000000000000..04a77b6a99799009a49c59d16307a6786a1c70f6 GIT binary patch literal 29657 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 z z^6fL!X?diQ=y!Qx%?TJzew}X!kyx-J5i*44;-vONh)yNnvnal0&yiS>9L*EhQn*Lh ztbiGEil@7tA6ak$K2^W6{QUq%M^xy=TCYX^oH!C7C_VkwkBDr1LG|&$h|Kb|jLO^N z=z`F`bC#>LpI(AtQ4R6>08bfEcn8jTN4rpm!f2J_CH?5v=OK1p9K1Q^Fe*H2@G#b` zyeWk_VZ|3T_2K1aEZlf`~6xle!pVUsGL)rlN~%!7`{+%<0}PKfR8(=6z4keGuvZh z&%Zra?y4SqU0yOQ%C51VYPl+6M~H6083f^}QS}K7BQuH{>#aUEW9G{s4C32SP>`Y^ z+}J2|sD@1Ud;?M}y1al2+3i8%#H*AglVGRD*aYwKeONqWyZke3&!Rv>G z=b+H|@8%S*xot(ph8@~o0?SbwmA~btrwSV#cxAo_L)s$O-v3d zO|vDO7+c9#bNMB@&Sb62t8aDGl_693e41k7i@6lPujqLJNeFvQk93D9Nc>Ke&!k&o z=8KrQp%;0A;dq)_X-+^Df}o#IoBM4Vuc4OL6-)}`E->>TQ#>=GY?LpbDh1hc6o6k+ zFZ>2+$6HXflB=8r@W7+R*RND036vueoFTWB4%1Y&rGASLs+2}j8F*7kXHZl2p zhp9^c>&0-|<=ftc(jIztmofvR-gmCQ`4{Hyp4z3c*ikFaEJW}kDzuT=oT=L&3!%?s zFFp+)CexlWYLnC*?ssK~tH(lJ4%K4&%9XS|+^-ja#b-{t@yrj{iFXqC;bP1RovN;; z0Db$Q10kD}p0gPox=ExJP0qt+cqh??2n-B#j~wb5XyuNLPz?#k!A+)H!|FrWn~q(8 z`2_MefLP^RL7=ekNwRT+E-*vW)aG^wMc@!}fD$SqLD|qdg6LPj)cIeR1fXl~Toi`NdLaC7z5?j^;vY}=^EGn()`DScrTe+&0q z{V35I7i+iP%aL0!`v;qqBf-j(d22pK$Yew2SvDK~XN@n1x;npG*uPXficg6U0%h_@ zV1nn2!@{&lQEza5uY|8y|VL~!pV%Eyie?yki%cosn_S-;0^Q& zuh+pK0!pG5Qk#~J(~dM4D_Kp&F0EP?Mbk206Y{!EE@axFkOe?VoBw?_s}KA~Rmqc2 z2u`aRM~oDs{Ti62L<0B3(-0MyT>fFo0;dHBpakR<9;)Vi!65`Pb>i%>2^kfBKCB)c zS}t8Mas<_;X{6YDO0;!Hvebf4?DnSZ%eBRaJ;W62XNuM6^gKE*`D~pKiIAy&s zGQ1P~F8C0WrCPON7#O4@dKLEDgZra$Q86&p^iYSLA7D@lujR}p-Z?$!t(;uo^>&F- z?Z#N#g#UJyF5&$6fCH%o9slEov(+?!Y1;9}><;NB#kFj!);^wBM~nd*pLK z=geKXF4hg6^{?r_M@&tr-O?%kNaeRV$YtKxfK458#e*hpsloW{k6z?}Yg$^EL zz0`pJAdQC9`dQXuy4ck)WXz8b9quR&Uw&?}Gb%VZuvih11s2R>L2~&#cAWgPRogKd z>SyJrT{nB>FeTTBk?@asE#|>INOF;eXI2g>p{B0B{pXt9ABg}o!X+J4k~s9<*AtW7 zOxZKT8{^|i^PAK{_fTu%^Q1-)HIknK7DT9Y0pMo6;r2@FuHIDczfiS_&WGuA-rY1p zmNuGp{8Qi!({ABw=D{==QZbBd5OP+P81~7LhIi<#9RI8AOC`zI+}<83N%!M)_pE;_eE1fcjsW z3(O&L1Y{sLz5f=M4PHQ4ZP2?Us5xjTt|Ro0+YyqSmYPtwF;=8rOuIhzadrc_{cdU` zbego^JDCwihH>^ojKdk^Sf29(?_ZUUOXUYge!9!EMroe7V9_r7f;v_6ob0&~dV7e# zCbH&?>sz%e)7v$g3?+`+VK;$NxQs9;lF)qmY5zGMb2qrDjU^m?`UapCBVoOe1p+Hk zoBB^J*cRN+A&(}XN#{`TYFmjv8HQ!VxFFE$OaPriY~LUG!4m(~Km|65m^gbcC{4G% zO*u0^>!xrH72>XDIVtPs-g?!8}NR5w5fB{vmWy5!J%aDns zi!~4e8%pAEISYXSQ+T?Pn`pj7CDDOWggu-|g%rTuh)_btUOckSRxFHSbCZ_$E=j@l zfD9c>4381X-5ATU@(|Y<`PY1fCnNb|deBVq5LnKQh_K;SLs==6id})%(CyFPcQL&G zQm6QhvHms~Dcc9m<3iU{5UXu})jtj>l(pMC@n}Mh@@@M!{^wc91s)2V&H5i{;2##o zuP&KU(H-!BMDm#hhO-<($$&xdR7*E%kEgJO}Jk_RoIHHcIMxW5g&o6h5b-=0u zMdeocDp-rzS`bcaw3K~Vup3MF(7Vjl6SK7>2oEHdTwf(f#M8|hIHngHYjzH@@55PF zcuyZOIxYKV&zZXWaR}fpBv>^$8TXm%im)2W{pGr4%k~#Zeka_3X?4UH%$L#f)Dd#8 z((hInreD*Hce6h$Sb;3>L4M1&tfUpE) zs*yNZ&d{_4T_`NSd|?(Pjfuzwg&LCw6(eZxjd}z+TpiYdTKO4W?V3ZZhISUr?R!QQAz=~ z=OnFUhz6#;`z?ikV>`MV+#Eq0|6HpJF`7o)rge1w)n3MFUf@?{8K|r1Wbw%Q!nOvn z0gQ`mL{dG$=Hj0QR7FN6dip!&;Pg)Q_g9&dM>LJ5UMcNb!S%82Bd$)HxH2Cg;oYYnYiYma?FpE6%A;J`K8TWqrdD95 zFc?s5yw{DR>y`2Xpnuu=kfv9Is*3=?e_(=1`rE$!!v8{I(K)(%fIuB8Jrk?UQ6+x( z!*u~iMH!II17TlTh)d%mY*=(ROsY6(lRxifV*fFDY%%d`Q9RKcbWkeY+<;SFP-tG?&rFJolk@d&j*D(hT4UFZ-qg#PVzH;qXm6UBQUKN`#;7v z@m8Iw9R>LkWM}E}l9<~xgUb@E ze?qk_s{g-Tax+K{Cc5rPoYmLTB0LLs+4x9D!E|{&)RXk|(^ev%?-Jd>qU-1@xnbHx zF$Q=|B)wHQ-R@Xz%StC9#aYY`FrUlnfp9!%uBR# zfx1gy>4F*h?1*|HDSS=$eE>&l&qcZeW})M|x0>>t9_fs6KTL^ps)(A!`g$64@}w&) zMJ{?-{!wJ)x4!%e84ARo7c11gz~N%A(#GDP9+g{Rj#h+ZykcXfNkyK-81Ztt>=d51 z4mleh)#&dX9?fiOD;~Y(cgJY2c#0>Ce|IpjmIU+fgCA1wa1hvZ2!B=@0cRGw>h@QL zFc{PXf$~e}#IEl@W-_zE$Hwy>vJzo!@shG1rJJm(!kueVZDsOVi+kY!j`9-=F+B>v z(=mpzKky05L3*?L!6add=$(pEX6FfS=95Jixcg8D%#`%w=c`Ql3f#_eE3Vq8A>!6p z_A{qJlnzHT{Z6`-`HBG2h?Vk3IW8(uLzizHil)+8m{{Pwm$(s;l(BLKRMaQBQIh}2 zqphLz0OEG@p+t8~Te|S$5?N11+c(trcku%sFtYzNe&&2;hgtt{7;g+%zjbea$(~d# zAZ%V#6?T}D6LtQjda&kWt?1enwUeEq~qU-XK0C;6QOyx zXKdF^kT1bwo%}t?Q9#)V(5>a9(DW}#Llol;R;oVzd+}JCc*IHO+KZwq-ppM5!+8x< z!LaSr&FbiIn>B+F*iVyY%kSWPs(no`?an|Z=S@wx0&zj`ciEz|82hndu>$9TQ{txn zdMSk?k=R$=-Kl9ccK_<-gtD(}ybI{yJXL<#)gOl#f+PGt2GH{MyagzmM1`7YW1CnW z5}(}^M4t8CaCLSuii23Ho;|)EWU3zggjvPaLGI%j5mQsB<|NDP+?kQ`im@rJ&~Yw^ z|7^w>Fb^*%P|XB!pTJ|@fsene=t^cBN&bA>c+>>@*%h(Kw;mI6s$wX|_fU_5^1OY7 zDko$JDvlx=X)*XoiFBHF7V~GtoSA8%{dW5c#XD14j|gD9(Ak{mgMBlnmU}L9pr{YC zhfEI1KceVM?AjK;I5znA-a36hRj5C3sMlbF63_=sePA+%u51I*`$W6xO^hfDmP7JI z9-w?z%I#TZqGOXH4fXnCHgo&>#so=%$%iHiL#Q1-LiIYQi@AsNbhE0?x3)FUynvPB zZ2~&<(!B&k@}B$d@D8EwcoD_HJg+Toy`L6_DWATGg9zGjmRMmp$nLNRt{t)u(;r`V zR3T3`)y{!FUJEtL_Y>nufwG19uf&vtVN@n&6kPRm-Qdv!*ZPy!!fvmPVjajJ89`xT zl(9bvMIJk@X(vQ9$T3OEd#N>cj=87(@&tjnK_I)U;9m)QThm0vIVHT2Y!9ZnQa=!S z-$3qx$f=EOe;5+j@W0i)cQsPK7&|P-Z9M;Dw=#>0JuutdtMmu>|CEsbe?}=&Ss-#( z8yl+)B<#)fIBu)}y-nux=m{eZgoQ?(Sl2fLKq-7yxG8e$7Rs--sM~ zlUT`-amAWo*;^~|CHMo>Ix&bt_+oNk1hRZZnAhF*{ZQMpA1A7qa1#1_IZEMAH**7+ z;z));NhTO*&&10+?F+kfF?U<-&{L$3$n5wZochYVTCO2rAJe$ zZU4R_!0X4z|FQUoK=b;6UVk!&PzRVEt>eCFh9ERqG(=*tK*V_CjOKmiyd320$EKoU zxS~#-BU$K>G9b2L=?Z)jnv>RR2MvV*ld40I!;`;6Dh|Q}X3yx|h}jhPBqjKkLnPKA zDoPvSroc=Xm+ZjwSqU(Ix9^aKCe0|si(!X3|2yNN2S=9$ke8R2e1W$t!qm&>`FoO6 z?|&fmQ{2JvC+T6VOzGW+WBPH@q*NvGfgzGGPqw)OQ+g&iro;`LB##ZmZ$LkU2r9(+ z9;w4>~ycg#ZZ zL+`{x#TteQ(IhTMG^5=y~>wM z?)vKk>*pYBwFKhZ0JlFN*Q24ge|mb~rrQ*dMvo7!+g5P23aa#@&UKQvE>+o^^};!t z%CL!=s@~2y%%3MJhb_zpzR-S1E?{4D=3A}n&UyQe%&LVxy`T#Bovpa%YM^TfQbTe^mP5Qve&f?VzrTnm$e%H^5GS2G8}Y7-?!_qn<7# zNfsZC;7+hu7MpqxJJM)GrgtPlryP zX_v9FFnM>GO78K5{DkLJH`TR|F_^FAHg`i}AIO7E8Hx88BOcR-iGy?FRkO5lYe>tF z_&F4>uV<}gUAGS^5v=*);kV8&n=hXF^HLc)#X3(fbgVlzJCBRJ{!(fAWTT!_FkN;) z3>sD+!yicMH{~771mo7*RoWVx2Z`B!v5`_2m|5L|CU85fRGAFXdPfmMj9(QGM+XL& zYj0|@zmiB#r6CF_^=zjW#?7At=yui2 zhwbSPwi(D)+x7}S+*oX104ns}e_by{R z8vfZeBYOA^`)aGkMkaJ;Ow7d(l=Isfw~;%y)c{KL8-9E*n~Va*hNmoNr`UHMzg)bk zKj5fn{qRE%0BcankqV+XCXTI{6I*iL+g4kCTFtR9TT=krRc~Zg5PLN}u;lD_#a^I3 zB#_M>y%AaCwMQ+PIgqLnUpts%AMklFcu^u&K*G#nK0aGJ{-YY~!fhgnanUR+Q$^m+ z{M^o_?B^#p^}}ze`<`W2^KZi^;Sjah-8p*oC*9(wd5~P*p+D&G)TP5fo&5l72Mv|t zj%1-bhSH8p(c=K`yT&=yxqG+6m{Gc|v>q4M2C4azBrPr3(XYwsA<@J7=@H(H-kC(c zPXQ?K63g1#P@b{5&Wt z_%)8DR;&h#l`fAsTWVP0?Msk-57T|ow6ndwtlqxwR+b6dhP0B+9yn^C-gJNhL$1(tHq_#! z5WZ{u?->~SFcB;H@$)P$j5ZlCjoy5v!DyQ!JGPM|#igg{3bUrsv!pjNvEil^{zE_h zY}hc~=6=;e@<)&zbsP#jW)W;6%2pGqe(d@UAzI63Z!_xCOUT;BaA~dMx8EvG zAX^K~`=Ar?>M^(6K)&kgc=N=Mu?nkyy0htIo(Ins6Jo3z{+qPx9fAbND^MIhM>HXY z!)5(*Bc$Eu+M4IxA>LCv<58&vx;k~-v_30Mlut8?H}pPCG>y_S4{>sF`pyN|fecS; z6eTCt&nmnq3Ya^EwRat4n-lp**`H%o_U-MA zn>_O>sNB67KfRZU9jnDcOS@35Qz!@ ztiYA{rDO<^wKO;WlEW>8Ch()!+&JPMwihh0N_uuIL-H|gqyi+6`A)#qaa$y6Rq_~1 zWI(oZeKm8$`4`ThtF(XU^Rkc}0n z_HQ7J@_vBaXC2EBg*{FzTzH4xJJc!3e?3z2f=JQnZ{5F1QBi0=Az$JO_3W;o0{_K- z(+8vzwgSnNB8$2^=hf|^j`7mZhMr0`ZMA-7?_L{g>;}v0DD)tFAwN@J5pGw$GXzr% zA=c(W3vzHrl@my z)>sZ@J!Vc@LR;$JoHg9J-*rVZYuL*; z;67u9d$KKi*(a2EzEf%3=ky{3tOF$7S8N}Yvc`xvydtS9p+B_=q1_OxXVaM?-mmnC zFFZ_lichy9NI|K#qR8UTZvCtKJ&kXOcnjfzNcY(V>ma=w&x4Y$<2dO69Zi>gzkb}88gSKm<6A&s+1q`* zJjQ4PX|k)p7tNehbn>&*ER&9u#F@C5Z}X)=hTGZsgf4~?i+S(jHtYpvKMx`%c%5q( zl|!3tCoXSKRgdRCAg1S;vs5fXF^>LGMaAw?9B%H1iiwi2ff=bOc2;jWph5D z%X^~C0r|H>r<9{PUzUQ=5NFp2(G#-$c%rWjX#*xtkowctYeoO&v1mqHg8G2#U9{Zs zZsE$0eGO+gm*Kkj1)8BwMCoU7G>UFmROQ=(`^vng3qas)L~IxJM+uCOAuE&j1^YtG z#QJSLWP-duCZpoypt;!U#B5l0OmC!^N;^Bg&sAW#!H2#^9L&_XzI*v{zQr|>Rg>E>hM*&Q34Ws7&zJ%(Hf0)b?!>Y8C5^W*h7UiLFrlNC4uD8lcp z&l%R6lpT9npJIiI+i;c@a!R#h{$|Fo(a9@6}^JGQH zk+Ha0TF{`xH650**QwtT6^?V|WhSmGCUDez_u}n}T@QQv8Fuujv(4bFURs+-U>WqM z0iO?kWBUwiVoQ+dF<_X2|AA*Ll}E%d@gmORuE38ks%~9cqS~2hc}BFfP0VHxaNd{W z={;ZUxo`9_1OKg$TJC2Ed+H}b+x{kTukE(@>wU02|MzPm=VJ1KM?1l?meBO>h_1ofq^NbilCkDab51Ngh78g!R&}XHNCT1fVsWP*oV`WTiOLG zIBLzz<>pwG;KH!sf)bMqCTMh;#0LkQm7G>eyDP`S{-Z zZhsT%vBmu4_xI}`fvcMilhT`y8GjtzG*7zZb^y_zH{M)u+m9AA(u{fUTnP|Pv8pl! z<}XhQ5g)Q*H!~$bssVbW#JU89oEh7w-&uDMQ{PR*nwq{q&SBk`lev?J%pS9x9yG|^faO27WfV9VR3*L&V9z=?g}@r$R}vM>lzWXi#r5RaVm#B z2=tzcw$dm3;UJg~uYFw*?Cf=wbjN_8`J>?&EIxU;u|tjERppanDtT;5g^3o&xfEyBy- zhbvkvIbVw@?pXNLiN#s8JTJucf9!YBEI{%eAL=JezqH8r4HxN-FoZwt&adzD2NOsX z76}K>+$2OBe3Sm+#xwY$rddSnfG zU5eYEcGtyWW9AKw`K=@^NPfKZ_28|4`nXT{#ioF}N@Q5=&Vz9I?1p7!33oWTNowRM>^ zo?1bdu{@j0yT-SaJohE1f~X!UnOSAqQ?Za6`anoU2mB^6gPXL0QZ$OhZosS_(YhrW zC!Q|-An$tim_ZvtW3dbTuDYPP*9vVkKVg*{d+o>qM$NBwbk$I#W%`0y6Qr?+^Q~iK zz%G(nG4e1%M$sQl9|DThZ6(BiIT&pc{v-*V077^9Ec}~7K?SFwcL`s=x@kvG9|Ii! z$Hl7gz^5C#S5dDlb`=^~i9c%ui-Ue9*apzIe;)*HL9bU6=RQ;OwBXqsv^fcZr>6r3Dkh3D_N6LaIPgSdU zD7>df?i_QfXPLGsw}ru(5i=e}Q0^T0xso^)7INFSLPv-rm(kdNlW+^Wlxvj?+SOfG zG^kNr0g7F7{TyV>@S_U0H@_q<>W*XGIWq@=-7H~Bk5V1Oo4U!q?muZKjWr6dHlPIY+4WuD||^1CEWY5Es+@L#^)orv*%W3y1 zsr#@K?s|~fiH^;aTvQtO5Jau2z;2p<;W~ByaRW2PKz~&bc!1WCUXe4xa^#_0>*6DC z=Ma@C8-G_$Bm)v{x6oM!UGrt1{md6tqsdYdIb8vi)TWmk%LnZWEcs1?F01)?S|U*eMJ#1p9SCOFZgTr_#DqGtZYh zgExgQ%e&~oCLKszD(pvS-QE4fs(iOtG~M~6;>;YWG$KAP$EzKDOk7F#GH@tX zkH1G^7{+u_sdK!AU7m2EkcqP8nGwj)KJ8AvkX+-Z)5a=1K9MZMpWm6@+rUw738vy* z+-0k{^;9&}>iSj@OF!c@Cm?LK8_v5|BO2G8>Sw*$vrK{0PKAS~iY5^b`!Y^7Sl1;;KL3QAq z%jkk#`Lg-D`D}Y1Rq`{sQqMq)R1uef4+DL&Ss2cnu&GViwFw+kN@3|06^o1f64GUd z6Ps?YC!cB<4+e_w>D#87m;?dk!7Y;NI~xPH(4FX-`3dChw~Y>N(wGN7V=VZZk3P|+ zouZIjEQh4>bgbg0QJ>>&oII1AQ^j1`v(=4Vt6Vdl3G+n4y8*#bJK?J8jyAEz@zI`G(8^shd2M}}u z=LU#N0(gP$7=AM0E^^NK2wr|Jml&?s6q>NFv2_gLLTT~*YU5{zj@$bgHBj&Jr!SWN;h0-iw}CPu8xKz$pBLBmRyDmricl{@jI(y%}Z!T zVa(HkqJd-0^O;bRA5n&9(E#_mTjwpQ7Q4|Sxbdp&BDJ804O@x#UgjaWPlb<)ni(XJ zv3^B=kQQ}8zXEh90km^~`nlF+|HIYZJ1(rjd&qpCjnh&GVG|^+_l2^uC~t{L`)vJX zuU!XfetzB)r-cGkTXIG|C`p%pC8_S{$bEekGtod=#1Z|?FBFhJx3MYIsaHW}N?#-f z$m7nBGvojg85xsH+{f=TCh2jE@g_t+UIupp@_3-lfPQ4^4pX27Ezt~4f(i>Abd_mNpVZT@;WMQE# z{b`tn_EA`RQ8&aZfO+U43G)hD5IBA@fJ^WFb=Y7wqI?ML+s$}lVMBsqn+aoUc159h zYjcsdoO=bZISa`tf7GNllzy|VXlHrXS(pEzWfw^Z`cSx@tTpV zA~hTx7A2KQBuOd}ie@c`f!e3ET9zYu)#e^B(Bwxu_Jukxe>fQUjE;`RrRYD0+Yr*x z54psh$CuFu{IfbZBo0>HMvrd)c(^@GA^h@fci@j=r`MhoxL+5RR0cIcKRsrGX1%U{ zc6}V|?befka&GU=(J3T$a^-0I4Pl)&A@Q%YOtp_Y-#WJBU~A ztMI~LD`jBqT-LO{oyL(PV%0dsbJI!!uC|rHWGmTxA3lvC_}Icn>uw8CCpn zpCN#hWN4XP7vwE$1ip@7f)Vn);1l{;T@lqbDd>^$g=Mp0hLj6a)chdz-8Qce6;n8{ z6%h()6Vi!PKHbR;d=`-Ifu58nTxAHlczU8bAbcATOaDGBTWIZfma6n*Q`leM$4t!L z*=Nvb`zFyomnVpT#w_I;P6&LV_C3SsC_)oz7p8~n_0BQ^$$zm1VuR9znBBeb}*DSYJ z8m{t%Pq-8(02Z3{?z$;|Dnm$b|FmyDwN13P&gO8Kj4e5~Nhq$syMdW`53=yWJBySh zpD30>9&{{mL>&7oh;a95-quV&!pQGyT5&toD1BfJF~NSC^xvsa&!!6xAT*3}5Wb%-%yvaG*1zOvVENh&bGE+YY+mHLC3&k#~D5pc(ZuQN2FA-X<(`dr@(wIUFYDjN^ zP@V6crNRPP22WV6J5c+TZ^_2HLo8Sfsdf5-x;@*v#l`0{?-Vb7 zEWi0am+gB+<^Y$xsO#=|X*^*y>mwyZip%!rb#uDdS3gXKX^nq9bw`XUCQhb1?8eKj z43j>Yi(rz#wb|D+?ys$gBujgYxx3}iY(r0zbjiq|_?g0m`vgsW%&LRii^RMq~N`!W5dAT)&7LKeo zM)>{^86@^r$V|^57PcD96gEV`ZgP`ebnU@kAZFWB3^xX>#Jp#Nc?mFgyB){ybd2~{ zzOX%_mqf;O5X}p(0%iNExW{|Q2pE2J*yWutqTBJcUE__mQtAoc+hVzyI)EG2)85v} zxJ4NQ&KR#WA}gcbVpB4lGpB6c@|b9+t(mp`^B;uxpm!;I4^x^9xb7f-RCf6L>72?W zQ>V-+DPNehW5F#V@H^dUwRC6p_YUK%hS^$md)M&C2<)t4kmt268|HX$}L(gYN=%?U>3Y=XquGBM>uo@>TXSG^M{8I?Knz0<+Nzx7(CSTd(| z=(NZ1CB=1npLEKFh}B2ZMBX*&w_T+YSk!&Ak7f*`{BrQgsR*9?heGOPJ@uyO z!O55%PFwEqs7LQ!;=UrVqr?GG19Opc+-m&Ne*)8Ryq91dmCvtmlYs|vKx~MaxV}E; z^Ql+xd9g|SeqmvK9T)w{Tyy|T_%peX$M>8*S&2oN;W~^6++W>hH@?F&k3xhrJ65`KBk5Gb zEDV@p0k?u>-}UB9p@h}y9^*U}@stzTBQPY~DxTjH2i@s$Yr4$5L0lEf(enA!g!R@E zQIN;LIlUG>+t@Cvmo)A8*PwVV=L|M8m+$anZg=79a?-k&%hwh(mRfR;R#_s_@FFi z?Spk3c7{bUIf<8a89wMO6QeOti9Q}e9T3+2>A{~Q^xWEyR+7SJW@c7K@@IzmUC+xw zp^F;0lD{zy$D%0rvbTLU*0S!4`&RSw-cvoftNm*hG!=%{2zekD z57RXQIot+m4*d68^Z#P_|G7{960&p2fDVJ+z*4m5+6m~96EhAwjb9<1{|9M1`6=;k z-9vw7XKCQ*^PAI3MQD{$tG9zB_dJ<+U4W{0Fe?I5=zXinGLJS4Lc(dL&)VLLUhNRWT3N+(7%QQM5($&ZV3Ai0?I?Z|@K>|!0 zTjjG73}#e}MCfSGSpW4@u`p|V#XZV3{L=kifATxK^SH!&Z(^dO@lTbt zfQCdP%2dk{HS`sUuyA@_gfMXUOF*-269dR|qheL^#j`tfut$^x9f}=+vBKhLuBC!O zgtiz);NRovV?p3%k*X_4e2k=&xA1}PL4YxceooiAIpG2d?>}t^Uen#i84}5;KVV4b zXIKY8#U)#x1;cV1b~5E~bF3{6Na2+_=H}*DM67ZlX(B+&W63LX)$EVFoQ|6sf62ZJ zf~6WgR`x+=t)0^~n!z}kAQ&EHJ>GXfB*bfPW|n=~Ta}i_flNIKe#0w%fm-~?vC@_5 z%ggC`60hw076Ot_cxv1gV2X>B0D&(xTJ-{8(R7N-*9sXPg=^uoYm^Tx5Y{T#8bBQt z3J~!6TL4O*`Fseww9zP_E9=wK!jRTaUQcHLWR#}z@e-J(gX8urfXuEo3L40vi#5;y zr-#}l+Di$9c4lQ}Qh>Ts1^Jh~_=HEa;yED@g;nG=A8QhD-JHmbxA#dq{-(x3K#=;| zC^ReVnsT0v3<@cL-uJ+YA{KXsf+P~#Pa@{I(XC2evs-q?+lxk8PYnrWxyo#HdCZ1$ zpGVr7wMWsEc&)C*i^jlowMtWkJkBbVU-6gKcvbvdt4ndkI(7^T4@Xuc|H;l(u&mre zrX`pmxRjnayU0FtL&7YKT?Y&s48H&zacEP++i8g`WuajR>*x*}TIaPP(}+2fZF6>D zwGudFLdG2gP1iy}pqK5r+yzIt)7pK~qCdPmOuGPFw8C!~k8`EKhB%ZFj46Z$glKr7 zKu@VfT*5KHMKuElTgN4pK`a_y-fMs2Ry-t);Po8nO5l*b>TCPfc;*o1Z-=SQ@u$&I z&g&vTs{|~^$72{8B8Gj)2?8zEAOYm7lgEv3&oLq>aXQxE^b(DbMeM+ZvPsG$E71AkTv$Uuiq zuS#x$G@E{7Vd?uk;m~a5p!nNM5tEsi9ft-I9sOpH8G}H6uv1ObU|R)#6_D;d{vcwP1z8=Ho%#? z(irbtH|6_tmP>T;cmtDf|DQ;nN!yHaz5tX%IS>8}Lfe39-C3)9`OQc2%I3v)rHns4 zNJx1zT`dC?mcD*qPOg0kIA^Dh?A@uyFzC=#LG5yHa=H8IUZyg>Cg}d!h_JC<5F_i# zDvxtV3HO@Ut_pNRkJdy@GOF#tw;+x(GL-2a~4 zE;Ba<9mbP3*64%>B^yEqkuPFI0yhcl{dhLjase6IQeSbe5K}YIwF1DSaE{)>+UIp8TGjzxmI+ulI>tleJe(|?HqL( zx?P3y>Kvq+XJXU8=trw0EG9yO9%iUuwwS`(QDzntrF#Ep)PDBmK*V) z2zx+$^V`F8Omr2~fD?^d+gn?D+Y+Q=J$=`_WxrTfO+EwLntMoz`v~eV*_UbLhEUFv z{(lG%uNwpQk;;Ne3(RI=5q0*#)$4-z>dD7;tNmA#4n4`xVv}yM%f1rx!L}-#7+A`cVp4lFo&CQ` z3Xy~>sv?i5Wakb?QWU-C`T~S}Rf#ead)Xv;IVqO!wW@*wI{y{x?m6Uyb;({Ifh<`~D0UbI{C2N=Fc*v^5%i!t5&B|jw zkZFB24Um-oI9%otvH>s4nlx9t&;YvVzMi0|YJ%rwc6o8?TP1*+@8f8c#Bpf=krpNX zy@*{-?^E>i6|DeCWGN6v^p8E>KPOV4zr~N``v5s*U9PMH0`Bv0Ldp2h{`Q?AL(5qM zW}6c6kBurIAi7dO&z-8EYITl|=q$*ytJ2YVe^y=4{cVdRe$#wwo$dZI!GC}Ni&|Sh zWhO`#3ZN*WJXGdA5KLTNqHs)~z6O_%3>?cnN$iquahLlRjuDFT^26ZrP+svC1_3!< z>KjOAgWoo7u+0I6F!O~YTm*GNsM<|;1np%+3H7H2VvA$7@|*jr%Nt>Fk4gD|B+O-a z!ya<}-gzJ(^FWpIEYcD(Lhu`;%&TlU8i7GU|5%ucl0rM`;{slGi2SC(6Kj43hCrd~ zqFKzJqS-eU?*l?*%OL}XySio%oJ?Edsksv+Q&^&3X@Xc}GH@L*p8 z1ORGNexia_%*a%-J%phl<=Ct1fp)~VO;^A(4A*^aj#mf z*mSE1?An�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 Windows 桌面 AI Agent 客户端 —— **PyQt6 外壳 + 本地 Web 渲染(WebView2 优先 / QtWebEngine 兜底) +> + 与 [pi](https://github.com/badlogic/pi) **1:1 对齐的 agent 核心**(工具调用 / 自动重试 / 上下文压缩)。** + +能读写文件、执行 bash、带图片与 PDF 附件聊天、把「思考 / 工具调用 / 工具结果」按时间线持久化, +并在此基础上支持会话树分支、会话复制、实时上下文计量与右侧任务面板。 + +--- + +## 一、快速开始 + +### 1. 环境要求 + +| 项 | 要求 | +|---|---| +| 操作系统 | Windows 10 / 11 x64 | +| Python | **3.10**(开发环境:miniconda env `haocode`) | +| WebView2 Runtime | Win11 自带;Win10 需装 [Evergreen Runtime](https://developer.microsoft.com/microsoft-edge/webview2/)(缺失会自动回落 QtWebEngine,仍可用) | +| Node.js | 可选,只有跑 `tests/test_math_extract.js` 需要 | + +### 2. 安装依赖 + +```bash +pip install -r requirements.txt +``` + +> **不需要** pip 安装的运行时依赖(已随仓库提供,勿删): +> `vendor/webview2/`(WebView2 .NET SDK + loader)、根目录 `WebView2Loader.dll`。 + +### 3. 配置 API Key + +编辑 `data/config.json`: + +```jsonc +{ + "providers": { + "deepseek": { + "api_key": "sk-填你自己的", // ← 交接版已清空,必须填 + "base_url": "https://api.deepseek.com", + "models": ["deepseek-v4-flash"], + "model_contexts": { "deepseek-v4-flash": 1000000 } // 决定上下文用量条与压缩阈值 + } + }, + "default_provider": "deepseek", + "default_model": "deepseek-v4-flash", + "debug_window_autostart": true, // 启动时是否自动开「调试窗口」 + "mode_switch": true, // 是否允许会话中途切换 chat ↔ worker + "webview_backend": "auto" // auto | webview2 | qtwebengine +} +``` + +### 4. 运行 + +```bash +python main.py +``` + +首次运行会自动在 `data/` 下创建**空的** `chat_history.db`(含一条初始对话)。 +左侧栏「+ 新建对话」开始聊天;输入框上方可贴图/拖文件/截屏(Ctrl+Shift+S)。 + +### 5. 打包 exe(可选) + +```bash +python -m PyInstaller haocode.spec --distpath "输出目录" --noconfirm +``` + +- 产物为 **onedir**(一个文件夹,里面 `haocode.exe` 双击即用) +- **不含数据库**:首次运行在 exe 同级 `data/` 自建空库 +- 冻结版没有控制台,启动日志写 **exe 同级 `haocode.log`**(`pyi_rth_trace.py` 钩子) +- ⚠️ 打包前务必确认:`main.py` 顶部的 stdout/stderr UTF-8 保护存在(否则 `print` 里的 emoji 会在 GBK 环境直接崩,表现为"双击没反应") + +--- + +## 二、架构总览 + +``` +┌──────────────────────────────────────────────────────────────────────────┐ +│ ① 表现层 ui/views/*.py (PyQt6) │ +│ main_window.py 主窗口 / bash_panel.py 右侧任务面板 / debug_window.py │ +└───────────────┬──────────────────────────────────────────────────────────┘ + │ QWebChannel(chat_bridge.py:Python → JS 单向调用) +┌───────────────▼──────────────────────────────────────────────────────────┐ +│ ② 渲染层 ui/web/(index.html + app.js + style.css + KaTeX/highlight) │ +│ 容器二选一:wv2_view.py(WebView2) / custom_web_page.py(QtWebEngine) │ +└───────────────▲──────────────────────────────────────────────────────────┘ + │ 事件信号(Qt Signal/Slot,跨线程 queued) +┌───────────────┴──────────────────────────────────────────────────────────┐ +│ ③ 引擎层 core/llm_engine.py │ +│ AgentWorker(worker 模式) / ChatWorker(chat 模式) / TitleWorker(标题) │ +└───────────────┬──────────────────────────────────────────────────────────┘ + │ +┌───────────────▼──────────────────────────────────────────────────────────┐ +│ ④ Agent 核心 core/agent/(pi 1:1 移植) │ +│ loop.py 循环 → stream_fn.py 流式+异常分类 → recovery.py 重试/压缩决策 │ +│ tools.py 四个工具(read/bash/write/edit) · compaction.py 上下文压缩 │ +│ context.py 上下文组装与计量 · types.py 数据结构 │ +└───────────────┬──────────────────────────────────────────────────────────┘ + │ +┌───────────────▼──────────────────────────────────────────────────────────┐ +│ ⑤ 存储层 core/db_manager.py(SQLite:会话树 / 消息 / 压缩标记 / 附件) │ +└──────────────────────────────────────────────────────────────────────────┘ +``` + +**一句话数据流**: +`输入框 → main_window 组装上下文(core/agent/context) → AgentWorker 跑 agent 循环 → +LLM 流式返回(stream_fn) → 工具在本地执行(tools) → 事件经 chat_bridge 推到 Web 层渲染 → +结束时整轮(正文/思考/工具时间线/usage)落库(db_manager),并成为会话树的新叶子` + +--- + +## 三、目录树(每行说明这是什么) + +``` +haocode/ +│ +├── main.py 程序入口:渲染开关 → UTF-8 保护 → QApplication → MainWindow +├── SYSTEM_PROMPT.md ★ agent 系统提示词(每次请求注入,不进历史、不占压缩) +├── requirements.txt 依赖清单(只列代码真实用到的包) +├── haocode.spec PyInstaller 打包配置(onedir / 不含 db / 带启动日志钩子) +├── pyi_rth_trace.py 打包运行时钩子:冻结版 stdout+stderr → exe 同级 haocode.log +├── WebView2Loader.dll WebView2 loader(工作目录兜底路径) +│ +├── core/ ★ 后端核心(无界面依赖) +│ ├── db_manager.py SQLite 存储层:会话/消息链表树/压缩标记/附件/复制会话 +│ ├── llm_engine.py Qt 线程桥:AgentWorker / ChatWorker / TitleWorker + 配置与提示词加载 +│ ├── webview2.py WebView2 集成:pythonnet 环境、单实例锁、无头守卫、残留进程清理 +│ ├── debug_log.py 调试事件总线(供调试窗口「对话消息 / 应用日志」两页) +│ └── agent/ ★ pi 1:1 agent 核心(9 个文件,见 Frame.md) +│ ├── agent.py Agent 对象:状态、事件订阅、prompt/continue、steering 队列 +│ ├── loop.py agent 主循环:流式一轮 → 工具批执行 → 轮末钩子 → 停止判定 +│ ├── stream_fn.py OpenAI 流式调用 + 异常分类(classify_error) +│ ├── recovery.py 重试/压缩三路决策(对照 pi retry.ts / overflow.ts) +│ ├── compaction.py 上下文压缩(摘要切点、保留尾巴、标记生成) +│ ├── context.py 上下文组装、token 估算、usage 锚定 +│ ├── tools.py 四个工具实现:read / bash / write / edit(+ 参数校验) +│ └── types.py ModelConfig / AgentConfig / AgentMessage / AgentTool… 数据结构 +│ +├── ui/ ★ 表现层 +│ ├── views/ PyQt6 窗口与逻辑 +│ │ ├── main_window.py ★主窗口(6000 行,全项目最核心):布局/样式/流式状态/附件/入库 +│ │ ├── bash_panel.py 右侧「任务面板」:运行中/已完成两栏、层卡片、拖拽调宽 +│ │ ├── chat_bridge.py QWebChannel 桥:把 Python 调用翻译成 JS 函数调用 +│ │ ├── wv2_view.py WebView2 容器控件(QWidget + 原生子窗口) +│ │ ├── custom_web_page.py QtWebEngine 容器控件(回落路径,含 QWebChannel 注入) +│ │ ├── debug_window.py 调试窗口:事件流 + 应用日志 + 命令输入 +│ │ └── system_tools/ 系统级能力(见 Frame.md) +│ │ ├── file_reader.py 文本/代码文件读取与二进制黑名单 +│ │ ├── global_hotkey.py 全局热键注册(Ctrl+Shift+S 截屏) +│ │ └── screen_capture.py 区域截屏 +│ └── web/ 本地 Web 渲染层(离线,无 CDN) +│ ├── index.html 页面骨架 + 三个本地库的引入 +│ ├── app.js ★前端全部逻辑:消息渲染/流式增量/时间线/KaTeX/滚动 +│ ├── style.css 全部样式(气泡/思考块/工具 chip/紧凑模式) +│ ├── marked.min.js Markdown 渲染 +│ ├── dompurify.min.js HTML 消毒(配合 marked) +│ ├── highlight/ 代码高亮(highlight.js + atom-one-dark) +│ └── katex/ 公式渲染(KaTeX + 字体) +│ +├── data/ 运行时数据目录 +│ ├── config.json 供应商/模型/开关配置(★ 需填 API Key) +│ ├── chat_history.db 聊天主库(**不在交接版内**,首次运行自建空库) +│ └── (运行后还会出现) debug_session.log · app_instance.lock · attachments/ · wv2_cache/ +│ +├── vendor/webview2/ WebView2 .NET SDK:net462 Core.dll + webview2loader_x64.dll +├── svg/ 界面图标 18 个(panel.svg 左栏 / panel_right.svg 右栏 / 模式图标…) +├── tools/builtin_tools/ +│ └── pdf_reader.py PDF 解析(extract_pdf_text / extract_pdf_images,被主窗口 import) +│ +├── tests/ ★ 测试与调试工具(见第五节) +│ +└── 历史文档(保留备查,非最新结构说明) + ├── ARCHITECTURE.md 早期架构文档(其中部分目录已在交接版移除) + ├── readme_our.md 早期设计/规划稿(973 行) + └── 黑边两现象分析报告.md Windows 窗口缩放黑边问题的分析记录 +``` + +--- + +## 四、我要改 X,该去哪个文件?(功能 → 文件索引) + +| 需求 | 文件 | 关键位置 | +|---|---|---| +| 改主界面布局 / 气泡 / 输入框 / 主题 | `ui/views/main_window.py` | `setup_ui()`、`setup_stylesheet()` | +| 改前端渲染(Markdown / 公式 / 流式增量) | `ui/web/app.js` + `style.css` | `marked.parse` 统一拦截点、`updateMessage` | +| 右侧任务面板(层卡片/状态) | `ui/views/bash_panel.py` | `BashPanel` / `BashLayer` / `_Section` | +| Python 调前端 JS | `ui/views/chat_bridge.py` | 每个方法 = 一个 JS 函数 | +| 数据库结构 / 会话树 / 附件 | `core/db_manager.py` | `add_message`、`get_message_chain`、`copy_session` | +| **系统提示词** | `SYSTEM_PROMPT.md` | 直接改,每次请求重新读取(无需重启) | +| 工具的实现与参数校验 | `core/agent/tools.py` | `tool_read` / `tool_bash` / `tool_write` / `tool_edit` | +| 工具调用循环 / 停止条件 | `core/agent/loop.py` | `run_agent_loop`、`execute_tool_calls` | +| 重试与压缩策略 | `core/agent/recovery.py` | `_handle_post_agent_run`(三路决策) | +| 上下文压缩算法 | `core/agent/compaction.py` | `compact_context`、`should_compact` | +| token 估算 / usage 锚定 | `core/agent/context.py` | `estimate_context_tokens`、`calculate_context_tokens` | +| 模型请求 / 流式解析 / 错误分类 | `core/agent/stream_fn.py` | `openai_stream`、`classify_error` | +| WebView2 行为(锁/无头/清场) | `core/webview2.py` | `get_environment`、`acquire_instance_lock` | +| 调试窗口 | `ui/views/debug_window.py` + `core/debug_log.py` | — | +| 打包 | `haocode.spec` + `pyi_rth_trace.py` | — | + +--- + +## 五、测试方式 + +### 1. 两条铁律(写新测试必须遵守) + +1. **不得污染真实数据库**:测试启动时必须把 `core.db_manager._DEFAULT_DB` 指向临时文件 + ```python + import core.db_manager as _dbm + _dbm._DEFAULT_DB = os.path.join(tempfile.gettempdir(), f"t_{os.getpid()}.db") + # 必须在 import MainWindow 之前 + ``` +2. **不得污染真实配置**(会写 `config.json` 的功能):把 `HAOCODE_CONFIG_FILE` 指向临时文件 + +### 2. 跑测试(建议先设两个环境变量) + +```bat +set PYTHONIOENCODING=utf-8 +set QT_QPA_PLATFORM=offscreen :: 只有带 GUI 的 smoke_* 需要 +``` + +**A. 纯逻辑测试(无 GUI,秒级)** + +```bash +python tests/run_tests.py # agent 核心(流式/工具/重试/压缩) 41 项 +python tests/test_tool_params.py # 四个工具的参数校验与错误串 35 项 +python tests/test_compaction_persist.py # 压缩标记持久化与上下文截断 41 项 +python tests/test_copy_session.py # 会话复制(含附件深拷贝、分支、标题递增) 54 项 +python tests/test_bash_stream.py # bash 实时输出/超时杀进程树/50KB 截断 30 项 +python tests/test_error_persist.py # 失败轮次入库与回放取舍(含旧库迁移安全) 39 项 +python tests/test_wv2_guard.py # WebView2 双守卫(无头/多实例) 10 项 +python tests/test_debug_window.py # 调试窗口 22 项 +python tests/test_think_code_neutral.py # 思考块/代码块中性化 10 项 +python tests/test_file_attach.py # 附件类型判定 +python tests/test_pdf_reader.py # PDF 文本/图片解析 +node tests/test_math_extract.js # 公式提取(前端 JS 逻辑) 39 项 +``` + +**B. GUI 离屏端到端(需 `QT_QPA_PLATFORM=offscreen`)** + +```bash +python tests/smoke_offscreen.py # 主窗口起得来 + 三个基础链路 8 项 +python tests/smoke_mode.py # chat ↔ worker 模式切换 16 项 +python tests/smoke_copy_session.py # 复制会话 UI 全链路 +python tests/smoke_bash_panel.py # 右侧任务面板全链路(含折叠/拖拽调宽) 116 项 +``` + +**C. 需要真机/真 API 的(默认不用跑)** + +`tests/smoke_live_guard.py`、`smoke_midswitch.py`、`smoke_persist.py`、`smoke_probe.py`、 +`smoke_repro_real.py`、`smoke_timeline.py`、`smoke_manual.py`、`diag_live_*.py`、`verify_onscreen.py` +—— 这些是开发期在真窗口/真模型上跑的工具,交接后按需使用。 + +### 3. 基线(本次交接版实测全绿) + +``` +run_tests 41/41 · tool_params 35/35 · compaction 41/41 · copy_session 54/54 +bash_stream 30/30 · error_persist 39/39 · wv2_guard 10/10 · debug_window 22/22 +think_code_neutral 10/10 · math_extract 39/39 +smoke_offscreen 8/8 · smoke_mode 16/16 · smoke_copy_session 全通过 · smoke_bash_panel 116/116 +``` + +### 4. 辅助工具 + +```bash +python tests/check_db_migration.py <某个 .db 或备份 .zip> +# 只读校验:迁移(新增列)后旧库数据是否 100% 原样保留(消息数/父指针/叶子/分支点逐项比对) +``` + +--- + +## 六、已知限制 + +1. **仅 Windows**:WebView2 与 `bash` 工具都按 Windows 语义实现(cmd.exe + taskkill /T)。 +2. **`bash` 工具的真实 shell 是 cmd.exe**(不是 git-bash):`;` 不是命令分隔符、 + `$VAR` 不展开、`cd` 不跨命令保持 —— 系统提示词里已写明这些陷阱与正确写法。 +3. **HTTP 代理/流式**:模型请求走 openai SDK,单次 180s 超时,失败按 2s/4s/8s 重试 3 次。 +4. **打包体积**:默认带 QtWebEngine 兜底,产物约 575 MB;若确定只用 WebView2, + 可从 `haocode.spec` 去掉 `PyQt6.QtWebEngine*` 的 `collect_all`(降到约 110 MB)。 +5. `data/attachments/` 里的图片/PDF 是**文件系统**资源,删库不会删它们;删会话时才会连带清理。 +6. 冻结版与源码版会共用同一个库的**唯一例外**:把 exe 放在源码树的 `dist/` 下时 + (`exe/../../data/` 存在即共用 `chat_history.db`);放到桌面等其它位置则用 exe 同级 `data/`。 +7. **运行时会往项目根目录写诊断产物**(开发期排障用,可直接删): + `compaction_diag.log`(压缩决策日志)、`stream_diag.log`(前端流式体检)、 + `diag_shot_*.png`(每轮回复结束时的画面快照)、`data/debug_session.log`(调试窗口日志)。 + 不想要可自行注释 `ui/views/main_window.py` 里的 `diag_log()` / `diag_shot` 调用点。 + +--- + +## 七、交接版说明(haocode_0 相对原项目做了什么) + +| 动作 | 内容 | +|---|---| +| ✅ 保留 | 全部源码、`SYSTEM_PROMPT.md`、`vendor/webview2/`、18 个 svg、`ui/web/`(含 KaTeX/highlight)、正式测试套件、`haocode.spec` + 打包钩子 | +| 🗑 删除·空文件 | `agents/`(3 个全空)、`workspace/`(4 个全空)、`tools/{registry,conda_env}.py`、`tools/builtin_tools/{file_ops,web_search}.py`、`core/{async_sync,memory_manager,prompt_templates}.py`、`ui/views/components.py`、`ui/assets/`(空 style.qss)、`tests/{test_ast,test_replace}.py`、根目录 0 字节文件 —— **均已确认零引用**(`__init__.py` 属于包结构标记,全部保留) | +| 🗑 删除·测试产物 | 根目录 `diag_shot_*.png`(36)、`*.log`、`_fadechk2.py`、`inspect_*.py`、`read_all_py.py`、`ssh_helper.py`、`tmp_timeout_probe.py`、`flowkit.db`、`stress_report.json` 等;`tests/_tmp*`(81 项,含 `_tmp_resize_vis/` 与全部临时日志) | +| 🗑 删除·数据库 | `data/chat_history.db` 及全部 `.bak/.pre_clean`、`data/attachments/`、`data/debug_session.log`、`data/wv2_cache/` → **首次运行自动新建空库(含初始对话)** | +| 🗑 删除·其它 | `__pycache__/` 全部、旧封装 `geekagent.spec`、未使用的 `untitled.ui` | +| ✏️ 重写 | `requirements.txt`(AST 扫描核对)、`readme.md`(本文件)、`Frame.md`(逐目录细节) | +| ⚠️ 注意 | `data/config.json` 的 `api_key` **已清空**(交接安全),请填入自己的 Key;`.txt` 文本示例按你的要求**全部保留**(`_out.txt`、`_t0.txt`) | + +> 详细到"每个子文件夹/每个文件干什么、关键类与函数叫什么",见 **`Frame.md`**。 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9929022 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,58 @@ +# haocode 运行依赖 +# --------------------------------------------------------------------------- +# 环境:Windows 10/11 x64 + Python 3.10(开发环境为 miniconda env: haocode) +# 安装:pip install -r requirements.txt +# 说明:本清单只列**代码真实 import 到**的第三方包(已用 AST 全量扫描核对), +# 不含开发机上其它项目的包(numpy / matplotlib / pillow / paramiko 等均未使用)。 +# --------------------------------------------------------------------------- + +# ---- GUI 框架(PyQt6)---- +PyQt6==6.10.2 +PyQt6-Qt6==6.10.2 + +# ---- 渲染回退:QtWebEngine(WebView2 不可用 / 无头 / 多实例时自动使用)---- +# 注:WebView2 是首选渲染器,但它依赖微软运行时 + vendor/webview2/ 里的 .NET SDK, +# 不走 pip;QtWebEngine 是本项目自带的兜底渲染路径,必须装。 +PyQt6-WebEngine==6.10.0 +PyQt6-WebEngine-Qt6==6.10.2 + +# ---- 大模型 SDK(OpenAI 兼容接口;DeepSeek / opencode-go / 自建反代均走它)---- +openai==2.26.0 + +# ---- WebView2 绑定:pythonnet(import clr)+ 其加载器(仅 Windows;Linux 自动跳过)---- +pythonnet==3.1.0; sys_platform == "win32" +clr_loader==0.3.1; sys_platform == "win32" + +# ---- PDF 附件解析(ui/views/main_window.py → tools/builtin_tools/pdf_reader.py)---- +PyMuPDF==1.28.0 + +# =========================================================================== +# Linux 源码运行(Ubuntu 22.04/24.04 x64,仅 QtWebEngine;不装 WebView2 任何东西) +# =========================================================================== +# 1) pip install -r requirements.txt # pythonnet/clr_loader 带平台 marker,Linux 自动跳过 +# 2) 安装 QtWebEngine 运行所需的系统库(apt,按需选装): +# sudo apt install -y libnss3 libxkbcommon0 libfontconfig1 libdbus-1-3 \ +# libgl1 libegl1 libasound2t64 # 24.04 用 libasound2t64;22.04 用 libasound2 +# 离屏测试另需:QT_QPA_PLATFORM=offscreen +# 3) 运行:python3.10 main.py +# - 只使用 QtWebEngine;每实例独立 profile(data/webengine/profile__*) +# - root/容器启动若页面空白:显式 QTWEBENGINE_CHROMIUM_FLAGS="--no-sandbox" python3.10 main.py +# (启动会打印高可见风险警告;普通桌面不要加) + +# =========================================================================== +# 以下仅在需要时安装 +# =========================================================================== + +# ---- 打包 exe(可选)---- +# PyInstaller==6.21.0 +# pyinstaller-hooks-contrib==2026.6 + +# =========================================================================== +# 不需要 pip 安装的运行时依赖(重要) +# =========================================================================== +# 1) vendor/webview2/ WebView2 .NET SDK(Core.dll)+ webview2loader_x64.dll +# 已随仓库提供,勿删;缺失 → 自动回落 QtWebEngine +# 2) WebView2Loader.dll 项目根目录的 loader(CWD 兜底路径) +# 3) WebView2 Runtime(系统级) Win11 自带;Win10 需安装 Evergreen Runtime +# 4) Node.js 仅 tests/test_math_extract.js 需要(可选) +# 5) pytest 不需要!tests/run_tests.py 自带 harness 并 stub 掉 pytest diff --git a/svg/check.svg b/svg/check.svg new file mode 100644 index 0000000..18ad000 --- /dev/null +++ b/svg/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/chevron_down.svg b/svg/chevron_down.svg new file mode 100644 index 0000000..a7b2834 --- /dev/null +++ b/svg/chevron_down.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/chevron_right.svg b/svg/chevron_right.svg new file mode 100644 index 0000000..89e2a27 --- /dev/null +++ b/svg/chevron_right.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/cross.svg b/svg/cross.svg new file mode 100644 index 0000000..c5d7de0 --- /dev/null +++ b/svg/cross.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/main.svg b/svg/main.svg new file mode 100644 index 0000000..257f014 --- /dev/null +++ b/svg/main.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/mode_chat.svg b/svg/mode_chat.svg new file mode 100644 index 0000000..09361e1 --- /dev/null +++ b/svg/mode_chat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/mode_worker.svg b/svg/mode_worker.svg new file mode 100644 index 0000000..82617bd --- /dev/null +++ b/svg/mode_worker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/model.svg b/svg/model.svg new file mode 100644 index 0000000..71755d3 --- /dev/null +++ b/svg/model.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/panel.svg b/svg/panel.svg new file mode 100644 index 0000000..2f9c682 --- /dev/null +++ b/svg/panel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/panel_right.svg b/svg/panel_right.svg new file mode 100644 index 0000000..804c1af --- /dev/null +++ b/svg/panel_right.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/provider.svg b/svg/provider.svg new file mode 100644 index 0000000..a24ed70 --- /dev/null +++ b/svg/provider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/provider2.svg b/svg/provider2.svg new file mode 100644 index 0000000..7d12eef --- /dev/null +++ b/svg/provider2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/provider3.svg b/svg/provider3.svg new file mode 100644 index 0000000..9d84d92 --- /dev/null +++ b/svg/provider3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/send.svg b/svg/send.svg new file mode 100644 index 0000000..7f53b5d --- /dev/null +++ b/svg/send.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/send_white.svg b/svg/send_white.svg new file mode 100644 index 0000000..81347fb --- /dev/null +++ b/svg/send_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/stop.svg b/svg/stop.svg new file mode 100644 index 0000000..1f7c151 --- /dev/null +++ b/svg/stop.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/stop_white.svg b/svg/stop_white.svg new file mode 100644 index 0000000..d4cd20b --- /dev/null +++ b/svg/stop_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/upload.svg b/svg/upload.svg new file mode 100644 index 0000000..6b2b62d --- /dev/null +++ b/svg/upload.svg @@ -0,0 +1,3 @@ + + + diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/_test_env.py b/tests/_test_env.py new file mode 100644 index 0000000..a9ed604 --- /dev/null +++ b/tests/_test_env.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +"""tests/_test_env.py —— 自动化测试的统一临时环境(P0-01 新增) + +铁律(VERIFICATION.md §凭据与运行数据隔离): + 1. 每个测试进程独立临时目录 + 最小临时配置; + 2. 在 import 任何可能间接加载 MainWindow 的模块之前设置 HAOCODE_CONFIG_FILE; + 3. 在 import MainWindow 之前把 core.db_manager._DEFAULT_DB 指向临时数据库; + 4. 写入、迁移、附件和截图产物只落到临时目录。 + +用法(放在测试文件顶部、任何 UI import 之前): + + from tests._test_env import isolate + isolate("bashpanel", config={"providers": {}, "mode_switch": True}) + +说明: + · 临时目录按 进程 pid 隔离,测试进程互不干扰; + · 默认临时配置为最小可启动结构(空 providers + 测试 provider); + · 本模块不 import 任何 PyQt 模块,可在无 GUI 环境中安全调用。 +""" +import json +import os +import sys +import tempfile + +_TESTS_DIR = os.path.dirname(os.path.abspath(__file__)) +_ROOT = os.path.dirname(_TESTS_DIR) +if _ROOT not in sys.path: + sys.path.insert(0, _ROOT) + + +def default_config() -> dict: + """最小可启动临时配置(不含任何真实凭据)。""" + return { + "providers": { + "testprov": { + "api_key": "test-key-not-real", + "base_url": "http://127.0.0.1:9/v1", + "models": ["test-model"], + "model_contexts": {"test-model": 100000}, + } + }, + "default_provider": "testprov", + "default_model": "test-model", + } + + +def isolate(tag: str = "t", config: dict | None = None) -> dict: + """创建临时配置 + 临时数据库并完成重定向。必须在 import MainWindow 之前调用。 + + 返回 {"base": 临时目录, "config": 临时配置路径, "db": 临时数据库路径}。 + """ + base = os.path.join(tempfile.gettempdir(), + f"haocode_test_{tag}_{os.getpid()}") + os.makedirs(base, exist_ok=True) + + cfg_path = os.path.join(base, "config.json") + with open(cfg_path, "w", encoding="utf-8") as f: + json.dump(config if config is not None else default_config(), + f, ensure_ascii=False, indent=2) + + db_path = os.path.join(base, "chat_history.db") + for p in (db_path, db_path + "-wal", db_path + "-shm"): + if os.path.exists(p): + os.remove(p) + + os.environ["HAOCODE_CONFIG_FILE"] = cfg_path + + # P1-03:QtWebEngine 独立 profile 重定向到临时目录(源码运行才在 data/webengine/) + os.environ.setdefault("HAOCODE_WEBENGINE_PROFILE_DIR", os.path.join(base, "webengine_profile")) + + import core.db_manager as _dbm + _dbm._DEFAULT_DB = db_path + + return {"base": base, "config": cfg_path, "db": db_path} diff --git a/tests/check_db_migration.py b/tests/check_db_migration.py new file mode 100644 index 0000000..8ab2e52 --- /dev/null +++ b/tests/check_db_migration.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +"""用「备份 ZIP 里的真实旧库」验证:迁移新列后旧数据必须 100% 原样保留(只读对比)。 + +用法: python tests/check_db_migration.py +""" +import os +import sys +import json +import shutil +import sqlite3 +import tempfile +import zipfile + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +ZIP = sys.argv[1] if len(sys.argv) > 1 else r"D:/haocode_backup_20260916_1102.zip" +OUT = os.path.join(tempfile.gettempdir(), "haocode_from_backup.db") +if os.path.exists(OUT): + os.remove(OUT) + +with zipfile.ZipFile(ZIP) as z: + name = [n for n in z.namelist() + if os.path.basename(n) == "chat_history.db"][0] + with z.open(name) as src, open(OUT, "wb") as dst: + shutil.copyfileobj(src, dst) +print("从备份取出:", name, os.path.getsize(OUT), "bytes") + + +def fp(path): + c = sqlite3.connect(path) + c.row_factory = sqlite3.Row + cols = [r[1] for r in c.execute("PRAGMA table_info(messages)")] + d = { + "messages_rows": c.execute("SELECT COUNT(*) FROM messages").fetchone()[0], + "sessions_rows": c.execute("SELECT COUNT(*) FROM sessions").fetchone()[0], + "msg_sum": list(c.execute( + "SELECT COUNT(*), SUM(LENGTH(COALESCE(content,''))), " + "SUM(LENGTH(COALESCE(timeline,''))) FROM messages").fetchone()[:]), + "parents": [tuple(r) for r in c.execute( + "SELECT id, parent_id FROM messages ORDER BY id")], + "leaves": [tuple(r) for r in c.execute( + "SELECT id, current_leaf_msg_id FROM sessions ORDER BY id")], + "branches": sorted((r["parent_id"], r["n"]) for r in c.execute( + "SELECT parent_id, COUNT(*) n FROM messages " + "WHERE parent_id IS NOT NULL GROUP BY parent_id HAVING n>1")), + "roles": sorted((r["role"], r["n"]) for r in c.execute( + "SELECT role, COUNT(*) n FROM messages GROUP BY role")), + "has_new_cols": all(x in cols for x in ("stop_reason", "error_message")), + } + c.close() + return d + + +before = fp(OUT) +print("备份库(迁移前): 消息=%d 会话=%d 分支点=%d 含新列=%s" % ( + before["messages_rows"], before["sessions_rows"], + len(before["branches"]), before["has_new_cols"])) + +import core.db_manager as _dbm # noqa: E402 +_dbm._DEFAULT_DB = OUT +d = _dbm.DBManager(db_path=OUT) # ← 触发迁移 +after = fp(OUT) +print("迁移后 : 消息=%d 会话=%d 分支点=%d 含新列=%s" % ( + after["messages_rows"], after["sessions_rows"], + len(after["branches"]), after["has_new_cols"])) +print() +keys = ("messages_rows", "sessions_rows", "msg_sum", "parents", + "leaves", "branches", "roles") +for k in keys: + print((" OK " if before[k] == after[k] else " DIFF ") + "%-14s" % k) +allok = all(before[k] == after[k] for k in keys) +print() +print("每个会话叶子:", [(r[0][:16], (r[1] or "")[:16]) for r in after["leaves"][:4]], "...") +print(">>> 结论:", "✅ 旧库数据 100% 原样保留(只多两个空列)" + if allok else "❌ 有改动!") +os.remove(OUT) +sys.exit(0 if allok else 1) diff --git a/tests/debug_inject.py b/tests/debug_inject.py new file mode 100644 index 0000000..d25b266 --- /dev/null +++ b/tests/debug_inject.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +"""代理侧调试注入 CLI(与运行中的 app 通过文件通信) + +用法: + python tests/debug_inject.py "备注内容" # 注入 [AGENT] 日志行 + python tests/debug_inject.py --show # 打开独立调试窗口 + python tests/debug_inject.py --hide # 关闭独立调试窗口 + python tests/debug_inject.py --read [N] # 读取会话日志最后 N 行(默认 50) +""" +import sys, os +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from core import debug_log as dl + + +def main(): + args = sys.argv[1:] + if not args: + print(__doc__) + return 1 + if args[0] == "--show": + with open(dl.DEBUG_CMD_PATH, "w", encoding="utf-8") as f: + f.write("show") + print(f"已请求打开调试窗口 -> {dl.DEBUG_CMD_PATH}") + return 0 + if args[0] == "--hide": + with open(dl.DEBUG_CMD_PATH, "w", encoding="utf-8") as f: + f.write("hide") + print(f"已请求关闭调试窗口 -> {dl.DEBUG_CMD_PATH}") + return 0 + if args[0] == "--read": + n = int(args[1]) if len(args) > 1 else 50 + if not os.path.exists(dl.DEBUG_LOG_PATH): + print("(会话日志尚不存在)") + return 0 + with open(dl.DEBUG_LOG_PATH, "r", encoding="utf-8") as f: + lines = f.read().splitlines() + print(f"===== {os.path.basename(dl.DEBUG_LOG_PATH)} 最后 {min(n, len(lines))} 行 =====") + for l in lines[-n:]: + print(l) + return 0 + # 普通文本 → 注入 [AGENT] + dl.debug_log(args[0], "AGENT") + print(f"已注入 [AGENT]: {args[0]}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/diag_live_agent.py b/tests/diag_live_agent.py new file mode 100644 index 0000000..eaedb90 --- /dev/null +++ b/tests/diag_live_agent.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +r"""真实 API 测试:opencode-go / deepseek-v4-flash + 完整 agent 循环(工具执行) +运行: C:\Users\14890\miniconda3\envs\haocode\python.exe -u tests/diag_live_agent.py +""" +import json +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) + +from core.agent import (Agent, AgentConfig, ModelConfig, RetryConfig) # noqa: E402 +from core.agent.recovery import AgentRunner # noqa: E402 +from core.agent.stream_fn import openai_stream # noqa: E402 +from core.agent.tools import default_tools # noqa: E402 + +MODEL_NAME = "deepseek-v4-flash" + +cfg = json.load(open(os.path.join(ROOT, "data", "config.json"), encoding="utf-8")) +prov = cfg["providers"]["opencode-go"] + +model = ModelConfig( + provider="opencode-go", name=MODEL_NAME, + context_window=int(prov.get("model_contexts", {}).get(MODEL_NAME, 1000000)), + max_tokens=4096, temperature=0.3, + api_key=prov["api_key"], base_url=prov["base_url"], +) + +with open(os.path.join(ROOT, "SYSTEM_PROMPT.md"), encoding="utf-8") as f: + system_prompt = f.read() + +agent_cfg = AgentConfig( + model=model, + tools=default_tools(), + system_prompt=system_prompt, + tool_context={"cwd": ROOT}, + retry=RetryConfig(max_attempts=2, base_delay_ms=1000), +) +agent = Agent(agent_cfg) +agent.set_stream_fn(openai_stream) + + +def show(e): + if e.type == "message_update" and e.assistant_message_event is not None: + ev = e.assistant_message_event + if ev.type == "text_delta": + print(" [正文] " + ev.text, end="", flush=True) + elif ev.type == "thinking_delta": + print(" [思考] " + ev.text, end="", flush=True) + elif ev.type == "toolcall_delta": + print(f" [tc] {ev.tool_call_field}={ev.tool_call_delta!r}", + end="", flush=True) + elif e.type == "tool_execution_start" and e.tool_call is not None: + print(f"\n [工具开始] {e.tool_call.name} 参数={e.tool_call.arguments}") + elif e.type == "tool_execution_update" and e.arg: + print(" [工具输出] " + str(e.arg), end="", flush=True) + elif e.type == "tool_execution_end" and e.tool_call is not None: + c = e.result.content if e.result else "" + if not isinstance(c, str): + c = "".join(x.get("text", "") for x in c if isinstance(x, dict)) + print(f"\n [工具结束] ok={not e.is_error} 结果={c[:200]!r}") + elif e.type == "agent_end": + print(f"\n [agent_end] stop_reason={e.stop_reason} " + f"error={getattr(e.error, 'message', None)}") + + +agent.subscribe(show) +runner = AgentRunner(agent) + +print("=" * 60) +print(f"实时测试: {model.base_url} / {MODEL_NAME}") +print(f"system prompt: {len(system_prompt)} 字符, tools: {len(default_tools())} 个") +print("=" * 60) + +runner.run("请用 bash 工具执行命令: echo hello-from-haocode && ls,然后告诉我输出结果。") + +print("\n===== 最终消息链 =====") +for m in agent.state.messages: + tc = f" tool_calls={[t.name for t in m.tool_calls]}" if m.tool_calls else "" + print(f"- {m.role}: {(m.content or '')[:100]!r}{tc}") + +ok = any(m.role == "toolResult" for m in agent.state.messages) +print("\n===== 结论:", "✅ 真实 tool_call 被发出并执行" if ok + else "❌ 没有工具执行(可能供应商不支持 tools API,检查是否走了文字兜底)", "=====") +sys.exit(0 if ok else 1) diff --git a/tests/diag_live_onscreen.py b/tests/diag_live_onscreen.py new file mode 100644 index 0000000..afddc14 --- /dev/null +++ b/tests/diag_live_onscreen.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +"""E2E onscreen:真实可见窗口 + 真实 API + 流式过程中多点采样 DOM。 +复现用户环境(非 offscreen,rAF 行为与真实窗口一致)。 +运行: python tests/diag_live_onscreen.py (会在桌面弹出窗口) +""" +import json +import os +import sys +import time + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.pop("QT_QPA_PLATFORM", None) # onscreen +os.environ.setdefault("HAOCODE_RENDER", "software") + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 + +from core.agent.types import AssistantMessageEvent # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +window = None +results = [] + +SNAP_BUF_JS = ( + "(function() {" + " var w = document.getElementById('msg-e2e-text');" + " if (!w) return 'no-wrapper';" + " var segs = w.querySelectorAll('.md-segment');" + " var out = [];" + " for (var i = 0; i < segs.length; i++) {" + " out.push('buf:' + ((segs[i].__buf || '').length)" + " + '/dom:' + ((segs[i].textContent || '').length));" + " }" + " return out.join(' ') || 'no-segs';" + "})()" +) + +SNAP_JS = ( + "(function() {" + " var w = document.getElementById('msg-e2e-text');" + " if (!w) return 'no-wrapper';" + " var segs = w.querySelectorAll('.md-segment');" + " var n = 0;" + " for (var i = 0; i < segs.length; i++)" + " if ((segs[i].textContent || '').trim()) n++;" + " return 'segs=' + segs.length + ' nonempty=' + n +" + " ' chip=' + !!w.querySelector('.tool-chip') +" + " ' streaming=' + w.classList.contains('streaming');" + "})()" +) + +FINAL_JS = """ +(function() { + try { + var w = document.getElementById('msg-e2e-text'); + if (!w) return JSON.stringify({error: 'no wrapper'}); + var tl = w.querySelector('.reply-content'); + var blocks = Array.prototype.map.call(tl.children, + function(el) { return el.className.split(' ')[0]; }); + var segs = w.querySelectorAll('.md-segment'); + var segTexts = Array.prototype.map.call(segs, + function(x) { return (x.textContent || '').slice(0, 80); }); + var chip = w.querySelector('.tool-chip'); + return JSON.stringify({blocks: blocks, segTexts: segTexts, + chip: !!chip, streaming: w.classList.contains('streaming')}); + } catch (e) { return JSON.stringify({error: String(e)}); } +})() +""" + + +def check(name, ok, detail=""): + print(f" {'PASS' if ok else 'FAIL'} {name}" + + (f" [{detail}]" if detail and not ok else "")) + results.append(ok) + + +def step1(): + global window + window = MainWindow() + window.show() + QTimer.singleShot(3500, step2) + + +def step2(): + from core.llm_engine import AgentWorker + import core.llm_engine as le + db = window.db + sess = db.create_session("E2E onscreen 测试") + sid = sess["id"] + mid = "msg-e2e-text" + user_row = db.add_message(sid, "user", "测试问题", None) + window.current_session_id = sid + window.chat_bridge.create_message(mid, "assistant", "", "E2E") + window._active_streams[sid] = { + "msg_id": mid, "content": "", "reasoning": "", + "timeline": [], "tl_kind": None, + "parent_id": user_row["id"], "branch_info": None, "worker": None, + "previous_leaf_id": user_row["id"], + } + + real_stream = le.openai_stream + + def logging_stream(context, model, signal, max_tokens, tools=None): + for kind, payload in real_stream(context, model, signal, + max_tokens, tools): + t = getattr(payload, "type", kind) + if t in ("text_delta", "thinking_delta", "toolcall_delta"): + txt = str(getattr(payload, "text", ""))[:25] + print(f" [stream] {t} {txt!r}", flush=True) + else: + print(f" [stream] {kind}/{t}", flush=True) + yield kind, payload + + le.openai_stream = logging_stream + worker = AgentWorker(provider_name=window.current_provider, + model_name=window.current_model, + openai_messages=[{"role": "user", + "content": "运行命令 echo hello-from-onscreen " + "并告诉我输出内容"}], + enable_tools=True) + + worker.reasoning_received.connect(lambda t: window.on_reasoning_received(sid, t)) + worker.chunk_received.connect(lambda t: window.on_chunk_received(sid, t)) + worker.tool_execution_started.connect( + lambda cid, name, args: window._on_tool_started(sid, cid, name, args)) + worker.tool_execution_updated.connect( + lambda cid, text: window._on_tool_updated(sid, cid, text)) + worker.tool_execution_finished.connect( + lambda cid, name, ok, text: window._on_tool_finished(sid, cid, name, ok, text)) + worker.error_occurred.connect( + lambda err: (print(" [worker error]", err, flush=True), + window.on_error(sid, err))) + worker.finished.connect(lambda: window.on_reply_finished(sid)) + window._active_streams[sid]["worker"] = worker + worker.start() + print("worker started(窗口已可见,观察屏幕)...", flush=True) + + def snapshot(tag): + window.browser.page().runJavaScript( + SNAP_JS, + lambda v, tag=tag: print(f" [snapshot {tag}] {v}", flush=True)) + window.browser.page().runJavaScript( + SNAP_BUF_JS, + lambda v, tag=tag: print(f" [snapshot {tag} BUF] {v}", flush=True)) + + QTimer.singleShot(8000, lambda: snapshot("t+8s")) + QTimer.singleShot(15000, lambda: snapshot("t+15s")) + QTimer.singleShot(25000, lambda: snapshot("t+25s")) + QTimer.singleShot(45000, step3) + + +def step3(): + def got(res): + d = json.loads(str(res)) + if "error" in d: + check("E2E DOM", False, d["error"]) + finish() + return + print(f" blocks = {d['blocks']}") + print(f" segTexts = {d['segTexts']}") + print(f" chip={d['chip']} streaming={d['streaming']}") + check("live 正文段非空", any(t.strip() for t in d["segTexts"]), + str(d["segTexts"])) + check("最终回答含命令输出", + any("hello-from-onscreen" in t for t in d["segTexts"]), + str(d["segTexts"])) + check("工具 chip 存在", d["chip"]) + check("streaming 已收尾", not d["streaming"]) + finish() + + window.browser.page().runJavaScript(FINAL_JS, got) + + +def finish(): + try: + window.db.delete_session(window.current_session_id) + except Exception: + pass + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: " + f"{sum(results)}/{len(results)} =====") + app.quit() + + +QTimer.singleShot(500, step1) +app.exec() diff --git a/tests/diag_live_text.py b/tests/diag_live_text.py new file mode 100644 index 0000000..4c79a58 --- /dev/null +++ b/tests/diag_live_text.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +"""E2E live 测试:真实 AgentWorker + 假流式 + 真实 MainWindow 信号链路。 +验证 live 时正文 md-segment 是否有内容(用户报告的 bug)。 +运行: QT_QPA_PLATFORM=offscreen python tests/diag_live_text.py +""" +import json +import os +import sys +import time + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 + +from core.agent.types import (AssistantMessageEvent, AgentMessage, ToolCall) # noqa: E402 +from core.agent import stream_fn as sf # noqa: E402 +from core.agent.tools import default_tools # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +window = None +results = [] +CALL_STATE = {"n": 0} + + +def check(name, ok, detail=""): + print(f" {'PASS' if ok else 'FAIL'} {name}" + + (f" [{detail}]" if detail and not ok else "")) + results.append(ok) + + +# ---- 假 stream_fn:第 1 轮 思考+文本+bash 工具调用;第 2 轮 最终回答 ---- +def fake_stream(context, model, signal, max_tokens, tools=None): + CALL_STATE["n"] += 1 + n = CALL_STATE["n"] + if n == 1: + yield ("event", AssistantMessageEvent(type="thinking_delta", text="我先看看")) + yield ("event", AssistantMessageEvent(type="thinking_delta", text="目录。")) + yield ("event", AssistantMessageEvent(type="text_delta", text="我来执行命令")) + yield ("event", AssistantMessageEvent(type="toolcall_delta", + tool_call_index=0, tool_call_field="id", tool_call_delta="call-e2e-1")) + yield ("event", AssistantMessageEvent(type="toolcall_delta", + tool_call_index=0, tool_call_field="name", tool_call_delta="bash")) + yield ("event", AssistantMessageEvent(type="toolcall_delta", + tool_call_index=0, tool_call_field="arguments", + tool_call_delta='{"command": "echo e2e-ok"}')) + time.sleep(0.3) + yield ("final", AgentMessage( + role="assistant", stop_reason="stop", + tool_calls=[ToolCall(id="call-e2e-1", name="bash", + raw_arguments='{"command": "echo e2e-ok"}')])) + else: + for tok in ["最终", "回答", ":任务", "完成。"]: + yield ("event", AssistantMessageEvent(type="text_delta", text=tok)) + time.sleep(0.05) + yield ("final", AgentMessage(role="assistant", stop_reason="stop")) + + +def step1(): + global window + window = MainWindow() + QTimer.singleShot(3500, step2) + + +def step2(): + from core.llm_engine import AgentWorker + db = window.db + sess = db.create_session("E2E 正文测试") + sid = sess["id"] + mid = "msg-e2e-text" + user_row = db.add_message(sid, "user", "测试问题", None) + window.current_session_id = sid + window.chat_bridge.create_message(mid, "assistant", "", "E2E") + window._active_streams[sid] = { + "msg_id": mid, "content": "", "reasoning": "", + "timeline": [], "tl_kind": None, + "parent_id": user_row["id"], "branch_info": None, "worker": None, + "previous_leaf_id": user_row["id"], + } + + # 真实 API + 流事件日志(定位 text_delta 是否到达) + import core.llm_engine as le + real_stream = le.openai_stream + def logging_stream(context, model, signal, max_tokens, tools=None): + n_ev = 0 + for kind, payload in real_stream(context, model, signal, + max_tokens, tools): + t = getattr(payload, "type", kind) + txt = str(getattr(payload, "text", ""))[:30] + if t not in ("text_delta", "thinking_delta", "toolcall_delta"): + print(f" [stream] {kind}/{t}", flush=True) + else: + n_ev += 1 + if n_ev <= 6 or n_ev % 20 == 0: + print(f" [stream] {t} {txt!r}", flush=True) + yield kind, payload + le.openai_stream = logging_stream + worker = AgentWorker(provider_name=window.current_provider, + model_name=window.current_model, + openai_messages=[{"role": "user", + "content": "运行命令 echo hello-from-diag 并告诉我输出"}], + enable_tools=True) + + # 与 send_message 相同的信号连接 + worker.reasoning_received.connect(lambda t: window.on_reasoning_received(sid, t)) + worker.chunk_received.connect(lambda t: window.on_chunk_received(sid, t)) + worker.tool_execution_started.connect( + lambda cid, name, args: window._on_tool_started(sid, cid, name, args)) + worker.tool_execution_updated.connect( + lambda cid, text: window._on_tool_updated(sid, cid, text)) + worker.tool_execution_finished.connect( + lambda cid, name, ok, text: window._on_tool_finished(sid, cid, name, ok, text)) + worker.error_occurred.connect(lambda err: (print(' [worker error]', err), window.on_error(sid, err))) + worker.finished.connect(lambda: window.on_reply_finished(sid)) + + window._active_streams[sid]["worker"] = worker + worker.start() + print("worker started, 等待流结束...") + QTimer.singleShot(40000, step3) + + +def step3(): + # live DOM 检查(不重载 DB) + js = """ + (function() { + try { + var w = document.getElementById('msg-e2e-text'); + if (!w) return JSON.stringify({error: 'no wrapper'}); + var tl = w.querySelector('.reply-content'); + var blocks = Array.prototype.map.call(tl.children, + function(el) { return el.className.split(' ')[0]; }); + var segs = w.querySelectorAll('.md-segment'); + var segTexts = Array.prototype.map.call(segs, + function(x) { return x.textContent; }); + var thinks = w.querySelectorAll('.think-content'); + var thinkTexts = Array.prototype.map.call(thinks, + function(x) { return x.textContent; }); + var chip = w.querySelector('.tool-chip'); + return JSON.stringify({blocks: blocks, segTexts: segTexts, + thinkTexts: thinkTexts, chip: !!chip, + streaming: w.classList.contains('streaming')}); + } catch (e) { return JSON.stringify({error: String(e)}); } + })() + """ + def got(res): + d = json.loads(str(res)) + if "error" in d: + check("E2E DOM", False, d["error"]) + finish() + return + print(f" blocks = {d['blocks']}") + print(f" segTexts = {d['segTexts']}") + print(f" thinkTexts = {d['thinkTexts']}") + print(f" chip = {d['chip']} streaming={d['streaming']}") + check("live 正文段有内容(至少一段非空)", + any((t or "").strip() for t in d["segTexts"]), + str(d["segTexts"])) + check("live 最终回答含命令输出", + any("hello-from-diag" in (t or "") for t in d["segTexts"]), + str(d["segTexts"])) + check("live 思考段有内容(或模型未思考)", + True, str(d["thinkTexts"])[:80]) + check("live 工具 chip 存在", d["chip"]) + check("streaming 已收尾", not d["streaming"]) + # 时间线入库检查 + st = window._active_streams.get(sid := window.current_session_id) + tl = window.db.get_session(window.current_session_id) if False else None + finish() + + window.browser.page().runJavaScript(js, got) + + +def finish(): + try: + window.db.delete_session(window.current_session_id) + except Exception: + pass + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: " + f"{sum(results)}/{len(results)} =====") + app.quit() + + +QTimer.singleShot(500, step1) +app.exec() diff --git a/tests/diag_panel_scrollbar.py b/tests/diag_panel_scrollbar.py new file mode 100644 index 0000000..4d657c5 --- /dev/null +++ b/tests/diag_panel_scrollbar.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +"""P2-02 诊断:右侧 Bash 面板滚动条与横纵交汇角(离屏) + +测量并断言: + S1 代码框(#bl_code)横滚动条实际厚度 = 8px、sizeHint 一致 + S2 代码框竖滚动条实际厚度 = 8px、sizeHint 一致 + S3 section 滚动区(#bl_scroll)竖滚动条实际厚度 = 8px + S4 面板滚动条箭头 extent = 0(箭头隐藏) + S5 交汇角像素 = 代码框背景 #fbfcfe(无原生亮色 corner 方块) + S6 无泄漏:未命名 QPlainTextEdit 的滚动条仍是原生口径(≠8px、箭头>0) + S7 无泄漏:附件预览滚动条保持自身 6px 口径 +并生成局部截图(面板全貌 + 代码框角落放大)打印测量值。 + +运行: QT_QPA_PLATFORM=offscreen python tests/diag_panel_scrollbar.py +""" +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost +os.environ.setdefault("PYTHONIOENCODING", "utf-8") + +# 铁律(P0-01):临时数据库 + 临时配置必须在 import MainWindow 之前完成 +from tests._test_env import isolate # noqa: E402 +_TMP = isolate("panelscroll", config={"providers": {}, "mode_switch": True}) +_DB_TMP = _TMP["db"] +_CFG_TMP = _TMP["config"] + +from PyQt6.QtWidgets import (QApplication, QPlainTextEdit, QStyle, # noqa: E402 + QStyleOptionSlider) # noqa: E402 +from PyQt6.QtTest import QTest # noqa: E402 +from PyQt6.QtCore import Qt # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +ok = True +OUT_DIR = os.path.join(os.path.dirname(__file__), "..", "docs", "agent-handoff", "evidence") + + +def check(name, cond, extra=""): + global ok + print((" PASS " if cond else " FAIL ") + name + ("" if cond else f" {extra}"), flush=True) + if not cond: + ok = False + + +def settle(ms=300): + for _ in range(int(ms / 20) + 1): + app.processEvents() + QTest.qWait(20) + + +def arrow_extent(sb, orient=Qt.Orientation.Vertical): + """滚动条箭头子控件(sub-line)的实际尺寸(px):QSS 把 add-line/sub-line 置 0 后应为 0。 + 用 sb.style()(样式表代理风格)才能反映 QSS 效果;PyQt6 参数序 = (cc, opt, sc, widget)。 + 返回 -2 表示无法测量(样式代理缺失等),调用方不得把 -2 当作 0。""" + try: + st = sb.style() + if orient == Qt.Orientation.Vertical: + return st.subControlRect(QStyle.ComplexControl.CC_ScrollBar, + QStyleOptionSlider(), + QStyle.SubControl.SC_ScrollBarSubLine, sb).height() + return st.subControlRect(QStyle.ComplexControl.CC_ScrollBar, + QStyleOptionSlider(), + QStyle.SubControl.SC_ScrollBarSubLine, sb).width() + except Exception as e: + print(f" (arrow_extent 测量异常: {e})", flush=True) + return -1 + + +window = MainWindow() +window.resize(1400, 800) +window.show() +settle(400) +panel = window.bash_panel +panel.expand_btn.click() +settle(500) + +# ---- 造数据:一个展开的层,out_box 同时触发横/纵滚动条 ---- +panel.on_started("sc1", "bash", {"command": "python long_report.py --all --verbose"}) +panel.on_finished("sc1", "bash", True, + "$ python long_report.py --all --verbose\n" + + "\n".join(f"line-{i:03d}" for i in range(60)) + + "\n[exit 0] (1.2s)") +settle(300) +lay = panel._layers["sc1"] +lay.toggle() +settle(200) +# 超宽单行(NoWrap)→ 横向滚动条;再追加 60 行 → 同时触发纵向滚动条 +panel._layers["sc1"].out_box.setPlainText("X" * 3000 + "\n" + + "\n".join(f"tail-{i:03d}" for i in range(60))) +settle(200) + +ob = lay.out_box +sbh = ob.horizontalScrollBar() +sbv = ob.verticalScrollBar() +check("S0.1 前置:横滚动条可见(超宽单行)", sbh.isVisible(), str(sbh.isVisible())) +check("S0.2 前置:竖滚动条可见(60+ 行超出 230px 上限)", sbv.isVisible(), str(sbv.isVisible())) + +# ---- S1/S2 代码框滚动条厚度 ---- +check("S1 代码框横滚动条实际厚度 = 8px", sbh.height() == 8, f"h={sbh.height()}") +check("S1b 代码框横滚动条 sizeHint 厚 = 8px", sbh.sizeHint().height() == 8, + f"{sbh.sizeHint().height()}") +check("S2 代码框竖滚动条实际厚度 = 8px", sbv.width() == 8, f"w={sbv.width()}") +check("S2b 代码框竖滚动条 sizeHint 宽 = 8px", sbv.sizeHint().width() == 8, + f"{sbv.sizeHint().width()}") + +# ---- S3 section 滚动区竖滚动条厚度 ---- +# 让运行中栏溢出:再加 12 个已完成层(复用 P11 的溢出手法不必,层数即可) +for i in range(12): + cid = f"scf{i}" + panel.on_started(cid, "bash", {"command": f"cmd-{cid}"}) + panel.on_finished(cid, "bash", True, f"$ cmd-{cid}\nok\n[exit 0] (0.1s)") +settle(300) +sdv = panel.sec_done.scroll.verticalScrollBar() +check("S0.3 前置:已完成栏溢出、竖滚动条可见", sdv.isVisible(), str(sdv.isVisible())) +check("S3 section 竖滚动条实际厚度 = 8px", sdv.width() == 8, f"w={sdv.width()}") + +# ---- S4 箭头 extent ---- +print(f" 测量:代码框 H 箭头 extent = {arrow_extent(sbh, Qt.Orientation.Horizontal)}px, " + f"V = {arrow_extent(sbv)}px; section V = {arrow_extent(sdv)}px", + flush=True) +check("S4 代码框横滚动条箭头 extent = 0", arrow_extent(sbh, Qt.Orientation.Horizontal) == 0, + str(arrow_extent(sbh, Qt.Orientation.Horizontal))) +check("S4b 代码框竖滚动条箭头 extent = 0", arrow_extent(sbv) == 0, str(arrow_extent(sbv))) +check("S4c section 竖滚动条箭头 extent = 0", arrow_extent(sdv) == 0, str(arrow_extent(sdv))) + +# ---- S5 交汇角(render 到透明 pixmap 取样;offscreen 下文档区背景不填充, +# 但样式子控件(滚动条/边框/corner)正常渲染,可直接断言)---- +from PyQt6.QtGui import QPainter, QPixmap # noqa: E402 +w, h = ob.width(), ob.height() +pm = QPixmap(w, h); pm.fill(Qt.GlobalColor.transparent) +pr = QPainter(pm); ob.render(pr); pr.end() +img = pm.toImage() +def px_at(x, y): + c = img.pixelColor(x, y) + return (c.red(), c.green(), c.blue()) +CORNER_BG = (0xfb, 0xfc, 0xfe) # #bl_code 背景色 = QSS 里 corner 规则的目标色 +n_bg = n_white = 0 +for dy in range(8): + for dx in range(8): + c = px_at(w - 1 - dx, h - 1 - dy) + if c == CORNER_BG: + n_bg += 1 + if c == (255, 255, 255): + n_white += 1 +# 健全性:样式确已作用到该框(文本色 #243043 与 handle #d0d0d0 应在渲染图中出现) +n_text = sum(1 for y in range(0, h, 2) for x in range(0, w, 2) + if px_at(x, y) == (0x24, 0x30, 0x43)) +n_handle = sum(1 for y in range(h - 10, h) for x in range(0, w - 12, 2) + if px_at(x, y) == (0xd0, 0xd0, 0xd0)) +print(f" 测量:corner 8x8 内 #fbfcfe 像素 = {n_bg},亮白(255,255,255)像素 = {n_white}," + f"文本色像素 = {n_text},handle色像素 = {n_handle}", flush=True) +check("S5 健全性:样式已作用于该框(文本色出现)", n_text > 0, f"n_text={n_text}") +check("S5b 健全性:handle #d0d0d0 出现在横滚动条带", n_handle > 0, f"n_handle={n_handle}") +check("S5c 交汇角渲染出 #fbfcfe(= 代码框背景,::corner 规则生效)", + n_bg >= 1, f"n_bg={n_bg}") +check("S5d 交汇角无原生亮白方块(255,255,255)", n_white == 0, f"n_white={n_white}") +img.save(os.path.join(OUT_DIR, "p2-02-outbox-render.png")) + +# ---- S6 无泄漏:未命名 QPlainTextEdit 仍为原生口径 ---- +probe = QPlainTextEdit() +probe.setPlainText("Y" * 3000) +probe.resize(200, 120) +probe.show() +settle(150) +psb = probe.horizontalScrollBar() +probe_sb_extent = arrow_extent(psb, Qt.Orientation.Horizontal) +check("S6 未命名代码框横滚动条非面板口径(原生厚≠8 或 有箭头)", + (psb.height() != 8) or probe_sb_extent > 0, + f"h={psb.height()} extent={probe_sb_extent}") +probe.close() + +# ---- S7 无泄漏:附件预览滚动条保持自身 6px 口径 ---- +att_sb = window.attachment_scroll_area.horizontalScrollBar() +att_hint_h = att_sb.sizeHint().height() +check("S7 附件预览横滚动条保持 6px(自身 QSS 未被面板规则覆盖)", + att_hint_h == 6, f"sizeHint.h={att_hint_h}") + +# ---- 截图(局部:面板全貌 + 代码框角落放大 4x)---- +# 注意:offscreen 下 ob.grab() 的文档区不填充(黑图),角落放大图从 S5 的 +# render 图(样式子控件已正常渲染)裁出,才有证据价值 +os.makedirs(OUT_DIR, exist_ok=True) +panel_path = os.path.join(OUT_DIR, "p2-02-panel.png") +panel.grab().save(panel_path) +crop = img.copy(max(0, w - 60), max(0, h - 60), 60, 60) +scaled = crop.scaled(240, 240, + Qt.AspectRatioMode.KeepAspectRatio, + Qt.TransformationMode.FastTransformation) +corner_path = os.path.join(OUT_DIR, "p2-02-codebox-corner-4x.png") +scaled.save(corner_path) +print(f" 截图:{panel_path}", flush=True) +print(f" 截图:{corner_path}(代码框右下角 60x60 → 4x)", flush=True) + +# ---- 收尾测量汇总 ---- +print(f"\n 汇总:代码框 H={sbh.height()}px V={sbv.width()}px | " + f"section V={sdv.width()}px | corner #fbfcfe 像素={n_bg} | " + f"未命名框 H={psb.height()}px extent={probe_sb_extent} | 附件 H hint={att_hint_h}px", + flush=True) + +print("\n===== " + ("ALL PASS" if ok else "HAS FAILURES") + " =====", flush=True) +if os.path.exists(_DB_TMP): + os.remove(_DB_TMP) +if os.path.exists(_CFG_TMP): + os.remove(_CFG_TMP) +# offscreen 铁律:os._exit 强制收尾(QtWebEngine 子进程可能不回收) +os._exit(0 if ok else 1) diff --git a/tests/diag_rename_overlay.py b/tests/diag_rename_overlay.py new file mode 100644 index 0000000..677acf2 --- /dev/null +++ b/tests/diag_rename_overlay.py @@ -0,0 +1,262 @@ +# -*- coding: utf-8 -*- +"""P2-03 结构+行为诊断:重命名遮罩 = 独立顶层透明窗(可盖住 WebView2 原生子窗)。 + +覆盖修复目标与硬约束: + R1 结构:顶层窗(非 bg_widget 子控件)、Tool+无边框、WA_TranslucentBackground、WA_DeleteOnClose + R2 几何:覆盖主窗口客户区(标题栏/窗口控制不被盖)、卡片居中、输入框初始全选 + R3 跟随:主窗口移动/缩放/窗口状态变化 → 遮罩同步(move/resize/WindowStateChange 事件过滤器) + R4 行为:Enter 提交(renamed 信号→DB+侧栏)、Esc 关闭、点空白关闭、✕ 关闭、取消关闭 + R5 释放:关闭后顶层窗口消失、无残留(deleteLater + 事件过滤器卸载) + R6 焦点(软检查,仅打印):关闭后焦点回主窗口 + +隔离 + offscreen;os._exit 收尾。 +用法: QT_QPA_PLATFORM=offscreen HAOCODE_RENDER=software .venv/Scripts/python.exe tests/diag_rename_overlay.py +""" +import os +import sys +import time + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ.setdefault("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-gpu") + +from tests._test_env import isolate +isolate() + +from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6.QtTest import QTest +from ui.views.main_window import MainWindow, RenameOverlay + +results = [] + + +def check(name, cond, info=""): + ok = bool(cond) + results.append((name, ok)) + print(f" [{'PASS' if ok else 'FAIL'}] {name} {info}", flush=True) + + +def settle(ms=120): + t0 = time.time() + while (time.time() - t0) * 1000 < ms: + QtWidgets.QApplication.processEvents() + time.sleep(0.01) + # offscreen 无真实事件循环:processEvents 不处理 DeferredDelete,显式冲刷(生产中事件循环常驻,deleteLater 正常) + QtCore.QCoreApplication.sendPostedEvents(None, QtCore.QEvent.Type.DeferredDelete) + QtWidgets.QApplication.processEvents() + + +def find_overlay(): + for w in QtWidgets.QApplication.topLevelWidgets(): + if isinstance(w, RenameOverlay): + return w + return None + + +def main(): + app = QtWidgets.QApplication(sys.argv) + window = MainWindow() + window.resize(1400, 800) + window.show() + settle(400) + + sid = window.db.create_session("旧标题A")["id"] + window.rebuild_sidebar() + settle(150) + + # ---------- 打开遮罩 ---------- + window._rename_session(sid) + settle(250) # 含 150ms 入场动画 + ov = find_overlay() + check("R0.1 overlay 已创建且为顶层窗口", ov is not None, + "" if ov is not None else "topLevelWidgets 中找不到 RenameOverlay") + if ov is None: + print(f"\n{'='*60}\nRESULT: 1 FAIL -> FAIL\n{'='*60}", flush=True) + os._exit(1) + + # ---------- R1 结构 ---------- + print("R1 结构(独立顶层透明窗)", flush=True) + check("R1.1 isWindow()", ov.isWindow()) + check("R1.2 自身即顶层窗口(非 bg_widget 内嵌子控件)", ov.window() is ov, + f"window() is ov={ov.window() is ov}") + check("R1.3 非主窗口自身", ov is not window) + check("R1.4 Tool 窗(不入任务栏)", bool(ov.windowFlags() & QtCore.Qt.WindowType.Tool)) + check("R1.5 无边框", bool(ov.windowFlags() & QtCore.Qt.WindowType.FramelessWindowHint)) + check("R1.6 WA_TranslucentBackground", ov.testAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground)) + check("R1.7 WA_DeleteOnClose", ov.testAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose)) + check("R1.8 主窗口未设 WA_TranslucentBackground(保持原生不透明底)", + not window.testAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground)) + + # ---------- R2 几何 ---------- + print("R2 几何(覆盖客户区,标题栏可操作)", flush=True) + exp_tl = window.mapToGlobal(window.rect().topLeft()) + exp_size = window.rect().size() + g = ov.geometry() + check("R2.1 覆盖客户区左上角", abs(g.left() - exp_tl.x()) <= 2 and abs(g.top() - exp_tl.y()) <= 2, + f"overlay=({g.left()},{g.top()}) expect=({exp_tl.x()},{exp_tl.y()})") + check("R2.2 覆盖客户区尺寸", abs(g.width() - exp_size.width()) <= 2 and abs(g.height() - exp_size.height()) <= 2, + f"overlay={g.width()}x{g.height()} expect={exp_size.width()}x{exp_size.height()}") + fx, fy = (g.width() - ov.form.width()) // 2, (g.height() - ov.form.height()) // 2 + check("R2.3 卡片居中", abs(ov.form.x() - fx) <= 2 and abs(ov.form.y() - fy) <= 2, + f"form=({ov.form.x()},{ov.form.y()}) expect=({fx},{fy})") + check("R2.4 输入框初始全选", ov.input.hasSelectedText(), f"text={ov.input.text()!r}") + check("R2.5 输入框预填旧标题", ov.input.text() == "旧标题A", f"text={ov.input.text()!r}") + + # ---------- R3 跟随 ---------- + print("R3 跟随(move/resize/状态变化)", flush=True) + base = window.pos() + window.move(base.x() + 150, base.y() + 80) + settle(150) + exp_tl2 = window.mapToGlobal(window.rect().topLeft()) + check("R3.1 主窗口移动→遮罩跟随", abs(ov.geometry().left() - exp_tl2.x()) <= 2 + and abs(ov.geometry().top() - exp_tl2.y()) <= 2, + f"overlay_tl=({ov.geometry().left()},{ov.geometry().top()}) expect=({exp_tl2.x()},{exp_tl2.y()})") + + window.resize(1200, 700) + settle(150) + g2 = ov.geometry() + check("R3.2 主窗口缩放→遮罩同步尺寸", + abs(g2.width() - 1200) <= 4 and abs(g2.height() - 700) <= 4, + f"overlay={g2.width()}x{g2.height()} expect=1200x700") + fx2 = (g2.width() - ov.form.width()) // 2 + check("R3.3 缩放后卡片重新居中", abs(ov.form.x() - fx2) <= 2, f"form.x={ov.form.x()} expect={fx2}") + + # WindowStateChange 分支(最大化/还原走同一条 _sync_geometry 路径;offscreen 直接投递事件验证分支) + before = ov.geometry() + QtWidgets.QApplication.sendEvent(window, QtCore.QEvent(QtCore.QEvent.Type.WindowStateChange)) + QtWidgets.QApplication.processEvents() + check("R3.4 WindowStateChange 分支不崩溃且几何仍正确", + abs(ov.geometry().width() - 1200) <= 4 and ov is find_overlay(), + f"geometry={ov.geometry().width()}x{ov.geometry().height()}") + + # ---------- R4 行为 ---------- + print("R4 行为", flush=True) + # R4.1 Enter 提交 → renamed 信号 → DB + 侧栏 + ov.input.setText("P203新会话名") + ov.confirm() + settle(250) + sessions = {s["id"]: s for s in window.db.get_all_sessions()} + check("R4.1a confirm 后 DB 标题已更新", sessions.get(sid, {}).get("title") == "P203新会话名", + f"db_title={sessions.get(sid, {}).get('title')!r}") + side_ok = False + for i in range(window.history_list.count()): + it = window.history_list.item(i) + if it and it.data(QtCore.Qt.ItemDataRole.UserRole) == sid: + w = window.history_list.itemWidget(it) + if w and hasattr(w, "title_label") and w.title_label.text() == "P203新会话名": + side_ok = True + check("R4.1b confirm 后侧栏标题已更新", side_ok) + check("R4.1c 提交后 overlay 已从顶层窗口消失", find_overlay() is None) + + # R4.2 空标题 confirm 不提交(只关闭) + window._rename_session(sid) + settle(200) + ovz = find_overlay() + if ovz: + ovz.input.clear() + ovz.confirm() + settle(200) + sessions = {s["id"]: s for s in window.db.get_all_sessions()} + check("R4.2 空标题 confirm 不改 DB 标题", + sessions.get(sid, {}).get("title") == "P203新会话名", + f"db_title={sessions.get(sid, {}).get('title')!r}") + + check("R4.2b 空标题确认后 overlay 已消失", find_overlay() is None) + + # R4.3 Esc 关闭 + window._rename_session(sid) + settle(200) + ov2 = find_overlay() + check("R4.3a 重开 overlay", ov2 is not None) + if ov2: + QtWidgets.QApplication.sendEvent( + ov2, QtGui.QKeyEvent(QtCore.QEvent.Type.KeyPress, QtCore.Qt.Key.Key_Escape, + QtCore.Qt.KeyboardModifier.NoModifier, "Esc")) + QtWidgets.QApplication.sendEvent( + ov2, QtGui.QKeyEvent(QtCore.QEvent.Type.KeyRelease, QtCore.Qt.Key.Key_Escape, + QtCore.Qt.KeyboardModifier.NoModifier, "Esc")) + QtWidgets.QApplication.processEvents() + settle(200) + check("R4.3b Esc 关闭", find_overlay() is None) + + # R4.4 点空白关闭 + window._rename_session(sid) + settle(200) + ov3 = find_overlay() + check("R4.4a 重开 overlay", ov3 is not None) + if ov3: + QTest.mouseClick(ov3, QtCore.Qt.MouseButton.LeftButton, + QtCore.Qt.KeyboardModifier.NoModifier, QtCore.QPoint(10, 10)) + settle(200) + check("R4.4b 点空白关闭", find_overlay() is None) + + # R4.5 ✕ 关闭 + window._rename_session(sid) + settle(200) + ov4 = find_overlay() + check("R4.5a 重开 overlay", ov4 is not None) + if ov4: + btn_x = None + for b in ov4.form.findChildren(QtWidgets.QPushButton): + if b.text() == "✕": + btn_x = b + break + check("R4.5b ✕ 按钮存在", btn_x is not None) + if btn_x: + btn_x.click() + settle(200) + check("R4.5c ✕ 关闭", find_overlay() is None) + + # R4.6 取消按钮关闭 + window._rename_session(sid) + settle(200) + ov5 = find_overlay() + if ov5: + for b in ov5.form.findChildren(QtWidgets.QPushButton): + if b.text() == "取消": + b.click() + break + settle(200) + check("R4.6 取消按钮关闭", find_overlay() is None) + + # R4.7 非确认关闭(Esc/空白/✕/取消)均不改标题 + sessions = {s["id"]: s for s in window.db.get_all_sessions()} + check("R4.7 非确认关闭不改 DB 标题", + sessions.get(sid, {}).get("title") == "P203新会话名", + f"db_title={sessions.get(sid, {}).get('title')!r}") + + # ---------- R5 释放 ---------- + print("R5 释放(无残留)", flush=True) + check("R5.1 无残留 rename_form 顶层窗口", + not [w for w in QtWidgets.QApplication.topLevelWidgets() + if w.findChild(QtWidgets.QFrame, "rename_form") is not None]) + check("R5.2 主窗口仍存活可用", window.isVisible() and window.db.get_all_sessions() is not None) + + # ---------- R6 焦点(软检查) ---------- + print("R6 焦点回主窗口(软检查)", flush=True) + window.activateWindow() + settle(200) + print(f" [INFO] window.isActiveWindow()={window.isActiveWindow()} " + f"(offscreen 下不可靠,仅记录;真实机器人工走查确认)", flush=True) + + window.close() + app.processEvents() + ok = all(o for _, o in results) + print(f"\n{'='*60}", flush=True) + print(f"RESULT: {sum(o for _, o in results)}/{len(results)} -> {'ALL PASS' if ok else 'FAIL'}", flush=True) + print(f"{'='*60}", flush=True) + sys.stdout.flush() + os._exit(0 if ok else 1) + + +if __name__ == "__main__": + try: + main() + except SystemExit: + raise + except BaseException: + import traceback + traceback.print_exc() + sys.stdout.flush() + os._exit(1) diff --git a/tests/diag_render_scale.py b/tests/diag_render_scale.py new file mode 100644 index 0000000..835f940 --- /dev/null +++ b/tests/diag_render_scale.py @@ -0,0 +1,336 @@ +# -*- coding: utf-8 -*- +"""P1-01 渲染窗口 400 条消息规模诊断(offscreen;临时 DB + 临时配置;不启动真实 LLM) + +运行: QT_QPA_PLATFORM=offscreen python tests/diag_render_scale.py [N] + N 默认 400(位置参数可覆盖) + +验证项(manual 模式保证确定性;末尾追加 auto 模式抽查): + 1. 初始窗口:.message-wrapper == min(N, size) 且 ≤ size(默认 40); + 窗口 = 最新 size 条;load-older 可见、load-newer 隐藏; + 2. 向上分页至头部:每页锚点误差 ≤ 2px(绝对顶部例外:scrollTop==0 且露出新页); + 全程窗口 ≤ size;到达头部后 hasMoreOlder=false; + 全部 N 条消息可达(各步渲染 id 并集 == 链 id 集),无重复 id; + 3. 自头部向下回翻 2 页:锚点稳定(≤2px); + 4. 规模报告:DOM 节点总数、页面高度、每页耗时采样(ms); + 5. auto 模式抽查:切 auto + 滚到顶部 → 自动补页发生。 + +调试铁律:本脚本自带总超时(QTimer 300s),bash 侧以 timeout=360 运行。 +""" +import json +import os +import sys +import time + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" + +# 铁律:临时 DB + 临时配置(含 render_window_mode/size),先于任何 UI import +from tests._test_env import isolate, default_config # noqa: E402 + +N = int(sys.argv[1]) if len(sys.argv) > 1 else 400 +_SIZE = 40 +_PAGE = _SIZE // 2 # 页大小 = 半窗(与 main_window._rw_page_size 一致) +_cfg = dict(default_config()) +_cfg["render_window_mode"] = "manual" # 确定性诊断;auto 行为末尾单独抽查 +_cfg["render_window_size"] = _SIZE +_env = isolate("render_scale", config=_cfg) + +import core.db_manager as _dbm # noqa: E402 +from core.db_manager import DBManager # noqa: E402 + +# ---------- 造数:N 条链(含附件用户消息 / assistant 时间线 / 一个分支兄弟) ---------- +db = DBManager() +sess = db.create_session(title=f"P1-01 scale {N}") +sid = sess["id"] +parent = None +chain_ids = [] +for i in range(N): + role = "user" if i % 2 == 0 else "assistant" + content = f"消息 {i} —— " + "这是一段用于撑起 DOM 高度的填充段落。" * 6 + atts = None + if role == "user" and i % 50 == 0: + atts = json.dumps({"user_text": content, "attachments": [ + {"type": "pdf", "mode": "text", "name": f"spec_{i}.pdf", + "size_kb": 12, "pages": 3, "lines": 40, "content": "文本附件内容"} + ]}, ensure_ascii=False) + timeline = None + if role == "assistant" and i % 75 == 3: + timeline = json.dumps([ + {"t": "think", "text": f"思考片段 {i}"}, + {"t": "text", "text": f"时间线正文 {i}"}, + ], ensure_ascii=False) + msg_id = f"scale-{i}" + db.add_message(session_id=sid, role=role, content=content, parent_id=parent, + msg_id=msg_id, attachment_metadata=atts, timeline=timeline) + parent = msg_id + chain_ids.append(msg_id) + # 分支兄弟:必须插在链中间(add_message 会把新消息设为叶子, + # 若放在主链之后会抢走叶子、截断可见链) + if i == 298 and N > 300: + db.add_message(session_id=sid, role="assistant", content="分支兄弟回复", + parent_id=parent, msg_id="scale-branch-sib") +db.mark_session_has_messages(sid) + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +results = [] + + +def check(name, fn): + try: + fn() + print(f" PASS {name}") + results.append(True) + except Exception as e: + import traceback + traceback.print_exc() + print(f" FAIL {name}: {e}") + results.append(False) + + +window = None +js = {"done": False} + + +def _run_js(code, timeout_s=15): + result = {"val": None, "done": False} + + def on_ret(val): + if isinstance(val, str): + try: + val = json.loads(val) + except Exception: + pass + result["val"] = val + result["done"] = True + + if hasattr(window.browser, "execute_js_async"): + window.browser.execute_js_async(code, on_ret) + else: + window.browser.page().runJavaScript(code, on_ret) + t0 = time.time() + while not result["done"] and time.time() - t0 < timeout_s: + app.processEvents() + time.sleep(0.02) + assert result["done"], f"JS 执行超时: {code[:60]}" + return result["val"] + + +def wait_until(cond_js, timeout_s=30, desc=""): + t0 = time.time() + while time.time() - t0 < timeout_s: + if _run_js(cond_js, timeout_s=5): + return True + time.sleep(0.1) + raise AssertionError(f"等待超时: {desc}") + + +page_metrics = {"pages": [], "heights": [], "dom_nodes": []} + + +def try_load(): + global window + window = MainWindow() + # offscreen 零视口(innerHeight=0)→ 给真实尺寸,滚动/锚点几何才有效 + window.resize(1400, 950) + window.show() + for _ in range(10): + app.processEvents() + time.sleep(0.05) + # 等真实视口 + wait_until("window.innerHeight > 0 && window.innerWidth > 0", 30, "视口尺寸") + # 等 JS 就绪 + 首轮(可能零视口)渲染完成 + wait_until("window.jsReady === true", 30, "jsReady") + wait_until(f"document.querySelectorAll('#chat-container .message-wrapper').length >= {_SIZE}", + 60, "首轮渲染") + # 真实视口下走完整 load_messages_to_web 路径重新窗口化加载 + window.load_messages_to_web(window.current_session_id, show_loading=False) + wait_until(f"rwState !== null && rwState.generation >= 2 && " + f"document.querySelectorAll('#chat-container .message-wrapper').length >= {_SIZE}", + 60, "视口重载") + wait_until("(window.__rwPageRendering === false && document.getElementById('load-older') !== null) ? 1 : 0", + 10, "初始窗口收尾") + run_checks() + + +def run_checks(): + sel = "#chat-container .message-wrapper" + + # ---- 1) 初始窗口 ---- + def initial(): + cnt = _run_js(f"document.querySelectorAll('{sel}').length") + assert cnt == _SIZE, f"初始窗口 {cnt} != {_SIZE}" + st = _run_js("JSON.stringify({len: rwState.order.length, hidO: rwState.hiddenOlder, " + "hidN: rwState.hiddenNewer, older: rwState.hasMoreOlder, newer: rwState.hasMoreNewer, " + "mode: rwState.mode, size: rwState.size})") + assert st["mode"] == "manual" and st["size"] == _SIZE, st + assert st["len"] == _SIZE and st["hidO"] == N - _SIZE, st + assert st["newer"] is False and st["older"] is True, st + assert _run_js("document.getElementById('load-older').hidden") is False + assert _run_js("document.getElementById('load-newer').hidden") is True + # 窗口 = 最新 size 条 + first = _run_js(f"document.querySelector('{sel}').id") + assert first == chain_ids[N - _SIZE], first + # 初始贴底 + assert _run_js("isNearBottom()"), "初始窗口未对齐底部" + + check(f"初始窗口 = 最新 {_SIZE} 条(链长 {N})", initial) + + # ---- 2a) 中部锚点保持(真实"窗口中部换页"路径,误差 ≤2px) ---- + seen = set(chain_ids[-_SIZE:]) + anchor_errors = [] + + def page_older_once(): + """执行一次向上换页(调用方保证视口位置);断言窗口上限与锚点。""" + before = _run_js("JSON.stringify(rwCaptureAnchor() || {})") + before = json.loads(before) if isinstance(before, str) else (before or {}) + scroll_before = _run_js("window.scrollY") + t0 = time.time() + _run_js("rwRequestPage('older')") + # 等待 pending 消费 + 批次渲染收尾 + wait_until("rwState.pending === null && window.__rwPageRendering === false", + 30, "换页完成") + dt = (time.time() - t0) * 1000 + page_metrics["pages"].append(dt) + cnt = _run_js(f"document.querySelectorAll('{sel}').length") + assert cnt <= _SIZE, f"窗口超限 {cnt}" + if before.get("msgId"): + el = _run_js(f"document.getElementById({json.dumps(before['msgId'])}) ? " + f"document.getElementById({json.dumps(before['msgId'])}).getBoundingClientRect().top + window.scrollY : null") + assert el is not None, f"锚点消息被裁剪: {before['msgId']}" + if scroll_before <= 1: + # 绝对顶部:停在 0 露出新页(需求定义的例外:不做锚点断言) + assert _run_js("window.scrollY") <= 1, "绝对顶部未保持" + anchor_errors.append(0.0) + else: + expect = scroll_before + (el - before["docTop"]) + actual = _run_js("window.scrollY") + err = abs(expect - actual) + anchor_errors.append(err) + assert err <= 2.0, f"锚点误差 {err}px (expect={expect} actual={actual})" + else: + anchor_errors.append(0.0) + ids_now = _run_js(f"Array.from(document.querySelectorAll('{sel}')).map(e => e.id)") + for i in ids_now: + seen.add(i) + page_metrics["dom_nodes"].append(_run_js("document.querySelectorAll('body *').length")) + page_metrics["heights"].append(_run_js("document.body.scrollHeight")) + + def anchor_middle(): + # 滚到窗口中部(35% 处):既非绝对顶部也非贴底 → 走完整锚点数学 + _run_js("window.scrollTo(0, Math.max(1, document.body.scrollHeight * 0.15)); 1") + time.sleep(0.2) + app.processEvents() + scroll_before = _run_js("window.scrollY") + assert scroll_before > 10, f"未到中部: {scroll_before}" + assert not _run_js("isNearBottom()"), "中部位置不应贴底(防振荡前置条件)" + page_older_once() + st = _run_js("JSON.stringify({hidO: rwState.hiddenOlder, hidN: rwState.hiddenNewer})") + assert st["hidN"] > 0, f"向上换页后应裁出较新隐藏区(无振荡): {st}" + assert st["hidO"] == N - _SIZE - _PAGE, f"窗口应上移 _PAGE 条: {st}" + + check("中部锚点保持(误差≤2px,无 newer 振荡)", anchor_middle) + + # ---- 2b) 自顶部循环向上分页至头部(真实"load older"点击路径) ---- + def page_up_to_head(): + _run_js("window.scrollTo(0, 0); 1") + time.sleep(0.2) + app.processEvents() + steps = 0 + while True: + if not _run_js("rwState.hasMoreOlder"): + break + page_older_once() + steps += 1 + assert steps <= N // _SIZE + 10, "换页次数异常(疑似死循环)" + first = _run_js(f"document.querySelector('{sel}').id") + assert first == chain_ids[0], f"未到达头部: {first}" + + check("自顶部向上分页至头部(绝对顶部例外)", page_up_to_head) + + def head_state(): + st = _run_js("JSON.stringify({len: rwState.order.length, hidO: rwState.hiddenOlder, " + "hidN: rwState.hiddenNewer, older: rwState.hasMoreOlder, newer: rwState.hasMoreNewer})") + assert st["hidO"] == 0 and st["older"] is False, st + assert st["newer"] is True and st["hidN"] == N - _SIZE, st + # 全链可达 + 无重复 + all_ids = _run_js(f"Array.from(document.querySelectorAll('{sel}')).map(e => e.id)") + assert len(all_ids) == len(set(all_ids)), "DOM 出现重复消息 id" + assert len(seen) == N, f"可达 {len(seen)}/{N} 条" + + check("头部状态 + 全链可达无重复", head_state) + + # ---- 3) 自顶部向下回翻 2 页(窗口下移,视口留在顶部) ---- + def page_down_two(): + for k in range(2): + _run_js("window.scrollTo(0, 0); 1") + time.sleep(0.15) + app.processEvents() + _run_js("rwRequestPage('newer')") + wait_until("rwState.pending === null && window.__rwPageRendering === false", + 30, f"向下换页{k}完成") + # 顶部回翻:锚点(最旧一条)随 trimHead 移除 → 视口留在顶部露出新页 + assert _run_js("window.scrollY") <= 1, "顶部回翻应留在顶部" + first = _run_js(f"document.querySelector('{sel}').id") + assert first == chain_ids[_PAGE * (k + 1)], f"窗口未下移: {first}" + st = _run_js("rwState.hasMoreOlder") + assert st is True, "回翻后应仍有更旧消息" + + check("自顶部向下回翻 2 页(窗口下移)", page_down_two) + + # ---- 5) auto 模式抽查:顶部自动补页 ---- + def auto_probe(): + _run_js("window.scrollTo(0, 0); 1") + time.sleep(0.15) + app.processEvents() + _run_js("rwState.mode = 'auto'; 1") + hid_before = _run_js("rwState.hiddenOlder") + _run_js("rwAutoCheck(); 1") # 直接触发自动补页判定(事件接线另行覆盖) + # 给自动补页 12s(每页渲染约 0.5-2s) + t0 = time.time() + moved = False + while time.time() - t0 < 12: + app.processEvents() + time.sleep(0.2) + if _run_js("rwState.hiddenOlder") < hid_before: + moved = True + break + assert moved, "auto 模式顶部未自动补页" + + check("auto 模式:顶部自动补页", auto_probe) + + # ---- 4) 规模报告 ---- + nodes = page_metrics["dom_nodes"] + heights = page_metrics["heights"] + pages_ms = page_metrics["pages"] + print("\n================ 规模报告 ================") + print(f"链长 N={N} | 窗口 size={_SIZE}") + print(f"换页数={len(pages_ms)} | 每页耗时 min/avg/max = " + f"{min(pages_ms):.0f}/{(sum(pages_ms) / len(pages_ms)):.0f}/{max(pages_ms):.0f} ms") + print(f"DOM 节点总数 min/max = {min(nodes)}/{max(nodes)}") + print(f"页面高度 min/max = {min(heights)}/{max(heights)} px") + if anchor_errors: + print(f"锚点误差 min/max = {min(anchor_errors):.2f}/{max(anchor_errors):.2f} px") + print("==========================================") + + +def finish(ok=None): + app.quit() + + +QTimer.singleShot(500, try_load) +QTimer.singleShot(300000, lambda: (print("[超时] 300s 总超时"), finish(False))) +app.exec() +try: + window.close() +except Exception: + pass +print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: {sum(results)}/{len(results)} =====") +# QtWebEngine 退出段错误规避:汇总已打印,直接退出 +os._exit(0 if all(results) else 1) diff --git a/tests/inject_math_demo.py b/tests/inject_math_demo.py new file mode 100644 index 0000000..6892866 --- /dev/null +++ b/tests/inject_math_demo.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +"""公式渲染验收消息注入:新建「公式渲染验收」会话,写入用户原始样本 + 正/负例 + +运行: PYTHONIOENCODING=utf-8 python tests/inject_math_demo.py +""" +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from core.db_manager import DBManager # noqa: E402 + +USER_MSG = """帮我看看这个推导,公式渲染对不对? + +上面是推导结果: +[ +P_4=\\operatorname{BRF}(M_4,M_5) +] + +[ +P_3=\\operatorname{BRF}(S_3,P_4) +] + +其中: +[ +\\operatorname{BRF}(L,H) +L+ +\\Gamma(L,\\operatorname{Up}(H)) +\\odot +\\Phi(\\operatorname{Up}(H)) +] +""" + +ASSISTANT_MSG = r"""## 公式渲染验收 + +### 1) 你原始样本(单括号块,应渲染为独立居中公式) + +上面是推导结果: +[ +P_4=\operatorname{BRF}(M_4,M_5) +] + +[ +P_3=\operatorname{BRF}(S_3,P_4) +] + +其中: +[ +\operatorname{BRF}(L,H) +L+ +\Gamma(L,\operatorname{Up}(H)) +\odot +\Phi(\operatorname{Up}(H)) +] + +### 2) 标准定界符 + +行内混合:能量公式 $E=mc^2$ 出现在句子中间;再来一个 $x_i^2 + y_j^2 = z_{ij}^2$。 + +行内括号形式:\(\alpha + \beta = \gamma\) + +双美元块: +$$ +\int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi} +$$ + +方括号块: +\[ +\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6} +\] + +带矩阵与希腊字母: +[ +\begin{pmatrix} a & b \\ c & d \end{pmatrix} +\begin{pmatrix} x \\ y \end{pmatrix} += +\begin{pmatrix} ax+by \\ cx+dy \end{pmatrix} +] + +### 3) 反例(不应渲染成公式) + +- 编号引用:见[1]和[2]的说明。 +- 链接:[KaTeX 官网](https://katex.org) +- 列表内容:[a, b] 只是一个数组。 +- 货币:价格 $1,000 and $2,000 之间。 +- 代码块: + +```python +price = "$5" +pattern = r"$x + y$" +arr[0] = 1 +``` + +- 行内代码:使用 `$z$` 表示变量。 + +### 4) 复杂嵌套(流式增量渲染路径同样适用) + +$$ +f(x) = \sum_{k=0}^{n} \binom{n}{k} x^k (1-x)^{n-k} +$$ +""" + + +def main(): + db = DBManager() + sess = db.create_session("公式渲染验收") + sid = sess["id"] + parent = sess.get("current_leaf_msg_id") + m1 = db.add_message(sid, "user", USER_MSG, parent_id=parent) + db.add_message(sid, "assistant", ASSISTANT_MSG, parent_id=m1["id"]) + db.mark_session_has_messages(sid) + print(f"已注入会话: {sid}") + print(f"标题: 公式渲染验收") + print(f"用户消息 {len(USER_MSG)}c / 助手消息 {len(ASSISTANT_MSG)}c") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/run_all.py b/tests/run_all.py new file mode 100644 index 0000000..a878e22 --- /dev/null +++ b/tests/run_all.py @@ -0,0 +1,265 @@ +# -*- coding: utf-8 -*- +"""P2-04 跨平台聚合测试入口(无 pytest / npm / 网络要求)。 + +用法: + python tests/run_all.py --group logic + python tests/run_all.py --group offscreen + python tests/run_all.py --group all + python tests/run_all.py --group all --list + python tests/run_all.py --group all --keep-logs + python tests/run_all.py --group logic --only test_tool_params + +设计(对应 REPAIR_BACKLOG.md P2-04 硬约束): + * 保留所有独立命令:每个条目就是 [解释器, 测试文件] 的普通子进程调用, + 与各测试文件头部的“运行:”命令等价(同一解释器、同一 cwd、同组环境)。 + * 聚合入口不要求 pytest / npm / 网络;缺 node 或第三方依赖的条目的 + 呈现方式(SKIP + 理由),不伪装通过。 + * 每个子测试使用独立临时目录(Windows: TEMP/TMP;POSIX: TMPDIR), + GUI 测试的临时配置/临时数据库由各测试自身在 import MainWindow 前 + 通过 tests/_test_env.isolate() 完成(仓库既有惯例)。 + * 默认不运行 diag_* / verify_* / tune_* / 真实 API(smoke_live_*、 + diag_live_*)/ 真实桌面 / 需要凭据的脚本,也不运行使用真实 DB 的 + 遗留脚本(smoke_persist、smoke_repro_real)。 + * 平台不适用项以明确 SKIP + 理由呈现;平台共同项失败 → 退出码非零。 + * 单个子测试崩溃或超时不阻止后续测试与最终汇总;退出码反映失败: + 0 = 无 FAIL/TIMEOUT(SKIP 不影响);1 = 存在 FAIL 或 TIMEOUT。 + * 不读取真实配置、不访问网络、不删除用户运行数据。 +""" +import argparse +import importlib.util +import os +import shutil +import subprocess +import sys +import tempfile +import time +from datetime import datetime + +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +PY = sys.executable # 用启动本入口的解释器跑所有 Python 子测试(与独立命令一致) +NODE = shutil.which("node") + +# 控制台编码安全化(与 main.py 同惯例):git-bash/GBK/cp1252 终端下 +# 聚合器自身的中文输出不得崩溃(子测试输出经 UTF-8 解码后同样安全打印)。 +for _name in ("stdout", "stderr"): + _s = getattr(sys, _name, None) + if _s is not None: + try: + _s.reconfigure(encoding="utf-8", errors="replace") + except Exception: + pass + +# --------------------------------------------------------------------------- +# 测试清单 / 分组元数据 +# (id, groups, argv, timeout_sec, needs, note) +# needs 取值: +# "node" —— 需要 node 可执行文件 +# "openai" —— 需要 openai 包(当前解释器) +# "pymupdf" —— 需要 PyMuPDF (fitz) +# "pyqt6" —— 需要 PyQt6(GUI/offscreen 条目) +# --------------------------------------------------------------------------- +JS = lambda f: [NODE, os.path.join(REPO, "tests", f)] if NODE else [None] +PYT = lambda f: [PY, os.path.join(REPO, "tests", f)] + +TESTS = [ + # ---- logic:纯逻辑 / 无 GUI(平台共同项,失败不得豁免)---- + ("run_tests.py (agent core 41)", ("logic",), PYT("run_tests.py"), 300, + ("openai",), "core.agent 单测套件(既有 run_tests.py 入口,原样保留)"), + ("test_tool_params.py", ("logic",), PYT("test_tool_params.py"), 120, + ("openai",), "工具参数解析(import core.agent.tools → openai)"), + ("test_bash_stream.py", ("logic",), PYT("test_bash_stream.py"), 180, + ("openai",), "bash 流式 / 进程树(P1-02、P2-01)"), + ("test_copy_session.py", ("logic",), PYT("test_copy_session.py"), 180, + (), "会话复制 DB 逻辑"), + ("test_compaction_persist.py", ("logic",), PYT("test_compaction_persist.py"), 180, + ("openai",), "压缩持久化"), + ("test_file_attach.py", ("logic",), PYT("test_file_attach.py"), 180, + (), "附件链路(P1-04)"), + ("test_cross_platform_shell.py", ("logic",), PYT("test_cross_platform_shell.py"), 240, + ("openai",), "跨平台 shell 契约 + 进程树终止(P1-02)"), + ("test_global_hotkey_platforms.py", ("logic",), PYT("test_global_hotkey_platforms.py"), 240, + ("pyqt6",), "全局热键平台矩阵 mock(P1-04;含 QShortcut/overlay 构造)"), + ("test_wv2_guard.py", ("logic",), PYT("test_wv2_guard.py"), 240, + ("platform:win32",), "WebView2 守卫(T0 事故锁死;msvcrt 单实例互斥为 Windows 专属,Linux 无 WebView2 链路)"), + ("test_pdf_reader.py", ("logic",), PYT("test_pdf_reader.py"), 240, + ("pymupdf",), "PDF 提取"), + ("test_math_extract.js", ("logic",), JS("test_math_extract.js"), 120, + ("node",), "数学提取 JS 单测(P1-03)"), + ("test_render_window.js", ("logic",), JS("test_render_window.js"), 180, + ("node",), "渲染窗口状态机 JS 单测(P1-01)"), + + # ---- offscreen:Qt GUI(QT_QPA_PLATFORM=offscreen 子环境)---- + ("smoke_offscreen.py", ("offscreen",), PYT("smoke_offscreen.py"), 420, + ("pyqt6",), "主窗口 + 核心链路冒烟"), + ("smoke_mode.py", ("offscreen",), PYT("smoke_mode.py"), 420, + ("pyqt6",), "模式切换(P0-02)"), + ("smoke_copy_session.py", ("offscreen",), PYT("smoke_copy_session.py"), 420, + ("pyqt6",), "会话复制 UI 端到端"), + ("smoke_bash_panel.py", ("offscreen",), PYT("smoke_bash_panel.py"), 480, + ("pyqt6",), "右侧 Bash 面板端到端(P2-01、P2-02)"), + ("smoke_timeline.py", ("offscreen",), PYT("smoke_timeline.py"), 420, + ("pyqt6",), "时间线持久化/还原"), + ("smoke_midswitch.py", ("offscreen",), PYT("smoke_midswitch.py"), 420, + ("pyqt6",), "流式中途切会话(P1-01)"), + ("test_main_window_event_filter.py", ("offscreen",), PYT("test_main_window_event_filter.py"), 300, + ("pyqt6",), "MainWindow.eventFilter(P0-02)"), + ("test_config_isolation.py", ("offscreen",), PYT("test_config_isolation.py"), 300, + ("pyqt6",), "配置/DB 隔离铁律(P0-01)"), + ("test_error_persist.py", ("offscreen",), PYT("test_error_persist.py"), 300, + ("pyqt6",), "错误持久化"), + ("test_think_code_neutral.py", ("offscreen",), PYT("test_think_code_neutral.py"), 420, + ("pyqt6",), "思考/代码块渲染中立性"), + ("test_debug_window.py", ("offscreen",), PYT("test_debug_window.py"), 300, + ("pyqt6",), "调试窗口"), + ("test_renderer_matrix.py", ("offscreen",), PYT("test_renderer_matrix.py"), 600, + ("pyqt6",), "渲染器矩阵(P1-03,含子进程并行)"), + ("test_screen_capture_platforms.py", ("offscreen",), PYT("test_screen_capture_platforms.py"), 300, + ("pyqt6",), "截图平台矩阵 mock + overlay 守卫(P1-04)"), +] + +# 默认不聚合(人工/半自动/真实资源):diag_*、verify_*、tune_*、 +# smoke_live_guard.py、diag_live_*.py、smoke_manual.py、smoke_repro_real.py、 +# smoke_persist.py(真实 DB)、smoke_probe.py、_probe_*.py、 +# debug_inject.py、inject_math_demo.py、check_db_migration.py + + +def _has_module(name): + try: + return importlib.util.find_spec(name) is not None + except Exception: + return False + + +def skip_reason(entry): + """返回 SKIP 理由;None 表示可运行。""" + _id, _groups, _argv, _to, needs, _note = entry + for need in needs: + if need.startswith("platform:"): + want = need.split(":", 1)[1] + if sys.platform != want: + return f"平台不适用:该条目仅 {want} 路径适用(当前 {sys.platform})" + continue + if need == "node" and not NODE: + return "node 不可用(聚合入口不要求 npm/node;安装 node 后自动纳入)" + if need == "openai" and not _has_module("openai"): + return "当前解释器无 openai 包(本环境不允许联网安装)" + if need == "pymupdf" and not _has_module("fitz"): + return "当前解释器无 PyMuPDF(本环境不允许联网安装)" + if need == "pyqt6" and not _has_module("PyQt6"): + return "当前解释器无 PyQt6(GUI 条目需在装有依赖的解释器运行)" + return None + + +def _child_env(extra_temp, offscreen): + env = os.environ.copy() + env["PYTHONIOENCODING"] = "utf-8" + env["PYTHONUNBUFFERED"] = "1" + if extra_temp: + if os.name == "nt": + env["TEMP"] = extra_temp + env["TMP"] = extra_temp + else: + env["TMPDIR"] = extra_temp + if offscreen: + env.setdefault("QT_QPA_PLATFORM", "offscreen") + env.setdefault("HAOCODE_RENDER", "software") + env.setdefault("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-gpu") + return env + + +def run_group(group, keep_logs, only): + entries = [e for e in TESTS if group in ("all",) or e[1][0] == group] + if only: + subs = [s.strip() for s in only.split(",") if s.strip()] + entries = [e for e in entries if any(s in e[0] for s in subs)] + if not entries: + print("没有匹配的测试条目(--group/--only 组合为空)") + return 1 + + run_dir = tempfile.mkdtemp(prefix="haocode_runall_") + print("=" * 72) + print("haocode 聚合测试入口 (P2-04)") + print(f"platform={sys.platform} python={sys.version.split()[0]} ({PY})") + print(f"group={group} entries={len(entries)} 开始={datetime.now():%H:%M:%S}") + print("=" * 72) + + results = [] # (id, status, seconds, note, argv) + t_all = time.time() + for entry in entries: + tid, _groups, argv, budget, needs, note = entry + off = "offscreen" in entry[1] + reason = skip_reason(entry) + if reason: + results.append((tid, "SKIP", 0.0, reason, argv)) + print(f" SKIP {tid} [{reason}]") + continue + t0 = time.time() + log_path = os.path.join(run_dir, tid.replace(" ", "_").replace("(", "").replace(")", "") + ".log") + try: + with tempfile.TemporaryDirectory(prefix="runall_t_") as td: + proc = subprocess.run( + argv, cwd=REPO, env=_child_env(td, off), + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + timeout=budget) + rc, err = proc.returncode, None + out = proc.stdout + except subprocess.TimeoutExpired as e: + rc, out, err = 124, (e.stdout or b""), f"超时(预算 {budget}s)" + except Exception as e: # 聚合器自身健壮性:单条崩溃不阻止汇总 + rc, out, err = 125, b"", f"聚合器异常: {e!r}" + dt = max(0.0, time.time() - t0) # WSL/9P 时钟回拨保护 + status = "PASS" if rc == 0 else ("TIMEOUT" if rc == 124 else "FAIL") + results.append((tid, status, dt, note, argv)) + tag = f" {status:<7} {dt:7.1f}s {tid}" + print(tag, flush=True) + # 非 PASS:打印最后 15 行帮助定位 + tail = (out or b"").decode("utf-8", "replace").splitlines()[-15:] + if status != "PASS" and tail: + for line in tail: + print(f" | {line}") + with open(log_path, "wb") as f: + f.write(b"# argv: " + " ".join(str(a) for a in argv).encode() + b"\n") + if err: + f.write(f"# {err}\n".encode()) + f.write(out or b"") + + dt_all = time.time() - t_all + n_pass = sum(1 for r in results if r[1] == "PASS") + n_fail = sum(1 for r in results if r[1] in ("FAIL", "TIMEOUT")) + n_skip = sum(1 for r in results if r[1] == "SKIP") + print("-" * 72) + print(f"总计 {len(results)}: PASS {n_pass} FAIL {n_fail} SKIP {n_skip}" + f" 总耗时 {dt_all:.1f}s") + if keep_logs or n_fail: + print(f"日志目录(保留): {run_dir}") + else: + shutil.rmtree(run_dir, ignore_errors=True) + print("日志目录(无失败,已清理)") + bad = [r for r in results if r[1] in ("FAIL", "TIMEOUT")] + if bad: + print("失败命令:") + for tid, status, dt, _note, argv in bad: + print(f" [{status}] {' '.join(str(a) for a in argv)}") + print("=" * 72) + return 1 if n_fail else 0 + + +def main(): + ap = argparse.ArgumentParser(description="haocode 跨平台聚合测试入口(P2-04)") + ap.add_argument("--group", choices=("logic", "offscreen", "all"), default="all", + help="logic=纯逻辑; offscreen=Qt GUI offscreen; all=两者(默认)") + ap.add_argument("--list", action="store_true", help="只列出条目,不执行") + ap.add_argument("--keep-logs", action="store_true", help="保留全部子测试日志") + ap.add_argument("--only", default="", help="只运行 id 含子串的条目(逗号分隔)") + args = ap.parse_args() + + if args.list: + for tid, groups, argv, budget, needs, note in TESTS: + mark = "SKIP?" if skip_reason((tid, groups, argv, budget, needs, note)) else "run " + print(f" [{mark}] {groups[0]:<10} {budget:>4}s {tid} {note}") + return 0 + sys.exit(run_group(args.group, args.keep_logs, args.only)) + + +if __name__ == "__main__": + main() diff --git a/tests/run_tests.py b/tests/run_tests.py new file mode 100644 index 0000000..fa934e9 --- /dev/null +++ b/tests/run_tests.py @@ -0,0 +1,33 @@ +"""离线测试 harness(无 pytest 依赖): +运行: conda run -n haocode python tests/run_tests.py +""" +import importlib.util +import os +import sys +import traceback + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +spec = importlib.util.spec_from_file_location( + "test_agent_core", os.path.join(os.path.dirname(__file__), "test_agent_core.py")) +mod = importlib.util.module_from_spec(spec) +# 替换 pytest 依赖后加载 +import types +_py_stub = types.ModuleType("pytest") +sys.modules["pytest"] = _py_stub +spec.loader.exec_module(mod) + +tests = [(n, f) for n, f in sorted(vars(mod).items()) + if n.startswith("test_") and callable(f)] +passed = failed = 0 +for name, fn in tests: + try: + fn() + print(f" PASS {name}") + passed += 1 + except Exception: + print(f" FAIL {name}") + traceback.print_exc() + failed += 1 +print(f"\n===== {passed} passed, {failed} failed / {len(tests)} =====") +sys.exit(1 if failed else 0) diff --git a/tests/smoke_bash_panel.py b/tests/smoke_bash_panel.py new file mode 100644 index 0000000..5bb4974 --- /dev/null +++ b/tests/smoke_bash_panel.py @@ -0,0 +1,737 @@ +# -*- coding: utf-8 -*- +"""右侧任务面板 · offscreen 端到端 +链路:顶部按钮(原「导出」位置)→ BashPanel 展开/收起 → tool_execution_* 事件 + → 层(运行中/已完成)→ 单击展开(参数 + 输出)→ 会话切换刷新 + +运行: QT_QPA_PLATFORM=offscreen python tests/smoke_bash_panel.py +""" +import os +import sys +import json +import tempfile +import shutil + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost +os.environ.setdefault("PYTHONIOENCODING", "utf-8") + +# 铁律(P0-01):临时数据库 + 临时配置必须在 import MainWindow 之前完成 +# (临时配置保留本套件的 mode_switch=true 语义) +from tests._test_env import isolate # noqa: E402 +_TMP = isolate("bashpanel", config={"providers": {}, "mode_switch": True}) +_DB_TMP = _TMP["db"] +_CFG_TMP = _TMP["config"] + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtTest import QTest # noqa: E402 +from PyQt6 import QtCore, QtWidgets # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 +from ui.views.bash_panel import BashLayer, LIVE_BUF_CAP, LAYER_LIMIT # noqa: E402 + +app = QApplication(sys.argv) +ok = True + + +def check(name, cond, extra=""): + global ok + print((" PASS " if cond else " FAIL ") + name + ("" if cond else f" {extra}"), flush=True) + if not cond: + ok = False + + +def settle(ms=400): + for _ in range(int(ms / 20) + 1): + app.processEvents() + QTest.qWait(20) + + +window = MainWindow() +window.show() +panel = window.bash_panel + + +def px(widget, x, y): + """取控件自身坐标系下 (x,y) 的渲染像素""" + img = widget.grab().toImage() + c = img.pixelColor(x, y) + return (c.red(), c.green(), c.blue()) + + +# ====================================================================== +# 1) 外壳:默认收起 52px、顶部按钮存在且尺寸与左侧收起按钮一致 +# ====================================================================== +check("P1.1 面板已创建并挂进主布局", panel is not None and panel.parent() is not None) +check("P1.2 默认收起 52px", panel.width() == 52 and panel.collapsed is True, + f"w={panel.width()} collapsed={panel.collapsed}") +check("P1.3 「导出」按钮已移除", not hasattr(window, "btn_export")) +# 🆕 开关只在右栏内部(与左侧栏一致),主界面顶部【不得】有任何面板按钮 +check("P1.4 主界面顶部【没有】面板开关按钮", not hasattr(window, "btn_panel")) + + +def visible_toggles(): + """全窗口可见的面板开关按钮(tooltip 含“任务面板”)""" + return [b for b in window.findChildren(QtWidgets.QPushButton) + if "任务面板" in (b.toolTip() or "") and b.isVisible()] + + +check("P1.5 收起态:可见开关恒为 1 个", len(visible_toggles()) == 1, str(len(visible_toggles()))) +check("P1.6 收起态开关 = 面板内的 expand_btn(居中)", + visible_toggles()[0] is panel.expand_btn) +check("P1.7 expand_btn 34×34、icon 18×18(与左侧栏收起页按钮同规格)", + panel.expand_btn.width() == 34 and panel.expand_btn.height() == 34 + and panel.expand_btn.iconSize() == QtCore.QSize(18, 18) + and panel.expand_btn.width() == window.collapse_expand_btn.width(), + f"{panel.expand_btn.width()}x{panel.expand_btn.height()} vs 左 {window.collapse_expand_btn.width()}") +check("P1.8 expand_btn 与左侧按钮同 objectName(继承同一套 QSS)", + panel.expand_btn.objectName() == window.collapse_expand_btn.objectName() == "collapse_btn") +_x = panel.expand_btn.mapTo(panel, QtCore.QPoint(0, 0)).x() +check("P1.9 expand_btn 水平居中于 52px 栏内", + abs((_x + 34 / 2) - panel.width() / 2) <= 1.5, f"center={_x + 17} panel_half={panel.width()/2}") + +# 展开(用栏内按钮,不用主界面按钮) +panel.expand_btn.click() +settle(500) +check("P1.10 点击收起页按钮 → 展开到 260px", panel.width() == 260 and panel.collapsed is False, + f"w={panel.width()} collapsed={panel.collapsed}") +check("P1.11 展开态:可见开关仍恒为 1 个(不叠加)", + len(visible_toggles()) == 1, str(len(visible_toggles()))) +check("P1.12 展开态开关 = 面板标题行右上角的 fold_btn", + visible_toggles()[0] is panel.fold_btn) +check("P1.13 fold_btn 28×28、icon 16×16(与左侧栏收起按钮同规格)", + panel.fold_btn.width() == 28 and panel.fold_btn.height() == 28 + and panel.fold_btn.iconSize() == QtCore.QSize(16, 16) + and panel.fold_btn.width() == window.collapse_btn.width(), + f"{panel.fold_btn.width()}x{panel.fold_btn.height()} vs 左 {window.collapse_btn.width()}") +check("P1.14 fold_btn 与左侧按钮同 objectName(同一套 QSS)", + panel.fold_btn.objectName() == window.collapse_btn.objectName() == "collapse_btn") +_fx = panel.fold_btn.mapTo(panel, QtCore.QPoint(0, 0)).x() +check("P1.15 fold_btn 位于标题行右端(右侧留白 ≤14px)", + panel.width() - (_fx + 28) <= 14, f"right_gap={panel.width() - (_fx + 28)}") +check("P1.16 展开后两栏同时可见(不互斥)", + (not panel.sec_running.isHidden()) and (not panel.sec_done.isHidden()), + f"run_hidden={panel.sec_running.isHidden()} done_hidden={panel.sec_done.isHidden()}") +check("P1.17 两栏为上下排列(分隔线可拖动)", + panel.splitter.orientation() == QtCore.Qt.Orientation.Vertical) +check("P1.18 默认两栏提示语", + panel.sec_running.hint.text() == "暂无正在运行的 bash" + and panel.sec_done.hint.text() == "本会话还没有已完成的 bash", + f"{panel.sec_running.hint.text()!r} / {panel.sec_done.hint.text()!r}") +# 🐛 已修:QWidget 子类样式表背景 + 底色/分隔线继承左侧 +check("P1.19 样式表背景已启用(WA_StyledBackground)", + panel.testAttribute(QtCore.Qt.WidgetAttribute.WA_StyledBackground)) +check("P1.20 面板底色 = 左侧栏底色 (#f7f8fa)", + px(panel, 30, 400) == (0xf7, 0xf8, 0xfa), str(px(panel, 30, 400))) +check("P1.21 面板左侧分隔线 = 左侧栏分隔线 (#ececec)", + px(panel, 0, 400) == (0xec, 0xec, 0xec), str(px(panel, 0, 400))) +check("P1.22 左侧栏对照:底色+分隔线", + px(window.sidebar, 30, 400) == (0xf7, 0xf8, 0xfa) + and px(window.sidebar, 259, 400) == (0xec, 0xec, 0xec), + f"{px(window.sidebar, 30, 400)} {px(window.sidebar, 259, 400)}") +check("P1.23 标题行与左侧栏标题行垂直对齐(y 相等、高 36)", + panel.header.mapTo(window, QtCore.QPoint(0, 0)).y() + == window.sidebar_header.mapTo(window, QtCore.QPoint(0, 0)).y() + and panel.header.height() == window.sidebar_header.height() == 36, + f"panel_y={panel.header.mapTo(window, QtCore.QPoint(0, 0)).y()} " + f"left_y={window.sidebar_header.mapTo(window, QtCore.QPoint(0, 0)).y()}") + +# ====================================================================== +# 2) 事件驱动:运行中 → 实时输出 → 读秒 → 完成归位 +# ====================================================================== +sid = window.current_session_id +if not sid: + window.on_new_chat_clicked() + sid = window.current_session_id + +window._on_tool_started(sid, "c1", "bash", json.dumps({"command": "echo hi"}, ensure_ascii=False)) +check("P2.1 bash 事件 → 运行中栏出现 1 层", panel.layer_ids("running") == ["c1"], + str(panel.layer_ids("running"))) +check("P2.2 已完成栏仍为空", panel.layer_ids("done") == [], str(panel.layer_ids("done"))) +lay = panel._layers["c1"] +check("P2.3 层头显示 bash + 运行中标签", + lay.name.text() == "bash" and lay.tag.text() == "运行中", lay.tag.text()) +check("P2.4 层头显示命令预览", "echo hi" in lay.cmd.text(), lay.cmd.text()) + +window._on_tool_updated(sid, "c1", "hi\n") +window._on_tool_updated(sid, "c1", "second\n") +check("P2.5 实时输出被累积", lay._live == "hi\nsecond\n", repr(lay._live)) +window._on_tool_timed(sid, "c1", 3, 120) +check("P2.6 读秒显示 3/120s", lay.meta.text() == "3/120s", lay.meta.text()) + +# 非 bash 工具不登记 +window._on_tool_started(sid, "c9", "read", json.dumps({"path": "x"})) +check("P2.7 非 bash 工具不登记", "c9" not in panel._layers) + +# 完成 → 归位到已完成栏 +final_text = "$ echo hi\nhi\n[exit 0] (0.1s)" +window._on_tool_finished(sid, "c1", "bash", True, final_text) +check("P2.8 完成后从运行中移除", panel.layer_ids("running") == [], str(panel.layer_ids("running"))) +check("P2.9 完成后进入已完成栏", panel.layer_ids("done") == ["c1"], str(panel.layer_ids("done"))) +check("P2.10 已完成标签 + 耗时(从 (0.1s) 解析)", + lay.tag.text() == "已完成" and lay.meta.text() == "0.1s", f"{lay.tag.text()} {lay.meta.text()}") +check("P2.11 已完成层输出 = 进入上下文的原文", lay._final == final_text) + +# ====================================================================== +# 3) 单击展开 → 参数 + 输出 +# ====================================================================== +check("P3.1 初始为收起态", lay.expanded is False and lay.body.isHidden()) +QTest.mouseClick(lay.head, QtCore.Qt.MouseButton.LeftButton, + QtCore.Qt.KeyboardModifier.NoModifier, + QtCore.QPoint(10, lay.head.height() // 2)) +settle(120) +check("P3.2 单击(非双击)即展开", lay.expanded is True and not lay.body.isHidden()) +check("P3.3 参数区显示完整命令", lay.arg_box.toPlainText() == "echo hi", + repr(lay.arg_box.toPlainText())) +check("P3.4 输出区标题标明「进入上下文」", lay.lbl_out.text() == "输出(进入上下文)", + lay.lbl_out.text()) +check("P3.5 输出区显示上下文原文", lay.out_box.toPlainText() == final_text) +QTest.mouseClick(lay.head, QtCore.Qt.MouseButton.LeftButton, + QtCore.Qt.KeyboardModifier.NoModifier, + QtCore.QPoint(10, lay.head.height() // 2)) +settle(120) +check("P3.6 再点一次收起", lay.expanded is False and lay.body.isHidden()) + +# 运行中的层展开 → 实时输出 +window._on_tool_started(sid, "c2", "bash", json.dumps({"command": "ping -t x"})) +window._on_tool_updated(sid, "c2", "line-A\n") +lay2 = panel._layers["c2"] +lay2.toggle() +check("P3.7 运行中层输出标题 = 输出(实时)", lay2.lbl_out.text() == "输出(实时)", + lay2.lbl_out.text()) +check("P3.8 运行中层实时内容可见", "line-A" in lay2.out_box.toPlainText()) +window._on_tool_updated(sid, "c2", "line-B\n") +check("P3.9 展开状态下新输出即时可见(无需重新展开)", + "line-B" in lay2.out_box.toPlainText(), repr(lay2.out_box.toPlainText())) +window._on_tool_finished(sid, "c2", "bash", False, "$ ping -t x\nline-A\n[exit 1] (0.5s)") +check("P3.10 失败层标签为「失败」", lay2.tag.text() == "失败", lay2.tag.text()) + +# 实时缓冲上限 +big = BashLayer("cbuf", "x") +for _ in range(260): + big.append_live("y" * 1000) +check("P3.11 实时缓冲截到 200KB 内", len(big._live) <= LIVE_BUF_CAP, str(len(big._live))) +check("P3.12 截断被标注", big._live_truncated is True) + +# ====================================================================== +# 4) 压缩切点 → 已出上下文标注 +# ====================================================================== +sid2 = window.db.create_session("面板压缩测试")["id"] +leaf = window.db.get_session_leaf(sid2) +tl1 = json.dumps([{"t": "tool", "id": "old1", "name": "bash", + "args": json.dumps({"command": "old-cmd"}), + "ok": True, "result": "$ old-cmd\nold\n[exit 0] (0.1s)"}], + ensure_ascii=False) +m_sys = leaf +m_u1 = window.db.add_message(sid2, "user", "q1", m_sys)["id"] +m_a1 = window.db.add_message(sid2, "assistant", "a1", m_u1, timeline=tl1)["id"] +m_u2 = window.db.add_message(sid2, "user", "q2", m_a1)["id"] +tl2 = json.dumps([{"t": "tool", "id": "new1", "name": "bash", + "args": json.dumps({"command": "new-cmd"}), + "ok": True, "result": "$ new-cmd\nnew\n[exit 0] (0.1s)"}], + ensure_ascii=False) +m_a2 = window.db.add_message(sid2, "assistant", "a2", m_u2, timeline=tl2)["id"] +window.db.insert_compaction_mark(sid2, "【摘要】前文略", cut_before_id=m_a1, + first_retained_id=m_u2) +window.load_messages_to_web(sid2) +settle(300) +check("P4.1 切换会话后面板跟随刷新", set(panel.layer_ids()) == {"old1", "new1"}, + str(panel.layer_ids())) +check("P4.2 压缩切点之前的层标注「已出上下文」", + panel._layers["old1"].tag.text() == "已出上下文", panel._layers["old1"].tag.text()) +check("P4.3 切点之后的层仍为「已完成」", + panel._layers["new1"].tag.text() == "已完成", panel._layers["new1"].tag.text()) +check("P4.4 已完成层不截断输出(原文保留)", + panel._layers["old1"]._final.endswith("[exit 0] (0.1s)")) + +# ====================================================================== +# 5) 层数上限 +# ====================================================================== +sid3 = window.db.create_session("面板层数上限")["id"] +leaf3 = window.db.get_session_leaf(sid3) +entries = [{"t": "tool", "id": f"many{i}", "name": "bash", + "args": json.dumps({"command": f"cmd{i}"}), + "ok": True, "result": f"$ cmd{i}\nok\n[exit 0] (0.1s)"} for i in range(35)] +window.db.add_message(sid3, "assistant", "批量", leaf3, + timeline=json.dumps(entries, ensure_ascii=False)) +window.load_messages_to_web(sid3) +settle(300) +check("P5.1 只渲染最近 30 层", panel.sec_done.count.text() == str(LAYER_LIMIT), + panel.sec_done.count.text()) +check("P5.2 有「仅显示最近 N 层」提示", "仅显示最近 30 层" in panel.sec_done.hint.text(), + panel.sec_done.hint.text()) +check("P5.3 面板内部仍保留全部 35 层(只是不渲染)", + len(panel.layer_ids("done")) == 35, str(len(panel.layer_ids("done")))) + +# ====================================================================== +# 6) 不自动收缩(resizeEvent 不影响右侧面板)+ 手动切换 +# ====================================================================== +was = panel.collapsed +window.resize(920, 700) +settle(200) +check("P6.1 窗口变小不触发面板自动收缩", panel.collapsed == was, + f"before={was} after={panel.collapsed}") +window.resize(1400, 800) +settle(200) +check("P6.2 窗口变大也不触发面板自动展开/收缩", panel.collapsed == was) +panel.fold_btn.click() +settle(500) +check("P6.3 只有点栏内按钮才收起", panel.width() == 52 and panel.collapsed is True) +check("P6.4 收起后可见开关切回 expand_btn(恒为 1 个)", + len(visible_toggles()) == 1 and visible_toggles()[0] is panel.expand_btn) +panel.expand_btn.click() +settle(500) +check("P6.5 收起页按钮再点一次即可展开", panel.width() == 260 and panel.collapsed is False) +check("P6.6 全窗口仍只有 1 个可见面板开关(且主界面顶部没有)", + len(visible_toggles()) == 1 and not hasattr(window, "btn_panel")) + +# ====================================================================== +# 7) 会话切回空会话 → 面板清空 +# ====================================================================== +sid4 = window.db.create_session("面板空会话")["id"] +window.load_messages_to_web(sid4) +settle(250) +check("P7.1 切到空会话后面板清空", panel.layer_ids() == [], str(panel.layer_ids())) + +# ====================================================================== +# 8) 🆕 左边缘拖拽调宽 → 记录 → 下次展开自动恢复(含最小宽度) +# ====================================================================== +from ui.views.bash_panel import (PANEL_W_DEFAULT, PANEL_W_MIN, PANEL_W_MAX, # noqa: E402 + BashPanel, load_panel_width) + +if panel.collapsed: + panel.expand_btn.click() + settle(400) + +check("P8.1 拖拽手柄存在、宽 4px、贴在最左", + panel._handle.width() == 4 and panel._handle.x() == 0, + f"w={panel._handle.width()} x={panel._handle.x()}") +check("P8.2 手柄覆盖面板全高", panel._handle.height() == panel.height(), + f"{panel._handle.height()} vs {panel.height()}") +check("P8.3 手柄光标 = 水平拖拽", + panel._handle.cursor().shape() == QtCore.Qt.CursorShape.SizeHorCursor) +check("P8.4 最小宽度已设定(%d px)" % PANEL_W_MIN, + PANEL_W_MIN == 200 and panel.W_MIN == PANEL_W_MIN) + + +def drag_to(width): + """模拟真实拖拽:按下(记右边界)→ 鼠标移到目标位置 → 松手""" + right = panel.mapToGlobal(QtCore.QPoint(panel.width(), 0)).x() + panel._drag_begin(right) + panel._drag_to_global_x(right - width) + panel._commit_drag_width() + settle(120) + + +# 8.1 正常拖宽 → 立即生效 + 落盘 +cfg_before = json.load(open(_CFG_TMP, encoding="utf-8")) +drag_to(340) +check("P8.5 拖到 340px 立即生效", panel.width() == 340 and panel.collapsed is False, + f"w={panel.width()}") +cfg_after = json.load(open(_CFG_TMP, encoding="utf-8")) +check("P8.6 已落盘 config.json['bash_panel_width'] = 340", + cfg_after.get("bash_panel_width") == 340, str(cfg_after.get("bash_panel_width"))) +check("P8.7 落盘不破坏其它键(providers/mode_switch 保留)", + "providers" in cfg_after and cfg_after.get("mode_switch") is True) + +# 8.2 收起再展开 → 回到记录值(不是默认 260) +panel.fold_btn.click() +settle(450) +check("P8.8 收起仍为 52px", panel.width() == 52 and panel.collapsed is True, f"w={panel.width()}") +check("P8.9 收起条居中按钮不被 4px 手柄遮住", panel.expand_btn.x() >= panel._handle.width(), + f"btn_x={panel.expand_btn.x()}") +panel.expand_btn.click() +settle(450) +check("P8.10 再展开 = 记录的 340px(不是默认 %d)" % PANEL_W_DEFAULT, + panel.width() == 340 and panel.W_EXPAND == 340, f"w={panel.width()} W_EXPAND={panel.W_EXPAND}") + +# 8.3 最小宽度夹紧 +win_half = int(window.width() * 0.5) +drag_to(120) +check("P8.11 拖到 120px → 被夹到最小 200px", panel.width() == PANEL_W_MIN, f"w={panel.width()}") +check("P8.12 夹紧后仍是展开态(不会误判为收起)", + panel.collapsed is False and panel.width() > panel.W_COLLAPSE) + +# 8.4 上限夹紧 +drag_to(5000) +exp_hi = min(PANEL_W_MAX, max(PANEL_W_MIN, win_half)) +check("P8.13 拖到 5000px → 被夹到上限(≤%d)" % exp_hi, panel.width() == exp_hi, + f"w={panel.width()} exp={exp_hi}") + +# 8.5 从收起态直接拖开 → 自动进展开态 +drag_to(PANEL_W_MIN) +panel.fold_btn.click() +settle(450) +check("P8.14 已收起 52px", panel.width() == 52) +panel._drag_begin(panel.mapToGlobal(QtCore.QPoint(panel.width(), 0)).x()) +panel._drag_to_global_x(panel.mapToGlobal(QtCore.QPoint(panel.width(), 0)).x() + 100) +check("P8.15 从收起态向外拖 → 立即进入展开态(不为 0/负数)", + panel.collapsed is False and panel.width() >= PANEL_W_MIN, f"w={panel.width()}") +panel._commit_drag_width() +settle(120) + +# 8.6 持久化:新实例直接读出记录值 +drag_to(300) +check("P8.16 记录 300px 后,新实例读出同一值", + load_panel_width() == 300, str(load_panel_width())) +_p2 = BashPanel() +check("P8.17 新面板 W_EXPAND 即上次记录值(重启后自动恢复)", + _p2.W_EXPAND == 300, str(_p2.W_EXPAND)) +_p2.deleteLater() + +# 8.7 只拖不松手不写盘 +with open(_CFG_TMP, "w", encoding="utf-8") as _f: + json.dump({"providers": {}, "mode_switch": True}, _f) +right = panel.mapToGlobal(QtCore.QPoint(panel.width(), 0)).x() +panel._drag_begin(right) +panel._drag_to_global_x(right - 420) +check("P8.18 拖动过程中不写盘(只在松手时记录)", + json.load(open(_CFG_TMP, encoding="utf-8")).get("bash_panel_width") is None) +panel._commit_drag_width() +check("P8.19 松手才落盘", + json.load(open(_CFG_TMP, encoding="utf-8")).get("bash_panel_width") == panel.width(), + str(json.load(open(_CFG_TMP, encoding="utf-8")).get("bash_panel_width"))) + +# ====================================================================== +# 9) 🆕 两栏折叠/展开:只收「下面填充的 bash 层」,头部行高恒定(抽屉动画) +# ====================================================================== +if panel.collapsed: + panel.expand_btn.click() + settle(400) + +# 造数据:运行中 1 层 + 已完成 2 层 +panel.on_started("p9_run", "bash", {"command": "python long_task.py"}) +panel.on_timed("p9_run", 3, 120) +panel.on_started("p9_d1", "bash", {"command": "echo a"}) +panel.on_finished("p9_d1", "bash", True, "a") +panel.on_started("p9_d2", "bash", {"command": "echo b"}) +panel.on_finished("p9_d2", "bash", True, "b") +settle(300) + +sr, sd = panel.sec_running, panel.sec_done +check("P9.0 两栏都有内容(运行中1 / 已完成2)", + len(panel.layer_ids("running")) == 1 and len(panel.layer_ids("done")) == 2, + f"{panel.layer_ids('running')} / {panel.layer_ids('done')}") + +head_h = sr.head_height() +total0 = sum(panel.splitter.sizes()) +check("P9.1 头部行高 = 24px 量级(收起/展开恒定的那一行)", + 16 <= head_h <= 40, f"head_h={head_h}") +check("P9.2 最小高已被重写为「只剩头部行」(bug 根因解除)", + sr.minimumSizeHint().height() == head_h and sd.minimumSizeHint().height() == sd.head_height(), + f"{sr.minimumSizeHint().height()} vs head {head_h}") + +h_run_before = sr.height() +h_done_before = sd.height() + +# ---- 收起「运行中」----- +sr.head.clicked.emit() +settle(120) # 只等一半 → 应处于动画中间态 +mid_run = sr.height() +settle(400) +check("P9.3 收起「运行中」→ 该栏只剩头部高(空白归零)", + abs(sr.height() - head_h) <= 2, f"h={sr.height()} head={head_h}") +check("P9.4 splitter sizes[0] == 头部高", + abs(panel.splitter.sizes()[0] - head_h) <= 2, str(panel.splitter.sizes())) +check("P9.5 「已完成」栏吃掉让出的空间", + sd.height() > h_done_before + 50, f"{h_done_before} -> {sd.height()}") +check("P9.6 让出空间 = 两栏高度之和不变", + abs((sr.height() + sd.height()) - (h_run_before + h_done_before)) <= 2, + f"{h_run_before}+{h_done_before} vs {sr.height()}+{sd.height()}") +check("P9.7 动画是渐变(中间帧介于首末之间)", + head_h < mid_run < h_run_before, f"mid={mid_run} ({head_h}, {h_run_before})") +check("P9.8 收起后内容区不可见(scroll.isVisible() == False)", + not sr.scroll.isVisible() and not sr.body.isVisible()) +check("P9.9 收起后头部行仍可见且高度不变", + sr.head.isVisible() and abs(sr.head.height() - head_h) <= 1, f"head={sr.head.height()}") +check("P9.10 收起态:栏头箭头变 ▸", sr.chev.text() == "▸") +check("P9.11 收起态:中间拖动分隔条被禁用", + panel.splitter.handle(1).isEnabled() is False) + +# ---- 再展开 ---- +sr.head.clicked.emit() +settle(120) +mid2 = sr.height() +settle(400) +check("P9.12 再展开 → 恢复原高度(±3)", + abs(sr.height() - h_run_before) <= 3, f"{sr.height()} vs {h_run_before}") +check("P9.13 展开也是渐变", head_h <= mid2 <= h_run_before, f"mid={mid2}") +check("P9.14 展开后内容可见 / 箭头回 ▾ / 分隔条恢复可拖", + sr.scroll.isVisible() and sr.chev.text() == "▾" and panel.splitter.handle(1).isEnabled()) +check("P9.15 折叠不影响层数据与实时缓冲", + len(panel.layer_ids("running")) == 1 and len(panel.layer_ids("done")) == 2 + and panel._layers["p9_run"].ok is None) + +# ---- 「已完成」栏单独收起同样生效 ---- +sd.head.clicked.emit() +settle(500) +check("P9.16 收起「已完成」→ 该栏只剩头部高", + abs(sd.height() - sd.head_height()) <= 2, f"h={sd.height()} head={sd.head_height()}") +# 🆕 新口径:收起「已完成」不再让「运行中」吃掉空间,而是保持它的高度、 +# 余量进底部留白(栏头紧跟上方内容,不被顶到底部) +check("P9.17 收起「已完成」→ 「运行中」高度保持不变(不再吃空间)", + abs(sr.height() - h_run_before) <= 3, f"{sr.height()} vs {h_run_before}") +sd.head.clicked.emit() +settle(500) +check("P9.18 展开恢复", abs(sd.height() - h_done_before) <= 3, f"{sd.height()} vs {h_done_before}") + +# ---- 两栏都收起 → 两个头部相邻在顶部 ---- +sr.head.clicked.emit(); settle(400) +sd.head.clicked.emit(); settle(400) +sizes2 = panel.splitter.sizes() +check("P9.19 两栏都收起 → sizes = [头部高, 头部高, 余量]", + abs(sizes2[0] - head_h) <= 2 and abs(sizes2[1] - head_h) <= 2 + and abs(sum(sizes2) - (panel.splitter.height() - 2 * panel.splitter.handleWidth())) <= 3, + str(sizes2)) +check("P9.20 两栏都收起时两个栏头相邻(间隔 = 分隔条宽)", + abs(sd.mapTo(panel, QtCore.QPoint(0, 0)).y() + - (sr.mapTo(panel, QtCore.QPoint(0, 0)).y() + sr.height()) + - panel.splitter.handleWidth()) <= 2, + f"sec2_y={sd.mapTo(panel, QtCore.QPoint(0, 0)).y()} sec1_y={sr.mapTo(panel, QtCore.QPoint(0, 0)).y()}") + +# ---- 连点 3 次 → 收敛到终态 ---- +for _s in (sr, sd): # 先确保两栏都展开 + if _s.folded: + _s.head.clicked.emit() + settle(500) +h_unfolded = sr.height() +sr.head.clicked.emit(); sr.head.clicked.emit(); sr.head.clicked.emit() +settle(700) +check("P9.21 未收起时连点 3 次 → 终态为收起,且只剩头部高", + sr.folded is True and abs(sr.height() - head_h) <= 2, + f"folded={sr.folded} h={sr.height()}") +sr.head.clicked.emit() +settle(700) +check("P9.22 连点后仍能正常展开并恢复原高度", + sr.folded is False and abs(sr.height() - h_unfolded) <= 3, + f"h={sr.height()} vs {h_unfolded}") + +# ---- 面板尺寸变化后仍钉在头部高 ---- +sr.head.clicked.emit() +settle(500) +sd_h_before = sd.head_height() +sizes_now = panel.splitter.sizes() +panel.splitter.setSizes([sizes_now[1], sizes_now[0]]) # 模拟被外部拉大/拉小 +settle(120) +panel._repin_fold() # resizeEvent 里的重钉 +settle(120) +check("P9.23 尺寸变化后收起栏仍只占头部高(_repin_fold 生效)", + abs(sr.height() - head_h) <= 2, f"h={sr.height()} head={head_h}") +sr.head.clicked.emit() +settle(500) +check("P9.24 收尾:两栏均展开,头部行高不变", + (not sr.folded) and (not sd.folded) + and sr.head_height() == head_h and sd.head_height() == sd_h_before, + f"{sr.head_height()}/{sd.head_height()} vs {head_h}/{sd_h_before}") + +# ====================================================================== +# 10) 🆕 两个实测 bug 的回归测试 +# bug1: 收起后 head 被拉伸成巨条(实测 793px) +# bug2: 收起「已完成」→ 栏头被顶到面板最底部 +# ====================================================================== +def sec_y(s): + return s.mapTo(panel, QtCore.QPoint(0, 0)).y() + +# ---- bug1: 头部行高【硬固定】(任意组合下都不被拉伸)---- +combos = [(False, False), (True, False), (False, True), (True, True)] +bad = [] +for want_r, want_d in combos: + for s, want in ((sr, want_r), (sd, want_d)): + if s.folded != want: + s.head.clicked.emit() + settle(450) + if sr.head.height() != sr.head_height() or sd.head.height() != sd.head_height(): + bad.append((want_r, want_d, sr.head.height(), sd.head.height())) +check("P9.25 四种折叠组合下 head.height() 恒等于 head_height()(不再被拉伸)", + not bad, str(bad)) +check("P9.26 两栏都收起时「已完成」head 高 == 24(修复前实测 793)", + sr.folded and sd.folded and sd.head.height() == sd.head_height() == head_h, + f"folded=({sr.folded},{sd.folded}) head={sd.head.height()}") +_sp = panel.splitter.sizes() +check("P9.27 两栏都收起 → 余量进底部留白(spacer)", + _sp[2] > 100 and abs(sum(_sp) - (panel.splitter.height() - 2 * panel.splitter.handleWidth())) <= 3, + str(_sp)) +check("P9.28 spacer 上方的分隔条不可拖且透明", + panel.splitter.handle(2).isEnabled() is False + and "transparent" in (panel.splitter.handle(2).styleSheet() or ""), + panel.splitter.handle(2).styleSheet()) + +# ---- bug2: 收起「已完成」→ 栏头紧跟「运行中」内容,而不是落到面板底部 ---- +for s in (sr, sd): + if s.folded: + s.head.clicked.emit() + settle(450) +h_run_keep = sr.height() +sd.head.clicked.emit() +settle(500) +sp_y = sd.mapTo(panel, QtCore.QPoint(0, 0)).y() +check("P9.29 收起「已完成」→ 栏头紧跟在「运行中」下方(不是面板底部)", + abs(sp_y - (sec_y(sr) + sr.height() + panel.splitter.handleWidth())) <= 2, + f"done_y={sp_y} run_bottom={sec_y(sr) + sr.height()}") +check("P9.30 收起「已完成」→ 栏头远离面板底部(留白在它下面)", + sp_y < panel.height() - 100, f"done_y={sp_y} panel_h={panel.height()}") +check("P9.31 收起「已完成」→ 「运行中」高度保持记录值", + abs(sr.height() - h_run_keep) <= 3, f"{sr.height()} vs {h_run_keep}") +check("P9.32 收起「已完成」→ spacer 吸收余量", + panel.splitter.sizes()[2] > 100, str(panel.splitter.sizes())) + +# ---- 展开恢复 ---- +sd.head.clicked.emit() +settle(550) +check("P9.33 展开「已完成」→ 恢复记录高度", + abs(sd.height() - h_done_before) <= 4, f"{sd.height()} vs {h_done_before}") +check("P9.34 展开后 spacer 归零(已完成重新填满到底部)", + panel.splitter.sizes()[2] <= 2, str(panel.splitter.sizes())) + +# ---- 不变量:任何折叠态下 sizes 之和 == 可用高度 ---- +ok_sum = True +for want_r, want_d in combos: + for s, want in ((sr, want_r), (sd, want_d)): + if s.folded != want: + s.head.clicked.emit() + settle(450) + avail = panel.splitter.height() - 2 * panel.splitter.handleWidth() + if abs(sum(panel.splitter.sizes()) - avail) > 3: + ok_sum = False +check("P9.35 不变量:任意折叠态下 sizes 之和 == splitter 可用高度", ok_sum) +for s in (sr, sd): + if s.folded: + s.head.clicked.emit() + settle(450) +check("P9.36 收尾:两栏均展开", (not sr.folded) and (not sd.folded)) + +# ====================================================================== +# 11) 🆕 P2-01:两栏按【启动顺序倒序】显示 + 重排复用实例/状态保持 +# · 排序键恒为启动序号(绝不用完成时间重排) +# · 重排复用同一批 BashLayer:展开态、实时输出、代码框滚动、栏滚动位置保持 +# ====================================================================== +panel.clear_all() +settle(120) + +# ---- 11.1 运行中栏:最新启动在第一项 ---- +panel.on_started("s1", "bash", {"command": "cmd-s1"}) +panel.on_started("s2", "bash", {"command": "cmd-s2"}) +panel.on_started("s3", "bash", {"command": "cmd-s3"}) +settle(150) +check("P11.1 运行中栏按启动倒序(s3 最新在第一项)", + panel.layer_ids("running") == ["s3", "s2", "s1"], + str(panel.layer_ids("running"))) +_rendered_run = [w for w in (panel.sec_running.lay.itemAt(i).widget() + for i in range(panel.sec_running.lay.count())) + if w is not None] +check("P11.2 实际布局顺序与显示顺序一致(widget 复用、顺序反转)", + [w.call_id for w in _rendered_run] == ["s3", "s2", "s1"], + str([w.call_id for w in _rendered_run])) + +# ---- 11.2 新任务触发重排:实例/展开态/实时输出/代码框滚动 全部保持 ---- +lay2 = panel._layers["s2"] +lay2.toggle() # 展开 s2 +panel.on_output("s2", "x" * 2000 + "\n") # 实时输出(NoWrap → 有水平滚动范围) +settle(120) # 等布局落定(真实用户滚动必然在渲染后; + # 否则首帧布局 flush 会把水平滚动归零——测试时序伪影,非产品 bug) +hbar = lay2.out_box.horizontalScrollBar() +hbar.setValue(500) +v0 = hbar.value() +dv0 = panel.sec_done.scroll.verticalScrollBar().value() +check("P11.3 前置:水平滚动处于非 0 位置", v0 > 0, f"v0={v0}") +panel.on_started("s4", "bash", {"command": "cmd-s4"}) # 新任务 → 两栏重排 +settle(150) +lay2b = panel._layers["s2"] +check("P11.4 重排后 s2 仍是同一个 BashLayer 实例(不重建)", lay2b is lay2) +check("P11.5 展开/折叠状态保持", lay2b.expanded is True and not lay2b.body.isHidden()) +check("P11.6 实时输出保持(未因重排丢失/重渲染)", lay2b._live == "x" * 2000 + "\n", + repr(lay2b._live[:20])) +check("P11.7 代码框水平滚动值保持", hbar.value() == v0, f"{hbar.value()} vs {v0}") +check("P11.8 已完成栏 section 滚动位置保持", + panel.sec_done.scroll.verticalScrollBar().value() == dv0) +check("P11.9 运行中栏重排后仍启动倒序(s4 顶到第一项)", + panel.layer_ids("running") == ["s4", "s3", "s2", "s1"], + str(panel.layer_ids("running"))) + +# ---- 11.3 完成时间【不是】排序键:s2 启动更晚却先完成 → 仍在 s1 之上 ---- +panel.on_finished("s2", "bash", True, "$ cmd-s2\nok2\n[exit 0] (0.1s)") +panel.on_finished("s1", "bash", True, "$ cmd-s1\nok1\n[exit 0] (0.2s)") +settle(150) +check("P11.10 已完成栏按启动倒序(s2 先完成仍在第一项,不按完成时间)", + panel.layer_ids("done") == ["s2", "s1"], str(panel.layer_ids("done"))) +check("P11.11 完成后从运行中栏消失(启动位置不变,仅换栏)", + panel.layer_ids("running") == ["s4", "s3"], str(panel.layer_ids("running"))) + +# ---- 11.4 运行中→已完成 仍占原启动位置(晚完成不顶到最上) ---- +panel.on_started("s6", "bash", {"command": "cmd-s6"}) +panel.on_finished("s6", "bash", True, "$ cmd-s6\nok6\n[exit 0] (0.1s)") +check("P11.12 s6 最后启动 → 顶到已完成栏第一项", + panel.layer_ids("done") == ["s6", "s2", "s1"], str(panel.layer_ids("done"))) +panel.on_finished("s3", "bash", True, "$ cmd-s3\nok3\n[exit 0] (0.3s)") # s3 最后完成 +settle(150) +check("P11.13 s3 最后完成但按启动位置插入第二项(不顶到最上)", + panel.layer_ids("done") == ["s6", "s3", "s2", "s1"], str(panel.layer_ids("done"))) + +# ---- 11.4b 已完成栏 section 滚动位置保持(有实际滚动范围时) ---- +_long = "\n".join(f"line-{j}" for j in range(20)) # 20 行 → 撑满 out_box 230px 上限 +panel._layers["s6"].set_finished(True, f"$ cmd-s6\n{_long}\n[exit 0] (0.1s)") +panel._layers["s3"].set_finished(True, f"$ cmd-s3\n{_long}\n[exit 0] (0.2s)") +panel._layers["s6"].toggle() # 展开两层 → 内容必然超出栏高,产生真实滚动范围 +panel._layers["s3"].toggle() +settle(150) +sbar = panel.sec_done.scroll.verticalScrollBar() +sbar.setValue(30) +sv0 = sbar.value() +check("P11.13b 前置:已完成栏存在真实滚动范围(v>0)", sv0 > 0, f"sv0={sv0} max={sbar.maximum()}") +panel.on_started("t0", "bash", {"command": "cmd-t0"}) # 新任务 → 两栏重排 +panel.on_finished("t0", "bash", True, "$ cmd-t0\nok\n[exit 0] (0.1s)") +settle(150) +check("P11.13c 重排后已完成栏 section 滚动值保持", sbar.value() == sv0, + f"{sbar.value()} vs {sv0}") +check("P11.13d 展开态在重排后仍保持", panel._layers["s6"].expanded is True + and panel._layers["s3"].expanded is True) + +# ---- 11.5 限量窗口:窗口成员不变,仅显示顺序反转(顶层 = 最新启动) ---- +for i in range(1, 32): + cid = f"t{i}" + panel.on_started(cid, "bash", {"command": f"cmd-{cid}"}) + panel.on_finished(cid, "bash", True, f"$ cmd-{cid}\nok\n[exit 0] (0.1s)") +settle(200) +check("P11.14 内部仍保留全部 36 个已完成(5 手工 + 31 批量)", len(panel.layer_ids("done")) == 36, + str(len(panel.layer_ids("done")))) +check("P11.15 限量显示仍为 30 层", panel.sec_done.count.text() == str(LAYER_LIMIT), + panel.sec_done.count.text()) +check("P11.16 「仅显示最近 N 层」提示保留", "仅显示最近 30 层" in panel.sec_done.hint.text(), + panel.sec_done.hint.text()) +_rendered_done = [w for w in (panel.sec_done.lay.itemAt(i).widget() + for i in range(panel.sec_done.lay.count())) + if w is not None] +check("P11.17 渲染窗口 = 最近启动的 30 个(不含最早启动的 s1/s2/s3/s6/t0/t1)", + [w.call_id for w in _rendered_done][0] == "t31" + and "s1" not in [w.call_id for w in _rendered_done] + and "s2" not in [w.call_id for w in _rendered_done] + and len(_rendered_done) == 30, + str([w.call_id for w in _rendered_done][:5])) +check("P11.18 已完成栏顶层 = 最新启动(t31),底层 = 窗口内最早(t2)", + [w.call_id for w in _rendered_done][0] == "t31" + and [w.call_id for w in _rendered_done][-1] == "t2", + str([w.call_id for w in _rendered_done][:2] + [w.call_id for w in _rendered_done][-1:])) + +# ---- 11.6 DB 重建(切换会话):启动序号 = 消息链顺序 + 时间线内顺序 → 显示倒序 ---- +sid5 = window.db.create_session("P2-01 启动倒序")["id"] +leaf5 = window.db.get_session_leaf(sid5) +tl5 = json.dumps([{"t": "tool", "id": f"db{i}", "name": "bash", + "args": json.dumps({"command": f"db-cmd{i}"}), + "ok": True, "result": f"$ db-cmd{i}\nok\n[exit 0] (0.1s)"} + for i in range(3)], ensure_ascii=False) +window.db.add_message(sid5, "assistant", "a", leaf5, timeline=tl5) +window.load_messages_to_web(sid5) +settle(300) +check("P11.19 DB 重建后已完成栏按启动倒序(db2 顶层、db0 底层)", + panel.layer_ids("done") == ["db2", "db1", "db0"], str(panel.layer_ids("done"))) +check("P11.20 「all」仍返回原始启动序号(正序,调试口径不变)", + panel.layer_ids() == ["db0", "db1", "db2"], str(panel.layer_ids())) + +print("\n===== " + ("ALL PASS" if ok else "HAS FAILURES") + " =====", flush=True) +if os.path.exists(_DB_TMP): + os.remove(_DB_TMP) +if os.path.exists(_CFG_TMP): + os.remove(_CFG_TMP) +# offscreen 铁律:QtWebEngine 渲染/GPU 子进程在解释器退出时可能不回收 → 挂起; +# 与 smoke_offscreen 等 offscreen harness 一致,用 os._exit 强制收尾(stdout 已 flush) +os._exit(0 if ok else 1) diff --git a/tests/smoke_copy_session.py b/tests/smoke_copy_session.py new file mode 100644 index 0000000..9652ca5 --- /dev/null +++ b/tests/smoke_copy_session.py @@ -0,0 +1,156 @@ +"""会话复制 · UI 入口端到端(offscreen) +链路:弹窗「📋 复制」按钮 → action_triggered("copy") → on_session_action → + DBManager.copy_session → 侧边栏重建 + 自动切到副本 + +运行: QT_QPA_PLATFORM=offscreen python tests/smoke_copy_session.py +""" +import os +import sys +import tempfile +import shutil + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost +os.environ.setdefault("PYTHONIOENCODING", "utf-8") + +# 铁律:测试不得污染真实 data/chat_history.db → 默认 DB 路径重定向到临时文件 +import core.db_manager as _dbm # noqa: E402 +_DB_TMP = os.path.join(tempfile.gettempdir(), f"haocode_test_copy_ui_{os.getpid()}.db") +if os.path.exists(_DB_TMP): + os.remove(_DB_TMP) +_dbm._DEFAULT_DB = _DB_TMP + +_FS_TMP = tempfile.mkdtemp(prefix="hocode_copy_ui_files_") # 临时附件根 + +from PyQt6.QtWidgets import QApplication, QPushButton # noqa: E402 +from PyQt6 import QtCore # noqa: E402 +from ui.views.main_window import MainWindow, SessionContextPopup # noqa: E402 + +app = QApplication(sys.argv) +ok = True + + +def check(name, cond, extra=""): + global ok + print((" PASS " if cond else " FAIL ") + name + ("" if cond else f" {extra}"), flush=True) + if not cond: + ok = False + + +def chain_sig(sid): + return [(m["role"], m["content"]) for m in window.db.get_message_chain(sid)] + + +window = MainWindow() +window.db.files_root = _FS_TMP + + +# ====================================================================== +# 1) 准备一个带内容的源会话(直接走 DB 层,不触发真实 API 请求) +# ====================================================================== +window.on_new_chat_clicked() +src = window.current_session_id +for role, text in [("user", "帮我看看这个文件"), ("assistant", "好的,我先读一下")]: + window.db.add_message(src, role, text, window.db.get_session_leaf(src)) +window.db.mark_session_has_messages(src) +window.rebuild_sidebar() +src_title = [s for s in window.db.get_all_sessions() if s["id"] == src][0]["title"] +check("源会话已就绪(2 条消息)", len(window.db.get_message_chain(src)) == 3, + str(len(window.db.get_message_chain(src)))) + +# 图片附件(验证 UI 链路里附件也被深拷贝) +os.makedirs(os.path.join(_FS_TMP, "data", "attachments"), exist_ok=True) +png = os.path.join(_FS_TMP, "data", "attachments", "ui_src.png") +with open(png, "wb") as f: + f.write(b"\x89PNG\r\n\x1a\nUI-IMAGE-BYTES") +meta = ('{"user_text":"看图","attachments":[{"type":"image","size_kb":0.1,' + '"local_path":"data/attachments/ui_src.png"}]}') +window.db.add_message(src, "user", "以及这张图", window.db.get_session_leaf(src), + attachment_metadata=meta) + +# ====================================================================== +# 2) 弹窗里存在「复制」按钮,且点击后发出 ("copy", sid) +# ====================================================================== +popup = SessionContextPopup(src, False, window) +btns = popup.findChildren(QPushButton) +texts = [b.text() for b in btns] +check("弹窗含「📋 复制」按钮", any("复制" in t for t in texts), str(texts)) +check("按钮顺序 编辑/星标/复制/删除", + len(texts) == 4 and "编辑" in texts[0] and "星标" in texts[1] + and "复制" in texts[2] and "删除" in texts[3], str(texts)) + +got = [] +popup.action_triggered.connect(lambda a, s: got.append((a, s))) +copy_btn = [b for b in btns if "复制" in b.text()][0] +copy_btn.click() +check("点击复制按钮发出 copy 动作", got == [("copy", src)], str(got)) + +# ====================================================================== +# 3) on_session_action("copy") → 真实克隆 + 侧边栏刷新 + 切到副本 +# ====================================================================== +n_before = len(window.db.get_all_sessions()) +window.on_session_action("copy", src) +sessions = window.db.get_all_sessions() +check("会话数 +1", len(sessions) == n_before + 1, f"{n_before}→{len(sessions)}") + +rows = [s for s in sessions if s["title"] == src_title + " (副本)"] +check("副本标题 = 源标题 + ' (副本)'", len(rows) == 1, str([s["title"] for s in sessions])) +copy_id = rows[0]["id"] if rows else None + +if copy_id: + check("副本不是源(ID 不同)", copy_id != src) + check("消息链完全一致", chain_sig(src) == chain_sig(copy_id)) + check("已自动切到副本", window.current_session_id == copy_id, str(window.current_session_id)) + check("侧边栏含副本项", + any(window.history_list.item(i).data(QtCore.Qt.ItemDataRole.UserRole) == copy_id + for i in range(window.history_list.count()))) + check("副本排在列表顶部(sort_order 最小)", + sessions[0]["id"] == copy_id, sessions[0]["title"]) + check("副本不带星标", rows[0]["is_starred"] == 0) + check("副本 mode 跟随源(未锁定为 None)", + rows[0]["mode"] == window.db.get_session_mode(src)) + + # 附件深拷贝:新旧文件同时存在,且副本 metadata 指向新文件 + import json as _json + c_rows = [m for m in window.db.get_message_chain(copy_id) if m.get("attachment_metadata")] + c_meta = _json.loads(c_rows[-1]["attachment_metadata"]) + new_rel = c_meta["attachments"][0]["local_path"] + check("副本附件已改名", new_rel != "data/attachments/ui_src.png", new_rel) + check("新旧图片文件同时存在", + os.path.isfile(png) and os.path.isfile(os.path.join(_FS_TMP, new_rel))) + check("副本图片内容一致", + open(os.path.join(_FS_TMP, new_rel), "rb").read() + == open(png, "rb").read()) + + # 删副本后源完好(UI 链路下的删除隔离) + window.db.delete_session(copy_id) + check("删副本后源消息链不变", chain_sig(src) == [ + ("system", "你是一个优秀的助手!"), ("user", "帮我看看这个文件"), + ("assistant", "好的,我先读一下"), ("user", "以及这张图")]) + check("删副本后源图片仍在", os.path.isfile(png)) + +# ====================================================================== +# 4) 生成中拒绝复制 +# ====================================================================== +n_before2 = len(window.db.get_all_sessions()) +window._active_streams[src] = {"worker": None} +window.on_session_action("copy", src) +check("会话生成中 → 拒绝复制(无新会话)", + len(window.db.get_all_sessions()) == n_before2) +window._active_streams.pop(src, None) + +# 5) 源不存在 → 静默失败,不崩 +try: + window.on_session_action("copy", "sess_not_exist_zzz") + check("源不存在时不抛异常", True) +except Exception as e: + check("源不存在时不抛异常", False, str(e)) + +print("\n===== " + ("ALL PASS" if ok else "HAS FAILURES") + " =====", flush=True) + +shutil.rmtree(_FS_TMP, ignore_errors=True) +if os.path.exists(_DB_TMP): + os.remove(_DB_TMP) +sys.exit(0 if ok else 1) diff --git a/tests/smoke_live_guard.py b/tests/smoke_live_guard.py new file mode 100644 index 0000000..b8228e6 --- /dev/null +++ b/tests/smoke_live_guard.py @@ -0,0 +1,280 @@ +# -*- coding: utf-8 -*- +"""四项 UI 增强回归测试(真实 WebEngine 页面): +1. rAF 卡死模拟(AMD 核显/合成器不出帧)→ 40ms 兜底仍实时渲染流式正文 +2. 深度思考默认收起 + .streaming-think 蓝色动画类;收尾后标签还原 +3. bash chip 耗时徽章([exit 0] (1.2s))+ 超时徽章(命令超时(>120s)) +4. 长结果:默认尾部 4000 字 + 展开按钮;点击展开全文/再点收起; + 收起状态下 finish 后结果仍可见(修复「结束后展开为空」) +运行: python tests/smoke_live_guard.py +""" +import json +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +window = None +results = [] + + +def check(name, ok, detail=""): + print(f" {'PASS' if ok else 'FAIL'} {name}" + + (f" [{detail}]" if detail and not ok else "")) + results.append(ok) + + +# Phase 0: rAF + 所有页面定时器全灭(极端节流)→ +# 内容必须上屏:同步通道(token 内)+ Qt 看门狗(200ms,forceRenderNow) +JS_PHASE_0A = r""" +(function() { + var out = {}; + window.__realRAF = window.requestAnimationFrame; + window.__realCAF = window.cancelAnimationFrame; + window.__realTO = window.setTimeout; + window.__realCTO = window.clearTimeout; + window.__realSI = window.setInterval; + window.__realCSI = window.clearInterval; + window.__fakeRafId = 0; + window.__fakeTimerId = 1000; + window.requestAnimationFrame = function() { return ++window.__fakeRafId; }; + window.cancelAnimationFrame = function(){}; + window.setTimeout = function() { return ++window.__fakeTimerId; }; + window.clearTimeout = function(){}; + window.setInterval = function() { return ++window.__fakeTimerId; }; + window.clearInterval = function(){}; + + var m0 = 'lg-sync-' + Date.now(); + window.__lgM0 = m0; + createMessage(m0, 'assistant', '', 'LG'); + appendReasoning(m0, 'sync think '); + appendToken(m0, 'sync text one '); + appendToken(m0, 'two'); + var segs = document.querySelectorAll('#' + m0 + ' .md-segment'); + var t = ''; + for (var i = 0; i < segs.length; i++) t += segs[i].textContent || ''; + out.textAtBurst = t; + return JSON.stringify(out); +})() +""" + +JS_PHASE_0B = r""" +(function() { + var out = {}; + var m0 = window.__lgM0; + var segs = document.querySelectorAll('#' + m0 + ' .md-segment'); + var t = ''; + for (var i = 0; i < segs.length; i++) t += segs[i].textContent || ''; + var tcs = document.querySelectorAll('#' + m0 + ' .think-content'); + var th = ''; + for (var i = 0; i < tcs.length; i++) th += tcs[i].textContent || ''; + out.text = t; + out.think = th; + // 恢复页面定时器 + window.requestAnimationFrame = window.__realRAF; + window.cancelAnimationFrame = window.__realCAF; + window.setTimeout = window.__realTO; + window.clearTimeout = window.__realCTO; + window.setInterval = window.__realSI; + window.clearInterval = window.__realCSI; + finishMessage(m0); + return JSON.stringify(out); +})() +""" + +# Phase A: 模拟 rAF 永不触发 + 流式 token;断言此刻 DOM 尚空(卡死生效) +JS_PHASE_A = r""" +(function() { + var out = {}; + window.__realRAF = window.requestAnimationFrame; + window.__realCAF = window.cancelAnimationFrame; + // 模拟真实卡死:rAF 返回真实挂起 ID(truthy)但回调永不被调用 + window.__fakeRafId = 0; + window.requestAnimationFrame = function(cb) { window.__rafCalls = (window.__rafCalls||0)+1; return ++window.__fakeRafId; }; + window.cancelAnimationFrame = function(){}; + + var mid = 'lg-' + Date.now(); + window.__lgMid = mid; + createMessage(mid, 'assistant', '', 'LG'); + appendReasoning(mid, 'deep '); + appendReasoning(mid, 'thinking...'); + appendToken(mid, 'live text one '); + appendToken(mid, 'two '); + appendToken(mid, 'three'); + + var segs = document.querySelectorAll('#' + mid + ' .md-segment'); + var domLen = 0; + for (var i = 0; i < segs.length; i++) + domLen += (segs[i].textContent || '').length; + out.rafCalls = window.__rafCalls || 0; + out.domLenBeforeTimers = domLen; + + // 思考块状态(默认收起 + 蓝色动画类) + var block = document.querySelector('#' + mid + ' .think-block'); + out.thinkOpen = block ? block.open : null; + out.thinkStreaming = block ? block.classList.contains('streaming-think') : false; + out.thinkLabel = block ? (block.querySelector('.think-label')||{}).textContent : null; + return JSON.stringify(out); +})() +""" + +# Phase B(timers 跑过之后): 兜底应已渲染正文 + 收尾 + 其余特性 +JS_PHASE_B = r""" +(function() { + var out = {}; + var mid = window.__lgMid; + var segs = document.querySelectorAll('#' + mid + ' .md-segment'); + var domText = ''; + for (var i = 0; i < segs.length; i++) domText += segs[i].textContent || ''; + out.liveTextRendered = domText.indexOf('live text one two three') !== -1; + + // 收尾:思考块标签还原 + 动画类移除 + finishMessage(mid); + var block = document.querySelector('#' + mid + ' .think-block'); + out.thinkLabelAfter = block ? (block.querySelector('.think-label')||{}).textContent : null; + out.thinkStreamingAfter = block ? block.classList.contains('streaming-think') : false; + // 恢复 rAF + window.requestAnimationFrame = window.__realRAF; + window.cancelAnimationFrame = window.__realCAF; + + // ---- 耗时 / 超时徽章 ---- + var mid2 = 'lg-timing-' + Date.now(); + createMessage(mid2, 'assistant', '', 'LG'); + toolExecutionStarted(mid2, 'call-ok', 'bash', JSON.stringify({command:'echo hi'})); + toolExecutionFinished(mid2, 'call-ok', 'bash', true, '$ echo hi\nhi\n[exit 0] (1.2s)'); + toolExecutionStarted(mid2, 'call-tmo', 'bash', JSON.stringify({command:'sleep 999'})); + toolExecutionFinished(mid2, 'call-tmo', 'bash', false, '命令超时(>120s)已终止'); + var w2 = document.getElementById(mid2); + var chipOk = w2.querySelector('[data-call-id="call-ok"]'); + var chipTmo = w2.querySelector('[data-call-id="call-tmo"]'); + out.durBadge = chipOk ? (chipOk.querySelector('.tool-chip-time')||{}).textContent : null; + out.tmoBadge = chipTmo ? (chipTmo.querySelector('.tool-chip-timeout')||{}).textContent : null; + + // ---- 收起状态下 finish:结果必须已写入(展开可见) ---- + var livePre = chipOk ? chipOk.querySelector('.tool-chip-live') : null; + out.resultWhileCollapsed = livePre ? (livePre.textContent || '').indexOf('hi') !== -1 : false; + + // ---- 长结果:尾部预览 + 展开/收起 ---- + var longRes = 'L'.repeat(1000) + ' MIDDLE-MARKER ' + 'R'.repeat(5000); // 6015 字,标记在头部(预览窗外) + toolExecutionStarted(mid2, 'call-long', 'read', JSON.stringify({path:'/big.txt'})); + toolExecutionFinished(mid2, 'call-long', 'read', true, longRes); + var chipLong = w2.querySelector('[data-call-id="call-long"]'); + var pre = chipLong ? chipLong.querySelector('.tool-chip-live') : null; + var btn = chipLong ? chipLong.querySelector('.tool-expand-btn') : null; + out.longHasBtn = !!btn; + out.longPreviewLen = pre ? (pre.textContent || '').length : 0; + out.longPreviewIsTail = pre ? (pre.textContent || '').lastIndexOf('R') > (pre.textContent||'').lastIndexOf('MIDDLE-MARKER') : false; + out.longPreviewHasMarker = pre ? (pre.textContent || '').indexOf('MIDDLE-MARKER') !== -1 : true; + if (btn) { + btn.click(); + out.expandedHasMarker = pre ? (pre.textContent || '').indexOf('MIDDLE-MARKER') !== -1 : false; + out.expandedLen = pre ? (pre.textContent || '').length : 0; + out.fullClass = pre ? pre.classList.contains('tool-chip-full') : false; + btn.click(); + out.collapseBackLen = pre ? (pre.textContent || '').length : 0; + } + return JSON.stringify(out); +})() +""" + + +def step1(): + global window + print("[step1] creating MainWindow...", flush=True) + window = MainWindow() + window.show() + print("[step1] shown, scheduling step2", flush=True) + QTimer.singleShot(3000, step2) + + +def step2(): + print("[step2] phase 0: kill all page timers + burst tokens", flush=True) + # 注册为当前会话的活跃流 → Qt 看门狗(200ms)会对它 forceRenderNow + window.current_session_id = "fake-sync-sid" + window._active_streams["fake-sync-sid"] = { + "msg_id": None, "content": "pending", "reasoning": "", + "timeline": [], "tl_kind": None, "parent_id": None, + "branch_info": None, "worker": None, "previous_leaf_id": None, + } + window.browser.page().runJavaScript(JS_PHASE_0A, on_p0a) + + +def on_p0a(res): + a = json.loads(str(res)) + print(f" phase0 burst 瞬间: text={a['textAtBurst']!r}") + # 把 JS 里生成的 mid 告诉看门狗(msg_id 需一致才会 forceRenderNow) + # —— 简化:直接改 JS 端记录的 mid 对应的 buffer 即可,这里用 runJavaScript 对齐 + window.browser.page().runJavaScript( + "window.__lgM0", lambda r: _align_and_wait(str(r))) + + +def _align_and_wait(mid): + mid = mid.strip().strip('"') + window._active_streams["fake-sync-sid"]["msg_id"] = mid + print("[phase0] 等待 Qt 看门狗渲染 (400ms) ...", flush=True) + QTimer.singleShot(400, on_p0b) + + +def on_p0b(): + window.browser.page().runJavaScript(JS_PHASE_0B, on_p0) + + +def on_p0(res): + p = json.loads(str(res)) + print(f" phase0 400ms 后: text={p['text']!r} think={p['think']!r}") + check("定时器全灭: burst 内思考同步上屏", "sync think" in p["think"], str(p)) + check("定时器全灭: 正文经同步通道/看门狗上屏", + "sync text one two" in p["text"], str(p)) + window._active_streams.pop("fake-sync-sid", None) + window.browser.page().runJavaScript(JS_PHASE_A, on_a) + + +def on_a(res): + print("[on_a] got result:", str(res)[:120], flush=True) + a = json.loads(str(res)) + print(f" phaseA: rafCalls={a['rafCalls']} domLenBefore={a['domLenBeforeTimers']}") + # v7 起:首 token 插入前已同步渲染(:empty 布局失效修复的副作用——首字必现), + # 故此刻 DOM 可能已有首 token 内容;本断言只验证 rAF 被调用但从未触发。 + check("rAF 被卡死(0 帧触发)", a["rafCalls"] > 0, str(a)) + check("思考块默认收起", a["thinkOpen"] is False) + check("思考块带蓝色动画类 streaming-think", a["thinkStreaming"]) + QTimer.singleShot(300, step3) + + +def step3(): + window.browser.page().runJavaScript(JS_PHASE_B, on_b) + + +def on_b(res): + b = json.loads(str(res)) + check("rAF 卡死时兜底仍实时渲染正文", b["liveTextRendered"], str(b)) + check("收尾后思考标签还原为『已完成深度思考』", + b["thinkLabelAfter"] == "已完成深度思考", str(b["thinkLabelAfter"])) + check("收尾后移除 streaming-think 动画类", b["thinkStreamingAfter"] is False) + check("耗时徽章 ⏱ 1.2s", b["durBadge"] == "⏱ 1.2s", str(b["durBadge"])) + check("超时徽章 ⏱ 超时 120s", b["tmoBadge"] == "⏱ 超时 120s", str(b["tmoBadge"])) + check("收起状态下 finish 后结果仍可见(修复展开为空)", b["resultWhileCollapsed"]) + check("长结果有展开按钮", b["longHasBtn"]) + check("长结果默认只显示尾部 4002 字", b["longPreviewLen"] == 4002, + str(b["longPreviewLen"])) + check("尾部预览不含中段标记(标记在头部)", b["longPreviewIsTail"] + and b["longPreviewHasMarker"] is False) + check("点击展开全文(含中段标记 + full 类)", + b["expandedHasMarker"] and b["fullClass"] + and b["expandedLen"] > 5000, str(b)) + check("再点收回到尾部预览", b["collapseBackLen"] == 4002, + str(b["collapseBackLen"])) + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: " + f"{sum(results)}/{len(results)} =====") + app.quit() + + +QTimer.singleShot(500, step1) +app.exec() diff --git a/tests/smoke_manual.py b/tests/smoke_manual.py new file mode 100644 index 0000000..e1fd0f4 --- /dev/null +++ b/tests/smoke_manual.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +"""验证人肉 debug 埋点链路: +Python [正文]/[思考] 打印 + JS console 桥 → [JS] 打印 全部出现在控制台 +""" +import os, sys +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from PyQt6.QtWidgets import QApplication +import PyQt6.QtWebEngineWidgets # noqa +from PyQt6.QtCore import QTimer +from ui.views.main_window import MainWindow + +app = QApplication(sys.argv) +window = MainWindow() +window.resize(1280, 800) +window.show() + +MID = "manual-debug-test" + +def step1(): + # 模拟一次真实的 send→token→finish 生命周期 + window.chat_bridge.create_message(MID, "assistant", "", "Test") + window.chat_bridge.append_reasoning(MID, "这是思考内容A") + window.chat_bridge.append_reasoning(MID, "思考B") + window.chat_bridge.append_token(MID, "这是正文第一段。") + window.chat_bridge.append_token(MID, "正文第二段来了。") + window.chat_bridge.tool_execution_started(MID, "call-xyz", "bash", "echo hi") + window.chat_bridge.tool_execution_finished(MID, "call-xyz", "bash", True, "hi\n[exit 0] (0.1s)") + QTimer.singleShot(800, step2) + +def step2(): + window.chat_bridge.finish_message(MID) + QTimer.singleShot(1200, done) + +def done(): + app.quit() + +QTimer.singleShot(2000, step1) +app.exec() +print("===== 测试结束(上方应看到 [生命周期]/[JS] 打印)=====") diff --git a/tests/smoke_midswitch.py b/tests/smoke_midswitch.py new file mode 100644 index 0000000..b915b04 --- /dev/null +++ b/tests/smoke_midswitch.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +"""中途切会话回归:agent 流式进行中切走 → 切回 → 时间线必须完整 +(用户报告:切走再切回,正文/思考那一段显示不出来) +运行: python tests/smoke_midswitch.py +""" +import json +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost + +# 铁律(P0-01):临时数据库 + 临时配置必须在 import MainWindow 之前完成 +from tests._test_env import isolate # noqa: E402 +_TMP = isolate("midswitch") # noqa: E402 + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +window = None +results = [] +S = {} # 测试状态 + + +def check(name, ok, detail=""): + print(f" {'PASS' if ok else 'FAIL'} {name}" + + (f" [{detail}]" if detail and not ok else "")) + results.append(ok) + + +CHECK_JS = r""" +(function() { + var mid = window.__msMid; + var w = document.getElementById(mid); + if (!w) return JSON.stringify({error: 'wrapper missing'}); + var tl = w.querySelector('.reply-content'); + var blocks = Array.prototype.map.call(tl.children, function(el) { + return el.className.split(' ')[0]; + }); + var texts = Array.prototype.map.call( + w.querySelectorAll('.md-segment'), + function(s) { return s.textContent || ''; }); + var thinks = Array.prototype.map.call( + w.querySelectorAll('.think-content'), + function(s) { return s.textContent || ''; }); + return JSON.stringify({blocks: blocks, texts: texts, thinks: thinks, + streaming: w.classList.contains('streaming')}); +})() +""" + + +def fire(session, fn, *args): + """模拟 worker 信号到达(UI 线程直接调 handler)""" + getattr(window, fn)(*([session] + list(args))) + + +def step1(): + global window + window = MainWindow() + window.show() + QTimer.singleShot(3000, step2) + + +def step2(): + db = window.db + sessA = db.create_session("切走测试A") + sessB = db.create_session("切走测试B") + A, B = sessA["id"], sessB["id"] + db.add_message(B, "user", "B 的问题", None) + + # ---- 会话 A 开始流式(手动模拟事件到达)---- + user_row = db.add_message(A, "user", "A 的问题", None) + mid = "msg-midswitch" + window.current_session_id = A + window.chat_bridge.create_message(mid, "assistant", "", "SW") + window._active_streams[A] = { + "msg_id": mid, "content": "", "reasoning": "", + "timeline": [], "tl_kind": None, + "parent_id": user_row["id"], "branch_info": None, "worker": None, + "previous_leaf_id": user_row["id"], + } + S.update(A=A, B=B, mid=mid) + window.browser.page().runJavaScript(f"window.__msMid = '{mid}';") + + # 阶段 1(A 前台):think1 + text1 + 工具 + fire(A, "on_reasoning_received", "思考第一") + fire(A, "on_reasoning_received", "段内容") + fire(A, "on_chunk_received", "工具前正文") + fire(A, "_on_tool_started", "call-ms", "bash", '{"command":"echo ms"}') + + QTimer.singleShot(800, switch_away) + + +def switch_away(): + """切到 B:A 的流继续在后台跑""" + print("[test] 切换到 B ...", flush=True) + window.load_messages_to_web(S["B"]) + # 阶段 2(A 后台):think2 + text2(只应累积,不进 JS) + QTimer.singleShot(600, lambda: ( + fire(S["A"], "on_reasoning_received", "思考第二"), + fire(S["A"], "on_chunk_received", "工具后正文"), + print("[test] 后台 token 已累积", flush=True), + QTimer.singleShot(600, switch_back) + )) + + +def switch_back(): + """切回 A:应重建 wrapper + 恢复时间线 + 后续无缝续流""" + print("[test] 切回 A ...", flush=True) + window.load_messages_to_web(S["A"]) + # ★ 切回后立即检查:恢复的正文/思考必须已同步上屏(不等 rAF/timer) + def check_right_away(): + window.browser.page().runJavaScript(CHECK_JS, lambda res: ( + print("[切回后立即]", str(res), flush=True), + check("切回后立即: 后台正文已同步上屏", + "工具后正文" in json.loads(str(res)).get("texts", [""] + [json.loads(str(res))["texts"][0] if json.loads(str(res)).get("texts") else ""])[0] or "工具后正文" in "".join(json.loads(str(res)).get("texts", []))), + QTimer.singleShot(300, phase3) + )) + def phase3(): + fire(S["A"], "on_chunk_received", " 续流正文") + QTimer.singleShot(600, finish_it) + QTimer.singleShot(400, check_right_away) + + +def finish_it(): + window.on_reply_finished(S["A"]) + QTimer.singleShot(400, step_check) + + +DIAG_JS = r""" +(function() { + var wrappers = Array.prototype.map.call( + document.querySelectorAll('.message-wrapper'), + function(w) { return w.id + ':' + w.className.split(' ')[1]; }); + return JSON.stringify({wrappers: wrappers, + bufKeys: Object.keys(window.messageBuffer || {})}); +})() +""" + +def step_check(): + def diag(res): + print("[diag]", str(res), flush=True) + window.browser.page().runJavaScript(CHECK_JS, on_check) + window.browser.page().runJavaScript(DIAG_JS, diag) + + +def on_check(res): + d = json.loads(str(res)) + if "error" in d: + check("切回后 wrapper 存在", False, d["error"]) + done() + return + blocks = d["blocks"] + texts = "".join(d["texts"]) + thinks = "".join(d["thinks"]) + print(f" blocks = {blocks}") + print(f" texts = {d['texts']}") + print(f" thinks = {d['thinks']}") + check("切回后 wrapper 存在", True) + check("块顺序与事件顺序一致: think→text→chip→think→text", + [b for b in blocks if b in + ("think-block", "tool-chip", "md-segment")] == + ["think-block", "md-segment", "tool-chip", "think-block", "md-segment"], + str(blocks)) + check("正文完整(切走前+后台+切回后)", + "工具前正文" in texts and "工具后正文" in texts + and "续流正文" in texts, str(d["texts"])) + check("思考完整(切走前+后台)", + "思考第一段内容" in thinks and "思考第二" in thinks, + str(d["thinks"])) + check("streaming 已收尾", not d["streaming"]) + # 入库验证 + row = window.db.get_message_chain(S["A"]) + asst = [m for m in row if m["role"] == "assistant"] + ok_db = False + if asst: + tl = asst[-1].get("timeline") + if tl: + tl_list = json.loads(tl) + joined = "".join(e.get("text", "") for e in tl_list if e["t"] == "text") + ok_db = ("工具前正文" in joined and "工具后正文" in joined + and "续流正文" in joined) + check("DB 时间线完整(三段正文都在)", ok_db) + done() + + +def done(): + try: + window.db.delete_session(S["A"]) + window.db.delete_session(S["B"]) + except Exception: + pass + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: " + f"{sum(results)}/{len(results)} =====") + app.quit() + + +QTimer.singleShot(500, step1) +app.exec() diff --git a/tests/smoke_mode.py b/tests/smoke_mode.py new file mode 100644 index 0000000..cc07655 --- /dev/null +++ b/tests/smoke_mode.py @@ -0,0 +1,94 @@ +"""offscreen 模式切换功能测试:DB 持久化 + 首条消息锁定 + worker 分派 +运行: QT_QPA_PLATFORM=offscreen python tests/smoke_mode.py +""" +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost +os.environ.setdefault("PYTHONIOENCODING", "utf-8") + +# 铁律:测试不得污染真实 data/chat_history.db → DBManager 默认路径重定向到临时文件 +import tempfile as _tf # noqa: E402 +import core.db_manager as _dbm # noqa: E402 +_dbm._DEFAULT_DB = os.path.join(_tf.gettempdir(), f"haocode_test_smoke_mode_{os.getpid()}.db") + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 (QtWebEngine 须先于 QApplication import 完成) + +app = QApplication(sys.argv) +ok = True + + +def check(name, cond): + global ok + print((" PASS " if cond else " FAIL ") + name) + if not cond: + ok = False + + +window = MainWindow() + +# 本套件验证「默认锁定」语义:显式置 mode_switch=false,不受本机 data/config.json 影响 +# (仅内存,不会写回配置文件) +window.config_data["mode_switch"] = False +window._refresh_mode_button() + +# 1) 新建会话 → 未锁定 +window.on_new_chat_clicked() +sid = window.current_session_id +check("新会话未锁定 (mode=None)", window._get_current_mode() is None) +check("按钮显示待选 Chat", "Chat" in window.btn_mode.text() and "🔒" not in window.btn_mode.text()) + +# 2) 浮动弹窗开/关 + 选择 +window.show_mode_popup() +check("弹窗打开", window.mode_popup.isVisible()) +window._select_mode("worker") +check("选 worker 后按钮更新", "Worker" in window.btn_mode.text()) +check("选择后弹窗自动关闭", not window.mode_popup.isVisible()) + +# 3) 首条发送 → 锁定 +window._lock_session_mode() +check("发送后锁定 worker", window.db.get_session_mode(sid) == "worker") +check("按钮显示锁定", "🔒" in window.btn_mode.text()) + +# 4) 锁定后不可改 +window._select_mode("chat") +check("锁定后选择无效", window.db.get_session_mode(sid) == "worker") + +# 5) worker 分派 +w1 = window._create_stream_worker([], "worker") +w2 = window._create_stream_worker([], "chat") +from core.llm_engine import AgentWorker, ChatWorker # noqa: E402 +check("worker 模式 → AgentWorker", isinstance(w1, AgentWorker)) +check("chat 模式 → ChatWorker", isinstance(w2, ChatWorker)) +check("ChatWorker 有基础信号", all(hasattr(w2, s) for s in + ("chunk_received", "reasoning_received", "error_occurred"))) +check("ChatWorker 无工具信号(chat 模式不暴露)", + not hasattr(w2, "tool_execution_started")) + +# 6) 切回新会话 → 解锁 +window.on_new_chat_clicked() +check("新会话恢复可选", window._get_current_mode() is None and "🔒" not in window.btn_mode.text()) + +# 7) 旧会话(无 mode 列值)→ 默认 chat 路径 +window.load_messages_to_web(sid) +check("切回已锁定会话显示锁定", window._get_current_mode() == "worker" and "🔒" in window.btn_mode.text()) + +# 8) mode_switch=true → 中途切换放行(旧锁定会话解锁 + 选择立即落库) +window.config_data["mode_switch"] = True +window._refresh_mode_button() +check("开关开启后旧会话解锁显示", "🔒" not in window.btn_mode.text()) +window._select_mode("chat") +check("开关开启后中途切换生效", window.db.get_session_mode(sid) == "chat") +window.config_data["mode_switch"] = False + +try: + window.close() +except Exception: + pass +app.quit() +print("\n===== " + ("ALL PASS" if ok else "HAS FAILURES") + " =====") +sys.exit(0 if ok else 1) diff --git a/tests/smoke_offscreen.py b/tests/smoke_offscreen.py new file mode 100644 index 0000000..2e77586 --- /dev/null +++ b/tests/smoke_offscreen.py @@ -0,0 +1,206 @@ +"""offscreen 冒烟测试:主窗口实例化 + 核心链路(不启动真实 LLM) +运行: QT_QPA_PLATFORM=offscreen python tests/smoke_offscreen.py +""" +import os +import sys +import json +import time + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost # 软渲染,离屏最稳 + +# 铁律:测试不得污染真实 data/chat_history.db → DBManager 默认路径重定向到临时文件 +import tempfile as _tf # noqa: E402 +import core.db_manager as _dbm # noqa: E402 +_dbm._DEFAULT_DB = os.path.join(_tf.gettempdir(), f"haocode_test_smoke_offscreen_{os.getpid()}.db") + +# P1-03:QtWebEngine 独立 profile 重定向到临时目录(不占项目 data/webengine/) +os.environ.setdefault( + "HAOCODE_WEBENGINE_PROFILE_DIR", + os.path.join(_tf.gettempdir(), f"haocode_test_smoke_offscreen_{os.getpid()}_profile")) + +import ctypes # noqa: E402 + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 + +# QtWebEngine 必须在 QApplication 创建前 import +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) + +results = [] + + +def check(name, fn): + try: + fn() + print(f" PASS {name}") + results.append(True) + except Exception as e: + import traceback + traceback.print_exc() + print(f" FAIL {name}: {e}") + results.append(False) + + +window = None +page_ready = {"ok": False} + + +def on_page_load_progress(v): + pass + + +def on_js_console(level, msg, line, src): + pass + + +def try_load(): + global window + try: + window = MainWindow() + page_ready["ok"] = True + except Exception: + import traceback + traceback.print_exc() + finish(False) + return + # MainWindow 构造完成时 HTML/JS 已就绪(loadFinished 可能早于连接) + QTimer.singleShot(6000, run_checks) # 等 JS 引擎 + 历史渲染完成 + + +def run_checks(): + # 1) 窗口已创建 + check("MainWindow 实例化", lambda: (_ for _ in ()).throw(AssertionError("no window")) if window is None else None) + + # 2) DB 链路 + def db_chain(): + assert window.db is not None + sessions = window.db.get_all_sessions() + assert isinstance(sessions, list) + + check("DB 会话列表", db_chain) + + # 3) build_api_context(P0 修复验证:不再有 reasoning 字段) + def ctx_build(): + sid = window.current_session_id + if not sid: + return + msgs = window.build_api_context(sid) + assert isinstance(msgs, list) + for m in msgs: + assert "reasoning" not in m, f"reasoning 字段仍在 API payload 里: {m.get('role')}" + + check("build_api_context 无 reasoning 字段", ctx_build) + + # 4) CJK token 估算 + def est(): + n = window._estimate_token_count([ + {"role": "user", "content": "你好,世界!这是一段中文测试。"}, + {"role": "assistant", "content": "hello world " * 20}, + ]) + assert isinstance(n, int) and n > 0 + + check("CJK token 估算", est) + + # 5) AgentWorker 可构造 + 信号齐全 + def worker(): + from core.llm_engine import AgentWorker, TitleWorker + w = AgentWorker(window.current_provider, window.current_model, + [{"role": "user", "content": "x"}]) + for sig in ("chunk_received", "reasoning_received", "error_occurred", + "tool_execution_started", "tool_execution_updated", + "tool_execution_finished", "context_compacted"): + assert hasattr(w, sig), sig + t = TitleWorker(window.current_provider, window.current_model, + [{"role": "user", "content": "x"}]) + assert hasattr(t, "chunk_received") + + check("AgentWorker/TitleWorker 构造", worker) + + # 6) bridge 工具方法 + def bridge(): + b = window.chat_bridge + for m in ("tool_execution_started", "tool_execution_updated", + "tool_execution_finished", "show_note"): + assert hasattr(b, m), m + + check("ChatBridge 工具事件方法", bridge) + + # 7) 离屏渲染 JS 就绪 + check("Web 页面加载完成", lambda: (_ for _ in ()).throw(AssertionError("page not ready")) if not page_ready["ok"] else None) + + # 8) 🌟 KaTeX 公式渲染(真实页面上下文:资源加载 + [...] 供应商格式 + 行内 $) + def _run_js(js, timeout_s=10): + result = {"val": None, "done": False} + + def on_ret(val): + if isinstance(val, str): + try: + val = json.loads(val) + except Exception: + pass + result["val"] = val + result["done"] = True + + if hasattr(window.browser, "execute_js_async"): # WebView2 路径(cb 收 JSON 字符串) + window.browser.execute_js_async(js, on_ret) + else: # QtWebEngine 路径(cb 收 Python 对象) + window.browser.page().runJavaScript(js, on_ret) + t0 = time.time() + while not result["done"] and time.time() - t0 < timeout_s: + app.processEvents() + time.sleep(0.05) + assert result["done"], "JS 执行超时" + return result["val"] + + def katex_render(): + # 等页面 JS 就绪(WV2 冷启动可能慢;app.js 就绪时置 window.jsReady=true) + for _ in range(30): + if _run_js("window.jsReady === true ? 1 : 0", timeout_s=3) == 1: + break + time.sleep(0.5) + else: + raise AssertionError("页面 JS 未就绪(jsReady)") + ver = _run_js("typeof katex !== 'undefined' ? katex.version : null") + assert ver, "katex 全局缺失(资源加载失败?)" + js = ("(function(){var s = '结果:" + chr(92) + "n[" + chr(92) + "nP_4=" + chr(92)*2 + "operatorname{BRF}(M_4,M_5)" + chr(92) + "n]" + chr(92) + "n" + chr(92) + "n行内 $E=mc^2$ 结束。';" + "var html = safeHtml(marked.parse(s));return {" + "has: html.indexOf('katex') !== -1," + "disp: (html.match(/katex-display/g) || []).length," + 'inline: (html.match(/class=\"katex\"/g) || []).length,' + "leaked: html.indexOf('@@K') !== -1," + "vis: html.indexOf('katex-html') !== -1," + "tex: html.indexOf('\\operatorname{BRF}') !== -1};})()") + r = _run_js(js) + assert isinstance(r, dict), f"意外返回: {r!r}" + assert r.get("has"), "未产生 KaTeX HTML" + assert r.get("disp", 0) >= 1, "块公式未渲染为 katex-display" + assert r.get("inline", 0) >= 1, "行内公式未渲染" + assert not r.get("leaked"), "占位符泄漏" + assert r.get("vis"), "缺少 katex-html 可视层(KaTeX 未真正渲染)" + assert r.get("tex"), "tex 未正确传入(转义错误)" + print(f" [info] KaTeX {ver} | display={r.get('disp')} inline={r.get('inline')}") + + check("KaTeX 公式渲染([...] 供应商格式 + 行内 $)", katex_render) + + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: {sum(results)}/{len(results)} =====") + try: + window.close() + except Exception: + pass + app.quit() + + +def finish(ok=None): + app.quit() + + +QTimer.singleShot(500, try_load) +QTimer.singleShot(90000, finish) # 总超时 +app.exec() +sys.exit(0 if all(results) else 1) diff --git a/tests/smoke_persist.py b/tests/smoke_persist.py new file mode 100644 index 0000000..17e1e6c --- /dev/null +++ b/tests/smoke_persist.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- +"""时间线持久化冒烟测试(真实 DB + 真实 WebEngine 页面): +1. 流式事件 → stream_state 时间线累积(思考/文本/工具 按序) +2. 入库(timeline 列)→ 切会话重载 → DOM 时间线还原(工具气泡不丢) +3. build_api_context 从时间线重建完整 API 链(assistant+tool_calls+tool) +4. 切回进行中的会话:restoreStreamingTimeline 续流 +运行: QT_QPA_PLATFORM=offscreen python tests/smoke_persist.py +""" +import json +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +results = [] +window = None +test = {"sid": None, "mid": None, "done": False} + + +def check(name, ok, detail=""): + print(f" {'PASS' if ok else 'FAIL'} {name}" + + (f" [{detail}]" if detail and not ok else "")) + results.append(ok) + + +def finish(): + if test["done"]: + return + test["done"] = True + # 清理测试会话 + try: + if test["sid"] and window: + window.db.delete_session(test["sid"]) + except Exception: + pass + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: " + f"{sum(results)}/{len(results)} =====") + app.quit() + + +# JS: 校验重载后的时间线 DOM +JS_VERIFY_RELOAD = r""" +(function() { + var out = {}; + try { + var mid = '__MID__'; + var wrapper = document.getElementById(mid); + if (!wrapper) return JSON.stringify({error: 'wrapper missing'}); + var tl = wrapper.querySelector('.reply-content'); + out.blocks = Array.prototype.map.call(tl.children, function(el) { + return el.className.split(' ')[0]; + }); + var chip = wrapper.querySelector('.tool-chip'); + var st = chip ? chip.querySelector('.tool-chip-status') : null; + out.chipStatus = st ? st.textContent : null; + out.chipOk = st ? st.classList.contains('ok') : false; + out.chipCallId = chip ? chip.getAttribute('data-call-id') : null; + var segs = wrapper.querySelectorAll('.md-segment'); + out.lastSegText = segs.length ? segs[segs.length - 1].textContent : ''; + out.thinkCount = wrapper.querySelectorAll('.think-block').length; + out.thinkChevron = !!wrapper.querySelector('.think-block .chev'); + } catch (e) { + out.error = String(e); + } + return JSON.stringify(out); +})() +""" + +# JS: 续流测试 +JS_RESUME_A = r""" +(function() { + try { + var mid = '__MID__'; + createMessage(mid, 'assistant', '', 'Resume'); + restoreStreamingTimeline(mid, '__TLJSON__'); + // 续流:接着最后一段文本写;思考新开一段 + appendToken(mid, '(续流文本)'); + appendReasoning(mid, '续思考内容'); + return 'resumeA-done'; + } catch (e) { + return 'resumeA-err:' + String(e); + } +})() +""" + +JS_RESUME_B = r""" +(function() { + try { + var mid = '__MID__'; + finishMessage(mid); + var wrapper = document.getElementById(mid); + var tl = wrapper.querySelector('.reply-content'); + var out = {}; + out.blocks = Array.prototype.map.call(tl.children, function(el) { + return el.className.split(' ')[0]; + }); + var segs = wrapper.querySelectorAll('.md-segment'); + out.lastSegText = segs.length ? segs[segs.length - 1].textContent : ''; + out.thinkCount = wrapper.querySelectorAll('.think-block').length; + out.chipCount = wrapper.querySelectorAll('.tool-chip').length; + wrapper.parentNode.removeChild(wrapper); + return JSON.stringify(out); + } catch (e) { + return 'resumeB-err:' + String(e); + } +})() +""" + + + +def run_checks(): + db = window.db + + # ---------- 建测试会话 + 模拟流式事件累积 ---------- + sess = db.create_session("持久化测试会话") + sid = sess["id"] + test["sid"] = sid + mid = "msg-persist-test" + test["mid"] = mid + + user_row = db.add_message(sid, "user", "测试问题", None) + user_id = user_row["id"] + + window.current_session_id = sid + window.chat_bridge.create_message(mid, "assistant", "", "PersistTest") + + st = { + "msg_id": mid, "content": "", "reasoning": "", + "timeline": [], "tl_kind": None, + "parent_id": user_id, "branch_info": None, "worker": None, + "previous_leaf_id": user_id, + } + window._active_streams[sid] = st + + # 事件序列:思考 → 文本 → 工具 → 思考 → 文本 + window.on_reasoning_received(sid, "先看一下") + window.on_reasoning_received(sid, "目录结构。") + window.on_chunk_received(sid, "我来执行") + window._on_tool_started(sid, "call-p1", "bash", '{"command": "echo hi"}') + window._on_tool_updated(sid, "call-p1", "hi\n") + window._on_tool_finished(sid, "call-p1", "bash", True, + "$ echo hi\nhi\n[exit 0]") + window.on_reasoning_received(sid, "输出正常。") + window.on_chunk_received(sid, "任务完成。") + + tl = st["timeline"] + check("时间线累积: 5 段", len(tl) == 5, str(tl)) + check("时间线类型序 think/text/tool/think/text", + [e["t"] for e in tl] == ["think", "text", "tool", "think", "text"], + str([e["t"] for e in tl])) + tool_e = tl[2] if len(tl) > 2 else {} + check("工具条目定格 ok+result", + tool_e.get("ok") is True and "[exit 0]" in tool_e.get("result", ""), + str(tool_e)) + check("聚合 content/reasoning 正确", + st["content"] == "我来执行任务完成。" + and st["reasoning"] == "先看一下目录结构。输出正常。", + f"{st['content']!r} / {st['reasoning']!r}") + + tl_json = json.dumps(tl, ensure_ascii=False) + + # ---------- 入库 ---------- + row = db.add_message(sid, "assistant", st["content"], user_id, + reasoning=st["reasoning"], msg_id=mid, + timeline=tl_json) + check("DB timeline 列写入", row.get("timeline") == tl_json) + + # ---------- 切走再切回(重载) ---------- + del window._active_streams[sid] # 模拟流已结束(先于重载,避免 live-restore 重复渲染) + window.load_messages_to_web(sid, show_loading=False) + + def verify_reload(res): + data = json.loads(str(res)) + if "error" in data: + check("重载 DOM 校验", False, data["error"]) + finish() + return + expected = ["think-block", "md-segment", "tool-chip", + "think-block", "md-segment"] + check("重载: 时间线块序还原", data["blocks"] == expected, + str(data["blocks"])) + check("重载: 工具气泡保留且成功", + data["chipOk"] and data["chipStatus"] == "✓ 完成" + and data["chipCallId"] == "call-p1", + f"{data['chipStatus']} {data['chipCallId']}") + check("重载: 思考块 x2 + 末段文本", + data["thinkCount"] == 2 and "任务完成。" in data["lastSegText"], + f"think={data['thinkCount']} seg={data['lastSegText']!r}") + check("重载: SVG 箭头", data["thinkChevron"]) + + # ---------- build_api_context 重建 ---------- + api = window.build_api_context(sid) + roles = [m["role"] for m in api] + check("API 链: user→assistant→tool→assistant", + roles == ["user", "assistant", "tool", "assistant"], + str(roles)) + asst1 = api[1] if len(api) > 1 else {} + check("API: 首条 assistant 带 tool_calls", + asst1.get("content") == "我来执行" + and len(asst1.get("tool_calls", [])) == 1 + and asst1["tool_calls"][0]["function"]["name"] == "bash", + str(asst1)[:200]) + check("API: tool 消息 tool_call_id 对齐", + len(api) > 2 and api[2].get("tool_call_id") == "call-p1" + and "[exit 0]" in api[2].get("content", ""), + str(api[2] if len(api) > 2 else {})[:200]) + check("API: 末条 assistant = 最终回答", + len(api) > 3 and api[3].get("content") == "任务完成。") + check("API: 无 reasoning 字段", + all("reasoning" not in m for m in api)) + + # ---------- 切回进行中会话: 续流 ---------- + tljs = json.dumps(tl_json) + js_a = (JS_RESUME_A + .replace("'__MID__'", "'msg-resume-test'") + .replace("restoreStreamingTimeline(mid, '__TLJSON__')", + f"restoreStreamingTimeline(mid, {tljs})")) + js_b = JS_RESUME_B.replace("'__MID__'", "'msg-resume-test'") + + def verify_resume_data(d2): + if "error" in d2: + check("续流 DOM 校验", False, d2["error"]) + finish() + return + expected2 = ["think-block", "md-segment", "tool-chip", + "think-block", "md-segment", "think-block"] + check("续流: 块序正确", d2["blocks"] == expected2, + str(d2["blocks"])) + check("续流: 文本并入末段", + "任务完成。(续流文本)" in d2["lastSegText"], + d2["lastSegText"]) + check("续流: 思考 x3 + 工具 x1", + d2["thinkCount"] == 3 and d2["chipCount"] == 1, + f"think={d2['thinkCount']} chip={d2['chipCount']}") + finish() + + def run_b(): + def got_b(v): + vstr = "" if v is None else str(v) + print(f" [resume B] {vstr[:120]}") + if vstr.startswith("resumeB-err"): + check("续流 finishMessage", False, vstr) + finish() + return + try: + d2 = json.loads(vstr) + except Exception: + check("续流 DOM 校验", False, repr(vstr)[:120]) + finish() + return + verify_resume_data(d2) + window.browser.page().runJavaScript(js_b, got_b) + + def run_a(): + def got_a(v): + vstr = "" if v is None else str(v) + print(f" [resume A] {vstr[:120]}") + if vstr.startswith("resumeA-err"): + check("续流 restore", False, vstr) + finish() + return + QTimer.singleShot(300, run_b) + window.browser.page().runJavaScript(js_a, got_a) + + QTimer.singleShot(300, run_a) + + + + window.browser.page().runJavaScript( + JS_VERIFY_RELOAD.replace("'__MID__'", f"'{mid}'"), verify_reload) + + +def main(): + global window + try: + window = MainWindow() + except Exception: + import traceback + traceback.print_exc() + app.quit() + return + QTimer.singleShot(6000, run_checks) + QTimer.singleShot(45000, lambda: (check("超时", False, "45s 未完成"), + finish()) if not test["done"] else None) + app.exec() + + +if __name__ == "__main__": + main() diff --git a/tests/smoke_probe.py b/tests/smoke_probe.py new file mode 100644 index 0000000..34477c6 --- /dev/null +++ b/tests/smoke_probe.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +"""验证 probeStream 探针在真实 WebEngine 页返回正确数据""" +import os, sys +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from PyQt6.QtWidgets import QApplication +import PyQt6.QtWebEngineWidgets # noqa +from PyQt6.QtCore import QTimer +from ui.views.main_window import MainWindow + +PASS = 0 +FAIL = 0 + +def check(name, cond, detail=""): + global PASS, FAIL + if cond: + PASS += 1 + print(f" PASS {name}") + else: + FAIL += 1 + print(f" FAIL {name} {detail}") + +app = QApplication(sys.argv) +window = MainWindow() +window.resize(1280, 800) +window.show() + +PROBE_JS = r""" +(function() { + var m = 'probe-test-' + Date.now(); + createMessage(m, 'assistant', '', 'LG'); + appendReasoning(m, '思考探针内容'); + appendToken(m, '正文探针 '); + appendToken(m, '第二段'); + // 同步强制渲染 + if (typeof forceRenderNow === 'function') forceRenderNow(m); + var res = probeStream(m); + finishMessage(m); + return res; +})() +""" + +def step1(): + window.browser.page().runJavaScript(PROBE_JS, on_probe) + +def on_probe(res): + import json + d = json.loads(str(res)) + print(" probe:", str(d)[:300]) + check("probe 返回缓冲段", len(d.get("segs", [])) >= 1, str(d)) + if d.get("segs"): + s0 = d["segs"][0] + check("缓冲长度>0", s0["b"] > 0, str(s0)) + check("DOM 已写入", s0["d"] > 0, str(s0)) + check("思考段探针", len(d.get("thinks", [])) >= 1, str(d)) + check("无 JS 异常", "err" not in d, str(d)) + print(f"===== {'ALL PASS' if FAIL == 0 else 'HAS FAILURES'}: {PASS}/{PASS+FAIL} =====") + app.quit() + +QTimer.singleShot(1500, step1) +app.exec() +sys.exit(1 if FAIL else 0) diff --git a/tests/smoke_repro_real.py b/tests/smoke_repro_real.py new file mode 100644 index 0000000..5664ee9 --- /dev/null +++ b/tests/smoke_repro_real.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +"""用 DB 里用户真实消息内容回放流式渲染,验证新路径是否正确。 +每个 chunk 走独立 runJavaScript(模拟 Python 逐 token 推送的真实路径)。""" +import os, sys, json, sqlite3 +# 不加 --disable-gpu:复现真实应用的 GPU 渲染环境 +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = os.environ.get("QTWEBENGINE_CHROMIUM_FLAGS", "") +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from PyQt6.QtWidgets import QApplication +import PyQt6.QtWebEngineWidgets # noqa +from PyQt6.QtCore import QTimer +from ui.views.main_window import MainWindow + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +PASS = 0 +FAIL = 0 + +def check(name, cond, detail=""): + global PASS, FAIL + if cond: + PASS += 1 + print(f" PASS {name}") + else: + FAIL += 1 + print(f" FAIL {name} {detail}") + +def esc(s): + return s.replace("\\", "\\\\").replace("'", "\\'").replace("\n", "\\n") + +# 取用户真实消息 +conn = sqlite3.connect(os.path.join(ROOT, "data", "chat_history.db")) +conn.row_factory = sqlite3.Row +row = conn.execute( + "SELECT content, timeline FROM messages WHERE id LIKE 'msg-99235c06%' " + "ORDER BY created_at DESC LIMIT 1").fetchone() +assert row, "DB 中找不到测试消息" +timeline = json.loads(row["timeline"] or "[]") +print(f"消息: content={len(row['content'])}c, timeline={len(timeline)} 条") + +MID = "repro-real" +# 构造回放脚本序列:think/text 按 20 字符切块,每批 20 个 chunk 一次 JS 调用 +CHUNK = 20 +BATCH = 20 +steps = [] # JS 片段列表 +for e in timeline: + t = e.get("t") + txt = e.get("text", "") + if t in ("think", "text") and txt: + for i in range(0, len(txt), CHUNK): + fn = "appendReasoning" if t == "think" else "appendToken" + steps.append(f"{fn}('{MID}', '{esc(txt[i:i+CHUNK])}');") +steps_batched = [chr(10).join(steps[i:i+BATCH]) for i in range(0, len(steps), BATCH)] + +app = QApplication(sys.argv) +window = MainWindow() +window.resize(1280, 800) +window.show() + +state = {"idx": 0, "probed": False} + +def next_batch(): + """一次送一批(20 个 chunk 拼接在一个 JS 任务里)""" + if state["idx"] >= len(steps_batched): + QTimer.singleShot(300, mid_probe) + return + bi = state["idx"] + js = steps_batched[bi] + total = len(steps_batched) + + def done(r, bi=bi): + state["idx"] = bi + 1 + # 过半时探针一次 + if not state["probed"] and bi + 1 >= total // 2: + state["probed"] = True + window.browser.page().runJavaScript( + f"probeStream('{MID}')", on_mid_probe) + else: + QTimer.singleShot(0, next_batch) + window.browser.page().runJavaScript(js, done) + +def on_mid_probe(res): + d = json.loads(str(res)) + print(" [过半探针]", str(d)[:400]) + check("中途: 缓冲已累积", any(s["b"] > 0 for s in d.get("segs", [])), str(d)) + check("中途: DOM 已写入部分正文", + any(s["d"] > 0 for s in d.get("segs", [])), str(d)) + check("中途: 思考 DOM 已写入", + any(t["d"] > 0 for t in d.get("thinks", [])), str(d)) + finish_seq() + +def mid_probe(): + window.browser.page().runJavaScript(f"probeStream('{MID}')", on_mid_probe) + +def finish_seq(): + window.browser.page().runJavaScript( + f"finishMessage('{MID}'); probeStream('{MID}')", on_final) + +def on_final(res): + d = json.loads(str(res)) + print(" [最终探针]", str(d)[:400]) + tot_b = sum(s["b"] for s in d.get("segs", [])) + tot_d = sum(s["d"] for s in d.get("segs", [])) + check("最终: 正文缓冲完整", tot_b > 500, f"b={tot_b}") + check("最终: 正文 DOM 完整", tot_d > 500, f"d={tot_d}") + check("最终: 思考 DOM 完整", + sum(t["d"] for t in d.get("thinks", [])) > 500, + str([t['d'] for t in d.get('thinks', [])])) + # DOM 实际包含关键子串 + window.browser.page().runJavaScript( + "(function(){ var w = document.getElementById('" + MID + "');" + " return w ? w.textContent.length : -1; })()", on_text) + +def on_text(res): + n = int(str(res) or 0) + check("DOM 总文本量正常", n > 1000, f"total={n}") + print(f"===== {'ALL PASS' if FAIL == 0 else 'HAS FAILURES'}: {PASS}/{PASS+FAIL} =====") + app.quit() + +def start(): + window.browser.page().runJavaScript( + f"createMessage('{MID}', 'assistant', '', 'Real');", + lambda r: QTimer.singleShot(200, next_batch)) + +QTimer.singleShot(1500, start) +app.exec() +sys.exit(1 if FAIL else 0) diff --git a/tests/smoke_timeline.py b/tests/smoke_timeline.py new file mode 100644 index 0000000..0e6f087 --- /dev/null +++ b/tests/smoke_timeline.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +"""时间线 DOM 冒烟测试(真实 WebEngine 页面内执行): +1. 流式事件序列 → 思考/正文/工具按事件顺序穿插 +2. 工具 chip 按 call_id 对号入座 + ok 状态(修复反转 bug) +3. SVG 箭头存在、流式光标移除 +4. 历史消息静态路径不受影响 +运行: QT_QPA_PLATFORM=offscreen python tests/smoke_timeline.py +""" +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" # 绕过 AMD 核显 context lost + +# 铁律(P0-01):临时数据库 + 临时配置必须在 import MainWindow 之前完成 +from tests._test_env import isolate # noqa: E402 +_TMP = isolate("timeline") # noqa: E402 + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 (QtWebEngine 已先导入) + +app = QApplication(sys.argv) + +results = [] +window = None +done = {"ok": False} + + +def check(name, ok, detail=""): + print(f" {'PASS' if ok else 'FAIL'} {name}" + (f" [{detail}]" if detail and not ok else "")) + results.append(ok) + + +def js(s): + return s + + +JS_SIM = js(r""" +(function() { + var out = {}; + try { + // ---- 1. 流式时间线 ---- + var mid = 'tl-test-' + Date.now(); + createMessage(mid, 'assistant', '', 'TL'); + var wrapper = document.getElementById(mid); + appendReasoning(mid, 'think part 1 '); + appendReasoning(mid, 'more thinking'); + appendToken(mid, 'before tool text '); + toolExecutionStarted(mid, 'call-1', 'bash', JSON.stringify({command: 'echo hi'})); + toolExecutionUpdated(mid, 'call-1', 'hi\n'); + toolExecutionFinished(mid, 'call-1', 'bash', true, '$ echo hi\nhi\n[exit 0]'); + appendToken(mid, ' after tool'); + appendReasoning(mid, ' second thinking'); + appendToken(mid, ' final answer'); + finishMessage(mid); + + var tl = wrapper.querySelector('.reply-content'); + out.blocks = Array.prototype.map.call(tl.children, function(el) { + return el.className.split(' ')[0]; + }); + var chip = wrapper.querySelector('.tool-chip'); + var status = chip ? chip.querySelector('.tool-chip-status') : null; + out.chipStatusText = status ? status.textContent : null; + out.chipOk = status ? status.classList.contains('ok') : false; + out.chipBrief = chip ? (chip.querySelector('.tool-chip-brief') || {}).textContent : null; + out.chipCallId = chip ? chip.getAttribute('data-call-id') : null; + out.thinkChevron = !!wrapper.querySelector('.think-block .chev'); + out.chipChevron = !!wrapper.querySelector('.tool-chip .chev'); + out.typingRemoved = !wrapper.querySelector('.streaming-typing'); + out.streamClassOff = !wrapper.classList.contains('streaming'); + out.thinkBlocks = wrapper.querySelectorAll('.think-block').length; + out.mdSegs = wrapper.querySelectorAll('.md-segment').length; + + // ---- 2. 历史消息静态路径 ---- + var mid2 = 'tl-hist-' + Date.now(); + createMessage(mid2, 'assistant', 'hello **world**', 'TL'); + insertThinkBlock(mid2, 'history thinking'); + finishMessage(mid2); + var w2 = document.getElementById(mid2); + var content2 = w2.querySelector('.message-content'); + out.histOrder = Array.prototype.map.call(content2.children, function(el) { + return el.className.split(' ')[0]; + }); + out.histBold = w2.querySelector('.reply-content strong') !== null; + out.histThinkChevron = !!w2.querySelector('.think-block .chev'); + out.histThinkLabel = (w2.querySelector('.think-label') || {}).textContent; + + // ---- 3. 失败工具 chip(反转修复验证)---- + var mid3 = 'tl-fail-' + Date.now(); + createMessage(mid3, 'assistant', '', 'TL'); + toolExecutionStarted(mid3, 'call-x', 'bash', '{"command":"false"}'); + toolExecutionFinished(mid3, 'call-x', 'bash', false, 'boom'); + var w3 = document.getElementById(mid3); + var st3 = w3.querySelector('.tool-chip-status'); + out.failChipFail = st3 ? st3.classList.contains('fail') : false; + out.failChipText = st3 ? st3.textContent : null; + finishMessage(mid3); + + // 清理 + [mid, mid2, mid3].forEach(function(id) { + var el = document.getElementById(id); + if (el) el.parentNode.removeChild(el); + }); + } catch (e) { + out.error = String(e) + ' | ' + (e.stack || '').split('\n')[1]; + } + return JSON.stringify(out); +})() +""") + + +def run_js_check(): + page = window.browser.page() if hasattr(window, "browser") else None + if page is None: + # 找 QWebEnginePage + from PyQt6.QtWebEngineWidgets import QWebEngineView + views = window.findChildren(QWebEngineView) + page = views[0].page() if views else None + if page is None: + check("页面句柄", False, "no page") + finish() + return + + def on_result(res): + try: + import json + data = json.loads(str(res)) + except Exception as e: + check("JS 执行", False, f"bad json: {res} ({e})") + finish() + return + if "error" in data: + check("JS 执行", False, data["error"]) + finish() + return + + # 期望时间线: think → text → chip → text → think → text + expected = ["think-block", "md-segment", "tool-chip", + "md-segment", "think-block", "md-segment"] + check("时间线块顺序(思考/正文/工具穿插)", data["blocks"] == expected, + str(data["blocks"])) + check("两个思考段 + 三个正文段", + data["thinkBlocks"] == 2 and data["mdSegs"] == 3, + f"think={data['thinkBlocks']} segs={data['mdSegs']}") + check("工具 chip 成功状态(非反转)", + data["chipOk"] and data["chipStatusText"] == "✓ 完成", + f"{data['chipStatusText']} ok={data['chipOk']}") + check("chip 摘要=结果首行", data["chipBrief"] == "$ echo hi", + str(data["chipBrief"])) + check("chip call_id 贯通", data["chipCallId"] == "call-1", + str(data["chipCallId"])) + check("SVG 箭头(思考+工具)", data["thinkChevron"] and data["chipChevron"]) + check("流式光标已移除 + streaming 类移除", + data["typingRemoved"] and data["streamClassOff"]) + check("失败 chip 标 ✗", data["failChipFail"] and data["failChipText"] == "✗ 失败", + f"{data['failChipText']}") + check("历史消息: 思考在正文前", + data["histOrder"].index("think-block") < data["histOrder"].index("reply-content"), + str(data["histOrder"])) + check("历史消息: markdown 正常解析", data["histBold"]) + check("历史消息: 思考块带 SVG 箭头+标签", + data["histThinkChevron"] and data["histThinkLabel"] == "已完成深度思考", + str(data["histThinkLabel"])) + finish() + + page.runJavaScript(JS_SIM, on_result) + + +def finish(): + done["ok"] = True + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: " + f"{sum(results)}/{len(results)} =====") + app.quit() + + +def main(): + global window + try: + window = MainWindow() + except Exception: + import traceback + traceback.print_exc() + app.quit() + return + QTimer.singleShot(6000, run_js_check) + QTimer.singleShot(25000, lambda: (check("超时", False, "25s 未完成"), finish()) + if not done["ok"] else None) + app.exec() + + +if __name__ == "__main__": + main() diff --git a/tests/test_agent_core.py b/tests/test_agent_core.py new file mode 100644 index 0000000..ca47c81 --- /dev/null +++ b/tests/test_agent_core.py @@ -0,0 +1,1323 @@ +""" +tests/test_agent_core.py +======================== +离线确定性测试:用脚本化 mock 流函数验证 core/agent 的 pi 1:1 语义。 +运行:conda run -n haocode python -m pytest tests/test_agent_core.py -v +(无网络、无 Qt 依赖) +""" +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +# P0-01:provider 用例经统一配置入口读取临时配置(测试 provider),不碰真实 data/config.json +from tests._test_env import isolate # noqa: E402 +isolate("agentcore") + +import pytest + +from core.agent import (Agent, AgentConfig, AgentError, ModelConfig, RetryConfig) +from core.agent.compaction import ( + compact_context, find_cut_point, find_turn_start, find_valid_cut_points, + prepare_compaction, serialize_conversation, format_file_operations, + FileOperations, extract_file_ops_from_message, compute_file_lists, +) +from core.agent.context import (clamp_max_tokens_to_context, should_compact, + estimate_context_tokens) +from core.agent.recovery import AgentRunner +from core.agent.stream_fn import to_openai_messages, from_openai_messages +from core.agent.tools import default_tools +from core.agent.types import (AgentMessage, ToolCall, AgentTool, + AgentToolResult) + + +# ====================================================================== +# 脚本化 mock 流:每个 turn 一个 dict,按序消费 +# ====================================================================== +def make_scripted_stream(turns): + state = {"i": 0} + + def stream_fn(context, model, signal, max_tokens, tools=None): + turn = turns[min(state["i"], len(turns) - 1)] + state["i"] += 1 + content = turn.get("content", "") + reasoning = turn.get("reasoning", "") + tool_calls = turn.get("tool_calls", []) + chunks = max(1, turn.get("chunks", 3)) + + if turn.get("raise"): + raise turn["raise"] + + if reasoning: + yield ("event", _thinking(reasoning)) + for i in range(0, len(content), max(1, len(content) // chunks) if content else 1): + piece = content[i:i + max(1, len(content) // chunks) if content else 1] + if signal.aborted: + return # 中止:生成器提前结束(真实流行为) + yield ("event", _text(piece)) + for tc in tool_calls: + yield ("event", _tc_delta(0, tc["id"], "id")) + yield ("event", _tc_delta(0, tc["name"], "name")) + yield ("event", _tc_delta(0, _json(tc["arguments"]), "arguments")) + + usage = turn.get("usage", {"input": 10, "output": 10}) + final = AgentMessage( + role="assistant", content=content, reasoning=reasoning, + tool_calls=[ToolCall(id=tc["id"], name=tc["name"], + arguments=tc["arguments"]) for tc in tool_calls], + stop_reason=turn.get("stop_reason", "stop"), usage=usage, + ) + yield ("event", _done()) + yield ("final", final) + + return stream_fn + + +def _text(t): + from core.agent.types import AssistantMessageEvent + return AssistantMessageEvent.text_delta(t) + + +def _thinking(t): + from core.agent.types import AssistantMessageEvent + return AssistantMessageEvent.thinking_delta(t) + + +def _tc_delta(idx, d, field): + from core.agent.types import AssistantMessageEvent + return AssistantMessageEvent.toolcall_delta(idx, d, field=field) + + +def _done(): + from core.agent.types import AssistantMessageEvent + return AssistantMessageEvent.done() + + +def _json(o): + import json + return json.dumps(o, ensure_ascii=False) + + +def make_agent(turns, **cfg_kw): + model = ModelConfig(provider="mock", name="mock-model", + context_window=cfg_kw.pop("context_window", 100000), + max_tokens=cfg_kw.pop("max_tokens", 32768), + api_key="x", base_url="http://mock") + cfg = AgentConfig(model=model, tools=cfg_kw.pop("tools", []), **cfg_kw) + agent = Agent(cfg) + agent.set_stream_fn(make_scripted_stream(turns)) + return agent + + +def run_events(agent): + events = [] + agent.subscribe(lambda e: events.append(e)) + return events + + +# ====================================================================== +# 1. 基础对话 + 事件顺序(对照 pi 事件流) +# ====================================================================== +def test_basic_chat_event_order(): + agent = make_agent([{"content": "你好呀!", "chunks": 4}]) + events = run_events(agent) + result = agent.prompt("hi") + types = [e.type for e in events] + assert types[0] == "agent_start" + assert types[1] == "turn_start" + assert "message_start" in types and "message_end" in types + assert types.count("message_update") == 4 # 4 个 chunk → 4 次增量 + assert types[-1] == "agent_end" + assert result.stop_reason == "stop" + assert agent.state.messages[0].role == "user" + assert agent.state.messages[1].role == "assistant" + assert agent.state.messages[1].content == "你好呀!" + assert not agent.state.is_streaming + + +# ====================================================================== +# 2. 工具循环:bash 调用 → 执行 → 第二轮回答(对照 pi tool 管线) +# ====================================================================== +def test_tool_loop_executes_and_continues(): + agent = make_agent( + [{"tool_calls": [{"id": "call_1", "name": "bash", + "arguments": {"command": "echo hi-from-tool"}}], + "stop_reason": "stop"}, + {"content": "命令执行完了。"}], + tools=default_tools(), + ) + events = run_events(agent) + result = agent.prompt("执行一下") + types = [e.type for e in events] + assert "tool_execution_start" in types + assert "tool_execution_end" in types + # 工具结果消息进了上下文 + trs = [m for m in agent.state.messages if m.role == "toolResult"] + assert len(trs) == 1 + assert trs[0].tool_name == "bash" + tr_text = trs[0].content if isinstance(trs[0].content, str) else \ + "".join(c.get("text", "") for c in trs[0].content) + assert "hi-from-tool" in tr_text + # 两轮:2 个 assistant + assistants = [m for m in agent.state.messages if m.role == "assistant"] + assert len(assistants) == 2 + assert assistants[1].content == "命令执行完了。" + assert result.stop_reason == "stop" + # end 事件带错误标记=False + end_evt = [e for e in events if e.type == "tool_execution_end"][0] + assert end_evt.is_error is False + + +# ====================================================================== +# 3. length 截断 + 工具调用 → 一律失败不执行(对照 failToolCalls) +# ====================================================================== +def test_length_truncation_fails_tool_calls(): + agent = make_agent( + [{"tool_calls": [{"id": "c1", "name": "bash", + "arguments": {"command": "echo should-not-run"}}], + "stop_reason": "length"}, + {"content": "恢复回答。"}], + tools=default_tools(), + ) + events = run_events(agent) + result = agent.prompt("go") + trs = [m for m in agent.state.messages if m.role == "toolResult"] + assert len(trs) == 1 + assert trs[0].is_error is True + tr_text = trs[0].content if isinstance(trs[0].content, str) else \ + "".join(c.get("text", "") for c in trs[0].content) + assert "未执行" in tr_text + # 循环继续(hasMoreToolCalls=True)→ 第二轮 + assistants = [m for m in agent.state.messages if m.role == "assistant"] + assert len(assistants) == 2 + assert result.stop_reason == "stop" + + +# ====================================================================== +# 4. 可恢复 length:删除坏消息 + 压缩 + 重试一次(对照 isRecoverableLength) +# ====================================================================== +def test_recoverable_length_compact_retry(): + # 预填 30 条大历史(~60K token)使 1:1 切点(保留 20K)有可摘要内容 + agent = make_agent( + [{"content": "", "stop_reason": "length", + "usage": {"input": 100, "output": 50}}, # 50 < max_tokens → 可恢复 + {"content": "压缩后恢复。"}], + max_tokens=100, + ) + for i in range(30): + agent.state.messages.append( + AgentMessage(role="user", + content=f"历史消息 {i} " + "长" * 2000)) + summarize_calls = [] + + def summarize(prompt, system_prompt, max_tokens): + summarize_calls.append((prompt, system_prompt, max_tokens)) + return "SUMMARY-OK" + + runner = AgentRunner(agent, summarize_fn=summarize) + events = run_events(agent) + result = runner.run("新问题") + assert result.stop_reason == "stop" + assert runner.last_action == "length_compact" + assert len(summarize_calls) == 1 + # pi 原版摘要提示词(逐字)进入了调用 + prompt, system, mt = summarize_calls[0] + assert "" in prompt and "## Goal" in prompt + assert "context summarization assistant" in system + assert mt == min(int(0.8 * 16384), 100) # min(0.8×reserve, model.maxTokens) + # 上下文里有压缩摘要(kind 标记,对照 pi compaction 条目) + sums = [m for m in agent.state.messages if m.kind == "compaction_summary"] + assert len(sums) == 1 and "SUMMARY-OK" in sums[0].content + # 保留尾巴非空且不含被摘要的历史 + assert len(agent.state.messages) > 1 + # 坏的 length 助手消息被移除(只剩恢复后的那个) + assistants = [m for m in agent.state.messages if m.role == "assistant"] + assert all(m.stop_reason != "length" for m in assistants) + + +# ====================================================================== +# 5. 可重试错误:退避重试(对照 isRetryable + 1600ms×1.6^n) +# ====================================================================== +def test_retryable_error_backoff_retry(): + agent = make_agent( + [{"raise": AgentError(message="429 Too Many Requests", + kind="rate_limit", status_code=429, + recoverable=True)}, + {"content": "重试成功。"}], + retry=RetryConfig(max_attempts=3, base_delay_ms=10, factor=2.0, + max_delay_ms=50), + ) + runner = AgentRunner(agent) + result = runner.run("hi") + assert result.stop_reason == "stop" + assert runner._retry_attempt == 1 + assert runner.last_action == "retry" + assert agent.state.messages[-1].content == "重试成功。" + + +# ====================================================================== +# 6. 不可重试错误:立即结束(401 auth) +# ====================================================================== +def test_auth_error_stops_immediately(): + agent = make_agent( + [{"raise": AgentError(message="401 Unauthorized", kind="auth", + status_code=401)}]) + runner = AgentRunner(agent, + summarize_fn=lambda *a: "S") # 压缩可用也不该触发 + result = runner.run("hi") + assert result.stop_reason == "error" + assert result.error.kind == "auth" + assert runner.last_action in ("none",) + + +# ====================================================================== +# 7. steering:turn 边界注入(对照 getSteeringMessages) +# ====================================================================== +def test_steering_injected_at_turn_boundary(): + agent = make_agent( + [{"content": "第一段回答。"}, + {"content": "看到转向了。"}], + ) + events = run_events(agent) + # 第一轮的 message_end 之后注入 steering(只注入一次) + steered = {"done": False} + + def on_event(e): + if e.type == "message_end" and e.message is not None \ + and e.message.role == "assistant" and not steered["done"]: + steered["done"] = True + agent.steer("插一句:改方向") + agent.subscribe(on_event) + result = agent.prompt("原始问题") + contents = [m.content for m in agent.state.messages if m.role == "user"] + assert "插一句:改方向" in contents + assistants = [m for m in agent.state.messages if m.role == "assistant"] + assert len(assistants) == 2 + assert result.stop_reason == "stop" + + +# ====================================================================== +# 8. followUp:run 结束前注入 → 自动续跑(对照外层循环) +# ====================================================================== +def test_follow_up_continues_run(): + agent = make_agent( + [{"content": "第一段。"}, + {"content": "第二段(followUp 触发)。"}], + ) + seen = {"n": 0} + + def on_event(e): + if e.type == "message_end" and e.message is not None \ + and e.message.role == "assistant": + seen["n"] += 1 + if seen["n"] == 1: + agent.follow_up("追加一问") + agent.subscribe(on_event) + result = agent.prompt("第一问") + user_msgs = [m for m in agent.state.messages if m.role == "user"] + assert len(user_msgs) == 2 + assistants = [m for m in agent.state.messages if m.role == "assistant"] + assert len(assistants) == 2 + assert result.stop_reason == "stop" + + +# ====================================================================== +# 9. abort:流中中止 → stop_reason=aborted → agent_end(对照 pi 中止语义) +# ====================================================================== +def test_abort_mid_stream(): + agent = make_agent([{"content": "ABCDEFGH", "chunks": 8}, + {"content": "不应到达"}]) + events = run_events(agent) + fired = {"n": 0} + + def on_event(e): + if e.type == "message_update": + fired["n"] += 1 + if fired["n"] == 2: # 收到第 2 个 chunk 后中止 + agent.abort() + agent.subscribe(on_event) + result = agent.prompt("hi") + assert result.stop_reason == "aborted" + types = [e.type for e in events] + assert types[-1] == "agent_end" + # 中止消息保留已输出部分 + last_a = [m for m in agent.state.messages if m.role == "assistant"][-1] + assert last_a.stop_reason == "aborted" + assert "AB" in last_a.content + # 第二轮未发生 + assert len([m for m in agent.state.messages if m.role == "assistant"]) == 1 + + +# ====================================================================== +# 10. 输出预算钳制公式(对照 simple-options clampMaxTokensToContext) +# ====================================================================== +def test_clamp_max_tokens_formula(): + model = ModelConfig(context_window=100000, max_tokens=32768) + # 构造已知输入:50000 个 ASCII 字符 ≈ 12500 token(/4)+ 每消息 4 + msg = AgentMessage(role="user", content="a" * 50000) + clamped, input_tokens = clamp_max_tokens_to_context(model, [msg]) + # 12500 + 4 = 12504;max_output = 100000 - 12504 - 4096 = 833... 不,= 83400 + assert clamped == min(32768, 100000 - input_tokens - 4096) + # 输入几乎占满窗口 → 输出预算被压到 1 + big = AgentMessage(role="user", content="a" * 400000) # 100004 token + assert clamp_max_tokens_to_context(model, [big]) is None # 溢出 + mid = AgentMessage(role="user", content="a" * 392000) # 98004 token + clamped2, _ = clamp_max_tokens_to_context(model, [mid]) + assert clamped2 == 1 # 100000-98004-4096 < 0 → 下限 1 + + +# ====================================================================== +# 11. 压缩切分点(1:1 对照 pi findCutPoint):token 预算回扫 + 有效切点 + 断轮 +# ====================================================================== +def test_compaction_split_point_alignment(): + msgs = [AgentMessage(role="user", content=f"u{i}") for i in range(4)] + a = AgentMessage(role="assistant", content="", tool_calls=[ + ToolCall(id="c1", name="bash", arguments={})]) + msgs.append(a) + msgs.append(AgentMessage(role="toolResult", tool_call_id="c1", + tool_name="bash", content="r")) + msgs.extend([AgentMessage(role="assistant", content=f"a{i}") for i in range(4)]) + # 有效切点:user/assistant 位置;toolResult(index 5) 绝不能做切点 + cuts = find_valid_cut_points(msgs, 0, len(msgs)) + assert 5 not in cuts + assert set(cuts) == {0, 1, 2, 3, 4, 6, 7, 8, 9} + # 小预算 → 尾部回扫立刻达标 → 切在 index 9(assistant)→ 断轮 + cut = find_cut_point(msgs, 0, len(msgs), keep_recent_tokens=1) + assert cut.first_kept_index == 9 + assert cut.is_split_turn is True + # 轮起点 = 向前最近的 user(index 3) + assert cut.turn_start_index == 3 + assert find_turn_start(msgs, 9, 0) == 3 + # 大预算(够不着)→ 切点落在第一个有效切点 index 0(user)→ 不断轮 + cut2 = find_cut_point(msgs, 0, len(msgs), keep_recent_tokens=10 ** 6) + assert cut2.first_kept_index == 0 and cut2.is_split_turn is False + + +# ====================================================================== +# 11b. should_compact 触发公式(1:1 对照 pi: tokens > window - reserve) +# ====================================================================== +def test_should_compact_formula(): + model = ModelConfig(context_window=100000, max_tokens=32768) + # 330000 ASCII 字符 ≈ 82500 + 4 = 82504 token < 100000-16384=83616 → 不触发 + small = AgentMessage(role="user", content="a" * 330000) + ok, t1 = should_compact([small], model, reserve_tokens=16384) + assert not ok and t1 == 82504 + # 335000 ASCII ≈ 83754 > 83616 → 触发 + big = AgentMessage(role="user", content="a" * 335000) + ok2, t2 = should_compact([big], model, reserve_tokens=16384) + assert ok2 and t2 == 83754 + + +# ====================================================================== +# 11c. usage 锚定估算(1:1 对照 pi estimateContextTokens) +# ====================================================================== +def test_usage_anchored_estimation(): + a = AgentMessage(role="assistant", content="x" * 100, + stop_reason="stop", usage={"totalTokens": 5000}) + tail = AgentMessage(role="user", content="b" * 4000) # 1000 + 4 = 1004 + est = estimate_context_tokens([a, tail]) + assert est.usage_tokens == 5000 + assert est.trailing_tokens == 1004 + assert est.tokens == 6004 + assert est.last_usage_index == 0 + # aborted/error 的 assistant usage 无效(对照 pi getAssistantUsage) + a2 = AgentMessage(role="assistant", content="y", + stop_reason="error", usage={"totalTokens": 9999}) + est2 = estimate_context_tokens([a2, tail]) + assert est2.last_usage_index is None + assert est2.tokens == 1004 + (1 + 4) + + +# ====================================================================== +# 11d. serialize_conversation 格式(1:1 对照 pi utils.ts) +# ====================================================================== +def test_serialize_conversation_format(): + msgs = [ + AgentMessage(role="user", content="做个工具"), + AgentMessage(role="assistant", reasoning="想一想…", content="好,", + tool_calls=[ToolCall(id="c1", name="bash", + arguments={"command": "ls"})]), + AgentMessage(role="toolResult", tool_call_id="c1", tool_name="bash", + content="R" * 3000), + ] + s = serialize_conversation(msgs) + assert "[User]: 做个工具" in s + assert "[Assistant thinking]: 想一想…" in s + assert "[Assistant]: 好," in s + assert "[Assistant tool calls]: bash(command=\"ls\")" in s + # 工具结果 2000 字符截断(pi TOOL_RESULT_MAX_CHARS) + assert "[Tool result]: " + "R" * 2000 in s + assert "[... 1000 more characters truncated]" in s + + +# ====================================================================== +# 11e. 文件操作提取与附录(1:1 对照 pi extractFileOps*/formatFileOperations) +# ====================================================================== +def test_file_ops_extraction_and_appendix(): + ops = FileOperations() + extract_file_ops_from_message(AgentMessage( + role="assistant", tool_calls=[ + ToolCall(id="1", name="read", arguments={"path": "/a/f.py"}), + ToolCall(id="2", name="write", arguments={"path": "/a/g.py"}), + ToolCall(id="3", name="edit", arguments={"path": "/a/f.py"}), + ]), ops) + read_files, modified = compute_file_lists(ops) + assert read_files == [] # f.py 被改过 → 不算只读 + assert modified == ["/a/f.py", "/a/g.py"] + appendix = format_file_operations(read_files, modified) + assert "\n/a/f.py\n/a/g.py\n" in appendix + # 压缩后摘要尾部带文件附录 + calls = [] + + def summarize(prompt, system, mt): + calls.append((prompt, mt)) + return "S" + msgs = [AgentMessage(role="user", content="u" + "x" * 40000), + AgentMessage(role="assistant", + tool_calls=[ToolCall(id="1", name="read", + arguments={"path": "/a/f.py"})]), + AgentMessage(role="user", content="u2" + "x" * 40000), + AgentMessage(role="user", content="u3" + "x" * 40000)] + out = compact_context(msgs, ModelConfig(max_tokens=8192), summarize) + assert out is not None + assert out[0].kind == "compaction_summary" + assert "\n/a/f.py\n" in out[0].content + + +# ====================================================================== +# 11f. 迭代式 previousSummary 更新(1:1 对照 pi UPDATE_SUMMARIZATION_PROMPT) +# ====================================================================== +def test_iterative_summary_update(): + calls = [] + + def summarize(prompt, system, mt): + calls.append(prompt) + return "UPDATED" + prev = AgentMessage(role="user", content="旧摘要内容ABC", + kind="compaction_summary") + msgs = [prev, + AgentMessage(role="user", content="n" + "x" * 40000), + AgentMessage(role="user", content="n2" + "x" * 40000), + AgentMessage(role="user", content="n3" + "x" * 40000)] + out = compact_context(msgs, ModelConfig(max_tokens=8192), summarize) + assert out is not None and out[0].kind == "compaction_summary" + assert "UPDATED" in out[0].content + # 旧摘要进 ,且用 UPDATE 提示词 + p = calls[0] + assert "\n旧摘要内容ABC\n" in p + assert "NEW conversation messages to incorporate" in p + + +# ====================================================================== +# 11g. 断轮双摘要拼接(1:1 对照 pi compact() 的 split-turn 分支) +# ====================================================================== +def test_split_turn_double_summary(): + calls = [] + + def summarize(prompt, system, mt): + calls.append(prompt) + return f"SUMMARY-{len(calls)}" + # 轮1: u1/a1(40K 各一);轮2: u2/a2/a3/a4(a 连续 → 切点必落 assistant → 断轮) + msgs = [AgentMessage(role="user", content="u1" + "x" * 40000), + AgentMessage(role="assistant", content="a1" + "x" * 40000), + AgentMessage(role="user", content="u2" + "x" * 40000), + AgentMessage(role="assistant", content="a2" + "x" * 40000), + AgentMessage(role="assistant", content="a3" + "x" * 40000), + AgentMessage(role="assistant", content="a4" + "x" * 40000)] + out = compact_context(msgs, ModelConfig(max_tokens=8192), summarize) + assert out is not None + assert len(calls) == 2 # 历史摘要 + 轮前缀摘要(pi split-turn 双调用) + assert "PREFIX of a turn" in calls[1] + c = out[0].content + assert "SUMMARY-1" in c and "SUMMARY-2" in c + assert "---" in c + assert "**Turn Context (split turn):**" in c + # 保留尾巴 = 切点之后的 a3/a4 + assert [m.content[:2] for m in out[1:]] == ["a3", "a4"] + + +# ====================================================================== +# 12. pi 消息 → OpenAI 消息转换(tool 回传格式) +# ====================================================================== +def test_to_openai_messages_format(): + a = AgentMessage(role="assistant", content="", tool_calls=[ + ToolCall(id="c1", name="bash", arguments={"command": "ls"})]) + t = AgentMessage(role="toolResult", tool_call_id="c1", tool_name="bash", + content="ok") + out = to_openai_messages([ + AgentMessage(role="user", content="hi"), a, t, + ]) + assert out[0] == {"role": "user", "content": "hi"} + assert out[1]["role"] == "assistant" + assert out[1]["tool_calls"][0]["function"]["name"] == "bash" + assert out[2]["role"] == "tool" + assert out[2]["tool_call_id"] == "c1" + assert out[2]["content"] == "ok" + + +# ====================================================================== +# 12b. reasoning 回传(thinking 模式,DeepSeek 400 修复) +# ====================================================================== +def test_reasoning_passthrough_toggle(): + """thinking 模式要求 assistant 的 reasoning_content 原样回传 → 默认开启; + 显式 False 关闭(特殊网关逃生阀)。只影响带 reasoning 的 assistant 条目。""" + from core.agent.types import ModelConfig + a = AgentMessage(role="assistant", content="答", reasoning="思考过程...", + tool_calls=[ToolCall(id="c1", name="bash", + arguments={"command": "ls"})]) + msgs = [AgentMessage(role="user", content="hi"), a, + AgentMessage(role="toolResult", tool_call_id="c1", + tool_name="bash", content="ok")] + # 默认:reasoning_content 回传 + out_def = to_openai_messages(msgs) + assert out_def[1]["reasoning_content"] == "思考过程..." + assert out_def[1]["content"] == "答" + assert out_def[1]["tool_calls"][0]["function"]["name"] == "bash" + assert out_def[2]["role"] == "tool" + # 显式关闭(逃生阀):不注入 + out_off = to_openai_messages(msgs, pass_reasoning=False) + assert "reasoning_content" not in out_off[1] + # 无 reasoning 的 assistant 条目不产生空字段 + b = AgentMessage(role="assistant", content="无思考", tool_calls=[]) + out_mix = to_openai_messages([b], pass_reasoning=True) + assert "reasoning_content" not in out_mix[0] + # ModelConfig 默认开 + mc = ModelConfig(name="t") + assert mc.pass_reasoning is True + + +# ====================================================================== +# 12c. bash 秒级读秒 + 真超时(进程树杀,修 Windows 孤儿进程假超时) +# ====================================================================== +def test_bash_timer_ticks_and_real_timeout(): + """Popen 秒级滴答:on_timer 每秒回调(气泡读秒); + 到期杀进程树 → 真中断(修复前:Windows 孤儿子进程跑满全时长才报超时)。""" + import time as _t + import core.agent.tools as T + from core.agent.types import AbortSignal + ticks = [] + ctx = {"cwd": os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "shell": True, "on_timer": lambda el, to: ticks.append((el, to))} + # 1) 3s 命令 timeout=5 → 正常结束 + 收到 1、2 滴 + r = T.tool_bash("tb1", {"command": r'python -c "import time; time.sleep(3)"', + "timeout": 5}, AbortSignal(), None, ctx) + assert not r.is_error, r.as_text() + assert "[exit 0]" in r.as_text(), r.as_text() + els = [x[0] for x in ticks] + assert 1 in els and 2 in els, f"读秒缺失: {ticks}" + assert all(x[1] == 5 for x in ticks), ticks + # 2) 5s 命令 timeout=1 → 真杀:总耗时 < 4s(修复前孤儿进程要跑满 5s) + ticks.clear() + t0 = _t.time() + r2 = T.tool_bash("tb2", {"command": r'python -c "import time; time.sleep(5)"', + "timeout": 1}, AbortSignal(), None, ctx) + real = _t.time() - t0 + assert r2.is_error and "超时" in r2.as_text(), r2.as_text() + assert real < 4.0, f"进程树杀不生效,实际阻塞 {real:.1f}s" + assert [x[0] for x in ticks] == [1], f"超前应读 1 秒: {ticks}" + + +# ====================================================================== +# 13. 同一 Agent 多次 prompt(会话记忆累积,对照 pi Agent 复用) +# ====================================================================== +def test_agent_reuse_across_prompts(): + agent = make_agent( + [{"content": "第一次。"}, {"content": "第二次。"}]) + r1 = agent.prompt("问题1") + r2 = agent.prompt("问题2") + users = [m for m in agent.state.messages if m.role == "user"] + assert len(users) == 2 + # 第二轮上下文包含第一轮全部消息 + assert r1.stop_reason == "stop" and r2.stop_reason == "stop" + + +# ====================================================================== +# 14. AgentWorker 接线回归(P0:必须注入 stream_fn,否则"未配置 stream_fn") +# ====================================================================== +def test_agent_worker_stream_fn_wiring(): + """AgentWorker.run() 必须把 openai_stream 注入 Agent(对照 pi 的 + agentLoopConfig.streamFn 注入点)。用假流函数验证整条接线。""" + import core.llm_engine as le + from PyQt6.QtCore import QCoreApplication + + QCoreApplication.instance() or QCoreApplication([]) + + chunks, errors = [], [] + real_stream = le.openai_stream + + def fake_stream(context, model, signal, max_tokens, tools=None): + yield ("event", _text("你好,")) + yield ("event", _text("世界!")) + yield ("final", AgentMessage(role="assistant", content="你好,世界!", + stop_reason="stop", + usage={"input": 5, "output": 5})) + + le.openai_stream = fake_stream + try: + cfg = le._load_config() + providers = list(cfg.get("providers", {}).keys()) + assert providers, "config.json 里没有 provider" + w = le.AgentWorker(providers[0], "any-model", + [{"role": "user", "content": "hi"}]) + w.chunk_received.connect(lambda t: chunks.append(t)) + w.error_occurred.connect(lambda e: errors.append(e)) + w.run() # 同步跑(不走线程),验证接线 + finally: + le.openai_stream = real_stream + + assert not errors, f"出现错误(stream_fn 未注入?): {errors}" + assert "".join(chunks) == "你好,世界!" + + +# ====================================================================== +# 15. 系统提示词:请求头部注入 + 不入历史 + SYSTEM_PROMPT.md 加载 +# ====================================================================== +def test_system_prompt_injected_at_request_head(): + seen = {} + + def spy_stream(context, model, signal, max_tokens, tools=None): + seen["context"] = list(context) + yield ("event", _text("ok")) + yield ("final", AgentMessage(role="assistant", content="ok", + stop_reason="stop", + usage={"input": 1, "output": 1})) + + model = ModelConfig(provider="mock", name="m", context_window=100000, + max_tokens=8192, api_key="x", base_url="http://mock") + cfg = AgentConfig(model=model, tools=[], system_prompt="SYS-TEST-123") + agent = Agent(cfg) + agent.set_stream_fn(spy_stream) + agent.prompt("hi") + + ctx = seen["context"] + assert ctx[0].role == "system" and ctx[0].content == "SYS-TEST-123" + # 系统提示词不能混进会话历史(不占压缩/持久化) + assert all(m.role != "system" for m in agent.state.messages) + # to_openai_messages:头部 system 放行,中途 system 跳过 + from core.agent.stream_fn import to_openai_messages + msgs = [ctx[0], + AgentMessage(role="user", content="u"), + AgentMessage(role="system", content="stray")] + out = to_openai_messages(msgs) + assert out[0] == {"role": "system", "content": "SYS-TEST-123"} + assert sum(1 for m in out if m["role"] == "system") == 1 + + +def test_system_prompt_md_file_loaded(): + from core.llm_engine import load_system_prompt + prompt = load_system_prompt() + assert "haocode" in prompt and len(prompt) > 200 + + +# ====================================================================== +# 16. tools 必须进 API 请求(回归:模型因此"文字演戏"工具调用) +# ====================================================================== +def test_openai_stream_sends_tools(): + import types as _pytypes + import core.agent.stream_fn as sf + from core.agent.stream_fn import AbortSignal + from core.agent.tools import default_tools + + captured = {} + + class _FakeStream: + def __init__(self, chunks): + self._it = iter(chunks) + + def __iter__(self): + return self + + def __next__(self): + return next(self._it) + + def close(self): + pass + + def _chunk(choices, usage=None): + return _pytypes.SimpleNamespace(usage=usage, choices=choices) + + def _delta(content=None, tool_calls=None): + return _pytypes.SimpleNamespace( + content=content, tool_calls=tool_calls, + **{"reasoning_content": None}) + + _tc = _pytypes.SimpleNamespace( + index=0, id="call_1", + function=_pytypes.SimpleNamespace(name="bash", + arguments='{"command":"echo hi"}')) + chunks = [ + _chunk([_pytypes.SimpleNamespace(delta=_delta(tool_calls=[_tc]), + finish_reason="tool_calls")]), + _chunk([], usage=_pytypes.SimpleNamespace(prompt_tokens=3, + completion_tokens=2)), + ] + + class _FakeCompletions: + def create(self, **params): + captured.update(params) + return _FakeStream(chunks) + + real_openai = sf.OpenAI + sf.OpenAI = lambda **kw: _pytypes.SimpleNamespace( + chat=_pytypes.SimpleNamespace(completions=_FakeCompletions())) + try: + model = ModelConfig(provider="t", name="m", context_window=100000, + max_tokens=100, api_key="k", base_url="http://x") + sig = AbortSignal() + out = list(sf.openai_stream([AgentMessage(role="user", content="hi")], + model, sig, 100, tools=default_tools())) + finally: + sf.OpenAI = real_openai + + tools = captured.get("tools") + assert tools, "tools 没进请求体!" + names = {t["function"]["name"] for t in tools} + assert names == {"read", "bash", "write", "edit"} + assert tools[0]["type"] == "function" + + final = [p for k, p in out if k == "final"][0] + assert final.tool_calls and final.tool_calls[0].name == "bash" + assert final.tool_calls[0].arguments == {"command": "echo hi"} + + +# ====================================================================== +# 17. 循环层兜底:文字"演"的工具调用被解析执行 +# ====================================================================== +def test_text_tool_calls_loop_fallback(): + turns = [ + {"content": "我来看看。echo haocode-test 稍等", + "tool_calls": []}, + {"content": "命令输出正常。"}, + ] + agent = make_agent(turns, tools=default_tools()) + result = agent.prompt("看一下") + + msgs = agent.state.messages + asst1 = next(m for m in msgs + if m.role == "assistant" and m.tool_calls) + assert asst1.tool_calls[0].name == "bash" + assert asst1.tool_calls[0].arguments["command"] == "echo haocode-test" + tr = next(m for m in msgs if m.role == "toolResult") + assert "haocode-test" in (tr.content if isinstance(tr.content, str) + else str(tr.content)) + assert result.stop_reason == "stop" + + +# ====================================================================== +# 18. from_openai_messages 全保真(worker 模式上下文丢失 bug 的回归守护) +# ====================================================================== +def test_from_openai_messages_preserves_tool_history(): + """build_api_context 产物(含 tool 消息 + assistant tool_calls)经 + from_openai_messages → to_openai_messages 往返后必须保真: + 工具历史不能丢,残缺参数 JSON 必须兑底成合法 "{}"。""" + import json as _json + src = [ + {"role": "user", "content": "帮我运行 main.py"}, + {"role": "assistant", "content": "我来读一下。"}, + {"role": "assistant", "content": None, "tool_calls": [ + {"id": "c1", "type": "function", + "function": {"name": "read", "arguments": '{"path": "main.py"}'}}]}, + {"role": "tool", "tool_call_id": "c1", "content": "print('hello')"}, + {"role": "assistant", "content": None, "tool_calls": [ + {"id": "c2", "type": "function", + "function": {"name": "bash", + "arguments": '{"command": "python main.py"}'}}]}, + {"role": "tool", "tool_call_id": "c2", "content": "hello"}, + {"role": "assistant", "content": "运行成功。"}, + {"role": "user", "content": "刚才的代码是什么?"}, + ] + msgs = from_openai_messages(src) + # 角色序列保真(8 条,无丢失、无空 assistant) + assert [m.role for m in msgs] == [ + "user", "assistant", "assistant", "toolResult", + "assistant", "toolResult", "assistant", "user"] + # tool_call 保真 + assert msgs[2].tool_calls[0].id == "c1" + assert msgs[2].tool_calls[0].name == "read" + assert msgs[2].tool_calls[0].arguments == {"path": "main.py"} + assert msgs[4].tool_calls[0].name == "bash" + # toolResult 保真 + assert msgs[3].tool_call_id == "c1" + assert msgs[3].content == "print('hello')" + # 纯工具轮不再是空 assistant + assert msgs[2].content == "" and len(msgs[2].tool_calls) == 1 + + # 往返:to_openai_messages(from_openai_messages(x)) 角色序一致 + JSON 合法 + rt = to_openai_messages(msgs) + assert [m["role"] for m in rt] == [m["role"] for m in src] + for m in rt: + if m["role"] == "assistant" and m.get("tool_calls"): + for tc in m["tool_calls"]: + _json.loads(tc["function"]["arguments"]) # 必须是合法 JSON + + # 残缺参数 JSON 兑底(中断导致的历史截断场景) + bad = [{"role": "user", "content": "hi"}, + {"role": "assistant", "content": None, "tool_calls": [ + {"id": "c9", "type": "function", + "function": {"name": "bash", "arguments": '{"command": "ls -'}}]}, + {"role": "tool", "tool_call_id": "c9", "content": "out"}] + bmsgs = from_openai_messages(bad) + assert bmsgs[1].tool_calls[0].arguments == {} + assert bmsgs[1].tool_calls[0].raw_arguments == "{}" + brt = to_openai_messages(bmsgs) + _json.loads(brt[1]["tool_calls"][0]["function"]["arguments"]) + + # token 估算器能消化 toolResult/tool_calls(不崩 + 计入工具历史) + est_full = estimate_context_tokens(msgs).tokens + est_notools = estimate_context_tokens( + [m for m in msgs if m.role != "toolResult"]).tokens + assert est_full > est_notools + + +def test_agent_worker_second_turn_sees_tool_history(): + """集成:AgentWorker 第 2 轮真实发出的 context 必须包含第 1 轮的全部 + 工具历史(toolResult + assistant tool_calls)——任务完成后追问不丢上下文。""" + import core.llm_engine as le + from PyQt6.QtCore import QCoreApplication + + QCoreApplication.instance() or QCoreApplication([]) + seen = {} + real_stream = le.openai_stream + + def fake_stream(context, model, signal, max_tokens, tools=None): + seen["context"] = list(context) + yield ("event", _text("ok")) + yield ("final", AgentMessage(role="assistant", content="ok", + stop_reason="stop", + usage={"input": 1, "output": 1})) + + le.openai_stream = fake_stream + try: + cfg = le._load_config() + providers = list(cfg.get("providers", {}).keys()) + assert providers, "config.json 里没有 provider" + w = le.AgentWorker(providers[0], "any-model", [ + {"role": "user", "content": "帮我运行 main.py"}, + {"role": "assistant", "content": "我来读一下。"}, + {"role": "assistant", "content": None, "tool_calls": [ + {"id": "c1", "type": "function", + "function": {"name": "read", + "arguments": '{"path": "main.py"}'}}]}, + {"role": "tool", "tool_call_id": "c1", + "content": "print('hello')"}, + {"role": "assistant", "content": "运行成功。"}, + {"role": "user", "content": "刚才的代码是什么?"}, + ]) + errors = [] + w.error_occurred.connect(lambda e: errors.append(e)) + w.run() # 同步跑 + finally: + le.openai_stream = real_stream + + assert not errors, f"AgentWorker 报错: {errors}" + ctx = seen["context"] + # 工具历史必须完整在场 + trs = [m for m in ctx if m.role == "toolResult"] + assert len(trs) == 1 and trs[0].tool_call_id == "c1" + assert "print('hello')" in trs[0].content + asst_tc = [m for m in ctx if m.role == "assistant" and m.tool_calls] + assert len(asst_tc) == 1 and asst_tc[0].tool_calls[0].name == "read" + # 末尾是本次提问 + assert ctx[-1].role == "user" and ctx[-1].content == "刚才的代码是什么?" + + +# ====================================================================== +# 🆕 P0: usage 锚点时效校验(对照 pi getLastAssistantUsageInfo) +# ====================================================================== +def test_usage_anchor_stale_after_compaction_summary(): + """压缩后:保留窗里 assistant 的旧 usage(来自压缩前)必须失效, + 否则下一次 should_compact 会锚定到过期 60K → 误触发二次压缩。""" + stale = AgentMessage(role="assistant", content="旧回答", + timestamp=2000, stop_reason="stop", + usage={"input": 55000, "output": 5000}) + # 对照组:无摘要 → 应锚定到 stale usage + est_ctrl = estimate_context_tokens([ + AgentMessage(role="user", content="旧问题", timestamp=1000), + stale, + ]) + assert est_ctrl.last_usage_index == 1 + assert est_ctrl.usage_tokens == 60000 + + # 实验组:新摘要消息(timestamp 更晚)插到前面 → 旧 usage 失效 + summary = AgentMessage(role="user", content="(压缩摘要)", + timestamp=9000, kind="compaction_summary") + est = estimate_context_tokens([summary, + AgentMessage(role="user", content="旧问题", timestamp=1000), + stale]) + assert est.last_usage_index is None, f"过期 usage 未被失效: {est}" + assert est.usage_tokens == 0 + + +def test_usage_anchor_recovers_after_new_assistant(): + """压缩后第一个新 assistant 回复到达 → 新 usage 自动成为锚点""" + msgs = [ + AgentMessage(role="user", content="(压缩摘要)", timestamp=9000, + kind="compaction_summary"), + AgentMessage(role="assistant", content="旧回答", timestamp=2000, + stop_reason="stop", usage={"input": 55000, "output": 5000}), + AgentMessage(role="user", content="新问题", timestamp=10000), + AgentMessage(role="assistant", content="新回答", timestamp=11000, + stop_reason="stop", usage={"input": 20000, "output": 300}), + ] + est = estimate_context_tokens(msgs) + assert est.last_usage_index == 3, f"应锚定到新回复: {est}" + assert est.usage_tokens == 20300 + + +def test_estimate_no_anchor_without_timestamps_backward_compatible(): + """无 timestamp 信息(全 0,旧 DB 回放)→ 行为等同旧版「取最后一条有效」""" + msgs = [ + AgentMessage(role="user", content="q1"), + AgentMessage(role="assistant", content="a1", stop_reason="stop", + usage={"input": 100, "output": 10}), + AgentMessage(role="user", content="q2"), + AgentMessage(role="assistant", content="a2", stop_reason="stop", + usage={"input": 200, "output": 20}), + ] + est = estimate_context_tokens(msgs) + assert est.last_usage_index == 3 + assert est.usage_tokens == 220 + + +# ====================================================================== +# 🆕 P2: 无锚点时 system 提示词 + 工具 schema 计入估算/钳制 +# ====================================================================== +class _FakeTool: + name = "read" + description = "读取文件内容" + parameters = {"type": "object", "properties": {"path": {"type": "string"}}} + + +def test_estimate_includes_system_and_tools_without_anchor(): + sysp = "你是一个编程助手。" * 100 # 900 字(。U+3002 不在 CJK 类 → 估算 ≈825) + base_msgs = [AgentMessage(role="user", content="hi")] + plain = estimate_context_tokens(list(base_msgs)) + full = estimate_context_tokens(list(base_msgs), + system_prompt=sysp, tools=[_FakeTool()]) + # system(≈825) + 工具 schema(>30) 必须被计入 + assert full.tokens >= plain.tokens + 800, f"{plain} -> {full}" + + # 有锚点时:usage 已精确覆盖 system+tools,不重复计 + anchor_msgs = [AgentMessage(role="assistant", content="x", + stop_reason="stop", + usage={"input": 1000, "output": 100})] + a1 = estimate_context_tokens(list(anchor_msgs)) + a2 = estimate_context_tokens(list(anchor_msgs), + system_prompt=sysp, tools=[_FakeTool()]) + assert a1.tokens == a2.tokens == 1100, f"{a1} vs {a2}" + + +def test_clamp_counts_system_tools(): + # 小窗口(8K):钳制结果受「窗口-输入-4096」约束,system+tools 计入后必须缩小 + model = ModelConfig(provider="p", name="m", + context_window=8000, max_tokens=8192) + msgs = [AgentMessage(role="user", content="hi")] + c1 = clamp_max_tokens_to_context(model, list(msgs)) + c2 = clamp_max_tokens_to_context(model, list(msgs), + system_prompt="x" * 4000, + tools=[_FakeTool()]) + # 输入估算上升 → 输出预算如实缩小(对照 pi 传完整 Context) + assert c2[1] > c1[1] + 900, f"input: {c1[1]} -> {c2[1]}" + assert c2[0] < c1[0], f"max_tokens: {c1[0]} -> {c2[0]}" + + +# ====================================================================== +# 🆕 M1/M2: 流式字段提取(reasoning 三字段 / choice.usage 兜底) +# ====================================================================== +def test_pick_reasoning_field_priority(): + from types import SimpleNamespace as NS + from core.agent.stream_fn import _pick_reasoning + # reasoning_content 优先(vLLM/Qwen) + assert _pick_reasoning(NS(reasoning="a", reasoning_content="b", + reasoning_text="c")) == "b" + # 其次 reasoning(llama.cpp) + assert _pick_reasoning(NS(reasoning="a")) == "a" + # 再次 reasoning_text + assert _pick_reasoning(NS(reasoning_text="c")) == "c" + # 全空 + assert _pick_reasoning(NS()) == "" + assert _pick_reasoning(None) == "" + # pydantic 对象的 model_dump 兜底 + class _D: + def model_dump(self): + return {"reasoning_text": "z"} + assert _pick_reasoning(_D()) == "z" + + +def test_pick_usage_choice_fallback(): + from types import SimpleNamespace as NS + from core.agent.stream_fn import _pick_usage + u1 = object() + assert _pick_usage(NS(usage=u1)) is u1 + # chunk.usage 为空 → choice.usage 兜底(Moonshot 系) + u2 = object() + assert _pick_usage(NS(usage=None, choices=[NS(usage=u2)])) is u2 + assert _pick_usage(NS(usage=None, choices=[])) is None + assert _pick_usage(NS(usage=None)) is None + + +# ====================================================================== +# 🆕 M3: AgentRunner 重试回调(onRetryScheduled / onRetryFinished) +# ====================================================================== +def test_agent_runner_retry_callbacks(): + from core.agent.recovery import AgentRunner + from core.agent.types import AgentConfig, ModelConfig, RetryConfig, RunResult + + events = [] + + class _State: + def __init__(self): + self.messages = [ + AgentMessage(role="user", content="q"), + AgentMessage(role="assistant", stop_reason="error", + error_message="connection error"), + ] + + class _Agent: + def __init__(self): + self.state = _State() + self.config = AgentConfig( + model=ModelConfig(provider="p", name="m", + context_window=128000, max_tokens=8192), + retry=RetryConfig(max_attempts=3, base_delay_ms=1)) + self.continued = False + + def has_queued(self): + return False + + def continue_(self): + self.continued = True + self.state.messages[-1] = AgentMessage( + role="assistant", stop_reason="stop", content="ok") + return RunResult(stop_reason="stop") + + agent = _Agent() + runner = AgentRunner( + agent, summarize_fn=None, + on_retry_scheduled=lambda a, m, d, r: events.append(("sched", a, m, r)), + on_retry_finished=lambda ok: events.append(("fin", ok))) + + runner._post_loop(RunResult(stop_reason="stop")) + + assert agent.continued, "可重试错误未触发 continue" + kinds = [e[0] for e in events] + assert "sched" in kinds and "fin" in kinds, f"events={events}" + sched = next(e for e in events if e[0] == "sched") + assert sched[1] == 1 and sched[2] == 3 + assert sched[3] == "connection error", f"reason 未透传: {sched}" + assert events[-1] == ("fin", True) + + +# ====================================================================== +# 🆕 P1: usage/timestamp 入库回放链路 +# ====================================================================== +def test_from_openai_maps_usage_and_timestamp(): + msgs = from_openai_messages([ + {"role": "user", "content": "q", "timestamp": 111}, + {"role": "assistant", "content": "a", "timestamp": 222, + "usage": {"input": 100, "output": 50}}, + {"role": "tool", "tool_call_id": "c1", "content": "r", + "timestamp": 333}, + ]) + assert msgs[0].timestamp == 111 + assert msgs[1].timestamp == 222 + assert msgs[1].usage == {"input": 100, "output": 50} + assert msgs[2].timestamp == 333 + est = estimate_context_tokens(msgs) + assert est.last_usage_index == 1 and est.usage_tokens == 150 + + +def test_db_usage_roundtrip(): + """add_message(usage=...) → get_message_chain 行带 usage → 锚定生效""" + import json as _json + import tempfile + import time as _time + from core.db_manager import DBManager + + tmp = tempfile.NamedTemporaryFile(suffix=".db", delete=False) + tmp.close() + try: + db = DBManager(tmp.name) + sid = db.create_session("P1 usage 测试")["id"] + uid = db.add_message(sid, "user", "问题一", None) + _time.sleep(1.1) # 保证 created_at(秒)递增,模拟真实时序 + db.add_message(sid, "assistant", "回答一(很短)", uid["id"], + usage=_json.dumps({"input": 30000, "output": 2000})) + chain = db.get_message_chain(sid) + assert [m["role"] for m in chain] == ["user", "assistant"], \ + f"chain={[(m['role'], m['parent_id']) for m in chain]}" + assert _json.loads(chain[1]["usage"]) == {"input": 30000, "output": 2000} + + # 模拟 build_api_context 的回放(timestamp/usage 挂到 OpenAI dict) + oai = [{"role": m["role"], "content": m["content"], + "timestamp": int(m["created_at"]) * 1000, + **({"usage": _json.loads(m["usage"])} + if m.get("usage") else {})} + for m in chain] + agent_msgs = from_openai_messages(oai) + est = estimate_context_tokens(agent_msgs) + assert est.last_usage_index == 1, f"usage 未锚定: {est}" + assert est.usage_tokens == 32000 + finally: + try: + os.remove(tmp.name) + except OSError: + pass + + +# ====================================================================== +# 轮中主动压缩检查(🆕 haocode 增强,偏离 pi 1:1) +# 内层循环每次 LLM 请求前跑 should_compact 同公式,超阈值先压缩再发。 +# ====================================================================== + +def _mid_tool(name, text): + """确定性工具:返回固定文本(避免真实 bash)""" + def execute(tool_call_id, args, signal, on_update, context): + return AgentToolResult.text(text) + return AgentTool( + name=name, description=name, + parameters={"type": "object", "properties": {}}, + execute=execute, label=name) + + +def _prefill_history(agent, n=8, chars=2000): + for i in range(n): + agent.state.messages.append( + AgentMessage(role="user", content=f"hist{i} " + "长" * chars)) + + +def _capture_requests(agent, captured): + """包一层 stream_fn,记录每次请求的 api 上下文""" + orig = agent._stream_fn + + def wrapper(context, model, signal, max_tokens, tools=None): + captured.append(list(context)) + yield from orig(context, model, signal, max_tokens, tools) + + agent._stream_fn = wrapper + + +def test_mid_turn_compaction_fires_on_growth(): + # 窗口 40000 → 阈值 23616;预填 8×2000 字 ≈ 16k(轮首检查不触发)。 + # ⚠️ 脚本流的 usage 必须真实(P0 锚点机制:估算锚定到最后一条 + # assistant 的真实 usage.input + 其后新增消息)。turn1 请求时真实 + # 输入 ≈ 16053 → usage.input=16000。 + agent = make_agent( + [{"tool_calls": [{"id": "c1", "name": "midtool", + "arguments": {}}], "stop_reason": "stop", + "usage": {"input": 16000, "output": 10}}, + {"content": "done.", + "usage": {"input": 20000, "output": 10}}], + tools=[_mid_tool("midtool", "长" * 8000)], # 8k → 锚定后 ≈ 24k > 23616 + context_window=40000, + ) + _prefill_history(agent) + summarize_calls = [] + + def summarize(prompt, system_prompt, max_tokens): + summarize_calls.append(1) + return "SUMMARY-MID" + + runner = AgentRunner(agent, summarize_fn=summarize) + agent.config.compact_fn = runner.compact_if_needed # 模拟 llm_engine 接线 + captured = [] + _capture_requests(agent, captured) + + result = runner.run("go") + assert result.stop_reason == "stop" + # 轮中压缩恰好触发一次(轮首 16k 不触发;压缩后 ≈20k 不再触发) + assert len(summarize_calls) == 1 + assert runner.compactions_performed == 1 + assert any(ev.get("path") == "mid_turn" for ev in runner.compaction_events) + # 状态首条是摘要,最早两条历史被摘要掉 + assert agent.state.messages[0].kind == "compaction_summary" + assert "SUMMARY-MID" in agent.state.messages[0].content + all_text = "".join(str(getattr(m, "content", "")) for m in agent.state.messages) + assert "hist0" not in all_text and "hist1" not in all_text + assert "hist7" in all_text + # 第二次请求(压缩后的那个)上下文首条就是摘要 + assert len(captured) == 2 + assert captured[1][0].kind == "compaction_summary" + + +def test_mid_turn_compaction_failure_capped(): + # 单条巨型工具结果(30k ≥ keep_recent 20k)在尾部 → 无有效切点 + # (cut_pinned_at_zero)→ 压缩失败;连败 2 次后本轮不再尝试(防刷屏护栏)。 + # 窗口 100000 → 阈值 83616;预填 34×2000 ≈ 68k。usage 必须真实 + # (锚点估算 = 最后 asst 的 usage.input + 其后新增)。 + import core.agent.recovery as rec + calls = [] + orig = rec.compact_context + + def counting(*a, **kw): + calls.append(1) + return orig(*a, **kw) + + rec.compact_context = counting + try: + agent = make_agent( + [{"tool_calls": [{"id": "c1", "name": "midtool", + "arguments": {}}], "stop_reason": "stop", + "usage": {"input": 60000, "output": 10}}, + {"tool_calls": [{"id": "c2", "name": "midtool", + "arguments": {}}], "stop_reason": "stop", + "usage": {"input": 65000, "output": 10}}, + {"content": "done.", + "usage": {"input": 50000, "output": 10}}], + tools=[_mid_tool("midtool", "长" * 30000)], + context_window=100000, + ) + for i in range(34): + agent.state.messages.append( + AgentMessage(role="user", content=f"hist{i} " + "长" * 2000)) + + def summarize(prompt, system_prompt, max_tokens): + raise AssertionError("prepare 返回 None → 不应调用 LLM 摘要") + + runner = AgentRunner(agent, summarize_fn=summarize) + agent.config.compact_fn = runner.compact_if_needed + result = runner.run("go") + assert result.stop_reason == "stop" + # 3 次请求机会:第 2、3 次前尝试压缩(均失败),第… 耗尽后跳过 + # turn2 前: 60000+30004=90004 > 83616 → 尝试#1 失败 + # turn3 前: 65000+30004=95004 > 83616 → 尝试#2 失败 → 耗尽 + assert len(calls) == 2, f"compact_context 应恰好尝试 2 次,实际 {len(calls)}" + assert runner._mid_turn_exhausted is True + assert runner.compactions_performed == 0 + # 状态未被修改(无摘要),原样继续 + assert not any(getattr(m, "kind", None) == "compaction_summary" + for m in agent.state.messages) + finally: + rec.compact_context = orig + + +def test_mid_turn_no_compaction_below_threshold(): + # 工具结果小(2k)→ 锚定后 16000+2004 ≈ 18k < 23616 → 不压缩,正常完成 + agent = make_agent( + [{"tool_calls": [{"id": "c1", "name": "midtool", + "arguments": {}}], "stop_reason": "stop", + "usage": {"input": 16000, "output": 10}}, + {"content": "done.", + "usage": {"input": 18000, "output": 10}}], + tools=[_mid_tool("midtool", "长" * 2000)], + context_window=40000, + ) + _prefill_history(agent) + summarize_calls = [] + + def summarize(prompt, system_prompt, max_tokens): + summarize_calls.append(1) + return "SHOULD-NOT-RUN" + + runner = AgentRunner(agent, summarize_fn=summarize) + agent.config.compact_fn = runner.compact_if_needed + result = runner.run("go") + assert result.stop_reason == "stop" + assert summarize_calls == [] + assert runner.compactions_performed == 0 + assert not any(getattr(m, "kind", None) == "compaction_summary" + for m in agent.state.messages) + + +if __name__ == "__main__": + sys.exit(pytest.main([__file__, "-v"])) diff --git a/tests/test_bash_stream.py b/tests/test_bash_stream.py new file mode 100644 index 0000000..abc75cc --- /dev/null +++ b/tests/test_bash_stream.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +""" +tool_bash 实时输出(增量流)单测 —— 纯函数级,无 UI 依赖 + +本轮改动核心:communicate(timeout=1) 阻塞式收集 + → stdout/stderr reader 线程 + 队列 + 主循环抽干回调 on_update +本测试锁死「改动没有破坏任何既有语义」+「输出真的是实时的」。 + +覆盖: + T1 增量流:on_update 被多次调用(不是结束时一次性给) + T2 实时性:第一块输出到达时刻 << 总耗时(证明是流式而非收尾补发) + T3 上下文文本格式完全不变($ cmd / stdout / [stderr] / [exit N] (Ns)) + T4 stderr 实时流带 [stderr] 分隔标记,且最终文本仍有 [stderr] 段 + T5 每 1 秒读秒回调 on_timer 仍然工作 + T6 超时:杀进程树 + 「命令超时(>Ns)已终止」+ 实际耗时远小于命令时长 + T7 中止:AbortSignal.aborted → 「操作已中止」 + T8 50KB 截断仍然生效 + T9 退出非 0 → is_error,且 exit code 写入 details + T10 空命令 → 参数校验错误 + T11 无输出命令:不产生 on_update,但读秒正常 + T12 最终文本 = 全部 stdout 拼接(不丢不重) + +运行: PYTHONIOENCODING=utf-8 python tests/test_bash_stream.py +""" +import os +import re +import sys +import time +import tempfile +import shutil + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from core.agent.tools import tool_bash # noqa: E402 +from core.agent.types import AbortSignal # noqa: E402 + +RESULTS = [] + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +_TMP = tempfile.mkdtemp(prefix="hocode_bashstream_") +PY = sys.executable + + +def run(script=None, timeout=None, abort_after=None, shell_script=None): + """把脚本写成临时文件再执行(避开 cmd 引号地狱)。 + 返回 (result, updates, first_t, dur, timer_calls)""" + path = None + if script is not None: + path = os.path.join(_TMP, f"s_{int(time.time() * 1000000) % 10**9}.py") + with open(path, "w", encoding="utf-8") as f: + f.write(script) + cmd = f'"{PY}" -u "{path}"' + else: + cmd = shell_script + + updates = [] + first_t = [None] + t0 = time.time() + + def on_update(text): + if first_t[0] is None: + first_t[0] = time.time() - t0 + updates.append(text) + + timers = [] + + def on_timer(elapsed, total): + timers.append((elapsed, total)) + + sig = AbortSignal() + if abort_after is not None: + import threading + + def _aborter(): + time.sleep(abort_after) + sig.abort("test") + threading.Thread(target=_aborter, daemon=True).start() + + args = {"command": cmd} + if timeout is not None: + args["timeout"] = timeout + res = tool_bash("call_test", args, sig, on_update, + {"cwd": _TMP, "shell": True, "on_timer": on_timer}) + dur = time.time() - t0 + return res, updates, first_t[0], dur, timers + + +def text_of(res): + c = res.content + if isinstance(c, str): + return c + return "".join(x.get("text", "") for x in c if isinstance(x, dict)) + + +# ====================================================================== +try: + # ---------- T1/T2/T3/T12: 流式 + 上下文格式 ---------- + res, ups, first_t, dur, timers = run( + "import sys, time\n" + "for i in range(3):\n" + " print('LINE%d' % i, flush=True)\n" + " time.sleep(0.5)\n", timeout=30) + txt = text_of(res) + check("T1.1 增量流被多次回调(>=3 块)", len(ups) >= 3, f"updates={len(ups)} {ups!r}") + check("T1.2 每块都是本次输出的一部分", all(u.strip() for u in ups), repr(ups[:3])) + check("T2.1 第一块在 1s 内到达(实时,不是收尾补发)", + first_t is not None and first_t < 1.0, f"first_t={first_t}") + check("T2.2 第一块明显早于总耗时", + first_t is not None and (dur - first_t) > 0.6, f"first={first_t} dur={dur:.2f}") + check("T3.1 上下文文本以 $ 命令开头", txt.startswith("$ "), repr(txt[:60])) + check("T3.2 含 [exit 0] 与耗时", + re.search(r"\[exit 0\] \(\d+\.\d+s\)", txt) is not None, repr(txt[-60:])) + check("T12.1 三行输出全部进入最终文本,不丢不重", + all(f"LINE{i}" in txt for i in range(3)) and txt.count("LINE0") == 1, repr(txt)) + check("T3.3 is_error=False", res.is_error is False) + check("T3.4 details 带 exit_code", res.details.get("exit_code") == 0, str(res.details)) + + # ---------- T4: stderr 实时 + 最终段 ---------- + res, ups, first_t, dur, timers = run( + "import sys\nprint('OUT1', flush=True)\nprint('ERR1', file=sys.stderr, flush=True)\n", + timeout=30) + txt = text_of(res) + joined = "".join(ups) + check("T4.1 实时流里有 [stderr] 分隔标记", "[stderr]" in joined, repr(joined)) + check("T4.2 最终文本含 [stderr] 段与内容", + "[stderr]" in txt and "ERR1" in txt, repr(txt)) + check("T4.3 stdout 内容也在最终文本里", "OUT1" in txt, repr(txt)) + + # ---------- T5/T11: 读秒 ---------- + res, ups, first_t, dur, timers = run( + "import time\ntime.sleep(2.6)\nprint('done', flush=True)\n", timeout=30) + check("T5.1 长命令期间读秒回调(>=2 次)", len(timers) >= 2, f"timers={timers}") + check("T5.2 读秒总量正确", all(t[1] == 30 for t in timers), str(timers)) + + res, ups, first_t, dur, timers = run( + "import time\ntime.sleep(1.5)\n", timeout=30) + check("T11.1 无输出命令不产生 on_update", len(ups) == 0, repr(ups)) + check("T11.2 无输出命令仍有读秒", len(timers) >= 1, str(timers)) + + # ---------- T6: 超时杀树 ---------- + res, ups, first_t, dur, timers = run( + "import time\nprint('start', flush=True)\ntime.sleep(30)\n", timeout=2) + txt = text_of(res) + check("T6.1 超时文案", "命令超时(>2s)已终止" in txt, repr(txt)) + check("T6.2 真的提前返回(耗时应 <10s)", dur < 10, f"dur={dur:.2f}") + check("T6.3 超时结果是 is_error", res.is_error is True) + + # ---------- T7: 中止 ---------- + res, ups, first_t, dur, timers = run( + "import time\ntime.sleep(30)\n", timeout=60, abort_after=1.5) + txt = text_of(res) + check("T7.1 中止文案", "操作已中止" in txt, repr(txt)) + check("T7.2 中止后迅速返回(<8s)", dur < 8, f"dur={dur:.2f}") + + # ---------- T8: 50KB 截断 ---------- + res, ups, first_t, dur, timers = run( + "import sys\n" + "line = 'X' * 100 + '\\n'\n" + "for _ in range(1200):\n" + " sys.stdout.write(line)\n" + "sys.stdout.flush()\n", timeout=30) + txt = text_of(res) + check("T8.1 超过 50KB 触发截断标记", "[输出超过 50KB 已截断]" in txt, repr(txt[-80:])) + check("T8.2 截断后字节数 <= 50KB+余量", + len(txt.encode("utf-8")) <= 50 * 1024 + 200, str(len(txt.encode("utf-8")))) + + # ---------- T9: 非 0 退出 ---------- + res, ups, first_t, dur, timers = run("import sys\nsys.exit(3)\n", timeout=30) + txt = text_of(res) + check("T9.1 exit 3 写入文本", "[exit 3]" in txt, repr(txt)) + check("T9.2 is_error=True", res.is_error is True) + check("T9.3 details.exit_code=3", res.details.get("exit_code") == 3, str(res.details)) + + # ---------- T10: 空命令 ---------- + res = tool_bash("c", {"command": " "}, AbortSignal(), None, + {"cwd": _TMP, "shell": True}) + check("T10.1 空命令被拒", "command 不能为空" in text_of(res), repr(text_of(res))) + + # ---------- T13: 秒级短命令仍正常(回归:不因线程化而变慢/丢输出) ---------- + res, ups, first_t, dur, timers = run(shell_script="echo hello_from_cmd") + txt = text_of(res) + check("T13.1 短命令输出正确", "hello_from_cmd" in txt, repr(txt)) + check("T13.2 短命令耗时 <3s", dur < 3, f"dur={dur:.2f}") + check("T13.3 短命令实时流也拿到了输出", "hello_from_cmd" in "".join(ups), repr(ups)) + +finally: + shutil.rmtree(_TMP, ignore_errors=True) + +failed = [n for n, ok in RESULTS if not ok] +print(f"\n===== {len(RESULTS) - len(failed)}/{len(RESULTS)} PASS =====", flush=True) +print("ALL PASS" if not failed else f"FAILED: {failed}", flush=True) +sys.exit(0 if not failed else 1) diff --git a/tests/test_compaction_persist.py b/tests/test_compaction_persist.py new file mode 100644 index 0000000..48345e0 --- /dev/null +++ b/tests/test_compaction_persist.py @@ -0,0 +1,289 @@ +# -*- coding: utf-8 -*- +""" +离屏验证:压缩持久化(链上标记点) +背景:压缩此前只改内存 agent.state.messages,下一轮提问从 DB 全量重建历史 +→「压缩等于没有压缩」。现:压缩成功后在链上插标记行(role="compaction", +is_ignored=1),保留首条改指到标记;build_api_context 在最后一个标记处截断、 +以摘要(user 消息)替代之前一切。历史行全部保留,前端切会话渲染不受影响。 +""" +import os, sys, json, tempfile, types + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +from core.db_manager import DBManager # noqa: E402 +from core.agent.types import AgentMessage, AgentConfig, ModelConfig # noqa: E402 +from core.agent.stream_fn import from_openai_messages, to_openai_messages # noqa: E402 +from core.agent.compaction import prepare_compaction, CompactionSettings # noqa: E402 +from core.agent.context import estimate_context_tokens # noqa: E402 +from core.agent.recovery import AgentRunner, _cut_ids_of # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 纯方法 unbound 调用,不实例化 + +RESULTS = [] +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + +TMP = os.path.join(tempfile.gettempdir(), f"haocode_compact_persist_{os.getpid()}.db") +if os.path.exists(TMP): + os.remove(TMP) +db = DBManager(TMP) +sess = db.create_session("压缩持久化测试") +sid = sess["id"] + +def add(role, content, parent): + return db.add_message(session_id=sid, role=role, content=content, parent_id=parent) + +# 链:r1(user 旧) → r2(assistant 旧) → r3(user 旧) → r4(assistant 保留) → r5(user 保留) +r1 = add("user", "旧问题1", None) +r2 = add("assistant", "旧回答1", r1["id"]) +r3 = add("user", "旧问题2", r2["id"]) +r4 = add("assistant", "保留回答", r3["id"]) +r5 = add("user", "保留问题", r4["id"]) +leaf_before = db.get_session_leaf(sid) +check("T0.初始叶子=最后一条", leaf_before == r5["id"]) + +MARK_SUMMARY = "## 摘要\n上方对话已摘要:用户问了两个旧问题。" + +# ---------- T1:标记插入(原子,不动叶子) ---------- +mid = db.insert_compaction_mark(sid, MARK_SUMMARY, r3["id"], r4["id"], + json.dumps({"path": "pre_prompt"}, ensure_ascii=False)) +chain = db.get_message_chain(sid) +check("T1.标记行已插入链上", mid is not None and any(m["id"] == mid for m in chain)) +check("T1.链=6行且顺序正确", + [m["id"] for m in chain] == [r1["id"], r2["id"], r3["id"], mid, r4["id"], r5["id"]], + [m["id"] for m in chain]) +check("T1.叶子指针不变", db.get_session_leaf(sid) == leaf_before) +check("T1.保留首条改指标记", chain[4]["parent_id"] == mid) +mark_row = next(m for m in chain if m["id"] == mid) +check("T1.标记 role/is_ignored", mark_row["role"] == "compaction" and mark_row["is_ignored"] == 1) + +# ---------- T5:分支一致性(无幻影分支) ---------- +check("T5.旧N唯一子=标记", [m["id"] for m in db.get_branch_info(r3["id"])] == [mid]) +check("T5.标记唯一子=保留首条", [m["id"] for m in db.get_branch_info(mid)] == [r4["id"]]) + +# ---------- T2:build_api_context 截断 ---------- +class _Dummy: + db = db +api = MainWindow.build_api_context(_Dummy(), sid) +api_text = json.dumps([m.get("content") for m in api], ensure_ascii=False) +check("T2.首条=摘要user消息(带_kind)", + api and api[0]["role"] == "user" and api[0]["content"] == MARK_SUMMARY + and api[0].get("_kind") == "compaction_summary", api[:1]) +check("T2.保留行仍在", "保留回答" in api_text and "保留问题" in api_text) +check("T2.切点前行消失", + "旧问题1" not in api_text and "旧回答1" not in api_text and "旧问题2" not in api_text) +check("T2.共3条(摘要+2保留)", len(api) == 3, len(api)) + +# ---------- T3:kind 传播 → 二次压缩走迭代摘要 ---------- +msgs = from_openai_messages(api) +check("T3.摘要 kind 还原", msgs and msgs[0].kind == "compaction_summary", + [m.kind for m in msgs]) +prep = prepare_compaction(msgs, CompactionSettings(reserve_tokens=1000, + keep_recent_tokens=2)) +check("T3.走 previous_summary 迭代路径", + prep is not None and prep.previous_summary == MARK_SUMMARY) + +# ---------- T4:双标记取最后一个 ---------- +mid2 = db.insert_compaction_mark(sid, "摘要2", r4["id"], r5["id"]) +api2 = MainWindow.build_api_context(_Dummy(), sid) +api2_text = json.dumps([m.get("content") for m in api2], ensure_ascii=False) +check("T4.取最后一个标记", api2[0]["content"] == "摘要2" and len(api2) == 2, len(api2)) +check("T4.只留第二个切点之后", "保留问题" in api2_text and "保留回答" not in api2_text) + +# ---------- T6:_cut_ids_of 切点计算(单元) ---------- +A = AgentMessage(role="user", content="x", db_msg_id="a") +B = AgentMessage(role="assistant", content="y", db_msg_id="") +C = AgentMessage(role="toolResult", content="z", db_msg_id="") +S = AgentMessage(role="user", content="SUM", kind="compaction_summary") +check("T6.尾巴首条无DB行→first为空(UI跳过插标记)", + _cut_ids_of([A, B, C], [S, B, C]) == ("a", "")) +B2 = AgentMessage(role="assistant", content="y", db_msg_id="b") +check("T6.正常切点", _cut_ids_of([A, B2, C], [S, B2, C]) == ("a", "b")) +D = AgentMessage(role="assistant", content="d", db_msg_id="d") +check("T6.尾巴不在旧列表→不插", _cut_ids_of([A, B2, C], [S, D]) == ("", "")) +check("T6.无之前消息→无切点", _cut_ids_of([B2, C], [S, B2, C]) == ("", "")) + +# T6c:⚠️ 同 id 回放序列(timeline 多条目共享一行 id)—— 曾导致 DB 自环卡死 +Pm = AgentMessage(role="user", content="p", db_msg_id="p") +A1 = AgentMessage(role="assistant", content="a1", db_msg_id="a") +A2 = AgentMessage(role="assistant", content="a2", db_msg_id="a") +A3 = AgentMessage(role="toolResult", content="a3", db_msg_id="a") +Qm = AgentMessage(role="user", content="q", db_msg_id="q") +cut = _cut_ids_of([Pm, A1, A2, A3, Qm], [S, A2, A3, Qm]) +check("T6c.同id回放切点回退到行头(cut_before≠first_retained)", + cut == ("p", "a"), cut) +cut2 = _cut_ids_of([Pm, A1, A2, A3, Qm], [S, A3, Qm]) +check("T6c.尾巴起点更深也回退到行头", cut2 == ("p", "a"), cut2) + +# ---------- T10:insert_compaction_mark 自环守卫 ---------- +bad = db.insert_compaction_mark(sid, "S", r5["id"], r5["id"]) +check("T10.cut==retained 拒绝插入(防自环)", bad is None) + +# ---------- T11:get_message_chain 环守卫(手工造 2 环) ---------- +sid2 = db.create_session("环守卫")["id"] +x1 = db.add_message(session_id=sid2, role="user", content="x1", parent_id=None) +x2 = db.add_message(session_id=sid2, role="assistant", content="x2", parent_id=x1["id"]) +with db.get_connection() as conn: + conn.execute("UPDATE messages SET parent_id=? WHERE id=?", (x1["id"], x2["id"])) + conn.execute("UPDATE messages SET parent_id=? WHERE id=?", (x2["id"], x1["id"])) + conn.commit() +import time as _t +t0 = _t.time() +chain11 = db.get_message_chain(sid2) +dur = _t.time() - t0 +check("T11.手工2环不死循环(<2s返回)", dur < 2 and 1 <= len(chain11) <= 3, (dur, len(chain11))) + +# ---------- T7:pre_prompt_compaction 事件 payload 端到端 ---------- +model = ModelConfig(provider="t", name="t", context_window=500, + max_tokens=100, api_key="k", base_url="http://x") +cfg = AgentConfig(model=model, system_prompt="s", tools=[], tool_context={}, + compaction_reserve=100, compaction_keep_recent=100) +from core.agent.agent import Agent # noqa: E402 +agent = Agent(cfg) +old_msgs = [ + AgentMessage(role="user", content="旧旧问题", db_msg_id="m1"), + AgentMessage(role="assistant", content="旧旧回答", db_msg_id="m2"), + AgentMessage(role="user", content="旧上下文 " * 200, db_msg_id="m3"), + AgentMessage(role="assistant", content="新回答", db_msg_id="m4"), + AgentMessage(role="user", content="新问题", db_msg_id="m5"), +] +agent.state.messages = old_msgs +runner = AgentRunner(agent, summarize_fn=lambda p, s, mt: "摘要X") +ok = runner.pre_prompt_compaction() +check("T7.压缩被触发", ok is True) +ev = runner.compaction_events[-1] +new_msgs = agent.state.messages +first = new_msgs[1] +idx = next(i for i, m in enumerate(old_msgs) if m is first) +check("T7.payload cut_before_id=切点前DB行", + ev.get("cut_before_id") == old_msgs[idx - 1].db_msg_id, ev) +check("T7.payload first_retained_id=尾巴首条DB行", + ev.get("first_retained_id") == first.db_msg_id, ev) +check("T7.新消息=摘要+尾巴", new_msgs[0].kind == "compaction_summary" + and new_msgs[1:] == old_msgs[idx:]) + +# ---------- T8:_key 不泄漏到 API ---------- +api_out = to_openai_messages(old_msgs) +check("T8.下划线内部字段不进API", + all(not any(k.startswith("_") for k in m.keys()) for m in api_out)) + +# ---------- T9:UI 渲染过滤排除 compaction(静态) ---------- +_mw_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "ui", "views", "main_window.py") +with open(_mw_path, "r", encoding="utf-8") as f: + _src = f.read() +# 注意:探针与循环变量名解耦(源码列表推导式用 `m` 或 `msg` 均可), +# 只锁死“渲染过滤排除 system/compaction”这一语义。 +check("T9.渲染过滤含 compaction", '["role"] not in ("system", "compaction")' in _src) + +# ---------- T12:Fix A — 摘要条目 timestamp → P0 失效过期锚点 ---------- +# 场景(长程会话 92.7k→11k):保留行里 assistant 的入库 usage 是压缩前快照; +# 若摘要条目不带 timestamp,显示/压缩判定会锚到过期值(92.7k),而真实 +# 下一轮输入只有摘要+保留行(~11k)。 +sid3 = db.create_session("过期锚点失效")["id"] +u1 = db.add_message(session_id=sid3, role="user", content="u" * 2000, parent_id=None) +a1 = db.add_message(session_id=sid3, role="assistant", content="A" * 40000, + parent_id=u1["id"], + usage=json.dumps({"input": 92700, "output": 500, + "cacheRead": 0, "cacheWrite": 0})) +u2 = db.add_message(session_id=sid3, role="user", content="v" * 2000, parent_id=a1["id"]) +db.add_message(session_id=sid3, role="assistant", content="B" * 40000, parent_id=u2["id"], + usage=json.dumps({"input": 92700, "output": 500, + "cacheRead": 0, "cacheWrite": 0})) +# 把全部行时间戳拨到 3000s 前(模拟它们早于压缩发生) +with db.get_connection() as conn: + conn.execute("UPDATE messages SET created_at=? WHERE session_id=?", + (int(_t.time()) - 3000, sid3)) + conn.commit() +api_ns = MainWindow.build_api_context(_Dummy(), sid3) +est_ns = estimate_context_tokens(from_openai_messages(api_ns)) +check("T12.对照:无标记→锚定入库usage", est_ns.usage_tokens > 0, est_ns.usage_tokens) +mid3 = db.insert_compaction_mark(sid3, "摘要", a1["id"], u2["id"]) +api3 = MainWindow.build_api_context(_Dummy(), sid3) +check("T12.摘要条目带timestamp且晚于保留行", + api3 and api3[0].get("timestamp", 0) > 0 + and all(api3[0]["timestamp"] > m.get("timestamp", 0) for m in api3[1:])) +est3 = estimate_context_tokens(from_openai_messages(api3)) +check("T12.有标记→过期锚点失效(usage_tokens=0)", est3.usage_tokens == 0, + est3.usage_tokens) +check("T12.估算=全量公式(远离过期93.2k)", est3.tokens < 40000, est3.tokens) + +# ---------- T13:Fix B + G1 — 工具行显示不锚点(G1 行块规则单元化) ---------- +# 场景(任务流会话 40.5k→80k):工具行的入库 usage 是本轮最后一个子请求的 +# 快照(工具输出未截断),下一轮真实输入=4k 截断回放。🆕 G1 后不再需要 +# 手动清锚:锚点选择器自动失效含工具行的 usage → 估算=全量公式。 +sid4 = db.create_session("工具行不锚点")["id"] +p1 = db.add_message(session_id=sid4, role="user", content="prompt", parent_id=None) +tl = json.dumps([ + {"t": "text", "text": "code" * 50000}, + {"t": "tool", "id": "c1", "name": "bash", "args": "{}", "result": "ok"}, + {"t": "text", "text": "done"}, +], ensure_ascii=False) +db.add_message(session_id=sid4, role="assistant", content="x", parent_id=p1["id"], + timeline=tl, + usage=json.dumps({"input": 32517, "output": 7999, + "cacheRead": 0, "cacheWrite": 0})) +api4 = MainWindow.build_api_context(_Dummy(), sid4) +check("T13.回放含tool条目(规则条件成立)", + any(m.get("role") == "tool" for m in api4)) +_est4 = estimate_context_tokens(from_openai_messages(api4)) +check("T13.G1:工具行入库usage自动失效锚点(无需手动清锚)", + _est4.usage_tokens == 0, _est4.usage_tokens) +check("T13.估算=全量公式(>旧锚点40516,度量截断回放)", + _est4.tokens > 40516, _est4.tokens) +# G1 精确性:仅失效「含工具活动的行」的 usage,其后的纯文本行锚点保留 +sid4b = db.create_session("工具行后纯文本行锚点保留")["id"] +p1b = db.add_message(session_id=sid4b, role="user", content="prompt", parent_id=None) +t1b = db.add_message(session_id=sid4b, role="assistant", content="x", parent_id=p1b["id"], + timeline=tl, + usage=json.dumps({"input": 32517, "output": 7999, + "cacheRead": 0, "cacheWrite": 0})) +u1b = db.add_message(session_id=sid4b, role="user", content="q2", parent_id=t1b["id"]) +_a2b = db.add_message(session_id=sid4b, role="assistant", content="y", parent_id=u1b["id"], + usage=json.dumps({"input": 90000, "output": 100, + "cacheRead": 0, "cacheWrite": 0})) +api4b = MainWindow.build_api_context(_Dummy(), sid4b) +_est4b = estimate_context_tokens(from_openai_messages(api4b)) +check("T13.G1:工具行(旧)usage失效、其后纯文本行(新)usage保留锚点", + _est4b.usage_tokens > 0 and _est4b.usage_tokens == 90100, + _est4b.usage_tokens) +# 纯文本会话:规则条件不成立 → 保留精确锚点(provider 实测值更准) +sid5 = db.create_session("文本行锚点")["id"] +p2 = db.add_message(session_id=sid5, role="user", content="hi", parent_id=None) +db.add_message(session_id=sid5, role="assistant", content="hello", parent_id=p2["id"], + usage=json.dumps({"input": 100, "output": 50, + "cacheRead": 0, "cacheWrite": 0})) +api5 = MainWindow.build_api_context(_Dummy(), sid5) +check("T13.纯文本行→无tool条目(保留锚点)", + not any(m.get("role") == "tool" for m in api5) + and estimate_context_tokens(from_openai_messages(api5)).usage_tokens > 0) + +# ---------- T14:G2 — should_compact 透传 system/tools(无锚点分支度量下一请求) ---------- +from core.agent.context import should_compact +_mc14 = ModelConfig(name="t", context_window=100000) +_msgs14 = from_openai_messages(api4) # 工具行 → G1 无锚点 +_sh_no, _tok_no = should_compact(_msgs14, _mc14, 16384) +_sh_yes, _tok_yes = should_compact(_msgs14, _mc14, 16384, + system_prompt="S" * 2000, + tools=[types.SimpleNamespace( + name="bash", description="d" * 1000, + parameters={})]) +check("T14.传入system/tools后估算增大(无锚点分支)", + _tok_yes > _tok_no, (_tok_no, _tok_yes)) +# 阈值边缘:同样内容,带上 system/tools 后跨过阈值 → 触发判定变化 +_mc_edge = ModelConfig(name="t2", context_window=_tok_no + 16384 + 5) +_sh_edge_no, _ = should_compact(_msgs14, _mc_edge, 16384) +_sh_edge_yes, _ = should_compact(_msgs14, _mc_edge, 16384, + system_prompt="S" * 2000, + tools=[types.SimpleNamespace( + name="bash", description="d" * 1000, + parameters={})]) +check("T14.阈值边缘:计入system/tools才触发(防低估漏压缩)", + _sh_edge_no is False and _sh_edge_yes is True, + (_sh_edge_no, _sh_edge_yes)) + +failed = [n for n, okk in RESULTS if not okk] +print(f"\n===== {len(RESULTS) - len(failed)}/{len(RESULTS)} PASS =====", flush=True) +print("ALL PASS" if not failed else f"FAILED: {failed}", flush=True) +sys.exit(0 if not failed else 1) diff --git a/tests/test_config_isolation.py b/tests/test_config_isolation.py new file mode 100644 index 0000000..5d2b62a --- /dev/null +++ b/tests/test_config_isolation.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- +"""tests/test_config_isolation.py —— P0-01 配置路径与测试隔离回归 + +运行: python tests/test_config_isolation.py +(仓库惯例:无 pytest 依赖,独立可跑;GUI 部分自动走 offscreen) + +完成证据(REPAIR_BACKLOG.md P0-01): + 1. 打开路径拦截器记录到的配置打开路径全部位于临时目录,真实配置路径从未被打开; + 该断言只用路径字符串比较,不读取、不散列真实配置文件; + 2. 临时配置读写用例通过,临时数据库之外没有数据库写入; + 3. 缺失配置与损坏配置各有一个回归用例:日志含明确警告、返回安全默认值、无异常; + 4. 静态扫描:源码中不存在绕过统一路径解析(core/config_paths)的运行时配置读取。 +""" +import ast +import contextlib +import io +import json +import os +import sqlite3 +import sys + +_TESTS_DIR = os.path.dirname(os.path.abspath(__file__)) +_ROOT = os.path.dirname(_TESTS_DIR) +sys.path.insert(0, _ROOT) + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ.setdefault("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-gpu") +os.environ.setdefault("PYTHONIOENCODING", "utf-8") + +from tests._test_env import isolate, default_config # noqa: E402 + +_TMP = isolate("cfgiso") # 必须在 import MainWindow 之前 +_REAL_CONFIG = os.path.join(_ROOT, "data", "config.json") # 仅作路径字符串,永不打开 + +ok = True + + +def check(name, cond, extra=""): + global ok + print((" PASS " if cond else " FAIL ") + name + + ("" if cond else f" {extra}"), flush=True) + if not cond: + ok = False + + +# ====================================================================== +# 拦截器:记录 builtins.open 与 sqlite3.connect 触碰的路径(不读取真实配置内容) +# ====================================================================== +class OpenInterceptor: + def __init__(self): + self.ops = [] # (path, mode) + self._real_open = None + + def __enter__(self): + self._real_open = __builtins__["open"] if isinstance( + __builtins__, dict) else __builtins__.open + import builtins + builtins.open = self._open + return self + + def _open(self, file, mode="r", *args, **kwargs): + try: + p = os.fspath(file) + except TypeError: + p = None + if p is not None: + self.ops.append((os.path.abspath(str(p)), str(mode))) + return self._real_open(file, mode, *args, **kwargs) + + def __exit__(self, *exc): + import builtins + builtins.open = self._real_open + return False + + # ---- 断言辅助 ---- + def config_ops(self): + # 含原子写的临时文件 config.json.tmp + return [(p, m) for p, m in self.ops + if os.path.basename(p).startswith("config.json")] + + def real_config_opened(self): + return [op for op in self.ops + if os.path.normcase(op[0]) == os.path.normcase(_REAL_CONFIG)] + + +class SqliteInterceptor: + def __init__(self): + self.paths = [] + self._real_connect = None + + def __enter__(self): + self._real_connect = sqlite3.connect + sqlite3.connect = self._connect + return self + + def _connect(self, database, *args, **kwargs): + self.paths.append(str(database)) + return self._real_connect(database, *args, **kwargs) + + def __exit__(self, *exc): + sqlite3.connect = self._real_connect + return False + + +# ====================================================================== +# 1) 静态扫描:不得存在绕过统一路径解析的配置读取 +# (源码中不允许出现 "config.json" 字符串字面量,core/config_paths.py 除外; +# 文档字符串与注释不计) +# ====================================================================== +def _docstring_values(tree) -> set: + vals = set() + + def _first_expr_body(body): + if body and isinstance(body[0], ast.Expr) and \ + isinstance(body[0].value, ast.Constant) and \ + isinstance(body[0].value.value, str): + vals.add(body[0].value.value) + + _first_expr_body(tree.body) + for node in ast.walk(tree): + if isinstance(node, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)): + _first_expr_body(node.body) + return vals + + +def static_scan(): + allowed = os.path.normcase(os.path.join(_ROOT, "core", "config_paths.py")) + bad = [] + scan_dirs = [os.path.join(_ROOT, d) for d in ("core", "ui", "tools")] + scan_files = [os.path.join(_ROOT, "main.py")] + targets = list(scan_files) + for d in scan_dirs: + for dirpath, _dirnames, filenames in os.walk(d): + if "__pycache__" in dirpath: + continue + for fn in filenames: + if fn.endswith(".py"): + targets.append(os.path.join(dirpath, fn)) + for path in targets: + with open(path, "r", encoding="utf-8") as f: + src = f.read() + tree = ast.parse(src, filename=path) + docstrings = _docstring_values(tree) + for node in ast.walk(tree): + if isinstance(node, ast.Constant) and isinstance(node.value, str) \ + and "config.json" in node.value \ + and node.value not in docstrings: + if os.path.normcase(path) != allowed: + bad.append(f"{os.path.relpath(path, _ROOT)}:{node.lineno}") + return bad + + +bad_literal = static_scan() +check("静态:源码无绕过统一解析的 config.json 字面量(仅 core/config_paths.py 允许)", + not bad_literal, f"发现: {bad_literal}") + + +# ====================================================================== +# 2) 缺失配置 / 损坏配置:可见警告 + 安全默认值 + 无异常 +# ====================================================================== +from core.config_paths import config_path, load_config # noqa: E402 +import core.llm_engine as le # noqa: E402 + +saved_env = os.environ.get("HAOCODE_CONFIG_FILE") + +_missing = os.path.join(_TMP["base"], "no_such_config.json") +os.environ["HAOCODE_CONFIG_FILE"] = _missing +_buf = io.StringIO() +with contextlib.redirect_stdout(_buf): + _res = load_config() +_log = _buf.getvalue() +check("缺失配置:返回安全空 dict", _res == {}) +check("缺失配置:日志含明确警告", "缺失" in _log and "config" in _log, _log) + +_corrupt = os.path.join(_TMP["base"], "corrupt.json") +with open(_corrupt, "w", encoding="utf-8") as f: + f.write("{ this is not valid json") +os.environ["HAOCODE_CONFIG_FILE"] = _corrupt +_buf = io.StringIO() +with contextlib.redirect_stdout(_buf): + _res = load_config() +_log = _buf.getvalue() +check("损坏配置:返回安全空 dict", _res == {}) +check("损坏配置:日志含明确警告", "解析失败" in _log or "读取/解析失败" in _log, _log) + +_notdict = os.path.join(_TMP["base"], "notdict.json") +with open(_notdict, "w", encoding="utf-8") as f: + f.write("[1, 2, 3]") +os.environ["HAOCODE_CONFIG_FILE"] = _notdict +_buf = io.StringIO() +with contextlib.redirect_stdout(_buf): + _res = load_config() +_log = _buf.getvalue() +check("非对象配置:返回安全空 dict 且有警告", _res == {} and "不是 JSON 对象" in _log, _log) + +os.environ["HAOCODE_CONFIG_FILE"] = saved_env # 恢复临时配置 +check("环境变量恢复:config_path 回到临时目录", + os.path.normcase(config_path()) == os.path.normcase(_TMP["config"])) + + +# ====================================================================== +# 3) 临时配置读取(llm_engine 统一入口) +# ====================================================================== +_cfg_now = le._load_config() +check("llm_engine._load_config 读取临时配置(含测试 provider)", + "testprov" in _cfg_now.get("providers", {})) + + +# ====================================================================== +# 4) MainWindow 全链路:构造主窗口期间,配置打开/数据库连接全部落在临时目录 +# ====================================================================== +from PyQt6.QtWidgets import QApplication # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 +import ui.views.bash_panel as bp # noqa: E402 + +app = QApplication.instance() or QApplication(sys.argv) + +oi = OpenInterceptor() +si = SqliteInterceptor() +with oi, si: + win = MainWindow() + # 宽度记录写回(config.json 写路径) + bp.save_panel_width(340) + win.close() + win.deleteLater() + app.processEvents() + +check("MainWindow 构造期间真实配置从未被打开", + not oi.real_config_opened(), f"打开记录: {oi.real_config_opened()}") +_cfg_ops = oi.config_ops() +check("MainWindow 链路至少发生一次配置读取(路径被验证而非空转)", + len(_cfg_ops) >= 1, f"记录: {_cfg_ops}") +_check_base = os.path.normcase(os.path.abspath(_TMP["base"])) +_outside = [op for op in _cfg_ops + if not os.path.normcase(op[0]).startswith(_check_base)] +check("全部 config.json 打开路径均位于临时目录", not _outside, f"越界: {_outside}") +_write_ops = [op for op in _cfg_ops if "w" in op[1]] +check("配置写路径(bash_panel 宽度)落在临时目录", + bool(_write_ops) and not [op for op in _write_ops + if not os.path.normcase(op[0]).startswith(_check_base)], + f"写记录: {_write_ops}") +check("save_panel_width 写回可被读回", bp.load_panel_width() == 340) + +_db_outside = [p for p in si.paths + if not (os.path.normcase(os.path.abspath(p)).startswith(_check_base) + or p in (":memory:", ""))] +check("临时数据库之外没有数据库连接/写入", not _db_outside, f"越界: {_db_outside}") +check("MainWindow.config_data 来自临时配置(providers 无真实凭据)", + set(win.config_data.get("providers", {}).keys()) == {"testprov"}) + + +# ====================================================================== +# 汇总 +# 注:QtWebEngine 在 offscreen 下的 C++ 静态析构可能在正常 sys.exit 后段错误, +# 测试进程用 os._exit 直接退出(退出码已在上方断言中确定),不改变测试结果。 +# ====================================================================== +print(f"\n===== test_config_isolation: {'ALL PASS' if ok else 'HAS FAILURES'} =====", flush=True) +os._exit(0 if ok else 1) diff --git a/tests/test_copy_session.py b/tests/test_copy_session.py new file mode 100644 index 0000000..c7eb720 --- /dev/null +++ b/tests/test_copy_session.py @@ -0,0 +1,336 @@ +# -*- coding: utf-8 -*- +""" +会话复制(DBManager.copy_session)单测 +—— 全程临时 DB + 临时附件目录,绝不触碰真实 data/chat_history.db + +覆盖: + T1 线性会话复制(消息数/顺序/内容一致,ID 全新) + T2 parent_id 链重建正确(首条 parent 为 None,链走通) + T3 分叉会话整树复制(分支数一致) + T4 压缩标记原样复制(数量/内容/切点关系/时间戳晚于全部保留行) + T5 current_leaf_msg_id 重映射且真实存在 + T6 源会话零改动(全列快照比对) + T7 删副本 → 源完好;删源 → 副本完好 + T8 图片附件物理复制到新路径(新旧文件同时存在、内容相同) + T9 文本附件原样保留(不产生新文件、metadata 逐字节相同) + T10 title / is_starred / mode / has_messages / sort_order 语义 + T11 不存在的 session_id → None,且无残留 + T12 副本再复制 → 标题 (副本 2) + T13 外键无违规 + 无孤儿 parent_id + T14 get_message_chain(源) 与 副本 的 (role, content, is_ignored) 序列完全相同 + +运行: PYTHONIOENCODING=utf-8 python tests/test_copy_session.py +""" +import os +import sys +import json +import uuid +import time +import tempfile +import shutil + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from core.db_manager import DBManager # noqa: E402 + +RESULTS = [] + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +_TMP = tempfile.mkdtemp(prefix="hocode_copysess_") +_ATT = os.path.join(_TMP, "data", "attachments") +os.makedirs(_ATT, exist_ok=True) + +db = DBManager(os.path.join(_TMP, "data", "chat_history.db")) +db.files_root = _TMP # 附件根指向临时目录 + + +# ====================================================================== +# 工具函数 +# ====================================================================== +def mk_session(title, msgs, mode=None, starred=0, has_messages=1, att_meta=None): + """建一个线性会话。msgs=[(role, content)];att_meta={index: json_string} + 返回 (session_id, [msg_id])""" + sid = "sess_" + uuid.uuid4().hex[:12] + now = int(time.time()) + with db.get_connection() as conn: + cur = conn.cursor() + cur.execute( + "INSERT INTO sessions (id,title,created_at,updated_at,has_messages,sort_order," + "is_starred,current_leaf_msg_id,mode) VALUES (?,?,?,?,?,?,?,?,?)", + (sid, title, now, now, has_messages, db.get_min_sort_order(), starred, None, mode)) + prev, ids = None, [] + for i, (role, content) in enumerate(msgs): + mid = ("comp_" if role == "compaction" else "msg_") + uuid.uuid4().hex[:16] + meta = (att_meta or {}).get(i) + cur.execute( + "INSERT INTO messages (id,session_id,role,content,reasoning,is_ignored," + "created_at,attachment_metadata,parent_id,timeline,usage) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?)", + (mid, sid, role, content, "思考内容", 0, now - 1000 + i, meta, prev, + '{"t":1}', '{"input":10,"output":5}')) + ids.append(mid) + prev = mid + cur.execute("UPDATE sessions SET current_leaf_msg_id = ? WHERE id = ?", (prev, sid)) + conn.commit() + return sid, ids + + +def add_child(session_id, parent_id, role, content, ts): + """在指定 parent 下挂一个子消息(构造分叉用)""" + mid = "msg_" + uuid.uuid4().hex[:16] + with db.get_connection() as conn: + conn.execute( + "INSERT INTO messages (id,session_id,role,content,reasoning,is_ignored," + "created_at,attachment_metadata,parent_id,timeline,usage) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?)", + (mid, session_id, role, content, "", 0, ts, None, parent_id, None, None)) + conn.commit() + return mid + + +def rows_of(sid): + with db.get_connection() as conn: + return [dict(r) for r in conn.execute( + "SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC, rowid ASC", + (sid,)).fetchall()] + + +def sess_of(sid): + with db.get_connection() as conn: + r = conn.execute("SELECT * FROM sessions WHERE id = ?", (sid,)).fetchone() + return dict(r) if r else None + + +def sess_count(): + with db.get_connection() as conn: + return conn.execute("SELECT COUNT(*) FROM sessions").fetchone()[0] + + +def chain_sig(sid): + """(role, content, is_ignored) 序列""" + return [(m["role"], m["content"], m["is_ignored"]) + for m in db.get_message_chain(sid)] + + +# ====================================================================== +try: + # ---------------- T1/T2: 线性会话 ---------------- + src, src_ids = mk_session("线性会话", [ + ("system", "sys"), ("user", "u1"), ("assistant", "a1"), + ("user", "u2"), ("assistant", "a2")]) + n_before = sess_count() + cpy = db.copy_session(src) + check("T1.1 返回新会话 dict 且 id 不同", cpy and cpy["id"] != src) + check("T1.2 会话数 +1", sess_count() == n_before + 1, f"{n_before}->{sess_count()}") + + s_rows, c_rows = rows_of(src), rows_of(cpy["id"]) + check("T1.3 消息数一致", len(s_rows) == len(c_rows) == 5, f"{len(s_rows)}/{len(c_rows)}") + check("T1.4 ID 全新无交集", + not (set(r["id"] for r in s_rows) & set(r["id"] for r in c_rows))) + check("T1.5 role+content 序列一致", + [(r["role"], r["content"]) for r in s_rows] == + [(r["role"], r["content"]) for r in c_rows]) + check("T1.6 reasoning/timeline/usage 原样复制", + all(s["reasoning"] == c["reasoning"] and s["timeline"] == c["timeline"] + and s["usage"] == c["usage"] for s, c in zip(s_rows, c_rows))) + + # T2: parent 链重建 + idmap = {s["id"]: c["id"] for s, c in zip(s_rows, c_rows)} + ok_chain = c_rows[0]["parent_id"] is None + for s, c in list(zip(s_rows, c_rows))[1:]: + ok_chain = ok_chain and c["parent_id"] == idmap.get(s["parent_id"]) + check("T2.1 parent_id 全量重映射", ok_chain) + check("T2.2 副本链首 parent 为 None(未指回源 ID)", c_rows[0]["parent_id"] is None) + check("T2.3 副本链里不含任何源 ID", + not (set(idmap.keys()) & set(r["parent_id"] for r in c_rows if r["parent_id"]))) + + # ---------------- T3: 分叉会话整树复制 ---------------- + sid3, ids3 = mk_session("分叉会话", [("system", "s"), ("user", "q")]) + base = ids3[-1] + add_child(sid3, base, "assistant", "br1", int(time.time()) + 10) + add_child(sid3, base, "assistant", "br2", int(time.time()) + 11) + copy3 = db.copy_session(sid3) + c3 = rows_of(copy3["id"]) + src_branches = len(db.get_branch_info(base)) + c_base = [r for r in c3 if r["role"] == "user"][0]["id"] + check("T3.1 源有 2 个分支", src_branches == 2, str(src_branches)) + check("T3.2 副本分支数一致", len(db.get_branch_info(c_base)) == 2, + str(len(db.get_branch_info(c_base)))) + check("T3.3 副本消息总数一致", len(c3) == len(rows_of(sid3)) == 4) + check("T3.4 分支内容一致", + sorted(b["content"] for b in db.get_branch_info(c_base)) == ["br1", "br2"]) + + # ---------------- T4: 压缩标记 ---------------- + sid4, ids4 = mk_session("压缩会话", [ + ("system", "s"), ("user", "u1"), ("assistant", "a1"), + ("user", "u2"), ("assistant", "a2")]) + mark = db.insert_compaction_mark(sid4, "【摘要】前面聊了 u1/a1", + cut_before_id=ids4[2], first_retained_id=ids4[3]) + copy4 = db.copy_session(sid4) + c4 = rows_of(copy4["id"]) + s4 = rows_of(sid4) + c_marks = [r for r in c4 if r["role"] == "compaction"] + s_marks = [r for r in s4 if r["role"] == "compaction"] + check("T4.1 标记存在且已复制", len(s_marks) == 1 and len(c_marks) == 1) + check("T4.2 摘要内容一致", c_marks and c_marks[0]["content"] == s_marks[0]["content"]) + m4 = {s["id"]: c["id"] for s, c in zip(s4, c4)} + check("T4.3 标记 parent 指向副本的 cut_before", + c_marks[0]["parent_id"] == m4.get(ids4[2])) + check("T4.4 first_retained 的 parent 指向副本标记", + [r for r in c4 if r["id"] == m4.get(ids4[3])][0]["parent_id"] == c_marks[0]["id"]) + check("T4.5 标记 id 带 comp_ 前缀", c_marks[0]["id"].startswith("comp_")) + retained = [r for r in c4 if r["created_at"] is not None + and r["id"] != c_marks[0]["id"]] + check("T4.6 标记时间戳晚于全部其它行", + all(c_marks[0]["created_at"] >= r["created_at"] for r in retained)) + check("T4.7 标记 is_ignored 保持 1", c_marks[0]["is_ignored"] == 1) + # created_at 相对次序必须与源完全一致(兄弟排序依赖它) + s_order = [i for i, _ in sorted(enumerate([r["created_at"] for r in s4]), + key=lambda x: x[1])] + c_order = [i for i, _ in sorted(enumerate([r["created_at"] for r in c4]), + key=lambda x: x[1])] + check("T4.8 created_at 相对次序与源一致", s_order == c_order, f"{s_order} vs {c_order}") + + # ---------------- T5: 叶子重映射 ---------------- + check("T5.1 副本叶子非空且不是源叶子", + cpy["current_leaf_msg_id"] and cpy["current_leaf_msg_id"] != sess_of(src)["current_leaf_msg_id"]) + check("T5.2 副本叶子真实存在于副本", + cpy["current_leaf_msg_id"] in [r["id"] for r in c_rows]) + check("T5.3 副本叶子对应源叶子的内容", + [r for r in c_rows if r["id"] == cpy["current_leaf_msg_id"]][0]["content"] + == s_rows[-1]["content"]) + + # ---------------- T6: 源会话零改动 ---------------- + src_snapshot = (sess_of(src), [tuple(sorted(r.items())) for r in rows_of(src)]) + _ = db.copy_session(src) + src_after = (sess_of(src), [tuple(sorted(r.items())) for r in rows_of(src)]) + check("T6.1 复制两次后源 sessions 行不变", src_snapshot[0] == src_after[0]) + check("T6.2 复制两次后源 messages 全列不变", src_snapshot[1] == src_after[1]) + + # ---------------- T7: 双向删除隔离 ---------------- + sid7, _ = mk_session("隔离A", [("system", "s"), ("user", "x")]) + c7 = db.copy_session(sid7) + db.delete_session(c7["id"]) + check("T7.1 删副本后源仍在且消息完整", + sess_of(sid7) is not None and len(rows_of(sid7)) == 2) + # 方向二另起一对,避免与方向一互相干扰 + sid7b, _ = mk_session("隔离B", [("system", "s"), ("user", "y")]) + c7b = db.copy_session(sid7b) + db.delete_session(sid7b) + check("T7.2 删源后副本仍在且消息完整", + sess_of(c7b["id"]) is not None and len(rows_of(c7b["id"])) == 2, + f'cpy sess={sess_of(c7b["id"]) is not None} rows={len(rows_of(c7b["id"]))}') + + # ---------------- T8: 图片附件物理复制 ---------------- + png_src = os.path.join(_ATT, "img_src_test.png") + with open(png_src, "wb") as f: + f.write(b"\x89PNG\r\n\x1a\n" + b"FAKEIMAGEDATA" * 8) + img_meta = json.dumps({"user_text": "看看这张图", + "attachments": [{"type": "image", "size_kb": 0.2, + "local_path": "data/attachments/img_src_test.png"}]}, + ensure_ascii=False) + sid8, _ = mk_session("图片会话", [("system", "s"), ("user", "带图")], + att_meta={1: img_meta}) + c8 = db.copy_session(sid8) + m8 = [r for r in rows_of(c8["id"]) if r["attachment_metadata"]][0] + meta8 = json.loads(m8["attachment_metadata"]) + new_rel = meta8["attachments"][0]["local_path"] + new_abs = os.path.join(_TMP, new_rel) + check("T8.1 local_path 已改写为新文件", + new_rel != "data/attachments/img_src_test.png", new_rel) + check("T8.2 新旧文件同时存在", + os.path.isfile(png_src) and os.path.isfile(new_abs)) + check("T8.3 新文件内容与源一致", + open(new_abs, "rb").read() == open(png_src, "rb").read()) + check("T8.4 user_text 等其它字段保留", meta8["user_text"] == "看看这张图") + check("T8.5 源 metadata 未被改动", + json.loads([r for r in rows_of(sid8) if r["attachment_metadata"]][0] + ["attachment_metadata"])["attachments"][0]["local_path"] + == "data/attachments/img_src_test.png") + + # 缺文件容错:metadata 保留原路径,不抛异常 + bad_meta = json.dumps({"user_text": "x", "attachments": [ + {"type": "image", "local_path": "data/attachments/does_not_exist.png"}]}, + ensure_ascii=False) + sid8b, _ = mk_session("缺文件", [("system", "s"), ("user", "y")], att_meta={1: bad_meta}) + c8b = db.copy_session(sid8b) + bad_after = [r for r in rows_of(c8b["id"]) if r["attachment_metadata"]][0] + check("T8.6 源文件缺失时保留原路径且不失败", + json.loads(bad_after["attachment_metadata"])["attachments"][0]["local_path"] + == "data/attachments/does_not_exist.png") + + # ---------------- T9: 文本附件原样 ---------------- + txt_meta = json.dumps({"user_text": "", "attachments": [ + {"type": "text", "size_kb": 1.0, "lines": 3, "content": "aaa\nbbb\nccc"}]}, + ensure_ascii=False) + sid9, _ = mk_session("文本附件", [("system", "s"), ("user", "t")], att_meta={1: txt_meta}) + n_files_before = len(os.listdir(_ATT)) + c9 = db.copy_session(sid9) + t9 = [r for r in rows_of(c9["id"]) if r["attachment_metadata"]][0] + check("T9.1 文本附件 metadata 逐字节相同", + t9["attachment_metadata"] == txt_meta, t9["attachment_metadata"][:60]) + check("T9.2 文本附件不产生新文件", len(os.listdir(_ATT)) == n_files_before) + + # ---------------- T10: 字段语义 ---------------- + sid10, _ = mk_session("语义检查", [("system", "s"), ("user", "m")], + mode="worker", starred=1) + min_order_before = db.get_min_sort_order() + c10 = db.copy_session(sid10) + check("T10.1 标题 = 原名 + ' (副本)'", c10["title"] == "语义检查 (副本)", c10["title"]) + check("T10.2 副本不带星标", c10["is_starred"] == 0, str(c10["is_starred"])) + check("T10.3 mode 跟随源", c10["mode"] == "worker", str(c10["mode"])) + check("T10.4 has_messages 跟随源", c10["has_messages"] == sess_of(sid10)["has_messages"]) + check("T10.5 sort_order 置顶", c10["sort_order"] == min_order_before, + f'{c10["sort_order"]} vs {min_order_before}') + check("T10.6 源仍是星标且未被改标题", + sess_of(sid10)["is_starred"] == 1 and sess_of(sid10)["title"] == "语义检查") + check("T10.7 created_at/updated_at = 当前时间", + abs(c10["updated_at"] - int(time.time())) <= 5) + + # 无消息的会话(只有 system 行)也能复制 + sid10b, ids10b = mk_session("孤儿", [("system", "only")], has_messages=0) + c10b = db.copy_session(sid10b) + check("T10.8 仅 system 行的会话可复制", + c10b and len(rows_of(c10b["id"])) == 1 and c10b["current_leaf_msg_id"] is not None) + + # ---------------- T12: 副本再复制 → (副本 2) ---------------- + c12 = db.copy_session(c10["id"]) + check("T12.1 再复制标题递增为 (副本 2)", c12["title"] == "语义检查 (副本 2)", c12["title"]) + c12b = db.copy_session(c12["id"]) + check("T12.2 第三次复制为 (副本 3)", c12b["title"] == "语义检查 (副本 3)", c12b["title"]) + c12c = db.copy_session(sid10, new_title="自定义标题") + check("T12.3 可显式指定标题", c12c["title"] == "自定义标题", c12c["title"]) + + # ---------------- T11: 不存在的会话 ---------------- + n11 = sess_count() + check("T11.1 不存在 → None", db.copy_session("sess_not_exist_xxx") is None) + check("T11.2 无残留(会话数不变)", sess_count() == n11) + + # ---------------- T13: 外键 / 孤儿 ---------------- + bad_fk = 0 + orphans = 0 + with db.get_connection() as conn: + bad_fk = len(conn.execute("PRAGMA foreign_key_check").fetchall()) + for r in rows_of(cpy["id"]): + if r["parent_id"] and r["parent_id"] not in [x["id"] for x in c_rows]: + orphans += 1 + check("T13.1 外键无违规", bad_fk == 0, str(bad_fk)) + check("T13.2 无孤儿 parent_id", orphans == 0, str(orphans)) + + # ---------------- T14: 链签名一致(端到端) ---------------- + check("T14.1 线性会话链签名一致", chain_sig(src) == chain_sig(cpy["id"])) + check("T14.2 分叉会话链签名一致", chain_sig(sid3) == chain_sig(copy3["id"])) + check("T14.3 压缩会话链签名一致(含标记行)", chain_sig(sid4) == chain_sig(copy4["id"])) + +finally: + shutil.rmtree(_TMP, ignore_errors=True) + +failed = [n for n, ok in RESULTS if not ok] +print(f"\n===== {len(RESULTS) - len(failed)}/{len(RESULTS)} PASS =====", flush=True) +print("ALL PASS" if not failed else f"FAILED: {failed}", flush=True) +sys.exit(0 if not failed else 1) diff --git a/tests/test_cross_platform_shell.py b/tests/test_cross_platform_shell.py new file mode 100644 index 0000000..57171a0 --- /dev/null +++ b/tests/test_cross_platform_shell.py @@ -0,0 +1,253 @@ +# -*- coding: utf-8 -*- +""" +P1-02 跨平台 shell 契约单测(纯函数级 + 真实进程级,无 UI 依赖) + +覆盖: + A. 平台参数:Windows `cmd.exe /d /c` argv / Linux `/bin/bash -lc` argv; + Linux Popen 独立进程组(start_new_session),Windows 无该参数 + B. 提示词平台段:通用正文完全相同、只插入对应平台段、互不串段; + load_system_prompt() 与文件内容一致(当前平台) + C. 进程树(真实进程,父+孙): + - 当前平台:超时 → 父与孙都不存在 + - 当前平台:主动中止 → 父与孙都不存在 + - Linux 专属:独立进程组整组终止(Windows 上跳过) + D. kill_process_tree 安全边界:已退出的进程 / 无独立组 → 不抛异常、不误杀 + +运行: PYTHONIOENCODING=utf-8 python tests/test_cross_platform_shell.py +""" +import os +import subprocess +import sys +import tempfile +import time + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from core import platform_shell # noqa: E402 +from core.agent.tools import tool_bash # noqa: E402 +from core.agent.types import AbortSignal # noqa: E402 + +RESULTS = [] + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +def text_of(res): + c = res.content + if isinstance(c, str): + return c + return "".join(x.get("text", "") for x in c if isinstance(x, dict)) + + +_TMP = tempfile.mkdtemp(prefix="haocode_crossshell_") +PY = sys.executable +IS_WIN = os.name == "nt" + +# ====================================================================== +# A. 平台参数(mock 平台,纯逻辑) +# ====================================================================== +_orig_is_win = platform_shell.is_windows + + +def _mock_win(v): + platform_shell.is_windows = lambda: v + + +try: + _mock_win(True) + check("A1 Windows 命令 = cmd.exe /d /s /c \"\"", + platform_shell.shell_command("echo hi") + == 'cmd.exe /d /s /c "echo hi"', + repr(platform_shell.shell_command("echo hi"))) + check("A2 Windows popen_flags 无进程组参数", + platform_shell.popen_flags() == {}, repr(platform_shell.popen_flags())) + + _mock_win(False) + check("A3 Linux argv = /bin/bash -lc ", + platform_shell.shell_command("echo hi") == ["/bin/bash", "-lc", "echo hi"], + repr(platform_shell.shell_command("echo hi"))) + check("A4 Linux popen_flags 独立进程组", + platform_shell.popen_flags() == {"start_new_session": True}, + repr(platform_shell.popen_flags())) +finally: + platform_shell.is_windows = _orig_is_win + +# ====================================================================== +# B. 提示词平台段 +# ====================================================================== +_PROMPT_FILE = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "SYSTEM_PROMPT.md") +with open(_PROMPT_FILE, "r", encoding="utf-8") as f: + _PROMPT_TEXT = f.read().strip() + +check("B1 通用正文含占位符", + platform_shell.SHELL_SECTION_PLACEHOLDER in _PROMPT_TEXT) + +_GENERIC_NO_LEAK = ("cmd.exe" not in _PROMPT_TEXT + and "/bin/bash" not in _PROMPT_TEXT) +check("B2 通用正文无平台泄漏(无 cmd.exe / 无 /bin/bash)", _GENERIC_NO_LEAK) + +try: + _mock_win(True) + full_win = platform_shell.apply_platform_section(_PROMPT_TEXT) + sec_win = platform_shell.shell_prompt_section() + _mock_win(False) + full_lin = platform_shell.apply_platform_section(_PROMPT_TEXT) + sec_lin = platform_shell.shell_prompt_section() +finally: + platform_shell.is_windows = _orig_is_win + +check("B3 Windows 段含 cmd.exe、无 /bin/bash", + "cmd.exe" in sec_win and "/bin/bash" not in sec_win) +check("B4 Linux 段含 /bin/bash -lc、无 cmd.exe", + "/bin/bash -lc" in sec_lin and "cmd.exe" not in sec_lin) +check("B5 只有对应平台段被插入", + full_win == _PROMPT_TEXT.replace(platform_shell.SHELL_SECTION_PLACEHOLDER, sec_win) + and full_lin == _PROMPT_TEXT.replace(platform_shell.SHELL_SECTION_PLACEHOLDER, sec_lin)) +check("B6 通用正文两平台完全相同", + full_win.replace(sec_win, "§SEC§") == full_lin.replace(sec_lin, "§SEC§")) +check("B7 无占位符文本原样返回", + platform_shell.apply_platform_section("无占位符的兜底文本") == "无占位符的兜底文本") + +# load_system_prompt()(当前平台,真实文件) +from core import llm_engine # noqa: E402 (PyQt6/openai 已装,无需 QApplication) +check("B8 load_system_prompt = 文件内容 + 当前平台段", + llm_engine.load_system_prompt() + == platform_shell.apply_platform_section(_PROMPT_TEXT)) + +# ====================================================================== +# C. 进程树(真实进程:父 + 孙,心跳文件证明生死) +# ====================================================================== +_CHILD = os.path.join(_TMP, "child.py") +with open(_CHILD, "w", encoding="utf-8") as f: + f.write( + "import sys, time\n" + "hb = open(sys.argv[1], 'a', encoding='utf-8')\n" + "t0 = time.time()\n" + "while time.time() - t0 < 30:\n" + " hb.write(f'{time.time():.3f}\\n')\n" + " hb.flush()\n" + " time.sleep(0.2)\n" + "open(sys.argv[2], 'w').write('done')\n" + ) + + +def _spawn_parent(hb_path, done_path, out_path): + """写一个父进程脚本(启动孙进程后挂 30s),返回 bash 命令字符串。""" + parent = os.path.join(_TMP, f"parent_{os.path.basename(hb_path)}.py") + with open(parent, "w", encoding="utf-8") as f: + f.write( + "import subprocess, sys, time\n" + "p = subprocess.Popen([sys.executable, " + + repr(_CHILD) + ", sys.argv[1], sys.argv[2]], " + "stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n" + "time.sleep(30)\n" + ) + cmd = f'"{PY}" -u "{parent}" "{hb_path}" "{done_path}"' + return cmd + + +def _hb_last(hb_path): + try: + with open(hb_path, "r", encoding="utf-8") as f: + lines = [l.strip() for l in f if l.strip()] + return float(lines[-1]) if lines else None + except FileNotFoundError: + return None + + +def _tree_dead(hb_path, done_path, quiesce=1.2): + """等待静默后判断:孙进程不再有心跳、且未跑完 → 进程树已死。""" + time.sleep(quiesce) + last = _hb_last(hb_path) + return last is not None and (time.time() - last) > 0.6, os.path.exists(done_path) + + +def run_tree_case(tag, timeout=None, abort_after=None): + hb = os.path.join(_TMP, f"hb_{tag}.txt") + done = os.path.join(_TMP, f"done_{tag}.txt") + out = os.path.join(_TMP, f"out_{tag}.log") + cmd = _spawn_parent(hb, done, out) + + updates, timers = [], [] + sig = AbortSignal() + if abort_after is not None: + import threading + def _aborter(): + time.sleep(abort_after) + sig.abort("test") + threading.Thread(target=_aborter, daemon=True).start() + + t0 = time.time() + res = tool_bash(f"call_{tag}", {"command": cmd, "timeout": timeout or 60}, sig, + lambda t: updates.append(t), + {"cwd": _TMP, "on_timer": lambda e, tt: timers.append((e, tt))}) + dur = time.time() - t0 + return res, dur, hb, done, timers + + +# ---- C1: 超时 → 父与孙都不存在 ---- +res, dur, hb, done, timers = run_tree_case("timeout", timeout=3) +txt = text_of(res) +dead, finished = _tree_dead(hb, done) +check("C1.1 超时返回错误结果", res.is_error and "超时" in txt, f"{txt!r}") +check("C1.2 超时快速返回(<15s,含 taskkill 缓冲)", dur < 15, f"dur={dur:.1f}s") +check("C1.3 超时后父+孙都不存在(心跳停止且未跑完)", dead and not finished, + f"hb_last={_hb_last(hb)} finished={finished}") +check("C1.4 读秒滴答仍工作", len(timers) >= 2, f"timers={timers}") + +# ---- C2: 主动中止 → 父与孙都不存在 ---- +res, dur, hb, done, _timers2 = run_tree_case("abort", timeout=60, abort_after=1.5) +txt = text_of(res) +dead, finished = _tree_dead(hb, done) +check("C2.1 中止返回错误结果", res.is_error and "中止" in txt, f"{txt!r}") +check("C2.2 中止后父+孙都不存在(心跳停止且未跑完)", dead and not finished, + f"hb_last={_hb_last(hb)} finished={finished}") + +# ---- C3: Linux 独立进程组整组终止(Windows 跳过) ---- +if not IS_WIN: + proc = subprocess.Popen( + platform_shell.shell_command("sleep 30"), + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + **platform_shell.popen_flags()) + time.sleep(0.3) + try: + pgid = os.getpgid(proc.pid) + check("C3.1 start_new_session 生效(pgid == 子 pid)", pgid == proc.pid, + f"pgid={pgid} pid={proc.pid}") + platform_shell.kill_process_tree(proc, grace_s=1.0) + time.sleep(0.5) + check("C3.2 整组终止后子进程不存在", + proc.poll() is not None, f"poll={proc.poll()}") + except Exception as e: + try: + platform_shell.kill_process_tree(proc, grace_s=1.0) + except Exception: + pass + check("C3 Linux 进程组用例", False, repr(e)) +else: + print("SKIP C3 Linux 进程组用例(当前为 Windows,Windows 用例见 C1/C2)", flush=True) + +# ====================================================================== +# D. kill_process_tree 安全边界 +# ====================================================================== +_p = subprocess.Popen([PY, "-c", "pass"]) +_p.wait(timeout=5) +try: + platform_shell.kill_process_tree(_p, grace_s=0.5) + check("D1 已退出进程:不抛异常", True) +except Exception as e: + check("D1 已退出进程:不抛异常", False, repr(e)) + +try: + platform_shell.kill_process_tree(None) + check("D2 None 输入:不抛异常", True) +except Exception as e: + check("D2 None 输入:不抛异常", False, repr(e)) + +# ====================================================================== +print(f"\n===== {sum(1 for _, ok in RESULTS if ok)}/{len(RESULTS)} passed =====", flush=True) +sys.exit(0 if all(ok for _, ok in RESULTS) else 1) diff --git a/tests/test_debug_window.py b/tests/test_debug_window.py new file mode 100644 index 0000000..308b002 --- /dev/null +++ b/tests/test_debug_window.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +"""独立调试器窗口 + 调试日志协议 回归测试(离屏,临时文件,不碰真实 DB/日志) +运行: PYTHONIOENCODING=utf-8 QT_QPA_PLATFORM=offscreen python tests/test_debug_window.py +""" +import sys, os, re, tempfile +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +_TMPDIR = tempfile.mkdtemp(prefix="haocode_dbg_") +os.environ["HAOCODE_DEBUG_LOG"] = os.path.join(_TMPDIR, "debug_session.log") +os.environ["HAOCODE_DEBUG_CMD"] = os.path.join(_TMPDIR, "debug_window.cmd") + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" + +from core import debug_log as dl + +PASS, FAIL = 0, 0 + + +def check(name, cond, extra=""): + global PASS, FAIL + if cond: + PASS += 1 + print(f" PASS {name}") + else: + FAIL += 1 + print(f" FAIL {name} {extra}") + + +def read_log(): + if not os.path.exists(dl.DEBUG_LOG_PATH): + return "" + with open(dl.DEBUG_LOG_PATH, "r", encoding="utf-8") as f: + return f.read() + + +LINE_RE = re.compile(r"^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}\] " + r"\[(USER|AGENT|APP|SYS)\] .+$") + +# ============ T1: debug_log 三方写入 + 行格式 ============ +print("T1: debug_log 行格式与三方 TAG") +dl.debug_log("hello app", "APP") +dl.debug_log("代理注入一条备注", "AGENT") +dl.debug_log("用户观察到标签 40.5k", "USER") +lines = [l for l in read_log().splitlines() if l] +check("三行全部写入", len(lines) == 3, lines) +check("行格式 [ts] [TAG] msg", + all(LINE_RE.match(l) for l in lines), lines) +check("TAG 顺序 APP/AGENT/USER", + [re.search(r"\[(USER|AGENT|APP|SYS)\]", l).group(1) for l in lines] + == ["APP", "AGENT", "USER"]) + +# ============ T2: poll_debug_cmd 控制协议 ============ +print("T2: poll_debug_cmd 消费语义") +with open(dl.DEBUG_CMD_PATH, "w", encoding="utf-8") as f: + f.write("show\n") +check("show 被识别", dl.poll_debug_cmd() == "show") +check("文件被消费(再读为 None)", dl.poll_debug_cmd() is None) +with open(dl.DEBUG_CMD_PATH, "w", encoding="utf-8") as f: + f.write(" HIDE ") +check("hide 大小写/空白容忍", dl.poll_debug_cmd() == "hide") +with open(dl.DEBUG_CMD_PATH, "w", encoding="utf-8") as f: + f.write("garbage") +check("非法内容忽略", dl.poll_debug_cmd() is None) + +# ============ T3-T6: DebugWindow 行为(离屏) ============ +print("T3: DebugWindow 用户输入 → [USER] 落盘") +from PyQt6.QtWidgets import QApplication +app = QApplication.instance() or QApplication(sys.argv) +import ui.views.debug_window as dw +# 应用日志 tab 指向临时文件(不读真实 diag.log) +_tmp_diag = os.path.join(_TMPDIR, "diag.log") +dw._APP_LOGS[:] = [("DIAG", _tmp_diag)] + +win = dw.DebugWindow() +check("窗口标题独立", win.windowTitle() == "Haocode 调试器") +win._input.setText(" 发送后标签跳到 80k ") +win._on_submit() +check("输入框被清空", win._input.text() == "") +check("[USER] 已落盘且去首尾空白", + any(l.endswith("[USER] 发送后标签跳到 80k") for l in read_log().splitlines())) + +print("T4: 首次 tick 记 [SYS] 开启事件") +win._tick() +check("[SYS] 调试窗口开启 已写入", + any("[SYS] 调试窗口开启" in l for l in read_log().splitlines())) + +print("T5: 实时 tail 会话日志 + 应用日志") +dl.debug_log("tick 前注入的 APP 事件", "APP") +dl.debug_log("AGENT: 现在检查 compaction_diag.log", "AGENT") +win._tick() +txt = win._view_session.toPlainText() +check("会话视图含 APP 事件", "tick 前注入的 APP 事件" in txt, txt[-300:]) +check("会话视图含 AGENT 注入", "AGENT: 现在检查 compaction_diag.log" in txt) +with open(_tmp_diag, "w", encoding="utf-8") as f: + f.write("[12:00:00.000] DIAG_TEST_LINE\n") +win._tick() +check("应用日志视图含 DIAG tail", + "DIAG_TEST_LINE" in win._view_app.toPlainText()) +check("应用日志带文件头", "[DIAG]" in win._view_app.toPlainText()) + +print("T6: 暂停显示 + 截断重置") +win._chk_pause.setChecked(True) # 暂停 +dl.debug_log("暂停期间的行不应上屏", "APP") +win._tick() +check("暂停期间不上屏", "暂停期间的行不应上屏" + not in win._view_session.toPlainText()) +# 文件截断(模拟「清空会话日志」)→ 偏移重置,新行仍可读取 +win._chk_pause.setChecked(False) +with open(dl.DEBUG_LOG_PATH, "w", encoding="utf-8") as f: + f.write("[2026-01-01 00:00:00.000] [SYS] 截断后新内容\n") +win._tick() +check("截断后偏移重置、新行上屏", + "截断后新内容" in win._view_session.toPlainText()) + +win.close() + +# ============ T4: 调试窗口随程序启动(autostart_debug_window) ============ +print("T4: 调试窗口随程序启动") +p = dl.DEBUG_CMD_PATH +if os.path.exists(p): + os.remove(p) +# 显式 false → 不写控制文件 +check("T4.autostart=False 不写控制文件", + dl.autostart_debug_window({"debug_window_autostart": False}) is False + and not os.path.exists(p)) +# 缺省(键不存在)→ 默认开 +check("T4.缺省(无键)写入 show", + dl.autostart_debug_window({}) is True and os.path.exists(p)) +check("T4.轮询消费 show", + dl.poll_debug_cmd() == "show" and not os.path.exists(p)) +# 显式 true +check("T4.autostart=true 写入 show", + dl.autostart_debug_window({"debug_window_autostart": True}) is True) +check("T4.轮询再消费 show", + dl.poll_debug_cmd() == "show") + +print(f"\n===== {PASS} PASS / {FAIL} FAIL =====") +sys.exit(1 if FAIL else 0) diff --git a/tests/test_error_persist.py b/tests/test_error_persist.py new file mode 100644 index 0000000..01c2d5e --- /dev/null +++ b/tests/test_error_persist.py @@ -0,0 +1,361 @@ +# -*- coding: utf-8 -*- +"""失败轮次持久化(对照 pi:message_end 无条件入库 → 出错也写会话)+ 回放取舍。 + +核心诉求:agent 跑了 200 个工具后第 201 步出错,**已完成的工具结果不能白跑** —— +必须入库、必须能进下次上下文,这样"接着执行最后一次"才可能。 + +覆盖矩阵: + T1 全空失败轮 → 入库留痕(is_ignored=1),回放**跳过** + T2 有工具/正文的失败轮 → 入库 + 回放(工具调用与结果成对)★核心 + T3 轮内重试 → 只动内存、**不入库**(不会产生一堆错误行) + T4 孤儿工具(ok=None) → 回放注入合成结果(对照 pi insertSyntheticToolResults) + T5 叶子前进 → 不再"时光倒流";parent_id 指向本轮提问 + T6 压缩切点交互 → 切点之后照常回放;之前 → 出上下文 + T7 旧库自动迁移 → 新列补齐,旧行 stop_reason=NULL 行为不变 + T8 copy_session → 复制错误行时携带 stop_reason/error_message/is_ignored + +运行: QT_QPA_PLATFORM=offscreen python tests/test_error_persist.py +""" +import os +import sys +import json +import uuid +import sqlite3 +import tempfile + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" +os.environ.setdefault("PYTHONIOENCODING", "utf-8") + +# 铁律(P0-01):临时数据库 + 临时配置必须在 import MainWindow 之前完成 +from tests._test_env import isolate # noqa: E402 +_TMP = isolate("errpersist", config={"providers": {}}) +_DB_TMP = _TMP["db"] +_CFG_TMP = _TMP["config"] + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtTest import QTest # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 +from core.db_manager import DBManager # noqa: E402 +from core.agent.recovery import AgentRunner # noqa: E402 +from core.agent.types import (AgentConfig, AgentMessage, ModelConfig, # noqa: E402 + RetryConfig) + +app = QApplication(sys.argv) +ok = True + + +def check(name, cond, extra=""): + global ok + print((" PASS " if cond else " FAIL ") + name + + ("" if cond else f" {extra}"), flush=True) + if not cond: + ok = False + + +def settle(ms=120): + for _ in range(int(ms / 20) + 1): + app.processEvents() + QTest.qWait(20) + + +window = MainWindow() +window.show() +settle(300) + + +def mk_failed_turn(sid, body="", reasoning="", tools=None, err="连接失败: Connection error"): + """模拟一次「已流出一部分 → 出错」的轮次,返回 (user_msg_id, stream_state)""" + chain = window.db.get_message_chain(sid) + parent = chain[-1]["id"] if chain else None + st = { + "msg_id": f"msg_err_{uuid.uuid4().hex[:10]}", + "parent_id": parent, + "previous_leaf_id": parent, + "content": body, + "reasoning": reasoning, + "timeline": list(tools or []), + "usage": {}, + "tl_kind": "text", + "worker": None, + } + window.current_session_id = sid + window._active_streams[sid] = st + window.on_error(sid, err) + settle(120) + return parent, st + + +def tool_entry(cid, name, args, ok_flag, result): + return {"t": "tool", "id": cid, "name": name, "args": args, + "ok": ok_flag, "result": result} + + +# ====================================================================== +# T1 全空失败轮 → 入库留痕但回放跳过 +# ====================================================================== +sid1 = window.db.create_session("T1 全空失败")["id"] +uid1 = window.db.add_message(session_id=sid1, role="user", content="开始吧", + parent_id=None)["id"] +mk_failed_turn(sid1, body="", reasoning="", tools=[]) +chain1 = window.db.get_message_chain(sid1) +last1 = chain1[-1] +check("T1.1 全空失败轮也入库(对照 pi 无条件 append)", + len(chain1) == 2 and last1["role"] == "assistant", f"chain={len(chain1)}") +check("T1.2 标记 stop_reason=error + error_message", + last1.get("stop_reason") == "error" and "Connection error" in (last1.get("error_message") or ""), + f"{last1.get('stop_reason')} / {last1.get('error_message')}") +check("T1.3 全空 → is_ignored=1(只在库里留痕)", int(last1.get("is_ignored") or 0) == 1) +check("T1.4 正文含 ⚠️ 中断说明(供历史/UI 可见)", + "⚠️" in (last1.get("content") or "") and "本轮中断" in (last1.get("content") or ""), + (last1.get("content") or "")[:60]) +ctx1 = window.build_api_context(sid1) +check("T1.5 回放**跳过**全空错误行(避免空 assistant 触发服务商 400)", + not any(m.get("role") == "assistant" for m in ctx1), + str([m.get("role") for m in ctx1])) + +# ====================================================================== +# T2 ★核心:200 个工具后第 201 步出错 → 工具结果必须进上下文 +# ====================================================================== +sid2 = window.db.create_session("T2 工具后出错")["id"] +uid2 = window.db.add_message(session_id=sid2, role="user", + content="帮我建 3 个目录", parent_id=None)["id"] +tools2 = [tool_entry(f"c{i}", "bash", json.dumps({"command": f"mkdir d{i}"}), + True, f"d{i} created") for i in range(1, 4)] +tools2.append(tool_entry("c4", "bash", json.dumps({"command": "mkdir d4"}), + None, "")) # 孤儿:开始了但没结果 +mk_failed_turn(sid2, body="正在创建目录…", reasoning="先建目录", tools=tools2) +chain2 = window.db.get_message_chain(sid2) +last2 = chain2[-1] +check("T2.1 有工具/正文的失败轮入库且 is_ignored=0(会回放)", + last2["role"] == "assistant" and int(last2.get("is_ignored") or 0) == 0, + f"ignored={last2.get('is_ignored')}") +check("T2.2 timeline 完整保留 4 个工具条目", + len([e for e in json.loads(last2["timeline"] or "[]") + if e.get("t") == "tool"]) == 4, + str([e.get("t") for e in json.loads(last2["timeline"] or "[]")])) +check("T2.2b timeline 尾部多一条 text 条目(中断说明,回放时才看得到)", + (json.loads(last2["timeline"] or "[]")[-1].get("t") == "text" + and "⚠️" in json.loads(last2["timeline"] or "[]")[-1].get("text", "")), + str(json.loads(last2["timeline"] or "[]")[-1])[:80]) +check("T2.3 正文保留 + 尾部中断说明", + "正在创建目录" in last2["content"] and "⚠️" in last2["content"]) + +ctx2 = window.build_api_context(sid2) +tcs = [tc for m in ctx2 if m.get("role") == "assistant" for tc in (m.get("tool_calls") or [])] +tool_msgs = [m for m in ctx2 if m.get("role") == "tool"] +check("T2.4 ★回放里出现 4 个 tool_call(200 个工具的记录没丢)", len(tcs) == 4, + f"tool_calls={len(tcs)}") +check("T2.5 ★每个 tool_call 都有配对的 tool 结果(成对,服务商不会 400)", + len(tool_msgs) == len(tcs) and + {m["tool_call_id"] for m in tool_msgs} == {t["id"] for t in tcs}, + f"tool_msgs={len(tool_msgs)}") +check("T2.6 已完成的工具结果原文进上下文", + any("d1 created" in (m.get("content") or "") for m in tool_msgs)) +check("T2.7 错误说明文本也进上下文(模型知道上轮为何断)", + any(m.get("role") == "assistant" and "⚠️" in (m.get("content") or "") + for m in ctx2)) +check("T2.8 顺序正确:assistant tool_calls 在 tool 结果之前", + [m.get("role") for m in ctx2].index("assistant") < + [m.get("role") for m in ctx2].index("tool")) + +# ====================================================================== +# T3 轮内重试只动内存、不入库 +# ====================================================================== +class _FakeState: + def __init__(self, msgs): + self.messages = msgs + + +class _FakeAgent: + def __init__(self): + self.config = AgentConfig( + model=ModelConfig(name="fake"), + retry=RetryConfig(max_attempts=3, base_delay_ms=1, factor=2.0), + ) + self.state = _FakeState([ + AgentMessage(role="user", content="hi"), + AgentMessage(role="assistant", stop_reason="error", + error_message="connection error"), + ]) + + +fa = _FakeAgent() +runner = AgentRunner(fa, summarize_fn=None) +n_before = len(window.db.get_message_chain(sid2)) +retried = runner._prepare_retry(fa.config.retry, reason="connection error") +n_after = len(window.db.get_message_chain(sid2)) +check("T3.1 _prepare_retry 生效(可重试错误)", retried is True) +check("T3.2 重试只从**内存**移除坏消息(轮次未结束,不该入库)", + len(fa.state.messages) == 1 and fa.state.messages[-1].role == "user", + str([m.role for m in fa.state.messages])) +check("T3.3 ★重试前后 DB 行数不变(不会堆一堆错误行)", n_before == n_after, + f"{n_before} -> {n_after}") + +# 正常成功轮 → 不写 error 列 +sid3 = window.db.create_session("T3 正常轮")["id"] +uid3 = window.db.add_message(session_id=sid3, role="user", content="你好", + parent_id=None)["id"] +st3 = {"msg_id": "msg_ok_1", "parent_id": uid3, "previous_leaf_id": uid3, + "content": "你好,我在。", "reasoning": "", "timeline": [], "usage": {}, + "tl_kind": "text", "worker": None} +window.current_session_id = sid3 +window._active_streams[sid3] = st3 +window.on_reply_finished(sid3) +settle(150) +ok_row = window.db.get_message_chain(sid3)[-1] +check("T3.4 正常轮 stop_reason 为空(与错误行可区分)", + not ok_row.get("stop_reason"), f"{ok_row.get('stop_reason')!r}") + +# ====================================================================== +# T4 孤儿工具 → 合成结果(对照 pi insertSyntheticToolResults) +# ====================================================================== +sid4 = window.db.create_session("T4 孤儿工具")["id"] +uid4 = window.db.add_message(session_id=sid4, role="user", content="跑个命令", + parent_id=None)["id"] +mk_failed_turn(sid4, body="", tools=[tool_entry("orphan1", "bash", "{}", None, "")]) +ctx4 = window.build_api_context(sid4) +tool4 = [m for m in ctx4 if m.get("role") == "tool"] +check("T4.1 孤儿工具也有配对结果", len(tool4) == 1, str(len(tool4))) +check("T4.2 孤儿结果是合成说明(不是空串,避免服务商拒绝)", + tool4 and "未收到" in tool4[0]["content"], tool4[0]["content"] if tool4 else "") +check("T4.3 孤儿工具的 tool_call 同时存在", + any(tc["id"] == "orphan1" for m in ctx4 if m.get("role") == "assistant" + for tc in (m.get("tool_calls") or []))) + +# ====================================================================== +# T5 叶子前进(不再时光倒流) +# ====================================================================== +check("T5.1 会话叶子 = 错误行(叶子前进,不再回退到提问)", + window.db.get_session_leaf(sid2) == last2["id"], + f"leaf={window.db.get_session_leaf(sid2)} last={last2['id']}") +check("T5.2 错误行 parent_id 指向本轮提问", + last2["parent_id"] == uid2, f"{last2['parent_id']} vs {uid2}") +check("T5.3 链上顺序 = [user, assistant(error)]", + [m["role"] for m in chain2] == ["user", "assistant"], + str([m["role"] for m in chain2])) +check("T5.4 下次提问可接着链(叶子非空 → 可继续)", + window.db.get_session_leaf(sid2) is not None) + +# ====================================================================== +# T6 压缩切点交互 +# ====================================================================== +sid6 = window.db.create_session("T6 压缩交互")["id"] +u6 = window.db.add_message(session_id=sid6, role="user", content="老问题", + parent_id=None)["id"] +mk_failed_turn(sid6, body="中途断了", tools=[]) +err6 = window.db.get_message_chain(sid6)[-1] +u6b = window.db.add_message(session_id=sid6, role="user", content="新问题", + parent_id=err6["id"])["id"] +a6 = window.db.add_message(session_id=sid6, role="assistant", content="新回答", + parent_id=u6b)["id"] +window.db.insert_compaction_mark(sid6, "【摘要】老问题与中断", err6["id"], u6b, + json.dumps({"path": "test", "before": 1, "after": 1})) +ctx6 = window.build_api_context(sid6) +flat6 = json.dumps(ctx6, ensure_ascii=False) +check("T6.1 切点之前的错误行 → 不进上下文(已出上下文)", + "中途断了" not in flat6 and "⚠️" not in flat6) +check("T6.2 摘要进上下文 + 切点之后照常", + "【摘要】老问题与中断" in flat6 and "新回答" in flat6) + +# ====================================================================== +# T7 旧库自动迁移(无新列 → 补齐;旧行 stop_reason=NULL) +# ====================================================================== +_OLD = os.path.join(tempfile.gettempdir(), f"haocode_old_schema_{os.getpid()}.db") +if os.path.exists(_OLD): + os.remove(_OLD) +_c = sqlite3.connect(_OLD) +_c.executescript(""" +CREATE TABLE sessions (id TEXT PRIMARY KEY, title TEXT, created_at INTEGER, updated_at INTEGER); +CREATE TABLE messages (id TEXT PRIMARY KEY, session_id TEXT, role TEXT, content TEXT, + reasoning TEXT, is_ignored BOOLEAN, created_at INTEGER, + attachment_metadata TEXT, parent_id TEXT, timeline TEXT, usage TEXT); +""") +_c.execute("INSERT INTO sessions VALUES ('s1','旧会话',1,1)") +_c.execute("INSERT INTO messages (id,session_id,role,content,created_at,parent_id) " + "VALUES ('m1','s1','user','你好',1,NULL)") +_c.commit() +_c.close() +d_old = DBManager(db_path=_OLD) +cols = [r[1] for r in d_old.get_connection().execute("PRAGMA table_info(messages)")] +check("T7.1 旧库自动补上 stop_reason / error_message 列", + "stop_reason" in cols and "error_message" in cols, str(cols)) +row_old = d_old.get_message_chain("s1") +check("T7.2 旧行读出来 stop_reason 为空(行为与升级前一致)", + row_old and not row_old[-1].get("stop_reason"), + str(row_old[-1].get("stop_reason") if row_old else "no row")) +check("T7.3 旧库可正常写入错误行(新列可用)", + d_old.add_message(session_id="s1", role="assistant", content="⚠️ 中断", + parent_id="m1", stop_reason="error", + error_message="boom")["id"] is not None) +check("T7.4 旧库错误行可读回", + d_old.get_message_chain("s1")[-1].get("error_message") == "boom") + +# ====================================================================== +# T8 copy_session 携带新列 +# ====================================================================== +copy8 = window.db.copy_session(sid2) +chain8 = window.db.get_message_chain(copy8["id"]) +last8 = chain8[-1] +check("T8.1 复制后错误行保留 stop_reason/error_message", + last8.get("stop_reason") == "error" and "Connection error" in (last8.get("error_message") or ""), + f"{last8.get('stop_reason')} / {last8.get('error_message')}") +check("T8.2 复制后 timeline 工具条目一致", + len(json.loads(last8["timeline"] or "[]")) == len(json.loads(last2["timeline"] or "[]"))) +check("T8.3 复制后 is_ignored 一致", + int(last8.get("is_ignored") or 0) == int(last2.get("is_ignored") or 0)) +check("T8.4 复制后链条角色一致", + [m["role"] for m in chain8] == [m["role"] for m in chain2]) + +# ====================================================================== +# T9 ★数据安全:追加新列绝不得触发「旧数据链表化重构」 +# _upgrade_schema 里 upgraded=True 会把每个会话的消息按时间拍平成线性链, +# 直接毁掉树状分支(用户的 12 个分支点!)。新列迁移必须走旁路。 +# ====================================================================== +_BR = os.path.join(tempfile.gettempdir(), f"haocode_branch_{os.getpid()}.db") +if os.path.exists(_BR): + os.remove(_BR) +_bc = sqlite3.connect(_BR) +_bc.executescript(""" +CREATE TABLE sessions (id TEXT PRIMARY KEY, title TEXT, created_at INTEGER, updated_at INTEGER, + has_messages BOOLEAN DEFAULT 0, sort_order INTEGER DEFAULT 0, + is_starred BOOLEAN DEFAULT 0, current_leaf_msg_id TEXT, mode TEXT); +CREATE TABLE messages (id TEXT PRIMARY KEY, session_id TEXT, role TEXT, content TEXT, + reasoning TEXT, is_ignored BOOLEAN, created_at INTEGER, + attachment_metadata TEXT, parent_id TEXT, timeline TEXT, usage TEXT); +""") +_bc.execute("INSERT INTO sessions VALUES ('s9','分支会话',1,1,1,0,0,'m5',NULL)") +# 链 u1(1) → a1(2) → u2(3) → {a2(4), a2b(5)} ← u2 下两个孩子 = 分支点 +for _mid, _role, _ct, _par in [("m1", "user", 1, None), ("m2", "assistant", 2, "m1"), + ("m3", "user", 3, "m2"), ("m4", "assistant", 4, "m3"), + ("m5", "assistant", 5, "m3")]: + _bc.execute("INSERT INTO messages (id,session_id,role,content,created_at,parent_id) " + "VALUES (?,?,?,?,?,?)", (_mid, "s9", _role, _mid, _ct, _par)) +_bc.commit() +_bc.close() +d_b = DBManager(db_path=_BR) +_cols_b = [r[1] for r in d_b.get_connection().execute("PRAGMA table_info(messages)")] +check("T9.1 旧库自动追加 stop_reason / error_message 列", + "stop_reason" in _cols_b and "error_message" in _cols_b, str(_cols_b)) +_rows_b = {r["id"]: r for r in d_b.get_connection().execute( + "SELECT id, parent_id FROM messages WHERE session_id='s9'")} +check("T9.2 ★分支结构未被拍平(a2b.parent 仍指向分支点 u2)", + _rows_b["m5"]["parent_id"] == "m3", + f"m5.parent={_rows_b['m5']['parent_id']}(拍平后会变成 m4)") +check("T9.3 叶子节点未被改写", d_b.get_session_leaf("s9") == "m5", + str(d_b.get_session_leaf("s9"))) +check("T9.4 原有行内容未被改动", + all(_rows_b[k]["parent_id"] == v for k, v in + [("m2", "m1"), ("m3", "m2"), ("m4", "m3")]), + str({k: _rows_b[k]["parent_id"] for k in _rows_b})) + +print("\n===== " + ("ALL PASS" if ok else "HAS FAILURES") + " =====", flush=True) +for _p in (_DB_TMP, _CFG_TMP, _OLD, _BR): + try: + if os.path.exists(_p): + os.remove(_p) + except Exception: + pass +sys.exit(0 if ok else 1) diff --git a/tests/test_file_attach.py b/tests/test_file_attach.py new file mode 100644 index 0000000..eb144e7 --- /dev/null +++ b/tests/test_file_attach.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +""" +file_reader 单元测试(标准库 unittest,零额外依赖) +运行:在项目根目录执行 python -m unittest discover tests -v + 或直接 python tests/test_file_attach.py +""" +import os +import sys +import tempfile +import unittest + +# 保证直接运行(python tests/xxx.py)时也能 import 到项目根下的包 +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) + +from ui.views.system_tools.file_reader import BINARY_EXTS, read_text_file # noqa: E402 + + +class ReadTextFileTest(unittest.TestCase): + """read_text_file:编码探测 / 二进制探测 / 大小守卫""" + + def _write(self, data: bytes, suffix: str = ".txt") -> str: + fd, path = tempfile.mkstemp(suffix=suffix) + with os.fdopen(fd, "wb") as f: + f.write(data) + self.addCleanup(os.remove, path) + return path + + def test_utf8_file(self): + path = self._write("你好,世界\nhello".encode("utf-8")) + content, enc, size_kb, lines = read_text_file(path) + self.assertIn("你好,世界", content) + self.assertIn("hello", content) + self.assertEqual(lines, 2) + self.assertIn(enc, ("utf-8-sig", "utf-8")) + self.assertGreater(size_kb, 0) + + def test_utf8_bom_file(self): + path = self._write(b"\xef\xbb\xbf" + "带BOM".encode("utf-8")) + content, enc, _, _ = read_text_file(path) + self.assertEqual(content, "带BOM") # utf-8-sig 会吃掉 BOM + self.assertEqual(enc, "utf-8-sig") + + def test_gbk_file_falls_back_to_gb18030(self): + path = self._write("中文GBK内容".encode("gbk")) + content, enc, _, _ = read_text_file(path) + self.assertEqual(content, "中文GBK内容") + self.assertEqual(enc, "gb18030") + + def test_binary_file_rejected(self): + path = self._write(b"\x00\x01\x02\x03binary-payload") + with self.assertRaises(ValueError): + read_text_file(path) + + def test_oversize_file_rejected(self): + path = self._write(b"a" * 100) + with self.assertRaises(ValueError): + read_text_file(path, max_bytes=10) + + def test_latin1_fallback_never_fails(self): + # 0xFF 既非合法 UTF-8 也非合法 GB18030 引导字节,应由 latin-1 兜底 + path = self._write(b"\xff\xfe\xfd plain text") + content, enc, _, _ = read_text_file(path) + self.assertEqual(enc, "latin-1") + self.assertIn("plain text", content) + + +class BinaryExtBlacklistTest(unittest.TestCase): + """黑名单分类:Word/Excel 等被拒,常见代码/文本文件放行""" + + def test_office_and_binary_blocked(self): + for ext in (".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", + ".zip", ".exe", ".dll", ".mp4", ".ttf", ".db", ".psd"): + self.assertIn(ext, BINARY_EXTS, f"{ext} 应在黑名单中") + + def test_pdf_not_blacklisted(self): + # PDF 改由专用分支(pdf_reader)处理,不再走二进制黑名单 + self.assertNotIn(".pdf", BINARY_EXTS, ".pdf 应由 PDF 专用分支处理,不应在黑名单中") + + def test_text_and_code_allowed(self): + for ext in (".py", ".js", ".ts", ".java", ".c", ".cpp", ".go", ".rs", + ".md", ".txt", ".json", ".yaml", ".html", ".css", ".sql", + ".sh", ".csv", ".log", ".ipynb", ""): + self.assertNotIn(ext, BINARY_EXTS, f"{ext} 不应在黑名单中") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_global_hotkey_platforms.py b/tests/test_global_hotkey_platforms.py new file mode 100644 index 0000000..e7646c0 --- /dev/null +++ b/tests/test_global_hotkey_platforms.py @@ -0,0 +1,279 @@ +# -*- coding: utf-8 -*- +""" +P1-04 全局热键平台矩阵单测(适配器替身,不依赖真实 X11 显示 / 不新增依赖) + +覆盖: + H1 session_kind 矩阵(win32 / x11 / wayland / offscreen-unknown,mock 环境变量 + sys.platform) + H2 hotkey_plan 路由(win32→RegisterHotKey 线程;x11→XGrabKey 线程;wayland/offscreen→None+明确日志) + H3 X11HotkeyThread 成功路径(fake libX11:XGrabKey 参数正确、命中 keycode 发射 triggered、 + stop 后 XUngrabKey/XCloseDisplay 释放) + H4 X11 注册失败(XGrabKey=0 键被占用 / 无显示 / 不支持的组合 → _registered=False,线程安静退出) + H5 Windows GlobalHotkeyThread 行为保持(非 Windows run() 静默就绪退出;Windows 常量完整) + +运行: PYTHONIOENCODING=utf-8 python tests/test_global_hotkey_platforms.py +""" +import contextlib +import io +import os +import socket +import sys +import threading +import time + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +from PyQt6.QtWidgets import QApplication # noqa: E402 + +from ui.views.system_tools import desktop_session as ds # noqa: E402 +from ui.views.system_tools import x11_hotkey as xh # noqa: E402 +from ui.views.system_tools import global_hotkey as gh # noqa: E402 + +RESULTS = [] +APP = QApplication.instance() or QApplication(sys.argv) + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +def with_env(patch: dict, fn): + saved = {k: os.environ.get(k) for k in patch} + for k, v in patch.items(): + if v is None: + os.environ.pop(k, None) + else: + os.environ[k] = v + try: + return fn() + finally: + for k, v in saved.items(): + if v is None: + os.environ.pop(k, None) + else: + os.environ[k] = v + + +# ====================================================================== +# H1. session_kind 矩阵 +# ====================================================================== +_orig_platform = ds.sys.platform + +def _set_platform(p): + ds.sys = type("FakeSys", (), {"platform": p})() + + +try: + _set_platform("win32") + check("H1.1 win32", ds.session_kind() == "win32") + _set_platform("linux") + check("H1.2 X11(DISPLAY 有、无 WAYLAND_DISPLAY)", + with_env({"DISPLAY": ":0", "WAYLAND_DISPLAY": None, "XDG_SESSION_TYPE": None, + "QT_QPA_PLATFORM": "xcb"}, lambda: ds.session_kind()) == "x11") + check("H1.3 Wayland(WAYLAND_DISPLAY 有)", + with_env({"WAYLAND_DISPLAY": "wayland-0", "DISPLAY": ":0", "XDG_SESSION_TYPE": None, + "QT_QPA_PLATFORM": "wayland"}, lambda: ds.session_kind()) == "wayland") + check("H1.4 QT_QPA_PLATFORM=wayland(无 WAYLAND_DISPLAY)", + with_env({"WAYLAND_DISPLAY": None, "DISPLAY": None, "XDG_SESSION_TYPE": None, + "QT_QPA_PLATFORM": "wayland"}, lambda: ds.session_kind()) == "wayland") + check("H1.5 offscreen → unknown(即使有 DISPLAY)", + with_env({"DISPLAY": ":0", "WAYLAND_DISPLAY": None, "XDG_SESSION_TYPE": None, + "QT_QPA_PLATFORM": "offscreen"}, lambda: ds.session_kind()) == "unknown") + check("H1.6 无显示无 WAYLAND → unknown", + with_env({"DISPLAY": None, "WAYLAND_DISPLAY": None, "XDG_SESSION_TYPE": None, + "QT_QPA_PLATFORM": None}, lambda: ds.session_kind()) == "unknown") + check("H1.7 XDG_SESSION_TYPE=wayland(无 WAYLAND_DISPLAY/QT 平台)", + with_env({"DISPLAY": None, "WAYLAND_DISPLAY": None, "XDG_SESSION_TYPE": "wayland", + "QT_QPA_PLATFORM": None}, lambda: ds.session_kind()) == "wayland") + check("H1.8 XDG_SESSION_TYPE=x11(无 DISPLAY)", + with_env({"DISPLAY": None, "WAYLAND_DISPLAY": None, "XDG_SESSION_TYPE": "x11", + "QT_QPA_PLATFORM": None}, lambda: ds.session_kind()) == "x11") + check("H1.9 矛盾时 WAYLAND_DISPLAY 优先于 XDG_SESSION_TYPE=x11", + with_env({"DISPLAY": ":0", "WAYLAND_DISPLAY": "wayland-0", "XDG_SESSION_TYPE": "x11", + "QT_QPA_PLATFORM": None}, lambda: ds.session_kind()) == "wayland") +finally: + ds.sys = sys # 还原 + +# ====================================================================== +# H2. hotkey_plan 路由 +# ====================================================================== +try: + _set_platform("win32") + factory, msg = ds.hotkey_plan("win32") + check("H2.1 win32 → GlobalHotkeyThread 工厂 + 说明", + factory is gh.GlobalHotkeyThread and "Windows" in msg, repr((factory, msg))) +finally: + ds.sys = sys + +factory, msg = ds.hotkey_plan("x11") +check("H2.2 x11 → X11HotkeyThread 工厂 + 说明", + factory is xh.X11HotkeyThread and "X11" in msg, repr((factory, msg))) + +factory, msg = ds.hotkey_plan("wayland") +check("H2.3 wayland → None + 明确不可用说明(不绕过 compositor)", + factory is None and "Wayland" in msg and "Alt+S" in msg, repr((factory, msg))) + +factory, msg = ds.hotkey_plan("unknown") +check("H2.4 unknown → None + 明确不可用说明", + factory is None and "不可用" in msg, repr((factory, msg))) + +# ====================================================================== +# H3–H4. X11HotkeyThread(fake libX11) +# ====================================================================== + +class FakeX11: + def __init__(self, grab_rc=1, open_rc=0xAB, keycode=39, unsupported_vk=False): + self.grab_rc = grab_rc + self.open_rc = open_rc + self.keycode = keycode + self.unsupported_vk = unsupported_vk + self.grab_calls = [] + self.ungrab_calls = [] + self.close_calls = 0 + self.select_calls = 0 + self.opened = False + self.pending_left = 1 + # socketpair:跨平台可被 select() 监听(Windows 上 os.pipe 的 fd 不行) + self._a, self._b = socket.socketpair() + self._b.send(b"\x01") # 让 a 有可读数据 → select 首次就绪 + self._event = xh.XEvent() + self._event.type = xh.KeyPress + self._event.keycode = self.keycode + + # -- libX11 API(鸭子类型替身) -- + def XOpenDisplay(self, name): + self.opened = True + return self.open_rc + def XCloseDisplay(self, d): + self.close_calls += 1 + def XConnectionNumber(self, d): + return self._a.fileno() + def XDefaultRootWindow(self, d): + return 123 + def XKeysymToKeycode(self, d, keysym): + if self.unsupported_vk: + return 0 + return self.keycode + def XSelectInput(self, d, w, mask): + self.select_calls += 1 + def XGrabKey(self, d, kc, mod, w, owner): + self.grab_calls.append((kc, mod, w, owner)) + return self.grab_rc + def XUngrabKey(self, d, kc, mod, w): + self.ungrab_calls.append((kc, mod, w)) + def XPending(self, d): + if self.pending_left > 0: + self.pending_left -= 1 + return 1 + return 0 + def XNextEvent(self, d, evp): + # 生产代码传入 ctypes.byref(ev)(CArgObject);真实 CDLL 自行解引用, + # 替身可调用对象则通过 ._obj 拿回原始 struct + import ctypes as _ct + target = getattr(evp, "_obj", evp) + _ct.memmove(_ct.byref(target), _ct.byref(self._event), _ct.sizeof(xh.XEvent)) + self._event.type = 0 # 之后无事件 + + def close(self): + for s in (self._a, self._b): + try: + s.close() + except Exception: + pass + + +def run_hotkey_case(fake, **kw): + """启动 X11HotkeyThread,等待 triggered 或退出,回收。返回 (got_signal, thread)""" + orig_open = xh._open_x11 + xh._open_x11 = lambda: (fake, fake.open_rc) + try: + t = xh.X11HotkeyThread(**kw) + got = threading.Event() + t.triggered.connect(lambda: got.set()) + t.start() + t.wait_ready(3.0) + deadline = time.time() + 6.0 + while not got.is_set() and time.time() < deadline: + APP.processEvents() + time.sleep(0.02) + t.stop() + t.wait(3000) + return got.is_set(), t + finally: + xh._open_x11 = orig_open + fake.close() + + +# H3.1 成功路径:grab 参数正确 + 命中发射 + stop 释放 +fake = FakeX11() +got, t = run_hotkey_case(fake) +check("H3.1 命中 Alt+S → triggered 发射", got) +check("H3.2 XGrabKey 参数(keycode=39, Mod1Mask=1, root=123, owner_events=1)", + fake.grab_calls == [(39, xh.Mod1Mask, 123, 1)], repr(fake.grab_calls)) +check("H3.3 stop 后 XUngrabKey + XCloseDisplay 释放", + len(fake.ungrab_calls) == 1 and fake.close_calls == 1, + repr((fake.ungrab_calls, fake.close_calls))) +check("H3.4 注册成功标志 _registered", t._registered is False) # cleanup 后复位为 False + +# H4.1 键被占用(XGrabKey → 0) +fake = FakeX11(grab_rc=0) +buf = io.StringIO() +with contextlib.redirect_stdout(buf): + got, t = run_hotkey_case(fake) +check("H4.1 注册失败 → 无信号、_registered=False、明确日志", + not got and t._registered is False and ("占用" in buf.getvalue() or "失败" in buf.getvalue()), + buf.getvalue()[-200:]) + +# H4.2 无显示(XOpenDisplay → None) +fake = FakeX11(open_rc=None) +buf = io.StringIO() +with contextlib.redirect_stdout(buf): + got, t = run_hotkey_case(fake) +check("H4.2 无 X11 显示 → 安静退出 + 明确日志", + not got and t._registered is False and "XOpenDisplay" in buf.getvalue(), + buf.getvalue()[-200:]) + +# H4.3 不支持的组合(vk 不在窄映射表) +fake = FakeX11() +orig_open = xh._open_x11 +t_probe = xh.X11HotkeyThread(vk=0x41) +xh._open_x11 = lambda: (fake, 0xAB) +try: + t_probe.start() + t_probe.wait_ready(3.0) + deadline = time.time() + 5.0 + while t_probe.isRunning() and time.time() < deadline: + time.sleep(0.02) + t_probe.stop() + t_probe.wait(2000) +finally: + xh._open_x11 = orig_open + fake.close() +check("H4.3 不支持的组合 → 不打开显示即退出", + t_probe._registered is False and not fake.opened, repr(t_probe._registered)) + +# ====================================================================== +# H5. Windows 路径保持 +# ====================================================================== +check("H5.1 GlobalHotkeyThread 常量完整(MOD_ALT/VK_S/WM_HOTKEY)", + gh.MOD_ALT == 0x0001 and gh.VK_S == 0x53 and gh.WM_HOTKEY == 0x0312) + +t_win = gh.GlobalHotkeyThread() +t_win.start() +t_win._ready.wait(3.0) +if gh._is_windows: + # 本机 Windows:真实 RegisterHotKey + GetMessage 循环 = 行为保持的存活检查(随后立即释放 Alt+S) + check("H5.2 Windows:RegisterHotKey 线程运行中(行为保持)", t_win.isRunning()) + t_win.stop() + t_win.wait(3000) + check("H5.3 Windows:stop() 干净退出(释放热键)", not t_win.isRunning()) +else: + t_win.wait(3000) + check("H5.2 非 Windows:run() 静默就绪退出(不注册、不崩)", + not t_win.isRunning() and t_win._ready.is_set(), + f"running={t_win.isRunning()}") + +print(f"\n===== {sum(1 for _, ok in RESULTS if ok)}/{len(RESULTS)} passed =====", flush=True) +sys.exit(0 if all(ok for _, ok in RESULTS) else 1) diff --git a/tests/test_main_window_event_filter.py b/tests/test_main_window_event_filter.py new file mode 100644 index 0000000..8e70948 --- /dev/null +++ b/tests/test_main_window_event_filter.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +"""tests/test_main_window_event_filter.py —— P0-02 事件策略回归 + +运行: python tests/test_main_window_event_filter.py +(仓库惯例:无 pytest 依赖,独立可跑;GUI 走 offscreen) + +完成证据(REPAIR_BACKLOG.md P0-02): + 1. AST 静态断言:MainWindow 只有一个 eventFilter; + 2. 四种键盘状态:Enter 可发送 / 按钮禁用时 Enter 不发送 / 流式生成时 Enter 被拦截 / + Shift+Enter 放行换行; + 3. 一次按键对应最多一次 send_message 调用(计数 wrapper 验证); + 4. 其他键与事件继续交给父类(按 a 正常插入字符、不触发发送)。 +遵守 P0-01:临时配置 + 临时数据库,在 import MainWindow 之前完成。 +""" +import ast +import os +import sys +import time + +_TESTS_DIR = os.path.dirname(os.path.abspath(__file__)) +_ROOT = os.path.dirname(_TESTS_DIR) +sys.path.insert(0, _ROOT) + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ.setdefault("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-gpu") +os.environ.setdefault("PYTHONIOENCODING", "utf-8") + +from tests._test_env import isolate # noqa: E402 + +_TMP = isolate("winfilter") # 必须在 import MainWindow 之前 + +ok = True + + +def check(name, cond, extra=""): + global ok + print((" PASS " if cond else " FAIL ") + name + + ("" if cond else f" {extra}"), flush=True) + if not cond: + ok = False + + +# ====================================================================== +# 1) AST 静态断言:MainWindow 只有一个 eventFilter +# ====================================================================== +with open(os.path.join(_ROOT, "ui", "views", "main_window.py"), + encoding="utf-8") as f: + _tree = ast.parse(f.read()) +_mw = [n for n in _tree.body + if isinstance(n, ast.ClassDef) and n.name == "MainWindow"][0] +_ef_lines = [n.lineno for n in _mw.body + if isinstance(n, ast.FunctionDef) and n.name == "eventFilter"] +check("AST:MainWindow 只有一个 eventFilter", len(_ef_lines) == 1, + f"行号: {_ef_lines}") + +# ====================================================================== +# 2) 四种键盘状态(真实事件派发:QApplication.sendEvent → 已安装过滤器 → 控件本身) +# ====================================================================== +from PyQt6 import QtGui, QtCore # noqa: E402 +from PyQt6.QtWidgets import QApplication # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 +import core.llm_engine as le # noqa: E402 + +app = QApplication.instance() or QApplication(sys.argv) +win = MainWindow() + +if not win.current_session_id: + win.on_new_chat_clicked() +sid = win.current_session_id +check("前置:存在当前会话", bool(sid)) + +# 计数 wrapper:包住真实 send_message(记录调用并透传执行) +calls = [] +_orig_send = win.send_message + + +def _spy_send(*a, **k): + calls.append(k) + return _orig_send(*a, **k) + + +win.send_message = _spy_send + + +def _press(key, shift=False, text=""): + """通过 Qt 事件系统向输入框派发一次真实的 KeyPress。""" + mods = (QtCore.Qt.KeyboardModifier.ShiftModifier if shift + else QtCore.Qt.KeyboardModifier.NoModifier) + ev = QtGui.QKeyEvent(QtCore.QEvent.Type.KeyPress, key, mods, text) + QApplication.sendEvent(win.text_input, ev) + app.processEvents() + + +def _clear_stream(): + """确保当前会话没有残留流(等待 worker 错误自清理,兜底手工清理)。""" + for _ in range(100): + if sid not in win._active_streams: + return + app.processEvents() + time.sleep(0.05) + st = win._active_streams.pop(sid, None) + if st and st.get("worker") is not None: + try: + st["worker"].abort() + st["worker"].wait(2000) + except Exception: + pass + win.set_send_button_state(False) + + +# ---- A) Enter 可发送(空闲 + 按钮可用 + 有文本) ---- +# 网络层桩:立即抛 ConnectionError(等价于不可达端口),走真实错误清理路径 +_REAL_OPENAI_STREAM = le.openai_stream + + +def _fake_openai_stream(*a, **k): + raise ConnectionError("test stub: no network") + yield # 保持生成器函数形态 + + +le.openai_stream = _fake_openai_stream +win.btn_send.setEnabled(True) +win.text_input.setPlainText("p002 enter send") +calls.clear() +_press(QtCore.Qt.Key.Key_Return) +check("A1 一次 Enter 至多一次 send_message 调用", len(calls) == 1, + f"调用次数: {len(calls)}") +check("A2 Enter 走 from_enter 规则", calls and calls[0].get("from_enter") is True, + f"kwargs: {calls}") +check("A3 发送已同步执行(流已注册)", sid in win._active_streams) +check("A4 输入框被清空", win.text_input.toPlainText() == "") +_clear_stream() +check("A5 流清理完毕(错误路径自恢复)", sid not in win._active_streams) +le.openai_stream = _REAL_OPENAI_STREAM + +# ---- B) 发送按钮禁用时 Enter 不发送 ---- +_clear_stream() +win.btn_send.setEnabled(False) +win.text_input.setPlainText("disabled should not send") +calls.clear() +_press(QtCore.Qt.Key.Key_Return) +check("B1 禁用时仍至多一次调用(规则在 send_message 内单一实现)", + len(calls) <= 1, f"调用次数: {len(calls)}") +check("B2 禁用时未发送(无流)", sid not in win._active_streams) +check("B3 禁用时输入内容保留", win.text_input.toPlainText() == "disabled should not send") +win.btn_send.setEnabled(True) + +# ---- C) 流式生成时 Enter 被拦截(不发送、不触发中断) ---- +win.set_send_button_state(True) # 与真实流式状态一致(停止图标,按钮仍可用) +_fake_stream = {"msg_id": "fake-ai", "content": "", "worker": None, "timeline": [], + "parent_id": None, "branch_info": {"current": 1, "total": 1}} +win._active_streams[sid] = _fake_stream +win.text_input.setPlainText("typing while generating") +calls.clear() +_press(QtCore.Qt.Key.Key_Return) +check("C1 流式时未产生真实发送(流仍是注入的假流)", + win._active_streams.get(sid) is _fake_stream) +check("C2 流式时未触发中断(假流字段未被改动)", + _fake_stream["msg_id"] == "fake-ai" and _fake_stream["worker"] is None) +check("C3 流式时输入内容保留", win.text_input.toPlainText() == "typing while generating") +del win._active_streams[sid] +win.set_send_button_state(False) + +# ---- D) Shift+Enter 放行换行 ---- +win.text_input.setPlainText("abc") +_cur = win.text_input.textCursor() +_cur.movePosition(QtGui.QTextCursor.MoveOperation.End) +win.text_input.setTextCursor(_cur) +calls.clear() +_press(QtCore.Qt.Key.Key_Return, shift=True) +check("D1 Shift+Enter 未调用 send_message", len(calls) == 0, + f"调用次数: {len(calls)}") +check("D2 Shift+Enter 插入换行(事件放行到输入框)", + win.text_input.toPlainText() == "abc\n", + repr(win.text_input.toPlainText())) +check("D3 Shift+Enter 未发送(无流)", sid not in win._active_streams) + +# ---- E) 其他键/事件继续交给父类 ---- +win.text_input.setPlainText("") +calls.clear() +_press(QtCore.Qt.Key.Key_A, text="a") +check("E1 普通字符键正常插入", win.text_input.toPlainText() == "a", + repr(win.text_input.toPlainText())) +check("E2 普通字符键不触发发送", len(calls) == 0) + +# ---- 收尾 ---- +try: + win.close() +except Exception: + pass +app.quit() + +print("\n===== " + ("ALL PASS" if ok else "HAS FAILURES") + " =====", flush=True) +os._exit(0 if ok else 1) # 避免 QtWebEngine offscreen 静态析构段错误(不影响结果) diff --git a/tests/test_math_extract.js b/tests/test_math_extract.js new file mode 100644 index 0000000..aa1ca46 --- /dev/null +++ b/tests/test_math_extract.js @@ -0,0 +1,123 @@ +// -*- coding: utf-8 -*- +// 公式管线单测:从 app.js 中切出【真实】公式段 + computeSafeLen,在沙箱里执行 +// 运行: node tests/test_math_extract.js +'use strict'; +const fs = require('fs'); +const path = require('path'); +const vm = require('vm'); + +const src = fs.readFileSync(path.join(__dirname, '..', 'ui', 'web', 'app.js'), 'utf8'); + +// ---- 切出公式段(公式渲染 section 起点 → 全局事件委托 section 之前)---- +const secStart = src.indexOf('// ==================== 🌟 公式渲染'); +const secEnd = src.indexOf('// ==================== 全局事件委托'); +if (secStart < 0 || secEnd < 0 || secEnd <= secStart) { + console.error('FAIL 无法切出公式段 (start=%d end=%d)', secStart, secEnd); + process.exit(1); +} +let mathCode = src.slice(secStart, secEnd); + +// ---- 切出 computeSafeLen 函数(行首锚定,避开文档注释里的同名行)---- +var _m = src.match(/^function computeSafeLen\(s, stableLen\) \{$/m); +if (!_m) { console.error('FAIL 无法切出 computeSafeLen'); process.exit(1); } +var csStart = _m.index; // 注意:indexOf 会命中文档注释里的同名行,必须用正则的 index +const csEnd = src.indexOf('// 初始化/获取某个容器 div 的增量渲染状态'); +if (csStart < 0 || csEnd < 0) { console.error('FAIL 无法切出 computeSafeLen'); process.exit(1); } +mathCode += '\n' + src.slice(csStart, csEnd); + +// ---- 沙箱 ---- +const sandbox = { + console, + escapeHtml: (t) => String(t).replace(/&/g, '&').replace(//g, '>'), + katex: { renderToString: (tex, opts) => '' + tex + '' }, + marked: { parse: (t) => '' + String(t), setOptions() {}, bind: null }, +}; +sandbox.marked.parse.bind = function () { return sandbox.marked.parse; }; +vm.createContext(sandbox); +vm.runInContext(mathCode, sandbox, { filename: 'app.js-math-section' }); + +const extractMath = sandbox.extractMath; +const restoreMath = sandbox.restoreMath; +const findUnclosedMathFrom = sandbox.findUnclosedMathFrom; +const computeSafeLen = sandbox.computeSafeLen; + +let pass = 0, fail = 0; +function check(name, cond, extra) { + if (cond) { pass++; console.log('PASS ' + name); } + else { fail++; console.log('FAIL ' + name + (extra !== undefined ? ' | ' + extra : '')); } +} +function itemsOf(text) { return extractMath(text).items; } + +// ============ 1) 用户原始样本(部分供应商单括号格式)============ +const userSample = '上面是推导结果:\n[\nP_4=\\operatorname{BRF}(M_4,M_5)\n]\n\n[\nP_3=\\operatorname{BRF}(S_3,P_4)\n]\n\n其中:\n[\n\\operatorname{BRF}(L,H)\nL+\n\\Gamma(L,\\operatorname{Up}(H))\n\\odot\n\\Phi(\\operatorname{Up}(H))\n]\n'; +{ + const ex = extractMath(userSample); + check('用户样本: 抽出 3 个块公式', ex.items.length === 3, 'got=' + ex.items.length); + check('用户样本: 全是 display', ex.items.every(i => i.display)); + check('用户样本: 占位符已就位', /@@K[BI]MA/.test(ex.md)); + check('用户样本: 无残留括号([ ] 已吞)', !/[\[\]]/.test(ex.md), JSON.stringify(ex.md)); + const html = restoreMath(ex.md, ex.items); + check('用户样本: 恢复出 3 个 KATEX 块', (html.match(//g) || []).length === 3); + check('用户样本: tex 内容正确', ex.items[0].tex.includes('P_4=\\operatorname{BRF}(M_4,M_5)')); +} + +// ============ 2) 标准定界符 ============ +check('$$ 块', itemsOf('a $$x^2+y^2$$ b').length === 1); +check('$$ 块 display', itemsOf('$$x$$')[0].display === true); +check('\\[ \\] 块', itemsOf('\\[E=mc^2\\]').length === 1); +check('行内 $x^2$', itemsOf('能量 $E=mc^2$ 著名').length === 1); +check('行内非 display', itemsOf('$x^2$')[0].display === false); +check('\\( \\) 行内', itemsOf('\\(a+b\\)').length === 1); +check('多公式同段', itemsOf('$a^2$ 和 $$b^2$$ 及 $c$').length === 3); + +// ============ 3) 防误伤 ============ +check('编号 [1] 不抽', itemsOf('见[1]参考').length === 0); +check('链接 [text](url) 不抽', itemsOf('[text](http://a.b) 和 [\nfoo\n](x)').length === 0); +check('列表 [a, b] 不抽', itemsOf('[a, b] 数组').length === 0); +check('货币 $1,000 and $2,000 不抽', itemsOf('价格 $1,000 and $2,000').length === 0); +check('单词 $a$ 按变量公式(有意取舍)', itemsOf('花 $a$ 朵').length === 1); +check('多词 $a b$ 不抽', itemsOf('这 $a b$ 个').length === 0); +check('未闭合 $x 不抽', itemsOf('价格 $x 未闭合').length === 0); +check('代码块内 $y$ [0] 不抽', itemsOf('```\nx = $y$\narr[0]\n```').length === 0); +check('行内代码 `$z$` 不抽', itemsOf('使用 `$z$` 变量').length === 0); +check('未闭合围栏内不抽', itemsOf('```\n$w$ 流式中').length === 0); + +// ============ 4) 混合定位 ============ +{ + const ex = extractMath('前文\n\n$$\na=b\n$$\n\n后文 $c$ 尾'); + check('混合: 2 公式', ex.items.length === 2); + check('混合: 占位符顺序', ex.md.indexOf('@@KBMA0@@') < ex.md.indexOf('@@KMIA1@@')); +} + +// ============ 5) findUnclosedMathFrom ============ +check('无公式 → 0', findUnclosedMathFrom('hello\nworld\n') === 0); +check('未闭合 $$ → 位置', findUnclosedMathFrom('a\n$$x+y\n') === 2); +check('闭合 $$ → 0', findUnclosedMathFrom('a\n$$x+y\n$$\n') === 0); +check('未闭合 [ 行 → 位置', findUnclosedMathFrom('a\n[\nx=1\n') === 2); +check('闭合 [..] → 0', findUnclosedMathFrom('a\n[\nx=1\n]\n') === 0); +check('链接 [t](u) 不算开 → 0', findUnclosedMathFrom('a\n[t](u)\n') === 0); +check('行内未闭合 $ → 位置', findUnclosedMathFrom('cost $5 plus') === 5); +check('代码围栏内忽略', findUnclosedMathFrom('```\n$$x\n```\n') === 0); + +// ============ 6) computeSafeLen 公式感知回退 ============ +{ + // “para1\n\n” = 7 字符(5 + 两个换行)。未闭合 [ 块在边界之后 → 稳定区止于 7 + const s1 = 'para1\n\n[\nx=1\n'; + check('流式: 未闭合 [ 前缀止于空行', computeSafeLen(s1, 0) === 7, 'got=' + computeSafeLen(s1, 0)); + check('流式: 增量无进展返回 0', computeSafeLen(s1, 7) === 0); + // 闭合后 → 整个块可固化 + const s2 = 'para1\n\n[\nx=1\n]\n\n'; + check('流式: 闭合后可固化全部', computeSafeLen(s2, 0) === s2.length, 'got=' + computeSafeLen(s2, 0)); + // 关键回退:块边界(空行)在 未闭合 $$ 之后 → 必须回退到 $$ 起点 + const s3 = 'a b\n\n$$x +\ny z\n\n'; + check('流式: 未闭合 $$ 触发回退到起点', computeSafeLen(s3, 0) === 5, 'got=' + computeSafeLen(s3, 0)); + // 闭合 $$ 后不再回退 + const s3b = 'a b\n\n$$x +\ny z$$\n\n'; + check('流式: 闭合 $$ 可固化全部', computeSafeLen(s3b, 0) === s3b.length, 'got=' + computeSafeLen(s3b, 0)); + // 链接不触发回退(candidate 到链接后的空行 15;若误判未闭合会回退到 7) + const s4 = 'para1\n\n[t](u)\n\ndone\n'; + check('流式: 链接不触发回退', computeSafeLen(s4, 0) === 15, 'got=' + computeSafeLen(s4, 0)); +} + +console.log('\n===== ' + pass + ' passed, ' + fail + ' failed ====='); +process.exit(fail ? 1 : 0); diff --git a/tests/test_pdf_reader.py b/tests/test_pdf_reader.py new file mode 100644 index 0000000..425935c --- /dev/null +++ b/tests/test_pdf_reader.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +"""tools/builtin_tools/pdf_reader.py 的单元测试。 + +用 PyMuPDF 现场生成含文本与内嵌图片的测试 PDF,验证文本结构化提取、 +图片提取落地,以及异常分支(文件不存在 / 超过大小上限)。 + +需在装有 PyMuPDF 的 haocode 环境运行:: + + python -m unittest discover tests +""" +import os +import sys +import tempfile +import unittest + +# 让 tests 目录能 import 到项目根目录下的 tools 包 +ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +if ROOT not in sys.path: + sys.path.insert(0, ROOT) + +try: + import pymupdf +except ImportError: # 兼容旧版导入名 + import fitz as pymupdf # type: ignore + +from tools.builtin_tools.pdf_reader import ( + extract_pdf_text, + extract_pdf_images, +) + + +def _make_png_bytes() -> bytes: + """生成一张 8x8 红色小图的 PNG 字节流。""" + pix = pymupdf.Pixmap(pymupdf.csRGB, pymupdf.IRect(0, 0, 8, 8), 0) + pix.set_rect(pix.irect, (255, 0, 0)) + data = pix.tobytes("png") + pix = None + return data + + +def _build_sample_pdf(path: str) -> None: + """造一个 2 页 PDF:第 1 页含文本 + 图片,第 2 页仅文本。""" + doc = pymupdf.open() + p1 = doc.new_page() + p1.insert_text((72, 72), "Hello PDF page one") + p1.insert_image(pymupdf.Rect(72, 100, 172, 200), stream=_make_png_bytes()) + p2 = doc.new_page() + p2.insert_text((72, 72), "Second page text here") + doc.save(path) + doc.close() + + +class PdfReaderTest(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.dir = self.tmp.name + self.pdf = os.path.join(self.dir, "sample.pdf") + _build_sample_pdf(self.pdf) + + def test_extract_text_structure(self): + text, pages = extract_pdf_text(self.pdf) + self.assertEqual(pages, 2) + self.assertIn("[第 1 页]", text) + self.assertIn("[第 2 页]", text) + self.assertIn("Hello PDF page one", text) + self.assertIn("Second page text here", text) + + def test_extract_images(self): + out_dir = os.path.join(self.dir, "imgs") + imgs = extract_pdf_images(self.pdf, out_dir) + self.assertGreaterEqual(len(imgs), 1) + im = imgs[0] + for key in ("page", "index", "abs_path", "mime", "size_kb", "width", "height"): + self.assertIn(key, im) + self.assertEqual(im["page"], 1) + self.assertEqual(im["mime"], "image/png") + self.assertTrue(os.path.isfile(im["abs_path"])) + self.assertGreater(os.path.getsize(im["abs_path"]), 0) + + def test_missing_file(self): + with self.assertRaises(ValueError): + extract_pdf_text(os.path.join(self.dir, "nope.pdf")) + + def test_oversize(self): + # 用一个极小的上限触发超大分支 + with self.assertRaises(ValueError): + extract_pdf_text(self.pdf, max_bytes=10) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_render_window.js b/tests/test_render_window.js new file mode 100644 index 0000000..1305a4a --- /dev/null +++ b/tests/test_render_window.js @@ -0,0 +1,347 @@ +// -*- coding: utf-8 -*- +// P1-01 渲染窗口状态机单测(DOM 无关,直接加载 ui/web/render_window.js,无 JSDOM/npm) +// 运行: node tests/test_render_window.js +'use strict'; +const path = require('path'); +const RW = require(path.join(__dirname, '..', 'ui', 'web', 'render_window.js')); + +let pass = 0, fail = 0; +function check(name, cond, extra) { + if (cond) { pass++; console.log('PASS ' + name); } + else { fail++; console.log('FAIL ' + name + (extra !== undefined ? ' | ' + extra : '')); } +} + +// ---------- 夹具 ---------- +function makeChain(n) { + var out = []; + for (var i = 0; i < n; i++) { + out.push({ id: 'm' + i, role: i % 2 === 0 ? 'user' : 'assistant', + content: 'msg ' + i, created_at: 1000 + i }); + } + return out; +} +// 模拟 Python 页载荷:按 (方向 + 边界消息 ID) 返回 [{id, chainIndex}] + 链长 +function pageFor(chain, st, req) { + var bi = chain.findIndex(function (d) { return d.id === req.boundaryId; }); + if (bi < 0) return null; + var start, items; + if (req.direction === 'older') { + start = Math.max(0, bi - st.size); + items = chain.slice(start, bi); + } else { + start = bi + 1; + items = chain.slice(bi + 1, bi + 1 + st.size); + } + return { + sessionId: st.sessionId, generation: st.generation, + boundaryId: req.boundaryId, direction: req.direction, + chainLen: chain.length, + items: items.map(function (d, k) { return { id: d.id, chainIndex: start + k }; }) + }; +} +function initChain(st, chain) { + var n = Math.min(st.size, chain.length); + var items = chain.slice(chain.length - n); + return RW.initFullChain(st, { + sessionId: 'sess-1', generation: 1, + chainLen: chain.length, + items: items.map(function (d, k) { return { id: d.id, chainIndex: chain.length - n + k }; }) + }); +} +function idsOf(st) { return st.order.slice(); } +function chainIds(chain) { return chain.map(function (d) { return d.id; }); } + +// ============ 1) 配置规范化 ============ +{ + var c; + c = RW.normalizeConfig({}); + check('size 缺失 → 40 / mode 缺失 → auto', c.size === 40 && c.mode === 'auto'); + c = RW.normalizeConfig(undefined); + check('配置 undefined → {auto,40}', c.size === 40 && c.mode === 'auto'); + c = RW.normalizeConfig({ render_window_size: true }); + check('size=true(布尔)→ 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: false }); + check('size=false(布尔)→ 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: '40' }); + check('size="40"(字符串)→ 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: 0 }); + check('size=0 → 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: -5 }); + check('size=-5 → 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: 9 }); + check('size=9(下越界)→ 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: 201 }); + check('size=201(上越界)→ 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: 40.5 }); + check('size=40.5(小数)→ 40', c.size === 40); + c = RW.normalizeConfig({ render_window_size: 10 }); + check('size=10 保留', c.size === 10); + c = RW.normalizeConfig({ render_window_size: 200 }); + check('size=200 保留', c.size === 200); + c = RW.normalizeConfig({ render_window_mode: 'manual' }); + check('mode=manual 保留', c.mode === 'manual'); + c = RW.normalizeConfig({ render_window_mode: 'AUTO' }); + check('mode=AUTO(大小写不符)→ auto', c.mode === 'auto'); + c = RW.normalizeConfig({ render_window_mode: 1 }); + check('mode=1 → auto', c.mode === 'auto'); + c = RW.normalizeConfig({ render_window_mode: null, render_window_size: 10 }); + check('mode=null + size=10 → {auto,10}', c.mode === 'auto' && c.size === 10); +} + +// ============ 2) auto/manual × 10/40/200 参数化初始窗口 ============ +[10, 40, 200].forEach(function (size) { + ['auto', 'manual'].forEach(function (mode) { + var st = RW.create({ render_window_mode: mode, render_window_size: size }); + var chain = makeChain(400); + initChain(st, chain); + var tail = chainIds(chain).slice(400 - size); + check('初始窗口 [' + mode + '/' + size + '] 长度=size', st.order.length === size); + check('初始窗口 [' + mode + '/' + size + '] = 最新 size 条', + JSON.stringify(idsOf(st)) === JSON.stringify(tail)); + check('初始窗口 [' + mode + '/' + size + '] hasMoreOlder', st.hasMoreOlder === true); + check('初始窗口 [' + mode + '/' + size + '] hiddenOlder=' + (400 - size), + st.hiddenOlder === 400 - size); + check('初始窗口 [' + mode + '/' + size + '] hiddenNewer=0', st.hiddenNewer === 0); + RW.clear(st); + check('clear 后模式/大小保持 [' + mode + '/' + size + ']', + st.mode === mode && st.size === size); + check('clear 后窗口/缓存/计数清空', st.order.length === 0 && + Object.keys(st.indexById).length === 0 && + st.hiddenOlder === 0 && st.hiddenNewer === 0); + }); +}); + +// ============ 3) 双向连续换页(size=10,400 条链)============ +{ + var st = RW.create({ render_window_size: 10 }); + var chain = makeChain(400); + initChain(st, chain); + + // ---- 连续向上,直到头部边界 ---- + var pages = 0; + while (RW.canRequest(st, 'older')) { + var req = RW.beginRequest(st, 'older'); + check('向上换页边界=窗口最旧条 p' + pages, + req && req.boundaryId === st.order[0]); + var res = RW.applyPage(st, req, pageFor(chain, st, req)); + check('向上 p' + pages + ' 非 stale', res.stale !== true); + check('向上 p' + pages + ' 窗口≤size', st.order.length <= 10, 'len=' + st.order.length); + check('向上 p' + pages + ' 加一端裁另一端', res.removedIds.length === 10, + 'removed=' + res.removedIds.length); + check('向上 p' + pages + ' 加入数=10', res.addedIds.length === 10); + // 顺序性:窗口内 id 在链中连续且递增 + var idx = chainIds(chain).indexOf(st.order[0]); + var okSeq = true; + for (var i = 1; i < st.order.length; i++) { + if (chainIds(chain).indexOf(st.order[i]) !== idx + i) { okSeq = false; break; } + } + check('向上 p' + pages + ' 窗口连续无重复', okSeq); + pages++; + if (pages > 50) { check('向上换页终止', false, '死循环'); break; } + } + check('向上换页到达头部边界', !st.hasMoreOlder && !RW.canRequest(st, 'older')); + check('头部窗口=链首 10 条', JSON.stringify(idsOf(st)) === JSON.stringify( + chainIds(chain).slice(0, 10))); + check('头部 hiddenOlder=0', st.hiddenOlder === 0); + check('头部 hiddenNewer=390', st.hiddenNewer === 390); + check('向上总换页数=39(窗口 10,400 条)', pages === 39, 'pages=' + pages); + + // ---- 连续向下,直到尾部边界 ---- + var down = 0; + while (RW.canRequest(st, 'newer')) { + var req2 = RW.beginRequest(st, 'newer'); + var res2 = RW.applyPage(st, req2, pageFor(chain, st, req2)); + check('向下 p' + down + ' 非 stale', res2.stale !== true); + check('向下 p' + down + ' 窗口≤size', st.order.length <= 10); + down++; + if (down > 50) { check('向下换页终止', false, '死循环'); break; } + } + check('向下换页到达尾部边界', !st.hasMoreNewer && !RW.canRequest(st, 'newer')); + check('尾部窗口=链尾 10 条', JSON.stringify(idsOf(st)) === JSON.stringify( + chainIds(chain).slice(390))); + check('向下总换页数=39', down === 39, 'down=' + down); + check('往返后窗口无重复', new Set(idsOf(st)).size === idsOf(st).length); +} + +// ============ 4) 短链边界(链 ≤ size)============ +{ + var st = RW.create({ render_window_size: 40 }); + var chain = makeChain(7); + initChain(st, chain); + check('短链: 全链入窗', st.order.length === 7); + check('短链: 无向上/向下', !st.hasMoreOlder && !st.hasMoreNewer); + check('短链: 不可请求', !RW.canRequest(st, 'older') && !RW.canRequest(st, 'newer')); +} + +// ============ 5) 过期响应 ============ +{ + var st = RW.create({ render_window_size: 10 }); + var chain = makeChain(60); + initChain(st, chain); + + // 5a) 切会话(sessionId 变化) + var req = RW.beginRequest(st, 'older'); + var payload = pageFor(chain, st, req); + st.sessionId = 'sess-2'; // 模拟切会话(未走 clear 的代次变化也需被拒) + var r = RW.applyPage(st, req, payload); + check('切会话后旧响应 → stale', r.stale === true); + check('stale 后 pending 清空', st.pending === null); + + // 5b) clear 递增代次 → 旧载荷(旧代次)失效 + initChain(st, chain); + req = RW.beginRequest(st, 'older'); + payload = pageFor(chain, st, req); + RW.clear(st); + r = RW.applyPage(st, req, payload); + check('clear 后旧代次响应 → stale', r.stale === true); + + // 5c) 边界不匹配(竞态:窗口已变化才到达的旧页) + initChain(st, chain); + req = RW.beginRequest(st, 'older'); + var reqB = RW.beginRequest(st, 'older'); + check('pending 时不可重复请求', reqB === null); + var bogus = { sessionId: st.sessionId, generation: st.generation, + boundaryId: 'm0', direction: 'older', chainLen: chain.length, items: [] }; + r = RW.applyPage(st, { direction: 'older', boundaryId: 'm0' }, bogus); + check('边界不匹配 → stale', r.stale === true); + + // 5d) 同一页重复投递(幂等) + req = RW.beginRequest(st, 'older'); + var p1 = pageFor(chain, st, req); + r = RW.applyPage(st, req, p1); + check('正常页投递成功', r.stale !== true); + r = RW.applyPage(st, req, p1); + check('同页重复投递 → stale(pending 已消费)', r.stale === true); +} + +// ============ 6) 活动流:计入上限、永不裁剪 ============ +{ + var st = RW.create({ render_window_size: 40 }); + var chain = makeChain(600); + initChain(st, chain); + var streamId = st.order[st.order.length - 1]; // 最新条即活动流 + RW.noteStream(st, streamId); + + // 默认 size=40 + 1 条流 → 最多另外 39 条 + var req = RW.beginRequest(st, 'older'); + var res = RW.applyPage(st, req, pageFor(chain, st, req)); + check('流在窗时向上换页非 stale', res.stale !== true); + check('流在窗时窗口恒≤size', st.order.length <= 40, 'len=' + st.order.length); + check('流在窗时窗口含流', st.order.indexOf(streamId) >= 0); + var others = st.order.filter(function (id) { return id !== streamId; }).length; + check('流在窗时另外 ≤39 条', others <= 39, 'others=' + others); + check('流未被裁剪(removed 不含流)', res.removedIds.indexOf(streamId) < 0); + + // 继续向上:流始终存活 + for (var i = 0; i < 4 && RW.canRequest(st, 'older'); i++) { + var rq = RW.beginRequest(st, 'older'); + var rs = RW.applyPage(st, rq, pageFor(chain, st, rq)); + check('流持续存活 p' + i, st.order.indexOf(streamId) >= 0 && + rs.removedIds.indexOf(streamId) < 0); + } + + // 流结束后不再受保护 + RW.streamFinished(st, streamId); + var rq2 = RW.beginRequest(st, 'older'); + var rs2 = RW.applyPage(st, rq2, pageFor(chain, st, rq2)); + check('流结束后可被正常裁剪', rs2.removedIds.indexOf(streamId) >= 0); + + // 流在窗口最旧端 + 向下换页:trimHead 保护(手工构造中部窗口) + var st2 = RW.create({ render_window_size: 10 }); + initChain(st2, chain); + st2.order = ['m140', 'm141', 'm142', 'm143', 'm144', 'm145', 'm146', 'm147', 'm148', 'm149']; + st2.indexById = {}; + for (var k = 0; k < st2.order.length; k++) st2.indexById[st2.order[k]] = 140 + k; + st2.hasMoreNewer = true; // 模拟窗口不在链尾 + st2.hiddenNewer = 100; + RW.noteStream(st2, st2.order[0]); + var rq3 = RW.beginRequest(st2, 'newer'); + var rs3 = RW.applyPage(st2, rq3, pageFor(chain, st2, rq3)); + check('流在最旧端时向下换页仍受保护', st2.order.indexOf(st2.order[0]) >= 0 && + rs3.removedIds.indexOf('m140') < 0); + check('流在最旧端时窗口恒≤size', st2.order.length <= 10); + check('流在最旧端时裁掉 10 条并补新页 10 条', rs3.removedIds.length === 10 && + rs3.addedIds.length === 10); +} + +// ============ 7) clear 语义(保留配置模式/大小)============ +{ + var st = RW.create({ render_window_mode: 'manual', render_window_size: 10 }); + var chain = makeChain(60); + initChain(st, chain); + var req = RW.beginRequest(st, 'older'); + var g0 = st.generation; + RW.clear(st); + check('clear: 代次+1', st.generation === g0 + 1); + check('clear: pending 清空', st.pending === null); + check('clear: 模式/大小保留', st.mode === 'manual' && st.size === 10); + check('clear: 不可请求', !RW.canRequest(st, 'older') && !RW.canRequest(st, 'newer')); +} + +// ============ 8) 锚点几何(纯数学)============ +{ + var entries = [ + { id: 'a', top: 0, height: 100 }, + { id: 'b', top: 100, height: 100 }, + { id: 'c', top: 200, height: 100 } + ]; + var an = RW.computeAnchor(entries, 50, 150); + check('锚点: 首个可见=a, offset=50', an && an.msgId === 'a' && an.offset === 50, + JSON.stringify(an)); + an = RW.computeAnchor(entries, 101, 200); + check('锚点: 首个可见=b, offset=1', an && an.msgId === 'b' && an.offset === 1, + JSON.stringify(an)); + an = RW.computeAnchor(entries, 100, 200); + check('锚点: 视口顶恰在 b 起点, offset=0', an && an.msgId === 'b' && an.offset === 0); + an = RW.computeAnchor(entries, 500, 600); + check('锚点: 无可见 → null', an === null); + check('滚动增量: 350-100=250', RW.scrollDeltaFromRects(100, 350) === 250); + check('滚动增量: 无位移=0', RW.scrollDeltaFromRects(100, 100) === 0); +} + +// ============ 9) 一次换页的原子性(加一端 + 裁另一端 + 计数同步)============ +{ + var st = RW.create({ render_window_size: 10 }); + var chain = makeChain(100); + initChain(st, chain); + var before = st.hiddenOlder; // 90 + var req = RW.beginRequest(st, 'older'); + var res = RW.applyPage(st, req, pageFor(chain, st, req)); + check('加 10 条', res.addedIds.length === 10); + check('裁 10 条', res.removedIds.length === 10); + check('hiddenOlder 递减=加入数', st.hiddenOlder === before - 10, + 'before=' + before + ' now=' + st.hiddenOlder); + check('返回计数与状态一致', res.hiddenOlder === st.hiddenOlder && + res.hiddenNewer === st.hiddenNewer && + res.hasMoreOlder === st.hasMoreOlder && res.hasMoreNewer === st.hasMoreNewer); +} + +// ============ 10) 活动消息追加(noteLive):计入上限、裁旧端 ============ +{ + var st = RW.create({ render_window_size: 10 }); + var chain = makeChain(60); + initChain(st, chain); // 窗口 m50..m59 + var r1 = RW.noteLive(st, 'live-user', -1); // 用户消息(未持久化) + check('noteLive: 追加到较新一端', r1.added === true && + st.order[st.order.length - 1] === 'live-user'); + check('noteLive: 窗口≤size(裁掉最旧 1 条)', st.order.length <= 10 && + st.order.indexOf('m50') < 0); + check('noteLive: 裁掉的 id 同步清除下标', st.indexById['m50'] === undefined); + + RW.noteStream(st, 'live-ai'); + var r2 = RW.noteLive(st, 'live-ai', -1); // 助手占位(活动流) + check('noteLive: 流占位入窗', r2.added === true && st.activeStreamId === 'live-ai'); + check('noteLive: 流计入上限后仍≤size', st.order.length <= 10); + + var r3 = RW.noteLive(st, 'live-ai', 61); // 持久化后补下标(幂等) + check('noteLive: 重复 id 幂等补下标', r3.added === false && + st.indexById['live-ai'] === 61); + + // hidden 计数:trimHead 两次后窗口最旧=m52;链尾未知条计入 hiddenNewer(截断≥0) + check('noteLive 后 hiddenOlder=52', st.hiddenOlder === 52, 'got=' + st.hiddenOlder); + check('noteLive 后 hiddenNewer=0(链尾无已持久化更新消息)', st.hiddenNewer === 0 && + st.hasMoreNewer === false, 'got=' + st.hiddenNewer); +} + +console.log('\n===== ' + pass + ' passed, ' + fail + ' failed ====='); +process.exit(fail ? 1 : 0); diff --git a/tests/test_renderer_matrix.py b/tests/test_renderer_matrix.py new file mode 100644 index 0000000..bfe5221 --- /dev/null +++ b/tests/test_renderer_matrix.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- +""" +P1-03 渲染器矩阵单测(平台模拟 + 真实进程级,无 UI 依赖,不启动真实 LLM) + +覆盖: + R1 resolve_backend 平台矩阵:Windows/Linux × auto/webview2/qtwebengine/非法值 + (非法值 → 可见警告 + 平台默认;Linux 请求 webview2 → 警告 + qtwebengine) + R3 Linux 模拟导入链(子进程 sys.platform='linux' 导入 ui.views.main_window): + _wv2mod 为 None,且 core.webview2 / clr / clr_loader 未进入 sys.modules + R4 两个 QtWebEngine 实例并行(2 个 offscreen 子进程同时跑): + 各自独立 profile 载入本地页面并关闭,无 profile 锁争用、无互相清理 + R5 Chromium sandbox 标志契约:普通桌面剥离 --no-sandbox + 告警; + root/容器 + 显式 --no-sandbox → 保留 + 高可见警告;root/容器未设 → 提示 + +运行: PYTHONIOENCODING=utf-8 python tests/test_renderer_matrix.py +""" +import contextlib +import io +import os +import subprocess +import sys +import tempfile + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +PY = sys.executable +IS_WIN = os.name == "nt" + +from core import renderer_backend as rb # noqa: E402 + +RESULTS = [] + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +# ====================================================================== +# R1. resolve_backend 平台矩阵(mock 平台,纯逻辑) +# ====================================================================== +_orig_is_win = rb.is_windows + + +def _mock(is_win: bool): + rb.is_windows = lambda: is_win + + +try: + _mock(True) + b, w = rb.resolve_backend("auto") + check("R1.1 Win auto → webview2 无警告", b == "webview2" and w is None, f"{b} {w!r}") + b, w = rb.resolve_backend("webview2") + check("R1.2 Win webview2 → webview2", b == "webview2" and w is None, f"{b} {w!r}") + b, w = rb.resolve_backend("qtwebengine") + check("R1.3 Win qtwebengine → qtwebengine(强制回落)", b == "qtwebengine" and w is None, + f"{b} {w!r}") + b, w = rb.resolve_backend("gecko") + check("R1.4 Win 非法值 → webview2 + 可见警告", + b == "webview2" and w and "非法" in w, f"{b} {w!r}") + b, w = rb.resolve_backend(123) + check("R1.5 Win 非字符串 → webview2 + 警告", b == "webview2" and w is not None, + f"{b} {w!r}") + b, w = rb.resolve_backend(" QTWebEngine ") + check("R1.6 大小写/空白容差 → qtwebengine", b == "qtwebengine" and w is None, + f"{b} {w!r}") + + _mock(False) + b, w = rb.resolve_backend("auto") + check("R1.7 Linux auto → qtwebengine 无警告", b == "qtwebengine" and w is None, + f"{b} {w!r}") + b, w = rb.resolve_backend("webview2") + check("R1.8 Linux webview2 → qtwebengine + 警告", + b == "qtwebengine" and w and "webview2" in w, f"{b} {w!r}") + b, w = rb.resolve_backend("qtwebengine") + check("R1.9 Linux qtwebengine → qtwebengine", b == "qtwebengine" and w is None, + f"{b} {w!r}") + b, w = rb.resolve_backend("gecko") + check("R1.10 Linux 非法值 → qtwebengine + 警告", + b == "qtwebengine" and w and "非法" in w, f"{b} {w!r}") +finally: + rb.is_windows = _orig_is_win + +# webview2_module 门控(同进程 mock) +try: + _mock(False) + check("R1.11 非 Windows:webview2_module() 返回 None 且不导入", + rb.webview2_module() is None) +finally: + rb.is_windows = _orig_is_win + +# ====================================================================== +# R5. Chromium sandbox 标志契约(mock root/容器探测) +# ====================================================================== +_orig_rootc = rb.is_root_or_container + + +def _run_sanitize(flags, rootc): + rb.is_root_or_container = lambda: rootc + buf = io.StringIO() + with contextlib.redirect_stdout(buf): + out = rb.sanitize_chromium_flags(flags, verbose=True) + return out, buf.getvalue() + + +try: + out, log = _run_sanitize("--disable-gpu", False) + check("R5.1 普通桌面:无 --no-sandbox 原样返回、无告警", + out == "--disable-gpu" and "no-sandbox" not in log, f"{out!r} {log!r}") + + out, log = _run_sanitize("--disable-gpu --no-sandbox", False) + check("R5.2 普通桌面:剥离 --no-sandbox + 告警", + out == "--disable-gpu" and "--no-sandbox" in log, f"{out!r} {log!r}") + + out, log = _run_sanitize("--disable-gpu --no-sandbox", True) + check("R5.3 root/容器 + 显式:保留 --no-sandbox + 高可见警告", + out == "--disable-gpu --no-sandbox" and "高可见警告" in log, f"{out!r} {log!r}") + + out, log = _run_sanitize("--disable-gpu", True) + check("R5.4 root/容器未设:原样返回 + 提示显式设置", + out == "--disable-gpu" and "--no-sandbox" in log and "高可见警告" not in log, + f"{out!r} {log!r}") +finally: + rb.is_root_or_container = _orig_rootc + +# ====================================================================== +# R3. Linux 模拟导入链(子进程:sys.platform='linux' 后 import main_window) +# ====================================================================== +r3_code = ( + "import os, sys;" + f"sys.path.insert(0, {ROOT!r});" + "os.environ.setdefault('QT_QPA_PLATFORM', 'offscreen');" + "os.environ['QTWEBENGINE_CHROMIUM_FLAGS'] = '--disable-gpu';" + "sys.platform = 'linux';" # 模拟非 Windows(导入门控按 sys.platform 判断) + "import ui.views.main_window as m;" + "bad = sorted(k for k in ('core.webview2', 'clr', 'clr_loader') if k in sys.modules);" + "ok = m._wv2mod is None and not bad;" + "print('R3_OK' if ok else f'R3_FAIL {bad!r}')" +) +r3 = subprocess.run([PY, "-c", r3_code], capture_output=True, text=True, + encoding="utf-8", errors="replace", timeout=180) +check("R3.1 Linux 模拟:main_window 导入成功且 _wv2mod 为 None、未导入 webview2/clr", + "R3_OK" in (r3.stdout or ""), + f"rc={r3.returncode} out={(r3.stdout or '')[-200:]!r} err={(r3.stderr or '')[-300:]!r}") + +# ====================================================================== +# R4. 两个 QtWebEngine 实例并行(独立 profile,offscreen) +# ====================================================================== +_r4_base = tempfile.mkdtemp(prefix="haocode_p103_profiles_") +_worker = os.path.join(_r4_base, "qtwe_worker.py") +_worker_code = f'''# -*- coding: utf-8 -*- +import os, sys +sys.path.insert(0, {ROOT!r}) +from PyQt6.QtWidgets import QApplication +from PyQt6.QtCore import QTimer, QUrl +from PyQt6.QtWebEngineCore import QWebEngineProfile +from PyQt6.QtWebEngineWidgets import QWebEngineView +from ui.views.custom_web_page import CustomWebPage +from core import renderer_backend as rbr + +app = QApplication(sys.argv) +pid = os.getpid() +name = f"parallel_{{pid}}" +pdir = rbr.webengine_profile_dir(name) +prof = QWebEngineProfile(name) +prof.setPersistentStoragePath(os.path.join(pdir, "storage")) +prof.setCachePath(os.path.join(pdir, "cache")) + +html = os.path.join(os.path.dirname(pdir), f"page_{{pid}}.html") +with open(html, "w", encoding="utf-8") as f: + f.write(f"ok {{pid}}") + +view = QWebEngineView() +view.setPage(CustomWebPage(prof, view)) +view.resize(800, 600) +view.show() + +st = {{"ok": False}} +fired = {{"v": False}} + +def finish(): + if fired["v"]: return + fired["v"] = True + print(f"WORKER_OK pid={{pid}} loaded={{st['ok']}} profile={{pdir}}", flush=True) + app.quit() + +view.page().loadFinished.connect(lambda o: (st.__setitem__("ok", bool(o)), finish())) +view.load(QUrl.fromLocalFile(html)) + +QTimer.singleShot(30000, finish) # 兜底显式时间预算(30s) +app.exec() +sys.exit(0 if st["ok"] else 1) +''' +with open(_worker, "w", encoding="utf-8") as f: + f.write(_worker_code) + +_r4_env = {**os.environ, + "QT_QPA_PLATFORM": "offscreen", + "QTWEBENGINE_CHROMIUM_FLAGS": "--disable-gpu", + "HAOCODE_WEBENGINE_PROFILE_DIR": _r4_base, + "PYTHONIOENCODING": "utf-8"} + +procs = [] +try: + for _ in range(2): + procs.append(subprocess.Popen([PY, _worker], stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=True, + encoding="utf-8", errors="replace", env=_r4_env)) + outs = [] + for p in procs: + try: + out, err = p.communicate(timeout=90) + outs.append((p.returncode, out, err)) + except subprocess.TimeoutExpired: + p.kill() + outs.append((None, "", "TIMEOUT")) + oks = [rc == 0 and "WORKER_OK" in out for rc, out, err in outs] + check("R4.1 两个 QtWebEngine 实例并行:都成功载入本地页面", + all(oks) and len({out for _, out, _ in outs if out}) == 2, + repr([(rc, (out or '')[-120:], (err or '')[-200:]) for rc, out, err in outs])) + # 两个不同 profile 目录、关闭后目录仍在(无互相清理) + prof_dirs = [] + for rc, out, err in outs: + for line in (out or "").splitlines(): + if line.startswith("WORKER_OK"): + prof_dirs.append(line.rsplit("profile=", 1)[1].strip()) + check("R4.2 两个实例 profile 目录不同(独立,不争用)", + len(prof_dirs) == 2 and prof_dirs[0] != prof_dirs[1], repr(prof_dirs)) + check("R4.3 关闭后 profile 目录仍存在(无互相清理)", + all(os.path.isdir(d) for d in prof_dirs), repr(prof_dirs)) +finally: + for p in procs: + try: + if p.poll() is None: + p.kill() + except Exception: + pass + +# ====================================================================== +print(f"\n===== {sum(1 for _, ok in RESULTS if ok)}/{len(RESULTS)} passed =====", flush=True) +sys.exit(0 if all(ok for _, ok in RESULTS) else 1) diff --git a/tests/test_screen_capture_platforms.py b/tests/test_screen_capture_platforms.py new file mode 100644 index 0000000..12d8c8a --- /dev/null +++ b/tests/test_screen_capture_platforms.py @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- +""" +P1-04 平台截图能力单测(portal 用替身 subprocess,不依赖真实 portal / compositor) + +覆盖: + C1 capture_plan 路由(win32/x11 → overlay;wayland → portal;unknown → unavailable+明确日志) + C2 detect_portal(非 Linux / 无 D-Bus 会话 / 无 gdbus / 齐备 → 四分支) + C3 portal_screenshot_sync 成功路径(fake subprocess:Screenshot 返回解析 + FilePicked + file:// URI 解码(含空格文件名)→ 现有附件流程可用的真实文件路径;校验 gdbus 命令行) + C4 用户取消/授权被拒(只有 Finished 无 FilePicked → denied) + C5 portal 缺失(call rc≠0 NotSupported → "portal 不可用" + 原因) + C6 等待超时(显式预算内无信号 → timeout,不无限挂起) + C7 PortalScreenshotWorker 信号回主线程(done(ok, path)) + C8 ScreenCaptureOverlay offscreen 构造 + start() 空画面守卫不崩 + +运行: PYTHONIOENCODING=utf-8 python tests/test_screen_capture_platforms.py +""" +import contextlib +import io +import json +import os +import shutil +import sys +import tempfile +import time +import types +import urllib.parse + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + +from PyQt6.QtWidgets import QApplication # noqa: E402 + +from ui.views.system_tools import desktop_session as ds # noqa: E402 +from ui.views.system_tools import portal_capture as pc # noqa: E402 +from ui.views.system_tools import screen_capture as sc # noqa: E402 + +RESULTS = [] +APP = QApplication.instance() or QApplication(sys.argv) + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +# ====================================================================== +# C1. capture_plan 路由 +# ====================================================================== +mode, msg = ds.capture_plan("win32") +check("C1.1 win32 → overlay", mode == "overlay" and msg is None, repr((mode, msg))) +mode, msg = ds.capture_plan("x11") +check("C1.2 x11 → overlay(原生 grabWindow 路径)", mode == "overlay" and msg is None, + repr((mode, msg))) +mode, msg = ds.capture_plan("wayland") +check("C1.3 wayland → portal(不绕过 compositor)", mode == "portal" and msg is None, + repr((mode, msg))) +mode, msg = ds.capture_plan("unknown") +check("C1.4 unknown → unavailable + 明确日志(主程序其余功能不受影响)", + mode == "unavailable" and msg and "不可用" in msg, repr((mode, msg))) + +# ====================================================================== +# C2. detect_portal 四分支 +# ====================================================================== +_orig_sys = pc.sys +_orig_which = pc.shutil.which + +try: + pc.sys = types.SimpleNamespace(platform="win32") + ok, reason = pc.detect_portal() + check("C2.1 非 Linux → 不可用", ok is False and reason, repr((ok, reason))) + + pc.sys = types.SimpleNamespace(platform="linux") + saved = {k: os.environ.get(k) for k in ("XDG_RUNTIME_DIR", "DBUS_SESSION_BUS_ADDRESS")} + for k in saved: + os.environ.pop(k, None) + ok, reason = pc.detect_portal() + check("C2.2 无 D-Bus 会话 → 不可用(明确原因)", + ok is False and "D-Bus" in reason, repr((ok, reason))) + os.environ["XDG_RUNTIME_DIR"] = "/run/user/1000" + pc.shutil.which = lambda name: None + ok, reason = pc.detect_portal() + check("C2.3 无 gdbus CLI → 不可用(明确原因)", + ok is False and "gdbus" in reason, repr((ok, reason))) + pc.shutil.which = lambda name: "/usr/bin/gdbus" + ok, reason = pc.detect_portal() + check("C2.4 齐备 → 可用", ok is True and reason is None, repr((ok, reason))) +finally: + pc.sys = _orig_sys + pc.shutil.which = _orig_which + for k, v in saved.items(): + if v is None: + os.environ.pop(k, None) + else: + os.environ[k] = v + + +# ====================================================================== +# C3–C7. portal_screenshot_sync(fake subprocess,模拟 Linux 环境) +# ====================================================================== +_linux_sys = types.SimpleNamespace(platform="linux") + + +class FakeRun: + """替身 subprocess.run:记录 argv,返回预先设定的 call 输出""" + def __init__(self, rc=0, stdout="", stderr=""): + self.rc = rc + self.stdout = stdout + self.stderr = stderr + self.cmds = [] + + def __call__(self, cmd, **kw): + self.cmds.append(list(cmd)) + p = types.SimpleNamespace() + p.returncode = self.rc + p.stdout = self.stdout + p.stderr = self.stderr + return p + + +class FakePipe: + """替身 monitor 的 stdout:按序输出 JSON 行;readline 可模拟阻塞""" + def __init__(self, lines, delay_s=0.0): + self._lines = list(lines) + self._delay = delay_s + self.closed = False + + def readline(self): + if self._delay: + time.sleep(self._delay) + self._delay = 0 + if self._lines: + return self._lines.pop(0) + "\n" + # 模拟管道关闭(EOF) + return "" + + +class FakePopen: + def __init__(self, lines, delay_s=0.0): + self._lines = lines + self._delay = delay_s + self.cmd = None + self.killed = False + + def __call__(self, cmd, **kw): + self.cmd = list(cmd) + p = types.SimpleNamespace() + p.stdout = FakePipe(self._lines, self._delay) + p.stderr = io.StringIO() + self._rc = None + p.poll = lambda: self._rc + p.kill = lambda: setattr(p, "killed", True) or setattr(self, "killed", True) + p.wait = lambda timeout=None: 0 + return p + + +def _uri(path: str) -> str: + return "file://" + urllib.parse.quote(path) + + +def _json(member, iface, body): + return json.dumps({"interface": iface, "member": member, "body": body}, + ensure_ascii=False) + + +# C3.1 成功路径(含空格文件名 → URI 解码) +tmpdir = tempfile.mkdtemp(prefix="haocode_p104_portal_") +shot = os.path.join(tmpdir, "shot test.png") +with open(shot, "wb") as f: + f.write(b"\x89PNG\r\n\x1a\nfake") + +pc.sys = _linux_sys # C3–C7 模拟 Linux 宿主 +_orig_which2 = pc.shutil.which +pc.shutil.which = lambda name: "/usr/bin/gdbus" # 本机无 gdbus,替身探测 +_saved_xdg = os.environ.get("XDG_RUNTIME_DIR") +os.environ["XDG_RUNTIME_DIR"] = "/run/user/1000" +run_fake = FakeRun(rc=0, stdout="('/org/freedesktop/portal/desktop/request/1000/haocode/7', <>)") +popen_fake = FakePopen([ + _json("FilePicked", "org.freedesktop.portal.FileChooser", [_uri(shot), {}]), + _json("Finished", "org.freedesktop.portal.Request", [0]), +]) +_orig_run, _orig_popen = pc.subprocess.run, pc.subprocess.Popen +pc.subprocess.run = run_fake +pc.subprocess.Popen = popen_fake +try: + t0 = time.time() + ok, result = pc.portal_screenshot_sync("haocode-shot", request_timeout_s=5, wait_budget_s=10) + dt = time.time() - t0 +finally: + pc.subprocess.run = _orig_run + pc.subprocess.Popen = _orig_popen + +check("C3.1 成功:返回真实文件路径(URI 空格解码正确)", + ok is True and result == shot and os.path.exists(result), repr((ok, result))) +check("C3.2 Screenshot gdbus 命令行正确(dest/path/method/parent=/)", + run_fake.cmds and run_fake.cmds[0][:5] == ["gdbus", "call", "--session", "--dest", + pc.PORTAL_DEST] + and "--method=org.freedesktop.portal.Screenshot.Screenshot" in run_fake.cmds[0] + and "/" in run_fake.cmds[0], repr(run_fake.cmds)) +check("C3.3 monitor 监听 request 对象路径", + popen_fake.cmd and popen_fake.cmd[-2:] == ["--object-path", + "/org/freedesktop/portal/desktop/request/1000/haocode/7"], + repr(popen_fake.cmd)) +check("C3.4 全程在显式预算内完成(<10s)", dt < 10, f"{dt:.1f}s") + +# C4. 用户取消/授权被拒(只有 Finished) +popen_fake = FakePopen([_json("Finished", "org.freedesktop.portal.Request", [0])]) +pc.subprocess.run = run_fake +pc.subprocess.Popen = popen_fake +try: + ok, result = pc.portal_screenshot_sync("haocode-shot", 5, 10) +finally: + pc.subprocess.run = _orig_run + pc.subprocess.Popen = _orig_popen +check("C4.1 授权被拒 → 不伪造成功,明确原因", + ok is False and "取消" in result, repr((ok, result))) + +# C5. portal 缺失/方法不支持(call rc≠0) +run_fake2 = FakeRun(rc=1, stderr="Error: org.freedesktop.DBus.Error.NotSupported: " + "Method not supported by portal") +pc.subprocess.run = run_fake2 +pc.subprocess.Popen = FakePopen([]) +try: + ok, result = pc.portal_screenshot_sync("haocode-shot", 5, 10) +finally: + pc.subprocess.run = _orig_run + pc.subprocess.Popen = _orig_popen +check("C5.1 portal 不支持 → 不可用 + 原因透出", + ok is False and "portal 不可用" in result and "NotSupported" in result, repr((ok, result))) + +# C6. 等待超时(monitor 首行前阻塞 > 预算) +popen_fake = FakePopen([_json("Finished", "org.freedesktop.portal.Request", [0])], + delay_s=3.0) +pc.subprocess.run = run_fake +pc.subprocess.Popen = popen_fake +try: + t0 = time.time() + ok, result = pc.portal_screenshot_sync("haocode-shot", 5, 1.0) + dt = time.time() - t0 +finally: + pc.subprocess.run = _orig_run + pc.subprocess.Popen = _orig_popen +check("C6.1 超预算 → timeout(不无限挂起)", + ok is False and "超时" in result and dt < 5, repr((ok, result, f"{dt:.1f}s"))) + +# ====================================================================== +# C7. PortalScreenshotWorker 信号 +# ====================================================================== +popen_fake = FakePopen([ + _json("FilePicked", "org.freedesktop.portal.FileChooser", [_uri(shot), {}]), + _json("Finished", "org.freedesktop.portal.Request", [0]), +]) +pc.subprocess.run = run_fake +pc.subprocess.Popen = popen_fake +try: + w = pc.PortalScreenshotWorker(wait_budget_s=10) + done = {} + w.done.connect(lambda ok, r: done.update(ok=ok, r=r)) + w.start() + deadline = time.time() + 15 + while "ok" not in done and time.time() < deadline: + APP.processEvents() + time.sleep(0.02) + w.wait(3000) +finally: + pc.subprocess.run = _orig_run + pc.subprocess.Popen = _orig_popen + pc.shutil.which = _orig_which2 + if _saved_xdg is None: + os.environ.pop("XDG_RUNTIME_DIR", None) + else: + os.environ["XDG_RUNTIME_DIR"] = _saved_xdg + pc.sys = _orig_sys +check("C7.1 worker done 信号回主线程(ok + 路径)", + done.get("ok") is True and done.get("r") == shot, repr(done)) + +# ====================================================================== +# C8. 覆盖层 offscreen 构造 + start() 空画面守卫 +# ====================================================================== +ov = sc.ScreenCaptureOverlay() +buf = io.StringIO() +with contextlib.redirect_stdout(buf): + ov.start() # offscreen:无屏幕或空画面都不得崩 +shown = ov.isVisible() +check("C8.1 offscreen start() 不崩;空画面时不显示覆盖层且日志明确", + (not shown and "空画面" in buf.getvalue()) or (shown and ov._full_pixmap is not None), + f"shown={shown} log={buf.getvalue()[-160:]!r}") +if shown: + ov.close() + +print(f"\n===== {sum(1 for _, ok in RESULTS if ok)}/{len(RESULTS)} passed =====", flush=True) +sys.exit(0 if all(ok for _, ok in RESULTS) else 1) diff --git a/tests/test_think_code_neutral.py b/tests/test_think_code_neutral.py new file mode 100644 index 0000000..f8ba920 --- /dev/null +++ b/tests/test_think_code_neutral.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +""" +离屏验证:思考/压缩气泡内代码朴素渲染(去"紫+边框")+ 正文代码块不受影响 +背景:压缩摘要充满代码,finishTimelineMessage 对全部 pre code 做 hljs 高亮后, +.code-block-wrapper 的浅色语法色(#a626a4 紫)+ 1px 边框 + 语言栏让定格后的 +压缩气泡观感"紫色带边框"。修复:.think-content 作用域内代码统一朴素灰、 +无边框、无头部、无 min-width;正文气泡代码块保持原样。 +""" +import os, sys, json + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +os.environ["QT_QPA_PLATFORM"] = "offscreen" +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" +os.environ.setdefault("HAOCODE_RENDER", "software") + +from PyQt6.QtWidgets import QApplication # noqa: E402 铁律:WebEngine 先于 QApplication 创建导入 +from PyQt6.QtCore import QTimer, QUrl # noqa: E402 +from PyQt6.QtWebEngineWidgets import QWebEngineView # noqa: E402 + +RESULTS = [] +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + +GRAY = "rgb(119, 119, 119)" # #777 +PURPLE = "rgb(166, 38, 164)" # #a626a4(正文代码块关键字色,保持) + +SUMMARY = ("## 摘要\n说明文字。\n```python\nimport os\ndef run():\n return \"x\"\n```\n" + "另外 `flowkit` 与 `read_file` 是工具名。") + +TEST_JS = r""" +(function(){ + try { + var out = {}; + var SUM = __SUMMARY__; + + // ---------- 压缩气泡:定格 + finish(触发全量 hljs 兜底)后探测 ---------- + createMessage('m1','assistant','','Assistant'); + compactionStarted('m1','pre_prompt'); + compactionFinished('m1',{summary:SUM,before:100,after:50,duration_ms:10,path:'pre_prompt'}); + finishMessage('m1'); + (function(){ + var block = document.querySelector('#m1 .compaction-think'); + if (!block) { out.m1 = 'NO-BLOCK'; return; } + var wrap = block.querySelector('.code-block-wrapper'); + if (!wrap) { out.m1 = 'NO-WRAP'; return; } + var cs = getComputedStyle(wrap); + out.m1_border = cs.borderTopWidth; + out.m1_minw = cs.minWidth; + var hdr = wrap.querySelector('.code-header'); + out.m1_header_display = hdr ? getComputedStyle(hdr).display : 'NO-HDR'; + var kw = wrap.querySelector('.hljs-keyword'); + out.m1_kw_color = kw ? getComputedStyle(kw).color : 'NO-KW-SPAN'; + var pre = wrap.querySelector('pre code'); + out.m1_pre_color = pre ? getComputedStyle(pre).color : 'NO-PRE'; + var ic = block.querySelector('p code'); + out.m1_inline_color = ic ? getComputedStyle(ic).color : 'NO-INLINE'; + })(); + + // ---------- 对照组:正文消息的代码块保持原样(边框+语法色) ---------- + createMessage('m2','assistant','','Assistant'); + appendToken('m2','前文。\n```python\nimport os\ndef run():\n return "x"\n```\n后文。'); + finishMessage('m2'); + (function(){ + var w = document.querySelector('#m2 .code-block-wrapper'); + if (!w) { out.m2 = 'NO-WRAP'; return; } + var cs = getComputedStyle(w); + out.m2_border = cs.borderTopWidth; + var hdr = w.querySelector('.code-header'); + out.m2_header_display = hdr ? getComputedStyle(hdr).display : 'NO-HDR'; + var kw = w.querySelector('.hljs-keyword'); + out.m2_kw_color = kw ? getComputedStyle(kw).color : 'NO-KW-SPAN'; + })(); + + return JSON.stringify(out); + } catch(e) { return 'JSERR:' + e.message + ' @' + ((e.stack||'').split('\n')[1]||''); } +})() +""".replace("__SUMMARY__", json.dumps(SUMMARY, ensure_ascii=False)) + +app = QApplication(sys.argv) +_js = {"v": None} +view = QWebEngineView(); view.resize(1000, 700) +_index = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), + "..", "ui", "web", "index.html")) +def _run(): + view.page().runJavaScript(TEST_JS, lambda v: _js.update(v=v)) +view.loadFinished.connect(lambda ok: QTimer.singleShot(1500, _run)) +QTimer.singleShot(9000, app.quit) +view.load(QUrl.fromLocalFile(_index)) +app.exec() + +try: + r = json.loads(_js["v"]) +except Exception: + r = None + print(f"DOM 结果解析失败: {_js['v']!r}", flush=True) + +check("T.DOM 返回", isinstance(r, dict), repr(_js["v"])[:300]) +if isinstance(r, dict): + # 压缩气泡内:朴素化 + check("T.压缩气泡代码块边框=0", r.get("m1_border") == "0px", r) + check("T.压缩气泡代码块min-width=0", r.get("m1_minw") == "0px", r) + check("T.压缩气泡代码头部=隐藏", r.get("m1_header_display") == "none", r) + check("T.压缩气泡关键字色=#777(去紫)", r.get("m1_kw_color") == GRAY, r.get("m1_kw_color")) + check("T.压缩气泡pre代码色=#777", r.get("m1_pre_color") == GRAY, r.get("m1_pre_color")) + check("T.压缩气泡内联代码色=#777(去粉)", r.get("m1_inline_color") == GRAY, r.get("m1_inline_color")) + # 正文对照:保持原样 + check("T.正文代码块边框=1px(不变)", r.get("m2_border") == "1px", r) + check("T.正文代码头部=可见(不变)", r.get("m2_header_display") not in ("none", "NO-HDR"), r) + check("T.正文关键字色=#a626a4(不变)", r.get("m2_kw_color") == PURPLE, r.get("m2_kw_color")) + +failed = [n for n, ok in RESULTS if not ok] +print(f"\n===== {len(RESULTS) - len(failed)}/{len(RESULTS)} PASS =====", flush=True) +print("ALL PASS" if not failed else f"FAILED: {failed}", flush=True) +sys.exit(0 if not failed else 1) diff --git a/tests/test_tool_params.py b/tests/test_tool_params.py new file mode 100644 index 0000000..9188ed3 --- /dev/null +++ b/tests/test_tool_params.py @@ -0,0 +1,255 @@ +# -*- coding: utf-8 -*- +""" +四大工具参数层单测(纯函数级,无 DB/无 UI 依赖) + +覆盖本轮修复: + T1-T9 参数归一化 + JSON Schema 校验(全错误上报 / null 归一化 / 轻量强制转换 / bool 漏洞) + T10-T13 edit 参数预处理(legacy 单条 / edits 为 JSON 字符串) + T14-T19 edit 区间规划(唯一性 / 重叠检测 / 空 oldText) + T20-T25 read 参数钳制(limit 负数漏洞 / 越界 / 空文件) + T26-T29 write + edit 原子写(无临时文件残留) + T30-T31 before 钩子改参后重新校验 + +运行: PYTHONIOENCODING=utf-8 python tests/test_tool_params.py +""" +import os +import sys +import json +import glob +import tempfile +import shutil + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from core.agent.tools import (validate_json_schema, normalize_and_coerce, # noqa: E402 + _prepare_edit_args, _plan_edits, + tool_read, tool_write, tool_edit, + execute_tool_call, PreparedToolCall) +from core.agent.types import (AgentTool, AgentToolResult, AbortSignal, # noqa: E402 + ToolCall, AgentMessage) + +RESULTS = [] + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +# ====================================================================== +# 测试用 schema(与 default_tools() 一致) +# ====================================================================== +S_READ = {"type": "object", + "properties": {"path": {"type": "string"}, + "offset": {"type": "integer"}, + "limit": {"type": "integer"}}, + "required": ["path"]} +S_BASH = {"type": "object", + "properties": {"command": {"type": "string"}, + "timeout": {"type": "number"}}, + "required": ["command"]} +S_EDIT = {"type": "object", + "properties": { + "path": {"type": "string"}, + "edits": {"type": "array", + "items": {"type": "object", + "properties": {"oldText": {"type": "string"}, + "newText": {"type": "string"}}, + "required": ["oldText"]}}}, + "required": ["path", "edits"]} + +SG = AbortSignal() + + +# ====================================================================== +# T1-T9 校验层 +# ====================================================================== +def err_of(args, schema): + return validate_json_schema(normalize_and_coerce(args, schema), schema) + + +check("T1.缺必填参数", err_of({"offset": 1}, S_READ) == "缺少必填参数: path", + err_of({"offset": 1}, S_READ)) +check("T2.string 类型错误", "应为 string" in (err_of({"path": 123}, S_READ) or ""), + err_of({"path": 123}, S_READ)) +check("T3.bool 不得冒充 integer(旧版漏洞)", + "应为 integer" in (err_of({"path": "a", "offset": True}, S_READ) or ""), + err_of({"path": "a", "offset": True}, S_READ)) +check("T4.bool 不得冒充 number(旧版漏洞)", + "应为 number" in (err_of({"command": "x", "timeout": True}, S_BASH) or ""), + err_of({"command": "x", "timeout": True}, S_BASH)) +check("T5.整数 1.5 拒绝", "期望 integer" in (err_of({"path": "a", "offset": 1.5}, S_READ) or ""), + err_of({"path": "a", "offset": 1.5}, S_READ)) +check("T6.多余参数宽容(与 pi 一致)", err_of({"path": "a", "lines": 10}, S_READ) is None, + err_of({"path": "a", "lines": 10}, S_READ)) +_err2 = err_of({"path": 123, "offset": "bad"}, S_READ) or "" +check("T7.多错全量上报(不再只报第 1 个)", + _err2.count(";") >= 1 and "path" in _err2 and "offset" in _err2, _err2) +check("T8.嵌套必填字段", + err_of({"path": "a", "edits": [{"newText": "y"}]}, S_EDIT) + == "参数 edits[0] 缺少必填字段 oldText", + err_of({"path": "a", "edits": [{"newText": "y"}]}, S_EDIT)) +check("T9.数组元素类型错误定位到下标", + "edits[1]" in (err_of({"path": "a", "edits": [{"oldText": "x"}, {"oldText": 5}]}, S_EDIT) or ""), + err_of({"path": "a", "edits": [{"oldText": "x"}, {"oldText": 5}]}, S_EDIT)) + +# ---- 归一化 / 强制转换 ---- +check("T10.可选字段 null 被删除(不再误报类型错)", + normalize_and_coerce({"path": "a", "offset": None}, S_READ) == {"path": "a"}) +check("T11.数字字符串被转换 \"30\"→30", + normalize_and_coerce({"command": "x", "timeout": "30"}, S_BASH)["timeout"] == 30) +check("T12.integer 字段收 \"1.5\" 保持原值(交由校验报错)", + normalize_and_coerce({"path": "a", "offset": "1.5"}, S_READ)["offset"] == "1.5") +_orig = {"path": "a", "offset": None} +normalize_and_coerce(_orig, S_READ) +check("T13.归一化不修改入参", _orig == {"path": "a", "offset": None}, _orig) + +# ====================================================================== +# T14-T15 edit 参数预处理 +# ====================================================================== +check("T14.legacy 单条形式 {oldText,newText} → edits[]", + _prepare_edit_args({"path": "a", "oldText": "x", "newText": "y"}) + == {"path": "a", "edits": [{"oldText": "x", "newText": "y"}]}) +check("T15.edits 为 JSON 字符串 → 解析为数组", + _prepare_edit_args({"path": "a", "edits": '[{"oldText":"x"}]'}) + == {"path": "a", "edits": [{"oldText": "x"}]}) + +# ====================================================================== +# T16-T19 edit 区间规划 +# ====================================================================== +_e, _sp = _plan_edits("hello world", [{"oldText": "world", "newText": "there"}]) +check("T16.唯一命中 → 规划成功", _e is None and _sp[0][0] == 6, (_e, _sp)) +check("T17.未命中 → 报错", "未找到匹配文本" in (_plan_edits("abc", [{"oldText": "zz"}])[0] or ""), + _plan_edits("abc", [{"oldText": "zz"}])[0]) +check("T18.重复命中 → 报错", "匹配到 2 处" in (_plan_edits("foo foo", [{"oldText": "foo"}])[0] or ""), + _plan_edits("foo foo", [{"oldText": "foo"}])[0]) +# 旧版会:两条对原始内容各自唯一 → 校验通过 → 应用时第 2 条已找不到(静默 no-op,仍报“已应用 2 处”) +# 现在必须判定为重叠并整批拒绝 +_e2 = _plan_edits("foo bar", [{"oldText": "foo bar", "newText": "foo BAR"}, + {"oldText": "bar", "newText": "baz"}])[0] +check("T19.区间重叠被检出(旧版静默 no-op 第 2 条)", "重叠" in (_e2 or ""), _e2) +check("T19b.嵌套重叠被检出", + "重叠" in (_plan_edits("abc", [{"oldText": "abc", "newText": "Z"}, + {"oldText": "ab", "newText": "Q"}])[0] or "")) +check("T19d.原文件不存在的 oldText 被拒(对齐 pi:对原始快照匹配)", + "未找到匹配文本" in (_plan_edits("abc", [{"oldText": "ab", "newText": "aX"}, + {"oldText": "aXb", "newText": "ZZ"}])[0] or "")) +check("T19c.空 oldText 被拒(旧版空文件会静默插入)", + "不能为空" in (_plan_edits("", [{"oldText": "", "newText": "INJ"}])[0] or ""), + _plan_edits("", [{"oldText": "", "newText": "INJ"}])[0]) + +# ====================================================================== +# T20-T25 read 参数钳制(临时文件,不碰项目数据) +# ====================================================================== +_TMP = tempfile.mkdtemp(prefix="haocode_tp_") +CTX = {"cwd": _TMP} + + +def _mk(name, text): + p = os.path.join(_TMP, name) + with open(p, "w", encoding="utf-8") as f: + f.write(text) + return p + + +try: + _mk("lines.txt", "".join(f"L{i}\n" for i in range(1, 11))) # 10 行 + _mk("empty.txt", "") + + r = tool_read("t", {"path": "lines.txt", "limit": -5}, SG, None, CTX) + _t20 = r.as_text() + check("T20.limit 负数不再读全文件(旧版返回 10 行减 5)", + "L1" in _t20 and "L2" not in _t20, _t20.replace("\n", " | ")[:120]) + + r = tool_read("t", {"path": "lines.txt", "limit": 0}, SG, None, CTX) + check("T21.limit=0 钳到 1(旧版返回空块 + 无意义脚注)", + "L1" in r.as_text() and "L2" not in r.as_text(), r.as_text().replace("\n", " | ")[:120]) + + r = tool_read("t", {"path": "lines.txt", "offset": 999}, SG, None, CTX) + check("T22.offset 越界 → 明确提示(旧版'已显示 999–998 行')", + "超出文件范围" in r.as_text() and "共 10 行" in r.as_text(), r.as_text()) + + r = tool_read("t", {"path": "empty.txt"}, SG, None, CTX) + check("T23.空文件 → 明确提示", "文件为空" in r.as_text(), r.as_text()) + + r = tool_read("t", {"path": ""}, SG, None, CTX) + check("T24.path 为空 → 'path 不能为空'(旧版报'文件不存在: ')", + r.is_error and "不能为空" in r.as_text(), r.as_text()) + + r = tool_read("t", {"path": "lines.txt", "offset": 3, "limit": 2}, SG, None, CTX) + check("T25.正常行窗口不变(offset=3,limit=2 → L3,L4)", + "L3" in r.as_text() and "L4" in r.as_text() and "L5" not in r.as_text() + and "offset=5" in r.as_text(), r.as_text().replace("\n", " | ")[:140]) + + # ================================================================== + # T26-T29 原子写 / edit 端到端 + # ================================================================== + r = tool_write("t", {"path": "w.txt", "content": "a\nb\n"}, SG, None, CTX) + left = glob.glob(os.path.join(_TMP, ".hocode_w_*")) + check("T26.write 成功且无临时文件残留", not r.is_error and not left, (r.as_text(), left)) + tool_write("t", {"path": "w2.txt", "content": "foo bar"}, SG, None, CTX) + + r = tool_edit("t", {"path": "w2.txt", + "edits": [{"oldText": "foo bar", "newText": "foo BAR"}, + {"oldText": "bar", "newText": "baz"}]}, SG, None, CTX) + check("T27.重叠 edit 整批拒绝且文件未被改动", + r.is_error and "重叠" in r.as_text(), r.as_text()) + + r = tool_edit("t", {"path": "w.txt", + "edits": [{"oldText": "a", "newText": "A"}, + {"oldText": "b", "newText": "B"}]}, SG, None, CTX) + with open(os.path.join(_TMP, "w.txt"), encoding="utf-8") as f: + after = f.read() + check("T28.多条不重叠 edit 一次性应用(对原始快照)", + not r.is_error and after == "A\nB\n", (r.as_text(), repr(after))) + + r = tool_edit("t", {"path": "w.txt", "edits": [{"oldText": "", "newText": "X"}]}, SG, None, CTX) + with open(os.path.join(_TMP, "w.txt"), encoding="utf-8") as f: + after = f.read() + check("T29.空 oldText 被拒且文件未变", r.is_error and after == "A\nB\n", + (r.as_text(), repr(after))) + + # ================================================================== + # T30-T31 before 钩子改参后重新校验 + # ================================================================== + def _echo(args): + return AgentToolResult.text(f"echo:{json.dumps(args, sort_keys=True)}") + + def _echo5(tool_call_id, args, signal, on_update, ctx): + return _echo(args) + + class _Cfg: + tool_context = {"cwd": _TMP} + before_tool_call = None + after_tool_call = None + + etool = AgentTool(name="echo", description="d", parameters=S_READ, execute=_echo5) + tc = ToolCall(id="c1", name="echo", arguments={"path": "a"}) + + cfg_bad = _Cfg() + cfg_bad.before_tool_call = lambda payload, sig: {"args": {"path": 123}} + res = execute_tool_call(PreparedToolCall(tool_call=tc, tool=etool, args={"path": "a"}), + AgentMessage(role="assistant", content=""), cfg_bad, SG, None) + check("T30.before 钩子返回非法参数 → 拒绝执行(pi 同款重校验)", + res.is_error and "校验失败" in res.as_text(), res.as_text()) + + cfg_ok = _Cfg() + cfg_ok.before_tool_call = lambda payload, sig: {"args": {"path": "b", "offset": "7"}} + res = execute_tool_call(PreparedToolCall(tool_call=tc, tool=etool, args={"path": "a"}), + AgentMessage(role="assistant", content=""), cfg_ok, SG, None) + check("T31.before 钩子改参后归一化生效(\"7\"→7)", + not res.is_error and '"offset": 7' in res.as_text(), res.as_text()) + + cfg_blk = _Cfg() + cfg_blk.before_tool_call = lambda payload, sig: {"block": True, "reason": "nope"} + res = execute_tool_call(PreparedToolCall(tool_call=tc, tool=etool, args={"path": "a"}), + AgentMessage(role="assistant", content=""), cfg_blk, SG, None) + check("T32.before 钩子 block 语义不变", res.is_error and "nope" in res.as_text(), res.as_text()) + +finally: + shutil.rmtree(_TMP, ignore_errors=True) + +failed = [n for n, ok in RESULTS if not ok] +print(f"\n===== {len(RESULTS) - len(failed)}/{len(RESULTS)} PASS =====", flush=True) +print("ALL PASS" if not failed else f"FAILED: {failed}", flush=True) +sys.exit(0 if not failed else 1) diff --git a/tests/test_wv2_guard.py b/tests/test_wv2_guard.py new file mode 100644 index 0000000..dc6e316 --- /dev/null +++ b/tests/test_wv2_guard.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +""" +WebView2 守卫单测 —— 锁死 T0 级事故不再复发 + +事故链(已发生): + 每个 MainWindow()(含 offscreen 测试)→ get_environment() + → 无条件 `taskkill /F /IM msedgewebview2.exe` + → 把【正在运行的生产 app】的 WebView2 浏览器进程一并杀掉 + → 它的 controller 变 disposed(set_bounds 报 0x8007139F) + → DOM 照渲染但视觉层永久空白(“选中会话不渲染核心内容”) + +覆盖: + T1 无头环境(QT_QPA_PLATFORM=offscreen)→ 不启用 WebView2 + T2 HAOCODE_FORCE_QTWEBENGINE=1 → 不启用 + T3 桌面平台(QT_QPA_PLATFORM=windows)→ 允许 + T4 单实例锁:持有者独占;【另一个进程】拿不到(跨进程互斥,是真守卫) + T5 offscreen 下 get_environment() 直接返回 None(根本不碰共享 profile) + T6 同一进程重复 acquire 幂等返回 True(不会把自己锁死) + +运行: PYTHONIOENCODING=utf-8 python tests/test_wv2_guard.py +""" +import os +import sys +import tempfile +import subprocess + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# 铁律:测试用独立锁文件,不得与正在运行的 app 争 data/app_instance.lock +# (否则断言会依赖“app 是否在跑”) +_LOCK_TMP = os.path.join(tempfile.gettempdir(), "haocode_wv2guard_%d.lock" % os.getpid()) +os.environ["HAOCODE_INSTANCE_LOCK_FILE"] = _LOCK_TMP +if os.path.exists(_LOCK_TMP): + try: + os.remove(_LOCK_TMP) + except Exception: + pass + +RESULTS = [] + + +def check(name, cond, extra=""): + RESULTS.append((name, bool(cond))) + print(f"{'PASS' if cond else 'FAIL'} {name} {extra if not cond else ''}", flush=True) + + +import core.webview2 as W # noqa: E402 + +_ORIG = dict(os.environ) + +try: + # ---------------- T1/T2/T3: 环境守卫 ---------------- + os.environ["QT_QPA_PLATFORM"] = "offscreen" + os.environ.pop("HAOCODE_FORCE_QTWEBENGINE", None) + check("T1.1 offscreen → 不允许 WebView2", W._wv2_allowed_here() is False) + + os.environ["QT_QPA_PLATFORM"] = "windows" + check("T1.2 windows → 允许 WebView2", W._wv2_allowed_here() is True) + + for p in ("minimal", "minimalegl", "vnc", "wayland", "embedded", "offscreen"): + os.environ["QT_QPA_PLATFORM"] = p + if W._wv2_allowed_here() is not False: + check(f"T1.3 平台 {p} 应被拒绝", False, p) + break + else: + check("T1.3 非 windows 平台全部拒绝", True) + + os.environ["QT_QPA_PLATFORM"] = "windows" + os.environ["HAOCODE_FORCE_QTWEBENGINE"] = "1" + check("T2.1 强制回退开关生效", W._wv2_allowed_here() is False) + os.environ.pop("HAOCODE_FORCE_QTWEBENGINE", None) + + # ---------------- T4: 跨进程单实例互斥(核心) ---------------- + os.environ["QT_QPA_PLATFORM"] = "windows" + W._INSTANCE_LOCK["fh"] = None # 从头开始,避免受本进程历史影响 + first = W.acquire_instance_lock() + check("T4.1 首个 acquires 成功", first is True, str(first)) + check("T4.2 同进程重复 acquire 幂等为 True", + W.acquire_instance_lock() is True) + + code = ("import sys; sys.path.insert(0, r'%s');" + "import core.webview2 as W; print(W.acquire_instance_lock())" + % os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + r = subprocess.run([sys.executable, "-c", code], capture_output=True, + text=True, encoding="utf-8", errors="replace", timeout=60) + got = (r.stdout or "").strip().splitlines() + got = got[-1] if got else "" + check("T4.3 另一进程拿不到锁(互斥生效)", got == "False", f"stdout={got!r} err={(r.stderr or '')[:120]}") + + # ---------------- T5: offscreen 下 get_environment 直接 None ---------------- + os.environ["QT_QPA_PLATFORM"] = "offscreen" + W._env = None + env = W.get_environment(None) + check("T5.1 offscreen 下 get_environment → None(不碰共享 profile)", env is None) + check("T5.2 被守卫拦下后 _env 仍为空", W._env is None) + + # ---------------- T6: 已有实例在跑时 → 不启用 WebView2 ---------------- + # 此时本进程仍持有锁;用子进程模拟“后来的实例” + code2 = ("import sys; sys.path.insert(0, r'%s');" + "import core.webview2 as W; print(W.get_environment(None) is None)" + % os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + r2 = subprocess.run([sys.executable, "-c", code2], capture_output=True, + text=True, encoding="utf-8", errors="replace", + env={**os.environ, "QT_QPA_PLATFORM": "windows"}, + timeout=60) + out2 = (r2.stdout or "").strip().splitlines() + out2 = out2[-1] if out2 else "" + check("T6.1 已有实例持锁 → 后来的实例拿到 None(回落 QtWebEngine,不 taskkill)", + out2 == "True", f"stdout={out2!r} err={(r2.stderr or '')[:160]}") + +finally: + try: + fh = W._INSTANCE_LOCK.get("fh") + if fh is not None: + fh.close() + except Exception: + pass + try: + if os.path.exists(_LOCK_TMP): + os.remove(_LOCK_TMP) + except Exception: + pass + os.environ.clear() + os.environ.update(_ORIG) + +failed = [n for n, ok in RESULTS if not ok] +print(f"\n===== {len(RESULTS) - len(failed)}/{len(RESULTS)} PASS =====", flush=True) +print("ALL PASS" if not failed else f"FAILED: {failed}", flush=True) +sys.exit(0 if not failed else 1) diff --git a/tests/tune_mode_popup.py b/tests/tune_mode_popup.py new file mode 100644 index 0000000..4e0de55 --- /dev/null +++ b/tests/tune_mode_popup.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +"""会话模式弹窗 · 可视化调参工具 +运行: C:\\Users\\14890\\miniconda3\\envs\\haocode\\python.exe tests\\tune_mode_popup.py +- 左侧:调参窗(拖动/修改参数 → 右侧弹窗实时重渲染) +- 右侧:真实的 SessionModePopup 本体(独立窗口,点调参窗不会消失) +- 满意后点「确定」→ 参数 JSON 写入 data/mode_popup_tune.json → 自动退出 +""" +import os +import sys +import json +import traceback + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" +os.environ.setdefault("HAOCODE_RENDER", "software") + +from PyQt6.QtWidgets import ( # noqa: E402 + QApplication, QWidget, QFormLayout, QHBoxLayout, QSpinBox, + QPushButton, QCheckBox, QMessageBox, +) +from PyQt6.QtCore import Qt # noqa: E402 +from PyQt6.QtGui import QPixmap # noqa: E402 +from ui.views.main_window import SessionModePopup, _ModeRow, _popup_svg_path # noqa: E402 + +DEFAULTS = { + "icon_size": 14, # 图标尺寸 + "name_font": 12, # 名称字号 + "desc_font": 12, # 描述字号 + "row_margin_v": 8, # 行上下内边距 + "row_margin_h": 10, # 行左右内边距 + "icon_text_gap": 12, # 图标-文字间距 + "name_desc_gap": 4, # 名称/描述行间距 + "row_radius": 8, # 行圆角 + "popup_width": 320, # 弹窗宽度 + "container_margin": 4, # 容器边距 +} +RANGES = { + "icon_size": (8, 48), "name_font": (10, 20), "desc_font": (9, 18), + "row_margin_v": (2, 20), "row_margin_h": (4, 24), "icon_text_gap": (4, 24), + "name_desc_gap": (0, 8), "row_radius": (0, 16), "popup_width": (240, 420), + "container_margin": (0, 16), +} +CN = { + "icon_size": "图标尺寸 (px)", + "name_font": "名称字号 (px)", + "desc_font": "描述字号 (px)", + "row_margin_v": "行上下内边距 (px)", + "row_margin_h": "行左右内边距 (px)", + "icon_text_gap": "图标-文字间距 (px)", + "name_desc_gap": "名称/描述行距 (px)", + "row_radius": "行圆角 (px)", + "popup_width": "弹窗宽度 (px)", + "container_margin": "容器边距 (px)", +} +FONT_STACK = '"HarmonyOS Sans SC", "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", sans-serif' + + +class Tuner: + def __init__(self): + self.app = QApplication(sys.argv) + self.params = dict(DEFAULTS) + + # ---- 弹窗本体(真实类):去掉 Popup 标志 → 独立普通无边框窗,不随失焦消失 ---- + self.popup = SessionModePopup(None) + self.popup.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.FramelessWindowHint) + self.rows = self.popup.container.findChildren(_ModeRow) + icon_by_mode = {m: _popup_svg_path(ic) for m, _, _, ic in SessionModePopup.MODES} + for r in self.rows: + r._tune_pix = QPixmap(icon_by_mode[r.mode]) # 原始分辨率,重缩不糊 + + screen = self.app.primaryScreen().availableGeometry() + self.px = screen.center().x() - 300 + self.py = screen.center().y() - 200 + self.popup.move(self.px, self.py) + self.popup.show() + + # ---- 调参窗 ---- + self.win = QWidget() + self.win.setWindowTitle("会话模式弹窗调参 —— 调好后点「确定」") + form = QFormLayout(self.win) + form.setSpacing(8) + self.spins = {} + for key, (lo, hi) in RANGES.items(): + sp = QSpinBox() + sp.setRange(lo, hi) + sp.setValue(self.params[key]) + sp.valueChanged.connect(lambda v, k=key: self.on_change(k, v)) + self.spins[key] = sp + form.addRow(CN[key], sp) + + self.chk_selected = QCheckBox("显示选中态(预览)") + self.chk_selected.toggled.connect(lambda _: self.apply_all()) + form.addRow(self.chk_selected) + + btns = QHBoxLayout() + b_reset = QPushButton("重置默认") + b_reset.clicked.connect(self.reset) + b_ok = QPushButton("✅ 确定(写入日志并退出)") + b_ok.setStyleSheet("font-weight: bold;") + b_ok.clicked.connect(self.finish) + btns.addWidget(b_reset) + btns.addWidget(b_ok) + form.addRow(btns) + + self.win.resize(360, self.win.sizeHint().height()) + self.win.move(self.px - 380, self.py) + self.win.show() + + self.apply_all() + + # ---------- 实时渲染 ---------- + def on_change(self, k, v): + self.params[k] = v + self.apply_all() + + def apply_all(self): + p = self.params + popup = self.popup + popup.setFixedWidth(p["popup_width"]) + cl = popup.container.layout() + cl.setContentsMargins(p["container_margin"], p["container_margin"], + p["container_margin"], p["container_margin"]) + sel = self.chk_selected.isChecked() + for r in self.rows: + r.lbl_icon.setFixedSize(p["icon_size"], p["icon_size"]) + r.lbl_icon.setPixmap(r._tune_pix.scaled( + p["icon_size"], p["icon_size"], + Qt.AspectRatioMode.KeepAspectRatio, + Qt.TransformationMode.SmoothTransformation)) + lay = r.layout() + lay.setContentsMargins(p["row_margin_h"], p["row_margin_v"], + p["row_margin_h"] + 2, p["row_margin_v"]) + lay.setSpacing(p["icon_text_gap"]) + txt = lay.itemAt(1).layout() + if txt is not None: + txt.setSpacing(p["name_desc_gap"]) + name_color = "#1a73e8" if sel else "#333333" + r.lbl_name.setStyleSheet( + f"font-family: {FONT_STACK}; font-size: {p['name_font']}px;" + f"font-weight: bold; color: {name_color}; background: transparent;") + r.lbl_desc.setStyleSheet( + f"font-family: {FONT_STACK}; font-size: {p['desc_font']}px;" + f"color: #888888; background: transparent;") + bg = "#e8f0fe" if sel else "transparent" + r.setStyleSheet(f"background-color: {bg}; border-radius: {p['row_radius']}px;") + self.app.processEvents() + popup.adjust_popup_height() + popup.adjustSize() + + def reset(self): + self.params = dict(DEFAULTS) + for k, sp in self.spins.items(): + sp.blockSignals(True) + sp.setValue(self.params[k]) + sp.blockSignals(False) + self.apply_all() + + # ---------- 确定 → 写日志 ---------- + def finish(self): + log = os.path.join(os.path.dirname(__file__), "..", "data", "mode_popup_tune.json") + os.makedirs(os.path.dirname(log), exist_ok=True) + with open(log, "w", encoding="utf-8") as f: + json.dump(self.params, f, ensure_ascii=False, indent=2) + print("TUNE_LOG=" + os.path.abspath(log), flush=True) + print(json.dumps(self.params, ensure_ascii=False), flush=True) + self.app.quit() + + +def main(): + try: + Tuner() + QApplication.instance().exec() + except Exception: + err = traceback.format_exc() + try: + with open(os.path.join(os.path.dirname(__file__), "..", "data", + "tune_error.log"), "w", encoding="utf-8") as f: + f.write(err) + except OSError: + pass + QMessageBox.critical(None, "调参工具启动失败", err) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/tests/tune_model_popup.py b/tests/tune_model_popup.py new file mode 100644 index 0000000..b5d0f3b --- /dev/null +++ b/tests/tune_model_popup.py @@ -0,0 +1,399 @@ +# -*- coding: utf-8 -*- +"""模型选择弹窗 · 可视化调参工具 +运行: C:\\Users\\14890\\miniconda3\\envs\\haocode\\python.exe tests\\tune_model_popup.py +- 左侧:调参窗(改参数 → 右侧弹窗实时重渲染) +- 右侧:真实的 ModelSelectPopup 本体(独立窗口,点调参窗不会消失) +- 满意后点「确定」→ 参数 JSON 写入 data/model_popup_tune.json → 自动退出 +""" +import os +import sys +import json +import traceback + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" +os.environ.setdefault("HAOCODE_RENDER", "software") + +from PyQt6.QtWidgets import ( # noqa: E402 + QApplication, QWidget, QFormLayout, QHBoxLayout, QSpinBox, + QPushButton, QCheckBox, QLabel, QMessageBox, QComboBox, +) +from PyQt6.QtCore import Qt, QSize # noqa: E402 +from PyQt6.QtGui import QPixmap, QIcon, QPainter, QFont, QFontDatabase # noqa: E402 +from ui.views.main_window import ModelSelectPopup, MainWindow, _popup_svg_path # noqa: E402 (先于 QApplication) + +DEFAULTS = { + # —— 字体 —— + "font_family": "Microsoft YaHei", # 字体族(下拉选择;调参确认值) + # —— 模型行 —— + "item_font": 13, # 模型名字号(经 list_widget.setFont 生效) + "model_item_h": 27, # 模型行高 + "model_icon": 16, # 模型图标尺寸 + "model_icon_pad": 34, # 模型行左边距(图标透明左垫,仅作用模型行) + # —— 供应商行 —— + "header_height": 38, # 供应商行高(= widget 高;默认 38 = 当前代码实际行高) + "header_font": 13, # 供应商名字号 + "count_font": 10, # 数量字号 + "provider_svg": "provider.svg", # 供应商图标(3 个 SVG 可切换) + "header_icon": 16, # 供应商图标尺寸 + "header_icon_pad": 0, # 供应商图标水平位置(左侧留白,仅推图标与后续内容) + "header_icon_pad_v": 1, # 供应商图标垂直位置(正=下移,负=上移) + "arrow_size": 13, # 展开/收起箭头尺寸 + "header_hpad_l": 3, # 供应商行左边距(头部按钮左 margin) + # —— 整体 —— + "popup_width": 340, # 弹窗宽度 + "container_vmargin": 4, # 容器上下边距 +} +RANGES = { + "item_font": (10, 20), + "model_item_h": (18, 40), "model_icon": (8, 28), + "model_icon_pad": (0, 48), "header_height": (20, 60), "header_font": (9, 18), + "count_font": (8, 16), "header_icon": (10, 28), "header_icon_pad": (0, 30), + "header_icon_pad_v": (-10, 10), + "arrow_size": (8, 20), + "header_hpad_l": (0, 20), + "popup_width": (260, 420), "container_vmargin": (0, 12), +} +CN = { + "font_family": "字体(下拉选择)", + "item_font": "模型名字号 (px)", + "model_item_h": "模型行高 (px)", + "model_icon": "模型图标尺寸 (px)", "model_icon_pad": "模型行左边距 (px)", + "header_height": "供应商行高 (px)", "header_font": "供应商名字号 (px)", + "count_font": "数量字号 (px)", "header_icon": "供应商图标尺寸 (px)", + "provider_svg": "供应商图标(SVG 切换)", + "header_icon_pad": "供应商图标水平位置 (px)", + "header_icon_pad_v": "供应商图标垂直位置 (px,正=下移)", + "arrow_size": "箭头尺寸 (px)", "header_hpad_l": "供应商行左边距 (px)", + "popup_width": "弹窗宽度 (px)", + "container_vmargin": "容器上下边距 (px)", +} +SECTIONS = [ + ("字体", ["font_family"]), + ("模型行", ["item_font", "model_item_h", "model_icon", "model_icon_pad"]), + ("供应商行", ["header_height", "header_font", "count_font", + "provider_svg", "header_icon", "header_icon_pad", + "header_icon_pad_v", "arrow_size", "header_hpad_l"]), + ("整体", ["popup_width", "container_vmargin"]), +] +# 供应商图标候选(文件名, 显示名) +PROVIDER_SVGS = [ + ("provider.svg", "图标 1 · 服务器"), + ("provider2.svg", "图标 2 · 二级服务器"), + ("provider3.svg", "图标 3 · 服务器(细线)"), +] +FONT_STACK = '"HarmonyOS Sans SC", "Microsoft YaHei", "Noto Sans SC", sans-serif' + +QSS_TMPL = """ + * { + font-family: FONT_STACK; + } + #popup_container { + background-color: #ffffff; + border: 1px solid #dcdcdc; + border-radius: 12px; + } + #group_toggle_btn { background: transparent; border: none; } + #group_toggle_btn:hover { background-color: #f2f5f9; border-radius: 6px; } + #model_list { + border: none; + background: transparent; + outline: none; + } + #model_list::item { + font-family: FONT_STACK; + color: #333333; + font-weight: normal; + /* 实测本 Qt/PyQt6 构建下 ::item 仅 background-color/color 生效; + font-size/font 缩写/font-family/margin/padding/border-radius 全部无效—— + 字号走 setFont,行高走 sizeHint,边距走图标透明垫/按钮 margin */ + } + #model_list::item:hover { + background-color: #f0f4f9; + color: #111111; + } + #model_list::item:selected { + background-color: #e8f0fe; + color: #1a73e8; + font-weight: bold; + } + QScrollBar:vertical { + border: none; + background: transparent; + width: 5px; + margin: 12px 2px; + } + QScrollBar::handle:vertical { + background: #d0d0d0; + min-height: 20px; + border-radius: 3px; + } + QScrollBar::handle:vertical:hover { + background: #a0a0a0; + } + QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { + height: 0px; + } +""" + + +class Tuner: + def __init__(self): + self.app = QApplication(sys.argv) + self.params = dict(DEFAULTS) + + # ---- 弹窗本体(真实类 + 真实 config + 真实祖先上下文) ---- + # ⚠️ 保真关键:实际 App 中弹窗是 MainWindow 的子部件,会继承其全局样式表 + # (QListWidget::item 的 padding/margin/选中蓝条等);若 parent=None 渲染, + # 就会出“调试与实际不符”的矛盾 → 借 MainWindow.setup_stylesheet 把真实 + # 样式表套到宿主上,弹窗挂在宿主下渲染(与生产同构) + self._host = QWidget() + MainWindow.setup_stylesheet(self._host) + self._host.resize(1, 1) + self._host.move(-200, -200) + self._host.show() + cfg_path = os.path.join(os.path.dirname(__file__), "..", "data", "config.json") + with open(cfg_path, "r", encoding="utf-8") as f: + cfg = json.load(f) + self.popup = ModelSelectPopup(self._host, cfg) + self.popup.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.FramelessWindowHint) + self.list = self.popup.list_widget + self._tag_headers() + + screen = self.app.primaryScreen().availableGeometry() + self.px = screen.center().x() - 200 + self.py = screen.center().y() - 300 + self.popup.move(self.px, self.py) + self.popup.show() + + # ---- 调参窗 ---- + self.win = QWidget() + self.win.setWindowTitle("模型选择弹窗调参 —— 调好后点「确定」") + form = QFormLayout(self.win) + form.setSpacing(7) + self.spins = {} + self.combos = {} + self.broken = set() # 用户标记的“不生效”参数 + for title, keys in SECTIONS: + form.addRow(QLabel(f"—— {title} ——")) + for key in keys: + mark = QPushButton("不生效") + mark.setCheckable(True) + mark.setFixedWidth(58) + mark.setCursor(Qt.CursorShape.PointingHandCursor) + mark.setStyleSheet(""" + QPushButton { font-size: 11px; color: #888888; border: 1px solid #cccccc; + border-radius: 4px; background: #fafafa; } + QPushButton:checked { color: #ffffff; background: #d93025; border-color: #d93025; } + """) + mark.toggled.connect(lambda on, k=key: self.on_mark(k, on)) + row = QHBoxLayout() + row.setSpacing(4) + if key == "font_family": + combo = QComboBox() + fams = ["HarmonyOS Sans SC", "Microsoft YaHei", "Noto Sans SC", + "Segoe UI", "Arial", "Consolas", "SimHei", "PingFang SC"] + seen = set() + for fam in fams + sorted(QFontDatabase.families()): + if fam and fam not in seen: + seen.add(fam) + combo.addItem(fam) + combo.setCurrentText(self.params[key]) + combo.currentTextChanged.connect(lambda v, k=key: self.on_change(k, v)) + self.combos[key] = combo + row.addWidget(combo, 1) + elif key == "provider_svg": + combo = QComboBox() + for fname, cname in PROVIDER_SVGS: + combo.addItem(cname, fname) + combo.setCurrentIndex(max(combo.findData(self.params[key]), 0)) + combo.currentIndexChanged.connect( + lambda i, k=key, c=combo: + self.on_change(k, c.itemData(i) or "provider.svg")) + self.combos[key] = combo + row.addWidget(combo, 1) + else: + lo, hi = RANGES[key] + sp = QSpinBox() + sp.setRange(lo, hi) + sp.setValue(self.params[key]) + sp.valueChanged.connect(lambda v, k=key: self.on_change(k, v)) + self.spins[key] = sp + row.addWidget(sp, 1) + row.addWidget(mark) + form.addRow(CN[key], row) + + self.chk_selected = QCheckBox("显示选中行(预览)") + self.chk_selected.toggled.connect(self.on_toggle_selected) + form.addRow(self.chk_selected) + + btns = QHBoxLayout() + b_reset = QPushButton("重置默认") + b_reset.clicked.connect(self.reset) + b_ok = QPushButton("✅ 确定(写入日志并退出)") + b_ok.setStyleSheet("font-weight: bold;") + b_ok.clicked.connect(self.finish) + btns.addWidget(b_reset) + btns.addWidget(b_ok) + form.addRow(btns) + + self.win.resize(380, min(self.win.sizeHint().height(), screen.height() - 80)) + self.win.move(max(20, self.px - 400), self.py) + self.win.show() + + self.apply_all() + + # ---------- 启动时给头部标签打角色标签(此时尺寸还是默认值,判定可靠) ---------- + def _tag_headers(self): + for g in self.popup._groups: + hwd = self.list.itemWidget(g["header_item"]) + for lbl in hwd.findChildren(QLabel): + txt = lbl.text() + if txt == "": + # 默认: 供应商图标 16×16, 箭头 12×12 → 启动时按尺寸区分(此后不再变判定基准) + lbl.setProperty("_role", "icon" if lbl.size().width() >= 14 else "chevron") + elif txt.isdigit(): + lbl.setProperty("_role", "count") + else: + lbl.setProperty("_role", "name") + + # ---------- 实时渲染 ---------- + def on_mark(self, k, on): + if on: + self.broken.add(k) + else: + self.broken.discard(k) + + def on_change(self, k, v): + self.params[k] = v + self.apply_all() + + def _rebuild_icons(self): + p = self.params + pop = self.popup + pop._provider_pixmap = QPixmap(_popup_svg_path(p.get("provider_svg", "provider.svg"))).scaled( + p["header_icon"], p["header_icon"], + Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) + pop._arrow_expanded = QIcon(_popup_svg_path("chevron_down.svg")).pixmap(p["arrow_size"], p["arrow_size"]) + pop._arrow_collapsed = QIcon(_popup_svg_path("chevron_right.svg")).pixmap(p["arrow_size"], p["arrow_size"]) + m = QPixmap(_popup_svg_path("model.svg")).scaled( + p["model_icon"], p["model_icon"], + Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) + pad_w = p["model_icon"] + p["model_icon_pad"] + _pad = QPixmap(pad_w, p["model_icon"]) + _pad.fill(Qt.GlobalColor.transparent) + _pp = QPainter(_pad) + _pp.drawPixmap(p["model_icon_pad"], 0, m) + _pp.end() + pop._model_icon = QIcon(_pad) + # 关键:item 持有 QIcon 的拷贝,类属性替换后必须逐个 setIcon 才会更新(实测) + for g in pop._groups: + for it in g["model_items"]: + it.setIcon(pop._model_icon) + self.list.setIconSize(QSize(pad_w, p["model_icon"])) + + def apply_all(self): + p = self.params + pop = self.popup + family = p["font_family"] + stack = f'"{family}", "Microsoft YaHei", "Noto Sans SC", sans-serif' + pop.setFixedWidth(p["popup_width"]) + pop.container_layout.setContentsMargins(0, p["container_vmargin"], 0, p["container_vmargin"]) + self._rebuild_icons() + + for g in pop._groups: + hwd = self.list.itemWidget(g["header_item"]) + hwd.setFixedHeight(p["header_height"]) + g["header_item"].setSizeHint(QSize(0, p["header_height"])) # 行高 = widget 高 + btns = hwd.findChildren(QPushButton) + if btns: + bl = btns[0].layout() + if bl is not None: + bl.setContentsMargins(p["header_hpad_l"], 0, 8, 0) + for lbl in hwd.findChildren(QLabel): + role = lbl.property("_role") + if role == "icon": + pad = p["header_icon_pad"] + pv = p["header_icon_pad_v"] + # 2 倍 margin:抵消 label 行内居中吸收的一半增高 → 1:1 位移 + top, bot = 2 * max(pv, 0), 2 * max(-pv, 0) + lbl.setFixedSize(p["header_icon"] + pad, p["header_icon"] + top + bot) + lbl.setContentsMargins(pad, top, 0, bot) + lbl.setPixmap(pop._provider_pixmap) + elif role == "chevron": + lbl.setFixedSize(p["arrow_size"], p["arrow_size"]) + lbl.setPixmap(pop._arrow_expanded if g["expanded"] else pop._arrow_collapsed) + elif role == "name": + lbl.setStyleSheet( + f"font-family: {stack}; color: #555555; font-weight: normal;" + f"font-size: {p['header_font']}px; letter-spacing: 1px; background: transparent;") + elif role == "count": + lbl.setStyleSheet( + f"font-family: {stack}; color: #888888;" + f"font-size: {p['count_font']}px; font-weight: normal; background: transparent;") + for it in g["model_items"]: + it.setSizeHint(QSize(0, p["model_item_h"])) + + pop.setStyleSheet(QSS_TMPL + .replace("FONT_STACK", stack)) + # 模型行字体:widget 级 setFont(QSS ::item 的 font-size/缩写都不可靠,实测) + _f = self.list.font() + _f.setPixelSize(p["item_font"]) + _f.setFamily(family) + self.list.setFont(_f) + self.app.processEvents() + pop.adjust_popup_height() + pop.adjustSize() + + def on_toggle_selected(self, on): + if on: + for g in self.popup._groups: + if g["model_items"] and not g["model_items"][0].isHidden(): + self.list.setCurrentItem(g["model_items"][0]) + break + else: + self.list.clearSelection() + + def reset(self): + self.params = dict(DEFAULTS) + for k, sp in self.spins.items(): + sp.blockSignals(True) + sp.setValue(self.params[k]) + sp.blockSignals(False) + for k, cb in self.combos.items(): + cb.blockSignals(True) + cb.setCurrentText(self.params[k]) + cb.blockSignals(False) + self.apply_all() + + # ---------- 确定 → 写日志 ---------- + def finish(self): + log = os.path.join(os.path.dirname(__file__), "..", "data", "model_popup_tune.json") + os.makedirs(os.path.dirname(log), exist_ok=True) + payload = dict(self.params) + payload["not_working"] = sorted(self.broken) # 用户标记的不生效参数 + with open(log, "w", encoding="utf-8") as f: + json.dump(payload, f, ensure_ascii=False, indent=2) + print("TUNE_LOG=" + os.path.abspath(log), flush=True) + print(json.dumps(payload, ensure_ascii=False), flush=True) + self.app.quit() + + +def main(): + try: + Tuner() + QApplication.instance().exec() + except Exception: + err = traceback.format_exc() + try: + with open(os.path.join(os.path.dirname(__file__), "..", "data", + "tune_error.log"), "w", encoding="utf-8") as f: + f.write(err) + except OSError: + pass + QMessageBox.critical(None, "调参工具启动失败", err) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/tests/verify_math_render.py b/tests/verify_math_render.py new file mode 100644 index 0000000..c3d3e75 --- /dev/null +++ b/tests/verify_math_render.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +"""公式渲染端到端验证:真实会话消息 → 真实前端管线 → DOM 断言 + +运行: PYTHONIOENCODING=utf-8 QT_QPA_PLATFORM=offscreen python tests/verify_math_render.py + +铁律:不污染真实 DB —— 先把 data/chat_history.db 复制到临时文件,再指向副本。 +""" +import os +import sys +import json +import time +import shutil +import tempfile + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") +os.environ.setdefault("HAOCODE_RENDER", "software") +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" + +_REAL_DB = os.path.join(os.path.dirname(__file__), "..", "data", "chat_history.db") +_TMP_DB = os.path.join(tempfile.gettempdir(), f"haocode_verify_math_{os.getpid()}.db") +shutil.copyfile(_REAL_DB, _TMP_DB) + +import core.db_manager as _dbm # noqa: E402 +_dbm._DEFAULT_DB = _TMP_DB + +from PyQt6.QtWidgets import QApplication # noqa: E402 +from PyQt6.QtCore import QTimer # noqa: E402 +from ui.views.main_window import MainWindow # noqa: E402 + +app = QApplication(sys.argv) +results = [] +win = {"w": None, "sid": None} + +JS_QUERY = r"""(function(){ + var scope = document.getElementById('chat-container') || document.body; + var q = function(s){ return scope.querySelectorAll(s).length; }; + // 只取助手消息(user 消息按设计是纯文本,本来就不渲染公式) + var asst = scope.querySelectorAll('.message-wrapper.assistant'); + var asstScope = asst.length ? asst[asst.length - 1] : scope; + // 可见文本:剔除 katex-mathml(CSS 视觉隐藏的 MathML 层,内部保留原始 tex 属正常) + var clone = asstScope.cloneNode(true); + clone.querySelectorAll('.katex-mathml').forEach(function(e){ e.parentNode.removeChild(e); }); + var visTxt = clone.textContent || ''; + var codeTxt = ''; + asstScope.querySelectorAll('pre, code').forEach(function(e){ codeTxt += e.textContent + '\n'; }); + return { + katex: q('.katex'), + display: q('.katex-display'), + mathml: q('.katex-mathml'), + vislayer: q('.katex-html'), + leakedPlaceholder: visTxt.indexOf('@@K') !== -1, + rawBackslash: visTxt.indexOf('\\operatorname') !== -1, + bareBracketFormula: visTxt.indexOf('P_4=\\operatorname') !== -1, + codeHasDollar: codeTxt.indexOf('$x + y$') !== -1, + codeHasArr: codeTxt.indexOf('arr[0]') !== -1 + }; +})()""" + + +def check(name, cond, extra=""): + print((" PASS " if cond else " FAIL ") + name + ((" | " + str(extra)) if extra else "")) + results.append(bool(cond)) + + +def run_js(js, timeout_s=15): + r = {"v": None, "d": False} + + def cb(val): + if isinstance(val, str): + try: + val = json.loads(val) + except Exception: + pass + r["v"] = val + r["d"] = True + + b = win["w"].browser + if hasattr(b, "execute_js_async"): + b.execute_js_async(js, cb) + else: + b.page().runJavaScript(js, cb) + t0 = time.time() + while not r["d"] and time.time() - t0 < timeout_s: + app.processEvents() + time.sleep(0.05) + return r["v"] + + +def boot(): + w = MainWindow() + win["w"] = w + sid = None + for s in w.db.get_all_sessions(): + if s.get("title") == "公式渲染验收": + sid = s["id"] + break + if not sid: + print("FAIL 未找到「公式渲染验收」会话(先跑 tests/inject_math_demo.py)") + app.quit() + return + win["sid"] = sid + print(f"会话: {sid}") + w.load_messages_to_web(sid) + QTimer.singleShot(9000, phase_check) + + +def phase_check(): + for _ in range(40): + if run_js("window.jsReady === true ? 1 : 0", timeout_s=3) == 1: + break + time.sleep(0.5) + + r = run_js(JS_QUERY) + if not isinstance(r, dict): + print(f"FAIL DOM 查询失败: {r!r}") + app.quit() + return + print("\n DOM 统计: " + json.dumps(r, ensure_ascii=False)) + check("KaTeX 渲染出公式(.katex > 0)", r["katex"] > 0, f"katex={r['katex']}") + check("块公式 7 个(.katex-display == 7)", r["display"] == 7, f"display={r['display']}") + check("可视层存在(.katex-html > 0)", r["vislayer"] > 0, f"vislayer={r['vislayer']}") + check("无占位符泄漏", not r["leakedPlaceholder"]) + check("可见文本无原始 tex 残留", not r["rawBackslash"]) + check("无裸括号公式残留", not r["bareBracketFormula"]) + check("代码块内 $x + y$ 保持原样", r["codeHasDollar"]) + check("代码块内 arr[0] 保持原样", r["codeHasArr"]) + + try: + shot_path = os.path.join(os.path.dirname(__file__), "_tmp_math_render.png") + win["w"].browser.grab().save(shot_path) + print(f" 截图: {shot_path}") + except Exception as e: + print(f" 截图失败: {e}") + + print(f"\n===== {'ALL PASS' if all(results) else 'HAS FAILURES'}: {sum(results)}/{len(results)} =====") + try: + win["w"].close() + except Exception: + pass + app.quit() + + +QTimer.singleShot(400, boot) +QTimer.singleShot(120000, app.quit) +app.exec() +try: + os.remove(_TMP_DB) +except Exception: + pass +sys.exit(0 if all(results) else 1) diff --git a/tests/verify_onscreen.py b/tests/verify_onscreen.py new file mode 100644 index 0000000..dd85190 --- /dev/null +++ b/tests/verify_onscreen.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +"""on-screen 布局验证:正文 .md-segment 在真实窗口中的 offsetHeight。 +offscreen 没有布局(一切 h=0),必须在真实窗口验证。 +PASS 条件:流式中 + finish 后 正文段 h > 0。 +""" +import os, sys +os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu" +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from PyQt6.QtWidgets import QApplication +import PyQt6.QtWebEngineWidgets # noqa +from PyQt6.QtCore import QTimer +from ui.views.main_window import MainWindow + +app = QApplication(sys.argv) +w = MainWindow() +w.resize(1000, 700) +w.show() + +AUDIT = {} + +def js(expr, cb=None): + if cb: + w.browser.page().runJavaScript(expr, cb) + else: + w.browser.page().runJavaScript(expr) + +def on_ready(_res): + js(f"createMessage('vtest', 'assistant');") + QTimer.singleShot(300, phase_stream) + +def phase_stream(): + js("appendReasoning('vtest', '这是思考第一段内容。');") + body = "测试!测试!测试!\n\n这是第二段正文,用于验证布局高度。" + import json as _json + for ch in body: + js("appendToken('vtest', " + _json.dumps(ch) + ");") + QTimer.singleShot(1500, phase_mid_check) + +def phase_mid_check(_r=None): + js("""(function(){ + var seg = document.querySelector('#vtest .md-segment'); + var tc = document.querySelector('#vtest .think-content'); + return JSON.stringify({ + mid: true, + segH: seg ? seg.offsetHeight : -1, + segConnected: seg ? seg.isConnected : null, + segRect: seg ? Math.round(seg.getBoundingClientRect().height) : -1, + tcH: tc ? tc.offsetHeight : -1 + }); + })()""", on_mid) + +def on_mid(res): + AUDIT["mid"] = res + js("finishMessage('vtest');") + QTimer.singleShot(1200, phase_finish_check) + +def phase_finish_check(_r=None): + js("""(function(){ + var seg = document.querySelector('#vtest .md-segment'); + return JSON.stringify({ + fin: true, + segH: seg ? seg.offsetHeight : -1, + segText: seg ? seg.textContent.length : -1, + segDisplay: seg ? getComputedStyle(seg).display : null + }); + })()""", on_finish) + +def on_finish(res): + AUDIT["fin"] = res + print("MID =", AUDIT.get("mid")) + print("FIN =", AUDIT.get("fin")) + try: + import json + m, f = json.loads(AUDIT["mid"]), json.loads(AUDIT["fin"]) + ok = m["segH"] > 0 and m["tcH"] > 0 and f["segH"] > 0 and f["segText"] > 20 + print("===== " + ("PASS: 正文段真实布局高度正常" if ok else "FAIL: 正文段高度异常") + f" mid.segH={m['segH']} fin.segH={f['segH']} =====") + except Exception as e: + print("===== FAIL: 解析异常", e, "=====") + app.quit() + +QTimer.singleShot(2500, lambda: js("document.readyState", on_ready)) +QTimer.singleShot(30000, app.quit) +app.exec() diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/builtin_tools/__init__.py b/tools/builtin_tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/builtin_tools/pdf_reader.py b/tools/builtin_tools/pdf_reader.py new file mode 100644 index 0000000..477489c --- /dev/null +++ b/tools/builtin_tools/pdf_reader.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- +""" +PDF 读取工具 (pdf_reader) +========================= + +项目内第一个正式内置工具(builtin tool)。对外提供两项能力: + + 1. ``extract_pdf_text`` —— 提取 PDF 全部文本,按页结构化为提示词友好格式 + 2. ``extract_pdf_images`` —— 提取 PDF 内嵌的所有图片,逐张落地为 PNG + +代码规范与调用模式(约定) +-------------------------- +* 每个对外函数都带完整类型注解(参数 + 返回值)。 +* docstring 采用 ``Args / Returns / Raises`` 分段,逐参数说明含义与单位。 +* 将来的工具注册器(tools/registry.py,尚未实现)可通过 + ``inspect.signature`` + ``__doc__`` 自动反射出 OpenAI 格式的 Tool JSON Schema, + 因此本文件的函数签名与文档即"接口契约",请保持稳定、描述清晰。 + +当前阶段说明 +------------ +* 本工具暂**不接入** agent 的自动工具调用链路(registry 未实现), + 由 UI 附件流程(``ui/views/main_window.py`` 的 PDF 处理)直接 import 调用。 +* 参数与返回值已按"可被自动调用"的标准描述清楚,后续接线无需改动函数本身。 + +依赖与协议 +---------- +* 依赖 PyMuPDF(导入名 ``pymupdf``)。 +* PyMuPDF 为 **AGPL-3.0 / Artifex 商业** 双许可:分发或通过网络提供服务时, + 需按 AGPL 开源本项目或购买商业许可。纯自用/内部不分发则无约束。 +""" +import os +import uuid + +try: + import pymupdf # PyMuPDF >= 1.24 的官方导入名 +except ImportError: # 兼容旧版导入名 fitz + import fitz as pymupdf # type: ignore + + +# 单个 PDF 的大小上限(字节):超过则拒绝解析,避免内存与上下文爆炸 +PDF_MAX_BYTES = 20 * 1024 * 1024 # 20 MB + + +def _open_doc(path: str, max_bytes: int) -> "pymupdf.Document": + """内部辅助:做存在性/大小校验后打开 PDF,统一异常为 ValueError。""" + if not os.path.isfile(path): + raise ValueError("文件不存在") + size = os.path.getsize(path) + if size > max_bytes: + raise ValueError( + f"PDF 过大({size / 1024 / 1024:.1f} MB > {max_bytes / 1024 / 1024:.0f} MB)" + ) + try: + doc = pymupdf.open(path) + except Exception as e: # pymupdf 抛出的异常类型不固定,统一兜底 + raise ValueError(f"PDF 打开失败(可能损坏): {e}") + if doc.needs_pass: + doc.close() + raise ValueError("PDF 已加密,需要密码,暂不支持") + return doc + + +def extract_pdf_text(path: str, max_bytes: int = PDF_MAX_BYTES) -> tuple: + """提取 PDF 的全部文本,按页结构化。 + + 输出格式(无文本的空页会被跳过):: + + [第 1 页] + <该页文本> + + [第 2 页] + <该页文本> + + Args: + path: PDF 文件路径(绝对路径,或相对当前工作目录的路径)。 + max_bytes: 允许解析的最大文件字节数,默认 ``PDF_MAX_BYTES``(20MB)。 + + Returns: + ``(structured_text, page_count)`` 二元组: + + * ``structured_text`` (str): 按页拼接的结构化文本,各页之间以空行分隔; + 若整份 PDF 无文本则为空字符串 ``""``。 + * ``page_count`` (int): PDF 的总页数(含空页)。 + + Raises: + ValueError: 文件不存在 / 超过 ``max_bytes`` / PDF 损坏 / PDF 加密。 + """ + doc = _open_doc(path, max_bytes) + try: + page_count = doc.page_count + parts = [] + for i, page in enumerate(doc, 1): + text = page.get_text("text").strip() + if text: + parts.append(f"[第 {i} 页]\n{text}") + return "\n\n".join(parts), page_count + finally: + doc.close() + + +def extract_pdf_images(path: str, out_dir: str, max_bytes: int = PDF_MAX_BYTES) -> list: + """提取 PDF 内嵌的所有图片,逐张保存为 PNG。 + + 遍历每一页的内嵌图片(``page.get_images``),用 ``Pixmap`` 解码后写出; + CMYK 色彩空间会自动转换为 RGB(否则无法存为 PNG)。单张图片解码失败 + 会被跳过,不影响其余图片。 + + Args: + path: PDF 文件路径。 + out_dir: 图片输出目录(建议使用绝对路径)。不存在时自动创建。 + max_bytes: 允许解析的最大文件字节数,默认 ``PDF_MAX_BYTES``(20MB)。 + + Returns: + 图片元数据列表(按 ``(page, index)`` 升序),每项为 dict:: + + { + "page": int, # 所在页码(从 1 开始) + "index": int, # 该页内的第几张(从 1 开始) + "abs_path": str, # 落地 PNG 的绝对路径 + "mime": str, # 固定为 "image/png" + "size_kb": float, # 文件大小(KB,保留两位小数) + "width": int, # 图片像素宽 + "height": int, # 图片像素高 + } + + PDF 中无内嵌图片时返回空列表 ``[]``。 + + Raises: + ValueError: 文件不存在 / 超过 ``max_bytes`` / PDF 损坏 / PDF 加密。 + """ + doc = _open_doc(path, max_bytes) + os.makedirs(out_dir, exist_ok=True) + tag = uuid.uuid4().hex[:8] # 本批次文件名前缀,避免跨 PDF 撞名 + results = [] + try: + for page_num, page in enumerate(doc, 1): + for img_index, img_info in enumerate(page.get_images(full=True), 1): + xref = img_info[0] + try: + pix = pymupdf.Pixmap(doc, xref) + if pix.n - pix.alpha >= 4: # CMYK → RGB + pix = pymupdf.Pixmap(pymupdf.csRGB, pix) + fname = f"pdfimg_{tag}_p{page_num}_{img_index}.png" + abs_path = os.path.join(out_dir, fname) + pix.save(abs_path) + width, height = pix.width, pix.height + pix = None # 及时释放位图内存 + except Exception: + continue # 单张失败不影响整体 + results.append({ + "page": page_num, + "index": img_index, + "abs_path": abs_path, + "mime": "image/png", + "size_kb": round(os.path.getsize(abs_path) / 1024, 2), + "width": width, + "height": height, + }) + return results + finally: + doc.close() diff --git a/ui/views/__init__.py b/ui/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ui/views/bash_panel.py b/ui/views/bash_panel.py new file mode 100644 index 0000000..05cb975 --- /dev/null +++ b/ui/views/bash_panel.py @@ -0,0 +1,956 @@ +# -*- coding: utf-8 -*- +"""右侧任务面板:本次会话的 bash 任务监控(运行中 / 已完成) + +统一口径(与用户确认): + · 两栏 = 「运行中」/「已完成」(按状态分);两栏【同时可见、不互斥】, + 中间是可拖动分隔线(260px 宽若真做左右并排,每栏仅 ~130px, + 展开区放不下「参数 + 输出」两块列表,故用上下两栏)。 + 若要严格左右并排:把 _SPLIT_ORIENTATION 改成 Horizontal 即可。 + · 一次 bash = 一层(BashLayer),自上而下按【启动先后倒序】排列(P2-01: + 最新启动的任务在第一项;排序键恒为启动顺序,运行中→完成归位时 + 不按完成时间重排;已落库时间线无显式时间时,启动序号 = 消息链 + 顺序 + 时间线内顺序,稳定可复现) + · 单击层头 = 展开/收起;展开后分「参数」「输出」两块 + · 运行中:输出为 tool_bash 的实时流(缓冲上限 200KB,超出丢弃最旧并标注) + · 已完成:输出为「进入上下文的原文」(DB messages.timeline[].result,不截断) + · 范围永远是【当前会话】;切换会话跟随刷新 + · 面板【不自动收缩、也不自动展开】,开关就在面板自身: + 收起态 = 栏正中按钮;展开态 = 标题行右上角按钮(永远只有一个可动按钮) + · 🆕 左边缘可拖拽调宽(最小 200px);松手立即记录到 config.json["bash_panel_width"], + 下次按展开按钮自动恢复到记录的宽度 + · 「已出上下文」= 该层在最近一次压缩切点之前(其输出已不在 API 上下文里) +""" +import json +import os +import re + +from PyQt6 import QtCore, QtGui, QtWidgets + +LIVE_BUF_CAP = 200 * 1024 # 每条实时输出缓冲上限 +LAYER_LIMIT = 30 # 已完成栏默认只渲染最近 N 层 +_SPLIT_ORIENTATION = QtCore.Qt.Orientation.Vertical # 改 Horizontal = 左右并排 + +_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +_DUR_RE = re.compile(r"\((\d+(?:\.\d+)?)s\)\s*$") + +# ---------------------------------------------------------------- 宽度 +PANEL_W_DEFAULT = 260 # 首次运行的默认展开宽度 +PANEL_W_MIN = 200 # 🆕 拖拽最小宽度(再窄「参数/输出」两块就挤坏了) +PANEL_W_MAX = 560 # 绝对上限(实际还会受「不超过主窗口 50%」约束) +_CFG_KEY = "bash_panel_width" + +# P0-01:配置路径统一走 core.config_paths(环境变量 HAOCODE_CONFIG_FILE 优先) +from core.config_paths import config_path as _unified_config_path # noqa: E402 + + +def _cfg_path() -> str: + """配置文件路径(P0-01 统一入口:测试可用 HAOCODE_CONFIG_FILE 指向临时文件 → 绝不污染真配置)""" + return _unified_config_path() + + +def load_panel_width(default: int = PANEL_W_DEFAULT) -> int: + """读回上次拖拽记录的宽度;缺失/异常 → 默认值(并强制夹在 [MIN, MAX])""" + try: + with open(_cfg_path(), "r", encoding="utf-8") as f: + w = int(json.load(f).get(_CFG_KEY, default)) + except Exception: + return default + return max(PANEL_W_MIN, min(PANEL_W_MAX, w)) + + +def save_panel_width(w: int) -> bool: + """只改这一个键、其余配置原样保留;临时文件 + replace 原子写""" + p = _cfg_path() + try: + cfg = {} + if os.path.exists(p): + with open(p, "r", encoding="utf-8") as f: + cfg = json.load(f) or {} + cfg[_CFG_KEY] = int(w) + tmp = p + ".tmp" + with open(tmp, "w", encoding="utf-8") as f: + json.dump(cfg, f, ensure_ascii=False, indent=2) + os.replace(tmp, p) + return True + except Exception as e: + print(f"[UI]: 保存任务面板宽度失败: {e}") + return False + + +def _svg(name: str) -> str: + return os.path.join(_ROOT, "svg", name) + + +def _fmt_dur(sec) -> str: + try: + sec = float(sec) + except Exception: + return "" + return f"{sec:.1f}s" if sec < 60 else f"{int(sec // 60)}m{int(sec % 60)}s" + + +def _parse_dur(text): + """从上下文文本结尾的 (Ns) 里取耗时;取不到返回 None""" + m = _DUR_RE.search((text or "").strip()) + if not m: + return None + try: + return float(m.group(1)) + except Exception: + return None + + +def _cmd_of(args) -> str: + """args 可能是 JSON 字符串或 dict → 取出 bash 的 command""" + if isinstance(args, dict): + return args.get("command", "") or "" + try: + d = json.loads(args or "{}") + if isinstance(d, dict): + return d.get("command", "") or "" + except Exception: + pass + return str(args or "") + + +def _iter_bash_entries(timeline): + """timeline 可能是 JSON 字符串(DB)或 list[dict](内存)→ 产出 name=='bash' 的工具条目""" + data = timeline + if isinstance(timeline, str): + if not timeline.strip(): + return + try: + data = json.loads(timeline) + except Exception: + return + if not isinstance(data, list): + return + for e in data: + if isinstance(e, dict) and e.get("t") == "tool" and e.get("name") == "bash": + yield e + + +class _ClickFrame(QtWidgets.QFrame): + """整块可单击(单击即触发,不用双击)""" + clicked = QtCore.pyqtSignal() + + def mouseReleaseEvent(self, e): + if (e.button() == QtCore.Qt.MouseButton.LeftButton + and self.rect().contains(e.position().toPoint())): + self.clicked.emit() + super().mouseReleaseEvent(e) + + +# ====================================================================== +# 一层 = 一次 bash 执行 +# ====================================================================== +class BashLayer(QtWidgets.QFrame): + def __init__(self, call_id: str, command: str = "", parent=None): + super().__init__(parent) + self.setObjectName("bl_layer") + self.call_id = call_id + self.command = command or "" + self.ok = None # None=运行中 / True / False=已完成 + self.in_context = True + self.expanded = False + self.elapsed = 0 + self.timeout = 0 + self._live = "" + self._live_truncated = False + self._final = None + self._build() + self._apply_status() + + # ---------------- UI ---------------- + def _build(self): + v = QtWidgets.QVBoxLayout(self) + v.setContentsMargins(0, 0, 0, 0) + v.setSpacing(0) + + self.head = _ClickFrame() + self.head.setObjectName("bl_head") + self.head.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.head.setToolTip(self.command or "") + hl = QtWidgets.QHBoxLayout(self.head) + hl.setContentsMargins(8, 6, 8, 6) + hl.setSpacing(6) + + self.dot = QtWidgets.QLabel("●") + self.dot.setObjectName("bl_dot") + self.name = QtWidgets.QLabel("bash") + self.name.setObjectName("bl_name") + self.meta = QtWidgets.QLabel("") + self.meta.setObjectName("bl_meta") + self.tag = QtWidgets.QLabel("") + self.tag.setObjectName("bl_tag") + self.cmd = QtWidgets.QLabel(self._preview()) + self.cmd.setObjectName("bl_cmd") + self.cmd.setSizePolicy(QtWidgets.QSizePolicy.Policy.Ignored, + QtWidgets.QSizePolicy.Policy.Preferred) + self.chev = QtWidgets.QLabel("▸") + self.chev.setObjectName("bl_chev") + + hl.addWidget(self.dot, 0) + hl.addWidget(self.name, 0) + hl.addWidget(self.meta, 0) + hl.addWidget(self.tag, 0) + hl.addWidget(self.cmd, 1) + hl.addWidget(self.chev, 0) + v.addWidget(self.head) + + self.body = QtWidgets.QWidget() + self.body.setObjectName("bl_body") + bl = QtWidgets.QVBoxLayout(self.body) + bl.setContentsMargins(8, 0, 8, 8) + bl.setSpacing(4) + + self.lbl_arg = QtWidgets.QLabel("参数") + self.lbl_arg.setObjectName("bl_sect_label") + self.arg_box = self._code_box(80, wrap=True) + bl.addWidget(self.lbl_arg) + bl.addWidget(self.arg_box) + + self.lbl_out = QtWidgets.QLabel("输出") + self.lbl_out.setObjectName("bl_sect_label") + self.out_box = self._code_box(230, wrap=False) + bl.addWidget(self.lbl_out) + bl.addWidget(self.out_box) + + self.body.hide() + v.addWidget(self.body) + self.head.clicked.connect(self.toggle) + + def _code_box(self, max_h, wrap): + box = QtWidgets.QPlainTextEdit() + box.setObjectName("bl_code") + box.setReadOnly(True) + box.setMaximumHeight(max_h) + box.setLineWrapMode( + QtWidgets.QPlainTextEdit.LineWrapMode.WidgetWidth if wrap + else QtWidgets.QPlainTextEdit.LineWrapMode.NoWrap) + box.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) + box.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded) + box.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded if not wrap + else QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + return box + + def _preview(self) -> str: + s = " ".join((self.command or "").split()) + return s[:58] + ("…" if len(s) > 58 else "") + + # ---------------- 状态 ---------------- + def _apply_status(self): + if self.ok is None: + self.dot.setProperty("state", "run") + self.meta.setText(f"{self.elapsed}/{self.timeout}s" if self.timeout + else (f"{self.elapsed}s" if self.elapsed else "…")) + else: + self.dot.setProperty("state", "ok" if self.ok else "bad") + self.meta.setText(_fmt_dur(self.elapsed) if self.elapsed else "") + + if self.ok is not None and not self.in_context: + self.tag.setText("已出上下文") + self.tag.setProperty("kind", "out") + elif self.ok is None: + self.tag.setText("运行中") + self.tag.setProperty("kind", "run") + elif self.ok: + self.tag.setText("已完成") + self.tag.setProperty("kind", "ok") + else: + self.tag.setText("失败") + self.tag.setProperty("kind", "bad") + + for w in (self.dot, self.tag): + w.style().unpolish(w) + w.style().polish(w) + + def set_running(self, elapsed, timeout): + self.ok = None + self.elapsed = int(elapsed or 0) + self.timeout = int(timeout or 0) + self._apply_status() + if self.expanded: + self._render_output() + + def append_live(self, text: str): + if not text: + return + self._live += text + if len(self._live) > LIVE_BUF_CAP: + self._live = self._live[-LIVE_BUF_CAP:] + self._live_truncated = True + if self.expanded: + self._render_output() + + def set_finished(self, ok, text): + self.ok = bool(ok) + self._final = text or "" + d = _parse_dur(self._final) + if d is not None: + self.elapsed = d + self._apply_status() + if self.expanded: + self._render_output() + + def set_in_context(self, in_ctx: bool): + self.in_context = bool(in_ctx) + self._apply_status() + + # ---------------- 展开 ---------------- + def toggle(self): + self.expanded = not self.expanded + self.body.setVisible(self.expanded) + self.chev.setText("▾" if self.expanded else "▸") + if self.expanded: + self.arg_box.setPlainText(self.command or "(无参数)") + self._render_output() + + def _render_output(self): + if self.ok is None: + body = self._live + if self._live_truncated: + body = "…(实时缓冲已截断,仅保留最后 200KB)\n" + body + self.lbl_out.setText("输出(实时)") + self.out_box.setPlainText(body if body else "(等待输出…)") + sb = self.out_box.verticalScrollBar() + sb.setValue(sb.maximum()) + else: + self.lbl_out.setText("输出(进入上下文)") + self.out_box.setPlainText(self._final or "(无输出)") + + +# ====================================================================== +# 一栏:标题(可折叠)+ 层列表 +# ====================================================================== +class _Section(QtWidgets.QWidget): + def __init__(self, title, empty_hint, on_fold=None, parent=None): + super().__init__(parent) + self.empty_hint = empty_hint + self.folded = False + self._on_fold = on_fold # 回调:交面板做高度动画(抽屉式) + self._effect = None # 内容区淡入淡出用(按需创建,静止时移除) + self._head_hint = 0 # 头部行高缓存(恒定值) + v = QtWidgets.QVBoxLayout(self) + v.setContentsMargins(0, 0, 0, 0) + v.setSpacing(0) + + self.head = _ClickFrame() + self.head.setObjectName("bl_sect_head") + self.head.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + hl = QtWidgets.QHBoxLayout(self.head) + hl.setContentsMargins(10, 6, 8, 6) + hl.setSpacing(6) + self.chev = QtWidgets.QLabel("▾") + self.chev.setObjectName("bl_sect_chev") + self.title = QtWidgets.QLabel(title) + self.title.setObjectName("bl_sect_title") + self.count = QtWidgets.QLabel("0") + self.count.setObjectName("bl_sect_count") + hl.addWidget(self.chev, 0) + hl.addWidget(self.title, 0) + hl.addStretch(1) + hl.addWidget(self.count, 0) + v.addWidget(self.head) + + self.scroll = QtWidgets.QScrollArea() + self.scroll.setObjectName("bl_scroll") + self.scroll.setWidgetResizable(True) + self.scroll.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) + self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + # 🐛 修复:QScrollArea 的 viewport 默认按 palette base(白)自画背景, + # 会把父级 #f7f8fa 盖成白色 → 强制透明 + self.scroll.viewport().setStyleSheet("background: transparent;") + self.scroll.viewport().setAutoFillBackground(False) + self.host = QtWidgets.QWidget() + self.host.setObjectName("bl_host") + self.host.setAutoFillBackground(False) + self.lay = QtWidgets.QVBoxLayout(self.host) + self.lay.setContentsMargins(6, 2, 6, 6) + self.lay.setSpacing(5) + self.scroll.setWidget(self.host) + + # 🆕 「下面填充的 bash 层」整块放进 body:折叠/展开动画只针对它, + # 头部行(self.head)高度永远不变 + self.body = QtWidgets.QWidget() + self.body.setObjectName("bl_body") + self.body.setAutoFillBackground(False) + bv = QtWidgets.QVBoxLayout(self.body) + bv.setContentsMargins(0, 0, 0, 0) + bv.setSpacing(0) + bv.addWidget(self.scroll, 1) + + self.hint = QtWidgets.QLabel("") + self.hint.setObjectName("bl_hint") + self.hint.setWordWrap(True) + bv.addWidget(self.hint) + v.addWidget(self.body, 1) + + self.head.clicked.connect(self._toggle_fold) + self._set_hint(self.empty_hint) + # 🐛 头部行高【硬固定】:收起时 body 被隐、布局里只剩 head,而 QFrame 默认 + # 竖直策略可伸长 → head 会被拉满整栏(实测 793px 巨条 = 「按钮变大很高」) + self._head_hint = max(16, self.head.sizeHint().height()) + self.head.setFixedHeight(self._head_hint) + + # ---------------- 头部行高(收起/展开恒定的那一行)---------------- + def head_height(self) -> int: + # 🐛 必须缓存 sizeHint:若用实时 self.head.height(),会形成正反馈—— + # 头部被压矮 → minimumSizeHint 变小 → splitter 允许更矮 → 头部再被压矮… + if self._head_hint <= 0: + self._head_hint = max(16, self.head.sizeHint().height()) + return self._head_hint + def minimumSizeHint(self): + # 🐛 关键修复:默认最小高 ≈ 113px(头部 + QScrollArea 最小高 + 提示语), + # QSplitter 完全没法把本栏收缩 → 收起后留一大块空白(用户报的 bug)。 + # 改为「只剩头部行」,内容区允许被压到 0(超出部分天然被父级裁切)。 + return QtCore.QSize(0, self.head_height()) + + # ---------------- 内容区透明度(动画帧驱动)---------------- + def set_body_opacity(self, op: float): + op = max(0.0, min(1.0, float(op))) + if op >= 0.999: + self._drop_effect() + return + if self._effect is None: + self._effect = QtWidgets.QGraphicsOpacityEffect(self.body) + self.body.setGraphicsEffect(self._effect) + self._effect.setOpacity(op) + + def _drop_effect(self): + """去掉离屏渲染开销(静止时不挂 effect)""" + if self.body.graphicsEffect() is not None: + self.body.setGraphicsEffect(None) + self._effect = None + + def show_body(self): + self.body.setVisible(True) + self.scroll.setVisible(True) + self.hint.setVisible(bool(self.hint.text())) + + def hide_body(self): + self.body.setVisible(False) + + def set_folded(self, folded: bool): + """应用折叠状态(高度由面板的 splitter 动画负责)""" + self.folded = bool(folded) + self.chev.setText("▸" if self.folded else "▾") + if self.folded: + self._drop_effect() + else: + self.show_body() + self.set_body_opacity(1.0) + + def _toggle_fold(self): + if self._on_fold is not None: + self._on_fold(self) # 交面板:状态切换 + 高度抽屉动画 + return + self.set_folded(not self.folded) + self.scroll.setVisible(not self.folded) + self.hint.setVisible(not self.folded and bool(self.hint.text())) + + def _set_hint(self, text): + self.hint.setText(text or "") + self.hint.setVisible(not self.folded and bool(text)) + + def set_layers(self, layers, total=None): + """重排层(复用同一批 widget → 实时缓冲不丢)""" + while self.lay.count(): + it = self.lay.takeAt(0) + w = it.widget() + if w is not None: + w.setParent(None) + for w in layers: + self.lay.addWidget(w) + w.show() + self.lay.addStretch(1) + self.count.setText(str(len(layers))) + total = len(layers) if total is None else total + if total > len(layers): + self._set_hint(f"仅显示最近 {len(layers)} 层(本会话共 {total} 层)") + else: + self._set_hint("" if layers else self.empty_hint) + + +# ====================================================================== +# 右侧任务面板(外壳,镜像左侧边栏) +# ====================================================================== +class _ResizeHandle(QtWidgets.QWidget): + """面板左边缘的拖拽手柄(4px 隐形条,hover 才亮;光标 SizeHor)""" + + W = 4 + + def __init__(self, panel): + super().__init__(panel) + self._panel = panel + self.setObjectName("bl_resize_handle") + # QWidget 子类必须显式开启才会绘制样式表背景(hover 高亮靠它) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_StyledBackground, True) + self.setCursor(QtCore.Qt.CursorShape.SizeHorCursor) + self.setStyleSheet("#bl_resize_handle:hover { background: #dfe3ea; }") + self.setToolTip("拖拽调整任务面板宽度(最小 %dpx)" % PANEL_W_MIN) + self._drag = False + + def mousePressEvent(self, e): + if e.button() == QtCore.Qt.MouseButton.LeftButton: + self._drag = True + self._panel._drag_begin(e.globalPosition().x()) + e.accept() + return + super().mousePressEvent(e) + + def mouseMoveEvent(self, e): + if self._drag: + self._panel._drag_to_global_x(e.globalPosition().x()) + e.accept() + return + super().mouseMoveEvent(e) + + def mouseReleaseEvent(self, e): + if self._drag: + self._drag = False + self._panel._commit_drag_width() + e.accept() + return + super().mouseReleaseEvent(e) + + +class BashPanel(QtWidgets.QWidget): + W_EXPAND = PANEL_W_DEFAULT + W_COLLAPSE = 52 + W_MIN = PANEL_W_MIN + W_MAX = PANEL_W_MAX + FOLD_MS = 200 # 栏折叠/展开时长(与 ModelSelectPopup.DRAWER_DURATION 一致) + FOLD_STEP = 16 # 帧间隔(与 DRAWER_STEP 一致,~60fps) + MIN_BODY_H = 60 # 展开后「下面填充的层」至少保留的高度 + + def __init__(self, parent=None): + super().__init__(parent) + self.setObjectName("right_sidebar") + # 🐛 关键修复:QWidget 的自定义子类默认【不绘制样式表背景/边框】 + # (#sidebar 是原生 QWidget 实例所以正常,BashPanel 是子类所以失效—— + # 表现为右侧栏底色变白、左侧分隔线丢失、空间感消失) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_StyledBackground, True) + # 🆕 展开宽度:优先用上次拖拽记录的值(config.json: bash_panel_width) + self.W_EXPAND = load_panel_width() + self._end_w = self.W_EXPAND + self._drag_right = None + self._w = self.W_COLLAPSE + self.setFixedWidth(self._w) # 默认收起 + self.collapsed = True + self._target = True + self._anim = None + self._session_id = None + self._db = None + self._layers = {} # call_id -> BashLayer + self._order = [] # 稳定启动序号(0=最早启动;追加顺序 = 启动先后) + self._running = set() + self._done = set() + self._saved_h = [120, 520] # 每栏收起前的高度(展开时恢复) + self._fold = None # 折叠动画状态 + self._fold_timer = QtCore.QTimer(self) + self._fold_timer.setInterval(self.FOLD_STEP) + self._fold_timer.timeout.connect(self._fold_tick) + self._build() + # 🆕 左边缘拖拽手柄(浮在最左 4px,收起/展开两种状态都在) + self._handle = _ResizeHandle(self) + self._handle.setFixedWidth(_ResizeHandle.W) + self._handle.raise_() + + # ---------------- 外壳 ---------------- + def _build(self): + v = QtWidgets.QVBoxLayout(self) + v.setContentsMargins(0, 0, 0, 0) + v.setSpacing(0) + self.stack = QtWidgets.QStackedWidget() + v.addWidget(self.stack) + + # ---- 展开页(顶部留白 20px + 36px 标题行,与左侧栏完全对齐)---- + self.expand_page = QtWidgets.QWidget() + ev = QtWidgets.QVBoxLayout(self.expand_page) + ev.setContentsMargins(0, 20, 0, 12) + ev.setSpacing(0) + + self.header = QtWidgets.QWidget() + self.header.setObjectName("bl_panel_head") + self.header.setFixedHeight(36) + hl = QtWidgets.QHBoxLayout(self.header) + hl.setContentsMargins(10, 0, 10, 0) + hl.setSpacing(6) + self.lbl_title = QtWidgets.QLabel("任务面板") + self.lbl_title.setObjectName("bl_panel_title") + self.lbl_total = QtWidgets.QLabel("") + self.lbl_total.setObjectName("bl_panel_total") + # 🐛 修复双按钮:面板内不再自带收起按钮(唯一开关 = 顶部工具栏按钮), + # 与左侧栏的区别:左侧栏的开关在栏内,右侧栏的开关在顶部(原「导出」位置) + hl.addWidget(self.lbl_title, 0) + hl.addWidget(self.lbl_total, 0) + hl.addStretch(1) + # 🆕 展开态开关:标题行右端(与左侧栏 collapse_btn 完全同规格) + self.fold_btn = QtWidgets.QPushButton("") + self.fold_btn.setObjectName("collapse_btn") + self.fold_btn.setIcon(QtGui.QIcon(_svg("panel_right.svg"))) + self.fold_btn.setIconSize(QtCore.QSize(16, 16)) + self.fold_btn.setFixedSize(28, 28) + self.fold_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.fold_btn.setToolTip("收起任务面板") + hl.addWidget(self.fold_btn, 0) + ev.addWidget(self.header) + ev.addSpacing(10) + + self.splitter = QtWidgets.QSplitter(_SPLIT_ORIENTATION) + self.splitter.setObjectName("bl_splitter") + self.splitter.setChildrenCollapsible(False) + self.splitter.setHandleWidth(5) + self.sec_running = _Section("运行中", "暂无正在运行的 bash", on_fold=self._toggle_section) + self.sec_done = _Section("已完成", "本会话还没有已完成的 bash", on_fold=self._toggle_section) + self.splitter.addWidget(self.sec_running) + self.splitter.addWidget(self.sec_done) + # 🆕 底部留白占位:最后一栏收起时由它吸收余量(否则栏头会被顶到面板底部, + # 或被拉伸成巨条) + self.spacer = QtWidgets.QWidget() + self.spacer.setObjectName("bl_spacer") + self.spacer.setAttribute(QtCore.Qt.WidgetAttribute.WA_StyledBackground, True) + self.spacer.setStyleSheet("#bl_spacer { background: transparent; }") + self.splitter.addWidget(self.spacer) + self.splitter.setCollapsible(2, True) # 占位层允许被压到 0 + self.splitter.setSizes(self._saved_h + [0]) + _h2 = self.splitter.handle(2) + if _h2 is not None: # 占位层上方的分隔条:不可拖、不可见 + _h2.setEnabled(False) + _h2.setStyleSheet("background: transparent;") + ev.addWidget(self.splitter, 1) + self.stack.addWidget(self.expand_page) + + # ---- 收起页:栏正中一个展开按钮(与左侧栏 collapse_expand_btn 完全同规格)---- + self.collapse_page = QtWidgets.QWidget() + cl = QtWidgets.QVBoxLayout(self.collapse_page) + cl.setContentsMargins(0, 0, 0, 0) + cl.addStretch(1) + self.expand_btn = QtWidgets.QPushButton("") + self.expand_btn.setObjectName("collapse_btn") + self.expand_btn.setIcon(QtGui.QIcon(_svg("panel_right.svg"))) + self.expand_btn.setIconSize(QtCore.QSize(18, 18)) + self.expand_btn.setFixedSize(34, 34) + self.expand_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.expand_btn.setToolTip("展开任务面板") + cl.addWidget(self.expand_btn, 0, QtCore.Qt.AlignmentFlag.AlignHCenter) + cl.addStretch(1) + self.stack.addWidget(self.collapse_page) + + # 两个按钮分居 QStackedWidget 两页 → 任何时刻可见开关恒为 1 个 + self.stack.setCurrentWidget(self.collapse_page) + self.fold_btn.clicked.connect(self.toggle) + self.expand_btn.clicked.connect(self.toggle) + + # ---------------- 两栏折叠/展开:抽屉式高度动画(头部行高恒定)---------------- + def _toggle_section(self, sec): + """点栏头 → 只把「下面填充的 bash 层」的高度收到 0,头部行高度不变""" + self._finish_fold() # 连点:先把上一段动画落定 + idx = 0 if sec is self.sec_running else 1 + sizes = self.splitter.sizes() + avail = sum(sizes) + head_h = sec.head_height() + other = self.sec_done if idx == 0 else self.sec_running + if not sec.folded and not other.folded: + # 即将收起 + 另一栏展开 → 记住当前高度(用于下次展开恢复); + # 另一栏已收起时不记(此时本栏高度是「余量」而非用户意图高度) + self._saved_h[idx] = max(sizes[idx], head_h + self.MIN_BODY_H) + sec.set_folded(not sec.folded) + target = self._layout_targets(actor=sec) + if not sec.folded: # 展开 → 内容从透明开始淡入 + sec.show_body() + sec.set_body_opacity(0.0) + self._sync_handle() + if avail <= 0 or self.splitter.width() <= 0: + self.splitter.setSizes(target) + self._end_fold_visual(sec) + return + self._fold = {"sec": sec, "from": list(sizes), "to": target, "t": 0.0} + self._fold_timer.start() + + def _layout_targets(self, actor=None): + """统一布局策略(层从顶部堆叠): + · 收起栏 = 只剩头部行 + · 本次被点开的那栏 → 用记录的高度 + · 余量只由「展开着的已完成」吸收(填满到底部); + 若「已完成」已收起 → 余量进底部留白(栏头紧跟上方内容) + """ + s = self.splitter.sizes() + avail = sum(s) + hr = self.sec_running.head_height() + hd = self.sec_done.head_height() + h0, h1 = s[0], s[1] + run_f, done_f = self.sec_running.folded, self.sec_done.folded + if run_f: + h0 = hr + if done_f: + h1 = hd + if (not run_f) and actor is self.sec_running: + h0 = self._saved_h[0] + if (not done_f) and actor is self.sec_done: + h1 = self._saved_h[1] + if not done_f: # 已完成展开 → 吃掉全部余量 + floor0 = hr if run_f else hr + self.MIN_BODY_H + h1 = max(hd + self.MIN_BODY_H, avail - max(h0, floor0)) + h0 = max(hr if run_f else hr + self.MIN_BODY_H, h0) + h1 = max(hd if done_f else hd + self.MIN_BODY_H, h1) + return [h0, h1, max(0, avail - h0 - h1)] + + def _fold_tick(self): + """抽屉式每帧:ease-out 三次方插值高度 + 内容淡入淡出(同模型选择窗口)""" + d = self._fold + if d is None: + self._fold_timer.stop() + return + d["t"] = min(1.0, d["t"] + self.FOLD_STEP / self.FOLD_MS) + e = 1.0 - (1.0 - d["t"]) ** 3 + a, b = d["from"], d["to"] + self.splitter.setSizes([int(round(x + (y - x) * e)) for x, y in zip(a, b)]) + sec = d["sec"] + sec.set_body_opacity((1.0 - e) if sec.folded else e) + if d["t"] >= 1.0: + self._finish_fold() + + def _finish_fold(self): + self._fold_timer.stop() + d = self._fold + if d is None: + return + self._fold = None + self.splitter.setSizes(d["to"]) + self._end_fold_visual(d["sec"]) + + def _end_fold_visual(self, sec): + if sec.folded: + sec.set_body_opacity(0.0) + sec.hide_body() # 隐藏后连离屏渲染也省了 + else: + sec.show_body() + sec.set_body_opacity(1.0) # 置 1 → 自动移除 effect + + def _sync_handle(self): + """两栏都展开 → 中间分隔条可拖;任一栏收起 → 禁用(避免「刚收起又被拖大」)""" + h = self.splitter.handle(1) + if h is not None: + ok = not (self.sec_running.folded or self.sec_done.folded) + h.setEnabled(ok) + h.setCursor(QtCore.Qt.CursorShape.SplitVCursor if ok + else QtCore.Qt.CursorShape.ArrowCursor) + + def _repin_fold(self): + """窗口/面板尺寸变化后,按统一策略重新钉住(收起栏 = 只剩头部行)""" + if self._fold is not None or self.collapsed: + return + if not (self.sec_running.folded or self.sec_done.folded): + return + want = self._layout_targets() + if want != self.splitter.sizes(): + self.splitter.setSizes(want) + + def get_panelWidth(self): + return self._w + + def set_panelWidth(self, w): + self._w = int(w) + self.setFixedWidth(int(w)) + + panelWidth = QtCore.pyqtProperty(int, fget=get_panelWidth, fset=set_panelWidth) + + def toggle(self): + self._set_collapsed(not self._target) + + def _set_collapsed(self, collapsed: bool): + self._stop_anim() + self._target = collapsed + self.stack.setCurrentWidget( + self.collapse_page if collapsed else self.expand_page) + start_w = self.width() + # 展开时若记录的宽度超出当前窗口可承受范围 → 夹一下 + self._end_w = self.W_COLLAPSE if collapsed else self._clamp_w(self.W_EXPAND) + end_w = self._end_w + self._anim = QtCore.QPropertyAnimation(self, b"panelWidth") + self._anim.setDuration(260) + self._anim.setStartValue(float(start_w)) + self._anim.setEndValue(float(end_w)) + self._anim.setEasingCurve(QtCore.QEasingCurve.Type.InOutCubic) + self._anim.finished.connect(self._on_anim_finished) + self._anim.start() + + def _on_anim_finished(self): + self.setFixedWidth(self.W_COLLAPSE if self._target else self._end_w) + self.collapsed = self._target + self._stop_anim() + + # ---------------- 宽度拖拽(右边界固定,左边界跟随鼠标)---------------- + def _stop_anim(self): + if self._anim is not None: + try: + self._anim.stop() + self._anim.deleteLater() + except Exception: + pass + self._anim = None + + def _clamp_w(self, w) -> int: + """夹在 [W_MIN, min(W_MAX, 主窗口 50%)](最小宽度就在这里生效)""" + hi = self.W_MAX + par = self.parentWidget() + if par is not None and par.width() > 0: + hi = min(hi, max(self.W_MIN, int(par.width() * 0.5))) + return max(self.W_MIN, min(hi, int(w))) + + def resizeEvent(self, e): + super().resizeEvent(e) + h = getattr(self, "_handle", None) + if h is not None: + h.setGeometry(0, 0, _ResizeHandle.W, self.height()) + h.raise_() + self._repin_fold() + + def _drag_begin(self, gx): + self._stop_anim() + # 动画中途按下 → 以当前实际宽度为准确定状态 + self.collapsed = self.width() <= self.W_COLLAPSE + 8 + self._target = self.collapsed + self.stack.setCurrentWidget( + self.collapse_page if self.collapsed else self.expand_page) + self._drag_right = self.mapToGlobal(QtCore.QPoint(self.width(), 0)).x() + + def _drag_to_global_x(self, gx): + if self._drag_right is None: + return + w = self._clamp_w(self._drag_right - int(gx)) + if self.collapsed: + if w <= self.W_COLLAPSE + 8: + return # 还在收起条内拖 → 不响应 + self.collapsed = False # 从收起态直接拖开 → 立即进展开态 + self._target = False + self.stack.setCurrentWidget(self.expand_page) + self._w = w + self.setFixedWidth(w) + + def _commit_drag_width(self): + self._drag_right = None + if self.collapsed: + return + self.W_EXPAND = self._w + if save_panel_width(self._w): + print(f"[UI]: 任务面板宽度 -> {self._w}px(已记录,下次展开自动使用)") + + # ---------------- 数据 ---------------- + def set_session(self, session_id, db, active_stream=None): + """切换会话 → 全量重建。已完成来自 DB 链;未落库的在跑任务来自 active_stream。""" + self._session_id = session_id + self._db = db + self._layers.clear() + self._order.clear() + self._running.clear() + self._done.clear() + + # ① DB:本会话链上的历史 bash(标注是否还在上下文内) + try: + chain = db.get_message_chain(session_id) if db else [] + except Exception: + chain = [] + mark_idx = -1 + for i, m in enumerate(chain): + if m.get("role") == "compaction": + mark_idx = i + for i, m in enumerate(chain): + msg_id = m.get("id") or "" + for e in _iter_bash_entries(m.get("timeline")): + cid = e.get("id") or f"dbmsg_{msg_id}_{i}" + if cid in self._layers: + continue + lay = BashLayer(cid, _cmd_of(e.get("args"))) + lay.set_finished(bool(e.get("ok")), e.get("result") or "") + lay.set_in_context(i > mark_idx) + self._layers[cid] = lay + self._order.append(cid) + self._done.add(cid) + + # ② 内存:正在进行的这一轮(包括已开始但未落库、以及刚结束未落库的) + for e in _iter_bash_entries((active_stream or {}).get("timeline")): + cid = e.get("id") + if not cid or cid in self._layers: + continue + lay = BashLayer(cid, _cmd_of(e.get("args"))) + if e.get("ok") is None: + lay.set_running(0, 0) + if e.get("result"): + lay.append_live(str(e.get("result"))) # 尽力回放(上游上限 4000 字符) + self._running.add(cid) + else: + lay.set_finished(bool(e.get("ok")), e.get("result") or "") + self._done.add(cid) + self._layers[cid] = lay + self._order.append(cid) + + self._refresh() + + def _refresh(self): + # P2-01:两栏都按【启动顺序倒序】显示(最新启动在第一项)。 + # 排序键恒为 self._order 中的位置(稳定启动序号)—— + # · 运行中→已完成 的任务仍占原启动位置(绝不按完成时间重排); + # · 已完成栏的限量窗口 = 最近启动的 LAYER_LIMIT 个(窗口成员不变,仅显示顺序反转)。 + # 重排走 set_layers(复用同一批 BashLayer 实例):展开/折叠状态、实时输出、 + # 代码框水平/垂直滚动值、两栏 section 滚动位置全部保持(同对象,不重建)。 + run_ids = [c for c in self._order if c in self._running] + done_ids = [c for c in self._order if c in self._done] + self.sec_running.set_layers([self._layers[c] for c in reversed(run_ids)]) + shown = done_ids[-LAYER_LIMIT:] + self.sec_done.set_layers([self._layers[c] for c in reversed(shown)], total=len(done_ids)) + self.lbl_total.setText(f"共 {len(self._order)}" if self._order else "") + + # ---------------- 事件 ---------------- + def on_started(self, call_id, name, args): + if name != "bash" or not call_id or call_id in self._layers: + return + lay = BashLayer(call_id, _cmd_of(args)) + lay.set_running(0, 0) + self._layers[call_id] = lay + self._order.append(call_id) + self._running.add(call_id) + self._refresh() + + def on_output(self, call_id, text): + lay = self._layers.get(call_id) + if lay is not None and lay.ok is None: + lay.append_live(text) + + def on_timed(self, call_id, elapsed, timeout): + lay = self._layers.get(call_id) + if lay is not None and lay.ok is None: + lay.set_running(elapsed, timeout) + + def on_finished(self, call_id, name, ok, text): + lay = self._layers.get(call_id) + if lay is None: + if name != "bash" or not call_id: + return + lay = BashLayer(call_id, "") + self._layers[call_id] = lay + self._order.append(call_id) + self._running.discard(call_id) + self._done.add(call_id) + lay.set_finished(bool(ok), text or "") + lay.set_in_context(True) + self._refresh() + + def clear_all(self): + self._layers.clear() + self._order.clear() + self._running.clear() + self._done.clear() + self._refresh() + + # ---------------- 测试/调试辅助 ---------------- + def layer_ids(self, which="all"): + # running/done 返回真实显示顺序(启动倒序);"all" = 原始启动序号(正序) + if which == "running": + return [c for c in self._order if c in self._running][::-1] + if which == "done": + return [c for c in self._order if c in self._done][::-1] + return list(self._order) diff --git a/ui/views/chat_bridge.py b/ui/views/chat_bridge.py new file mode 100644 index 0000000..2d32338 --- /dev/null +++ b/ui/views/chat_bridge.py @@ -0,0 +1,230 @@ +# chat_bridge.py +import json +from PyQt6.QtCore import QObject, pyqtSlot, pyqtSignal + +class ChatBridge(QObject): + # 信号定义 + regenerate_clicked = pyqtSignal(str) # 携带需要重新回答的助手消息ID + branch_switch_clicked = pyqtSignal(str, int) # 分支切换信号 (msg_id, direction: -1 为上一条, 1 为下一条) + delete_message_requested = pyqtSignal(str) # 删除消息信号 (msg_id) + attachment_clicked = pyqtSignal(str) + scroll_changed = pyqtSignal(float, float, float) # 页面 scrollY / scrollHeight / innerHeight + # 🆕 P1-01 渲染窗口:前端请求换页(fire-and-forget;响应经 run_js 推送) + window_page_requested = pyqtSignal(str, str, str, int) # (session_id, direction, boundary_id, generation) + + def __init__(self, page, channel, js_runner=None): + """ + :param page: QWebEnginePage 实例(QtWebEngine 路径) + :param channel: QWebChannel 实例(QtWebEngine 路径) + :param js_runner: 可选 JS 执行函数(WebView2 路径:script -> None) + """ + super().__init__() + self.page = page + self._js_runner = js_runner + self.window = None # 🆕 P1-01:MainWindow 引用(分页请求需要访问 DB/代次) + if channel is not None: + # 将自身注册到 channel 中,前端可通过 bridge 对象调用 + channel.registerObject("bridge", self) + print("ChatBridge被初始化") + + def run_js(self, script: str): + if self._js_runner is not None: + self._js_runner(script) + elif self.page is not None: + self.page.runJavaScript(script) + else: + print("[ChatBridge] run_js: 无可用执行通道") + + # ---------- 消息构造 (Python -> JS) ---------- + + def create_message(self, msg_id: str, role: str, text: str = "", sender_name: str = "", branch_info: dict = None): + """ + 在前端创建一条消息容器 + :param branch_info: 格式如 {"current": 0, "total": 2},若为 None 则不显示分支切换器 + """ + safe_text = json.dumps(text) + safe_name = json.dumps(sender_name) + safe_branch = json.dumps(branch_info) if branch_info else "null" + self.run_js(f"createMessage('{msg_id}', '{role}', {safe_text}, {safe_name}, {safe_branch});") + + def create_long_message(self, msg_id: str, role: str, text: str, sender_name: str = ""): + safe_text = json.dumps(text) + safe_name = json.dumps(sender_name) + size_kb = round(len(text.encode('utf-8')) / 1024, 2) + self.run_js(f"createLongMessage('{msg_id}', '{role}', {safe_text}, {safe_name}, {size_kb});") + + def create_user_message_with_attachments(self, msg_id: str, text: str, attachments: list): + safe_text = json.dumps(text) + safe_attachments = json.dumps(attachments) + self.run_js(f"createUserMessageWithAttachments('{msg_id}', {safe_text}, {safe_attachments});") + + # ---------- 流式输出 (Python -> JS) ---------- + def append_token(self, msg_id: str, token: str): + safe_token = json.dumps(token) + self.run_js(f"appendToken('{msg_id}', {safe_token});") + + def append_reasoning(self, msg_id: str, token: str): + safe_token = json.dumps(token) + self.run_js(f"appendReasoning('{msg_id}', {safe_token});") + + def finish_message(self, msg_id: str): + self.run_js(f"finishMessage('{msg_id}');") + + # ---------- 工具执行事件 (Python -> JS) —— pi tool_execution_* ---------- + def tool_execution_started(self, msg_id: str, call_id: str, name: str, args: str): + """工具开始执行:前端在时间线当前位置插入 chip(带 call_id 对号入座)""" + safe_call = json.dumps(call_id) + safe_name = json.dumps(name) + safe_args = json.dumps(args) + self.run_js(f"toolExecutionStarted('{msg_id}', {safe_call}, {safe_name}, {safe_args});") + + def tool_execution_updated(self, msg_id: str, call_id: str, text: str): + """工具执行中的增量输出(bash stdout 等)""" + safe_call = json.dumps(call_id) + safe_text = json.dumps(text) + self.run_js(f"toolExecutionUpdated('{msg_id}', {safe_call}, {safe_text});") + + def tool_execution_timed(self, msg_id: str, call_id: str, + elapsed: int, timeout: int): + """🆕 bash 运行中每秒读秒:气泡摘要行刷新 N/Ts""" + safe_call = json.dumps(call_id) + self.run_js(f"toolExecutionTimed('{msg_id}', {safe_call}, " + f"{int(elapsed)}, {int(timeout)});") + + def tool_execution_finished(self, msg_id: str, call_id: str, name: str, ok: bool, text: str): + """工具执行结束:chip 按 call_id 标记成功/失败并显示结果摘要""" + safe_call = json.dumps(call_id) + safe_name = json.dumps(name) + safe_text = json.dumps(text) + self.run_js(f"toolExecutionFinished('{msg_id}', {safe_call}, {safe_name}, {str(ok).lower()}, {safe_text});") + + # ---------- 时间线 (Python -> JS) ---------- + def restore_streaming_timeline(self, msg_id: str, timeline_json: str): + """切回进行中的会话:按时间线 JSON 恢复 思考/文本/工具 块(续流)""" + safe_json = json.dumps(timeline_json) + self.run_js(f"restoreStreamingTimeline('{msg_id}', {safe_json});") + + def render_timeline_history(self, msg_id: str, timeline_json: str): + """历史消息:按时间线 JSON 静态渲染 思考/文本/工具 块""" + safe_json = json.dumps(timeline_json) + self.run_js(f"renderTimelineHistory('{msg_id}', {safe_json});") + + # ---------- 压缩可视化 (Python -> JS) ---------- + def compaction_started(self, msg_id: str, path: str): + """压缩开始 → 当前消息时间线内显示「上下文压缩」思考气泡(与深度思考同款)""" + safe_id = json.dumps(msg_id or "") + safe_path = json.dumps(path or "") + self.run_js(f"compactionStarted({safe_id}, {safe_path});") + + def compaction_finished(self, msg_id: str, payload: dict): + """压缩完成 → 同一气泡原地更新(前→后 token + 摘要全文)""" + safe_id = json.dumps(msg_id or "") + safe_payload = json.dumps(payload or {}, ensure_ascii=False) + self.run_js(f"compactionFinished({safe_id}, {safe_payload});") + + # ---------- 系统提示 (Python -> JS) ---------- + def show_note(self, text: str): + """在聊天流中插入一条居中系统提示(如:已自动压缩上下文)""" + safe_text = json.dumps(text) + self.run_js(f"showSystemNote({safe_text});") + + # ---------- 错误与清理 (Python -> JS) ---------- + def show_error(self, msg_id: str, error_text: str): + safe_text = json.dumps(error_text) + self.run_js(f"showError('{msg_id}', {safe_text});") + + def clear_chat(self): + self.run_js("clearChat();") + + def delete_message(self, msg_id: str): + """通知前端从 DOM 中移除特定消息""" + self.run_js(f"deleteMessage('{msg_id}');") + + # ---------- 历史记录渲染 ---------- + + def render_history_message(self, msg_id: str, role: str, content: str, reasoning: str = "", branch_info: dict = None): + self.create_message(msg_id, role, content, branch_info=branch_info) + if reasoning: + safe_reasoning = json.dumps(reasoning) + self.run_js(f"insertThinkBlock('{msg_id}', {safe_reasoning});") + self.finish_message(msg_id) + + def show_welcome(self): + self.run_js("showWelcome();") + + # ---------- 会话加载界面 (Python -> JS) ---------- + def show_loading(self): + """显示统一加载界面(图标 + 从左到右扫描条)""" + self.run_js("showLoadingOverlay();") + + def hide_loading(self): + """隐藏加载界面(带渐变退场)""" + self.run_js("hideLoadingOverlay();") + + # ---------- 🆕 P1-01 渲染窗口 (Python -> JS) ---------- + + def rw_config(self, mode: str, size: int): + """注入渲染窗口配置(JS 就绪后、首次加载前调用一次)""" + self.run_js("rwApplyConfig(" + json.dumps( + {"render_window_mode": mode, "render_window_size": size}) + ");") + + def rw_begin(self, session_id: str, generation: int, total: int): + """开始一轮窗口化加载:清屏 + 重同步 (session, generation)""" + self.run_js(f"rwBegin({json.dumps(session_id)}, {int(generation)}, {int(total)});") + + def rw_init_window(self, session_id: str, generation: int, chain_len: int, items): + """初始窗口就绪:items = [(msg_id, chain_index), ...](旧→新)""" + payload = json.dumps({ + "sessionId": session_id, + "generation": int(generation), + "chainLen": int(chain_len), + "items": [{"id": mid, "chainIndex": ix} for mid, ix in items], + }, ensure_ascii=False) + self.run_js(f"rwInitWindow({payload});") + + def rw_note_live(self, session_id: str, generation: int, msg_id: str, + chain_index: int, chain_len: int = -1): + """新消息追加进窗口(发送用户消息 / 助手占位 / 切回续流)。 + 未持久化/未知 → chain_index=-1;未知链长 → chain_len=-1(JS 保持旧值)""" + self.run_js(f"rwNoteLive({json.dumps(session_id)}, {int(generation)}, " + f"{json.dumps(msg_id)}, {int(chain_index)}, {int(chain_len)});") + + def rw_page_response(self, payload: dict): + """分页响应推送:payload 由 MainWindow._on_window_page_request 构造""" + self.run_js("rwPageResponse(" + json.dumps(payload, ensure_ascii=False) + ");") + + # ---------- 交互 Slot (JS -> Python) ---------- + + @pyqtSlot(str, str, str, int) + def onRequestWindowPage(self, session_id, direction, boundary_msg_id, generation): + """🆕 P1-01:前端请求换页(direction: older/newer)。 + fire-and-forget:结果由 Python 经 rwPageResponse 推送(双引擎同构)。""" + self.window_page_requested.emit(session_id, direction, boundary_msg_id, int(generation)) + + @pyqtSlot(str) + def onRegenerateClicked(self, msg_id): + """前端点击“重新生成”按钮时触发""" + print(f"Regenerate requested for: {msg_id}") + self.regenerate_clicked.emit(msg_id) + + @pyqtSlot(str, int) + def onBranchSwitch(self, msg_id, direction): + """前端点击分支切换箭头时触发""" + print(f"Branch switch requested for: {msg_id}, direction: {direction}") + self.branch_switch_clicked.emit(msg_id, direction) + + @pyqtSlot(str) + def onDeleteMessageClicked(self, msg_id): + """接收 JS 发来的确认删除指令(🌟 已去重,原先定义了两次)""" + print(f"Delete requested for: {msg_id}") + self.delete_message_requested.emit(msg_id) + + @pyqtSlot(str) + def onAttachmentClicked(self, meta_json_str): + """接收 JS 发来的附件点击事件""" + self.attachment_clicked.emit(meta_json_str) + + @pyqtSlot(float, float, float) + def onScrollChanged(self, y, content_h, client_h): + """接收前端上报的页面滚动信息,用于自定义滚动条位置/滑块长度镜像""" + self.scroll_changed.emit(y, content_h, client_h) diff --git a/ui/views/custom_web_page.py b/ui/views/custom_web_page.py new file mode 100644 index 0000000..0571d37 --- /dev/null +++ b/ui/views/custom_web_page.py @@ -0,0 +1,77 @@ +from PyQt6.QtWebEngineCore import QWebEnginePage, QWebEngineScript, QWebEngineProfile +from PyQt6.QtCore import QUrl +from PyQt6.QtGui import QDesktopServices + +class CustomWebPage(QWebEnginePage): + """ + 自定义网页类,集中约束内置 QtWebEngine 的不合规浏览器行为: + + 1. 拦截所有外部链接跳转,改用系统默认浏览器打开; + 2. 禁用 Ctrl/Meta + 滚轮 及 Ctrl + +/-/0 快捷键的页面缩放 + (浏览器式缩放对桌面聊天工具无意义且易误触)。 + """ + def __init__(self, profile_or_parent=None, parent=None): + # P1-03:兼容两种调用 —— 新式 CustomWebPage(profile, parent) 与旧式 CustomWebPage(parent)。 + # profile 缺省 None → QtWebEngine 默认 profile;main_window 传入本实例独立 profile。 + if isinstance(profile_or_parent, QWebEngineProfile): + profile, par = profile_or_parent, parent + else: + profile, par = None, profile_or_parent + if parent is not None: + raise TypeError("CustomWebPage(profile, parent) 或 CustomWebPage(parent)") + if profile is not None: + super().__init__(profile, par) + else: + super().__init__(par) + self._inject_zoom_lock() + + def _inject_zoom_lock(self): + """ + 🌟 缩放锁定:通过网页脚本在文档创建阶段(DocumentCreation)注入监听, + 使用隔离世界(ApplicationWorld)注入,不污染页面自身逻辑。 + + 原理:Chromium 的 Ctrl+滚轮缩放会先经过页面 wheel 事件的 + preventDefault() 判定 —— 页面阻止即取消缩放,这是地图类应用 + 禁用缩放的官方做法;Ctrl+=/-/0 快捷键同理用 keydown 拦截。 + """ + script = QWebEngineScript() + script.setName("haocode_zoom_lock") + script.setInjectionPoint(QWebEngineScript.InjectionPoint.DocumentCreation) + script.setWorldId(QWebEngineScript.ScriptWorldId.ApplicationWorld) + script.setRunsOnSubFrames(True) + script.setSourceCode(r""" +(function () { + if (window.__haocodeZoomLocked) return; // 防重复注入 + window.__haocodeZoomLocked = true; + + // 1) Ctrl/Meta + 滚轮 → 阻止缩放 + document.addEventListener('wheel', function (e) { + if (e.ctrlKey || e.metaKey) { + e.preventDefault(); + e.stopPropagation(); + } + }, { passive: false }); // 必须非被动,preventDefault 才有效 + + // 2) Ctrl + = / + / - / 0 → 阻止缩放快捷键 + document.addEventListener('keydown', function (e) { + if ((e.ctrlKey || e.metaKey) && ['+', '-', '=', '0'].indexOf(e.key) >= 0) { + e.preventDefault(); + } + }, false); +})(); +""") + self.scripts().insert(script) + + def acceptNavigationRequest(self, url: QUrl, nav_type, is_main_frame): + # 如果是本地文件(我们自己的 index.html),允许加载 + if url.scheme() == "file": + return True + + # 如果是外部链接(http/https),用系统浏览器打开 + if url.scheme() in ["http", "https"]: + print(f"[System]: 在系统浏览器中打开 -> {url.toString()}") + QDesktopServices.openUrl(url) + return False # 阻止在应用内跳转 + + # 其他情况(如 javascript:void(0)),允许 + return True \ No newline at end of file diff --git a/ui/views/debug_window.py b/ui/views/debug_window.py new file mode 100644 index 0000000..db6c76d --- /dev/null +++ b/ui/views/debug_window.py @@ -0,0 +1,214 @@ +# -*- coding: utf-8 -*- +"""独立调试器窗口 —— 与主窗口/项目树完全解耦(顶层窗口,parent=None) + +功能: + Tab1「调试会话」 实时 tail data/debug_session.log,按来源着色: + [USER]蓝 / [AGENT]绿 / [APP]灰 / [SYS]紫 + Tab2「应用日志」 实时 tail diag.log + compaction_diag.log + stream_diag.log + 底部输入框 用户输入观察到的情况,回车 → 记 [USER] + 按钮 暂停显示 / 清空会话日志 / 打开日志文件 + +控制: 代理写 data/debug_window.cmd (show/hide),主窗口 2s 轮询后调用本窗口。 +本文件不 import main_window,可独立离屏测试。 +""" +import os +import re +from PyQt6.QtCore import Qt, QTimer +from PyQt6.QtGui import QTextCharFormat, QTextCursor, QColor +from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPlainTextEdit, + QLineEdit, QPushButton, QCheckBox, QLabel, + QTabWidget, QMessageBox) +from core.debug_log import DEBUG_LOG_PATH, DEBUG_CMD_PATH, debug_log + +_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +_APP_LOGS = [ + ("DIAG", os.path.join(_ROOT, "diag.log")), + ("COMPACT", os.path.join(_ROOT, "compaction_diag.log")), + ("STREAM", os.path.join(_ROOT, "stream_diag.log")), +] + +_TAG_COLORS = {"USER": "#2563eb", "AGENT": "#16a34a", + "APP": "#6b7280", "SYS": "#9333ea"} +_LINE_RE = re.compile(r"^\[([^\]]+)\]\s+\[([A-Z]+)\]\s?(.*)$") + + +class _TailReader: + """单文件增量读取器(文件被截断时自动重置偏移)""" + + def __init__(self, path: str): + self.path = path + self.offset = 0 + + def read_new(self) -> str: + try: + if not os.path.exists(self.path): + return "" + size = os.path.getsize(self.path) + if size < self.offset: # 被清空/轮转 + self.offset = 0 + if size == self.offset: + return "" + with open(self.path, "r", encoding="utf-8", errors="replace") as f: + f.seek(self.offset) + data = f.read() + self.offset = size + return data + except Exception: + return "" + + +class DebugWindow(QWidget): + def __init__(self): + super().__init__(None) # 顶层独立窗口 + self.setWindowTitle("Haocode 调试器") + self.resize(780, 540) + self.setWindowFlags(Qt.WindowType.Window) + # 默认停靠主屏右上角,避免被主窗口挡住 + try: + from PyQt6.QtGui import QGuiApplication + _geo = QGuiApplication.primaryScreen().availableGeometry() + self.move(_geo.right() - self.width() - 24, _geo.top() + 24) + except Exception: + pass + + self._paused = False + self._announced = False + + root = QVBoxLayout(self) + root.setContentsMargins(8, 8, 8, 8) + + # ---- Tab 容器 ---- + self._tabs = QTabWidget() + self._view_session = QPlainTextEdit() + self._view_session.setReadOnly(True) + self._view_session.setMaximumBlockCount(3000) + self._view_session.setLineWrapMode( + QPlainTextEdit.LineWrapMode.NoWrap) + self._view_app = QPlainTextEdit() + self._view_app.setReadOnly(True) + self._view_app.setMaximumBlockCount(3000) + self._view_app.setLineWrapMode(QPlainTextEdit.LineWrapMode.NoWrap) + self._tabs.addTab(self._view_session, "调试会话") + self._tabs.addTab(self._view_app, "应用日志") + root.addWidget(self._tabs, 1) + + # ---- 状态行 ---- + status = QLabel(f"会话日志: {DEBUG_LOG_PATH}\n" + f"控制文件: {DEBUG_CMD_PATH} (show/hide)") + status.setStyleSheet("color:#888; font-size:11px;") + status.setWordWrap(True) + root.addWidget(status) + + # ---- 按钮行 ---- + btn_row = QHBoxLayout() + self._chk_pause = QCheckBox("暂停显示(记录继续)") + self._chk_pause.toggled.connect(self._on_pause_toggled) + self._chk_top = QCheckBox("置顶") + self._chk_top.toggled.connect(self._on_top_toggled) + btn = QPushButton("清空会话日志") + btn.clicked.connect(self._on_clear) + btn2 = QPushButton("打开日志文件") + btn2.clicked.connect(self._on_open_file) + btn_row.addWidget(self._chk_pause) + btn_row.addWidget(self._chk_top) + btn_row.addStretch(1) + btn_row.addWidget(btn) + btn_row.addWidget(btn2) + root.addLayout(btn_row) + + # ---- 用户输入行 ---- + in_row = QHBoxLayout() + hint = QLabel("观察到的情况(回车记录为 [USER]):") + hint.setStyleSheet("color:#555; font-size:12px;") + self._input = QLineEdit() + self._input.setPlaceholderText("例如: 上下文标签显示 40.5k,刚发送了「接着输出」") + self._input.returnPressed.connect(self._on_submit) + in_row.addWidget(hint) + in_row.addWidget(self._input, 1) + root.addLayout(in_row) + + # ---- 文件增量读取器 + 轮询 ---- + self._reader_session = _TailReader(DEBUG_LOG_PATH) + self._readers_app = {tag: _TailReader(p) for tag, p in _APP_LOGS} + self._timer = QTimer(self) + self._timer.setInterval(500) + self._timer.timeout.connect(self._tick) + self._timer.start() + + # ==================== 轮询 ==================== + def _tick(self): + try: + if not self._announced: + self._announced = True + debug_log("调试窗口开启", "SYS") + if not self._paused: + data = self._reader_session.read_new() + if data: + self._append_tagged(self._view_session, data) + for tag, _p in _APP_LOGS: + d = self._readers_app[tag].read_new() + if d: + self._view_app.appendPlainText( + f"── [{tag}] {os.path.basename(_p)} ──") + self._view_app.appendPlainText(d.rstrip("\n")) + except Exception: + pass + + def _append_tagged(self, view: QPlainTextEdit, data: str): + cur = view.textCursor() + cur.movePosition(QTextCursor.MoveOperation.End) + for line in data.splitlines(): + if not line: + continue + m = _LINE_RE.match(line) + color = _TAG_COLORS.get(m.group(2)) if m else None + fmt = QTextCharFormat() + if color: + fmt.setForeground(QColor(color)) + cur.insertText(line + "\n", fmt) + view.setTextCursor(cur) + view.ensureCursorVisible() + + # ==================== 交互 ==================== + def _on_submit(self): + text = self._input.text().strip() + if not text: + return + debug_log(text, "USER") + self._input.clear() + + def _on_pause_toggled(self, checked: bool): + self._paused = checked + + def _on_top_toggled(self, checked: bool): + f = self.windowFlags() + if checked: + f |= Qt.WindowType.WindowStaysOnTopHint + else: + f &= ~Qt.WindowType.WindowStaysOnTopHint + self.setWindowFlags(f) + self.show() # setWindowFlags 会隐藏窗口,需重新 show + + def _on_clear(self): + if QMessageBox.question( + self, "清空会话日志", + "将清空 debug_session.log(USER/AGENT/APP 记录全部丢失),确定?") \ + != QMessageBox.StandardButton.Yes: + return + try: + open(DEBUG_LOG_PATH, "w", encoding="utf-8").close() + self._reader_session.offset = 0 + self._view_session.clear() + debug_log("会话日志已清空", "SYS") + except Exception: + pass + + def _on_open_file(self): + try: + import subprocess + if os.name == "nt": + os.startfile(DEBUG_LOG_PATH) # noqa + else: + subprocess.Popen(["xdg-open", DEBUG_LOG_PATH]) + except Exception: + pass diff --git a/ui/views/main_window.py b/ui/views/main_window.py new file mode 100644 index 0000000..9365e9e --- /dev/null +++ b/ui/views/main_window.py @@ -0,0 +1,6222 @@ +import sys +from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6.QtWebEngineWidgets import QWebEngineView +# 引入我们刚才写的线程工作类 +from core.llm_engine import AgentWorker, ChatWorker, TitleWorker +import os +import json +from ui.views.custom_web_page import CustomWebPage +from PyQt6.QtCore import QUrl # 🌟 新增:用于加载本地 HTML + +# ========== 流式诊断日志(排查显示问题的根本手段,写 stream_diag.log) ========== +import time as _diag_time +DIAG_LOG_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "stream_diag.log") + +def diag_log(line: str): + try: + t = _diag_time.time() + with open(DIAG_LOG_PATH, "a", encoding="utf-8") as f: + f.write(f"[{_diag_time.strftime('%H:%M:%S', _diag_time.localtime(t))}." + f"{int(t * 1000) % 1000:03d}] {line}\n") + except Exception: + pass +import uuid # <--- 🌟 加上这一行! +from ui.views.chat_bridge import ChatBridge # 🌟 新增:引入桥接器 +from core import renderer_backend as _renderer_backend # P1-03 渲染器矩阵(纯 stdlib) +# 🆕 WebView2 后端(A′ 双轨:Windows 首选,任何失败自动回落 QtWebEngine) +# P1-03:非 Windows 永不导入 core.webview2(不触达 pythonnet/Win32 API/WebView2 DLL/taskkill) +_wv2mod = None +if sys.platform == "win32": + try: + from core import webview2 as _wv2mod + except Exception as _wv2_imp_err: # pythonnet 缺失等 + _wv2mod = None + print(f"[WV2] 后端不可用(回落 QtWebEngine): {_wv2_imp_err}") +from ui.views.system_tools.screen_capture import ScreenCaptureOverlay # 🌟 截图覆盖层 +from ui.views.system_tools.global_hotkey import GlobalHotkeyThread # 🌟 全局热键监听 +from ui.views.system_tools import desktop_session # P1-04 平台会话/能力路由(纯 stdlib) +from core.db_manager import DBManager +from core.debug_log import debug_log, poll_debug_cmd # 🆕 调试窗口文件协议(独立于项目树) +from ui.views.system_tools.file_reader import read_text_file, BINARY_EXTS # 🌟 文本/代码文件读取(编码探测+二进制探测) +from ui.views.bash_panel import BashPanel # 🆕 右侧任务面板(bash 任务监控) +from tools.builtin_tools.pdf_reader import extract_pdf_text, extract_pdf_images # 🌟 PDF 工具(文本+图片解析) +from PyQt6 import QtWidgets, QtCore, QtGui +# -*- coding: utf-8 -*- +""" +设置窗口 (SettingsWindow) - 完整改进版 +修复了: +1. 右侧按钮卡边问题(优化内边距) +2. 居中虚化遮罩(固定卡片尺寸 + 全屏半透明背景) +3. 模型垂直排列(改用 QVBoxLayout) +""" +class AttachmentPreviewOverlay(QtWidgets.QWidget): + """🌟 原生附件预览覆盖层 (全屏半透明遮罩 + 居中卡片 + 现代UI + 一键复制) + + 🆕 必须是无边框顶层窗口(独立 HWND):WebView2 是原生子窗,永远绘制在主窗口 + 内所有 Qt 控件之上 —— 若预览层是 bg_widget 的子控件,遮罩盖不住 webview + (webview 显得特别亮),居中的卡片会被压到 webview 下面。独立顶层窗口 + + WA_TranslucentBackground(逐像素 alpha)才能盖住原生子窗。 + """ + def __init__(self, meta_dict, parent=None, siblings=None, index=0, att_data=None): + super().__init__(parent) + self.meta = meta_dict + self._siblings = siblings if siblings else [meta_dict] # 同组可翻页图片(单图时即自身) + self._index = index + self._att_data = att_data # PDF 附件字典(提供时显示“选择”按钮并回写 selected_images) + # 🆕 无边框顶层 Tool 窗(不入任务栏,Windows 上默认浮在父窗之上) + self._main = parent.window() if parent is not None else None + self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint | QtCore.Qt.WindowType.Tool) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose, True) + if self._main is not None: + # 完全覆盖主窗口(含边框);移动/大小变化由 eventFilter 跟随 + self.setGeometry(self._main.frameGeometry()) + self._main.installEventFilter(self) + + # 灰色半透明遮罩 + self._overlay_color = QtGui.QColor(0, 0, 0, 100) + + # 主卡片 + self.card = QtWidgets.QFrame(self) + self.card.setObjectName("preview_card") + self.card.setStyleSheet(""" + #preview_card { background: #ffffff; border-radius: 12px; border: 1px solid #dcdcdc; } + """) + + lay = QtWidgets.QVBoxLayout(self.card) + lay.setContentsMargins(20, 16, 20, 20) + lay.setSpacing(12) + + # 🌟 统一的现代滚动条样式 + modern_scrollbar_qss = """ + QScrollBar:vertical { + border: none; background: transparent; width: 8px; margin: 0px; + } + QScrollBar::handle:vertical { + background: #d0d0d0; min-height: 40px; border-radius: 4px; + } + QScrollBar::handle:vertical:hover { + background: #a0a0a0; + } + QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { + height: 0px; border: none; background: transparent; + } + QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: transparent; + } + QScrollBar:horizontal { + border: none; background: transparent; height: 8px; margin: 0px; + } + QScrollBar::handle:horizontal { + background: #d0d0d0; min-width: 40px; border-radius: 4px; + } + QScrollBar::handle:horizontal:hover { + background: #a0a0a0; + } + QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { + width: 0px; border: none; background: transparent; + } + QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: transparent; + } + """ + + # 标题栏 + title_lay = QtWidgets.QHBoxLayout() + title_label = QtWidgets.QLabel(self.meta.get("name", "文本内容")) + self._title_label = title_label + title_label.setStyleSheet(""" + font-family: "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", sans-serif; + font-size: 16px; font-weight: bold; color: #222; background: transparent; + """) + title_lay.addWidget(title_label) + title_lay.addStretch() + + # 🌟 核心新增:如果是长文本,添加“复制”按钮 + if self.meta.get("type") != "image": + self.btn_copy = QtWidgets.QPushButton("复制") + self.btn_copy.setFixedSize(64, 28) + self.btn_copy.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self._set_copy_btn_style(self.btn_copy, False) # 设置初始样式 + self.btn_copy.clicked.connect(self._on_copy_clicked) + title_lay.addWidget(self.btn_copy) + title_lay.addSpacing(8) # 复制按钮和关闭按钮之间留点空隙 + + # PDF 解析图:添加“选择”按钮(选中后绿色边框,行为对标复制按钮) + if self.meta.get("type") == "image" and self._att_data is not None: + self.btn_select = QtWidgets.QPushButton("选择") + self.btn_select.setFixedSize(64, 28) + self.btn_select.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self._set_select_btn_style(self._is_current_selected()) + self.btn_select.clicked.connect(self._on_select_clicked) + title_lay.addWidget(self.btn_select) + title_lay.addSpacing(8) # 选择按钮和关闭按钮之间留点空隙 + + btn_x = QtWidgets.QPushButton("✕") + btn_x.setFixedSize(28, 28) + btn_x.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn_x.setStyleSheet(""" + QPushButton { + font-family: "Microsoft YaHei UI", sans-serif; + background: transparent; border: none; border-radius: 14px; color: #999; font-size: 15px; + } + QPushButton:hover { background: #eee; color: #333; } + """) + btn_x.clicked.connect(self.close_overlay) + title_lay.addWidget(btn_x) + lay.addLayout(title_lay) + + # 内容区 (图片或文本) + if self.meta.get("type") == "image": + import os + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + abs_path = os.path.join(root_dir, self.meta.get("local_path", "")) + + scroll = QtWidgets.QScrollArea() + scroll.setWidgetResizable(True) + scroll.setStyleSheet(f""" + QScrollArea {{ border: 1px solid #eee; border-radius: 8px; background: #f9f9f9; }} + {modern_scrollbar_qss} + """) + + img_label = QtWidgets.QLabel() + img_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + img_label.setStyleSheet("background: transparent;") + self._img_label = img_label # 翻页时复用它来切换图片 + + if os.path.exists(abs_path): + pixmap = QtGui.QPixmap(abs_path) + if pixmap.width() > 800 or pixmap.height() > 600: + pixmap = pixmap.scaled(800, 600, QtCore.Qt.AspectRatioMode.KeepAspectRatio, QtCore.Qt.TransformationMode.SmoothTransformation) + img_label.setPixmap(pixmap) + else: + img_label.setText("❌ 图片文件已丢失或被物理删除") + img_label.setStyleSheet('font-family: "Microsoft YaHei UI", sans-serif; color: red; font-size: 14px;') + + scroll.setWidget(img_label) + lay.addWidget(scroll) + self.card.setFixedSize(860, 680) + else: + text_edit = QtWidgets.QTextEdit() + text_edit.setReadOnly(True) + text_edit.setPlainText(self.meta.get("content", "")) + text_edit.setStyleSheet(f""" + QTextEdit {{ + border: 1px solid #eee; border-radius: 8px; padding: 12px; + background: #fafafa; color: #333; + font-family: "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", sans-serif; + font-size: 14px; line-height: 1.5; + }} + {modern_scrollbar_qss} + """) + lay.addWidget(text_edit) + self.card.setFixedSize(600, 500) + + self._center_card() + # 多张图片(如 PDF 解析图)时,叠加左右翻页按钮 + 页码计数 + if self.meta.get("type") == "image" and len(self._siblings) > 1: + self._add_nav_buttons() + self.show() + self.raise_() + self.activateWindow() + self._animate_in() + + # ==================== 🌟 复制功能相关方法 ==================== + def _on_copy_clicked(self): + """一键复制到剪贴板,并触发按钮变色动画""" + text = self.meta.get("content", "") + if text: + # 写入系统剪贴板 + QtWidgets.QApplication.clipboard().setText(text) + + # 按钮变绿反馈 + self.btn_copy.setText("已复制") + self._set_copy_btn_style(self.btn_copy, is_copied=True) + + # 1.5秒后恢复原状 + QtCore.QTimer.singleShot(1500, lambda: self._restore_copy_btn()) + + def _restore_copy_btn(self): + """恢复复制按钮状态""" + try: + self.btn_copy.setText("复制") + self._set_copy_btn_style(self.btn_copy, is_copied=False) + except RuntimeError: + pass # 防止窗口已经关闭导致报错 + + def _set_copy_btn_style(self, btn, is_copied): + """统一管理复制按钮的 QSS 样式""" + if is_copied: + # 成功状态:浅绿色背景,深绿色文字 + btn.setStyleSheet(""" + QPushButton { + font-family: "Microsoft YaHei UI", sans-serif; + background: #e6f4ea; border: none; border-radius: 6px; color: #1e8e3e; font-size: 13px; font-weight: bold; + } + """) + else: + # 默认状态:浅灰色背景,深灰色文字 + btn.setStyleSheet(""" + QPushButton { + font-family: "Microsoft YaHei UI", sans-serif; + background: #f0f0f0; border: none; border-radius: 6px; color: #555; font-size: 13px; + } + QPushButton:hover { background: #e0e0e0; color: #333; } + """) + # ========================================================= + + # ==================== 🌟 图片选择功能相关方法(PDF 解析图) ==================== + def _current_image_dict(self): + """当前预览图对应的完整 image dict(用于写入 selected_images)。""" + if not (self._att_data and self._att_data.get("images")): + return None + lp = self._siblings[self._index].get("local_path") + return next((x for x in self._att_data["images"] if x.get("local_path") == lp), None) + + def _is_current_selected(self): + """当前预览图是否已在 selected_images 中。""" + if not self._att_data: + return False + lp = self._siblings[self._index].get("local_path") + return any(s.get("local_path") == lp for s in self._att_data.get("selected_images", [])) + + def _on_select_clicked(self): + """切换当前图的选中态,并回写 att_data["selected_images"](重开弹窗勾选仍在)。""" + im = self._current_image_dict() + if im is None: + return + sel = self._att_data.setdefault("selected_images", []) + lp = im["local_path"] + if any(s.get("local_path") == lp for s in sel): + self._att_data["selected_images"] = [s for s in sel if s.get("local_path") != lp] + selected = False + else: + sel.append(im) + selected = True + self._set_select_btn_style(selected) + + def _set_select_btn_style(self, selected): + """统一管理选择按钮的 QSS 样式:选中=绿色边框,未选=灰底。""" + if selected: + self.btn_select.setText("已选择") + self.btn_select.setStyleSheet(""" + QPushButton { + font-family: "Microsoft YaHei UI", sans-serif; + background: #e6f4ea; border: 1px solid #1e8e3e; border-radius: 6px; + color: #1e8e3e; font-size: 13px; font-weight: bold; + } + """) + else: + self.btn_select.setText("选择") + self.btn_select.setStyleSheet(""" + QPushButton { + font-family: "Microsoft YaHei UI", sans-serif; + background: #f0f0f0; border: 1px solid transparent; border-radius: 6px; + color: #555; font-size: 13px; + } + QPushButton:hover { background: #e0e0e0; color: #333; } + """) + # ========================================================= + + def _center_card(self): + x = (self.width() - self.card.width()) // 2 + y = (self.height() - self.card.height()) // 2 + self.card.move(x, y) + + def paintEvent(self, event): + painter = QtGui.QPainter(self) + painter.fillRect(self.rect(), self._overlay_color) + painter.end() + + def mousePressEvent(self, event): + if not self.card.geometry().contains(event.pos()): + self.close_overlay() + + def resizeEvent(self, event): + self._center_card() + + def eventFilter(self, obj, ev): + """跟随主窗口移动/大小变化;主窗口隐藏(最小化)时自动关闭预览。""" + if self._main is not None and obj is self._main: + t = ev.type() + if t == QtCore.QEvent.Type.Move: + self.move(self._main.frameGeometry().topLeft()) + elif t == QtCore.QEvent.Type.Resize: + self.setGeometry(self._main.frameGeometry()) + self._center_card() + elif t in (QtCore.QEvent.Type.Close, QtCore.QEvent.Type.Hide): + self.close_overlay() + return super().eventFilter(obj, ev) + + def _animate_in(self): + # 顶层窗口用 windowOpacity 动画(QGraphicsEffect 作用在顶层窗上不可靠) + self.setWindowOpacity(0.0) + self._anim = QtCore.QPropertyAnimation(self, b"windowOpacity") + self._anim.setDuration(150) + self._anim.setStartValue(0.0) + self._anim.setEndValue(1.0) + self._anim.start() + + def close_overlay(self): + self.deleteLater() + + # ==================== 🌟 图片翻页功能(PDF 解析图等多图场景) ==================== + def _load_image(self, local_path): + """按相对路径加载图片到 self._img_label,超出 800x600 则等比缩放。""" + import os + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + abs_path = os.path.join(root_dir, local_path) + if os.path.exists(abs_path): + pixmap = QtGui.QPixmap(abs_path) + if pixmap.width() > 800 or pixmap.height() > 600: + pixmap = pixmap.scaled(800, 600, QtCore.Qt.AspectRatioMode.KeepAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation) + self._img_label.setStyleSheet("background: transparent;") + self._img_label.setPixmap(pixmap) + else: + self._img_label.clear() + self._img_label.setText("❌ 图片文件已丢失或被物理删除") + self._img_label.setStyleSheet( + 'font-family: "Microsoft YaHei UI", sans-serif; color: red; font-size: 14px;') + + def _add_nav_buttons(self): + """在卡片左右两侧叠加圆形翻页按钮(页码信息改由顶部标题展示)。""" + nav_qss = """ + QPushButton { + background: rgba(0,0,0,0.35); border: none; border-radius: 20px; + color: #ffffff; font-size: 24px; font-weight: bold; + } + QPushButton:hover { background: rgba(0,0,0,0.55); } + """ + self.btn_prev = QtWidgets.QPushButton("‹", self.card) + self.btn_next = QtWidgets.QPushButton("›", self.card) + for b in (self.btn_prev, self.btn_next): + b.setFixedSize(40, 40) + b.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + b.setStyleSheet(nav_qss) + b.raise_() + self.btn_prev.clicked.connect(self._nav_prev) + self.btn_next.clicked.connect(self._nav_next) + cy = self.card.height() // 2 - 20 + self.btn_prev.move(44, cy) # 较初版向内收 30px + self.btn_next.move(self.card.width() - 84, cy) # 较初版向内收 30px(与左侧对称) + + def _show_sibling(self): + meta = self._siblings[self._index] + self._title_label.setText(meta.get("name", "")) + self._load_image(meta.get("local_path", "")) + if getattr(self, "btn_select", None) is not None: # 翻页后刷新“选择”按钮状态 + self._set_select_btn_style(self._is_current_selected()) + + def _nav_prev(self): + self._index = (self._index - 1) % len(self._siblings) + self._show_sibling() + + def _nav_next(self): + self._index = (self._index + 1) % len(self._siblings) + self._show_sibling() + # ===================================================================== + + +class SettingsWindow(QtWidgets.QWidget): + """设置窗口:虚化遮罩居中自适应卡片""" + close_requested = QtCore.pyqtSignal() + + def __init__(self, parent=None, config_data=None): + super().__init__(parent) + self.config_data = config_data or {} + self._setup_ui() + self._setup_animation() + + # ------------------------------------------------------------------ + def _setup_ui(self): + # 全屏透明遮罩(只负责背景展示,不负责关闭) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True) + self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint) + + self.overlay = QtWidgets.QWidget(self) + self.overlay.setStyleSheet("background-color: rgba(0, 0, 0, 0.45);") + # 🌟 遮罩不负责关闭,只响应空白区域 + + # 主卡片(居中,动态尺寸) + self.main_card = QtWidgets.QWidget(self.overlay) + self.main_card.setStyleSheet("background-color: #ffffff; border-radius: 12px;") + # 🌟 关键:安装事件过滤器,阻止点击冒泡到 overlay + self.main_card.installEventFilter(self) + + # 内部垂直布局 + self._vlayout = QtWidgets.QVBoxLayout(self.main_card) + self._vlayout.setContentsMargins(0, 0, 0, 0) + self._vlayout.setSpacing(0) + + self._build_topbar() + + body = QtWidgets.QWidget() + body_layout = QtWidgets.QHBoxLayout(body) + body_layout.setContentsMargins(0, 0, 0, 0) + body_layout.setSpacing(0) + + self.sidebar = QtWidgets.QWidget() + self.sidebar.setStyleSheet("background-color: #f7f7f7; border-radius: 0 0 0 12px;") + self._build_sidebar() + body_layout.addWidget(self.sidebar) + + self.content_stack = QtWidgets.QStackedWidget() + self.content_stack.addWidget(self._build_provider_section()) + self.content_stack.addWidget(self._build_placeholder_section()) + body_layout.addWidget(self.content_stack, 1) + + self._vlayout.addWidget(body) + + self.resize_to_parent() + self.content_stack.setCurrentWidget(self.content_stack.widget(0)) + + # ------------------------------------------------------------------ + def eventFilter(self, obj, event): + """🌟 核心:拦截 main_card 上的鼠标点击,防止冒泡到 overlay 触发关闭""" + if obj is self.main_card and event.type() == QtCore.QEvent.Type.MouseButtonPress: + event.ignore() # 阻止冒泡 + return True + return super().eventFilter(obj, event) + + # ------------------------------------------------------------------ + def _build_topbar(self): + topbar = QtWidgets.QWidget() + topbar.setFixedHeight(48) + topbar.setStyleSheet("background-color: #ffffff; border-radius: 12px 12px 0 0;") + topbar_layout = QtWidgets.QHBoxLayout(topbar) + topbar_layout.setContentsMargins(24, 0, 8, 0) + topbar_layout.setSpacing(0) + + # 🌟 用 layout 自动推 close_btn 到最右边 + title = QtWidgets.QLabel("设置") + title.setStyleSheet( + "font-size: 15px; font-weight: 600; color: #333; background: transparent;" + ) + topbar_layout.addWidget(title) + topbar_layout.addStretch() + + close_btn = QtWidgets.QPushButton("✕") + close_btn.setFixedSize(40, 40) + close_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + close_btn.setStyleSheet( + "QPushButton { background: transparent; border: none; " + "font-size: 16px; color: #999; border-radius: 8px; } " + "QPushButton:hover { background-color: #f0f0f0; color: #555; }" + ) + close_btn.clicked.connect(lambda: self._close(immediate=True)) + + topbar_layout.addWidget(close_btn) + + self._vlayout.addWidget(topbar) + + # ------------------------------------------------------------------ + def _build_sidebar(self): + sidebar_layout = QtWidgets.QVBoxLayout(self.sidebar) + sidebar_layout.setContentsMargins(0, 16, 0, 16) + sidebar_layout.setSpacing(4) + + nav_data = [ + ("模型提供商", "provider"), + ("该功能未开发", "placeholder"), + ] + self.nav_buttons = {} + for label, key in nav_data: + btn = QtWidgets.QPushButton(label) + btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn.setStyleSheet( + "QPushButton { " + " background: transparent; border: none; " + " text-align: left; padding: 10px 20px; " + " font-size: 14px; color: #555; " + "} " + "QPushButton:hover { background-color: #e8e8e8; color: #333; } " + "QPushButton.active { " + " background-color: #e3f2fd; color: #1976d2; font-weight: 500; " + " border-left: 3px solid #1976d2; " + "} " + ) + self.nav_buttons[key] = btn + sidebar_layout.addWidget(btn) + + self.nav_buttons["provider"].setProperty("class", "active") + self.nav_buttons["provider"].clicked.connect(lambda: self._show_section("provider")) + self.nav_buttons["placeholder"].clicked.connect(lambda: self._show_placeholder_toast()) + sidebar_layout.addStretch() + + # ------------------------------------------------------------------ + def _build_provider_section(self) -> QtWidgets.QWidget: + page = QtWidgets.QWidget() + layout = QtWidgets.QVBoxLayout(page) + layout.setContentsMargins(24, 20, 24, 20) + layout.setSpacing(12) + + header = QtWidgets.QWidget() + header_layout = QtWidgets.QHBoxLayout(header) + header_layout.setContentsMargins(0, 0, 0, 0) + + header_title = QtWidgets.QLabel("模型提供商") + header_title.setStyleSheet("font-size: 16px; font-weight: bold; color: #111;") + header_layout.addWidget(header_title) + header_layout.addStretch() + + add_btn = QtWidgets.QPushButton("+ 新建") + add_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + add_btn.setFixedHeight(28) + add_btn.setStyleSheet( + "QPushButton { " + " background-color: #1976d2; color: #fff; border: none; " + " padding: 0 14px; border-radius: 6px; font-size: 12px; font-weight: 500; " + "} " + "QPushButton:hover { background-color: #1565c0; }" + ) + header_layout.addWidget(add_btn) + layout.addWidget(header) + + scroll = QtWidgets.QScrollArea() + scroll.setWidgetResizable(True) + scroll.setStyleSheet( + "QScrollArea { border: none; background: transparent; } " + "QScrollBar:vertical { width: 5px; background: #f0f0f0; border-radius: 3px; } " + "QScrollBar::handle { background: #ccc; border-radius: 3px; }" + ) + + inner = QtWidgets.QWidget() + inner_layout = QtWidgets.QVBoxLayout(inner) + inner_layout.setContentsMargins(0, 4, 0, 0) + inner_layout.setSpacing(10) + + providers = self.config_data.get("providers", {}) + if not providers: + empty = QtWidgets.QLabel("暂无配置") + empty.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter) + empty.setStyleSheet("color: #bbb; font-size: 14px; padding: 40px;") + inner_layout.addWidget(empty) + else: + for provider_name, provider_config in providers.items(): + card = self._build_provider_card(provider_name, provider_config) + inner_layout.addWidget(card) + + inner_layout.addStretch() + scroll.setWidget(inner) + layout.addWidget(scroll, 1) + + return page + + # ------------------------------------------------------------------ + def _build_provider_card(self, name: str, config: dict) -> QtWidgets.QWidget: + card = QtWidgets.QWidget() + card.setStyleSheet( + "background-color: #fafafa; border-radius: 10px; " + "border: 1px solid #e8e8e8;" + ) + layout = QtWidgets.QVBoxLayout(card) + layout.setContentsMargins(16, 14, 16, 14) + layout.setSpacing(10) + + row1 = QtWidgets.QHBoxLayout() + row1.setSpacing(10) + + name_label = QtWidgets.QLabel(f"🤖 {name}") + name_label.setStyleSheet("font-size: 14px; font-weight: 600; color: #222;") + row1.addWidget(name_label) + row1.addStretch() + + edit_btn = QtWidgets.QPushButton("API Key") + edit_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + edit_btn.setFixedHeight(26) + edit_btn.setStyleSheet( + "QPushButton { " + " background-color: #f0f0f0; color: #666; border: none; " + " padding: 0 12px; border-radius: 5px; font-size: 12px; " + "} " + "QPushButton:hover { background-color: #e0e0e0; color: #333; }" + ) + row1.addWidget(edit_btn) + + add_btn = QtWidgets.QPushButton("+模型") + add_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + add_btn.setFixedHeight(26) + add_btn.setStyleSheet( + "QPushButton { " + " background-color: #e3f2fd; color: #1976d2; border: none; " + " padding: 0 12px; border-radius: 5px; font-size: 12px; font-weight: 500; " + "} " + "QPushButton:hover { background-color: #bbdefb; }" + ) + row1.addWidget(add_btn) + layout.addLayout(row1) + + # 🌟 第二行:模型垂直排列,加左缩进,不超出边框 + models = config.get("models", []) + if models: + models_wrap = QtWidgets.QWidget() + models_layout = QtWidgets.QVBoxLayout(models_wrap) + models_layout.setContentsMargins(4, 4, 0, 4) # 左4px,右0px + models_layout.setSpacing(5) + + for model_name in models: + mbtn = QtWidgets.QPushButton(model_name) + mbtn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + mbtn.setFixedHeight(30) # 🌟 明确高度,防止被内容撑开 + mbtn.setStyleSheet( + "QPushButton { " + " background-color: #e8f4fd; color: #1976d2; " + " border: 1px solid #b3d9f7; " + " padding: 0 12px; border-radius: 5px; " + " font-size: 13px; text-align: left; " + "} " + "QPushButton:hover { background-color: #d0ebff; }" + ) + mbtn.clicked.connect( + lambda checked, m=model_name: print(f"[设置] 选中模型: {m}") + ) + models_layout.addWidget(mbtn) + + layout.addWidget(models_wrap) + else: + empty = QtWidgets.QLabel("暂无模型") + empty.setStyleSheet( + "font-size: 12px; color: #aaa; font-style: italic; padding-left: 4px;" + ) + layout.addWidget(empty) + + return card + + # ------------------------------------------------------------------ + def _build_placeholder_section(self) -> QtWidgets.QWidget: + page = QtWidgets.QWidget() + layout = QtWidgets.QVBoxLayout(page) + layout.setContentsMargins(24, 20, 24, 20) + layout.addStretch() + label = QtWidgets.QLabel("🚧 该功能未开发") + label.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter) + label.setStyleSheet("font-size: 16px; color: #bbb;") + layout.addWidget(label) + layout.addStretch() + return page + + # ------------------------------------------------------------------ + def _show_section(self, key: str): + idx = 0 if key == "provider" else 1 + self.content_stack.setCurrentIndex(idx) + for k, btn in self.nav_buttons.items(): + btn.setProperty("class", "active" if k == key else "") + btn.style().unpolish(btn) + btn.style().polish(btn) + + # ------------------------------------------------------------------ + def _show_placeholder_toast(self): + toast = QtWidgets.QLabel(self.main_card) + toast.setText("🚧 该功能未开发") + toast.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + toast.setFixedSize(160, 34) + toast.move( + (self.main_card.width() - toast.width()) // 2, + self.main_card.height() - 70 + ) + toast.setStyleSheet( + "background-color: #333; color: #fff; border-radius: 8px; font-size: 13px;" + ) + toast.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + toast.show() + QtCore.QTimer.singleShot(1500, toast.deleteLater) + + # ------------------------------------------------------------------ + def resize_to_parent(self): + parent = self.parentWidget() + if not parent: + return + self.setFixedSize(parent.size()) + self.overlay.setFixedSize(self.size()) + + W = int(self.width() * 0.8) + H = int(self.height() * 0.88) + self.main_card.setFixedSize(W, H) + self.main_card.move( + (self.width() - W) // 2, + (self.height() - H) // 2 + ) + + # ------------------------------------------------------------------ + def _setup_animation(self): + self._anim = QtCore.QPropertyAnimation(self.overlay, b"windowOpacity") + self._anim.setDuration(500) + self._anim.setStartValue(0.0) + self._anim.setEndValue(1.0) + + # ------------------------------------------------------------------ + def show_with_animation(self): + # 🌟 关键:先 setFixedSize 再 show,否则 show() 时瞬间以极小尺寸闪一下 + self.setFixedSize(self.parentWidget().size()) + self.overlay.setFixedSize(self.size()) + self.overlay.setGraphicsEffect(None) # 重置之前可能的 effect + + # 🌟 初始 opacity=0,再 show 出来,然后做正向动画淡入 + self._anim.setStartValue(0.0) + self._anim.setEndValue(1.0) + self._anim.setDirection(QtCore.QAbstractAnimation.Direction.Forward) + self.show() + self._anim.start() + + + # ------------------------------------------------------------------ + def _close(self, immediate=False): + """关闭窗口。immediate=True 时立即关闭(关闭按钮用),否则播放淡出动画""" + if immediate: + self._do_close() + else: + self._anim.setDirection(QtCore.QAbstractAnimation.Direction.Backward) + self._anim.finished.connect(self._on_close_finished) + self._anim.start() + + def _do_close(self): + """直接关闭,不播放动画""" + try: + self._anim.finished.disconnect(self._on_close_finished) + except TypeError: + pass + + self.hide() + parent = self.parent() + if parent: + for attr_name in dir(parent): + try: + if getattr(parent, attr_name, None) is self: + setattr(parent, attr_name, None) + break + except Exception: + pass + self.deleteLater() + self.close_requested.emit() + + + # ------------------------------------------------------------------ + def _on_close_finished(self): + self._anim.finished.disconnect(self._on_close_finished) + self.hide() + parent = self.parent() + if parent: + for attr_name in dir(parent): + try: + if getattr(parent, attr_name, None) is self: + setattr(parent, attr_name, None) + break + except Exception: + pass + self.deleteLater() + self.close_requested.emit() + + # ------------------------------------------------------------------ + def keyPressEvent(self, event): + if event.key() == QtCore.Qt.Key.Key_Escape: + self._close() + + + +class HLine(QtWidgets.QFrame): + """水平分隔线""" + def __init__(self): + super().__init__() + self.setFixedHeight(1) + self.setStyleSheet("background-color: #e8e8e8; border: none;") + + +class PasteAwareTextEdit(QtWidgets.QPlainTextEdit): + """拦截粘贴/拖拽操作:图片自动识别,超长文本自动折叠,并修复中文输入法占位符重叠Bug""" + long_text_pasted = QtCore.pyqtSignal(str) + image_pasted = QtCore.pyqtSignal(object) # 传递 QImage 或文件路径列表(str) + files_pasted = QtCore.pyqtSignal(list) # 传递文本/代码文件路径列表(拖拽/粘贴/上传) + + LONG_TEXT_THRESHOLD = 2000 + LONG_TEXT_LINES = 50 + IMAGE_EXTS = ('.png', '.jpg', '.jpeg', '.webp', '.bmp', '.gif') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._original_placeholder = "" + self._is_composing = False # 标记是否正在使用输入法 + self.setAcceptDrops(True) # 允许拖拽接收 + + def setPlaceholderText(self, text: str): + """重写设置占位符方法,保存原始文本""" + if not self._is_composing: + self._original_placeholder = text + super().setPlaceholderText(text) + + def inputMethodEvent(self, event: QtGui.QInputMethodEvent): + """拦截输入法事件,修复拼音与占位符重叠""" + # 检查是否有正在输入的拼音字母 (pre-edit string) + if event.preeditString(): + if not self._is_composing: + self._is_composing = True + # 输入法激活时,临时清空占位符 + super().setPlaceholderText("") + else: + if self._is_composing: + self._is_composing = False + # 输入法提交或取消时,恢复原始占位符 + super().setPlaceholderText(self._original_placeholder) + + # 必须调用父类方法,否则输入法无法正常打字 + super().inputMethodEvent(event) + + def insertFromMimeData(self, source: QtCore.QMimeData): + """拦截粘贴操作:优先识别图片,其次超长文本折叠,最后普通文本""" + # 1. 优先检查剪切板中是否有图片(如微信截图、QQ截图等) + if source and source.hasImage(): + image = source.imageData() + if isinstance(image, QtGui.QImage): + self.image_pasted.emit(image) + return + + # 2. 检查剪切板中的文件 URL:图片走图片管线,其余交给文件管线探测 + if source and source.hasUrls(): + image_paths, other_paths = self._classify_urls(source.urls()) + if image_paths: + self.image_pasted.emit(image_paths) + if other_paths: + self.files_pasted.emit(other_paths) + if image_paths or other_paths: + return + + # 3. 文本粘贴处理(原有逻辑) + text = source.text() if source else '' + if not text: + super().insertFromMimeData(source) + return + + line_count = text.count('\n') + 1 + char_count = len(text) + + if char_count > self.LONG_TEXT_THRESHOLD or line_count > self.LONG_TEXT_LINES: + self.long_text_pasted.emit(text) + else: + super().insertFromMimeData(source) + + def dragEnterEvent(self, event): + """拖拽进入:接受图片数据和图片文件""" + mime = event.mimeData() + if mime.hasImage() or mime.hasUrls(): + event.acceptProposedAction() + else: + super().dragEnterEvent(event) + + def dragMoveEvent(self, event): + """拖拽移动:保持接受状态""" + mime = event.mimeData() + if mime.hasImage() or mime.hasUrls(): + event.acceptProposedAction() + else: + super().dragMoveEvent(event) + + def dropEvent(self, event): + """拖拽放下:提取图片并发送信号""" + mime = event.mimeData() + + # 1. 直接拖拽的图片数据(如从浏览器拖入的图片) + if mime.hasImage(): + image = mime.imageData() + if isinstance(image, QtGui.QImage): + self.image_pasted.emit(image) + event.acceptProposedAction() + return + + # 2. 拖拽的文件:图片走图片管线,其余交给文件管线探测 + if mime.hasUrls(): + image_paths, other_paths = self._classify_urls(mime.urls()) + if image_paths: + self.image_pasted.emit(image_paths) + if other_paths: + self.files_pasted.emit(other_paths) + if image_paths or other_paths: + event.acceptProposedAction() + return + + super().dropEvent(event) + + def _classify_urls(self, urls): + """把文件 URL 分成 (图片路径, 其他文件路径);跳过文件夹。 + 非图片文件(含黑名单)一律交给下游 _on_files_dropped 探测并反馈。""" + image_paths, other_paths = [], [] + for url in urls: + if not url.isLocalFile(): + continue + path = url.toLocalFile() + if not os.path.isfile(path): # 跳过文件夹 + continue + ext = os.path.splitext(path)[1].lower() + (image_paths if ext in self.IMAGE_EXTS else other_paths).append(path) + return image_paths, other_paths + + +class DraggableHistoryList(QtWidgets.QListWidget): + """长按拖拽排序 + 星标/普通分区 + 禁止跨区 (零崩溃版)""" + order_changed = QtCore.pyqtSignal(list) + SEPARATOR_ROLE = QtCore.Qt.ItemDataRole.UserRole + 1 + + def __init__(self, parent=None): + super().__init__(parent) + self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel) + self.setMouseTracking(True) + + self._long_press_timer = QtCore.QTimer(self) + self._long_press_timer.setSingleShot(True) + self._long_press_timer.setInterval(100) + self._long_press_timer.timeout.connect(self._on_long_press) + + # 边缘滚动定时器 + self._scroll_timer = QtCore.QTimer(self) + self._scroll_timer.setInterval(30) + self._scroll_timer.timeout.connect(self._do_edge_scroll) + self._scroll_dir = 0 + + self._dragging = False + self._drag_item = None + self._drag_start_row = -1 + self._press_pos = None + self._ghost = None + self._ghost_offset = None + self._drop_anim = None + self._drag_zone = None + self._insert_row = -1 # 松手后要插入的目标行 + + # 插入指示线 + self._indicator = QtWidgets.QFrame(self.viewport()) + self._indicator.setFixedHeight(2) + self._indicator.setStyleSheet("background-color: #4a90d9; border-radius: 1px;") + self._indicator.hide() + + # ---------- 工具方法 ---------- + def _is_separator(self, item): + return item and item.data(self.SEPARATOR_ROLE) == "separator" + + def _get_zone(self, item): + if not item or self._is_separator(item): + return None + row = self.row(item) + for i in range(row, -1, -1): + if self._is_separator(self.item(i)): + return "normal" + return "starred" + + def _find_separator_row(self): + for i in range(self.count()): + if self._is_separator(self.item(i)): + return i + return -1 + + def _zone_bounds(self, zone): + """返回指定区域的 (起始行, 结束行+1)""" + sep = self._find_separator_row() + total = self.count() + if sep < 0: + return (0, total) + if zone == "starred": + return (0, sep) + else: + return (sep + 1, total) + + # ---------- 长按触发 ---------- + def _on_long_press(self): + if not self._drag_item or self._is_separator(self._drag_item): + return + self._dragging = True + self._drag_zone = self._get_zone(self._drag_item) + self._drag_start_row = self.row(self._drag_item) + self._insert_row = self._drag_start_row + + # 半透明标记原位 + self._drag_item.setForeground(QtGui.QBrush(QtGui.QColor(200, 200, 200))) + + # 创建幽灵 + rect = self.visualItemRect(self._drag_item) + w = self.itemWidget(self._drag_item) + title = w.title_label.text() if w and hasattr(w, 'title_label') else "" + + self._ghost = QtWidgets.QLabel(self.parentWidget()) + self._ghost.setText(title) + self._ghost.setFixedSize(rect.width() - 12, rect.height()) + self._ghost.setStyleSheet( + "background-color: rgba(255,255,255,0.95);" + "border: 1.5px solid #c0c0c0; border-radius: 8px;" + "padding: 10px 12px; color: #222; font-size: 13px;" + ) + self._ghost.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + + item_tl = self.mapToParent(rect.topLeft()) + press_parent = self.mapToParent(self._press_pos) + self._ghost_offset = press_parent - item_tl + self._ghost.move(item_tl) + self._ghost.show() + + shadow = QtWidgets.QGraphicsDropShadowEffect(self._ghost) + shadow.setBlurRadius(16) + shadow.setOffset(0, 3) + shadow.setColor(QtGui.QColor(0, 0, 0, 45)) + self._ghost.setGraphicsEffect(shadow) + + # ---------- 鼠标事件 ---------- + def mousePressEvent(self, event): + if event.button() == QtCore.Qt.MouseButton.LeftButton: + item = self.itemAt(event.pos()) + if item and not self._is_separator(item): + self._press_pos = event.pos() + self._drag_item = item + self._long_press_timer.start() + super().mousePressEvent(event) + + def mouseMoveEvent(self, event): + if self._long_press_timer.isActive() and self._press_pos: + if (event.pos() - self._press_pos).manhattanLength() > 10: + self._long_press_timer.stop() + + if self._dragging and self._ghost: + # 移动幽灵(轻量操作) + self._ghost.move(self.mapToParent(event.pos()) - self._ghost_offset) + + # 计算目标插入行 + y = event.pos().y() + lo, hi = self._zone_bounds(self._drag_zone) + best_row = self._drag_start_row + min_dist = 999999 + + for i in range(lo, hi): + it = self.item(i) + if self._is_separator(it): + continue + r = self.visualItemRect(it) + mid = r.top() + r.height() // 2 + d = abs(y - mid) + if d < min_dist: + min_dist = d + best_row = i + + self._insert_row = best_row + + # 画指示线(轻量操作) + if best_row != self._drag_start_row: + target_item = self.item(best_row) + if target_item: + r = self.visualItemRect(target_item) + if best_row > self._drag_start_row: + line_y = r.bottom() + else: + line_y = r.top() + self._indicator.setGeometry(8, line_y - 1, self.viewport().width() - 16, 2) + self._indicator.show() + else: + self._indicator.hide() + + # 边缘滚动 + if y < 30: + self._scroll_dir = -4 + if not self._scroll_timer.isActive(): + self._scroll_timer.start() + elif y > self.viewport().height() - 30: + self._scroll_dir = 4 + if not self._scroll_timer.isActive(): + self._scroll_timer.start() + else: + self._scroll_timer.stop() + return + + super().mouseMoveEvent(event) + + def _do_edge_scroll(self): + self.verticalScrollBar().setValue( + self.verticalScrollBar().value() + self._scroll_dir + ) + + def mouseReleaseEvent(self, event): + self._long_press_timer.stop() + self._scroll_timer.stop() + self._indicator.hide() + + if self._dragging: + if self._drag_item: + self._drag_item.setForeground(QtGui.QBrush()) + + src = self._drag_start_row + dst = self._insert_row + + if self._ghost and src != dst: + # 落地动画 + target_rect = self.visualItemRect(self.item(dst)) + land_pos = self.mapToParent(target_rect.topLeft()) + + self._drop_anim = QtCore.QPropertyAnimation(self._ghost, b"pos") + self._drop_anim.setDuration(180) + self._drop_anim.setStartValue(self._ghost.pos()) + self._drop_anim.setEndValue(land_pos) + self._drop_anim.setEasingCurve(QtCore.QEasingCurve.Type.OutBack) + self._drop_anim.finished.connect(lambda: self._finalize_drop(src, dst)) + self._drop_anim.start() + else: + self._cleanup() + + self._dragging = False + self._drag_zone = None + return + + super().mouseReleaseEvent(event) + + def _finalize_drop(self, src, dst): + """动画结束后,一次性完成真实重排""" + # 🌟 先取数据,再清理 + item_data = None + if self._drag_item: + item_data = self._drag_item.data(QtCore.Qt.ItemDataRole.UserRole) + + self._cleanup() + + if not item_data or src == dst or src < 0 or dst < 0: + return + + self.takeItem(src) + + new_item = QtWidgets.QListWidgetItem() + new_item.setData(QtCore.Qt.ItemDataRole.UserRole, item_data) + new_item.setSizeHint(QtCore.QSize(0, 44)) + self.insertItem(dst, new_item) + + main_win = self.window() + if hasattr(main_win, '_create_session_widget'): + widget = main_win._create_session_widget(item_data) + self.setItemWidget(new_item, widget) + + self.setCurrentItem(new_item) + + new_order = [] + for i in range(self.count()): + it = self.item(i) + if not self._is_separator(it): + sid = it.data(QtCore.Qt.ItemDataRole.UserRole) + if sid: + new_order.append(sid) + if new_order: + self.order_changed.emit(new_order) + + + def _cleanup(self): + if self._ghost: + self._ghost.deleteLater() + self._ghost = None + self._drag_item = None + self._press_pos = None + self._insert_row = -1 + self._drag_start_row = -1 + + + +class SessionItemWidget(QtWidgets.QWidget): + """会话列表项:标题 + 右侧悬浮 ··· 按钮""" + menu_requested = QtCore.pyqtSignal(str, QtCore.QPoint) # session_id, 按钮全局坐标 + + def __init__(self, session_id, title, parent=None): + super().__init__(parent) + self.session_id = session_id + self.setMouseTracking(True) + + # 🟢 改为: + layout = QtWidgets.QHBoxLayout(self) + layout.setContentsMargins(10, 0, 6, 0) + layout.setSpacing(0) + layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignVCenter) + + self.title_label = QtWidgets.QLabel(title) + self.title_label.setStyleSheet("color: #444; font-size: 15px; background: transparent;") + self.title_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + + self.menu_btn = QtWidgets.QPushButton("···") + self.menu_btn.setFixedSize(25, 20) + self.menu_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.menu_btn.setStyleSheet(""" + QPushButton { + background: transparent; border: none; border-radius: 6px; + color: #999; font-size: 16px; font-weight: bold; letter-spacing: 2px; + padding-bottom: 4px; + } + QPushButton:hover { background-color: #e0e0e0; color: #333; } + """) + self.menu_btn.setVisible(False) + self.menu_btn.clicked.connect(self._on_menu_click) + + layout.addWidget(self.title_label, 1) + layout.addWidget(self.menu_btn, 0) + + def set_title(self, title): + self.title_label.setText(title) + + def _on_menu_click(self): + pos = self.menu_btn.mapToGlobal(QtCore.QPoint(0, self.menu_btn.height())) + self.menu_requested.emit(self.session_id, pos) + + def mouseMoveEvent(self, event): + # 只有鼠标在右侧 40px 区域才显示 ··· + in_zone = event.pos().x() > self.width() - 40 + self.menu_btn.setVisible(in_zone) + super().mouseMoveEvent(event) + + def leaveEvent(self, event): + self.menu_btn.setVisible(False) + super().leaveEvent(event) +class SessionContextPopup(QtWidgets.QWidget): + """会话操作弹出菜单:编辑 / 星标 / 复制 / 删除""" + action_triggered = QtCore.pyqtSignal(str, str) # (action, session_id) + + def __init__(self, session_id, is_starred=False, parent=None): + super().__init__(parent) + self.session_id = session_id + self.setWindowFlags(QtCore.Qt.WindowType.Popup | QtCore.Qt.WindowType.FramelessWindowHint) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground) + self.setFixedWidth(160) + + container = QtWidgets.QFrame(self) + container.setObjectName("ctx_popup") + main_lay = QtWidgets.QVBoxLayout(self) + main_lay.setContentsMargins(0, 0, 0, 0) + main_lay.addWidget(container) + + lay = QtWidgets.QVBoxLayout(container) + lay.setContentsMargins(6, 6, 6, 6) + lay.setSpacing(2) + + # 编辑 + btn_edit = self._make_btn("✏️ 编辑", "edit") + lay.addWidget(btn_edit) + + # 星标 / 取消星标 + star_text = "⭐ 取消星标" if is_starred else "☆ 星标" + btn_star = self._make_btn(star_text, "star") + lay.addWidget(btn_star) + + # 🆕 复制会话(深度克隆:分支/压缩标记/附件文件) + btn_copy = self._make_btn("📋 复制", "copy") + lay.addWidget(btn_copy) + + # 分隔线 + sep = QtWidgets.QFrame() + sep.setFrameShape(QtWidgets.QFrame.Shape.HLine) + sep.setStyleSheet("color: #eee; margin: 4px 8px;") + lay.addWidget(sep) + + # 删除 + btn_del = self._make_btn("🗑️ 删除", "delete") + btn_del.setStyleSheet(btn_del.styleSheet() + "QPushButton { color: #e04040; } QPushButton:hover { background: #fdecea; color: #c62828; }") + lay.addWidget(btn_del) + + self.setStyleSheet(""" + #ctx_popup { + background: #ffffff; + border: 1px solid #dcdcdc; + border-radius: 10px; + } + """) + self.adjustSize() + + def _make_btn(self, text, action): + btn = QtWidgets.QPushButton(text) + btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn.setStyleSheet(""" + QPushButton { + text-align: left; border: none; border-radius: 6px; + padding: 8px 12px; font-size: 13px; color: #333; + background: transparent; + } + QPushButton:hover { background-color: #f0f4f9; } + """) + btn.clicked.connect(lambda: self._emit(action)) + return btn + + def _emit(self, action): + self.action_triggered.emit(action, self.session_id) + self.close() + + def show_at(self, pos: QtCore.QPoint): + """带浮现动画显示""" + self.setWindowOpacity(0.0) + self.move(pos.x(), pos.y()) + self.show() + + self._anim_group = QtCore.QParallelAnimationGroup(self) + + opacity_anim = QtCore.QPropertyAnimation(self, b"windowOpacity") + opacity_anim.setDuration(120) + opacity_anim.setStartValue(0.0) + opacity_anim.setEndValue(1.0) + opacity_anim.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) + + pos_anim = QtCore.QPropertyAnimation(self, b"pos") + pos_anim.setDuration(120) + pos_anim.setStartValue(QtCore.QPoint(pos.x(), pos.y() + 8)) + pos_anim.setEndValue(pos) + pos_anim.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) + + self._anim_group.addAnimation(opacity_anim) + self._anim_group.addAnimation(pos_anim) + self._anim_group.start() + +class RenameOverlay(QtWidgets.QWidget): + """无边框重命名 — 独立顶层透明窗口(P2-03 修复) + + 🆕 必须是可覆盖原生 WebView2 的独立顶层窗(独立 HWND):WebView2 是原生子窗, + 永远绘制在主窗口内所有 Qt 控件之上 —— 旧实现是 bg_widget 的子控件,遮罩盖不住 + webview 区域(聊天区不暗)、卡片被压到 webview 下面。独立顶层 Tool 窗 + + WA_TranslucentBackground(逐像素 alpha)才能盖住原生子窗(同 AttachmentPreviewOverlay)。 + + 只覆盖主窗口【客户区】:系统标题栏与窗口控制保持可操作。 + 主窗口 Move / Resize / WindowStateChange(最大化/还原,含多显示器/DPI 变化时 + Qt 合成的 move+resize)通过 eventFilter + mapToGlobal 跟随。 + 行为保持:点空白关闭、Esc 关闭、✕ 关闭、输入框初始全选、Enter 提交、关闭后焦点回主窗口。 + """ + renamed = QtCore.pyqtSignal(str) # 发射新标题 + + def __init__(self, current_title, parent=None): + super().__init__(parent) + self._main = parent.window() if parent is not None else None + # 无边框顶层 Tool 窗(不入任务栏;Windows 上作为拥有者窗口默认浮在父窗之上) + self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint | QtCore.Qt.WindowType.Tool) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose, True) + + # 半透明灰色遮罩 + self._overlay_color = QtGui.QColor(0, 0, 0, 80) + + # ---- 居中表单 ---- + self.form = QtWidgets.QFrame(self) + self.form.setFixedSize(380, 200) + self.form.setObjectName("rename_form") + self.form.setStyleSheet(""" + #rename_form { + background: #ffffff; + border: 1px solid #dcdcdc; + border-radius: 12px; + } + """) + + lay = QtWidgets.QVBoxLayout(self.form) + lay.setContentsMargins(24, 20, 24, 18) + lay.setSpacing(16) + + # 标题行 + title_lay = QtWidgets.QHBoxLayout() + title_label = QtWidgets.QLabel("编辑会话名称") + title_label.setStyleSheet("font-size: 15px; font-weight: bold; color: #222;") + title_lay.addWidget(title_label) + title_lay.addStretch() + + btn_x = QtWidgets.QPushButton("✕") + btn_x.setFixedSize(24, 24) + btn_x.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn_x.setStyleSheet(""" + QPushButton { background: transparent; border: none; border-radius: 12px; color: #999; font-size: 14px; } + QPushButton:hover { background: #eee; color: #333; } + """) + btn_x.clicked.connect(self.close_overlay) + title_lay.addWidget(btn_x) + lay.addLayout(title_lay) + + # 输入框(加大内边距防文字被裁) + self.input = QtWidgets.QLineEdit(current_title) + self.input.selectAll() + self.input.setStyleSheet(""" + QLineEdit { + border: 1.5px solid #e0e0e0; border-radius: 8px; + padding: 10px 14px; font-size: 14px; color: #222; + background: #fafafa; + } + QLineEdit:focus { border-color: #4a90d9; background: #fff; } + """) + self.input.returnPressed.connect(self.confirm) + lay.addWidget(self.input) + + # 按钮行 + btn_lay = QtWidgets.QHBoxLayout() + btn_lay.addStretch() + + btn_cancel = QtWidgets.QPushButton("取消") + btn_cancel.setFixedSize(72, 32) + btn_cancel.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn_cancel.setStyleSheet(""" + QPushButton { background: #f5f5f5; border: 1px solid #e0e0e0; border-radius: 8px; color: #666; font-size: 13px; } + QPushButton:hover { background: #eaeaea; } + """) + btn_cancel.clicked.connect(self.close_overlay) + + btn_ok = QtWidgets.QPushButton("确定") + btn_ok.setFixedSize(72, 32) + btn_ok.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn_ok.setStyleSheet(""" + QPushButton { background: #4a90d9; border: none; border-radius: 8px; color: white; font-size: 13px; font-weight: bold; } + QPushButton:hover { background: #3a7bc8; } + """) + btn_ok.clicked.connect(self.confirm) + + btn_lay.addWidget(btn_cancel) + btn_lay.addSpacing(8) + btn_lay.addWidget(btn_ok) + lay.addLayout(btn_lay) + + # 拖拽(卡片可拖动,限制在客户区内) + self._drag_pos = None + self.form.mousePressEvent = self._form_press + self.form.mouseMoveEvent = self._form_move + self.form.mouseReleaseEvent = self._form_release + + self._result = None + self._closed = False + + # 先同步几何(覆盖主窗口客户区)并挂事件过滤器,再显示 + self._sync_geometry() + if self._main is not None: + self._main.installEventFilter(self) + self.show() + self.raise_() + self.activateWindow() + self.input.setFocus() + self._animate_in() + + # ==================== 几何同步(客户区覆盖,标题栏/窗口控制可操作) ==================== + def _client_top_left(self): + """主窗口客户区左上角的【全局】坐标(mapToGlobal 已含多显示器/DPI 换算)。""" + return self._main.mapToGlobal(self._main.rect().topLeft()) + + def _sync_geometry(self): + if self._main is None: + return + self.setGeometry(QtCore.QRect(self._client_top_left(), self._main.rect().size())) + self._center_form() + + def eventFilter(self, obj, ev): + """跟随主窗口移动/大小变化/窗口状态(最大化、还原);主窗口关闭/隐藏时关闭遮罩。 + DPI 变化时 Qt 对主窗口合成 move+resize 事件,此过滤器随之自动跟随。""" + if self._main is not None and obj is self._main: + t = ev.type() + if t == QtCore.QEvent.Type.Move: + self.move(self._client_top_left()) + elif t in (QtCore.QEvent.Type.Resize, QtCore.QEvent.Type.WindowStateChange): + self._sync_geometry() + elif t in (QtCore.QEvent.Type.Close, QtCore.QEvent.Type.Hide): + self.close_overlay() + return super().eventFilter(obj, ev) + # ============================================================================== + + def _center_form(self): + x = (self.width() - self.form.width()) // 2 + y = (self.height() - self.form.height()) // 2 + self.form.move(x, y) + + def _animate_in(self): + # 顶层窗口用 windowOpacity 动画(QGraphicsEffect 作用在顶层窗上不可靠) + self.setWindowOpacity(0.0) + self._anim = QtCore.QPropertyAnimation(self, b"windowOpacity") + self._anim.setDuration(150) + self._anim.setStartValue(0.0) + self._anim.setEndValue(1.0) + self._anim.start() + + # ---- 绘制半透明遮罩 ---- + def paintEvent(self, event): + painter = QtGui.QPainter(self) + painter.fillRect(self.rect(), self._overlay_color) + painter.end() + + # ---- 点击遮罩区域关闭 ---- + def mousePressEvent(self, event): + if not self.form.geometry().contains(event.pos()): + self.close_overlay() + + # ---- Esc 关闭 ---- + def keyPressEvent(self, event): + if event.key() == QtCore.Qt.Key.Key_Escape: + self.close_overlay() + return + super().keyPressEvent(event) + + # ---- 表单拖拽(限制在主窗口客户区内)---- + def _form_press(self, event): + if event.button() == QtCore.Qt.MouseButton.LeftButton: + self._drag_pos = event.pos() + + def _form_move(self, event): + if self._drag_pos: + new_pos = self.form.pos() + event.pos() - self._drag_pos + # 限制在覆盖层范围内 + x = max(0, min(new_pos.x(), self.width() - self.form.width())) + y = max(0, min(new_pos.y(), self.height() - self.form.height())) + self.form.move(x, y) + + def _form_release(self, event): + self._drag_pos = None + + def confirm(self): + title = self.input.text().strip() + if title: + self._result = title + self.renamed.emit(title) + self.close_overlay() + + def close_overlay(self): + """关闭并释放:卸事件过滤器、焦点回主窗口、延迟删除(不残留遮罩/过滤器/焦点捕获)。""" + if self._closed: + return + self._closed = True + if self._main is not None: + self._main.removeEventFilter(self) + self._main.activateWindow() + self._main.raise_() + self.deleteLater() + + def get_result(self): + return self._result + + +from PyQt6 import QtCore, QtGui, QtWidgets +def _popup_svg_path(filename: str) -> str: + """🌟 弹窗类内部取 svg 图标绝对路径(与 MainWindow.get_svg_path 同一套定位逻辑,不依赖主窗口实例)""" + base_dir = os.path.dirname(os.path.abspath(__file__)) + project_root = os.path.abspath(os.path.join(base_dir, "..", "..")) + return os.path.join(project_root, "svg", filename) + + +# 🆕 抽屉 v2:模型行淡入淡出 / 相邻行滑移 的 per-item 数据角色 +_FADE_ROLE = QtCore.Qt.ItemDataRole.UserRole + 901 # 模型行不透明度 0..1(None=1) +_SLIDE_ROLE = QtCore.Qt.ItemDataRole.UserRole + 902 # 纯 item 垂直滑移偏移 dy (px)(None=0) + + +class _ModelFadeDelegate(QtWidgets.QStyledItemDelegate): + """模型行 淡出+滑移 委托(抽屉 v2) + + - _FADE_ROLE: paint 时 setOpacity → 模型行渐渐变浅透明 + - _SLIDE_ROLE: paint 时 translate(0, dy) → 供应商头以下的整块行垂直滑移 + (供应商头是 setItemWidget 真实控件,不走 delegate,由 _SlideListView 偏移) + """ + + def paint(self, painter, option, index): + fade = index.data(_FADE_ROLE) + dy = index.data(_SLIDE_ROLE) + if fade is None and not dy: + super().paint(painter, option, index) + return + painter.save() + if fade is not None: + painter.setOpacity(max(0.0, min(1.0, float(fade)))) + if dy: + painter.translate(0, int(dy)) + # 🆕 背景穿透修复:滑移中的行先铺不透明白底(随平移后的位置), + # 盖住底下正在淡出的模型行文字,避免两层文字重叠 + painter.fillRect(option.rect, QtGui.QColor("#ffffff")) + super().paint(painter, option, index) + painter.restore() + + +class _SlideListView(QtWidgets.QListWidget): + """可保持供应商头控件垂直滑移偏移的 QListWidget(抽屉 v2) + + QListView 会在每次 layout/resize/scroll 时把 setItemWidget 子控件 + 复位到自然位置——单帧 move() 会被下一个事件冲掉。这里在基类处理 + 完成之后重新应用偏移,保证滑移状态持续到该帧绘制。 + """ + + def __init__(self, parent=None): + super().__init__(parent) + self._slide_offsets = [] # [(QListWidgetItem, dy), ...](item 不可哈希,用列表) + + def _offset_of(self, it): + for item, dy in self._slide_offsets: + if item is it: + return dy + return 0 + + def set_slide_offset(self, it, dy): + if dy: + for i, (item, _) in enumerate(self._slide_offsets): + if item is it: + self._slide_offsets[i] = (item, int(dy)) + break + else: + self._slide_offsets.append((it, int(dy))) + else: + self._slide_offsets = [(item, d) for item, d in self._slide_offsets if item is not it] + w = self.itemWidget(it) + if w is not None: + r = self.visualItemRect(it) + w.move(r.x(), r.y() + self._offset_of(it)) + + def clear_slide_offsets(self): + self._slide_offsets.clear() + + def _reapply_slide(self): + for it, dy in list(self._slide_offsets): + w = self.itemWidget(it) + if w is not None: + r = self.visualItemRect(it) + w.move(r.x(), r.y() + dy) + + def paintEvent(self, e): + # 每帧绘制前重应用偏移:layout/resize/scroll 都会把 itemWidget 复位, + # paint 前再移一次保证该帧最终视觉(注:PyQt6 的 doItemsLayout 无法 + # 经 super() 调用,不能在那里钩) + if self._slide_offsets: + self._reapply_slide() + super().paintEvent(e) + + def resizeEvent(self, e): + super().resizeEvent(e) + self._reapply_slide() + + def scrollContentsBy(self, dx, dy): + super().scrollContentsBy(dx, dy) + self._reapply_slide() + + +class ModelSelectPopup(QtWidgets.QWidget): + """ + 🌟 极客级自定义向上弹出菜单 (带丝滑浮现动画 & 供应商抽屉折叠) + - 供应商分组头:[SVG箭头] [provider.svg] 名称(微软雅黑·不加粗) —空白— 数量(右对齐·纯文字),整行可点 + - 模型项:model.svg 图标(左带透明边,比供应商头缩进一点)+ 模型名,行距紧凑 + - 滚动条上下内缩 12px,避免滑轨顶满右边两个圆角 + """ + model_selected = QtCore.pyqtSignal(str, str) + + ICON_SIZE = 16 # 模型项图标尺寸(调参工具确认) + MODEL_ICON_PAD = 34 # 模型图标左侧透明边(模型行缩进,调参工具确认) + HEADER_ICON_SIZE = 16 # 供应商头图标尺寸(调参工具确认 15→16) + HEADER_ICON_PAD = 0 # 供应商头图标水平偏移(左侧留白,调参工具可调) + HEADER_ICON_PAD_V = 1 # 供应商头图标垂直偏移(正=下移,调参工具确认 0→1) + MODEL_ROW_H = 27 # 模型行高(调参工具确认 26→27;抽屉 v2 中恒定不压缩) + MIN_POPUP_H = 50 # 弹窗高度钳制下限(与 adjust_popup_height 一致) + MAX_POPUP_H = 400 # 弹窗高度钳制上限(与 adjust_popup_height 一致) + DRAWER_DURATION = 200 # 抽屉淡出/滑移段时长 (ms) + DRAWER_SETTLE = 120 # 抽屉回座段时长(收起后整体下滑 / 展开前整体上移,ms) + DRAWER_STEP = 16 # 抽屉动画帧间隔 (ms) ~60fps + PROVIDER_SVG = "provider.svg" # 供应商图标(可选 provider/provider2/provider3,调参工具可切) + ARROW_SIZE = 13 # 展开/收起箭头尺寸(调参工具确认) + + def __init__(self, parent=None, config_data=None): + super().__init__(parent) + self.setWindowFlags(QtCore.Qt.WindowType.Popup | QtCore.Qt.WindowType.FramelessWindowHint) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground) + + self.config_data = config_data or {"providers": {}} + self.setFixedWidth(340) + + # 供应商头图标(PROVIDER_SVG 可切换,调参工具确认) + self._provider_pixmap = QtGui.QPixmap(_popup_svg_path(self.PROVIDER_SVG)).scaled( + self.HEADER_ICON_SIZE, self.HEADER_ICON_SIZE, + QtCore.Qt.AspectRatioMode.KeepAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation) + # 🆕 展开/收起 SVG 箭头(替换旧 ▾/▸ 文字字符) + self._arrow_expanded = QtGui.QIcon(_popup_svg_path("chevron_down.svg")).pixmap(self.ARROW_SIZE, self.ARROW_SIZE) + self._arrow_collapsed = QtGui.QIcon(_popup_svg_path("chevron_right.svg")).pixmap(self.ARROW_SIZE, self.ARROW_SIZE) + # 🆕 模型图标:左带 MODEL_ICON_PAD 透明边 → 模型行比供应商头缩进一点点 + _m = QtGui.QPixmap(_popup_svg_path("model.svg")).scaled( + self.ICON_SIZE, self.ICON_SIZE, + QtCore.Qt.AspectRatioMode.KeepAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation) + _pad = QtGui.QPixmap(self.ICON_SIZE + self.MODEL_ICON_PAD, self.ICON_SIZE) + _pad.fill(QtCore.Qt.GlobalColor.transparent) + _p = QtGui.QPainter(_pad) + _p.drawPixmap(self.MODEL_ICON_PAD, 0, _m) + _p.end() + self._model_icon = QtGui.QIcon(_pad) + self._groups = [] # [{"provider", "header_item", "model_items", "expanded", "chevron"}] + self._drawer = None # 进行中的抽屉动画状态 {group, t, timer, row_h, anchor_bottom} + + self.setup_ui() + self.populate_data() + self.adjust_popup_height() + + def setup_ui(self): + self.container = QtWidgets.QFrame(self) + self.container.setObjectName("popup_container") + self.main_layout = QtWidgets.QVBoxLayout(self) + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.main_layout.addWidget(self.container) + + self.container_layout = QtWidgets.QVBoxLayout(self.container) + self.container_layout.setContentsMargins(0, 4, 0, 4) + self.container_layout.setSpacing(0) + + self.list_widget = _SlideListView() + self.list_widget.setObjectName("model_list") + self.list_widget.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel) + self.list_widget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + # 模型行字体:widget 级 setFont(实测 QSS ::item 的 font-size 在本构建无效) + _list_font = QtGui.QFont("Microsoft YaHei") + _list_font.setPixelSize(13) + self.list_widget.setFont(_list_font) + self.container_layout.addWidget(self.list_widget) + + self.list_widget.itemClicked.connect(self.on_item_clicked) + self._fade_delegate = _ModelFadeDelegate(self.list_widget) # 抽屉 v2 淡出/滑移 + self.list_widget.setItemDelegate(self._fade_delegate) # 🐛 必须安装才生效(之前只创建未挂载→fade/遮罩全不渲染) + + # 🎨 注入灵魂:加入圆润字体栈,调整字重与间距,让视觉更柔和 + self.setStyleSheet(""" + * { + /* 全局字体:微软雅黑(调参工具确认)→ 鸿蒙黑体 → Noto Sans SC */ + font-family: "Microsoft YaHei", "HarmonyOS Sans SC", "Noto Sans SC", sans-serif; + } + #popup_container { + background-color: #ffffff; + border: 1px solid #dcdcdc; + border-radius: 12px; + } + /* 🆕 分组头整行可点(抽屉折叠触发器) */ + #group_toggle_btn { background: transparent; border: none; } + #group_toggle_btn:hover { background-color: #f2f5f9; border-radius: 6px; } + #model_list { + border: none; + background: transparent; + outline: none; + } + #model_list::item { + /* ⚠️ 显式声明必须保留——作用是【屏蔽 MainWindow 全局 QListWidget::item + 的级联泄漏】(padding 10px 12px / margin 2px 4px / border-radius 8px): + id 选择器 > 类型选择器,级联必胜;实测泄漏会把 38px 供应商头 widget + 压裁(“卡进去”)、并在供应商行与首模型行间多出间隙 */ + font-family: "Microsoft YaHei", "HarmonyOS Sans SC", "Noto Sans SC", sans-serif; + padding: 0px; + margin: 0px; + border: none; + border-radius: 0px; + color: #333333; + font-weight: normal; + } + #model_list::item:hover { + background-color: #f0f4f9; + color: #111111; + } + #model_list::item:selected { + background-color: #e8f0fe; + color: #1a73e8; + font-weight: bold; /* 选中时使用真正的粗体 */ + border: none; border-left: none; /* 屏蔽全局选中态的 3px 蓝色左竖条 */ + } + + /* 🆕 滚动条:上下内缩 12px,避免灰色滑轨顶满右边两个圆角 */ + QScrollBar:vertical { + border: none; + background: transparent; + width: 5px; + margin: 12px 2px; + } + QScrollBar::handle:vertical { + background: #d0d0d0; + min-height: 20px; + border-radius: 3px; + } + QScrollBar::handle:vertical:hover { + background: #a0a0a0; + } + QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { + height: 0px; + } + """) + + + def populate_data(self): + providers = self.config_data.get("providers", {}) + # 🆕 图标区宽 = 16 + 34px 透明左边(缩进),高 16(调参工具确认) + self.list_widget.setIconSize(QtCore.QSize(self.ICON_SIZE + self.MODEL_ICON_PAD, self.ICON_SIZE)) + + for provider_name, info in providers.items(): + models = info.get("models", []) + if not models: continue + + # --- 🆕 供应商分组头(整行可点:展开/收起抽屉) --- + header_item = QtWidgets.QListWidgetItem(self.list_widget) + header_item.setFlags(header_item.flags() & ~QtCore.Qt.ItemFlag.ItemIsSelectable & ~QtCore.Qt.ItemFlag.ItemIsEnabled) + + header_widget = QtWidgets.QWidget() + header_widget.setFixedHeight(38) # 🐛 供应商行高 38 = 整行高(调参工具确认) + outer_layout = QtWidgets.QVBoxLayout(header_widget) + outer_layout.setContentsMargins(2, 2, 2, 2) + + toggle_btn = QtWidgets.QPushButton() + toggle_btn.setObjectName("group_toggle_btn") + toggle_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + # 🐛 QPushButton 默认垂直 sizePolicy=Fixed,不会填满行高 → 内容行只有 12px, + # 16px 图标溢出被裁、文字偏下。“字只有一半”的另一半原因。 + toggle_btn.setSizePolicy( + QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + btn_layout = QtWidgets.QHBoxLayout(toggle_btn) + # 🐛 垂直边距归零:图标+名称由布局自动垂直居中 + # (旧版 (8,6,8,2) 不对称边距会把内容往下顶,加剧底部裁切) + btn_layout.setContentsMargins(3, 0, 8, 0) # 🐛 左边距 8→3:供应商头整体再靠左一点 + btn_layout.setSpacing(6) + + icon_lbl = QtWidgets.QLabel() + icon_lbl.setPixmap(self._provider_pixmap) + # 尺寸含水平/垂直偏移:内容区 = 图标尺寸,图标整体平移。 + # 垂直 margin 取 2 倍:label 在行内居中会吸收一半增高,双倍才 1:1 位移 + _top = 2 * max(self.HEADER_ICON_PAD_V, 0) + _bot = 2 * max(-self.HEADER_ICON_PAD_V, 0) + icon_lbl.setFixedSize( + self.HEADER_ICON_SIZE + self.HEADER_ICON_PAD, + self.HEADER_ICON_SIZE + _top + _bot) + icon_lbl.setContentsMargins(self.HEADER_ICON_PAD, _top, 0, _bot) + icon_lbl.setStyleSheet("background: transparent;") + + # 🆕 供应商名:鸿蒙黑体·不加粗 + lbl_name = QtWidgets.QLabel(provider_name) + lbl_name.setStyleSheet(""" + font-family: "Microsoft YaHei", "HarmonyOS Sans SC", "Noto Sans SC", sans-serif; + color: #555555; + font-weight: normal; + font-size: 13px; /* 调参工具确认 12→13px */ + letter-spacing: 1px; + background: transparent; + """) + + # 🆕 数量:去掉灰色方块,纯文字右对齐(靠 stretch) + lbl_count = QtWidgets.QLabel(str(len(models))) + lbl_count.setStyleSheet(""" + font-family: "Microsoft YaHei", "HarmonyOS Sans SC", "Noto Sans SC", sans-serif; + color: #888888; + font-size: 10px; + font-weight: normal; + background: transparent; + """) + + # 🆕 SVG 箭头(展开=朝下 / 收起=朝右),放在最左 + lbl_chevron = QtWidgets.QLabel() + lbl_chevron.setFixedSize(self.ARROW_SIZE, self.ARROW_SIZE) + lbl_chevron.setPixmap(self._arrow_expanded) + lbl_chevron.setStyleSheet("background: transparent;") + + btn_layout.addWidget(lbl_chevron) + btn_layout.addWidget(icon_lbl) + btn_layout.addWidget(lbl_name) + btn_layout.addStretch() + btn_layout.addWidget(lbl_count) + outer_layout.addWidget(toggle_btn) + + # item 高度 = widget 高度(实测 QSS padding/margin 在 ::item 无效,行高直接等于 widget 高) + header_item.setSizeHint(QtCore.QSize(0, 38)) + self.list_widget.setItemWidget(header_item, header_widget) + toggle_btn.clicked.connect(lambda _checked=False, p=provider_name: self.toggle_group(p)) + + # --- 模型项(model.svg 图标 + 纯模型名) --- + model_items = [] + for model_name in models: + item = QtWidgets.QListWidgetItem(model_name) + item.setIcon(self._model_icon) + # 🐛 显式 sizeHint(宽 0):防止最长模型名把单列网格撑宽超出 viewport + # (网格被撑宽时供应商头 widget 会按网格宽布局 → 右侧数量溢出弹窗外看不见) + item.setSizeHint(QtCore.QSize(0, self.MODEL_ROW_H)) # 调参工具确认 26→27 + item.setData(QtCore.Qt.ItemDataRole.UserRole, (provider_name, model_name)) + self.list_widget.addItem(item) + model_items.append(item) + + self._groups.append({ + "provider": provider_name, + "header_item": header_item, + "model_items": model_items, + "expanded": True, + "chevron": lbl_chevron, + }) + + # ==================== 🆕 抽屉 v2:fade + 相邻供应商行滑移 ==================== + # 收起:A 段(顶部锚定,模型行 27px 不变原地淡出 1→0,下方供应商行整体 + # 上滑逐渐盖住 → 两供应商行合并)+ B 段(整体下滑回座按钮锚点) + # 展开:B' 段(整体上移让位)+ A' 段(顶部锚定,下方供应商行整体下滑打开, + # 模型行淡入 0→1,底缘同步落回按钮)——收起的严格逆过程 + # ⚠️ 窗口几何一律用 delta_h = clamp(终态内容高) - clamp(起态内容高) + # (被 50/400 钳制后的真实窗口高差);内容滑移 dy 才用 span。 + # 列表超长(钳制在 400)时 delta_h 可能 = 0 → 窗口完全不动, + # 动画全部发生在窗口高度之下(滚动区内淡出/滑移)。 + def _natural_content_height(self): + """内容自然总高(可见 item + 10,未钳制;与 adjust_popup_height 同公式)""" + total = 0 + lw = self.list_widget + for i in range(lw.count()): + it = lw.item(i) + if it is None or it.isHidden(): + continue + total += lw.visualItemRect(it).height() + return total + 10 + + def _clamped_h(self, natural): + return max(self.MIN_POPUP_H, min(self.MAX_POPUP_H, natural)) + + def toggle_group(self, provider_name: str): + """点击供应商头 → 折叠/展开该供应商的模型组(🆕 抽屉 v2 动画)""" + g = None + for gg in self._groups: + if gg["provider"] == provider_name: + g = gg + break + if g is None: + return + # 上一个抽屉动画进行中 → 先立即收敛到终态(允许快速连点切换) + self._finish_drawer() + g["expanded"] = not g["expanded"] + # SVG 箭头切换(展开=朝下 / 收起=朝右) + g["chevron"].setPixmap( + self._arrow_collapsed if not g["expanded"] else self._arrow_expanded) + if not self.isVisible(): + # 防御:弹窗未显示时直接应用终态(不播动画) + self._apply_group_state(g) + self._apply_height_and_position() + return + self._start_drawer(g) + + def _apply_group_state(self, g): + """应用组终态:展开=可见 27px 行 / 收起=隐藏(行高恒定不变)""" + for it in g["model_items"]: + it.setSizeHint(QtCore.QSize(0, self.MODEL_ROW_H)) + it.setData(_FADE_ROLE, None) + it.setHidden(not g["expanded"]) + + def _clear_fx(self): + """清除所有淡出/滑移偏移(收敛/打断共用)""" + self.list_widget.clear_slide_offsets() + lw = self.list_widget + for i in range(lw.count()): + it = lw.item(i) + if it is None: + continue + it.setData(_FADE_ROLE, None) + it.setData(_SLIDE_ROLE, None) + + def _set_slide(self, it, dy): + """给单个 item 施加滑移:纯模型行→data role(delegate 绘制); + 供应商头→_SlideListView 偏移(可抗 layout/resize 复位)""" + if self.list_widget.itemWidget(it) is not None: + self.list_widget.set_slide_offset(it, dy) + else: + it.setData(_SLIDE_ROLE, dy if dy else None) + + def _start_drawer(self, g): + """启动抽屉 v2 动画:抓取几何,创建帧定时器""" + timer = QtCore.QTimer(self) + timer.setInterval(self.DRAWER_STEP) + timer.timeout.connect(self._drawer_tick) + n = len(g["model_items"]) + lw = self.list_widget + after = [] + if n: + last_idx = lw.indexFromItem(g["model_items"][-1]).row() + 1 + for i in range(last_idx, lw.count()): + after.append(lw.item(i)) + # 🆕 背景穿透修复:滑移的供应商头(真实控件)铺不透明白底, + # 真正“盖住”底下淡出的模型行;动画收敛时恢复透明 + for it in after: + w = lw.itemWidget(it) + if w is not None: + w.setAttribute(QtCore.Qt.WidgetAttribute.WA_StyledBackground, True) + w.setStyleSheet("background-color: #ffffff;") + # 强制立即生效(stylesheet 默认要等下一次 polish,会留一帧穿透) + st = w.style() + st.unpolish(w) + st.polish(w) + w.update() + self._drawer = { + "group": g, "timer": timer, + "span": self.MODEL_ROW_H * n, # 内容总滑移距离(行高 × 行数) + "after_items": after, # 本组最后一个模型行之后的所有 item + # 收起: A(淡出+滑上 200ms) → B(下滑回座 120ms) + # 展开: B(上移让位 120ms) → A(淡入+滑下 200ms) + "phase": "A" if not g["expanded"] else "B", + "t": 0.0, + "top0": self.y(), + "h0": self.minimumHeight(), + "bottom0": self.y() + self.minimumHeight(), + } + # 🆕 窗口真实高度差(被 50/400 钳制后)——窗口位移/长高只许用这个, + # 不能用 span(内容差):列表超长时窗口被钳在 400,delta_h=0, + # 动画全部发生在窗口高度之下(否则窗口会越界飞走) + natural_now = self._natural_content_height() + natural_final = natural_now + self._drawer["span"] if g["expanded"] \ + else natural_now - self._drawer["span"] + self._drawer["delta_h"] = self._clamped_h(natural_final) - self._clamped_h(natural_now) + timer.start() + + def _drawer_tick(self): + """抽屉 v2 每帧(方向/阶段感知)""" + d = self._drawer + if d is None: + return + g = d["group"] + span = d["span"] + dh = d["delta_h"] # 窗口真实高差(已钳制,可正可负可为 0) + if d["phase"] == "A": + # ---- A 段:顶部锚定(顶部左上角不动,setFixedHeight 天然保顶) ---- + d["t"] = min(1.0, d["t"] + self.DRAWER_STEP / self.DRAWER_DURATION) + e = 1.0 - (1.0 - d["t"]) ** 3 # ease-out 三次缓出 + if g["expanded"]: + # 展开 A':模型行淡入,下方块下滑打开,窗口高按 delta_h 渐长 + for it in g["model_items"]: + it.setData(_FADE_ROLE, e) + dy = -int(round(span * (1.0 - e))) # 内容滑移:-span → 0 + top_fixed = d["top0"] - dh # B' 段已上移到位 + else: + # 收起 A:模型行淡出,下方块上滑盖住,窗口高按 delta_h 渐缩 + for it in g["model_items"]: + it.setData(_FADE_ROLE, 1.0 - e) + dy = -int(round(span * e)) # 内容滑移:0 → -span + top_fixed = d["top0"] + h_new = d["h0"] + int(round(dh * e)) # 只用钳制后的高差 + self.setFixedHeight(max(1, h_new)) + self.move(self.x(), top_fixed) # 显式保顶(稳健) + self.list_widget.doItemsLayout() + for it in d["after_items"]: + self._set_slide(it, dy) + if d["t"] >= 1.0: + if g["expanded"]: + self._finish_drawer() # 展开完成 → 落座 + else: + # 收起 A 完成 → 隐藏行、清滑移,进入 B(下滑回座) + self._apply_group_state(g) + for it in d["after_items"]: + it.setData(_SLIDE_ROLE, None) + self.list_widget.clear_slide_offsets() + self.list_widget.doItemsLayout() + d["phase"] = "B" + d["t"] = 0.0 + d["h0"] = self.minimumHeight() + else: + # ---- B 段:整体平移回座(收起=下滑 / 展开=上移;距离 = |delta_h|) ---- + d["t"] = min(1.0, d["t"] + self.DRAWER_STEP / self.DRAWER_SETTLE) + e = 1.0 - (1.0 - d["t"]) ** 3 + delta = int(round(abs(dh) * e)) + if g["expanded"]: + self.move(self.x(), d["top0"] - delta) # 展开 B':整体上移让位 + if d["t"] >= 1.0: + # B' 完成 → 模型行以透明态就位(27px 恒高),进入 A' 淡入 + for it in g["model_items"]: + it.setHidden(False) + it.setSizeHint(QtCore.QSize(0, self.MODEL_ROW_H)) + it.setData(_FADE_ROLE, 0.0) + self.list_widget.doItemsLayout() + d["phase"] = "A" + d["t"] = 0.0 + d["h0"] = self.minimumHeight() + return + else: + self.move(self.x(), d["top0"] + delta) # 收起 B:整体下滑回座 + if d["t"] >= 1.0: + self._finish_drawer() + + def _finish_drawer(self): + """抽屉动画收敛到终态(动画完成 / 连点打断共用)""" + d = self._drawer + if d is None: + return + d["timer"].stop() + self._drawer = None + # 🆕 恢复滑移供应商头的透明背景(_start_drawer 里铺的白底) + for it in d["after_items"]: + w = self.list_widget.itemWidget(it) + if w is not None: + w.setStyleSheet("") + w.setAttribute(QtCore.Qt.WidgetAttribute.WA_StyledBackground, False) + self._clear_fx() + self._apply_group_state(d["group"]) + self.list_widget.doItemsLayout() + self.adjust_popup_height() + if not self.isVisible(): + return + parent = self.parentWidget() + btn = getattr(parent, "model_selector", None) if parent else None + if btn is not None: + # 真实 App:回到“按钮正上方右对齐”锚点 + btn_pos = btn.mapToGlobal(QtCore.QPoint(0, 0)) + self.move(btn_pos.x() + btn.width() - self.width(), + btn_pos.y() - self.minimumHeight() - 5) + elif d.get("bottom0") is not None: + # 无锚定按钮(如调参工具宿主):保持动画起点底缘不漂 + self.move(self.x(), d["bottom0"] - self.minimumHeight()) + + def _apply_height_and_position(self): + """折叠/展开后:按可见项重算高度;若弹窗正显示中,保持“按钮正上方右对齐”锚点""" + self.adjust_popup_height() + if not self.isVisible(): + return + parent = self.parentWidget() + btn = getattr(parent, "model_selector", None) + if btn is None: + return + btn_pos = btn.mapToGlobal(QtCore.QPoint(0, 0)) + x = btn_pos.x() + btn.width() - self.width() + y = btn_pos.y() - self.height() - 5 + self.move(x, y) + + def adjust_popup_height(self): + self.list_widget.doItemsLayout() + total_height = 0 + for i in range(self.list_widget.count()): + it = self.list_widget.item(i) + if it.isHidden(): + continue + rect = self.list_widget.visualItemRect(it) + total_height += rect.height() + + target_height = total_height + 10 + + if target_height > 400: + target_height = 400 + elif target_height < 50: + target_height = 50 + + self.setFixedHeight(target_height) + + # ==================== 🌟 核心新增:丝滑浮现动画 ==================== + def show_with_animation(self, target_pos: QtCore.QPoint): + """带透明度和位移的弹出动画""" + # 初始状态:完全透明,且位置比目标位置低 15 个像素 + self.setWindowOpacity(0.0) + self.move(target_pos.x(), target_pos.y() + 15) + self.show() + + # 创建并行动画组 (同时执行位移和透明度) + self.anim_group = QtCore.QParallelAnimationGroup(self) + + # 1. 透明度动画 (0.0 -> 1.0) + self.opacity_anim = QtCore.QPropertyAnimation(self, b"windowOpacity") + self.opacity_anim.setDuration(150) # 150毫秒,极速响应 + self.opacity_anim.setStartValue(0.0) + self.opacity_anim.setEndValue(1.0) + self.opacity_anim.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) # 缓出曲线,非常自然 + + # 2. 位移动画 (向上滑动 15 像素) + self.pos_anim = QtCore.QPropertyAnimation(self, b"pos") + self.pos_anim.setDuration(150) + self.pos_anim.setStartValue(QtCore.QPoint(target_pos.x(), target_pos.y() + 15)) + self.pos_anim.setEndValue(target_pos) + self.pos_anim.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) + + self.anim_group.addAnimation(self.opacity_anim) + self.anim_group.addAnimation(self.pos_anim) + self.anim_group.start() + + def on_item_clicked(self, item): + data = item.data(QtCore.Qt.ItemDataRole.UserRole) + if data: + provider, model = data + self.model_selected.emit(provider, model) + self.close() + + +class _ModeRow(QtWidgets.QWidget): + """会话模式弹窗的单个行控件:左图标 + 右两行文字(名称/作用),自管 hover/选中/点击""" + row_clicked = QtCore.pyqtSignal(str) + + ICON_SIZE = 14 + + def __init__(self, mode: str, name: str, desc: str, icon_path: str, parent=None): + super().__init__(parent) + self.mode = mode + self._selected = False + self._hover = False + self._normal_bg = "transparent" + self._hover_bg = "#f0f4f9" + + layout = QtWidgets.QHBoxLayout(self) + layout.setContentsMargins(10, 8, 12, 8) + layout.setSpacing(12) + + # 左:SVG 图标(必须显式 transparent:行级 background-color 会传染给未声明背景的子控件, + # 否则选中/悬停时图标会被涂成浅色色块) + self.lbl_icon = QtWidgets.QLabel() + self.lbl_icon.setStyleSheet("background: transparent;") + self.lbl_icon.setFixedSize(self.ICON_SIZE, self.ICON_SIZE) + pix = QtGui.QPixmap(icon_path) + if not pix.isNull(): + self.lbl_icon.setPixmap(pix.scaled( + self.ICON_SIZE, self.ICON_SIZE, + QtCore.Qt.AspectRatioMode.KeepAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation)) + + # 右:两行(名称 + 作用) + self.lbl_name = QtWidgets.QLabel(name) + self.lbl_name.setStyleSheet(""" + font-family: "HarmonyOS Sans SC", "Microsoft YaHei UI", "微软雅黑", sans-serif; + font-size: 12px; font-weight: bold; color: #333333; + background: transparent; + """) + self.lbl_desc = QtWidgets.QLabel(desc) + self.lbl_desc.setStyleSheet(""" + font-family: "HarmonyOS Sans SC", "Microsoft YaHei UI", "微软雅黑", sans-serif; + font-size: 12px; color: #888888; + background: transparent; + """) + txt = QtWidgets.QVBoxLayout() + txt.setContentsMargins(0, 0, 0, 0) + txt.setSpacing(4) + txt.addWidget(self.lbl_name) + txt.addWidget(self.lbl_desc) + + layout.addWidget(self.lbl_icon, 0, QtCore.Qt.AlignmentFlag.AlignVCenter) + layout.addLayout(txt, 1) + + # ---- 状态与样式 ---- + def set_selected(self, selected: bool): + self._selected = selected + self._apply() + + def _apply(self): + if self._selected: + self._normal_bg = "#e8f0fe" + name_color, name_weight = "#1a73e8", "bold" + else: + self._normal_bg = "transparent" + name_color, name_weight = "#333333", "bold" + self.setStyleSheet( + f"background-color: {self._hover_bg if self._hover else self._normal_bg};" + "border-radius: 8px;") + self.lbl_name.setStyleSheet(f""" + font-family: "HarmonyOS Sans SC", "Microsoft YaHei UI", "微软雅黑", sans-serif; + font-size: 13px; font-weight: {name_weight}; color: {name_color}; + background: transparent; + """) + + def _hover_set(self, on: bool): + self._hover = on + self._apply() + + def enterEvent(self, e): # noqa: N802 + self._hover_set(True) + super().enterEvent(e) + + def leaveEvent(self, e): # noqa: N802 + self._hover_set(False) + super().leaveEvent(e) + + def mouseReleaseEvent(self, e): # noqa: N802 + if e.button() == QtCore.Qt.MouseButton.LeftButton: + self.row_clicked.emit(self.mode) + super().mouseReleaseEvent(e) + + +class SessionModePopup(QtWidgets.QWidget): + """ + 🆕 会话模式选择浮动弹窗(无边框浮动窗 + 150ms 透明淡入 + 15px 上移丝滑浮现动画) + 改版:去掉「会话模式」标题行;每行 = 左 SVG 图标 + 右两行文字(名称/作用) + """ + mode_selected = QtCore.pyqtSignal(str) + + MODES = ( + ("chat", "Chat 模式", "普通问答,无工具调用", "mode_chat.svg"), + ("worker", "Worker 模式", "Agent 循环:工具 / 重试 / 压缩", "mode_worker.svg"), + ) + ROW_HEIGHT = 56 + + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowFlags(QtCore.Qt.WindowType.Popup | QtCore.Qt.WindowType.FramelessWindowHint) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground) + self.setFixedWidth(320) + self.setup_ui() + self.adjust_popup_height() + + def setup_ui(self): + self.container = QtWidgets.QFrame(self) + self.container.setObjectName("popup_container") + self.main_layout = QtWidgets.QVBoxLayout(self) + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.main_layout.addWidget(self.container) + + self.container_layout = QtWidgets.QVBoxLayout(self.container) + self.container_layout.setContentsMargins(4, 4, 4, 4) + self.container_layout.setSpacing(2) + + for mode, name, desc, icon in self.MODES: + row = _ModeRow(mode, name, desc, _popup_svg_path(icon), self.container) + row.row_clicked.connect(self.on_row_clicked) + self.container_layout.addWidget(row) + + self.setStyleSheet(""" + * { + font-family: "HarmonyOS Sans SC", "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", sans-serif; + } + #popup_container { + background-color: #ffffff; + border: 1px solid #dcdcdc; + border-radius: 10px; + } + """) + + def on_row_clicked(self, mode: str): + if mode: + self.mode_selected.emit(mode) + self.close() + + def mark_selected(self, mode): + # 行控件直管选中态 + for w in self.container.findChildren(_ModeRow): + w.set_selected(w.mode == mode) + + def adjust_popup_height(self): + # 无列表:直接取内容提示高度(两行 + 容器边距) + target_height = self.container.sizeHint().height() + 2 + if target_height > 400: + target_height = 400 + elif target_height < 50: + target_height = 50 + self.setFixedHeight(target_height) + + def show_with_animation(self, target_pos: QtCore.QPoint): + """带透明度和位移的弹出动画(与模型选择弹窗同款风格)""" + self.setWindowOpacity(0.0) + self.move(target_pos.x(), target_pos.y() + 15) + self.show() + self.anim_group = QtCore.QParallelAnimationGroup(self) + self.opacity_anim = QtCore.QPropertyAnimation(self, b"windowOpacity") + self.opacity_anim.setDuration(150) + self.opacity_anim.setStartValue(0.0) + self.opacity_anim.setEndValue(1.0) + self.opacity_anim.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) + self.pos_anim = QtCore.QPropertyAnimation(self, b"pos") + self.pos_anim.setDuration(150) + self.pos_anim.setStartValue(QtCore.QPoint(target_pos.x(), target_pos.y() + 15)) + self.pos_anim.setEndValue(target_pos) + self.pos_anim.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) + self.anim_group.addAnimation(self.opacity_anim) + self.anim_group.addAnimation(self.pos_anim) + self.anim_group.start() + + +# ==================== 🌟 PDF 图片提取子线程工作者 ==================== +class _PdfImageExtractWorker(QtCore.QObject): + """在独立线程里调用 pdf_reader 提取 PDF 内嵌图片,避免大文件解析阻塞 UI。 + + 通过 finished / failed 信号把结果送回主线程。本类不持有任何控件引用, + 因此可安全地 moveToThread 到子线程运行;线程与工作者均无父级、自管理生命周期 + (finished 后各自 deleteLater),即使弹窗中途关闭也不会因删除运行中的线程而崩溃。 + """ + finished = QtCore.pyqtSignal(list) # 提取到的图片元数据列表 + failed = QtCore.pyqtSignal(str) # 失败原因 + + def __init__(self, pdf_abs: str, out_dir: str): + super().__init__() + self.pdf_abs = pdf_abs + self.out_dir = out_dir + + def run(self): + try: + raw = extract_pdf_images(self.pdf_abs, self.out_dir) + except (ValueError, OSError) as e: + self.failed.emit(str(e)) + return + images = [] + for im in raw: + images.append({ + "page": im["page"], "index": im["index"], + "local_path": f"data/attachments/{os.path.basename(im['abs_path'])}", + "abs_path": im["abs_path"], + "mime": im["mime"], "size_kb": im["size_kb"], + "width": im["width"], "height": im["height"], + }) + self.finished.emit(images) + + +# ==================== 🌟 PDF 解析模式候选栏 ==================== +class PdfModePopup(QtWidgets.QWidget): + """PDF 附件的解析模式候选栏(弹出于 PDF 标签正上方,仿 ModelSelectPopup)。 + + - 两个互斥模式按钮:文本读取模式 / 图片解析模式。 + - 选中图片模式后懒提取 PDF 全部内嵌图片,展开纯文字勾选列表(默认不勾选), + 提供“全选”,每项可调用原生预览层查看图片。 + - 鼠标移出框边界即淡出消失;点击按钮不会关闭。 + - 通过 mode_changed / preview_requested 信号与主窗口通信, + 并直接读写共享的 att_data(mode / images / selected_images)。 + """ + mode_changed = QtCore.pyqtSignal(str) # "text" / "image" + preview_requested = QtCore.pyqtSignal(dict, list, int, dict) # 当前图 meta, 同组列表, 下标, 附件字典 + + # ---- 布局尺寸常量(_setup_ui 与 _adjust_size 共用,保证估算与实际一致)---- + POPUP_W = 360 # 弹窗固定宽度 + MARGIN = 12 # 容器四周留白 + SPACING = 10 # 主布局控件间距 + TITLE_H = 24 # 标题行高 + BTN_H = 36 # 模式按钮高度 + ROW_H = 40 # 图片列表单行高度 + MAX_VISIBLE_ROWS = 6 # 图片列表最多显示行数(超出滚动) + + def __init__(self, att_data, parent=None): + super().__init__(parent) + self.setWindowFlags(QtCore.Qt.WindowType.Popup | QtCore.Qt.WindowType.FramelessWindowHint) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground) + self.setMouseTracking(True) + self.att_data = att_data + self.setFixedWidth(self.POPUP_W) + self._left_x = 0 + self._bottom_y = 0 + self._row_checks = [] # 每行勾选框引用 + self._processing = False # 是否正在子线程解析图片 + self._dot_count = 0 # “正在处理...”动态省略号计数 + self._extract_thread = None # 当前解析线程(无父级,自管理生命周期) + self._extract_worker = None + self._dot_timer = QtCore.QTimer(self) + self._dot_timer.setInterval(400) + self._dot_timer.timeout.connect(self._tick_dots) + self._setup_ui() + self._apply_mode(att_data.get("mode", "text"), first=True) + + def _setup_ui(self): + self.container = QtWidgets.QFrame(self) + self.container.setObjectName("pdf_popup_container") + self.container.setMouseTracking(True) + outer = QtWidgets.QVBoxLayout(self) + outer.setContentsMargins(0, 0, 0, 0) + outer.addWidget(self.container) + + lay = QtWidgets.QVBoxLayout(self.container) + lay.setContentsMargins(self.MARGIN, self.MARGIN, self.MARGIN, self.MARGIN) + lay.setSpacing(self.SPACING) + + # 标题 + title = QtWidgets.QLabel(f"PDF 解析模式 · {self.att_data.get('name', '')}") + title.setFixedHeight(self.TITLE_H) + title.setStyleSheet("color:#333333; font-size:13px; font-weight:bold;") + lay.addWidget(title) + + # 两个模式按钮(互斥) + self.btn_text = QtWidgets.QPushButton("📝 文本读取模式") + self.btn_image = QtWidgets.QPushButton("🖼️ 图片解析模式") + for b in (self.btn_text, self.btn_image): + b.setCheckable(True) + b.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + b.setFixedHeight(self.BTN_H) + self.btn_text.clicked.connect(lambda: self._apply_mode("text")) + self.btn_image.clicked.connect(lambda: self._apply_mode("image")) + lay.addWidget(self.btn_image) # 图片解析模式在上 + lay.addWidget(self.btn_text) # 文本读取模式在下 + + # 图片区(默认隐藏,选中图片模式后展开) + self.image_section = QtWidgets.QWidget() + img_lay = QtWidgets.QVBoxLayout(self.image_section) + img_lay.setContentsMargins(0, 2, 0, 0) + img_lay.setSpacing(8) + + head = QtWidgets.QHBoxLayout() + self.select_all_cb = QtWidgets.QCheckBox("全选") + self.select_all_cb.stateChanged.connect(self._on_select_all) + self.lbl_img_count = QtWidgets.QLabel("已提取 0 张") + self.lbl_img_count.setStyleSheet("color:#888888; font-size:11px;") + head.addWidget(self.select_all_cb) + head.addStretch() + head.addWidget(self.lbl_img_count) + img_lay.addLayout(head) + + self.image_list = QtWidgets.QListWidget() + self.image_list.setObjectName("pdf_image_list") + self.image_list.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel) + self.image_list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + img_lay.addWidget(self.image_list) + + self.lbl_empty = QtWidgets.QLabel("该 PDF 未提取到内嵌图片") + self.lbl_empty.setStyleSheet("color:#aaaaaa; font-size:12px; padding:6px;") + self.lbl_empty.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.lbl_empty.setVisible(False) + img_lay.addWidget(self.lbl_empty) + + # 子线程解析期间的动态提示(与列表/空提示互斥显示) + self.lbl_processing = QtWidgets.QLabel("正在处理") + self.lbl_processing.setStyleSheet("color:#1a73e8; font-size:13px; padding:14px;") + self.lbl_processing.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.lbl_processing.setVisible(False) + img_lay.addWidget(self.lbl_processing) + + lay.addWidget(self.image_section) + self.image_section.setVisible(False) + + self.setStyleSheet(""" + * { font-family: "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", sans-serif; } + #pdf_popup_container { background-color:#ffffff; border:1px solid #dcdcdc; border-radius:10px; } + #pdf_popup_container > QPushButton { + background-color:#f5f5f5; color:#444444; border:1px solid #e5e5e5; + border-radius:6px; font-size:13px; text-align:left; padding:0 12px; + } + #pdf_popup_container > QPushButton:hover { border:1px solid #b3d9ff; color:#0066cc; } + #pdf_popup_container > QPushButton:checked { + background-color:#e8f0fe; color:#1a73e8; border:1px solid #b3d9ff; font-weight:bold; + } + #pdf_image_list { border:1px solid #eeeeee; border-radius:6px; background:#fafafa; outline:none; } + #pdf_image_list::item { padding:0px; margin:0px; border:none; background:transparent; } + #pdf_image_list::item:hover { background:#f0f7ff; } + QCheckBox { font-size:13px; color:#333333; } + QScrollBar:vertical { border:none; background:transparent; width:5px; margin:2px 2px 2px 0px; } + QScrollBar::handle:vertical { background:#d0d0d0; min-height:20px; border-radius:2px; } + QScrollBar::handle:vertical:hover { background:#a0a0a0; } + QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height:0px; } + """) + + # ---------- 模式切换 ---------- + def _apply_mode(self, mode, first=False): + self.att_data["mode"] = mode + is_image = (mode == "image") + self.btn_text.setChecked(not is_image) + self.btn_image.setChecked(is_image) + self.image_section.setVisible(is_image) + if is_image: + if self.att_data.get("images"): + # 已缓存:直接渲染,不重复解析(一个文档只解析一次) + self._set_processing(False) + self._populate_image_list() + else: + # 首次:子线程解析,期间显示动态“正在处理...” + self._start_extract_async() + else: + self._set_processing(False) + self._adjust_size() + if not first: + self.mode_changed.emit(mode) + + # ---------- 子线程图片解析 ---------- + def _start_extract_async(self): + """启动子线程提取 PDF 内嵌图片,期间 UI 显示动态“正在处理...”。""" + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + pdf_abs = os.path.join(root_dir, self.att_data.get("local_path", "")) + out_dir = os.path.join(root_dir, "data", "attachments") + + self._set_processing(True) + self._extract_thread = QtCore.QThread() # 无父级,自管理生命周期 + self._extract_worker = _PdfImageExtractWorker(pdf_abs, out_dir) + self._extract_worker.moveToThread(self._extract_thread) + self._extract_thread.started.connect(self._extract_worker.run) + self._extract_worker.finished.connect(self._on_extract_done) + self._extract_worker.failed.connect(self._on_extract_failed) + self._extract_worker.finished.connect(self._extract_thread.quit) + self._extract_worker.failed.connect(self._extract_thread.quit) + # 线程/工作者结束后各自销毁,弹窗中途关闭也不会删除运行中的线程 + self._extract_thread.finished.connect(self._extract_thread.deleteLater) + self._extract_worker.finished.connect(self._extract_worker.deleteLater) + self._extract_worker.failed.connect(self._extract_worker.deleteLater) + self._extract_thread.start() + + def _set_processing(self, on: bool): + """切换“处理中 / 正常”两种界面状态(列表、空提示、按钮、计数互斥)。""" + self._processing = on + has_imgs = len(self.att_data.get("images", [])) > 0 + self.lbl_processing.setVisible(on) + self.image_list.setVisible((not on) and has_imgs) + self.lbl_empty.setVisible((not on) and not has_imgs) + self.btn_text.setEnabled(not on) + self.btn_image.setEnabled(not on) + self.select_all_cb.setEnabled(not on) + if on: + self.lbl_img_count.setText("处理中…") + self._dot_count = 0 + self.lbl_processing.setText("正在处理") + self._dot_timer.start() + else: + self._dot_timer.stop() + + def _tick_dots(self): + """动态省略号:正在处理. → .. → ... 循环。""" + self._dot_count = (self._dot_count % 3) + 1 + self.lbl_processing.setText("正在处理" + "." * self._dot_count) + + def _on_extract_done(self, images): + """子线程解析成功:缓存结果(此后不再重复解析)并渲染列表。""" + self.att_data["images"] = images + self.att_data["selected_images"] = [] # 默认不勾选 + self._set_processing(False) + self._populate_image_list() + self._adjust_size() + + def _on_extract_failed(self, msg): + """子线程解析失败:按“无图片”处理,不阻断其它操作。""" + print(f"[Warn]: PDF 图片解析失败: {msg}") + self.att_data["images"] = [] + self._set_processing(False) + self._populate_image_list() + self._adjust_size() + + def closeEvent(self, event): + """关闭时停掉动画定时器;解析线程自管理,无需在此阻塞等待。""" + self._dot_timer.stop() + super().closeEvent(event) + + def _populate_image_list(self): + self.image_list.clear() + self._row_checks = [] + images = self.att_data.get("images", []) + selected_paths = {s["local_path"] for s in self.att_data.get("selected_images", [])} + self.lbl_img_count.setText(f"已提取 {len(images)} 张") + self.lbl_empty.setVisible(len(images) == 0) + self.image_list.setVisible(len(images) > 0) # 无图时不显示空白列表框 + for im in images: + item = QtWidgets.QListWidgetItem(self.image_list) + item.setSizeHint(QtCore.QSize(0, self.ROW_H)) + row = QtWidgets.QWidget() + row.setFixedHeight(self.ROW_H) + hl = QtWidgets.QHBoxLayout(row) + hl.setContentsMargins(16, 0, 16, 0) + hl.setSpacing(14) + cb = QtWidgets.QCheckBox(f"第 {im['page']} 页 no.{im['index']}") + cb.setFixedHeight(self.ROW_H) # 撑满行高,由 QStyle 在整行内垂直居中文字 + cb.setChecked(im["local_path"] in selected_paths) # 还原上次勾选(在 connect 前设置,不触发信号) + cb.stateChanged.connect(lambda st, m=im: self._on_row_toggled(m, st)) + btn = QtWidgets.QPushButton("预览") + btn.setFixedSize(56, 28) + btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn.setStyleSheet( + "QPushButton{background:#eeeeee;border:none;border-radius:6px;color:#555555;font-size:12px;}" + "QPushButton:hover{background:#d9e8ff;color:#1a73e8;}" + ) + btn.clicked.connect(lambda chk=False, m=im: self._request_preview(m)) + # checkbox 已撑满行高(内容自居中);预览按钮较小,显式垂直居中 + hl.addWidget(cb) + hl.addStretch() + hl.addWidget(btn, 0, QtCore.Qt.AlignmentFlag.AlignVCenter) + self.image_list.addItem(item) + self.image_list.setItemWidget(item, row) + self._row_checks.append(cb) + # 列表高度:最多显示 MAX_VISIBLE_ROWS 行,超出滚动;上下各留 6px 内边距 + rows = min(max(len(images), 1), self.MAX_VISIBLE_ROWS) + self.image_list.setFixedHeight(rows * self.ROW_H + 12) + n = len(self._row_checks) + k = sum(1 for c in self._row_checks if c.isChecked()) + self.select_all_cb.blockSignals(True) + self.select_all_cb.setChecked(n > 0 and k == n) # 还原“全选”勾选态 + self.select_all_cb.blockSignals(False) + + # ---------- 勾选逻辑 ---------- + def _on_row_toggled(self, im, state): + checked = (state == QtCore.Qt.CheckState.Checked.value) + sel = self.att_data.setdefault("selected_images", []) + if checked: + if not any(s["local_path"] == im["local_path"] for s in sel): + sel.append(im) + else: + self.att_data["selected_images"] = [s for s in sel if s["local_path"] != im["local_path"]] + n = len(self._row_checks) + k = sum(1 for c in self._row_checks if c.isChecked()) + self.select_all_cb.blockSignals(True) + self.select_all_cb.setChecked(n > 0 and k == n) + self.select_all_cb.blockSignals(False) + + def _on_select_all(self, state): + checked = (state == QtCore.Qt.CheckState.Checked.value) + for cb in self._row_checks: + cb.blockSignals(True) + cb.setChecked(checked) + cb.blockSignals(False) + self.att_data["selected_images"] = list(self.att_data.get("images", [])) if checked else [] + + def _request_preview(self, im): + """呼叫主窗口用原生预览层查看该图片,并带上同组图片供左右翻页。 + + 先立即关闭本弹窗(越快越好),再让主窗口打开预览覆盖层。 + """ + base_name = self.att_data.get("name", "") + images = self.att_data.get("images", []) + siblings = [{ + "type": "image", + "name": f'{base_name} · 第 {x["page"]} 页 no.{x["index"]}', + "local_path": x["local_path"], + "mime": x["mime"], + "size_kb": x.get("size_kb", 0), + } for x in images] + index = next((i for i, x in enumerate(images) if x["local_path"] == im["local_path"]), 0) + self.close() # 解析选择窗口立即消失 + self.preview_requested.emit(siblings[index], siblings, index, self.att_data) + + # ---------- 尺寸与定位 ---------- + def _adjust_size(self): + # 高度 = 上边距 + 标题 + 间距 + 两按钮 + [图片区] + 下边距,全部取自布局常量 + m = self.MARGIN + h = m + self.TITLE_H + self.SPACING + self.BTN_H + self.SPACING + self.BTN_H + # 用 mode 而非 image_section.isVisible():构造期弹窗未 show,isVisible() 恒为 False, + # 会导致图片模式被误判成文本模式、按矮高度计算从而压扁列表 + if self.att_data.get("mode") == "image": + if self._processing: + body_h = 46 # “正在处理...”动态提示区 + else: + n = len(self.att_data.get("images", [])) + if n == 0: + body_h = 30 # “未提取到图片”提示行 + else: + rows = min(n, self.MAX_VISIBLE_ROWS) + body_h = rows * self.ROW_H + 12 # 列表行高 + 上下内边距 + h += self.SPACING + (2 + 26 + 8 + body_h) # 间距 + 图片区(上边距+表头+间距+主体) + h += m + self.setFixedHeight(int(h)) + if self._bottom_y: # 保持底边锚定在标签上方 + self.move(self._left_x, self._bottom_y - self.height()) + + def show_with_animation(self, target_pos: QtCore.QPoint): + """淡入 + 上滑弹出(仿 ModelSelectPopup),并记录锚点供增高时重新定位。""" + self._left_x = target_pos.x() + self.setWindowOpacity(0.0) + self.move(target_pos.x(), target_pos.y() + 15) + self.show() + self._bottom_y = target_pos.y() + self.height() + + self.anim_group = QtCore.QParallelAnimationGroup(self) + op = QtCore.QPropertyAnimation(self, b"windowOpacity") + op.setDuration(150); op.setStartValue(0.0); op.setEndValue(1.0) + op.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) + ps = QtCore.QPropertyAnimation(self, b"pos") + ps.setDuration(150) + ps.setStartValue(QtCore.QPoint(target_pos.x(), target_pos.y() + 15)) + ps.setEndValue(target_pos) + ps.setEasingCurve(QtCore.QEasingCurve.Type.OutQuad) + self.anim_group.addAnimation(op) + self.anim_group.addAnimation(ps) + self.anim_group.start() + + # 关闭方式:依赖 Qt.Popup 原生行为——点击弹窗以外任意区域即关闭(与 ModelSelectPopup 一致), + # 鼠标移出不再关闭。 + + +# ==================== 可点击标签(附件预览用) ==================== +class ClickableLabel(QtWidgets.QLabel): + """鼠标悬停显示下划线、点击发射 clicked 信号的 QLabel""" + clicked = QtCore.pyqtSignal() + + def mousePressEvent(self, event): + if event.button() == QtCore.Qt.MouseButton.LeftButton: + self.clicked.emit() + + +# ==================== 🌟 自定义网页滚动条 ==================== +class WebScrollBar(QtWidgets.QWidget): + """自定义网页滚动条:完全镜像 QtWebEngine 页面滚动。 + + - 位置镜像:页面 scrollY ↔ 滑块位置(双向,经 QWebChannel) + - 长度镜像:滑块高度 ∝ 视口/内容比例(内容长→滑块短;内容短→滑块长) + - 交互:拖动滑块 / 点击轨道跳转 / 滚轮翻页 均回写页面 window.scrollTo + - 全程无浏览器原生滚动条参与(原生已被 CSS 隐藏),避免重绘延迟观感 + """ + TRACK_MARGIN_X = 4 # 轨道左右边距 + MIN_SLIDER_H = 30 # 滑块最小高度 + WHEEL_STEP = 60 # 滚轮单格滚动像素 + + def __init__(self, bridge, parent=None): + super().__init__(parent) + self.bridge = bridge + self.setFixedWidth(16) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True) + self.setMouseTracking(True) + self.setStyleSheet(self._qss()) + + self.track = QtWidgets.QFrame(self) + self.track.setObjectName("web_scroll_track") + self.track.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents, True) + + self.slider = QtWidgets.QFrame(self) + self.slider.setObjectName("web_scroll_slider") + self.slider.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents, True) + + self._y = 0.0 # 页面 scrollY + self._content = 1.0 # 页面 scrollHeight + self._client = 1.0 # 页面 innerHeight + self._track_h = 0 + self._slider_h = 0 + self._slider_y = 0 + self._hover = False + self._dragging = False + self._drag_grab = 0 # 按下时指针相对滑块顶部的偏移 + + def _qss(self): + return """ + #web_scroll_track { background: rgba(0,0,0,0.05); border-radius: 4px; } + #web_scroll_slider { background-color: rgba(0,0,0,0.16); border-radius: 4px; } + #web_scroll_slider[state="hover"] { background-color: rgba(0,0,0,0.30); } + #web_scroll_slider[state="drag"] { background-color: rgba(37,99,235,0.60); } + """ + + # ---------------- 页面 → 控件(镜像方向 1) ---------------- + def set_scroll_info(self, y, content, client): + """前端上报页面滚动状态后调用,刷新滑块位置与长度。""" + self._y = float(y) + self._content = float(content) if content > 0 else 1.0 + self._client = float(client) + self._layout_slider() + + def _scrollable(self): + return self._content > self._client + 1 + + def _layout_slider(self): + self._track_h = self.height() + if self._track_h <= 0: + return + track_w = self.width() - 2 * self.TRACK_MARGIN_X + self.track.setGeometry(self.TRACK_MARGIN_X, 0, track_w, self._track_h) + + if not self._scrollable(): + self.slider.hide() + return + self.slider.show() + + # 🌟 滑块高度 = 视口占比 × 轨道高(内容越长滑块越短),带最小高度 + sh = max(self.MIN_SLIDER_H, int(self._track_h * (self._client / self._content))) + sh = min(sh, self._track_h) + span = self._track_h - sh + + # 🌟 位置镜像:页面滚动比例 → 滑块位置比例 + max_scroll = self._content - self._client + if max_scroll <= 0: + y_frac = 0.0 + else: + y_frac = min(1.0, max(0.0, self._y / max_scroll)) + + self._slider_h = sh + self._slider_y = int(y_frac * span) + self.slider.setGeometry(self.TRACK_MARGIN_X, self._slider_y, track_w, sh) + + # ---------------- 控件 → 页面(镜像方向 2) ---------------- + def _slider_y_to_page(self, slider_y): + if not self._scrollable(): + return 0.0 + span = self._track_h - self._slider_h + if span <= 0: + return 0.0 + frac = min(1.0, max(0.0, slider_y / span)) + return frac * (self._content - self._client) + + def _scroll_page_to_y(self, y): + max_scroll = self._content - self._client + if max_scroll <= 0: + y = 0.0 + y = min(max_scroll, max(0.0, y)) + self._y = y + # 统一走 webScrollTo(内部经 document.scrollingElement,兼容 body 内部滚动容器) + self.bridge.run_js(f"webScrollTo({int(y)});") + + # ---------------- 鼠标/滚轮交互 ---------------- + def mousePressEvent(self, event): + if event.button() != QtCore.Qt.MouseButton.LeftButton or not self._scrollable(): + return super().mousePressEvent(event) + if self.slider.isVisible(): + sr = self.slider.geometry() + if sr.contains(event.pos()): + # 拖动滑块 + self._dragging = True + self._drag_grab = event.pos().y() - sr.y() + self._apply_state() + event.accept() + return + # 点击轨道:滑块跳跃到点击处 + target = event.pos().y() - self._slider_h // 2 + self._scroll_page_to_y(self._slider_y_to_page(target)) + self._layout_slider() + event.accept() + + def mouseMoveEvent(self, event): + if self._dragging: + slider_y = event.pos().y() - self._drag_grab + self._scroll_page_to_y(self._slider_y_to_page(slider_y)) + self._layout_slider() + event.accept() + return + # hover 反馈 + hover = self.slider.isVisible() and self.slider.geometry().contains(event.pos()) + if hover != self._hover: + self._hover = hover + self.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) if hover else self.unsetCursor() + self._apply_state() + super().mouseMoveEvent(event) + + def mouseReleaseEvent(self, event): + if self._dragging and event.button() == QtCore.Qt.MouseButton.LeftButton: + self._dragging = False + self._apply_state() + event.accept() + return + super().mouseReleaseEvent(event) + + def leaveEvent(self, event): + self._hover = False + self.unsetCursor() + self._apply_state() + super().leaveEvent(event) + + def wheelEvent(self, event): + delta = event.angleDelta().y() + if delta == 0: + event.accept() + return + self._scroll_page_to_y(self._y + (self.WHEEL_STEP if delta > 0 else -self.WHEEL_STEP)) + self._layout_slider() + event.accept() + + def resizeEvent(self, event): + super().resizeEvent(event) + self._layout_slider() + + def _apply_state(self): + """按 hover / 拖动 状态刷新滑块 QSS""" + state = "drag" if self._dragging else ("hover" if self._hover else "normal") + self.slider.setProperty("state", state) + self.slider.style().unpolish(self.slider) + self.slider.style().polish(self.slider) + + +# ==================== 主窗口 ==================== +class MainWindow(QtWidgets.QMainWindow): + def __init__(self): + super().__init__() + self.setWindowTitle("haocode - 极客级协同系统") + self.resize(1100, 800) + self.setMinimumSize(900, 600) + + # 🌟 侧边栏收缩状态(False=展开 260px / True=收缩为 52px 细条) + self.sidebar_collapsed = False + self._sidebar_anim = None + self._sidebar_target = False + + # 🌟 v2: 恢复 Windows 11 原生边框(移除无边框自绘标题栏)。 + # 原生标题栏自带 最小化/最大化/关闭、窗口拖拽、边缘吸附与圆角; + # 自绘按钮、EdgeGrip 拉伸、四分屏吸附逻辑全部移除,交给 DWM 接管。 + + # 🌟 调试标记:设置 HAOCODE_WINDOW_TAG=xxx 可在标题栏追加标记, + # 用于多实例(如 A/B 渲染模式对比)时区分窗口,平时不设置则无影响。 + _win_title = "haocode" + _win_tag = os.environ.get("HAOCODE_WINDOW_TAG", "") + if _win_tag: + _win_title = f"{_win_title} [{_win_tag}]" + self.setWindowTitle(_win_title) + + self.setup_ui() + self.setup_stylesheet() + + # 🌟 初始化模型选择与发送逻辑 + self.current_provider = None + self.current_model = None + self.worker = None + + self.is_generating = False + self._was_cancelled = False + + # 🌟 提前初始化(init_model_popup 内部会触发 update_context_display 用到) + self._active_streams = {} + self._diag_chunk_n = 0 + self._diag_think_n = 0 + try: + open(DIAG_LOG_PATH, "w").close() + diag_log("APP_START") + except Exception: + pass + # 🌟 渲染看门狗:若前端 rAF/定时器被浏览器节流(窗口隐藏/GPU 问题), + # 由 Qt 侧定时器每 200ms 主动 forceRenderNow,保证流式正文一定上屏 + self._render_watchdog = QtCore.QTimer(self) + self._render_watchdog.setInterval(200) + self._render_watchdog.timeout.connect(self._render_watchdog_tick) + self._render_watchdog.start() + # 人肉 debug:JS console 桥抽取器(JS console.log → Python 控制台) + self._jslog_timer = QtCore.QTimer(self) + self._jslog_timer.setInterval(500) + self._jslog_timer.timeout.connect(self._jslog_drain_tick) + self._jslog_timer.start() + # 🆕 Fix E: 上下文标签防抖定时器(工具/思考/正文任一显现 → 400ms 内合并刷新一次) + self._ctx_refresh_timer = QtCore.QTimer(self) + self._ctx_refresh_timer.setSingleShot(True) + self._ctx_refresh_timer.setInterval(400) + self._ctx_refresh_timer.timeout.connect(self.update_context_display) + # 🆕 调试窗口控制:文件协议 data/debug_window.cmd (show/hide),与项目树完全独立 + self.debug_window = None + self._debug_cmd_timer = QtCore.QTimer(self) + self._debug_cmd_timer.setInterval(2000) + self._debug_cmd_timer.timeout.connect(self._poll_debug_cmd) + self._debug_cmd_timer.start() + self._title_workers = {} + self.current_ai_msg_id = None + self._ghost_msg_map = {} # 🌟 新增:专门记录幽灵报错气泡与提问的映射关系 + import time + self._last_click_time = 0 + + self.init_model_popup() + self.init_mode_popup() + self.init_chat_events() + + # 🌟 长文本折叠相关 + self._folded_texts = [] + self._is_folding = False + self.LONG_TEXT_THRESHOLD = 500 + self.LONG_TEXT_LINES = 15 + + self.init_browser() + + # 🆕 调试窗口随程序启动(config.json debug_window_autostart,缺省 true): + # 写 "show" 到控制文件,上方 2s 轮询在事件循环启动后自动开窗 + try: + from core.llm_engine import _load_config + from core.debug_log import autostart_debug_window + autostart_debug_window(_load_config()) + except Exception: + pass + + + def setup_ui(self): + self.bg_widget = QtWidgets.QWidget(self) + self.bg_widget.setObjectName("bg_widget") + self.setCentralWidget(self.bg_widget) + + + self.main_layout = QtWidgets.QHBoxLayout(self.bg_widget) + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.main_layout.setSpacing(0) + + # ==================== 1. 左侧边栏 ==================== + self.sidebar = QtWidgets.QWidget() + self.sidebar.setObjectName("sidebar") + self.sidebar.setFixedWidth(260) + self.sidebar_root = QtWidgets.QVBoxLayout(self.sidebar) + self.sidebar_root.setContentsMargins(0, 0, 0, 0) + self.sidebar_root.setSpacing(0) + + # 🌟 双页面容器:展开页 / 收缩页(收缩图标用独立干净布局精确居中) + self.sidebar_stack = QtWidgets.QStackedWidget() + self.sidebar_root.addWidget(self.sidebar_stack) + + # ---- 页面0:展开状态(标题行、logo、历史列表、功能按钮)---- + self.expand_page = QtWidgets.QWidget() + self.sidebar_layout = QtWidgets.QVBoxLayout(self.expand_page) + self.sidebar_layout.setContentsMargins(10, 20, 10, 20) + + # 🌟 顶部标题行:应用图标 + haocode + 收缩按钮(统一高度对齐) + self.sidebar_header = QtWidgets.QWidget() + self.sidebar_header.setFixedHeight(36) + self.sidebar_header_layout = QtWidgets.QHBoxLayout(self.sidebar_header) + self.sidebar_header_layout.setContentsMargins(2, 0, 2, 0) + self.sidebar_header_layout.setSpacing(8) + + self.logo_icon = QtWidgets.QLabel() + self.logo_icon.setObjectName("logo_icon") + self.logo_icon.setFixedSize(22, 22) + self.logo_icon.setPixmap(QtGui.QPixmap(self.get_svg_path("main.svg")) + .scaled(22, 22, QtCore.Qt.AspectRatioMode.KeepAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation)) + + self.logo_label = QtWidgets.QLabel("haocode") + self.logo_label.setObjectName("logo_label") + + self.collapse_btn = QtWidgets.QPushButton("") + self.collapse_btn.setObjectName("collapse_btn") + self.collapse_btn.setIcon(QtGui.QIcon(self.get_svg_path("panel.svg"))) + self.collapse_btn.setIconSize(QtCore.QSize(16, 16)) + self.collapse_btn.setFixedSize(28, 28) + self.collapse_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.collapse_btn.setToolTip("收起侧边栏") + + self.sidebar_header_layout.addWidget(self.logo_icon, 0, QtCore.Qt.AlignmentFlag.AlignVCenter) + self.sidebar_header_layout.addWidget(self.logo_label, 0, QtCore.Qt.AlignmentFlag.AlignVCenter) + self.sidebar_header_layout.addStretch() + self.sidebar_header_layout.addWidget(self.collapse_btn, 0, QtCore.Qt.AlignmentFlag.AlignVCenter) + + self.sidebar_layout.addWidget(self.sidebar_header) + self.sidebar_layout.addSpacing(10) + + self.history_list = DraggableHistoryList() + self.history_list.setObjectName("history_list") + self.sidebar_layout.addWidget(self.history_list) + + self.btn_new_chat = QtWidgets.QPushButton(" + 新建对话") + self.btn_new_chat.setObjectName("btn_new_chat") + self.sidebar_layout.addWidget(self.btn_new_chat) + self.sidebar_layout.addSpacing(20) + + self.btn_skills = QtWidgets.QPushButton("Skill & Tools") + self.btn_settings = QtWidgets.QPushButton("设置") + self.btn_help = QtWidgets.QPushButton("帮助") + self.btn_about = QtWidgets.QPushButton("关于 (1.19.0)") + for btn in [self.btn_skills, self.btn_settings, self.btn_help, self.btn_about]: + btn.setObjectName("sidebar_menu_btn") + self.sidebar_layout.addWidget(btn) + + self.sidebar_stack.addWidget(self.expand_page) + + # ---- 页面1:收缩状态(上下 stretch 使图标精确垂直居中)---- + self.collapse_page = QtWidgets.QWidget() + self.collapse_lay = QtWidgets.QVBoxLayout(self.collapse_page) + self.collapse_lay.setContentsMargins(0, 0, 0, 0) + self.collapse_lay.addStretch(1) + self.collapse_expand_btn = QtWidgets.QPushButton("") + self.collapse_expand_btn.setObjectName("collapse_btn") + self.collapse_expand_btn.setIcon(QtGui.QIcon(self.get_svg_path("panel.svg"))) + self.collapse_expand_btn.setIconSize(QtCore.QSize(18, 18)) + self.collapse_expand_btn.setFixedSize(34, 34) + self.collapse_expand_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.collapse_expand_btn.setToolTip("展开侧边栏") + self.collapse_lay.addWidget(self.collapse_expand_btn, 0, QtCore.Qt.AlignmentFlag.AlignHCenter) + self.collapse_lay.addStretch(1) + self.sidebar_stack.addWidget(self.collapse_page) + + # ==================== 2. 右侧主聊天区 ==================== + self.chat_area = QtWidgets.QWidget() + self.chat_area.setObjectName("chat_area") + self.chat_layout = QtWidgets.QVBoxLayout(self.chat_area) + self.chat_layout.setContentsMargins(0, 0, 0, 0) + self.chat_layout.setSpacing(0) + + # --- 2.1 自定义顶部标题栏 --- + self.top_bar = QtWidgets.QWidget() + self.top_bar.setObjectName("top_bar") + self.top_bar.setFixedHeight(50) + self.top_bar_layout = QtWidgets.QHBoxLayout(self.top_bar) + self.top_bar_layout.setContentsMargins(20, 0, 10, 0) + + self.top_label = QtWidgets.QLabel("") + self.top_label.setStyleSheet("font-weight: bold; font-size: 16px;") + self.top_bar_layout.addWidget(self.top_label) + self.top_bar_layout.addStretch() + + self.btn_history = QtWidgets.QPushButton("历史") + self.btn_history.setObjectName("top_tool_btn") + self.top_bar_layout.addWidget(self.btn_history) + + # 🆕 右侧任务面板的开关【不在这里】:与左侧栏一致,开关在栏内 + # (收起=栏正中按钮 / 展开=栏标题行右上角按钮)→ 永远只有一个可动按钮 + + # 🌟 v2: 移除自绘 最小化/最大化/关闭 按钮 —— 已由 Windows 11 原生标题栏接管。 + # 历史 按钮保留,随顶部工具栏整体下移到原生标题栏下方。 + self.chat_layout.addWidget(self.top_bar) + + # --- 2.2 🌟 核心修复:浏览器渲染引擎防穿帮“幕布” --- + self.browser_container = QtWidgets.QWidget() + self.browser_container.setObjectName("browser_container") + self.browser_container.setStyleSheet("background-color: #ffffff;") # 纯白幕布 + self.browser_layout = QtWidgets.QVBoxLayout(self.browser_container) + self.browser_layout.setContentsMargins(0, 0, 0, 0) + self.browser_layout.setSpacing(0) + + # 创建浏览器(🆕 A′ 双轨:Windows 上优先 WebView2,失败/配置指定时回落 QtWebEngine) + # P1-03:平台矩阵 —— 解析 webview_backend 配置;非法值可见警告 + 回落平台默认,不阻断启动 + self._wv2_session = None + _backend_pref = "auto" + try: + from core.config_paths import load_config as _load_cfg # P0-01 统一配置入口 + _backend_pref = _load_cfg().get("webview_backend", "auto") + except Exception: + pass + _backend, _backend_warn = _renderer_backend.resolve_backend(_backend_pref) + if _backend_warn: + print(_backend_warn, flush=True) + if _backend == "webview2" and _wv2mod is not None and sys.platform == "win32": + _app = QtWidgets.QApplication.instance() + _env = _wv2mod.get_environment(_app) + if _env is not None: + try: + self._wv2_session = _wv2mod.Wv2Session(_env, int(self.winId()), _app) + except Exception as _ex: + print(f"[WV2] session 创建失败 → 回落 QtWebEngine: {_ex}") + self._wv2_session = None + + if self._wv2_session is not None: + # ---- WebView2 路径 ---- + from ui.views.wv2_view import WebView2View + self.browser = WebView2View(self._wv2_session) + self.browser.setSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Expanding) + self.browser.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + # 桥接:Python→JS 走 ExecuteScript(JS 文本同构);JS→Python 走 WebMessageReceived + self.chat_bridge = ChatBridge(None, None, js_runner=self.browser.run_js) + self.browser.attach_bridge(self.chat_bridge) + self.web_channel = None + print("[System] 浏览器内核: WebView2") + else: + # ---- QtWebEngine 路径(原逻辑,保持可用) ---- + # P1-03:本实例独立 profile 目录(两个并行源码实例不争用同一个 Chromium profile; + # 目录在 data/webengine/,测试经 HAOCODE_WEBENGINE_PROFILE_DIR 重定向到临时目录) + from PyQt6.QtWebEngineCore import QWebEngineProfile + _prof_name = _renderer_backend.webengine_profile_name() + _prof_dir = _renderer_backend.webengine_profile_dir(_prof_name) + self._qtwe_profile = QWebEngineProfile(_prof_name) + self._qtwe_profile.setPersistentStoragePath(os.path.join(_prof_dir, "storage")) + self._qtwe_profile.setCachePath(os.path.join(_prof_dir, "cache")) + print(f"[Renderer] QtWebEngine 独立 profile: {_prof_dir}", flush=True) + + self.browser = QWebEngineView() + # 🌟 关键修改:使用自定义的 WebPage + custom_page = CustomWebPage(self._qtwe_profile, self.browser) + self.browser.setPage(custom_page) + + # 🌟 v2: 不透明绘制属性 —— 告诉 Qt 无需先擦背景再等 WebEngine 纹理, + # 减少窗口缩放瞬间新暴露区域的底色闪烁(配合白底幕布 + main.py 的 GPU 光栅化 flags) + self.browser.setAttribute(QtCore.Qt.WidgetAttribute.WA_OpaquePaintEvent, True) + self.browser.setAttribute(QtCore.Qt.WidgetAttribute.WA_NoSystemBackground, True) + + # 🌟 让 Chromium 合成器用白色作为清屏/新暴露区域的底色,而非默认黑色: + # → GPU 合成(59 FPS)+ 白底不黑闪,兼得速度与观感(配合 main.py 的合成模式) + self.browser.page().setBackgroundColor(QtGui.QColor("#ffffff")) + + # 其他配置保持不变 + self.browser.setSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Expanding) + self.browser.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + + # 🌟 初始化桥接器时,传入自定义的 page + from PyQt6.QtWebChannel import QWebChannel + + # 创建 QWebChannel,它是 Python ↔ JS 的桥梁 + self.web_channel = QWebChannel() + + # 创建 ChatBridge,传入 page 和 channel(构造函数内部会 channel.registerObject) + self.chat_bridge = ChatBridge(custom_page, self.web_channel) + + # 把 channel 设置到 page 上,使 qt.webChannelTransport 生效 + custom_page.setWebChannel(self.web_channel) + print("[System] 浏览器内核: QtWebEngine") + + self.browser_container.setAttribute(QtCore.Qt.WidgetAttribute.WA_OpaquePaintEvent, True) + + # 将浏览器放入布局 + self.browser_layout.addWidget(self.browser) + + # 🌟 自定义滚动条:固定在浏览器右侧,总高度随浏览器变化(镜像网页滚动) + self.web_scrollbar = WebScrollBar(self.chat_bridge) + self.browser_row = QtWidgets.QWidget() + self.browser_row_layout = QtWidgets.QHBoxLayout(self.browser_row) + self.browser_row_layout.setContentsMargins(0, 0, 0, 0) + self.browser_row_layout.setSpacing(0) + self.browser_row_layout.addWidget(self.browser_container, 1) + self.browser_row_layout.addWidget(self.web_scrollbar, 0) + self.chat_layout.addWidget(self.browser_row) # 浏览器 + 滚动条整行加入主布局 + + # --- 2.3 底部输入框容器 --- + self.input_container = QtWidgets.QFrame() + self.input_container.setObjectName("input_container") + # 💡 小优化:把最大高度从 200 调到 250,给折叠框和滚动条留出足够的呼吸空间 + self.input_container.setMaximumHeight(250) + + self.input_container_layout = QtWidgets.QVBoxLayout(self.input_container) + + # 【第 1 行】工具栏 (图标) + self.input_tools_layout = QtWidgets.QHBoxLayout() + self.btn_upload = QtWidgets.QPushButton("") # 清空原来的 Emoji 字符 + self.btn_upload.setIcon(QtGui.QIcon(self.get_svg_path("upload.svg"))) # 使用我们刚才写的安全路径工具 + self.btn_upload.setIconSize(QtCore.QSize(18, 18)) # 图标设为 18x18,配合 30x30 的按钮留出绝佳边距 + + self.btn_screenshot = QtWidgets.QPushButton("✂️") + self.btn_web = QtWidgets.QPushButton("🌐") + self.btn_skill = QtWidgets.QPushButton("🛠️") + self.btn_server = QtWidgets.QPushButton("☁️") + for btn in [self.btn_upload, self.btn_screenshot, self.btn_web, self.btn_skill, self.btn_server]: + btn.setFixedSize(30, 30) + btn.setObjectName("icon_btn") + btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.input_tools_layout.addWidget(btn) + self.input_tools_layout.addStretch() + self.input_container_layout.addLayout(self.input_tools_layout) + + # 【第 2 行】🌟 多附件标签滚动区域 + self.attachment_scroll_area = QtWidgets.QScrollArea() + self.attachment_scroll_area.setVisible(False) + self.attachment_scroll_area.setWidgetResizable(True) + self.attachment_scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + self.attachment_scroll_area.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded) + self.attachment_scroll_area.setFixedHeight(48) + self.attachment_scroll_area.setStyleSheet(""" + QScrollArea { border: none; background: transparent; } + QScrollBar:horizontal { border: none; background: transparent; height: 6px; margin: 0px; } + QScrollBar::handle:horizontal { background: #c0c0c0; min-width: 30px; border-radius: 3px; } + QScrollBar::handle:horizontal:hover { background: #a0a0a0; } + QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { width: 0px; } + """) + + self.attachment_area = QtWidgets.QWidget() + self.attachment_area.setStyleSheet("background: transparent;") + self.attachment_area_layout = QtWidgets.QHBoxLayout(self.attachment_area) + self.attachment_area_layout.setContentsMargins(4, 0, 4, 8) + self.attachment_area_layout.setSpacing(8) + self.attachment_area_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeft) + + self.attachment_scroll_area.setWidget(self.attachment_area) + self.input_container_layout.addWidget(self.attachment_scroll_area) # <--- 确保它被作为第2行加入 + + # 【第 3 行】文本输入框 + self.text_input = PasteAwareTextEdit() + self.text_input.setPlaceholderText("给 haocode 发送消息...") + self.text_input.setObjectName("text_input") + self.text_input.setMaximumHeight(100) + self.input_container_layout.addWidget(self.text_input) + + # 【第 4 行】底部栏 (提示文字、模型选择、发送按钮) + self.input_bottom_layout = QtWidgets.QHBoxLayout() + self.hint_label = QtWidgets.QLabel("AI 生成内容可能不准确。") + self.hint_label.setObjectName("hint_label") + + self.context_label = QtWidgets.QLabel("128k / 200k") + self.context_label.setObjectName("context_label") + + self.model_selector = QtWidgets.QPushButton("gemini-3-pro-preview...") + self.model_selector.setObjectName("model_selector") + # 🆕 圆角改造:与模式按钮(mode_btn)完全一致的白底 13px 圆角,同高 26 + self.model_selector.setFixedHeight(26) + self.model_selector.setMinimumWidth(96) + + self.btn_send = QtWidgets.QPushButton("") # 1. 传入空字符串,去除原本的文字 + self.btn_send.setIcon(QtGui.QIcon(self.get_svg_path("send.svg"))) # 2. 加载 SVG 图标(用冻结安全路径) + self.btn_send.setIconSize(QtCore.QSize(20, 20)) # 3. 设置图标大小 (稍微比 32x32 的按钮小一点,留出边距更好看) + self.btn_send.setObjectName("btn_send") + self.btn_send.setFixedSize(32, 32) + + # ============ 🆕 模式切换按钮(chat / worker) ============ + # 按按钮 → 上方浮动窗缓慢弹出(SessionModePopup,与模型选择弹窗同款实现); + # 选择后发送第一条消息 → 该会话锁定此模式 + self._mode_panel_selected = "chat" + + self.btn_mode = QtWidgets.QToolButton() + self.btn_mode.setObjectName("mode_btn") + self.btn_mode.setFixedSize(96, 26) + self.btn_mode.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + self.btn_mode.setToolTip("切换聊天模式(发送第一条消息后锁定)") + self.btn_mode.clicked.connect(self.show_mode_popup) + + self.input_bottom_layout.addWidget(self.hint_label) + self.input_bottom_layout.addStretch() + self.input_bottom_layout.addWidget(self.context_label) + self.input_bottom_layout.addWidget(self.model_selector) + self.input_bottom_layout.addWidget(self.btn_mode) + self.input_bottom_layout.addWidget(self.btn_send) + self.input_container_layout.addLayout(self.input_bottom_layout) + + # 打包装入主聊天区域 + self.input_wrapper = QtWidgets.QHBoxLayout() + self.input_wrapper.setContentsMargins(20, 0, 20, 20) + self.input_wrapper.addWidget(self.input_container) + self.chat_layout.addLayout(self.input_wrapper) + + self.main_layout.addWidget(self.sidebar) + self.main_layout.addWidget(self.chat_area) + # 🆕 右侧任务面板(默认收起 52px;不参与 resizeEvent 自动收缩,只能手动切换) + self.bash_panel = BashPanel(self) + self.main_layout.addWidget(self.bash_panel) + self.browser.loadFinished.connect(self.on_web_load_finished) + + # ========================================== + # 🌟 数据库与历史记录初始化逻辑 (放在 UI 控件全建好之后) + # ========================================== + self.db = DBManager() + + if self.db.is_first_run: + print("[System] 欢迎!检测到初次运行,已自动创建本地数据库和初始对话。") + else: + print("[System] 欢迎回来!成功读取本地数据库。") + + # 1. 获取所有会话并在侧边栏渲染 + sessions = self.db.get_all_sessions() + + # 清空 UI 上可能残留的占位符 + self.history_list.clear() + + # 🟢 改为: + self.current_session_id = None # 先初始化 + self.pending_mode = "chat" # 🆕 锁定前选中的模式(默认 chat) + self.rebuild_sidebar() + + # 2. 确定启动时默认加载的对话 (默认最新的一条) + if sessions: + self.current_session_id = sessions[0]["id"] + # 让 UI 列表默认选中第一项 + self.history_list.setCurrentRow(0) + + # ⚠️ 注意:不要在这里直接调用 load_messages_to_web! + # 因为此时 QWebEngineView 的网页还没加载完,直接执行 JS 会报错。 + # 我们只需记住 current_session_id,等网页加载完毕后再灌入数据。 + else: + self.current_session_id = None + self.pending_load_session_id = None + + + # ==================== 🌟 核心新增:初始化浏览器 ==================== + # 把它放在 def setup_ui(self): 的正上方 + def get_svg_path(self, filename): + """🌟 自动获取 svg 文件的绝对路径,并检测文件是否存在""" + import os + base_dir = os.path.dirname(os.path.abspath(__file__)) + project_root = os.path.abspath(os.path.join(base_dir, "..", "..")) + full_path = os.path.join(project_root, "svg", filename) + + # 🛠️ 杀手锏:帮你自动检查文件到底在不在! + if not os.path.exists(full_path): + print(f"\n❌ [严重警告]: 找不到图标文件!系统去这里找了,但是没找到: \n -> {full_path}\n") + else: + print(f"\n✅ [成功]: 找到了图标文件: {full_path}") + + return full_path + + def init_browser(self): + """初始化浏览器设置、信号绑定及页面加载""" + + # 🆕 P1-01 渲染窗口:配置(10/40/200,非法值静默回落 40)+ 代次管理 + from core import config_paths as _cp + _rw_cfg = _cp.render_window_settings() + self._rw_mode = _rw_cfg["mode"] + self._rw_size = _rw_cfg["size"] + # 页大小 = 半窗:保证向上换页时“首个可见消息”锚点留在窗口内(锚点恢复前提) + self._rw_page_size = max(1, self._rw_size // 2) + self._rw_generation = 0 # 每次加载/切会话/分支/删除/重答/新建 +1 + self._rw_config_pushed = False + self._rw_page_inflight = False + + # 1. 信号绑定 (ChatBridge 已在 setup_ui 中通过 QWebChannel 注册) + # 重新回答信号 + self.chat_bridge.regenerate_clicked.connect(self._on_regenerate_clicked) + + # 分支切换信号 + self.chat_bridge.branch_switch_clicked.connect(self._on_branch_switch) + + # 删除消息信号 + self.chat_bridge.delete_message_requested.connect(self._on_delete_message) + # 🌟 绑定附件点击信号 + self.chat_bridge.attachment_clicked.connect(self._on_attachment_clicked) + # 🆕 P1-01 渲染窗口换页请求(fire-and-forget,响应经 rwPageResponse 推送) + self.chat_bridge.window_page_requested.connect(self._on_window_page_request) + # 2. 计算本地 HTML 路径 + # 假设 web 文件夹位于当前脚本目录的上一级 + base_dir = os.path.dirname(os.path.abspath(__file__)) + html_path = os.path.normpath(os.path.join(base_dir, '..', 'web', 'index.html')) + + # 3. 加载页面 + # 注意:确保在加载 URL 之前,QWebChannel 已经正确设置到了 self.browser.page() 上 + # 🛡 防缓存:file:// URL 追加时间戳查询串 —— 每次启动保证加载最新 web/ 代码, + # 避免 QtWebEngine 残留旧 JS/CSS 导致“改了前端没生效” + _u = QUrl.fromLocalFile(html_path) + # 🆕 立即设按钮初始文本:WebView2 冷启动链路慢(~10s+),不能等页面加载后才填按钮 + try: + self._refresh_mode_button() + except Exception: + pass + self.browser.setUrl(QUrl(_u.toString() + "?hocode_v=" + str(int(_diag_time.time() * 1000)))) + def _on_attachment_clicked(self, meta_json_str): + """🌟 弹出原生附件预览窗口""" + import json + try: + meta = json.loads(meta_json_str) + # self.bg_widget 是铺满整个主窗口的底层容器,挂在它上面就能完美覆盖全屏 + # PDF 图片卡:用勾选的图片开可翻页预览(抄弹窗预览那套,页码显示在顶部标题) + if meta.get("type") == "pdf" and meta.get("mode") == "image" and meta.get("selected_images"): + base_name = meta.get("name", "") + siblings = [{ + "type": "image", + "name": f'{base_name} · 第 {x["page"]} 页 no.{x["index"]}', + "local_path": x["local_path"], + "mime": x.get("mime", "image/png"), + "size_kb": x.get("size_kb", 0), + } for x in meta["selected_images"]] + overlay = AttachmentPreviewOverlay(siblings[0], self.bg_widget, + siblings=siblings, index=0) + else: + overlay = AttachmentPreviewOverlay(meta, self.bg_widget) + except Exception as e: + print(f"[Warn]: 打开附件预览失败: {e}") + + def setup_stylesheet(self): + self.setStyleSheet(""" + * { font-family: "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", "Segoe UI", sans-serif; } + + #bg_widget { background-color: #ffffff; } + #chat_area { background-color: #ffffff; } + + /* ---- 左侧边栏 / 右侧任务面板(共用一套淡蓝设计语言)---- */ + #sidebar { background-color: #f7f8fa; border-right: 1px solid #ececec; } + #right_sidebar { background-color: #f7f8fa; border-left: 1px solid #ececec; } + #logo_icon { background: transparent; } + #logo_label { font-size: 20px; font-weight: 900; color: #1a2332; letter-spacing: 0.5px; background: transparent; } + #collapse_btn { background: transparent; border: none; border-radius: 8px; } + #collapse_btn:hover { background-color: #e6e8ee; } + + /* ---- 侧边栏历史列表(🐛 用 objectName 限定作用域:旧版是 QListWidget 类型选择器, + 会级联泄漏进模型选择弹窗——选中行 3px 蓝竖条/padding/margin 全部漏进去, + 造成“调参工具与实际不一致”。现在只作用于 #history_list) ---- */ + #history_list { border: none; background: transparent; outline: none; } + #history_list::item { padding: 10px 12px; border-radius: 8px; margin: 2px 4px; color: #444; } + #history_list::item:hover { background-color: #eceef2; } + #history_list::item:selected { background-color: #e4edfa; color: #1a3a63; font-weight: 600; border-left: 3px solid #3b82f6; } + + #btn_new_chat { background-color: #ffffff; border: 1px solid #e2e5ea; border-radius: 10px; padding: 10px; font-weight: 600; color: #1f2937; } + #btn_new_chat:hover { background-color: #eef2f7; border-color: #cfd6e0; } + #sidebar_menu_btn { text-align: left; border: none; padding: 9px 12px; margin: 0 4px; color: #5b6472; font-size: 13px; border-radius: 8px; } + #sidebar_menu_btn:hover { background-color: #eceef2; color: #111827; } + + /* ---- 🆕 右侧任务面板(继承左侧栏配色:#f7f8fa / #ececec / 淡蓝 #e4edfa)---- */ + #bl_panel_head { background: transparent; } + #bl_panel_title { font-size: 13px; font-weight: 700; color: #1a2332; } + #bl_panel_total { font-size: 11px; color: #8a94a6; } + #bl_splitter::handle { background: #e9ecf3; } + #bl_splitter::handle:hover { background: #d7deea; } + #bl_sect_head { background: transparent; } + #bl_sect_head:hover { background-color: #eceef2; } + #bl_sect_title { font-size: 12px; font-weight: 600; color: #33415c; } + #bl_sect_count { font-size: 11px; color: #7c8698; } + #bl_sect_chev { color: #8a94a6; font-size: 10px; } + #bl_scroll, #bl_host { background: transparent; border: none; } + #bl_hint { color: #9aa4b5; font-size: 11px; padding: 2px 10px 8px 10px; } + #bl_layer { background-color: #ffffff; border: 1px solid #e6eaf2; border-radius: 9px; } + #bl_layer:hover { border-color: #cfe0f7; } + #bl_head { background: transparent; border-radius: 9px; } + #bl_head:hover { background-color: #f2f7fe; } + #bl_dot { font-size: 10px; color: #9aa4b5; } + #bl_dot[state="run"] { color: #3b82f6; } + #bl_dot[state="ok"] { color: #16a34a; } + #bl_dot[state="bad"] { color: #dc2626; } + #bl_name { font-size: 11px; font-weight: 700; color: #1a3a63; } + #bl_meta { font-size: 10px; color: #7c8698; } + #bl_cmd { font-size: 10px; color: #5b6472; } + #bl_chev { color: #9aa4b5; font-size: 10px; } + #bl_tag { font-size: 9px; border-radius: 6px; padding: 1px 5px; + color: #4b5563; background-color: #eef0f4; } + #bl_tag[kind="run"] { color: #1d4ed8; background-color: #e4edfa; } + #bl_tag[kind="ok"] { color: #15803d; background-color: #e7f6ec; } + #bl_tag[kind="bad"] { color: #b91c1c; background-color: #fdeaea; } + #bl_tag[kind="out"] { color: #6b7280; background-color: #eef0f4; } + #bl_sect_label { font-size: 10px; font-weight: 600; color: #7c8698; } + #bl_code { background-color: #fbfcfe; border: 1px solid #e6eaf2; border-radius: 7px; + padding: 4px; font-family: Consolas, "Courier New", monospace; + font-size: 11px; color: #243043; } + /* ---- 🆕 P2-02:右侧任务面板滚动条 + 横纵交汇角(全部选择器限定在 + #bl_code / #bl_scroll,绝不添加无作用域的 QScrollBar/QAbstractScrollArea + 全局规则,不污染模型弹窗/会话列表/附件预览等其他控件) ---- + 口径:厚 8px、隐藏箭头(add-line/sub-line 置 0)、handle 可见 + hover、 + corner 用 Qt 支持的 QAbstractScrollArea::corner 子控件(不写 QScrollBar::corner), + 与代码框背景 #fbfcfe 一致(消除原生亮色 corner 方块) */ + QPlainTextEdit#bl_code QScrollBar:vertical { border: none; background: transparent; width: 8px; margin: 0px; } + QPlainTextEdit#bl_code QScrollBar::handle:vertical { background: #d0d0d0; min-height: 30px; border-radius: 4px; } + QPlainTextEdit#bl_code QScrollBar::handle:vertical:hover { background: #a0a0a0; } + QPlainTextEdit#bl_code QScrollBar::add-line:vertical, QPlainTextEdit#bl_code QScrollBar::sub-line:vertical { height: 0px; border: none; background: transparent; } + QPlainTextEdit#bl_code QScrollBar::add-page:vertical, QPlainTextEdit#bl_code QScrollBar::sub-page:vertical { background: transparent; } + QPlainTextEdit#bl_code QScrollBar:horizontal { border: none; background: transparent; height: 8px; margin: 0px; } + QPlainTextEdit#bl_code QScrollBar::handle:horizontal { background: #d0d0d0; min-width: 30px; border-radius: 4px; } + QPlainTextEdit#bl_code QScrollBar::handle:horizontal:hover { background: #a0a0a0; } + QPlainTextEdit#bl_code QScrollBar::add-line:horizontal, QPlainTextEdit#bl_code QScrollBar::sub-line:horizontal { width: 0px; border: none; background: transparent; } + QPlainTextEdit#bl_code QScrollBar::add-page:horizontal, QPlainTextEdit#bl_code QScrollBar::sub-page:horizontal { background: transparent; } + QPlainTextEdit#bl_code::corner { background-color: #fbfcfe; } + QScrollArea#bl_scroll QScrollBar:vertical { border: none; background: transparent; width: 8px; margin: 0px; } + QScrollArea#bl_scroll QScrollBar::handle:vertical { background: #d0d0d0; min-height: 30px; border-radius: 4px; } + QScrollArea#bl_scroll QScrollBar::handle:vertical:hover { background: #a0a0a0; } + QScrollArea#bl_scroll QScrollBar::add-line:vertical, QScrollArea#bl_scroll QScrollBar::sub-line:vertical { height: 0px; border: none; background: transparent; } + QScrollArea#bl_scroll QScrollBar::add-page:vertical, QScrollArea#bl_scroll QScrollBar::sub-page:vertical { background: transparent; } + QScrollArea#bl_scroll::corner { background: transparent; } + #bl_body { background: transparent; } + + /* ---- 顶部栏 ---- */ + #top_bar { background-color: #ffffff; border-bottom: 1px solid #eeeeee; } + #top_tool_btn { background: transparent; border: 1px solid #e2e5ea; border-radius: 8px; padding: 5px 14px; color: #4b5563; font-size: 12px; } + #top_tool_btn:hover { background-color: #f3f4f6; border-color: #d1d5db; color: #111827; } + + /* ---- 输入区 ---- */ + #input_container { background-color: #f6f7f9; border: 1px solid #e4e6ea; border-radius: 20px; padding: 10px; } + #icon_btn { background: transparent; border: none; border-radius: 15px; } + #icon_btn:hover { background-color: #e6e8ec; } + #text_input { border: none; background: transparent; font-size: 15px; color: #1f2937; selection-background-color: #bfdbfe; } + #hint_label { color: #9ca3af; font-size: 11px; } + #context_label { color: #6b7280; font-size: 12px; margin-right: 10px; } + /* 🆕 模型选择按钮:与模式按钮(mode_btn)完全一致的圆角样式 */ + #model_selector { background: #ffffff; border: 1px solid #e2e5ea; border-radius: 13px; font-size: 12px; color: #4b5563; padding: 2px 8px; } + #model_selector:hover { background-color: #eef1f5; border-color: #cbd5e1; color: #111827; } + + /* 🆕 模式切换按钮(选择窗为 SessionModePopup 浮动窗,配色由其自己注入) */ + #mode_btn { background: #ffffff; border: 1px solid #e2e5ea; border-radius: 13px; font-size: 12px; color: #4b5563; padding: 2px 8px; } + #mode_btn:hover { background-color: #eef1f5; border-color: #cbd5e1; color: #111827; } + + /* ---- 发送按钮(实际配色由 set_send_button_state 动态控制) ---- */ + #btn_send { background-color: #2563eb; border: none; border-radius: 16px; font-weight: 700; } + #btn_send:hover { background-color: #1d4ed8; } + #btn_send:pressed { background-color: #1e40af; } + """) + + def set_send_button_state(self, is_generating: bool): + """🌟 统一管理发送/停止按钮的 UI 状态""" + if is_generating: + # 正在生成:红色停止按钮(白色图标) + self.btn_send.setIcon(QtGui.QIcon(self.get_svg_path("stop_white.svg"))) + self.btn_send.setStyleSheet(""" + QPushButton { background-color: #ef4444; border: none; border-radius: 16px; font-weight: 700; } + QPushButton:hover { background-color: #dc2626; } + QPushButton:pressed { background-color: #b91c1c; } + """) + else: + # 空闲状态:蓝色发送按钮(白色图标) + self.btn_send.setIcon(QtGui.QIcon(self.get_svg_path("send_white.svg"))) + self.btn_send.setStyleSheet(""" + QPushButton { background-color: #2563eb; border: none; border-radius: 16px; font-weight: 700; } + QPushButton:hover { background-color: #1d4ed8; } + QPushButton:pressed { background-color: #1e40af; } + """) + + # ==================== 🌟 侧边栏收缩 ==================== + @QtCore.pyqtProperty(float) + def sidebarWidth(self): + """侧边栏宽度属性:供 QPropertyAnimation 平滑插值收缩/展开""" + return float(self.sidebar.width()) + + @sidebarWidth.setter + def sidebarWidth(self, w): + self.sidebar.setFixedWidth(int(w)) + + def _effective_collapsed(self): + """当前生效的收缩状态:动画播放中按其目标方向,否则按已落定状态。""" + if self._sidebar_anim is not None: + return self._sidebar_target + return self.sidebar_collapsed + + def toggle_sidebar(self): + """手动切换侧边栏展开/收缩""" + self._set_sidebar_collapsed(not self._effective_collapsed()) + + def _set_sidebar_collapsed(self, collapsed: bool): + """收缩/展开侧边栏:从右到左平滑滑动宽度动画。 + 展开/收缩分别使用独立干净页面(QStackedWidget), + 收缩图标由上下 stretch 精确垂直居中,彻底规避残留间距导致的偏移。 + """ + # 若已有动画正在播放,先停止并重定向到新目标(保证 resize 时也能正常工作) + if self._sidebar_anim is not None: + self._sidebar_anim.stop() + self._sidebar_anim.deleteLater() + self._sidebar_anim = None + + self._sidebar_target = collapsed + + # 🌟 切换页面:收缩页(图标精确居中) / 展开页(完整内容) + self.sidebar_stack.setCurrentWidget( + self.collapse_page if collapsed else self.expand_page) + + # 🌟 从右到左 / 从左到右 宽度滑动动画 + start_w = self.sidebar.width() + end_w = 52 if collapsed else 260 + self._sidebar_anim = QtCore.QPropertyAnimation(self, b"sidebarWidth") + self._sidebar_anim.setDuration(260) + self._sidebar_anim.setStartValue(float(start_w)) + self._sidebar_anim.setEndValue(float(end_w)) + self._sidebar_anim.setEasingCurve(QtCore.QEasingCurve.Type.InOutCubic) + self._sidebar_anim.finished.connect(self._on_sidebar_anim_finished) + self._sidebar_anim.start() + + def _on_sidebar_anim_finished(self): + """动画结束:锁定最终宽度并落定状态。""" + self.sidebar.setFixedWidth(52 if self._sidebar_target else 260) + self.sidebar_collapsed = self._sidebar_target + self._sidebar_anim.deleteLater() + self._sidebar_anim = None + + def resizeEvent(self, event): + super().resizeEvent(event) + # 🌟 侧边栏自动收缩:带回滞,且动画播放中也能正确重定向(resize 下同样正常工作) + eff = self._effective_collapsed() + if eff: + # 当前处于(或正趋向)收缩态:仅当宽度明显变大才展开 + if self.width() > 1150: + self._set_sidebar_collapsed(False) + else: + # 当前处于(或正趋向)展开态:仅当宽度明显变小才收缩 + if self.width() < 1050: + self._set_sidebar_collapsed(True) + + # 🌟 v2: 原生边框自带拉伸,EdgeGrip 隐形拉伸块已移除,无需手动几何计算。 + + # 设置窗口跟随主窗口自适应 + if hasattr(self, '_settings_win') and self._settings_win is not None: + self._settings_win.resize_to_parent() + + def showEvent(self, event): + super().showEvent(event) + # 🌟 v2: 每次显示都重新声明圆角偏好(Windows 11 22000+)。 + # 最大化时 Windows 会按系统规则自动切换为直角,属正常行为。 + self._apply_win11_rounded_corners() + + def _apply_win11_rounded_corners(self): + """通过 DWM 设置窗口圆角偏好(Windows 11 原生圆角)。""" + try: + import ctypes + if not hasattr(ctypes, 'windll'): + return # 非 Windows 平台无需处理 + # DWMWA_WINDOW_CORNER_PREFERENCE = 33, DWMWCP_ROUND = 2 + val = ctypes.c_int(2) + ctypes.windll.dwmapi.DwmSetWindowAttribute( + ctypes.c_void_p(int(self.winId())), + 33, + ctypes.byref(val), + ctypes.sizeof(val) + ) + except Exception as e: + print(f"[Warn]: 设置窗口圆角失败: {e}") + + + def _try_remove_file(self, path: str, absolute: bool = False) -> None: + """尽力物理删除一个附件缓存文件, 失败仅打印告警。 + + Args: + path: 相对项目根目录的路径, 或 absolute=True 时的绝对路径。 + absolute: path 是否已是绝对路径。 + """ + import os + if not path: + return + if absolute: + abs_path = path + else: + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + abs_path = os.path.join(root_dir, path) + try: + if os.path.exists(abs_path): + os.remove(abs_path) + print(f"[System]: 已清理废弃附件缓存 -> {path}") + except Exception as e: + print(f"[Warn]: 清理废弃附件失败: {e}") + + def remove_attachment(self, tag_widget, index): + """删除指定的附件标签,如果是未发送的图片,同时清理本地缓存文件""" + import os + + # 将对应位置标记为 None(不直接 pop,防止索引错乱) + if index < len(self._folded_texts): + att_data = self._folded_texts[index] + + # 🌟 核心新增:垃圾回收机制 (物理删除废弃附件缓存) + if att_data and att_data.get("type") in ("image", "pdf"): + # 附件本体文件 (图片 / PDF 拷贝) + if att_data.get("local_path"): + self._try_remove_file(att_data["local_path"]) + # PDF 图片解析模式提取出的所有图片 + for im in att_data.get("images", []): + abs_im = im.get("abs_path") + if abs_im: + self._try_remove_file(abs_im, absolute=True) + + # 标记数据为废弃 + self._folded_texts[index] = None + + # 从布局中移除并销毁 widget + self.attachment_area_layout.removeWidget(tag_widget) + tag_widget.deleteLater() + + # 如果所有附件都被删除了,隐藏容器并恢复提示语 + if all(t is None for t in self._folded_texts): + self._folded_texts.clear() + self.attachment_scroll_area.setVisible(False) + self.text_input.setPlaceholderText("给 haocode 发送消息...") + + print(f"[UI]: 已移除附件 {index + 1}") + + + + + def reset_input_ui(self): + """恢复输入框和按钮的初始状态""" + self.set_send_button_state(False) + + + # ==================== 事件拦截(P0-02:MainWindow 唯一 eventFilter) ==================== + def eventFilter(self, obj, event): + """统一事件过滤器:只处理输入框的 Enter / Shift+Enter,其余对象与事件全部交给父类。 + 「是否允许发送」的规则是 send_message(from_enter=True) 里的单一实现, + 与发送按钮点击路径共用;一次按键至多触发一次 send_message 调用。""" + if obj == self.text_input and event.type() == QtCore.QEvent.Type.KeyPress: + if event.key() in (QtCore.Qt.Key.Key_Return, QtCore.Qt.Key.Key_Enter): + if event.modifiers() & QtCore.Qt.KeyboardModifier.ShiftModifier: + return False # Shift+Enter:放行换行 + self.send_message(from_enter=True) + return True # 事件已消费:不往输入框插入换行 + return super().eventFilter(obj, event) + # ==================== 🌟 核心新增:发送与线程控制 ==================== + def init_chat_events(self): + # 1. 绑定发送按钮 + self.btn_send.clicked.connect(self.send_message) + + # 2. 为输入框安装事件过滤器 (拦截 Enter 键) + self.text_input.installEventFilter(self) + self.text_input.long_text_pasted.connect(self._on_long_text_pasted) + self.text_input.image_pasted.connect(self._on_image_pasted) + self.text_input.files_pasted.connect(self._on_files_dropped) # 🌟 文本/代码文件拖拽/粘贴 + # 3. 绑定左侧边栏按钮 (占位) + self.btn_new_chat.clicked.connect(self.on_new_chat_clicked) + self.collapse_btn.clicked.connect(self.toggle_sidebar) + self.collapse_expand_btn.clicked.connect(self.toggle_sidebar) + + # 🌟 自定义滚动条:前端页面滚动 → 滑块位置/长度镜像 + self.chat_bridge.scroll_changed.connect(self.web_scrollbar.set_scroll_info) + self.btn_skills.clicked.connect(lambda: print("\n[UI]: 点击了 -> Skill & Tools")) + self.btn_settings.clicked.connect(self.show_settings) # 或者你原来的写法 + self.btn_help.clicked.connect(lambda: print("\n[UI]: 点击了 -> 帮助")) + self.btn_about.clicked.connect(lambda: print("\n[UI]: 点击了 -> 关于")) + + # 4. 绑定顶部工具栏按钮 (占位) + self.btn_history.clicked.connect(lambda: print("\n[UI]: 点击了 -> 历史")) + + # 5. 绑定输入框下方的工具按钮 (占位) + self.btn_upload.clicked.connect(self._on_upload_clicked) + + # 6. 截图功能 (Alt+S 全局热键 + 按钮) + self.screenshot_overlay = ScreenCaptureOverlay() + self.screenshot_overlay.screenshot_captured.connect(self._on_image_pasted) + self.btn_screenshot.clicked.connect(self._start_screenshot) + # P1-04:平台路由 —— Windows RegisterHotKey / X11 XGrabKey / Wayland+offscreen 无全局热键 + _sess_kind = desktop_session.session_kind() + _hk_factory, _hk_msg = desktop_session.hotkey_plan(_sess_kind) + print(_hk_msg, flush=True) + self.hotkey_screenshot = _hk_factory() if _hk_factory else None + if self.hotkey_screenshot is not None: + self.hotkey_screenshot.triggered.connect(self._start_screenshot) + self.hotkey_screenshot.start() + # 非 Windows 平台回退到应用级快捷键(Wayland/offscreen 下窗口获焦时仍可用) + if sys.platform != "win32": + self.shortcut_screenshot = QtGui.QShortcut(QtGui.QKeySequence("Alt+S"), self) + self.shortcut_screenshot.activated.connect(self._start_screenshot) + + self.btn_web.clicked.connect(lambda: print("\n[UI]: 点击了 -> 联网搜索 🌐")) + self.btn_skill.clicked.connect(lambda: print("\n[UI]: 点击了 -> 动态技能 🛠️")) + self.btn_server.clicked.connect(lambda: print("\n[UI]: 点击了 -> 后台服务 ☁️")) + self.history_list.itemClicked.connect(self.on_sidebar_item_clicked) + self.history_list.order_changed.connect(self.on_session_order_changed) + + + def on_session_order_changed(self, ordered_ids): + self.db.update_session_order(ordered_ids) + print(f"[UI]: 会话顺序已更新 ({len(ordered_ids)} 条)") + + + def _on_upload_clicked(self): + """点击上传按钮:支持图片 + 文本/代码文件多选,按扩展名自动分类入库。""" + paths, _ = QtWidgets.QFileDialog.getOpenFileNames( + self, "选择文件(图片 / 文本 / 代码)", "", + "所有文件 (*);;图片 (*.png *.jpg *.jpeg *.webp *.bmp *.gif)" + ) + if not paths: + return + + # 按扩展名分类:图片走图片管线,其余交给文件管线(内部做二进制/编码探测) + image_paths, other_paths = [], [] + for path in paths: + ext = os.path.splitext(path)[1].lower() + (image_paths if ext in PasteAwareTextEdit.IMAGE_EXTS else other_paths).append(path) + + if image_paths: + self._on_image_pasted(image_paths) # 复用:拷贝到 data/attachments 并加图片附件 + if other_paths: + self._on_files_dropped(other_paths) # 复用:读取文本内容并加文件附件 + + + def _on_long_text_pasted(self, text: str): + """长文本粘贴,转为通用附件格式,然后显示在输入框上方""" + size_kb = round(len(text.encode('utf-8')) / 1024, 2) + line_count = text.count('\n') + 1 + att_data = { + "type": "text", + "content": text, + "size_kb": size_kb, + "lines": line_count + } + self._add_attachment_tag(att_data) + + + def _on_image_pasted(self, image_data): + """处理粘贴或拖拽的图片:保存到本地 data/attachments 并添加为附件""" + import os + import shutil + import uuid + + # 定位到项目根目录的 data/attachments + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + attach_dir = os.path.join(root_dir, "data", "attachments") + os.makedirs(attach_dir, exist_ok=True) + + # 情况1:image_data 是 QImage 对象(剪切板截图 / 直接拖入的图片数据) + if isinstance(image_data, QtGui.QImage): + new_filename = f"img_{uuid.uuid4().hex[:8]}.png" + target_path = os.path.join(attach_dir, new_filename) + image_data.save(target_path, "PNG") + + size_kb = round(os.path.getsize(target_path) / 1024, 2) + att_data = { + "type": "image", + "name": f"clipboard_{new_filename}", + "size_kb": size_kb, + "mime": "image/png", + "local_path": f"data/attachments/{new_filename}" + } + self._add_attachment_tag(att_data) + + # 情况2:image_data 是文件路径列表(拖拽图片文件 / 剪切板文件 URL) + elif isinstance(image_data, list): + for file_path in image_data: + ext = os.path.splitext(file_path)[1].lower() + if ext == '.jpg': + ext = '.jpeg' + new_filename = f"img_{uuid.uuid4().hex[:8]}{ext}" + target_path = os.path.join(attach_dir, new_filename) + shutil.copy2(file_path, target_path) + + size_kb = round(os.path.getsize(target_path) / 1024, 2) + mime_type = f"image/{ext[1:]}" if ext else "image/jpeg" + att_data = { + "type": "image", + "name": os.path.basename(file_path), + "size_kb": size_kb, + "mime": mime_type, + "local_path": f"data/attachments/{new_filename}" + } + self._add_attachment_tag(att_data) + + # 截图确认后,若主窗口原处于后台(Alt+S 触发),拉回前端显示 + if getattr(self, '_screenshot_from_background', False): + self._screenshot_from_background = False + self.showNormal() # 从最小化恢复 + self.raise_() # 提到 Z 序顶层 + self.activateWindow() # 请求系统焦点 + + def _on_files_dropped(self, paths): + """处理拖拽/粘贴/选择的文件:PDF 走专用解析,其余按文本读取转为附件。 + 不支持的类型 / 二进制 / 超大文件静默跳过,不打扰用户。""" + for path in paths: + ext = os.path.splitext(path)[1].lower() + if ext == '.pdf': # 🌟 PDF 交给专用工具解析(文本/图片双模式) + self._on_pdf_dropped(path) + continue + if ext in BINARY_EXTS: + continue + try: + content, enc, size_kb, lines = read_text_file(path) + except (ValueError, OSError): + continue + self._add_attachment_tag({ + "type": "text", + "name": os.path.basename(path), + "content": content, + "size_kb": size_kb, + "lines": lines, + "encoding": enc, + }) + + def _on_pdf_dropped(self, path): + """PDF 专用导入:拷贝落地 + 用 pdf_reader 解析逐页文本,生成默认文本模式附件。 + 加密/损坏/超大 PDF 静默跳过。""" + import shutil + # 1. 拷贝到 data/attachments(像图片一样落地;图片模式需要原文件再次提取) + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + attach_dir = os.path.join(root_dir, "data", "attachments") + os.makedirs(attach_dir, exist_ok=True) + new_filename = f"pdf_{uuid.uuid4().hex[:8]}.pdf" + target_path = os.path.join(attach_dir, new_filename) + try: + shutil.copy2(path, target_path) + # 2. 解析逐页结构化文本 + 总页数 + text_content, pages = extract_pdf_text(target_path) + except (ValueError, OSError): + return + self._add_attachment_tag({ + "type": "pdf", + "name": os.path.basename(path), + "size_kb": round(os.path.getsize(target_path) / 1024, 2), + "pages": pages, + "mode": "text", # 默认文本模式;候选栏里可切 "image" + "text_content": text_content, + "local_path": f"data/attachments/{new_filename}", + "images": [], # 切到图片模式时懒提取并缓存 + "selected_images": [], # 用户勾选的图片(图片模式发送用) + }) + + def _set_pdf_tag_style(self, tag_label: "ClickableLabel", mode: str) -> None: + """按当前模式给 PDF 附件标签设置外框颜色。 + + text 模式: 灰框, 悬停变蓝(与图片附件一致); image 模式: 持久红框。 + + Args: + tag_label: PDF 附件的标签控件。 + mode: "text" 或 "image"。 + """ + if mode == "image": + # 图片解析模式: 持久红框(悬停仅微调边框色, 不变蓝) + tag_label.setStyleSheet(""" + QLabel { background-color: #fff1f0; color: #cf1322; font-size: 13px; + padding: 8px 14px; border-radius: 6px; border: 1px solid #ff4d4f; } + QLabel:hover { border: 1px solid #ff7875; } + """) + else: + # 文本模式: 与图片/文本附件标签完全一致, 悬停变蓝 + tag_label.setStyleSheet(""" + QLabel { background-color: #f5f5f5; color: #555555; font-size: 13px; + padding: 8px 14px; border-radius: 6px; border: 1px solid #e5e5e5; } + QLabel:hover { color: #0066cc; border: 1px solid #b3d9ff; text-decoration: underline; } + """) + + def _show_pdf_popup(self, att_data: dict) -> None: + """在 PDF 附件标签上方弹出模式选择弹窗。 + + Args: + att_data: PDF 附件数据字典(含 _tag_label / images / mode 等)。 + """ + # 关闭上一个弹窗 + if getattr(self, "_pdf_popup", None) is not None: + try: + self._pdf_popup.close() + self._pdf_popup.deleteLater() + except Exception: + pass + self._pdf_popup = None + + tag_label = att_data.get("_tag_label") + if tag_label is None: + return + + popup = PdfModePopup(att_data, self.bg_widget) + popup.mode_changed.connect(lambda m, d=att_data: self._set_pdf_tag_style(d["_tag_label"], m)) + popup.preview_requested.connect(self._on_pdf_image_preview) + self._pdf_popup = popup + + # 弹窗高度由 setFixedHeight 固定, 可直接用来算标签上方的落点 + g = tag_label.mapToGlobal(QtCore.QPoint(0, 0)) + x = g.x() + y = g.y() - popup.height() - 5 + if y < 0: + y = g.y() + tag_label.height() + 5 + popup.show_with_animation(QtCore.QPoint(x, y)) + + def _on_pdf_image_preview(self, meta: dict, siblings: list, index: int, att_data: dict) -> None: + """预览 PDF 提取出的图片(复用附件图片预览覆盖层),支持同组左右翻页与选择。 + + Args: + meta: 当前图片元信息, 含 local_path / name / mime。 + siblings: 同组全部图片的 meta 列表(供翻页)。 + index: 当前图片在 siblings 中的下标。 + att_data: PDF 附件字典(供“选择”按钮回写 selected_images)。 + """ + overlay = AttachmentPreviewOverlay(meta, self.bg_widget, siblings=siblings, + index=index, att_data=att_data) + overlay.show() + + def _start_screenshot(self): + """启动截图(P1-04 平台路由:win32/x11 → 覆盖层;wayland → portal;unknown → 明确告知)""" + # 记录截图发起时主窗口是否处于非激活状态(如 Alt+S 热键触发) + self._screenshot_from_background = not self.isActiveWindow() + _kind = desktop_session.session_kind() + _mode, _msg = desktop_session.capture_plan(_kind) + if _msg: + print(_msg, flush=True) + return + if _mode == "portal": + self._start_portal_screenshot() + return + self.screenshot_overlay.start() + + def _start_portal_screenshot(self): + """Wayland:经 xdg-desktop-portal 交互截图(用户授权,不绕过 compositor)。""" + from ui.views.system_tools import portal_capture + if not hasattr(self, "_portal_worker"): + self._portal_worker = None + self._portal_worker = portal_capture.PortalScreenshotWorker(parent=self) + self._portal_worker.done.connect(self._on_portal_screenshot_done) + self._portal_worker.start() + + def _on_portal_screenshot_done(self, ok, path_or_reason): + """portal 截图结果回主线程:成功 → 进现有图片附件流程;失败 → 明确日志。""" + if ok: + self._on_image_pasted([path_or_reason]) + else: + print(f"[Screenshot] portal 截图未完成:{path_or_reason} → 当前环境截图能力不可用/已取消;" + f"聊天与其他功能不受影响", flush=True) + + + def _add_attachment_tag(self, att_data: dict): + """🌟 通用附件 UI 渲染(图片和长文本共用这一个精美样式)""" + index = len(self._folded_texts) + self._folded_texts.append(att_data) + + tag_widget = QtWidgets.QWidget() + tag_widget.setObjectName(f"attachment_tag_{index}") + tag_layout = QtWidgets.QHBoxLayout(tag_widget) + tag_layout.setContentsMargins(0, 0, 0, 0) + tag_layout.setSpacing(6) + + # 根据类型设置不同的文字 + if att_data["type"] == "text": + display_name = att_data.get("name", "长文本") + label_text = f"📄 附件 {index + 1}: {display_name} ({att_data['size_kb']} KB · {att_data['lines']} 行)" + elif att_data["type"] == "pdf": + label_text = f"📕 附件 {index + 1}: {att_data['name']} ({att_data.get('pages', 0)} 页 · {att_data['size_kb']} KB)" + else: + label_text = f"🖼️ 附件 {index + 1}: 图片 ({att_data['name']} · {att_data['size_kb']} KB)" + + label = ClickableLabel(label_text) + label.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + + if att_data["type"] == "pdf": + # 🌟 PDF:点击弹出解析模式候选栏;外框颜色随模式切换(文本=灰 / 图片=红) + att_data["_tag_label"] = label + self._set_pdf_tag_style(label, att_data.get("mode", "text")) + label.clicked.connect(lambda checked=False, d=att_data: self._show_pdf_popup(d)) + else: + label.setStyleSheet(""" + QLabel { background-color: #f5f5f5; color: #555555; font-size: 13px; + padding: 8px 14px; border-radius: 6px; border: 1px solid #e5e5e5; } + QLabel:hover { color: #0066cc; border: 1px solid #b3d9ff; text-decoration: underline; } + """) + label.clicked.connect(lambda checked=False, d=att_data: AttachmentPreviewOverlay(d, self.bg_widget)) + + remove_btn = QtWidgets.QPushButton("✕") + remove_btn.setFixedSize(26, 26) + remove_btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + remove_btn.setStyleSheet(""" + QPushButton { background: #eeeeee; border: none; border-radius: 13px; color: #888888; font-size: 12px; font-weight: bold; } + QPushButton:hover { background: #dddddd; color: #333333; } + """) + remove_btn.clicked.connect(lambda checked, w=tag_widget, i=index: self.remove_attachment(w, i)) + + tag_layout.addWidget(label) + tag_layout.addWidget(remove_btn) + + self.attachment_area_layout.addWidget(tag_widget) + self.attachment_scroll_area.setVisible(True) + self.text_input.setPlaceholderText("可继续添加文件或输入补充说明...") + + # ==================== 重新回答发送逻辑 ==================== + def _on_regenerate_clicked(self, msg_id): + """前端点击“重新回答”按钮时触发 (完美兼容 User框、正常AI框、幽灵报错框)""" + if self.current_session_id in self._active_streams: + return + + # 获取当前时间线上的所有消息 + messages = self.db.get_message_chain(self.current_session_id) + target_msg = next((m for m in messages if m["id"] == msg_id), None) + + # 🌟 核心修复:精准路由指针! + if not target_msg: + # 如果在数据库找不到,说明点的是报错的幽灵气泡 + # 查小本本,拿到绝对正确的提问指针! + user_msg_id = self._ghost_msg_map.get(msg_id) + if not user_msg_id: + print(f"[UI]: 未知气泡 {msg_id},拒绝重试操作") + return # 万一没查到,安全退出,绝不乱指 + else: + # 如果是正常的历史气泡 + if target_msg["role"] == "user": + user_msg_id = target_msg["id"] + else: + user_msg_id = target_msg["parent_id"] + + # 备份当前指针 (时光倒流用,这部分你之前的修改已经做得很好了) + original_leaf_id = self.db.get_session_leaf(self.current_session_id) + + # 截断时间线,重新拉取 UI,并启动生成 + self.db.update_session_leaf(self.current_session_id, user_msg_id) + self.load_messages_to_web(self.current_session_id, show_loading=False) # 🌟 内部刷新,不触发加载层 + self._regenerate_from_user_msg(user_msg_id, original_leaf_id) + + + # 🌟 参数增加 original_leaf_id + def _regenerate_from_user_msg(self, user_msg_id, original_leaf_id=None): + import uuid + session_id = self.current_session_id + api_messages = self.build_api_context(session_id) + self._dbg(f"[send-regen] model={self.current_model} " + f"mode={self._get_current_mode()}") + + ai_msg_id = f"msg-{uuid.uuid4().hex}" + + siblings = self.db.get_branch_info(user_msg_id) + total_branches = len(siblings) + 1 + branch_info = {"current": total_branches, "total": total_branches} + + self.chat_bridge.create_message( + ai_msg_id, "assistant", "", + self.current_model or "Assistant", + branch_info=branch_info + ) + # 🆕 P1-01:重新回答占位进渲染窗口 + self._rw_note_live(ai_msg_id, session_id) + self._ghost_msg_map[ai_msg_id] = user_msg_id + self._active_streams[session_id] = { + "msg_id": ai_msg_id, + "content": "", + "reasoning": "", + "timeline": [], # 🌟 agent 时间线(思考/文本/工具 按事件顺序) + "tl_kind": None, # 时间线当前段类型(think/text/tool) + "parent_id": user_msg_id, + "branch_info": branch_info, + "worker": None, + "usage": None, # 🆕 P1: 本轮已收到的精确 usage(显示锚定) + "previous_leaf_id": original_leaf_id or user_msg_id # 🌟 核心:存入时光倒流锚点! + } + + # 🆕 模式分派:重新回答跟随会话已锁定的模式(老会话未锁定 → chat 普通聊天) + worker = self._create_stream_worker(api_messages, self._get_current_mode() or "chat") + self._active_streams[session_id]["worker"] = worker + + worker.chunk_received.connect(lambda token: self.on_chunk_received(session_id, token)) + worker.reasoning_received.connect(lambda token: self.on_reasoning_received(session_id, token)) + worker.error_occurred.connect(lambda err: self.on_error(session_id, err)) + worker.finished.connect(lambda: self.on_reply_finished(session_id)) + # 🆕 P1: 本轮精确 usage(chat/worker 都有此信号)→ 显示锚定 + worker.usage_updated.connect(lambda u: self._on_usage_updated(session_id, u)) + if isinstance(worker, AgentWorker): + worker.tool_execution_started.connect(lambda cid, name, args: self._on_tool_started(session_id, cid, name, args)) + worker.tool_execution_updated.connect(lambda cid, text: self._on_tool_updated(session_id, cid, text)) + worker.tool_execution_timed.connect(lambda cid, el, to: self._on_tool_timed(session_id, cid, el, to)) + worker.tool_execution_finished.connect(lambda cid, name, ok, text: self._on_tool_finished(session_id, cid, name, ok, text)) + worker.context_compacted.connect(lambda p: self._on_context_compacted(session_id, p)) + # 🆕 压缩开始 → 前端「执行中」动态气泡 + worker.compaction_started.connect(lambda p: self._on_compaction_started(session_id, p)) + # 🆕 M3: 重试提示(仅 agent 循环有重试) + worker.retry_scheduled.connect(lambda a, m, d, r: self._on_retry_scheduled(session_id, a, m, d, r)) + worker.start() + + self.set_send_button_state(True) + self.update_context_display() + + + def clear_fold_state(self): + """发送后清除所有附件""" + self._folded_texts.clear() + # 清空附件容器里的所有子 widget + while self.attachment_area_layout.count(): + item = self.attachment_area_layout.takeAt(0) + if item.widget(): + item.widget().deleteLater() + self.attachment_scroll_area.setVisible(False) + self.text_input.setPlaceholderText("给 haocode 发送消息...") + + + # ==================== 核心发送逻辑 ==================== + + # ==================== 🆕 模式切换(chat / worker,首条消息锁定) ==================== + def _get_current_mode(self): + # 读取当前会话的模式(chat/worker),未发送过返回 None + sid = self.current_session_id + if not sid: + return None + try: + return self.db.get_session_mode(sid) + except Exception: + return None + + def _mode_switch_enabled(self): + # 🆕 config.json "mode_switch"(默认 false):是否允许会话中途切换 chat↔worker + # false = 现状(首条消息锁定,不可再改);true = 随时可切,选择即生效 + try: + return bool(self.config_data.get("mode_switch", False)) + except Exception: + return False + + def _refresh_mode_button(self): + # 切换会话后刷新模式按钮(显示锁定状态或待选状态) + if getattr(self, "mode_popup", None) is not None and self.mode_popup.isVisible(): + self.mode_popup.close() + cur = self._get_current_mode() + if cur and not self._mode_switch_enabled(): + # 开关关(默认)且会话已有模式 → 锁定态 + self.btn_mode.setText("🔒 " + ("Chat" if cur == "chat" else "Worker")) + self.btn_mode.setToolTip("本会话已锁定模式(首条消息时锁定),新开会话可换") + self._mode_panel_selected = cur + else: + # 开关开(无锁)或新会话:会话已有模式时显示并同步该模式 + mode = cur or self.pending_mode + if cur and self._mode_switch_enabled(): + self.pending_mode = cur + self.btn_mode.setText(("💬 Chat" if mode == "chat" else "⚡ Worker") + " ▾") + self.btn_mode.setToolTip("切换聊天模式(随时可切换)" if self._mode_switch_enabled() + else "切换聊天模式(发送第一条消息后锁定)") + self._mode_panel_selected = mode + if getattr(self, "mode_popup", None) is not None: + self.mode_popup.mark_selected(self._mode_panel_selected) + + def init_mode_popup(self): + # 🆕 实例化模式选择浮动弹窗(与模型选择弹窗同款实现,先不显示) + self.mode_popup = SessionModePopup(self) + self.mode_popup.mode_selected.connect(self._select_mode) + + def show_mode_popup(self): + '''计算位置并执行动画弹出(模式按钮正上方右对齐)''' + if self._get_current_mode() is not None and not self._mode_switch_enabled(): + # 已锁定:在提示行闪一下 + self.hint_label.setText("本会话已锁定模式,新开会话可换") + QtCore.QTimer.singleShot(2500, self._restore_hint_label) + return + btn_pos = self.btn_mode.mapToGlobal(QtCore.QPoint(0, 0)) + x = btn_pos.x() + self.btn_mode.width() - self.mode_popup.width() + y = btn_pos.y() - self.mode_popup.height() - 5 + self.mode_popup.mark_selected(self._mode_panel_selected) + self.mode_popup.show_with_animation(QtCore.QPoint(x, y)) + + def _restore_hint_label(self): + self.hint_label.setText("AI 生成内容可能不准确。") + + def _select_mode(self, mode): + if self._get_current_mode() is not None and not self._mode_switch_enabled(): + return # 开关关且会话已锁定:不可改 + self.pending_mode = mode + self._mode_panel_selected = mode + self.btn_mode.setText(("💬 Chat" if mode == "chat" else "⚡ Worker") + " ▾") + self.mode_popup.mark_selected(mode) + self.mode_popup.close() + # 🆕 开关开:选择即落库,下一次发送/重新回答立即生效 + if self._mode_switch_enabled(): + sid = self.current_session_id + if sid: + try: + self.db.set_session_mode(sid, mode) + print(f"[UI]: 会话 {sid[:8]} 模式切换 -> {mode}") + except Exception as e: + print(f"[UI]: 模式切换落库失败: {e}") + + def _lock_session_mode(self): + # 首条消息发送时,记录当前会话模式(开关关=锁定不可再改;开关开=仅记录,之后仍可切换) + sid = self.current_session_id + if not sid or self._get_current_mode() is not None: + return + mode = self.pending_mode or "chat" + try: + self.db.set_session_mode(sid, mode) + if self._mode_switch_enabled(): + print(f"[UI]: 会话 {sid[:8]} 模式记录 -> {mode}") + else: + print(f"[UI]: 会话 {sid[:8]} 模式锁定 -> {mode}") + except Exception as e: + print(f"[UI]: 模式锁定失败: {e}") + self._refresh_mode_button() + + def _create_stream_worker(self, messages, mode): + # 按模式创建 worker:worker→AgentWorker(agent 循环) / chat→ChatWorker(普通聊天) + if mode == "worker": + return AgentWorker(self.current_provider, self.current_model, messages) + return ChatWorker(self.current_provider, self.current_model, messages) + + def _persist_interrupted_stream(self, session_id, stream_state): + """🆕 Fix B: 持久化进行中的部分回复(发送中断 / 关窗共用)。 + - 有内容/思考/时间线 → 以 assistant 消息挂到链表(parent 指向本轮提问) + - 完全为空 → 时光倒流:会话叶子回退到发送前 + """ + import json as _json + try: + if (stream_state.get("content") or stream_state.get("reasoning") + or stream_state.get("timeline")): + tl_json = (_json.dumps(stream_state["timeline"], ensure_ascii=False) + if stream_state.get("timeline") else None) + # 🆕 P1: 中断回复也保存精确 usage(供后续显示/压缩估算锚定) + _usage_json = None + try: + from core.agent import calculate_context_tokens as _calc_usage + if _calc_usage(stream_state.get("usage") or {}) > 0: + _usage_json = _json.dumps(stream_state.get("usage")) + except Exception: + pass + self.db.add_message( + session_id=session_id, + role="assistant", + content=stream_state.get("content", ""), + parent_id=stream_state.get("parent_id"), + reasoning=stream_state.get("reasoning", ""), + msg_id=stream_state.get("msg_id"), + timeline=tl_json, + usage=_usage_json + ) + print(f"[DB]: 中断内容已保存 " + f"({len(stream_state.get('content') or '')} 字) session={session_id[:8]}", flush=True) + else: + prev_leaf = stream_state.get("previous_leaf_id") + if prev_leaf: + self.db.update_session_leaf(session_id, prev_leaf) + print(f"[DB]: 中断时未生成内容,叶子节点已回退至: {prev_leaf}", flush=True) + except Exception as e: + print(f"[DB]: 中断内容保存失败: {e}", flush=True) + + def send_message(self, from_enter: bool = False): + import time + import uuid + import json + + # 🌟 P0-02:发送规则的单一实现(Enter 与按钮点击路径共用): + # 发送按钮禁用 → 一律不得发送; + # 当前会话正在流式生成 → Enter 路径直接 no-op(不参与停止/中断语义,防误触); + # 按钮点击路径保留原有中断行为(红色停止按钮),继续落入下方中断逻辑。 + if not self.btn_send.isEnabled(): + return + if from_enter and self.current_session_id in self._active_streams: + return + + current_time = time.time() + if current_time - self._last_click_time < 0.3: + return + self._last_click_time = current_time + + # 检查当前会话是否正在生成(处理中断请求) + if self.current_session_id in self._active_streams: + stream_state = self._active_streams[self.current_session_id] + worker = stream_state.get("worker") + if worker: + try: + worker.chunk_received.disconnect() + worker.error_occurred.disconnect() + worker.reasoning_received.disconnect() + worker.finished.disconnect() + if hasattr(worker, "tool_execution_started"): + worker.tool_execution_started.disconnect() + worker.tool_execution_updated.disconnect() + worker.tool_execution_finished.disconnect() + worker.context_compacted.disconnect() + worker.usage_updated.disconnect() + if hasattr(worker, "retry_scheduled"): + worker.retry_scheduled.disconnect() + except Exception: + pass + worker.abort() + worker.finished.connect(worker.deleteLater) + + msg_id = stream_state["msg_id"] + self.chat_bridge.show_error(msg_id, "🛑 已中断生成") + self.chat_bridge.finish_message(msg_id) + + # 🆕 Fix B: 中断部分内容的持久化收拢到公共方法(与 closeEvent 共用) + self._persist_interrupted_stream(self.current_session_id, stream_state) + + del self._active_streams[self.current_session_id] + self.set_send_button_state(False) + self.update_context_display() + + print("\n[系统]: 🛑 已中断。") + # 🆕 Fix C: 输入框里若有新提问(用户是边中断边点发送的), + # 不再 return 吞掉 —— 直接落入下方正常发送流程(中断 + 发送一步完成) + if not (self.text_input.toPlainText().strip() + or [t for t in self._folded_texts if t is not None]): + return + + # 正常发送消息流程 + extra_text = self.text_input.toPlainText().strip() + valid_attachments = [t for t in self._folded_texts if t is not None] + + if not extra_text and not valid_attachments: + return + + self.text_input.clear() + self.clear_fold_state() + self.set_send_button_state(True) + + user_msg_id = f"msg-{uuid.uuid4().hex}" + attachment_metadata_json = None + + # 🌟 分离文本附件和图片附件 (多模态支持) + text_attachments_content = [] + api_attachments_meta = [] + + if valid_attachments: + for att in valid_attachments: + if att["type"] == "text": + # 带文件名的附件在 prompt 里包一层来源标记,方便模型区分多文件 + if att.get("name"): + text_attachments_content.append(f"[文件: {att['name']}]\n{att['content']}") + else: + text_attachments_content.append(att["content"]) + meta_item = { + "type": "text", + "size_kb": att["size_kb"], + "lines": att["lines"], + "content": att["content"] # 🌟 补回 content 字段,防止前端 JS 截取预览时报错 + } + if att.get("name"): + meta_item["name"] = att["name"] # 🌟 文件名存入元数据,前端卡片与历史重载用 + api_attachments_meta.append(meta_item) + elif att["type"] == "image": + api_attachments_meta.append({ + "type": "image", + "name": att["name"], + "mime": att["mime"], + "local_path": att["local_path"], + "size_kb": att.get("size_kb", 0), # 🌟 补上大小,防止 JS 出现 undefined KB + "lines": 1, # 🌟 补上行数,防止 JS 出现 undefined 行 + "content": f"[图片文件: {att['name']}]" # 假 content 防报错 + }) + elif att["type"] == "pdf": + mode = att.get("mode", "text") + text_content = att.get("text_content", "") + if mode == "image": + # 图片解析模式: 文本与勾选的图片一起发送 + if text_content: + text_attachments_content.append(f"[文件: {att['name']}]\n{text_content}") + # 卡片①:图片(用户勾选的) + api_attachments_meta.append({ + "type": "pdf", + "mode": "image", + "name": att["name"], + "size_kb": att.get("size_kb", 0), + "pages": att.get("pages", 0), + "selected_images": att.get("selected_images", []), + "images": att.get("images", []), # 全部提取图片, 供清理物理文件 + "local_path": att.get("local_path"), # PDF 本体拷贝, 供清理 + "lines": len(att.get("selected_images", [])), + "content": f"[PDF 图片解析: {att['name']}]" + }) + # 卡片②:文本(与图片分开成独立气泡显示) + if text_content: + api_attachments_meta.append({ + "type": "pdf", + "mode": "text", + "name": att["name"], + "size_kb": att.get("size_kb", 0), + "pages": att.get("pages", 0), + "images": [], + "lines": text_content.count("\n") + 1, + "content": text_content + }) + else: + # 文本模式: 结构化文本作为文本附件注入 prompt + text_attachments_content.append(f"[文件: {att['name']}]\n{text_content}") + api_attachments_meta.append({ + "type": "pdf", + "mode": "text", + "name": att["name"], + "size_kb": att.get("size_kb", 0), + "pages": att.get("pages", 0), + "images": att.get("images", []), # 文本模式一般为空, 供清理 + "local_path": att.get("local_path"), + "lines": text_content.count("\n") + 1, + "content": text_content + }) + + # 前端渲染展示 (传 meta 过去) + self.chat_bridge.create_user_message_with_attachments(user_msg_id, extra_text, api_attachments_meta) + + attachment_metadata_json = json.dumps({ + "user_text": extra_text, + "attachments": api_attachments_meta + }, ensure_ascii=False) + + # 数据库里的 content 依然只存纯文本 + all_text_attachments = "\n\n---\n\n".join(text_attachments_content) + if extra_text and all_text_attachments: + llm_text = extra_text + "\n\n" + all_text_attachments + elif all_text_attachments: + llm_text = all_text_attachments + else: + llm_text = extra_text + else: + self.chat_bridge.create_message(user_msg_id, "user", extra_text, "You") + llm_text = extra_text + + # 🚀 1. 获取当前对话的尾巴节点 + current_leaf_id = self.db.get_session_leaf(self.current_session_id) + + # 🚀 2. 插入用户消息(它的父亲是旧的尾巴节点),插入后这只 User 成了新尾巴 + self.db.add_message( + session_id=self.current_session_id, + role="user", + content=llm_text, # 纯文本部分 + parent_id=current_leaf_id, # <--- 链表指针! + msg_id=user_msg_id, + attachment_metadata=attachment_metadata_json # 图片路径和文本元数据存入这里 + ) + self.db.mark_session_has_messages(self.current_session_id) + # 🆕 P1-01:用户消息进渲染窗口(已持久化,带真实链内下标) + self._rw_note_live(user_msg_id, self.current_session_id) + self._dbg(f"[send] model={self.current_model} mode={self._get_current_mode()}") + + # 组装给大模型的 API 上下文(build_api_context 内部会去解析图片 local_path 并转为 base64 发给 API) + messages = self.build_api_context(self.current_session_id) + + ai_msg_id = f"msg-{uuid.uuid4().hex}" + + # 🚀 正常发送产生的新回答,必定是这句提问的第 1 个分支 + branch_info = {"current": 1, "total": 1} + + self.chat_bridge.create_message( + ai_msg_id, "assistant", "", + self.current_model or "Assistant", + branch_info=branch_info # 🚀 传给前端 + ) + # 🆕 P1-01:助手占位进渲染窗口(未持久化 -1 降级;流式保护由 streaming 类自动生效) + self._rw_note_live(ai_msg_id, self.current_session_id) + self._ghost_msg_map[ai_msg_id] = user_msg_id + session_id = self.current_session_id + self._active_streams[session_id] = { + "msg_id": ai_msg_id, + "content": "", + "reasoning": "", + "timeline": [], # 🌟 agent 时间线(思考/文本/工具 按事件顺序) + "tl_kind": None, # 时间线当前段类型(think/text/tool) + "parent_id": user_msg_id, + "branch_info": branch_info, + "worker": None, + "usage": None, # 🆕 P1: 本轮已收到的精确 usage(显示锚定) + "previous_leaf_id": user_msg_id # 🌟 核心修复:新提问的锚点就是提问本身 + } + + # 创建 worker(只创建一次) + # 🆕 模式分派:worker → agent 循环(工具/重试/压缩);chat → 普通聊天 + mode = self._get_current_mode() or self.pending_mode + self._lock_session_mode() # 首条消息即锁定 + worker = self._create_stream_worker(messages, mode) + self._active_streams[session_id]["worker"] = worker + + # 用 lambda 绑定 session_id,让回调函数知道是哪个会话的数据 + worker.chunk_received.connect(lambda token: self.on_chunk_received(session_id, token)) + worker.reasoning_received.connect(lambda token: self.on_reasoning_received(session_id, token)) + worker.error_occurred.connect(lambda err: self.on_error(session_id, err)) + worker.finished.connect(lambda: self.on_reply_finished(session_id)) + # 🆕 P1: 本轮精确 usage(chat/worker 都有此信号)→ 显示锚定 + worker.usage_updated.connect(lambda u: self._on_usage_updated(session_id, u)) + if isinstance(worker, AgentWorker): + # 工具执行事件只有 agent 循环才有 + worker.tool_execution_started.connect(lambda cid, name, args: self._on_tool_started(session_id, cid, name, args)) + worker.tool_execution_updated.connect(lambda cid, text: self._on_tool_updated(session_id, cid, text)) + worker.tool_execution_timed.connect(lambda cid, el, to: self._on_tool_timed(session_id, cid, el, to)) + worker.tool_execution_finished.connect(lambda cid, name, ok, text: self._on_tool_finished(session_id, cid, name, ok, text)) + worker.context_compacted.connect(lambda p: self._on_context_compacted(session_id, p)) + # 🆕 压缩开始 → 前端「执行中」动态气泡 + worker.compaction_started.connect(lambda p: self._on_compaction_started(session_id, p)) + # 🆕 M3: 重试提示(仅 agent 循环有重试) + worker.retry_scheduled.connect(lambda a, m, d, r: self._on_retry_scheduled(session_id, a, m, d, r)) + print(f"[生命周期] 发送 → session={session_id[:8]} ai_msg={ai_msg_id} 模式={mode} 用户文本={len(extra_text)}c", flush=True) + worker.start() + + # 🌟 新增:发送时刷新上下文显示 + self.update_context_display() + + + + + def on_reply_finished(self, session_id): + """回复完成""" + if session_id not in self._active_streams: return + + stream_state = self._active_streams[session_id] + msg_id = stream_state["msg_id"] + parent_id = stream_state["parent_id"] # 取出父亲是谁 + + if session_id == self.current_session_id: + self.chat_bridge.finish_message(msg_id) + self.browser.page().runJavaScript("dumpDiag()", self._on_diag_dumped) + print("\n[系统]:✅ 回复完毕。") + else: + print(f"\n[系统]: ✅ 会话 {session_id[:8]} 回复完毕(后台)") + + # 人肉 debug:完成时刻的生命周期快照 + _tl0 = stream_state.get("timeline") or [] + print(f"[生命周期] 回复完成 session={session_id[:8]} mid={msg_id} " + f"正文={len(stream_state['content'])}c 思考={len(stream_state['reasoning'])}c 时间线={len(_tl0)}条", flush=True) + # 🆕 调试日志:完成时刻的精确 usage + 时间线条数 + try: + _du = stream_state.get("usage") or {} + self._dbg(f"[finish] usage_input={_du.get('input')} " + f"usage_output={_du.get('output')} timeline={len(_tl0)}条") + except Exception: + pass + # 完成时刻屏幕快照 + DOM 体检 + try: + self._shot_n = getattr(self, "_shot_n", 0) + 1 + import os as _os + _shot_path = _os.path.join( + _os.path.dirname(_os.path.dirname(_os.path.dirname(_os.path.abspath(__file__)))), + f"diag_shot_{self._shot_n:02d}_FINISH.png") + self.browser.grab().save(_shot_path) + print(f"[画面] 完成快照 -> {_os.path.basename(_shot_path)}", flush=True) + except Exception as _e: + print(f"[画面] 完成截图失败: {_e}", flush=True) + def _finish_dom_probe(_res): + diag_log(f"FINISH_DOM {_res}") + print(f"[画面] 完成时刻 DOM 体检: {_res}", flush=True) + self.browser.page().runJavaScript(f"probeStream('{msg_id}')", _finish_dom_probe) + # 🚀 入库,自动成为时间线新叶子! + if (stream_state["content"] or stream_state["reasoning"] + or stream_state.get("timeline")): + tl_json = (json.dumps(stream_state["timeline"], ensure_ascii=False) + if stream_state.get("timeline") else None) + # 🆕 P1: 保存本轮精确 usage(供下次显示/压缩估算做 usage 锚定) + _usage_json = None + try: + from core.agent import calculate_context_tokens as _calc_usage + if _calc_usage(stream_state.get("usage") or {}) > 0: + _usage_json = json.dumps(stream_state.get("usage")) + except Exception: + pass + self.db.add_message( + session_id=session_id, + role="assistant", + content=stream_state["content"], + parent_id=parent_id, # <--- 链表指针! + reasoning=stream_state["reasoning"], + msg_id=msg_id, + timeline=tl_json, # 🌟 时间线持久化(思考/文本/工具 按序) + usage=_usage_json # 🆕 P1: usage 锚点 + ) + print(f"[生命周期] DB 写入完成 mid={msg_id} timeline={len(_tl0)}条", flush=True) + # 🆕 P1-01:入库后刷新链内下标(仅当前会话推送;JS 侧同名校验) + self._rw_note_live(msg_id, session_id) + + if self.db.check_session_needs_title(session_id): + self._generate_session_title(session_id) + + del self._active_streams[session_id] + + if session_id == self.current_session_id: + self.set_send_button_state(False) + self.update_context_display() + + def _generate_session_title(self, session_id): + """调用 LLM 生成会话标题""" + # 🌟 如果这个会话已经在生成标题了,跳过 + if session_id in self._title_workers: + return + + # 🚀 修复 Bug:使用新的链表查询方法 get_message_chain! + messages = self.db.get_message_chain(session_id) + + user_msg = next((m for m in messages if m["role"] == "user"), None) + assistant_msg = next((m for m in messages if m["role"] == "assistant"), None) + + if not user_msg or not assistant_msg: + return + + title_prompt = [ + {"role": "system", "content": "你是一个标题生成助手。根据对话内容,生成一个6个字以内的简洁标题。只返回标题文本,不要其他内容。"}, + {"role": "user", "content": f"用户:{user_msg['content'][:100]}\n助手:{assistant_msg['content'][:100]}"} + ] + + worker = TitleWorker(self.current_provider, self.current_model, title_prompt) + + # 🌟 用字典存储,以 session_id 为 key + self._title_workers[session_id] = { + "worker": worker, + "accumulator": "" + } + + # 🌟 用 lambda 绑定 session_id + worker.chunk_received.connect(lambda chunk: self._on_title_chunk(session_id, chunk)) + worker.finished.connect(lambda: self._on_title_finished(session_id)) + worker.start() + def _on_title_chunk(self, session_id, chunk): + """累积标题 token""" + if session_id in self._title_workers: + self._title_workers[session_id]["accumulator"] += chunk + + def _on_title_finished(self, session_id): + if session_id not in self._title_workers: + return + + title_state = self._title_workers[session_id] + new_title = title_state["accumulator"].strip()[:20] + + if new_title: + self.db.update_session_title(session_id, new_title) + + # 🔴 原来: item.setText(new_title) + # 🟢 改为: 通过 widget 更新 + for i in range(self.history_list.count()): + item = self.history_list.item(i) + if item.data(QtCore.Qt.ItemDataRole.UserRole) == session_id: + w = self.history_list.itemWidget(item) + if w and hasattr(w, 'set_title'): + w.set_title(new_title) + break + + print(f"[System]: ✅ 会话标题已生成 -> {new_title}") + + worker = title_state["worker"] + worker.deleteLater() + del self._title_workers[session_id] + + + def _on_title_generated(self, worker): + """标题生成完成的回调""" + # 从 worker 中提取生成的标题 + if hasattr(worker, '_accumulated_content'): + new_title = worker._accumulated_content.strip()[:20] # 最多 20 个字 + if new_title: + # 更新数据库 + self.db.update_session_title(self.current_session_id, new_title) + + # 更新侧边栏 UI + for i in range(self.history_list.count()): + item = self.history_list.item(i) + if item.data(QtCore.Qt.ItemDataRole.UserRole) == self.current_session_id: + item.setText(new_title) + break + + print(f"[System]: ✅ 会话标题已生成 -> {new_title}") + + worker.deleteLater() + + # ==================== 工具执行事件(pi tool_execution_*) ==================== + + def _on_tool_started(self, session_id, call_id, name, args): + """工具开始执行 → 前端在时间线当前位置插入执行 chip""" + print(f"[工具] 开始 name={name} call={call_id} session={session_id[:8]}", flush=True) + # 🆕 右侧任务面板(bash 才登记;只跟当前会话) + if session_id == self.current_session_id: + try: + self.bash_panel.on_started(call_id, name, args) + except Exception as _e: + print(f"[Warn]: 任务面板 on_started 失败: {_e}") + st = self._active_streams.get(session_id) + if not st: + return + if session_id == self.current_session_id: + self._schedule_context_refresh() # 🆕 Fix E: 工具显现 → 刷新上下文标签 + # 🌟 时间线:工具条目(跨会话也记录,供持久化) + st["tl_kind"] = "tool" + st["timeline"].append({"t": "tool", "id": call_id, "name": name, + "args": args, "ok": None, "result": ""}) + if session_id == self.current_session_id: + self.chat_bridge.tool_execution_started(st["msg_id"], call_id, name, args) + + def _on_tool_updated(self, session_id, call_id, text): + """工具执行中的增量输出""" + # 🆕 右侧任务面板:实时输出(独立缓冲,不受上游 4000 字符上限影响) + if session_id == self.current_session_id: + try: + self.bash_panel.on_output(call_id, text) + except Exception: + pass + st = self._active_streams.get(session_id) + if not st: + return + if session_id == self.current_session_id: + self._schedule_context_refresh() # 🆕 Fix E: 工具输出显现 → 刷新 + # 🌟 时间线:按 call_id 累积工具输出(上限 4000 字符) + for e in reversed(st["timeline"]): + if e.get("t") == "tool" and e.get("id") == call_id: + e["result"] = (e.get("result", "") + text)[-4000:] + break + if session_id == self.current_session_id: + self.chat_bridge.tool_execution_updated(st["msg_id"], call_id, text) + + def _on_tool_timed(self, session_id, call_id, elapsed, timeout): + """🆕 bash 运行中每秒读秒 → 前端气泡刷新 N/Ts(0/10s, 1/10s, ...)""" + # 🆕 右侧任务面板:读秒 + if session_id == self.current_session_id: + try: + self.bash_panel.on_timed(call_id, elapsed, timeout) + except Exception: + pass + if session_id == self.current_session_id: + st = self._active_streams.get(session_id) + if st: + self.chat_bridge.tool_execution_timed( + st["msg_id"], call_id, int(elapsed), int(timeout)) + + def _on_tool_finished(self, session_id, call_id, name, ok, text): + """工具执行结束 → chip 按 call_id 标记结果""" + _flat = " ".join((text or "").split()) + print(f"[工具] 完成 name={name} ok={ok} 结果={len(text or '')}c call={call_id} {_flat[:80]}", flush=True) + # 🆕 右侧任务面板:完成后原位转为「已完成」(输出 = 进入上下文的原文) + if session_id == self.current_session_id: + try: + self.bash_panel.on_finished(call_id, name, ok, text) + except Exception as _e: + print(f"[Warn]: 任务面板 on_finished 失败: {_e}") + st = self._active_streams.get(session_id) + if not st: + return + if session_id == self.current_session_id: + self._schedule_context_refresh() # 🆕 Fix E: 工具结果定格 → 刷新 + # 🌟 时间线:按 call_id 定格工具条目 + for e in reversed(st["timeline"]): + if e.get("t") == "tool" and e.get("id") == call_id: + e["ok"] = bool(ok) + e["result"] = text or e.get("result", "") + break + if session_id == self.current_session_id: + self.chat_bridge.tool_execution_finished(st["msg_id"], call_id, name, ok, text) + + def _on_compaction_started(self, session_id, path): + """🆕 压缩开始(摘要 LLM 调用中)→ 当前消息时间线内显示「上下文压缩」思考气泡""" + print(f"[压缩] 开始 session={session_id[:8]} path={path}", flush=True) + if session_id == self.current_session_id: + st = self._active_streams.get(session_id) + if st: + self.chat_bridge.compaction_started(st["msg_id"], str(path)) + + def _on_context_compacted(self, session_id, payload=None): + """agent 自动压缩了上下文(pi compaction)→ 同一气泡原地更新(含摘要全文)""" + payload = payload or {} + print(f"[压缩] 完成 session={session_id[:8]} path={payload.get('path')} " + f"before={payload.get('before')} after={payload.get('after')} " + f"duration_ms={payload.get('duration_ms')}", flush=True) + self._dbg(f"[compact] path={payload.get('path')} " + f"before={payload.get('before')} after={payload.get('after')}") + # 🆕 压缩持久化:切点齐备 → DB 链上插标记行(历史全保留,API 在标记处截断) + try: + _cb = payload.get("cut_before_id") + _fr = payload.get("first_retained_id") + if _cb and _fr: + _meta = json.dumps({"path": payload.get("path"), + "before": payload.get("before"), + "after": payload.get("after")}, ensure_ascii=False) + self.db.insert_compaction_mark( + session_id, payload.get("summary") or "", _cb, _fr, _meta) + else: + print("[压缩] 切点不完整(保留尾巴无 DB 行)→ 本轮仅轮内生效,不插标记", flush=True) + except Exception as _e: + print(f"[压缩] 标记入库失败: {_e}", flush=True) + if session_id == self.current_session_id: + st = self._active_streams.get(session_id) + if st: + self.chat_bridge.compaction_finished(st["msg_id"], payload) + self.update_context_display() + + def _on_usage_updated(self, session_id, usage): + """🆕 P1: 收到本轮精确 usage → 记录供显示锚定 + 防抖刷新""" + st = self._active_streams.get(session_id) + if st is not None: + st["usage"] = usage + self._dbg(f"[usage] input={usage.get('input')} output={usage.get('output')}") + if session_id == self.current_session_id: + self._schedule_context_refresh() + + # ==================== 🆕 调试窗口(独立于项目树;文件协议) ==================== + def _poll_debug_cmd(self): + """2s 轮询 data/debug_window.cmd:show/hide → 开/关独立调试窗口""" + try: + action = poll_debug_cmd() + if not action: + return + if action == "show": + if self.debug_window is None: + from ui.views.debug_window import DebugWindow + self.debug_window = DebugWindow() + self.debug_window.show() + self.debug_window.raise_() + self.debug_window.activateWindow() + elif action == "hide": + if self.debug_window is not None: + self.debug_window.hide() + except Exception: + pass + + def _dbg(self, msg): + """向调试会话日志注入一条 APP 事件(吞一切异常,绝不影响主流程)""" + try: + debug_log(f"sid={(self.current_session_id or '?')[:8]} {msg}", "APP") + except Exception: + pass + + def _on_retry_scheduled(self, session_id, attempt, max_attempts, delay_ms, reason): + """🆕 M3: 重试已调度(对照 pi onRetryScheduled)——UI 提示(同压缩提示风格)""" + if session_id == self.current_session_id: + self.chat_bridge.show_note( + f"请求异常,正在自动重试({attempt}/{max_attempts})…") + + def on_error(self, session_id, error_text: str): + """发生错误""" + if session_id not in self._active_streams: + return + + stream_state = self._active_streams[session_id] + msg_id = stream_state["msg_id"] + self._dbg(f"[error] {str(error_text)[:150]}") + + # 🆕 失败轮次持久化(对照 pi:出错也写会话)—— + # 不再"时光倒流"丢弃整轮:已跑完的工具结果 / 正文全部入库,叶子前进, + # 下次提问能接着干(回放取舍在 build_api_context 里定)。 + self._persist_failed_stream(session_id, stream_state, error_text) + + # 错误信息始终显示(即使不在当前会话) + if session_id == self.current_session_id: + self.chat_bridge.show_error(msg_id, f"❌ 请求失败: {error_text}") + self.chat_bridge.finish_message(msg_id) + # 清理该会话的流式状态 + del self._active_streams[session_id] + # 只有当前会话出错时,才更新按钮状态 + if session_id == self.current_session_id: + self.set_send_button_state(False) + self.update_context_display() + + + def _persist_failed_stream(self, session_id, stream_state, error_text): + """🆕 失败轮次持久化(对照 pi:message_end 无条件入库 → 出错也写会话)。 + + 与「用户中断」的**持久化策略一致**(本轮已完成的工具结果 + 正文 + 思考全入库), + 只在语义上标注 stop_reason="error";**不再回退叶子("时光倒流")**: + 否则 agent 跑了 200 个工具后第 201 步出错,整轮产出会被丢掉, + 下次提问模型完全不知情 → 只能从头重做。 + + 回放取舍(见 build_api_context): + · 有正文/工具 → is_ignored=0,正常进上下文 + · 完全空 → is_ignored=1,只在库里留痕,不回放(避免空 assistant 触发 400) + """ + import json as _json + try: + err = " ".join(str(error_text or "").split())[:500] + body = stream_state.get("content") or "" + # 用 Markdown 引用块 → 前端 marked 直接渲染成醒目提示条(无需改 JS) + note = f"> ⚠️ [本轮中断] {err}" if err else "> ⚠️ [本轮中断]" + content = (body + "\n\n" + note) if body.strip() else note + timeline = list(stream_state.get("timeline") or []) + # ⚠️ 关键:带 timeline 的行,回放走 timeline 分支(**不读 content**) + # → 中断说明必须额外作为一条 text 条目,否则模型看不到「上轮为何断」 + if timeline: + timeline.append({"t": "text", "text": "\n\n" + note}) + tools = [e for e in timeline if e.get("t") == "tool"] + has_real = (bool(body.strip()) or bool(tools) + or bool((stream_state.get("reasoning") or "").strip())) + tl_json = _json.dumps(timeline, ensure_ascii=False) if timeline else None + _usage_json = None + try: + from core.agent import calculate_context_tokens as _calc_usage + if _calc_usage(stream_state.get("usage") or {}) > 0: + _usage_json = _json.dumps(stream_state.get("usage")) + except Exception: + pass + self.db.add_message( + session_id=session_id, + role="assistant", + content=content, + parent_id=stream_state.get("parent_id"), + reasoning=stream_state.get("reasoning", ""), + msg_id=stream_state.get("msg_id"), + timeline=tl_json, + usage=_usage_json, + is_ignored=(not has_real), + stop_reason="error", + error_message=err, + ) + print(f"[DB]: 失败轮次已入库 正文={len(body)}c 工具={len(tools)}个 " + f"回放={'是' if has_real else '否(全空留痕)'} " + f"session={session_id[:8]} err={err[:60]}", flush=True) + except Exception as e: + print(f"[DB]: 失败轮次入库失败: {e}", flush=True) + prev_leaf = stream_state.get("previous_leaf_id") + if prev_leaf: + try: + self.db.update_session_leaf(session_id, prev_leaf) + except Exception: + pass + + def _render_watchdog_tick(self): + """渲染看门狗:当前会话有活跃流且已有内容 → 强制前端渲染一帧。 + 每 2s 附带一次 DOM 体检(PROBE)写入 stream_diag.log。""" + try: + st = self._active_streams.get(self.current_session_id) + if not st: + return + if not (st.get("timeline") or st.get("content") or st.get("reasoning")): + return + self.chat_bridge.run_js( + f"forceRenderNow('{st['msg_id']}');") + import time as _t + now = _t.time() + if not hasattr(self, "_last_probe_at"): + self._last_probe_at = 0 + if now - self._last_probe_at >= 2.0: + self._last_probe_at = now + self.browser.page().runJavaScript( + f"probeStream('{st['msg_id']}')", self._on_probe_result) + # 屏幕快照:默认关闭(grab() 强制出帧会阻塞渲染器主线程 1-2s, + # 与正文 token 处理互相干扰);需要时设环境变量 HAOCODE_SHOT=1 + if os.environ.get("HAOCODE_SHOT") == "1": + _tot = len(st.get("content") or "") + len(st.get("reasoning") or "") + if not hasattr(self, "_last_shot_len"): + self._last_shot_len = 0 + if _tot != getattr(self, "_last_shot_len", 0): + self._last_shot_len = _tot + try: + if not hasattr(self, "_shot_n"): + self._shot_n = 0 + self._shot_n += 1 + import os as _os + _shot_path = _os.path.join( + _os.path.dirname(_os.path.dirname(_os.path.dirname(_os.path.abspath(__file__)))), + f"diag_shot_{self._shot_n:02d}.png") + self.browser.grab().save(_shot_path) + print(f"[画面] 流式快照 #{self._shot_n} 总长={_tot}c -> {_os.path.basename(_shot_path)}", flush=True) + except Exception as _e: + print(f"[画面] 截图失败: {_e}", flush=True) + except Exception: + pass + + def _on_probe_result(self, res): + diag_log(f"PROBE {str(res)[:800]}") + + def _jslog_drain_tick(self): + """每 500ms 抽取 JS console 缓冲 → Python 控制台""" + try: + self.browser.page().runJavaScript( + "window.__jslogDrain ? window.__jslogDrain() : ''", self._jslog_on_drain) + except Exception: + pass + + def _jslog_on_drain(self, res): + if not res: + return + for _line in str(res).split("\n"): + if _line.strip(): + print(_line, flush=True) # 行内已含标签 + + def on_chunk_received(self, session_id, chunk: str): + """接收到 Token""" + self._diag_chunk_n += 1 + _match = session_id == self.current_session_id + if self._diag_chunk_n <= 3 or self._diag_chunk_n % 50 == 0 or not _match: + _st0 = self._active_streams.get(session_id) + diag_log(f"CHUNK n={self._diag_chunk_n} match={_match} " + f"mid={(_st0 or {}).get('msg_id')} +{len(chunk)}c") + if session_id not in self._active_streams: + return + + # 🌟 累积内容到该会话的状态中(不再用全局变量) + self._active_streams[session_id]["content"] += chunk + if session_id == self.current_session_id: + self._schedule_context_refresh() # 🆕 Fix E: 正文显现 → 刷新上下文标签 + + # 🌟 时间线:文本段(与上一段不同则新开) + st = self._active_streams[session_id] + if st["tl_kind"] != "text": + st["tl_kind"] = "text" + st["timeline"].append({"t": "text", "text": chunk}) + else: + st["timeline"][-1]["text"] += chunk + + # 人肉 debug:每个正文 token 控制台打印 + try: + _mid = self._active_streams[session_id]["msg_id"] + _flat = " ".join(chunk.split()) + print(f"[正文] mid={_mid[:8]} 匹配={_match} +{len(chunk)}c {_flat[:100]}", flush=True) + except Exception: + pass + + # 只有当前激活的会话才推送到前端显示 + if session_id == self.current_session_id: + msg_id = self._active_streams[session_id]["msg_id"] + self.chat_bridge.append_token(msg_id, chunk) + + + + from PyQt6 import QtWidgets, QtCore + + def add_session_item_to_sidebar(self, sess_data, at_top=False): + """渲染一条会话到侧边栏(使用自定义 widget)""" + item = QtWidgets.QListWidgetItem() + item.setData(QtCore.Qt.ItemDataRole.UserRole, sess_data["id"]) + item.setSizeHint(QtCore.QSize(0, 44)) + + widget = SessionItemWidget(sess_data["id"], sess_data["title"]) + widget.menu_requested.connect(self.show_session_context_menu) + + is_starred = sess_data.get("is_starred", 0) + + if at_top: + if is_starred: + self.history_list.insertItem(0, item) + else: + # 插到分隔线下方第一个位置 + sep_row = self.history_list._find_separator_row() + insert_row = (sep_row + 1) if sep_row >= 0 else 0 + self.history_list.insertItem(insert_row, item) + self.history_list.setItemWidget(item, widget) + self.history_list.setCurrentItem(item) + else: + self.history_list.addItem(item) + self.history_list.setItemWidget(item, widget) + + + def _rw_visible_chain(self, session_id): + """🆕 P1-01:会话的可见消息链(过滤 system/compaction),旧→新。""" + chain = self.db.get_message_chain(session_id) + return [m for m in chain if m["role"] not in ("system", "compaction")] + + def _rw_note_live(self, msg_id, expected_session=None): + """🆕 P1-01:把新生成的消息推进渲染窗口。 + 已持久化 → 带真实链内下标 + 链长;未持久化/查询失败 → -1(安全降级)。 + 非当前会话的后台完成不推送(JS 侧状态属于当前会话)。""" + session = self.current_session_id + gen = self._rw_generation + if not session or gen <= 0: + return + if expected_session and expected_session != session: + return + chain_index, chain_len = -1, -1 + try: + visible = self._rw_visible_chain(session) + chain_len = len(visible) + for i, m in enumerate(visible): + if m["id"] == msg_id: + chain_index = i + break + except Exception: + pass + self.chat_bridge.rw_note_live(session, gen, msg_id, chain_index, chain_len) + + def _render_history_one(self, msg): + """🆕 P1-01:渲染单条历史消息(自 load_messages_to_web 抽取;分页复用)。 + 渲染分发逻辑与原版完全一致(附件补齐/时间线/降级)。""" + import json + branch_info = None + if msg["role"] == "assistant" and msg.get("parent_id"): + siblings = self.db.get_branch_info(msg["parent_id"]) + if len(siblings) > 1: + try: + sibling_ids = [s["id"] for s in siblings] + idx = sibling_ids.index(msg["id"]) + 1 + branch_info = {"current": idx, "total": len(siblings)} + except (ValueError, KeyError): + branch_info = None + + if msg["role"] == "user" and msg.get("attachment_metadata"): + try: + metadata = json.loads(msg["attachment_metadata"]) + user_text = metadata.get("user_text", "") + attachments = metadata.get("attachments", []) + for att in attachments: + if "content" not in att: + if att.get("type") == "image": + att["content"] = f"[图片文件: {att.get('name', '未知图片')}]" + else: + att["content"] = "[附件内容]" + if "size_kb" not in att: + att["size_kb"] = 0 + if "lines" not in att: + att["lines"] = 1 + self.chat_bridge.create_user_message_with_attachments( + msg["id"], user_text, attachments) + except (json.JSONDecodeError, TypeError): + self.chat_bridge.render_history_message( + msg_id=msg["id"], + role=msg["role"], + content=msg["content"], + reasoning=msg.get("reasoning", ""), + branch_info=branch_info) + else: + tl_json = msg.get("timeline") if msg["role"] == "assistant" else None + if tl_json: + self.chat_bridge.create_message( + msg_id=msg["id"], role=msg["role"], + text=msg["content"], + sender_name=self.current_model or "Assistant", + branch_info=branch_info) + self.chat_bridge.render_timeline_history(msg["id"], tl_json) + self.chat_bridge.finish_message(msg["id"]) + else: + self.chat_bridge.render_history_message( + msg_id=msg["id"], + role=msg["role"], + content=msg["content"], + reasoning=msg.get("reasoning", ""), + branch_info=branch_info) + + def _on_window_page_request(self, session_id, direction, + boundary_msg_id, generation): + """🆕 P1-01:前端换页请求 → 按边界消息在 DB 切片 → 渲染页 → 推送响应。 + 边界失效(并发数据变更)→ 空页安全降级,计数仍正确收敛。""" + if self._rw_page_inflight: + return # 最多一页在途(JS 侧 pending 同效,双保险) + if session_id != self.current_session_id or generation != self._rw_generation: + return # 会话已切 / 代次已推进 → 丢弃 + if direction not in ("older", "newer"): + return + self._rw_page_inflight = True + try: + visible = self._rw_visible_chain(session_id) + chain_len = len(visible) + ids = [m["id"] for m in visible] + try: + bi = ids.index(boundary_msg_id) + except ValueError: + bi = -1 + + size = self._rw_page_size # 半窗页(非整窗):锚点消息必须留在窗口内 + if bi < 0: + page, page_indices = [], [] + elif direction == "older": + start = max(0, bi - size) + page = visible[start:bi] + page_indices = list(range(start, bi)) + else: + start = bi + 1 + page = visible[start:start + size] + page_indices = list(range(start, start + len(page))) + + # 批次渲染期间抑制 createMessage/finishMessage 的滚动副作用 + self.chat_bridge.run_js("window.__rwPageRendering = true;") + for m in page: + self._render_history_one(m) + self.chat_bridge.rw_page_response({ + "sessionId": session_id, + "generation": generation, + "boundaryId": boundary_msg_id, + "direction": direction, + "chainLen": chain_len, + "items": [{"id": m["id"], "chainIndex": ix} + for m, ix in zip(page, page_indices)], + }) + self.chat_bridge.run_js("window.__rwPageRendering = false;") + except Exception as e: + print(f"[RW] 分页处理异常: {e}") + self.chat_bridge.run_js("window.__rwPageRendering = false;") + finally: + self._rw_page_inflight = False + + def load_messages_to_web(self, session_id, show_loading=True): + """加载消息链到 WebView(🆕 P1-01:窗口化——初始仅渲染最新 size 条)""" + import json + # 🆕 P1-01:每次加载递增代次,旧会话的在途分页响应一律 stale + self._rw_generation += 1 + gen = self._rw_generation + self.current_session_id = session_id + self._refresh_mode_button() # 🆕 会话切换 → 刷新模式按钮 + # 🆕 右侧任务面板:跟随会话切换(范围永远是当前会话) + try: + self.bash_panel.set_session( + session_id, self.db, self._active_streams.get(session_id)) + except Exception as _e: + print(f"[Warn]: 任务面板刷新失败: {_e}") + # 🌟 统一加载界面:切换会话/启动时盖加载层;内部刷新(重新回答/分支/删除)不触发 + if show_loading: + self.chat_bridge.show_loading() + # 🆕 P1-01:rwBegin 内部执行 clearChat + (session, generation) 重同步 + visible = self._rw_visible_chain(session_id) + total = len(visible) + self.chat_bridge.rw_begin(session_id, gen, total) + + # 2. 处理空对话状态 + if not visible: + self.chat_bridge.show_welcome() + self._update_send_button_state() + if show_loading: + QtCore.QTimer.singleShot(450, lambda: self.chat_bridge.hide_loading()) + return + + # 3. 窗口化渲染:仅最新 size 条(🆕 P1-01);更早消息经换页按需加载 + window_items = visible[-self._rw_size:] if self._rw_size > 0 else visible + # 批次渲染期间抑制逐条滚底(初始窗口完成后由前端统一对齐底部) + self.chat_bridge.run_js("window.__rwPageRendering = true;") + for msg in window_items: + self._render_history_one(msg) + # 链内下标 = 窗口在链尾的偏移 + 窗口内序号(不是局部下标!) + offset = total - len(window_items) + self.chat_bridge.rw_init_window( + session_id, gen, total, + [(m["id"], offset + i) for i, m in enumerate(window_items)]) + self.chat_bridge.run_js("window.__rwPageRendering = false;") + + # 5. 恢复流式输出状态(处理页面刷新或切换回正在生成的会话) + #🌟 如果该会话有正在进行的流式输出,每次都重新推送 + if session_id in self._active_streams: + stream_state = self._active_streams[session_id] + msg_id = stream_state["msg_id"] + + # 🚀 修复点:恢复时也要带上缓存的 branch_info + branch_info = stream_state.get("branch_info") + + self.chat_bridge.create_message( + msg_id, "assistant", "", + self.current_model or "Assistant", + branch_info=branch_info # 🚀 传给前端 + ) + # 🆕 P1-01:切回复活的流式消息进渲染窗口(已入库则带真实下标) + self._rw_note_live(msg_id, session_id) + # 🌟 有 agent 时间线 → 按序恢复 思考/文本/工具 块(后续 token 无缝续流) + if stream_state.get("timeline"): + diag_log(f"RESTORE mid={msg_id} entries={len(stream_state['timeline'])} " + f"text={len(stream_state.get('content',''))}c think={len(stream_state.get('reasoning',''))}c") + self.chat_bridge.restore_streaming_timeline( + msg_id, json.dumps(stream_state["timeline"], ensure_ascii=False)) + else: + # 恢复已生成的推理内容 + if stream_state.get("reasoning"): + reasoning_text = stream_state["reasoning"] + for i in range(0, len(reasoning_text), 500): + self.chat_bridge.append_reasoning(msg_id, reasoning_text[i:i+500]) + + # 恢复已生成的正文内容 + if stream_state.get("content"): + content_text = stream_state["content"] + for i in range(0, len(content_text), 500): + self.chat_bridge.append_token(msg_id, content_text[i:i+500]) + + # 6. 更新 UI 状态 + self._update_send_button_state() + self.update_context_display() + + # 🌟 绘制完成后,渐变退场露出会话(图标扫描条 → 渐隐) + if show_loading: + QtCore.QTimer.singleShot(450, lambda: self.chat_bridge.hide_loading()) + + + def _update_send_button_state(self): + """根据当前会话是否在生成,更新发送按钮状态""" + is_generating = self.current_session_id in self._active_streams + self.set_send_button_state(is_generating) + + + def on_sidebar_item_clicked(self, item): + # 🌟 点击分隔线无效 + if self.history_list._is_separator(item): + return + session_id = item.data(QtCore.Qt.ItemDataRole.UserRole) + if not session_id: + return + print(f"[UI]: 切换到历史对话 -> {session_id}") + self.load_messages_to_web(session_id) + + + def init_model_popup(self): + # 1. 读取配置(P0-01 统一入口:缺失/损坏 → 可见警告 + 安全默认值) + from core.config_paths import load_config as _load_cfg + self.config_data = _load_cfg() or {"providers": {}} + + # 2. 实例化我们写的自定义弹窗 (先不显示) + self.model_popup = ModelSelectPopup(self, self.config_data) + + # 3. 绑定弹窗的选中信号 + self.model_popup.model_selected.connect(self.on_model_selected) + + # 4. 把原来的 model_selector 按钮点击事件绑定到显示弹窗的方法上 + # 注意:需要把按钮的 setMenu 去掉(如果你在 setup_ui 里写了的话) + self.model_selector.clicked.connect(self.show_model_popup) + self.model_selector.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + + # 5. 设置默认选中 + default_p = self.config_data.get("default_provider", "GPTBest") + default_m = self.config_data.get("default_model", "gemini-3.1-pro-preview-thinking-high") + self.on_model_selected(default_p, default_m) + + def show_model_popup(self): + """计算位置并执行动画弹出""" + # 获取按钮在屏幕上的全局坐标 + btn_pos = self.model_selector.mapToGlobal(QtCore.QPoint(0, 0)) + + # 计算弹窗最终应该停留的目标坐标 + x = btn_pos.x() + self.model_selector.width() - self.model_popup.width() + y = btn_pos.y() - self.model_popup.height() - 5 + + # 🌟 调用动画显示方法,传入目标坐标 + self.model_popup.show_with_animation(QtCore.QPoint(x, y)) + + + def on_model_selected(self, provider, model): + """当用户在弹窗中选择模型时触发""" + self.current_provider = provider + self.current_model = model + + # 截断过长的模型名字显示在按钮上 + display_name = model if len(model) < 20 else model[:18] + "..." + self.model_selector.setText(display_name) + + print(f"\n[系统]: 已切换引擎 -> 供应商: {provider} | 模型: {model}") + # 🌟 新增:处理思考过程的槽函数 + #新增:切换模型后刷新上下文显示(因为不同模型上限不同) + self.update_context_display() + + def on_reasoning_received(self, session_id, chunk: str): + """接收到思考过程""" + self._diag_think_n += 1 + _match = session_id == self.current_session_id + if self._diag_think_n <= 3 or self._diag_think_n % 50 == 0 or not _match: + _st0 = self._active_streams.get(session_id) + diag_log(f"THINK n={self._diag_think_n} match={_match} " + f"mid={(_st0 or {}).get('msg_id')} +{len(chunk)}c") + if session_id not in self._active_streams: + return + + # 🌟 累积思考过程到该会话的状态中 + self._active_streams[session_id]["reasoning"] += chunk + if session_id == self.current_session_id: + self._schedule_context_refresh() # 🆕 Fix E: 思考显现 → 刷新上下文标签 + + # 🌟 时间线:思考段(与上一段不同则新开) + st = self._active_streams[session_id] + if st["tl_kind"] != "think": + st["tl_kind"] = "think" + st["timeline"].append({"t": "think", "text": chunk}) + else: + st["timeline"][-1]["text"] += chunk + + # 人肉 debug:每个思考 token 控制台打印 + try: + _mid = self._active_streams[session_id]["msg_id"] + _flat = " ".join(chunk.split()) + print(f"[思考] mid={_mid[:8]} 匹配={_match} +{len(chunk)}c {_flat[:60]}", flush=True) + except Exception: + pass + + # 只有当前激活的会话才推送到前端显示 + if session_id == self.current_session_id: + msg_id = self._active_streams[session_id]["msg_id"] + self.chat_bridge.append_reasoning(msg_id, chunk) + + def _on_diag_dumped(self, res): + diag_log(f"JS_DIAG {str(res)[:3000]}") + + def on_web_load_finished(self, ok): + """网页加载完成后的回调""" + if not ok: + print("[Error]: 网页加载失败") + return + + try: + self.browser.page().runJavaScript( + "String(window.__APP_VER || 'unknown')", + lambda v: diag_log(f"FRONTEND_VER {v}")) + except Exception: + pass + print("[System]: 网页 HTML 加载完毕,等待 JS 引擎就绪...") + + # 🌟 开始轮询检测 JS 是否就绪 + if self.current_session_id: + self._check_js_ready() + + def _check_js_ready(self, retry_count=0): + """ + 递归检测 JS 引擎是否就绪 + 最多重试 20 次(2 秒),每次间隔 100ms + """ + if retry_count > 20: + print("[Error]: JS 引擎超时未就绪") + return + + # 检测 window.jsReady 标志 + self.browser.page().runJavaScript( + "typeof window.jsReady !== 'undefined' && window.jsReady === true", + lambda is_ready: self._on_js_ready_checked(is_ready, retry_count) + ) + + def _on_js_ready_checked(self, is_ready, retry_count): + """JS 就绪检测的回调""" + if is_ready: + print("[System]:✅ JS 引擎已就绪,正在加载历史记录...") + # 🆕 P1-01:先注入渲染窗口配置,再开始窗口化加载 + if not self._rw_config_pushed: + self._rw_config_pushed = True + self.chat_bridge.rw_config(self._rw_mode, self._rw_size) + self.load_messages_to_web(self.current_session_id) + # 🌟 触发前端上报一次初始滚动状态,同步自定义滚动条 + self.chat_bridge.run_js("setTimeout(reportWebScroll, 60);") + else: + # 还没就绪,100ms 后重试 + QtCore.QTimer.singleShot(100, lambda: self._check_js_ready(retry_count + 1)) + + + def on_new_chat_clicked(self): + # 🆕 P1-01:代次 +1(旧会话的在途分页响应失效) + self._rw_generation += 1 + new_sess = self.db.create_session(title="新对话") + print(f"[UI]: 新建对话 -> {new_sess['id']}") + + self.current_session_id = new_sess["id"] + self._refresh_mode_button() # 🆕 新建会话 → 未锁定,恢复可选状态 + + # 🌟 统一加载界面:新建会话同样走 加载 → 渐变 → 欢迎页 流程 + self.chat_bridge.show_loading() + + # 重建侧边栏(自动处理分隔线和插入位置) + self.rebuild_sidebar() + + self.chat_bridge.clear_chat() + self.chat_bridge.show_welcome() + self._update_send_button_state() + self.update_context_display() + QtCore.QTimer.singleShot(450, lambda: self.chat_bridge.hide_loading()) + + + def build_api_context(self, session_id): + """ + 🚀 构建上下文:读取本地图片文件,实时转为 Base64 发给大模型,彻底解放数据库! + """ + import json + import os + import base64 + + messages = self.db.get_message_chain(session_id) + api_messages = [] + + # 🆕 压缩持久化:链上最后一个 compaction 标记 = 切点。 + # 它之前的一切只以摘要形式发送(作为一条 user 消息,与轮内压缩 + # 的 to_openai_messages 渲染一致);标记保留在库中,UI 渲染照常。 + _mark_idx = -1 + for _i, _m in enumerate(messages): + if _m["role"] == "compaction": + _mark_idx = _i + if _mark_idx >= 0: + _mark = messages[_mark_idx] + api_messages.append({ + "role": "user", + "content": _mark["content"], + "_kind": "compaction_summary", + "_db_msg_id": _mark["id"], + # 🆕 Fix F: 摘要条目必须带时间戳(标记插入时刻,晚于全部保留行)。 + # 缺了它 P0 锚点时效校验失效:保留行里 assistant 的入库 usage 是 + # 压缩前快照(如 92.7k),显示/压缩判定会锚到过期值 → 标签虚高, + # 小窗口模型还会误触发二次压缩(摘要套摘要)。 + "timestamp": int(_mark.get("created_at", 0) or 0) * 1000, + }) + messages = messages[_mark_idx + 1:] + # 获取项目根目录 + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + + for msg in messages: + if msg["is_ignored"]: + continue + + # 🆕 失败轮次·全空行:入库留痕但**不回放**(对照 pi transform-messages + # 跳过 error/aborted 的 assistant;空 assistant 内容会让个别服务商 400) + if msg.get("role") == "assistant": + _tl = (msg.get("timeline") or "").strip() + _has_tl = _tl not in ("", "[]", "null") + if (not (msg.get("content") or "").strip() and not _has_tl + and not (msg.get("reasoning") or "").strip()): + continue + + content_payload = msg["content"] + + # 🌟 核心:如果是用户消息且带有附件元数据,检查是否有图片 + if msg["role"] == "user" and msg.get("attachment_metadata"): + try: + meta = json.loads(msg["attachment_metadata"]) + # 收集普通图片附件 + PDF 图片解析模式下用户勾选的图片 + images = [] + for a in meta.get("attachments", []): + if a.get("type") == "image": + images.append(a) + elif a.get("type") == "pdf" and a.get("mode") == "image": + for sel in a.get("selected_images", []): + if sel.get("local_path"): + images.append({ + "local_path": sel["local_path"], + "mime": sel.get("mime", "image/png"), + }) + + if images: + # 发现图片!将 content 转换为 OpenAI 视觉接口要求的 List 格式 + content_payload = [{"type": "text", "text": msg["content"]}] + for img in images: + local_path = img.get('local_path') + if not local_path: continue + + # 拼接出图片的绝对路径并实时读取转码 + # 拼接出图片的绝对路径并实时读取转码 + abs_path = os.path.join(root_dir, local_path) + + if os.path.exists(abs_path): + with open(abs_path, "rb") as f: + b64_data = base64.b64encode(f.read()).decode('utf-8') + + content_payload.append({ + "type": "image_url", + "image_url": { + "url": f"data:{img['mime']};base64,{b64_data}" + } + }) + else: + print(f"[Warn]: 找不到图片文件,可能已被物理删除: {abs_path}") + except Exception as e: + print(f"[Warn]: 解析图片附件失败: {e}") + + # 🌟 AI 消息带 agent 时间线 → 重建完整上下文(含 tool_calls 与工具结果), + # 让模型跨轮次看得到自己用过的工具和输出(对照 pi 全量上下文语义) + if msg["role"] == "assistant" and msg.get("timeline"): + try: + tl = json.loads(msg["timeline"]) + except Exception: + tl = None + if isinstance(tl, list) and tl: + # 🆕 P0/P1: 回放本行时间戳(created_at 秒→毫秒)与 usage(锚点) + row_ts = int(msg.get("created_at", 0) or 0) * 1000 + row_usage = None + if msg.get("usage"): + try: + row_usage = json.loads(msg["usage"]) + except Exception: + row_usage = None + for e in tl: + et = e.get("t") + if et == "think": + continue + if et == "text": + api_messages.append( + {"role": "assistant", "content": e.get("text", ""), + "timestamp": row_ts, "_db_msg_id": msg["id"]}) + elif et == "tool": + tcid = e.get("id") or f"tl{len(api_messages)}" + if api_messages and api_messages[-1].get("role") == "assistant": + base = api_messages[-1] + else: + base = {"role": "assistant", "content": None} + api_messages.append(base) + base["timestamp"] = row_ts + base["_db_msg_id"] = msg["id"] + base.setdefault("tool_calls", []).append({ + "id": tcid, + "type": "function", + "function": {"name": e.get("name", ""), + "arguments": e.get("args") or "{}"}, + }) + _res = e.get("result", "") + if e.get("ok") is None: + # 🆕 孤儿工具调用(开始了但没拿到结果 = 本轮异常中断): + # 对照 pi insertSyntheticToolResults —— 补一条合成结果, + # 保证 tool_call/tool_result 成对,否则服务商直接 400 + _res = "(本轮请求异常中断,未收到该工具的结果)" + api_messages.append({ + "role": "tool", "tool_call_id": tcid, + # 长结果 UI 存 2 万字供展开;回灌模型限 4000 字防上下文爆炸 + "content": _res[:4000], + "timestamp": row_ts, "_db_msg_id": msg["id"], + }) + # 🆕 P1: 本行 usage 挂到本行最后一条 assistant 上(usage 锚点) + if row_usage: + for _entry in reversed(api_messages): + if _entry.get("role") == "assistant": + _entry["usage"] = row_usage + break + continue + + # P0 修复: 不再向 API 注入 reasoning 字段 + # (OpenAI 兼容接口不认该字段,部分服务端直接 400; + # 思考过程仅用于本地展示与入库) + entry = {"role": msg["role"], "content": content_payload, + # 🆕 P0: 回放本行时间戳(供 usage 锚点时效校验) + "timestamp": int(msg.get("created_at", 0) or 0) * 1000, + "_db_msg_id": msg["id"]} + # 🆕 P1: assistant 行有入库 usage → 回放(显示/agent 做 usage 锚定) + if msg["role"] == "assistant" and msg.get("usage"): + try: + entry["usage"] = json.loads(msg["usage"]) + except Exception: + pass + api_messages.append(entry) + + return api_messages + + + def closeEvent(self, event): + """窗口关闭前,清理所有正在运行的 worker 线程""" + print("[System]: 正在清理后台任务...") + + # 1. 停止所有正在运行的会话生成任务 + for session_id in list(self._active_streams.keys()): + stream_state = self._active_streams[session_id] + # 🆕 Fix B: 关窗 ≈ 中断,先把进行中的部分内容落库(防止蒸发) + self._persist_interrupted_stream(session_id, stream_state) + worker = stream_state.get("worker") + if worker: + try: + worker.chunk_received.disconnect() + worker.error_occurred.disconnect() + worker.reasoning_received.disconnect() + worker.finished.disconnect() + if hasattr(worker, "tool_execution_started"): + worker.tool_execution_started.disconnect() + worker.tool_execution_updated.disconnect() + worker.tool_execution_finished.disconnect() + worker.context_compacted.disconnect() + worker.usage_updated.disconnect() + if hasattr(worker, "retry_scheduled"): + worker.retry_scheduled.disconnect() + except Exception: + pass + worker.abort() + worker.wait(1000) + if worker.isRunning(): + worker.terminate() + worker.wait() + self._active_streams.clear() + + # 🌟 2. 停止所有标题生成任务 + for session_id in list(self._title_workers.keys()): + title_state = self._title_workers[session_id] + worker = title_state.get("worker") + if worker: + try: + worker.chunk_received.disconnect() + worker.finished.disconnect() + except Exception: + pass + worker.cancel() + worker.wait(1000) + if worker.isRunning(): + worker.terminate() + worker.wait() + self._title_workers.clear() + + # 🌟 停止全局热键监听线程(注销 Alt+S) + if hasattr(self, "hotkey_screenshot"): + self.hotkey_screenshot.stop() + + print("[System]: ✅ 清理完成") + event.accept() + def _get_current_max_context(self): + """获取当前选中模型的最大上下文 (token 数)""" + try: + provider_info = self.config_data["providers"][self.current_provider] + return provider_info.get("model_contexts", {}).get(self.current_model, 128000) + except (KeyError, TypeError): + return 128000 + def update_context_display(self): + max_tokens = self._get_current_max_context() + max_k = max_tokens // 1000 + + if not self.current_session_id: + self.context_label.setText(f"0 / {max_k}k") + self.context_label.setStyleSheet("color: #888; font-size: 12px; margin-right: 10px;") + return + + messages = self.build_api_context(self.current_session_id) + # 🆕 G3(替代 Fix F):统一「下一请求」口径 —— 与压缩判定(should_compact) + # 同一公式: + # - 有有效锚点(轮中内存 / 纯文本行)→ provider 实测值(含 system+tools) + # - 工具行的入库 usage 是内存快照(未截断)≠ 下一请求(4k 截断回放) + # → G1 自动失效其锚点 → 全量公式 + # - 全量公式计入 system 提示词 + 工具 schema(worker 模式), + # 度量下一请求真实载荷(旧 Fix F 漏了这 ~10k,标签 34.1k vs 真实 44.3k) + try: + from core.agent import (from_openai_messages as _fom, + estimate_context_tokens as _ect) + _sp, _tools = "", None + if self._get_current_mode() == "worker": + from core.llm_engine import load_system_prompt as _lsp + from core.agent.tools import default_tools as _dt + _sp, _tools = _lsp(), _dt() + tokens = _ect(_fom(messages), system_prompt=_sp, + tools=_tools).tokens + except Exception: + tokens = self._estimate_token_count(messages) + + if self.current_session_id in self._active_streams: + s = self._active_streams[self.current_session_id] + # 🆕 P1: 在飞请求的精确 usage 已到达 → usage 锚定(对照 pi 显示端: + # usage 精确覆盖 system+tools+历史+在飞输出,比字符估算准) + try: + from core.agent import calculate_context_tokens as _calc_usage + _u_tokens = _calc_usage(s.get("usage") or {}) + except Exception: + _u_tokens = 0 + if _u_tokens > 0: + tokens = _u_tokens + else: + tokens += int((len(s["content"]) + len(s["reasoning"])) / 2.5) + # 🆕 Fix E: 在飞未入库的工具输出也计入显示,标签随工具结果显现实时上涨 + for _e in (s.get("timeline") or []): + if _e.get("t") == "tool": + tokens += int(len(_e.get("result", "")) / 2.5) + + used_str = f"{tokens / 1000:.1f}k" if tokens >= 1000 else str(tokens) + self.context_label.setText(f"{used_str} / {max_k}k") + # 🆕 调试日志:标签值变化才记(避免 400ms 防抖每次刷新都写) + _ctx_dbg = f"{used_str} / {max_k}k" + if getattr(self, "_last_ctx_dbg", None) != _ctx_dbg: + self._last_ctx_dbg = _ctx_dbg + self._dbg(f"[ctx] {_ctx_dbg}") + + ratio = tokens / max_tokens if max_tokens > 0 else 0 + if ratio > 0.9: + color = "#e81123" + elif ratio > 0.7: + color = "#f5a623" + else: + color = "#888" + self.context_label.setStyleSheet(f"color: {color}; font-size: 12px; margin-right: 10px;") + def _schedule_context_refresh(self): + """🆕 Fix E: 上下文标签防抖刷新(400ms 内的高频事件合并为一次)""" + try: + if not self._ctx_refresh_timer.isActive(): + self._ctx_refresh_timer.start() + except Exception: + pass + + def _estimate_token_count(self, messages): + """ + CJK 感知 token 估算(core.agent.context 统一口径): + 中日韩字符 ×1,其余字符 /4,每条消息 +4 开销,每张图片 1600。 + 与 agent 内部钳制/压缩用同一估算器。 + """ + try: + from core.agent import from_openai_messages, estimate_context_tokens + agent_msgs = from_openai_messages(messages) + tokens = estimate_context_tokens(agent_msgs).tokens + return max(1, int(tokens)) + except Exception: + # 兜底:旧口径 + total_chars = sum( + (len(m.get("content", "")) if isinstance(m.get("content", ""), str) else 0) + + len(m.get("reasoning", "") or "") + for m in messages + ) + return int(total_chars / 2.5) + def rebuild_sidebar(self): + """完整重建侧边栏列表(含分隔线)""" + self.history_list.clear() + sessions = self.db.get_all_sessions() + + starred = [s for s in sessions if s.get("is_starred")] + normal = [s for s in sessions if not s.get("is_starred")] + + for sess in starred: + self.add_session_item_to_sidebar(sess) + + # 有星标才加分隔线 + if starred and normal: + sep_item = QtWidgets.QListWidgetItem() + sep_item.setData(DraggableHistoryList.SEPARATOR_ROLE, "separator") + sep_item.setFlags(QtCore.Qt.ItemFlag.NoItemFlags) + sep_item.setSizeHint(QtCore.QSize(0, 20)) + self.history_list.addItem(sep_item) + + sep_widget = QtWidgets.QFrame() + sep_widget.setFixedHeight(1) + sep_widget.setStyleSheet("background-color: #e0e0e0; margin: 0 16px;") + self.history_list.setItemWidget(sep_item, sep_widget) + + for sess in normal: + self.add_session_item_to_sidebar(sess) + + # 恢复选中态 + if self.current_session_id: + for i in range(self.history_list.count()): + it = self.history_list.item(i) + if it.data(QtCore.Qt.ItemDataRole.UserRole) == self.current_session_id: + self.history_list.setCurrentItem(it) + break + def show_session_context_menu(self, session_id, global_pos): + """显示会话右键菜单""" + is_starred = self.db.is_session_starred(session_id) + popup = SessionContextPopup(session_id, is_starred, self) + popup.action_triggered.connect(self.on_session_action) + popup.show_at(global_pos) + self._ctx_popup = popup # 防 GC + + def on_session_action(self, action, session_id): + """处理菜单动作""" + if action == "edit": + self._rename_session(session_id) + elif action == "star": + is_starred = self.db.is_session_starred(session_id) + self.db.update_session_star(session_id, not is_starred) + self.rebuild_sidebar() + elif action == "copy": + self._copy_session(session_id) + elif action == "delete": + self._delete_session(session_id) + + def _rename_session(self, session_id): + current_title = "" + for i in range(self.history_list.count()): + it = self.history_list.item(i) + if it.data(QtCore.Qt.ItemDataRole.UserRole) == session_id: + w = self.history_list.itemWidget(it) + if w and hasattr(w, 'title_label'): + current_title = w.title_label.text() + break + + overlay = RenameOverlay(current_title, self.bg_widget) + overlay.renamed.connect(lambda new_title: self._apply_rename(session_id, new_title)) + + def _apply_rename(self, session_id, new_title): + self.db.update_session_title(session_id, new_title) + for i in range(self.history_list.count()): + it = self.history_list.item(i) + if it.data(QtCore.Qt.ItemDataRole.UserRole) == session_id: + w = self.history_list.itemWidget(it) + if w and hasattr(w, 'set_title'): + w.set_title(new_title) + break + print(f"[UI]: 会话已重命名 -> {new_title}") + + def _copy_session(self, session_id): + """📋 复制会话:DB 层深度克隆(全部支线 + 压缩标记 + 附件文件),完成后切到副本。""" + # 生成中不允许复制:副本只会拿到半截记录,且切走后原会话的流回调会失效 + if session_id in self._active_streams: + try: + QtWidgets.QToolTip.showText(QtGui.QCursor.pos(), + "该会话正在生成中,请稍后再复制") + except Exception: + pass + print("[UI]: 复制被拒绝(会话正在生成中)") + return + + try: + new_sess = self.db.copy_session(session_id) + except Exception as e: + print(f"[UI]: 复制会话失败 -> {e}") + return + if not new_sess: + print(f"[UI]: 复制失败,源会话不存在 -> {session_id}") + return + + new_id = new_sess["id"] + print(f"[UI]: 会话已复制 -> {new_id} ({new_sess.get('title')})") + + # 重建侧边栏(副本 sort_order 在顶部),选中并进入副本 + self.rebuild_sidebar() + for i in range(self.history_list.count()): + it = self.history_list.item(i) + if it.data(QtCore.Qt.ItemDataRole.UserRole) == new_id: + self.history_list.setCurrentItem(it) + break + self.load_messages_to_web(new_id) + + def _delete_session(self, session_id): + # P0 修复: 删除前必须停掉该会话的活动流, + # 否则后台 worker 会在删除后继续 append 到已不存在的会话。 + stream = self._active_streams.get(session_id) + if stream and stream.get("worker"): + try: + w = stream["worker"] + w.abort() + w.wait(3000) + except Exception: + pass + self._active_streams.pop(session_id, None) + title_state = self._title_workers.get(session_id) + if title_state and title_state.get("worker"): + try: + title_state["worker"].cancel() + title_state["worker"].wait(2000) + except Exception: + pass + self._title_workers.pop(session_id, None) + + # 1. 在数据库彻底删除前,先查出该会话下所有的图片元数据 + with self.db.get_connection() as conn: + rows = conn.execute("SELECT attachment_metadata FROM messages WHERE session_id = ?", (session_id,)).fetchall() + metadata_list = [r['attachment_metadata'] for r in rows if r['attachment_metadata']] + + # 2. 从数据库物理删除会话(SQLite 的 CASCADE 会自动删掉 messages 表的数据) + self.db.delete_session(session_id) + + # 3. 🌟 启动物理粉碎机,清理这个会话产生的所有本地图片 + if metadata_list: + self._cleanup_physical_files(metadata_list) + + # 从列表移除 + for i in range(self.history_list.count()): + it = self.history_list.item(i) + if it.data(QtCore.Qt.ItemDataRole.UserRole) == session_id: + self.history_list.takeItem(i) + break + + # 如果删的是当前会话,切到第一个可用的 + if session_id == self.current_session_id: + for i in range(self.history_list.count()): + it = self.history_list.item(i) + if not self.history_list._is_separator(it): + sid = it.data(QtCore.Qt.ItemDataRole.UserRole) + if sid: + self.history_list.setCurrentItem(it) + self.load_messages_to_web(sid) + return + # 没有任何会话了,新建一个 + self.on_new_chat_clicked() + + # 检查分隔线是否还需要 + self.rebuild_sidebar() + def _create_session_widget(self, session_id): + """为指定 session_id 创建 SessionItemWidget(供拖拽重排后重建用)""" + # 从 DB 拿标题 + sessions = self.db.get_all_sessions() + title = "新对话" + for s in sessions: + if s["id"] == session_id: + title = s["title"] + break + widget = SessionItemWidget(session_id, title) + widget.menu_requested.connect(self.show_session_context_menu) + return widget + + def show_settings(self): + if hasattr(self, '_settings_win') and self._settings_win is not None: + self._settings_win.deleteLater() + self._settings_win = None + + self._settings_win = SettingsWindow( + parent=self, + config_data=self.config_data + ) + self._settings_win.show_with_animation() + def _on_branch_switch(self, msg_id, direction): + """🌟 核心:处理用户点击左右箭头切换分支""" + # 如果当前有正在生成的消息,禁止乱跳时空,以免导致数据冲突 + if self.current_session_id in self._active_streams: + return + + with self.db.get_connection() as conn: + # 1. 查出这兄弟的父亲是谁 + msg = conn.execute("SELECT parent_id FROM messages WHERE id = ?", (msg_id,)).fetchone() + if not msg or not msg['parent_id']: + return + + parent_id = msg['parent_id'] + + # 2. 查出这父亲下面的所有子分支,按时间正序排 + siblings = conn.execute("SELECT id FROM messages WHERE parent_id = ? ORDER BY created_at ASC", (parent_id,)).fetchall() + sibling_ids = [s[0] for s in siblings] + + if len(sibling_ids) <= 1: + return + + try: + current_idx = sibling_ids.index(msg_id) + except ValueError: + return + + # 3. 计算目标分支索引,做边界保护 + target_idx = current_idx + direction + if target_idx < 0 or target_idx >= len(sibling_ids): + return + + target_msg_id = sibling_ids[target_idx] + + # 4. 🚀 关键魔法:找到这个目标分支一直延续下去的最末端叶子节点! + target_leaf_id = self.db.get_branch_leaf(target_msg_id) + + # 5. 更新会话,直接扭转时间线指针 + self.db.update_session_leaf(self.current_session_id, target_leaf_id) + + # 6. 重新渲染!暴力清除原页面,拉取新时间线,前端毫无闪烁,干脆利落 + self.load_messages_to_web(self.current_session_id, show_loading=False) # 🌟 分支切换不触发加载层 + def _on_delete_message(self, msg_id): + """处理剪枝请求""" + # 防止用户在生成文本时手滑点击删除,引发并发灾难 + if self.current_session_id in self._active_streams: + print("[UI]: 正在生成中,拒绝截断时间线") + return + + print(f"[UI]: 执行时空剪枝,原点 -> {msg_id}") + + # 1. 执行底层物理删除,并拿到被删掉的消息的附件元数据 + deleted_metadata = self.db.delete_message_branch(self.current_session_id, msg_id) + + # 2. 🌟 启动物理粉碎机,清理硬盘上的图片缓存 + if deleted_metadata: + self._cleanup_physical_files(deleted_metadata) + + # 3. 暴力美学:瞬间重灌整个页面的数据,坏死的树枝自动消失! + self.load_messages_to_web(self.current_session_id, show_loading=False) # 🌟 删除消息不触发加载层 + + def _cleanup_physical_files(self, metadata_list): + """🌟 物理粉碎机:传入元数据列表,自动清理硬盘上的图片""" + import json + import os + + # 定位到项目根目录 + current_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + + for meta_str in metadata_list: + if not meta_str: + continue + try: + meta = json.loads(meta_str) + for att in meta.get("attachments", []): + att_type = att.get("type") + # 图片 / PDF 本体缓存 + if att_type in ("image", "pdf") and att.get("local_path"): + abs_path = os.path.join(root_dir, att["local_path"]) + if os.path.exists(abs_path): + os.remove(abs_path) + print(f"[System]: 随聊天记录清理关联附件 -> {att['local_path']}") + # PDF 图片解析模式提取出的图片 + if att_type == "pdf": + for im in att.get("images", []): + im_abs = im.get("abs_path") + if not im_abs and im.get("local_path"): + im_abs = os.path.join(root_dir, im["local_path"]) + if im_abs and os.path.exists(im_abs): + os.remove(im_abs) + print(f"[System]: 随聊天记录清理 PDF 提取图片 -> {im_abs}") + except Exception as e: + print(f"[Warn]: 解析/清理历史附件失败: {e}") + + + + + + + +if __name__ == "__main__": + app = QtWidgets.QApplication(sys.argv) + window = MainWindow() + window.show() + sys.exit(app.exec()) diff --git a/ui/views/system_tools/__init__.py b/ui/views/system_tools/__init__.py new file mode 100644 index 0000000..7644509 --- /dev/null +++ b/ui/views/system_tools/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +""" +系统级工具集合 (system_tools) +- screen_capture: 屏幕截图覆盖层 +- global_hotkey: 全局热键监听线程 +- file_reader: 文本/代码文件读取(编码探测 + 二进制探测) +""" diff --git a/ui/views/system_tools/desktop_session.py b/ui/views/system_tools/desktop_session.py new file mode 100644 index 0000000..18557b3 --- /dev/null +++ b/ui/views/system_tools/desktop_session.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +"""P1-04:桌面会话探测 + 截图/全局热键能力路由(纯 stdlib,可在任何平台导入)。 + +契约(REPAIR_BACKLOG P1-04): +- Windows 保持现有行为(Win32 RegisterHotKey + Qt grabWindow 覆盖层)。 +- Linux X11:原生全局快捷键(XGrabKey,见 x11_hotkey.py)+ 原生屏幕捕获(Qt grabWindow,X11 可用)。 +- Linux Wayland:截图走 xdg-desktop-portal(用户授权,不绕过 compositor,见 portal_capture.py); + 全局热键依赖 compositor 桌面协议(ext-global-shortcut 等),本版本无免依赖实现 → + 明确告知不可用,仅保留应用内 Alt+S 快捷键,主程序其余功能不受影响。 +- offscreen/无显示(unknown):能力不可用要有明确日志,主程序仍可聊天。 +""" +import os +import sys + + +def session_kind() -> str: + """返回 "win32" / "x11" / "wayland" / "unknown"。 + + 判定顺序(Linux,综合 Qt 平台名与 XDG_SESSION_TYPE,见 PLATFORM_PLAN): + 1. QT_QPA_PLATFORM 以 offscreen 开头 → unknown(自动化离屏,无桌面能力) + 2. QT_QPA_PLATFORM 以 wayland 开头,或 WAYLAND_DISPLAY 已设置, + 或 XDG_SESSION_TYPE=wayland → wayland + 3. DISPLAY 已设置,或 XDG_SESSION_TYPE=x11 → x11 + 4. 其余(headless/无显示)→ unknown + """ + if sys.platform == "win32": + return "win32" + if sys.platform != "linux": + # 其他 POSIX(macOS 等)不在本任务支持矩阵内 + return "unknown" + qt_plat = os.environ.get("QT_QPA_PLATFORM", "").strip() + if qt_plat.startswith("offscreen"): + return "unknown" + xdg_type = os.environ.get("XDG_SESSION_TYPE", "").strip().lower() + if (qt_plat.startswith("wayland") + or os.environ.get("WAYLAND_DISPLAY", "").strip() + or xdg_type == "wayland"): + return "wayland" + if os.environ.get("DISPLAY", "").strip() or xdg_type == "x11": + return "x11" + return "unknown" + + +def hotkey_plan(kind: str): + """全局热键能力路由 → (thread_factory | None, message)。 + + thread_factory() 返回 QThread(带 triggered 信号);None 表示无全局热键能力 + (调用方应保留应用内 QShortcut 兜底)。message 需要打印以明确当前能力。 + """ + if kind == "win32": + from ui.views.system_tools.global_hotkey import GlobalHotkeyThread + return GlobalHotkeyThread, "[GlobalHotkey] Windows:系统级全局热键 Alt+S(RegisterHotKey)" + if kind == "x11": + from ui.views.system_tools.x11_hotkey import X11HotkeyThread + return X11HotkeyThread, "[GlobalHotkey] X11:原生全局热键 Alt+S(XGrabKey)" + if kind == "wayland": + return None, ("[GlobalHotkey] Wayland:全局热键需要 compositor 桌面协议" + "(ext-global-shortcut 等),本版本未启用 → 仅提供应用内 Alt+S 快捷键" + "(窗口获焦时生效)与截图按钮;其余功能不受影响") + return None, ("[GlobalHotkey] 当前环境无显示服务(offscreen/无 DISPLAY)→ 全局热键不可用;" + "应用内 Alt+S 快捷键同样不可用,可用截图按钮以外的全部功能") + + +def capture_plan(kind: str): + """截图能力路由 → (mode, message)。 + + mode: "overlay"(Qt grabWindow 覆盖层,win32/x11) + "portal"(xdg-desktop-portal 交互截图,wayland) + "unavailable"(unknown:明确告知,主程序其余功能不受影响) + """ + if kind in ("win32", "x11"): + return "overlay", None + if kind == "wayland": + return "portal", None + return "unavailable", ("[Screenshot] 当前环境无法获取屏幕画面(offscreen/无显示)→ " + "截图功能不可用;聊天与其他功能不受影响") diff --git a/ui/views/system_tools/file_reader.py b/ui/views/system_tools/file_reader.py new file mode 100644 index 0000000..2f8a0e6 --- /dev/null +++ b/ui/views/system_tools/file_reader.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" +文本/代码文件读取工具 (file_reader) +编码探测 + 二进制探测 + 大小守卫,供附件系统(拖拽/粘贴/上传文本与代码文件)复用。 +用法:read_text_file(path) -> (content, encoding, size_kb, lines),失败抛 ValueError。 +说明:纯函数模块,不依赖 Qt,便于单元测试。 +""" +import os + +# 明确拒绝的二进制/文档格式(Word/Excel/PPT/PDF/压缩包/可执行/媒体等) +BINARY_EXTS = frozenset({ + # Office 文档(明确排除 Word/Excel) + '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', + '.odt', '.ods', '.odp', '.rtf', + # 电子书(.pdf 已交由 tools/builtin_tools/pdf_reader.py 专门解析,不在此拦截) + '.epub', '.mobi', + # 压缩包 / 磁盘镜像 + '.zip', '.rar', '.7z', '.tar', '.gz', '.bz2', '.xz', '.iso', '.dmg', + # 可执行 / 编译产物 + '.exe', '.dll', '.so', '.dylib', '.msi', '.bin', '.apk', '.jar', + '.class', '.pyc', '.pyd', '.o', '.a', + # 音视频 + '.mp3', '.wav', '.flac', '.m4a', '.aac', '.ogg', + '.mp4', '.avi', '.mov', '.mkv', '.webm', '.wmv', + # 字体 + '.ttf', '.otf', '.woff', '.woff2', '.eot', + # 数据库 + '.db', '.sqlite', '.sqlite3', '.mdb', + # 设计稿 + '.psd', '.ai', '.sketch', '.fig', +}) + +# 单文件大小上限(字节):超过则拒绝,避免内存与上下文爆炸 +MAX_ATTACH_FILE_BYTES = 2 * 1024 * 1024 # 2 MB + +# 编码降级链:UTF-8(含BOM) → GB18030(⊇GBK/GB2312) → latin-1(永不失败) +_ENCODINGS = ('utf-8-sig', 'gb18030', 'latin-1') + + +def read_text_file(path, max_bytes=MAX_ATTACH_FILE_BYTES): + """读取一个文本/代码文件。 + + 返回 (content, encoding, size_kb, lines)。 + 文件过大或判定为二进制时抛出 ValueError(附带可读原因)。 + """ + size = os.path.getsize(path) + if size > max_bytes: + raise ValueError( + f"文件过大({size / 1024 / 1024:.1f} MB > {max_bytes / 1024 / 1024:.0f} MB)" + ) + + with open(path, 'rb') as f: + raw = f.read() + + # 二进制探测:前 8KB 含 NUL 字节即判定为二进制(git 同款启发式) + if b'\x00' in raw[:8192]: + raise ValueError("二进制文件,无法作为文本读取") + + text, used_enc = None, 'utf-8' + for enc in _ENCODINGS: + try: + text = raw.decode(enc) + used_enc = enc + break + except UnicodeDecodeError: + continue + if text is None: # 理论上 latin-1 兜底永不失败 + raise ValueError("无法识别文件编码") + + lines = text.count('\n') + 1 + return text, used_enc, round(size / 1024, 2), lines diff --git a/ui/views/system_tools/global_hotkey.py b/ui/views/system_tools/global_hotkey.py new file mode 100644 index 0000000..6d8b240 --- /dev/null +++ b/ui/views/system_tools/global_hotkey.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +""" +全局热键监听器 (Windows) +独立线程 + Win32 RegisterHotKey 消息循环,实现主窗口失焦也能触发的系统级全局快捷键。 + +用法: + hotkey = GlobalHotkeyThread() # 默认 Alt+S + hotkey.triggered.connect(on_triggered) # 跨线程信号,槽函数在主线程执行 + hotkey.start() # 启动线程 + hotkey.stop() # 注销热键并退出线程 +""" +import ctypes +import sys +import threading +from ctypes import wintypes + +from PyQt6 import QtCore + +# Win32 常量 +WM_HOTKEY = 0x0312 +WM_QUIT = 0x0012 +MOD_ALT = 0x0001 +MOD_CONTROL = 0x0002 +MOD_SHIFT = 0x0004 +MOD_NOREPEAT = 0x4000 # 按住不重复触发 (Windows 7+) +VK_S = 0x53 + +_is_windows = sys.platform == "win32" + +if _is_windows: + _user32 = ctypes.windll.user32 + _kernel32 = ctypes.windll.kernel32 + + # 显式声明函数签名,避免 ctypes 默认 int 截断指针/句柄 + _user32.RegisterHotKey.argtypes = [wintypes.HWND, ctypes.c_int, wintypes.UINT, wintypes.UINT] + _user32.RegisterHotKey.restype = wintypes.BOOL + _user32.UnregisterHotKey.argtypes = [wintypes.HWND, ctypes.c_int] + _user32.UnregisterHotKey.restype = wintypes.BOOL + _user32.GetMessageW.argtypes = [ + ctypes.POINTER(wintypes.MSG), wintypes.HWND, wintypes.UINT, wintypes.UINT + ] + _user32.GetMessageW.restype = wintypes.BOOL # >0 正常 / 0 WM_QUIT / -1 出错 + _user32.PostThreadMessageW.argtypes = [ + wintypes.DWORD, wintypes.UINT, wintypes.WPARAM, wintypes.LPARAM + ] + _user32.PostThreadMessageW.restype = wintypes.BOOL + _kernel32.GetCurrentThreadId.restype = wintypes.DWORD + + +class GlobalHotkeyThread(QtCore.QThread): + """在独立线程注册系统级全局热键并运行 Win32 消息循环。 + + 收到 WM_HOTKEY 后通过 Qt 信号 triggered 通知主线程, + 信号槽机制保证槽函数在主线程执行,操作 Qt 控件安全。 + """ + + triggered = QtCore.pyqtSignal() + + def __init__(self, hotkey_id=9001, mod=MOD_ALT, vk=VK_S, parent=None): + super().__init__(parent) + self._hotkey_id = hotkey_id + self._mod = mod + self._vk = vk + self._thread_id = 0 + self._ready = threading.Event() # run() 记录线程 ID 后置位 + self._registered = False + + def run(self): + """线程入口:注册热键 -> 消息循环 -> 退出时注销""" + if not _is_windows: + self._ready.set() + return + + self._thread_id = _kernel32.GetCurrentThreadId() + ok = _user32.RegisterHotKey( + None, self._hotkey_id, self._mod | MOD_NOREPEAT, self._vk + ) + self._registered = bool(ok) + self._ready.set() + if not ok: + print( + f"[GlobalHotkey] 注册热键失败 (id={self._hotkey_id}, mod={self._mod:#x}, " + f"vk={self._vk:#x}),可能已被其他程序占用" + ) + return + + # Win32 消息循环:hwnd=None 取本线程所有消息 + msg = wintypes.MSG() + while _user32.GetMessageW(ctypes.byref(msg), None, 0, 0) > 0: + if msg.message == WM_HOTKEY and msg.wParam == self._hotkey_id: + self.triggered.emit() + + # 收到 WM_QUIT 退出循环 -> 注销热键 + _user32.UnregisterHotKey(None, self._hotkey_id) + self._registered = False + + def stop(self): + """请求线程退出:向线程消息队列投递 WM_QUIT,然后等待结束""" + if not _is_windows: + return + # 等 run() 至少记录好线程 ID(注册成功或失败都行) + self._ready.wait(timeout=2.0) + if self._thread_id: + _user32.PostThreadMessageW(self._thread_id, WM_QUIT, 0, 0) + self.wait(2000) diff --git a/ui/views/system_tools/portal_capture.py b/ui/views/system_tools/portal_capture.py new file mode 100644 index 0000000..6bc1793 --- /dev/null +++ b/ui/views/system_tools/portal_capture.py @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- +""" +xdg-desktop-portal 截图(P1-04,Linux Wayland 专用窄适配器) + +Wayland compositor 不允许应用直接抓取屏幕画面(安全模型),截图必须走 +xdg-desktop-portal 的 org.freedesktop.portal.Screenshot: + 1. gdbus 调 Screenshot(handle, parent_window=/, {}) → 返回 request 对象路径; + 2. gdbus monitor 监听该 request 对象: + FilePicked(file_uri, ...) → 用户已授权并保存成功 → 返回文件路径; + Finished(无 FilePicked) → 用户取消/授权被拒 → 返回 denied; + 3. 全程有显式时间预算;超时 → timeout。 + +实现只用系统自带 CLI(gdbus,GLib 的一部分)+ 标准库,不新增 Python 依赖、 +不绕过 compositor、不伪造成功。portal/桌面环境不支持时返回明确的不可用原因。 +""" +import json +import os +import shutil +import subprocess +import sys +import time +import urllib.parse + +from PyQt6 import QtCore + +PORTAL_DEST = "org.freedesktop.portal.Desktop" +PORTAL_PATH = "/org/freedesktop/portal/desktop" +SCREENSHOT_IFACE = "org.freedesktop.portal.Screenshot" +REQUEST_IFACE = "org.freedesktop.portal.Request" + + +def detect_portal(): + """探测 portal 截图能力 → (ok: bool, reason: str | None)。""" + if sys.platform != "linux": + return False, "portal 截图仅用于 Linux" + if not (os.environ.get("XDG_RUNTIME_DIR", "").strip() + or os.environ.get("DBUS_SESSION_BUS_ADDRESS", "").strip()): + return False, ("未检测到 D-Bus 会话(XDG_RUNTIME_DIR/DBUS_SESSION_BUS_ADDRESS 均缺失)" + " → portal 截图不可用") + if not shutil.which("gdbus"): + return False, ("未找到 gdbus CLI(GLib 组件)→ portal 截图不可用;" + "聊天与其他功能不受影响") + return True, None + + +def _gdbus_screenshot_request(handle: str, timeout_s: float): + """调 Screenshot 方法,返回 (request_path, stderr);失败抛 RuntimeError。""" + cmd = ["gdbus", "call", "--session", "--dest", PORTAL_DEST, + "--object-path", PORTAL_PATH, + f"--method={SCREENSHOT_IFACE}.Screenshot", + handle, "/", "{}"] + try: + p = subprocess.run(cmd, capture_output=True, text=True, + encoding="utf-8", errors="replace", + timeout=timeout_s, check=False) + except subprocess.TimeoutExpired: + raise RuntimeError(f"portal Screenshot 调用超时({timeout_s:.0f}s 预算)") + if p.returncode != 0: + err = (p.stderr or p.stdout or "").strip().splitlines() + raise RuntimeError("portal 不可用: " + (err[-1] if err else "未知错误")) + out = (p.stdout or "").strip() + # gdbus 输出形如:('/org/freedesktop/portal/desktop/request/1000/haocode/42', <>) + start = out.find("('") + end = out.find("',") if start != -1 else -1 + if start == -1 or end == -1: + raise RuntimeError(f"无法解析 Screenshot 返回: {out[:120]!r}") + return out[start + 2:end], (p.stderr or "").strip() + + +def _gdbus_monitor_request(request_path: str, budget_s: float): + """监听 request 对象直到 FilePicked / Finished / 预算耗尽。 + + 返回 (status, path_or_reason):status ∈ {"ok", "denied", "timeout"}。 + """ + cmd = ["gdbus", "monitor", "--session", "--object-path", request_path] + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + text=True, encoding="utf-8", errors="replace") + deadline = time.monotonic() + budget_s + file_path = None + finished = False + try: + while time.monotonic() < deadline: + line = p.stdout.readline() + if not line: + if p.poll() is not None: + break + continue + line = line.strip() + if not line.startswith("{"): + continue + try: + ev = json.loads(line) + except Exception: + continue + member = ev.get("member", "") + body = ev.get("body", []) + if member == "FilePicked" and body: + uri = str(body[0]) + # 剥前缀 + unquote(比 urlparse 稳健:兼容 file:///tmp/x 与 file://D%3A%5Cx) + file_path = urllib.parse.unquote(uri[len("file://"):]) \ + if uri.startswith("file://") else uri + elif member == "Finished" and ev.get("interface", "") == REQUEST_IFACE: + finished = True + break + if file_path: + return "ok", file_path + if finished and time.monotonic() <= deadline: + return "denied", "用户在 portal 授权窗口取消/拒绝" + return "timeout", f"等待 portal 授权超时({budget_s:.0f}s 预算)" + finally: + try: + p.kill() + except Exception: + pass + try: + p.wait(timeout=3) + except Exception: + pass + + +def portal_screenshot_sync(handle: str = "haocode-shot", + request_timeout_s: float = 10.0, + wait_budget_s: float = 120.0): + """同步执行 portal 截图(调用方须保证不在 GUI 线程阻塞,或用 PortalScreenshotWorker)。 + + 返回 (ok: bool, path_or_reason: str)。 + """ + ok, reason = detect_portal() + if not ok: + return False, reason + try: + request_path, _err = _gdbus_screenshot_request(handle, request_timeout_s) + except RuntimeError as e: + return False, str(e) + status, result = _gdbus_monitor_request(request_path, wait_budget_s) + if status == "ok": + return True, result + if status == "denied": + return False, result + return False, result + + +class PortalScreenshotWorker(QtCore.QThread): + """GUI 线程安全的 portal 截图:done(ok, path_or_reason) 信号回主线程。""" + + done = QtCore.pyqtSignal(bool, str) + + def __init__(self, handle: str = "haocode-shot", + request_timeout_s: float = 10.0, + wait_budget_s: float = 120.0, parent=None): + super().__init__(parent) + self._handle = handle + self._request_timeout_s = request_timeout_s + self._wait_budget_s = wait_budget_s + + def run(self): + try: + ok, result = portal_screenshot_sync(self._handle, + self._request_timeout_s, + self._wait_budget_s) + except Exception as e: + ok, result = False, f"portal 截图异常({type(e).__name__}: {e})" + self.done.emit(ok, result) diff --git a/ui/views/system_tools/screen_capture.py b/ui/views/system_tools/screen_capture.py new file mode 100644 index 0000000..8d8ca07 --- /dev/null +++ b/ui/views/system_tools/screen_capture.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- +""" +屏幕截图覆盖层 (ScreenCaptureOverlay) +全屏半透明遮罩 + 鼠标拖拽选区 + 确认/取消工具条 + 截图完成发射 QImage 信号 +用法:调用 start() 启动截图,监听 screenshot_captured 信号获取结果 +""" +from PyQt6 import QtCore, QtGui, QtWidgets +import os + + +class ScreenCaptureOverlay(QtWidgets.QWidget): + """全屏截图覆盖层:半透明遮罩 + 鼠标拖拽选区 + 确认/取消按钮""" + + screenshot_captured = QtCore.pyqtSignal(QtGui.QImage) + + # 按钮尺寸 + BTN_W = 36 + BTN_H = 30 + BTN_GAP = 4 + + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowFlags( + QtCore.Qt.WindowType.FramelessWindowHint + | QtCore.Qt.WindowType.WindowStaysOnTopHint + | QtCore.Qt.WindowType.Tool + ) + self.setCursor(QtCore.Qt.CursorShape.CrossCursor) + + self._full_pixmap = None + self._start_pos = QtCore.QPoint() + self._end_pos = QtCore.QPoint() + self._is_drawing = False + self._has_selection = False + self._current_rect = QtCore.QRect() + + # SVG 图标路径(项目根目录下 svg/ 文件夹) + root_dir = os.path.abspath( + os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "..") + ) + # 确认 / 取消按钮(使用 SVG 图标,灰白简约风背景) + self._btn_confirm = QtWidgets.QPushButton(self) + self._btn_cancel = QtWidgets.QPushButton(self) + self._btn_confirm.setIcon(QtGui.QIcon(os.path.join(root_dir, "svg", "check.svg"))) + self._btn_cancel.setIcon(QtGui.QIcon(os.path.join(root_dir, "svg", "cross.svg"))) + btn_style = ( + "QPushButton { background-color: #f9f9f9; border: 1px solid #ddd; border-radius: 4px; }" + "QPushButton:hover { background-color: #eee; border-color: #ccc; }" + ) + for btn in (self._btn_confirm, self._btn_cancel): + btn.setFixedSize(self.BTN_W, self.BTN_H) + btn.setIconSize(QtCore.QSize(20, 20)) + btn.setCursor(QtCore.Qt.CursorShape.PointingHandCursor) + btn.setStyleSheet(btn_style) + btn.hide() + self._btn_confirm.clicked.connect(self._on_confirm) + self._btn_cancel.clicked.connect(self._on_cancel) + + def start(self): + """开始截图:抓取屏幕全图并显示覆盖层""" + screen = QtWidgets.QApplication.primaryScreen() + if not screen: + print("[Screenshot] 无主屏幕 → 截图不可用", flush=True) + return + self._full_pixmap = screen.grabWindow(0) + # P1-04:X11 某些 compositor/环境下 grabWindow 可能拿到空图(Wayland 已改走 portal) + if self._full_pixmap is None or self._full_pixmap.isNull() or self._full_pixmap.width() == 0: + print("[Screenshot] 屏幕抓取返回空画面(当前 compositor/环境限制)→ 本次截图取消;" + "聊天与其他功能不受影响", flush=True) + self._full_pixmap = None + return + self.setGeometry(screen.geometry()) + self.show() + self.activateWindow() + self.raise_() + + def paintEvent(self, event): + if not self._full_pixmap: + return + painter = QtGui.QPainter(self) + + # 1. 绘制屏幕截图作为背景 + painter.drawPixmap(0, 0, self._full_pixmap) + # 2. 半透明遮罩 + painter.fillRect(self.rect(), QtGui.QColor(0, 0, 0, 100)) + + # 绘制中 或 已有选区 时,绘制选区高亮 + if self._is_drawing or self._has_selection: + if self._is_drawing: + rect = QtCore.QRect(self._start_pos, self._end_pos).normalized() + else: + rect = self._current_rect + + if rect.width() > 0 and rect.height() > 0: + # 3. 选区内重绘原图(去掉遮罩,形成高亮效果) + painter.drawPixmap(rect, self._full_pixmap, rect) + # 4. 蓝色边框 + pen = QtGui.QPen(QtGui.QColor(0, 120, 215), 2) + painter.setPen(pen) + painter.setBrush(QtCore.Qt.BrushStyle.NoBrush) + painter.drawRect(rect) + # 5. 尺寸标注 + size_text = f"{rect.width()} x {rect.height()}" + font = painter.font() + font.setPointSize(9) + painter.setFont(font) + fm = painter.fontMetrics() + text_w = fm.horizontalAdvance(size_text) + text_h = fm.height() + text_x = rect.x() + text_y = rect.y() - text_h - 2 + if text_y < 0: + text_y = rect.bottom() + 2 + painter.fillRect(text_x, text_y, text_w + 10, text_h, QtGui.QColor(0, 120, 215)) + painter.setPen(QtGui.QColor(255, 255, 255)) + painter.drawText(text_x + 5, text_y + fm.ascent(), size_text) + + painter.end() + + def mousePressEvent(self, event): + if event.button() == QtCore.Qt.MouseButton.LeftButton: + # 开始新选区,隐藏按钮 + self._hide_buttons() + self._has_selection = False + self._start_pos = event.position().toPoint() + self._end_pos = self._start_pos + self._is_drawing = True + self.update() + elif event.button() == QtCore.Qt.MouseButton.RightButton: + self.close() + + def mouseMoveEvent(self, event): + if self._is_drawing: + self._end_pos = event.position().toPoint() + self.update() + + def mouseReleaseEvent(self, event): + if event.button() == QtCore.Qt.MouseButton.LeftButton and self._is_drawing: + self._is_drawing = False + rect = QtCore.QRect(self._start_pos, self._end_pos).normalized() + if rect.width() > 5 and rect.height() > 5: + # 保留选区,显示确认/取消按钮 + self._current_rect = rect + self._has_selection = True + self._position_buttons(rect) + self._btn_confirm.show() + self._btn_cancel.show() + self.update() + else: + self.close() + + def keyPressEvent(self, event): + if event.key() == QtCore.Qt.Key.Key_Escape: + self.close() + elif event.key() in (QtCore.Qt.Key.Key_Return, QtCore.Qt.Key.Key_Enter): + if self._has_selection: + self._on_confirm() + + def _position_buttons(self, rect): + """将确认/取消按钮定位到选区右下角""" + total_w = self.BTN_W * 2 + self.BTN_GAP + # 默认放在选区右下角外侧 + x = rect.right() - total_w + y = rect.bottom() + 4 + # 边界检测:超出屏幕底部时翻到选区内侧 + if y + self.BTN_H > self.height(): + y = rect.bottom() - self.BTN_H - 4 + if x < 0: + x = 0 + self._btn_confirm.move(x, y) + self._btn_cancel.move(x + self.BTN_W + self.BTN_GAP, y) + + def _hide_buttons(self): + self._btn_confirm.hide() + self._btn_cancel.hide() + + def _on_confirm(self): + """确认截图:裁剪并发射信号""" + if self._full_pixmap and self._current_rect.width() > 5 and self._current_rect.height() > 5: + dpr = self._full_pixmap.devicePixelRatio() + phys_rect = QtCore.QRect( + int(self._current_rect.x() * dpr), + int(self._current_rect.y() * dpr), + int(self._current_rect.width() * dpr), + int(self._current_rect.height() * dpr), + ) + captured = self._full_pixmap.toImage().copy(phys_rect) + self.screenshot_captured.emit(captured) + self.close() + + def _on_cancel(self): + """取消截图:直接关闭""" + self.close() + + def closeEvent(self, event): + self._is_drawing = False + self._has_selection = False + self._hide_buttons() + self._full_pixmap = None + super().closeEvent(event) diff --git a/ui/views/system_tools/x11_hotkey.py b/ui/views/system_tools/x11_hotkey.py new file mode 100644 index 0000000..dcbe7d3 --- /dev/null +++ b/ui/views/system_tools/x11_hotkey.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- +""" +X11 原生全局热键(P1-04,Linux X11 专用窄适配器) + +用 ctypes 调 libX11:XOpenDisplay → XGrabKey(root, keycode, Mod1Mask) → +select(display_fd) + XNextEvent 消息循环,命中后发射 triggered 信号。 +与 GlobalHotkeyThread(Windows)同一公开面:triggered / start() / stop()。 + +约束: +- 只支持现有截图快捷键(Alt+S),不增加任意键监听/记录/重映射; +- 注册失败/无显示/无 libX11 → 打印明确"不可用"日志后安静退出,绝不影响主程序; +- 不引入任何新的 Python 依赖(libX11 是 X11 桌面必然存在的系统库)。 +""" +import ctypes +import ctypes.util +import select +import threading + +from PyQt6 import QtCore + +# ---- X11 常量 ---- +KeyPress = 2 +Mod1Mask = 0x0001 # Alt +KeyPressMask = 0x00002 # XSelectInput event mask +AnyModifier = 0xFFFFFF +DEFAULT_MOD = 1 # 与 global_hotkey.MOD_ALT 同值 +DEFAULT_VK = 0x53 # 与 global_hotkey.VK_S 同值('S') + +#: Win32 VK → X11 keysym 的窄映射(只覆盖现有快捷键;扩展需同步本表) +_VK_TO_KEYSYM = { + 0x53: 0x73, # S → 's' +} + +_XEVENT_FIELDS = [ + ("type", ctypes.c_int), + ("serial", ctypes.c_ulong), + ("send_event", ctypes.c_int), + ("display", ctypes.c_void_p), + ("window", ctypes.c_uint), + ("root", ctypes.c_uint), + ("subwindow", ctypes.c_uint), + ("time", ctypes.c_ulong), + ("x", ctypes.c_int), + ("y", ctypes.c_int), + ("root_x", ctypes.c_int), + ("root_y", ctypes.c_int), + ("state", ctypes.c_uint), + ("keycode", ctypes.c_uint), + ("same_screen", ctypes.c_int), +] + + +class XEvent(ctypes.Structure): + """XEvent union 的按键事件视图(字段布局与 xproto.h XKeyEvent 一致,64 位下 keycode 位于偏移 76)""" + _fields_ = _XEVENT_FIELDS + + +def _load_x11(): + """加载 libX11 并声明最小 API 原型。失败抛 OSError(调用方转成"不可用"日志)。""" + name = ctypes.util.find_library("X11") or "libX11.so.6" + x11 = ctypes.CDLL(name) + x11.XOpenDisplay.argtypes = [ctypes.c_char_p] + x11.XOpenDisplay.restype = ctypes.c_void_p + x11.XCloseDisplay.argtypes = [ctypes.c_void_p] + x11.XConnectionNumber.argtypes = [ctypes.c_void_p] + x11.XConnectionNumber.restype = ctypes.c_int + x11.XDefaultRootWindow.argtypes = [ctypes.c_void_p] + x11.XDefaultRootWindow.restype = ctypes.c_uint + x11.XKeysymToKeycode.argtypes = [ctypes.c_void_p, ctypes.c_ulong] + x11.XKeysymToKeycode.restype = ctypes.c_int + x11.XSelectInput.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_long] + x11.XGrabKey.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint, ctypes.c_int] + x11.XGrabKey.restype = ctypes.c_int + x11.XUngrabKey.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint] + x11.XPending.argtypes = [ctypes.c_void_p] + x11.XPending.restype = ctypes.c_int + x11.XNextEvent.argtypes = [ctypes.c_void_p, ctypes.POINTER(XEvent)] + return x11 + + +def _open_x11(): + """可注入入口(测试用替身替换)。返回 (x11, display);display 为 0/None 表示无显示。""" + x11 = _load_x11() + disp = x11.XOpenDisplay(None) + return x11, disp + + +class X11HotkeyThread(QtCore.QThread): + """X11 全局热键线程(公开面与 GlobalHotkeyThread 一致:triggered/start/stop)。""" + + triggered = QtCore.pyqtSignal() + + def __init__(self, hotkey_id=9001, mod=DEFAULT_MOD, vk=DEFAULT_VK, parent=None): + super().__init__(parent) + self._hotkey_id = hotkey_id + self._mod = mod + self._vk = vk + self._ready = threading.Event() + self._stop_flag = False + self._ready_flag = False + self._registered = False + self._keycode = 0 + self._x11 = None + self._display = None + self._fd = None + + # ------------------------------------------------------------------ + def _setup(self): + """打开显示、注册热键。成功返回 True;失败打印明确日志并返回 False。""" + try: + keysym = _VK_TO_KEYSYM.get(self._vk) + if keysym is None or self._mod != DEFAULT_MOD: + print(f"[X11Hotkey] 暂不支持的快捷键组合 (mod={self._mod:#x}, vk={self._vk:#x})" + f" → 全局热键不可用(本适配器只覆盖现有 Alt+S)", flush=True) + return False + x11, disp = _open_x11() + if not disp: + print("[X11Hotkey] XOpenDisplay 失败(无 X11 显示服务)→ 全局热键不可用;" + "应用内快捷键/截图按钮以外的功能不受影响", flush=True) + return False + self._x11 = x11 + self._display = disp + self._fd = x11.XConnectionNumber(disp) + root = x11.XDefaultRootWindow(disp) + keycode = x11.XKeysymToKeycode(disp, keysym) + if not keycode: + print("[X11Hotkey] 键码解析失败 → 全局热键不可用", flush=True) + self._cleanup() + return False + self._keycode = keycode + x11.XSelectInput(disp, root, ctypes.c_long(KeyPressMask)) + if x11.XGrabKey(disp, keycode, Mod1Mask, root, 1) == 0: + # BadAccess:键已被其他程序抢占 + print(f"[X11Hotkey] XGrabKey 注册失败(Alt+S 可能已被其他程序占用)" + f" → 全局热键不可用;应用内快捷键/截图按钮以外的功能不受影响", flush=True) + self._cleanup() + return False + self._registered = True + return True + except Exception as e: + print(f"[X11Hotkey] 初始化失败({type(e).__name__}: {e})→ 全局热键不可用", flush=True) + self._cleanup() + return False + + def _cleanup(self): + if self._display and self._x11: + try: + self._x11.XUngrabKey(self._display, self._keycode, AnyModifier, + self._x11.XDefaultRootWindow(self._display)) + except Exception: + pass + try: + self._x11.XCloseDisplay(self._display) + except Exception: + pass + self._display = None + self._x11 = None + self._fd = None + self._registered = False + + # ------------------------------------------------------------------ + def run(self): + if not self._setup(): + self._ready.set() + return + self._ready.set() + try: + while not self._stop_flag: + if self._fd is None: + break + try: + r, _, _ = select.select([self._fd], [], [], 0.2) + except (OSError, ValueError): + break + if not r: + continue + if not self._x11.XPending(self._display): + continue + ev = XEvent() + self._x11.XNextEvent(self._display, ctypes.byref(ev)) + if ev.type == KeyPress and ev.keycode == self._keycode: + self.triggered.emit() + except BaseException as e: + # 绝不允许异常逃逸出 QThread.run()(PyQt6 会 abort 整个应用) + print(f"[X11Hotkey] 事件循环异常({type(e).__name__}: {e})→ 全局热键不可用;其余功能不受影响", + flush=True) + finally: + self._cleanup() + + def wait_ready(self, timeout_s: float = 2.0) -> bool: + """等待注册流程结束(成功或失败都算就绪;测试/诊断用)""" + return self._ready.wait(timeout_s) + + def stop(self): + """请求退出(select 0.2s 超时轮询 stop 标志 → 线程安全退出,无需向 X 连接发消息)""" + self._stop_flag = True diff --git a/ui/views/wv2_view.py b/ui/views/wv2_view.py new file mode 100644 index 0000000..edb646b --- /dev/null +++ b/ui/views/wv2_view.py @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- +""" +WebView2View —— 外观兼容 QWebEngineView 的 QWidget(仅实现 main_window 用到的 API 面): + setUrl / loadFinished / page().runJavaScript / page().setBackgroundColor / grab +内部由 core.webview2.Wv2Session 驱动: + - 30ms timer + resizeEvent 双路 SetBoundsAndZoomFactor(slot 矩形 → 父窗客户区物理像素) + - WebMessageReceived → ChatBridge 的 JS→Python slot + - run_js → ExecuteScriptAsync(与 QWebChannel 路径生成的 JS 文本同构) +""" +import json +import ctypes +import ctypes.wintypes as wintypes + +from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6.QtCore import Qt, pyqtSignal, QTimer, QUrl + +# JS → Python 消息名 → ChatBridge slot 名(与 QWebChannel 注册的对象方法一一对应) +_BRIDGE_METHODS = ( + "onRegenerateClicked", + "onBranchSwitch", + "onDeleteMessageClicked", + "onAttachmentClicked", + "onScrollChanged", + "onRequestWindowPage", # 🆕 P1-01 渲染窗口换页请求 +) + + +class _PageShim: + """QWebEnginePage 的最小替身""" + + def __init__(self, view): + self._view = view + + def runJavaScript(self, script, callback=None): + if callback is None: + self._view.run_js(script) + else: + self._view.execute_js_async(script, callback) + + def setBackgroundColor(self, color): + pass # WebView2 底色由页面 CSS 决定(页面本身就是白底) + + +class WebView2View(QtWidgets.QWidget): + loadFinished = pyqtSignal(bool) + + def __init__(self, session, parent=None): + super().__init__(parent) + self._session = session + self._page = _PageShim(self) + self._bridge = None + self._session.on_load_finished = self._on_page_loaded + self.setAttribute(Qt.WidgetAttribute.WA_OpaquePaintEvent, True) + # 子窗口发现(异步创建) + self._child_timer = QTimer(self) + self._child_timer.setInterval(100) + self._child_timer.timeout.connect(self._try_find_child) + self._child_timer.start() + # bounds 同步兜底(resizeEvent 主路 + 30ms 兜底,与 P1 实测一致) + self._sync_timer = QTimer(self) + self._sync_timer.setInterval(30) + self._sync_timer.timeout.connect(self.sync_bounds) + self._sync_timer.start() + # 几何去重:值没变就不发跨进程 COM(移动窗口时避免主线程被 WebView2 阻塞) + self._last_sent_bounds = None + + # ---------- 页面加载完成 ---------- + def _on_page_loaded(self): + # 立即启动 JS 管线(子窗口全程可见,无节流/竞态)。 + # 首帧前的"透底色"问题由 Qt 侧白色 paintEvent 解决(透明子窗表面露出白底)。 + self.loadFinished.emit(True) + + def paintEvent(self, ev): + # 子窗口隐藏期间(启动首帧前)槽位必须自绘白底, + # 否则 WA_OpaquePaintEvent + 无 paintEvent = 未绘制表面 = 纯黑 + p = QtGui.QPainter(self) + p.fillRect(self.rect(), QtGui.QColor("#ffffff")) + p.end() + + # ---------- QWebEngineView 兼容 API ---------- + def page(self): + return self._page + + def setUrl(self, url): + # 接受 QUrl 或 str + s = url.toString() if isinstance(url, QUrl) else str(url) + self._session.navigate(s) + + def grab(self): + """子窗口区域截图(调试工具用)""" + h = self._session.child_hwnd + if not h: + return QtGui.QPixmap(self.size()) + r = wintypes.RECT() + if not ctypes.windll.user32.GetWindowRect(wintypes.HWND(h), ctypes.byref(r)): + return QtGui.QPixmap(self.size()) + w = max(1, r.right - r.left) + hgt = max(1, r.bottom - r.top) + screen_dc = ctypes.windll.user32.GetDC(0) + mem_dc = ctypes.windll.gdi32.CreateCompatibleDC(screen_dc) + bmp = ctypes.windll.gdi32.CreateCompatibleBitmap(screen_dc, w, hgt) + ctypes.windll.gdi32.SelectObject(mem_dc, bmp) + ctypes.windll.gdi32.BitBlt(mem_dc, 0, 0, w, hgt, screen_dc, r.left, r.top, 0x00CC0020) + # BITMAPINFO + class _BMI(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), ("biWidth", ctypes.c_long), + ("biHeight", ctypes.c_long), ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), ("biXPelsPerMeter", ctypes.c_long), + ("biYPelsPerMeter", ctypes.c_long), ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + bmi = _BMI() + bmi.biSize = ctypes.sizeof(_BMI) + bmi.biWidth = w + bmi.biHeight = -hgt # 顶向下 + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = 0 + buf = ctypes.create_string_buffer(w * hgt * 4) + ctypes.windll.gdi32.GetDIBits(mem_dc, bmp, 0, hgt, buf, ctypes.byref(bmi), 0) + ctypes.windll.gdi32.DeleteObject(bmp) + ctypes.windll.gdi32.DeleteDC(mem_dc) + ctypes.windll.user32.ReleaseDC(0, screen_dc) + img = QtGui.QImage(buf, w, hgt, w * 4, QtGui.QImage.Format.Format_RGBA8888).copy() + return QtGui.QPixmap.fromImage(img) + + # ---------- 桥接 ---------- + def attach_bridge(self, bridge): + self._bridge = bridge + self._session.on_message = self._dispatch_message + + def _dispatch_message(self, data): + if not isinstance(data, dict) or not self._bridge: + return + name = data.get("m") + args = data.get("a", []) + if name in _BRIDGE_METHODS: + fn = getattr(self._bridge, name, None) + if fn: + try: + fn(*args) + except Exception as ex: + print(f"[WV2] bridge {name} error:", ex) + + # ---------- JS → Python 用的执行通道 ---------- + def run_js(self, script): + self._session.execute_js(script) + + def execute_js_async(self, script, cb): + self._session.execute_js_async(script, cb) + + # ---------- 几何同步 ---------- + def _dpr(self): + try: + d = self.dpr() + return d if d > 0 else 1.0 + except Exception: + return 1.0 + + def sync_bounds(self): + if not self.isVisible() or not self._session.child_hwnd: + return + top = self.window() + p = self.mapTo(top, QtCore.QPoint(0, 0)) + d = self._dpr() + L, T = p.x() * d, p.y() * d + W, H = max(1, self.width() * d), max(1, self.height() * d) + # 去重:值没变就不发跨进程 COM(移动窗口时避免主线程被 WebView2 阻塞 → 整窗黑屏) + # 注:旧版 resize hold(放大时钳制旧尺寸→露白边)已移除 —— + # 拖动黑边的真凶是假异步 JS 泵(已修真异步),高频 SetBounds 实测 Chromium 完全跟得上; + # 用户实测:立即发送 = 缩小/放大都实时渲染、无阻塞。 + if self._last_sent_bounds == (L, T, W, H): + return + self._session.set_bounds(L, T, W, H) + self._last_sent_bounds = (L, T, W, H) + + def resizeEvent(self, ev): + super().resizeEvent(ev) + self.sync_bounds() + + def showEvent(self, ev): + super().showEvent(ev) + # 确保渲染层点亮(SDK 初始状态下控制器可能不可见) + self._session.set_visible(True) + self.sync_bounds() + + def _force_repaint(self): + """WebView2 子窗口创建会打断首帧合成 → 强制整窗重绘(治启动时控件渲染丢失)""" + top = self.window() + if top is None: + return + top.update() + QtWidgets.QApplication.processEvents() + + def _try_find_child(self): + if self._session.child_hwnd: + self._child_timer.stop() + self._session.set_visible(True) + self.sync_bounds() + self._force_repaint() + QtCore.QTimer.singleShot(300, self._force_repaint) + return + if self._session.find_child_once(): + self._child_timer.stop() + self._session.set_visible(True) + self.sync_bounds() + self._force_repaint() + QtCore.QTimer.singleShot(300, self._force_repaint) + + # ---------- 生命周期 ---------- + def closeEvent(self, ev): + try: + self._child_timer.stop() + self._sync_timer.stop() + self._session.close() + except Exception: + pass + super().closeEvent(ev) diff --git a/ui/web/app.js b/ui/web/app.js new file mode 100644 index 0000000..8548559 --- /dev/null +++ b/ui/web/app.js @@ -0,0 +1,2309 @@ +// ========== 诊断日志(排查流式显示问题的根本手段) ========== +// ========== JS 控制台桥:console.* 全部捕获进 window.__jslog,Python 每 500ms 抽到控制台 ========== +(function() { + try { + var realLog = console.log.bind(console); + var realWarn = console.warn.bind(console); + var realErr = console.error.bind(console); + window.__jslog = []; + function fmt(a) { + if (typeof a === 'string') return a; + if (typeof a === 'object' && a !== null) { + try { return JSON.stringify(a); } catch (e) { return String(a); } + } + return String(a); + } + function push(level, args) { + var str = ''; + for (var i = 0; i < args.length; i++) str += (i ? ' ' : '') + fmt(args[i]); + window.__jslog.push('[' + level + '] ' + str); + if (window.__jslog.length > 500) window.__jslog.splice(0, window.__jslog.length - 500); + } + console.log = function() { push('log', Array.prototype.slice.call(arguments)); realLog.apply(null, arguments); }; + console.warn = function() { push('warn', Array.prototype.slice.call(arguments)); realWarn.apply(null, arguments); }; + console.error = function() { push('err', Array.prototype.slice.call(arguments)); realErr.apply(null, arguments); }; + window.__jslogDrain = function() { + if (!window.__jslog || !window.__jslog.length) return ''; + var out = window.__jslog.join('\n'); + window.__jslog = []; + return out; + }; + } catch (e) {} +})(); +window.__APP_VER = '20260721-v7'; +console.log('[JS] ===== app.js 加载 ver=20260721-v7 ====='); +// 公式渲染依赖本地 KaTeX(离线);此处确认资源加载结果,缺失时打印告警便于定位 +console.log('[JS] KaTeX ' + (typeof katex !== 'undefined' ? katex.version + ' 就绪' : '缺失(公式将退化为纯文本)')); +// 渲染器主线程心跳:dt 异常大 = 渲染器被阻塞(截图/重绘/GPU 等) +(function() { + var _hbLast = Date.now(); + setInterval(function() { + var _now = Date.now(); + var _dt = _now - _hbLast; + _hbLast = _now; + if (_dt >= 1500) { + console.log('[JS] 心跳 dt=' + _dt + 'ms (渲染器主线程曾卡顿)'); + } + }, 1000); +})(); +window.__diag = { events: [], cap: 300, tokenN: 0, thinkN: 0 }; +function diagEvent(name, extra) { + try { + var d = window.__diag; + d.events.push({ t: Date.now() % 1000000, e: name, x: extra }); + if (d.events.length > d.cap) d.events.splice(0, d.events.length - d.cap); + } catch (e) {} +} +function dumpDiag() { + try { + var c = {}; + var last = {}; + var evs = window.__diag.events; + for (var i = 0; i < evs.length; i++) { + var e = evs[i].e; + c[e] = (c[e] || 0) + 1; + last[e] = evs[i].x; // 每类最后一条 + } + return JSON.stringify({ ver: window.__APP_VER, n: evs.length, + counts: c, last: last, + recent: evs.slice(-30) }); + } catch (e) { return '{}'; } +} + +// ★ 实时 DOM 体检:缓冲区字符 vs DOM 实际字符 vs 可见性 +// 返回每个正文段/思考段的 {b:缓冲, d:DOM, h:高度, op:透明度, dis:display} +function probeStream(msgId) { + try { + var out = { id: msgId, buf: false, segs: [], thinks: [], raf: 0, due: 0 }; + var buf = messageBuffer[msgId]; + if (!buf) return JSON.stringify(out); + out.buf = true; + out.raf = buf.raf ? 1 : 0; + out.due = buf.rafDue ? 1 : 0; + buf.textSegs = buf.textSegs || []; + buf.thinkSegs = buf.thinkSegs || []; + var i, el; + for (i = 0; i < buf.textSegs.length; i++) { + el = buf.textSegs[i]; + var cs = (el.ownerDocument.defaultView.getComputedStyle) + ? el.ownerDocument.defaultView.getComputedStyle(el) : null; + out.segs.push({ + b: (el.__buf || '').length, + d: (el.textContent || '').length, + h: el.offsetHeight, + op: cs ? cs.opacity : '?', + dis: cs ? cs.display : '?', + child: el.childNodes.length + }); + } + for (i = 0; i < buf.thinkSegs.length; i++) { + el = buf.thinkSegs[i]; + out.thinks.push({ + b: (el.__buf || '').length, + d: (el.textContent || '').length, + h: el.offsetHeight + }); + } + return JSON.stringify(out); + } catch (e) { + return JSON.stringify({ err: String(e) }); + } +} + +var chatContainer = document.getElementById('chat-container'); +var messageBuffer = {}; +var longTextStore = {}; +var finalContentStore = {}; +var attachmentMetaStore = {}; +function isNearBottom() { + return (window.innerHeight + window.scrollY) >= (document.body.scrollHeight - 150); +} + +// ==================== 自定义滚动条镜像上报 ==================== +function getScroller() { + return document.scrollingElement || document.documentElement; +} + +function webScrollTo(y) { + getScroller().scrollTop = y; +} + +function reportWebScroll() { + if (window.bridge && window.bridge.onScrollChanged) { + var se = getScroller(); + window.bridge.onScrollChanged(se.scrollTop, se.scrollHeight, se.clientHeight); + } +} +document.addEventListener('scroll', function() { + requestAnimationFrame(reportWebScroll); + // 🆕 P1-01:自动模式顶部自动加载旧页 / 双模式底部自动恢复新页 + if (typeof rwAutoCheck === 'function') requestAnimationFrame(rwAutoCheck); +}, { passive: true, capture: true }); +window.addEventListener('resize', function() { + requestAnimationFrame(reportWebScroll); +}); +document.addEventListener('DOMContentLoaded', function() { + setTimeout(reportWebScroll, 300); +}); + +// ==================== Markdown 渲染器配置 ==================== +function escapeHtml(s) { + return String(s == null ? '' : s) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} + +function safeHtml(html) { + if (typeof window !== 'undefined' && window.DOMPurify) { + return DOMPurify.sanitize(html, { ADD_TAGS: ['details', 'summary'] }); + } + return html; +} + +var renderer = new marked.Renderer(); + +renderer.code = function(obj) { + var code = (typeof obj === 'string') ? obj : (obj.text || ''); + var lang = (typeof obj === 'string') ? (arguments[1] || '') : (obj.lang || ''); + var langLabel = lang ? lang : 'code'; + var isSvg = String(lang || '').trim().toLowerCase() === 'svg'; + var svgBtnHtml = isSvg + ? '' + : ''; + var safeCode = escapeHtml(code); + var safeLang = escapeHtml(lang); + var safeLangLabel = escapeHtml(langLabel); + return '
' + + '
' + + '' + safeLangLabel + '' + + '
' + + '' + + '' + + svgBtnHtml + + '
' + + '
' + + '' + + '
'; +}; + +// 流式渲染是全量重渲,围栏未闭合的瞬态或回答中的无围栏 HTML 片段都会被打成活体 DOM。 +// 覆盖 renderer.html,把一切裸 HTML 转义为可见文本。 +renderer.html = function(html) { + return escapeHtml(html); +}; + +marked.setOptions({ renderer: renderer, breaks: true }); + +// ==================== 🌟 公式渲染(KaTeX + 部分供应商单括号 [...] 格式) ==================== +// +// 部分大模型提供商把块公式输出成单括号 [ ... ](非标准 $$...$$), +// 前端原先无任何公式渲染。统一管线(包在 marked.parse 里,17+ 个调用点 +// ——正文/思考/工具/压缩摘要——自动生效): +// extractMath: 冻结代码区 → 抽公式为占位符 → 还原代码 +// marked.parse: 正常 markdown 渲染(占位符当纯文本通过) +// restoreMath: 占位符 → KaTeX HTML(throwOnError=false,流式半截公式红色自愈) +// safeHtml(DOMPurify): 调用点原有逻辑,KaTeX 产物也过一遍消毒 +// +// 块定界符: $$...$$、\[...\]、[ ... ](供应商格式,严格启发式防误伤) +// 行内定界符: $...$(货币/空格守卫)、\(...\) + +var _mathItems = []; + +function _mathHasFeature(c) { + // 数学特征:\ 命令、上下标、等号、矩阵 &、希腊字母 + return /\\[a-zA-Z]/.test(c) || /[_^]/.test(c) || /=/.test(c) || /&/.test(c) + || /[\u0370-\u03FF]/.test(c); +} + +function _putMath(tex, display) { + _mathItems.push({ tex: tex, display: display }); + return (display ? '@@KBMA' : '@@KMIA') + (_mathItems.length - 1) + '@@'; +} + +function _katexRender(tex, display) { + if (typeof katex === 'undefined') return escapeHtml(tex); + try { + return katex.renderToString(tex, { displayMode: display, throwOnError: false, errorColor: '#cf1322' }); + } catch (e) { + return escapeHtml(tex); + } +} + +function extractMath(text) { + _mathItems = []; + // ---- 1) 冻结代码区(围栏含流式未闭合瞬态 + 行内代码):公式提取不碰代码 ---- + var codeFrozen = []; + var s = String(text).replace(/```[\s\S]*?(?:```|$)|`[^`\n]*`/g, function(m){ + codeFrozen.push(m); + return '@@KOCE' + (codeFrozen.length - 1) + '@@'; + }); + // ---- 2) 块 $$...$$ ---- + s = s.replace(/\$\$([\s\S]+?)\$\$/g, function(_, tex){ return _putMath(tex, true); }); + // ---- 3) 块 \[...\] ---- + s = s.replace(/\\\[[\s\S]+?\\\]/g, function(m){ return _putMath(m.slice(2, -2), true); }); + // ---- 4) 供应商单括号块 [ ... ](严格启发式)---- + // 判公式条件:行首 [ + 行尾 ] + 后不紧跟 ((排除链接)+ 不含 http + // + 多行 或 含数学特征;[1] 编号/[a, b] 列表/单行链接全部排除 + { + var out = '', pos = 0, n = s.length; + while (pos < n) { + var nl = s.indexOf('\n', pos); + var lineEnd = nl === -1 ? n : nl; + var line = s.substring(pos, lineEnd); + var m = /^(\s*)\[/.exec(line); + var consumed = false; + if (m) { + var searchFrom = pos + m[0].length; + var brPos = pos + m[1].length; // '[' 的位置(保留括号前空白,丢括号) + var closeIdx = -1; + var p2 = searchFrom; + while (p2 < n) { + var nl2 = s.indexOf('\n', p2); + var le2 = nl2 === -1 ? n : nl2; + var l2 = s.substring(p2, le2); + var cm = l2.match(/\](\s*)$/); + if (cm) { closeIdx = p2 + cm.index; break; } + p2 = (nl2 === -1) ? n : nl2 + 1; + } + if (closeIdx > searchFrom) { + var content = s.substring(searchFrom, closeIdx); + var ok = content.trim() !== '' + && s.charAt(closeIdx + 1) !== '(' + && content.indexOf('http') === -1 + && content.indexOf('@@KOCE') === -1 + && (content.indexOf('\n') !== -1 || _mathHasFeature(content.trim())); + if (ok) { + out += s.substring(pos, brPos) + _putMath(content, true); + pos = closeIdx + 1; + consumed = true; + } + } + } + if (!consumed) { + out += line + (nl === -1 ? '' : '\n'); + pos = nl === -1 ? n : nl + 1; + } + } + s = out; + } + // ---- 5) 行内 \(...\) ---- + s = s.replace(/\\\(([\s\S]+?)\\\)/g, function(_, tex){ return _putMath(tex, false); }); + // ---- 6) 行内 $...$(守卫:首尾无空格、非纯数字、含数学特征 或 纯 ASCII 单词如 $x$)---- + s = s.replace(/\$([^\n$]+?)\$/g, function(full, tex){ + if (/^\s|\s$/.test(tex)) return full; // 首尾空格 → 货币/普通 + if (/^[\d,.\s]+$/.test(tex)) return full; // 纯数字 → 货币 + if (!_mathHasFeature(tex) && !/^[A-Za-z][A-Za-z0-9]*$/.test(tex.trim())) return full; + return _putMath(tex, false); + }); + // ---- 7) 还原代码区 ---- + s = s.replace(/@@KOCE(\d+)@@/g, function(_, i){ return codeFrozen[+i]; }); + return { md: s, items: _mathItems }; +} + +function restoreMath(html, items) { + items = items || _mathItems; + for (var i = 0; i < items.length; i++) { + var tok = (items[i].display ? '@@KBMA' : '@@KMIA') + i + '@@'; + html = html.split(tok).join(_katexRender(items[i].tex, items[i].display)); + } + return html; +} + +// 🌟 统一拦截点:包 marked.parse,所有调用点(正文/流式/思考/工具/摘要)自动获得公式渲染 +var _markedParseRaw = marked.parse.bind(marked); +marked.parse = function(text, opts) { + if (typeof text !== 'string') return _markedParseRaw(text, opts); + // 快速路径:无任何公式特征字符直接过([...] 供应商格式也靠 [ 触发) + if (text.indexOf('$') === -1 && text.indexOf('\\[') === -1 + && text.indexOf('\\(') === -1 && text.indexOf('[') === -1) { + return _markedParseRaw(text, opts); + } + var ex = extractMath(text); + return restoreMath(_markedParseRaw(ex.md, opts), ex.items); +}; + +// 🌟 流式稳定前缀防切分:前缀内有未闭合公式起点 → 返回应回退到的位置(0=无) +// (启发式;误判只延迟一帧固化,无功能影响) +function findUnclosedMathFrom(s) { + var inFence = false, pos = 0, n = s.length; + var dollarOpen = -1, bsOpen = -1, parenOpen = -1, inlineOpen = -1, bracketOpen = -1; + while (pos < n) { + var nl = s.indexOf('\n', pos); + var lineEnd = nl === -1 ? n : nl + 1; + var line = s.substring(pos, lineEnd); + if (/^\s*(```|~~~)/.test(line)) inFence = !inFence; + if (!inFence) { + var i2 = 0; + while ((i2 = line.indexOf('$$', i2)) !== -1) { + dollarOpen = (dollarOpen === -1) ? (pos + i2) : -1; + i2 += 2; + } + var ib = line.indexOf('\\['); + if (ib !== -1) bsOpen = (bsOpen === -1) ? (pos + ib) : -1; + if (line.indexOf('\\]') !== -1) bsOpen = -1; + var ip = line.indexOf('\\('); + if (ip !== -1) parenOpen = (parenOpen === -1) ? (pos + ip) : -1; + if (line.indexOf('\\)') !== -1) parenOpen = -1; + for (var k = 0; k < line.length; k++) { + if (line.charAt(k) === '$' + && line.charAt(k + 1) !== '$' + && (k === 0 || line.charAt(k - 1) !== '$')) { + inlineOpen = (inlineOpen === -1) ? (pos + k) : -1; + } + } + if (bracketOpen !== -1) { + if (/\]\s*$/.test(line)) bracketOpen = -1; + } else { + var mb = /^(\s*)\[/.exec(line); + if (mb && line.indexOf('](') === -1 && !/\]\s*$/.test(line)) { + // 行首 [ 未同行闭合、非链接;裸 [ 行或含数学特征才视为公式开 + if (line.trim() === '[' || _mathHasFeature(line)) bracketOpen = pos; + } + } + } + pos = lineEnd; + } + var opens = []; + if (dollarOpen !== -1) opens.push(dollarOpen); + if (bsOpen !== -1) opens.push(bsOpen); + if (parenOpen !== -1) opens.push(parenOpen); + if (inlineOpen !== -1) opens.push(inlineOpen); + if (bracketOpen !== -1) opens.push(bracketOpen); + return opens.length ? Math.min.apply(null, opens) : 0; +} + +// ==================== 全局事件委托 ==================== +if (chatContainer) { + chatContainer.addEventListener('click', function(e) { + var target = e.target; + + // --- 1. 消息操作栏:复制整条消息 --- + var copyMsgBtn = target.closest('.copy-msg-btn'); + if (copyMsgBtn) { + var actionBar = copyMsgBtn.closest('.message-actions'); + if (actionBar) { + var targetMsgId = actionBar.getAttribute('data-msg-id'); + var rawContent = (typeof finalContentStore !== 'undefined' && finalContentStore[targetMsgId]) || ''; + copyToClipboard(rawContent).then(function() { + var iconCopy = copyMsgBtn.querySelector('.icon-copy'); + var iconCheck = copyMsgBtn.querySelector('.icon-check'); + if (iconCopy && iconCheck) { + iconCopy.style.display = 'none'; + iconCheck.style.display = 'inline'; + setTimeout(function() { + iconCopy.style.display = 'inline'; + iconCheck.style.display = 'none'; + }, 2000); + } + }).catch(function(err) { + console.error('复制失败:', err); + }); + } + return; + } + + // --- 2. 消息操作栏:重新回答 --- + var regenBtn = target.closest('.regenerate-btn'); + if (regenBtn) { + var actionBar = regenBtn.closest('.message-actions'); + if (actionBar) { + var targetMsgId = actionBar.getAttribute('data-msg-id'); + if (window.bridge && typeof window.bridge.onRegenerateClicked === 'function') { + window.bridge.onRegenerateClicked(targetMsgId); + } + } + return; + } + + // --- 3. 消息操作栏:压缩对话(预留) --- + if (target.closest('.compress-btn')) { + console.log('[JS]: 压缩对话功能预留'); + return; + } + + // --- 4. 代码块复制 --- + var copyBtn = target.closest('.copy-btn'); + if (copyBtn) { + var wrapper = copyBtn.closest('.code-block-wrapper'); + var codeElem = wrapper ? wrapper.querySelector('code') : null; + if (codeElem) { + var rawCode = codeElem.textContent; + copyToClipboard(rawCode).then(function() { + copyBtn.classList.add('copied'); + var iconCopy = copyBtn.querySelector('.icon-copy'); + var iconCheck = copyBtn.querySelector('.icon-check'); + var btnText = copyBtn.querySelector('.btn-text'); + if (iconCopy) iconCopy.style.display = 'none'; + if (iconCheck) iconCheck.style.display = 'inline'; + if (btnText) btnText.textContent = '已复制'; + setTimeout(function() { + copyBtn.classList.remove('copied'); + if (iconCopy) iconCopy.style.display = 'inline'; + if (iconCheck) iconCheck.style.display = 'none'; + if (btnText) btnText.textContent = '复制'; + }, 2000); + }).catch(function(err) { + console.error('代码复制失败:', err); + }); + } + return; + } + + // --- 5. 代码块折叠 --- + var foldBtn = target.closest('.fold-btn'); + if (foldBtn) { + var wrapper = foldBtn.closest('.code-block-wrapper'); + var pre = wrapper ? wrapper.querySelector('.code-body') : null; + if (pre) { + var isCollapsed = pre.classList.toggle('collapsed'); + foldBtn.textContent = isCollapsed ? '展开' : '收起'; + } + return; + } + + // --- 5.5 SVG 代码块:绘制/源码 切换 --- + var svgRenderBtn = target.closest('.svg-render-btn'); + if (svgRenderBtn) { + var svgWrapper = svgRenderBtn.closest('.code-block-wrapper'); + if (svgWrapper && typeof toggleSvgRender === 'function') { + toggleSvgRender(svgWrapper, svgRenderBtn); + } + return; + } + + // --- 6. 附件卡片点击 (呼叫 Python 原生窗口) --- + var card = target.closest('.long-text-card'); + if (card) { + var attId = card.getAttribute('data-msg-id'); + var meta = attachmentMetaStore[attId]; + if (meta && window.bridge && typeof window.bridge.onAttachmentClicked === 'function') { + window.bridge.onAttachmentClicked(JSON.stringify(meta)); + } else if (typeof showContentModal === 'function') { + showContentModal(attId); + } + return; + } + + // --- 7. 分支切换:左侧上一分支 --- + var prevBranchBtn = target.closest('.prev-branch'); + if (prevBranchBtn && !prevBranchBtn.disabled) { + var selector = prevBranchBtn.closest('.branch-selector'); + if (selector) { + var msgId = selector.getAttribute('data-msg-id'); + if (window.bridge && typeof window.bridge.onBranchSwitch === 'function') { + window.bridge.onBranchSwitch(msgId, -1); + } + } + return; + } + + // --- 8. 分支切换:右侧下一分支 --- + var nextBranchBtn = target.closest('.next-branch'); + if (nextBranchBtn && !nextBranchBtn.disabled) { + var selector = nextBranchBtn.closest('.branch-selector'); + if (selector) { + var msgId = selector.getAttribute('data-msg-id'); + if (window.bridge && typeof window.bridge.onBranchSwitch === 'function') { + window.bridge.onBranchSwitch(msgId, 1); + } + } + return; + } + + // --- 9. 优先检查:是否点击了“确认删除气泡”内部 --- + var confirmPopover = target.closest('.delete-confirm-popover'); + if (confirmPopover) { + var actionBar = confirmPopover.closest('.message-actions'); + if (actionBar) { + var targetMsgId = actionBar.getAttribute('data-msg-id'); + if (window.bridge && typeof window.bridge.onDeleteMessageClicked === 'function') { + window.bridge.onDeleteMessageClicked(targetMsgId); + } + } + confirmPopover.remove(); + e.stopPropagation(); + return; + } + + // --- 10. 垃圾桶按钮点击:弹出确认气泡 --- + var delBtn = target.closest('.delete-btn'); + if (delBtn) { + document.querySelectorAll('.delete-confirm-popover').forEach(function(el) { el.remove(); }); + var popover = document.createElement('div'); + popover.className = 'delete-confirm-popover'; + var warnText = delBtn.classList.contains('user-delete-btn') ? '将连带下方对话一并删除,确认?' : '确认删除当前回答?'; + popover.innerHTML = '' + warnText + ''; + delBtn.appendChild(popover); + e.stopPropagation(); + return; + } + + }); +} +document.addEventListener('click', function(e) { + if (e.target.closest('.modal-close-btn')) { closeContentModal(); return; } + var overlay = e.target.closest('.content-modal-overlay'); + if (overlay && e.target === overlay) { closeContentModal(); return; } + document.querySelectorAll('.delete-confirm-popover').forEach(function(el) { el.remove(); }); +}); + +// ==================== 剪贴板 ==================== +function copyToClipboard(text) { + var ta = document.createElement('textarea'); + ta.value = text; + ta.style.cssText = 'position:fixed;left:-9999px;top:-9999px;opacity:0'; + document.body.appendChild(ta); + ta.focus(); + ta.select(); + return new Promise(function(resolve, reject) { + try { document.execCommand('copy'); resolve(); } + catch (err) { reject(err); } + finally { ta.remove(); } + }); +} + +// ==================== 模态框 ==================== +function showContentModal(msgId) { + var text = longTextStore[msgId]; + if (!text) return; + closeContentModal(); + + var overlay = document.createElement('div'); + overlay.className = 'content-modal-overlay'; + + var modal = document.createElement('div'); + modal.className = 'content-modal'; + + var header = document.createElement('div'); + header.className = 'modal-header'; + var title = document.createElement('span'); + title.textContent = '文件内容'; + var closeBtn = document.createElement('button'); + closeBtn.className = 'modal-close-btn'; + closeBtn.innerHTML = '✕'; + header.appendChild(title); + header.appendChild(closeBtn); + + var body = document.createElement('pre'); + body.className = 'modal-body'; + body.textContent = text; + + modal.appendChild(header); + modal.appendChild(body); + overlay.appendChild(modal); + document.body.appendChild(overlay); + requestAnimationFrame(function() { overlay.classList.add('visible'); }); +} + +function closeContentModal() { + var overlay = document.querySelector('.content-modal-overlay'); + if (overlay) { + overlay.classList.remove('visible'); + setTimeout(function() { overlay.remove(); }, 200); + } +} + +// ==================== 消息操作栏(只定义一次) ==================== +function createActionBar(msgId) { + var bar = document.createElement('div'); + bar.className = 'message-actions'; + bar.setAttribute('data-msg-id', msgId); + + var regenBtn = document.createElement('button'); + regenBtn.className = 'action-btn regenerate-btn'; + regenBtn.title = '重新回答'; + regenBtn.innerHTML = '' + + ''; + + var copyMsgBtn = document.createElement('button'); + copyMsgBtn.className = 'action-btn copy-msg-btn'; + copyMsgBtn.title = '复制'; + copyMsgBtn.innerHTML = '' + + '' + + '' + + ''; + + var compressBtn = document.createElement('button'); + compressBtn.className = 'action-btn compress-btn'; + compressBtn.title = '压缩对话'; + compressBtn.innerHTML = '' + + '' + + ''; + + var deleteBtn = document.createElement('button'); + deleteBtn.className = 'action-btn delete-btn'; + deleteBtn.title = '删除'; + deleteBtn.innerHTML = ''; + deleteBtn.style.position = 'relative'; + + bar.appendChild(regenBtn); + bar.appendChild(copyMsgBtn); + bar.appendChild(compressBtn); + bar.appendChild(deleteBtn); + + return bar; +} + +// ==================== 用户消息专属操作栏 ==================== +function createUserActionBar(msgId) { + var bar = document.createElement('div'); + bar.className = 'message-actions user-actions'; + bar.setAttribute('data-msg-id', msgId); + bar.style.cssText = 'display: flex; justify-content: flex-end; margin-top: 8px; gap: 8px;'; + + function createBtn(title, svgContent, isDelete) { + var btn = document.createElement('button'); + btn.className = 'action-btn ' + (isDelete ? 'delete-btn user-delete-btn' : (title.includes('重') ? 'regenerate-btn' : 'copy-msg-btn')); + btn.title = title; + btn.innerHTML = svgContent; + btn.style.cssText = 'background: transparent; border: none; cursor: pointer; padding: 6px; border-radius: 6px; display: inline-flex; align-items: center; justify-content: center; transition: background 0.2s;'; + btn.onmouseenter = function() { + this.style.backgroundColor = isDelete ? '#fee2e2' : '#eaeaea'; + var svgs = this.querySelectorAll('svg'); + svgs.forEach(function(s) { + if (!s.classList.contains('icon-check')) { + s.style.stroke = isDelete ? '#ef4444' : '#333333'; + } + }); + }; + btn.onmouseleave = function() { + this.style.backgroundColor = 'transparent'; + var svgs = this.querySelectorAll('svg'); + svgs.forEach(function(s) { + if (!s.classList.contains('icon-check')) { + s.style.stroke = '#999999'; + } + }); + }; + return btn; + } + + var regenSvg = ''; + var copySvg = ''; + var delSvg = ''; + + var regenBtn = createBtn('重新提问', regenSvg, false); + var copyMsgBtn = createBtn('复制提问', copySvg, false); + var deleteBtn = createBtn('删除提问', delSvg, true); + deleteBtn.style.position = 'relative'; + + bar.appendChild(regenBtn); + bar.appendChild(copyMsgBtn); + bar.appendChild(deleteBtn); + + return bar; +} +// ==================== 消息创建 ==================== +function createMessage(msgId, role, initialText, senderName, branchInfo) { + console.log('[JS] createMessage id=' + msgId + ' role=' + role); + initialText = initialText || ''; + senderName = senderName || ''; + var welcome = document.querySelector('.welcome-screen'); + if (welcome) { + welcome.style.display = 'none'; + } + var wrapper = document.createElement('div'); + wrapper.className = 'message-wrapper ' + role; + wrapper.id = msgId; + var avatar = document.createElement('div'); + avatar.className = 'avatar'; + avatar.innerText = role === 'user' ? 'U' : 'AI'; + var content = document.createElement('div'); + content.className = 'message-content'; + var nameLabel = document.createElement('div'); + nameLabel.className = 'sender-name'; + nameLabel.innerText = senderName || (role === 'user' ? 'You' : 'Assistant'); + + if (role === 'assistant' && branchInfo && branchInfo.total > 1) { + var branchUI = document.createElement('div'); + branchUI.className = 'branch-selector'; + branchUI.setAttribute('data-msg-id', msgId); + var prevBtn = document.createElement('button'); + prevBtn.className = 'branch-btn prev-branch'; + prevBtn.innerHTML = '❮'; + prevBtn.disabled = (branchInfo.current <= 1); + var textSpan = document.createElement('span'); + textSpan.className = 'branch-text'; + textSpan.innerText = branchInfo.current + ' / ' + branchInfo.total; + var nextBtn = document.createElement('button'); + nextBtn.className = 'branch-btn next-branch'; + nextBtn.innerHTML = '❯'; + nextBtn.disabled = (branchInfo.current >= branchInfo.total); + branchUI.appendChild(prevBtn); + branchUI.appendChild(textSpan); + branchUI.appendChild(nextBtn); + nameLabel.appendChild(branchUI); + } + content.appendChild(nameLabel); + var replyDiv = document.createElement('div'); + replyDiv.className = 'reply-content markdown-body'; + + if (initialText) { + if (role === 'user') { + replyDiv.innerText = initialText; + } else { + // 🆕 助手纯文本消息(无时间线历史路径)也包进 md-segment → 与时间线路径同样有浅灰气泡背景 + var _tHtml = typeof marked !== 'undefined' ? safeHtml(marked.parse(initialText)) : safeHtml(initialText); + replyDiv.innerHTML = '
' + _tHtml + '
'; + } + } + content.appendChild(replyDiv); + if (role === 'assistant') { + if (typeof createActionBar === 'function') { + content.appendChild(createActionBar(msgId)); + } + if (typeof finalContentStore !== 'undefined') { + finalContentStore[msgId] = initialText || ''; + } + } else if (role === 'user') { + if (typeof createUserActionBar === 'function') { + content.appendChild(createUserActionBar(msgId)); + } + if (typeof finalContentStore !== 'undefined') { + finalContentStore[msgId] = initialText || ''; + } + } + wrapper.appendChild(avatar); + wrapper.appendChild(content); + + if (typeof chatContainer !== 'undefined') { + chatContainer.appendChild(wrapper); + } else { + document.getElementById('chat-container').appendChild(wrapper); + } + if (typeof messageBuffer !== 'undefined') { + messageBuffer[msgId] = { reasoning: '', content: initialText, follow: true }; + } + if (role === 'assistant') { + wrapper.classList.add('streaming'); + } + diagEvent('createMessage', { id: msgId, role: role, stream: role === 'assistant' }); + if (typeof softScroll === 'function' && !window.__rwPageRendering) { + softScroll(); + } +} + +// ==================== 长文本消息 ==================== +function createLongMessage(msgId, role, fullText, senderName, sizeKb) { + senderName = senderName || 'You'; + var welcome = document.querySelector('.welcome-screen'); + if (welcome) welcome.style.display = 'none'; + + longTextStore[msgId] = fullText; + var lineCount = fullText.split('\n').length; + + var wrapper = document.createElement('div'); + wrapper.className = 'message-wrapper ' + role; + wrapper.id = msgId; + + var avatar = document.createElement('div'); + avatar.className = 'avatar'; + avatar.innerText = 'U'; + + var content = document.createElement('div'); + content.className = 'message-content'; + + var nameLabel = document.createElement('div'); + nameLabel.className = 'sender-name'; + nameLabel.innerText = senderName; + content.appendChild(nameLabel); + + content.appendChild(buildAttachmentCard(msgId, fullText, sizeKb, lineCount)); + + wrapper.appendChild(avatar); + wrapper.appendChild(content); + chatContainer.appendChild(wrapper); + + messageBuffer[msgId] = { reasoning: '', content: '', follow: true }; + if (!window.__rwPageRendering) softScroll(); +} + +// ==================== 带附件的用户消息 ==================== +function createUserMessageWithAttachments(msgId, plainText, attachments) { + var welcome = document.querySelector('.welcome-screen'); + if (welcome) welcome.style.display = 'none'; + + var wrapper = document.createElement('div'); + wrapper.className = 'message-wrapper user'; + wrapper.id = msgId; + + var avatar = document.createElement('div'); + avatar.className = 'avatar'; + avatar.innerText = 'U'; + + var content = document.createElement('div'); + content.className = 'message-content'; + + var nameLabel = document.createElement('div'); + nameLabel.className = 'sender-name'; + nameLabel.innerText = 'You'; + content.appendChild(nameLabel); + + var cardsContainer = document.createElement('div'); + cardsContainer.className = 'attachments-container'; + for (var i = 0; i < attachments.length; i++) { + var att = attachments[i]; + var attId = msgId + '-att-' + i; + longTextStore[attId] = att.content; + attachmentMetaStore[attId] = att; + cardsContainer.appendChild(buildAttachmentCard(attId, att.content, att.size_kb, att.lines, att.name, att.type, att.pages, att.mode)); + } + content.appendChild(cardsContainer); + + if (plainText && plainText.trim()) { + var replyDiv = document.createElement('div'); + replyDiv.className = 'reply-content markdown-body'; + replyDiv.innerText = plainText; + content.appendChild(replyDiv); + } + + content.appendChild(createUserActionBar(msgId)); + + wrapper.appendChild(avatar); + wrapper.appendChild(content); + chatContainer.appendChild(wrapper); + + messageBuffer[msgId] = { reasoning: '', content: '', follow: true }; + if (!window.__rwPageRendering) softScroll(); +} + +// ==================== 附件卡片构建器 ==================== +function buildAttachmentCard(id, text, sizeKb, lineCount, fileName, attType, pages, mode) { + var card = document.createElement('div'); + card.className = 'long-text-card'; + card.setAttribute('data-msg-id', id); + + var icon = document.createElement('div'); + icon.className = 'card-icon'; + icon.innerHTML = '' + + '' + + '' + + '' + + ''; + if (attType === 'pdf') { + icon.innerHTML = '' + + '' + + '' + + '' + + ''; + } + + var info = document.createElement('div'); + info.className = 'card-info'; + var cardTitle = document.createElement('div'); + cardTitle.className = 'card-title'; + if (fileName) { + cardTitle.textContent = fileName; + } else { + var preview = text.substring(0, 40).replace(/\n/g, ' '); + if (text.length > 40) preview += '...'; + cardTitle.textContent = preview; + } + var cardMeta = document.createElement('div'); + cardMeta.className = 'card-meta'; + if (attType === 'pdf') { + if (mode === 'image') { + cardMeta.textContent = 'PDF 图片 · ' + sizeKb + ' KB · ' + (pages || 0) + ' 页 · ' + (lineCount || 0) + ' 张'; + } else { + cardMeta.textContent = 'PDF 文本 · ' + sizeKb + ' KB · ' + (pages || 0) + ' 页'; + } + } else { + cardMeta.textContent = (fileName ? '' : 'TXT · ') + sizeKb + ' KB · ' + lineCount + ' 行'; + } + + info.appendChild(cardTitle); + info.appendChild(cardMeta); + card.appendChild(icon); + card.appendChild(info); + return card; +} + +// ==================== SVG 代码块:绘制/源码 切换 ==================== +function toggleSvgRender(wrapper, btn) { + var codeElem = wrapper.querySelector('.code-body code'); + var foldBtn = wrapper.querySelector('.fold-btn'); + var isRenderMode = wrapper.classList.contains('svg-mode'); + + if (isRenderMode) { + wrapper.classList.remove('svg-mode'); + btn.textContent = '绘制'; + btn.classList.remove('active'); + if (foldBtn) foldBtn.disabled = false; + var renderBody = wrapper.querySelector('.svg-render-body'); + if (renderBody) renderBody.remove(); + } else { + if (!codeElem) return; + var raw = codeElem.textContent; + var safe = ''; + if (typeof DOMPurify !== 'undefined') { + safe = DOMPurify.sanitize(raw, { USE_PROFILES: { svg: true, svgCustom: true } }); + } + if (!safe) return; + var body = document.createElement('div'); + body.className = 'svg-render-body'; + body.innerHTML = safe; + wrapper.appendChild(body); + wrapper.classList.add('svg-mode'); + btn.textContent = '源码'; + btn.classList.add('active'); + if (foldBtn) foldBtn.disabled = true; + } +} + +// ==================== 流式渲染(长上下文优化) ==================== +// 🌟 核心优化:稳定前缀增量渲染 + rAF 批量,替代「每个 token 全量 marked.parse」。 +// +// 原理: +// - 把已流式内容切成 [稳定前缀 | 尾部] 两段。 +// - 稳定前缀 = 可以独立解析的完整 markdown 块(段落以空行结束、 +// 代码围栏已闭合、行内代码反引号配对),解析一次后固化进 .md-stable, +// 之后永不再碰。 +// - 尾部(正在生长的那个块)每个 rAF 帧重渲一次。 +// - 多个 token 在一帧内到达时只渲一次(原来每 token 一次全量 parse → O(n²); +// 现在每帧只 parse「尾部小段」+ 偶尔 parse「新完成的块」→ 近似 O(n))。 +// +// function computeSafeLen(s, stableLen) { +// 返回 s 中最长「可固化前缀」长度(> stableLen 才算有进展)。 +// 规则: +// 1) 只算到最后一个完整行(末尾半行永远留尾部) +// 2) 代码围栏(```/~~~)闭合前,围栏及其所在块全部留尾部 +// 3) 块边界 = 围栏外的空行、或刚闭合的围栏之后 +// 4) 稳定区内行内代码反引号必须成对(不成对则回退到该行行首) +// } +function computeSafeLen(s, stableLen) { + var lastNl = s.lastIndexOf('\n'); + var limit = lastNl >= 0 ? lastNl + 1 : 0; + if (limit <= stableLen) return 0; + + var inFence = false; + var candidate = 0; // 最新的块边界位置(行首索引) + var pos = 0; + while (pos < limit) { + var nl = s.indexOf('\n', pos); + if (nl === -1 || nl >= limit) break; + var line = s.substring(pos, nl); + var next = nl + 1; + var fence = /^\s*(```|~~~)/.test(line); + if (!inFence && fence) { + inFence = true; + } else if (inFence && fence) { + inFence = false; + candidate = next; // 围栏闭合后是块边界 + } else if (!inFence && line.trim() === '') { + candidate = next; // 空行是块边界 + } + pos = next; + } + if (candidate > stableLen) { + var seg = s.substring(0, candidate); + var bt = (seg.match(/`/g) || []).length; + if (bt % 2 === 1) { + // 行内代码未闭合 → 回退到该段最后一行的行首 + var ln = seg.lastIndexOf('\n'); + candidate = ln >= 0 ? ln + 1 : 0; + } + // 🌟 公式感知:稳定区内有未闭合公式起点 → 回退到起点之前 + //(防公式前半被固化为纯文本、后半在尾部永远拼不上) + var unc = findUnclosedMathFrom(seg); + if (unc > 0) candidate = Math.min(candidate, unc); + } + return candidate > stableLen ? candidate : 0; +} + +// 初始化/获取某个容器 div 的增量渲染状态 +function mdStateOf(el) { + if (!el.__mdState) { + el.innerHTML = ''; + var stableEl = document.createElement('div'); + stableEl.className = 'md-stable'; + var tailEl = document.createElement('div'); + tailEl.className = 'md-tail'; + el.appendChild(stableEl); + el.appendChild(tailEl); + el.__mdState = { stableEl: stableEl, tailEl: tailEl, + stableLen: 0, lastTail: null, hlCount: 0 }; + } + return el.__mdState; +} + +// 对新固化进 .md-stable 的代码块做渐进高亮(只处理新增的) +function highlightNewCode(st) { + if (typeof hljs === 'undefined') return; + var codes = st.stableEl.querySelectorAll('pre code'); + for (var i = st.hlCount; i < codes.length; i++) { + try { hljs.highlightElement(codes[i]); } catch (e) {} + } + st.hlCount = codes.length; +} + +// 增量渲染:content 全量文本 → [固化段追加 + 尾部重渲] +function renderMarkdownStreaming(el, content) { + var st = mdStateOf(el); + var safe = computeSafeLen(content, st.stableLen); + if (safe > st.stableLen) { + var seg = content.slice(st.stableLen, safe); + st.stableEl.insertAdjacentHTML('beforeend', safeHtml(marked.parse(seg))); + st.stableLen = safe; + highlightNewCode(st); + } + var tail = content.slice(st.stableLen); + if (tail !== st.lastTail) { + st.tailEl.innerHTML = safeHtml(marked.parse(tail)); + st.lastTail = tail; + } +} + +// ==================== 时间线渲染(思考 / 工具 / 正文 按事件顺序穿插) ==================== +// +// 🌟 修复:原来「所有思考堆进顶部一个气泡、所有正文挤进一个块、 +// 工具气泡全堆在末尾」。现在 .reply-content 就是时间线容器, +// 思考块 / 正文段 / 工具 chip 按事件到达顺序插入: +// +// .reply-content +// .think-block ← 思考段 1 +// .tool-chip ← 工具调用 1 +// .md-segment ← 正文段 1(工具前模型说的话) +// .think-block ← 思考段 2 +// .md-segment ← 正文段 2(最终回答) +// .streaming-typing ← 光标(永远最后) + +var CHEVRON_SVG = ''; + +function makeChevron() { + var span = document.createElement('span'); + span.innerHTML = CHEVRON_SVG; + return span.firstElementChild; +} + +function makeThinkBlock(openNow, label) { + var block = document.createElement('details'); + block.className = 'think-block'; + block.open = !!openNow; + var summary = document.createElement('summary'); + summary.appendChild(makeChevron()); + var lab = document.createElement('span'); + lab.className = 'think-label'; + lab.textContent = label; + summary.appendChild(lab); + var tc = document.createElement('div'); + tc.className = 'think-content markdown-body'; + block.appendChild(summary); + block.appendChild(tc); + return block; +} + +// 惰性把消息的 .reply-content 变成时间线容器 +function ensureTimeline(wrapper, buf) { + var replyDiv = wrapper.querySelector('.reply-content'); + if (!replyDiv) return null; + if (!buf.timeline) { + buf.timeline = true; + buf.textSegs = []; + buf.thinkSegs = []; + var typing = document.createElement('span'); + typing.className = 'streaming-typing'; + typing.textContent = 'Chasing a shining star '; + var dotEl = document.createElement('span'); + dotEl.className = 'typing-dot'; + dotEl.textContent = '●'; + typing.appendChild(dotEl); + replyDiv.appendChild(typing); + buf.typingEl = typing; + } + return replyDiv; +} + +// ==================== 流式光标:Chasing a shining star ==================== +// 光标(.streaming-typing)自消息第一个时间线事件出现即显示并循环脉冲(同款蓝 #3b82f6), +// 思考/工具/压缩/正文全程保持;finishMessage 时移除。无休眠态。 + +// 「思考结束」时立即就地固化进行中的思考块(不等消息结束)—— 激发→结束的态转换点: +// 一旦来了非思考事件(正文 token / 工具开始 / 压缩开始),当前思考段立即: +// 最终渲染(未闭合代码围栏补围栏)→ 删 __buf/__mdState 冻结 DOM → 去 .streaming-think +// (蓝色脉冲消失)→ 折叠 → 标签「已完成深度思考」,并从 thinkSegs 摘除(渲染不再碰它)。 +// 与 finishTimelineMessage 的固化逻辑同款(幂等兑底保留)。 +function finalizeOpenThinkingBlocks(msgId) { + var buf = messageBuffer[msgId]; + if (!buf || !buf.thinkSegs) return; + for (var i = buf.thinkSegs.length - 1; i >= 0; i--) { + var tc = buf.thinkSegs[i]; + var block = tc.closest ? tc.closest('.think-block') : null; + if (!block || !block.classList.contains('streaming-think')) continue; + var c = tc.__buf || ''; + if ((c.match(/```/g) || []).length % 2 !== 0) { + tc.innerHTML = safeHtml('
' + + marked.parse(c + '\n```') + '
'); + } else if (c && tc.innerHTML === '') { + // rAF 还没跑过(极快结束)→ 一次性全量解析 + tc.innerHTML = safeHtml('
' + + marked.parse(c) + '
'); + } + delete tc.__mdState; + delete tc.__buf; + block.classList.remove('streaming-think'); + if (block.open) block.open = false; + var lab = block.querySelector('.think-label'); + if (lab) lab.textContent = '已完成深度思考'; + buf.thinkSegs.splice(i, 1); + } +} + +// rAF 批量:一帧内到达的所有 token 只触发一次渲染 +// 兜底:rAF 依赖合成器 BeginFrame(窗口隐藏/远程桌面/GPU 驱动异常时可能长时间 +// 不出帧)→ 40ms 后若 rAF 仍未触发,用 setTimeout 强制同步渲染(≈25fps 下限)。 +// 保证流式正文在任何渲染环境下都能实时显示。 +function scheduleStreamingRender(msgId) { + var buf = messageBuffer[msgId]; + if (!buf || buf.raf) return; + buf.raf = requestAnimationFrame(function() { + buf.raf = 0; + if (buf.rafDue) { clearTimeout(buf.rafDue); buf.rafDue = 0; } + buf.lastRenderAt = Date.now(); + doStreamingRender(msgId); + }); + buf.rafDue = setTimeout(function() { + if (buf.raf) { + buf.raf = 0; + buf.rafDue = 0; + buf.lastRenderAt = Date.now(); + doStreamingRender(msgId); + } + }, 40); +} + +// 若上一帧迟迟未触发(>60ms 无渲染)→ 放弃 rAF,本 token 直接同步渲染 +function forceRenderIfStale(msgId) { + var buf = messageBuffer[msgId]; + if (buf && buf.raf && buf.lastRenderAt && Date.now() - buf.lastRenderAt > 60) { + buf.raf = 0; + if (buf.rafDue) { clearTimeout(buf.rafDue); buf.rafDue = 0; } + buf.lastRenderAt = Date.now(); + doStreamingRender(msgId); + } +} + +// ★ 终极兜底:同步渲染节流(≈33fps 上限)。 +// 内容可见性不再依赖 rAF / 页面定时器 —— token 由 Python runJavaScript 送达, +// 本函数在同一 JS 任务内直接把内容写进 DOM。即使页面被判定隐藏 +// (rAF 停发 + timer 钳制 1Hz)也能逐 token 实时显示。 +var __lastSyncRender = {}; +function syncRenderThrottled(msgId, minGapMs) { + var now = Date.now(); + if (now - (__lastSyncRender[msgId] || 0) < (minGapMs == null ? 30 : minGapMs)) return; + __lastSyncRender[msgId] = now; + var buf = messageBuffer[msgId]; + if (!buf) return; + doStreamingRender(msgId); +} + +// Qt 看门狗入口:强制渲染(幂等,尾部无变化时开销极小) +function forceRenderNow(msgId) { + var _frNow = Date.now(); + if (!window.__frLast || _frNow - window.__frLast > 1000) { + window.__frLast = _frNow; + console.log('[JS] forceRenderNow id=' + msgId + ' (看门狗)'); + } + if (messageBuffer[msgId]) doStreamingRender(msgId); +} + +function cancelStreamingRender(msgId) { + var buf = messageBuffer[msgId]; + if (!buf) return; + if (buf.raf) { cancelAnimationFrame(buf.raf); buf.raf = 0; } + if (buf.rafDue) { clearTimeout(buf.rafDue); buf.rafDue = 0; } +} + +// 每帧一次:增量渲染时间线上所有段 + 跟随滚动 +// 兜底:任何渲染异常(marked 解析/HTML 注入)→ 对该段强制全量重解析, +// 保证流式正文永不因单次解析异常而永久空白。 +function _fullRenderSegment(el, c, isThink) { + if (!c) return; + if (isThink) { + el.innerHTML = safeHtml('
' + marked.parse(c) + '
'); + } else { + el.innerHTML = safeHtml(marked.parse(c)); + } + delete el.__mdState; // 增量状态作废,下一帧从零重建 +} +function doStreamingRender(msgId) { + window.__renderN = (window.__renderN || 0) + 1; + if (window.__renderN % 10 === 1) { + console.log('[JS] render#' + window.__renderN + ' 开始 id=' + msgId); + } + var buf = messageBuffer[msgId]; + if (!buf) return; + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + var wasNearBottom = isNearBottom(); + + if (buf.timeline) { + var i, seg, tc; + for (i = 0; i < buf.textSegs.length; i++) { + seg = buf.textSegs[i]; + try { + renderMarkdownStreaming(seg, seg.__buf || ''); + } catch (e) { + try { _fullRenderSegment(seg, seg.__buf || '', false); } catch (e2) {} + } + } + for (i = 0; i < buf.thinkSegs.length; i++) { + tc = buf.thinkSegs[i]; + try { + renderMarkdownStreaming(tc, tc.__buf || ''); + tc.scrollTop = tc.scrollHeight; + } catch (e) { + try { _fullRenderSegment(tc, tc.__buf || '', true); } catch (e2) {} + } + } + } else if (buf.content) { + var replyDiv = wrapper.querySelector('.reply-content'); + if (replyDiv) { + try { + renderMarkdownStreaming(replyDiv, buf.content); + } catch (e) { + try { _fullRenderSegment(replyDiv, buf.content, false); } catch (e2) {} + } + } + } + + // 跟随滚动(每帧最多一次;用户上滚自动暂停跟随) + if (wasNearBottom && buf.follow !== false) { + var anchor = document.getElementById('scroll-anchor'); + if (anchor) anchor.scrollIntoView({ behavior: 'auto', block: 'end' }); + } +} + +function appendReasoning(msgId, token) { + if (!messageBuffer[msgId]) return; + var buf = messageBuffer[msgId]; + buf.reasoning += token; + var wrapper = document.getElementById(msgId); + if (!wrapper) { diagEvent('appendReasoning', 'NO_WRAPPER:' + msgId); return; } + window.__diag.thinkN++; + if (window.__diag.thinkN === 1 || window.__diag.thinkN % 25 === 0) { + diagEvent('appendReasoning', 'n=' + window.__diag.thinkN); + } + wrapper.classList.add('streaming'); + var tl = ensureTimeline(wrapper, buf); + if (!tl) return; + // 续接规则:紧邻上一个块是「进行中」的思考块才续写,否则新开一段 + var last = buf.typingEl.previousElementSibling; + var tc = (last && last.classList && last.classList.contains('streaming-think')) + ? last.querySelector('.think-content') : null; + if (!tc) { + // 默认收起;进行中由 .streaming-think 蓝色呼吸动画提示(CSS) + var block = makeThinkBlock(false, '深度思考'); + block.classList.add('streaming-think'); + tl.insertBefore(block, buf.typingEl); + tc = block.querySelector('.think-content'); + buf.thinkSegs.push(tc); + } + tc.__buf = (tc.__buf || '') + token; + console.log('[JS] think#' + window.__diag.thinkN + ' 段buf=' + tc.__buf.length + 'c dom=' + (tc.textContent || '').length + 'c h=' + tc.offsetHeight); + syncRenderThrottled(msgId); // ★ 同步通道 + scheduleStreamingRender(msgId); +} + +function appendToken(msgId, token) { + if (!messageBuffer[msgId]) return; + var buf = messageBuffer[msgId]; + buf.content += token; + var wrapper = document.getElementById(msgId); + if (!wrapper) { diagEvent('appendToken', 'NO_WRAPPER:' + msgId); return; } + window.__diag.tokenN++; + if (window.__diag.tokenN === 1 || window.__diag.tokenN % 25 === 0) { + diagEvent('appendToken', 'n=' + window.__diag.tokenN); + } + wrapper.classList.add('streaming'); + var tl = ensureTimeline(wrapper, buf); + if (!tl) return; + finalizeOpenThinkingBlocks(msgId); // 首个正文 token → 思考必然已结束:思考段就地定格「已完成深度思考」 + // 续接规则:紧邻上一个块是正文段才续写,否则新开一段 + var last = buf.typingEl.previousElementSibling; + var seg = (last && last.classList && last.classList.contains('md-segment')) + ? last : null; + if (!seg) { + seg = document.createElement('div'); + seg.className = 'md-segment markdown-body'; + buf.textSegs.push(seg); + seg.__buf = token; + // ★ 根因修复(2026-07):Chromium 布局失效 bug —— 空 .md-segment 进文档时 + // 匹配 :empty{display:none},随后写入内容不重排,盒永久 0x0(正文不可见, + // 切会话重渲因"带内容插入"而正常)。必须先同步渲染、带内容再插入。 + mdStateOf(seg); + renderMarkdownStreaming(seg, seg.__buf); + tl.insertBefore(seg, buf.typingEl); + } else { + seg.__buf = (seg.__buf || '') + token; + } + console.log('[JS] token#' + window.__diag.tokenN + ' 段buf=' + seg.__buf.length + 'c dom=' + (seg.textContent || '').length + 'c 段数=' + buf.textSegs.length + ' h=' + seg.offsetHeight); + if (window.__diag.tokenN === 1 || window.__diag.tokenN % 25 === 0) { + diagEvent('tokenDOM', { buf: seg.__buf.length, dom: (seg.textContent || '').length }); + } + syncRenderThrottled(msgId); // ★ 同步通道:token 到 → 内容必现 + scheduleStreamingRender(msgId); // rAF 通道:更平滑(环境允许时) +} + +// ==================== 完成消息 ==================== +function finishMessage(msgId) { + console.log('[JS] finishMessage id=' + msgId); + var wrapper = document.getElementById(msgId); + if (!wrapper) { delete messageBuffer[msgId]; diagEvent('finish', 'NO_WRAPPER:' + msgId); return; } + diagEvent('finish', { id: msgId }); + var buf = messageBuffer[msgId]; + cancelStreamingRender(msgId); + + if (buf && buf.timeline) { + // ---- 时间线路径:各段原地冻结(不重排、不重渲) ---- + finishTimelineMessage(wrapper, buf); + } else { + // ---- 静态路径(历史 / 非流式) ---- + // --- A. 修复未闭合 Markdown(围栏奇数 → 补围栏后全量重渲一次)--- + var content = buf ? buf.content : ''; + var replyDiv = wrapper.querySelector('.reply-content'); + var codeBlockCount = (content.match(/```/g) || []).length; + if (codeBlockCount % 2 !== 0) { + content += '\n```'; + if (buf) buf.content = content; + if (replyDiv) { + delete replyDiv.__mdState; + replyDiv.innerHTML = safeHtml(marked.parse(content)); + } + } else if (replyDiv && replyDiv.__mdState) { + // 正常路径:增量 DOM 已经完整,零全量重渲,保留用户的折叠状态 + delete replyDiv.__mdState; + } + + // --- D. 折叠思考框(压缩气泡 .compaction-think 有自己名字,不碰) --- + var thinkBlock = wrapper.querySelector('.think-block:not(.compaction-think)'); + if (thinkBlock && thinkBlock.open) { + thinkBlock.open = false; + var lab = thinkBlock.querySelector('.think-label'); + if (lab) lab.textContent = '已完成深度思考'; + } + if (thinkBlock) { + var tc = thinkBlock.querySelector('.think-content'); + if (tc && tc.__mdState) delete tc.__mdState; + } + } + + // --- B. 折叠代码块过渡 --- + var collapsedBlocks = wrapper.querySelectorAll('.code-body.collapsed'); + collapsedBlocks.forEach(function(block) { + block.classList.add('scroll-locked'); + block.scrollTop = block.scrollHeight; + }); + + // --- C. 移除 streaming(操作栏自动显示) --- + wrapper.classList.remove('streaming'); + // 🆕 P1-01:流结束 → 解除渲染窗口流式保护(恢复可裁剪) + if (typeof rwState !== 'undefined' && rwState && typeof RenderWindowState !== 'undefined') { + RenderWindowState.streamFinished(rwState, msgId); + } + + // --- E. 代码高亮(增量渲染已渐进高亮过的会被跳过?这里统一兜底一次) --- + wrapper.querySelectorAll('pre code').forEach(function(block) { + try { hljs.highlightElement(block); } catch(e) {} + }); + + // --- F. 等重排完成 --- + // 🆕 P1-01:在调度时刻捕获渲染批次标志(延迟回调触发时批次已结束,不能届时再读) + var rwBatchSuppressed = !!window.__rwPageRendering; + requestAnimationFrame(function() { + setTimeout(function() { + collapsedBlocks.forEach(function(block) { + if (block.classList.contains('collapsed')) { + block.classList.remove('scroll-locked'); + block.scrollTop = block.scrollHeight; + } + }); + // 🆕 P1-01:窗口换页/初始窗口批次渲染期间不自动滚底(锚点由 rw 控制器恢复) + if (!rwBatchSuppressed) { + var anchor = document.getElementById('scroll-anchor'); + if (anchor) anchor.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } + }, 50); + }); + + // --- G. 更新最终内容存储 + 清理帧任务 --- + if (buf) { + finalContentStore[msgId] = buf.content; + if (buf.raf) { cancelAnimationFrame(buf.raf); buf.raf = 0; } + } + delete messageBuffer[msgId]; + + // --- H. 刷新自定义滚动条 --- + reportWebScroll(); +} + +// 时间线路径的收尾:逐段冻结 +function finishTimelineMessage(wrapper, buf) { + console.log('[JS] finishTimeline 正文段=' + (buf ? buf.textSegs.length : 0) + + ' 思考段=' + (buf ? buf.thinkSegs.length : 0) + + ' 正文总量=' + (buf && buf.content ? buf.content.length : 0) + 'c'); + // 收尾:取消未触发的 rAF / 兜底定时器 + if (buf.raf) { cancelAnimationFrame(buf.raf); buf.raf = 0; } + if (buf.rafDue) { clearTimeout(buf.rafDue); buf.rafDue = 0; } + // 正文段:围栏奇数 → 补围栏后重渲该段;偶数 → 增量 DOM 已完整,只固化尾部 + buf.textSegs.forEach(function(seg) { + var c = seg.__buf || ''; + if ((c.match(/```/g) || []).length % 2 !== 0) { + seg.innerHTML = safeHtml(marked.parse(c + '\n```')); + } else if (seg.__mdState) { + renderMarkdownStreaming(seg, c); + delete seg.__mdState; + } else if (c) { + // rAF 还没跑过(极快响应 / offscreen)→ 一次性全量解析 + seg.innerHTML = safeHtml(marked.parse(c)); + } + delete seg.__buf; + }); + // 思考块:固化 + 折叠 + buf.thinkSegs.forEach(function(tc) { + var c = tc.__buf || ''; + if ((c.match(/```/g) || []).length % 2 !== 0) { + tc.innerHTML = safeHtml(marked.parse(c + '\n```')); + } else if (c && tc.innerHTML === '') { + // rAF 还没跑过(极快响应 / offscreen)→ 一次性全量解析 + tc.innerHTML = safeHtml('
' + + marked.parse(c) + '
'); + } + delete tc.__mdState; + delete tc.__buf; + var block = tc.closest('.think-block'); + if (block) { + block.classList.remove('streaming-think'); + if (block.open) block.open = false; + var lab = block.querySelector('.think-label'); + if (lab) lab.textContent = '已完成深度思考'; + } + }); + // 未结束的工具 chip(中止/出错) + wrapper.querySelectorAll('.tool-chip.streaming').forEach(function(ch) { + ch.classList.remove('streaming'); + var st = ch.querySelector('.tool-chip-status'); + if (st && st.classList.contains('running')) { + st.classList.remove('running'); + st.classList.add('fail'); + st.textContent = '✗ 已中断'; + } + }); + // 移除流式光标 + if (buf.typingEl && buf.typingEl.parentNode) { + buf.typingEl.parentNode.removeChild(buf.typingEl); + } + // finish 后正文段体检(人肉 debug:确认正文盒是否可见) + buf.textSegs.forEach(function(seg, i) { + try { + var cs = window.getComputedStyle(seg); + var r = seg.getBoundingClientRect(); + console.log('[JS] finishAudit 正文段' + i + + ' h=' + seg.offsetHeight + ' connected=' + seg.isConnected + + ' rect=' + Math.round(r.top) + '/' + Math.round(r.height) + + ' display=' + cs.display + ' visibility=' + cs.visibility + + ' opacity=' + cs.opacity + + ' parent=' + (seg.parentElement ? seg.parentElement.className : 'NULL')); + } catch (e) { + console.log('[JS] finishAudit 正文段' + i + ' 异常 ' + e); + } + }); +} + +// ==================== 错误注入 ==================== +function showError(msgId, errorText) { + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + var contentDiv = wrapper.querySelector('.message-content'); + + if (contentDiv.querySelector('.system-error')) return; + + var errDiv = document.createElement('div'); + errDiv.className = 'system-error'; + errDiv.innerText = errorText; + + var actionBar = contentDiv.querySelector('.message-actions'); + if (actionBar) { + contentDiv.insertBefore(errDiv, actionBar); + } else { + contentDiv.appendChild(errDiv); + } + + wrapper.classList.remove('streaming'); + + if (messageBuffer[msgId]) { + finalContentStore[msgId] = messageBuffer[msgId].content; + } + + softScroll(); +} + +// ==================== 工具执行气泡(pi tool_execution_* 事件,按 call_id 对号入座) ==================== +// 浅色气泡,类似思考气泡:默认收起,摘要只显示「执行了什么」;点开展开参数+输出 +function _toolBrief(name, args) { + // 从参数里提取一行人类可读的简述(如 bash 的 command、read 的 path) + try { + var a = JSON.parse(args); + var brief = a.command || a.path || a.file || a.pattern || a.query || ''; + if (typeof brief !== 'string') brief = JSON.stringify(brief); + brief = String(brief).replace(/\s+/g, ' ').trim(); + if (brief.length > 46) brief = brief.slice(0, 46) + '…'; + return brief; + } catch (e) { + return ''; + } +} + +function _findChip(wrapper, callId) { + if (callId) { + var byId = wrapper.querySelector('.tool-chip[data-call-id="' + callId + '"]'); + if (byId) return byId; + } + // 兜底:没带 call_id 的旧事件 → 最后一个还在流式中的 chip + var chips = wrapper.querySelectorAll('.tool-chip.streaming'); + return chips.length ? chips[chips.length - 1] : null; +} + +// 工具 chip 构造器(流式/恢复/历史 三种场景共用) +// opts: {streaming: bool, ok: null|true|false, result: str} +function buildToolChip(callId, name, args, opts) { + opts = opts || {}; + var chip = document.createElement('details'); + chip.className = 'tool-chip' + (opts.streaming ? ' streaming' : ''); + chip.setAttribute('data-tool', name); + chip.setAttribute('data-call-id', callId || ''); + chip.open = false; // 默认收起,只显示执行了什么 + + var sum = document.createElement('summary'); + sum.appendChild(makeChevron()); + var icon = document.createElement('span'); + icon.className = 'tool-chip-icon'; + icon.textContent = '⚙'; + var nameSpan = document.createElement('span'); + nameSpan.className = 'tool-chip-name'; + nameSpan.textContent = name; + var brief = document.createElement('span'); + brief.className = 'tool-chip-brief'; + brief.textContent = _toolBrief(name, args); + var status = document.createElement('span'); + if (opts.ok === null || opts.ok === undefined) { + status.className = 'tool-chip-status running'; + status.textContent = '执行中…'; + } else if (opts.ok) { + status.className = 'tool-chip-status ok'; + status.textContent = '✓ 完成'; + if (opts.result) { + var fl = String(opts.result).split('\n')[0].replace(/\s+/g, ' ').trim(); + if (fl.length > 60) fl = fl.slice(0, 60) + '…'; + if (fl) { brief.textContent = fl; brief.classList.add('done'); } + } + } else { + status.className = 'tool-chip-status fail'; + status.textContent = '✗ 失败'; + } + sum.appendChild(icon); + sum.appendChild(nameSpan); + if (brief.textContent) sum.appendChild(brief); + sum.appendChild(status); + + var body = document.createElement('div'); + body.className = 'tool-chip-body'; + if (args) { + var argsLabel = document.createElement('div'); + argsLabel.className = 'tool-chip-label'; + argsLabel.textContent = '参数'; + var argsPre = document.createElement('pre'); + argsPre.className = 'tool-chip-pre tool-chip-args'; + argsPre.textContent = String(args).length > 1500 ? String(args).slice(0, 1500) + '…' : String(args); + body.appendChild(argsLabel); + body.appendChild(argsPre); + } + var liveLabel = document.createElement('div'); + liveLabel.className = 'tool-chip-label'; + liveLabel.textContent = '输出'; + var live = document.createElement('pre'); + live.className = 'tool-chip-pre tool-chip-live'; + body.appendChild(liveLabel); + body.appendChild(live); + + chip.appendChild(sum); + chip.appendChild(body); + chip.__sum = sum; + chip.__liveBuf = ''; + if (opts.ok === null || opts.ok === undefined || !opts.result) { + // 运行中(或无结果):输出区暂隐 + live.textContent = '执行中…'; + live.style.display = 'none'; + liveLabel.style.display = 'none'; + } else { + // 已出结果:长结果默认尾部预览 + 「展开完整输出」按钮; + // 耗时/超时徽章进摘要行 + _renderToolResultBody(chip, String(opts.result)); + _updateChipTimingSummary(chip, String(opts.result)); + } + return chip; +} + +// 从 bash 结果解析耗时与命中超时: +// 成功: "$ cmd\n\n[exit 0] (1.2s)" 超时: "命令超时(>120s)已终止" +function _parseToolTiming(resultText) { + var s = String(resultText || ''); + var dur = null, timeout = null; + var m = /\[exit -?\d+\]\s*\((\d+(?:\.\d+)?)s\)/.exec(s); + if (m) dur = parseFloat(m[1]); + var t = /命令超时(>\s*(\d+)s)/.exec(s); // 工具输出用全角括号 + if (t) timeout = parseInt(t[1], 10); + return { dur: dur, timeout: timeout }; +} + +// 摘要行插入 耗时/超时 徽章(收起时也能看到执行了多久、是否超时) +function _updateChipTimingSummary(chip, resultText) { + var tm = _parseToolTiming(resultText); + if (tm.dur === null && tm.timeout === null) return; + var sum = chip.__sum || chip.querySelector('summary'); + if (!sum) return; + var status = sum.querySelector('.tool-chip-status'); + var insertAt = status || sum.lastElementChild; + if (tm.dur !== null) { + var timeEl = chip.querySelector('.tool-chip-time'); + if (!timeEl) { + timeEl = document.createElement('span'); + timeEl.className = 'tool-chip-time'; + sum.insertBefore(timeEl, insertAt); + } + timeEl.textContent = '⏱ ' + tm.dur + 's'; + } + if (tm.timeout !== null) { + var tmoEl = chip.querySelector('.tool-chip-timeout'); + if (!tmoEl) { + tmoEl = document.createElement('span'); + tmoEl.className = 'tool-chip-timeout'; + sum.insertBefore(tmoEl, insertAt); + } + tmoEl.textContent = '⏱ 超时 ' + tm.timeout + 's'; + } +} + +// 工具结果正文:短结果完整显示;长结果默认只显示尾部 4000 字 + +// 「展开完整输出」按钮(再点收起)。chip.__fullResult 保存全文。 +var TOOL_PREVIEW_CHARS = 4000; +function _updateExpandBtn(btn, full, expanded) { + btn.textContent = expanded + ? '⬇ 收起(回到尾部预览)' + : '⬆ 展开完整输出(共 ' + full.length + ' 字)'; +} +function _renderToolResultBody(chip, resultText) { + var live = chip.querySelector('.tool-chip-live'); + if (!live) return; + var label = live.previousElementSibling; + var body = live.parentElement; + var full = String(resultText || ''); + chip.__fullResult = full; + chip.__expanded = false; + var btn = chip.querySelector('.tool-expand-btn'); + if (!full.trim()) { + if (label) label.style.display = 'none'; + live.style.display = 'none'; + if (btn) btn.remove(); + return; + } + if (label) label.style.display = 'block'; + live.style.display = 'block'; + live.classList.remove('tool-chip-full'); + if (full.length > TOOL_PREVIEW_CHARS) { + live.textContent = '…\n' + full.slice(-TOOL_PREVIEW_CHARS); + if (!btn) { + btn = document.createElement('button'); + btn.className = 'tool-expand-btn'; + btn.type = 'button'; + body.insertBefore(btn, live); + } + _updateExpandBtn(btn, full, false); + btn.onclick = function() { + chip.__expanded = !chip.__expanded; + if (chip.__expanded) { + live.textContent = full; + live.classList.add('tool-chip-full'); + _updateExpandBtn(btn, full, true); + } else { + live.textContent = '…\n' + full.slice(-TOOL_PREVIEW_CHARS); + live.classList.remove('tool-chip-full'); + _updateExpandBtn(btn, full, false); + } + }; + } else { + if (btn) btn.remove(); + live.textContent = full; + } +} + +function toolExecutionStarted(msgId, callId, name, args) { + console.log('[JS] tool开始 name=' + name + ' call=' + callId + ' id=' + msgId); + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + var contentDiv = wrapper.querySelector('.message-content'); + var buf = messageBuffer[msgId]; + + var chip = buildToolChip(callId, name, args, {streaming: true, ok: null}); + + // 🌟 插入到时间线当前位置(思考/正文之间,按事件顺序); + // 非流式消息(无 messageBuffer)退回气泡底部 + finalizeOpenThinkingBlocks(msgId); // 工具开始 → 思考段就地定格「已完成深度思考」 + var replyDiv = contentDiv.querySelector('.reply-content'); + if (replyDiv && buf) { + ensureTimeline(wrapper, buf); + replyDiv.insertBefore(chip, buf.typingEl); + } else { + var actionBar = contentDiv.querySelector('.message-actions'); + if (actionBar) contentDiv.insertBefore(chip, actionBar); + else contentDiv.appendChild(chip); + } + scheduleStreamingRender(msgId); // 触发一次滚动 +} + +function toolExecutionUpdated(msgId, callId, text) { + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + var chip = _findChip(wrapper, callId); + if (!chip) return; + chip.__liveBuf = (chip.__liveBuf || '') + text; + if (chip.__liveBuf.length > 4000) { + chip.__liveBuf = chip.__liveBuf.slice(-4000); + } + // 只有展开时才实时刷新输出(收起时零 DOM 开销) + if (chip.open) { + var live = chip.querySelector('.tool-chip-live'); + live.style.display = 'block'; + live.textContent = chip.__liveBuf; + live.previousElementSibling.style.display = 'block'; + var body = chip.querySelector('.tool-chip-body'); + body.scrollTop = body.scrollHeight; + } +} + +function toolExecutionTimed(msgId, callId, elapsed, timeout) { + // 🆕 bash 运行中每秒读秒(Python 每秒推一次 = 唯一事实源): + // 摘要行显示 ⏱ 0/10s → 1/10s → 2/10s ... + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + var chip = _findChip(wrapper, callId); + if (!chip) return; + var t = chip.querySelector('.tool-chip-livetimer'); + if (!t) { + t = document.createElement('span'); + t.className = 'tool-chip-livetimer'; + var sum = chip.__sum || chip.querySelector('summary'); + if (sum) sum.appendChild(t); + } + t.textContent = '\u23f1 ' + elapsed + '/' + timeout + 's'; +} + +function toolExecutionFinished(msgId, callId, name, ok, text) { + console.log('[JS] tool完成 name=' + name + ' ok=' + ok + ' 结果=' + (text ? text.length : 0) + 'c call=' + callId); + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + var chip = _findChip(wrapper, callId); + if (!chip) return; + // 🆕 读秒停止:移除运行中计时,换成完成/超时徽章(_updateChipTimingSummary) + var _lt = chip.querySelector('.tool-chip-livetimer'); + if (_lt) _lt.remove(); + chip.classList.remove('streaming'); + var status = chip.querySelector('.tool-chip-status'); + var outText = text || chip.__liveBuf || ''; + if (status) { + status.classList.remove('running'); + status.classList.add(ok ? 'ok' : 'fail'); + status.textContent = ok ? '✓ 完成' : '✗ 失败'; + } + // 摘要显示结果首行(收起时也能看到「执行了什么 + 得到什么」) + var brief = chip.querySelector('.tool-chip-brief'); + if (ok && brief && outText) { + var firstLine = outText.split('\n')[0].replace(/\s+/g, ' ').trim(); + if (firstLine.length > 60) firstLine = firstLine.slice(0, 60) + '…'; + brief.textContent = firstLine; + brief.classList.add('done'); + } + // 完整结果入正文 —— 不再依赖 chip 当前是否展开(修复「结束后展开为空」bug); + // 长结果默认显示尾部 4000 字 + 「展开完整输出」按钮 + if (outText) { + _renderToolResultBody(chip, outText); + _updateChipTimingSummary(chip, outText); + } + scheduleStreamingRender(msgId); +} + +// ==================== 时间线恢复 / 历史渲染(持久化的 agent 时间线) ==================== +// entries: [{"t":"think","text"}, {"t":"text","text"}, +// {"t":"tool","id","name","args","ok":null|bool,"result"}] +// liveMode=true → 切回进行中的会话:块按流式状态建立,后续 token 无缝续流 +// liveMode=false → 历史消息:静态渲染(思考折叠 / chip 定格 / 文本完整解析) +function renderTimelineEntries(msgId, entries, liveMode) { + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + var contentDiv = wrapper.querySelector('.message-content'); + var replyDiv = contentDiv.querySelector('.reply-content'); + if (!replyDiv) return; + var buf = messageBuffer[msgId]; + + if (liveMode && buf) { + ensureTimeline(wrapper, buf); + } else if (!liveMode) { + // 静态:清掉 createMessage 预先渲染的聚合文本(时间线接管展示) + replyDiv.innerHTML = ''; + } + + var textAll = '', thinkAll = ''; + entries.forEach(function(e) { + if (e.t === 'think') { + var block = makeThinkBlock(false, liveMode ? '深度思考' : '已完成深度思考'); + var tc = block.querySelector('.think-content'); + if (liveMode) { + block.classList.add('streaming-think'); + tc.__buf = e.text || ''; + buf.thinkSegs.push(tc); + replyDiv.insertBefore(block, buf.typingEl); + } else { + tc.innerHTML = safeHtml('
' + + marked.parse(e.text || '') + '
'); + replyDiv.appendChild(block); + } + thinkAll += e.text || ''; + } else if (e.t === 'text') { + var seg = document.createElement('div'); + seg.className = 'md-segment markdown-body'; + if (liveMode) { + seg.__buf = e.text || ''; + buf.textSegs.push(seg); + if (seg.__buf) { + // ★ 同 appendToken:带内容再插入,规避 :empty 布局失效 + mdStateOf(seg); + renderMarkdownStreaming(seg, seg.__buf); + } + replyDiv.insertBefore(seg, buf.typingEl); + } else { + seg.innerHTML = safeHtml(marked.parse(e.text || '')); + replyDiv.appendChild(seg); + } + textAll += e.text || ''; + } else if (e.t === 'tool') { + var chip = buildToolChip(e.id || '', e.name, e.args || '', { + streaming: liveMode && e.ok === null, + ok: e.ok === null ? null : !!e.ok, + result: e.result || '' + }); + if (liveMode) replyDiv.insertBefore(chip, buf.typingEl); + else replyDiv.appendChild(chip); + } + }); + + if (liveMode && buf) { + // 缓冲区对齐:后续流式事件在此基础上继续累积(复制/入库不丢内容) + buf.content = textAll; + buf.reasoning = thinkAll; + // ★ 恢复的内容立即同步上屏(不等待 rAF/timer) + syncRenderThrottled(msgId, 0); + scheduleStreamingRender(msgId); + } + diagEvent(liveMode ? 'restore' : 'history', + { id: msgId, entries: entries.length, text: textAll.length, + think: thinkAll.length, buf: !!buf }); +} + +// 切回进行中的会话:恢复时间线(后续 token 无缝续流) +function restoreStreamingTimeline(msgId, timelineJson) { + try { console.log('[JS] restoreTimeline id=' + msgId + ' 条目=' + (JSON.parse(timelineJson) || []).length); } catch (e) {} + try { + var entries = JSON.parse(timelineJson); + if (Array.isArray(entries) && entries.length) { + renderTimelineEntries(msgId, entries, true); + } + } catch (e) { + console.error('[JS]: restoreStreamingTimeline 解析失败', e); + } +} + +// 历史消息:静态时间线渲染 +function renderTimelineHistory(msgId, timelineJson) { + try { console.log('[JS] historyTimeline id=' + msgId + ' 条目=' + (JSON.parse(timelineJson) || []).length); } catch (e) {} + try { + var entries = JSON.parse(timelineJson); + if (Array.isArray(entries) && entries.length) { + renderTimelineEntries(msgId, entries, false); + // 删除 buffer → finishMessage 不再全量重渲(避免破坏时间线 DOM), + // 但仍会执行代码高亮/滚动等收尾 + delete messageBuffer[msgId]; + } + } catch (e) { + console.error('[JS]: renderTimelineHistory 解析失败', e); + } +} + +// ==================== 上下文压缩气泡(照抄深度思考气泡类配置,仅改名字和显示内容) ==================== +// 🌟 不再自写结构 —— 复用 makeThinkBlock / .think-block / .streaming-think: +// 执行中:蓝色呼吸 + 三点动画(与深度思考完全一致) +// 位置:当前消息的 .reply-content 时间线内(流式光标之前)—— 时间线位置,不锁底 +// 限高:.think-content max-height 400px + 滚动(CSS 已做) +// 完成:原地折叠,label 显示 前→后 token,内容为摘要全文(.think-inner,同深度思考固化) +function _fmtK(n) { + if (n === null || n === undefined) return '?'; + return (n / 1000).toFixed(1) + 'k'; +} + +function compactionStarted(msgId, path) { + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + wrapper.classList.add('streaming'); + var buf = messageBuffer[msgId] || null; + var tl, typingEl; + if (buf) { + tl = ensureTimeline(wrapper, buf); // 惰性把 .reply-content 变时间线(建流式光标) + typingEl = buf.typingEl; + } else { + tl = wrapper.querySelector('.reply-content'); + typingEl = tl ? tl.querySelector('.streaming-typing') : null; + } + if (!tl) return; + finalizeOpenThinkingBlocks(msgId); // 防御:压缩开始 → 若有进行中的思考段也先定格 + // —— 与 appendReasoning 新建思考块完全同款 —— + var block = makeThinkBlock(false, '上下文压缩'); + block.classList.add('streaming-think', 'compaction-think'); + var inner = document.createElement('div'); + inner.className = 'think-inner'; + inner.textContent = '正在生成摘要…'; + block.querySelector('.think-content').appendChild(inner); + if (typingEl && typingEl.parentNode === tl) { + tl.insertBefore(block, typingEl); // 时间线位置:流式光标之前 + } else { + tl.appendChild(block); + } + reportWebScroll(); +} + +function compactionFinished(msgId, payload) { + payload = payload || {}; + var wrapper = document.getElementById(msgId); + if (!wrapper) return; + // 精确锁定「仍在执行中」的压缩气泡(最后一条)——一轮内多次压缩时 + // 不会误定/重复定格旧气泡;都已完成时回退到最后一条(幂等) + var blocks = wrapper.querySelectorAll('.compaction-think'); + var block = null; + for (var bi = blocks.length - 1; bi >= 0; bi--) { + if (blocks[bi].classList.contains('streaming-think')) { block = blocks[bi]; break; } + } + if (!block && blocks.length) block = blocks[blocks.length - 1]; + if (!block) return; // 气泡未建(非激活会话)→ 丢弃 + // —— 与 finishTimelineMessage 固化思考块同款 —— + block.classList.remove('streaming-think'); + if (block.open) block.open = false; + var lab = block.querySelector('.think-label'); + var dur = (payload.duration_ms !== null && payload.duration_ms !== undefined) + ? ' · ' + (payload.duration_ms / 1000).toFixed(1) + 's' : ''; + if (lab) { + lab.textContent = payload.failed + ? '上下文压缩 · 未执行' + dur + : '已完成上下文压缩 · ' + _fmtK(payload.before) + + ' → ' + _fmtK(payload.after) + dur; + } + var tc = block.querySelector('.think-content'); + if (tc) { + tc.innerHTML = safeHtml('
' + + marked.parse(payload.summary || '(无摘要内容)') + '
'); + delete tc.__mdState; + } + reportWebScroll(); +} + +// ==================== 系统提示(居中单行) ==================== +function showSystemNote(text) { + var note = document.createElement('div'); + note.className = 'system-note'; + note.textContent = text; + var anchor = document.getElementById('scroll-anchor'); + if (anchor && anchor.parentNode === chatContainer) { + chatContainer.insertBefore(note, anchor); + } else { + chatContainer.appendChild(note); + } + reportWebScroll(); +} + +// ==================== 滚动控制 ==================== +var _softScrollPending = 0; +function softScroll() { + // 🌟 rAF 节流:历史记录批量渲染时每帧最多滚一次 + if (_softScrollPending) return; + _softScrollPending = requestAnimationFrame(function() { + _softScrollPending = 0; + var anchor = document.getElementById('scroll-anchor'); + if (anchor) { + anchor.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } + }); +} + +// ==================== 登录/会话加载界面 ==================== +function showLoadingOverlay() { + var el = document.getElementById('session-loading'); + if (!el) return; + el.classList.remove('hide'); + el.style.display = 'flex'; +} +function hideLoadingOverlay() { + var el = document.getElementById('session-loading'); + if (!el) return; + el.classList.add('hide'); + setTimeout(function() { el.style.display = 'none'; }, 480); +} + +// ==================== 历史记录与视图控制 ==================== +function clearChat() { + var bubbles = chatContainer.querySelectorAll('.message-wrapper, .system-note'); + bubbles.forEach(function(b) { b.remove(); }); + + // 🌟 修复:attachmentMetaStore 之前漏清,切会话后附件卡片会指向旧元数据 + messageBuffer = {}; + longTextStore = {}; + finalContentStore = {}; + attachmentMetaStore = {}; + + // 🆕 P1-01:清渲染窗口状态机(游标/缓存/未决请求/代次;配置模式与大小保留) + if (typeof rwState !== 'undefined' && rwState && typeof RenderWindowState !== 'undefined') { + RenderWindowState.clear(rwState); + rwUpdateLoadButtons(); + } + + var welcome = document.querySelector('.welcome-screen'); + if (welcome) welcome.style.display = 'none'; + reportWebScroll(); +} + +function deleteMessage(msgId) { + var wrapper = document.getElementById(msgId); + if (wrapper) { + wrapper.style.transition = "opacity 0.3s ease, transform 0.3s ease"; + wrapper.style.opacity = "0"; + wrapper.style.transform = "translateY(-10px)"; + setTimeout(function() { wrapper.remove(); }, 300); + } + delete messageBuffer[msgId]; + delete longTextStore[msgId]; + delete finalContentStore[msgId]; + setTimeout(reportWebScroll, 350); +} + +function showWelcome() { + var welcome = document.querySelector('.welcome-screen'); + if (welcome) welcome.style.display = 'flex'; + reportWebScroll(); +} + +// ==================== 历史记录专用:插入思考块 ==================== +function insertThinkBlock(msgId, reasoningText) { + var wrapper = document.getElementById(msgId); + if (!wrapper) { + console.error('[JS]: 找不到消息气泡 ' + msgId); + return; + } + + var contentDiv = wrapper.querySelector('.message-content'); + var replyDiv = contentDiv.querySelector('.reply-content'); + + var thinkBlock = makeThinkBlock(false, '已完成深度思考'); + var thinkContent = thinkBlock.querySelector('.think-content'); + thinkContent.innerHTML = safeHtml('
' + marked.parse(reasoningText) + '
'); + + contentDiv.insertBefore(thinkBlock, replyDiv); +} + +// ==================== 🆕 P1-01 双向渲染窗口(DOM 层;状态机见 render_window.js) ==================== +var rwState = null; // RenderWindowState 实例(rwApplyConfig 注入配置后创建) + +function rwApplyConfig(cfg) { + rwState = RenderWindowState.create(cfg || {}); +} + +/* 一轮窗口化加载开始:清屏 + 重同步 (session, generation)。 */ +function rwBegin(sessionId, generation, total) { + clearChat(); + if (!rwState) rwState = RenderWindowState.create({}); + RenderWindowState.clear(rwState); + rwState.sessionId = sessionId; + rwState.generation = (generation | 0); + if (total <= 0) rwUpdateLoadButtons(); +} + +/* 初始窗口就绪:状态机登记 + 入口按钮 + 对齐底部(与既开开会话在最新处的行为一致)。 */ +function rwInitWindow(payload) { + if (!rwState || !payload) return; + RenderWindowState.initFullChain(rwState, payload); + rwUpdateLoadButtons(); + var anchor = document.getElementById('scroll-anchor'); + if (anchor) anchor.scrollIntoView({ behavior: 'auto', block: 'end' }); + reportWebScroll(); +} + +/* 分页响应:state 机校验 (session, generation, 未决请求);stale 丢弃并清理已渲染节点。 */ +function rwPageResponse(payload) { + if (!rwState || !payload) return; + var req = { direction: payload.direction, boundaryId: payload.boundaryId }; + var res = RenderWindowState.applyPage(rwState, req, payload); + if (res.stale) { + (payload.items || []).forEach(function(it) { rwRemoveMessageDom(it.id); }); + rwUpdateLoadButtons(); + return; + } + if (res.side === 'older') rwApplyOlder(res); + else rwApplyNewer(res); +} + +/* 向上换页:锚点捕获 → 新页移到头部 → 裁尾 → 锚点恢复(误差≤2px)→ 入口更新。 */ +function rwApplyOlder(res) { + var anchor = rwCaptureAnchor(); + var oldScroll = getScroller().scrollTop; + var firstExisting = chatContainer.querySelector('.message-wrapper'); + res.addedIds.forEach(function(id) { + var el = document.getElementById(id); + if (el) chatContainer.insertBefore(el, firstExisting); + }); + res.removedIds.forEach(rwRemoveMessageDom); + if (anchor) { + var el = document.getElementById(anchor.msgId); + if (el) { + var newTop = el.getBoundingClientRect().top + window.scrollY; + if (oldScroll <= 1) { + // 绝对顶部:停在顶部露出新页(自动模式会沿顶部继续补页) + getScroller().scrollTop = 0; + } else { + getScroller().scrollTop = oldScroll + (newTop - anchor.docTop); + } + } + } + rwUpdateLoadButtons(); + reportWebScroll(); + // 自动模式:停在顶部且还有旧页 → 沿顶部继续补页(pending 防并发,逐页推进) + if (rwState && rwState.mode === 'auto' && getScroller().scrollTop <= 1 && + RenderWindowState.canRequest(rwState, 'older')) { + setTimeout(function() { if (typeof rwAutoCheck === 'function') rwAutoCheck(); }, 60); + } +} + +/* 向下换页:新页已在尾部 → 裁头 → 锚点恢复(无跳动)。 */ +function rwApplyNewer(res) { + var anchor = rwCaptureAnchor(); + var oldScroll = getScroller().scrollTop; + res.removedIds.forEach(rwRemoveMessageDom); + if (anchor) { + var el = document.getElementById(anchor.msgId); + if (el) { + var newTop = el.getBoundingClientRect().top + window.scrollY; + getScroller().scrollTop = oldScroll + (newTop - anchor.docTop); + } + } + rwUpdateLoadButtons(); + reportWebScroll(); +} + +/* 新消息追加进窗口(发送用户消息 / 助手占位 / 切回续流);超限裁旧端。 + * chainIndex/chainLen 为 -1 表示未知(安全降级)。带 streaming 类的消息自动接管流式保护。 */ +function rwNoteLive(sessionId, generation, msgId, chainIndex, chainLen) { + if (!rwState || rwState.sessionId !== sessionId || rwState.generation !== generation) return; + if (chainLen !== undefined && chainLen !== null && chainLen >= 0) { + rwState.chainLen = chainLen | 0; + } + var ix = (chainIndex === undefined || chainIndex === null || chainIndex < 0) ? -1 : (chainIndex | 0); + var r = RenderWindowState.noteLive(rwState, msgId, ix); + var el = document.getElementById(msgId); + if (el && el.classList.contains('streaming')) { + RenderWindowState.noteStream(rwState, msgId); + } + (r.removedIds || []).forEach(rwRemoveMessageDom); + rwUpdateLoadButtons(); +} + +/* 发起换页请求(双引擎同构:QtWebChannel slot / WebView2 postMessage 同名方法)。 */ +function rwRequestPage(direction) { + if (!rwState) return; + var req = RenderWindowState.beginRequest(rwState, direction); + if (!req) return; + if (window.bridge && typeof window.bridge.onRequestWindowPage === 'function') { + window.bridge.onRequestWindowPage(rwState.sessionId, req.direction, req.boundaryId, rwState.generation); + } +} + +/* 滚动驱动:双模式底部自动恢复新页;自动模式顶部自动加载旧页。 */ +function rwAutoCheck() { + if (!rwState) return; + if (RenderWindowState.canRequest(rwState, 'newer') && isNearBottom()) { + rwRequestPage('newer'); + } else if (rwState.mode === 'auto' && getScroller().scrollTop <= 1 && + RenderWindowState.canRequest(rwState, 'older')) { + rwRequestPage('older'); + } +} + +/* 锚点:换页前首个可见消息的 id + 文档坐标 top。 */ +function rwCaptureAnchor() { + var top = getScroller().scrollTop; + var bot = top + window.innerHeight; + var els = chatContainer.querySelectorAll('.message-wrapper'); + for (var i = 0; i < els.length; i++) { + var r = els[i].getBoundingClientRect(); + if (r.bottom > top && r.top < bot) { + return { msgId: els[i].id, docTop: r.top + window.scrollY, offset: Math.max(0, top - r.top) }; + } + } + return null; +} + +/* 从 DOM 移除一条消息并清理全部相关存储(活动流不受裁剪,状态机保证)。 */ +function rwRemoveMessageDom(msgId) { + var wrapper = document.getElementById(msgId); + if (wrapper) wrapper.remove(); + delete messageBuffer[msgId]; + delete longTextStore[msgId]; + delete finalContentStore[msgId]; + delete attachmentMetaStore[msgId]; +} + +/* 加载入口:固定在 chat-container 首/尾;无更多消息时隐藏。 */ +function rwEnsureLoadButtons() { + if (!document.getElementById('load-older')) { + var b = document.createElement('div'); + b.id = 'load-older'; + b.className = 'load-window-btn'; + b.hidden = true; + b.innerText = '⌃ 加载更早消息'; + b.addEventListener('click', function() { rwRequestPage('older'); }); + chatContainer.appendChild(b); + } + if (!document.getElementById('load-newer')) { + var n = document.createElement('div'); + n.id = 'load-newer'; + n.className = 'load-window-btn'; + n.hidden = true; + n.innerText = '⌄ 加载更新消息'; + n.addEventListener('click', function() { rwRequestPage('newer'); }); + chatContainer.appendChild(n); + } + chatContainer.insertBefore(document.getElementById('load-older'), chatContainer.firstChild); + chatContainer.appendChild(document.getElementById('load-newer')); +} + +function rwUpdateLoadButtons() { + if (!rwState) return; + rwEnsureLoadButtons(); + document.getElementById('load-older').hidden = !rwState.hasMoreOlder; + document.getElementById('load-newer').hidden = !rwState.hasMoreNewer; +} + +// ==================== JS 引擎就绪标志 ==================== +window.jsReady = true; +console.log('[JS]: 引擎已就绪'); diff --git a/ui/web/dompurify.min.js b/ui/web/dompurify.min.js new file mode 100644 index 0000000..b472a86 --- /dev/null +++ b/ui/web/dompurify.min.js @@ -0,0 +1,3 @@ +/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=R(Array.prototype.forEach),m=R(Array.prototype.lastIndexOf),p=R(Array.prototype.pop),f=R(Array.prototype.push),d=R(Array.prototype.splice),h=R(String.prototype.toLowerCase),g=R(String.prototype.toString),T=R(String.prototype.match),y=R(String.prototype.replace),E=R(String.prototype.indexOf),A=R(String.prototype.trim),_=R(Object.prototype.hasOwnProperty),S=R(RegExp.prototype.test),b=(N=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:h;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function O(e){for(let t=0;t/gm),G=a(/\$\{[\w\W]*/gm),Y=a(/^data-[\-\w.\u00B7-\uFFFF]+$/),j=a(/^aria-[\-\w]+$/),X=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),q=a(/^(?:\w+script|data):/i),$=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),K=a(/^html$/i),V=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var Z=Object.freeze({__proto__:null,ARIA_ATTR:j,ATTR_WHITESPACE:$,CUSTOM_ELEMENT:V,DATA_ATTR:Y,DOCTYPE_NAME:K,ERB_EXPR:W,IS_ALLOWED_URI:X,IS_SCRIPT_OR_DATA:q,MUSTACHE_EXPR:B,TMPLIT_EXPR:G});const J=1,Q=3,ee=7,te=8,ne=9,oe=function(){return"undefined"==typeof window?null:window};var re=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:oe();const o=e=>t(e);if(o.version="3.2.4",o.removed=[],!n||!n.document||n.document.nodeType!==ne||!n.Element)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:R,Element:O,NodeFilter:B,NamedNodeMap:W=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:G,DOMParser:Y,trustedTypes:j}=n,q=O.prototype,$=v(q,"cloneNode"),V=v(q,"remove"),re=v(q,"nextSibling"),ie=v(q,"childNodes"),ae=v(q,"parentNode");if("function"==typeof N){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let le,ce="";const{implementation:se,createNodeIterator:ue,createDocumentFragment:me,getElementsByTagName:pe}=r,{importNode:fe}=a;let de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof e&&"function"==typeof ae&&se&&void 0!==se.createHTMLDocument;const{MUSTACHE_EXPR:he,ERB_EXPR:ge,TMPLIT_EXPR:Te,DATA_ATTR:ye,ARIA_ATTR:Ee,IS_SCRIPT_OR_DATA:Ae,ATTR_WHITESPACE:_e,CUSTOM_ELEMENT:Se}=Z;let{IS_ALLOWED_URI:be}=Z,Ne=null;const Re=w({},[...L,...C,...x,...k,...U]);let we=null;const Oe=w({},[...z,...P,...H,...F]);let De=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ve=null,Le=null,Ce=!0,xe=!0,Me=!1,ke=!0,Ie=!1,Ue=!0,ze=!1,Pe=!1,He=!1,Fe=!1,Be=!1,We=!1,Ge=!0,Ye=!1,je=!0,Xe=!1,qe={},$e=null;const Ke=w({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Ve=null;const Ze=w({},["audio","video","img","source","image","track"]);let Je=null;const Qe=w({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),et="http://www.w3.org/1998/Math/MathML",tt="http://www.w3.org/2000/svg",nt="http://www.w3.org/1999/xhtml";let ot=nt,rt=!1,it=null;const at=w({},[et,tt,nt],g);let lt=w({},["mi","mo","mn","ms","mtext"]),ct=w({},["annotation-xml"]);const st=w({},["title","style","font","a","script"]);let ut=null;const mt=["application/xhtml+xml","text/html"];let pt=null,ft=null;const dt=r.createElement("form"),ht=function(e){return e instanceof RegExp||e instanceof Function},gt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!ft||ft!==e){if(e&&"object"==typeof e||(e={}),e=D(e),ut=-1===mt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,pt="application/xhtml+xml"===ut?g:h,Ne=_(e,"ALLOWED_TAGS")?w({},e.ALLOWED_TAGS,pt):Re,we=_(e,"ALLOWED_ATTR")?w({},e.ALLOWED_ATTR,pt):Oe,it=_(e,"ALLOWED_NAMESPACES")?w({},e.ALLOWED_NAMESPACES,g):at,Je=_(e,"ADD_URI_SAFE_ATTR")?w(D(Qe),e.ADD_URI_SAFE_ATTR,pt):Qe,Ve=_(e,"ADD_DATA_URI_TAGS")?w(D(Ze),e.ADD_DATA_URI_TAGS,pt):Ze,$e=_(e,"FORBID_CONTENTS")?w({},e.FORBID_CONTENTS,pt):Ke,ve=_(e,"FORBID_TAGS")?w({},e.FORBID_TAGS,pt):{},Le=_(e,"FORBID_ATTR")?w({},e.FORBID_ATTR,pt):{},qe=!!_(e,"USE_PROFILES")&&e.USE_PROFILES,Ce=!1!==e.ALLOW_ARIA_ATTR,xe=!1!==e.ALLOW_DATA_ATTR,Me=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ke=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ie=e.SAFE_FOR_TEMPLATES||!1,Ue=!1!==e.SAFE_FOR_XML,ze=e.WHOLE_DOCUMENT||!1,Fe=e.RETURN_DOM||!1,Be=e.RETURN_DOM_FRAGMENT||!1,We=e.RETURN_TRUSTED_TYPE||!1,He=e.FORCE_BODY||!1,Ge=!1!==e.SANITIZE_DOM,Ye=e.SANITIZE_NAMED_PROPS||!1,je=!1!==e.KEEP_CONTENT,Xe=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||X,ot=e.NAMESPACE||nt,lt=e.MATHML_TEXT_INTEGRATION_POINTS||lt,ct=e.HTML_INTEGRATION_POINTS||ct,De=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(De.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(De.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(De.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ie&&(xe=!1),Be&&(Fe=!0),qe&&(Ne=w({},U),we=[],!0===qe.html&&(w(Ne,L),w(we,z)),!0===qe.svg&&(w(Ne,C),w(we,P),w(we,F)),!0===qe.svgFilters&&(w(Ne,x),w(we,P),w(we,F)),!0===qe.mathMl&&(w(Ne,k),w(we,H),w(we,F))),e.ADD_TAGS&&(Ne===Re&&(Ne=D(Ne)),w(Ne,e.ADD_TAGS,pt)),e.ADD_ATTR&&(we===Oe&&(we=D(we)),w(we,e.ADD_ATTR,pt)),e.ADD_URI_SAFE_ATTR&&w(Je,e.ADD_URI_SAFE_ATTR,pt),e.FORBID_CONTENTS&&($e===Ke&&($e=D($e)),w($e,e.FORBID_CONTENTS,pt)),je&&(Ne["#text"]=!0),ze&&w(Ne,["html","head","body"]),Ne.table&&(w(Ne,["tbody"]),delete ve.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw b('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');le=e.TRUSTED_TYPES_POLICY,ce=le.createHTML("")}else void 0===le&&(le=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(j,c)),null!==le&&"string"==typeof ce&&(ce=le.createHTML(""));i&&i(e),ft=e}},Tt=w({},[...C,...x,...M]),yt=w({},[...k,...I]),Et=function(e){f(o.removed,{element:e});try{ae(e).removeChild(e)}catch(t){V(e)}},At=function(e,t){try{f(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(Fe||Be)try{Et(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},_t=function(e){let t=null,n=null;if(He)e=""+e;else{const t=T(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===ut&&ot===nt&&(e=''+e+"");const o=le?le.createHTML(e):e;if(ot===nt)try{t=(new Y).parseFromString(o,ut)}catch(e){}if(!t||!t.documentElement){t=se.createDocument(ot,"template",null);try{t.documentElement.innerHTML=rt?ce:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),ot===nt?pe.call(t,ze?"html":"body")[0]:ze?t.documentElement:i},St=function(e){return ue.call(e.ownerDocument||e,e,B.SHOW_ELEMENT|B.SHOW_COMMENT|B.SHOW_TEXT|B.SHOW_PROCESSING_INSTRUCTION|B.SHOW_CDATA_SECTION,null)},bt=function(e){return e instanceof G&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof W)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Nt=function(e){return"function"==typeof R&&e instanceof R};function Rt(e,t,n){u(e,(e=>{e.call(o,t,n,ft)}))}const wt=function(e){let t=null;if(Rt(de.beforeSanitizeElements,e,null),bt(e))return Et(e),!0;const n=pt(e.nodeName);if(Rt(de.uponSanitizeElement,e,{tagName:n,allowedTags:Ne}),e.hasChildNodes()&&!Nt(e.firstElementChild)&&S(/<[/\w]/g,e.innerHTML)&&S(/<[/\w]/g,e.textContent))return Et(e),!0;if(e.nodeType===ee)return Et(e),!0;if(Ue&&e.nodeType===te&&S(/<[/\w]/g,e.data))return Et(e),!0;if(!Ne[n]||ve[n]){if(!ve[n]&&Dt(n)){if(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n))return!1;if(De.tagNameCheck instanceof Function&&De.tagNameCheck(n))return!1}if(je&&!$e[n]){const t=ae(e)||e.parentNode,n=ie(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=$(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,re(e))}}}return Et(e),!0}return e instanceof O&&!function(e){let t=ae(e);t&&t.tagName||(t={namespaceURI:ot,tagName:"template"});const n=h(e.tagName),o=h(t.tagName);return!!it[e.namespaceURI]&&(e.namespaceURI===tt?t.namespaceURI===nt?"svg"===n:t.namespaceURI===et?"svg"===n&&("annotation-xml"===o||lt[o]):Boolean(Tt[n]):e.namespaceURI===et?t.namespaceURI===nt?"math"===n:t.namespaceURI===tt?"math"===n&&ct[o]:Boolean(yt[n]):e.namespaceURI===nt?!(t.namespaceURI===tt&&!ct[o])&&!(t.namespaceURI===et&&!lt[o])&&!yt[n]&&(st[n]||!Tt[n]):!("application/xhtml+xml"!==ut||!it[e.namespaceURI]))}(e)?(Et(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!S(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ie&&e.nodeType===Q&&(t=e.textContent,u([he,ge,Te],(e=>{t=y(t,e," ")})),e.textContent!==t&&(f(o.removed,{element:e.cloneNode()}),e.textContent=t)),Rt(de.afterSanitizeElements,e,null),!1):(Et(e),!0)},Ot=function(e,t,n){if(Ge&&("id"===t||"name"===t)&&(n in r||n in dt))return!1;if(xe&&!Le[t]&&S(ye,t));else if(Ce&&S(Ee,t));else if(!we[t]||Le[t]){if(!(Dt(e)&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,e)||De.tagNameCheck instanceof Function&&De.tagNameCheck(e))&&(De.attributeNameCheck instanceof RegExp&&S(De.attributeNameCheck,t)||De.attributeNameCheck instanceof Function&&De.attributeNameCheck(t))||"is"===t&&De.allowCustomizedBuiltInElements&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n)||De.tagNameCheck instanceof Function&&De.tagNameCheck(n))))return!1}else if(Je[t]);else if(S(be,y(n,_e,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==E(n,"data:")||!Ve[e]){if(Me&&!S(Ae,y(n,_e,"")));else if(n)return!1}else;return!0},Dt=function(e){return"annotation-xml"!==e&&T(e,Se)},vt=function(e){Rt(de.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||bt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:we,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=pt(a);let m="value"===a?c:A(c);if(n.attrName=s,n.attrValue=m,n.keepAttr=!0,n.forceKeepAttr=void 0,Rt(de.uponSanitizeAttribute,e,n),m=n.attrValue,!Ye||"id"!==s&&"name"!==s||(At(a,e),m="user-content-"+m),Ue&&S(/((--!?|])>)|<\/(style|title)/i,m)){At(a,e);continue}if(n.forceKeepAttr)continue;if(At(a,e),!n.keepAttr)continue;if(!ke&&S(/\/>/i,m)){At(a,e);continue}Ie&&u([he,ge,Te],(e=>{m=y(m,e," ")}));const f=pt(e.nodeName);if(Ot(f,s,m)){if(le&&"object"==typeof j&&"function"==typeof j.getAttributeType)if(l);else switch(j.getAttributeType(f,s)){case"TrustedHTML":m=le.createHTML(m);break;case"TrustedScriptURL":m=le.createScriptURL(m)}try{l?e.setAttributeNS(l,a,m):e.setAttribute(a,m),bt(e)?Et(e):p(o.removed)}catch(e){}}}Rt(de.afterSanitizeAttributes,e,null)},Lt=function e(t){let n=null;const o=St(t);for(Rt(de.beforeSanitizeShadowDOM,t,null);n=o.nextNode();)Rt(de.uponSanitizeShadowNode,n,null),wt(n),vt(n),n.content instanceof s&&e(n.content);Rt(de.afterSanitizeShadowDOM,t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(rt=!e,rt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Nt(e)){if("function"!=typeof e.toString)throw b("toString is not a function");if("string"!=typeof(e=e.toString()))throw b("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Pe||gt(t),o.removed=[],"string"==typeof e&&(Xe=!1),Xe){if(e.nodeName){const t=pt(e.nodeName);if(!Ne[t]||ve[t])throw b("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof R)n=_t("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===J&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!Fe&&!Ie&&!ze&&-1===e.indexOf("<"))return le&&We?le.createHTML(e):e;if(n=_t(e),!n)return Fe?null:We?ce:""}n&&He&&Et(n.firstChild);const c=St(Xe?e:n);for(;i=c.nextNode();)wt(i),vt(i),i.content instanceof s&&Lt(i.content);if(Xe)return e;if(Fe){if(Be)for(l=me.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(we.shadowroot||we.shadowrootmode)&&(l=fe.call(a,l,!0)),l}let m=ze?n.outerHTML:n.innerHTML;return ze&&Ne["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&S(K,n.ownerDocument.doctype.name)&&(m="\n"+m),Ie&&u([he,ge,Te],(e=>{m=y(m,e," ")})),le&&We?le.createHTML(m):m},o.setConfig=function(){gt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Pe=!0},o.clearConfig=function(){ft=null,Pe=!1},o.isValidAttribute=function(e,t,n){ft||gt({});const o=pt(e),r=pt(t);return Ot(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&f(de[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=m(de[e],t);return-1===n?void 0:d(de[e],n,1)[0]}return p(de[e])},o.removeHooks=function(e){de[e]=[]},o.removeAllHooks=function(){de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return re})); +//# sourceMappingURL=purify.min.js.map diff --git a/ui/web/highlight/atom-one-dark.min.css b/ui/web/highlight/atom-one-dark.min.css new file mode 100644 index 0000000..5344ee3 --- /dev/null +++ b/ui/web/highlight/atom-one-dark.min.css @@ -0,0 +1 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline} \ No newline at end of file diff --git a/ui/web/highlight/highlight.min.js b/ui/web/highlight/highlight.min.js new file mode 100644 index 0000000..5d699ae --- /dev/null +++ b/ui/web/highlight/highlight.min.js @@ -0,0 +1,1213 @@ +/*! + Highlight.js v11.9.0 (git: f47103d4f1) + (c) 2006-2023 undefined and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";function e(n){ +return n instanceof Map?n.clear=n.delete=n.set=()=>{ +throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ +const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) +})),n}class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] +;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope +;class r{constructor(e,n){ +this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ +this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ +if(e.startsWith("language:"))return e.replace("language:","language-") +;if(e.includes(".")){const t=e.split(".") +;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") +}return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} +closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const s=(e={})=>{const n={children:[]} +;return Object.assign(n,e),n};class o{constructor(){ +this.rootNode=s(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const n=s({scope:e}) +;this.add(n),this.stack.push(n)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ +return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), +n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} +addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ +this.closeNode()}__addSublanguage(e,n){const t=e.root +;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ +return new r(this,this.options).value()}finalize(){ +return this.closeAllNodes(),!0}}function c(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} +function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} +function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ +const n=e[e.length-1] +;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} +})(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} +function p(e){return RegExp(e.toString()+"|").exec("").length-1} +const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function h(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t +;let a=c(e),i="";for(;a.length>0;){const e=_.exec(a);if(!e){i+=a;break} +i+=a.substring(0,e.index), +a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], +"("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} +const f="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},O={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},x=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, +contains:[]},t);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:b(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},M=x("//","$"),S=x("/\\*","\\*/"),A=x("#","$");var C=Object.freeze({ +__proto__:null,APOS_STRING_MODE:O,BACKSLASH_ESCAPE:v,BINARY_NUMBER_MODE:{ +scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:x, +C_BLOCK_COMMENT_MODE:S,C_LINE_COMMENT_MODE:M,C_NUMBER_MODE:{scope:"number", +begin:N,relevance:0},C_NUMBER_RE:N,END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}}),HASH_COMMENT_MODE:A,IDENT_RE:f, +MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+E,relevance:0}, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y, +PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, +end:/\/[gimuy]*/,contains:[v,{begin:/\[/,end:/\]/,relevance:0,contains:[v]}]}, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const n=/^#![ ]*\// +;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, +end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, +TITLE_MODE:{scope:"title",begin:f,relevance:0},UNDERSCORE_IDENT_RE:E, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0}});function T(e,n){ +"."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ +n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function I(e,n){ +Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function L(e,n){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function B(e,n){ +void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] +})),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ +relevance:0,contains:[Object.assign(t,{endsParent:!0})] +},e.relevance=0,delete t.beforeMatch +},z=["of","and","for","in","not","or","if","then","parent","list","value"],F="keyword" +;function U(e,n,t=F){const a=Object.create(null) +;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ +Object.assign(a,U(e[t],n,t))})),a;function i(e,t){ +n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") +;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){ +return n?Number(n):(e=>z.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},H=(e,...n)=>{console.log("WARN: "+e,...n)},q=(e,n)=>{ +P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) +},G=Error();function Z(e,n,{key:t}){let a=0;const i=e[t],r={},s={} +;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=p(n[e-1]) +;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=h(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=h(e.end,{joinWith:""})}})(e)}function Q(e){ +function n(n,t){ +return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) +}class t{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,n){ +n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), +this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(h(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const n=this.matcherRe.exec(e);if(!n)return null +;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] +;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t +;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), +n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ +this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ +const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex +;let t=n.exec(e) +;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ +const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} +return t&&(this.regexIndex+=t.position+1, +this.regexIndex===this.count&&this.considerAll()),t}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(r,s){const o=r +;if(r.isCompiled)return o +;[R,L,W,$].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), +r.__beforeBegin=null,[D,I,B].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +l=r.keywords.$pattern, +delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=U(r.keywords,e.case_insensitive)), +o.keywordPatternRe=n(l,!0), +s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(o.endRe=n(o.end)), +o.terminatorEnd=c(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), +r.illegal&&(o.illegalRe=n(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ +variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) +})),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new i +;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ +return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ +constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} +const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ +const a=Object.create(null),i=Object.create(null),r=[];let s=!0 +;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let p={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function _(e){ +return p.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" +;"object"==typeof n?(a=e, +t=n.ignoreIllegals,i=n.language):(q("10.7.0","highlight(lang, code, ...args) has been deprecated."), +q("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};x("before:highlight",r) +;const s=r.result?r.result:f(r.language,r.code,t) +;return s.code=r.code,x("after:highlight",s),s}function f(e,t,i,r){ +const l=Object.create(null);function c(){if(!x.keywords)return void S.addText(A) +;let e=0;x.keywordPatternRe.lastIndex=0;let n=x.keywordPatternRe.exec(A),t="" +;for(;n;){t+=A.substring(e,n.index) +;const i=w.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,x.keywords[a]);if(r){ +const[e,a]=r +;if(S.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ +const t=w.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] +;e=x.keywordPatternRe.lastIndex,n=x.keywordPatternRe.exec(A)}var a +;t+=A.substring(e),S.addText(t)}function d(){null!=x.subLanguage?(()=>{ +if(""===A)return;let e=null;if("string"==typeof x.subLanguage){ +if(!a[x.subLanguage])return void S.addText(A) +;e=f(x.subLanguage,A,!0,M[x.subLanguage]),M[x.subLanguage]=e._top +}else e=E(A,x.subLanguage.length?x.subLanguage:null) +;x.relevance>0&&(C+=e.relevance),S.__addSublanguage(e._emitter,e.language) +})():c(),A=""}function g(e,n){ +""!==e&&(S.startScope(n),S.addText(e),S.endScope())}function u(e,n){let t=1 +;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} +const a=w.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(A=i,c(),A=""),t++}} +function b(e,n){ +return e.scope&&"string"==typeof e.scope&&S.openNode(w.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(g(A,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +A=""):e.beginScope._multi&&(u(e.beginScope,n),A="")),x=Object.create(e,{parent:{ +value:x}}),x}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) +;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) +;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,t,a)}function _(e){ +return 0===x.matcher.regexIndex?(A+=e[0],1):(D=!0,0)}function h(e){ +const n=e[0],a=t.substring(e.index),i=m(x,e,a);if(!i)return ee;const r=x +;x.endScope&&x.endScope._wrap?(d(), +g(n,x.endScope._wrap)):x.endScope&&x.endScope._multi?(d(), +u(x.endScope,e)):r.skip?A+=n:(r.returnEnd||r.excludeEnd||(A+=n), +d(),r.excludeEnd&&(A=n));do{ +x.scope&&S.closeNode(),x.skip||x.subLanguage||(C+=x.relevance),x=x.parent +}while(x!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} +let y={};function N(a,r){const o=r&&r[0];if(A+=a,null==o)return d(),0 +;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===o){ +if(A+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) +;throw n.languageName=e,n.badRule=y.rule,n}return 1} +if(y=r,"begin"===r.type)return(e=>{ +const t=e[0],a=e.rule,i=new n(a),r=[a.__beforeBegin,a["on:begin"]] +;for(const n of r)if(n&&(n(e,i),i.isMatchIgnored))return _(t) +;return a.skip?A+=t:(a.excludeBegin&&(A+=t), +d(),a.returnBegin||a.excludeBegin||(A=t)),b(a,e),a.returnBegin?0:t.length})(r) +;if("illegal"===r.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(x.scope||"")+'"') +;throw e.mode=x,e}if("end"===r.type){const e=h(r);if(e!==ee)return e} +if("illegal"===r.type&&""===o)return 1 +;if(R>1e5&&R>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return A+=o,o.length}const w=v(e) +;if(!w)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const O=Q(w);let k="",x=r||O;const M={},S=new p.__emitter(p);(()=>{const e=[] +;for(let n=x;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) +;e.forEach((e=>S.openNode(e)))})();let A="",C=0,T=0,R=0,D=!1;try{ +if(w.__emitTokens)w.__emitTokens(t,S);else{for(x.matcher.considerAll();;){ +R++,D?D=!1:x.matcher.considerAll(),x.matcher.lastIndex=T +;const e=x.matcher.exec(t);if(!e)break;const n=N(t.substring(T,e.index),e) +;T=e.index+n}N(t.substring(T))}return S.finalize(),k=S.toHTML(),{language:e, +value:k,relevance:C,illegal:!1,_emitter:S,_top:x}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, +context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:k},_emitter:S};if(s)return{ +language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:S,_top:x} +;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ +const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} +;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(k).map((n=>f(n,e,!1))) +;i.unshift(t);const r=i.sort(((e,n)=>{ +if(e.relevance!==n.relevance)return n.relevance-e.relevance +;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 +;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,l=s +;return l.secondBest=o,l}function y(e){let n=null;const t=(e=>{ +let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" +;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) +;return n||(H(o.replace("{}",t[1])), +H("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} +return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return +;if(x("before:highlightElement",{el:e,language:t +}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) +;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) +;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) +;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t +;e.classList.add("hljs"),e.classList.add("language-"+a) +})(e,t,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),x("after:highlightElement",{el:e,result:r,text:a})}let N=!1;function w(){ +"loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(y):N=!0 +}function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} +function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=n}))}function k(e){const n=v(e) +;return n&&!n.disableAutodetect}function x(e,n){const t=e;r.forEach((e=>{ +e[t]&&e[t](n)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +N&&w()}),!1),Object.assign(t,{highlight:h,highlightAuto:E,highlightAll:w, +highlightElement:y, +highlightBlock:e=>(q("10.7.0","highlightBlock will be removed entirely in v12.0"), +q("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)}, +initHighlighting:()=>{ +w(),q("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +w(),q("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!s)throw n;K(n),i=c} +i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&O(i.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete a[e] +;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, +listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:O, +autoDetection:k,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ +e["before:highlightBlock"](Object.assign({block:n.el},n)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ +e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}, +removePlugin:e=>{const n=r.indexOf(e);-1!==n&&r.splice(n,1)}}),t.debugMode=()=>{ +s=!1},t.safeMode=()=>{s=!0},t.versionString="11.9.0",t.regex={concat:b, +lookahead:d,either:m,optional:u,anyNumberOfTimes:g} +;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t +},te=ne({});te.newInstance=()=>ne({});var ae=te;const ie=e=>({IMPORTANT:{ +scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ +scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, +FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, +ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}),re=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],se=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],oe=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],le=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],ce=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),de=oe.concat(le) +;var ge="[0-9](_*[0-9])*",ue=`\\.(${ge})`,be="[0-9a-fA-F](_*[0-9a-fA-F])*",me={ +className:"number",variants:[{ +begin:`(\\b(${ge})((${ue})|\\.)?|(${ue}))[eE][+-]?(${ge})[fFdD]?\\b`},{ +begin:`\\b(${ge})((${ue})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${ue})[fFdD]?\\b`},{begin:`\\b(${ge})[fFdD]\\b`},{ +begin:`\\b0[xX]((${be})\\.?|(${be})?\\.(${be}))[pP][+-]?(${ge})[fFdD]?\\b`},{ +begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${be})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function pe(e,n,t){return-1===t?"":e.replace(n,(a=>pe(e,n,t-1)))} +const _e="[A-Za-z$_][0-9A-Za-z$_]*",he=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],fe=["true","false","null","undefined","NaN","Infinity"],Ee=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],ye=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Ne=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],we=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ve=[].concat(Ne,Ee,ye) +;function Oe(e){const n=e.regex,t=_e,a={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const t=e[0].length+e.index,a=e.input[t] +;if("<"===a||","===a)return void n.ignoreMatch();let i +;">"===a&&(((e,{after:n})=>{const t="",M={ +match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(x)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]} +;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ +PARAMS_CONTAINS:h,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/, +contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,y,{ +className:"attr",begin:t+n.lookahead(":"),relevance:0},M,{ +begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ +className:"function",begin:x,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, +excludeEnd:!0,keywords:i,contains:h}]}]},{begin:/,/,relevance:0},{match:/\s+/, +relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, +"on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ +begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},N,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:t, +className:"title.function"})]},{match:/\.\.\./,relevance:0},O,{match:"\\$"+t, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[f]},w,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},E,k,{match:/\$[(.]/}]}} +const ke=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),xe=["Protocol","Type"].map(ke),Me=["init","self"].map(ke),Se=["Any","Self"],Ae=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Ce=["false","nil","true"],Te=["assignment","associativity","higherThan","left","lowerThan","none","right"],Re=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],De=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Ie=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Le=m(Ie,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Be=b(Ie,Le,"*"),$e=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),ze=m($e,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Fe=b($e,ze,"*"),Ue=b(/[A-Z]/,ze,"*"),je=["attached","autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Fe,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Pe=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;var Ke=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ +begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} +;Object.assign(t,{className:"variable",variants:[{ +begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},r={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(s);const o={begin:/\$?\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,r,{match:/(\/[a-z._-]+)+/},s,{ +match:/\\"/},{className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}, +grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},b=[c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:b.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:b.concat(["self"]),relevance:0}]),relevance:0},p={ +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], +relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, +keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s] +}]},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, +strings:o,keywords:u}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="(?!struct)("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},b={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) +},m=[b,c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],p={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:m.concat(["self"]),relevance:0}]),relevance:0},_={className:"function", +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{ +begin:/:/,endsWithParent:!0,contains:[o,l]},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:u, +relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s]}] +},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:u,illegal:"",keywords:u,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:u},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ +keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/, +keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]}) +;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE], +o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},u={begin:"<",end:">",contains:[{beginKeywords:"in out"},t] +},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +keyword:"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,a,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ +const n=e.regex,t=ie(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ +name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ +keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, +contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+oe.join("|")+")"},{begin:":(:)?("+le.join("|")+")"}] +},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b"},{ +begin:/:/,end:/[;}{]/, +contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0, +excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", +relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ +},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:se.join(" ")},contains:[{ +begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ +className:"selector-tag",begin:"\\b("+re.join("|")+")\\b"}]}},grmr_diff:e=>{ +const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ +className:"meta",relevance:10, +match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) +},{className:"comment",variants:[{ +begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), +end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]}},grmr_go:e=>{const n={ +keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], +type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], +literal:["true","false","iota","nil"], +built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{const n=e.regex;return{name:"GraphQL",aliases:["gql"], +case_insensitive:!0,disableAutodetect:!1,keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:n.concat(/[_A-Za-z][_0-9A-Za-z]*/,n.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}},grmr_ini:e=>{const n=e.regex,t={ +className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{ +begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{begin:/;/,end:/$/},{begin:/#/, +end:/$/}];const i={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{ +begin:/\$\{(.*?)\}/}]},r={className:"literal", +begin:/\bon|off|true|false|yes|no\b/},s={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0 +},l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ +const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+pe("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},s={className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", +3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0, +contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,me,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},me,r]}},grmr_javascript:Oe, +grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", +beginKeywords:n.join(" ")};return{name:"JSON",keywords:{literal:n},contains:[{ +className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{ +match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], +illegal:"\\S"}},grmr_kotlin:e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] +},l=me,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 +},e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{ +begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ +3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, +excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},l]}},grmr_less:e=>{ +const n=ie(e),t=de,a="[\\w-]+",i="("+a+"|@\\{"+a+"\\})",r=[],s=[],o=e=>({ +className:"string",begin:"~?"+e+".*?"+e}),l=(e,n,t)=>({className:e,begin:n, +relevance:t}),c={$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:se.join(" ")},d={begin:"\\(",end:"\\)",contains:s,keywords:c, +relevance:0} +;s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,o("'"),o('"'),n.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},n.HEXCOLOR,d,l("variable","@@?"+a,10),l("variable","@\\{"+a+"\\}"),l("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const g=s.concat({ +begin:/\{/,end:/\}/,contains:r}),u={beginKeywords:"when",endsWithParent:!0, +contains:[{beginKeywords:"and not"}].concat(s)},b={begin:i+"\\s*:", +returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ +},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b", +end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}] +},m={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:c,returnEnd:!0,contains:s,relevance:0}},p={ +className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a +}],starts:{end:"[;}]",returnEnd:!0,contains:g}},_={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:i,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u,l("keyword","all\\b"),l("variable","@\\{"+a+"\\}"),{ +begin:"\\b("+re.join("|")+")\\b",className:"selector-tag" +},n.CSS_NUMBER_MODE,l("selector-tag",i,0),l("selector-id","#"+i),l("selector-class","\\."+i,0),l("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+oe.join("|")+")"},{ +className:"selector-pseudo",begin:":(:)?("+le.join("|")+")"},{begin:/\(/, +end:/\)/,relevance:0,contains:g},{begin:"!important"},n.FUNCTION_DISPATCH]},h={ +begin:a+":(:)?"+`(${t.join("|")})`,returnBegin:!0,contains:[_]} +;return r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,m,p,h,b,_,u,n.FUNCTION_DISPATCH), +{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:r}}, +grmr_lua:e=>{const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] +},i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,t,{contains:[a],relevance:10 +})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:i}].concat(i) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{ +const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={ +variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},r=e.inherit(a,{contains:[] +}),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r) +;let o=[n,t];return[a,i,r,s].forEach((e=>{e.contains=e.contains.concat(o) +})),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_objectivec:e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, +keyword:["@interface","@class","@protocol","@implementation"]};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{"variable.language":["this","super"],$pattern:n, +keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], +literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], +built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], +type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] +},illegal:"/,end:/$/,illegal:"\\n" +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", +begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, +contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, +relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={ +$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/, +end:/\}/},s={variants:[{begin:/\$\d/},{ +begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@][^\s\w{]/,relevance:0}] +},o=[e.BACKSLASH_ESCAPE,i,s],l=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],c=(e,a,i="\\1")=>{ +const r="\\1"===i?i:n.concat(i,a) +;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t) +},d=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),g=[s,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),r,{className:"string",contains:o,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", +begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", +relevance:0},{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:c("s|tr|y",n.either(...l,{capture:!0}))},{begin:c("s|tr|y","\\(","\\)")},{ +begin:c("s|tr|y","\\[","\\]")},{begin:c("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...l,{capture:!0 +}),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ +begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ +begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", +subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] +}];return i.contains=g,r.contains=g,{name:"Perl",aliases:["pl","pm"],keywords:a, +contains:g}},grmr_php:e=>{ +const n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={ +scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ +begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ +illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),o,{ +begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(s),"on:begin":(e,n)=>{ +n.data._beginMatch=e[1]||e[2]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}},e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ +begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" +}],relevance:0 +},g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],m={ +keyword:u,literal:(e=>{const n=[];return e.forEach((e=>{ +n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase()) +})),n})(g),built_in:b},p=e=>e.map((e=>e.replace(/\|\d+$/,""))),_={variants:[{ +match:[/new/,n.concat(l,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i],scope:{ +1:"keyword",4:"title.class"}}]},h=n.concat(a,"\\b(?!\\()"),f={variants:[{ +match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" +}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ +match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", +3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))], +scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class", +3:"variable.language"}}]},E={scope:"attr", +match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, +begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] +},N={relevance:0, +match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], +scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(N) +;const w=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, +keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, +endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ +begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, +contains:["self",...w]},...w,{scope:"meta",match:i}] +},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ +scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, +keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, +contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ +begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ +begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,N,f,{ +match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ +scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, +excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" +},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", +begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m, +contains:["self",r,f,e.C_BLOCK_COMMENT_MODE,c,d]}]},{scope:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ +beginKeywords:"use",relevance:0,end:";",contains:[{ +match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},c,d]} +},grmr_php_template:e=>({name:"PHP template",subLanguage:"xml",contains:[{ +begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*", +end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0 +},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null, +contains:null,skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0}),grmr_python:e=>{ +const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:a, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, +end:/\}/,keywords:i,illegal:/#/},o={begin:/\{\{/,relevance:0},l={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,o,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})` +}]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, +contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, +illegal:/(<\/|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,l]}]}}, +grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt", +starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{ +begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{ +const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) +;return{name:"R",keywords:{$pattern:t, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, +starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), +endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ +scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 +}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] +}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], +variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ +1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"}, +match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{ +2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"}, +match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ +match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`", +contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{ +const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={ +"variable.constant":["__FILE__","__LINE__","__ENCODING__"], +"variable.language":["self","super"], +keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], +built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], +literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},o={ +begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[s] +}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, +end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ +begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ +begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, +end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ +begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ +begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), +contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[e.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},b={variants:[{match:/\(\)/},{ +className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, +keywords:r}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ +match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", +4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{ +2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{ +1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ +match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ +begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, +relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", +keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], +illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ +begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", +end:"\\][a-z]*"}]}].concat(o,l),relevance:0}].concat(o,l) +;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} +},{className:"meta.prompt", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",keywords:r,contains:m}}];return l.unshift(o),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, +grmr_rust:e=>{const n=e.regex,t={className:"title.function.invoke",relevance:0, +begin:n.concat(/\b/,/(?!let|for|while|if|else|match\b)/,e.IDENT_RE,n.lookahead(/\s*\(/)) +},a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:r, +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},t]}}, +grmr_scss:e=>{const n=ie(e),t=le,a=oe,i="@[a-z-]+",r={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", +case_insensitive:!0,illegal:"[=/|']", +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+re.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+a.join("|")+")"},{className:"selector-pseudo", +begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, +contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+ce.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:/:/,end:/[;}{]/,relevance:0, +contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] +},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ +begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:se.join(" ")},contains:[{begin:i, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] +},n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta.prompt", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]}),grmr_sql:e=>{ +const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=r,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!r.includes(e))),c={ +begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} +;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t +;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, +keyword:l.concat(s),literal:a,type:i}},{className:"type", +begin:n.either("double precision","large object","with timezone","without timezone") +},c,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", +variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, +contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ +className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, +relevance:0}]}},grmr_swift:e=>{const n={match:/\s+/,relevance:0 +},t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ +match:[/\./,m(...xe,...Me)],className:{2:"keyword"}},r={match:b(/\./,m(...Ae)), +relevance:0},s=Ae.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ +className:"keyword", +match:m(...Ae.filter((e=>"string"!=typeof e)).concat(Se).map(ke),...Me)}]},l={ +$pattern:m(/\b\w+/,/#\w+/),keyword:s.concat(Re),literal:Ce},c=[i,r,o],g=[{ +match:b(/\./,m(...De)),relevance:0},{className:"built_in", +match:b(/\b/,m(...De),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ +className:"operator",relevance:0,variants:[{match:Be},{match:`\\.(\\.|${Le})+`}] +}],_="([0-9]_*)+",h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0, +variants:[{match:`\\b(${_})(\\.(${_}))?([eE][+-]?(${_}))?\\b`},{ +match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(${_}))?\\b`},{match:/\b0o([0-7]_*)+\b/ +},{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ +match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] +}),y=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) +}),N=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ +}),w=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),y(e),N(e)] +}),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),N(e)]}),O={ +className:"string", +variants:[w(),w("#"),w("##"),w("###"),v(),v("#"),v("##"),v("###")] +},k=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, +contains:[e.BACKSLASH_ESCAPE]}],x={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, +contains:k},M=e=>{const n=b(e,/\//),t=b(/\//,e);return{begin:n,end:t, +contains:[...k,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},S={ +scope:"regexp",variants:[M("###"),M("##"),M("#"),x]},A={match:b(/`/,Fe,/`/) +},C=[A,{className:"variable",match:/\$\d+/},{className:"variable", +match:`\\$${ze}+`}],T=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ +contains:[{begin:/\(/,end:/\)/,keywords:Pe,contains:[...p,f,O]}]}},{ +scope:"keyword",match:b(/@/,m(...je))},{scope:"meta",match:b(/@/,Fe)}],R={ +match:d(/\b[A-Z]/),relevance:0,contains:[{className:"type", +match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,ze,"+") +},{className:"type",match:Ue,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d(Ue)),relevance:0}]},D={ +begin://,keywords:l,contains:[...a,...c,...T,u,R]};R.contains.push(D) +;const I={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ +match:b(Fe,/\s*:/),keywords:"_|0",relevance:0 +},...a,S,...c,...g,...p,f,O,...C,...T,R]},L={begin://, +keywords:"repeat each",contains:[...a,R]},B={begin:/\(/,end:/\)/,keywords:l, +contains:[{begin:m(d(b(Fe,/\s*:/)),d(b(Fe,/\s+/,Fe,/\s*:/))),end:/:/, +relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params", +match:Fe}]},...a,...c,...p,f,O,...T,R,I],endsParent:!0,illegal:/["']/},$={ +match:[/(func|macro)/,/\s+/,m(A.match,Fe,Be)],className:{1:"keyword", +3:"title.function"},contains:[L,B,n],illegal:[/\[/,/%/]},z={ +match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, +contains:[L,B,n],illegal:/\[|%/},F={match:[/operator/,/\s+/,Be],className:{ +1:"keyword",3:"title"}},U={begin:[/precedencegroup/,/\s+/,Ue],className:{ +1:"keyword",3:"title"},contains:[R],keywords:[...Te,...Ce],end:/}/} +;for(const e of O.variants){const n=e.contains.find((e=>"interpol"===e.label)) +;n.keywords=l;const t=[...c,...g,...p,f,O,...C];n.contains=[...t,{begin:/\(/, +end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l, +contains:[...a,$,z,{beginKeywords:"struct protocol class extension enum actor", +end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{ +className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c] +},F,U,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 +},S,...c,...g,...p,f,O,...C,...T,R,I]}},grmr_typescript:e=>{ +const n=Oe(e),t=_e,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={ +beginKeywords:"namespace",end:/\{/,excludeEnd:!0, +contains:[n.exports.CLASS_REFERENCE]},r={beginKeywords:"interface",end:/\{/, +excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a}, +contains:[n.exports.CLASS_REFERENCE]},s={$pattern:_e, +keyword:he.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]), +literal:fe,built_in:ve.concat(a),"variable.language":we},o={className:"meta", +begin:"@"+t},l=(e,n,t)=>{const a=e.contains.findIndex((e=>e.label===n)) +;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} +;return Object.assign(n.keywords,s), +n.exports.PARAMS_CONTAINS.push(o),n.contains=n.contains.concat([o,i,r]), +l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ +name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n},grmr_vbnet:e=>{ +const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ +className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ +begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ +begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}] +},o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] +}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) +;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, +classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},o,l,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +keyword:"const disable else elseif enable end externalsource if region then"}, +contains:[l]}]}},grmr_wasm:e=>{e.regex;const n=e.COMMENT(/\(;/,/;\)/) +;return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/, +keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] +},contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/], +className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ +match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ +begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", +3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, +className:"type"},{className:"keyword", +match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ +},{className:"number",relevance:0, +match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ +}]}},grmr_xml:e=>{ +const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[i,r,o,s]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:n.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ +className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ +className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} +},grmr_yaml:e=>{ +const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/, +end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", +contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", +begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] +;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:l}}});const He=ae;for(const e of Object.keys(Ke)){ +const n=e.replace("grmr_","").replace("_","-");He.registerLanguage(n,Ke[e])} +return He}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/ui/web/index.html b/ui/web/index.html new file mode 100644 index 0000000..7c09433 --- /dev/null +++ b/ui/web/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ haocode +

haocode

+

探索未至之境

+
+
+ + +
+ +
+ + + + + + + + + + diff --git a/ui/web/katex/fonts/KaTeX_AMS-Regular.woff2 b/ui/web/katex/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0acaaff03d4bb7606de02a827aeee338e5a86910 GIT binary patch literal 28076 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 G2<`xUL{2yW literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Caligraphic-Regular.woff2 b/ui/web/katex/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75344a1f98e37e2c631e178065854c3a81fb842f GIT binary patch literal 6908 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 CFgb+) literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Fraktur-Bold.woff2 b/ui/web/katex/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..395f28beac23c7b0f7f3a1e714bd8dac253dd3bc GIT binary patch literal 11348 zcmV-aEUVLZPew8T0RR9104!7h4gdfE08HQj04x0f0RR9100000000000000000000 z00006U;u#x2s{a#3=s$l=RnhY0X7081A=@Dfj|HRAO(ni2ZA6BfhQYjK}92Ka2^Ov z0o}VqRBm=p{=X$q8M1cpbPUxS0!WG`C@4;IjHc?u&;+W>o%jXepM@BXgT+(Np6`yc z(p7IC8)x~5s#)!;6hBM!$6i|TH+G!ojgVxvwMV<>f6hrZ$wC)-SGcn~DA9)}RnL-z*RWekuPpCacmiMm2|#%vBmjodga!vtbS#zLV>nN#tH3xi zx24vQ-W{9R6oCZDJ)7svwFKw8dX5Ertxp852kD0_jPpq2rl)~lVfgktpU>?)kvu~$F8*Uz4iS< zmZ`8fx#t%{j6voQKRzWm;NI(ozQ zRm@Vm{LZwtM0X_?gs}l%&k&q{rMmnT*ngRw@8cYK!5!Jtxe+7lX0q?RCzcT7q#Hmo zE^0*r(`sIkAzpk%0rZDr=EenWnI~e@!ZWRw4&5YkdjWbzW}AA-v&Fz&U5v^$^*x^x z9D>=4oA;0hM2CEuwmS(iI~>@Mq%N%>10q;tU~LSNM4`9p(1S0Dl=;`tIgN5W8&hou zPvN%tJA4SbyjVH=tj?w8eUoobL6Wf2ZzU|Nb`mB zLywc}C%gcA(M%|66)j*4 zN>4qgxgPdPQyNp}{kMs#qQYEb2*2o#q5yL_>0DrUx>q|qT5aF))`^^cJ(QyK?sdw% z5#qW_n-;{pfuk=23r9`Do^BO2Xmd1xLk(tW+f+cT*Gc5gob;BZZcmO401gJ6ok>~S zr*F>a%7h)e=@U5^>@gWP)+L`j;MOKn(o>Y95bLohJz|{O74(Qp)Pk~v=`u&7Rz~5H zIz5}?SCMA>K}5qD1k9-?JM>3HY_A9J#M_dWNQlB++g$JUDn^)0fD`gdC3@zY8lw!H zYeg}GSS#YlJSonktjp~RV@BlFsl@t<%m=O8(LX z6y&&L=2R7_DC01Vw*UGr7d?L}=bU*|n1oeZ%4#CHW_$Z670 zH|hjzE@6De0$j6>L}KJGrL_Ininvg~+uMOTQ;Zpy(l=72h^OU+ixSHSHRP_aEKc0k3BsMrY=JELM3 zRP2g6(GzHr7J7vu%N1HXL>pFJOZMb#q&L_r*sC4(Ngn`HL^LmHSz7nGO9@8+^fgxb z67+4et`qyTi(?%L%ignifXMoovo zDa~GAqTo;v$#-c_OTXhqpS*Z7mM%vJxu*e59{jtNVHwmar>RU!IN<7TB|7>%97?^a zPWk!jl4)mKa){in)E>$tQnAj8*x?xiQxnP93oWKT>XmeIEMjL@w_Gj>2HItrq-7^` zI2p8ThlX|;F%u%Vm?8!wXL)++7IY}HCB(T+?FU93;}J;g zL>%SRb$ecz{m~HAL~75Iml)RFrUf)sm)>b+u64tc|j$3wC$s4>ay3Sn|4k~+;9d0-X>U=pxEkpL2fP$mdP4u7ID0UCu+Cj<=~ z66q5(6~H3VA`a#*8$nq)teS8S?Q7GE;LD$iX58Wf=pk7LZYlYjtp=j@Sz0 zfV;#2_A$UA27cUojVIN3R*e_ccufen#Q^sh_yc-_Pc`^bgKstXNeKAH0KXU}{v`am zU$;w9Ef2D*c>W;Xc{3f+)D#=*iypg8H3a3Nk)h0quG04cx||21OQ86Tlj+4iUT2R8 zo$pTh(whLV-@r*4&-Dj8j$14?y@E8_ z3u)|cq1PMWk8T6VmXP8gDDVF1q}kn3V1Yjad}-$aba;m zr!kQ#MD8v53!c31`Olgkj|rrt5*{ZhG+q)xY0~miDzUri^|hg16<-KumAQqHDgzZI z&o@UE;IJ&v!=)IqNZ;8R>njNyi9S+EdJ$n#kGVimbQ5usVQ)+dIf-8)m8b&1IiNI6 z2Q{Lw=K?#iFr`???bmT(yktyOo#J%U?x`~$TeA<&X0CZ_rP2C*+i7af+&`7Qb+*9Er%^4^6VIy^oewME%bP1f=|h20lY?Ih{0lS`T~|aAmI~ z&V9)5_)@OiQVRSE19I8nz(JqNkarcO{*R`3bk9W@C}nQyDgMRZf8O*3e&$1oVJFU7 z&a^~u8nGb!0Wz%sp6^!uU*lv^C2h5%rwi^CMud^h#YX}irAi8ZWdkbU>3b(mtOn(w zEN{Y4dTFF$s z3dn;iza^VJkQZ_D2MgqINxxJoD$$$d*)3uCP6S zCX~EjSPa*2W~pV2nzQC$Tz{w3{)SNG=a=`vu)2vT0PE#i2p6PUbrdfIw#!!4x%)`Z zU9qajna@(YNplbxj0a`{t5=l^ABncoKifv5k*JI;Y8lUAq+(Y1{EjoM$hC=LVMwb)(vzMiFM=CFeHy z`wM|=yDabV8I$TfVJy0NkcRfCl0U&(1OqJYDS~kt))t`GuY$cl%K!WGF zk;t0Nj0R-U#vkgnLTn?q3#heT{!rfJk|lbU9beJvgg7#&f05aj2k~z+vfOsOaf8if zg*yrB@^$yxr)O z85L|=+UF2qT;_|x`g?0AQ#KvNzM9uU&%u8=C2*t`dR^}wmT?(%Efjz1 zqV|ZE$5q{?)^)7Gyvf6p6P(;?eAAfV8Dv?TA0Ae{yvHzO5U-m*r)3*bCH_&$5J7Dxc7My#z6S!LA2gv4 zqP>$1zvG7+yA++Pz3bv)_)C=5* zo-F_$yDw>k$9T$pVvW4R6hIQvjejViY5b!#=_Z2z z?hjRQ;O8&x#hjavbVQEct^RLIweFBJ$UdWHuAb@;Shy7DMUo54~yHPEsJn9 zlv%M6ffvxf+w8JqF4NJjQ`+4lIZ3Ehvm8$R5#Em@93uzsa^*Ys?0eKCuBGw3yKPzx z@2IO)w~NWk@)o<1cO<$}vh$qOGblK4)(M&WmFb&pE2Y~z9T!*@wF53&AqXJWNnT=N z=mYs3MgPNueoxXV(bJ&#xk-n~zz9hGV}bVcBAQqg0F*!unDZK|6pO#r4NU1+22Te? zXh#n%itXb9jUTRbP8eMIif=bcIy30DwW`Igfr4WcAu>1$blj13hHXnXo2tXU?Ja}=wMVGv>xRYnAAlcF>Xem7r7=A1b*pnc3{jQ578{wO6BQ@ilAsRRzJ814ql6nNft9pRxGC z-HbYVX5(gxtz4Vp{0Ff8hb#AxN4}2LmKA}KyE$+QZJa=9&R$}ldVxchXdsuW%A%bb z4w;mcz3+MKko+#oN(%zd<>VL+deXgDspQlQjGQ%e^fyAkEo|{DdAFPwe@M;HVaBoW zojyoHabdHb-(_i$xu*_s;^*I0Y>d6BYc<*vyj9~ey%sUFHg}zkh3O?Nh`rIwGT8SZ z%wA$T66%{{>5Wu$@llJG47_j2m~NMVnzF+~1&2zrCR^sAj&>e(PYY`Ejar45c!n`| zy0>yTl=KA#2hr|
8iJi9&VuLl!D?|!}g_M>mOF8Np9hD)!Z1Vi=)NUxj~3huD& zyD|QQ7aI3(({H9Q#J{MlFEJmW^?D~ilCv^kGW^DwJtrX3%3lmPoqYMX$D{1PT>tY- z7&&?qIxCZ(mgn?cQ!37X+$}o(Af39P0>$~7j7f4p+>@Bi9aIj#bOl6-yFQA)naIV7 zp$RaqtO$JzbfPI|iDvvTz%%DZQ;3nI&&ZQvm|GrhS*E--9kMD12pHQ#GI%oy(ufJBQy}WA%+Fg zb{2gTOV|l#(Lp}SWgvO9bUmv48C28iNlXJO5*Z7kk&Cq+N*F$xAJ=R_wbAzj?a!dz z-1?v->KqkvLsOb+HZ+If1+3D6_rR|Lnpd@k|!GPWpb*j{dYXDsT;!&wG%w50@ z!$X2~O&VXQJ!?yxp6*gdc{-qUj^BC*;N4J)Ap{)5$EPb_8sZZA1HK0TH zdTmQk%mOe(F9JU#xBiL!jtTtjOY^dtP;*s{(b(A-qIV`0!Jw}0_{d;lEa@IU>z=9) z^uB3N7mQcy+b?ODY%5#hF(*89hX%5&Euu@f`sUi3jG9dwZF3E(gnRk33%cgDzear= zWK`GHf`>oYT;+2ubmPA&_iFX&PMZSM_+BiZ!Y-#A)*YdckLV7A8r~8g&K+l_Hwyv=a@c>BAIeuPD-ZnjuA4f}pR1E_a3AMFiQ8NasIL{hQ`(;ge= z4?i+&@?@`uvRXQbQl{QpgQ`9m*KK&^Mj1?5Lt$8Tb^d-$Qa5ws_j*=s;2BhiVj`2k zxMy1n+lpghTh;B*nzq*572+(t(wmG7Wl|D|yJHKZNnx?)75o0Ad8(V5Ok{}KKeZyd z9F1<*mPPOxt^jp`MBXAna0f`$#YP+b#`o2U_h?M!Vq&T4&J5gHzO^~h5?NZ#8>-Om zZ~cmMsXj26*%22f#S87gEGzj64&|vZ5^Hy9w>(q%E?uCpqGF;gnP4{b;+~MrqA6&d zoN0?S2EY7pq&ewXKJM-9Nl$wuE%f6WBQfzzTb|g^m1KRg?R^}!y@zTATAup?28~xP zr>jSbAWtz|Clz(Qr%8&3I0qROxN01)nYeLhc}ty!xV80)dQYQ&pm8?KtM#e|t9G|l zZ!0JDNMUaX7IE{WMeu~yU5Tf%7mZKVNsj*_0&_&dzdsiD=4yR3z zF7cDlC-JBYm0daq!H1#XmXX-|%XOdzD?)qcW#)^sJ5CXYS|P%wsFAYMscIlE*@=qw z4>eN#=+(b;3UPS1?#5tW72J+)Bx|IAB2@mhpOGrLNa0c1jP!xXoA)mE`5t}V6+g)B zbEh1QGclhnI%a2W417rsuhJ$mvN^_Hi8-P62X~url|=r2Fz4o;XK^lWIJk93Yc`rq zyBsaeLBSRYvNWFm;)`FV@2&)87VKZMk;88Ni7{*tq7;AJY7+TgsfC~7HhwzeG$;fX z`O6_sW)s>HR~cvqb6cG)Ef@C?Uz**!Qa+e>ZV*>_P;32h$bdqB$U5hRu*zOp4P}@L zMIM;~XxTo~8?6)dFpY3#g}JJr=)1*kmBC2i@lTov$d4CMw`GoIy-z_N1+h(AOJQp$ zOl@sAQ?;U2r4hlWnC&-qjMW&#pw>ogkFuZI;IOhJ6lfAcJ|Q(mHB##476GHV*o5#Z%vGnF>1Xa@muz^z5<@=U3j7k#$?7u*F?=&_}7ehUv$4lqTF1 zdrNPsJ>_*@sTc%q?ZfNU8*X#dbvZ@h2s5b{<5(4YQwb;xO#v;Kf zg00+UVhKk!Do1#9jLotBAOB%*>3|8QKucY+D2ujP?mHgn@RFKU(1v1yQh_)s#cfBG zLTp7syF{)sYb5;I?IIZ9>Gz!J_Vs=jx-p5I7b82hc!NPVPkqBOad;nzMv?qm8lBy0 zohsY-==OIY@}u3v{(Qfgwi@O9mkuL~{IBzNMt3~idRN3h^1b5c_N$v8`>ewR75pXq z&sy^&2W%&}Ce4g;R)U0kZY!R=>g;)#gU-cw^^#G&&&}A3rVjmNYpvf=VO`kKO@3#~ z)haw@4B-`|-BApsAm4f{=VKIe3s7n!-!H7$^3w93-x2|^~2?L z&&?!?^hR~84mnDoHSQm#q;Sr*UMKBq5=y+6j;UTBXfSZthyo(fa(cYc*%fH`e!p4f zz;dKb;lpJJ(s-=|;5HyHWOj4$Crb-$cV1acqn+w1TrIH&32DP(|DfC4t&H)_+E)z% z-H0{bvkaWop(xr=RV;^=uA6yplmq>s&{9uj8N5$gPH4RZE8XL(zGkGRkzTSLB*i%M zVH6zj_o@|v;{@Nu2+it@eXLJiRcNpkceyY>!)KO>?bbFi@r_7zLp*r$14u7Cpso%R$kdP;Bd3b(%3C-a7Z;+eQ8<| z`Rp`L4Cht<-+5F(BMUcgfeR(KUbQ=vNq^3+3WyKv6I!foG>L%TA_##3IZI5}$m)QL zk&zzgt80yI5=P)&#((_kF1<^Bk%N?*#6m^d{qOUOl4wob=z@Nfx`1*g{DyRMcyjQ) zZ5_#u_}=yNJ3NbI?YM_y>UtX2K(jpFwKDF+1G10TkB`jC6|vGyAp*~02zbbxq4~wpE<5^Jz_s_ML8s)Qhx552)Dx-Rw?zbI^K^Mab%;b{;-xo>fHeO!u+B z;pok~fzC(CW@PrfPRM$V3=D?{piBLv4t?qJ4>v$dA)N*8;$No;@Q)M^dTnzSw5RFH z+ja>vgY4+ujBUezJW#*EG%)ySUwYpjgjlF*@{s}Y33p5AhyN~^WKR zZ@c{EN)N2QmF$|IaCyt6n#t;6rJ|;``qm#K{&w}uDgmd|L-$!_5)qXYzaJfMGV19>%7Mct6yNwe?$#%M!6&CG1 z$xuk^7qfk3J_#G{;8<;fLt7_ZzXo_=G869N{15jruSy_=+deVnFOrw<`mz2XSn#5g zqcE_A=lQ%kvkr!Vu^)cD2ByQjsjr79<)$SyzrXlZd8~QeFMm##BZK9>pj6Ftk#P?r zHDD_5p9hbA+MbC?oB#b)rLtAa+8g-42f5h8k?VoOp5UFH_Lfg&jUO?yz0OXZ zCeC;a)NNvt0SD~HBdYmAk~^slIxDRFo0Cd5)1wIovwp#{BQ{~R$Hd5HFEdfaKOOj% zbacdT-3R=$`Bb6Q&19Q<`-42{sryGhds0L?eE-2Na3h5GR!JUg3{Gb5Xmv%I8DdET zwD<^2Xrivi+rc)jYyaIi-w1=M{B~$2R$cC5O_za<=OxC=FclQG8wGsyU?r5g3h5ex zw7s?l*nV|22sb^_<|vv#uZ95J_omLm zKN}{CexLXj(OdCm|BDK4qjAa-$$&m{`jAZsb0qB$1RMd_d=CC=ETb+3%n#mMy28ap zF#o{v9&bA|m`)eExmk2z$l_U92diU zQAN;VfV}fp?&7MH@dZCQ&uYDk>2O7d!}H@hgc)w^aTTw>32G=XD0NO>{@-TRljCI% zH_rk0@UZSq!y`&Hs}?{<&KMgzeU1P)SXWix3O5q#^^4XI6{J1LJP)$uVF~yyBI&Tt z_*@@=;PV$ZYfB5#p53^)O^w6;pFYpNAI0Rx(Zvw3Tt>|`JpGs7F?YgmkAS)d3vLEp zxBLom*$J-PClkCMJoJF3R&`u$rsLiVgc=JE^zy=Hj{4ghnQ$VMqjg zg34RyZ}QjgxDgZNhp0~E`|E&z=@IGaeC{B6Zl^k{cZpi@MY039K!-I;Z0{#kJP0v9 z=@RxjHK3n%^@|GuAa5~P__^eP zd;h*2uDsG}WY4EFbAVr4Hx@XV?BU#5#p&LhWrfaI}BfRk5*{-7Bfq{eL zh_Q(qBwxgNNaRpNN9%*fST1S&BiSX2Y6mi?jrKr5neJl>Wwz^#4;e!4fIG8=* zA?I#{xFEqN7f5P(?M4Uu@)~$qX|;_B5a;mA4M1Al?W?rzp?8T3>ug8SMGCEJ$xokF zv1SeXM32+J@{@gdPz9t;FT$Yb%Y%iWMq2RXDklkaAaJHP={UQNsM~@iq${WBHB?vf zezJkz^!A%&3;*u&Qd1gMUvl&2T9lVE<4@U zrg+QCe)H*w<^>Qg#90rx$mpp=}9AQ)yi8iZz>%K0nPCN_|0 z-PY&G@}KB@Vy0(Rst}wq@G!&{GG**Pi>}S^qglm({`;2~%S=w+ym@DdDkI7~h0?|< zLHqB1rw-F`zxrn>WEe?Z&%*LeNuYMccZf%wZ`3W36uk%B&qxPQ_|lh4@}8cnvSD+c zm1i)md1fs$-#(|Qi}oq5?8>@2adLjykwyISo#K^yTT(%_SygB>d%)K2oXs;`*=Jw` z7YeP3=TEhcPaEtJhOhaJc;ewMcV5n4fr3qcM0R`Ty>C)2pNKT2L#;xktUjE{XHhE2 zc;C@TMDZcZvLNT*bDP!~%UHcWi?IpfY7}dU==X>`+?<=^9|&{JjFFP4e3^xtKm~>G zP;GM;mZUq1(Ni09-}ixoyylqP&z)GA^XZ1UMZb4l65hJ_34K5xIe+Hk-(8^3s$LlS zitP5t{meg-qR|oiTJ;B+m!H3f`Obqu=9C|@H+g%k6|>>xbu#4B_SXU{pSpZI`rt8k zd(SOot!YkLt%y*@!R@+jh@@G#A$+$=I(?-2U?5$LJd22Biy|-ekN)~_{)M9gY zj|&7WebrFeFrD)D)lZpRLf?*66bv=mZq_R=SgKbm6-FB-p_IJ+=5v+Z!b6A0z&J%7 z4;{tax0^oBm54k!acoUXhoXqyqY|`IhZI9YP}ib)n=%yHuQ>2{>{;LjcskGkvZZoQ z&qtbMh{@^QI#grgRy^6hSqUY?nr~B&Y)I5Inm)1?pP(e$jcDRL+MddWc%nX+Rgedm zO7kg)OvMaoftxyAEu)r62|B}-^2!XHF6NXK=RH;)WJ=j3v^`gvOYbD1u#DT}D~C-@ zMW;8VDsWOQ-qC8TR8Vu>IxmU9%gyU1}Fx zn-&9^Ci(eR%@x_QWczx#9-SI7Lw0f{O3hjz`JO3ZgdWkxje9`{^`IWRNo1&VJGPCa zPp=mPqV+h_J&tGGYZAI?*_AzgM8D29t=LXiht$xtF!rboMraR(){nk4s>7;q_;2P5 z@ryKld@cOa{W94v0{Kb(`0tYn18FVI@UV3H*a5$=%-WN`%3tU!`e_ILZb_&5{RgKv z5rpFGyl(QT?8s!SK0&Rq5i1vEY7V}@N)#dsOAwKg=Ao!a_CHa9*7{l}!sI@kdKU6j zfV$pi?~hPA#FTmuyzex%=gHv*t-3z`6f#hq17-Rcp~cL16!*K3_wb$$#b76(j6E5w zKZ2j$N9{Ri{Rv#BUIq`LePvKHaI617HGEg%0e7Rwu;Qgllf~CLIqBtUi1u6- zXVO@-7?S6`0YW-r3(qPpY+BCA0~3QNKSf4~YVP(~8O3PKWi-cPj|uJ)!@;-)HiJ~` zGHe8kCVjfS+@_E3HLM$Mn-(LM81ntqqA3{=E!SL*N5L8-Kf82 z9KvQCv6^96G+k2o#*g<0jVv*M`Q2n6_!2%go^p1c)178_^fj>R|9Bi!B#X`A z^7sOw2pj?u3K|9$4jus!2^j?q0}C4m7Z0C6IUx}-3D>?|atcZnDygVxXjRdvre|Pe zVP#|I;N;@w;Z@7WFCZu+EFvlB}U8T zMzB?gr+a~R;~(48<%7kiMqgf>1?x%Y;Y$Yd5XK)8mpUz%x?)bF$$R&@`ES|j$<79b Wg04?dcHtp;A))8;;A&?XTgw>?+~w4ijH#pv#Ou(S+JuTfhf>O^sW6;Fx#b2@rkj)P z-d}ewUs&r@x;?8bxf$`O*x4$w9`>Zp>GY6YYWOpppm0Tacj>9iMat?P7M zeq?N4er^2~ix2%ro%X&YLuBF*x1rn;Z`+whNU)8Qx?Rs|;h>c+(BThy{Z&%F@&w1yt=VV>r?H~L?6BF>5 zfJa7O#Hzbje%F80X)XY&@YP=+`+y2QQsM%pInqCr8y^i@=8oQ`C%0^%Ub%S)hpm7f zP~X1guWio2E3?dm>`7kJJ;Y@9;7<=tN!J0-=kELQvE7zHBF{AQTJXu*2qOWdrif8+I3s)9ni^D z#kH^$TnqQgMRvcEbW|EmSS4OD{6f0G(M!k6sOlQ}% z*;c`2gC|~H&<{<>%StNx;=zm+u-fT(FzM8F}SU;Atw&ec}8x^On? zguk%zd*;cMfG;)?qQg7bdxubOzFO?ABY$##DF5;Z=IOnjbPqK?S6Tx10xv3_0h&v_Si)5*QLc|Uv&m&^8kq`Vx6HZ+D9Z7L(kv*uQ>6qJ#+Jatmu{(X}0MRx#^&#bGc zv?`WG3*qv{5>wAp~q zyeu*@;mYg1NfecNl!;l@@q>)gcrr~@76o^UA>2`t_o{DomkZSVqAFeMxO7_*+TAVXR&@vmp0(C^bf-eNCzWa`UGR~+ zK|`J@b=TCTJCPppUWG?T`K=1ohPbYe!;jXBud>X;YPhbWAbVyHKOEyqmr!uV5FUQ% zli~9sP&M#E40D+q@0`Fb04*_r`_8-*{Sa>QzdC!$9cdnJ?J$)PVj9ygIf297MMbSw z#%I-d@_-%)xC|n2UXalFIg1c@Z1baqZ-x@sW?&hp7;?AiN&~!LC@{v*fWo5&RUb}H z@GsWqBt#64Xe~q{FrgGPlwpplSfCnKP#vqNfi={`I%?rc=L8&tK&a*Lqh*RfZ%am9 z)|`%MjKklToiz@_KMz|Q0j9#*ET~=|NmXJcbf67gQ0Rd|9~1_lFa(7WDCD591qx%( z%p4TQEn4^-(n2LoSjn>_71^A*xdK?k%NXq^E@^p;F+KmU7RkDHP`SEaWfW{N|hXm~Zm zF@PA!5*Pl`N7wgex`x5E-}&5#;{5RM3QlHHr1U1JW@IGcwy+dlUfD~bEp5f!+)@=& zZs$o--jjQfyyKuUX_+f|EuW^H2)c}+FwIuA7Ecv1SMJJ6S}D_vC-Y9ap^B8;`D`U5 zp|c{XU-><;wdXTRzhT5uv5;X<#Yu=L(aBSLMZiSDY;5=ykTfOOF#-4J3!_p zp=>)B&`oNgTh%Y{*+vwzR@07M1jQp3RM*zp|AA@oWkt?ML&hxf*Sx^fMz1mVom1BE zR!_T^V2Y?zS^b2zqN-vkmdFc1dd}~?+Q4HyuA^o?O=ZR zg6c{!LNSNd3B)WlGyU^Zm}VS6;?&^5xfJmRi2nv&b_S+e)sg*;*yS>@j1;rm$Go95 zYi4Odi=K7jc#RtRTvNAMnzzKJ5=X!bGfI9@V3`|3-KPD~Re70v1rMslaX_ipz|jwS zvnRv}Q$#y?uTm!7BCg|jQ^|XW0=P-=9&-`W6aXEE8G`T(o1{XP0$}6hJGdl38Nm$^ z@`eHUp|C(06Am#1M;L-*3}Fc{tZ@oY{wvoRuP2O5g^KD4xy@H z8>X-eQ*++}3LRn?hmH}TQv~QdhcKmZ2{X8c8Qj7Q?$HW8B0zlv^a+g|USSUJFo#c= z!#7%?Uj*nML1r!g@NfLyK7Od{g=q1$Wv#S`S%cny?^NpV?0_(6K;0a*avL;l?BXZ5 z7eMqTs4rmxTL}tf@rF5ClQn>KajYU;CBm&krE+9l9zYjvRa;J8Usn=eH&7w^`5lF{ z4D+bNG=tHZZm(I_Oxd1Z8ES1!ciK+cne<30gJvNIl{bUEXRpoYm6`I$+|c5F&-&u_ zZnE-yz#6kT^>%#tG;yU)sU|(m-gITGy*J%qwF0 zvF`ClrurB3;(S+ce7#FC#Mdq^zw*scomvf62>j&$E<<@L()7Z|25_iJl%Xv-68Lx0 z&bYmAYH6MDOcC!h?c$hxMs3&GK`vy(AzfX?xuli;o@#wfbv7-KIRXX~h)#XEm5mh& z80$lPtOqAOZ$BE~Q)C#-z~LrG;ww}AKFh~g|H@Rn#!g|Ao45?Ikr~5B1`k%+kCY#m z&UvctPz&wbSN6CI-i_0)+_~YvcbmTRl~Z5+PV0BSdRBFqI11Bn%2XW@zx-b7_svk< z=zwsi{3nOO@1NSS`SR+npjpdej`dRFS&vrQz}42p@HIPijo z7!d*ZP8g-vup0vHdyVha83yh8iQ}uC`=k{4fB<+2i)?e|*0522Vgb~N{vvYxzIH*$$}#0@zd`9@sYKU>UAa$WoyJekvUWOG0hGRWEUQU01{_ElaicFLJ;OvYmA=bwpdi=}e3vRvoQs z2ZBc$;gA4j@q8XurOT`{j(OTniTVZ3&21xpgtWN0;Vz?a%rY*`KSVCCBkKLF%L}_UKE6Zs ze6B2-IycOjkDdD*9SUBke0qJHTAwsWaTy|jj!0ud+9h02CQa(qeCyHSJJk3s^A?$? z)Hb40OeHS(kFo&m%hW=O01m`W>U`l(mEOI&MVGS`yFNRr$Gk?9%fcV@$?Tj*KI_}4(2 zVhaNb85A?tV7q*nH?wjwG%{dmDih>>SdGNBe_k2 z>&pU>UF}W?e~FW?TWAzX%sF2@g}SwcRH~fein4lnagS=Z(G%MhZGzFJJqC)FDz1n< zslQHgX6^%bjlfsvyq=s-Qc>vHQJ^uxp;!p!Mxi z0eKE7Qa@NsSZ40#fn=}vw@v=*B=2|%I-|309^PCB0yJw<>byqjK0Lfxx%hAk3r8I$Udb>}Z zM`Y7?{p}1daY5iwJZt|K!X>oP8{{-q9ZqNCj28_sZwAU{kt_+2=gHd%-%wHb#y98b zgyG29Z@eKT|5)`haQLBitp|tm;>~Oy)O<1Rl!0LuW;}>%KJq^1_OPpBDH=v?-q-K; z&nm%avn1tIe}asG_0dtB7L6tRu=zK1>m&nv229t)4Osv;@U%&f`n;4A;@u~p z0>idTi)zy0wm?(nRX^4TpR)D5>J})5-I4RwZ99w>wk7zJ+@*Nkk{kiHEzgG}5{w)S zRB|aidoc)oA3f2oJsFLDh%xa-MxL_bdps zWg+OApY~XRQ9dXi-?)p+%lhddlq08|R?wb-YPXS!0p#IA!STb;b15h?#~x&}*hPI^ zufliGG(w;^ftI_qcw`FQ?j=5b(f$BqgZ=pZ>9|X>G}nsX zuq8we`gm$TPtubp;aNsPL6uvf^lTJ|v^2*lg=afBPrCb&ed56nZ!TWXmlp?RhZ_5- zFD4v<+>y{h-rC>uG8mUK$T0O|*%g%ps&%67w1cd`LY%Zx9FPM_UU(YfiL%m?5iXZj z%9RuoXJE$RRrt6)$atahoxzI;)htC_?p4G$?xuZE1Js_G9QryU8%d{-89fL_r$UK5${CZ4`TM1(mLOc|%n{j3ObqnD_sYQnRJxfq}C+=~4I@TP6qv(y4P@=7uu8&Gpm2486pIb8DV5*L#=F zgdsRIgy+EKrw}$;2Kg%g@(ku>oZ_SZ9dr;0^p0VKWh&cK$k%-ifqJ(XDsQC0uCCyQAyCmZoA>&ARm>Abd|!(TeFE%I;bW z7CvNKXFJ6s!WC-61>dmz2(_e4NxW&y&ZQ(Frp#e@}HIs+rhh{dFTlS%+v5WH*v>Qih zZXn+U2Q=xu`N|3b)w&-HvIMkSxXiS8&>Gix%&;?6K$$s`xS5pU*um&80w-im_8&hn zeF8ZECFvS6lL65{7)<0#>~Sp&DP6;oYUDw2KT3F>y2B}yiEwU=G3&Vu?FB1}DaR<$ z0s`el)SdnrO_V=j%gm{HNp63u(o-DhYn_Q(Y~h4ye~ByE;g(-l*zW1V2Bu^0f<@KA z9K)=dA7%G%9REnWvU3G1x_SNbE!L@ox!GMe*X3{Ca&@;Z`zVuhJ zB2P#tVm%4w9%4EW;bp`)xpmD_YO~_qaa#6-a7#I~hPaR&Hd?^gE7{M=P8wk$%p6uk z9Q`M6g--(5A&Hg_u6Hi}YxvIASQ76m2t z(VR{wVHAvar$P0vjaYl+{nl>Vb6Xo>m_G0e*EXhQ1HZX$+uD#25H&;EO|1#9>K$e5 zndj}pVgm$4`WFfQ^`Xq)7V|c4U)1DuDjr!xx?r-+V~bU`BPtN05BJaG@s;r$e%7Oq z->J73>YBm%Us_>DV>Qs!ZXn2xk5Gv!3)SWgU)v>I(`}Q!V5OZJSVUySBG&L;U!b zs1CX?Bg_3(shRm^mzpufu$G?^+2zU-kCe|4NFG?_Pvn}1{gxu9qe%AA-M2jhG{Iri zhO&!?b5G5_@I}PVgEx*hJW_Z4wX-$^Z>B4R2@3vB!-ifMH~rSO(zdAT_M_ftW{T&v zo^Z@N-r-4ix>Yull6Y176;)xg|NZEXT->>}-*;qFrTOH^{z8+xHSKB!S?r=0Jravw zdu6_BbrsSFdc1Qo14ZiM9AcuE<(XG}Z@~fvc8jW#s};p!X=RnQrllj3V>^WpGc6oz z8@=Bzf9`mqEL30ZR9Cmg>&xbiUcM#!e&2}y8MHI)6;zAn>4oq>0HmPI4~uhqFaUDODpXLE8Sf5ZN><&1=AZ9!?FJ~->g|ie5ybHRXS@e-DYbk#Xp0#N>2_Vvv{=To%C7S*U)?ce<6=t23Ryi@j;h1 z7H8EYi;l~;MIw>#g?eQ?Wpndq?e=^w^u zH}_SyN||}r)bz@#r)}Wo{(C33?09cZ7hm6E0LpShx69jAI>%vTH&jij8pa1@IUsuf zdAF@f_1Cs97JQ1UH*UnJ`u%N|+#VyJsyaLx{J3Ygh-aO7N5TJi?5r@4yorOOIfIqT z$12PP8p3K(->FQdPt}03{c<_(fBBb}uUm#%%aBPdpmbzS$x9D4b9?%qaY zex$G{|5F2&T;LB`9*Wp%t@3+jY+`lT@yo81aj=FeL5YDQxrSSieRbk3*vEI zDZV#%_^Ja>&$+1$2FDtB5nG`J^R9w^@ufVv$^43tQX@+rUYOxm;Hx=m#Gke{hs&7` zSV~J5E)UZ=GtUd9*sb9e7Os26(OP6%cb2oF`xI*Ml}DtSyt;Y1^b^5yjyNy!9Q0Yw z+Y7F~ji+zo-<@UiY7c9(#Y*@3s_23N0?dl!S5ii}xM#@lUZ&xarl87F$l6!x*e0Pj zWw29~4OO;xz$1mXtMwWOH(c9c*Ktt?pI~N95`X>q|CL=+k(*@7Aaz4`;X>fFiRk(D z;S2azulblBeF*QA?JM6tZ`&7)tlr<>b+z&7D@Ir?u&9mBSh2YVw?<*rwwaR$tu`N<6%S>2%GjM_H#oOLeZKH2!FJBHEYm6$kVc@2Z)uR-!j~9le<~Lv#GsnB zNOq9=GBEJ@i^tGLfBjsKU9T22>=kiT#?Q#r@er5qB8c(>I%S;NWDW|tZhPtAu78(7 zRBqN?r4=W-BNnFDifFT6#Jo^H^Qgn3Dv``zS!0#yv#o6WNbp+7!Qpy_ef?1?HsNY@3hUbVmroKybpi#Tof2c% zZ_N;#Ek5F;bU+!Ts0x!sOk>L)pnEho;V@r8o*7|B*+?U4 zd8T|24y`0--Vx<-ekYCV{deYOnr$5A!}Fgakz$G>>C&mTjVzoOxFgE-$UPmN53g%WUr8L<6lZllHU2B}rWo$N$u<+$`6|c(#ge{R@)Z;+u3^aw^BMZ(3a` zp*qg`*{pMen8sX%8GLPI?!qH{&4F?m=vya#7~8O3^yBcq&?Ikwnkya(~YB ziq{u0CCSjGp#3fMhVkUXQ*3X67Wo!FfOSF`+?%uwo#5CvwXTEAP;HT(GgNk&!DC~_ zZHL@ZeuqtnhwR+BV|WkpC1h`#NfmuwN|+|SSCBBsS$h~tQRLOZD2@k~RvSCZwf2Vd zWsVBP=7*5#=rU)5kd$J6{YK*X&&CgLHr#R9Lh$yX2X|SjF|6l;mxfnj`A6a4GUAOzkO? z5;jY7*ZsV6(5&27Dt8N?g&u%a+&YpifAmd3h1CEvd9{iNxwZgO9bN9s*m+-EWurW1 z)&n6$D;iLB!4mEk&mv8;TeweHYxH)`W@}dvwI$`8yR0OrcAop&YO1BdY^5bXAeNhiI)(eY$x$yQ-+6pFE$TXTc6w zng?pKIt;v=sSS{#c;O`F^+z8gB@V?!g(g^ZP7?PTf1C7xSB&RgZfY;f{+gRT7mc#3 zYz?G^7}75nnHWEuVt8FKbh_R07o%To`^!8Y9PUX?7@v|UUtp4z&-u$s_&9^~9ih&n zmxn3UnrOAxsoM(DUmwO1hH=a;V^d}n9D1ta8O<~qyO`-uGr&h*|M8&n{ZGIBsta_b z&W-PVom)CgO`YgC!?p^C2$|Lze91^%_q?85mmB!YlwgY}UU9BmVY1+}P%GmjaUA5$ zxvUlk9*RpRJlYCLfi`c9TE8^Xm=p2r#=8#BfNNkRpC0@$P{m=wf2!uW3ZHjz|3J0Y zoE~Kt+u@$#C?V>!t1hx&e&z9L#*~)URFXEX4cRw)}S> zLV;TrOxS{XK{v}&68Beyic_!s2!XOu@7BZK?W8Tv)>X?`Nz^A>0B`bpH;Ua)t;#rJ zZJL^me4ECgr8;%>PF?>MkhoM7b~+QVN^uLJ$*Qg|IO8BX<*}a0EFem!+Bpkr`W?0r zTup04Wd60m+7t~2ZK6SG_F8jqXgR83h`5`Rta9dKu0Q_wWnLFNWfQZ}D`9fs3-GHZ zU&xc6!aRR&3!?EN!#h|F#|#K-Oh8Xhw{M%94mLZVVyB9t9U+k2_YSjJvIJ@CQ{`N1 zrKp;kD-9;EBwh~-I49TNU9%DqdwkCZ)bSi^sLuOa;#~u^2i6iD*;kwZ5u%sA>Zotr z@;hP|AHHDEmwj&>Le=%W$6b-?tgq!xJC>IH1A1WQl|D$)KK!sr>~vI)g`do2x5iQp zA5C2WpaYjbIQ(0Vvs5X#eS~SrN5RkjYboS3E>1!&U%Z+X+PJ7w??rBS>{1zaLX83;V|!etuGWVPWUE7UNr`R3XM5ygG7dJH&eF3j*mu%=OmVuhyAe z+XGo|zKYJi5(wM#f^FsPu*k0CPtU0(L&5WNHgu71BVz&BLdb^1niUA>;LYd9d-EgX z5g$Ch?MOuq>^*AxP}~zgd#<$*mL3+r-I9d<(hVNTt}MEFfIQ*PO*?%C2R@)5pw*B0 z@!;k{p@F-->?37Y)yVX3@Ql+Kci)dXD|$5 z%K5S@8}2GzI%h@aI>i8R;x}!NY2y+lBJ}H@PocJ53g@0gzT9goXtzY_R5|nL4Sl6W z<&$>pFs19;Yggu*tBN`4P%h{jT+(kc@GV|O+hDd?6W zcOntn(Nd+JCa`B3YW!`8|MVroAIUiI`r?_Bt=U-ncsDc!T>nuRzep#W8pAIDpQL_w zp8=12+=6ReiJVa22kPyGd2<_H``A~|lop;j(DJgS+a098S|=p2y~ zQ>Dyb@I~i`sDr)hT0j1;wTV%vJYgooo@%aCTKLGiu%p7Q&qA*=>+!%^iSe$-^Vf-~ z8cnGNHxK5WAqW*tG`R!;3WzBAEJ%X51#)Fp$fYj(O7`r3sOLwz6Xj5=8Mz98{p}R; zEO37Z%|QB2xV8Nc(;FIvOAbfh?_-xUHMgE?jOM#U-=g6{=o@iMp`*+SCjN)GLEIQs z1o)R|U57hoJ*KX9Gq-)i(CF@}um2|s$KXjH+KS11MWb8wbOt_8`-aE!_i>CB6gEu` zOb&-ZtuUT;xm@}dgO2udRou;rUk$nvtNs~G9cA%cdKrh) zZ7D?!Q-6Jk#+TsehP0F+v0wRgCNCmlfbP|gC=!L2LVR6u6@x9sW$DvGdR}k{JoT8w z6F@iQ=E~zAxoo#en~~Y!fcwdhawMzkMae9Qd%3m=T_^@4vP~8>5tY>Wml=S&&tthY zg^T!(f)iHXOB!`g-!diVUVm35<-a}g0#)uIS(mL~#OumWaEcnS4JRUIAiR_02)`uE zE@PX@+lO9iTSjhrik`P^by4kiL1a>s@99u;yA3E2@ctNXf;gvLs&F?o6ruQ@gjDm* zklW_E-~43u5{|sI;)6VEtJNbvBQ~wm4_*S!85gWZXj@$lS^a^jWWGuJl}<_@ys|jl zfaAhRgCuXW?FE8`V3!ZFDrRI^E2!iT!ad#$a#0Eu;G`Q$>!yL@^>;61;842=T-8t$ zLyR0PhiabyGk?S6F9R)&t(P8IXmq-Gqv&*N&jn1%pgI7P@IW7?<5ICL=@%F!SkN`yGJQ(k6cq)$jj z++{)ygb@ZOl!9laAV*ZB@6qd6w;I9gm8j@GO3caBNK3$Xyw3gr+F+AOy1_QsT5_@3M!0J4uE1v zf(M~qA%K}_T}~F@xNI6p;Zuba{j87xA)rW2Rq*LZ+nS$4kD}ut1`$XI=?WA)LI+I8 zAOHe*dR#9JO#DA3mi*I+usZ+%3l{n}jf2kK_}?SHZUTS;1<0wY+Uu4Y*`B7pN4iUE zx6vcpRWoD@J?a-^S;{q_Qr}zp1XyK-xmVwK=s5MKxrkIc{`_qOumy8Cfgwm(zzhbE zpIGx5uuY2(UcLQvQrCOpVUVs`6b}`$YlnC>!wzKD`k)__3a1qPbL~Z{-2@|Bw%g(k z#m@E;U_pBkYbeJZ>1g$Sw?7u_O2LM1H1wX$pTJ(dtAYUWtl-KYtZd?l z11}G_g$8_KAcWQTvjQ_r>6(QsB0$Mq*B_i{=B|_e5%YB4h#$KU0IC4MFn~ZV7Gv^< zStj}+nNxskz)Xew-@M50dQ%oJZf4vEO{v9705^ZpK|(QhDOfWAwV2jHmNSV1Y74F3 zV?jnVPB;WO6@u;1sZa#ZoC@Rd)~Rr+WSxp&P1%~@;HmiP%;Kj?U>xo#_3AUGUxzmB z1_>xMQwmEj@3D)huT+{@`>OG=wy~(>6)Ff%ZFS?-y*ap&_&pFs{K)&8$jg>rn4kl{k%S zyq}a%ucf15v{=%?owhpZ5L&(3_t+d7_^>D~WVfY(G6((b#|8BA0aEEO@5&H_^^5`mX+714k}%K4h!Vc` zfC?Is&`L*k=#L4+Xt&_a1i}DhV2EdsZ~->nqQY|Xp$zJiC{@3D_cc`n7@_e3A*M z`bKAadTovWQ{#074gn1V3kQ#Yh=h!SDhmxA0}~5dHV!Tx0TBr)894D;C+WT!U<21_4^m--^~Ip zJdkUT83C&E{3jCy!EA@cYG2ga2VMaJn-MyU{k{hbV0-A(7TnmIU00bZfh-L?l84Q6k8(p9$#9e#j zay#&*{AZqb!i{nEIFLFLjG|^yR#~$D|34+^7{d+y08OLnKP1aVk&cmYh+LTSpn$_E z1CBKUhXx(;t@HE&$&|WJnIW@OqKVmh88hLPv?y>}N=NO3GRf&N@`?quW?!+oJVOxQ z5M(%s#o|K1?dWmCdD*X(En&UgZ~Gt_YA^Nvx~wn%5b!1mvj0#^sPUTb)=5uBiepa{ zM@C#m?v<3t_GwDBor8v<ttQO?g=!#O_g2#tM`J3K$P-v8VFqW@nKOE#jm5&c;t zImW0Q^h9U_r9`no!bnamPVbB}?({-V&$u$`JiRtAy($LX{5}c6LP8)wpoZ3I{h3ux zT*ogqj5^JCz8()fNA1td9=LZUR>1qx6K~4{4g*f)xHy7d7KIz`4CS<(k&^?-P6~p; zlMpQ{@NfY^v-_L5{sv?#w238S;()WZ13){{^i}>{`-Erb{ic@G-7jf^E_BhPN zlt>z-oxOEA@1B=oe8=`38v+X$EK-^>3^bbq1mABhf0CI666W;1vn64x!~&3Y1$L_c zr&sw`Rns0{A1{arfc3$CudWOh6_5g7nN+vW4$y%^dVK; z58e;kU~zxK!!d83GNKVCq4k?7Q#mQ{M5H@a4(ONd3j}uH_I4S&O_<-{_3=;qyDfxb zNX<}8iS6^`a5!cZg$->0)^B^QbZQ{-W_Y1Y@R%{!e1dC_TUHRUe0RL&twDV>P$sB?z9jlTDbh2`HHuPsM zIl#>vCZ*h!k`m@NM_`M(vcg6cTxEr+GZn&Ay8fT4Wjo|*Q>VRZ-K|}PTy%Ht+}Ta% z(&gX}Ko0(Z0RvJu7*H|@^3D>tyH5n9XA0B?Q7JgZq@^}e7qw2gyXU5fv1?s)Zd+f| zxAyy%&hF&q(-*pmml(6x%3SJRXhoPbWuP0yL&#bb%3+jb{?}@CA-N^-Oh~3J|MfZZ zIT!D!&Y6#3GPj6`_h8n@5L)7~tW`CE#ORGh+jxKw0qeEbZ~xy<{dX~=-FEVFj5Uaa z5^}-I=-Qv!aqPFg(tT0)7q#mdg@GVFFc@V498dEk5&%EAMgZ33LqD_x15-(HdOz^v z)OUZxpK)dtiO@s#kCJsLmeY}y0UK`=0HCkj4FDPLQ$hs98x3T2#0vV=_w+-YMg^8* zkG&2$?3gps|NEZLJ@zNmMsCLCrM#9O=MO7gL4`F{Gc{LnDRD@K$Y?U2Of2)4$z^Jp zPIgz$mUHEpTqO6C$H=$J_seJHZ_3ZhKak&600luoQcx6h1*Y&(NE9-KQlV0WDv}j? zg-Kyi*cF)yr=m(xt7uj%RSYRsDK;p!D)uQ3D&A9ER{W@Vp`; zs22u43;a9q-;mUhqhHA8=K(TM<%2jX?&1%)uKpf;1-=JAAdLU5eT0KDSVom$GLg(r zCi{oc!-wSO4YN=n{~(m`|UGnlTjP3x7sQ_y0q~qQzB2UbPf^1QIN-r zksPtboYe68Oy6G05|yysZgD911CY`YO}qFY0Iyho_CI&QMn$6GmUk9@j}32LnfmCB zO~hgU-M2fV{v<;KCAbwP2E0E8_T_tO*FOU{*4TZFOXOP*M4nCzG33QUcAWPF_Xt)p z9srb8)QS*H%d#SZc<~h#px;yGFP+ks9ucD!G~a4zHCIIZx&o;Yu}wYk#cDu}2BR_? z-tdC%!CpAMyn(YzbnucV)5?BuHSF3T6WSQTT}m)uKw3|v)jHdu2Y+;UyZm$LCdSEP zLTxwr${Dx$uYk(syIJ?@#oa#9k~@p@JCB9}&D682ts2ecCpb|eKW1Tx{C7PGv15d( z7|9~PMYdElD;q)Nq+AeO4+IzHwhy_}`8XLLr(;JJ((qW7=e4u?WQ5@?^u!(mB}J{G z3QR!ksUJg~UBJ+k2KvtXa$X*V*4GqC#6|BZTEJDuZ97~jqS7^~cKyQ-PUQ6KLy9sP zZ4u|~5IdLV7R0=PC)WYdQDSY!^(yM1$0=VG!+nxFOZ0OOTxaQ-tDvrAnmrf zIL7k)*_iZ6G4SHJxD~-*&dF+`Yd&d+wKRzwYQTpfQb_DExR8sAzNaOq1%qDnw{p^3 zii&5Q@%8V7t?RP+MGh=GAvQR3yFE4|%5E3D6K`vtdN>Md?DAzzv!a8J12pHmwT)ew zngF%jb>YN{xb$E>a$6i@d6A1sml64?I%O*Q+ZTBMH55D;+g-AutSWkVza8FxS>Zb0 z9rK>vM*)K0xY#m;Rq2Mg6C>Bc_i|1T;i73Vrns2nFF$gu2S z+Q>O;sWOBCfm%uU4lMv&urVPCj(%ZE`@ggRrwX+DHBgvhLfe$gh>9W}Ma!pwD;Gpn zy(j+ugthn+CI5-FJEnUj3J9WN=<<+6c|m<$_B*~joC4~B+ z)XMv>K~NLE-co40anN#7j(yyFc(OhA`FTrmij(lMO;`_h0TdMZh72ikC<-W=P_&?E zL(zev3q=o#J~TT5nq+0;{K%-F6<<4S!wEM)9OY|uf((z2caP7@6u=CTj3lkgo%+h9 z=sYJgb0;eH*lxBR#A&yvX<-uXn}^Q4Z&ogEZ2(VDPj2EAY_n@GAPgMKiXtHYL75r9 zkoB^W0zW@5TR?*uc15t_KcI@+sIN2?ce+tWMWeKL7X^uQ)Qu)6ZYk4m^WXcn#tC7^ z-Q)I}4m$}hTwK%LdmxbC;p}4nur8`l@%Obj+RY;an!E!qWWR>mRFzs(P^2C{y+7$a zxeR+)&!=vS^ZBajy=;dNxlmRzjl3mqsu=I-%txesFk>%NnR+%nH#x+3FE>!#PlC!> zS*B^-b((PcXyp-Fc%2aw6tG3a7zkhWWCwQ8#CZ$yZY!I0FM5?7Zgcs71{*?M&7h=N zPoF&WNMw8putA7m`AEzhF-fM;^W6+J8u6~Ui@;REt*++5rnk>q%m6N%=~krB(!G3q z48#`>Fh02%=x!mr>I6~)1X6qZkfC#P3uvq^ljM&w_g%c?+;!V8^;WF>aj(F=*jRQA z?nh3w$*;#+nmNPI*A)rjtomiL^J}hQs-S2DPl44o{P}5CNAb__g7yc@bz6mjcG0_QNx#!%+7;*=3T)6z_h_tjt4f75Qdx{$+6GJ3fM$K zm~#0u>=7p<%mr*w0bwcVl?qRM?SbBa2iOXFXAir4ul5+05Cl$(avX3;0h1*Jg)=H9 z>~PK7*E)CrLog;NfF;m2cmPMZ=b{iFJmb}d$hZ4^6m-zz9z!us5+()YDgrn$KqWn5 z1}WuH#>;XDj_42`sUtw00O@(2lrAh?S-P?G8iINQsCPj60h7@uM_(L$bMzB}`UR*z z!14c>@M}G*?W49f;KuQD5bwO1j%W<2YU*jL0SN5IW+2r;dxqcx#U3Ayc>?q| z0H*{15Wc|-JoOcrH-@klaUiWI#%ggr4+0OBBsMEe8oL<4i+EAGUJA_P=!9Yv4ixCg z021$4BCNPv8rymWPw+g@(vliML;%H&2T7E&0*?n#6KhzNa<;Kz7D`MMs29H|4VRCF zp#7_h!oF3nKX}YHzc^l8 zy=h!I(YlZf$%(yEjC^}yuYMoNSsoQQ>?uz6AQnOE?{dPYqg zl+AwST-9k??`c#W%`aUzb2V9>?y?T^E!D!#Tna`;FQQx6Qvn9tCzMbm#y|dC{CFOx zfRo8nKTe#(c7Qx7X!`FI!mpJWMvw}UH~mf|o`9GLt;G=CaD?aar87Av+(%%KgNyKS z@_p2=ZAE~V*G=EH$+FB#T&6j*hVlQV0yF)jV3H|dr-lj6WN5u9!iMF=sj&y~mUnSN z1K`zgB1^zYG#BrN?9m-D!5Ymva2&}1(Q5<^>KqMS$h0W|I={$*XeM#D85Gg06~8z@ zGHlDwfF~d-NZogk_1oBOiHxvS=s|?gf8cyv5MEqHiUvTSj$P4)Y%hDYdAsXvrDU#| zzWC2D=Pf3q_$s{W0MQ*`T8XrrN9r{?G#EBF0D9%l$=jW#Uv`OoEhJzufJG*3B;&=V zL~=_wq$X6?3hhTCojeNEIjYZhu$SAZ!L!V4g%rX~fv6zI;WRXrr|4Rg5lVJyCHRqt zLXo~ZWC{{9NG^plapdH#x6$flZ?i%@&@&p0ujzh#9HQW1U=`V|b%mE4_cWH0FojIc zkSD-`ckco;iB=JJlJIZ_=zy_!h#g=c!-ZcAED|Jx92V|*dM5{wLeqBDmy@+}1@T$I zw;RN84(Vy;tb#dE;Oc^5xoxeN<&9PkA1Czw{mKAof{XvhF`?r?LA!7n;u*bINS6Gd zHCq7rr5o5ap+X*{VAgm24NZpzMCb=OO_VdCU;3Pm0ZjiSQZ#j5A*EBFyha*aHVZw)9fzb6%BMhVWD`b43Rg83E}^uK zhgFDo-hr^GA=W^eOR4C>^3}KqC#RLrh~(8UfsPLJwPRYq81(J1NXS;3T51?V7Mqpf3HAKZfGVe^;Ov#Ls_@TP>2= z^u>>U`culxx0>(?L*=`FP&EFJg@;au+L{_Q=S<@IuarHDS*j-HJnXgg5zVV?<?ulaNwP$j}huNLptN20)+MH(BL9LHIMa#RR|$&Px;mYIH_pkfx3>HRnF|LW-EhDU2!yw~O&>&~2Ys4skZ;DH@V^lDEw>c@}w*1*s zy@3W#+z1np!qvhRezqCxl@Yb3ay&S1!?v8R#58c7lM(i%)R9rT(lRpe?x=BD&ya_D z_N)2e9~%Z1L1nTUSc-4+U~Z)RsHK%AgxAOYM{tVonxgUf4fwuprEY+}+L};a%12ks zRrn3^lHklPN4iZs@Y`!XMz_&-f&$NsfKm61VRMyZtQA?D)-3Nu&}jPD*@EdPNH zZcK*6iVq*R8!7qod5~mqR*bTm0b*+?binBdm7m^9?x|JjG8ZW-T=A5mYOS}bQhgtdTO7?*e7E8&n^Tfm`-#j;f*_lq3oBULYhn7YkfV{EqThC;8w)A`>pzGDxb z4HP5KQcp15_$Lt%YD97*uZi5spBaO_r}h{86O&mOkj^=xKH{n3O@-bjRRV!G#^av` zEJ{w5d*N>>#k}iV0p@#ST9sRcylgSkvFHFPKmk*!+#gl_wEr70A*LTE@j9xZeP}#8 z_X!w0Wlz-8m};(ZmV&GwHvoEU1^x;qu>VPHw=9E@ZpJ|d1DeY_d1j^AUZol%c|2anStpGu(v>tO~m%-E&i15v4?3|F6qU* zY$G)V9I$nr|8TYF3-!!>Rz?B8wv4pG1e0CtTZJK{AM>Im@BQqK!|tDut|9 z%r6-M3F$mel!vu@v^3T0piBEa5-jG0BS#8Rai#}R7vAWdOGi<^_uerH3Klry<{lkV zyHEhjk%GJx>dt5;XO>*pu$yd7k&gO^5r~oA!Y*q={ge3xY|7ux~?v&Ksn53JA9t5EQq{Zy0M*{ew*F-#`q5 z)oikef(X~KO9f=Zi!q|RtypcR*gZ{1B#sdeCy>s*63!$_GOXbm{{f&7-rdflBEy>h z4Ml$s1vQsed98dT7qMo4^T015lJ*MXkjat2w@?+oMm?70KHe|5#3;5Pc~j zu%KHH+`{o`Ww^qwD*@kEIJ(tm6q?(cd`cCnl)vFKOxdEdBDsS60)H3%_X6`6e*k&k zq<{xfgi348>fOd}DgIIesgw6H1w9sT?OjG%cL!1W?=jD6*U%wbAPU-3H<8|gCiZK1 z*Ah@fum`uBGCTw1D-gO^5lA!dO(Vf!XCJ%mCGK23W5L0L;Qmb{U@3FxTa46R(QY<| z62s2fTsnCp1`VKT(YGw+QtwmWZZxeI)5Z%)Mbk4qg~4-_p$tpZJV%rw2uWVm%Vq-W z$xcAAs1m!7%klCz{M-(;E9FjD^J#V)3od)L{*2rNgDAXtz@KneYtgQy-*}QlQjI^u zZr50}_Zr@tFT3@XlkT1dj}Nh{f(CCL9efW*EDC;_*R*@ylN!0(wGnL{Q(mmUj%HjX@4v|WaZJU-UD z=hPu$-_ZkM5PU6A9y%ZgBIw)k9Wq)vk=A4_eN%0n61_vfgtYai^4S+?$ypRNwg73> zT7g|aX7o@37S5*J<~W0Pfd@OKl#;t;s5WRMJI?(+~Fi^{Xv&v$+Ecn2+zBb{`b zqKuW+I(8lPv^2g0YPJJzw`1a41D_!n8(?TxeWz!Wqp>tpvg zFJl>MNzy}dSaqlQa>r-5;!TNRnf4YFYQPxQUgjMxa5~8IH~Pqxvdv<@wSol=oz@*O z#AcCd1AzlE8sM9%-0;({WQ$g@r$0_n#=?{5yExMPV)LS&U-;0%?T>@f&T@gTWT0)_ z4!%BR3g2i%*%wHFq7J9CUmg})!LDP#^+rlARauEfkg`Z)VQM?Yg~TQ*nHa@ZUKGR8 zejLSx20MfkP%8mMXQ6IF2kIh(HF~Yfd;5r*RpA0+m+?$jud=Y9iF)H^`ZA>DxMo|0 z+|#H*9Y%O&=7(Ix`~uz+%;VGRf->nU>YRwfq;zI1rBTL>LW~U@6|M5S;N4MS6U8{g z&}-g?O?a{t1i{PWWJjk!HE%vKB4nSZe zwe1Vh5hz>@Qsfkiffe3HK7j=&h^iO1`BT^(>)1yIk|na1_J`~I4t~UKq`RAf?Tuf& zdBc9v^nni?18U!ECAz=A*?#YPk3$+hU;~sy7ZGbifn*7mzashi2x6C04X4is)S%UHuW zZsk`zS4wV75wwV`S~A{KrAW=s?oAuN6e#W=dxN0v$Cj&Ho#oqq;uy?4MPFJ-StCxoLTCWX5AUjxBZ5C>G8yo6s!)#}9b@lMbvZ76yNhX- zgc-LZkH;cEi&G%_S@+Ln!tns2EcJ7}BL)l*7dRPZzom@8>V3HQJr^4mTvnh9F7}F^ zmspw<5Zo3Zd;;a`NE^tH5epqLz)d#PhCBsz;4@T26vW_-G%!$wLYjWmCIgsW;@hCh z_fbH^W?B3Vtpd`pga+`n6K8=)nO!~L0cBzKO<&U!!}j zww^8LQ7sm~Nv=wk?|0Qv(~Ypb>uL_+>z^f0_nkpI5Pw`M2!%uU9)~X*D~~rtRx{W^?wsY~rA48F7yQ_P0g24e}wj ztOe}+p|_R}kbn|>-Nz}}oYNkoYM&E1x)@Sz?xw=z2=OV@KXTaR5S}aGu4$XTiMCTSvX4-gbL|iCACR# zbURFXF^v5oGI${SEBn-X5z(tWnv<{wNKN4IB#O(oSSTZlsA32l$@sB|(nd;bc%-#t zUFnvIfIwN7^iW4j`(A6bqPDQ3n={5$B#!Vb3k=VVwnTnk zKyD@GL()li!dG)pJV^99TVP!W{4;ck*qMQ1Wi4j`67aJrNYdHD6HdHz(#bFF5@hc} z`p5wY({G8YXaZ1-^Qk}h(@VxF)2#VLQI8+Qx@@QpoX;q5CESH2hNafjj`9QDjiBk& zkA?-otpdWDthAOSD7A=*Bk(RJ_8^o;NZQy>F{KK^)(RjBg_ClmD4RkVUPbT5{lVCD zc8J;FxSma{q}T%dbSxUD+WF5|`X_>}xn-LHW|0Zy0%L(asu)t;U>hj8Ik0%05*wmd zz)vEZ$WmG>S4rdk!1~LtGJYvG$d|^Un($bQIn@I;P(5lRw##D3d<*KL<^9l;#XSY%rou>QMuPeMuFN<$>06LzPVBF57&dg&L zp<{$jB8Z`3K8*i^8G?d=;gY!H^jYr!PQ3h(!M>t}d1Rx|a9tyHyWh=~pZ5#J_n>aH zP5vU9e-T+4-Jm+7P|1dgl|W-GZ_w!XKg0*tx#C#Z&AuIhS?A!o@I{E7wfc`tMk`ayPIM?&EB5 zVc$%E#MW}szBBfMoNH_YT*-{E=IZ=I8?h;(v|idG2NIxoiiZo-ddIiim05jvFAYHa z6AVr??}S>;N<*`^H0hsIPD6LfKS777papj zJAl896Wg+E!-%p&@kCxoTJ`xzu`FB(57japc{Q&_0wK)_mU0IyE*Cf>IuK}CJcIU8 z948+cl2n?QKE3pO$%%~M?cR{kfwW=WCPL4*dHL4HKQ`>rV-x(*LNub{d`4yD1N^JJ zhsUFVM+{Y%U{gVqO~45$idp_lM)L9qlB;tJ4R6pfF(b3wJ48@VT{;P5w4x%<6TsEY zFc4UBmPX-7USZ^{ii`2Sfi~S-see2*$3SZV5UK1UAma*Z-A1{@Hur;aBDA;CS-nDWuvr6z*m;7`STMV~ zCZB5>ODky)NJD$A`*|i}ZaSU8{!7RcnD{3WT;nPa^?_1qj?Z~5UFx-Fc_FCi`jo7Vjj#4c2+XNWw=G)H>)Gx6cy=N?qJd?~A4m@~ zc0xCZvX68UkIKs%WoVql9f`9p@;9UygdaiL{E$DKfhA+E_tS?D<)zcal0EB?;SIzH zuC}D_RR~JILdGpZTRD?7i#1@yv^#q;V>X%Qvv?xGMaKwa8-{kePni?P%d0U4?604w zozvO++hJs(7;As&m*H*mFWQxVb3zD;O#Gd{qWvwSz41$bqwL8ztQ=Iw^|0`nx!C%Z zzcGF|Xj@TI{2P*bg|v&4+}3K}|II(8f6D=JV!iM!IT6oYnfAp0((T-rgDu0%^V2OyOTh_GcnjL4(?6~kVk4bF5ehYIS4GuaZKr*H7AX8fau zctYhGlN$c#H?yalp%s$2IYIjeFfVJr#p69 zpdM80cxpucv!w4S)xUm0KD-<<%AuIpv7Nw9Q(SB@aBy&+$WjCzMec=sB1o&*xPh%C ziq2QU=bB!STb96m!6m_`XO;c7hm@Pk(Z+FmIH^^AITCzQA*rG72yLRd;KZZr2LG8J zcMB)i z^C%w|G{@1)@hpFdAw}5S{!1$GSWZ)qgO4lsvEX3RUCWGX<3O!e_<*i=)$gMZk%H*D zRHI`nOxNQTfyB3Sq+CbkLmcEalq#>y&ibeL+t-KF#`fImS93!9Mx@XC)V$W%FEuOq zMa8^tjAO+q#b5$|_juUwOCpIztoa$~TC?hVOmcpua>cI~rZlpEnV9;fymVvgQ@~BUjH)RjtloF!fAM= znfI|nN{N^_k`;dex1Q(a!l6W=rC|b9_JIuA9wN3Q^s*!`z_0RTawN_$@+>mN%-;J>qoVQm|qz5`7;Ll z+Cgp;M8pO9^zVRdEfM+8@&W7 z@>LxFP?K(JU%<)uHGHNXHZ3l1xv^hf;2(eu{fW{&d(rWy_#Un9m<|+n%II>%wIwix z9n+4%1}!Fz#bVn4redq*KLn_LO#7drO0r*9>0+|tr9-0f^rQo{*$>Fb!GHOAq9_O& z5(xwDYg%VJ<-vIdmqE)Rz-6VNk;nCZlni(dzLg92_kkvq)4~f`8?r{$gs$ZSb7^29p=bxV0C=qVfCzpf&&c7`d9wsPmH3iL9~qSf{59f~O5Gi(Xmdlv}rU zm17Rxf|l=O<>kBnbuJ#c3zG}B@n{2;{yJB>bOwS*a9iM5QOIGbc|NbklQ(Y(ZgwYE zvb4e__Pnn+Ou!`adHUz(ZiYlc;jNi;h6v*C*4Eu6i=}-Bvh>jj^H$5cnEXxJL460c zzx0^zXQ~Pdef=I5H52^YU%Fv`}Yb%j}k|X>I>oaq7=a`Nt8w;{SCF zCOnV7DTtC#21=*|oJbV66s6+T6_L%8`7s`+*Yck)Gi2_)oDeX>&hCrahfJeg|)6Z(6=tnF0Iu&hUnU7&r`q1|DBvbim(Vh{LV^Q619% zvoR^h$FSiH2^o3FTBUtBl_qa1a_2wQtWs0I+(-3wz9&L&b)Np_C8KF%Rv&&mEwNd@;lkiHI93VaM9lXyhdZ5==V&f6hLvZp0u&c{TB@mD1KcXNAgw!1UwPchm$r2RUZmrc_M@=@DxW?h?J zUl$kfdB*1|O?M~p^!*@1PAHH|^p3J2oG7+)XsKRdDD#DA(ittbF@yAcwOBMji;5YKE@>rS7)RGYW z@Z2F@kcuW)b~ab;oN5?i3DeNo5|FFo7*$pucXp=lZ@JZc&f1K!ZjQp=w;D=F-~bor zIbPe>TH%>!?J(8qxod>7S!7fC13{=cg#CGGut=dyIJ{2Tn^5+DW~{H7t#$gRE>0?r zb8np(dv%x&{Y3Iga(jewo6LVw77A{d1H?zJ|JJ`O1*CU$#_9jA?E!WZWuC|ylxzxZ zmv`)ZW|7=83i4_>1{5d4asn)s5~wSt2ox>}nt)b_L@001$#vm2N^dwY6Zt>L{pC%_}q|lBf&dS4t5xa(ni!jLQ*s(UyFk722+*6h8 z$qa4XAXM-A)_H$}`?qXci78cDB$IT@LIA5RGG*@z)VZErEf3AgX;^qZu>7yG{S=4U z3@de+9Cc9mxzu*LeRh6s|3bwYe5N!afbT(8>iuqKX2gk z3T4B3B2*Vsmb;l8CMSuz=|Y)ndQrl-RlikP&tP&`{VQXlMwpBdg=M>G8?yK3N=YCfUqLyoy!8QLv6!k*<%g6n0Vn_PtLIIb=s~DDo>(76>Yw~|7 zq;ZO)`5*j+dv&{8B1fXD%1eKCxxhdL=5wnvpWgr)nbp-`pqNK945FKEy)>I`P+saY z!|Avd)dB-szQ&LPv=Q1GYF<)BPksD4i!(;Ah|yb|>-}0w*^#!-v~-U=MDAe~m`p`Q zYY*L-LB}wm2vIM@pL`26Kl;bsJ+2+J72UYxNN8p4c?O=~UR@+;O}FZ@i@?P+PDVK~ z4^s?W3M-;y_nki}#_%8<6FJThD`iBRryS*f&B>U8aRL+~6pWco5DDoSOFkV-=39 z3h(LLUFT@a5p2bT4N3ypHpw88HwGOF9QL&3nkIxo&p?AWGb$?ufkF)LUqZqIJG(jrINR1c?Lv8r=hZsLGS^atf4bS=Q z0v!+OerxDohngbyG5W|Y&UJ})?}q7h7MzZ*r2d4CUW3VaQ-`OiWGiIbr!z+yhK^l} z#A)c#$xTc=KnX$T5lG`2pY!6#pr1rUOt~gB#vMnEEPRzt6XVRM1Q{OCJfuhM#2Y`{ zpiU5J#?C{9A1(yCj^uSt5CR?`7Mpwcf}THf=rEJx)w8%_xI=+1 zcpa=dd8sRM)M_yGIL6b;2+C)^59y>*vR|yv39i&0UCG+JhciqKP*PdF8Ci9n*}y$3 z*)!YOgP1tS#~9ZBbe!(4s&nUBh)zg`*i_ET-D;|@50$`SGd0#g8P#puuA}A=ap#m3 zy1m9%*}U5~<~xn81-n%PD!%mM5er%~LAp524QlT{xSSj_5t&2LYEb$DE*jw89%NCN zub@^!7y$-f@FUcl?vb*1M{^rhfN)h zBVmQh!+?uxRQ#Bnz1)ducAd%vV*~Bn4b|d^t$MKYD;jS2sd~72Rk$H8yJmDjO{H~vPz#QP+{BzkGf*u?oc`77 z&Y!9HfU7m975e68O5wha{az@!7LQ6}sm@%O(U8#yg-75>nPSV$etAvj&hFNs~01c0$MjP+tNhgV_uw z$C*wOEdQga29ioCFh>AUP*gi3;$pptM97p0CYOpBVoW0YyZJOmL=?2%GtFT=0Jo~j~<;OKpZ3`3Xeiw$P|m? z6o+z4)9THMO4@Xmte=GP5`K+U=tz$RQmb5Q@=K_WC>?myx+D{>?0Kl+jR-_D@}-NU zhw(MHuy$wxp$uUyqezbw6N(8C;%^Bms9n_CV2rE!c2iD)DKWj^3u$;bPp@U-yYlO@ zl4#w(G_yAl^vvn|zm>9l^|yw@r! zHu@urX9HX4ryhnuAFBCDyx)mgZ#Pi7C%-QaX?4*H8;iM<+O1otSt)5|l9R65_jcL@ zSIQwlzv9On-jxlkVky>DZlEnI^?kbcFD3J1O7z^)1vjX;MQ_4QNi^|a3-C-5+=^`K zD^y6k5<8{7*9gH{D={Iq9rx<{-;7%Q+^p z+9D75fRPakPMvFQaUq8lBS_=|-zZzkE)iI;K&o=1WuXX*MO*~LR`uS5f_R{auv$h| z;5g-Y{eroQO&p&jgbs@tIHi6%quwMV|6gIJn0`x2>q^XxijXu&{fDL4KZG%Q0xO;S z!R-c9v_OC-&CPJSJ~vT{Q@?5=kFxZ8AOz2U^~~-#>%xt8oN~OR38mufFXF86wn}}A z1*gn4H{GD1;|oa$?nMqoT;QGCa>9YHA0<6`Yjac>r@?tV7Sw$bk}q(yE@;gUh}~4{_8IL+iw@qa>uOFdbRsS z{?KxzDc$6uYzrPa6;b`)-;H%`ot0F!^o5oF#fY;f-ir33UV1D?<9sFUtBq5u6KbKQF2D9H;MF+oMlU+u89JvG`Ue)EPcqr&Wg~6*T(oL^)*~WjZj=9=1rW*NPnf2R@?)wFH69Z(pLM3nq6wis53f+eB)oD>g`R|Wa z1xVoQWrT79a_l4mn#XSkumg&BLrH7`$%nIGD@|4IM<}OH-)(4Mn@Jet7O&ZtoEfg5 zcYVN6zi>e$6GukR&gIzJ5!@<_OI(qxYY*r&L}*t8=-QJLSHuaeIOVvfb&iT_qPukM z1gP#C2oi~KWZ~JlJfuHyIYYwr%c_5052CmVj+S5`k%_zu#aw#SfUmhhw|prmz7RCC zSgK{f$;T^G71o4$*O^Y1DGT{$`KdU0u&^4X;9@aMD0>FEeGHL{5^&_}xia@48LvF{ zPH=+3X(`CXDaWfCP%7>hB8K3kAXO-QqqNAXB01TnNOihv`-7+Wq3mi9vvgX9;z({S z|B#?MYH2btzOUmyPfFJ;%upnR8@}oID5^t)lU-jF>mN0L3oDK1H~|@AeHmY(@E2zX zQOrmr38o(;P~Le*yO+m+u)&uH4~MqqrD+zXqmWdJ0L~Q{xpYZB!)Kxa1Bdl_26u@5 z*SF|qs|bEt^$vXpU!(YHJs4UCs)?;>-1>gfVZEHgfFQu&a1&f4z$-Ha?31?m4Z6t%`diujC}ej*2&{< zK{CIUiwB;p+4ZvZWhJC}iO<-c4EV<=S!g|{iqwawx+{TONiRQKieGwa4V-!uMn1_u zc3t^ml~AELE7NUJa8oRG5}8kav44I=t{|t#IXWcYsTq|0ObiL$%7Wsx9x`DPiV2Vr zNa~3|fpuwF4k1*YuME##oGBDP7y4vPI)Mdy5r=CI0XQTK3{Xi!Saei4mcerh zgY#bbAy{%}Nyxa+KRPD#>xzsgPNv_s1M8koeiNA^rokzn3Eou}u3V@M6`R zx7mKZ0mx6VC`agXd7o?FWlFvx4kw_D$n|U=n3=?QL%1EU^5+~w9wtSJE5D!x5#g6| z1^TS5tZ`Z57g0oxbXz2Q7BwQlbBpSaQ}Ae+x^zpos#K5n61l!V!#?98Ps@)_cTgY) zWF!Y%Bh_BK6v4oQa7G@3|4zX7DMgfwX@uK=VFa82g$e;dhv$5MFtRJM3knOvUu_^O zqX%OKAsgj_ufK%Ci)m}?Xz%Fg?1ofiL7nRxZAV9#ZhL2^?BqoOpCIIQd{gM;2?-2e zJSh`tW!Jd2))gEAGAq|+K@j}=9*IF}$#0Cz4bMK5-&1MzOe`vQ}Om%F@Xky2B*Cf}EL_ zq5c^Jk}Au`vYN@g^pA*%2V3t*WHZVbRh^6)cUw&0^iNWk^JxV?gq#fx+YlJ`tWRSn zc-F|{#~SME)xAYWm&Y*?A4nw9MVuK{yU?GR_ z*>^QAl6dOMdeO4gA*Jd}_kqti!iY?w`sjrnqBmy%J_X$tFv3Kp|$rI zG>yF5*&0R8$_16_R7(asb3X|WKsQ3I`#v|Wt~%;=EzV2OwY0qTCPhi=+OTLre0j>U zmls+SySq(^jq@zD)NDo*M6;?E=7}6TO~u%=^jfssMo9W~8ExZ&mifB#J#zx6);V^j8k^uWM)VD`V4cWVr3TkN;pmme8# ziZeqXJ}^Dd9xyeENDT4z}! zpc80?=nvK*V@%j8965hl>*J%lq-@)ywx8a)OWvh|J2orrqet^{Hf;<^@4nl3rWJhI z3MdOXVHpRC+H`yRnETg=+P7#19mT>d1(lwcdz2~e*!EHJFXjB4$$s-Xzp>@gDWzg+ z14mlx%v}R_Kfo0i75M$Q()`i3isNLw1pd5Sm3a$@1+Eq8fuEPcB{&^ju`^PL|62O{ z=~uaqtLay+h2u!fHOe)pA42wvA*9+O#eO{cYBZKc@T@g{{5CE(%JE0cGxOvdG@L-A z1Rqo$8$G^fT6r*-LL=Y;KMhr)gz>~Y@H775Qu5S5{$ojKM0=(Z0#Gg$(YAWV1|VmJ zK7G?+2<3`qWX;f)ZXoLqaBk?(Kd z7n{`3tfEXqMpv7-S`9ZJ)bv*PACj92TnU^55&Nk^Cr>|YYA0rrw@$3WS+4487QSj? zE18&SY9H3~oI>jUhyzHK?v*2$RZdOUR?^awGukuKlULHNH5I$)<|K*k{|PgC-sDC{ zK|Al!kfnI;73fchc5f#{8~8d|qu=^bZ;+t6(dor3bVk0U>V1lZgf+}_kzyir=~Bz@ zvke@=#LuAxkOM;~miMccXeUtC;_1;k2qBL4B#(Dbk)W8ERX9=r1Nnzs0!{$ZO~pLd zMGy#)2kpkvH%&F!tqtbIZy0#){7#>i(j;09ktK+r8DcWqLJfmtC=gt9@rpM|0Rbm) zS`emxKEoW8B>U~QC`iOc8i?>(q^&)>o;ZZ-7Wh40OdHYWR z{Gboz#*l88tLNm34<3*yQ(JrGNJLj}{}~V3sgf%BqBf2Zxw+=2LqER3U|tBdtqP%o z9Rl@NG)11fZ%D6Reaj?VKYlB}itRK0ISF{-wZc@n6!s5)Cg93bg==9iAbmdW>yO5w z{=VZMBM=QUAX0^w(#ASJVWYCyRNDmWJf+RcfSCT|EI}Wnj-)>D)%jAcf72dh zSem1S5xPz$g<3@B$aHiB*5)j|AoSC=0AvyL-CSP0OFro<{4R<>e&AxFEOz3Yh6BOA z9~I)&iqTEx8FFKgy4km=J^YMilqM!!Lsd9_j_z zzNQA82(`XLW3)oYS)^Vx+NFo>1Qr^Ba15tSm*uMTEp$$m+oj=?d_BW4V_0zo%{yGP} zLn3}bu#+>x-}T>%^_l=HbU#+opEn>5=a`_lD`(dJb%EI>n!#$UpCWs(qlCd zzR2fdxe7+O5y=`jmZ%XylM`=U1bljyg%ErASY>80xPB#x`*}DzxqdyPAslt*)I;RO>Qex!pYl zf}1Sn%>qGp508q4PPcJQ(wA*|HOa))xWMcIqn zoG2mM!e=j~v%FP`6#I5iR(=u{bb+$+?Wy)kg%{}mMoV_?1Yv|&1K+KM=rf!Exyyj& zbS`%D_+$tnqFkfQz;W|B7o$0b8h)?V53ks@0~7#eMzfVF6{!}>OZn{r`9fs{D{N1( zS0OKJNC%zZL>IS-vQ->fV-hc`w&tNT}VQ8+#HRL*@umk-R^96%kE&F<|TMENOf=->Uu=Tlx3^myaXULTA z@1ui1h(nv|!6}ZQ;-Y74*_4*Tgc!t>Z|EO#)cfC4$Om&0YEp`=-#;|W=iDCaSzYI2 zUciAN(&#=+&;^X=|N1&V9T(+X&Q6R$wn@kSf7f7vN?kmF`bj`F2wGk+#)>}71JcP)dk$*3Z24`o%=C4ET6?MW-$xsq(W1BMM zLtGt^MB=^6`R+L=0J#Fgx6ieEF%pTW;||GlU{q=AVv#!B_CsvHZGQO>sOJlSey*)J zz$+()hW@mqgDbGbLCEOi4cqJ>O()=^#Z92;eod?WZ2m7V{RfgBf7|hJH_unr0L5T%GW$%u49DM}I{DkcwwUN`}u!C(I z9`6x~JX&r?mZD2fj5G;NL4@M=T17(x7vI>$Bnb)~qx3zC3hCzzC$y;vd@{F&m3{JH#LGLaC8??aRcN!gOfl+b2`&;pUGn=(SRQ|S##D~w!s-HtBdBcsxshhmK#Vw zKghJf)Hya;O19e}JijQ4$X)qlQk(_NGPy$gUh<15<13%PQo_{O#AsBm)l@sS2xG95}J5P6tOHpqDe zFPbiGS4^Kgm}8nWs!y5qF*##rK*7IS0@1@Q0_8{FwrX{`0xqwBZm802x(rrvz^co) zv~S7j1w5`GSEoI1t31_+HddZGZ@Z6lPj;`w$NOzd`LR;>ag!t}=Co{fn$bEpe#)ApCZ zf)8U(H-Zz?^&#QbRDJ5mSrX;!_d>ZuD*RVKP2!q8`56d1xV4Vev21~kV+wr9S?nt5 zqd9pCCyh4weo;e#Av?)bVJXr7(EX&h#^hi4J2YU*1AYHvE}jcGi%CK(k2?Xj&fk_G zqGRpp6H)341L-;j`0<O3TvI`)u)^y0@HM&f zeU?+IfVAD)2zk&`wr?y1azGX62*y;OBL5% zWb|?jrG+M%hFrb~(bI%RXHsfnfn-1+9BW|u%zy`{ydekb7yVqHU*i?3CHDX9v7BIZ;C(bC z8d$PNcIqAf%6{kQFoQ+KAX*@$Ea}O(=f~ zl(SiYi9lW!lRLsbUpFF&QYYmKX`9W+f3c08^U<|I&VRW*Kpzc}AQtc$p+V8L>$sMc zQJZPP+$43K`QGE#GXmN;L0hg!G+;0Vg2d(BVJ2T2+WV?o=z<^|G?Up`SGEKV@y=f$ zm1pUjee_Fg5uJ6U3+H)YZAqF1%+ESp_}$9|g6#5Igc+3I@nnl)9=FykazrLqi1&jN z3;jvZ04v(x*4|Dj!QP7c{3QRDHD{hC4(aNP;LGZzl12GxF^wDNd+c!dL|b^m8Ib3t zUd2kQR#+%6sFCT|H*?pYha24G zgewHKM8C-Qmymh{5lVxv#l;(B^%X3%`8Ee;cvfX!09QEQwAF zURJ88Q7yP4b_~L^RjfWbdKqZH;&piKmS_*K&I-o=%P8Sty{-*(zMfIBb|cwJk}DyELv5ux*bYIhfl%b)1c2WBPpP? z-nmAeAjUA5QsfIsXh&1Eth&KHzC&|J>q#)6ldz^x@yYg3&ELTY^ zjDCExrG6i!flqyB6A9t@t44LvN&dDH6e|YHMJzUxF%s?A36|J+bt67UV1s9WUL}`@ z4iUtpx~5#4b9J-1=WvM*SLJAAL?)NPBcEhW^0$h&i?^BU$VH&d?8JSC47o*6-ofNB z89n9;gdhe|swXKJ17afM#(c*?GN6Mlw#Mp$d=7$t9ZWfcR>H5(H)kX*l>}Uy`y@?y zxP(SW8NPao?P7I@MCfjSDtn5f=&4)-UGX`V@#=#{J*be1ASS?#4_>{2#6evPX~H;? z$_sFtn35oTUGK|4=}l_97<2o5c!5w0RQx@1)>IqgE04zezVb9a$G{2DYQiksrYgSS zVz{(~>l*1UWb~f^#|?C9KKYMwI78KPyVQJV@x(FkWfNoPDxU?8kdXQo^W3h?c238c zL#B?M0Ifz|L+wRKc#fLXaI0wOJJ0AR1!4Il1oI7O)o2rZ(UBG6y+d#uO-oJPfKz!>>5+d*q z+!Gy}B5{?X`~p4D2lkh71h$JJBgmJ?S~0P>B>&$cUj>F(w7D-(p9%`X@)1&{Tt%r1 z4Wt7F{3ithzD<*#FJBx2gQCkQHU;)^S|yBYkbJ)`KsgPe^twTi~saQN^T`-Oj9gUN_O$fZSJDikBD)t(LWGBd=Pa|5rB{ zsGbdwTNTE#a)S3AO!v0+YuAXovmzQ6WhYK`A`~53sZ%$W7vN~v`qL**o@VKjKKiH$ z#oCE{MY69SSJ?L5w6--x-trwga%6mR_VDEB;aA3|W?#0z(f>qgA5^F4BZ3#K1m)P& z>Ye`VHjO<8_s}#lPpJLvw@sTODX>hmh!!@DKU*BM=IQvZGpRlU9xQY!8tuNlpq@|v zqD|YD>5pK8To}xrtm3V7bvN}|A)nG~9Cm1d*4dHCdq(mfLaOT<`@mubreTF~(RC$|ufBmU#JLswYptjmGG-NcaU^53Cf6ISSm<8m(FTs-tg6agR zSWrwFUhfIF9+gvxVJ6K7^{@2T=6~@YPj(s!@}7AtU_$&Bb{dw}yiVx&H~;zw5~7=IART!*Y94n{B@_N5{f5^_oM*@Oa)crYYq_Q~<^^7m{Q0t~T)ygU_61AzEjJF{|6YA&?2`h9=85_@04-EL zX&}vqhco-$Rd5BAH#6C6#@n&B*Y_>GoBYRNzk%kv-VHVamCa_dzv|fXwO_5#RNKmY zwKO*ED_|@MM3^$4FUIz0HFg=e#%3rOq`=~Br%x+gdd6k-@}aGu7!>j;D(G_ZN7k5L zl-U!#b1i{S#EO4%dCMnVE)cVJAL*FzIH)-Wz+w>DRO%2`qb3i*0#bX&-k|9kS%x08DX~6DVmE9UC^3d&sCz8x*V+qGV4w zY+&o;KmFu}#r;K0N%xTmE<#C5uw2MZMRq-wSSrr3_=o%q=7P0#&XFivuG`vsxgYdS z=*_;`3bxMFu<5t=>QQ;&oncT|$VnTrEj0F!X0cXRNWN1hs+_AGi?Cdw<5* z>(>uARwbaAD#wAjR*e16*SKDj-VQaaTj}LqR^|(7!hGdr?)h!Kw@)lmwgv3O6mS55 z7N470yEWRqe_hX6D|F<=f*lh}&F(!bfuS=ep_1)OGcT;jaV;#TS%`v4X9Bbak}Fo# z6XYawwb!MunKE)}6pILCYJKu4cD-_1>Ha*g-fBs!Tks1nehMtR_)Sev>PK83`B>0$s7aiH2h( zSYJOXh`z9J9=qa5+REFXYf#t3Nso!6nZ>X#$(u{lF7$T zu22nAtKbNo88zbDT`DxPX}T~n1%0HM54$~cK>7FdR66zTkKnhj(3l(sZz!npQN>eE z#gjViq8-o>nEyMMr=JWc@K4)HU`8^q*0&0;GsJlYzXsnLKpAo-^;Ne6#@2^B^h%e#-YioWW+L!A}MLi0?j*&x+=IgBP!_M@o6G zc{w~sao4UgEpT#(emP#(RfCP1>A6j&Q=@0?N%SWq06|BkES2krWLp!{N4vuK=6WMn>v_b&-+sy?lX}%d3U5Y9U@GwL#E&g4vuPk9OVqtTB{KM)%5Jsa}-e z-!mbMy(dobn*@s7-#_7A^B#dAX}v^N-|R=|f~eTw&m1n55>A-rF6`^TOCK~=iufG@ zE_+dBS`rz;k{hsi?m7czP zt=SU^o;qDtnxAc!61be6R+Qr~Bxpkf#8i*^@*-#ZKQQM%TMRepDZ(8|L4!j{SwP8D zm{7sjJS2dXIjHDb8VMV+ln<}^wf6l<9)$z&%=d%MvMrG^wjE4UIrX(BwsoZH@R84s z{)}L%VWn2T73uBwuNRS>jk#L|<6$eWK>TJ)qrD;>I9xOi1p$jy(!`#GHO34UMJ`m| z)z@vx8_2cJJDy3kwJLv~`)$cMU!@czxuv9zq#H<|Ktwz4vz-mV%&WdXF~Z=i!PbcDZubfbt%sO2qsPNjF{ z4YHhuQl-(`>Mh|CIbxwt_hA+;P^zYI1t$`qSu3lOdhpDsvo=|-QtMfkr3}?`wSq(^ zQ0yk!)e!$`=~jplwxSHZM$9gh8kX2=?aC~0NGfwll(X_M_vK`Qr3>| zzl~e><7EUfmgfMxPxg)Vr+M9H)yxJdRR~ff2}uQsASmcQ7x`Bid5cQK*wb-gQcd?= znBKE*5v%o zD?f~DrPw-J0*iM`D}!|C64D+*;Hljd3hUQ zaKv&RS;l~A`i9t8>9N=ppRt6f%w0<6qm;+o0tDtYDuoRS&6v31+_AI+qFnQD*Ed5CNmeT(#nFi z45_AjQEIFWIi&ErtKM@@(+Ao!jnoqcfC%faNdg8apQZW<1aLsTnqC4rARjMvAck)p ziX*($fyMZ@L$xHIwVJ4dWlfa+u5Cj;={v~f$pv&OO#}(zaqoN`&1w^bFG$M|%9zPQ zHF6r{Itnt08$CtF!9MK;&1j2OG~y{eZ?Hiad`x2BmPx<0fo{LK@v&HtBpulGPFZoU?j^1VKK6%-_TYzo2OP}bbW?4 zo=V7r{s>gTHW!g934XFR2&(xO8K%mbEf`dewj^3)941dwtEX>ZXk=_+YG!U>X=QC= zYiAD!8@9oWA>%$X>L+7X+vALBcO7*s#64e{iei|hyHPdimhHIQ9I1b@lW+Aji1H0q|XUe@XGTjY07ZJAE<-UzJ8F=X&XQS5|G+`#4;%dX-6(Gtz2ymD)RcE@wNSU=z)eoQ0Q@|99u=Wv#pOV}R)pnCF+jKJWW8`ay%5>c!WUUitQC!{QFWcE1PbhpE;- PaXo+be{0we>31`C1)00bZfi3|sW4Ge)Y8+vFJaF2oire z6Q%w*9*@UcE$Y4k+e^FZm0k67gIxW+`kdS|b}&XiMSq7>q)bYx2$o>!2#tM`J3!Of z-6gqP{3N;LV!d3FCbcw|CKZjqK>q{y!)|_X0IcwQ+DtC0gcbP84|}u$I@pj*3Huz9g3@`{>+yd*6g1KS(89qAp8!=MX|4OE;Y>cP@cH1c;ddwB&%?1p!gJ1o!rlpf(V^pj0r~kCH=* zWsD*>N^(e{cTvaIu3C46yZT&|jYrl}ORRuc*a}(a0EmPob^v?@M%l{tRjY`Hq-QO; zWx}d0etO%zeU6aoHM+(NS|#i;|GU3e^N}^VyS6T#QHYFX5HiXB>zK<>wcB!b&aoR~ z1Lg>j01-&GF979#J&Om>bGj7(Hhz5YH#QLTb58)iUH9O>KTh$L%of0nUg$XVOsuMY z_ZbIlIl}<}{;GojfOcD%=iu@vX|%{qgJ(_ur-nx>OOd8py=BJjbt@gP?tZu*>%IL%@9#s4EKSk6fByx5W|k&HtwtOSyzH0jwYpX}diyi( z>w}97t)jL6FM9rS&s}%icFRZ3JK;(D?6$_FQ42ZXkM+2{W^MnL7oIUHv?m^Sy?M<* z+Eq=7R30)`Dx0=%523N!~#qE^`M%ty+hGH2Y%l%#!bup`_#s zFZO+@wiB3N7lLar`?*10Ejn&-l03!clCA9Q{H5j9OOke|?=q5UO;d0b_F@+aw+OOB z1UUvUW+1W-xX?%=d`#eK`DfP1^XEsxV*0Xj{4r5s&7@nxl$HrA(~qZC!o z4GnD-jJ7r`hJo;Lfy||St|{0&RYcq*Y(txb$sonpdjRaXoPm=7cIVvQ9iz40bnj_C z3DXR4>O`e`{sm2rP>|&T#NPxF)klYd3zeM<=KwCQjvCw7pPbUhe?KM4aJP!gJ0VR>p2ncjMq&9jfH1sRUAdUU02X^4IL=^R z+cK{L%09!BIrOy$7-JV&5VD;8x+8>hM1}$1oxn^I^O3NCCo+@^Qa)i&t|})oJ+$RYib>jAC8GoMs%gCc z8jAcL#OrvCE-H{Yy%XMlS(c1-namSrQIPI`bJB4OR6VJPeM;DU304?xfR~&39Wx?IV=^t{xy&` zFGGCucm@|Q>A0}EjMUPpCGR~0ko~ryTC!7ZUSi`~bVMk~^&EN92nrfQhbEv?lhCCp z=+-p!Xa@9ZCiH36S{us$M09!oHK`*I{4kdTe5n*E^%X(Y9?$Teb*vlyFa;uOi*-@(-nbBvYd( z=4N%|hnrla8{I&gYF1%ikad(dj0^D-Uy5yrcG}$e&gbn%eB_b<~mq<@I1N&^pI9P`Ah(#l0W#<_tW*URku`0uo?KPRM zFrS)<|Esnhwn%USW}`)uYhW(gcwukV4G5A2^pG*q3FQERiM4ltlg@NY^x40J>r z7EKLc>43Ht;XrUxb4h`x1NvGz1MCwaF&Jh5(RF}vCL)1pq@^0POoNtd5QR%z*Gd{g zr32PlL<7MsttADW4%lmv11((BMz)6OI>0#-xhPV&W&qoDfO{tA4-{e%lxLxYTCx{v z;to0+q3%2{9w6|}AoI-t{u6}as3=*En&r|I+o4-Kh#4Tw!1FmLuw(_+tiYBP*ewNP z2ADJOCFdmWti+R*c(W3prQpv1!=GoU@q&Nn#rB6sZ*;OH)`MDOWAr`D2C+L?+^r|L ziU84^0(xOe4jj11c>uEl!15LP{&E24GN>S-HJ7+IslC|r1lS(AqI#IhHx_2Yw}sCI zqc9%D@)%|)r1%Uxly*N131}dJKiiNG(@Hg(g+eDmVrvL0Oj{C8VKM?&ITp1qC~=WK zlN@&ts0`JLMETNEnGbQvqy<*0`Ow%fn&MrNJXEHj(r_0es#n$p1DQiJ&FNub8mU7O zsb)P2lcd}s4@%R;>D?*ItCjL>JWi3GkyDvo-&j>0E*9fT%PNsmiVi19B`hjS@1|I} z%%h<(g^EFOWjI0jRftj@n`MoTsmTu2qQp?URH~u0T8&1;6LHH#9G5nh#q$KvQ=lA^ zLQ{BwrsQD|1f0Jya~?j=U!c{lJWF+W!WYk)+}a5KbRwWrDX%O3rlC4wkr&wo$H(Cv zu%QK$4b6}5G51vrtEMqHKe2@z_jjX;Civ>O ztWZ!+*>)@$a#VbXF_h#Vwo?;eIx(vtS?ETzN_2QwBU$66Ezf=gw(D`J8-E? zNGtt;k<(-^%n*ZqF~*GIyJ}MO6Px=D&i*v@iBH|a+9oB!Rx_FYi-O~Jge6VCnral+ zV!2uo?J0o^4tgO74XH#+J}}@sm!N__U7aofX-J4A>m1bu#T1s8=oIwrF!!6{aq#_+ z7Jzk?dDr3`1WbqQ-}=f2o@Uag84%VaN94Ui3q~_FAk5;sBm4=Y?uE+GM@tRH_N0}T zNU1Dv%v(bOe>xcio<>Gzl%tT=8Ce4!8{WJ%kVgK0$ODoE1Is=}_-D6i zah{`b=aq8}g#&e(c~`qz(q@r(`V>S9V0XOLWKy&7pI`zRnfn=lg=Q)A5ORRME~hy2 z=QQ-7M*;i}5*2?>_V4<^lh`uk=w>o2Xp*(!m;lw-{THnD2@cICR~ znv6-rruNsuWS@a&CC5-0pA=_~hlxa6f81KLZ(lJtqGt%TtPF}b-lldnlXXjvYcz!` zl04%=jL2h6);13A%T=AiT-{qzXaPm!Zp8;D+-iH@rEC!#=P3w{JkN2FfbKx7rl{AU zZs`P*F-oH1^fb0JX5Qn|KZ9+b$|s78>#DIi`=G9_aq|9mW=#UY#hCX9jgFFaYCu+K z^$N$+#JLy|)-=bi%*mCnZxdTcTpS8*;lTQnqsnacNSktCyJe(CUR-rs(YB_Rvi~FL zpkY|hiMABD$??|LeviUdH=Tq2l-2DW#zvDA3Vdn!8e1fgMWp4B568c(MwWFPKc}u+=n(U}x zjmh4d6jaA_T?;MpHnRbt-Q*3~$1um_O*@g65Lsi@sA?#7b>$ug9Le|SPmFTG z)Hya`5+mIti-0A`8N3o(PV}Ol-;MP5V6Yj(nLDi@Fz>$ zOu?l@Ny;6?_gCTR6Xo16L@1Kw8)HX6(};)w|Cj`OSvv~dnf4C+J&)eu9mU09BAA$< z5E?0XgA3%5&%NEKF8hPniza^=5;k_jHc%nJ4cXlJ`Sm{SrqrqR0x> zDPH_<;#wTl3BzZQ9|o&#TPVQ8(DCBI0k*a+o%PD(zO8^nuvrRn(C$h>i()*VEgqSJ z0IhVuvnMXUAm@H@RP=q~Ns7su)&%vo_0CXu^8X%Crb=?9qWhGL#It;hq}Jhd>>B zcN}IO4<_kF$u4lu;7B6WC|L>qAYNI-V&(@p(XZH*Go{xTT?iJKtTfKabVx8Zn71Zp zIl8v|<_)%m5(mRtg*?^kB`TnN39Mvp zsita4HfNtyv`(Q@lgF!}buzZ_5Zr@>?Ow?>ZmA02NAu{_idf1q;u`CU6#s@UKqHGp z0eFxPE06AY`>aXG7L);kY*Z{f9}vx~y!@Kc#2o{@75>QEjPfZ4`Rn^M=AINllimBK%sda=5@)wu2v<1^xm>-+9gyO8{5s=46jh9%IRFdT$tR7fWdYFJ2&{uXKJN&%Ts2 zBTnadCM0jMk7;|`y-`J?ep+fM#JB?kgFLlZwiItMl5xQBR*{SrEv%yJ<5EX)P-M(E z(He+^C8syzu4kr-ap<=W9g5aD*;o-)%`&lLR2*MDMlz5UK3_&n1LI(a zW`N0dnt^~OZ97TS*z*sZwo~Ff?-~@X>6!!<@0G9KyM0_TO}Wc`}K*$SwD|I z>K%3zar5h@*SzJvLAnSvxmO9fe)QlP4WOGa4=Rf7Z;f4%KHj)`sVTZY0e0CDY7+^v5vH}{W@Hh+tyrOdqo-eQk zNu!Wb7RD{Zlq7(97>Vwt6weC#~rq8%5lckCVnxIl5@HZ z55J@Ah?n*4$5-2sxY+DzFr}cGY)`kY0k#NNvWv*)ImV5vb(d||5~CLrCn(g-uu^14 zp#_l|=1~@H9VP5Fx*aN~(@;qWiZavY*ODCD-}FwYjrp)a~Q+ zCYif$u&X`xsBeKng7&WRZL^@knU+D6=t<&q`tygUVhFZ=cZl$sqb=<_(+XOx5l}9z zX(}Z+uIP;F{*l$1dBb<@woC?OCuzn+G+cvJ9KSfOs%CF-g0if^d^`uy1JB~78|F#m zo}~1wING~VVrpp-M9i_uurKMzydJNG#$U2C|EXq)$%sq%6DD(>$#Zr)`9HZXo<~rz znHI5bLhLDaH%^wTCTR#~K0%rwt-%sS)qqqJ4~cSJtpb`gPmP@ra z%w;UK)}{M{BDGUGuuiPIuc{XKZpC%?URMv&h0M`(Sw02|4PBCim1&nvsrj9p^jqQc zs>9B(AiP(ldJTTK66Ze8_k0v~wrJ)l332029Bc&J-P*@wZz)bW_Ay=}A{EY6gN+}WNuKXHOD;Oj(t{=S_}v9`z^^@)AbnKyFkk>qKb3I^FQ z9wrFkwF6|Qvw_gYpO9qb9HvHSj6P9MO6BIw8qwp$V~lsssX2R~anVU88%KhHA2et`mAepNfgsKF?X(&l%e8)( zBYox|@wZ<0_edMwJIhWxl_l)1UU{m{nf+BD9hVvB0XsI;ZhV&pGRJK5MR-``6D7_2 zz`OXS$A|%MbS!i16JMu|{n&WAbB4)o%DTqt0*$L5OW94XTAUq_gYJG;Q&3QNp9~k6 z+*iRC_j5eZG4G2}($*!yZp({oZRIhzPKk1>bhwvo`Uc*|s=w)&z#HJ}WDe)d`0ZQs zmV5We^*Aze&C8>0p?jd}U(k*e6A(_Bt~{yP9J^lkZmBCnKQOmHj)+tihCyiU2Y&ox z7n;TqXP+Uz#X8mT!4j5Q1$We~W<6z@s->vM?r!vlHp|LjmHT)cLTNi%=h)WJg(=Y< zKd)EM@PN?2zfMfW5Pf++zZY=?B+>#|s%Ls^tV$JFcg@gV+qEZeQD{KAOQ(oc#VZiek)tA?*)>IOoC#YP%)&Cd0fA{$v5 znd>A{NLj^y6Sdg zg^}2uf10~~g07v_U>Z_;1w*WOC!Aral)ot>HZiL!C#%Xi=6iB`KwwLaF-`ozaVnqv zKE7O7>D9<@=pFBgRoIt1om|E4Ir;Vn734o>W$>hrZCUAKC@_M4J@+}y&U{zh%m-`E zs1GN1+04)8ht``hs?^!Ku=+D7Wg>URUQ;662)k7d~!Jz33L8x6b}B4X3w$ zbF|aSXdJWYrW$6+gmuZ?spe(c0900MCO2By?n^W_Epu#IRP{R+TlYf(5f-WBg7{e^-%R7w*940Ie^WM~n0vf>sgfGr!Dgu8_idI2`)Dg|z(Ie;iBU)wk?}ZO zX3{nb>?!4RDnM4>c8lsU=j_-|N?Ip*s#Gd)CjPQ5-I6q^?Fc;6GWGWz)nZhsDc1|1 zJ{9ub;t=bVPK?kf1j@S9GEAvNd2qXx-Xk?4-X7&zPqxNr3<6wySSzKh>6TctJK5>T zBf=Y8iDr@4Ex&Ebt_GYl4s_l7^M#5zT}i(8jgbH0OzV#hE{AtweO z+lp8j$e8aWt6xYCNJBXG2X_h}D-iBtk_m5Fg%oPajdP|EDvAoir&J|vxo58tyoZRK z%;#(erNj%g5Ie%B-sGZ8A=A}h`vo#j_5_@CvtT>&*jZ1$4o;T8P_#Dxp6j)M9k@g9 z{v|BHeh#SQU*7Ov8n5mhik*sP)^W@MEPUC}sDUYR(-cljk{Ya(&x@PlWVWmZ?KBOd zD@X(l7mvF^lQh~YJw<5I{yqp;T@;0Xpc$@lpVo;3q;x6e|seMI2@rnu!K%)@7y2rs_ z@O$>Jzw1bGRbqN(a=A6j)zpBx#k!l0tgNo#!obZPLdkbxf!y`x*YCq(T#T5^7N^k$ z4L=^9b8{9HviXs|l9}>|kWmfO*5uxYiwHl1>|6HMCs?k${F8;C-J7_8&ay2mRm|b? z;#zr^E!r|zXTG)#UtLYaO8tXsb$I_xVN1u(Kgmm+2NJiYjGW;Y|s<||X>IX>1=e#AFSQx8-$%7jm? zm&>G)U*y;{n{C6P+v`CCd&EG0zfJiF_8_@^}nfA~#cMGUxp_cCT! zN?r*kPt$wKK#ifAbi)d)Nd`lXv6jJ4UODLYh$fTO$UWgio+HI2aBigp6~o5O7oRCa z{`Y1Nu!qB2V8*v#qF7P35!yBbbSMaAVE1moyu&mTF%I`ah5c*K@_AAKPE zW$(Bn_UV@T7AQ2IEV+sam&UBHosT|&{JKMd!r4rg27uZ;(?a>AziDQsE4&fJl{jxX z9*273#KmE@SxIc)dWURR}ccnn@a$khMsWhB7BquG1_vER&^p@UP)y4$HcmE{o za$W{+9O_fVHNm8DgY|#05eTZ%WH}4|Zfrg1mPoI5gv|q3`WveIlaDQix&kRtMtW}o^XN8ntrS84Y}zN z{jiA%le{J|OPc0m3u}uPXcyw8 zV|^9qdj$OX1N)ab9^OwLrf;n;(PEM>0GGTH=Xj&|Y%KjO>eF^GJGb~$3F(!-s6h&o z^e~~w=0`Vl3S=YAkoyCrOyya&#Adi)Qg|LE+fnj3$&Y?&ZNd$CrLra!fnlsrE*81l zU86ZuBxPt4aGmW5?H~gI9XeOm?CE7rrF8dOXG@nlK9Bb>4;d((Gs_HJed=CmQRC}| zs28{zbk1?=@cpB9t{wh%@sHM=D14E;e73iFL0#e*jaDOa=LOyL(om{8gy#;ol&9SP z?IKrHax&=G9!xp}-QhHVq(6g)3<2A@DQCWLirG^j%BN#QPgGc@xc zB)^^Y!pekx_1j9lc;6dTyRu#p=}`T?B&Hh=J&gQGX+zrR&BXz5hNBJWEa$taNOfmM zzddu^y3XP)QEw+p(z9=0b2qM9Rw34_FFne~1bhvIypi7#nQdQ?izOl6y#3<~3L?Fr z{8K4gOL|6|vk=aAaK`2>=}|-jcR2eb?jMtZ5Xj}pBkGBG2AU9vRBSW4XrN5tmJ}?A z+4EVHVPiS4_^-vJ`fDb_#V`D&1E3AxP*hg_wTYX&+|=LRY#7d#yb-VUEzEFg+)w7vx4n zu(KlGa-10`ZfG>tf%*>dm@2}*VC-ncQRH+QFH`Bqpo+&2XsC(3b`99OmFyL}jxNY` zJdkkd;>O3zNL!&ytX-=v&b8@tgm>=(cb`a}J-^srV@pCo?XZ3r%FP8PgSfV8PL&eh znf~9vv-C=OB>+`a0CO>(R-xT=DSDS9;s|LnB@GQ@ZJ+XC}#&myQ9w?Ir*$52|kBZfrvq;GcoZQg%MX zZjvXCaTVnetD-A4azMnaR(X&!9&oJ@fTCjz^A=p*;qM7y>V~O9CL-CDB4MS#vi8;M z^{MHu44ib^gMsPg>h8Q5JP?@hwPCg4j97uOK^2lMxmksn*h+g{1T1Q0U zF1k;MknBpKpyPKFF&%GHDHh%~H@iP5z$UXwR0kds04T=hHzjPlq=geW9R09vSXpen ziTOP{lq3aq!_Adfh)^R6M|3GvubXD{OBYJr8R<}RG7!$+@2(6+wt<8KMXVW#B?gv- zrz3Kbdbbtk`5zlAr5WO(j>QQNglI%Vp?K2b-40W@?WMmKE2-WwEVEn}Hl-+w zD{LqXSuX!S;qtM>B%2-bJ6AfJ(W9S=&@-jRFizYXpq~$a4+GCKfi2cGg0@m>pJla! z+9lw`l$~i0Kk@_ zzmoP~G3NkHa|2oXFs5h&^NqnBA#U58O*&9@u=HxfG#5Iw>c}cyKPpQo3wp~XgsUtK z>3Ttp>N1Ip4D+-kJrJf8PL{}-nmtAY#zquD^n^KT$ zi-J?&0AM#a1DZ`CLoO~DXK$Ba0Z^|i03|^(n7Fm7=WzX{xEs%cbxXNWKd3rxDhrmC z7?3fuVfuVfs=z(gLLun^{ot+|9P+Z1&WT5kd@Ar%@P{>O#t~8Lk_|mcINA->MU#$XGfB)3gq}{reb;KQ%xDN zzci=^);v{jod!V;xWA7qK2=BD%JCQYRWBA3NhLe9LS}UxAT~?uI z`R&voORD2Se8rA0E^gIa=oNqauN#A(a=SQC+Ao0a6m8~4Q2yP#8tZlgsbOP_WEpnI zQTU2w^@$DZZ4%|hIHWB)z9f{Acnn>~pl>7u;>};08p>i*SV`4y!{8+YqLgx79}?L@ zg5VFsJQ|)DcKTB`YY=t@&BU_M&&whgn!jhatTBE@N}4yUhQNJacqRO1(4}5%KUiL# zM;j=e%bD(w=Vz*=@M~&}nDhs-vw^8;X1&bg$4o%G>vLz_nxiG=5Jms5O8L1T;aMeC zD?2OV82`^z^czS8J1u~iVNI+$HQbLrFwXQ%L95>v@gtyUB6E_jnFbx~au9wK?Oxqb zqqJ!qZ`vWPF#8I-efg4nS*#8wFvMk(8$zf0A=Tdd-kB`ESpz{GSnD1EhD?%U7VkF z$!*w&CVSVQX?vI_Ehn9$U!c7dI+@5bJtW}$`SdS}@TbbeZm2+fv^Z{+%ExqGE)Ujl zz&Q^OX*ezoEprXMWkGZXvJ1+;hD`YYZgDJ`9Gr|>>slWf6>XRo5|g14^jMp^6;#SG zex!dM;E9k12m+IK17OY%o*WKXGN;VW@qg^GBUK`LLK4-JaMls_ooc<;cizrQHpjeNfJ9^em5fVV*Z$(bnA)@`}Q zt>NKgcMeMRG zLdz&s{gZzywc)RGi6Wv9xxF;8ernfV9@|8Qt64`#!?5QMZo!*0j6RE5*l%NMkdoY*04HM#<^Dm(7tRF@I|= z7vFPAcb65FG-svBw=lLAXbNJRk~^6EO|>n_1*~1>)h-O-r$jWM|830O5?4Z;q4t1pLbt?M5iK?jg{2S6S?=S<^ z8XvGQ(HKBmV*)BAM5ItX z@$XV^*G@XV=N@IeZKQ6h!;j%ckT%RFTU$0IAWQj**W^3r3iEN}#a^;shQt|}j*qjO zasuqeX^!f?%CP%q9-nU*)t+VUbC35BHYFxr!xtf~2r1jP%Qqy4RT)_E0jB!1r;S0Lxx`I0V1uqr}Kk=-;LYuALF`l?QRIm0p^K&q<9>e)fV2Q+LWk zsMifj#unuI@LR($@d9j^Pi4pMM8i+3-1q|MO1uGe89uyljLfXLF1;ErPWC!(7np_u z#X_oBx&I8o7yH3-5KIV*egac|Oz8&QR{3=~4AE;1>p&YyDafLPstVm`H|p6AwdPZb zzh<&|kNF`;s!HZ;9V91SH8m&@@Wgf6v@SZ_I~}NqXqdvu9*vsmQC6*5(kS^}bx=KB z)(=ftwlt?8Z{r)(Xq_st$F3BFHUDOdtVgo=QELF>45ZPrSbO36T#)iz>19=gSBNlG z%6BXAg0G%l2%?9peV7dX`U2yIl4L8q9$r#ltg7yxO7Yc_4nL7L$g0HOzkKSy@;rP{ET-6IVc5=? zOpkmQ9LL`??TVjqN+pPDoIJbB8zJ0L_+oT^rT{w1iP-+MQc8Rt7QFD3I?YZ^9C(Vy z$WK8g-$P#6T+TVr!i|A#~y({eUUa=P5(ALO6BIZ&aKxU zSZO9QnQ8+j;u8cmzVhtOnrPd<5sIsHxjdK2OhI3IDDr?^9BrA=>IrzPU(3@Qy%B8e z6G`EDNuvheuH+5hBpzL7ATkXV8elTp=UY(-KBZ?U$#qy&Z-C;ex%mmFBHLp*K#5gq z*N0?cjgR70IUi2^oYa!0En(QNN50u#LsnFZV*hyy-jkdmQPa=pM%ArGB@V7WtR|C2 zqtga)m7P8NjMLLup1-q!gRKxCcdx9)LyoN~WU#z3uTk~$PwLov(-KkBYl8`s zq|TMK`O@08Zdd-!BFN6!3%j|fJJTgbd7@r$4#7OXz~&G5aR~q1xkr9|7d*i9UJ?X$CnykkjixUM=x1x$}{w)NUhaB?zCOnNUjT!CJ z{&S?&k&$|M_~JV}P_wF>)c(q(SbZzLj6T7c-BqGr+9%A53BkNqUKYWxoOBvs_`ikO!7_0qcf2xnYTT`^HV}O}Loo>-|vo#N#ts=HipuAn6n3 z@bw4;VoSDdZv4i~ft0XH^Y!V-50;?>unX+pG-h zgLf)3blOjSh{wuLR@9m{M+1SRd-vV@qu)HUBI|FZn$O0<-$6lfdRBIcVKwT{=zsG! zXS`p1$95^|ncNJdh~JvZu*1IO#=KBv9zjT(`)14Js~gNe_$2r861$tU?mAp^hRGcl z$Dy{fdTwz+iRT9R=LV+GK`o`1-NzT}T zOrcC7{(H~v$aO_?cwEHF`c_Q7w9x)iqNy$G^9D)OE_2vBjOtHP z+s*l}${*gmB}UWO^>^-SZhJh)nT+QNv+(U4e&~Y_22VH7o*oDc2XQCGdEUTsVaV`- zK(sgDId-hAgy{XkEb4;thSK!0Z&UsUgVWv@mctwcKDDeh296q_WE%N5BWCwkfFd0F z$FZgqm@4t~m&aX%gX_a~hI@Zs@>J?7DTVU$$%c{(4T@SO`!xfuV%DP4H9`)cQx#!u zz4=NqEufqA%&}{IFh!A3V0Kb6$TsY)V@RD+#SFJq+Z!7|QkqZ;iB2b-qWnvEu#<4qk?+_D?_QB8;tJUlw$TZ<2f=4(;yy!3?F76EmQCeF42MCNw8B%{nM_I1CuR`>Ajp58*z4^HrdqZ8V>Z zZf2v|X%WwHm@p4e6sT0NkTeJTfh861ulwk@R1g8KUK4E(dgas$5{`A=7!siJpM)GG z^=C$&RVvajsN~+wc-BOnQHgWn&*8+hUeC^pIL2dS_JBk{m4*C`G9m2!@Oc1o=T83z zih{yv2QtAI`cnA*ts!>jdH8k*+rQb~xI534lViH>J)K$S1%nAtZYsWm(-X>Fm%A3` z5zHfFyO)86zNNs4T>inGy1Zs@i9#$HCLm$i10yjVZeiy|JYtU*WGW97@0bS%qwZPw z;X5fKu~{dQx3lVr7QXn6nvnYgJ1o={H(}D%pn;sU*IoJE=k#a98=lPEs+@2bMUv3X z*o=S9QLUUKc-|IfV_-TM25m8eAc<=?3>oQpv2Vg{X;eGdH&cK#rM%&ms&9R?E58Og z%6s7=l$_Mdccf?>r+Yz4b&m*Wdd7*Ug(PWjaK_Z=F&}9q_xLkU_zX=#{)sDGa68T$ zRhq*?dwWeik{KUdgIRKk7I7N$DYhs&Y^kkSRq=aCa*}6Sq6_R@6Zd|?l}|J?QnMSWuaiY_q36zt`s%!Gb5a$Vyg0h4RTIVH{(CaEN~*Fm!R(7W2YTsDI(PzKzAQ{0wqI zT>e}6#hklV4oF`b0GQLuj2r=U8KB1?Qmu3?AfrLc?)YeW!KK)ACNn9{s^W9h zQkpYT*EmI?f{vDTcy^0S#9c1Qw+okRLsrdFjz0?6bS6JLB|b{R*;J|-f7uqPm8vG` zRxgw2YEb5xdZbiOHtJePw@Y*-AW4dmnM7PJc{5_9=`*zzSqXaKHtJ|}q3c;H-2~_a zpksjECeb~Bt_Som2od|UF6DrL*l=BrqSPpgJEfLZ-csaemZQQ+iC%1qGMqZszFF+2 zFXKa&97Y7P=u0Op-A||#0=CSkWKbN;Nswl7x|0#X^*BOjah(EOt+>wv=%pr^F8y^; zAme9QE=8c&s1bo!k|DITX*C0<&*b_uTsBk?)uWa8i3)SP$r2!aCd-rRpuh%2gBHu9 zJx=SB6lSN#Vesq3s2GxRBCi7jY3Ae5XHBrc2MPpq5m4643)jU-W3`k6IlYUuYD7u_ z&}mnfrdTO@zD3HJ1}JY>(~}JKHq{pD^aP;7ilr)i)=@sYK!Q`z##`@M6$2oEkNp>y z95B?&Qh!EdoG$=>X1V#%OWBd#GM|FSXZ;QUg2BSL8`Zj-@mLdpf&l@@ur;d^gEymb+8(M|4ZCpTDE}kf&F8q9?d>jkB61-E;0bF9wuPgzj>C zo8ZZy`a7!iDqHKB?(_d{^1)c^ec~SVj92O<^=VP@1oN*d3VxlYMY&F|)oit8W`3)< z>&~w_#BAy#e9FPzPv3uRKM7PTC?Txfu^0URp#u~bCdn$(ht zTpBp7_Wswl+BjEx=FgoXAe9_<^|8dM`+8F*=chCmqT@dk3@s#@)4b$&ajF1ZGYBOo zaUWHJx2-L58bAd<)fDwL{;?t%`E?S5er_3$nM{l4W$mg(zV&QcJZj2AxGZ^cDx1~; z{i+zcDe#1IEDQ_h^5$bn*4$%RD(SqZVu}G9oX>(nnUPSHL@U%WJW2OYZpK&bzCN&9ZpUow9bncCC)2jrKcFMkB4n z%=^?U3dqY?vY(O6;wsA)cuK|xHE%<{M1_lWU|1Z;ArMat@5wk30=%Z8=Y$ib8h&fp zEYhf|9Trk;DH})sCFvrh8syOH0_|#?^*iR#82!*mE20JbB0l+0Bynv)pOjXp(W2qf zP`X97GnRJ`*zsV7ZG3pgevbw)@fd5~fGfU4$`$EEE5GVL$PWU)D19$z4Y!4c#XNJ=UcH4QBtJsQKv z#4MbJRfI@UqQ$U@O|$>44so1Z;w4CwBw317Y0|lQc==_@k}XHB1@h!8P^d_;5&=P_ zLduk@P^n6_8nqe&;oY=bW^A?2UXT0GQOCl;Z+F8bMH>IyaMN|S!zYt0vdJNrJn|`^ zFqq>`IPHv+PAxCF(`g^}*t1(l;}UN0CCzxcy}a!6ixxE&euA+iC$IEc>tG|Ce|}L@ zOCwZq9V))g3tn&U`1+xH1D)NAdpO0{IyuE>{)i(zNyvMTSC9P|f$ztU(r-VXbnh7W zyRRC6w2b?{=`v-K?fG3*t*BVA`^k9N1Q6$#hv+W2xexpR4)|YGXzkI8qswcr=J2RB z!m}nYr32#QnqT$#1?SBP;NTs9D6JuV^;112HXy(Cp8kEbvFSyv=~t>{30T_$Kmo+O literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Main-Italic.woff2 b/ui/web/katex/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b50920e138807f385d0b0359f4f0f09891f18406 GIT binary patch literal 16988 zcmV(>K-j-`Pew8T0RR91076^<4gdfE0E4su073x(0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Main-Regular.woff2 b/ui/web/katex/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eb24a7ba282b03d830fa6c63ee897d92a5188736 GIT binary patch literal 26272 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�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 bkH82T%!~T~dOL3iZSfI!+IWoKhyte*`46Vs literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Math-BoldItalic.woff2 b/ui/web/katex/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29657023adc09956249f6295746c8ce4469b50d3 GIT binary patch literal 16400 zcmV+rK<~eIPew8T0RR9106-7`4gdfE0D43K06(+<0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Math-Italic.woff2 b/ui/web/katex/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..215c143fd7805a5c2b222bd7892a1a2b09610020 GIT binary patch literal 16440 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 G>;nKVNojrn literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_SansSerif-Italic.woff2 b/ui/web/katex/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..349c06dc609f896392fd5bc8b364d3bc3efc9330 GIT binary patch literal 12028 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 GG{*pT{>~Tx literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Script-Regular.woff2 b/ui/web/katex/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3048fc115681ee6c1bc86b0aa158cfbbf59daa3 GIT binary patch literal 9644 zcmV;dB~#jWPew8T0RR91041yd4gdfE06`=G03}%f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Size1-Regular.woff2 b/ui/web/katex/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5a8462fbfe2c39a7c1857b9e296e62500a8a8a5 GIT binary patch literal 5468 zcmV-i6{G5RPew8T0RR9102N#S4gdfE059|a02KrP0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Size4-Regular.woff2 b/ui/web/katex/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..680c13085076a2f6c5a7e695935ec3f21cddb65f GIT binary patch literal 4928 zcmV-G6Tj?tPew8T0RR91024p}4gdfE04S^g021l|0RR9100000000000000000000 z00006U;u$M2o4FH3=s$lpb(dJ0X7081A$BnXaEEt1&II$gDMPx92+(xvye7xR)-Qr zuyF+D<2}WHmB5qvtDzk>iwqJnL*(fZs|06Yb!k(1`ETc1I4-BI5fi@^u8fdm)_=e` zdp}9j)YFz0DG~@_Kr>cMHY70C!K^ZDLNTA1b7Br>uDhMiy#E2l3s-l)|7lD20$2hm z@RXnGF4_PYHl#gB*k&mx`PNs|E@~BRiaIk-Yp%L*)p~xqH)tK24LDPq+9^`k`Cgg@ z?wr3yPQ)iMi`0C({fo<{L5l+`f3Eib=1O^!+?5mxbFzfbmnAs&^Jiy+y`4!4(_Cp% zqD;z%tlFv-x2E;!;w zVW0LxIo!N76;gG%@Hb~*66P0cigm@!%!Cno$kKtF{J6eOf$5?ZhZ zGxUV~z5L(+ewzJn*7bz*N{9T6&S$7sY0!Etm|_zlZIG>ifQcfRwh5_SQlHslg9^@7tlD^wLmOxkR|-Rl>&iBW8}oeXg=l3PGl0WW7UOHQ$AH=-*sQ_FPT5-1d5EJQD9Pn$NP z=&ex`C2L6`ubBa-+$U+ol!uAv{MKA*F%G6?$zgGfC`t3*GI6_Eb;)%5MJ*?0ruoG$O;U?7n^){QDYAVGaEVAHLqZB9$dHf<2?`{n zLBa$`NQZCJlm;XxcSy38uj#vUF*`Hs$Te_xywo5!OD#vP&QtM_|MGmbfNp9M$0RSK=0_8_ zABCw>{ZyuM9=Qack^&VKMj|Ak)m~&+sFoKh!y*qw(#BI)DONKBw}KKQLVnAX zG1&USa_<#$+$JX-mDDDeb~MggE1*$BlEb77LoKF}k$@k0xv!=(a9U`DIxRMzDx4M- zby_$y8F)ug0CH(Ej8jTz)P`gfLQ@?uVB-n6GIj$~)F}})=^B$un~SNqEM_044HB;N zhGmM31%SFVDb>`A0h1#dQO?j~Y^-I)6a-yTPH)gB2)PoKXk{Nguv@^n30~1Uz4`%@ zD`m4i&uZq$jbBlIr!`;~fTB|CWScMarV3S1Y6Ge}8#%>J_FVVI{x3$o9E61rv-C=)ljThD#+}}^zAw|gQO7_rj>e?#e`;j4(=L3iD8l>nvKp>+j@jEgyUwZEikoU zHWST>2naBxf=JYIC;){c0_HLu-=J;+&@vhwQB#6|W=GUg1Q6yqqWK8|7C1^ROpF?C z4J(R71hg?xdm%6l9Zb|25zxhC-Rw}!J;^ooCJ5+rWc?5T1CD4gLBNosqr+-OSs87_ zHo}VL7ojq>IQPjFsy3FWnUJ(p$So71-$xwI z?-zDt94hM6EP-*1I$K5)wa*E%kwg-TMNvt2=HcQl{g&m$ZUSxtJ5FpQZ$aTfFJ)Q^ zKqdy3I8BgEQ0@SJBhqaonQ$$rn0XLeCP8yU{np*|Vs>g`NUiHm1r*-6C^Ak@npARd z+~sMJ@odvPOygYR7IQ1sqae%e#;7iVVvO(o1Ck$0* zFd;Bmk#K2Cdlr&B;k#c9JTX4=Tb+%hn~s0mmbsT+pj5fN?boKS1uqw}iVm{fn@Pzy zlBeJ}FNK{1rNjm{l2+_Gjs>rRH35$8i)y?pjmO2P18mc2)B)8;a&4%GCor|!ue2l0 z@X11NoM#Ltr=3&ntIU+uA7Q!Dp}Y!^&Ni{D-6snT!|DB3i!jgBoFj`Q*i^tK&VyE& zvw)M1orI5?t@f#>&HD zak^D@rlVy+5kEoOn_MXLu0H+IQn&56%Sqs?@mfCVarak6{Uy;q{3a2bl}wz`wDWW2 zFe_eM+Gu$l-T;AwdpZ%+8c>Xjj9L02w!{{t3%dFTa16K4; zIWgrd&P@RPxY}Dr-k_JC=$4!E7KBmC2$MP#w->H5!6_>Pr9I@t|HRTurr;U-+c_17 zle`RDGL=Dw*u?=Af_22JyfNP9Y9`_6ee?*coA&SST${*$%I)9i# z>QCny1#6hw;;UEI`#w-TSOu)Bv#Nl9%?K)BC3UGOY|qXa&%vaQ&-k$DKw$9Uzn^>N z;eYm}h<1CJ|M-dDT8kDhn~;uxfl>{O`#pnGusBQTSLWLp4DhWwVxo*Jch`sW+*@`` z_ak7SJRpZ@zrTH5oMa}J_!{pz=N{2)H*N16;-^2s^hBQjFPN0S{9v~~X*yzY_B#zO zZ`@+Co5ek=JsDu`K7U@w>p@27n{aZ>nzEX1pWoc#*^kkriEAA7%^NB*>>W^ey;Zpi zK!h)^cg;i*qx(Fqr!ofnW(o(Jlf!m9yX8!vY0LMzT4C!J!MLHRZ~Cm6X}7Ig@)HLQ zN4^)s3V-w0A8ldnFz_#kX$F&6{MfvW3#FaG49`9U;jg#Mja*)<+B@LVi8>dBl55q- z<(9ei@FTF_lM#&RYYcTxSBh`d_^9v-bF)Asgvwz@xrQ-KuWBg<$S|DWP7O|s(zdQE(#);lqcVpr9 zSKNgW-))N`jHq|DB)ATJ8H}+79&pVt6y$wTZJe&42aC)hH};_9m($#@|E1)$CS3N4 z`O|W9wY%3hVY)?s53f)8=JJ$umzkl$!eV3YQ)MfaYwE79zY^UoH*1k01Af^b>H%ZG z^-DO;E}HCzW9!w$_j~-7$l*4@;Rv(b4R1>?|7ShTT$e0)e4>665*$kjchBvGYlW zVFf{88Rp5xs_ysr^`=9=Fi?M47nbk1E?9R>W>`1R@MHqzN_m-wSvrhkCVj<4pSw2P z9)=TJ^AcaxXRvNtuJ_T1AAF?ccXZ%oE_l%9(r`;hs!%jQG?KAQ^?y|NMm0=%m zDp3wQk=5Rfussmr&7R<7&lQCop?gBz@77;ie_dPVir%j-KZ3*88_esm=dk1WcPGAg zto?*Wm=AMA!|Wqb!MEldKGJdgGeJxdqsAN-1>yD|6?!3WhqDhm>PHM>j@5nhx#9SC zj^p2-XK{?-drRD44zlS_--hSvOCM?YJ?{7N{K3&Z!TxDjURSqu!?e!HYXw&1>@L0Z zZ=-jKj*UzCrvgQ_uG{h>He8n&ugf-VTVA_iTHV%la@cN*S^%7Rg7*2Tf+kR*!tk*_@q85UwF!pw(p|nk`ns4bNmF3u!6WrJ!9# zT^44B(E|fR(rr2R^(;aba*?6@{ZjXVY_1F|9y?hWL?q1gppPxAM3zE_WC}8Bbh)$x z{n%R~yGzrnT4THQvNK6vTcWBi$4ecM>e*PrOhhnvRW%Hq7FP?Yee05N4RUnp3c%t4 z38w?h+SS7nbYPivurP_2byCduQ6FY!VI<&E`djO1pk75!^k?zAa`GJs5iIxC+f{{a z7`Rzd#v*CwDlx~hw-hBXRw<4;5_Hl%w*>9g(~%NK%i=IJp!MrN39~R2^?_pyOs5yO z6ge2o{ae&O0u#(|U<%4nfdyzK24CVUVu`~Yq$8g6B#?oOWFj+J$VxU6$xaS(QWUw! zP0CfBZ=4xqAJKL2sICSTTqTeI literal 0 HcmV?d00001 diff --git a/ui/web/katex/fonts/KaTeX_Typewriter-Regular.woff2 b/ui/web/katex/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..771f1af705f5cef5f578b3a1e7d8eff66f9b76b0 GIT binary patch literal 13568 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 G0ssIW.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/ui/web/katex/katex.min.js b/ui/web/katex/katex.min.js new file mode 100644 index 0000000..b69360c --- /dev/null +++ b/ui/web/katex/katex.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Yn}});class r{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;let n,o,s="KaTeX parse error: "+e;const i=t&&t.loc;if(i&&i.start<=i.end){const e=i.lexer.input;n=i.start,o=i.end,n===e.length?s+=" at end of input: ":s+=" at position "+(n+1)+": ";const t=e.slice(n,o).replace(/[^]/g,"$&\u0332");let r,a;r=n>15?"\u2026"+e.slice(n-15,n):e.slice(0,n),a=o+15":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;const a=function(e){return"ordgroup"===e.type||"color"===e.type?1===e.body.length?a(e.body[0]):e:"font"===e.type?a(e.body):e};var l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(i,(e=>s[e]))},hyphenate:function(e){return e.replace(o,"-$1").toLowerCase()},getBaseElem:a,isCharacterBox:function(e){const t=a(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){const t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"}};const h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function c(e){if(e.default)return e.default;const t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}class m{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(const t in h)if(h.hasOwnProperty(t)){const r=h[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:c(r)}}reportNonstrict(e,t,r){let o=this.strict;if("function"==typeof o&&(o=o(e,t,r)),o&&"ignore"!==o){if(!0===o||"error"===o)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===o?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+o+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){let n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))}isTrusted(e){if(e.url&&!e.protocol){const t=l.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}const t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)}}class p{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return u[d[this.id]]}sub(){return u[g[this.id]]}fracNum(){return u[f[this.id]]}fracDen(){return u[b[this.id]]}cramp(){return u[y[this.id]]}text(){return u[x[this.id]]}isTight(){return this.size>=2}}const u=[new p(0,0,!1),new p(1,0,!0),new p(2,1,!1),new p(3,1,!0),new p(4,2,!1),new p(5,2,!0),new p(6,3,!1),new p(7,3,!0)],d=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],f=[2,3,4,5,6,7,6,7],b=[3,3,5,5,7,7,7,7],y=[1,1,3,3,5,5,7,7],x=[0,1,2,3,2,3,2,3];var w={DISPLAY:u[0],TEXT:u[2],SCRIPT:u[4],SCRIPTSCRIPT:u[6]};const v=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];const k=[];function S(e){for(let t=0;t=k[t]&&e<=k[t+1])return!0;return!1}v.forEach((e=>e.blocks.forEach((e=>k.push(...e)))));const M=80,z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class A{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createDocumentFragment();for(let t=0;te.toText())).join("")}}var T={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}};const B={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},C={"\xc5":"A","\xd0":"D","\xde":"o","\xe5":"a","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function N(e,t,r){if(!T[t])throw new Error("Font metrics not found for font: "+t+".");let n=e.charCodeAt(0),o=T[t][n];if(!o&&e[0]in C&&(n=C[e[0]].charCodeAt(0),o=T[t][n]),o||"text"!==r||S(n)&&(o=T[t][77]),o)return{depth:o[0],height:o[1],italic:o[2],skew:o[3],width:o[4]}}const q={};const I=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],R=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],H=function(e,t){return t.size<2?e:I[e-1][t.size-1]};class O{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||O.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=R[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){const t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(const r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new O(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:H(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:R[e-1]})}havingBaseStyle(e){e=e||this.style.text();const t=H(O.BASESIZE,e);return this.size===t&&this.textSize===O.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){let e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==O.BASESIZE?["sizing","reset-size"+this.size,"size"+O.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=function(e){let t;if(t=e>=5?0:e>=3?1:2,!q[t]){const e=q[t]={cssEmPerMu:B.quad[t]/18};for(const r in B)B.hasOwnProperty(r)&&(e[r]=B[r][t])}return q[t]}(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}O.BASESIZE=6;var E=O;const L={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},D={ex:!0,em:!0,mu:!0},V=function(e){return"string"!=typeof e&&(e=e.unit),e in L||e in D||"ex"===e},P=function(e,t){let r;if(e.unit in L)r=L[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{let o;if(o=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=o.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=o.fontMetrics().quad}o!==t&&(r*=o.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},F=function(e){return+e.toFixed(4)+"em"},G=function(e){return e.filter((e=>e)).join(" ")},U=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");const e=t.getColor();e&&(this.style.color=e)}},Y=function(e){const t=document.createElement(e);t.className=G(this.classes);for(const e in this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);for(const e in this.attributes)this.attributes.hasOwnProperty(e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e",t};class W{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,e,r,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return l.contains(this.classes,e)}toNode(){return Y.call(this,"span")}toMarkup(){return X.call(this,"span")}}class _{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return l.contains(this.classes,e)}toNode(){return Y.call(this,"a")}toMarkup(){return X.call(this,"a")}}class j{constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(const t in this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){let e=''+l.escape(this.alt)+'=n[0]&&e<=n[1])return r.name}}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=$[this.text])}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createTextNode(this.text);let t=null;this.italic>0&&(t=document.createElement("span"),t.style.marginRight=F(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=G(this.classes));for(const e in this.style)this.style.hasOwnProperty(e)&&(t=t||document.createElement("span"),t.style[e]=this.style[e]);return t?(t.appendChild(e),t):e}toMarkup(){let e=!1,t="0&&(r+="margin-right:"+this.italic+"em;");for(const e in this.style)this.style.hasOwnProperty(e)&&(r+=l.hyphenate(e)+":"+this.style[e]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');const n=l.escape(this.text);return e?(t+=">",t+=n,t+="",t):n}}class K{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(let t=0;t':''}}class Q{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){const e=document.createElementNS("http://www.w3.org/2000/svg","line");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e}toMarkup(){let e="","\\gt",!0),se(ie,le,ye,"\u2208","\\in",!0),se(ie,le,ye,"\ue020","\\@not"),se(ie,le,ye,"\u2282","\\subset",!0),se(ie,le,ye,"\u2283","\\supset",!0),se(ie,le,ye,"\u2286","\\subseteq",!0),se(ie,le,ye,"\u2287","\\supseteq",!0),se(ie,he,ye,"\u2288","\\nsubseteq",!0),se(ie,he,ye,"\u2289","\\nsupseteq",!0),se(ie,le,ye,"\u22a8","\\models"),se(ie,le,ye,"\u2190","\\leftarrow",!0),se(ie,le,ye,"\u2264","\\le"),se(ie,le,ye,"\u2264","\\leq",!0),se(ie,le,ye,"<","\\lt",!0),se(ie,le,ye,"\u2192","\\rightarrow",!0),se(ie,le,ye,"\u2192","\\to"),se(ie,he,ye,"\u2271","\\ngeq",!0),se(ie,he,ye,"\u2270","\\nleq",!0),se(ie,le,xe,"\xa0","\\ "),se(ie,le,xe,"\xa0","\\space"),se(ie,le,xe,"\xa0","\\nobreakspace"),se(ae,le,xe,"\xa0","\\ "),se(ae,le,xe,"\xa0"," "),se(ae,le,xe,"\xa0","\\space"),se(ae,le,xe,"\xa0","\\nobreakspace"),se(ie,le,xe,null,"\\nobreak"),se(ie,le,xe,null,"\\allowbreak"),se(ie,le,be,",",","),se(ie,le,be,";",";"),se(ie,he,me,"\u22bc","\\barwedge",!0),se(ie,he,me,"\u22bb","\\veebar",!0),se(ie,le,me,"\u2299","\\odot",!0),se(ie,le,me,"\u2295","\\oplus",!0),se(ie,le,me,"\u2297","\\otimes",!0),se(ie,le,we,"\u2202","\\partial",!0),se(ie,le,me,"\u2298","\\oslash",!0),se(ie,he,me,"\u229a","\\circledcirc",!0),se(ie,he,me,"\u22a1","\\boxdot",!0),se(ie,le,me,"\u25b3","\\bigtriangleup"),se(ie,le,me,"\u25bd","\\bigtriangledown"),se(ie,le,me,"\u2020","\\dagger"),se(ie,le,me,"\u22c4","\\diamond"),se(ie,le,me,"\u22c6","\\star"),se(ie,le,me,"\u25c3","\\triangleleft"),se(ie,le,me,"\u25b9","\\triangleright"),se(ie,le,fe,"{","\\{"),se(ae,le,we,"{","\\{"),se(ae,le,we,"{","\\textbraceleft"),se(ie,le,pe,"}","\\}"),se(ae,le,we,"}","\\}"),se(ae,le,we,"}","\\textbraceright"),se(ie,le,fe,"{","\\lbrace"),se(ie,le,pe,"}","\\rbrace"),se(ie,le,fe,"[","\\lbrack",!0),se(ae,le,we,"[","\\lbrack",!0),se(ie,le,pe,"]","\\rbrack",!0),se(ae,le,we,"]","\\rbrack",!0),se(ie,le,fe,"(","\\lparen",!0),se(ie,le,pe,")","\\rparen",!0),se(ae,le,we,"<","\\textless",!0),se(ae,le,we,">","\\textgreater",!0),se(ie,le,fe,"\u230a","\\lfloor",!0),se(ie,le,pe,"\u230b","\\rfloor",!0),se(ie,le,fe,"\u2308","\\lceil",!0),se(ie,le,pe,"\u2309","\\rceil",!0),se(ie,le,we,"\\","\\backslash"),se(ie,le,we,"\u2223","|"),se(ie,le,we,"\u2223","\\vert"),se(ae,le,we,"|","\\textbar",!0),se(ie,le,we,"\u2225","\\|"),se(ie,le,we,"\u2225","\\Vert"),se(ae,le,we,"\u2225","\\textbardbl"),se(ae,le,we,"~","\\textasciitilde"),se(ae,le,we,"\\","\\textbackslash"),se(ae,le,we,"^","\\textasciicircum"),se(ie,le,ye,"\u2191","\\uparrow",!0),se(ie,le,ye,"\u21d1","\\Uparrow",!0),se(ie,le,ye,"\u2193","\\downarrow",!0),se(ie,le,ye,"\u21d3","\\Downarrow",!0),se(ie,le,ye,"\u2195","\\updownarrow",!0),se(ie,le,ye,"\u21d5","\\Updownarrow",!0),se(ie,le,ge,"\u2210","\\coprod"),se(ie,le,ge,"\u22c1","\\bigvee"),se(ie,le,ge,"\u22c0","\\bigwedge"),se(ie,le,ge,"\u2a04","\\biguplus"),se(ie,le,ge,"\u22c2","\\bigcap"),se(ie,le,ge,"\u22c3","\\bigcup"),se(ie,le,ge,"\u222b","\\int"),se(ie,le,ge,"\u222b","\\intop"),se(ie,le,ge,"\u222c","\\iint"),se(ie,le,ge,"\u222d","\\iiint"),se(ie,le,ge,"\u220f","\\prod"),se(ie,le,ge,"\u2211","\\sum"),se(ie,le,ge,"\u2a02","\\bigotimes"),se(ie,le,ge,"\u2a01","\\bigoplus"),se(ie,le,ge,"\u2a00","\\bigodot"),se(ie,le,ge,"\u222e","\\oint"),se(ie,le,ge,"\u222f","\\oiint"),se(ie,le,ge,"\u2230","\\oiiint"),se(ie,le,ge,"\u2a06","\\bigsqcup"),se(ie,le,ge,"\u222b","\\smallint"),se(ae,le,ue,"\u2026","\\textellipsis"),se(ie,le,ue,"\u2026","\\mathellipsis"),se(ae,le,ue,"\u2026","\\ldots",!0),se(ie,le,ue,"\u2026","\\ldots",!0),se(ie,le,ue,"\u22ef","\\@cdots",!0),se(ie,le,ue,"\u22f1","\\ddots",!0),se(ie,le,we,"\u22ee","\\varvdots"),se(ie,le,ce,"\u02ca","\\acute"),se(ie,le,ce,"\u02cb","\\grave"),se(ie,le,ce,"\xa8","\\ddot"),se(ie,le,ce,"~","\\tilde"),se(ie,le,ce,"\u02c9","\\bar"),se(ie,le,ce,"\u02d8","\\breve"),se(ie,le,ce,"\u02c7","\\check"),se(ie,le,ce,"^","\\hat"),se(ie,le,ce,"\u20d7","\\vec"),se(ie,le,ce,"\u02d9","\\dot"),se(ie,le,ce,"\u02da","\\mathring"),se(ie,le,de,"\ue131","\\@imath"),se(ie,le,de,"\ue237","\\@jmath"),se(ie,le,we,"\u0131","\u0131"),se(ie,le,we,"\u0237","\u0237"),se(ae,le,we,"\u0131","\\i",!0),se(ae,le,we,"\u0237","\\j",!0),se(ae,le,we,"\xdf","\\ss",!0),se(ae,le,we,"\xe6","\\ae",!0),se(ae,le,we,"\u0153","\\oe",!0),se(ae,le,we,"\xf8","\\o",!0),se(ae,le,we,"\xc6","\\AE",!0),se(ae,le,we,"\u0152","\\OE",!0),se(ae,le,we,"\xd8","\\O",!0),se(ae,le,ce,"\u02ca","\\'"),se(ae,le,ce,"\u02cb","\\`"),se(ae,le,ce,"\u02c6","\\^"),se(ae,le,ce,"\u02dc","\\~"),se(ae,le,ce,"\u02c9","\\="),se(ae,le,ce,"\u02d8","\\u"),se(ae,le,ce,"\u02d9","\\."),se(ae,le,ce,"\xb8","\\c"),se(ae,le,ce,"\u02da","\\r"),se(ae,le,ce,"\u02c7","\\v"),se(ae,le,ce,"\xa8",'\\"'),se(ae,le,ce,"\u02dd","\\H"),se(ae,le,ce,"\u25ef","\\textcircled");const ve={"--":!0,"---":!0,"``":!0,"''":!0};se(ae,le,we,"\u2013","--",!0),se(ae,le,we,"\u2013","\\textendash"),se(ae,le,we,"\u2014","---",!0),se(ae,le,we,"\u2014","\\textemdash"),se(ae,le,we,"\u2018","`",!0),se(ae,le,we,"\u2018","\\textquoteleft"),se(ae,le,we,"\u2019","'",!0),se(ae,le,we,"\u2019","\\textquoteright"),se(ae,le,we,"\u201c","``",!0),se(ae,le,we,"\u201c","\\textquotedblleft"),se(ae,le,we,"\u201d","''",!0),se(ae,le,we,"\u201d","\\textquotedblright"),se(ie,le,we,"\xb0","\\degree",!0),se(ae,le,we,"\xb0","\\degree"),se(ae,le,we,"\xb0","\\textdegree",!0),se(ie,le,we,"\xa3","\\pounds"),se(ie,le,we,"\xa3","\\mathsterling",!0),se(ae,le,we,"\xa3","\\pounds"),se(ae,le,we,"\xa3","\\textsterling",!0),se(ie,he,we,"\u2720","\\maltese"),se(ae,he,we,"\u2720","\\maltese");const ke='0123456789/@."';for(let e=0;e{if(G(e.classes)!==G(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){const t=e.classes[0];if("mbin"===t||"mord"===t)return!1}for(const r in e.style)if(e.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;for(const r in t.style)if(t.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;return!0},Ie=function(e){let t=0,r=0,n=0;for(let o=0;ot&&(t=s.height),s.depth>r&&(r=s.depth),s.maxFontSize>n&&(n=s.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Re=function(e,t,r,n){const o=new W(e,t,r,n);return Ie(o),o},He=(e,t,r,n)=>new W(e,t,r,n),Oe=function(e){const t=new A(e);return Ie(t),t},Ee=function(e,t,r){let n,o="";switch(e){case"amsrm":o="AMS";break;case"textrm":o="Main";break;case"textsf":o="SansSerif";break;case"texttt":o="Typewriter";break;default:o=e}return n="textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular",o+"-"+n},Le={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},De={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]};var Ve={fontMap:Le,makeSymbol:Ne,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Ce(e,"Main-Bold",t).metrics?Ne(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===oe[t][e].font?Ne(e,"Main-Regular",t,r,n):Ne(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Re,makeSvgSpan:He,makeLineSpan:function(e,t,r){const n=Re([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=F(n.height),n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){const o=new _(e,t,r,n);return Ie(o),o},makeFragment:Oe,wrapFragment:function(e,t){return e instanceof A?Re([],[e],t):e},makeVList:function(e,t){const{children:r,depth:n}=function(e){if("individualShift"===e.positionType){const t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth;let o=n;for(let e=1;e0)return Ne(s,h,o,t,i.concat(c));if(l){let e,n;if("boldsymbol"===l){const t=function(e,t,r,n,o){return"textord"!==o&&Ce(e,"Math-BoldItalic",t).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(s,o,0,0,r);e=t.fontName,n=[t.fontClass]}else a?(e=Le[l].fontName,n=[l]):(e=Ee(l,t.fontWeight,t.fontShape),n=[l,t.fontWeight,t.fontShape]);if(Ce(s,e,o).metrics)return Ne(s,e,o,t,i.concat(n));if(ve.hasOwnProperty(s)&&"Typewriter"===e.slice(0,10)){const r=[];for(let a=0;a{const r=Re(["mspace"],[],t),n=P(e,t);return r.style.marginRight=F(n),r},staticSvg:function(e,t){const[r,n,o]=De[e],s=new J(r),i=new K([s],{width:F(n),height:F(o),style:"width:"+F(n),viewBox:"0 0 "+1e3*n+" "+1e3*o,preserveAspectRatio:"xMinYMin"}),a=He(["overlay"],[i],t);return a.height=o,a.style.height=F(o),a.style.width=F(n),a},svgData:De,tryCombineChars:e=>{for(let t=0;t{const r=t.classes[0],n=e.classes[0];"mbin"===r&&l.contains(et,n)?t.classes[0]="mord":"mbin"===n&&l.contains(Qe,r)&&(e.classes[0]="mord")}),{node:i},a,h),ot(o,((e,t)=>{const r=at(t),n=at(e),o=r&&n?e.hasClass("mtight")?Ye[r][n]:Ue[r][n]:null;if(o)return Ve.makeGlue(o,s)}),{node:i},a,h),o},ot=function(e,t,r,n,o){n&&e.push(n);let s=0;for(;sr=>{e.splice(t+1,0,r),s++})(s)}n&&e.pop()},st=function(e){return e instanceof A||e instanceof _||e instanceof W&&e.hasClass("enclosing")?e:null},it=function(e,t){const r=st(e);if(r){const e=r.children;if(e.length){if("right"===t)return it(e[e.length-1],"right");if("left"===t)return it(e[0],"left")}}return e},at=function(e,t){return e?(t&&(e=it(e,t)),rt[e.classes[0]]||null):null},lt=function(e,t){const r=["nulldelimiter"].concat(e.baseSizingClasses());return Je(t.concat(r))},ht=function(e,t,r){if(!e)return Je();if(We[e.type]){let n=We[e.type](e,t);if(r&&t.size!==r.size){n=Je(t.sizingClasses(r),[n],t);const e=t.sizeMultiplier/r.sizeMultiplier;n.height*=e,n.depth*=e}return n}throw new n("Got group of unknown type: '"+e.type+"'")};function ct(e,t){const r=Je(["base"],e,t),n=Je(["strut"]);return n.style.height=F(r.height+r.depth),r.depth&&(n.style.verticalAlign=F(-r.depth)),r.children.unshift(n),r}function mt(e,t){let r=null;1===e.length&&"tag"===e[0].type&&(r=e[0].tag,e=e[0].body);const n=nt(e,t,"root");let o;2===n.length&&n[1].hasClass("tag")&&(o=n.pop());const s=[];let i,a=[];for(let e=0;e0&&(s.push(ct(a,t)),a=[]),s.push(n[e]));a.length>0&&s.push(ct(a,t)),r?(i=ct(nt(r,t,!0)),i.classes=["tag"],s.push(i)):o&&s.push(o);const l=Je(["katex-html"],s);if(l.setAttribute("aria-hidden","true"),i){const e=i.children[0];e.style.height=F(l.height+l.depth),l.depth&&(e.style.verticalAlign=F(-l.depth))}return l}function pt(e){return new A(e)}class ut{constructor(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){const e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G(this.classes));for(let t=0;t0&&(e+=' class ="'+l.escape(G(this.classes))+'"'),e+=">";for(let t=0;t",e}toText(){return this.children.map((e=>e.toText())).join("")}}class dt{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return l.escape(this.toText())}toText(){return this.text}}var gt={MathNode:ut,TextNode:dt,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}toNode(){if(this.character)return document.createTextNode(this.character);{const e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",F(this.width)),e}}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},newDocumentFragment:pt};const ft=function(e,t,r){return!oe[t][e]||!oe[t][e].replace||55349===e.charCodeAt(0)||ve.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=oe[t][e].replace),new gt.TextNode(e)},bt=function(e){return 1===e.length?e[0]:new gt.MathNode("mrow",e)},yt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";const r=t.font;if(!r||"mathnormal"===r)return null;const n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";let o=e.text;if(l.contains(["\\imath","\\jmath"],o))return null;oe[n][o]&&oe[n][o].replace&&(o=oe[n][o].replace);return N(o,Ve.fontMap[r].fontName,n)?Ve.fontMap[r].variant:null},xt=function(e,t,r){if(1===e.length){const n=vt(e[0],t);return r&&n instanceof ut&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}const n=[];let o;for(let r=0;r0&&(e.text=e.text.slice(0,1)+"\u0338"+e.text.slice(1),n.pop())}}}n.push(s),o=s}return n},wt=function(e,t,r){return bt(xt(e,t,r))},vt=function(e,t){if(!e)return new gt.MathNode("mrow");if(_e[e.type]){return _e[e.type](e,t)}throw new n("Got group of unknown type: '"+e.type+"'")};function kt(e,t,r,n,o){const s=xt(e,r);let i;i=1===s.length&&s[0]instanceof ut&&l.contains(["mrow","mtable"],s[0].type)?s[0]:new gt.MathNode("mrow",s);const a=new gt.MathNode("annotation",[new gt.TextNode(t)]);a.setAttribute("encoding","application/x-tex");const h=new gt.MathNode("semantics",[i,a]),c=new gt.MathNode("math",[h]);c.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&c.setAttribute("display","block");const m=o?"katex":"katex-mathml";return Ve.makeSpan([m],[c])}const St=function(e){return new E({style:e.displayMode?w.DISPLAY:w.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Mt=function(e,t){if(t.displayMode){const r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Ve.makeSpan(r,[e])}return e},zt=function(e,t,r){const n=St(r);let o;if("mathml"===r.output)return kt(e,t,n,r.displayMode,!0);if("html"===r.output){const t=mt(e,n);o=Ve.makeSpan(["katex"],[t])}else{const s=kt(e,t,n,r.displayMode,!1),i=mt(e,n);o=Ve.makeSpan(["katex"],[s,i])}return Mt(o,r)};const At={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Tt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]};var Bt=function(e,t,r,n,o){let s;const i=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(s=Ve.makeSpan(["stretchy",t],[],o),"fbox"===t){const e=o.color&&o.getColor();e&&(s.style.borderColor=e)}}else{const e=[];/^[bx]cancel$/.test(t)&&e.push(new Q({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&e.push(new Q({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));const r=new K(e,{width:"100%",height:F(i)});s=Ve.makeSvgSpan([],[r],o)}return s.height=i,s.style.height=F(i),s},Ct=function(e){const t=new gt.MathNode("mo",[new gt.TextNode(At[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Nt=function(e,t){const{span:r,minWidth:n,height:o}=function(){let r=4e5;const n=e.label.slice(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){const s="ordgroup"===(o=e.base).type?o.body.length:1;let i,a,l;if(s>5)"widehat"===n||"widecheck"===n?(i=420,r=2364,l=.42,a=n+"4"):(i=312,r=2340,l=.34,a="tilde4");else{const e=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][e],i=[0,239,300,360,420][e],l=[0,.24,.3,.3,.36,.42][e],a=n+e):(r=[0,600,1033,2339,2340][e],i=[0,260,286,306,312][e],l=[0,.26,.286,.3,.306,.34][e],a="tilde"+e)}const h=new J(a),c=new K([h],{width:"100%",height:F(l),viewBox:"0 0 "+r+" "+i,preserveAspectRatio:"none"});return{span:Ve.makeSvgSpan([],[c],t),minWidth:0,height:l}}{const e=[],o=Tt[n],[s,i,a]=o,l=a/1e3,h=s.length;let c,m;if(1===h){c=["hide-tail"],m=[o[3]]}else if(2===h)c=["halfarrow-left","halfarrow-right"],m=["xMinYMin","xMaxYMin"];else{if(3!==h)throw new Error("Correct katexImagesData or update code here to support\n "+h+" children.");c=["brace-left","brace-center","brace-right"],m=["xMinYMin","xMidYMin","xMaxYMin"]}for(let n=0;n0&&(r.style.minWidth=F(n)),r};function qt(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function It(e){const t=Rt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Rt(e){return e&&("atom"===e.type||re.hasOwnProperty(e.type))?e:null}const Ht=(e,t)=>{let r,n,o;e&&"supsub"===e.type?(n=qt(e.base,"accent"),r=n.base,e.base=r,o=function(e){if(e instanceof W)return e;throw new Error("Expected span but got "+String(e)+".")}(ht(e,t)),e.base=n):(n=qt(e,"accent"),r=n.base);const s=ht(r,t.havingCrampedStyle());let i=0;if(n.isShifty&&l.isCharacterBox(r)){const e=l.getBaseElem(r);i=ee(ht(e,t.havingCrampedStyle())).skew}const a="\\c"===n.label;let h,c=a?s.height+s.depth:Math.min(s.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Nt(n,t),h=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:i>0?{width:"calc(100% - "+F(2*i)+")",marginLeft:F(2*i)}:void 0}]},t);else{let e,r;"\\vec"===n.label?(e=Ve.staticSvg("vec",t),r=Ve.svgData.vec[1]):(e=Ve.makeOrd({mode:n.mode,text:n.label},t,"textord"),e=ee(e),e.italic=0,r=e.width,a&&(c+=e.depth)),h=Ve.makeSpan(["accent-body"],[e]);const o="\\textcircled"===n.label;o&&(h.classes.push("accent-full"),c=s.height);let l=i;o||(l-=r/2),h.style.left=F(l),"\\textcircled"===n.label&&(h.style.top=".2em"),h=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:-c},{type:"elem",elem:h}]},t)}const m=Ve.makeSpan(["mord","accent"],[h],t);return o?(o.children[0]=m,o.height=Math.max(m.height,o.height),o.classes[0]="mord",o):m},Ot=(e,t)=>{const r=e.isStretchy?Ct(e.label):new gt.MathNode("mo",[ft(e.label,e.mode)]),n=new gt.MathNode("mover",[vt(e.base,t),r]);return n.setAttribute("accent","true"),n},Et=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((e=>"\\"+e)).join("|"));je({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{const r=Ze(t[0]),n=!Et.test(e.funcName),o=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:o,base:r}},htmlBuilder:Ht,mathmlBuilder:Ot}),je({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{const r=t[0];let n=e.parser.mode;return"math"===n&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ht,mathmlBuilder:Ot}),je({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:o}},htmlBuilder:(e,t)=>{const r=ht(e.base,t),n=Nt(e,t),o="\\utilde"===e.label?.12:0,s=Ve.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:o},{type:"elem",elem:r}]},t);return Ve.makeSpan(["mord","accentunder"],[s],t)},mathmlBuilder:(e,t)=>{const r=Ct(e.label),n=new gt.MathNode("munder",[vt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});const Lt=e=>{const t=new gt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};je({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){let{parser:n,funcName:o}=e;return{type:"xArrow",mode:n.mode,label:o,body:t[0],below:r[0]}},htmlBuilder(e,t){const r=t.style;let n=t.havingStyle(r.sup());const o=Ve.wrapFragment(ht(e.body,n,t),t),s="\\x"===e.label.slice(0,2)?"x":"cd";let i;o.classes.push(s+"-arrow-pad"),e.below&&(n=t.havingStyle(r.sub()),i=Ve.wrapFragment(ht(e.below,n,t),t),i.classes.push(s+"-arrow-pad"));const a=Nt(e,t),l=-t.fontMetrics().axisHeight+.5*a.height;let h,c=-t.fontMetrics().axisHeight-.5*a.height-.111;if((o.depth>.25||"\\xleftequilibrium"===e.label)&&(c-=o.depth),i){const e=-t.fontMetrics().axisHeight+i.height+.5*a.height+.111;h=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:c},{type:"elem",elem:a,shift:l},{type:"elem",elem:i,shift:e}]},t)}else h=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:c},{type:"elem",elem:a,shift:l}]},t);return h.children[0].children[0].children[1].classes.push("svg-align"),Ve.makeSpan(["mrel","x-arrow"],[h],t)},mathmlBuilder(e,t){const r=Ct(e.label);let n;if(r.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){const o=Lt(vt(e.body,t));if(e.below){const s=Lt(vt(e.below,t));n=new gt.MathNode("munderover",[r,s,o])}else n=new gt.MathNode("mover",[r,o])}else if(e.below){const o=Lt(vt(e.below,t));n=new gt.MathNode("munder",[r,o])}else n=Lt(),n=new gt.MathNode("mover",[r,n]);return n}});const Dt=Ve.makeSpan;function Vt(e,t){const r=nt(e.body,t,!0);return Dt([e.mclass],r,t)}function Pt(e,t){let r;const n=xt(e.body,t);return"minner"===e.mclass?r=new gt.MathNode("mpadded",n):"mord"===e.mclass?e.isCharacterBox?(r=n[0],r.type="mi"):r=new gt.MathNode("mi",n):(e.isCharacterBox?(r=n[0],r.type="mo"):r=new gt.MathNode("mo",n),"mbin"===e.mclass?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):"mpunct"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):"mopen"===e.mclass||"mclose"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0em"):"minner"===e.mclass&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}je({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:Ke(o),isCharacterBox:l.isCharacterBox(o)}},htmlBuilder:Vt,mathmlBuilder:Pt});const Ft=e=>{const t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};je({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){let{parser:r}=e;return{type:"mclass",mode:r.mode,mclass:Ft(t[0]),body:Ke(t[1]),isCharacterBox:l.isCharacterBox(t[1])}}}),je({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){let{parser:r,funcName:n}=e;const o=t[1],s=t[0];let i;i="\\stackrel"!==n?Ft(o):"mrel";const a={type:"op",mode:o.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:Ke(o)},h={type:"supsub",mode:s.mode,base:a,sup:"\\underset"===n?null:s,sub:"\\underset"===n?s:null};return{type:"mclass",mode:r.mode,mclass:i,body:[h],isCharacterBox:l.isCharacterBox(h)}},htmlBuilder:Vt,mathmlBuilder:Pt}),je({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"pmb",mode:r.mode,mclass:Ft(t[0]),body:Ke(t[0])}},htmlBuilder(e,t){const r=nt(e.body,t,!0),n=Ve.makeSpan([e.mclass],r,t);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(e,t){const r=xt(e.body,t),n=new gt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});const Gt={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Ut=e=>"textord"===e.type&&"@"===e.text;function Yt(e,t,r){const n=Gt[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":{const e={type:"atom",text:n,mode:"math",family:"rel"},o={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[e],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[o],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{const e={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[e],[])}default:return{type:"textord",text:" ",mode:"math"}}}je({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder(e,t){const r=t.havingStyle(t.style.sup()),n=Ve.wrapFragment(ht(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=F(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(e,t){let r=new gt.MathNode("mrow",[vt(e.label,t)]);return r=new gt.MathNode("mpadded",[r]),r.setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new gt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),je({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){let{parser:r}=e;return{type:"cdlabelparent",mode:r.mode,fragment:t[0]}},htmlBuilder(e,t){const r=Ve.wrapFragment(ht(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(e,t){return new gt.MathNode("mrow",[vt(e.fragment,t)])}}),je({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;const o=qt(t[0],"ordgroup").body;let s="";for(let e=0;e=1114111)throw new n("\\@char with invalid code point "+s);return a<=65535?i=String.fromCharCode(a):(a-=65536,i=String.fromCharCode(55296+(a>>10),56320+(1023&a))),{type:"textord",mode:r.mode,text:i}}});const Xt=(e,t)=>{const r=nt(e.body,t.withColor(e.color),!1);return Ve.makeFragment(r)},Wt=(e,t)=>{const r=xt(e.body,t.withColor(e.color)),n=new gt.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};je({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){let{parser:r}=e;const n=qt(t[0],"color-token").color,o=t[1];return{type:"color",mode:r.mode,color:n,body:Ke(o)}},htmlBuilder:Xt,mathmlBuilder:Wt}),je({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){let{parser:r,breakOnTokenText:n}=e;const o=qt(t[0],"color-token").color;r.gullet.macros.set("\\current@color",o);const s=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:o,body:s}},htmlBuilder:Xt,mathmlBuilder:Wt}),je({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){let{parser:n}=e;const o="["===n.gullet.future().text?n.parseSizeGroup(!0):null,s=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:s,size:o&&qt(o,"size").value}},htmlBuilder(e,t){const r=Ve.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=F(P(e.size,t)))),r},mathmlBuilder(e,t){const r=new gt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",F(P(e.size,t)))),r}});const _t={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},jt=e=>{const t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new n("Expected a control sequence",e);return t},$t=(e,t,r,n)=>{let o=e.gullet.macros.get(r.text);null==o&&(r.noexpand=!0,o={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,o,n)};je({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){let{parser:t,funcName:r}=e;t.consumeSpaces();const o=t.fetch();if(_t[o.text])return"\\global"!==r&&"\\\\globallong"!==r||(o.text=_t[o.text]),qt(t.parseFunction(),"internal");throw new n("Invalid token after macro prefix",o)}}),je({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e,o=t.gullet.popToken();const s=o.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(s))throw new n("Expected a control sequence",o);let i,a=0;const l=[[]];for(;"{"!==t.gullet.future().text;)if(o=t.gullet.popToken(),"#"===o.text){if("{"===t.gullet.future().text){i=t.gullet.future(),l[a].push("{");break}if(o=t.gullet.popToken(),!/^[1-9]$/.test(o.text))throw new n('Invalid argument number "'+o.text+'"');if(parseInt(o.text)!==a+1)throw new n('Argument number "'+o.text+'" out of order');a++,l.push([])}else{if("EOF"===o.text)throw new n("Expected a macro definition");l[a].push(o.text)}let{tokens:h}=t.gullet.consumeArg();return i&&h.unshift(i),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h),h.reverse()),t.gullet.macros.set(s,{tokens:h,numArgs:a,delimiters:l},r===_t[r]),{type:"internal",mode:t.mode}}}),je({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e;const n=jt(t.gullet.popToken());t.gullet.consumeSpaces();const o=(e=>{let t=e.gullet.popToken();return"="===t.text&&(t=e.gullet.popToken()," "===t.text&&(t=e.gullet.popToken())),t})(t);return $t(t,n,o,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),je({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e;const n=jt(t.gullet.popToken()),o=t.gullet.popToken(),s=t.gullet.popToken();return $t(t,n,s,"\\\\globalfuture"===r),t.gullet.pushToken(s),t.gullet.pushToken(o),{type:"internal",mode:t.mode}}});const Zt=function(e,t,r){const n=N(oe.math[e]&&oe.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},Kt=function(e,t,r,n){const o=r.havingBaseStyle(t),s=Ve.makeSpan(n.concat(o.sizingClasses(r)),[e],r),i=o.sizeMultiplier/r.sizeMultiplier;return s.height*=i,s.depth*=i,s.maxFontSize=o.sizeMultiplier,s},Jt=function(e,t,r){const n=t.havingBaseStyle(r),o=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=F(o),e.height-=o,e.depth+=o},Qt=function(e,t,r,n,o,s){const i=function(e,t,r,n){return Ve.makeSymbol(e,"Size"+t+"-Regular",r,n)}(e,t,o,n),a=Kt(Ve.makeSpan(["delimsizing","size"+t],[i],n),w.TEXT,n,s);return r&&Jt(a,n,w.TEXT),a},er=function(e,t,r){let n;n="Size1-Regular"===t?"delim-size1":"delim-size4";return{type:"elem",elem:Ve.makeSpan(["delimsizinginner",n],[Ve.makeSpan([],[Ve.makeSymbol(e,t,r)])])}},tr=function(e,t,r){const n=T["Size4-Regular"][e.charCodeAt(0)]?T["Size4-Regular"][e.charCodeAt(0)][4]:T["Size1-Regular"][e.charCodeAt(0)][4],o=new J("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),s=new K([o],{width:F(n),height:F(t),style:"width:"+F(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),i=Ve.makeSvgSpan([],[s],r);return i.height=t,i.style.height=F(t),i.style.width=F(n),{type:"elem",elem:i}},rr={type:"kern",size:-.008},nr=["|","\\lvert","\\rvert","\\vert"],or=["\\|","\\lVert","\\rVert","\\Vert"],sr=function(e,t,r,n,o,s){let i,a,h,c,m="",p=0;i=h=c=e,a=null;let u="Size1-Regular";"\\uparrow"===e?h=c="\u23d0":"\\Uparrow"===e?h=c="\u2016":"\\downarrow"===e?i=h="\u23d0":"\\Downarrow"===e?i=h="\u2016":"\\updownarrow"===e?(i="\\uparrow",h="\u23d0",c="\\downarrow"):"\\Updownarrow"===e?(i="\\Uparrow",h="\u2016",c="\\Downarrow"):l.contains(nr,e)?(h="\u2223",m="vert",p=333):l.contains(or,e)?(h="\u2225",m="doublevert",p=556):"["===e||"\\lbrack"===e?(i="\u23a1",h="\u23a2",c="\u23a3",u="Size4-Regular",m="lbrack",p=667):"]"===e||"\\rbrack"===e?(i="\u23a4",h="\u23a5",c="\u23a6",u="Size4-Regular",m="rbrack",p=667):"\\lfloor"===e||"\u230a"===e?(h=i="\u23a2",c="\u23a3",u="Size4-Regular",m="lfloor",p=667):"\\lceil"===e||"\u2308"===e?(i="\u23a1",h=c="\u23a2",u="Size4-Regular",m="lceil",p=667):"\\rfloor"===e||"\u230b"===e?(h=i="\u23a5",c="\u23a6",u="Size4-Regular",m="rfloor",p=667):"\\rceil"===e||"\u2309"===e?(i="\u23a4",h=c="\u23a5",u="Size4-Regular",m="rceil",p=667):"("===e||"\\lparen"===e?(i="\u239b",h="\u239c",c="\u239d",u="Size4-Regular",m="lparen",p=875):")"===e||"\\rparen"===e?(i="\u239e",h="\u239f",c="\u23a0",u="Size4-Regular",m="rparen",p=875):"\\{"===e||"\\lbrace"===e?(i="\u23a7",a="\u23a8",c="\u23a9",h="\u23aa",u="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(i="\u23ab",a="\u23ac",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(i="\u23a7",c="\u23a9",h="\u23aa",u="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(i="\u23ab",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(i="\u23a7",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(i="\u23ab",c="\u23a9",h="\u23aa",u="Size4-Regular");const d=Zt(i,u,o),g=d.height+d.depth,f=Zt(h,u,o),b=f.height+f.depth,y=Zt(c,u,o),x=y.height+y.depth;let v=0,k=1;if(null!==a){const e=Zt(a,u,o);v=e.height+e.depth,k=2}const S=g+x+v,M=S+Math.max(0,Math.ceil((t-S)/(k*b)))*k*b;let z=n.fontMetrics().axisHeight;r&&(z*=n.sizeMultiplier);const A=M/2-z,T=[];if(m.length>0){const e=M-g-x,t=Math.round(1e3*M),r=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v1759 h347 v-84\nH403z M403 1759 V0 H319 V1759 v"+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v"+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z\nM367 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v"+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+" v1715 h263 v84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+" v1799 H0 v-84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v602 h84z\nM403 1759 V0 H319 V1759 v"+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v602 h84z\nM347 1759 V0 h-84 V1759 v"+t+" v602 h84z";case"lparen":return"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\n-36,557 l0,"+(t+84)+"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\nl0,-"+(t+92)+"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z";case"rparen":return"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,"+(t+9)+"\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\nl0,-"+(t+144)+"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z";default:throw new Error("Unknown stretchy delimiter.")}}(m,Math.round(1e3*e)),o=new J(m,r),s=(p/1e3).toFixed(3)+"em",i=(t/1e3).toFixed(3)+"em",a=new K([o],{width:s,height:i,viewBox:"0 0 "+p+" "+t}),l=Ve.makeSvgSpan([],[a],n);l.height=t/1e3,l.style.width=s,l.style.height=i,T.push({type:"elem",elem:l})}else{if(T.push(er(c,u,o)),T.push(rr),null===a){const e=M-g-x+.016;T.push(tr(h,e,n))}else{const e=(M-g-x-v)/2+.016;T.push(tr(h,e,n)),T.push(rr),T.push(er(a,u,o)),T.push(rr),T.push(tr(h,e,n))}T.push(rr),T.push(er(i,u,o))}const B=n.havingBaseStyle(w.TEXT),C=Ve.makeVList({positionType:"bottom",positionData:A,children:T},B);return Kt(Ve.makeSpan(["delimsizing","mult"],[C],B),w.TEXT,n,s)},ir=.08,ar=function(e,t,r,n,o){const s=function(e,t,r){t*=1e3;let n="";switch(e){case"sqrtMain":n=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize1":n=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize2":n=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize3":n=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize4":n=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,M);break;case"sqrtTall":n=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,M,r)}return n}(e,n,r),i=new J(e,s),a=new K([i],{width:"400em",height:F(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Ve.makeSvgSpan(["hide-tail"],[a],o)},lr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],hr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],cr=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],mr=[0,1.2,1.8,2.4,3],pr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],ur=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],dr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],gr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},fr=function(e,t,r,n){for(let o=Math.min(2,3-n.style.size);ot)return r[o]}return r[r.length-1]},br=function(e,t,r,n,o,s){let i;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),i=l.contains(cr,e)?pr:l.contains(lr,e)?dr:ur;const a=fr(e,t,i,n);return"small"===a.type?function(e,t,r,n,o,s){const i=Ve.makeSymbol(e,"Main-Regular",o,n),a=Kt(i,t,n,s);return r&&Jt(a,n,t),a}(e,a.style,r,n,o,s):"large"===a.type?Qt(e,a.size,r,n,o,s):sr(e,t,r,n,o,s)};var yr={sqrtImage:function(e,t){const r=t.havingBaseSizing(),n=fr("\\surd",e*r.sizeMultiplier,dr,r);let o=r.sizeMultiplier;const s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness);let i,a,l=0,h=0,c=0;return"small"===n.type?(c=1e3+1e3*s+80,e<1?o=1:e<1.4&&(o=.7),l=(1+s+ir)/o,h=(1+s)/o,i=ar("sqrtMain",l,c,s,t),i.style.minWidth="0.853em",a=.833/o):"large"===n.type?(c=1080*mr[n.size],h=(mr[n.size]+s)/o,l=(mr[n.size]+s+ir)/o,i=ar("sqrtSize"+n.size,l,c,s,t),i.style.minWidth="1.02em",a=1/o):(l=e+s+ir,h=e+s,c=Math.floor(1e3*e+s)+80,i=ar("sqrtTall",l,c,s,t),i.style.minWidth="0.742em",a=1.056),i.height=h,i.style.height=F(l),{span:i,advanceWidth:a,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,o,s){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(lr,e)||l.contains(cr,e))return Qt(e,t,!1,r,o,s);if(l.contains(hr,e))return sr(e,mr[t],!1,r,o,s);throw new n("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:mr,customSizedDelim:br,leftRightDelim:function(e,t,r,n,o,s){const i=n.fontMetrics().axisHeight*n.sizeMultiplier,a=5/n.fontMetrics().ptPerEm,l=Math.max(t-i,r+i),h=Math.max(l/500*901,2*l-a);return br(e,h,!0,n,o,s)}};const xr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},wr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function vr(e,t){const r=Rt(e);if(r&&l.contains(wr,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function kr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}je({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>{const r=vr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:xr[e.funcName].size,mclass:xr[e.funcName].mclass,delim:r.text}},htmlBuilder:(e,t)=>"."===e.delim?Ve.makeSpan([e.mclass]):yr.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{const t=[];"."!==e.delim&&t.push(ft(e.delim,e.mode));const r=new gt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");const n=F(yr.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}}),je({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:vr(t[0],e).text,color:r}}}),je({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=vr(t[0],e),n=e.parser;++n.leftrightDepth;const o=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);const s=qt(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:o,left:r.text,right:s.delim,rightColor:s.color}},htmlBuilder:(e,t)=>{kr(e);const r=nt(e.body,t,!0,["mopen","mclose"]);let n,o,s=0,i=0,a=!1;for(let e=0;e{kr(e);const r=xt(e.body,t);if("."!==e.left){const t=new gt.MathNode("mo",[ft(e.left,e.mode)]);t.setAttribute("fence","true"),r.unshift(t)}if("."!==e.right){const t=new gt.MathNode("mo",[ft(e.right,e.mode)]);t.setAttribute("fence","true"),e.rightColor&&t.setAttribute("mathcolor",e.rightColor),r.push(t)}return bt(r)}}),je({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=vr(t[0],e);if(!e.parser.leftrightDepth)throw new n("\\middle without preceding \\left",r);return{type:"middle",mode:e.parser.mode,delim:r.text}},htmlBuilder:(e,t)=>{let r;if("."===e.delim)r=lt(t,[]);else{r=yr.sizedDelim(e.delim,1,t,e.mode,[]);const n={delim:e.delim,options:t};r.isMiddle=n}return r},mathmlBuilder:(e,t)=>{const r="\\vert"===e.delim||"|"===e.delim?ft("|","text"):ft(e.delim,e.mode),n=new gt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n}});const Sr=(e,t)=>{const r=Ve.wrapFragment(ht(e.body,t),t),n=e.label.slice(1);let o,s=t.sizeMultiplier,i=0;const a=l.isCharacterBox(e.body);if("sout"===n)o=Ve.makeSpan(["stretchy","sout"]),o.height=t.fontMetrics().defaultRuleThickness/s,i=-.5*t.fontMetrics().xHeight;else if("phase"===n){const e=P({number:.6,unit:"pt"},t),n=P({number:.35,unit:"ex"},t);s/=t.havingBaseSizing().sizeMultiplier;const a=r.height+r.depth+e+n;r.style.paddingLeft=F(a/2+e);const l=Math.floor(1e3*a*s),c="M400000 "+(h=l)+" H0 L"+h/2+" 0 l65 45 L145 "+(h-80)+" H400000z",m=new K([new J("phase",c)],{width:"400em",height:F(l/1e3),viewBox:"0 0 400000 "+l,preserveAspectRatio:"xMinYMin slice"});o=Ve.makeSvgSpan(["hide-tail"],[m],t),o.style.height=F(a),i=r.depth+e+n}else{/cancel/.test(n)?a||r.classes.push("cancel-pad"):"angl"===n?r.classes.push("anglpad"):r.classes.push("boxpad");let s=0,l=0,h=0;/box/.test(n)?(h=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),s=t.fontMetrics().fboxsep+("colorbox"===n?0:h),l=s):"angl"===n?(h=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness),s=4*h,l=Math.max(0,.25-r.depth)):(s=a?.2:0,l=s),o=Bt(r,n,s,l,t),/fbox|boxed|fcolorbox/.test(n)?(o.style.borderStyle="solid",o.style.borderWidth=F(h)):"angl"===n&&.049!==h&&(o.style.borderTopWidth=F(h),o.style.borderRightWidth=F(h)),i=r.depth+l,e.backgroundColor&&(o.style.backgroundColor=e.backgroundColor,e.borderColor&&(o.style.borderColor=e.borderColor))}var h;let c;if(e.backgroundColor)c=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:i},{type:"elem",elem:r,shift:0}]},t);else{const e=/cancel|phase/.test(n)?["svg-align"]:[];c=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:o,shift:i,wrapperClasses:e}]},t)}return/cancel/.test(n)&&(c.height=r.height,c.depth=r.depth),/cancel/.test(n)&&!a?Ve.makeSpan(["mord","cancel-lap"],[c],t):Ve.makeSpan(["mord"],[c],t)},Mr=(e,t)=>{let r=0;const n=new gt.MathNode(e.label.indexOf("colorbox")>-1?"mpadded":"menclose",[vt(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){const r=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+r+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};je({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){let{parser:n,funcName:o}=e;const s=qt(t[0],"color-token").color,i=t[1];return{type:"enclose",mode:n.mode,label:o,backgroundColor:s,body:i}},htmlBuilder:Sr,mathmlBuilder:Mr}),je({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(e,t,r){let{parser:n,funcName:o}=e;const s=qt(t[0],"color-token").color,i=qt(t[1],"color-token").color,a=t[2];return{type:"enclose",mode:n.mode,label:o,backgroundColor:i,borderColor:s,body:a}},htmlBuilder:Sr,mathmlBuilder:Mr}),je({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\fbox",body:t[0]}}}),je({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"enclose",mode:r.mode,label:n,body:o}},htmlBuilder:Sr,mathmlBuilder:Mr}),je({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(e,t){let{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\angl",body:t[0]}}});const zr={};function Ar(e){let{type:t,names:r,props:n,handler:o,htmlBuilder:s,mathmlBuilder:i}=e;const a={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:o};for(let e=0;e{if(!e.parser.settings.displayMode)throw new n("{"+e.envName+"} can be used only in display mode.")};function Rr(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function Hr(e,t,r){let{hskipBeforeAndAfter:o,addJot:s,cols:i,arraystretch:a,colSeparationType:l,autoTag:h,singleRow:c,emptySingleRow:m,maxNumCols:p,leqno:u}=t;if(e.gullet.beginGroup(),c||e.gullet.macros.set("\\cr","\\\\\\relax"),!a){const t=e.gullet.expandMacroAsText("\\arraystretch");if(null==t)a=1;else if(a=parseFloat(t),!a||a<0)throw new n("Invalid \\arraystretch: "+t)}e.gullet.beginGroup();let d=[];const g=[d],f=[],b=[],y=null!=h?[]:void 0;function x(){h&&e.gullet.macros.set("\\@eqnsw","1",!0)}function w(){y&&(e.gullet.macros.get("\\df@tag")?(y.push(e.subparse([new Nr("\\df@tag")])),e.gullet.macros.set("\\df@tag",void 0,!0)):y.push(Boolean(h)&&"1"===e.gullet.macros.get("\\@eqnsw")))}for(x(),b.push(qr(e));;){let t=e.parseExpression(!1,c?"\\end":"\\\\");e.gullet.endGroup(),e.gullet.beginGroup(),t={type:"ordgroup",mode:e.mode,body:t},r&&(t={type:"styling",mode:e.mode,style:r,body:[t]}),d.push(t);const o=e.fetch().text;if("&"===o){if(p&&d.length===p){if(c||l)throw new n("Too many tab characters: &",e.nextToken);e.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}e.consume()}else{if("\\end"===o){w(),1===d.length&&"styling"===t.type&&0===t.body[0].body.length&&(g.length>1||!m)&&g.pop(),b.length0&&(x+=.25),c.push({pos:x,isDashed:e[t]})}for(v(i[0]),r=0;r0&&(p+=y,le)))for(r=0;r=a)continue;(o>0||e.hskipBeforeAndAfter)&&(i=l.deflt(c.pregap,u),0!==i&&(z=Ve.makeSpan(["arraycolsep"],[]),z.style.width=F(i),M.push(z)));let d=[];for(r=0;r0){const e=Ve.makeLineSpan("hline",t,m),r=Ve.makeLineSpan("hdashline",t,m),n=[{type:"elem",elem:h,shift:0}];for(;c.length>0;){const t=c.pop(),o=t.pos-k;t.isDashed?n.push({type:"elem",elem:r,shift:o}):n.push({type:"elem",elem:e,shift:o})}h=Ve.makeVList({positionType:"individualShift",children:n},t)}if(0===T.length)return Ve.makeSpan(["mord"],[h],t);{let e=Ve.makeVList({positionType:"individualShift",children:T},t);return e=Ve.makeSpan(["tag"],[e],t),Ve.makeFragment([h,e])}},Lr={c:"center ",l:"left ",r:"right "},Dr=function(e,t){const r=[],n=new gt.MathNode("mtd",[],["mtr-glue"]),o=new gt.MathNode("mtd",[],["mml-eqn-num"]);for(let s=0;s0){const t=e.cols;let r="",n=!1,o=0,i=t.length;"separator"===t[0].type&&(a+="top ",o=1),"separator"===t[t.length-1].type&&(a+="bottom ",i-=1);for(let e=o;e0?"left ":"",a+=c[c.length-1].length>0?"right ":"";for(let e=1;e-1?"alignat":"align",s="split"===e.envName,i=Hr(e.parser,{cols:r,addJot:!0,autoTag:s?void 0:Rr(e.envName),emptySingleRow:!0,colSeparationType:o,maxNumCols:s?2:void 0,leqno:e.parser.settings.leqno},"display");let a,l=0;const h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){let e="";for(let r=0;r0&&c&&(n=1),r[e]={type:"align",align:t,pregap:n,postgap:0}}return i.colSeparationType=c?"align":"alignat",i};Ar({type:"array",names:["array","darray"],props:{numArgs:1},handler(e,t){const r=(Rt(t[0])?[t[0]]:qt(t[0],"ordgroup").body).map((function(e){const t=It(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),o={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Hr(e.parser,o,Or(e.envName))},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(e){const t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")];let r="c";const o={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){const t=e.parser;if(t.consumeSpaces(),"["===t.fetch().text){if(t.consume(),t.consumeSpaces(),r=t.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",t.nextToken);t.consume(),t.consumeSpaces(),t.expect("]"),t.consume(),o.cols=[{type:"align",align:r}]}}const s=Hr(e.parser,o,Or(e.envName)),i=Math.max(0,...s.body.map((e=>e.length)));return s.cols=new Array(i).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[s],left:t[0],right:t[1],rightColor:void 0}:s},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){const t=Hr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){const r=(Rt(t[0])?[t[0]]:qt(t[0],"ordgroup").body).map((function(e){const t=It(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");let o={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if(o=Hr(e.parser,o,"script"),o.body.length>0&&o.body[0].length>1)throw new n("{subarray} can contain only one column");return o},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(e){const t=Hr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Or(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Vr,htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(e){l.contains(["gather","gather*"],e.envName)&&Ir(e);const t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Rr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Hr(e.parser,t,"display")},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Vr,htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(e){Ir(e);const t={autoTag:Rr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Hr(e.parser,t,"display")},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["CD"],props:{numArgs:0},handler(e){return Ir(e),function(e){const t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();const r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}let r=[];const o=[r];for(let a=0;a-1);else{if(!("<>AV".indexOf(o)>-1))throw new n('Expected one of "<>AV=|." after @',l[t]);for(let e=0;e<2;e++){let r=!0;for(let h=t+1;h{const r=e.font,n=t.withFont(r);return ht(e.body,n)},Gr=(e,t)=>{const r=e.font,n=t.withFont(r);return vt(e.body,n)},Ur={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};je({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=Ze(t[0]);let s=n;return s in Ur&&(s=Ur[s]),{type:"font",mode:r.mode,font:s.slice(1),body:o}},htmlBuilder:Fr,mathmlBuilder:Gr}),je({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{let{parser:r}=e;const n=t[0],o=l.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:Ft(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:o}}}),je({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{let{parser:r,funcName:n,breakOnTokenText:o}=e;const{mode:s}=r,i=r.parseExpression(!0,o);return{type:"font",mode:s,font:"math"+n.slice(1),body:{type:"ordgroup",mode:r.mode,body:i}}},htmlBuilder:Fr,mathmlBuilder:Gr});const Yr=(e,t)=>{let r=t;return"display"===e?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:"text"===e&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===e?r=w.SCRIPT:"scriptscript"===e&&(r=w.SCRIPTSCRIPT),r},Xr=(e,t)=>{const r=Yr(e.size,t.style),n=r.fracNum(),o=r.fracDen();let s;s=t.havingStyle(n);const i=ht(e.numer,s,t);if(e.continued){const e=8.5/t.fontMetrics().ptPerEm,r=3.5/t.fontMetrics().ptPerEm;i.height=i.height0?3*c:7*c,u=t.fontMetrics().denom1):(h>0?(m=t.fontMetrics().num2,p=c):(m=t.fontMetrics().num3,p=3*c),u=t.fontMetrics().denom2),l){const e=t.fontMetrics().axisHeight;m-i.depth-(e+.5*h){let r=new gt.MathNode("mfrac",[vt(e.numer,t),vt(e.denom,t)]);if(e.hasBarLine){if(e.barSize){const n=P(e.barSize,t);r.setAttribute("linethickness",F(n))}}else r.setAttribute("linethickness","0px");const n=Yr(e.size,t.style);if(n.size!==t.style.size){r=new gt.MathNode("mstyle",[r]);const e=n.size===w.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",e),r.setAttribute("scriptlevel","0")}if(null!=e.leftDelim||null!=e.rightDelim){const t=[];if(null!=e.leftDelim){const r=new gt.MathNode("mo",[new gt.TextNode(e.leftDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}if(t.push(r),null!=e.rightDelim){const r=new gt.MathNode("mo",[new gt.TextNode(e.rightDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}return bt(t)}return r};je({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=t[1];let i,a=null,l=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":i=!0;break;case"\\\\atopfrac":i=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":i=!1,a="(",l=")";break;case"\\\\bracefrac":i=!1,a="\\{",l="\\}";break;case"\\\\brackfrac":i=!1,a="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text"}return{type:"genfrac",mode:r.mode,continued:!1,numer:o,denom:s,hasBarLine:i,leftDelim:a,rightDelim:l,size:h,barSize:null}},htmlBuilder:Xr,mathmlBuilder:Wr}),je({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=t[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:o,denom:s,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),je({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){let t,{parser:r,funcName:n,token:o}=e;switch(n){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:o}}});const _r=["display","text","script","scriptscript"],jr=function(e){let t=null;return e.length>0&&(t=e,t="."===t?null:t),t};je({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){let{parser:r}=e;const n=t[4],o=t[5],s=Ze(t[0]),i="atom"===s.type&&"open"===s.family?jr(s.text):null,a=Ze(t[1]),l="atom"===a.type&&"close"===a.family?jr(a.text):null,h=qt(t[2],"size");let c,m=null;h.isBlank?c=!0:(m=h.value,c=m.number>0);let p="auto",u=t[3];if("ordgroup"===u.type){if(u.body.length>0){const e=qt(u.body[0],"textord");p=_r[Number(e.text)]}}else u=qt(u,"textord"),p=_r[Number(u.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:o,continued:!1,hasBarLine:c,barSize:m,leftDelim:i,rightDelim:l,size:p}},htmlBuilder:Xr,mathmlBuilder:Wr}),je({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(e,t){let{parser:r,funcName:n,token:o}=e;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:qt(t[0],"size").value,token:o}}}),je({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(qt(t[1],"infix").size),i=t[2],a=s.number>0;return{type:"genfrac",mode:r.mode,numer:o,denom:i,continued:!1,hasBarLine:a,barSize:s,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Xr,mathmlBuilder:Wr});const $r=(e,t)=>{const r=t.style;let n,o;"supsub"===e.type?(n=e.sup?ht(e.sup,t.havingStyle(r.sup()),t):ht(e.sub,t.havingStyle(r.sub()),t),o=qt(e.base,"horizBrace")):o=qt(e,"horizBrace");const s=ht(o.base,t.havingBaseStyle(w.DISPLAY)),i=Nt(o,t);let a;if(o.isOver?(a=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:i}]},t),a.children[0].children[0].children[1].classes.push("svg-align")):(a=Ve.makeVList({positionType:"bottom",positionData:s.depth+.1+i.height,children:[{type:"elem",elem:i},{type:"kern",size:.1},{type:"elem",elem:s}]},t),a.children[0].children[0].children[0].classes.push("svg-align")),n){const e=Ve.makeSpan(["mord",o.isOver?"mover":"munder"],[a],t);a=o.isOver?Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:.2},{type:"elem",elem:n}]},t):Ve.makeVList({positionType:"bottom",positionData:e.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:e}]},t)}return Ve.makeSpan(["mord",o.isOver?"mover":"munder"],[a],t)};je({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:$r,mathmlBuilder:(e,t)=>{const r=Ct(e.label);return new gt.MathNode(e.isOver?"mover":"munder",[vt(e.base,t),r])}}),je({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[1],o=qt(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:o})?{type:"href",mode:r.mode,href:o,body:Ke(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{const r=nt(e.body,t,!1);return Ve.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{let r=wt(e.body,t);return r instanceof ut||(r=new ut("mrow",[r])),r.setAttribute("href",e.href),r}}),je({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=qt(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");const o=[];for(let e=0;e{let{parser:r,funcName:o,token:s}=e;const i=qt(t[0],"raw").string,a=t[1];let l;r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");const h={};switch(o){case"\\htmlClass":h.class=i,l={command:"\\htmlClass",class:i};break;case"\\htmlId":h.id=i,l={command:"\\htmlId",id:i};break;case"\\htmlStyle":h.style=i,l={command:"\\htmlStyle",style:i};break;case"\\htmlData":{const e=i.split(",");for(let t=0;t{const r=nt(e.body,t,!1),n=["enclosing"];e.attributes.class&&n.push(...e.attributes.class.trim().split(/\s+/));const o=Ve.makeSpan(n,r,t);for(const t in e.attributes)"class"!==t&&e.attributes.hasOwnProperty(t)&&o.setAttribute(t,e.attributes[t]);return o},mathmlBuilder:(e,t)=>wt(e.body,t)}),je({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;return{type:"htmlmathml",mode:r.mode,html:Ke(t[0]),mathml:Ke(t[1])}},htmlBuilder:(e,t)=>{const r=nt(e.html,t,!1);return Ve.makeFragment(r)},mathmlBuilder:(e,t)=>wt(e.mathml,t)});const Zr=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};{const t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new n("Invalid size: '"+e+"' in \\includegraphics");const r={number:+(t[1]+t[2]),unit:t[3]};if(!V(r))throw new n("Invalid unit: '"+r.unit+"' in \\includegraphics.");return r}};je({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(e,t,r)=>{let{parser:o}=e,s={number:0,unit:"em"},i={number:.9,unit:"em"},a={number:0,unit:"em"},l="";if(r[0]){const e=qt(r[0],"raw").string.split(",");for(let t=0;t{const r=P(e.height,t);let n=0;e.totalheight.number>0&&(n=P(e.totalheight,t)-r);let o=0;e.width.number>0&&(o=P(e.width,t));const s={height:F(r+n)};o>0&&(s.width=F(o)),n>0&&(s.verticalAlign=F(-n));const i=new j(e.src,e.alt,s);return i.height=r,i.depth=n,i},mathmlBuilder:(e,t)=>{const r=new gt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);const n=P(e.height,t);let o=0;if(e.totalheight.number>0&&(o=P(e.totalheight,t)-n,r.setAttribute("valign",F(-o))),r.setAttribute("height",F(n+o)),e.width.number>0){const n=P(e.width,t);r.setAttribute("width",F(n))}return r.setAttribute("src",e.src),r}}),je({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=qt(t[0],"size");if(r.settings.strict){const e="m"===n[1],t="mu"===o.value.unit;e?(t||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+o.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):t&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:o.value}},htmlBuilder(e,t){return Ve.makeGlue(e.dimension,t)},mathmlBuilder(e,t){const r=P(e.dimension,t);return new gt.SpaceNode(r)}}),je({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:o}},htmlBuilder:(e,t)=>{let r;"clap"===e.alignment?(r=Ve.makeSpan([],[ht(e.body,t)]),r=Ve.makeSpan(["inner"],[r],t)):r=Ve.makeSpan(["inner"],[ht(e.body,t)]);const n=Ve.makeSpan(["fix"],[]);let o=Ve.makeSpan([e.alignment],[r,n],t);const s=Ve.makeSpan(["strut"]);return s.style.height=F(o.height+o.depth),o.depth&&(s.style.verticalAlign=F(-o.depth)),o.children.unshift(s),o=Ve.makeSpan(["thinbox"],[o],t),Ve.makeSpan(["mord","vbox"],[o],t)},mathmlBuilder:(e,t)=>{const r=new gt.MathNode("mpadded",[vt(e.body,t)]);if("rlap"!==e.alignment){const t="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",t+"width")}return r.setAttribute("width","0px"),r}}),je({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){let{funcName:r,parser:n}=e;const o=n.mode;n.switchMode("math");const s="\\("===r?"\\)":"$",i=n.parseExpression(!1,s);return n.expect(s),n.switchMode(o),{type:"styling",mode:n.mode,style:"text",body:i}}}),je({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new n("Mismatched "+e.funcName)}});const Kr=(e,t)=>{switch(t.style.size){case w.DISPLAY.size:return e.display;case w.TEXT.size:return e.text;case w.SCRIPT.size:return e.script;case w.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};je({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>{let{parser:r}=e;return{type:"mathchoice",mode:r.mode,display:Ke(t[0]),text:Ke(t[1]),script:Ke(t[2]),scriptscript:Ke(t[3])}},htmlBuilder:(e,t)=>{const r=Kr(e,t),n=nt(r,t,!1);return Ve.makeFragment(n)},mathmlBuilder:(e,t)=>{const r=Kr(e,t);return wt(r,t)}});const Jr=(e,t,r,n,o,s,i)=>{e=Ve.makeSpan([],[e]);const a=r&&l.isCharacterBox(r);let h,c,m;if(t){const e=ht(t,n.havingStyle(o.sup()),n);c={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-e.depth)}}if(r){const e=ht(r,n.havingStyle(o.sub()),n);h={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-e.height)}}if(c&&h){const t=n.fontMetrics().bigOpSpacing5+h.elem.height+h.elem.depth+h.kern+e.depth+i;m=Ve.makeVList({positionType:"bottom",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:F(-s)},{type:"kern",size:h.kern},{type:"elem",elem:e},{type:"kern",size:c.kern},{type:"elem",elem:c.elem,marginLeft:F(s)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(h){const t=e.height-i;m=Ve.makeVList({positionType:"top",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:F(-s)},{type:"kern",size:h.kern},{type:"elem",elem:e}]},n)}else{if(!c)return e;{const t=e.depth+i;m=Ve.makeVList({positionType:"bottom",positionData:t,children:[{type:"elem",elem:e},{type:"kern",size:c.kern},{type:"elem",elem:c.elem,marginLeft:F(s)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}}const p=[m];if(h&&0!==s&&!a){const e=Ve.makeSpan(["mspace"],[],n);e.style.marginRight=F(s),p.unshift(e)}return Ve.makeSpan(["mop","op-limits"],p,n)},Qr=["\\smallint"],en=(e,t)=>{let r,n,o,s=!1;"supsub"===e.type?(r=e.sup,n=e.sub,o=qt(e.base,"op"),s=!0):o=qt(e,"op");const i=t.style;let a,h=!1;if(i.size===w.DISPLAY.size&&o.symbol&&!l.contains(Qr,o.name)&&(h=!0),o.symbol){const e=h?"Size2-Regular":"Size1-Regular";let r="";if("\\oiint"!==o.name&&"\\oiiint"!==o.name||(r=o.name.slice(1),o.name="oiint"===r?"\\iint":"\\iiint"),a=Ve.makeSymbol(o.name,e,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),r.length>0){const e=a.italic,n=Ve.staticSvg(r+"Size"+(h?"2":"1"),t);a=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:0},{type:"elem",elem:n,shift:h?.08:0}]},t),o.name="\\"+r,a.classes.unshift("mop"),a.italic=e}}else if(o.body){const e=nt(o.body,t,!0);1===e.length&&e[0]instanceof Z?(a=e[0],a.classes[0]="mop"):a=Ve.makeSpan(["mop"],e,t)}else{const e=[];for(let r=1;r{let r;if(e.symbol)r=new ut("mo",[ft(e.name,e.mode)]),l.contains(Qr,e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new ut("mo",xt(e.body,t));else{r=new ut("mi",[new dt(e.name.slice(1))]);const t=new ut("mo",[ft("\u2061","text")]);r=e.parentIsSupSub?new ut("mrow",[r,t]):pt([r,t])}return r},rn={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};je({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:(e,t)=>{let{parser:r,funcName:n}=e,o=n;return 1===o.length&&(o=rn[o]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:o}},htmlBuilder:en,mathmlBuilder:tn}),je({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Ke(n)}},htmlBuilder:en,mathmlBuilder:tn});const nn={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};je({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:en,mathmlBuilder:tn}),je({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:en,mathmlBuilder:tn}),je({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e,n=r;return 1===n.length&&(n=nn[n]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:en,mathmlBuilder:tn});const on=(e,t)=>{let r,n,o,s,i=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,o=qt(e.base,"operatorname"),i=!0):o=qt(e,"operatorname"),o.body.length>0){const e=o.body.map((e=>{const t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),r=nt(e,t.withFont("mathrm"),!0);for(let e=0;e{let{parser:r,funcName:n}=e;const o=t[0];return{type:"operatorname",mode:r.mode,body:Ke(o),alwaysHandleSupSub:"\\operatornamewithlimits"===n,limits:!1,parentIsSupSub:!1}},htmlBuilder:on,mathmlBuilder:(e,t)=>{let r=xt(e.body,t.withFont("mathrm")),n=!0;for(let e=0;ee.toText())).join("");r=[new gt.TextNode(e)]}const o=new gt.MathNode("mi",r);o.setAttribute("mathvariant","normal");const s=new gt.MathNode("mo",[ft("\u2061","text")]);return e.parentIsSupSub?new gt.MathNode("mrow",[o,s]):gt.newDocumentFragment([o,s])}}),Br("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),$e({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?Ve.makeFragment(nt(e.body,t,!1)):Ve.makeSpan(["mord"],nt(e.body,t,!0),t)},mathmlBuilder(e,t){return wt(e.body,t,!0)}}),je({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){let{parser:r}=e;const n=t[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(e,t){const r=ht(e.body,t.havingCrampedStyle()),n=Ve.makeLineSpan("overline-line",t),o=t.fontMetrics().defaultRuleThickness,s=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*o},{type:"elem",elem:n},{type:"kern",size:o}]},t);return Ve.makeSpan(["mord","overline"],[s],t)},mathmlBuilder(e,t){const r=new gt.MathNode("mo",[new gt.TextNode("\u203e")]);r.setAttribute("stretchy","true");const n=new gt.MathNode("mover",[vt(e.body,t),r]);return n.setAttribute("accent","true"),n}}),je({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"phantom",mode:r.mode,body:Ke(n)}},htmlBuilder:(e,t)=>{const r=nt(e.body,t.withPhantom(),!1);return Ve.makeFragment(r)},mathmlBuilder:(e,t)=>{const r=xt(e.body,t);return new gt.MathNode("mphantom",r)}}),je({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"hphantom",mode:r.mode,body:n}},htmlBuilder:(e,t)=>{let r=Ve.makeSpan([],[ht(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(let e=0;e{const r=xt(Ke(e.body),t),n=new gt.MathNode("mphantom",r),o=new gt.MathNode("mpadded",[n]);return o.setAttribute("height","0px"),o.setAttribute("depth","0px"),o}}),je({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"vphantom",mode:r.mode,body:n}},htmlBuilder:(e,t)=>{const r=Ve.makeSpan(["inner"],[ht(e.body,t.withPhantom())]),n=Ve.makeSpan(["fix"],[]);return Ve.makeSpan(["mord","rlap"],[r,n],t)},mathmlBuilder:(e,t)=>{const r=xt(Ke(e.body),t),n=new gt.MathNode("mphantom",r),o=new gt.MathNode("mpadded",[n]);return o.setAttribute("width","0px"),o}}),je({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){let{parser:r}=e;const n=qt(t[0],"size").value,o=t[1];return{type:"raisebox",mode:r.mode,dy:n,body:o}},htmlBuilder(e,t){const r=ht(e.body,t),n=P(e.dy,t);return Ve.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){const r=new gt.MathNode("mpadded",[vt(e.body,t)]),n=e.dy.number+e.dy.unit;return r.setAttribute("voffset",n),r}}),je({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(e){let{parser:t}=e;return{type:"internal",mode:t.mode}}}),je({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler(e,t,r){let{parser:n}=e;const o=r[0],s=qt(t[0],"size"),i=qt(t[1],"size");return{type:"rule",mode:n.mode,shift:o&&qt(o,"size").value,width:s.value,height:i.value}},htmlBuilder(e,t){const r=Ve.makeSpan(["mord","rule"],[],t),n=P(e.width,t),o=P(e.height,t),s=e.shift?P(e.shift,t):0;return r.style.borderRightWidth=F(n),r.style.borderTopWidth=F(o),r.style.bottom=F(s),r.width=n,r.height=o+s,r.depth=-s,r.maxFontSize=1.125*o*t.sizeMultiplier,r},mathmlBuilder(e,t){const r=P(e.width,t),n=P(e.height,t),o=e.shift?P(e.shift,t):0,s=t.color&&t.getColor()||"black",i=new gt.MathNode("mspace");i.setAttribute("mathbackground",s),i.setAttribute("width",F(r)),i.setAttribute("height",F(n));const a=new gt.MathNode("mpadded",[i]);return o>=0?a.setAttribute("height",F(o)):(a.setAttribute("height",F(o)),a.setAttribute("depth",F(-o))),a.setAttribute("voffset",F(o)),a}});const an=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];je({type:"sizing",names:an,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{let{breakOnTokenText:r,funcName:n,parser:o}=e;const s=o.parseExpression(!1,r);return{type:"sizing",mode:o.mode,size:an.indexOf(n)+1,body:s}},htmlBuilder:(e,t)=>{const r=t.havingSize(e.size);return sn(e.body,r,t)},mathmlBuilder:(e,t)=>{const r=t.havingSize(e.size),n=xt(e.body,r),o=new gt.MathNode("mstyle",n);return o.setAttribute("mathsize",F(r.sizeMultiplier)),o}}),je({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{let{parser:n}=e,o=!1,s=!1;const i=r[0]&&qt(r[0],"ordgroup");if(i){let e="";for(let t=0;t{const r=Ve.makeSpan([],[ht(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(let e=0;e{const r=new gt.MathNode("mpadded",[vt(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}}),je({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){let{parser:n}=e;const o=r[0],s=t[0];return{type:"sqrt",mode:n.mode,body:s,index:o}},htmlBuilder(e,t){let r=ht(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=Ve.wrapFragment(r,t);const n=t.fontMetrics().defaultRuleThickness;let o=n;t.style.idr.height+r.depth+s&&(s=(s+c-r.height-r.depth)/2);const m=a.height-r.height-s-l;r.style.paddingLeft=F(h);const p=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+m)},{type:"elem",elem:a},{type:"kern",size:l}]},t);if(e.index){const r=t.havingStyle(w.SCRIPTSCRIPT),n=ht(e.index,r,t),o=.6*(p.height-p.depth),s=Ve.makeVList({positionType:"shift",positionData:-o,children:[{type:"elem",elem:n}]},t),i=Ve.makeSpan(["root"],[s]);return Ve.makeSpan(["mord","sqrt"],[i,p],t)}return Ve.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder(e,t){const{body:r,index:n}=e;return n?new gt.MathNode("mroot",[vt(r,t),vt(n,t)]):new gt.MathNode("msqrt",[vt(r,t)])}});const ln={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};je({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){let{breakOnTokenText:r,funcName:n,parser:o}=e;const s=o.parseExpression(!0,r),i=n.slice(1,n.length-5);return{type:"styling",mode:o.mode,style:i,body:s}},htmlBuilder(e,t){const r=ln[e.style],n=t.havingStyle(r).withFont("");return sn(e.body,n,t)},mathmlBuilder(e,t){const r=ln[e.style],n=t.havingStyle(r),o=xt(e.body,n),s=new gt.MathNode("mstyle",o),i={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return s.setAttribute("scriptlevel",i[0]),s.setAttribute("displaystyle",i[1]),s}});$e({type:"supsub",htmlBuilder(e,t){const r=function(e,t){const r=e.base;if(r)return"op"===r.type?r.limits&&(t.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?en:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===w.DISPLAY.size||r.limits)?on:null:"accent"===r.type?l.isCharacterBox(r.base)?Ht:null:"horizBrace"===r.type&&!e.sub===r.isOver?$r:null;return null}(e,t);if(r)return r(e,t);const{base:n,sup:o,sub:s}=e,i=ht(n,t);let a,h;const c=t.fontMetrics();let m=0,p=0;const u=n&&l.isCharacterBox(n);if(o){const e=t.havingStyle(t.style.sup());a=ht(o,e,t),u||(m=i.height-e.fontMetrics().supDrop*e.sizeMultiplier/t.sizeMultiplier)}if(s){const e=t.havingStyle(t.style.sub());h=ht(s,e,t),u||(p=i.depth+e.fontMetrics().subDrop*e.sizeMultiplier/t.sizeMultiplier)}let d;d=t.style===w.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;const g=t.sizeMultiplier,f=F(.5/c.ptPerEm/g);let b,y=null;if(h){const t=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(i instanceof Z||t)&&(y=F(-i.italic))}if(a&&h){m=Math.max(m,d,a.depth+.25*c.xHeight),p=Math.max(p,c.sub2);const e=4*c.defaultRuleThickness;if(m-a.depth-(h.height-p)0&&(m+=t,p-=t)}const r=[{type:"elem",elem:h,shift:p,marginRight:f,marginLeft:y},{type:"elem",elem:a,shift:-m,marginRight:f}];b=Ve.makeVList({positionType:"individualShift",children:r},t)}else if(h){p=Math.max(p,c.sub1,h.height-.8*c.xHeight);const e=[{type:"elem",elem:h,marginLeft:y,marginRight:f}];b=Ve.makeVList({positionType:"shift",positionData:p,children:e},t)}else{if(!a)throw new Error("supsub must have either sup or sub.");m=Math.max(m,d,a.depth+.25*c.xHeight),b=Ve.makeVList({positionType:"shift",positionData:-m,children:[{type:"elem",elem:a,marginRight:f}]},t)}const x=at(i,"right")||"mord";return Ve.makeSpan([x],[i,Ve.makeSpan(["msupsub"],[b])],t)},mathmlBuilder(e,t){let r,n,o=!1;e.base&&"horizBrace"===e.base.type&&(n=!!e.sup,n===e.base.isOver&&(o=!0,r=e.base.isOver)),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);const s=[vt(e.base,t)];let i;if(e.sub&&s.push(vt(e.sub,t)),e.sup&&s.push(vt(e.sup,t)),o)i=r?"mover":"munder";else if(e.sub)if(e.sup){const r=e.base;i=r&&"op"===r.type&&r.limits&&t.style===w.DISPLAY||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(t.style===w.DISPLAY||r.limits)?"munderover":"msubsup"}else{const r=e.base;i=r&&"op"===r.type&&r.limits&&(t.style===w.DISPLAY||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.style===w.DISPLAY)?"munder":"msub"}else{const r=e.base;i=r&&"op"===r.type&&r.limits&&(t.style===w.DISPLAY||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.style===w.DISPLAY)?"mover":"msup"}return new gt.MathNode(i,s)}}),$e({type:"atom",htmlBuilder(e,t){return Ve.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder(e,t){const r=new gt.MathNode("mo",[ft(e.text,e.mode)]);if("bin"===e.family){const n=yt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});const hn={mi:"italic",mn:"normal",mtext:"normal"};$e({type:"mathord",htmlBuilder(e,t){return Ve.makeOrd(e,t,"mathord")},mathmlBuilder(e,t){const r=new gt.MathNode("mi",[ft(e.text,e.mode,t)]),n=yt(e,t)||"italic";return n!==hn[r.type]&&r.setAttribute("mathvariant",n),r}}),$e({type:"textord",htmlBuilder(e,t){return Ve.makeOrd(e,t,"textord")},mathmlBuilder(e,t){const r=ft(e.text,e.mode,t),n=yt(e,t)||"normal";let o;return o="text"===e.mode?new gt.MathNode("mtext",[r]):/[0-9]/.test(e.text)?new gt.MathNode("mn",[r]):"\\prime"===e.text?new gt.MathNode("mo",[r]):new gt.MathNode("mi",[r]),n!==hn[o.type]&&o.setAttribute("mathvariant",n),o}});const cn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},mn={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};$e({type:"spacing",htmlBuilder(e,t){if(mn.hasOwnProperty(e.text)){const r=mn[e.text].className||"";if("text"===e.mode){const n=Ve.makeOrd(e,t,"textord");return n.classes.push(r),n}return Ve.makeSpan(["mspace",r],[Ve.mathsym(e.text,e.mode,t)],t)}if(cn.hasOwnProperty(e.text))return Ve.makeSpan(["mspace",cn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder(e,t){let r;if(!mn.hasOwnProperty(e.text)){if(cn.hasOwnProperty(e.text))return new gt.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return r=new gt.MathNode("mtext",[new gt.TextNode("\xa0")]),r}});const pn=()=>{const e=new gt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};$e({type:"tag",mathmlBuilder(e,t){const r=new gt.MathNode("mtable",[new gt.MathNode("mtr",[pn(),new gt.MathNode("mtd",[wt(e.body,t)]),pn(),new gt.MathNode("mtd",[wt(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});const un={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},dn={"\\textbf":"textbf","\\textmd":"textmd"},gn={"\\textit":"textit","\\textup":"textup"},fn=(e,t)=>{const r=e.font;return r?un[r]?t.withTextFontFamily(un[r]):dn[r]?t.withTextFontWeight(dn[r]):"\\emph"===r?"textit"===t.fontShape?t.withTextFontShape("textup"):t.withTextFontShape("textit"):t.withTextFontShape(gn[r]):t};je({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"text",mode:r.mode,body:Ke(o),font:n}},htmlBuilder(e,t){const r=fn(e,t),n=nt(e.body,r,!0);return Ve.makeSpan(["mord","text"],n,r)},mathmlBuilder(e,t){const r=fn(e,t);return wt(e.body,r)}}),je({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"underline",mode:r.mode,body:t[0]}},htmlBuilder(e,t){const r=ht(e.body,t),n=Ve.makeLineSpan("underline-line",t),o=t.fontMetrics().defaultRuleThickness,s=Ve.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:o},{type:"elem",elem:n},{type:"kern",size:3*o},{type:"elem",elem:r}]},t);return Ve.makeSpan(["mord","underline"],[s],t)},mathmlBuilder(e,t){const r=new gt.MathNode("mo",[new gt.TextNode("\u203e")]);r.setAttribute("stretchy","true");const n=new gt.MathNode("munder",[vt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),je({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){let{parser:r}=e;return{type:"vcenter",mode:r.mode,body:t[0]}},htmlBuilder(e,t){const r=ht(e.body,t),n=t.fontMetrics().axisHeight,o=.5*(r.height-n-(r.depth+n));return Ve.makeVList({positionType:"shift",positionData:o,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){return new gt.MathNode("mpadded",[vt(e.body,t)],["vcenter"])}}),je({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(e,t){const r=bn(e),n=[],o=t.havingStyle(t.style.text());for(let t=0;te.body.replace(/ /g,e.star?"\u2423":"\xa0");var yn=Xe;const xn="[ \r\n\t]",wn="(\\\\[a-zA-Z@]+)"+xn+"*",vn="[\u0300-\u036f]",kn=new RegExp(vn+"+$"),Sn="("+xn+"+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff]"+vn+"*|[\ud800-\udbff][\udc00-\udfff]"+vn+"*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|"+wn+"|\\\\[^\ud800-\udfff])";class Mn{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp(Sn,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){const e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new Nr("EOF",new Cr(this,t,t));const r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new n("Unexpected character: '"+e[t]+"'",new Nr(e[t],new Cr(this,t,t+1)));const o=r[6]||r[3]||(r[2]?"\\ ":" ");if(14===this.catcodes[o]){const t=e.indexOf("\n",this.tokenRegex.lastIndex);return-1===t?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=t+1,this.lex()}return new Nr(o,new Cr(this,t,this.tokenRegex.lastIndex))}}class zn{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new n("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");const e=this.undefStack.pop();for(const t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,r){if(void 0===r&&(r=!1),r){for(let t=0;t0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{const t=this.undefStack[this.undefStack.length-1];t&&!t.hasOwnProperty(e)&&(t[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t}}var An=Tr;Br("\\noexpand",(function(e){const t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Br("\\expandafter",(function(e){const t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Br("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Br("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Br("\\@ifnextchar",(function(e){const t=e.consumeArgs(3);e.consumeSpaces();const r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Br("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Br("\\TextOrMath",(function(e){const t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));const Tn={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Br("\\char",(function(e){let t,r=e.popToken(),o="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if(r=e.popToken(),"\\"===r.text[0])o=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new n("\\char` missing argument");o=r.text.charCodeAt(0)}else t=10;if(t){if(o=Tn[r.text],null==o||o>=t)throw new n("Invalid base-"+t+" digit "+r.text);let s;for(;null!=(s=Tn[e.future().text])&&s{let o=e.consumeArg().tokens;if(1!==o.length)throw new n("\\newcommand's first argument must be a macro name");const s=o[0].text,i=e.isDefined(s);if(i&&!t)throw new n("\\newcommand{"+s+"} attempting to redefine "+s+"; use \\renewcommand");if(!i&&!r)throw new n("\\renewcommand{"+s+"} when command "+s+" does not yet exist; use \\newcommand");let a=0;if(o=e.consumeArg().tokens,1===o.length&&"["===o[0].text){let t="",r=e.expandNextToken();for(;"]"!==r.text&&"EOF"!==r.text;)t+=r.text,r=e.expandNextToken();if(!t.match(/^\s*[0-9]+\s*$/))throw new n("Invalid number of arguments: "+t);a=parseInt(t),o=e.consumeArg().tokens}return e.macros.set(s,{tokens:o,numArgs:a}),""};Br("\\newcommand",(e=>Bn(e,!1,!0))),Br("\\renewcommand",(e=>Bn(e,!0,!1))),Br("\\providecommand",(e=>Bn(e,!0,!0))),Br("\\message",(e=>{const t=e.consumeArgs(1)[0];return console.log(t.reverse().map((e=>e.text)).join("")),""})),Br("\\errmessage",(e=>{const t=e.consumeArgs(1)[0];return console.error(t.reverse().map((e=>e.text)).join("")),""})),Br("\\show",(e=>{const t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),yn[r],oe.math[r],oe.text[r]),""})),Br("\\bgroup","{"),Br("\\egroup","}"),Br("~","\\nobreakspace"),Br("\\lq","`"),Br("\\rq","'"),Br("\\aa","\\r a"),Br("\\AA","\\r A"),Br("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),Br("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),Br("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),Br("\u212c","\\mathscr{B}"),Br("\u2130","\\mathscr{E}"),Br("\u2131","\\mathscr{F}"),Br("\u210b","\\mathscr{H}"),Br("\u2110","\\mathscr{I}"),Br("\u2112","\\mathscr{L}"),Br("\u2133","\\mathscr{M}"),Br("\u211b","\\mathscr{R}"),Br("\u212d","\\mathfrak{C}"),Br("\u210c","\\mathfrak{H}"),Br("\u2128","\\mathfrak{Z}"),Br("\\Bbbk","\\Bbb{k}"),Br("\xb7","\\cdotp"),Br("\\llap","\\mathllap{\\textrm{#1}}"),Br("\\rlap","\\mathrlap{\\textrm{#1}}"),Br("\\clap","\\mathclap{\\textrm{#1}}"),Br("\\mathstrut","\\vphantom{(}"),Br("\\underbar","\\underline{\\text{#1}}"),Br("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),Br("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),Br("\\ne","\\neq"),Br("\u2260","\\neq"),Br("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),Br("\u2209","\\notin"),Br("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),Br("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),Br("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),Br("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),Br("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),Br("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),Br("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),Br("\u27c2","\\perp"),Br("\u203c","\\mathclose{!\\mkern-0.8mu!}"),Br("\u220c","\\notni"),Br("\u231c","\\ulcorner"),Br("\u231d","\\urcorner"),Br("\u231e","\\llcorner"),Br("\u231f","\\lrcorner"),Br("\xa9","\\copyright"),Br("\xae","\\textregistered"),Br("\ufe0f","\\textregistered"),Br("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),Br("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),Br("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),Br("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),Br("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),Br("\u22ee","\\vdots"),Br("\\varGamma","\\mathit{\\Gamma}"),Br("\\varDelta","\\mathit{\\Delta}"),Br("\\varTheta","\\mathit{\\Theta}"),Br("\\varLambda","\\mathit{\\Lambda}"),Br("\\varXi","\\mathit{\\Xi}"),Br("\\varPi","\\mathit{\\Pi}"),Br("\\varSigma","\\mathit{\\Sigma}"),Br("\\varUpsilon","\\mathit{\\Upsilon}"),Br("\\varPhi","\\mathit{\\Phi}"),Br("\\varPsi","\\mathit{\\Psi}"),Br("\\varOmega","\\mathit{\\Omega}"),Br("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),Br("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),Br("\\boxed","\\fbox{$\\displaystyle{#1}$}"),Br("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),Br("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),Br("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");const Cn={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Br("\\dots",(function(e){let t="\\dotso";const r=e.expandAfterFuture().text;return r in Cn?t=Cn[r]:("\\not"===r.slice(0,4)||r in oe.math&&l.contains(["bin","rel"],oe.math[r].group))&&(t="\\dotsb"),t}));const Nn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Br("\\dotso",(function(e){return e.future().text in Nn?"\\ldots\\,":"\\ldots"})),Br("\\dotsc",(function(e){const t=e.future().text;return t in Nn&&","!==t?"\\ldots\\,":"\\ldots"})),Br("\\cdots",(function(e){return e.future().text in Nn?"\\@cdots\\,":"\\@cdots"})),Br("\\dotsb","\\cdots"),Br("\\dotsm","\\cdots"),Br("\\dotsi","\\!\\cdots"),Br("\\dotsx","\\ldots\\,"),Br("\\DOTSI","\\relax"),Br("\\DOTSB","\\relax"),Br("\\DOTSX","\\relax"),Br("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Br("\\,","\\tmspace+{3mu}{.1667em}"),Br("\\thinspace","\\,"),Br("\\>","\\mskip{4mu}"),Br("\\:","\\tmspace+{4mu}{.2222em}"),Br("\\medspace","\\:"),Br("\\;","\\tmspace+{5mu}{.2777em}"),Br("\\thickspace","\\;"),Br("\\!","\\tmspace-{3mu}{.1667em}"),Br("\\negthinspace","\\!"),Br("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Br("\\negthickspace","\\tmspace-{5mu}{.277em}"),Br("\\enspace","\\kern.5em "),Br("\\enskip","\\hskip.5em\\relax"),Br("\\quad","\\hskip1em\\relax"),Br("\\qquad","\\hskip2em\\relax"),Br("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Br("\\tag@paren","\\tag@literal{({#1})}"),Br("\\tag@literal",(e=>{if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Br("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Br("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Br("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Br("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Br("\\newline","\\\\\\relax"),Br("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");const qn=F(T["Main-Regular"]["T".charCodeAt(0)][1]-.7*T["Main-Regular"]["A".charCodeAt(0)][1]);Br("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+qn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Br("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+qn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Br("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Br("\\@hspace","\\hskip #1\\relax"),Br("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Br("\\ordinarycolon",":"),Br("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Br("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Br("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Br("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Br("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Br("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Br("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Br("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Br("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Br("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Br("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Br("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Br("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Br("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Br("\u2237","\\dblcolon"),Br("\u2239","\\eqcolon"),Br("\u2254","\\coloneqq"),Br("\u2255","\\eqqcolon"),Br("\u2a74","\\Coloneqq"),Br("\\ratio","\\vcentcolon"),Br("\\coloncolon","\\dblcolon"),Br("\\colonequals","\\coloneqq"),Br("\\coloncolonequals","\\Coloneqq"),Br("\\equalscolon","\\eqqcolon"),Br("\\equalscoloncolon","\\Eqqcolon"),Br("\\colonminus","\\coloneq"),Br("\\coloncolonminus","\\Coloneq"),Br("\\minuscolon","\\eqcolon"),Br("\\minuscoloncolon","\\Eqcolon"),Br("\\coloncolonapprox","\\Colonapprox"),Br("\\coloncolonsim","\\Colonsim"),Br("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Br("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Br("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Br("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Br("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Br("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Br("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Br("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Br("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Br("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Br("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Br("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Br("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Br("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Br("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Br("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Br("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Br("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Br("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Br("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Br("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Br("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Br("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Br("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Br("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Br("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Br("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Br("\\imath","\\html@mathml{\\@imath}{\u0131}"),Br("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Br("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Br("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Br("\u27e6","\\llbracket"),Br("\u27e7","\\rrbracket"),Br("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Br("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Br("\u2983","\\lBrace"),Br("\u2984","\\rBrace"),Br("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Br("\u29b5","\\minuso"),Br("\\darr","\\downarrow"),Br("\\dArr","\\Downarrow"),Br("\\Darr","\\Downarrow"),Br("\\lang","\\langle"),Br("\\rang","\\rangle"),Br("\\uarr","\\uparrow"),Br("\\uArr","\\Uparrow"),Br("\\Uarr","\\Uparrow"),Br("\\N","\\mathbb{N}"),Br("\\R","\\mathbb{R}"),Br("\\Z","\\mathbb{Z}"),Br("\\alef","\\aleph"),Br("\\alefsym","\\aleph"),Br("\\Alpha","\\mathrm{A}"),Br("\\Beta","\\mathrm{B}"),Br("\\bull","\\bullet"),Br("\\Chi","\\mathrm{X}"),Br("\\clubs","\\clubsuit"),Br("\\cnums","\\mathbb{C}"),Br("\\Complex","\\mathbb{C}"),Br("\\Dagger","\\ddagger"),Br("\\diamonds","\\diamondsuit"),Br("\\empty","\\emptyset"),Br("\\Epsilon","\\mathrm{E}"),Br("\\Eta","\\mathrm{H}"),Br("\\exist","\\exists"),Br("\\harr","\\leftrightarrow"),Br("\\hArr","\\Leftrightarrow"),Br("\\Harr","\\Leftrightarrow"),Br("\\hearts","\\heartsuit"),Br("\\image","\\Im"),Br("\\infin","\\infty"),Br("\\Iota","\\mathrm{I}"),Br("\\isin","\\in"),Br("\\Kappa","\\mathrm{K}"),Br("\\larr","\\leftarrow"),Br("\\lArr","\\Leftarrow"),Br("\\Larr","\\Leftarrow"),Br("\\lrarr","\\leftrightarrow"),Br("\\lrArr","\\Leftrightarrow"),Br("\\Lrarr","\\Leftrightarrow"),Br("\\Mu","\\mathrm{M}"),Br("\\natnums","\\mathbb{N}"),Br("\\Nu","\\mathrm{N}"),Br("\\Omicron","\\mathrm{O}"),Br("\\plusmn","\\pm"),Br("\\rarr","\\rightarrow"),Br("\\rArr","\\Rightarrow"),Br("\\Rarr","\\Rightarrow"),Br("\\real","\\Re"),Br("\\reals","\\mathbb{R}"),Br("\\Reals","\\mathbb{R}"),Br("\\Rho","\\mathrm{P}"),Br("\\sdot","\\cdot"),Br("\\sect","\\S"),Br("\\spades","\\spadesuit"),Br("\\sub","\\subset"),Br("\\sube","\\subseteq"),Br("\\supe","\\supseteq"),Br("\\Tau","\\mathrm{T}"),Br("\\thetasym","\\vartheta"),Br("\\weierp","\\wp"),Br("\\Zeta","\\mathrm{Z}"),Br("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Br("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Br("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Br("\\bra","\\mathinner{\\langle{#1}|}"),Br("\\ket","\\mathinner{|{#1}\\rangle}"),Br("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Br("\\Bra","\\left\\langle#1\\right|"),Br("\\Ket","\\left|#1\\right\\rangle");const In=e=>t=>{const r=t.consumeArg().tokens,n=t.consumeArg().tokens,o=t.consumeArg().tokens,s=t.consumeArg().tokens,i=t.macros.get("|"),a=t.macros.get("\\|");t.macros.beginGroup();const l=t=>r=>{e&&(r.macros.set("|",i),o.length&&r.macros.set("\\|",a));let s=t;if(!t&&o.length){"|"===r.future().text&&(r.popToken(),s=!0)}return{tokens:s?o:n,numArgs:0}};t.macros.set("|",l(!1)),o.length&&t.macros.set("\\|",l(!0));const h=t.consumeArg().tokens,c=t.expandTokens([...s,...h,...r]);return t.macros.endGroup(),{tokens:c.reverse(),numArgs:0}};Br("\\bra@ket",In(!1)),Br("\\bra@set",In(!0)),Br("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),Br("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),Br("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),Br("\\angln","{\\angl n}"),Br("\\blue","\\textcolor{##6495ed}{#1}"),Br("\\orange","\\textcolor{##ffa500}{#1}"),Br("\\pink","\\textcolor{##ff00af}{#1}"),Br("\\red","\\textcolor{##df0030}{#1}"),Br("\\green","\\textcolor{##28ae7b}{#1}"),Br("\\gray","\\textcolor{gray}{#1}"),Br("\\purple","\\textcolor{##9d38bd}{#1}"),Br("\\blueA","\\textcolor{##ccfaff}{#1}"),Br("\\blueB","\\textcolor{##80f6ff}{#1}"),Br("\\blueC","\\textcolor{##63d9ea}{#1}"),Br("\\blueD","\\textcolor{##11accd}{#1}"),Br("\\blueE","\\textcolor{##0c7f99}{#1}"),Br("\\tealA","\\textcolor{##94fff5}{#1}"),Br("\\tealB","\\textcolor{##26edd5}{#1}"),Br("\\tealC","\\textcolor{##01d1c1}{#1}"),Br("\\tealD","\\textcolor{##01a995}{#1}"),Br("\\tealE","\\textcolor{##208170}{#1}"),Br("\\greenA","\\textcolor{##b6ffb0}{#1}"),Br("\\greenB","\\textcolor{##8af281}{#1}"),Br("\\greenC","\\textcolor{##74cf70}{#1}"),Br("\\greenD","\\textcolor{##1fab54}{#1}"),Br("\\greenE","\\textcolor{##0d923f}{#1}"),Br("\\goldA","\\textcolor{##ffd0a9}{#1}"),Br("\\goldB","\\textcolor{##ffbb71}{#1}"),Br("\\goldC","\\textcolor{##ff9c39}{#1}"),Br("\\goldD","\\textcolor{##e07d10}{#1}"),Br("\\goldE","\\textcolor{##a75a05}{#1}"),Br("\\redA","\\textcolor{##fca9a9}{#1}"),Br("\\redB","\\textcolor{##ff8482}{#1}"),Br("\\redC","\\textcolor{##f9685d}{#1}"),Br("\\redD","\\textcolor{##e84d39}{#1}"),Br("\\redE","\\textcolor{##bc2612}{#1}"),Br("\\maroonA","\\textcolor{##ffbde0}{#1}"),Br("\\maroonB","\\textcolor{##ff92c6}{#1}"),Br("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Br("\\maroonD","\\textcolor{##ca337c}{#1}"),Br("\\maroonE","\\textcolor{##9e034e}{#1}"),Br("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Br("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Br("\\purpleC","\\textcolor{##aa87ff}{#1}"),Br("\\purpleD","\\textcolor{##7854ab}{#1}"),Br("\\purpleE","\\textcolor{##543b78}{#1}"),Br("\\mintA","\\textcolor{##f5f9e8}{#1}"),Br("\\mintB","\\textcolor{##edf2df}{#1}"),Br("\\mintC","\\textcolor{##e0e5cc}{#1}"),Br("\\grayA","\\textcolor{##f6f7f7}{#1}"),Br("\\grayB","\\textcolor{##f0f1f2}{#1}"),Br("\\grayC","\\textcolor{##e3e5e6}{#1}"),Br("\\grayD","\\textcolor{##d6d8da}{#1}"),Br("\\grayE","\\textcolor{##babec2}{#1}"),Br("\\grayF","\\textcolor{##888d93}{#1}"),Br("\\grayG","\\textcolor{##626569}{#1}"),Br("\\grayH","\\textcolor{##3b3e40}{#1}"),Br("\\grayI","\\textcolor{##21242c}{#1}"),Br("\\kaBlue","\\textcolor{##314453}{#1}"),Br("\\kaGreen","\\textcolor{##71B307}{#1}");const Rn={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class Hn{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new zn(An,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new Mn(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){let t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),({tokens:n,end:r}=this.consumeArg(["]"]))}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new Nr("EOF",r.loc)),this.pushTokens(n),t.range(r,"")}consumeSpaces(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}}consumeArg(e){const t=[],r=e&&e.length>0;r||this.consumeSpaces();const o=this.future();let s,i=0,a=0;do{if(s=this.popToken(),t.push(s),"{"===s.text)++i;else if("}"===s.text){if(--i,-1===i)throw new n("Extra }",s)}else if("EOF"===s.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[a]:"}")+"'",s);if(e&&r)if((0===i||1===i&&"{"===e[a])&&s.text===e[a]){if(++a,a===e.length){t.splice(-a,a);break}}else a=0}while(0!==i||r);return"{"===o.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:o,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");const r=t[0];for(let e=0;ethis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){const t=this.popToken(),r=t.text,o=t.noexpand?null:this._getExpansion(r);if(null==o||e&&o.unexpandable){if(e&&null==o&&"\\"===r[0]&&!this.isDefined(r))throw new n("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);let s=o.tokens;const i=this.consumeArgs(o.numArgs,o.delimiters);if(o.numArgs){s=s.slice();for(let e=s.length-1;e>=0;--e){let t=s[e];if("#"===t.text){if(0===e)throw new n("Incomplete placeholder at end of macro body",t);if(t=s[--e],"#"===t.text)s.splice(e+1,1);else{if(!/^[1-9]$/.test(t.text))throw new n("Not a valid argument number",t);s.splice(e,2,...i[+t.text-1])}}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(!1===this.expandOnce()){const e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Nr(e)]):void 0}expandTokens(e){const t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){const e=this.stack.pop();e.treatAsRelax&&(e.noexpand=!1,e.treatAsRelax=!1),t.push(e)}return this.countExpansion(t.length),t}expandMacroAsText(e){const t=this.expandMacro(e);return t?t.map((e=>e.text)).join(""):t}_getExpansion(e){const t=this.macros.get(e);if(null==t)return t;if(1===e.length){const t=this.lexer.catcodes[e];if(null!=t&&13!==t)return}const r="function"==typeof t?t(this):t;if("string"==typeof r){let e=0;if(-1!==r.indexOf("#")){const t=r.replace(/##/g,"");for(;-1!==t.indexOf("#"+(e+1));)++e}const t=new Mn(r,this.settings),n=[];let o=t.lex();for(;"EOF"!==o.text;)n.push(o),o=t.lex();n.reverse();return{tokens:n,numArgs:e}}return r}isDefined(e){return this.macros.has(e)||yn.hasOwnProperty(e)||oe.math.hasOwnProperty(e)||oe.text.hasOwnProperty(e)||Rn.hasOwnProperty(e)}isExpandable(e){const t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:yn.hasOwnProperty(e)&&!yn[e].primitive}}const On=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,En=Object.freeze({"\u208a":"+","\u208b":"-","\u208c":"=","\u208d":"(","\u208e":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1d62":"i","\u2c7c":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209a":"p","\u1d63":"r","\u209b":"s","\u209c":"t","\u1d64":"u","\u1d65":"v","\u2093":"x","\u1d66":"\u03b2","\u1d67":"\u03b3","\u1d68":"\u03c1","\u1d69":"\u03d5","\u1d6a":"\u03c7","\u207a":"+","\u207b":"-","\u207c":"=","\u207d":"(","\u207e":")","\u2070":"0","\xb9":"1","\xb2":"2","\xb3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1d2c":"A","\u1d2e":"B","\u1d30":"D","\u1d31":"E","\u1d33":"G","\u1d34":"H","\u1d35":"I","\u1d36":"J","\u1d37":"K","\u1d38":"L","\u1d39":"M","\u1d3a":"N","\u1d3c":"O","\u1d3e":"P","\u1d3f":"R","\u1d40":"T","\u1d41":"U","\u2c7d":"V","\u1d42":"W","\u1d43":"a","\u1d47":"b","\u1d9c":"c","\u1d48":"d","\u1d49":"e","\u1da0":"f","\u1d4d":"g","\u02b0":"h","\u2071":"i","\u02b2":"j","\u1d4f":"k","\u02e1":"l","\u1d50":"m","\u207f":"n","\u1d52":"o","\u1d56":"p","\u02b3":"r","\u02e2":"s","\u1d57":"t","\u1d58":"u","\u1d5b":"v","\u02b7":"w","\u02e3":"x","\u02b8":"y","\u1dbb":"z","\u1d5d":"\u03b2","\u1d5e":"\u03b3","\u1d5f":"\u03b4","\u1d60":"\u03d5","\u1d61":"\u03c7","\u1dbf":"\u03b8"}),Ln={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Dn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"};class Vn{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Hn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{const e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){const t=this.nextToken;this.consume(),this.gullet.pushToken(new Nr("}")),this.gullet.pushTokens(e);const r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r}parseExpression(e,t){const r=[];for(;;){"math"===this.mode&&this.consumeSpaces();const n=this.fetch();if(-1!==Vn.endOfExpression.indexOf(n.text))break;if(t&&n.text===t)break;if(e&&yn[n.text]&&yn[n.text].infix)break;const o=this.parseAtom(t);if(!o)break;"internal"!==o.type&&r.push(o)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(e){let t,r=-1;for(let o=0;o=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);const r=oe[this.mode][t].group,n=Cr.range(e);let s;if(te.hasOwnProperty(r)){const e=r;s={type:"atom",mode:this.mode,family:e,loc:n,text:t}}else s={type:r,mode:this.mode,loc:n,text:t};o=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(S(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),o={type:"textord",mode:"text",loc:Cr.range(e),text:t}}if(this.consume(),r)for(let t=0;te.length)&&(t=e.length);for(var u=0,n=new Array(t);u=e.length?{done:!0}:{done:!1,value:e[u++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function e(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,hooks:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}r.defaults=e();function u(e){return t[e]}var n=/[&<>"']/,l=new RegExp(n.source,"g"),o=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,a=new RegExp(o.source,"g"),t={"&":"&","<":"<",">":">",'"':""","'":"'"};function A(e,t){if(t){if(n.test(e))return e.replace(l,u)}else if(o.test(e))return e.replace(a,u);return e}var c=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function x(e){return e.replace(c,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var h=/(^|[^\[])\^/g;function p(u,e){u="string"==typeof u?u:u.source,e=e||"";var n={replace:function(e,t){return t=(t=t.source||t).replace(h,"$1"),u=u.replace(e,t),n},getRegex:function(){return new RegExp(u,e)}};return n}var Z=/[^\w:]/g,O=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function f(e,t,u){if(e){try{n=decodeURIComponent(x(u)).replace(Z,"").toLowerCase()}catch(e){return null}if(0===n.indexOf("javascript:")||0===n.indexOf("vbscript:")||0===n.indexOf("data:"))return null}var n;t&&!O.test(u)&&(e=u,g[" "+(n=t)]||(q.test(n)?g[" "+n]=n+"/":g[" "+n]=C(n,"/",!0)),t=-1===(n=g[" "+n]).indexOf(":"),u="//"===e.substring(0,2)?t?e:n.replace(j,"$1")+e:"/"===e.charAt(0)?t?e:n.replace(P,"$1")+e:n+e);try{u=encodeURI(u).replace(/%25/g,"%")}catch(e){return null}return u}var g={},q=/^[^:]+:\/*[^/]*$/,j=/^([^:]+:)[\s\S]*$/,P=/^([^:]+:\/*[^/]*)[\s\S]*$/;var k={exec:function(){}};function d(e,t){var u=e.replace(/\|/g,function(e,t,u){for(var n=!1,r=t;0<=--r&&"\\"===u[r];)n=!n;return n?"|":" |"}).split(/ \|/),n=0;if(u[0].trim()||u.shift(),0t)u.splice(t);else for(;u.length>=1,e+=e;return u+e}function m(e,t,u,n){var r=t.href,t=t.title?A(t.title):null,i=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?(n.state.inLink=!0,e={type:"link",raw:u,href:r,title:t,text:i,tokens:n.inlineTokens(i)},n.state.inLink=!1,e):{type:"image",raw:u,href:r,title:t,text:A(i)}}var b=function(){function e(e){this.options=e||r.defaults}var t=e.prototype;return t.space=function(e){e=this.rules.block.newline.exec(e);if(e&&0=r.length?e.slice(r.length):e}).join("\n")),{type:"code",raw:t,lang:e[2]&&e[2].trim().replace(this.rules.inline._escapes,"$1"),text:u}},t.heading=function(e){var t,u,e=this.rules.block.heading.exec(e);if(e)return t=e[2].trim(),/#$/.test(t)&&(u=C(t,"#"),!this.options.pedantic&&u&&!/ $/.test(u)||(t=u.trim())),{type:"heading",raw:e[0],depth:e[1].length,text:t,tokens:this.lexer.inline(t)}},t.hr=function(e){e=this.rules.block.hr.exec(e);if(e)return{type:"hr",raw:e[0]}},t.blockquote=function(e){var t,u,n,e=this.rules.block.blockquote.exec(e);if(e)return t=e[0].replace(/^ *>[ \t]?/gm,""),u=this.lexer.state.top,this.lexer.state.top=!0,n=this.lexer.blockTokens(t),this.lexer.state.top=u,{type:"blockquote",raw:e[0],tokens:n,text:t}},t.list=function(e){var t=this.rules.block.list.exec(e);if(t){var u,n,r,i,s,l,o,a,D,c,h,p=1<(g=t[1].trim()).length,f={type:"list",raw:"",ordered:p,start:p?+g.slice(0,-1):"",loose:!1,items:[]},g=p?"\\d{1,9}\\"+g.slice(-1):"\\"+g;this.options.pedantic&&(g=p?g:"[*+-]");for(var F=new RegExp("^( {0,3}"+g+")((?:[\t ][^\\n]*)?(?:\\n|$))");e&&(h=!1,t=F.exec(e))&&!this.rules.block.hr.test(e);){if(u=t[0],e=e.substring(u.length),o=t[2].split("\n",1)[0].replace(/^\t+/,function(e){return" ".repeat(3*e.length)}),a=e.split("\n",1)[0],this.options.pedantic?(i=2,c=o.trimLeft()):(i=t[2].search(/[^ ]/),c=o.slice(i=4=i||!a.trim())c+="\n"+a.slice(i);else{if(s)break;if(4<=o.search(/[^ ]/))break;if(d.test(o))break;if(C.test(o))break;if(k.test(o))break;c+="\n"+a}s||a.trim()||(s=!0),u+=D+"\n",e=e.substring(D.length+1),o=a.slice(i)}f.loose||(l?f.loose=!0:/\n *\n *$/.test(u)&&(l=!0)),this.options.gfm&&(n=/^\[[ xX]\] /.exec(c))&&(r="[ ] "!==n[0],c=c.replace(/^\[[ xX]\] +/,"")),f.items.push({type:"list_item",raw:u,task:!!n,checked:r,loose:!1,text:c}),f.raw+=u}f.items[f.items.length-1].raw=u.trimRight(),f.items[f.items.length-1].text=c.trimRight(),f.raw=f.raw.trimRight();for(var E,x=f.items.length,m=0;m$/,"$1").replace(this.rules.inline._escapes,"$1"):"",n=e[3]&&e[3].substring(1,e[3].length-1).replace(this.rules.inline._escapes,"$1"),{type:"def",tag:t,raw:e[0],href:u,title:n}},t.table=function(e){e=this.rules.block.table.exec(e);if(e){var t={type:"table",header:d(e[1]).map(function(e){return{text:e}}),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),rows:e[3]&&e[3].trim()?e[3].replace(/\n[ \t]*$/,"").split("\n"):[]};if(t.header.length===t.align.length){t.raw=e[0];for(var u,n,r,i=t.align.length,s=0;s/i.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):A(e[0]):e[0]}},t.link=function(e){e=this.rules.inline.link.exec(e);if(e){var t=e[2].trim();if(!this.options.pedantic&&/^$/.test(t))return;var u=C(t.slice(0,-1),"\\");if((t.length-u.length)%2==0)return}else{u=function(e,t){if(-1!==e.indexOf(t[1]))for(var u=e.length,n=0,r=0;r$/.test(t)?u.slice(1):u.slice(1,-1):u)&&u.replace(this.rules.inline._escapes,"$1"),title:r&&r.replace(this.rules.inline._escapes,"$1")},e[0],this.lexer)}},t.reflink=function(e,t){var u;if(u=(u=this.rules.inline.reflink.exec(e))||this.rules.inline.nolink.exec(e))return(e=t[(e=(u[2]||u[1]).replace(/\s+/g," ")).toLowerCase()])?m(u,e,u[0],this.lexer):{type:"text",raw:t=u[0].charAt(0),text:t}},t.emStrong=function(e,t,u){void 0===u&&(u="");var n=this.rules.inline.emStrong.lDelim.exec(e);if(n&&(!n[3]||!u.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var r=n[1]||n[2]||"";if(!r||""===u||this.rules.inline.punctuation.exec(u)){var i=n[0].length-1,s=i,l=0,o="*"===n[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(o.lastIndex=0,t=t.slice(-1*e.length+i);null!=(n=o.exec(t));){var a,D=n[1]||n[2]||n[3]||n[4]||n[5]||n[6];if(D)if(a=D.length,n[3]||n[4])s+=a;else if((n[5]||n[6])&&i%3&&!((i+a)%3))l+=a;else if(!(0<(s-=a)))return a=Math.min(a,a+s+l),D=e.slice(0,i+n.index+(n[0].length-D.length)+a),Math.min(i,a)%2?(a=D.slice(1,-1),{type:"em",raw:D,text:a,tokens:this.lexer.inlineTokens(a)}):(a=D.slice(2,-2),{type:"strong",raw:D,text:a,tokens:this.lexer.inlineTokens(a)})}}}},t.codespan=function(e){var t,u,n,e=this.rules.inline.code.exec(e);if(e)return n=e[2].replace(/\n/g," "),t=/[^ ]/.test(n),u=/^ /.test(n)&&/ $/.test(n),n=A(n=t&&u?n.substring(1,n.length-1):n,!0),{type:"codespan",raw:e[0],text:n}},t.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},t.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}},t.autolink=function(e,t){var u,e=this.rules.inline.autolink.exec(e);if(e)return t="@"===e[2]?"mailto:"+(u=A(this.options.mangle?t(e[1]):e[1])):u=A(e[1]),{type:"link",raw:e[0],text:u,href:t,tokens:[{type:"text",raw:u,text:u}]}},t.url=function(e,t){var u,n,r,i;if(u=this.rules.inline.url.exec(e)){if("@"===u[2])r="mailto:"+(n=A(this.options.mangle?t(u[0]):u[0]));else{for(;i=u[0],u[0]=this.rules.inline._backpedal.exec(u[0])[0],i!==u[0];);n=A(u[0]),r="www."===u[1]?"http://"+u[0]:u[0]}return{type:"link",raw:u[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}},t.inlineText=function(e,t){e=this.rules.inline.text.exec(e);if(e)return t=this.lexer.state.inRawBlock?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):A(e[0]):e[0]:A(this.options.smartypants?t(e[0]):e[0]),{type:"text",raw:e[0],text:t}},e}(),B={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:k,lheading:/^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\.|[^\[\]\\])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/},w=(B.def=p(B.def).replace("label",B._label).replace("title",B._title).getRegex(),B.bullet=/(?:[*+-]|\d{1,9}[.)])/,B.listItemStart=p(/^( *)(bull) */).replace("bull",B.bullet).getRegex(),B.list=p(B.list).replace(/bull/g,B.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+B.def.source+")").getRegex(),B._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",B._comment=/|$)/,B.html=p(B.html,"i").replace("comment",B._comment).replace("tag",B._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),B.paragraph=p(B._paragraph).replace("hr",B.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",B._tag).getRegex(),B.blockquote=p(B.blockquote).replace("paragraph",B.paragraph).getRegex(),B.normal=F({},B),B.gfm=F({},B.normal,{table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),B.gfm.table=p(B.gfm.table).replace("hr",B.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",B._tag).getRegex(),B.gfm.paragraph=p(B._paragraph).replace("hr",B.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",B.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",B._tag).getRegex(),B.pedantic=F({},B.normal,{html:p("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",B._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:k,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:p(B.normal._paragraph).replace("hr",B.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",B.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()}),{escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:k,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,rDelimUnd:/^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:k,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~",w.punctuation=p(w.punctuation).replace(/punctuation/g,w._punctuation).getRegex(),w.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,w.escapedEmSt=/(?:^|[^\\])(?:\\\\)*\\[*_]/g,w._comment=p(B._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),w.emStrong.lDelim=p(w.emStrong.lDelim).replace(/punct/g,w._punctuation).getRegex(),w.emStrong.rDelimAst=p(w.emStrong.rDelimAst,"g").replace(/punct/g,w._punctuation).getRegex(),w.emStrong.rDelimUnd=p(w.emStrong.rDelimUnd,"g").replace(/punct/g,w._punctuation).getRegex(),w._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,w._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,w._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,w.autolink=p(w.autolink).replace("scheme",w._scheme).replace("email",w._email).getRegex(),w._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,w.tag=p(w.tag).replace("comment",w._comment).replace("attribute",w._attribute).getRegex(),w._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,w._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,w._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,w.link=p(w.link).replace("label",w._label).replace("href",w._href).replace("title",w._title).getRegex(),w.reflink=p(w.reflink).replace("label",w._label).replace("ref",B._label).getRegex(),w.nolink=p(w.nolink).replace("ref",B._label).getRegex(),w.reflinkSearch=p(w.reflinkSearch,"g").replace("reflink",w.reflink).replace("nolink",w.nolink).getRegex(),w.normal=F({},w),w.pedantic=F({},w.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:p(/^!?\[(label)\]\((.*?)\)/).replace("label",w._label).getRegex(),reflink:p(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",w._label).getRegex()}),w.gfm=F({},w.normal,{escape:p(w.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\'+(u?e:A(e,!0))+"\n":"

"+(u?e:A(e,!0))+"
\n"},t.blockquote=function(e){return"
\n"+e+"
\n"},t.html=function(e){return e},t.heading=function(e,t,u,n){return this.options.headerIds?"'+e+"\n":""+e+"\n"},t.hr=function(){return this.options.xhtml?"
\n":"
\n"},t.list=function(e,t,u){var n=t?"ol":"ul";return"<"+n+(t&&1!==u?' start="'+u+'"':"")+">\n"+e+"\n"},t.listitem=function(e){return"
  • "+e+"
  • \n"},t.checkbox=function(e){return" "},t.paragraph=function(e){return"

    "+e+"

    \n"},t.table=function(e,t){return"\n\n"+e+"\n"+(t=t&&""+t+"")+"
    \n"},t.tablerow=function(e){return"\n"+e+"\n"},t.tablecell=function(e,t){var u=t.header?"th":"td";return(t.align?"<"+u+' align="'+t.align+'">':"<"+u+">")+e+"\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+""},t.br=function(){return this.options.xhtml?"
    ":"
    "},t.del=function(e){return""+e+""},t.link=function(e,t,u){return null===(e=f(this.options.sanitize,this.options.baseUrl,e))?u:(e='
    "+u+"")},t.image=function(e,t,u){return null===(e=f(this.options.sanitize,this.options.baseUrl,e))?u:(e=''+u+'":">"))},t.text=function(e){return e},e}(),z=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,u){return""+u},t.image=function(e,t,u){return""+u},t.br=function(){return""},e}(),$=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var u=e,n=0;if(this.seen.hasOwnProperty(u))for(n=this.seen[e];u=e+"-"+ ++n,this.seen.hasOwnProperty(u););return t||(this.seen[e]=n,this.seen[u]=0),u},t.slug=function(e,t){void 0===t&&(t={});e=this.serialize(e);return this.getNextSafeSlug(e,t.dryrun)},e}(),S=function(){function u(e){this.options=e||r.defaults,this.options.renderer=this.options.renderer||new _,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new z,this.slugger=new $}u.parse=function(e,t){return new u(t).parse(e)},u.parseInline=function(e,t){return new u(t).parseInline(e)};var e=u.prototype;return e.parse=function(e,t){void 0===t&&(t=!0);for(var u,n,r,i,s,l,o,a,D,c,h,p,f,g,F,A,k="",d=e.length,C=0;C",i?Promise.resolve(t):s?void s(null,t):t;if(i)return Promise.reject(e);if(!s)throw e;s(e)});if(null==e)return l(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof e)return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if((t=u)&&t.sanitize&&!t.silent&&console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options"),u.hooks&&(u.hooks.options=u),n){var o,a=u.highlight;try{u.hooks&&(e=u.hooks.preprocess(e)),o=f(e,u)}catch(e){return l(e)}var D,c=function(t){var e;if(!t)try{u.walkTokens&&I.walkTokens(o,u.walkTokens),e=g(o,u),u.hooks&&(e=u.hooks.postprocess(e))}catch(e){t=e}return u.highlight=a,t?l(t):n(null,e)};return!a||a.length<3?c():(delete u.highlight,o.length?(D=0,I.walkTokens(o,function(u){"code"===u.type&&(D++,setTimeout(function(){a(u.text,u.lang,function(e,t){if(e)return c(e);null!=t&&t!==u.text&&(u.text=t,u.escaped=!0),0===--D&&c()})},0))}),void(0===D&&c())):c())}if(u.async)return Promise.resolve(u.hooks?u.hooks.preprocess(e):e).then(function(e){return f(e,u)}).then(function(e){return u.walkTokens?Promise.all(I.walkTokens(e,u.walkTokens)).then(function(){return e}):e}).then(function(e){return g(e,u)}).then(function(e){return u.hooks?u.hooks.postprocess(e):e}).catch(l);try{u.hooks&&(e=u.hooks.preprocess(e));var h=f(e,u),p=(u.walkTokens&&I.walkTokens(h,u.walkTokens),g(h,u));return p=u.hooks?u.hooks.postprocess(p):p}catch(e){return l(e)}}}function I(e,t,u){return R(v.lex,S.parse)(e,t,u)}T.passThroughHooks=new Set(["preprocess","postprocess"]),I.options=I.setOptions=function(e){return I.defaults=F({},I.defaults,e),e=I.defaults,r.defaults=e,I},I.getDefaults=e,I.defaults=r.defaults,I.use=function(){for(var D=I.defaults.extensions||{renderers:{},childTokens:{}},e=arguments.length,t=new Array(e),u=0;u= MIN_SIZE && v <= MAX_SIZE; + } + + function normalizeConfig(cfg) { + var c = (cfg && typeof cfg === 'object') ? cfg : {}; + var size = validSize(c.render_window_size) ? c.render_window_size : DEFAULT_SIZE; + var mode = (c.render_window_mode === 'auto' || c.render_window_mode === 'manual') + ? c.render_window_mode : 'auto'; + return { mode: mode, size: size }; + } + + function create(cfg) { + var c = normalizeConfig(cfg); + return { + mode: c.mode, + size: c.size, + sessionId: null, + generation: 0, + order: [], // 窗口内 id(旧 → 新),长度 ≤ size + indexById: {}, // id → 链内下标(-1 = 未持久化) + chainLen: 0, // 最近一次载荷给出的可见链长度 + hiddenOlder: 0, // 窗口之上链中消息数 + hiddenNewer: 0, // 窗口之下链中消息数 + hasMoreOlder: false, + hasMoreNewer: false, + pending: null, // {direction, boundaryId, generation} | null + activeStreamId: null, // 活动流式消息 id(计入上限、永不裁剪) + followBottom: false + }; + } + + function windowIds(st) { return st.order.slice(); } + + function isFull(st) { return st.order.length >= st.size; } + + function canRequest(st, direction) { + if (!st || st.pending || st.order.length === 0) return false; + return direction === 'older' ? st.hasMoreOlder : st.hasMoreNewer; + } + + /* 登记一次换页请求,返回 {direction, boundaryId};boundary 为窗口对应端的消息 id。 */ + function beginRequest(st, direction) { + if (!canRequest(st, direction)) return null; + var boundaryId = direction === 'older' ? st.order[0] : st.order[st.order.length - 1]; + st.pending = { direction: direction, boundaryId: boundaryId, generation: st.generation }; + return { direction: direction, boundaryId: boundaryId }; + } + + function num(v) { return (isInt(v) && v >= 0) ? v : 0; } + + /* 按链内下标推导两端隐藏计数。 + * 未持久化消息(index=-1)只可能出现在较新一端: + * hiddenOlder = 窗口最旧 id 的下标(最旧端必为已持久化消息) + * hiddenNewer = chainLen - 1 - 已知最大下标 - 其后的未持久化条数 */ + function recompute(st) { + var minI = null, maxI = null, maxPos = -1, unknownAfterMax = 0; + for (var i = 0; i < st.order.length; i++) { + var ix = st.indexById[st.order[i]]; + if (ix === undefined || ix < 0) continue; + if (minI === null || ix < minI) minI = ix; + if (maxI === null || ix > maxI) { maxI = ix; maxPos = i; } + } + for (var j = maxPos + 1; j < st.order.length; j++) { + var jx = st.indexById[st.order[j]]; + if (jx === undefined || jx < 0) unknownAfterMax++; + } + if (minI === null) { + st.hiddenOlder = 0; + st.hiddenNewer = 0; + st.hasMoreOlder = false; + st.hasMoreNewer = false; + return; + } + st.hiddenOlder = minI; + st.hiddenNewer = Math.max(0, st.chainLen - 1 - maxI - unknownAfterMax); + st.hasMoreOlder = st.hiddenOlder > 0; + st.hasMoreNewer = st.hiddenNewer > 0; + } + + /* 从较新一端裁剪,直到长度 ≤ size;活动流永不裁剪。 */ + function trimTail(st, removed) { + while (st.order.length > st.size) { + var i = st.order.length - 1; + if (st.order[i] === st.activeStreamId) { i--; } // 跳过尾部活动流,裁次新一条 + if (i < 0) break; // 病态兜底:整窗都是活动流(不可能,仅一条流) + removed.push(st.order.splice(i, 1)[0]); + delete st.indexById[removed[removed.length - 1]]; + } + } + + /* 从较旧一端裁剪,直到长度 ≤ size;活动流永不裁剪。 */ + function trimHead(st, removed) { + while (st.order.length > st.size) { + var i = 0; + if (st.order[i] === st.activeStreamId) { i = 1; } + if (i >= st.order.length) break; + removed.push(st.order.splice(i, 1)[0]); + delete st.indexById[removed[removed.length - 1]]; + } + } + + function absorb(st, items) { + var added = []; + for (var i = 0; i < items.length; i++) { + var d = items[i]; + if (!d || !d.id || st.order.indexOf(d.id) >= 0) continue; + st.order.push(d.id); + st.indexById[d.id] = (d.chainIndex === undefined || d.chainIndex < 0) ? -1 : d.chainIndex; + added.push(d.id); + } + return added; + } + + /* 初始窗口:最新 size 条(Python 负责截取)。 + * payload = {sessionId, generation, chainLen, items:[{id, chainIndex}]} + * 用 Python 代次重同步(覆盖 clear() 的本地自增)。 */ + function initFullChain(st, payload) { + st.sessionId = payload.sessionId; + st.generation = num(payload.generation); + st.order = []; + st.indexById = {}; + st.pending = null; + st.activeStreamId = null; + st.followBottom = false; + st.chainLen = num(payload.chainLen); + absorb(st, payload.items || []); + trimTail(st, []); // 防御:载荷超过 size 时保留最新端 + recompute(st); + return { window: windowIds(st), hasMoreOlder: st.hasMoreOlder }; + } + + /* 收到 Python 页载荷。 + * req = beginRequest 的返回值(或 {direction, boundaryId}) + * payload = {sessionId, generation, boundaryId, direction, chainLen, + * items:[{id, chainIndex}]} + * 返回 {stale:true} 或 + * {side, addedIds, removedIds, hiddenOlder, hiddenNewer, + * hasMoreOlder, hasMoreNewer} + * (DOM 层:addedIds 已渲染、加到 side 端;removedIds 从 DOM 移除; + * 加载入口可见性按 hasMore* 更新) */ + function applyPage(st, req, payload) { + if (!st || !req || !payload) return { stale: true }; + if (payload.sessionId !== st.sessionId || + payload.generation !== st.generation) { + st.pending = null; + return { stale: true }; + } + if (!st.pending || + st.pending.direction !== req.direction || + st.pending.boundaryId !== req.boundaryId) { + // 无匹配的未决请求(代次已推进/窗口已变/重复投递)→ 丢弃 + st.pending = null; + return { stale: true }; + } + st.pending = null; + + var items = payload.items || []; + var removedIds = []; + var addedIds = absorb(st, items); + if (req.direction === 'older') { + // absorb 追加在尾部,这里把新页挪到头部(保持 旧→新 顺序) + var head = st.order.splice(st.order.length - addedIds.length, addedIds.length); + st.order = head.concat(st.order); + trimTail(st, removedIds); + } else { + trimHead(st, removedIds); + } + st.chainLen = num(payload.chainLen); + recompute(st); + return { + side: req.direction, + addedIds: addedIds, + removedIds: removedIds, + hiddenOlder: st.hiddenOlder, + hiddenNewer: st.hiddenNewer, + hasMoreOlder: st.hasMoreOlder, + hasMoreNewer: st.hasMoreNewer + }; + } + + /* 切会话 / 清屏 / 切分支:游标、缓存、未决请求、代次全部清空(本地自增使 + * 旧载荷失效);已注入的配置模式与大小保持不变。下一次 initFullChain + * 用 Python 代次重同步。 */ + function clear(st) { + st.generation += 1; + st.sessionId = null; + st.order = []; + st.indexById = {}; + st.chainLen = 0; + st.hiddenOlder = 0; + st.hiddenNewer = 0; + st.hasMoreOlder = false; + st.hasMoreNewer = false; + st.pending = null; + st.activeStreamId = null; + st.followBottom = false; + return st; + } + + /* 活动流开始:该消息计入上限、永不被裁剪。 */ + function noteStream(st, msgId) { + st.activeStreamId = msgId; + st.followBottom = true; + } + + function streamFinished(st, msgId) { + if (st.activeStreamId === msgId) { + st.activeStreamId = null; + st.followBottom = false; + } + } + + /* 新消息追加到窗口较新一端(发送用户消息 / 助手占位 / 切回续流)。 + * 超出 size 时从较旧一端裁剪(活动流除外),流式消息计入上限。 */ + function noteLive(st, msgId, chainIndex) { + if (!st || st.sessionId === null || !msgId) return { added: false }; + if (st.order.indexOf(msgId) >= 0) { + if (chainIndex !== undefined && chainIndex >= 0) st.indexById[msgId] = chainIndex; + recompute(st); + return { added: false }; + } + st.order.push(msgId); + st.indexById[msgId] = (chainIndex === undefined || chainIndex < 0) ? -1 : chainIndex; + var removed = []; + trimHead(st, removed); + recompute(st); + return { added: true, removedIds: removed }; + } + + /* ---------- 锚点几何(纯数学;DOM 层传入测量值) ---------- */ + + /* 首个可见消息 + 像素偏移。 + * entries: [{id, top, height}](文档坐标,DOM 顺序 旧→新) + * viewportTop/viewportBottom: 视口在文档坐标中的范围 + * 返回 {msgId, offset};无可见消息 → null */ + function computeAnchor(entries, viewportTop, viewportBottom) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.top + e.height > viewportTop && e.top < viewportBottom) { + return { msgId: e.id, offset: Math.max(0, viewportTop - e.top) }; + } + } + return null; + } + + /* 换页后的滚动增量:把换页前记录的 anchor 文档 top(rectTopBefore) + * 对齐到换页后实测的 top(rectTopAfter)。DOM 层用两次真实测量, + * 误差只来自亚像素取整,≤ 2 px。 */ + function scrollDeltaFromRects(rectTopBefore, rectTopAfter) { + return rectTopAfter - rectTopBefore; + } + + return { + MIN_SIZE: MIN_SIZE, + MAX_SIZE: MAX_SIZE, + DEFAULT_SIZE: DEFAULT_SIZE, + normalizeConfig: normalizeConfig, + create: create, + windowIds: windowIds, + isFull: isFull, + canRequest: canRequest, + beginRequest: beginRequest, + applyPage: applyPage, + initFullChain: initFullChain, + clear: clear, + noteStream: noteStream, + streamFinished: streamFinished, + noteLive: noteLive, + computeAnchor: computeAnchor, + scrollDeltaFromRects: scrollDeltaFromRects + }; +})); diff --git a/ui/web/style.css b/ui/web/style.css new file mode 100644 index 0000000..608b3a9 --- /dev/null +++ b/ui/web/style.css @@ -0,0 +1,932 @@ +/* ==================== 1. 全局 ==================== */ +body, html { + margin: 0; padding: 0; + font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, sans-serif; + background-color: #ffffff; + color: #333; + overflow-x: hidden; + /* 🌟 不再给 html/body 设 height:100%(会让 body 退化为内部滚动容器, + 导致 window.scrollY/scrollTo 失效;视口高度由 #chat-container 的 min-height:100vh 承担) */ +} + +#chat-container { + max-width: 95%; + margin: 0 auto; + padding: 20px 20px 20px 20px; + min-height: 100vh; /* 🌟 至少占满整个视口高度 */ +} + +/* ==================== 隐藏 WebEngine 原生滚动条 ==================== */ +/* 改用右侧自定义 Qt 滚动条(WebScrollBar),避免内置滚动条高速滑动时的重绘延迟观感 */ +::-webkit-scrollbar { + width: 0px; + height: 0px; + background: transparent; +} + +/* ==================== 会话加载界面 ==================== */ +.session-loading { + position: fixed; + top: 0; left: 0; right: 0; bottom: 0; + z-index: 999; + display: flex; + align-items: center; + justify-content: center; + background-color: #ffffff; + opacity: 1; + transition: opacity 0.45s ease; /* 结束后的渐变退场 */ +} +.session-loading.hide { + opacity: 0; + pointer-events: none; +} +.session-loading-box { + display: flex; + flex-direction: column; + align-items: center; +} +.session-loading-icon { + width: 72px; + height: 72px; +} +.session-loading-bar { + width: 190px; + height: 4px; + margin-top: 26px; + background: #eceef2; + border-radius: 2px; + overflow: hidden; + position: relative; +} +.session-loading-bar-fill { + position: absolute; + top: 0; left: 0; + height: 100%; + width: 36%; + border-radius: 2px; + background: linear-gradient(90deg, rgba(59,130,246,0) 0%, #3b82f6 50%, rgba(59,130,246,0) 100%); + animation: loadingSweep 1.2s ease-in-out infinite; /* 从左到右扫描,非进度条 */ +} +@keyframes loadingSweep { + 0% { transform: translateX(-110%); } + 100% { transform: translateX(300%); } +} + +/* ==================== 欢迎界面 ==================== */ +.welcome-screen { + display: flex; + justify-content: center; + align-items: center; + position: fixed; /* 🌟 固定定位,脱离文档流 */ + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 60px 20px; + pointer-events: none; /* 🌟 允许点击穿透到下方的输入框 */ +} + +.welcome-content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + pointer-events: auto; /* 🌟 但内容本身可以交互 */ + /* 旧的渐入动画已移除:会话切换统一由加载界面完成过渡 */ +} + +/* 欢迎页图标:main.svg */ +.welcome-icon { + width: 56px; + height: 56px; + margin-bottom: 12px; +} + +.brand-name { + font-size: 40px; + font-weight: 700; + margin: 0; + letter-spacing: 6px; + font-family: "Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑", "Segoe UI", sans-serif; + background: linear-gradient(135deg, #2563eb 0%, #7c3aed 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + text-fill-color: transparent; +} + +.brand-tagline { + font-size: 15px; + color: #8a94a6; + margin: 14px 0 0 0; + font-weight: 400; + letter-spacing: 5px; +} + + +/* ==================== 2. 消息气泡 ==================== */ +.message-wrapper { + display: flex; + align-items: flex-start; + margin-bottom: 30px; +} +.message-wrapper.user { justify-content: flex-end; } + +/* ==================== 3. 头像 ==================== */ +.avatar { + width: 32px; height: 32px; + border-radius: 6px; + display: flex; justify-content: center; align-items: center; + font-weight: bold; font-size: 14px; + flex-shrink: 0; + margin-top: 20px; +} +.assistant .avatar { background-color: #4a90d9; color: white; margin-right: 15px; } +.user .avatar { background-color: #e3e3e3; color: #555; margin-left: 15px; order: 2; } + +/* ==================== 4. 消息内容区 ==================== */ +.message-content { + max-width: 85%; + display: flex; + flex-direction: column; +} +.assistant .message-content { + align-items: flex-start; + /* 🆕 助手气泡恒定宽度:输出中/完成后一律 85%,不随内容伸缩(流式特效不受影响) */ + width: 85%; +} +/* 🆕 内层同步撑满:.reply-content 基类是 fit-content(贴内容缩), + 可见气泡(md-segment 背景/思考卡/工具卡)都在它里面 → 必须 100% 才真正恒定 */ +.assistant .reply-content { width: 100%; } +.user .message-content { align-items: flex-end; } + +.sender-name { + font-size: 11px; color: #aaa; + margin-bottom: 6px; font-weight: 600; + text-transform: uppercase; letter-spacing: 0.5px; +} + +.reply-content { + line-height: 1.6; font-size: 15px; + width: fit-content; max-width: 100%; +} +.user .reply-content { + background-color: #f4f4f4; + padding: 10px 18px; + border-radius: 18px; border-top-right-radius: 4px; + color: #333; text-align: left; +} + +/* ==================== 5. 思考过程 ==================== */ +.think-block { + margin-bottom: 12px; border-radius: 8px; + background-color: #ffffff; border: 1px solid #eaeaea; + overflow: hidden; transition: all 0.3s ease; width: 100%; +} +.think-block summary { + padding: 8px 14px; font-size: 13px; color: #888; + cursor: pointer; user-select: none; + background-color: #fafafa; list-style: none; + display: flex; align-items: center; font-weight: 500; +} +.think-block summary .chev { color: #b8b8b8; margin-right: 8px; } +.think-block[open] summary { border-bottom: 1px dashed #eaeaea; } +.think-content { + padding: 12px 14px; font-size: 13px; color: #777; + background-color: #fff; max-height: 400px; overflow-y: auto; +} + +/* 🌟 流式输出中:flex 锁底,展示最新思考内容 */ +/* 🌟 流式输出中:思考框保持可滚动,JS 控制锁底 */ +.message-wrapper.streaming .think-content { + overflow-y: auto !important; +} + + +.think-inner { + flex-shrink: 0; +} + + +.think-content.markdown-body p { color: #777; margin-bottom: 8px; } + +/* ============ 思考/压缩气泡内:代码朴素渲染 ============ + 压缩摘要充满代码:浅色语法色(#a626a4 紫)+ code-block-wrapper 边框/语言栏, + 让定格后的气泡观感"紫色带边框"。此处统一朴素灰、无边框无头部; + 正文气泡的代码块不受影响。 */ +.think-content .code-block-wrapper { + border: none; + border-radius: 0; + background: transparent; + min-width: 0; + margin: 8px 0; +} +.think-content .code-header { display: none; } +.think-content .code-block-wrapper pre, +.think-content .code-block-wrapper pre code, +.think-content .code-block-wrapper .hljs, +.think-content .code-block-wrapper .hljs * { + color: #777 !important; + background: transparent !important; +} +.think-content code, +.think-content.markdown-body p code { + color: #777; + background-color: #f6f7f9; +} + +/* ==================== 6. Markdown 基础 ==================== */ +.markdown-body p { margin-top: 0; margin-bottom: 10px; } +.markdown-body code { + font-family: 'Consolas', 'Courier New', monospace; font-size: 13px; +} +.markdown-body p code { + background-color: #f0f0f0; color: #e83e8c; + padding: 2px 5px; border-radius: 4px; +} + +/* ==================== 6b. 🌟 KaTeX 公式渲染 ==================== */ +.katex-display { + margin: 10px 0; padding: 4px 2px; + overflow-x: auto; overflow-y: hidden; +} +.katex-display::-webkit-scrollbar { height: 6px; } +.katex-display::-webkit-scrollbar-thumb { background: #d0d0d0; border-radius: 3px; } +.markdown-body .katex { font-size: 1.06em; } +.markdown-body .katex-display { font-size: 1.08em; } + +/* ==================== 7. 代码块 ==================== */ +.code-block-wrapper { + position: relative; + border: 1px solid #e5e5e5; border-radius: 8px; + margin: 12px 0; overflow: hidden; + background-color: #ffffff; + min-width: 500px; /* 短代码也保持基本宽度,避免气泡过窄难看 */ +} + +.code-header { + display: flex; justify-content: space-between; align-items: center; + background-color: #fafafa; padding: 4px 10px; + border-bottom: 1px solid #eee; +} +.code-lang-label { + font-size: 11px; color: #aaa; font-weight: 500; + text-transform: lowercase; letter-spacing: 0.3px; +} +.code-header-actions { display: flex; align-items: center; gap: 4px; } + +.code-header button { + background: transparent; border: 1px solid transparent; + color: #999; cursor: pointer; + display: flex; align-items: center; gap: 4px; + font-size: 12px; padding: 3px 8px; border-radius: 4px; + transition: all 0.15s ease; font-family: inherit; outline: none; +} +.code-header button:hover { + background-color: #f0f0f0; border-color: #e0e0e0; color: #555; +} +.copy-btn.copied { + color: #52c41a !important; + border-color: rgba(82, 196, 26, 0.3) !important; + background-color: rgba(82, 196, 26, 0.06) !important; +} + +/* 代码主体 */ +.code-body { + margin: 0; padding: 14px; + background-color: #fafafa !important; + overflow-x: auto; + max-height: 5000px; +} + +/* 修改折叠态:允许滚动但隐藏滚动条 */ +.code-body.collapsed { + max-height: 140px !important; + overflow-y: auto !important; /* ← 从 hidden 改为 auto */ + scrollbar-width: none; /* Firefox */ +} +.code-body.collapsed::-webkit-scrollbar { + display: none; /* Chrome/Safari */ +} + +/* 🌟 流式输出中:用 flex 布局天然展示底部代码,不依赖 JS scrollTop */ +.message-wrapper.streaming .code-body.collapsed { + display: flex !important; + flex-direction: column !important; + justify-content: flex-end !important; + overflow: hidden !important; +} + + +/* 默认折叠遮罩:底部渐隐(展示顶部代码) */ +.code-block-wrapper:has(.code-body.collapsed)::after { + content: ''; + position: absolute; + bottom: 0; left: 0; right: 0; + height: 40px; + background: linear-gradient(transparent, #fafafa); + pointer-events: none; + border-radius: 0 0 8px 8px; +} + +/* 🌟 流式输出中遮罩:顶部渐隐(展示底部最新代码) */ +.message-wrapper.streaming .code-block-wrapper:has(.code-body.collapsed)::after { + top: 36px; bottom: auto; + border-radius: 0; + background: linear-gradient(#fafafa, transparent); +} + +/* 强制覆盖 highlight.js 深色背景 */ +.code-block-wrapper pre, +.code-block-wrapper pre code, +.code-block-wrapper .hljs { + background-color: #fafafa !important; + color: #383a42 !important; +} + +/* 浅色语法高亮 */ +.code-block-wrapper .hljs-keyword, +.code-block-wrapper .hljs-selector-tag, +.code-block-wrapper .hljs-title, +.code-block-wrapper .hljs-section, +.code-block-wrapper .hljs-doctag, +.code-block-wrapper .hljs-name, +.code-block-wrapper .hljs-strong { color: #a626a4; } +.code-block-wrapper .hljs-string, +.code-block-wrapper .hljs-attr { color: #50a14f; } +.code-block-wrapper .hljs-number, +.code-block-wrapper .hljs-literal, +.code-block-wrapper .hljs-variable, +.code-block-wrapper .hljs-template-variable, +.code-block-wrapper .hljs-tag .hljs-attr { color: #986801; } +.code-block-wrapper .hljs-comment, +.code-block-wrapper .hljs-quote { color: #a0a1a7; font-style: italic; } +.code-block-wrapper .hljs-built_in, +.code-block-wrapper .hljs-builtin-name { color: #c18401; } +.code-block-wrapper .hljs-function .hljs-title, +.code-block-wrapper .hljs-class .hljs-title { color: #4078f2; } +.code-block-wrapper .hljs-type, +.code-block-wrapper .hljs-params { color: #c18401; } +.code-block-wrapper .hljs-meta { color: #4078f2; } +.code-block-wrapper code { + font-family: 'Consolas', 'Courier New', monospace; font-size: 13px; +} + +/* ==================== 7.1 SVG 代码块:绘制/源码 切换 ==================== */ +/* 渲染容器:透明背景、居中,防超大 SVG 撑破布局 */ +.svg-render-body { + display: flex; + align-items: center; + justify-content: center; + padding: 14px; + background: transparent; + overflow: auto; + max-height: 5000px; +} +.svg-render-body svg { + min-width: 360px; /* 小图适当放大,避免渲染出来太小看不清 */ + max-width: 100%; + height: auto; +} +/* 渲染态:隐藏代码体与折叠渐隐遮罩 */ +.code-block-wrapper.svg-mode .code-body { display: none !important; } +.code-block-wrapper.svg-mode:has(.code-body.collapsed)::after { display: none; } +/* 渲染态按钮高亮(此时按钮文案为「源码」) */ +.code-header .svg-render-btn.active { + color: #10a37f; + border-color: rgba(16, 163, 127, 0.3); + background-color: rgba(16, 163, 127, 0.06); +} +/* 折叠按钮被锁定时(处于渲染态) */ +.code-header .fold-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + pointer-events: none; +} +/* 流式输出中隐藏「绘制」按钮(与复制按钮同等待遇,避免重渲冲掉切换状态) */ +.message-wrapper.streaming .svg-render-btn { + display: none !important; +} + +/* ==================== 8. 长文本附件卡片 ==================== */ +.long-text-card { + display: flex; align-items: center; gap: 12px; + padding: 12px 16px; background-color: #f8f8f8; + border: 1px solid #e8e8e8; border-radius: 12px; + cursor: pointer; transition: all 0.2s ease; max-width: 320px; +} +.long-text-card:hover { + background-color: #f0f0f0; border-color: #d0d0d0; + box-shadow: 0 2px 8px rgba(0,0,0,0.06); +} +.card-icon { + flex-shrink: 0; width: 40px; height: 40px; + display: flex; align-items: center; justify-content: center; + background-color: #fff; border-radius: 8px; border: 1px solid #eee; +} +.card-info { overflow: hidden; } +.card-title { + font-size: 13px; color: #333; font-weight: 500; + white-space: nowrap; overflow: hidden; + text-overflow: ellipsis; max-width: 220px; +} +.card-meta { font-size: 11px; color: #aaa; margin-top: 3px; } + +/* ==================== 9. 模态框 ==================== */ +.content-modal-overlay { + position: fixed; top: 0; left: 0; right: 0; bottom: 0; + background-color: rgba(0,0,0,0); + display: flex; justify-content: center; align-items: center; + z-index: 9999; transition: background-color 0.2s ease; +} +.content-modal-overlay.visible { background-color: rgba(0,0,0,0.4); } +.content-modal { + background-color: #fff; border-radius: 12px; + width: 70%; max-width: 700px; max-height: 75vh; + display: flex; flex-direction: column; + box-shadow: 0 20px 60px rgba(0,0,0,0.15); + transform: scale(0.95); opacity: 0; + transition: all 0.2s ease; overflow: hidden; +} +.content-modal-overlay.visible .content-modal { + transform: scale(1); opacity: 1; +} +.modal-header { + display: flex; justify-content: space-between; align-items: center; + padding: 14px 20px; border-bottom: 1px solid #eee; + font-size: 14px; font-weight: 600; color: #333; +} +.modal-close-btn { + background: transparent; border: none; font-size: 18px; + color: #999; cursor: pointer; padding: 4px 8px; + border-radius: 4px; transition: all 0.15s ease; line-height: 1; +} +.modal-close-btn:hover { background-color: #f0f0f0; color: #333; } +.modal-body { + padding: 16px 20px; overflow-y: auto; + font-family: 'Consolas', 'Courier New', monospace; + font-size: 13px; line-height: 1.6; color: #444; + white-space: pre-wrap; word-break: break-all; + margin: 0; background-color: #fafafa; +} + +/* ==================== 10. 错误与动画 ==================== */ +.system-error { + background-color: #fef0f0; border: 1px solid #fde2e2; + color: #f56c6c; padding: 10px 15px; border-radius: 8px; + margin-top: 10px; font-size: 13px; font-weight: bold; + display: inline-block; +} + +/* ==================== 11. 多附件容器 ==================== */ +.attachments-container { + display: flex; flex-direction: column; + gap: 8px; margin-bottom: 8px; +} +.attachments-container .long-text-card { max-width: 300px; } +.user .attachments-container + .reply-content { margin-top: 4px; } +/* ==================== 12. 流式输出状态(纯 CSS 控制,不闪烁) ==================== */ +.message-wrapper.streaming .copy-btn { + display: none !important; +} + +.message-wrapper.streaming .fold-btn { + font-size: 0 !important; + pointer-events: none; + position: relative; +} + +.message-wrapper.streaming .fold-btn::after { + content: '输出中...'; + font-size: 12px; + color: #f5a623; +} +/* 过渡态:从 flex-end 切换到 scroll 模式,保持显示底部 */ +.code-body.collapsed.scroll-locked { + display: block !important; + overflow-y: auto !important; + justify-content: initial !important; + flex-direction: initial !important; + scrollbar-width: none; +} +.code-body.collapsed.scroll-locked::-webkit-scrollbar { + display: none; +} +/* ==================== 13. 消息操作栏 ==================== */ +.message-actions { + display: flex; + align-items: center; + gap: 2px; + margin-top: 8px; +} + +.action-btn { + display: flex; + align-items: center; + justify-content: center; + width: 30px; + height: 30px; + border: none; + background: transparent; + border-radius: 6px; + cursor: pointer; + color: #999; + transition: all 0.15s ease; + padding: 0; +} + +.action-btn:hover { + background-color: #f0f0f0; + color: #555; +} + +.action-btn svg { + pointer-events: none; +} + +/* 流式输出中隐藏操作栏 */ +.message-wrapper.streaming .message-actions { + display: none !important; +} +/* ================= 分支选择器 ================= */ +.branch-selector { + display: inline-flex; + align-items: center; + margin-left: 10px; + background-color: #f0f0f0; + border-radius: 12px; + padding: 2px 6px; + font-size: 11px; + color: #666; + user-select: none; +} + +/* 暗色模式的话可以加这句,如果是纯亮色就不用 */ +@media (prefers-color-scheme: dark) { + .branch-selector { background-color: #333; color: #aaa; } +} + +.branch-btn { + background: transparent; + border: none; + cursor: pointer; + padding: 0 4px; + color: #888; + font-size: 10px; + font-weight: bold; + display: flex; + align-items: center; + justify-content: center; +} + +.branch-btn:hover:not(:disabled) { + color: #111; +} + +.branch-btn:disabled { + color: #ccc; + cursor: not-allowed; +} + +.branch-text { + margin: 0 4px; + font-family: monospace; +} +/* ================= 删除确认气泡 ================= */ +.delete-confirm-popover { + position: absolute; + bottom: 120%; /* 浮在按钮上方 */ + left: 50%; + transform: translateX(-50%); + background-color: #fee2e2; /* 淡红色警告背景 */ + border: 1px solid #f87171; + border-radius: 6px; + padding: 6px 10px; + display: flex; + align-items: center; + gap: 4px; + box-shadow: 0 4px 10px rgba(239, 68, 68, 0.2); + z-index: 100; + cursor: pointer; + white-space: nowrap; + width: max-content; /* 🌟 核心修复:保证气泡背景宽度根据文字自适应,不被按钮挤压 */ +} +.delete-confirm-popover:hover { + background-color: #fecaca; +} +.delete-confirm-text { + color: #ef4444; + font-size: 12px; + font-weight: bold; +} +.delete-confirm-popover svg { + stroke: #ef4444; +} + +/* ================= 用户消息专属操作栏 ================= */ +.user-actions { + display: flex; + justify-content: flex-end; /* 靠右对齐 */ + margin-top: 4px; + opacity: 1; /* 默认隐藏,悬浮显示 */ + transition: opacity 0.2s ease-in-out; +} + +.message-wrapper.user:hover .user-actions { + opacity: 1; /* 鼠标悬浮气泡时,显示操作栏 */ +} + +/* 强制指定按钮的图标颜色、大小和边距,打破继承魔咒 */ +.user-actions .action-btn { + background: transparent; + border: none; + color: #999999; /* 强制指定为高级灰,让 SVG 显形 */ + padding: 6px; + margin-left: 4px; + border-radius: 6px; + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.user-actions .action-btn:hover { + background-color: #eaeaea; + color: #333333; /* 悬浮时图标变深 */ +} + +.user-actions .user-delete-btn:hover { + background-color: #fee2e2; + color: #ef4444; +} + +/* 🌟 用户侧靠右对齐 */ +.user-actions .delete-confirm-popover { + left: auto; + right: 0; + transform: none; +} + +/* ⚠️ 注意:删除原本文件最底部的 "确认删除弹窗基础样式" 这一大段重复代码,避免样式冲突 */ + +/* ================= 确认删除弹窗基础样式 ================= */ +.delete-confirm-popover { + position: absolute; + bottom: 120%; + left: 50%; + transform: translateX(-50%); + background-color: #fee2e2; + border: 1px solid #f87171; + border-radius: 6px; + padding: 6px 10px; + display: flex; + align-items: center; + gap: 4px; + box-shadow: 0 4px 10px rgba(239, 68, 68, 0.2); + z-index: 100; + cursor: pointer; + white-space: nowrap; +} + +.delete-confirm-popover:hover { + background-color: #fecaca; +} + +.delete-confirm-text { + color: #ef4444; + font-size: 12px; + font-weight: bold; +} + +.delete-confirm-popover svg { + stroke: #ef4444; +} +/* ==================== 工具执行气泡(pi tool_execution_* 事件,浅色·对齐思考气泡) ==================== */ +.tool-chip { + margin: 10px 0 4px 0; border-radius: 8px; + background-color: #ffffff; border: 1px solid #eaeaea; + overflow: hidden; transition: all 0.3s ease; width: 100%; +} +.tool-chip.streaming { + border-color: #d6e4ff; + background-color: #fbfdff; +} +.tool-chip summary { + padding: 8px 14px; font-size: 12.5px; color: #888; + cursor: pointer; user-select: none; + background-color: #fafafa; list-style: none; + display: flex; align-items: center; gap: 8px; font-weight: 500; +} +.tool-chip summary::-webkit-details-marker { display: none; } +.tool-chip summary .chev { color: #b8b8b8; } +.tool-chip[open] summary { border-bottom: 1px dashed #eaeaea; } +.tool-chip-icon { font-size: 13px; color: #bbb; } +.tool-chip-name { + font-family: Consolas, Monaco, monospace; + font-weight: 600; color: #666; font-size: 12px; +} +.tool-chip-brief { + font-family: Consolas, Monaco, monospace; + color: #aaa; font-size: 12px; + overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + flex: 1; +} +.tool-chip-brief.done { color: #52c41a; } +.tool-chip-status { + margin-left: auto; flex-shrink: 0; + font-size: 11px; padding: 1px 8px; border-radius: 10px; +} +.tool-chip-status.running { + color: #4a7fd4; background: #eef4ff; + animation: toolPulse 1.2s ease-in-out infinite; +} +.tool-chip-status.ok { color: #52c41a; background: #f6ffed; } +.tool-chip-status.fail { color: #cf1322; background: #fff1f0; } +@keyframes toolPulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.45; } +} +.tool-chip-body { + padding: 10px 14px 12px 14px; + max-height: 260px; overflow: auto; background-color: #fff; +} +.tool-chip-label { + font-size: 11px; color: #bbb; font-weight: 600; + margin: 6px 0 4px 0; letter-spacing: 0.5px; +} +.tool-chip-label:first-child { margin-top: 0; } +.tool-chip-pre { + margin: 0 0 6px 0; padding: 8px 10px; + background-color: #f6f7f9; color: #555; + border: 1px solid #eef0f3; border-radius: 6px; + font-family: Consolas, Monaco, monospace; + font-size: 11.5px; line-height: 1.55; + white-space: pre-wrap; word-break: break-all; + max-height: 150px; overflow: auto; +} + +/* ==================== 系统提示(如:已自动压缩上下文) ==================== */ +.system-note { + text-align: center; + font-size: 12px; + color: #6b7280; + background: #f3f4f6; + border-radius: 10px; + padding: 6px 14px; + margin: 10px auto; + max-width: 70%; +} + +/* ==================== 增量流式渲染容器 ==================== */ +/* 注意:不能用 display:contents —— 本机 Chromium 下父盒(.md-segment)高度坍缩为 0, + 导致流式正文整段不可见(切会话重渲走无包裹路径所以可见)。用 block 规避。 */ +.md-stable, .md-tail { + display: block; +} + +/* ==================== 浅色 SVG 箭头(替代文字字形) ==================== */ +.chev { + flex: none; display: inline-block; + transition: transform 0.2s ease-in-out; +} +.think-block[open] .chev, .tool-chip[open] .chev { transform: rotate(90deg); } +.think-label { color: inherit; } + +/* ==================== 深度思考:默认收起 + 进行中蓝色呼吸动画 ==================== */ +.think-block.streaming-think > summary .think-label { + color: #3b82f6; + font-weight: 600; + animation: think-breathe 1.6s ease-in-out infinite; +} +.think-block.streaming-think > summary .think-label::after { + content: ''; + display: inline-block; + width: 1.2em; + text-align: left; + animation: think-dots 1.4s infinite; +} +@keyframes think-breathe { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.4; } +} +@keyframes think-dots { + 0% { content: ''; } + 25% { content: '.'; } + 50% { content: '..'; } + 75% { content: '...'; } +} + +/* ==================== 工具 chip:耗时 / 超时徽章 ==================== */ +.tool-chip-time { + font-size: 11px; + color: #9ca3af; + font-variant-numeric: tabular-nums; + margin-left: 2px; +} +.tool-chip-timeout { + font-size: 11px; + color: #dc2626; + font-weight: 600; + margin-left: 2px; +} +.tool-chip-livetimer { + /* 🆕 bash 运行中每秒读秒(N/Ts):琥珀色 + 等宽数字,不跳动 */ + font-size: 11px; + color: #d97706; + font-weight: 600; + font-variant-numeric: tabular-nums; + margin-left: 2px; +} + +/* ==================== 工具结果:长输出展开按钮 ==================== */ +.tool-expand-btn { + display: block; + width: 100%; + margin: 4px 0 0; + padding: 3px 8px; + font-size: 11px; + line-height: 1.5; + color: #3b82f6; + background: #eff6ff; + border: 1px solid #bfdbfe; + border-radius: 6px; + cursor: pointer; + text-align: center; + font-family: inherit; +} +.tool-expand-btn:hover { background: #dbeafe; } +.tool-chip-pre.tool-chip-full { + max-height: 360px; + overflow: auto; +} + +/* ==================== 时间线:正文段 / 流式光标 ==================== */ +.md-segment:empty { display: none; } +.md-segment > :first-child { margin-top: 0; } +.md-segment > :last-child { margin-bottom: 0; } +/* block 包裹下,额外压平内层首尾段落的边距,保持气泡观感 */ +.md-segment > :last-child > :last-child { margin-bottom: 0; } +/* 光标 "Chasing a shining star":文字顶住不动,只有 ● 缩放闪烁(星光脉冲无限循环)。 + 生命周期=原版:消息第一个时间线事件出现即显示 → finishMessage 移除, + 思考/工具/压缩/正文全程保持(无休眠态) */ +.streaming-typing { + display: inline-block; margin-left: 4px; color: #3b82f6; + font-size: 13px; + font-family: "Cascadia Mono", "Cascadia Code", Consolas, "Lucida Console", monospace; +} +.streaming-typing .typing-dot { + display: inline-block; + animation: cursor-star 1.6s ease-in-out infinite; +} +@keyframes cursor-star { + 0%, 100% { + opacity: .25; + transform: scale(.85); + text-shadow: none; + } + 50% { + opacity: 1; + transform: scale(1.15); + text-shadow: 0 0 6px rgba(59, 130, 246, .8), 0 0 12px rgba(59, 130, 246, .45); + } +} + + +/* ========== 助手正文透明气泡(流式中/完成后一致) ========== + 🐛 修复:原选择器 .message.assistant 是死代码(JS 只挂 message-wrapper 类),背景从未渲染 */ +/* 🆕 用户决定:助手正文气泡【透明】——不要背景/边框/圆角/内边距(2026-07 像素取证调试后明确: + 原死选择器 P0 修复带来的浅灰底不是想要的效果),正文直接裸排在 85% 定宽列内 */ +.message-wrapper.assistant .reply-content .md-segment + .md-segment { + margin-top: 6px; +} + +/* ==================== 🆕 P1-01 渲染窗口:加载入口按钮 ==================== */ +/* 上/下两端的「加载更多」入口:无边框浅灰胶囊,居中;无更多消息时由 JS 隐藏 */ +.load-window-btn { + display: flex; + align-items: center; + justify-content: center; + width: 220px; + margin: 14px auto; + padding: 6px 14px; + font-size: 12px; + color: #666; + background: #f4f4f6; + border: 1px solid #e3e3e8; + border-radius: 999px; + cursor: pointer; + user-select: none; + transition: background 0.15s ease, color 0.15s ease; +} +.load-window-btn:hover { + background: #eaeaf0; + color: #333; +} +.load-window-btn[hidden] { + display: none; +} +/* 底部入口与 scroll-anchor 的间距(scroll-anchor 自带 150px margin) */ +#load-newer { + margin-bottom: 4px; +} diff --git a/vendor/webview2/net462_Microsoft.Web.WebView2.Core.dll b/vendor/webview2/net462_Microsoft.Web.WebView2.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..23bfe7ad9a6044e4940a21a5de62c005032b3936 GIT binary patch literal 698208 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[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%0Djs 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 z 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 literal 0 HcmV?d00001 diff --git a/vendor/webview2/sdk.nupkg b/vendor/webview2/sdk.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..16a2cb867860dabe38dc9ead7387757186f5c843 GIT binary patch literal 9259926 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

    WLeV z_406f$}dfD#6I#f_lu_|(+7UMLn~=y`WkF^ECK8yr^W*OERv8+wZv>Sr>_=1<&RCj z=5N=s_VR)39w39wFgO1~bEHD!qcdMxbYCAGfdtx*2QDvQ&~oZ_o`cd;UKhn=t>q&l z)bXR2PwJYss)zM_TBTLk>#%38vfszeA*A5`p_LQf=pV=%|JP4dYqQyKaK0fsD1_6@ zxj2^A7EnN-yL!#+C^^CpSSAnP=6=1GWIY`f&UGt2sJbrDc^-=>j!`QA_;p11UzM(w zh7K9Td|&+vKRFH4arKBPAM@w?kCw{vp2eoOR=kf=*6U-D`M! zjt>>~nLF7XN%2#5zd7T-vp@Q)G(sgxCvo*|*05d!+CbNlkv9-@Tg#rkp1fcxhUN%b z0Ezzomj6HI&LKD#CfeG`iEZ1qos;Cmwr$(CZQHhO+qUiGP44%P{^=dwsvh-tRqg8C zYpn-Ws?Uxh_jhAdl-|k?@e_q_eN^MzSIp+-WXBq<-FB_EN1Ohc3?Y_%$EK587Mpwj zW#7%vDU}RX53g+DZjYl&f;EE!O6s>UCYE3qchQqrz|#?1WYcjVMq+d zNG$F(aTrs?5VMn?-OusdzsZE9&%*6Pa#xJR+Ra759TMrdpl`<8AeV6r(=a=QiG`f( zpTO>p&qySi?ZavFwtZ<_m#>C(A^(PtgJSj<9uc?~bny~U=}LQ`?ok@+7MyR0yHlyh zF1aEk20rUjAg$3VAIcJ03F$A|LwZaO^k=pa^ z+R2nacDuvq!TogiS0}>8&oTl&48Kg?QZ+vZ$!wAF<;-ne-3Q~*I)wn*_PfK@E4`m| z0s;?H(PIiQpO~$uONEYg=S@(B8jH4GE>_;F;l+rIjMx~DFIUe;@Ev;Eo2_eGmc6gz z-IDI;Y*LI2Pg=DDudh#vkw{vn6POu;iuA8=-Pq|SZuB1iM^*&P9znB}e3~0V&(XP) z)!PC7!VbaaIGrw&_g3str4oBy`<)}_iO*H0+_%i7U#>d!x?oEx8%cq`-a|ZEe zCRo1fM$9jlo%O#3$XVX`;9IW`cTN6hfEoKXg`fUhuC~t`Z^2V;ZKR17&f70%uiip* zN3B8Zo||ri)#uQIf>T$S068YNYWK+*nO|e4;}`$Ot3@8)(H7%eRo+*F(O~gkFtNr? zIzOvXsJGrKo>DY#R1*TgWbB*SO?QRE=XKmup4QJ$?9s&punSEjLHS0;`*ZVM8-9e- zC*|@_9LJ+*o}x?E_w|b!peR@1@MU5qF2s3jE!a6LFf}$0$L$x!$g9_O3*+t$(WHV6 z{``H-^hcOmU+!=Ge~S^i+a?s011L#?uHadp#fn?&&x*%kbwOb;a9Db7J+itYvaYT+0-e{#lswcZ0dCJ3 z7BiLO52!12A9De^*8wLiJUi`hD?jSDrCtVxn(Lf8Osto|s#27^>E4^)$Na6U9Xniv z&msS>T+TbEj_$<^IS%MIF;%@Lsqe=Orac4?r{|xxJ)FIVB>616ZZi%7UQdAbPn*Qu z?rZHH5A%6LW-^w;oMn{M9^iid7OFR^mj72N#qG{cHEs=dZsT_#5aIWE$4jr5z~TCG zH&kOqxR(<>k2_x!jk%;r^Zjw?nnjq;s|p=&67O5VJI-dVZSMOC0O8gCOu&CK{kq7v z7J75Lby4LY(EGm3vSTNG*Gd}foqEUlv7K-!bS7*9qvzdswjWaoXQ2QQ zE0gye#+284%;6%RC&0fl)>|-^QR2hL&7kfl!QXnyvX@6saM|J|Sv>HXfFYZb$JPEk zU}Yx50iL(x_mb2fRhGD$*JRx<$8gOi?Pt95m2m5)+442uTTnG?jO+H&)qRl?5ywzX z|F!w@qeEn;C-5#?_Z45ZyJzMK0g?1{ z3X;@`)B8De8!@JKieSFZt6G5Vwx99w+UA|B*J5U`D0>hwVJEf;S|_*2rAM7@ByjC* zvBm{V-xY)an143V%$M0s{o>%RnVjX+bK_iU<8pf0LK044*jrD$JNPxV07NPEP!Q}E zQ@{Iq>}VBn_-#LZE8WpOs@&z)vc!e5Fk;Kv@L@k<1um|}!UgWQAKKFm>1_=u&hY?u zPFmxBZa5LCBSal~bJ-Ov<-qsm5JEI#A0>)Lr+FBE^e(sTM8oKzG7!Vvf0kJPv1wp^&X+0tS4gA?1B>AooN$nvdwAYDZs?pv zXC8uuUX(Rg7h}uX{9n*6SycxKr@!;|@~$NJ#r%(qOAu z5046vf4A~O@N>-EtJGE%Yqi^%O&HyLbH?u-?0eb7L(Uran$^+L-g5ybro&nFnkNeT{l&I@UxYWh!KNfPQ%oZSvfhCb%+4C#Jy}R>t^#zt8 z?W-@G9x_fKH%Y*Cs-q{*r;FCl+xoZo39Ewy0~Md@WjC?yYU6JwL$90HM}t$=f4)ig zT zQ*GovKS5K82`^Q|ysdo>12xY*=QBt>b#r+1UU#m;lNnx8^nULM%cU+UNL%kfI z=Q{)^UBQ6!gx#v3_}wbL+pOSVKlQl1Q@VteoK%M!i)Q7fz|9FhT-v)$LJ63afgy!@ z=Nt0&Hqhn=O!Fem_O7EC0EKCfz-E3K zk6Jt4wqonY{P>J539?C*XIaWyoyE8LAT)}jlhw9o=OfOo)}W5bl=dpQvmS+3 zlmkZi&gnv3fj!;XHV3(1kBN{t$D_&Kc1C^0(SsWgV1}9c4@#qd8uuhmbFy6R<5pGE zuLUo5bQ$jyW)$Xkn9}j0p0UrE9G=BljPOsyI6={Uw%T6Aem7r(n@7L#7u)&<@y=1J zWg|O0x@o~4+0a{6QoV_Mq0m8Ob^v4{Lqiu%A9_|&krM)DqizgSN0Q)$pFzkzhoaHU zqa>|Su`IvX{@TI^PnB?b3y*8V9HyQpH6c$gv{V*UbSbPLII*!_fbK*jVJyX@Cza8Q zKrv`2Bz@wr&sL)PrG|Wyb6!=gV!c+X{heH`2jV=uzMf4>^xF>ev3w_Bn>B zPlL9~zVmSp14!O>-tL3^7|4>gHu$UavlFJ3-*eYkSMSq{+bq-Qeimo*&tpglYc(yC|+@6XZdL#-HmkQ6CyT1<`sM&kjFFELI!pB}Lb;Ziqla}F_t zn5sMZJPtbhca*fTcZWi5eVzUP$$j$Uk}S9j5;0l=0Q0N3X-C@t@pf0y&V>2S;EYtHkjvy;*9 zO1=vR*w*Vuy@vO7C;Lcd*G@*O#YXN-0_7S(2fumqC2GCyO;u+F|C)2|;9J^5dm!dA zv^x(DAv6#7O{UKzY-M-M?$*!UUG*@PcxiDBuMKL(D|bdY<{?V1&ZpS>Dtac%Y+6$D zbBDd}D@o|%I7Eejwxea~X_~f8?PwDAdq&MO^%no_pd(sbl+I6gSv+e$P<%J9}*+5ub&=1!3)NO@`m09AZtU&s$M#na9|9jv+DF-l7(Vd>TzCrYUAK8tYBlut9Uq zLg65F1g%-KWsK2b5XX$^AO;Z~3Wkond(*4*pVRJMZsv=ntXm;C$_e3m)=~;hHOAhi z=8Hw&+iAMdKxwa>_tWQo#SVj>xjMi;kB+SY5QKhxF3_)(_HA=p(Og&deX*2tr00E* zabIgy+R>N3K}U9f5|ffUCLpbKe;_6BeG$-t@k&YKh8b3Od+t>!K$Y?hFV2 z%W1gjUA7;cr67jWl@s1`H-&&71$aJ+u~<<_>g0jl*l5z5d3I|7lS;$$wLJOLXG6u% z^E^73qZKNb+QTTj@r#qklqbqBP?4sfg4y*m9a15d^A4X25<}zVbXV%Cb)o5M_3Wmr z;1J=OK@)hkxg9IPb@cunpC$0>rrURXaVubL&t>uJ(ii=k>u9PX61TTqn@$VDtMYh}N_VjjY zXFH9f>udLRx_9IE=M><2RmNs#QYeQZ; ze2)M6I#z1fU4Z;T7cTw>oc33}ZcTHsBc#Qum^(DSbu@~C>>xeQZ&`yhWWt=1D=xOo z{E}B8ls&->gU(cB^<2TE{7KGU1e}d7)@jlsRR_aBhTnz4D!7Pc@r=FIKXL2P!xG{>F#2uJHMwy<4$8u*0S{S6XfxOhpY}z+XZ+y~wgXuB8 z77D*!9}Hy)ltcT7Zo#8@M6H_ir?cxIy2>`(4U)=tw)s8&$=P(av9da(qo$G&xxenV zH_<79e5SJ?X;6&nv1emUe>vy#!=}}ttTsU}^xWt>@oF|)3mcZU`MY}_eF23i{2K#L zSd$9`B7qwqddkL#3lpk~6)6c)mYmd4+<>c@`Q-nR-fUCz3@Y20QKQ#fIQrL8Va^~W z{w0bW$6(t-qgv3{uks#KSK;@N#fs~RT+`{i`~W<)(Ettk0#I!;W^;HGw^bO-#ah=c zKt2?nT+f+mth8&Ct~}Lq>y*e-tP_zaM;<7lunE>j2{1zo)10b@41ytS1HS@Ig8#|u z7p4rh5`&(TUZI8&9{WdO&bN8kNyNpq@83YRFB=(s?Ook5i0Np6FGCXwsqDElw9=XI z6xlUuJ0X5m%`}D6dq^u2-sS`Mq`P)8k5+R@bB!cdyl=-jV&yh~)ToPq295p(mgO8a z^0ROGMY~j1FAvT`n*2bs?@8r<^+(;cl5o7ttG}SmWZ&i)Phw%SxjdGhBEA@P1T@n? zYmik*Z{pqO9?NF$v|s^@GBXVQvxI8}NDmP*9>mx$1Pt>TXMty2=V`9ej z3&@NJ#|^^&1;xWREJq+gIXW-=dBhh`(csxryoSl1s&8z&M2&}KyS{)LQx5*jucQqk z4>B8{G9mdF`gdAA!xrM43CKqp^aW}coM*qMr?j#WWS7}*N!4eo_3JGkr|7E7m()n! zzK;!Z!ip2~%F~o@#bPkLMo?5|Vvr__{Vh6HHaB{ zORuWa(KW(I|CyjR{do?gw9tj)wh4hCJB`avHG}anyR(D1g-!DWEGAm$Erm1YL(Mq* zSaZp};_^mLy7wQWEVd3rW>@|C=6;vER+E-(BmjSFDo zA4sIEWSG?$^S?N?6QDc8k@^T2J?cMTx}~0h2t*5_<*cm`hBgWCky*0i7&-e;I@kH*gfNXZ zxoY;ZWeCVamYSskO*2S^8oi8K`DkzEJ73Cz3xbW6XnuT4S`pM{0$d(~r&KpNyuwx? z%+d^I@HX+BVkqAid&6|5`8e#Gp91x@dcK6W+?#2UIZ!i-o@`{@ofoG^v*AlTiW7>4 z^SQ}r#DIy6Y^=PhRmW!P3~7c`>SPLRXWEeu5q0}kCO7g4IWAP$`Hhg_i;@O}Ml^a$ z{8E(?|LhRG=&U_^iFNnj4|gabv-lVR|LzBb=o(LESlwZNQ4*7RUF8bl(nd$ETA8|V zx@S=KcURUS?5nx40-=i@QUHBZ`V#=(o3QeFN-L@LF!eZ1nNH|0wOv!#s-d-9Db;m8 z5jB*v-@0S^_W=mPNACJKCC~f_Pkol-oK}`(PNEtt`8IV#1UkUdj+|goRYIC-NhJL+ zkXS(((K-nDE9q5@C7>@7>>nqX6teLpQ)Qjv@AG><>mjv1FT!$a&Qu1_4nk7H zVSJgJvtv*=@qNwFd6o^>R2Tr9XTSi#ieAqHr<8;_8gN3{sPq=d>aYZ;t_$uH>+SHa zIS3o-piJ~d)bhH5D-gB)e50kT+}t@^?&O@yihy&3GLv2ZQMKvooIsbGMUib}%6|K? z$?nu6bJ_t8iaYp*Dou>}nSP98uUrm9-@1&EI1Bw|(=;n~5(wJh9Ucn{b2n=tK9mO2 zu>8$uJ&mTudd;g1e-zg13{1kRD_?roym-kU{$tucUnL)Q@qTXQ!`{&4DCeDi9&H zm9=NsM_Ap#Sx!sP7Bn98R;Glk@4|IytE=4)sZh|rn*_hsD08GqZSq$+dLb024?p1& z8)--o^E;Y&dQn`| zm3lz(QXrtHKtMo{K#j~8Iyh$@dzycMfQ(^)fT;evHFUACHfFFjaJFzYVK8vCVP|Df zGci=PFmYp+wlgp`aill4wx+kXFsxDCk=FbDYFVdPO~>mGHtIBZv#nm8Ioo#pGa`oX)QsP1 zQDxNVU)J;Ad1bAoSbYDWWbF8f;3<`#bDm~eg|MlO{&Q0YU8e@-)!#mdodoZv3k{}u z#5Y25(*291D-1OmALM;pBS;naoNYXZIhDznQ1n-ILy+`@<~kTQ8%-+RN1Rmu5=x=w zQJNguTi(ZEji<5}L=CM`#i>cx&ChMCr9aOz31aNWFxh`Swv@WHkuK2ej!8LMZ`TXB z2xf5ch|Oo0Ct3iJDQ%1)z|fBI5k6e3?PYa?%{Gcz%3c6@imO<#bdM!OF#fE4|82P^ zfT#@VmGgDN502Euhz|pZX2n}lqW-L&yp@=1x`SD4R%qC%9cRXXA^|5LGwWEOe)&_ z{=Y!O{uAid4psv601gl&MG+9q|3;un&i{$m=>JLdI#bHl=pSk*iz!$?5HO6trvND^ z`~?tjfIoS6Nnx)3!FuY=d_5dEti~TD*M3jTdY~UGik#!kThf>!f6krHPL#7bIAXzAAxP`?7y;D;#szH$9(YyH0*TpUS+yk9MGc5&zGe zZ6rOw^ONoSRY*@=9>8|w$L`l-@UHKhz~jF)7vsqV>$kj_1#=xy>4Y^CV&? z{m9Q*o?l0s?@r;YZ0J#Yxm^2e7bkrYHhEbTqs2jSuC%GZPX9AF6ajwk$Nm(<8@pa- zo6hzwO3QW6WBKTvUPnUUT%UKzGP;~tR8yDjgQTb1?k$+k*SbwzmEYMZPF=^jp?nWa z9%ty-TJM7_;K4qdq69wFC>?ujAwRcRQ<9EohCJ@n1s#9od8nTMGC2%^5b$)b`}X@& zh7d-vq~Oz@4mY+3-;N1euL*C8X2@T4p|tJD`D4JD6)kt^{;*;HurpvDUWXqo%Hg%% z<*xcp>wTZW%|gM?kLSnCTaow8TBCIbyR^iLeLCR(_wZri;r;93c)^`f-PesVW5vmc zrX)?EgY->*5zaHwj>Q{c;$A9Fm8v6|y;aBEBqA+U8*N<%ZgawR|6h={!wq-pet zJc^$GV4&SGt4C@MS6dt_y8`FB&m&mumY~<8+k0Q%-u>si+;U;#L0{(eZ-a86)JpJh zlo=fqdKI77^Ursg!>%5G@vo`v+q7nJ_+sR|vFqO!%%C|sFcU1bT9J!v9_t8!+JA+4o|WxW9GCG_DU}OL}aY&yS|pPy6GQi z6UhSg977d0PrbBGdfIFGhZ*)aAF(=ud91_ksh=z zJb;p1)P?k24z<=gerlz!^5PHu;%*6nh=+XGaX)SjN%Dy?ySH^Ak>RbYZbLlQ9M3 z9JDRvrfT3Rv5CmgC5hf-SG_ZY9YSe>5JS8WLG)pF-GZ8h^9s5hgF$MC!GP70Q0wAf z3aN^kZ;!osJjrcj59Q}o;Y_qfS0RbPlWT!YyfLsw5)>G z@Pje$v_r6!CrN$h7EdSyk^3l&8D>B-zqx5MlPbH(rXwhaU;l0B^G1=Fos22PSkpq# z=1OSO(1W23eEa+g^@OnSw+Q{drTAzgA?7y*3l@zjni9v>)&*`g-#%1THzi)i;yfK_ zBTY?wAEe!%s%}=DVAT?vB_A;>-y5#AJD?nGb_w+0HuVOzq}#-dP+X=WQxU9)ap5gXdq4aF!?FV~D?kN@C^Rc=0%ol0U_VnnNTlpXyk;Onk zeXt}b7~huNHM$&uV~f@cqkypVnr{F3CplGuXA|-n7U9hU%{6L4S>!~2OEXSQJjy6- zEfXRu*V*g6iuDzo3kmf3W2phDo5Q%ui6H_TjSPE zNr3nfnWo4}A>(Z8(>m-5jxco`H~l}W?3XIf_sWE$B0TYp>=~{ZWeK*zNk*h91*+=N zXwyLDT{DJk%d;wnomJV8h#%|9L!+x#2^rXx5H-XqC-V-bF+AV#8C8?RJV~u7N~98b zCVh(Ib%2tKJ$|CM4O|kI(!@t&rr)>isaE6NYIC`CNcXY<=V{bdB(1c^Y@;yuMcw)P znbOKj=EKm#;n76#9a+5jF)E99kcgbnne7zWvzJI?g39$j3$+vFxoLs4CnG&cN$#W2 zz~Dm8X9?)n)K|9qX&dDc)PiFbDgj-FBg^V``3CPcj>yzAjJdkL+ew_xhZ8G?!eLV; zLuH;pLn)YMXm5^xgD?qbiaW?NB^VBlfu_$3?_m>f7(N#W6iZ7N0_rSPUtPY#-uQhr z2%!$FAFX@RDKaEIr+=sDy;7L|nkEvVH7hRg%WGF(j^}1{A+>RFpoQSr)`ZB3M1+FZ zjWRp2t25we_Uk^hMp9HBeIusjNOZE+E~7i5@m{yU-` zBuc%_Nz6nYx2+ObTX&P1aa3y z@)YzllxKRd?F|ID2E7vTqHt<+>_m~HLwt|VsaLe7rN;3|wbE^I%oC0W_-`-|{&j0T zUFiASITn;g9a4?Uybzg}-pvo{ktfU?eM04<5hkU={gbwkp*X5va;*tczo+z6R~ zD1|o|7*0u-A|{xU{iTlF+3fli|ARJlOEjCg7kBi2qiH}fpDD*oT%6x2#(eZo5PLh2 zU9v5-nD1d_zqaM;4%^gE2iv5jAInI8Cm?we{fgO@Vs^&sD1CMD6es4%H|^Yb+y3J4 zh+6=!W`sOP%BUigUeG1%k}MxKhV!^QkPR!PqKezFYr-o=IZWV``=(Y)$_LT(fx~`D zp39X&lG7y8{G2fr_Xs~_`^ce2t80#^fE$b6^5#oC1G@>oB1q}a158*^L_wQkmT(Xq z%YR_Njy1hDm%Jgatv}|>_;YK#5hHdf_Ssk9G)|(Smg;9jc%h>XrDPf5)-B(yncaF6 zjmnKRTckzCbgpcAs?}0l(BKp}hFQj$Y*m`NIj(#I$9-n@K4;_dnyf)W)r=v8{l;$c zb`HFe5lzf43H~}9on9|dY9-^o(N_Gbr!1w?1}3T2Ow2l+p{@?}sv1olw(f7(qXN+^ z=9scantX=swS`v`UQ;@1=;XzTa6cmXi6{6u;fn<23tyW!&dt6FgZjKGMRT#^Fb!Wj}QS@2F zUB%7;%-_>n$t;o!i+jCCqOC;^+sLm_>fUlvsZi7|oN?0*U%s8C3G$1Jjf~@*46uB4 z=A`E%u~b^A#|1r?XTauHSyv65V5m%!(W!bdvvi(%1!7pP)iZYXWMRKedmZ;0UxRuT z?bdiAuRSGmg>`a2YrQP?bP(a1a(^%BieE(SsxGnxY^A96pHadFrcAQfofZnZCA&V# zRkfG+zKlqIt1Fc91Y%d)KS{aP@a>iqu_ZW@)!p68map->l?OMF#e8b(z+TWv?1apu zn9;xiR#y!O2!UX&CLf)r>@4d|tm0(I!5e36#^!(1LI1oR6SZQCNf~LS|NbG-di|-B zsS$sPhk=;LaH8vnWNShnmn|@}k>dIS+Fj#l4;kIOX61lc&5?>s02VT=0M;mnxBI)m z=Oa=3`{zi@{d;rdl^J~*G(hxNQ`A%(Io*;qH22TNI8mF+dRN@1OH!(tv9A{efZ+?~ zEprkmCYrwjNz_`pgTyN&J%7KxvC_+W;HM3$!>p_&5|&aLY_Yg+;Z&Td{;F6AfiM3= zsrcKDNsY(e_)n)Hbj72+68KF<#VTtAT`|8kuWdFD{I?$Qe~@hrDg&(Y;Q|HY@EMIT zm^WQG!u;np6%|fy{ZJKHO!7P#<|A@jZg&m z`ECRY6>AA_-IdXnk>7!5v$?*Hky_Zc)RyFh>a;{@$Ngsz3BVHh%Y+!XSXBfqH@lJ z0V6wk$3ruHa}e*!I-D4XXS5I2nHf2|9s{mRqhy3-ln?LhyKO*sfvHi1TM=FLd%*xs zro5R>U#COTuT)d`X}&${pou4hCH=3j8DoN_WZPG7WjSGacGaQop!n!%wh%6riebam zbnF17VSfiGU<8m`wqLZw^c(v1&)2fY3*p}yzK2rp3)ja4dQJQ8=AR98VemhTB>l0C2Mh2u4D; zm!(i~cb|oA!I6T>0UMjowxsO1`8-8>^0STyZ2o@Aep2x<`3tctlGh~+@HRAObE;VL zu|}OvrF(+*$f|V@#Mr$Khx+lF(S9z^O9-ET&*bVqm|0)7E8uZ6Ki#UH?9B8L$R6@p zeU~Y9-&;hcBeZ|3qW%#&BAmwxMpmi_30v8&h$jDOHgv#zZUCUf?)oSJFaA&k>%#{L zOHJy_V2PD)vu%)WiC3PqgI-({|Y*6fm(RqMhg&r)WsK zCCyNFOOWB0USuxd91bB&=b^lBr3tJukOw4&vrTjzI{--xM{Qw1R_E| z^hY>xRJmDt4+XmvR})L@L$B%gsgrh7i8`KnjA#_mQ-2ameLf}7!e1d4I)09!ziaC! zt!PzAaa3NJi~J52gvDwufsOiDl}*1t*v5^6%&C*OmpbwiXQKb!Ad*4WnS{ zh9)zI6;+%f#7XZ_*JuahjLjN^Ih`u*H3>~ndy{emEVd&a{v)PA(#;6&zA%m0O`vGA zpuz^UDtKguL{)vfW+OfdyE;=}p#|<6H4+J{Wsujd#|ZBO18N3iFlGhl)D7h?jC)F0 zYpfR2A;>k=Ytf(Vy(;Ol@!#fb^PiSq3lg~~S;ezw6>7$I zB&C3X<5TQR?2vAwo;YWR$}Qn$V{x*U{+f$nclez8dHrbo2}xy&!l8~#4J9}|%V22`I) zF}a!&vAR8H4?%#quE(~HxpAZ)tSae@Z{QIYb`NUInf!Oj}07ie3O!iZBp3k zhV3izp~U-|QiAl-FWTF-audRE}}gPpcT z0=1UWe*j3M3ns3TDBo?O{=F4#lI7cu&ZhSwvP!0N2_naOx>W17*Xe7nr$n$4FUZl7 z(F+)bd}HNIjKcxUFMM>3Q?1xLAKO^CgwVmC(`Y)Y#5JN$8#3nVR9uL*;sgU$BkLZyX*g~oc?6T0H%ahCJG(pbm`Q+c?*)}4x`Cw& zdo((xFgtv@j^siuf|!HepmuMbK-+WHh2P!o&i2>avF@sbp6p_OxDwp>d_K#_GM6$- zKBJ(hR>R)dw`Acpm^+*6^^iI-76z5W;xOg*e{^p&7-?)SYN^g##;2B^zV4olswV_D zC^EFxAuZ+dTL#k@}>%vP{JHEF~f?IFxY`} zhmR-5YZtg{kEtn}R3}crgYNFH%iW;Zcv0AJj;L`tQ#~v~^k$Rt0Q#fChAN%5+O!AH zXwMzx^&C!3m!{EMw6>_KD0Bdi_>!!Tya%-jL1<5V+?G$f&Y7eT-&J`;0jWMAsVI`+ z6XHZ-8uC~yz$uzWLB=ZtIOKQ*^S_a$s^6f^)uJ1gB)`-?_HxL7S&#!VWfZt88I^5~ z8p`}o8W5v1#Yk$u*edoRsW3max|qpzf>=a~kIW-HlTh;SNdFRB2}%@z_+<6+!5i$m zbds~})Ac6jw)h4e;etBF*Jy~Dg!q@dqhGz;)m*V~T&ddu@#XMgQSanu?n=Dk*gz&C z35u~9@<}9q9T(;#m=*9A@d0ZOmk2>$ZG9<(*TG>2+ku#r_;{Ykhf08Ql%`#W8usHt zqF>HU3aa+1m=mC!(FuD?y(ll=6=!B#heUjhy>Y9#RB6uTRAmX93sMw48VI!Nv_x(& z@@nbRB|UY8$yEqO**~K{D`{G*jGYuyuwN9@IBdiqSo_blZ(3uid>PX!Yu&Q`qO2k6 z1}wmGc=c^Vce}^uyXkvn4e!59+f3*tGSjpyTo|Pm+a2nF=o3XH%ist}WZ#}NprNn= zNh?V;!&^C&lPOt$G^WwbZY7CtVVg+X+x-UnW8)?)3vdo098JmGj@Zx4ceLG z9lfk(ZI(|HEI7BtUH`f~mi>=I6)&P7iz$UaLNVXS5hv0n=66vR{1|~F($ijjpM>s1gU~^JY0+*UNa{0Sy zAmOuAkX(+#!MHF;qvsU74sx5ZslawUQyv&_`w4YdlAG@MeY#6SQf?$d8I?^V8W~F% zBuaG0$zGN)pq!EHs{DKJ@q2GpF{pGgj$CgC&r`R;mSO`DogjJLw$d7X{_`*zxM-Ely_Fi@wNt~G%!~;b6)<-hiCbqVFsk>RT$)J&0o$_BO@DTx%aU| zf80##DUj!vpMfCGq#q==W>AUks_P&{55z)f8~{2wUFsX&DG4&)vI> z#rO3R*5@(l+LP+=oahgGahj;BGt3Ifq@DKdXWqxdKTUy8{U5o$Et=?-O>pcu$#KDS zbz!XR5^mQ8M1sAY#!-!ZIhKbuM8FEgUKLN>4oKnMcfr6*@TOSuMmk(Gqdxkod=6i_=v{o^Q0xQ$BG@>;xx*B5 zAx7BctU-S)Wn(^ymcJ;tyq7NR5zAx=>;c#J>!RHF#8LmO5FfL9RF@+ggi~I-VRYm4 z4URqrR^Xgg#+o?6U0izhIUu)-MiO1P5?2ZWoYCkXawvI7v&L1u^o^Lq9K-m~8PuMe zja_d-NwLA7dCm&yW~0mM2v>4^Enx!Ww2){J_q6)!o6tq>vnNAI(`{mr(9Hk^zNRFX z$7MwtK-BaSSjAp%lhJJ#&G9Y|lb{NCz`*5ld&;V&G6U5y+Aq`#_O92;HqlZ=i(naM zhel1(pU`@Dg6kw&Y9S5OHqiFShiQXFgUeV@Ol&5NzoDh$nXF7Aa5jQP%;o}YozM?? zyXQIEfUA)g4?XSZh}EoP$?BzFrgiZoWwypD{e*a;Eo6tD(uk<2Ht8rBu&+XI3CE~q z?5Ioqd-G`G5UWwca83)Wg_Ww!_H_TbXk*FR*VHx?Hmia5lf*L(A&nA3qdFwT23>tB zWxT;Ipog8R!#=NJwJdWu|j(_{-Xs9sm zgZM=6>%a8d*jJgGw7}1f1d26o(tLxbH5q2WAikNSBRNCNKCM4C6w>;cLqR!Q8Rlgb{jX&Zwc z1Q)tVFTNb0f(e^WRiXV2LJ)Qq z!?aenR^wI?_U?01ON7Zp4yE##%-B)y`=N&wsR6Hu_r6Fkiu|T06=vXlfHggU7{TZb zw|$vnvga`(QadEEQPY4t5V-Pq3vKUdRQ?) zp{d~xkPc6k=MDOP>Onk6fX%>~Fr4Pi7S!X^AX#c*V;gR>kxfIFEMGgZla57BuiZn| zm~HR%Z3R76Bh?e8Lw)h!Xs*xi1_)U3ltG7p-2FO+&C>=hTo?JdBwV(;KawV_#I43M zhRq6uewbQFD(DeR{P zLU0W)8_S-@g-ng^R@+|LL7n&@^9m8B*HZmbdwM=o!f&ST~=ZnK=AP0FnyEnw$J;_^Qq70}MJ1!@OGwIEoWy}7EiX~w~5)ecT zsqS@~UeBX@DSeT<-CY}-70UCAkiA)9SduohK8R_Qms}!EVQH$_;J#=L@C-@O>vW(G zCOqa1sOr!}W@?N>O!l-Lx9q2EM*U`RKcj1o$*U+r=G(OY=#7y7dP?9@suZw0QadZh z?!Buaod~v~5wo2~NCeqOpkw`okxOKCo&#>mAzo1F*{b8RWDJlMv*Vl>jyv)&LK}R_f@{y${Pl?8DhJRqRMmhkxG?{AE zvvl0*WL3u)VuWIZPU9SNSK@)))fBH#BI5mv@X?VH| zyo?wYM<&V%_8CcR<8_LEg`4I`n8}(vr7pV8ocF6 zvIO3UcBCVvBI8(|Tp|u8v5sbZ$jcL<+k7!1^im(U>uCj1y_o~w<=GmJ`=IfUAN98y zD%}lF@Maj#*tWhbM)rg$2yJj`_9vrPjI|nb|DH_N`d(k&_O)d8d{dYz2+p9jH)lFf zfDvU+S}9p^i=P&Wu7rPA)(oULib1*4PX#_^dFcg34KA$bBP94u|2GR!FV(xoO*dD+ zU(3wF@s1$`a4EbW-LU7!$MTMB9&jwfbsyUK^U<=GIt?4YUN0b2zKnLf7t6yg;*qxh ziF&3=&NTTMuDc?29ux#7G9@M!d(CP7K0%hNH&l?B^_y!ez28 zPzJ2tPTHaZvfIG#(yU+U65TF%^CWpsdw8y+-$R|R1pVx~HSGNu_DCP?vO4KN9{XS2 zHV<5AWK2m^<1zFQHhQ^7Mq{4tMW=QrPsa5#@qXM=na-&DVKl%!=nXW z#hU&Rgs7|e<5VV4$qRumHea2f9nF0sZO&E0f5}+fWvg?|3)82q;A%{_P1ETAGTf~= zDN6bPm8~KR$BhzKIF&6BMsaCwm!>iNwS!MPJ{`(MxcKL-?u;*wBP?$~+tO$rLI|{Q zlo*O9#Jfl73*XCUC>cW~q~sbbaWcY!g6UY^ka!l0zs0@*1D^@D#Mr(a+>5Nq7y10)l2#gVc_G&KOv_Jvit}@R05E)kAgb zI5ZVS3M(K=__ca{NqFb_e*kVkk-rhF%1~9%HHP|dkY*e8tTX=e27V)dcl+f{zyEaS2dIZqI%OA5CEG-} zb=KO2g_=opl88%}pMZRJ`rAe#Nm@yP0YhRa$(Ur0uX2fE(!A%g&-l_L*KQ#asD*Ca zNA)F$CM%hpV$G6Du1*^)&*~F4fb(8-FcHlVnHnSpx5AjR@#qmkjDW4eVVdU&WHx|d z-J2~XuR55kylc!7DfwZVa2A?#Y<|eYhLJ{Y1sT0JhK!LZC1o77hh_XU*C zCS`~@GgUyIXm)|>4iCp3PlZ3TAP1%zLg+09w%sAq+>udrj`J|-8tPAy_PI?ZOEE^FpO4MFeukyWa5bc zbnotwlUJBtLu@Z_$2rPW;(&AXAm}VXIu9>yxvQ$>EoK+!v%DVNqsE3rtmcs+CSY;R ztf7ig9fSs3)Xp;>zkob2-{Huqjlo!~Frd;z(1{b47(Hhiv>F)aPtUf1*E&|HrCQJ2 zqNO>yHAYRuxy2DiO*-m|=LJ%;hacvJo)tYvp$SptE@@1kMw>N`6UP{!G-)G;{o8HM zO={1hw-8NhrjAvpL=K=6Q? z2gtpVq@jBTSpZ`~zlQt637pM04O!V0J~3F~-c6dYF_P z#nN`iopqLZaYM{{mI;JGQ|6?e7$^{n0CFreN(xy@^urfsoizr30sL#1{ZTVgDB3Yk zx|WG-oZ~Pm!0yS3qARVZnl3O4dtYw0BO+&SqODh`rhb(3C2aM@ zg+Y7ELb0?QE7#C61B}X4F>(V+78BM^;rKObmnOZxS`bR?Svd@vr}|x(u9;&&!{jkz zipN=Bysx+S_Ntbo-GHOi-LaX#Vo4ZNmJ~`(fcZH21^cYi??W>`m5=vJQ$Mn`3r-j@ zRheY)$R%r^Soeu~?7fYUDJNP{-^aW#QJ$bE!{=nz^>N10zB z;C^Ujn>3_=QcZad6&R>jCNIPkVv6pe1go2*FHSVA{q@j*W}Sz$!ceKOl0|L<{aV?KP8zHwj0sI8A&Gs|v;!)Q*XQ|H=JPDWX}*^cI6#52*| z+$*yVXKTx&cV`ow*_OcS?i?{F3Py@r4{W|UYd!Q|AE%i9+n?;_@Y@pdz>!fW{Riv} z%_CC+W2|#ri(X9Ij_M1zbLU|@8yLmtWBnV$|e0Flr`-9FWx|vZF|i4h_>XfL_2|gy_%QZsZ_Qfuwnk zV-aFu2-X=p02AgKE#(4F#h)j*%MktYn}eVcq7|-9#%!RO(K2ySq>xfbRpLvcGu%ap z{_@Ya_lF%4v<#zXW6=~DAOUO3g$Lx4rPPk2zaTopUB)3D(pN$9w?7TO=LdULrn}Qle#r@9;r8>KAU2A z#_w$o{fqmJpY10-b+_}gO=>5+Rr0`7(@Ce@YZ`rbqwZTVcKZ%bJ_vN^@oA;_{^rBU zCkj^E-cD}*#jdWCpISCro%qMk_B5O-&8+#8@t@YzUwLfl>A}~Xn|k>FAKV;$mFnt= zSM~ApyzS&OFdGGoS8`m}$lgl$S@Gl?2(LT)a6*CQB!FGY_v#*ak%7J9Jk&ZRdZkr9 zWht*dDYiWOTA%wlP<~^3Z+nf}vvBgQ&%Wu+YfnMfTl@EokInJP>zjN&HJ|?OwVegd z@1gxP#(wQO6bZuvYcH8&v@ys0#34k7(JMZ^g!AF~1@FX=;8oPNZ>eZe21PLLF$@L- zow){%puMK7S<;f!uV5}n^g!B7A$l#!)?#I7MOY|I|BRLrY4iq5RF6|`&>O~2_X?H^vIASuz(^D#W?AI zq*i?4`iOCPirdy|t)zy~xHJ<6kA*2h=TI@!N+f}B#q_ck``F4MtBrAV9UXa4o(Q+7 ztT9C%xshj}9CKe0zO3cWt^DEcX8(n0b<#McTG%o~21zn&Mbe#Y3={G>#vA`0JD zEFu^0GMy)Oh_Y1W1DtrF-d$;}5`~7$7 ztGk1lG6hWx0Xs_?m4gK7IeN~%glR8O&ewa7fN8~Rq#URJB*u=!K%JOkL>{5Eu8I-d zH+ZG96U%FT7SWI;vebbL5RFA9VnMJ(t6n_!4PyE1#9*DSMd~Sx#9gy8loXjT4o+B$ zMx{K$mL}nB#C|E$)N?0){qyE%O?_Y=QW2&U9X+TaE-r5ccIMH#VmW7s4HBqq_sEfm#3K=6=*Z()5U5z^Yess`66 zEFFj;m%tjmuytrPYp>MXK^f9@gn0OLJ2kt1n}b+0OvD*tWzZN{Qb^PHJ!oh}O_nKn zg>$9;f6?UrkVz2B!w>X_2%ZP(OKa7}BdD-Gav zt7&iXF+hn>7&;Ax5IR#Vft&Yc)e|DhAql>c4)QuoXxLLpIEi4y5Nl)%lSC=RKCEbr zr5_R@e;pBEZAX#}Qa8rvfkC{osN3`pb&1)vMK~k^d>s+WUR^oY=)E!ZmKk)C14o2e zJ3f6K-Gd(zp?ni!jz&4#B*9d&TA;7kRH)AXGet%Ky?Sg2n|gsIfGzm}W=^wvAF zS~3PlV*#C%Qi}JSTV9RnHQ<%vq|LTBk8)OYkKFU<3`2~`Y<9VM$Rt-oEMJ!9EBUFV z@wK-KA`++vE+GN~w9bfuSlpp&kU?-nIoI}CznN;38|SEBsk-w$KB~A+t)|(b+>ITmh6^fzqDJjZ?WnU1VM0Hm$-{`kCfvW z85XI6Mi!V9LFiR1NbM!2d!#Q%_`5%@a~$g&)3)y!Tp|?@h?ys-jRvu-$kmLPyU)D% zp8GJD@;krN>+goIavk$(t7j%wEm;*Y1_l+X(Ao{6jfRpn)5Sy{z+9+5eo*3$HuSr=d9yNNfhOGGR;uiD%QIy--+sfqj4%HL7*3`;y(gN$!5@ANA_Z zrlvSUpE+lYrWHhEK*jQcH{XxZ^J6!>9MV!YQ9wYcPU@K%g-ytPO@`FCk4*9ZOWQfpxi< z>Q8S!ee^%ReRI{f&ZCQJowOs&-ayF-+$f<`k(4cVjY~^-0CH*4dsfodkecKSjqIRd z1zM$H7M|L2rOzin?!dZ?gukuEC|g;G-R`#36l7UtR1{=0LYWEHN@>nKCol2U9@I-Z z+rRz$Xj#E&C{G9HGC^ZzaGC>SmQvk%5TBoA{reTmN?RG{R>+4#qYn^U0=py_)ev$X zC3!kR*E9Q%`*Xnub?ut}JUFqu4{Un|@3}ztrlSsSc|8oWeyxYMXCIBT$`l@6`+68{ zov%B*_;o+dX3p&3PWNM=jyo@4AJW65(N}_ejU}!zzUKMQnT=zXC-1|!H%@={3w?lb z#8DReaPEz|pKrRi-+%p^xi?PxI)u*yr6Z5W*oSuH(C1m8Ut@)zquSFzeTglPT6Dh; z=w7h&OoXH2o+m;c6LTEy@xS}!^?3L8>Uy;h?`kW>l{Kj5ipf(!mII7SMXM#Yo^6D> zjCdcS9NlX_joj{-*J_XrA&&Y8$UO4UmJ3hcTO!YUbUVHt^O@5QT zs}A^(3KDIQz=T1uc6H{_?S|hS!Wl^Ies@&3r|bhQrU@#oLdT5gDOl>2aw)vQ?R@WT zcYbnK?t^SXGc(B9Akh_t#;9XRh&?P6H-V0(c&OFgGn*&$BDZV~?!Nf!&hd-)|9$uI z?afly)dzpS?*F=e^wox!d!M#iXr7HiN1(x=Y#EjsgL|31i+R!I^*jW*5C60K1^?_b zo#)i*6Q!ihk#{rBjXGFU0S&28k_4VTiFTSp>$aBkI>hA7X744c)C%=7LA4}k_l90a z^VSmenYYE{*CA#V4_s~LbW*TcG8g135mZ8i*3>bFwA9#gbYBE*A-xV!zr23Gx?ym= z^!V|MHkqo=JfXrB#Pjx4Tv6|#N-lQ0o9H<3S1o-j3*3vvo--;X0fk5qk&ZH?<-#G2 zIF8r;N?PVVdYdhF4)2`IQDf_%R20_IKo+)CwYOC1c=4~KCI9k2AN_jAVjHGDLoF35 zUO|Nh*r_17wocYZ$xBqS6YZ6>=-ok0Y(^=?4l+X@IIl$e@nuV-B00=_t9cq$k|sMVq$lltf2D>@|X>D~zWj<}xix zAKmE)x%4{Z-W)cuIVK4XY3+a`N7;mU-E$41t*-1gM z4bX@RQyYk-a`QqWjdrVgEn~+UE_-&BPxIbe7W6tDG`vBiPc-V;i&PIe?NRsPRgFO& zP)eIBRYI^P&@c#O++n>G^q{%9MT$Q5seBEijrAz^=bx_Lj8*1my`lLhUqNl(t&>b8 zCA7{1)U3gZ7%Zk1a?4r!k`mYl_@XtrX0$pK{A%1J()Wt&)F>M%np*%_sn9?HCY`;O zGR9m)Zb7~dnLmA4%?{t3B>w%?57+wf)0P*lkwu0K0d$c-Vfsg&^!?*sp$%Ywy#zL62IH=?b&RI}|C~zE>x-J?Qv{z-a-}+G|+es~# zkfGitD0733C zv+?&kj+rW9gcOD$jx<3%Dy;N^5hC-P5+^OGfDM?JmGkGTpH`y){psBfMQN59!c0g# zGH5b`DHrsTDR2#~&axRG#cdr z>B&K{cQD6W2vuvanITD{%tq3_4$kp2-P4m}pqVNj9^ij%?93&f?)Tz%SHx|<`>Ur_uf`@8p# z->jF_Ua!df>jq+1K*WiQ%!pEDfO-lrZwB(%MT7NnyBBO9<_iZB`$=uKSISKr_lnp{ z1VvX^CPf~#P!`tQ!a=1k*;dy#&OA0Zyx9TO9CM3|lstks3M>VK8da^{HQb&Uc?9z7 z6}?%@Vd#)<5w#2lNm3Zsf!RwZPCYkjN2-2Bb-gR!-ep=GoY7b&$jBj)0|FIorK$Eh z?kPQa&i(!pwWny?UT$_8u$zS6NfGZX;ZPeflYcQ|6Z!qZT1r{fP_WA!A|)vWR1 zEApO%cssLo{Iy$8LSI|>X{~FGcoLF3a_>jn+ju1KUB3II&|8_wlf2w@^5`6>OV;Ly zBS(*e`;sy_4dTWK{uDN~J$^ietJ)s4oQUq1VZteGbYDDvBF;y|)6d5K%ZDT5x>J>~ zelgEoIlg*wb;Rq3|NgY9xc686m?U1;S!Z`bZ9RahDww9AmE^4v$&_V?aTs`A{BvTJ zlS|y1VvZDh7!_o5f@aDvtray;v6$N^V;-k5y@<&BUTM!Ah0Y_*nHy><0&-?p^8leJ zaSpE{%Xs1-?rRaaHA3{9k~T-{G?uF#w9`a1CbnF2sK+UMJ$1Mzt)7Yvj|^=ygPK+- zkAzM5@e7n5&)m8uH^$%CqzFVVA*HE*d&e=en3p7Z96t^5(EN-%B+=cm? zgl(E>ZAFNuV@#Q#C=rr+L+xH?VM@WnL1mXT(fcgcX0+*8M$&98fV~+g1OZcsm~%v} z$=%X2WZy=*pom}g{)^`^{<<9k7-WLs^^*=LL-4%7HDaPkdlX< zl|ou-=_u^iBs6W-Uz3uj8fqW{)jA<<5^`?VIB;efM=QN#SG>XIK*S%XDQ5%K7D3q> zBo;=iSyhFt+R~pL#CAz^ikHRPjozOd=;ox^Q5Ly_7L zs2NDPLn!&e(F9v?NRp;=UGvo0X@faUP?fuxF4@gC)+;SWAwndNe;u z;U(+v_j**iiz3BT8)I5@P*wsxNCmk%m_|brOX}9L-CE;8+!qjdMAA5q=A=0z+Xx^D z39Ow#EsPRIin-O#`d&%S`1@lLo)1;>$d+=dh%+~k#0jgxF$?8rsTy%UM&;Mm`k9yQi3vTq7Piqwr+h?L_7?=Zd$$*5m6FLH*XBxkh4*bej?UnhDD_%yF5$C&RAa z(y44@jdeoPcn~0-isO;vbY3J z;80Mw4G7VM2C)%x(*7j?zPAozwIJus8(*D#`Q-kMnJItni$wxP~UeN_c_pEqbr;o_4As5ApHHCT*_sZxX4 zu$ULx8!(roymgX?wO%|3nze+Yp}^7%XfaCHJnt3*Y~Wmy^gT=clYjX1=Hq7E&8oJx z7tK9_V#u)CJE)~j6kF`KJ01_>UQpC8*2~EryE}j~+elGSSYZfJ0tM}Z)uOi})xAK&zg_LL`a(bY-&XE;d3Mhx)nL)2 z3u^QU%FbZcj@~I}%RHhk+Jf@p8C zrX~Bl1NDV`XO_Ml!~&|UN0&=N`* zZrNZ_I;iFX8MC6)5=O1PCW{+dHUQ5oO*ciNy)Z*Jf8{`S-L z7GI&3-4ZzD2oiH}FoV=?RELO~E`0AWE=M+PP2-h1>STxn1GyClX+x+Ivb?E*K=g)~IBP(V%z6bHddWOxXyCDvRc?PY&Cv-wEiTvH{Li} zZDU4w^awIhXlsPhTW_9i<`(ygczz?^Oy=xYai%Ih9q{R=+iJ#l%ayO+X2xiQ)t zg3?C=ml}|JB{H!Xh8-a&Urf;c>(PU$infe8ynrMY@E8N4p%l_O3vJliCg4km*t9TD zCS%SDXPzh{D5OWnXv`dVOltPHipv?-;d{Fq*~lZK%p5?a53mZMC7NEO<-kkmco6se zlJ0J)T8#V8@2`GX^^d#n$22aDd+0Fh5yWJ$ITg)v9KELyY#E>)iGF^0-(G#_3x}V7 z`uK50LeY%PXaD`d_L zik-p54csQjNUS-`Mb$pYiwN28pk~XU*xDBl}!K+l1sREuYfkU5eeQ=56C`}ixr`qH{TkC82{*O1v2+TI zTnB+fBW%Wu5-GOaM651x&0*jd6t&fKXn4sj!J0Kts|IZ}(F^CQEzl4?PSu6$YIh~| z*k%mDk(DY)8-qj4XjMiRla?hsknoU%{H zi`GZpbY^9SnwmgzB^0e4tc6epX&re;O8U5viww=~mHL-=WBUR~o;j8r3Wl@+ZNi93{A261tiYK3Y|p)q^z{c#nSFsfU(a(gh={s@1z z*k&&k!>fU~O>k}%A#%{JRirMdjKjb$C~C8gI_Fl>5IBtt8Wy0r251b$DYs#xAE)X? z>uS>vL@8c0GboRaQqzQ~Ied1u7(-yT<78dJ9o!babAdo;$wIP;F{FS(DiF&J!%Ng* znwu>H%bj4CBflE%{oa2vfB)fNOKQ_7^*P~PJ4%QNJlcRp7OEUH)6&~KrHD%k-8EDu zPTf-L;A{p;!C_t^Y7NO!O2Z575_Q30@*me3hRwNFCXuF^5HcxptP7gQqpA1I95_Y+b!#9m4O;3zYjuRy zZTgg58ZMY|Uu~Xx^Y+81_x`)Ledp@&lqqOxC>#T*NQbH!dMzF&$Nc$#r-xAI&*E;C zwrTf?xrh{lhc-Z523W;mViuMB_fyWN06ZboYM6icJo24LM~>Z}jd;Xbnu91ujftL& zy|USZ%aC?GzB3B`ig*7d9{mb7H$mY^Udx|<{PdGuuiV445mwRNNh<%Q|NM$~au-7! zT(xu%D;GquqFc~28GQgn6nO&*s{m*44vsLLiZHDyXxeKs@n;8ruMX_tY5hg)Bca$BKY|t zJ_Dac%wMl;@s7)HHpo+$DQb2w6M@>CupARYja)P{(a?qbCeS6w?pb%1J^Ao~lq7(( z3)n3qDpO3!t;N2Z^Rt@vM(?wm`F(eJ+}i6+grnN*6ESzfJ(=0}M>dD!&>mLF!5ao{ zA75VZ%~m{nyS~9e->F@_x%znJTm6CNDOM_K69$=eaL$e}Gg)lCmbr|-_n_UBbew4% zMfvw{KYj2=_*&QEA!W2N1Z349DhZ_w%H1;0mKVMY)cMKo^c2iKCKbj^ok21Q=5eB@ zQY|xEk8z=SALN__cY6n7QVCR0M++bs2KLIJI;V};M&_~b+{QZ7``kN8TT@Xj11T2* z_1+*U2S^o)U8>CCH&i!pPEYfXe!V0aez!i2<$8PGB~j_QRYdoUl4pa(*}yrI#yS(n zCFtD&b$+tD4IzrM7A9~_6J=I`O;?06Yhju(=edvbxy<2@zPlUFkxO+`Xv>VE++jQ` zrZk_GM`XXp^-N9c3-Z=Fs1(}Bsi93{lu|3WXTs!6Ddc8t$|k#XK6<;WTgEi=5D}zS zl*j?rjbL0t4W5PCJ(A~b_3HxO_J8bYOs&YIApvppfKs|aM`W195UJEzBrQxo1D&%e z-N)Z|HIKF8q6i^Yl-?4gibJJ&j3P-TKjeFfX7u*41@3cDYOPmvtr=yILwsatVl7ls z?A#wx_HkD4`sY2x&#o%{~^fqBHDB|09lZucnUr808Cr6T zi9+phX$HqYpFzxDuE(QoqW2LbmVi{Fp@>H66CQXe5tw}t;L+PPcB+pG1T?d%UF zcQKtEZrwn&IXLx-)arEgT&?KB^)t-5`o#O_Tl2)MbtDbw!~|lQP|uDWMskmHj_eOv zo~>`Z55L=s4>lInh!J}Q#pnJ;idZtlAsD`Qi^Zmuzl!7{)2JOv^!pg_6S3Bm~dNTFcYI5^L;(TRg^JzI%>m zJ3w{MkvG%}b#hR$j>1!+l>%I2iFHyB)ixOKLOl`jU%Y?&;luZDuGSY0?+YMYa-)_R zbuxqE5O7NYjXkhu;k%WvJK@erHEnYBX>AarhZay|X7Eshb)7ZE!Ij%%T+@lje*0d3 z_~DUv8oPv&nGiU4kc|v0MG%|xG2C+YzVKY2&hS1raJS!Oi#~@)j*ROoSjieHwrP$Y0KDn2h_PJZZ?)tsRn5i)n`L# zRKcbUo-?ITz0Pd=IG(Dp{O0YO$NYG**-GgJ-b6sr2xb(JC`}4d#M;tgZjjF5!Z%?z zUt**+s*TVk zvdT=9yDmg`1D?z-_n_Z>bKoeSRz-|zK^%ReG>MCkuU)6Pj}%J15%Qd(P9yR2DC}E* zbM-HO|KFRx@4h;+ecMl%&QKXVNkCLPcvu1VFsF0rU6yhAW1y$1nMX?4?TM$%noSeB zn}S*?U~P^_H}v~RSq`&5t!G|MXmcqW$ZsWeLJy;RLk=n^CKb$eqLvzzi&HDdu|Jh3x?jq7*Xs-Vbyd0VKR)8& z$H+}t7^&I>)uxc{1-;KaEymp9(g2P`znqZG+UTiJ5MxZ4ilS6tLmEamvy?*Q8lIr! z9CdP2h>!hs;hkG{^w}LGIe~i|$UTn`qh{)hf^F0@w}s6jHs5_3nun3Y3uly23UsO> z);WZ0$x-VO%+K-8mzCK2Q{9#etqoqy7&K+Va(8g#s9K{AP7Cub)HA>HjUu+aPae~x zDsm1LMM8$gUNEP$(v&NUAHn=&?|hv?{M(Q2Z}wgr>N-MKBFOLo3b}zJ35rwisZ^rM z3*%jAr+UY?iK&|(n*>Elj%}bNsh~6joN`7l<}F(zC0z*KM>$nS=sx5hfBf%9BSVnx(oFj#FwKnx0Cd}$zUZzk2Qnb8#v^N z+PXKHA}x)D@@~9yRR10LmP1QDQ_hOc*+8)e=-MWVr<_KmQFT7X_GHcKKKkw;P)n#a z^FY$5pqL%jTe%6OGRNLSl^s-18};2s{_}gi{;*zyxIvUgnI37vxOGrS4C~TS#6_r0 zyBj#{ggY(Ozg~U#q;IbN_t-IUG@@6k5lpjzLyp; z!g&+vWCP?)*tB~U_dH@1_d}@DrENBGk6JI1LRF>A@LJ-UcY)2Cka}vPQ6T4X!~1Cb zON!Z33mN&zwQ#S1GXz4rOWRC7?NsCbY&B;}zwIt;b7pb3nDLATau5GfhW00a<9b-l ze0J5`6mS7KkKI$I)tY!WR4oZaIY46QC^fgBGOAJ96tM|=!ie$FGWN9e_KXU6fP1b6 z{-BUOyXnNL1uqCy6hvI1A_F|EwPaE$&0{2-wAA#&TE01v zTn1*P0HT4$JOq%wqG05<>m3FS#v5i9atu4^uBUpnmbr1`In<{vw zqFQER-lO8g3kv>p^}~-J|E%xc?YAcCHYwPE&ZZ#E6+*4T;^-bJwjjE2y+b>L(QH8P zvW*&hvt|aFrJ-5AeR4OD(h*=>;XrRC2?FQ19`U{bq&Onqjk<|440D9NQEUusLg zO#WU_cFp8&6~yDo#0z<>nk_sV>AcH+2J&fldBmA&>4YXjKqVL0qz1RzI8-L_FK5f& zeE9DEOxp1?y&cW7dLq=BB1o;HwH_fe#1QHX^5stdpKqXFR@G_O zd|Mhn|96;y*ka&fdE#dAzWhc8r50lp^LgRONr1Z}e* z&FUbj8OqFvr8u|Z9y>qHHeH79r;m5bf#9DnT0eVZBXar z>7M#Z^h?P2f%bo#B|b{XBZ2?+>+$LJH1hU>?BWDEik|(7W($b(0FfUGda}f3BN!ygU!|am8P*^0EReImv zmbUx=<1*vlSGeP+Z_JXpl@y`14Umrv={Z50&o+wHqRT5k0(CKhUxxnu=T^e7G*w_V zFlY{k)=}VQ7Ny0J+hWEZ<6Ovhcnq2LxlQ(xdxd9JkgLOj2aG;*ie1UlJj(4dgYRR^ zzutWO`=9i~KYsWA=I;H?$Njf#I@P-lkk9}{bC^m%94x(XD%qDv`&ryeQQx?@{+-{B zO&`2>S^s$V>3#Q;3pJsYoJ#Bvnhvg_klYo866er*AHFoxmFU-!apI(YADuh}G!+Gx z79lJJvnzGu%BhTJs97qx+_3SWk{{>?KN#CcL_!6z1dzGFya-y-mSe0j+hS^ufnCnd zehyTA#os5Ia_lXLz^OFQm=TtOpg6TKYV6j+Li7aStCCFzE7FO&HNtEqgQ_y5RzV82 zlOzi|$J1;tXIFNSztfM_Y(}#vaHve2PzM$DGutW)#od7*j? z?t&h}{UK#PyZQJh|F8}B?!WywM3Xe!yEGINp-s(j6*bMAds^Q9QLu}VTs}O^MQ?*= zg4E_9lLo6zP@7ZbCLxEuaC?ApVM=MAQ%@F67^TGu$|a)pkPt@mtdxQ^KHzk@R=0eZ z_s5{rQy4=q)h8%dh9))SR46z}GYN6OHA=lWBW3S@fCF zOU|I73{9n@mk}lxOKs=@(aVPxmJfgO?!R}R4z}=18^Sb@0tZkqgJmMjGBdNg<=q7R z5b0Iu9e?4&JN42DExUkb?J!Rj-KT2QSw!mzmap@|e|PuYr|=I2a9zw= z{QP!v;>k8i!K!a0s2Glfymq-Ibdg?49f^$^3P!oKvleZ&j9%J-A2AK$9Id*afB zkZT+?k>(IkPXtvd$gyOVYUHd7*9UNyj`TmVWXN-}w;Yg|2&A#XMis=F=5Vw4_1NNz zuMn+S``nh5_TT8gZvJ+^uy}k>Z8@YIqo7X?pri$@hJw;!s8eG~zL?2Fz)KFQ zC$RV5w{(tyLPV+Npr($-p`p~+qcdri_7vMo#iLJvpSXjeb29D@a}S^#c&md@Bqi}t zB-=7^Ig5J<>U#l-lOAH4*(7BIs~wcc(Z;OEdC+VnwH%io{}}P&uHhyj?`H9L&SiAZ z)}pv#NQfXV1f|BX=t5I;1X-T)0p_Lc=<>lXJM}c-SlcM<6;xP2-3nA=2E`E?xh7^` z2tPu+_yX_F^Vtl3XPz)?3c-6tpj1G0beNQmGO2Ql?6ix6KE!<46F!mfvoLR~^>552%3?VP{o7Tb3fp7)H-dI3)tUok2_4RCghTvPnW__F4LndRH% zdHr)!3_t(=ci$bILY9(4BrUMY4jwkp8h6YPW1X6(m1V?x2(br$emm1kh@Kg$}-0Rw>d)`3a^^LRb_XbM(Y$p);V^|@GFq7 zC+mqz`RbSw3mT^Y)=(fRI*5x7vCN`+OwQG1{A9avXODbyPpO26>O8^S)rNTyzh@mFp znnM^%SY#FU+e$l;WjJyPMGLA_1`ihq&54pZy2m_57^@ZTs<^7q!;=Hln~$2|aSm{f z6*{VbHTy_4nvJFT9mBc~^%Eyw%s8`ahSk!*!RHbUjzRheF0Ils4jv#~$-w^U=Hom6 zfgYrSddsN`VHP4V#Q{yDBJ@-et+s!WKclzJ8wpgokZ0(diQayx*GH zFvSYX>LAe?d&!z@>Gy|dukKJDtML0{JaI$&Ov+X#W|R!>rR?^Br4}TG(o$Qx`6}#d zOFJ`>r&vOty&$AKz}^%_IU;lLQb%u9mYL#8^lQuega7mHiJg1N*_djE`J7Z-3xKYP8y|q|`??pw zSbYDNsaor!J|Fq4fA|8(FYemQ%CGU0o{##_U0HK@&H=!_L3?4VUolc&2J`|}Y}Lqg zep%u#H~x5j+Pi=FJb65EtI_n}5~-q74938uO?rkuGlNDZJOC|J`@*Zu*z{_Ian22FJGS zZXu42Ryv`CNwZZ-!@|OQALv?y(?KeIEf!mWGBGHO4&z234&Ag!@8JaFbS=txk8%sS zx9*JEvV!KA&}0cZqxKX%#~{Zk=W9`>J<5@tyLm_RFhRu_*7HQOSvY$oV?R!ru0^@- zQPz-4D^$T#Cs?(h^(-)-W-)1~@dV|1Ey``bVf4bW%!ZJnf@g?m*%{4-j#Q{}rQ?*_ zwJ2{!;SYE3Zl1iYlp_%}@2IW`G`vEK7Su6K)y>MZdl@Uy-%{GaP3}Fm=Dnkg9zkIe zbh;zd(Ogq2l*2Q$UCjnQR8IQDpN{)QpL63#ZeU@1}!-h zbjle-&d@d!YzPesIcVeKD&B_vzU9)Hv#2xrECfoqL)aNJdrd?#E#;^9U(Z(U>dX5A zl8nlYAe|z}V@9j7fn%ZC%5>`WNdZ^$o_6)oehZR0WaNxgVg%=0pgA%|6EC@x-iAFX z;A+0q=UK?{p3o}KG^4`{7f@%1292n(_A;l|Q5HAlEbiOLNe8DBd28GUX!Zn>PB8I| z+;}EyGt3@W>A7AHd0cNk+@HgZQh)@lASnZu;zX}XnkZ?Oyh_m3dd!Jrfe>0E?Ex(( z18Fg|PKMF5bV*dD`y%87;ML~Q%l*&({`hW4;Y!v^M((kKf;bulfoRm`D$#Z~Je9fR%%Cn6TB@K)YQ4o&dy<9qSBTdqd9cAvi{+UL zYG`3`%NtQg&olMmsia!=S-ze@{ZhqlgTuj4EoO-(T1gWmZ9ug+dNGe0v^b}Q>;cm2 zQ$8^&^CX>F;gc#Tk)l>VJ!zAJZ7;fba+a~^3@Myk|6eK@SuiXJ*euM~O2 z;~K8uzHKY`^x=qqGiUE?6HP_{Ng-Htf#pdd1#>Z4NbewC)1&!P!{+(?ZF>vC=i|%w zS=Z7nl^URVR8Z>^l0pE@>^{1tYPPUGjd=wb$J@FXl|07;r8GfYB1A&Lw3wuI9n&y$;4aTdle0{BAzw?<6NfaVdO%X)1 z!K_6jvy{Y~D9t^duNnLNT1P(EZ4gp4Cvai{Rf&+;2po&dIzk!M_KCjYEa+<;bZ`)| zSq>qg#b%&U49%)Q#wcY@vX&2szG8gfYaP5#G*cTag3yh@GcasqLJh@o%5er82SoV_ zM9Usg^%LUdGgRK(t(e==X1LmR;K)b~`iAB+i9ijVuo&*ZVM% zLmCZGWb2$L_p}IkUL{u$y4j!pvzy_6?Asm18@u}9j8dsO2U$XkRKPPN$Sj6X1~J7- zJuGJBnYFyW)L(Cgy3NNwx=&X*d&PFnqB=N%ln2htpPM@9vdfv)KNvpv!9H ziUTT+!d(0rtx0za80%RcqK@Dl2ZX3HIJ|)5y>)- zl5A2br}?H=BK(uP_ZxeU53Mu2i+r>>>SVswt8y)NP1?y3Eb$;>LfgX0{a88VvKg!U@2 z(kS8!HnXBAl-y{HE? ztp@VuP%Z_e#dwO2vRlGkf&4l`{^;)(AMkjanL%rykdcDe?x=Ff9hJIP5}rfGBH$45 zb(_tXYRj zkCwgUC78Ji`?bU@d&Z6*Gu#u0IwYfbP>_nk#uUUxB9(;6bWv~$@H(_l)GI<0ZM{sh$S2spF755taTCO0 zG!EJ@IXbBK2^GEO+V_jJoOQdNf%Ron{02U2oRF8mUF2-fP^NlKq9hnp^47!O^%^i!3?T-kxN{lK17A+SKXqdz`u3;a zfARy$MPpavh&U~QT4<19g3L8XO_sgRh4MbsYmz+vcvF@hIAqM$7{pQ`wN_}dIwWYH zev<2@pX=i7-2ThoZ;xsDsoyTw1svp%l~9x&NwtC03UrD=xg;xDrR{9$DZtCMxU;X=aQ6yqFGfCmxe}tVhGJN zv-H^(^Y#ejvc%r|xal9CXb9}u)k1~ZjLS7AZ8S$tWhSE{mCHi%A>gYugd_L|(RHDk zvI$bJ6(mK`LQrTX&hDc}9#1n)uTA-Q+pUSKQ7jPC1gad-Mh<90m@*g6y7alTxR<2= z2jBJ(KW{QPdYv2zt#bqoDNv6FqbAdINRG?Y`7G{r=pXFUP@N-rhwvz%G6y7yA}dJ_ zQ;SDg#s9L+XIIZ^3s|!G$f+RCp`bVmqzy*OW4PvCQ`1#4F5Q^^e0$UHhJU#@=Tx|> zw$NNET51tATZEM^u;Q89s9JYxk*5(aM)|aBI?^E1GSH-UQ11a&Y+z8+7%j{E@|0i0 zA$`&fm0~n#L|B>*@=Q>P1EmxSIRs*wJ8rM!e6Ddhy|h|WCCr`~#M~h^4Q13xg>%&11h7>Ulo99WFiC13K6kG|Pc{pV}O+LBHC4%-0YhUJINH2iOWd+&eKkG}ip_##cn zwGAEv!&pIcWEhi!#*DSaswpo1!)d_JReo=u%u5Wy^97{?=Tmx5L!hk>5aqCJjSn%C z3`<=(Jgq2QP15eWeJj^PsA*=T7zGrlp}BR$I)hqi$qFqBJ_B5v@ZlcAm}V{vvsyvD z5hSDm$w|69g&yQFg_}vOc_gy-e(4>RglJs)+i$M)@P12TIEwJuHO2;R{g7+gO%5ol%%MFy9kJ_ zL3IRBi6Y`fhUlW?DBRVp&)3@jxEaU&Aa168k}9g!3gS8-DP%OMlPpJ_p)G1o;JvY& z{dQJ;c*=92M6aM$D#Sa(#!M14Q7HLIJy&mRKiJ;FxThlXh^?jpo83Xh3@uNAvW4QE zJ%zZac!Y9o>Oa)?<468Z|LbGxlKtvV$AQaaCFpD+Au<(ErU5Cfqj=^NY6(7<7xEP9 z75%0MB!2tdeeU}~AU`P0>L_XjH1mXcO^{eqF7B>ui=acStB)!Vs!sblW~$LNU{o?t z?*(mgMzr9@Bc_`BNgY@3B})qb!C577ki~$a+(0!2D0xIKc{J%U^H>Iz$1qp7Sxc>d z@FU$L#hPQAiZnt8B@fUx6xsXWqE(dYB4HowO?t(B-J6|0{T~NPino>;C*;r!6lkE; zm|(fu$RX9QS2iA^y|I*oQDlmaFgsdK5j3Kp_0TYCkY4iaBgd0k-e5|!)INT6ziU+Y zPa*0YDXR;jg$ycFV5Je1Q+COHc3V8iQ+RJA=j6e_iM`GdQJ3RP>wvZ>UZQO^U{K417AqmlnJjSO8Wy|u5ajBH`N#j%oBiI>f~MHC!Sl$VQ8HS~hQQX8 zbIWRTVg3;1>V4!VH~wxMB-YnLQWPV#3~H%E0}F<6Wy_v>Sg1cnc@yd>eWY~;){Y~VAmG%)Ax6uzB||@Z^JD_G;a#3JYdrqnyX1DLpUvN)nk-v zQ~&wx+(hD!#T!y(w=xJtlY>$fXp01=5(dv8vfJjrhxH}_ho3J=e7pUg$NEI?p0nkO zFoZ#IDva{LP;RYfx3D+C-NSs79%Qyy~$(-rF8sQ3Kh z&bBRQ-;EqGR-=yY96&}H%}awtNi43Mce(icIM=5CEB$oa|Ni}czyICe+lj^2X))zA z3fyZ36|az5B4X?#M6NZ-Vw2AUUt8c|>?@WryjMnUse^-){$zx~eN>#+ce$0jik1!*u4nV@N$&@l5zQDWt#N34N< z1Cf9H?`_}w_~GMwy}A9kug;PMn;{~Hl0cput+as-ef?q~emz zQCnh=_Kr53k>VI5lqsd2kaX=u&*Rna+X8LeVxkH&W{{^0iAj)ah?!J)gmGNYTP=D1 z>Tdb(V-8O99>SCawc;Sl1=2jjQnns64(*G>d4TpNuFa#$Ph^28P2R*F) zumjPc(t2`as|?bbVU`1GE`^wCN?cB>d4vA*cs`Dv1^tN*Nz*2LIDizwT zf~F3%FcVbN3iV;8^pqUFzMRc6=^tD_9E3frx0E;#{J!7B>}Wg*R=G3vN}<+8$^q8( z!yemT-+vVp$XhkEkO{=OL)<1J1%-xo=haguExNc8r+Yh)>v>8)jjN}foR-qCU zb;u~xyOzld^M@!`54he}y1g^|iG7kOrC4cX^hx*KyTWR2C_Z{DF@~?FJRL!Ov*n3< z5=+=&dkx>Fz}a2=BBR6}94Q-t%mt#eBh=IrE5)|+p`TaDwS{kUZ1=DZKd(zF3HQ3;x&Cwz#O#uaFw4edf%50@(X}Roizj=$r*QM5j z9I?zH#y-K_Cuk&sYUs!mI;S8t@z`hoCd;i$wfW%T*OYT)SfUIv9}tcODOuF2J!to1 z^snxsEY%)&hAWBmkQ$0|1|=3~_J)$ioTUm`>4zfT%on~-%Rio{LlmU<=BT4~P?`av zy<&2xIeQ=0u{e6;!&R4ee;Elr&lwPp9>~(WLmE!g6AQ zzCTEFo7MAd-Jp#tC^v%!tB5@$jjiN4!y@S@-t`mSj;8R8+^SP@L=pj|nP9UJ66Z-G zWYhP|*4rfS{PE^*w>R^q>+Q$iemuNuUZiGYHFTZ^DnronbPUaN#+E5CEi#S+zP+Hd zuV_>oR0(;84B{y;4HKPwh|I0AmOOZm_w`uqeoj@Umc~OaGJS|*7jT4f^+?xqovw|o-(Dnx9H$P z6%>lVj2&cUQm)-|ILiNuePugsTYh>fJ-QN6E*;!w0~N`z(G?o!aGNr0*SsF!y-kYr zFK_SueY^a)WDy4KzlF)HtCzXja!|x_HM=fnINA{}G4dtCX`_uM|2wjsoJI zVPXZExdif9s)j>F*WZ|Vtnw47BZYhK)iK9xASnv%-e5h)ID&eeM-*LZdE(*D+ZDR@ zcZaS!8tpXR?wfBdzuV3C%`jg!30)59S2t&metQPm{UH6VaQC~2z7^!i{+(}c2VVz> zZ+@5e$>87os6KDQxQMu~n+Glh_9b`!LU3!37(9=6EM@)dj{mc;o0j&?uXLNo{mswo ze%!wZ$bHD>?4c89vF_80zZGOj@x6!ve4K!Kk;k>m0R2{&{lv>}ZtIt@@GH{lz5)4R z-r4!HP*+14>)^m|Yav@F+Gg&Tywp&B~_I|ZpU;Ae3^<_Eo8OQ9d1O3&?<;9oQ z@%Ov4H;0`Exw*sud_O;a*=5|7M^V!AH_)BOyM*id$CW{_7sB5MTfV`? z_!8^5j4OK|X}E~Tu_k2jO_=uv^Cf39>AQEE>GJn`_wPRX_{-hRclVuq`}y(ElXGmn zrUH{P!8!&+Jt0gg+DA({EekPcP`BSdceZ>vQ76tE>{GNhgZ3W5)E!!Rp!X^x*3v?k z720;-*O2(#cR#<~oc6El-klV4nbdKz@61$KPRBDm{me zS!)B&Y!J5&Et$Q}!pV50#_PSu?LXhY{qS#pfAT_)QKgkwk;bT?E*+L^pz(-R*{tTg z$T|Xcjkk5A)`N`ZASuYK=y_IfZ3+otfGGw^-867Ktsz}W#2e?RWp&c*!el8|B(&9|dEK0QP2(I0PJHpvJY3`XcBH>Koa$&(*KDX_Z1r!wErV z02gYoApz1{rAFaiWreou*|W`@@*jWf@7-^=AN=@sZ2viNaK_f4`3M6|d@NUAwvrP# z%qcNht$8luo`!u3S?4o2V+)!~MwzLCiZ`fRK@aMZo$BcIUfeqHYfJp|&ks&HX=M%> zsJS;O+q~w4ifjtTJ*5p4qo&(zd8?=kadMKg#2kurk^rB<}|9 zqR?3@R@Bn-nz2ky&~`qL_r>yVhshK(Ey2irf^`;XD}vU7iM@@vy+-FN#5p|K7h6Ag zcil~|OYg{wgW9MqAr$Y5(pH91TWCriiR$`%7yePib2P6nrhj(z@us?e{N1Phqe3!9zAp@f7Gcl6Npix8)c?9*`*w)OA595ln@emb4<;M%aCzZy@R3Q^ivY4=xpp zd4Vcd=yXCViH%ER<4r)}LEJYJb|mwKtxc;6uX%wMF>FX6dlJz)vTtuCe-QVrg_Rv; zu_kp|309_qvIsP^z(*a+n&djxNy^ReB^IDL|z-go!acYfjek*k&gm zfjg&+1J@0e;#9bI)SwBTqd{~OP}3E>*2tn8`gdW@N&DWe(o#$tUC_na=7Mvpv7k~5 z#}F6Vn+LsJAGyDCj2?A}50u&ysOABcH9^&bSE@`j@6QbYjn8f z3bwH2qZHkr&b>iR9O}!wT27q=S*(F_uaGt~ig@T8txUIF>Syo7f4Z9S{)hGt^Q(8) z5%SnA|5U1!E)AZWf!1_*RL7t~DRQ+hx4Rt2JZnwt8NYvMtfP^0!%E3PmIo}2hKL(~ z+et_C2j#t;1Ne9_8#(*3SsR10Bb|%ARY+-u zVBI2l9!dtIUF^(Zr+VBniV~A&M-Pg$m z>*_E6{BY<-(-oz$w1U-Wfod-BVgic7y_amJo0>R=cTOQU-r=B+3@L0i8F=&srncak z1=VI*(bMv}aWgw$=XH}eR*wx_;=D@52v49y3qDqXo35sPip{ml|I7o_waJ?-?C(DQ zBGQhl=f%)G!C4} zHsUdpq194B6baT=gRYWSqd7F$M#~P;`9eD1m^_-8koxFc0~)!2taeE84x3zg+HBVP zK^5ms6S=j0y;U>fz^(8@NA$iLTIfPGad!>8cn#5vWvx=m>+DD!%rPByE`eYRc0E#pw0|RB}4i!L?c(9t+mmQi#W&h@PJv`^-8tZUaCTC z&Y&g>?xdg|X)fofHI9p*w-Ld+PKj36lsje~87w71nFHN&>#Z`+l#Ywww-IsV&Ys0H zui}VA2AVm+Yc?43&{D=I%a2MqV-VoD@x8t-GZhg>%3)yYvfZx9%Trs$r9Q0aTwVT4 zL}EW>H?ORQ-jzVc1{qCYAzi6k)9vi)E6lm}*zedYdnsMnsYOO1UZA`xw5prlh3wW0|&+XRa$d`^R8 zU!hA?EgvHOG*^0JGXE{_ld|t0hxm^Z^THp6`ZX!{=_iUdKwmOrUjXQv)YNC9os@0* zD8$q9AfE^M0>`{Iz&rVRPeb|DKVPUaPD+G(6yj%;Cl>tXFpxxO^xyNRFQ9a&@Ef3qH0 z(_{rfBZEp`kVb)^o~ZXZeH-U|5ceyEC(ZDmFZVase6GH`xxQyRhr3sJ3w8FoFqj+^ zQb1!Uq82sELadvR`y(v8X%T#$Zr{#{uRi|$>f^@;>fUYERC|9Mo$_|&BK{6}EO(C-s zYbV+1Khe`a8~!&Zde&zdI>o!ZxS6^mO9= z-~ay4@3uesyfnwp5B~Tj(Dw2E%)dOesj5I{G4S+`n3Iu4Q0i+G-lnlU#>BzDd}NP% zjpF#nKkhAy-lwy~KqhM-H-l0!G;6(1RrR%*ah#0*|56ZpH*AwNi8&Ed1jOB7wb9K# zm1bMHwfU%$C@)eJC-%gHCGl|UeRPk1gq?r<SnNAm8U@#+2hPk+TvrnJfd8d5le&T z8K9m9yw5u$Ty4r2XX&DRkkDOY_ zN=iK7g*#}~fKKmNO?;@S#dZ>M59DQues>k$efoADe^584HknnCaxS2(28rshDA|_z zEMuel80!C#^xftz%VLmr5Jv)O4=77PQOhfeWSe|~_RDJQKZ=jz!_`0b^9Hpf=2aY$ zgg})DPNSd*&B$uPscqEm;9RJ@{o3SKXI0Er6DYL-x15pFm@_v|!EsRErPklpmmaRh z`RHoA#G&acyL(1uYfD-g0Uc|A%F56zjJ0a_&RO!T2NhrJi2Rk};lW6KB+aWrIXZ|$ zA+y{lmaNRi-Swd2OB{$cf4;pTez$5z_dXKCYaO6I7F5$hb6L#2&(-rr=switiY$At znJ{rlj^t^6ev~{Cbgii*>Vx%|%1d)j-%zVNGQDUu<%Bf2f@&Wy^$H%frc?@+*#z+%uwX~AQL|78O+O~~GF{R>!M$UfEm4*hD4RfCny|78Y8oSD zCZ2_lX}-vX!5xN2)&)J!StF2go1m-{QpLc%jYXZUPC2Ie620-wHT>`H4PRNzsJ%@v zox5fa z)RGsdwgz7#qxxtrWprI~T==Cn?ZZ>+#kodd!Ro7nG!?j{3hrx+KHCb}^JSMfv;OUe z_!!@P+Poce`)<+UnOHt?CboxnSv9&(@80=mda~+EoP-`_xwrMCqvW0|T*?Af4tT4C zlGhYAsw4GN)L+(gbf4xQ{`-$O5*1mtvRg9L1;K_<8$1{(#sEoDcv!_)U45wLsGIuVL%hs5*v%n@O?dh4Z0b(>^8_+@53d|Gv=5{%uv+SSQ?Qf?6q%#utHm;0jV}gn`7`bD1(P@zqZO?-50$pCac<{!2t)#tB#i}|$LJl!+ zP;G7`Z7i!Bt;aDh&xhRS7~~O-;X-@+;Vx`BEl!rOoGM6c!OaYIok(syf`bIw(zBUUb;Ru*)5fn}p=tt;hrg7!S^)K(Umx!G7pm0s9B z_71u4&ws^-Pgft~@A2Jji~Q%u2O2x8u~}m*D;c!bfM;eTnpz~~(qz-wpKR~{pt!D+ zSdWJBqKv579Ia*sjZ&aKJG$iQqfVJp9xkA33l|#EJB9GxR_kg)O(uqE*9Kl?ep97db3z4Ek>Q0L8~itq=7J7);eeA zv9I`Y6LxVS^IZK-hcyixfDnYF|RS5s| zn=qiqHek4`ySC7jGBO*1Viag0LDW^!q*i^q340LjvWB8R+4bK&P|veupU#BTqJm-y zth5Rn%Z9l1&u_eag}m%V>uprwa3Iyfn`unUC=0YkfvE|U!nzQxT<1pXSENgfq}~#H zFqB$m3~>)wuLkPbpfnk&_8B&3lGJw9UU)2Z!|~8Gl2r4Yo-w>Qh*pQ{8kj|`NY8Vq z?}~ld$>X=DB%h$~r*`D{;%h+PPBC5)|FnCP9%*6kn8zy^*=`X%d^gThVPC%Fzhb{e zseehFJmE&AXCS`@_1n~$SL{-!WiY;yrPnI2SLy%{r@*~}mDehx*XRvM zgSYNI*2b4?ju&n{PuksoaR!^Y(W~K}euL{%OuRyg>~G?oa2eoZjhwIt_Y#J_4X{0Y zE$OqcPuT%EgZb;Q@hf@Zy9QsQH*PJw{9NiLit*BI__UzQi&(lFi+I^GzghUdZXdk$ zB(LFQZ-HOg%kHmCkFI(D9FCv=@x#?0-v9p7hp@k2f9n0af9-9rdonj^2DNa|tOjLG zNU260)}w5nHaHA+ZRIHo@>_D(|J;-0xuWIPTZ6CCL8%d>dq?9|-E$sMVnb{f=wVX( zHL>NiMSAeUpkK$Qf4~25d-c%oZ|<1;^zr6Srt1r*-@m(Qyx+yU?S*4IqWa8Kvvovh z1EmmHR)zFb$JC}V>PFNNxUIGCeI@Xe;y;=GUb59nX_nf-*#pFxpuI3EbBiopS<-#{ z%ee*IcEcmr9eQn%s6*5pRBD4Z8|ZnaT--^v2UbskKC`T!*togydq>eU@;+9A%$`Bi z7DPscD`z1qvyHh?bT8_;#aug+_;gQ2HQ}791SAH5$_l7^LCK-nyRWg``8gT?^#tDB z2Kkrk`OfACd$0RMVRy%eSH=Qm$vCyltgB#JSk0s{|^k zfpTTIv%tH0Y1C)kj>Jdc&P~7UJ%|=Ic@${Z0iw*1Vi|QTTaDVtTJGb2z9zFZSa%yc zg-hXvyxIh@3e>q{Qn8fsT$S`b0q1K#KmTssL{|>v2lL9tO%2S;K{6(^r-p9YX?4#m zywPwR@@z7;ceDO3MqK^to@D(fa}F!WJr~djg6FP~(YTB@bJ}LHoQ!`ifrn?dp`#Ux zKqe)Sl??YD5EfmdbDp|!s)ylTlm52E{v3XA0IRi^K9iu*WKgFDo82LE2Ky+nL^jO7 zL3;HeY}eHObCWZTh>oR0K$Hw>lhJE0lBaemvB&!Lhp}B-buR;U>Wt;+*%qjhLP$C^ z=QUQ7%-Z*8zy46RW9!IZCOJzLF^pCew30#6a!6hyF;|gR_Q;=WI6Go-x7|cdYj({@ zk_IRxgY{fc`dp^biRON5KiiP@)#Rg`DRmj8*Z>W3P>BhR*^y)EQd(BGx86O%!rP17 ztvb;WsjZ1Q+X7kYkiHa4!)c06sq>L4U$ZW6B8~Ck0p}alh89YYTpb*1qDRiKC^hjK zy|28{w8cB43*Hz!%{4R~WhKtYBQLOY194WAEV<>BwRpdy$iDq8BX>O-LzqYJR1n*cYDB+V7Eae8;*&ezB` z_MTTMey37SKz>D0x8Hn!e7gGA)u;d7H0}7$Ue;0dM6(fS2!pCNSgRd*YOkw>&+WqG zFx;!w$sv1(qf@TBMjaJNWPqv&q*|bG;anvWsokgI^`ldF%^q)AGR3F_!K4SsJ3+Mx zvalDDHL);7!2f1mtsxy7wI$;zg-h z#~QjoOEPTOL}gyFI7jQg5p)>!^`nHFZ|>RrkRrAAMd*_oXiC7l6D;*P`^Y|Q)8p@8 zouL-4UF4DAW>YI=tco?dgM>S5Rl#b}XEbA{4do5W8A6*IGl$oNMP~}`j8!v%W>VN( z32FJ%)^Gk@->^MLSo2#u`)?3XO`Z~T76Azp+(t#IDJ$g|rPOceo+G5Wv2))C#Nh_ zs?Fo%=}hF0PY$X}vZx6hO+Y0vL{`Ea!m~u-8Q=0hZ~XO$#l35B$|yoyKt2a3f}p(_ z#>zE?PAyUI*Kn>L@XPBAz4&f#pM5RPm1@UaxzJYgJ<{3X0Z`)0PR(`*$cvATDc28nxXj52C~5;FON6b-GxtybU6r5*-8kEA1yIZ#PH$k3t$$QHwy8!EF!8k1JhZ)BWr zVXKc)1oe(VZ;WK=}@kQM(llRqp>r9oHI0h(BR(kGV|2c1It)IX&Q9p z8$mK{g>tHQ6`XVD=vXUX(tFjmpz0YES>PiHgws%)D|3r2>2tL2uSN3i{m0{j@(AxT zQ^!mupq?r$X~vLIM$*i_O{v^LJkRL+Kua$%$mgh-Y7AmFsN{?pg(h*WJ#2!x!wWB@F4SAqnI&)8pLrYO+T4Sy$`N^19RbVUL6a(^G=)rd zmF$zcePw^vCFK`;o1LH^{`2Ff_kX`Wi*Pk>O+R=DeyzCvj|8a{1DSV-*M`W+7Bxzr zAI*GzuZpCPk1KWv&!(>E$C+pJzlP;NI#Jq3&$j zJ*A1=em&(h@qrKD6!g0&UwEIvUZ4=4(}8aR zUcg1YpbL0#CH8ovC-%25pZ`U~KfeF&x+y&a69T7y8{A@BjXH{CxBE-X}0a z@>+Reuw~Go1Q|uJYOL8bwX!y=*TZ0&pFQ>tp%;*`cQnbeV}V2h z+6rS9R^wjFWZtN{2lK3=wx)kRca)UUik3v^kqRi~4#~A)TJ~ny)qPVxdq8hP|46LJ za@TN!X=hN23g_lXvexWUjaM92@fQ8&{#*3Jrmr~&o>v3WTF})8qMHpO*7>{F5$fRuPe!Dw+-h4+}^vn}KYFNOGw_B)$b@2`W3w_kUC3YVN^ zE_kg0%FQ617xGwDEXtI+^(otrZ@^Bg$4AgQ+zfenvs?nL4+k|1n1!OTW?j-^E!wcV zgYqbn_g2IPX!GUN;{IBBKmYRW_ow~i`ZN3Q+tNxjz^fa`DnUzOm@qFP&nCW+w}30`f^Bc$nUq>rSFdn(JD!3GUbrwnN=L&Chz z+{3on%trxVU%+jL|IOO`$qxV7D3#I!v(FB?p{~S)#;NMC+-=*)kKjG}7TsskKXR^{ zTCVI9X;}f~HlW!FBL~T_)bhypsyJI+9IS*=D|_Y!O|yV35iAxXMMlcc{CswYoSOX9E!vT+>2$$+42B z+4Et_XK;+0-_hPt?mjBnL<$|C;sqvipoSzRr8ILnO!*9Maq~Ogq3j&Vt1vi(LCgxv zX(EqaB-gG>+hNLlF3Njr=8?OS+5-2HL5&K0j6k%JnwMnJH=GYZosaa9C{q`qXdN|{ zgI3LO9|e+AB-P$2(J}64c6x^eB-K0@XKV@GxJA_uFT6&B!b_KkN&pr|m8%0B+ zEKp^(-@%l`}x@s~gT{y+W^_QAf}8+v$_)O8iKW&$cKP~ku-PE$GQ z%Cez<2<{vM(6`opXrJOQ?>}6{(HDqlGOa+OX4^}%%p0W8SgGYCZR6ul#y_jPBV9ae z9cgqBCju=ps2gL$%56^kcU-~p+#*ot9}^xyn_C^dvv@@4h|Buk^^i# zARZ0bm0Mn`)u9_DM-k61;bzBmM}}HX$>&5%CBUO}Shj$dno?$KRcRyRUet3)Ik-Y_ zjwq`;$fj(jC^kqS$&zzQA=3BxpKFcq+0tGvc3Y_xujm#5nl;1C4W3#yR|*!PL0Um%1C-`~ty~jJ;j<~;?V7V$E-itJbP!8G*$uf5@$Ozri+$Q>TQht%)pqB7*0ZKqNW%i$ z>wx89h`a{-8daklqutI&`|!{^WUOpiv645CuLNnLpj=a(QKl~1Cx7N?_m07`f8Sym zsX40K0M!uK%njUX>Dedcai9XuKlT3Yhgk99L(CKA4XZ4oN`zi}0k7^*uY{sQi56SW zo2lL-EWEYE!!Nao)y}0i7#9JT*5IvWj1kRvE$vkwsdQ`T%>^G>=SB^QIZ!%hFq^@o z3S?PCNS4{lBL$zWC;tBGFW=d_o4mH~{_^RsKe>9hzrizC_g*!lxie_2fF{r2*=wPg zWA(L>cMt4Yc6)9fmH1h_`^T|}e(rOnF$H6F0(r@>6%C8K;sYzf=kPcb1bD*hNe{16p9A^T2R!3pmj~B< z&jq?!Cp`!3xlQVqCyux;4gA!HO-}Q&k4F3Kl1@*a_zH681*1FT(VgGyj&Q9lFWyn> z%%JEKQd`GZl4n|78*lc6?m_(a|6Xk*KT+Nf{`)C@YoD$$_wG0JWwWmW*TEo50w0{g zsVs@r#QJ9PavJ!Biavao;3!dO_KG!mfMQg56oU?H%X0Sa^K|W78y8gsH)qg(ALGCw z(Ai6_H4~~)1*N6%wi2}XiZv=(Y+Cqf;1??TaJ@%2N=gML#GphBUp-Jmwdd(#%}>{U zsr7#IXyTCxe06Ws%R*|Yfhswyw?L=Nx>6IGr&Rv87A{Ku!D)T2IXumZnJ7TrGonsyzkzA_f1C zxhrdKbGM;?i3>miZ{3&a-cF~}r!xQvwwb0$n&fu*_q8K6vGqx|Y*$LA56Qi^Iyi?P z36dZPmd#8yorwe7RtD#^U{nbu_vKTg`z+@wF5jl)?KP9Ns-}XLV}N^aFqZ~(%1g;} zw05rK`fW-+?!kHRN{s_9t%6iCEZagJOf<#QNb_9b-=hEiOz!AQjN80}QGDt`nQMW( zR7i_Jnwgd>Sy-Ig8b=L&Ti*Qd%#~(&t?Qa_W%oNL3ZQQot$+xOytyJhu{0 zZGmsR4{UO)XG!EtSW6ms3c(5+a_w`Bscm(8Y7=~0Gsqu?oj#mUTAC?Wv^o`BeZm$E zMDuKoGqLg~`Df#QyV6fw(jbYdW188+{olhv6D zW3-e(Wj3f31&!f#@tD1@=e0xmMjB$*tsm|U)~B=0j#9XTqA9csVMR3Jk>`kX-h%9_ z_JyC`%%3-Y^}UUo-`*5=do_Oj_T#JdYJ95m^HnJV)vd{cDWf145fH}K*Q7i6$*11F)ilYsXY(; z`Et)()qgSY_zv$$6^fr_>UOpDe>L=!DgC8(9-p57KfwP#)@M4bXCt5GC7zA`lwmo2 zPVtnnvSm=485&W+RDBFp{_-T)k6wLv_uBq*)7tNDJ7#?Nv}OL8y_v6X_UQZn`n{jN zw|9SiHJ;^j{`Xt#!SM5&L11r2+(>!-_Wh9yx6-xGu^e7L`B2HQP(v9*I4ap}wxhp= zx)9|b-1L>detZ)*_a1Hr@cUOYHt$~!Z6zBy??i=nqfpy>u5OF-ThDW@`g*IypOyt;_v>&Hpb=g@?J)?H&F^2#7<0?T_rQKAK24&+$FQzOx*QItIc7>FW7*6gmw?1v=$%Eni?4i|b-5btx)~UmQ_d45oIA4Dxl^8=h_h2Y=uU*u};#atI_5I+SQn-%z-jyfJ`PN z&5V-gV4GuPJKfrRHQFb9OS4q04NT$!qB-D}I<&1in$4v%pCo@3pYmk`c3eTz+GEN@ zO<|xJ6HbRf|J3O>n0UpQT|D^GZx?F7Q!WxPP>eiWSj_R=5X&4;(| zKitG|#)#MP{_OyhKy1I?<5+o+EW{)zJ!jCg4oNB?mr@eXI`$_*hcG+zGYi~5hiExq z8nTj>2#_`crEKt)3Q9?{XRf0qJI1tJo@(91*dnD;3^65vG#tLfU=&t!@R&l!sMgC< zrNb#?)?NoKP?;6PULctW=6!i<9L{=-DqWr`A5iUa^S@LwW-J0%Yp_KXlG>VFCFW|! zsPg5heoE{6>-+fd*SD|d_H=G!Z-Q1!0(0+>t^rjlt>jVXJZ#}D<`pCyFTvcyMk7;b zpA4clVa^84eJ*uvwyy$w9PSFle;+n)rndv$t}D6?$E=(|$ri-Dp_{2iqrANDcppW( z8tu&m2a`r-1(_{CMhPCwn9ef$j9x__;C%&Wx3~1zEzYDo8auq%0ChI#B7%4=v$EB- zzo>C0`o(4a;ji|$cymgQ@>(g+46-7iRT(NFkle*AC<)n4&N0+$$~a!Bn4^ey0-JP@ zl?jhAkd~$vmRjDw<8c)2dbBq+ylIe7S(wrs)P&(>cGRkEb(P88AK-n3(Xh8vH?=dP zWEl&@JV9esNJ$AjMW&o8r6ms#ztlot_dM|KUmP~|?AB@;Sk4P1;qasmD?Q1~qvhB| zP7ZJ`wGzBz;)IJA&V@}IGW7yVR^Y_~kz*AtrHwAf7+=`OZ!PV;+3(}s+xLgHnP}Bf zG&81F2X&v&mJF+;}UeCO}afxfb!(^2)P(t7T&@CJ&}q0|gh$H?l+ImY9nF7EyB zT0ZrNLyi23#2$t>psOVW8GKytIl!wP;^m zXSGBATht55nD*|*Wc=vW-~WE|&42Umc5l7uNwwrUR)?rFxYti(Ji%f`Ewq?o_W@4e zU5NVYkFSnxrh8e5`xx?_18|Xd!3Fp2%Bv!BJivuJ>V3rLluj;Wz&O~>JUViOG!g{@@rZe@v+u~7Q9jY=AK1y}spncap1NowI zjyq}%r`bnEunkZj0f|_cwP(pqM#}3B{fjSde_+SMZCZ&so1lv?5SIl{xnrf0bVQrx zpX+cB`;l{8D2ER_8GozD>m~=VMxUpY>D8h zPDm+9NLn@i(ufxgt^L5x2mqztT)7MkZv||cU}4o}d(pQL`92zN`&43l6aA+C~lFks#163M3jmkZ~@V!RN+TL~S0WQ;;d+g0r(N<|QDMp_iRB7!Ga=XsCMyaK&d+aXTcAM8?sF0-W z7#s$g#IO_t%!85i>wy>8Ja$=umKD5sTZZSZkFq~FYUl5 zUviaj-^BJPZbS;3sBQ*QP0$epkEFSFrkDr)<)SNun^;_ok1>B6?>}sEV{`iykyO-` z7@Ug2k}r%o%*mrJ-Svn=oQqKX>3@#ze%Ew09RwlIpkW2tTZKA{a%!XRJ>4zDC3nA{ z(GS0Qt8*2i3K=1wJSuDuL7Ix>xu#P0 z{F&lKcfX(EY4hMj5o>9H201usgHkk%%5APD9;<(*c+rHCpZ@2J4Z1WEuQ||y3%Ibt z-6jeZYdS}jA)o19ZG*lubviR6M{sBth*|-a&d^Xs&!sKuNqS44SzjY7V`t@bMn;`& z1`p&20&!c=868nbtMiaZ^)ufqL=+B%fcXTH~nDBP~~e)Im-%_lr|nTE42 zCR1>(0p<|ssEisit>hW8Ux*z5U1-H{YvZ?XKfF4|RM^5BW30;HXcN|(q4w#y=E!}& z*!_ZXIhr?vBfkIUFR$ackFz=^u`9B#3|ft0JrSZzOSH0-vGd7yp)TpDlRZ#LKiJHky>{9q~d%7 z*ARE&T5R`LH76|h49cZKbOb1@Qh1tcY{gtY>ELJI{oUUD_I-SaHzR%$c3YxvLw$PE zH4U{8fw>!e7KM09v{+XeV@Lfc+!cv$wt8YZ<}^$#3XV}AISQ1L+p;7&)&tBh<-w1c zs)s{(Qlx4I9#+636?m75(n@G9$}Q^y)GrkCyl3jD>nS<6F5-wP3Lc|EO*@9??vYax zpGSCK)cb7gY@g*3skL`S;}u}a2G`k;gE|=rN4Jx#FSJuUVrY|&*y>8DO(abdT+4ul zEl8@St7#GTle90idpu(3$N&C#^XGO6P=iaeo>69=;7Ju?5-_S{QmDkf4Eh787h4i+ z4W0<|R<6|-!-NeyIYB%KE%h=xu~k3%4KAOvc-q`HA9tltPN=>XxXuPkOTd}JYEL{` zdsM^KM#0|R;b3s-ZE6;*)D$djK~q%p(U$SxS*txN;%Z~!yd{w79K=$wW>fIsfO%d} zDkV`^l=*n)y3Q)-r1?L-oAz;AUW2lZ-qB`RV73H}lreO8bT6~b^{B8N@>h|wIY4n` zOSNJ&5im7_M49kh8kOj=;_(l)gTC50I&tK0Au3cb-4xusKv(Gq8%<{`IVC!x=4r$hxMT>hp zFL{b|*TP{(u9lQjBFx?xRE1!5cBCS8Rr6?epXepelI~id1EN%gOUnXT!@wi~_r>7B ziE{B~M)!zb@=SV%=HC8xD=TT$au;a7VNlQF^IL`bp2DxR;i4e2!nG#9+?QQ4@%( zL7WtI)CjM2c+2>a2s-x_JxvB ze|cL0>1e!o360dVAPpu^w}6%s=%S1J@>FftH})VGj1%9%-*|IrUMK{nG(brcWRW20 z>QYQspM00)CF8<(4Ac$H-ey`0x@dq`FRC61q<1h@)cHnr;Ke9 z;8vovd?J!K*tJ7e%b1fQTJzlNWBf1Pn@^RhSrMd5kZd_lZtxu34?QT1^S1^Z}a1;WZVkkunt$9!>6YzWiap*32e^**TXi3?i!_8Vbpppt0JF zWMZA}a=t?Fe`}{6Hgv5Lks7qw0;QsGt_dyM7>T`)6?aKrA=v-P&Xa=t)ykr=P*@yP z(twLOB<5@>$5_1c+Gk;3Skm!zDe-g}LKxKq)N??MD;jZMHl>er?=xIJSiCW_U6sa2 z);M9#(Ll)@HliX%t*n#E;Cz?!6@tURd^`U3n>W7<`)3@ln@~sdB|ed8WUv&4ObYbG zC3j{Q-?j5StV`BR_?7+TO?*5W*(0IVN(;<76qIv@*VRzQ%FB$h>=#Y{L%CpN@2-K3 zu~RnHo04Q*32Ti8TB5Mj7P2hMscX@Cf3RL59QK=w!{b-blqcXM17^^vGv%FBd<4eY!HfHLkUytA}6OEdKWH7u( zfN0G@qnWL_rF_X4)S;P^)2B7{Mgkf|K^g;IWFaiioV&NSjx_ca0u6`OPE4fKxee8d z#>ybk4j-doa_teFJ2%?$zkJZ)l(9``PuyGZ0_hUaNDPhCQE1udN=ZiD^1ng=;*Pba z?C4W2BWGzC)eY2qz@jm_si?N$%jJ`vCs??qyweA0Guu!pgu2*3Y6U*JBWFoIs*G9u zld|)`uOjOB+99V{(sRLb8lWNuQE`;sI4EhfrduVK4_q7=JDuaE)6z_iNy$K?XK3jS zVx<>L)>=No{|Z5jQ`R<55lI=LC86}*LAzrMR?NoaNqFV5P6)W{8QUpqbRfW5U*XIs zLm1>mU}*(d26;)Oy!eEG%bvFVHs?7BuG#U8^%lfj_@tS1*0)L z^ka`fuu*Drp}1s_%?U4Sp?C8(RNS(DVR*?n%ntr=fBzF3AK$(|bc(}m%Ho7>OrX{r znsT~jom*MMc<$QuVc5&K!=1&Gd+<_-=U4=j$e>ylM4Q1Q&8eQsEcAu@dgf)mV=ZC zu0_yk4Nf$vN9^eCfi7G9{JxEIJc}l_kxNFKrGso%=yXP-)>kpMsk<%JdEi$Nb==GJ zT#8Iqd+&7U;31`B^gKW+K%#3w9C+b_4jwL zA`zr-wcgD_*Z!RAx*>F_v4U|`dB+aNPRy1m}?&}~t4tzy1cmBmAbFz=gqqT%m zCxM&>tdxM8WSfyj+aKLN%hnYopSamoVy4y>dNKp0(V(6km1JKI{19vX1?>|XE)EsGhd;4G2RQ>`;2Fd&V)Ml^v{z)Zr%lX*08ww-Aj7%>oebJIS=j! z_PoLU1N%P=>>t>R2KA#48$1neSCsdezj{eC>>-}l2xpeGJ`e0}t=~r#-3*ehy@5>TC=ck`bygjcSzWn}KbJ4lw@}7vg ztwZ+cqv#J|JX71_g_~Xq^#5$9d%(K_FfW6 zhWIJ(|5?58(Q9Q-hIw9_oN-~~iGW|O6+CY}wo7SzR#$sGll$p7&ui9mQevNm_-F#= znJ`~wvuE|&M-$Fo2J^y3`fbc-b)1{uy}Z}lfV`y3JbL{6M7U3f8qeK~e*X2#UDP4e zs}Jv9+kbxZ<~M8o@a>zA@87X(T zPiBYR{Tej?*Cs!G|Mt6ghYdYFH;#r@8iCs)aHNVMtqND=*uQdf3h(LyHkA}S#nL&T z$_-?#Kqdud?balGRBI0^C|8$oBDW|f4yOsS#-N}KNiAb|NL{rl2XBRJVXrRd_wkok zA3nZ6_WZ?Mxg?nxHM@gZ8>o6ln@ueh?!K=9d=~cC6jnCJ=*&r`K*c&}m4N1{Xk(2L z(Qb zM|}U?{O<50mCVJ>Fy726PR`G6j5-7==8Qs zjQe?tuG8g?S>D{DUsR`cLgU`{sWi29tf)RT$|P-PNvdB>(s73#+QZ5+%v1(wFvC+Z z$XKf{)0NoI5_Uz$ezPlh{W@+o2Df{~`1i*HNm+|=&5EIeKuR5w#{f}RvX*1*GtC}= zyo!vsZ{EZ>WM9@?(u0wTOpxY)B^J~wWmJ{+zcL6Lq-&Di&Z0f0t7d~qHc`$G3lZZ-4)3yosAhZTkdL)y2{sF=qt@DV&v%*5aU za*KM&{oq4p%O-z1H?vCM*(S)zpv@{`8TDDLN8vNnT*V0=v3q>>PpY+QP8hBOlrlqG zpWsqyRZm4zIz!YI*8r!jmyI@`i-Y0h6BMPwSOlG@X-PD4k@K}({kwhq{_EFY{`psS z1NO>Z-+0#dHg5m^;g;3Sl=0o`jnC^Uk&0qA>7bzn(ndp74Yd@*_ti1}50<})M)|Fc zzu8~noVKB8CdLEWdj+*Yuv!*82UE?gk?84dvnTKkHqjq$dhiXiU&MdTX&o7Tgm8!T z=pfMv*V#~;q?S2z%H{ml`C|JUXqe;Oc#~H+)CP}%k!J^GuFz5)RwmWahD_QGohRA& zDnj>t@)5nuSt2i_rUf*pL+endxp zAOHQk*GD!rbGfGG1=2Y{Js6UDM~JVLJ&(43eBuD=T05D&t?l!QQP)T=5H1SJ*=~6| zNMep+$(-mI@2l-u{%7nq`tkc1@#=xIuE{(z_lBmkfNQN_=Y=IB%@(?n?sk@E<9}^| zho4J)X`L&fl*ph`1=4bY(g-qbOogAM@auoWKfU_+*DoXb$R|y1qrQKr)pCtIcxvPHRFM*gJh27@j+sD&=xnyZmX2sxeaA^fp=Rzx%EITvvE&%^@LtjPm z&64O{y#M$r4uw*bVH|;_O~I*8w6PSGqRcFF)tny}`WgPJ@=ja|GxasdF=$qh(t?W> zw32yB4q-3H6kR!Fa$s_EnyMDM#NfR%NW>vj8`{WGBxbMqs58BGaOA*dJ&?f~mZ=zY zB?Z;R5N?dIOfpH(c=Tgj1`^7!p@Cu}ud3ebJ~D9x z>ni62|4Y;PQLK3X-d=C`4<)mKE{Q=Y5rl)_9?OQTCbH*$8uFSlejoq%EUIOVt@DvJBBoE|We)0nz0eI_3d@xO{Mx@+)6ZM!N`gam2k3W}bf zy)rmYi(y=t)a1E7nhBOX{fRV1;FM3G^67)Vxu70F<4t2MQiQ$Nc5 znoEoaYnAX)UpWV=#saP4aH54|nwdTKz8}%20KbBSO~Gg-9^4e7ok7MK8ri^0thWfx zwjR`QoxXqHAsb7`$TDB>9_q=U@jlNx?#pVDcck)3=G zW0%+ZB9!CVrOyER-(Sy8=imJFAl2&sg|p8?d(wr=4d#i&l^5V0WR0AClYR@ePlb4) zzRh9q`6>Auv~x}okDZdes1Y8uc-Fz`|I_dv&ODBMiOu89`I7PbU*@iCIj-D>{t_3E z1m3czvhT~=DG&q`RUF&V$l1O=l5Tq}_3c()$=y<_lJQ8MdvFdH5Cpfa1$SN(j~AKF zg8guX=WD#lh6+71`d!-pDt|N!p zt5Mr$mM%o?aKfP$Yn)R-3^^`arg`=XpCS@;=LXQ{c)jwUuh%n`yu zC`Bpe(o>##i0Ikd<^$-%MXEt0kq=Z)4k|f7=5SCgBP90`f*)jhp)x%ZbBt`o6Qc?f zsD}oQaezmWP<>?c2jzL8!Ep!sJ^jX4oqUGrIbeDTplKDV%pkMrscDiOy*->uQ9QNf zC$Mu+VRZHaiWZ@HFh}@FlQ7=xqtiO<`KMCpnN2p$r=h(LSkW1YYYw9 zP^SnybGW z;|gt^K&?fHdPC@C&K{G6tWUB&e-!aMe?N9Ld+^-D=rN1VgvKVI=^av20+o~#2j;O` z-aL$UcDi>H^<%?I9f>m~^cFg(wg$;fVA43xF(*%2sD6udslny<{_i6*#8IP3AcK+= z5Vr}@Iw36@%B{t@uDTGf>kEwo;HejNC&EEa?!{OU)ks_~FX@@3%emaP6lSRfASY=@CS8qFZNl zo?|o*+;>k&J_fr`6Zn%JNebDJ+!|#xEd?}khlCU{Q}U3~2x4WSxxhR>DRd&`clYn_ z{KmfwJHPtq&s>#TV|?=xklS^d&r`Vr~tVe5Hgtul#i!9;W^_-vGLNx1{4< z_UY&R*o(ft|M5lNq?dg3Aa(Lgqu)-$Ui{tm#fopRWnS?Tl$TvJ_Xz4mi|_aUe#FKVZ^gVM_y_?Hi#+hV^RSYBjzHEbLmaDIHPAOCt~w+L6)Za074 z{h5CdBYyJv-w$S~HMg2bJ9v}{swF^1c8IIzA>C?QQvNHPFDAaTv-+JKjTeoXn7j=f~pX@dq&efV{x5@>!RT?&;>>OtZ&aDRo60jX)+5GNwUl3XMw2*_YPw2Uy%!wX!QjG=hQ=I1GXM3`3_@%kv55 z>7vws`2JAyNZqKiXLy_p>V+W1897OmQlj~8-u(sU^37vsO&A;^8 zm%rE(QMuYk6hS!$khKOiCxo0yD)-nb--|d6d`US!y4}09S~X8fqS3&C@A&h8#BLCB zo5qpL?rPabAeX0kvdpI^ZYBy!!9Y?oxamNZNV$68%y~`xl}r5SsY6$pG-F3Ep@66a zD2)hbQ=yV%?9x0dq|0{JFJ}ID<^NjU{uQQkQ)F!c#FHUb3Zhh-MGJlVto=c>ixU6+ zwZ8x6E~eP`jNVGgMDSD@G;)Csn{bgba#S9f7S8)Xm!?>5KOBfukccuU zgn%Awph=F^N}Yve;k%D?*-rVz%#k}|)9Ag3z&vJ9?Hy96z2T7cP;z<2D)`gGE;rzx7;D5s3ykJIL7XR~ z=82(_nIn5>dB^uv9Nl9hhZ~29Oz%~YMopkW4O)8!&C#odHpk?HoG;rn9@{z`S&bPo zm(fvMnjn<{4%K0aD9udSxgMncve0Uk131Y1%iQneR?gM8t4Y|Fl+Oy~OQ?Q&H|hH0 zT@3UUAKwq=FZ*=!Hsh1u-wkSCg>m};#m&nAz8$4r`1xn&`|L8j{qru-dhPmb(~sTf z3#$I0Up(61fA^nnZv5}KJ9%~E%Mah|F6n>xyYK5q?N{%v?ke=K3*Z>oGY7QE3L+;+ zvVo9$r7B%W7mvFU{Sl+@EPuYlp&b_Z@W<8OpTe1KAbJcSWkV;eATM*&DXpcr2zi9^ ziiFpfWsd3OhS|A;G%&OkM&(v1m(i;D0mkVSDd*LMs#7N^=*=o9bO-0y(Q>J2#x$q$ z0m}ImDbpV187s}{1zos-ObbL(#neEVyVun60m}4>l*@io?ny^W8D2br)DyI6gT^3D zgRo0DK)Jjk<+?|CkPQ_|u#g%`&JM{;$Qq^7Z0_?=Dc4t|{Ny7vJhPMK9XPwdp|)P!0uXdxGn7DeYVAvF!2OgTPd{h-Yl z&W=DMfWjnbY7>^!dLOm7UG8KX_?yc+vTu9TGA0f5S`}23z_B&3sgG8Mc+u@DcQ#&8 z?3V+S2kz}mIW_K<5k?S{WF2Bv;Xaa3=t0|UNt!Zs*S!>w0l$2KYR*hLlo#=BK zh_iyVJ4Pn07G+B6TQt4qIJPpL_e2fnYS|l1%uuuhbRL4Pt!L_;NANA8UNhuh89(9+ zHE7Tj(A7Jrw1Qr80LRd~G_E<*7HMzk1$PvV%;l?Tq&&bW5-1e|OHLS_B;+(=4t0yb z{{#1NWI>f`m@%Y=N^U5^4&@L)Gr1QYKBGKC;cNE1+ZST(!$1A{KX>V=gAoa(A%WtA zdr?px3bm@J(>)ccq0y4TI1T)!vW~2wOz|#~VW|dCtPzrCf>=m#raZljZR%dX|NZd& zr@!y^wtoM^-HWeJ+%0R>Igc_yAqP+{1PwJH(u_SNE40)3922i6^>EA7+*O<);vH1H zqid`Pxwe*g&fE@p&R1`YM}z&$9!=bkl4X$33JFosdym#s2l=5&d6W45WJn)pkL(T+ zS5W8%(JZjqf+`2n#0RvzWfXsB`^fq1nq#XuLwh7p905{FMw6;KI&&KRh?v(Or5;#a zT`?e@HIINmwSpQ6Bs!y(DIGVAS*BJsM2HRrNtlpAf{~;3NG2{zrL4hTHyyLH_+*B16fUC`LN{q3 z%L0*3=x*Ao2l~9#a0~RSOIyE*zmw&}J&lo2IRy~chEAzquvpOSvvpm`TEV`mgI?J_ z?5F!QOS5*UWoJjE91SC@7dRW5UaCpw&mZdE#3vjVEoz$pltRVyRM7A zqp+`?dtcf9`E9P;->*Dl;7K9miEb@|#3Q(oBF8c26iuzm7HJFoTX@JX98TRdQCuo% z8qgR9$VUecR}>m4s6{E1w`je$^R_X_Pd{88$$_R&LkN}8LGJAoVtKGR){5nQ}7yFqds_(zW;;zJ22vzw;pF8XvhwVN{|pbqBqHj zEvDL@l=o(%-R@A`-7SRgeg6#!DTzi*ik63fEC%#eA}rO$M7hPZ$l3z^#?lT4Vo8ce zBSjyvf|4+LGY7>&oOie60K`tQ_HmFSjwIpDT4Mg6$`Y6K|K__wFQqig!7$MX z>b;@Y9?+zBi8`j_u}R`v&*>geIh9bT)n{PF@X8?V6U-VhC5%{8qbO;Uhg}Pos~o^GBHOAAo2_;wZL1^+#^}7eni!qY;xHd{=>)d)I)c%ax0+< zQjWfy1!gx!&zfb3m$KX4yAAx+<=yY%zTHQDYW@)F%&~Dn8d^YJ7}|J3oJVL(?z^WO zpK0aQ1t0b)976U?0l_GOv?laA8v5v-dX(;I9GCY7j^yyx7UI&gB+QvQs8d7tn$RfE zG$VzX4>^uE=v#+#{K15Mn4(S*kd*{YEy0y$uGC^9I>7%8^7}`g>l2YOW1R>+8;V*% z&#AzyOX6*?1~OO9YCkK&>fwB#usGLb5^E>rYZn3`4DiG-q&(ZXFa$K_^r695m2Otsb0X zzTx7g7|JU?jJCpk!Y&NklZ9*kxlrl1yVg^N?He=~p=(vE_^k6%aKfJ#FaQ!Q@PuJH^ zbPuv(RVPY}1foQjdLuu9rLO)w#l>>W-e= z+i+0y5a6SqzV`cPy+C&w?c>KYKs@8ZxYKZl_R^m`A9@n@%bvy!?=(FFZQEl$CjlSr z+dGfqZM*PZ2!6hbxkWnpa^XpkXFjQT67Oy*c!svTgE?=PT|mFx@$mIEumFC$$zap9 zi(5gzUDrQn_C5!5zF_Cv zrFkZq+orWI1wTBIJUWxRdtmv>^ybdTeHi}k?iauF>$}@}@sltA{(ZgCcOU+8I4SKj zj8sCyh&h3b3ph(bwj4*%=(0O>^916Tzxd8RrI$=lx5|3=;hU#+FV+z2tgs&P?rJ#W z0kfJzPFY&s)3t(pGhyG(MfNnw7}Q7;xWx$?C4of+;z2^mv5#FE@i5w(%So$!_G8*8 z6DfxTntgynjVP(aXlZhv@`RrB=7Nr_^9(E1TremwN^Kcja|5TQ)KjBa`3YHX+pAX3 z;x3w+$6j(uaP0w@43xOz+}*MK=|0g*bysentHPLV_9#pP|nek-ZVv;O;@Vw8~04WgPsUKvt~ zK!(@sxg~SjNn2yRk(4JNW@FYgObt2`gJNfJ=pB8`*i)?HyMw$(5#OqY9+TL2>CSl+ z>IsR>KzSx~ss$E^lNa$c?1Zkja_f&-tX5w7Xwg$dlPtRy=-JR3he%De_j*ED{=X1L zd%|Mm(jx~j*NEadKzk{OHfaRzeb#Y87`>{nyYbQA`8VI3^cs{~A)O5>ZYXIwIC+C) z>6M2`-ktP#0D4aM@o*NfN!u#I-U<3jtlOw|`z&Q6=6$%bA-}c_ZsTM8+rYNvx}Jsg z+{yP=@TG;F1?*YR1U&`0rGFjix4-alrMG_K)42L@@ClS$Vk?{)TA~iJs^~EX%vy4r zq8@g8Cm(~{XPoUHq#76*S^D)_z>@LWEh;c?bN3M#9DnW-M zQA(ho6_TlrZ%Ge6_(9?_HsC|O6Z)4|iLaH=$Sr_djxoQKj6|9#`{zgedsLX%ixWKbCs zM5%){Pt3-tYRxU|4u$UHoSD`y^u7M&z&#zQxXyw^X@JJ;kTwZbdNWF;)j1b-hv3fO zXbz&T9?j|IeNqDj%An~3YC2KKEyj9>o%i(?CR*= zqi~=A;xs{xGMIA$6)u@mbn~UKjsc#@eJr@^V+yW4vS9KUpjsWOF+fu2CFPRmm}_=t zqIBya?QVJD{a>D(1$*aGNe!Ay1Wj^ungP;hqQD|~cl*iHuxBFu``a+--PLMqt4d}B)1Y?RK;u;saM*z>&GS|3imDO+Lni=9PfyNYYE(O&k7{}gqjHj5M z&B?5Re{@@6Pn?wE6eq`l?5%Vh7^LKrx-{N((zy12dH&=HPrH!F*Cz3pw;XN@( zYJ^xMlqf#CFQqzvo)em=E*2dWE&MUTZ43M@Sd8bswvVkxNSuLS_!}V z>!&&2`48V~f9GSP2$EhTPY2BrK($tAjsy!HqEHw)Eb;wj{I8aAztFq5uDe%0K7P2q z+4-)0@*-37oP^jYfs$58NRGg5P@GbW+m8Hk)H95YPl2z-9TgsFR!R{R`w;I|k)dO!3_Q=|6)!4CDVY_Ay3O6MX=LCt`F({U)PE1xeC_2|v<0%`T zqp+j#QHiPKSQVBvfm-R{5*j3zOv9LGEE}|ZwsXd~>5o^#Kb#8hN)0kck0>Jz5Vr)5 zEr7~!FWu5Ci!0vYoj<(0hdmkIb&A2GIkcAqirS&X6=pF^?XjdO4|!f7yt~K!;hb(a zN7{9qHncdS>x`h1B7}n>ck|wfZ0^p(JOVpgJHEp_m}eMN4DPdq@~n}8e;_YoWX7xsiz2CSYH>Sse@9W2#PuGs`f4KHrx3AY%cTMoufBkUt zVfRaGfo$yd^?VO)NB9N)WM52Lz$@z zbBNFcX(q_13~6TOvE{J4O8OYybLp=d++p@#N@>em&g<_Flik)*e>kpgmIvz9{`Qya z+cPoaK488Dv%l?Ee3#gB9}rIwlxl^FCDb-Xh*486%UZz^v^!fHOYX&#kGwxFJz5wI zBSZ!zWoRh^>omlrd9Ac!z5+eFfFJ(7`xt(_#7l86+7xNzfIPcGqXf{5TB*=vo;%(< ztV@>nGAVg?^>LqNo~h(oQD#?UR{~ebNYrZN7$XH;Sbl-H9JwR!e<+32D?<`bP&Puh z>S&xbYA#Ys-RF3zYTq}o-nSCRXgz}qIcP`+w>Chnk(N?z#B_vfx)9mhYY=v`oIS3| zL-iU8hP4QaqoQ+eNF#NNq)BM;32UT_Q{69DE#f7&gp_LqNiuXdhSxE>))5lNBU~?E zu19W*Y#Mk5g6E{5Vh*0QLUR~1v|3Z5Ba|=NdVlp#zka8y7lR}u^)k@73W#$6YmX2b z7NUhRbz%D$<)RdiyqQs$II*HeX3*pbO&*|HN*YDjckAVl&ZJ-5O3@U-3MHw^9R9RBcS{Bw%pWYUn9v)DSu)AA{;rgln|R zjAHi&e&;uLVbf|0#wb#$O?aISs)@lg88Wz!uBkL$oYETW60YbG{OZo$BvBeS(9jO5 zp3%t!gFR}hxrUmKa=la={fvL)h1xPCnpIfx4$>N-DH7tSb+j@$58b1@g1i**gE362 zZaL-zk3~S*8HY2*tpZ7}S{1+Z<4lL6xnH$DZzj1MaubX&o`fQhS4G zWsubY@#y0$uSy5yp~PMw=LYFo>g|&yZ0oyX4YrJPv3tQ+ju(Km7aE z&4J6HYpc@Y0CP}K>kJ*UA?B1-hSbu1;kQD%D9u$wpuM_Vhg%X*n+%R@=(X1xw5a!Z zgy)4SdWZh~4^M0}b&;OT9U+;5ax0LWDuPvY>NaLy#B-97oaF z5Jt(Mse(S3Fbc=2TxZ@LUwsPmm8c&cNUSw(ri>XIgKC=S#t}S5vF>H4^GO948(1D# zJ3MgDVN5KFs-uF;3BAn*70E4(+1%v_{fiCT4{ZEWZ(o)c;|)%X;>E z3x~TwX}zb`BIeWr>Rh3%2|QI&?-HrZr+8nq2ON2BcSuXgV@0r_pg0u0m4a%maW1n* z?+fRBs7nn^f4aK)>k+cS!<5hrP38m@B8YoOh^e$5OAJL9vX9{|NBHwb$)gj*sAO@t z!gLx+@CI&?;hHB$>r=}zqV54+a*nvR@vD!1`1M!vTB`a)mMJLH1X|+VKYE`-rb}Ar zZ-IUVAxCaItwCzmgeqQ9<}`@M3{Iq6Qp`h_j(HOI>=N#P{TCnJU)>HP>$o7_{;wiL z5s(c-XL5K;mU`jn<_qf;)CF4lL-Zpl@!ZIj46)}93L!#h2*yaMGHM@TiIY#_zMh2D z_F)N}LJG)(188~xM~i5cr)x899yV#XXg!?h8PrDY+B#fRw2B@E;o8Ps}))}V-;Bz14o!q}$bVs&w!EIe2Rg-Z6>9IX!r^;Xe)86cib zY#LkW3;7k^WlMfBaj?MaXqm?}Fk1yp>(G)3T+GLyP=dxIoG(|-_rLnxhfmkGn0wj< zQPo;lGfK7q8bu&pBFy55fk?@gl=W8lR~NLZlw2a2Gpa@fiDyW2L*h9~_ZZ2`a}=Go zj(%u=-ECd?fzPY=hxS|sr;(>Ba_tNCGVnN6xbj@{~%0 z>P#T#3N2)qy~*f2tHtyL>r3Q)e)x}1`tIt#e*HatKlX>-5VUAjq?!h(bAj~UKsj;f zHTl?OcJ^Q{L-16KNO{&7Cpb?Bktmc?f>o(RX~f#YKH1AQi_ccJwT+Ru)oFx5F@U@m zh*yD$YD}%U&XfEv(Lf$=xA@H`eSh=m?gf_XCpMzwA$^cAG=~bBp`s6&aPeuJQq8-4 zN?YO2Dd^`{x7n|g&8hZQ%7}tgLk6|3=)*g*gi<^c*WKmfJHQJ!rh6M(o03~suQQ^? zIYGrII?n>)T0~2;wtK?-BcoVg6%HTfOhMVrfFVq0s`Hj4G>h#_>)oB=Yl zViltI`#6qPyOaU$JW1k9?nV)oZYcI zkx2#J$1I`gbYCiF1M+LiSf%SqEncl-Na-jwMf9o@!I?>{G~=*Q$1`SQr!I}bfjsTj zOJtVMALbNa`2ERU{u^;_vp6poar^OCNVpGkpZ${ZL71YGyy&Cv-MwV^ zocl=j0X9DYvikhNe#hq*_vUST&&2(_2LFQMIK4gT`9PodUz~ifb`NCpUXGWe-fdBM zc0;}Ue&fr@d*6Opg?)L8+qBTV5$nNf<+GLCjtPIi`u8(C`uDFlE?>R?>elm|0qfQe zpNG^f(3vRRyNMS9{KChkO!R5Iy^P`ZgObbVk1}{K`R*%hZ%YDg$GgvJd=;b9$%@k$ z%WU~8NNkv>J_BsyH1vPWUD6e~h3X-&OAuae?0!VsoO_MZVWnnJE(G?lnnVXdi<-H~HWDd+$$fU!^S0 z6=ReJ8eu>v1n8vVG%eS<1b$EAo>#`xBQ>`#b0h;}y0 zOBeQt>!c*EEg@5Fpym}CQbS2eQg#__f4BDonCCg;s_kEM-2eN`k@nrwTU)soVBWr& zZ9V<^$-PT$oO#?mf7;8RjdJT2&mKTMf;w1#qztW;JL)h2B{FdBiXc%ZD9M~ zc6_)Y@QaT+?j271GyO1jN8R2`60f~qZ@aW@v0lkzQYw&^4WwCNsRl@7VI@&c{quT- zef)U+EBEpBW=9%Tf+@Oo0kKC&=>a1%Nl~Uy%HHh5`#itK^pn2+1?fOJA8%%*NJ}mm ztx*NV=GZB~3^|(h!gXJMPoth&$nX4v|3{DP{i$kR4!5EodWd8NI?kHcz~M{*rcQoCYN5vrF;V%Ir&XbsG4Ba<2WKk96c9(o^WjeFl)YLP8qo zI&&In4Bz+9#}UsYV5zaEuR_a|IGawW87=3$*kFO=8AB~CE6Ks3()ouMNA0E6v9q~X z85L8fgJNRvn2MN#XJL(5+bIp{nIcxh@`D;S4fURjbz6B(-ig0@{%)kQb@F!a(fh68 zGq3BohjMZ(@G_hSJx4JGprw>>kSRHa37?19#J0JQwG5JMgqW?ia}JA2hv` z|IIJ_$UZ+VbqwnfrOXCuaYDmPsH~m31S+zOf=-~`8Q$=sKA^UUaNNrmaL6u zs!L~(cl-GVSFZn9&DO{~wSX{ug4{ZkSWqpK{7IU(gbdRFGLPab-Nc;3qM#nj=M4V73ugoMZ*K%oiP%EZW-r1V%u@`d#p>a27R z&xe%@jbRbfjg~XXWk^Gq!@RH;&$7^6L!FiG@B80;eD~fT^Npf~V}`I*P#g@-Loubr zk&?A9dyCgt=Oyg^4IAI9M(vuJlOT2Z=HkQN1(6wy0Z zi#__-pY3`W^vsRtVQUX>Km46{fA{aFwmQ{GGi8*N1BhaT1{atPp`J8Q>8BMQvUvd? zI!tE&=?DHd{r9`o0U?cRkKP#F8-p|k=o}SHd3G}iJ^5+D4{cod4gW+xUEide{70|G z$=4fZs5Asd5|?c~)>A|d!Zu>g$>p@#dj{Y5-Tun|dwoi?#}bHgh9(Q3G6*KaQ6?qr zk(BcW%{xnPEcQ40-KUcdT)Ou@VnWk-^MLyg}{Fw{I|l)c3SX_rMLFs-}!&ueK^@G$qZbC8Z`F+N@YORC#0D+7Pd%ngWR31 zx9*UZyLwN);1V>H?h`e;gH$T4S;2GVp1T<-7H8v#`kQIyZc7+>a2~NIHdsN zpr8>1GACnl3ql$@=c9!4B?#ZyM`RwU)1Z`VI7a=bRJ0Lu_zD4!MD* zIn;R~%j{WvO!8$te*^Lb#2j9>B8%p25-3vvh1|hf8)g|UaZKubv|gQW$?Acr-A=j3 z^=P){E*+y&0(q)X;eo~_jLF_5m4)>h>JoI*`iNdJYK$6!f>I-BBtx*;QXXLv+cCap zciWwj^*u9*%v4~V8i;C!ss!}N*1XI)JRT!__Ri^W{$kI`D(8Vfp@E_)Sg3+6Q_-9M zC@*#5FxrJkuTEZM)7G0H&d#794LVvt4^t!e9zqFEus(a`*xSjE9ndrxMTKThpim~P zHG>kz)Kg}w^$FUSsv!>q0sMZK$cMRfYDy^ikh}a5$W?6rD_fH?c^y^(6&_7%q>7$cT%u!%A4OBHla!Zgd zy%CvEULtwhz|SaYeK8G3<=hQ*&IuAR@Ti2uT*mA%k*u8LysJR#OKEaviYYQuOc^wL zfdo!SlR3}UY|OIec-H>Hukz}!s8DMdijbp$rWxs04}B50oUGmt=WFvQIC$&4I~PK|~ccX`r(=N!E-kuSu5klB|zk zcj&5tE7WTNMe48+1K4^gGX$@a)+FnBNw&v5;E1DBV^9eJRC0vnNocKUizIQjxhC1p zOY%p0t*1hay%iM-1)W0##iZa|44h{VUQ<$DTBQxhXBD%YD6meD)Hr-7x>^PG9>C@q zHRLjBcq;n<-2tr25MGVVm7-`9L^B7~UZ5T)*uBcM+*5DI7@sd2aIx}qoFz3P7ZYgn z44SdRv=f>{a_fO}I8fFXjIbhHCn7PKXgMWN4+aa_kiCi$ryBZE zzGtrMzyI#`&sQ;(QA@TCYq^4?XK)UNR!K8c$ua9fc!hPA62ANC_WNJz)%xIuP9vpR zI&zO4L`1M^g4Wmqr8Fq+8Lz?4GQ3<_Ikv@*d&xl?!-G1=qe8heJmo2zRC2T9%+D7+ zKVa;4uKjOMtkX5_Bbq>hCy>_wwNBth!9tuh$`ZKP27VDqzu)a+_^>`DA#n`d9W}Fo zYM)?^4ROR6r_10@iK%{)iudY8#s<$+BcTX*%`L2TVv@I2Jr$0gJCrO(~u-M@nMXKk2TKfcfN z-ge5x{pUBNa6cDnm-74yCGw&J!|vle$e?}Z@r4g@?mpd~Y;_l8*>+mj3g~_w!^>a# z%koZN%g%#z&y7bJZo%D@$@#TLcA1RlL*Hc%p0VV2-<}cuWES36TR55W_O%vnCNyU( z|Jx+1Ggi)%`BTp~uzgGD;m4O;l&|vg9mb2cHa|eyl56mMw6AQ*pS4~39>OzL#l9MP z(}LFv&{yjz&p7w%Gvt=ljF$uMsC{*h{o)>ai6_36GyB!+_|VcuzQVBiUW{Pl`D&k^ ze>}z7dcfLefGyL_uLWEteb1HlyouJPE%y5$DSrO_e$#hezw5ihfq$qs)ZV|pg?{R) zi^9!YE{52Op~Tjp6dID}Y&tz>T|!k`;rDE|Obxe*+KsAzsQW;~y^_gkv?-0ymRna_h6EOPj$MXHPqHt~ zHQf2??Y2vq*yGSj72ZMt6(3+thS|w!QYb2I#eI!>P6>PeICd|0rBHhyaGeTjy+d;> zn8Y%;=jm}(QC67eq5nJoF#PJthJ!{ImRiBBL{PE>o86G5YvW2bXes^&ke6sT4p~a8 zecMER1VQoML1YLsIE4a1 zO(DT|S#dd{H46EaeS71imp)!6zy?iU+w-9;lleA*rQ zcH#v{tz=de(Y1n9D>yWQnlqQ^U43zalem|avC0by%7JB~*3O_R1erq+W3Fnm5s_}v z@%m$!hxR_lvyNsS_em7u3=o?M)U!Y)MR-W5L{g^8w^Fu1KSRta?6B6dZR)-yka35& zVOqW!=Jvz3@Z0_8UUmV}1B9<-z6_?n0%gO9ZVSxGk<~LmzK+T1PJA=USH0eijp_5D z4mj(!Fx^kI`}aTS`~Q7Hn>BXB8XCeWUok+f<|V#JMa2F$hk{- zv2vu4U22jjjL0D(Pc4v~9663wo6g#4tQfzzj8|@ag!gBM*}5k2;OWn`Ve1WztEcxe zPqi3-cEiuEum6SRUYMKm-hH}>FZk|c-jDs``-9g)wb)rK2t4KpvO>_3JKQMGnVZW# z;p-^g-ro0izy970ihmM1(Ww2Ld+0K4J08zLu{DZhGr{W)SqOZE=qs3&6o0| zK^-+mrP3Md{P(m>JKt_lYE&K`a?Ual)-c?#kV#JV~D}O20g! zPq8|QWaQ`>#IeF=5O|2}&ZEa!o}^zcO8-b4eb8_Z9WH@ELJljM5mU`wj1whYi&(>+ zQOXas|Lt~Qc=hr9YEMn`*o~08E6A-tI~N4<$kl6BTO44GbVkAl8%m{ab&P@_A%U_u zY>ozxsgz`~mVUpfIeX){oMZpPn>pIYfBs3|zgrS9PT#!{Ynh%Cyo~{3YtURHBuj54 zc+Gtod_B|3^MtPYzk@m-SJ+KAo~=+GSDcqTzquH;cG5p{9S_-BGR->;{3ddaI+D{Ywa0-H zDSUly74`|Y8!_|7wZTc?YU5|{P zbTUxM+`WWKj(rrc#S9uPgKLSHty<>EOtN&#+YP*_yyH&S!)PTtoJByn zF|2e3#WXmD7Gv+v6MA|7yT{|SD^hXysOY6+P@Nq*JYlrb<0yH|X3x`mVXwSL;-rH* zcgdx7@MHmTh+uC8)J1LfJiNu{iM^Pw?)EkAw`(2u(wQ{5kB(H6fQ$qpfgx36WtUvb z5(U`;{YH`wS5uK#%sPQe?I7m}PEue=EqCj)P}!>NVik06e$$XFNiQ|jhN8KFsuL_U zLNBqkQKf6GTLoUMQZC;eZA&TCn3M?A)Iru95)+|HO>C7^BQKiPpqFelf2U7|KLQP@ zZDc6T3X;+xB?oY6GP^0O%38+n^l}l9JBwT51$h=5RU$Ox4x&;aS|@y_=6!_R)laLr zm=FC#Uu%IKWRL->yVuY#_L^Xk9VTferQASr@hD95Y z&nW21huIU+Jq3tH2Z5>9HlKt=mv_he1eDwfPEx^o8+WoRynXe~91Ifh(MN;-d4`;lJz zudjaO@2~ZERdbzPwJJJ|4iZn$)CK}&9kXz4`wJphn3t()_Y9tVFRiCqL>aZVw8W}K zMKQCqT4$T3)stGz|6YFl-+y_()~6>y)V*-&16f5tStm4kh4+-xbd_3o(Q+U2a^7!pF@02)Tnz!`0Lv*g8;7Gc{Bys5mS zZ;-i+qBcNA6U0Hm(jBZmx_kAk;dw&8l{b3i9wRf((gGTX3F@37(+Q*Jz-?9=r94mX z`5T!HB#y+43Pq1pF>_#0ods5->INe7D4r8qH3yLfSnLBSG_v6%jj_z+ zw}HQztfS3;?x9y}88K4=6>iW_Dk6`N=BzE&vR&Xsn*KWu&uaFm*O9^`2$cpRuh5(_ zMoh`1aN}Uxbzacxp3~eH3oY~^uu=nPc7|{+XkL5JTAC%=F7gt-c>TAJV@oxqY(39O zs4)si$Ao0=$YgWQJ|+3mQl17rpPb#F+*&){o(wi^R5OZ+f<`n*o&wckMBe8ZbJ6ht z@j^Y^})Kv0(!|z zhu`^4qR59&enLl6kswttHBV6V0o7h%Q%aLodaTPh`XTBCg)H0l{pwUcFy%UPnu0uh zfRYVZWXno5j)-&;O}y<|f0oz3kT!6~H9Jrhz786?J#S_@kC)VihFn`{yFwr}c4 zw8Ux}b9Q*H5i|pXohG_?OL=$;*|umqe=B!qdSg~_Rb!TXwQ##hNNC@V4p?#I(6Vn3gfGA`<=dm>wHewIS0^J%KVbz@s;H6B_(_%(tc_773#yu z)%X`+Zd<^80pOP9)7ORlI^K5y&aZWkUv6A8cs$rIw-q& z-dT{ouB?`c+pDziCud~Oz&brCdJV80$8G1M-Qg}H+U2T~eSdaj@ZVGDQ8GHk37WG( zV#=tLOUu=D?6>6~N8C6b-a`0?@89`{)s5|QXpAKymqsAw0A*8nwdf(#IP+L2-otox zQt1(^J_hGZ3}FdP`l>idA}bTKN&J7+abnLQN%QDAR7rfgMzaR zZ#_vFkGICYay`2p<2`<#vk4TXyeB*zZw zBSNJP^b}i&jY}_c#qAugbBBBQLV~80W8;86Xo9>nD3hXC(2_?rle$n`L%kx!pWK{w z`NymGKmO1^4j)f8$dqS@nLE;K8I(hUm6_q{k}_-Y{T1u$q^51|9qbXf%;)r1&*U>;>GL-9pw<29>%+a`m=deb z36WGm+6AgJ!ovvUGl<#J|2#r_{qFHG^pOM#H%eX;LP`lVQ-I}`Ky8#^W#nvhi0|22 z&d(NhE%ok}x+9|x8aX#laH$Pc6T#|;=(AA`q@?>rxg)4&Ebm7q4wt(I8ZF0&65=iY z1j))Eu|!I<+w2?ozkd1eCyu}LPoMO!tIUqlYO>tXXb^~Fgq6`DlZ`x0QQJ2YYpmBC zWjzE=t6_7mfml#ePaw?`QVJoZ>aEvcL+VkMuQ}y-h|U$(NkbV{+(4QOR6+u!*rqwB(94?Yt9Pz<@rWZ;)IEhT4O}aM z$OEJd0i`N6irAd}z{2o3>ga;}^xIF$Iz=#p6i^-tt6`$`*^~9=n&ttvXM6q2u?M4B(z5Otq4XVn{9-#BN}(5m9Pu+}KN7 z%J@Fw*$CeTt^W1#>NebW^-n#N+Yn-EQ5d~y1NjKxoE4nsVB;AZF9XHnh#Lu?h_zim z3Seyx(p}#MBcA)jZZf$&5P0{*O9G{zpWSwG#=Qq0&mdn=G7qP7&wcdX?CM3&FV*|` zk1pfsXFYK@W_dvwog4*jzAYwM)Xl&+mS^{fpm!{O+o+w>!6-lTVB+6O^UGXb1vjDNS3Kx^x_e!S25M z-e>DuZfAG}8IOmTv9W|q3ANP#G81TF#cZm=7PtpLt|Psjko-u9X$vXOfu1vgYBXrB zjxI6_%@!N!aUuEbgnWPeTR(IkzxV6wn?GJ{KPkgv<$$Pepf);G14A^%8iOg7Mb|d) zHs8`|U(t`EAQ{aK=HE zt5r+j5GKfTgapZGbx`9JV)iBGvjzGak+^D3dQOyWB6cEBAcLk5F(wu5jfI`JYJ9`S zFU~ zV{mDRRSRgy1jpbA!G?rr*{8fr|2O*n^D017OX#Cus2eDT45p!|+^Xm(G0*w30(iqt zX;16W1{_P|UKvu8gNQrSZNidRsX^FN-XixctM|wMe0cv+#}D3JU+J~qq_}?g>+#D$ zY70Fm5j>ECd`@tzirBKqY&^-94){g3zSTlV>l5YTBqB&v2MrIfLIKHgqUu#D_ZOGK zTYCDQ+3u>v_x{8kF;NnQ(KCwW2GXctX#u0A*sXTuY^MugZ|0k-0c%ca6~m!M)Cp2a zLBR<+r9fh9W7IJQdVnRWlE&Cg&;-9ah`jJn+y3+Tn ziD$1oD`9F1pkV{TDS~WL7n`l=hGu(l#l-uk!X=PObxSI;^366OHSnn1)6YD9=m z%|dCEQhAB^Z^GLT#9b!o9KB^&cL!-z$P9|40ZJxqw%)?rtnnMD#J8DFhi0FeL+w5dE>%HePN*0ost4{Ns>_Dn`4;|-C!xQ2 zum3ac|JXJOO<9x7I?%>Ykd_E;DyUPr7fX_C3DdvG)|(Z=krS7KRvTrYR-d3gGNd$t zc&(v?Hu^q)?-=G+yxIFJO{X=j%x}C6dmGf_;QcE?Ka7~aD)K&tyJ@}gIl!A@vaf08 zRZ%yFoL*RHR>+1NWB=>&F34*1JI-{VIg z|B0Xf=z9G4hR^kZEhJXv?5NoY#9>0bDp)0Ptg6G8HT3%sH;CW6LH^#2i5K-xD{8;` zczq~uiMx>p8mNOR$cI6#WsJ$Wm#8C4Tgcr9d1ZS4XYR_jb)zpwfI+$jIkL7R~l5|;R-Fou> zK(0&gd++QICujzRHPePPD1+H5#D_wIjT-eNG4?bMVArMl!=D{{#xYZL4n(vHW>IMP z!Z0o&-K~}FYahW}lOi2)tTPpEEu;Gsu+6%0lpL*ar&c_l;z-vc`M`3ba+y>av)2yx zuFzT(RLHZentW|UPhnk;?4eGh{{F+m z4Dw*%)cDwDRLO;~a-QJj4jH4NN*Qiia=uOWK1RFNK>6Jb{fH*bZU(CyeX#^lkF;%UJO){yO5AWYFU71Eb6Y9%I2>8j`t;(yZli`!4rbSNQZl zerpeAqlsDSCRi~WxUCN7QL#L`b;?QRHc}n~U7;f#{_V}gYsOFPZ@c)eH4RTN^8|Jw zSX&0qT+8Ys(d}h!JD@AjyaC>2Np;S%Dk#%-It?bZLCPwVDYNvt(Ypn>!bd)!{`h9y zuutbnHhYH@V{nWN9hK4Dm^5;kwte8cAXn%x2jpMHpW|?1VRsSSbT@I#G#$Jm!#h_j zCE#uibo8OEw;k zl4OE=ORzjExOnSalZ_r5&s%_}w9wt+dB^H_L3`;#hgISQM?3C4_WL`Fw+OyZ2@sU1ONV0+l=HZ9y?65zvA(mdC*he(4A??7k!zV`N9_vzBhoMjTqm1dK*+P zjR@a+^k|@a>Z6;df2!1D7x5)+@z8zG1)P5KL)>((H|x!?gN65>cLwhM`t<4R@H9PI zLuVE+%Y;rB%q})2nfvWU!;gdBv;U3X{P0VB-(@mRI7Duft$3g%HE^K@nYchIm1YT{xmlb4hF)3{prS&8l_fMFj*T|`-C(-Xz8;L>OIX(!KLsoEbZX7fA!(te~t(AQKGCgJ46rq zsu{#BV{*&0(;&ND20zKh6-D0t-M4Q3)59F+w6v~F-7R3^9XzW*Gz`62_wHlN+q;V{ zK)#NkN5;IIB$d7b;k|*E5VZTiwA5=!MnUP8{0j_sCtl6&N^A{wsYsecZ-nPGMb% z^smMrWB&cmhcuTzKROFFAJ%4t>Kx$F1(x%`(CACr?6LaB{T}2?%tr6pyI@vYij-W$ zpfVD86o>n4U~8p}KGvXZR(b*QwFSMk_a7elC|y_WeF@Tx4wf;YofFhcPpoN3*}B3p z=8JxnV}rE2e7}Vy9VpouTs*<+oan|Wq?T4ZpH*?K>D|K?%aIHfCJk};ECjaV(3vZU zER2;K*?Ae|#bxmE&^x)eye53c0tXwkc_8JKOH;2h>8uQXaTyP+K)c7xnvvWUoJAo; z8723YoqJoepB3|3o&8sTeEZLv*};RyE^{xdIfFA9YS4hSn6N}iEtXo+v)YbqTx+U# zF!R?lBTQkMq9Ula2rSuP%?cK+Il9aciA~Q2_d=t~!OZvm{O`Aaf6Ni9)#B7LMo$Aw z9&lO(i^)v;EF5*?{u%EjobdmQUD8)pt!=G}O4PuM98O&zVx`U%wdp$6@Phs1v&{>F z9*IjUo*dam0=p_iqQj<139V)FHZY#WeHk&wkpr2WMsJ3}t%6e}Sm%T~s8t@>lIV{A zb;Ac|dT+SJkY%VT26$wF^GqnV5=E_?%x@XLV8=b*>PIu5vjtd5z-ra+Yr8^;6;Ozo4r#WCMlD# zIP%mC<`_`of{{Zg4^pG_ne>%IlXooa76(MFMJD7L0WL8iWmUB5rILF#;XTi*z0bq^ z>6?d(=V*w@Y>U`2dwShx%X)`6UJy6wMjs- z2TEcaC8r|G9_4?%_Ixn+;5C%V#7FUjNFHFR0v}`$ohyTG;U z=W<;$BXcpZrhq12a9wUa7n;#;Ilov~>TEQs2HpYTb1wL{NcvuekVTIo8!$1Wv;nYLy=X$v>LRTp=+(4Rw~oBxZj27FC^^r zn3^~fJ0%E>1}0K?PKq@(Cbvdj%dMCf4)^WM{ou{}69Ve6IY%oS*j8lFh+12qIZAv`TNi*Rn3u^Ge@m zH+_jUJokn+Mn-LOKznge&8wRY&!b)@=*1>8k4Cv_vXN6+m{cmbs=z%KR95iJR_r#+ zcpmsw}l~uqw z1~kut7S(NJFLG+l^%CxQ?|e(;B03uSNEz(2LI)+Z#D&wCmcgft>YEXnJ(Ebs-$PZP8|I&xCa+2a!z;@nN(zvQ6MNq{YU zf8jMf7a)9`0(=$Flb?M&4f@&8J|!KWtxUCpJell!!BMFl(ARwI6ZXFb;*i_ z;5q!=4bGRkyF2@TPbd#|8s_4g-OfG!rLXhO7SGped0O4K9mZEXf{Q}5UyFGg=6Noh z+xgD(a{QXMa6vff>2Obf_+apB+QQj+<(Z?yKaCIneEaTChl+ULvhk-synFlizs`@> z$*p*YAAbJbr-FOC)!fLVYbgb-v4TBMm{5bUmpQ5MOj|7R0kpl@Z+s^8CDZyZkhDvZ zP_`=EQCQ}7J+5d9h~-$Nt8mvxG|~Tss9ll!oJ|G`q=kSb2;Oo<)85Q{Nz3yQQRV+a z)C0$cnv^z(F+~I17Q;vlym<1;%(>Q`v>oXGg}^N?vt7}-3pA3oYNcW{4luO=)vTzT zW}1|()op{~66pUsvB#Z|mRT;;k!><~ScTJ=NHTq;&dpX_s`me*M;@H@w{N`mz6wK~ znL|^9QfpvI0-rsjD%C|+a=EQ%c^>%ngns(nx9olFQi*gL)r8TTf~ySJ3c(7O$+I}c z+Vnku_kSR3t0{aKWWRs&`@bD4oLUl5g-UbO&J$g0Lb5rzuR43$GQBQ={=XA@Z{D^$ zjqJ^Xq@e|O)La_+8jfXLL>ISJ{Zi@o485k4`X9foz{$_;-L7(qM6RuN%sw+Xra+1W zT4x)SyN%d?@jdMSLyx_~=JWuoDVB;Ux}^-ZFQ)#_F zsPg~CS$*X3z+oYZQIiw;%mUWxFe5@C(>}S*a{Cp};=aDjpZzV~o!Up4F;f$6&@>Fp z%OT4%GI6dv(yT>y8h4=oPXd4b?# zIH6x27VGan&Ep=)2M!;dYk@Bou!%s41)fH3H4Cr0Z8Sa2$m_j;-~8=#ETL*0YJm|p z!L2$(QpTv&h9*mS#HRBe)~iPnHVXSVf<$VWMj(yCU~UDH`a)K*?BbJcp3w99QG|`d zK8E00L%Arbue9|*8QejmWmS{Pt|tV&egt9T@KF4qmqw|Kj+~-{#S(0kfo!Aaq%}tE zCuIGBh~w)DnlsMnik?ilQ%{bh`p zoFGdFxYPn2lR=thM3FvaYoR=S> zcNF+YP8!oJ7DGlXaAJeDHnCC_PRV0RdPokxzMQ%%h@@)L7HZW5ZpGj-8*;E_qu!F$ zhvd{3m-EYb|F^>^@x#Bax9|RP$`veeSIdOea{+gyEle_XlJ=!}QfzvTz+T50{N}IY zhQfz;_U5ngzhB>8fp+r#R35}Gd0{FuIA?;X1e!IiMBc-<;O0fxFE00QkGb&@wGl@` zFQVYW1LCEEsjpd@`?UC^?QgH^#EpV5<+v2^fsKyqqTk;}d3Ia>i|0Qx@*!;g-0%GwZ~J`Q?(6LQ z=5No?1do;yUx{{iGIB|#(&K3NrvhJ(cfrv6Rq!W=(KEL|-`p~MxcB+*^Ud4s+R^XC z`|4`*3iK$6lg~$66g@ z6a}+2xYi7|+G<&;mt`C6({Rs7_a@8qZy# zkB#FUjOQfwcE&jI?rILvB^6=X!Kwq&Y=B49=w%gS+IVdc&;7m*n7{aY>=PG>OlvXN zY8f1fAxR9zt#HsPHhAOpKa6MX&mTd5^>_d9@4r2Cje@migBL+W98AQJu^Px^a(JR5 z+p9Z?_MDyM6#VYIW-FewB+Q_ODin~E8LM)esn;UXA7T5PBh%sF(up22`f9yR?mDje7Joa9^4+y!eApes%{6=yQe^^@ zDST+cA}L0?xZQ5doCLcr)$hc5^Vc`0ZYwWySdt7E7Vs(s-V-6ONsV}U%56`24|`qu z-+O1f-4!uUqFPYr5HNR#5qDJT$)_ZW+oXX95udY*{ou_X{`j4L|JDBTW_(;F9#&!R z-u`(PuUgr<1*X;xob zp_rzqxd`7z*dD-p&UXF7zt|sQ?^-L#$N!_W?qE(1&AFir;o8%j)YC?BLwH`_`oo*{ zzg=JY@weMt{8w-P{%*v!5PihGQT4$!GSriR2L()O1y`n(t=AdbjP$8yo=@J7-~RK* zH{bQc_x}F=rth2#m3N8hQ7Wig0#hXDm<7Gaq$D~+$EM;G+H*FL`|uA`Z7Hdy+$IKT zfKw2pn?fV6Nh>R@dXnw)Pi#K^d^jq-FTv?OIGJHa>R{ppDJx^;8QcahyWL&63-X-t zfd8RBa#?}5Je;Z_dz;`^5=`0ztt6$do+-9Bc^~c?t@I>5?a~Mvj}Z>{YG9!S7dNa# z!lP-ctv|x|Stp4n4V2v;TR8U`$m#*+HDEO+y1A8HQ|U_|BmA7L$22W}K-%m8>LNLeSJR*loZ^Q4Ax~;yriU zMvV)QuO?zY^IpBrwv5585;&)T=P3xa8pPGOjy>%wO}p=c?^B5*a?8f(D;Kb6gUfKt zm1a~Qt}E}EULlsaN8fF6)nX;h2J$d)CW5YB5H=!lr52?=MD_V6i1*O>h$>0;;%gvk zGBA_CYD&<-F*VC9D?Lc{`A5gc_hu!n+@b}PRtMJ{&^`&arlig^t=}Vi#l6{+__WKp z=_Tc~5aI+*J;PISgs)P%_2yOX^1bHX?A-{39o*(_G?D3zI@l$FOUqCx9c_4L$u@Ov zqsboX`RBfOuxZz~QkSL~YlMJ1H&`BmoCeidW*@UW!1D_8;5*#BDLnCEDP4g0@tqa;EZ18RL(ZF zKcwJlgT~Ip{#yH3p_MY)bearDvLz3%G`Za}k&| z!bmx&ts-33p6->Fp?9!%Bl4(qCYzvW240AZb04r`3gXIZHqLeQJ<)3|Rqud* z`_FG5x!z|?89ki9k{dXPA+i!!bF5yZ@ol}03y`la;x;nBE2_{(N})We9ZUhS6xMYRT$xk&s*b=iDbfZSef=UQSEhHPG{@ zV5J4&zL2KnRcc6Ha*?K&YG@zq-G@i^dlqMIvIv7ZgOwAkx`V`OC$6+?8!;}zegPq; z`wW>TEx{;tFxa!hx@M%QI=!|zZ&Ma8Kz=z95A>U|a;eQKTHyqqgQ1!eQj?gvs>+fJ z#k@$*`RALPl=SU4?;mh!*+r5BikO096sTK*H+88s<QAJC(_tO5|m0 zU}(u;%?9V@7&%4ApxXSNcYE$k=AXQe?OlB9?`!R^_8r-*M8RA#!Ko_%Wk8z0tgJv2 z)-3ECv^IA4fu1)h;6Cz?-|VNhby-Msm_!GMFNjh{<{HY$t$sSfzXyBXuKGS6S@n8y z&MFg$7K4=vMCOEKA7z!6*0RquueIjAkG#A7sjb>)=~x;aoW-DH1}squt*ut_&m6C| z-u(pqSYV%99j)uctUZCt2)I#3^0n$J%V*lX&T9qte>LK-@y);5pa1>-&HIySnj^7W z$%eQJjJA1w~l@U_UvhzJM`0ej#E6R;DNrTf+;ejhNIO^gR~EolYFm} z=lFn$efGfQAoW0Md4anHRC7h5O6+y1)%7^*XKlxyZT#nv2|G8}Dgu(4!8I5*YX$RI zGH?EHo;%L}xz0HCtDA}0O++vbxxr)= zWK-(3Sghm^GJQ@5w?{vf$Kj>7uDOD9X0T+1>r~9yTM~^iHm2AUrcakrGzNU>O-=r2ei4`Uf{$NrmPTJrK~Zvct0li>}%g6xYxN;5uPxi3QmJyeN~X;u$ZfO-I(6T zdDe8Id%*i}POXcTCR)xJ+@(Ww3^ZvgM${gePcVGmM56o1`{O35EG>=_s;F86?%vVG zXjv|UdOAh%S@RY?BmdpE8ZpNMe9xsOS}4>qxD&zBAh?$9R5YzmFLICdoa@}*zM1j% zrk(qnn?rf_;Gy6oNvzcbZ7SfX9n!nQXCF=xX^Cxgj}WhNGWa1A-~FrkpJSfMJI>N$ zEfTcu4(_?YH6?IvGA%c*w9Q?fZs^%1KEA-Gh%{@34stMaf~49(qnoCchR3)g8@?cf0Ac*ReT(URuYdx2{1YBk@x3 z5Q1?8q$L{S&b{7!tuIl>=3wVs9UFG9g)L!?y1+F}$XW@#%dDDM+KfB2zr2pk{X$=R zwkK*Povl81^!P^ZOP)D=ho@a6dIYn3FPA_5x%AExo_RZCJkiW;#hSCXh#o()6=gYl z{q>#44rNK6Be6K?!Idi>B;zVy+L@A?TJ z?C|3yhdiGGbV-@e`%hkalR13sNVZ2J^)A)Bf2f&IQiztUe9uf7^yn`1t>O@ab>=cAxD_9=qB7dQua; zyDRmC1>FB0duq45Y_H}E;6D8ODRZh_toRAe;cO`QixIxW$2>Lk`c&XA?f-|zpBgv0 zEG+f}m^*Qk%c{A5{OjlW@NJFd@BVeXJuJi?JbvBCN4MONQXOC~4zc7&mNbPn>9-Nv zhXIc)UlRFx4k5JLFRrulG)VFZ9#kM{R&<(dS#pT-<4WkYq?98m(pyS}GdjxvFPZSP zCUP3KlB}CQ`{Po|Ye{+Fmg8Zw6dDK*1y}0u(k6n*av7`0^pAqh;=Zn|<2Kh>wB)wX zyCrZb6B4t66DN`s(ptSp*Q+(X-@WSDI5>-}Cvnz551M6Dw=n2$% znclP~+P0vcV&dvz|B-M0aou>~AI=Awq~=s5lcSHMs3HUrW3(}LjG|%`%hi4Lw6=D(!M%J#`$7C;oD-3w zrb&`OW*xPR4DDrsvgoo_+p60vVS{^l5g!BfXM0MQMzxiSRZ0eDQFtB&&N8b-Dtvnc z;TG@}ddWw-=X=PI%0_cxC>3y1hYbld(^WyiQ|!V9?aQN~Hmc8DQfI6K#;(jivIE6^}@HDS!5`?fs||GNbcCv&CQ%fvg~O zwYl=@YFy4MdYy*$fE&{^ZB#Ri)fSMHrsfpt%T00~GfumFxjrV938uBcvlK`z8L3h82=+?z0!=UM z7LKg%$06d(!4NqpYaB4-+q?pyn}4ngz3I0*__Tz8GvpC3HH|Hp@8={K~>kf3Ma^-CIYCT2b47iMz7p zHhUZTN?ZUExa+=5*XcUbn==3jwrSI(<2c=(zLr0yaV*J}9ZR|Sf7y->&f!iF1gS#Q z61w$}DePRvY5Fczf4jrWrw<%^i)cd)wT}W?#UPRlxkzz$s=dy8(e>Zrz;S2ygagOb zsalSONsU286HLhwE3M2$mPEa$;kn1dj_8mQ}n*Klwfc@2-zX1^!p zn;bYEF-&_e{8Frx2_vTgN~=I;FQ^f@I`J}zN2Od~d2_@t?_En`O_CN$FAEeSU^Ev- z8e@8`Qz$(uK>E$G07Z@J?p-(M= zN~$>?}Zqn_2eYbh|%4+)E zi93PkVD84J*Xmwhj1EtQ=lwdaM*L$J-iV)m{=Ad;;riwZ!(QmuC?ttsr3A>P!>u&T zF0oowA8VUR4ugIE-AjhnC#dedby1nT$3*d&LD@SrW+JSr2{ew=GLFWH~O+nee- zk_WU~%Xtz^=K{qX5ax+RvsRtjx@~)_6Ob<_VlVit&TM@J>T(5f&yYR|b!bV(Auaqw z6{pw5gI=n{fF%?VB)8DAHMr;{ADk%LgJ#qBamk$)Se1_#6Xy@ z#a&F=mLTFG%-v5X7uO5v?)9{p`_Lq?rVJXZLCc!ZURrhQIZ;2vw_J+w5C6T3R{rhB zwcd<3@oxNQFZt&v?8Q+j>6RG6H9OW^Gx5xgWOJuKiF;8&dpYLRiczhCLd!v=DMSZD zq$aY6Rnj9m;$jVGvv+L#i&;2z7ZmCYsyZON7W#@=DX%$1_EhYnUP{a_?4AAjm==+! zDa^5|cThC1C$8Z1h;X3~Q-TBv#kEN@( z9FoHY+(t*uxx-2jBu83f6^XQY0bXM2Lb8vzq*aSFDoDB0PT7D(SES&adTY9JJD}{+ zb@tnv+am`Ovya+p14%Q~;RzaTAs6D@c+m8X`XQ`K5&zwlz5B4@@&1#l`%+irG6m!# zAW|8F=c+c6P1{xxr-7ec+RbIQ+tdPoc>ng}UJCN%B{iOgCZnR(x!~OvXmsf%b^Ub0 zbQtaeHS?vtBUQp8nsbNO$f#`!Jmn5mL7wu+ zydvENmmWmBSUvnE{{H@-$7@1!rz|OfYn!0Z1@qNFnVpGfHqM)h1F+wqE)Gp}wP+V{ zLvXI3l^R5JB74*nV^NKRHF2Sd?w+wD$EZ$TMFV|s0)-ZcwE~)XlJ_xYjbr>TH;`^N zfB%nZk1Pa(ThF~Uw9*|^hr>u0yn3`reMZbp%0BF67k!)EKiW$h`be@uD(TPHqQTt@b+I>=|r8ZlSvhjWhbUDi9 zA?Mszq1;f#I>@rXDG|(NnMa;o{4nPWI1YBE_A_3tMqRWpG}1tIZ&2+4Zxmx#p|R)y zCCf@akrU!skuwZ zKRl0kZ&52HSRVzoWrw>Ia0{(2>e&x1i$$GkN?pObLqOy`sAHx+s zmY_yo@aTaaa}4*~#kLXT6zJ#5+H=((R<-?q^9ekeW8>J@pLQaD4c?OppPqo(JRDz* za*{jl>rC9PS-%qF&aLy+qVIboo=h8c9Ohw>y%^|r5&7~4_5UsMYt+`gUEb@#eO={$ z-YL9Fd%U+~|B5!Wn?X-VDfBqN)2V-+{Qi?Gz8B)2y7GCcncI2p)kvQ(Z#^2Z^@G@D zR{gLgI{NAN?eB4AH~;?X&ASf=T%cwxW-Vwe3est?H3O_vdK#AO?u33HX-mI-Ywffc zt(TK74_S|CM%0nI3dm_fsxAzUL7AqPZbw*`3(`LJ4BwoCq@m9UNZrbEuZa!Yc+uaEDd0O~|{o^08w~17qqRSz+5@>jWmNwC}No&E0+Ex!w z1D{XQt`~jEX#IWr$88$41M%`EYgx1e3Jp;09o9t=g$7ylV4_XSF~oEBh+`)AZw{*` zY6R*vfhaBbtbte|CactB^0sI}5K9Ukm4%x)m42A>*~@viEdTKFDjsR{K0S0qMO9%?^aAap zAhD*|a!uVf&-nw$OSbw?Hg{RNP9BsB)*2za7}UP@`KOni5Ye=7X9 zkhe9G2g*WOv<=1TOF=RW!kS^Fam~XscX?9ThI~0uhlF@;iLGU}}=T z7u9k|$c4!N=w_kzm&aO|Yo%-j93G(63Z#^Z6vY$!a-UlZyN`FtCbbznSoEDIuQob- z5`&gGv~~uujYM8+8D)?ArON&N`1s+Ga_?SvOcta(5-2r>4oVo=ddXCHWZSsk!@Fp? z?+hL;_tMK;c_vKF1ynM@T6aVhlSwjVv_0+@D)*m$c)v>mJs&Ch+VSdy1AP0Vv%u3!TIap4|es&{N}ZV zzr4SG|Jz;q^>^d=8mTW|OC%wt3{YJY)<=a`mZU+Y=vEU?13y>N{yz4wqKCVdlS2Q$ zK={FlyO5IspWFky2z7xAea5puM-iX(xX>QTHX*%&zFVBHq_P{M zUxUgH=j*6^8m(S|%_pcA6Z*rm#xvHoI_mI8M{}(a7%4oFOZKrN<>7Y^u zL`%a^TT-1_E!`RYS^Vc8Hh+B;A3l7gQMXmN&kPEmAQyrz>S!^j&dyUj-x>W)%vaEQ z(zN%}@6LbPyAkuYh1@jR>zh&Gw{g95#_stiWmRd_kWv;9u|w-DXw+sN95dZz(|8>9 z%n}Z+I0k!Wk_JsFgPIg*O^POAk&>i{jrw70!OJl3mKgY%76Bc32gGwa_Y*dZzXaQ8|4ZS@~gIu{X9T zsJ$1kqycL+Av({{oSG(jj;#DmWbHq6>q<)&R?fC%GH^--IcrTW$%3C#S>>CEs(be_ z#AQ`NM4F(U23%JHm7;^(XA*sesQOJr(F0Lox_sHftUZJBs8GutQplu-&o#?4MA0`9 z#ScW)%DH&%a2*b^QsL4WOT)~$GU;~Ul80luP+ch}L|+b8cBpkh3Z_9^ zi&K4uDETI$bZO6}D%H($^QYOAzwJ$|&X}t0L$+I%xF) zO(BS-mAqt@w28QbJO5H>XXVM+lxu0M3L1q#;%UoRn+A{3b_a`vxAiizzkGlFX1&>hXO7+`s8PqTg;HpM z!~@FBp_Xf|6xw3j;GT?sc3B@D2BmFEni-`*6WWr2W*+dG1u2!%5;66do04OY=WX|2 zS~?tjA=6WBJs}!RQ12DmMuLwXzEY%Cw|nI$AiuVhd;X0Ftc^>WX*O8M1o3o8${E8* zXZ0G~?>kA(wS&Beee8~_65C`5n}bqh*vblSL#d|fDeJ~_AM5qo_2!5E)fjJYALZUX z@%FG>R~uwA!GtDwdV>cGjHi`6R-~LazK6ihO?X!>5645Q$!55q2^DZKLwyDkImN0b z#(iUa2<`QU#C;?CPhjs&Lb*&K!ALW}eHbhc!}2ofEOjp4CZQA2Ut7`-V%g18lb^f) zQ-X3%OQbC1kr>pt!?FaZ5A~)i^}CzhCt<(3oISVR0ST#g*P;RCIzUAlL|Ox_v}$id zm~G!BdS2RpesgVax4+&7IX~n)C#{m_#LT^dM{~$144<>K$+?s}=jI`>GZVh^!|&gC zo?YB#8Cbn!a3O+aZE$X5c#M|X*hn7%eEn(XOFM^8ud6qWwa|DLa1DcWNtnS>oWz;v z5bJYIM5i21ZOkPP38{oRVt`W4u$B|@szN;)+1MKPVbJpnI7B*W$nYqzsSUJ>z)~b= zi`gSPuUQ_DJ~z={U%h#Mb<_H`o!H?DU zVr%kD{XWO@mgAA*uCB_mnxmFhL8UWXdc=k?vp&*`PNV7)gxVI>>>(5^ar8ZnhNnmeGg_U@a7_?2D7{N4Mjaio{$;Z}xJwBZeGiC}FFRFCepuJtL& z#g}Mj>+O#RDwXbS)KXB`CTL}cnK`(SdF^dj-8>$jfi6U}?7e@KxyveOvv<%EgN(A! za!uZN7bx?DMKn}5a5YvM zZOz!a+#$@fEoN?i+N;)tG_?Of5@tU_2^(48`stU5XQlp|n5Ve7dN^}Qir&mYqh>gz z069zTI$6^A91C|DC)aP{&o>40t9AR2Z*1))qKYx35=OKJio~!k3u9Hy#xcs=)+>8R zuis%G8rVyLq$`SPMz3a|$r)lg!EKDyr}xElgzM|C1~&^IKASkwnro?xONV)K5VJs> z9dmKhIz81c8|Qt*bG7E*j(E2_Z;Hc|CrPla4wYYxrcdL;rm`Krv!ol&9$D7nDf=vY!_PAS)t z@4x4U+pj)7J8^K9A3Q~>GFnUqbxjcGi4-eWtvu7(TJ$rmoJHdA;_o+k zW9;n@;@$fN;H`nn!duvCx zL0$4n)B`=Y0@5KcSqde|gB#aYW262V?2P-LKfQnd_rpZ1cRa8g}4EoOjJ;YhDPMoIt)N zJj;T}ibB+?bGb+HCBC~8?qHl0T>pHa7u*K`REfW9So~ZTkHE{S)D*lWjeM@sdV(%GvAla9;l1`{#!*8lql&3-HBv_HMuUqVf3V zB<00A@1JYDNblF&3cTk_e`(LzoWw7liB9lap91rLN8Xd!y^ehEtIdAx73O`{-f3^w zefs{B&b8-&o#r?@3F)4%>BS&V`jJip`NFsHywZKrZE*_7r)~d>n%axUhuz5Zb!)w6 z?MI&t{N!Hq6r}&}(Ox)y>{k6R{odV_@#HIr+c&qh)ZLBl4|lQ5w|~0*&E88ErYqKh zq>@3D9ct7NeWhHxca?2#wGXrz_|BcZQ?@YAq5Zv&YsJ-3-p-!6jt+GpP-+FY|LFa09@z8t<}wx~%w814HMSte5{Xu(G>gQ>{xIB`C45?< z9c?vr&0INEq(lx{DWKT~sBuws%8lhg7|X>P&Syj4y}Eky$WtxJsV18fMw&oW88$6L zZLP^%s;<6?cm(reVh*;Wo;4MxfS0Zy(+<<=@X1z|cUe{MBwV-&Jv6u1f2(k-l)xb! zG;)HpnbGD-+O3Uda)kN0JMd?FzX_ZB*X?L1Rb`Y^1SBz`$rENC*>fvVXl%^)kS_`6bKzaAy3~T%=LPN^^h`5o8X9wmf3a#BOsV ze*o-qW6u9Amc1(iK5C4C$zDJj3sRdwsZSMkNh2TSfA&f1v&rAS|9G`m__K8>$`zWX zgPIA%=0q_QA(L6|!s{L)U9jXgb4QQX+DyH*%BZV zoO)q7Hygr74?vSh%WV`?+llhY@L3$uhp5c5>Ro2=Q=l&_?dtun z^a!@I`EcwSCWXu!S_=b703Y=>9u~O$aAnejRk>i&4S28@rd}0kApwS#UC8G}4FXf*x)+w+PCF5K0QAXA_;qwnm>ph(_Htccj#DQdLmkC9^+Bg6V0Pop z>tHsO9*2M6b;&K-Xn zo<)ZGl@{=?jEZ!$O^Ro~S7E(!>Vl4-cDWH`E zRx=^Z+R`-EmA~-p-1X5P*_*dtX6Js!a_Q4KqJ^vy+wzjuwo5ZaUb)sjDY*Xs*2{Q* zHGh5+n{&Md&Hj5t%op1~X~p^fq>tM#?&6Oh9!#WOdJ%^gEg;eios^*}sT*^0Uz>)* zaF-#y=XjB^+L(f|R)ESBNKS;5yL-*D$ns;X%h_n(4;FtwTIyP6%g|cuAesZ(>wq;M z!P?ByR@8^lUZ3(m{&CYqZ4Ucz{XH9h`}5T}9t^XGRzJ(P8i zqgO7SAu>`oCn~}Nt&9b-I$%8l7S5?tqDK5Y zWtXnA>#MN8AE>jM=Sal|RFi=;5zMq)IdruNr8z)r z1e7VmbmgL~tyX%Tvh&v2b_e6`Pp9Nt%uy?incyM? z_PyKNBR8$Q3@_anJ*@$X+#$&)np;}4u2t>92(pKHX8Jz~ySnzU>nHD}k1(bp6%m|4 z(-)L_L08k56eYK9%sAb^IfZTaosMkXYNJS5962aJIWL&kfEHyHqLKN*D6x-uX8Lc& zjkn`3@888UdXP!8$)Ql91kxnXnG}t^N6kFDZdLRmTj!Mf>$e~O{L^>)sX#`K*3dXt z5O;zNCY0)3d(oEJH#rBeE93;W83r7NXL1`CU&r4g9i#esb_s++($zE2ar;imaPMdd@POEc27q zv!P$2j^6+C&5e;G3(8TG&(#W4NkA+MHaWp8wHT>ROR`BhhY%6tHmX59QHh|4RyXPg(4KeN`h3ba``FXwkyN~CF#>B=kZC|B2Zp+*Icx2AaeJp5 zIIFM&sre(4ByJOuR6%o2XeoigZQ5WlU%pA$gF0__-g?^Z0Q}&<6w91!2ugMXaa|Di z4i2qiCDb}?ypNz>U_|Gzb(TkgS9$nTAgmo^n9VMQ7`$rs?Dw9wX4B7Emn{GOVCBUpcuhYKPj^ zW#{MLUA_79pLcmWu5S*w_VV^dxOrv7-~dfo@H`TDS_>JSTYXRq` zQWL_?vS7fN3q&Ro52{=pN` z&nM|eH_-!6%AqW}d=aQ|fY=u_^@ZHn>+(`NZw>7Pd)%JAKPf|{<;t!ZqMUSR2bQn%ojU;QJte!BOHcuOUjB6Agx z@_@QKiktKlgQew7(^1H?_|m_ybmNmarG5&nAw3sFO$^dB;glK8^Uy@vYuk3N&#-Vl zX-E7ZL@P#eMy17|l?4_u;F?P{_chYo6LC&2$b;OAdp_qT)ucfrb&$*ok!sMMB8Y3T zs(W1TRiVm}DQWkhsDX%6abK|LE{R4TKWtQp7no^`?T$;SR8>y=Yk0g+KaWj2_Z zfzpb#W@n3WjPO~P6`yR-1H!3~(mM@glMIrwV1)>YbSkgHp8P0bx&UF`3uhB0E(M-K zKyC@Lazza@UPdX`(s_dh)n z@#1N6R6^C%K;9>m+CcXiLPV;zY1qR%SBJg(Fb}yi^PFWyUf`Y`L{lIk36{h%cj>Kd zY(K-C$A9?+`oj^0sV-|X!)F(ev<92gP^f0|(RhX(V0ni4)-T}i?p^)C-hSL$d}IPQse;rQ8qy%zXK7Z~s@nkhH1N5E9Jn~m8Au_<-EN- zmhEdW39SCx)O|f$I8l4M{vH2<2j6W z5z6~n8JmvI0&Ya090l5KL1J;U!chu8!uj=Q-9uLD1JXQdHO~bktAqM9IOTvQkz~9g z#dw7D>-$$WE05e`v)T)1?`Td0>UBa^A*`P2Y$L@W`hxLUZ?PT7NPn1iAEQ!phpQ=Q zXojq1DAGemYtot?e@XRR^lyJWOn9_x%bl=1Cy-TwjVu@@Y3h*ZUuMa>1jW63T4OXR zEul}#phOkkxS(Vg=`w9C-RF3Q4aR-+y7$yuu5HzX%#A>;1$-ofEu~1sJmq$P z`{=ZH!*a~FX2bF%Af*lqD;SX})=DFCJwWpH-Ie#z`C&;~mp)2CHFZ!g3D$E!yQX9{ zw_rO!^7UPm_tDz}lBI}}_yl=LAomPiv%y$u$;EQY+LP{tT9Maf>v&jVIsYkCbFqH z3H$PL$^$)=C{im8L+1e1P*?;Zny>8KooJk_=e#rQVViYt57825o$w$5^_uRoG>p|k zL%WikEa<$m@nM_vK+xh;jB5uC@1R)($}vGpSIQ+4=hFq9cji89b8kLpD^XogT4|tA zf_Jarn#9s-#lTYvG!`Ky_p+R$Qk*R4ysL*_+s6-aFh!5WpgydEsCSSjf~B@lMjo7{tkAiM zI0krD;=hTvc73z@xP3`M_DNVJ<)t%8nZ9w}!@IzE@;~OzY%8+e z2E(u9LAIs4%)?rl$IE|7ww$oi-JAfO;q3!#I1N-4wSfwon{%q0=C{7`EX(rkq5A#{ z(y6u7Ldz&54x%=pDJW=$+^NanzO;`$ivO=$(t8RzpJ$(T^8#yV*(Nl*gS=0O&x#T( zSSOD;l*RNzivM5N)Wd?(&Q@WJE@eWfJE-!6vqw>yTnaICo(^K!krJ1Q?`TQ*QH zABo2}2oanWM+(h-9MCZJp(5lBLzONdy9>^_cudjH=>iSRX&Q)J3_GY4+!=E<- zJ@7NXzKyPO^{)|K>n47Q=E)>hxntMJt#pTK?PS^mN}LSpr9pe1h^3AZD~C?^x%t1j z-u|SQ|M>BZ$MNY)K;Qn!53UzDpYEO?`t|wnPb=O9Dwf$L2{dp8Rc+AP7?dUE!YNrl zV9WXE?>_m}NsXcEp>pnEWd?N-aG;J>S=y|rHLZJ%xo)C=yYS1)lh|^=_5D->-}J99 zx%cbAmQPZY{ky zD2_mFw(6V~qJxs}K46@meYyJVU#_m#pBMg{^Q*J@Y^7Bi6ex7`6e1|;fND~Bil&)T zvAV=ct`mPx*l(Y&S8C&I-zv?CHM)bPL{JC{&LKg%bkU?)^U~Ayifsh*)Bkw?dUQf_ zPSv$AYE=OZir_p5Mm=)pW=zXEYmM}W0^PZ%P{k7YgqRt~BSS(b-mK+!qM2hJB@^a|36#5odrEMPbH?05 z9s4&Z8zTJZ>)EG0DY&89T17z0Y6NGE(UiGX(+hB#6|8WRYn$n>ND=C)&00mY6^B=@%FJ=?R?V-eai) zI#UCUk-=0QiQFl49V3+m?ttEgNWc7Yd3ED6-FZE!*wCg(aWJT~44yeb5^J(DW-IUY0Js@-UfOC)n<~Ja))XlkOhV`3kY>^ zqdwGTc@}ERx$E93eQ4B}7OAp!aLx%dfSIb8jKTj4LR{1f4yjP03=hR?l{n zZOb0_(2o4HVS3ISr9dcU&|m}SFko?v)SKxT2~r3dK(3&T-LtI$vk z8d9iDSh&eixGjg3hj#q@`fr~m#7t^YqA0jU1I60F+A2aRebi>fQa%cJEBuil_j~&} z4@p)9M16v4j*vzHA@?@8QM7)%rQYgq;rTyo(*Bh+^+IV@frSu2$rKtSqiU(S*W!8d zQQGa7(|fE*PdjNNt1UV#g#nr>&>;$!tfTf8J;b%7n~k!2UFJ-dH55h-sez0eq)C8{ znP)3)*l0Us+d9bqdVX=eQMtT2a5&m1Xsro7#{e=;u z@1Z4x7!{mqM5!8}y&05;$C@ZG+l!#zw{ibiuZtcx7hV4R-O#H;&Dm4z>TbwsCeX+c zR!WA6hiJod^Q9B-C~nh$cZ_&8dZI7H8_zhykCyAk3ay!&;`^f->1U306!VLA&a zv<7Augc|y+GxU1rQdq73uE^KdJHCFo`|*!Ho%erSM|WTU#vlFahnKf8jlLgyn#7q{ z5vvvu*8yqN(Kr`nYR!C!0eVpx?~DHBO8eS?pw2l{6a%$TK&3^9#)?o)q}h}%%M^QD z_`M--)-)GB{d(Nr&(>n7sktN2R1gINhaM1HP9a4RFUwTAqxW%;_Ipu!s+4^wSVIN{ zaTs?3Ge_!)d$+ouY{Rh0AAh~PI{*B~|6X4C=UYekfgYHP)FzBRtATtHG;~FhK1oyK z&TV1aQQRcZb;pQjYpzxbS;IE?1wf+tL^BH~(U} zShT+aC2%WV3Av8}@@Y_u9mTR$t)Y9S1#!RZCZpzIOAZH_XV*kkZx9EFgrQmkl$<}pm^dI|S-{dc(wdc8_HwB5E8n+{aZ1d@>aBYHV{1aA_Ho zYJmCdDCV7|Ta`Q>p={{%_~~ao`?PZHDO^XWLqW~$hKr#z6K0;RMdr+`3)dq1Ay%G0 z*Q=Xs9~auMfA#w0;;bJB^;9O$&Ina1sL_PBoG_Cl3*D`kr2^N=e>mW@6M~eIrcO`~ z4oWk@5_ilJb4y+&QF#gR`#P~!nY4ehD9tpA6j-DTDy=|fHOx_DNY?IAUjn|xWbqQi z(o=pBc8L?LC4*chG^dV~`^dRg>h7=LfB*Vl<~F~(e|6}B=;&3m3t}k^WP`zl5~#9j z=vC@n2-hCXZN}%rX6#LcoI6#C7GY5sbH+xd6wQB6B+}aJ2gF~vAvw0-t7&UzVwAyy_?53xChD`9$z*J-cxp>6dQ#Mmh)&BCy-NFIq3-XaK~u^e z0#X|dluL#V6G*B>)wMJktBJShv%kB^9(cgXHu`iC!=PS3G9#>w3{K8XgUcAp`gu{= zWGr0@ey)Zz49R^c%Ip!u)1ZYaa!NG?3b8bMK(Xcc`Ma-|e_!45>KN=J8mO>?W>2u5 z9HZ1qvo#-aarqwAeNV(c^vj=q8Q1=;i@Q_WAO1_vKB;~3XZ$jwDlE+ks%=80F_b7s z>@jLxb~S6H-xYNB>oeKK&Hl_J!JWE#La>rSR0)!WFbB6%3k|Qd;5`!DYLxt=_wz49 zFaG;@Zdw}Bnn`h{+-6PaEB({oFZ}ZF z=by%Yg>t)Pt=KtnU6S%w!P zcP?#uJxaL6VD!h&dU5q*y*N;Fvt;WrfrPy3cHO;LJtLCdU97!$Ff3oIS&W2X9)!XiGbMDz`~vy#5OHZ~m(@ySN^^ z?+=&t+N|gEz(uz(=Ljgu1tj87W(Fs!p~XbAERZiLVngsH)MYX5!1xktZXUFOlXOtA z4oPCr=*_k9U|CkC>%>18?0)BFn=+$iL75Uj9up*zL)%~vX44|CXWqigxdg!+$^ec) zaliZ2W0^*+f~6Nw3I?^2F)fE2sHK<|zI&lPQ3tot5UV9) z6D=k0XW69x-I{QqrwtChwTj$`K~yt%G)HQ6^q56^?2kw`=~GL|&(3ljDCI%mCJ|Jc zfMcrQ=ABiQLeoba8;*y6I{SRcQ(LN+QYwNa1?ARY+5)msQOTuHn+wH_$R@kDrQBy~ zB6F{trbDa{sCb2?nUSg(H?6Z}`o^%OQ{hkNdU^G5_y5Cw)VE+k#_Xw~5(iMG+jdqU z&9YC`pm#@YYvnfu{>9nljS+WK$FtxZd!4ES+@ygT7jQI!h2FchJmOfKDlaYOJ->h( z7sx}y)_`{%M7efU(YsW4N~|b8l6J~P%5r+LR{qt%4>M)2;@wRPeEb1~=k%Ur;a&M8 z*>j2ybE%%dzLhCoU!{Eivy+&4|FajparB(#nmnMdSHJ&wm)P($b$|cyTUM&$uSKob zTT(#1;9ZXO()S6NP9}Jtc;@t`F8B6VJyY~L(c2^sCsDq?;r$k|m6vM&4@KMrbDpGt zqqh`KC;9eKXXUlLHwmw~4EKrx)?W*IOCjqndA&~g!F{2V2wu15OI@B5`QhLE%L(S= zqj!m3F1hZC%WHLiz4EHXYxTbm#XptcpD$0wezFm4U2yr!byr2AzES^C$lxiyjHB_E zZ;)PM0Z-7WeszAT@9Qak z-kq4AMC!@$^eHqS9Sfg8@8}8a>BJwL`<>*g_;ynDMt8xY^mdE>GdyO zee%z@xZeM90_n5QC+P6IF8&ks`*kk#Hx%&HRedtyzn=ZX*1*qko@A<#%T{UH8ww+_@{-d(5?>&sssb6I7}~i^iCS zQM-HTXIJRHh#%Y+`odFylOgToUUnk!#AucZNJJnO4BQHZpwYSWex|fN)F1rw`M(ao zBv5BAlrtmekU%45=->ezy@xr)sr7~Jkl>pU*R}Rt!bjir(O1OR3+@0O=`?@z{`KN| zj>J!Ie*E3_4%}~+3fH;bzRr1j&~oMd>d#-kTR!Z)s7Otu_~@wJJIJ%bQi%|6#AP(` zyHoljs*g?h!M$m(X=4YmZvMLzfAeMTc`}eG1q(f*c#a?n1yU#=PobaP5hN0U+zG6#$id3YHBt_~z&xw^E?767>}P9++@%s%L~0HiBY>w)lvJ`0 zi8{j4+ZU}3YG$|C^t5%Qn6gqwDNRAb1MET&qCN`eN;w^5NE<*r+q?=>om~uGV+N&a zFv|?)ZW>1y9rl3c12wPb-@)TNk~S&`#Cb`%V`&svZ!_i5$ZZYR_Vu-s%2pyXiJ~T& zpgJlnQG`n$WsaFW&lO<#-N63f|2pq_v>~Qa&3Yb)y^JMG3-?wak*H5=Y$^-a1Jw;1 z;`cM(^3wa|o>%;0ni1K;0FA-WI2qA<$()j>nHQXWYTIEPNXrq`ElbBx?x3D0#HOKJ z%i4PPFvddjoanni-8Fb0KkPT|>6>-Q=flfS?KHX;K^YuCE(P4n1eYvSg1g=2lszuI z0o)(IUVi6a#?3zb0ADK_C3}EoB2bbElU5LD_Bfe)9rSooL%i(u&1KdoG{%Q zh-QanGxXePH1FoN03DEgw{`o$(hnph^g)q>L6S2ljj}uloeEJfO1aRo+E}5y1>Vyj zzlCa)7P3c%1|Fd16`CkOB-3cI7Pqoc9TMCUX6LmEo2{g#V9Es)+k}W!lxVIq*TT%t z)4b2>eP7{+vz`W%p?4b~ z2@~8ogQRzBO;PO5S-(zbT}1gIt(*1DNsPJ?I;ByI3*j_cPj|epl=|Ju z&Fh;~zwPW!Cj59$^|nU5a+mZ5(feJ*3BTEIi}+KR`FO4QhA#6|?`;iz#jxwm`)Da( zrb!@81CoLxwxDSeCr$0qX~lB%^$YznK3&^&8{%@IUoNL#yzCV3zW6CaOySWKEV$?J!&8#cc~k9sEU(W+u3nJ9$}mP5u2R8pog zJ){FH>D^&&=LGHl(7*Z4`{Qo2^ah`=8Dm}ic&3^Z;A8aY8~QK)d{7>b5ccMSZnGe^ETG;9meK^*GS!N6q4F%)N9kdIIrD!%VKbrb zJw${a71T?Ec`0aRgqT=bE@NSPM)L#V?Sz+xLM4cS-5fOCAU!%-@hZa$8Pid|kJ96A zY}t7p*IK3S1tT^BN$Fsk9Z^f1RgKDMM*%-d&%3eZY40Oy)Hw`{SSKi`Lkb7f$)zR} zO1T^b{75~p>_iC%6{3RNYCs8Q;F2;rrI3b?HX0uVEL#HZ8CRMy1!@sRLI4dePzi<@ zx^bDFOG&#>TMs7tMi2_#O{E}F37{SatQx@w6{>l-OW!5geAw7KR^--NRK^%OK#3Vl zi7{eV&q6V=?V@ZxKu#9lGG`RofKl5B|@ue!1g3G3zashLJmi+E8d8j>#!Ak1|`V z3(+32ZPxDlK`2vH&xYA!0(r^c9ul;-NS$JN?DhQs00-Jw9i5D2B4nJoqr!R$kS^raY~?!HO(dA#Ptt%66x*0HJv%hKqzs5rW!1&fZ80b z%@&m60{2vO)8YTHExWgT3Qr9!BYG5231~U3d2}f}nR(_?p?NZBb_W+HFsJG@n>UeLz!l1yp#DiO{^tAQ^fMRp8X9_a z2E|CQB!t8>o7E{2Xd!zlv<=9ge|g~AT$;+t0h!VS4GEA^B9eL_&#m(P!v0=os|c6d z;>TU$mnE?7`M~cQbJC&6WD&$9uu&#Pkm;Ud;k&@^HPY`6d!;wYj>gU3E^DC6{gll| z<){(L96+H9jC>%Nd-Pc5{k@94nja5u$J3cK6`BMYt%8y>xJCoDp2`@Z&lZpJZLr=r zXiI)NkXUIJsvyKcphg{RWx_gpYBRH?3G@tD9ahEbd)&D87URkT|zs=ryaET(Qk z%J)V|#xhe1TG8iplsXHHLWU0_m!5Uxg>=8>MnRH~P1!%+b1cRj2;OEynYqDAnlO*u zO+}0NUb3yG`o~r*sg-v(s$9AzL5Lxsj3AKEI;NLGBh5adE>QdAHrTN4vEraRHj(9$ z7{ka>Yz)ZA0i#=#)LV$N9A-Po3Upn1tVe|3N2b0s$<}_AB{+WNU7eMh55v*dUo3f< z_)W<4$ptT0-B@{E_rdw`sdT;tZ=B4uC-ESsl0A*qovY!sPnaAMTuzH${&>fZ-idWi z#<}Rdm+i&68>=soymhLiR-GgW~PnhMLo) z^$2N=K^g??#n7!daT=kNvX?J?P{8~Iu=uQ&Il-DXP-zjGv_gb5WD;gedja#Q0AJCM zAM$kFFQ}@A&1-qd1@Lws3#^dYxAM^7d^Kzq&g6vKs^8>K1B3 zqdY*RI+!#gq$Ave5`_*+r_Ih81HDVGxJ8mipS>vCDe# z_m&=R#Zs9hD!m7&j|e6Yu8zx;6a>E8eKh%1DeqNIQvCV@vtXiYnMDa>7bh%KGaGb|h! z_e;I`wEet+kWnz|@LUKST0%1(h&oteZLB#hh)=2>9c#xa1PvpEHY=pEfZZc>Fhi#n z^VVw5v;yx={pgraoK28sqH#idE?_PJGU9}U5R-Z5+4Bn0;|(i+JNtBIXYbE0_d7m3 zQs4sZY~VH{S{(%;1}`MBTU)x(mFkDXT;=(2QHmiOO6v_=Im2q4P*I*;W@PmTct`ho zwkBZ5N_E#>dNM)kg~4ME=x7sMoAcmMvhoVLTk!)z-W!3>-@o_1Ww=N&sVEz!xq_Js z)T|>7t&Q>=Bk97nL-W7`#NNSyojn$XRe~E0e2%`zOEnv@NJOS5~fQYO*Gb~3&Re* zV}N|;x_P9|xTG*8B1+9*?t*60A=%uLre1CXAv*;Rh4Sn3_nXPr$g|c;XsvXx6o!#0 zd{E@zxei(a9bZKbnB;FSe%x}>s)d;&wFDy#V7CD+Rxn1_oJ%Nv8#a8Xa^OU7?@JT0 z8A*pHFW^xP<}%PoTS-I~$hM^Yz#Zw8)xY@FUL?KrjiET!nq?q!8DMk8b;6NZlUVFM z+#ZPCR60W9ca*` zVr88xAxLzJlO*M;<(S z8?B5Mwj?_rIN3kn7J<~>MA}qDnhI{QqD2ZAOd(60W2U7?e5`dypYqP==gaf&{NwwL zvrI9jn7KpL7%bUfi6#OM%3O<$+!ltdatG_vAKTrrYeuDNn<@y}3)pIfX|2#=t$EW} zO%|LdWe?rof1@AuCdhK;oBM!<_oM~VhJjPakk}cVng>m3=&h@{Q}LKE8&|fr8k0LC z&Pd>H9U^LoUQ39|5{m7iIrR8&-*$S0GfNBJn32nj;H(O%u_JVEGYt!t`yQM_j~h!A zZ}XD+F*6&8e1b#h&@mj+hnL(XdnpUYrq;nc)CWel&nkzF;AZGK4RA_?R?T5vvqs{g zHSfeY?6mTM>AzfP|K|oxRc9$lkf{`Kvt!rJPl+A}Y4`H@9C;SMy>`G^q0Ai?;}{&h$50ohCsYqV-rT(S zv_vJg9{jZ!CFeR3MKZWGf#sGV8b_+!z2(I%+pBw6u$$MSHV09fDRJ%@)RTcnuP~;7 zl4`1wJaZlk&ZgSo2hhdr=HO{+S#%nd*ubrJsCY!qu06Ki+43%mBMh8(cGE^LJy-)x zu#^fWRtRZ?gw&{YW@@wx;|K%hyZ?OX+b{FXRJG@1a(Q+s7lm;QI@S@(Wl$K|In&p7i>&D*InXSKm+9;D*YZ~4rQr8T& zFwsIMP%h4aDtFHd$EMgJ%j1a)mu99YB{OpF87wV8B{CwF9t%nLIv0d3Vh8N2p1NFA zd&qHUf>C2|%mY?N!w54lrR+oFPKHDFR8PK~t2M^dGK7A(2D zFPDv6k3ibgpiu;==K(I7p~WK-T^9&d&m0zzEoz5r5#M<~`*^mwO{}X+%$C4h1uVp{ z76N(;(Xvyshpl z=kGsX|I*gbOCw21rb31caIOgw1|d|cQ4?E}g=eqsvBBcT$#Ratte|@~unmW`!Eh== zgM~J`t|B{_%W-|_$i`j{2`R?nXp|~=ib1&s#M-o{kj1Sm6kjzC=GxsD`@{L=*}VOg zzg(PM?K-{Ke)y$3)m%~s7ca{TE3M3mseRTlDur%0C@a-p0=aG@?ZSBV-+Q|YpS>IR ztH|AcvKL**vt4G{VE0B^-?_fv@}YZTS0UKf30&>odC46>4;1e9|2+HD!#$O|EjZ7= zoad{^U9jr)3O|3*rt+^k8|%$)DD~1aD)%HemnYvs?P{sx`M2xs(s^~u*jy!hJGt@F zGaX+9_b)rWT=Cx8%*$?0+R$8L@^4a0t^>(0yw&TT*qbTb#DiZav_zv`*@<3HJzsD) z<)*@GN2eQ^H)wu;{`~R_!5+)p&7ocewm6xu^CtGY_RrV6_O)J9?(bH5f@{6Z>*jEC zL6Uy@=O=u7|KsDhZ7*5!Ab1!Io~=RMBdo`f$Ivl(SxS1O^1#9~y~x)?YzuTHi9_>r z#9$ems6!@4Xdbae?=6LeWQ)|1aejBUdA_(YMNbX2(*Tc2Fdqqt*lM?#oqeI%P&xsa z-<@5ZBK7h2i?hq+Dz2^f(5uE$XG95Az$6KcnuBL-lUkqZ?FMnR{_(+guRn|DM%prH z^a(C)q9yMzWiiV+^g|vNj*HX@@ zO+n8gg6r&1AqRyZk}9>4^Fp>;^Vrq$iP&_@ZN};YEi?s>6d;`pDbbMWrPSM~?pDQ9 zXmeYa3_|iEVg&Aef^!HENd~Vaw$P`K+pQj(T1T&r-+BLhap52O-96%)`=e?aQ-TG= z+6y>zhY>flKA2dtmbMHHE0m87`@Mg-?Y(#6wx||Ds0b}MxCVwTLEp{_FSb8X%oXGf&&|b zT1FR5+NsGbVLMSg6{PeSiE>K98KrXqM=5BdG$f}Qn$nD=Y)49`g2a!IIw#7J0$e?V zXHckE1of^&*+Y=I9f?l`>B&v4xoB}2hG8y}10~7t5z@FRAAlLkOv27N2162~tu(pxATkMBEl9XpQuejN^F>JG0^L2R|R< z_M2S~(OBy><`j^o@a^d=R|RKpRaH3p5(Igcjg!xqUD=^AsE(2#A|0$HLem&XJVI3o z(c-dLutNFdGvQ_(_9y?<#l`u>r(HQxV#=dahRtqZazbmlqSf3qig4*mhyPqNC!amH zTZMM!Op77$unH+G;F$unPelqLmMmQ*EKTPb7TzjTUf6rznaBRV@3jNP7gNvZR{q~M zAJo*tnZ2t9FMm7f@B04z^_x}8pTE$Hem)*gFL+9>78{030J}1j`hZX$L3n77OW5hL z%<}1(74S6)-*K~AAgWXdK3WHt<}jNBDU{x_Yo#Dd`nReb5aW6`=EmI4GMfvCWPrW% zaw(#alvXGCQhRnP z9=Ze`8sA>0MhIM#8HJR6_8Qhiwp^dbGgVG3-lFudikA)7|M}4um5u?gpB+h^uLIW#h z*vJf?bEevCPLJDD9}k%PCxeQah(<9%Z_40a7{+73$umm`)NehS?P>?a_|D(^Px|5V zcjtYpYc_{ei3(4%frk@JEy0XhbS{==T0nN_9T4T_Ek*5HC^$HIIR#W zdI^JOZ41RisRIN2%`fax%Bh;fG73C(0{6-gZH!1&by#PSr6u3jIB=48+(%vl#aapG zS->MZB>6xVqf%P0I@(6cU)6=Kb1D~U-1lsr9jv*hvGhK#7I-ieKKq!)hTMxnQ1?|{ z8hN|b*ysyhcH`NrAx&p+W;|GxAOpRRWd;M^3DYX}QmV zh#S!xEj{yuXeV$ZL90yg#50A!F*V;#5s!&+^KtKEYSgB5$%3q1z?L&a^Mn`5r4F6O z%iz3P|JcZWv1hS?bBu*UM9Z^-g)3UJ1WG(?=3c^FCLOEw503ohi<{Sy{(ZT)N{=|b zhS6px%vl>)l_9+uLT^cZ%;BO7=ToAGhr54p;wF!`AE5ORoVzGkqJW1I#7rQi#xW&R z_N5q~mOVo0U2h7y%Hw(V{pYPAKuNgkq$CU1lh1NUq%tA7D|jlyh!k9Tb|y=5dsEZ4cW5)~YaqRnJT#vUb_)5z->kJ>8#{8_IbHU6c4 zf1%@QkIK$S-So&5GNdO3_v(-l6xjyPY{WX2B7K&Pqabhh3_OKIxgsQXaLEypt78Pt z+&i0l-^O=rcVPP!gF34ZG6iQcFqHxgoj`NCa7b~4^fXO84$eFOQLmiJexvj8!Y{Y( z;Z&!g%}_l>aHk1r(-C^flcmfY{f2J6fuq3w<^1DW-|g?rGRLF_iFts%G-we*D$dd; z^_CXO70Rc8x4j!JUZkWk;XPz<9Tl3#L@t^*k!KlkCFN23(Z8Lab-$V-T-C1Y_`um7 zXMM)ns7C|&WUzWg8@0m9oD@tn^#%JSrVgF~|J}SO!g}hh8+t4X4l_dCG9pt&~si{-O;*2XOS^brwKTu1no6o z1TM3%kT~tYI9hA^@3P%!-#MjR(%=~yOhW>j4(JfV7`=2JYN0PRY_0sUKsR@3N!65H zJG71twqUT{8zN7xJy>;{3)&9Bqrz;we>=#+Xc;w^4EEWeaVD5jrV_Q4zK7;GE$T04 zKl=ISjmMLt&st_z6ippGxXGnYtg`L3XOSU zkQ6Q{6sCn|x8z}f?hkw0Z_83mDr00=@d|d2Fx7@JifQ)|G}?l)DR!W7=f2%{zA`nXg!u$)^8`{_#xPLQC*AeXf>r=ag zSHz9qNO((#Z|_Oh)#6_wPOr=0wK1$WvT+?)dHcNBA0v6Cfw!#}8&ljh%dM-`Zzf%D zpT~PAHE&?&zkBzMu9dm*AfLICzgBzk682v7zE$n;YM0*qf?2ouc8$_9_C2|* z{qFjvsjFs(tE=6A@aqb#H!^>B!#C#_j&FZ`^_xF`|Nib6-qyIDW}#?#z-n}G3>{L` zpxVQzR%5w!Z+6Ljb94H{?Pm{@@w2<+y~I7(k9PI9+jQ)j|CDJpq&mQn9n9X*YVGhD znKGBCSr@QvVn@gN{rOd`INx~dnK{oq2UObt7iy4^2RbED_TkC%0<|f1Do7i#*s7z` z6ht-w&p>GE8Idz*uM|_#T}<(aP!E3g^|0<$v-o(`n`|8InieRzAlMLOjs{~XkQ5V@ zq-?U3+&b}-#on<}8}n=-IchaWP9;NVG=vnXk0FuTGw5$^oMa|!_OK#TM@Stl&_JG3 z(PD0>fkx^Y#AjT^e%#*n!OyP0e)1q)(XO?(2+cxZt_`hIK+VzTWS)1&Db|UfEOy*@ zlvkL96=J!9B?eegMh%*+%s!cQJ@?6UZ<|R=kH8}bcDD#=k-?)Ss3k>fMZ}oe$Yniv zI$dyn1fJPTO4HGb2QayyNs6G@L|W}pb*=~J(*@5PN5^ZY;RCUT3C@|(S}BOt>X;#0 zD|tP5J{9nr^J?>InsNS5|FHd7K-E4qTS1O(AbTxn!UZ$U(OOG^Z})z#l|Nzh9p~&P z6)UkKaA)Kh3{oUPOf5?*`RbqN3POYMq%xHyrG8dDaxAPp)eYl^D^avgX9HvuLNg-p<6fjGIjLb+fJ+@ed=iJJ6^m)sYmhE%$QnmKn6_REFb1%?jgy2@1 zGffqJM0NZL_>zn#XWMGUW}Sk}Ie>i@v^pz7jutpk4>LUCdfTb>{jleHx<~QFRYCu~ zqF+NsYva(*ki3mTy@lZCmC>aCi-|YN=M5KsT|E5x+7DdFbw}FP7`f--yh)+Haq{lT zy}8N?imGwNXJI_oHXnfyJ&!l`A%(pvXqgpU|T&mAL@flG2|vx-i01Rv_HF22|^ zESy?K>|!q?kI1orf)SXSLYW=2^-P6wWiMaZ_g{2>BDmlA<;9u*{(k@#&sp;`FlO{nc+jJvw->%y|lug$d@NXpuXrk(jEMsEfz9-oUA4!_A!ckMbgI$c(}UN>RXZ7^Ep9Sof-x>JY!7->ZAd&>KfkLJTG?A$QH-IVW1429p?KO|z$# zS5cqNwB|wTcGdNkd!b~G7!ref5;RVX5lbhwXl(I@dxi3;f&cZ}r`vgyIa?eFG9`fH zG&JT3ixjHa;CMUqtrI^L{CEBQqd$GecQ4&j?VxB89FxLk8jx%r>H&@o=qHX=$nZgO`E?jF;%HkQA?*%Iv+>Aj=Jt}gqkXVmW&^`^o#qC-(8;% zy~^Pa%TNCL?Zyg-a#jkMZ7?`=hUm=b*@|T?G-$cudQ<6ZM|^AbXSb<%(U|ijz<2)R z`A<(=*O>yRp%ry@1@~xZ-W5e!m~DnYk{5`rY6k?lzT$O9NwktnC$C7J3pn)-(bSMq zuW7WAIobm8Md`pLv3&E*`}0p%r(kznuw8Z5S;;|KDp(UiT>`v?T7zhzwovSlI|jbo;u@H8&6;}5)8o?%I z@X&^qXTdC1N6r#swp}O(ZZBW#@4sZ;sH9bdr|i|X~A^8KNA zKi7`I@kKf}qssd8;7@2Ro%?Ik^q>{5yt90r*sBpAsI7MYcBy@-MJum=UoZ69TwB#@ z*1mA|^L}~u)8aCIyZrr$M%ZV`R4Jj4AmBL!R$7HdAuE~LZ|_Lls`b^>Gv7LU6O_N7 zUH-5-uxMX@cpWF$TWBqX?vo8Bv4O+v z5Sa|glw7oMP0P@>M*6^@=U10>{CH*i(_Q7?OPf;R&LN|v)WKc{G$ck2VVaCS+U*;T ztM!kLJjT7R_hx`bDU?b@ch6wwf##!vsVDYMVqsaHd7-sqXU8%iJ|{ojVgP~0b97=^~i3mBevks@Y>^yyi#bam7 zyC2T~b?^JzV9nmFNiE9^C8G%wxNAmh%^;Ggi8Y^bi7LO+>M3N;^~FHHzPOUvn=8%K z)wCdZFmO|asdZ2^8ogF-vaA-p%-A6_;}_ch`TfOJIB)EwRwFj|0Iwy0IXJXY2Xk#@ zc+wWfLVZv5=y*2|y}s-E;e%iN>B4_n<0q6_V{NsgHJjkX4LW0lGsTokNR<{(XuW|$ zLVu(E2Orm7@n1g5BSCl>}do0s$U4?bxhlTyoFZ7*XUS3Ug z_IGI0O4S?$ap(ZIplDPBM%R#v8xh+L=?dk8VlMZ3{qF3;{_cr$C|qMl2t~o-2GMC4 zp{m8~DV4G?-jh9cN3@xev-8~>ZyH+^CiL7KJWGT1Ibel+u$LHpDaF0IheiBwseQjc zGD@sUozX+g;Le0Ld}5O8)Dh~}=ROz7V>=wTsrW|UzuybjIg-BUdgJpc4bzu(`#49`u5 zMFbBCoGid*F0kG?SfUcgyg^){d<4ut=?C9mPjfUY$r&RJ23tvxkO{0a28mrw!VTnJ z-D4nL1YUD4gDo9APKx>-}kjD zFQ)(!%qa0#Q<9wJ@1xe0ZK)UamE7G<9;V{9@8LOIKoA7UuOagK_P8yzTr~IEFrzn6 zEd@HNgSfQ9JWEMSUwsPue_~Jnay9&Vl~JuRG#SS5yisX1!G#A(uUVz~th^YVRoGua z>iVb_6%L~-qqGu05-U_oLJypzr06D#)K%D*mU@2~_QRi!%Jjl9R4a(3Opppe8zuDS zfhT$7$6)MH+)GM)c#`$_1ky(dCMxJ21BgZfr%dR%6b&u=%y|*FAb#zMV}DreQ=Uc<&Vyi6P_zlPovyp;-0@b;p4(D)LI-{lU9m{cFW2oYq?N(ZIzWRH{RX z2DprtgSVi*!~%}uUQ*)ys`Ys1G)p>r&X8;olzf0KRis?UklvW2eohnl+Ff&@ux~eJ zW8Ci}659W%fA^p0w^#4}yMf(On??;YRKrMRf<`LfS~5KL;xPu!K_1k;rKtapiujFR z{rwxe-VCwLKiZj4ayE@h@aPG|bHLi{urjK<*Aj9*S_4~UT)q!%HrZEteJycnffGte z1!Ob9dJx1}f|Nm0X&JjKkpG`#rY)VtTaL3<@Q4#sra@;MXgP(_dG@AprOxyfg+86$ z51QjJHP5UV?RvyW#{GCqx2ck$SWvw11C3_@f?+m zGA-751@ixs%$++ztmWx3BlVd;gBaYcLuYLxhy?gIzTgL zaA$*4o$8#(9z(M0z%MHH`rYuG^-@b@PPtadBm)Ugm|Fm)$~3FTo|bXC2Ktghf2AMZ z_iv7l&S_n;rwWavkL%E60XdrwNkL~xi@rz1uRJOj630hlm?Jm04jElQ)e1zr!-kYW zrIt+PnXa!r3V(Io|M|y$<9>XlnY*?owW7wrAf*USDZssrm~-cnmo|HX`nA`YpNXsr zkAymNo93`G6NuPgF*`gb)*gF_RUag-K)$5R-+goa-d8CsRAWggLUWIx?gLiS1os+B z$~B6PMd1Sa{~+$cwEe;FKHR+bx<)kY5r7tsF)`}w>31T94cF7!`&`_I)I&F(p9=z{L0g18o#vV*0N_S9kwivza~ z{IX)N@2>mxajR2JGz0)o6 zgGob=38nJ{W$xhI4L$MfJy@Eer~ApIqN8H-xU}=dHw?dO}lgpb{H6XvZ+; z(Rwc?OQ3os`X%Mwv$(st>i6ZZ^lv>_)6Nk#dj@49Xc>wqa}-U@RQ*BhD(p*2{iEy6 z3W3}$S1A#NJA<-k2w4Zkk@IA$IV=Jf#Q$4an{oB4dsF)1>h|ucFL{UCT6>V0^H2m< z14)h$YaLW#NM)utdGRP-Tg*i(;2XX1hhq@O_d>~rPU(z3EP=G!(vNE;E;Z-Iz6{l; zuwQ#G^pD@Y)7x(rmwdYcm4>v^F=$j!o&nN&K;WEv%@X_L^z#hmvN=D0ywjVz58rKO z_oM9-vc;%{QBtd*ArV|tM4=iZR~lvNqUR~>S8ks_J&lR~{QbP%62-wuvqfa#0GhGE zT4u0BArHp0mPOPq)MbTS>+RiduJ5kqRbRJ9D@nOdPAEwND8~VFF6gA{Zd|#{2WjiT zFDZ6&RA=K|JRap=z55=m%WNrweMXR$2(4K$y~XIRRv*3E*A#I{;hV!efBg5=UH`^! zK2q8_H!~BnR+OGPXru}fqBLhWzo0??ZPLZKEL_8DuG+l=yQMvWzg^nX{{iI z7RU-m3(M;3DDEXC{`KBH-poR)hUDzChtv#Fqk=|Ckd!CX>!dQZq_MQ!QQV74bUQvu zwm0#t#nuSIuAts0q?H7!Lqdrm&|I9CmFSn2`|OI2AKYB844}6%hUP(NEfT2Y0c&%@ zqMHebI%&34!l{Z|bBycMC9XIkb=o3VA3ZvKv1<+zy}q{gC9-!d@JPfWXm@ough?JJ@CD4J8d2Oh$qE$B!02j335YU}Cs@GG`s-VT0rbL9FTq+7bA3Dd`tau4%UBuRdp+>VnA#hF*TkB>41RS?=e75LEl=d$|NN`_-Mk;a zzuSHAe1s3G&YSdPJCf`FkUz9X$kxm+O^pQ~NEFf+j zT&1DJT4%PLhlV|*>FlI8|6TrS|2t;dXH!D)I6yKcIAp@Ks+Fx5A4?#42k6qo)6OLj zTscldRI4Cs6Xv844V6kt)C28je*WIQRp539pYA=3EGWVTDxrb3Hnf&%PKAS(wx9a> z`}kIYKmO0v&THB(f8w>kL6kB?SnI( zNG)KDAfV(C7OcaA#~f$l(R`8eGVH}g-TDtVv+VBqg3&23dT0&Qih+YTg7wf#bFxN@ zoCAOtZ=F4lJJ-x+X&9))0jf2^f(R(m%rvLTjEjhUU|&PP?gPJWO~-`9HbLwLQ8%>V zC41ni_JV?oTc=H-c}qfQZXPW|sZUTT0ctJ4LUS%T2kU%T!o{uBrqHq_Az2Snl)*j& zi0XiN4ak~3P~u)&JS?Gn4GDEiLXS}fi6Yb{ATb4pJYh|G=`&OBdRRjJ8WR3=b@$GH zpxcHvggSEZ439H{ax_Q@j3g#iQq^AaqT~h8%b3}pfBUW9++O|b1*a+M(BRqOqzM#L zhEa(aU8+qEfubyGo*`b`d)h5{*Nx)D9z9pMcn0;^AyzAht+A_^rM^eY<^8GMl6M`e zOd5)%3HLBS(F-_7LZ2~oi8h1IJz_5FVLj{(|NB1fw`cO3s#f|4U`Yfj+My#%XyB<{ zM#za40iR(mGVMJp?T^>d{)Lkx)w~P^uk5LdY~b>JG+3N-EXY< z*c5o=Rf>@^3*`<= zJqw3N2^aQbpBMKdzw`d$MVzA6*kCzV5T^v~6c9!$VFqiO>_NwI;5P_c7oK|1^>ju5 z+W6K3z~@QtO-TUzFjhRBwi@T-1pFqv6(jF8aL-!$ZH)fBvKOxH+nb2akFIXNd#C^1 zlL8&pEyj@HGzb(`p)@NxX=>G*xGpp7HqI;i>nq6aVcBP!MJ%Ig5YTXj)*eurq){q! z81Xa9^V8dTqSMLZEQ%C_7Z1`#DzF^5aU&kop7TrRCAhO>5^d~MAz2AjheNV71g31I z#aLXQ6U^r&xD%nAnQXWr)*zr#2r_d_AuxQoYLDfZjz`a?E!;k1trbU(FaB?oO>-&!m?6+j&$w;^rV=y zZm>`Z#D!tr8QD!!%B7Wjkn_3v@Q*kD z&c~-b-NT0zT1un$1mV;`ArGkffcLJVJ+>^1#drbpTs8lb`@i{vztcM(%ZcR8Tcw-7 z-xfh}jOMPeoC`{d6DGBzxP~^1wfu1t;4tRpMeKh&d9)E*Dg>oDP)a8V_lcQW4Ausl zr=waPq0c4h!@GBXy7_Rs*;ns=d%I+@ESWM}YFJ_$%nTpXP-2;2PYK1XyHy!;EG_dg z>P3YddTf6*CeCdl#t@KuH7J#WSyN5D=Nzp*XgLo2Rpjj0En^=oO;{}*rS=Jp+K_Cv z)~#1pUZ>|=R_s@<|GHnI9k*gxdi5>}_3EHH1sa;7&z|yRZaMoR3bhvh}%1429;Q-YWlFAEeZqGYn9?j};6|FLZv^%6sLoQM>ds7YZIlpra&`0>~)n}P4v(<>nRY4LPB#($0-DPCU zWyo`a=URO}!qc`RU(`obhe(nzy=OIWNJwGp?f!p@f)51GPd>Cr8cPtq0GVwra4Rmtfl_Sm)%CBQ!aI ziU&x`35m1T!90g=4U%?Vg1ocTDNM5&x+evhS7?xo*7`I{+FZ8?@_7l$09`<$zxG5_ z)Ka2}(L930J0x^ROQ8=NA-VMD1m(O0f2eo*?)vZB^_YX^Rw8701`!pQH-f}zITbaZ zOHbU!xd_>vM6s$h^jyJnHc%#lRhw|H)Kd!0N7~Ew%qIM?l)OWCjMACGoEs=lfrMBP za;8kCk!IdY_sjDbt1L~l8vhdFmSgH$m3zBaV3LuhG{cZaAg=_;MUYb0F-H?l{2=gEWn50=$4Y)t zqbXtSm& zWgw=Ype76}9#J@iF_dR|^wIW$U5@sBMg9GSB#k_p_0$}7rUs(gAzU4UTF!%p#JJe& zb>NqjwPz@_;NEH!lo=DqB*DZLwRasFv-MUEtGUQ{`1#n)fwNkRBe&j`G#L>N7^A5- zayDDMswWWVrntF}@7I2(WB0mF3Z*q|9ifYZC=WphFeQBJ?}SX-Wq#S$cJsNWqPC8A~e?m>Or6(4FsyA zq~aQf?sENb5vtoW=%mC`C8PD_e&hu0Q=z6ldJk1-?BROunR6-Rhu`S?zrS#iW^SWJ z8nD3uq%FXD37FNJ)DomTn(Mu=XODhAmig!RS4XW15oOhqpq3Jd`T!?0kasaoE!U=t zk|(H_wkylELErzEUcFPhdUtjA-@X2EjN~N*K@?FCYlMa-$T4>+HIqK(`yU5BznmA^ zq>pBl5@U`=Aj%Glk&v?2)+{*Jxktz4+T(>;R*H}`4v51A6lQ`^NeIJbMu{QBEvMiD zbL^AD>N`8}rKjBa@nMKrJDA5nuHE7&A|tll8&}UybN^K2UaSTi&`1o5+F+?VoQ+wd z*ED&T?Rlr8KYqCV&fkyw&i5mqesiPmw&x^?6iN`Vbpg2%tmcZLHabnJ^YJnAeOPBF zebC#gp~fBx(l7;$z_4Hg$#T$`W3Q^uSzloIeJ<(XyXZryD@CN>5#(Z!SqoGq<&r7% zywKhTJLA=dpE6qCbe+R@-@W;>$F#LC`Tl+P*M9mb-RRX{uE-x+iL@e#XD!m2w39Ew z@>geYugFkXi*$4^{{(=qX0@;`~7?7+gYT6dmO_mLbm}@QCJxnX>v)U z=jObuKc7Nu{@?dD;BRpe_mMh~M`@8Vsla0;kjR8&PhjOqVkW^B$8Zp%{FVwtfB3JnL9!BFcRDbdzWd-i z-BD^7NfWHi0Gc6yod|~IYseqn87k=^Z|2sL>a_=WFOHN znx7#~PilXQmszb4Dbg$%#2z70GiGBeL2IVcx4E68!585DBRUT8ZcfP48I*GYXGxGe z*mLDtX4vNV+7bQC;_q_YHrDIDSaY)U`4>wUebpxqa*xeBfBf(5oqxNzy7=$!uWvUs zgP(u?!*YY)-e_n~wP=zGZ`nXW8Z7ZdCQ38pF*q-?(LuZ?Wqxm=@s{rLvVfnz|JUXM zzwLg*%~A`BkUWDXS1`?vIR;CzBJ^>mXcy{|w72`aXPZK$BbK5dD+$Wp5nAX(Q%VTo z5btzJ;s;DhpE`IrW-NU|{@Wbyu{P|XQ^2dXjC29$s zZGuu(D8~RRMbs%5dOX6j19UmcfAH_FZ+1@WXdTkEBMUc>rwNTwP_0Z&k!Cbni0_3v z=P-RN@AGeaPQN;mIh%F zkP<^IJs`;g`!*$^gmN{OJ#1zd7M^G4!*vb*i0f0^1}emgJ$*N~fK?Fea9 zP|5_(HK9$$GAk-ym7yZp9h<{A`8dy1I74N#c@qIn`q3R!)~ zZ2nBcr6;cCw^j32li?$>pz0LRP=QiPh-J2%O0n#AT+2D9t>w4F_A|CQdy#_JLIO#j zP)!YK2F{_5AtPtHVCH>v~;R3jZ?6MbO0Rifj2c0`7MR)qM~%T~3deGYU_J-I12?sKl~imZhOVH{87f`TOP5+g zyTa?PGWh^)Cw==e;eow)Y9%PBr~_nDA5`yjSg!*(8QGLNX(_}=XRo@^<;*B zNXFZ=%u9!onoO>>5~gXipG3sRl(UB%ug`gon|z!7L5xzX zH*#1g0~C6Kj2;n{X2{|i)3WeciGF$!dz=K5m}hGW=g>eh2~5S&jBWJk?A{KLKAoSi z1G}@O=VB?>fssQ2jcSlI8>-Hsqov`aA7FVxZ(#>_|C}+zf`&Ozy(p-+1h&`^WO^q} zG1)jk_Tg*sq%7JnAERNq zSI`^;;W6NnH1(cDW?rFeUyd5q793nULrK5f;QFDAaTlZzoIitN6+9N zDrYa}l9*&hMw%^vQm#;=fDvd|=*{F1=LPhXl>dBl^|)TVzZ!jq=qRCUFOW163I&0c zI?-m!9)m0OrMv7xorT`EMa&w^T?&#op+uYDAO)IxsO-77qzCw&YLb5ry8lkkR9eqn zD!K+J#VB z3D6!5wNI-vm5}PuYJNaI)hzj95!;n+W6Z8I!b(&WuLAWs&;s+2nJlKY>@QLG2ljhP z_c3Imv?M6jDl`s4NL*%;(qp2PB2F4YSX0tYek0Asxd|#uKnWZmK^ufQk+vC{`0KQs zqFsKZcmAiVZ~f!j-v^StMv5hj2x{&iR)dygkQt>=YCJeC+;;#^SMOUv)ZHy*XLf?- z%%C|PN~J+dpC;XnMfOKyPfsoFMCelLl^SyJi4v;AMs#SUre13+bMEJMk|urz`EVrY z=6ZA3aVIT&X7XB5!Z48M3Kbrxv4?1xX*@0r4?&(LqS=J zY+=M1b5G04a0T+o$^Y@24|n%}zj4EFUOdH5Em5bAIi-O@573k4HmT{H!4&~ zMyZPhE_Kzw`S(b?D;g)=H5W6)p4vVlS|o8;WTricaoJ!|%g9;k0lVd?(&$R6^r~ zSyMo1&0*0p#wfKCjV2b4GCqYxURv#bir*Vs_MV#Zn3#1GQ0WSZS7P0^#lf)9BB&1rm+Z(CQ^;OQ`*iW;>3ilD;?7djG_V_?It9?^4vm_TX30{5 zP9xdN?SxJG2{P|I9o<@}rGTtvkY|O&&_G_fF-1vP_mext4&4?cZFjg?=ZL}KbsC5x zL5UotIhzd85N$s>Iw83Oxyr4@5_^Vtc2JrX5|vQK9BwHmD$fVQDQEK|?=uuJP16jC zx`BE~Q0fFuLZ!+mG@o-jspq~0nRjkorc|RcWLO4O&QPU<(d#U61jpiXauHxD%KC&((6WJa{E4J5-MHZpQA z)*{oau`UFkft`-x5;cA?u26dIsY%CZT|uo0Br=0SX(>wgO3OygN3@d%5%$6EybSN| zxx|S&Y67J^A=CsG;*>74)hf?eo<2OV4>#`wHpGf_ha?>!&jl=QC}B*a9)`p{m3dNg zvk!OY>hYpNoEXmJAm$3zFhFEEO7Ltg?b1A{;dxBhd)ddzfrCk(m_!6p&M?;rEhHLd zPD%RnwEok(T3f(--PA(VSu%m^V30@zdn@qntdy-<9s7Bn%voLaDpbyDwR%Gu!9m0Z zts2l{?wNBPVY@z0??^lXzpzUdxaClkA=Uz@aRN7r$SRzyb}vrPS)O=v>>l;*x?jKh z$@OFV+#b3&Y!r@3vZ4+b&`1o)jWM}4P98ZuZk8MXJ=q4t=E|Kre|a>CXHAV6i6w&i zn9wvTWX#z{NM2=Gv3!I({a{*fk3C&Btf^#Z4jshSATvdT5<{v=USfMj^Ynf6V{lQzrTCDx9I8BR0l5FWVRxu zGR$%SrD@RA0$d~{r{Gf;d$St<%tBrWo^ua5%*4x@&co?jUpe33nDdgV!6Xs{gHBNR%R@=NSbH!(a!!LR!6#Vc(T;t&`!dIo9j;4wN>%)%sQ z^<~=njBzr%yMP_=r93AIqoaAtpfM{ns)I)JuAGd*Hm_5w ze@!OpODDj-|MB?KYtLNXfB2R|Ye&y^yy@$;_Z&XLtUL5@3}RV}zUJKDs{Hu1NXL`Z z--Pt4raYQ;{Z@c4td8|r!Eb_pQ_COC!aV};JOlGBpFK^g`ohm2R*h@h`FVEK+Dd<( zk+Awe>)vda)lApsnY;z4GPj@!)k6y3+_~EB*_1Boel{b_>{_8gh z`n;j@s?U}&`l^2Vx?9(ufAl74Ti?E>;vYYKy(L-`@_Z3s3B|pxl9q4YR7a0v@O2jF zF$(iai}UB(wfHN;17D8ydZV*}d)q9xy`*|YpIEn+Tn%-j$F4_x&*?CEnIOd=c);fXeY%sBjp_8%_dG#f4c?;zU{`da; z^S7)NULv`h{ZmP+O_V7O)P=y+3j(DvGFMA&>|vSCLG%69w@a%Z%Czm0$>&H2EhW$_ z6H1;SC5D*?Wt&U%Z7#gr+^`Sp9E7j0-?_g3rT_OQH~OuAs;HgINIhi@j1eb+ zq$Nme0okWl9-KVVLVGXb*~s5ljK5gl-sUhOgX$1Fd0$J{0Rt2?OV+!QGFZ1U*@bgN_t0YkyYCT89Ffyn_2GZEm z*MXm2(hsk0`n#9MO7zfDN{Tu;p=e@oBSvybvr~0XwrE(;&OcUuc>V7B=BRDTI;^;W zJrq!p3?|JOU1Ld&qnEnSUhpnqnI8Y}VvniRsi%(ERY9Rfh*5yYJcq{;a$lyePiSZF zB72J2aeb>;4cVa_CP;`O*)x2kJS}st-CkgQjyZQ+(5#+}n-?Y=NSjCdjP`w!{IFl(o2s9qwdrvkH)QMjs@_v~|VcwPj(kc5ZO_LhL+ zt#=6>eMACzXkaY`y`_?xstxUnfWwgIrN8lS$Gt!PgZq~kzuC>7?dpY*Sr{bZ;L#>h zBA1xBYFRvl!-(f5e;@kT{P~^Vy^wP;LKr#%gerkbP-v+M$x{`!pd8bKj8)j@6||=n z)WT>rFmmVt6kK4XGOPxzHsUm@yYw$n`CU&@>DUT%>xS{uz6jdTb;CXA9jLe$1eQY^jfMIRw}VHMft zG#s%hE;{m-(So!Hferec3sT_#ft4_}*Y`=fm#xTrwrehBN?DOnm`ZX8lo&(s8YS2m zJx5ErHRPs`{b@* z20K1~T2gL9%pcc_`~8a}MWUcEc_9%PBnI*Y$!J!h80Vbtr9VXV(i*f4LRw7UM5XqDeQIkGTbjghK!!&?nEBqRCNs zW5OmCbA;Z-)#`3dv%4mQ{+aH1M|LQNy$KN&n}`79F?f}bNE92Aw8Dg5_EC}-_UvCQ z=|4?a;^RY$wJSbJYm*iN3uS?jrNqG2A%oV^s!||uFa9XWtBSvC`&+Tu`-rR!AOL&x ztTQI?USvZ`>M|w&g=c}M%!cQK0Kr8e2(?rh!N#yTIxJPmE`Wv9Tc!%i7p=^}fSHkC zSR0G6xPZXq(Wj))Miap)wkgnlEv^tX8{swF7gl%>&H?I70wF*^uY^FSgiS)oAT}?w zR#3iTWk%9o9XV^GMHRF~qnR)oDwr&&0%WD|eH^xe@?|Si3a9mu&k>6&E*M6yQ$m1P zkN_NN)=4<&eBjhqVV~X=oQ|H+h?~d8DxiXq93vPhFnA*nWD*fdagfWH=+{x9j@8G_ zv-xclc)hn_?v1A?HKA5PAuupT9V4n}lQjVJn1fJ3`TCU^=@^|uQO+Vo(g;ogQYsp= z(7}O)9A&Dk({=i3-njlN{u3`6o_nco2INPYa7secr{3;s1S)mNh2r>sJ0t+l9 zS%f4QDNsZW5+FkgBKThX0gBg{6P~bAyY@7MoDE5gkQ_qP8c9Zr$^zw_l+991NPl6E z^$D+G4Kg-6YqG;4eL(OjU`Re=fJ{Y3PGYhW*HWYV&$G1ZvjTT2QKC}GvP3UPAz14$ z1Z^=#rec{3hu-jvlDzcd=P9rKW7g5fTr4J01VT&+Lx~=Rhu{?ikzGD4|HT(SPnqeR z3TRiXGZHXsE(jq@j5cHx*)v6s+A2F$feY_NK4k{G!+@NQr39ql3PLIdBZ0->xoG3r z$tb5PaN%9ap|nzvWV1^O6`PC@lf)oV) z7dE7#g~d!dAw&T5+7lWUIvYuejTsjDIt!IIv%4|xH)m(1AwZD=Aw=uY=fnsg$ixy- z<}@Vw-IZM5mJ=-x`7^=mn2ZcaAx8wM6Ozgv6$N2zNk(lRa-O7n(TcpK)xUY}KOFo7Z?$zMVJbifQ6>zW7?a^7l8UOZ z?FHYbc$L`ayH-h;vpm%5MHy*;0b}wBA+p2hML}=9iC!lmeJ}hV#VfS@U^aM65h#N} zXGK6TMqtoTP+B1rSzj{mxhxmV2jAnN_O9pj4wxjGR0=}09s_HEB#jJN_((#J$b0F@ zr)RQ1`y}OpGMFi4gj5s;A0-BFqqFQdvKMq@l7 z6h-K>4yau$ELn-1hezJEVv#+ok@qVlXJJ%98A%~PB%~k!EqSj6JIpvr`CKc{EBFjHxIz#<*lu(oyv$@DR7D-wu zRmoX`pR7hh`QjS|gDgkWEV44nB$1GXD`-4vq!c7-SDa=J(t)U~*0oYCCYX=h%WF%F zQd{Hz1&s;;DVm6urD5%3_8}Zy&+8c9r!sut#Is-aZ?@6S1#bu~K|rG|VTcS!!IEdA zf~V>F^|Y_7ppQ&{x?3zWFFB9us!&n0jt-T}3QY(FDM3Vv&byQ|+mfs6_?6ui)wVm0 z_>p&)4Jl-sl~8DkbqHWI1}Pl|rkp{Gtdr{NHB9fqYlkgHd+)EY7fwq?Qc|{(8}!}_ zbXgQ#ECG~!Nb*asB0f-_(fm+!LT4R~NCsIKLP)GIhLTV-OJ%HdesdmnlI~?I!f8!+ zpXNN~BBX32D33-Pi=e-cF#HNx3f-0C(B!n0wh7cHKPD(lw(r7Uz z^;KN^q0Gt%F0m>O19^|25@2BOP_Yprk+!Vm&*L9e1f zsigEVWk^{J%Y2>my^r_H*_sFQScQyM#)v`)hoG&-D2qlLQxZa#=r#9}@6)?Rn?KyQ zcMGlh+g2VAHti11;4&2kj5aAWF$N4qW-P`Dm)S=bdyT0fec|d1#iONB&Va}WDmes4 z772t$YkhHng2*NA%YT(f^oGgcsi-WZ%`Tv1NC-(}3`qs_T5F%YOVX-QsjuJ|Y;)T4 z&Xki5vOx>QAlRTVne)pZuqDwRActrZ%R9C~j(lG9Qpla$&?p4y{$VU7QhmY??4AtWP{ zkA&GNi(surFI7Mr4ZEORDP()8cS&7(3DWZziRg$Alf8<}+4@=%P=isu?Bv2+n2uVbYN-OlniKwC^VCu!*r*&!N=$VY{rH34h(iy?Y zgodKQD2&EvtY-$xvBWXCuj2;%xTL#PSuDToNbXWLU{t^oIU`7^kYX|@y$QnR9F*%P z&|zv<5_-7RiHH*^i%CL2BOReHPN9vZIIfm3851Iq%v#h(gjHazyVyAd~>;W5^h-H%hYeR`-^?g7Wn% zGjayRSu2H2n2n7H1OcPW1&wf)gjLNyzOqhNQmj?Oc({L}QjopS2*ol2>4H8Hqs~dD zOb$x2eO>k`UcO%zd%FlAbRr|r6`v5;YYg5LObLvzLTHVf ztN_7eLejnVWKmha^kQj;w3ly7fZ93AH<|3WppKF1mP@_3kicr38FVD zh5c5%8(lF4;X1-9<(8J0b=WF*7SH>>`?C6_U0VLn@w2VI`&76VYE(#E}R0y~r_W zMyVtt+KB8+ltEyT zN}-89V<Hgw_Y@{wq$rLui z4-mYV%8YOtnaeU28?!-B$)YhPVNli~3rf~%Dqi<~!6e-aRAjbV)9{t-TKZI|Bs7UN zLNo>`nvBAc5ZY);A@pMRR4#WV`!@N#z;;ZTNG4PPB7)BjqZN$K=3;?J2Nk!ayx^7W zFPhnTaJoz}IG2P&k_HgGk?0LOBp(zc4}~@>y`IL!=EiTtcU#dWP}0YQ(!_v}R7RhH zP&n&ykuo?(dlFuv4PVZweQN5UIkPsiRoPPnBn^Z@fVaj#az^x`Z6T)8Kt$00jB^^7>794s=4#7FX2oBJAFIWI5mZlfDCvl;B0j92Bmddg# zN}(nW2nGZO@`Ra*JploE*ob+Jo0s=^?A@RQ5xkEPRRDp&Ng#nFV9(3>q1ppv;@6fZ?7(qm3bn!~1Uf!0-1=k^4)c0R} zE`gXM+M+ZN5-C7H<$+cPkr$EfF#Ik>o5Zc1nUXCBSseqG({D_n{5#!{=*u_J9W*H9G@=QHTg=qS5Fhd(=i3n?P$RWH0nLG8giKKX9Hc zIjx6dQz=>2Akar=(121Hg)JyTDIAKo(s3{6S2`E-9zO70=4GRH{beg3_ zT2gWum5&919icZ0&`Ik;1}}>4z2OSV-@h{5OGc9qzz{3%3k6h0C4?9Zl2Zm_@rJb* zLXhn1&=b7M3ou7K@DzXo7%wrFpb&zI7){KWRk9|47EV7J=_^0&)U!Lr`|#QjK}l$x zOb9Y(qyip^edgk$G%8fo<#Ikqm%BYUii?U_>ZCW9S4L4VNM*5<=!~|}OJ{r0dmF8@r^$NR;ge`F{WR<0F{Bti)W z36w%#$Vh2pjsU%!Es2Y{M_+00g*$=SO2a6uw+NXDDX_b2@@S?E4~SMIoIgpeQWoRFloX#MZpx*t^|Y<8KZX*P0B)( z4@St|-Ke5{sR|wQW}VUn0z`w%P9qdikU(h!p<)1=3&h^{t0R8dD%HJNXOnjja=~m| zL~sGnv&xt_MJZVZ;NJ7DBYv4Gt%r@Z@GOk+5+&u%v^WgTI0T`xvkXe>xF!4gg4TMA z{QgTFJ_Tz5LvV!PjlduaqtPiEU%X5lo=ADQfX&A>-yfV*vPeV@A{r|a0*Q!ZibW-C zBA+y;+)sZ!t&2}8oAEQ{{N(}?j5G+W0z#1zqcM!JD6$;2RRMajA1PkL`#Z+6h@x3U zmywNB2rgtKArd;5f+j6UhsR-fZJV;;ca#H|9F$@u3TGvPCxtQRh?Yu9Mnxa8uc^)D zJiv_=n^LUgg$|hrNqLE&lR|PjW3--iGFm4PPb#9Xr&x9NJtXM_sD!K%AsEUSY+wX- zKDrnvgWS~M+LnF8?-<2WlDy2SpzvNG7#ER}cNnb*Li*&L%{8^Tv|_=OVks~#fQd*s zX9VpH1}iK^OFA0{mN7i32wX+6hGtnQ9V?+Sk~aY%`GDT(h)EF{Yn}IB_Zu!YzYfo= zS{N0rlxS?y2uU;gSTq*Pk}^15gxyGXxjD6`toKBVY`n-=AX)^94!y`3wbMRDN};Iq zM6^qI>^)`Ji!?YJi^mH2w;7(F~uh`UUYN5XYq2*U-lD6g=7m>DwNqP1XTb%>w@Hz%AB<>$@P+Mk-1E! z=o9*TyM{p%dlG1cacCF>2I&*Buq>iumn;m(d6A{=q1;N!qLiQ+qY(;$qe1T?U?Aj8IM}6ADtr3V_YZ093y~9OAbA8q4!uwTQ%KBF5Gf;`hTUZ=TP=61C-J|elwORL8-1$r<0%$(&~# zzLDu3raG_dpS(JDCY2{oWF0$aZd2QSqUsE(zP=T8*7!PKjD9$r*-_iChn%5$C%8jT zuOXBp?NI9{>I7k+>SGc z!FkR~hy5LNrr(o0QDnu<&d~q<%BIuX;_Kx@CsWv5 z0(1s`cVo?W@@D&x&RJ9zM;py2hl-Cxo;)aAMP~1G>M62xr!Y?nQne=!Pcbi>LxAVh zeENJ}Et&3U+{qD&np1Cegzjc-W&TF<2i{0^7PS?xk6&_}8SrUNx|}u~I(Pi6k?=jD zX07{qW(zcV@h6R>CQ1D~OHh-4UPb7u^K!iQJZ4m%q5+dB%|}t|V!h{vFTY>Fxbs_1 zX_Y2t^sFdulZtqXHdZ78o>F;u>v zKya==C-iNPbLt#Cy>r>^Mm}FG`Dc!;Kdtt^Y`o0XA0OuPk7>z#x7iYY{<*Qz8w2@@ z?(&?M!`SWqHFaW|NDVgll0&7^2@CAv1$>Pi^QwdA89t90&O~KcE5fxqxs^~5BGdGDSQ{T zu50w>-?xnz^oje}Oa=T0UUl>9VTqKGgf)eq8?c@nO~IRgLH{G}8ZbH*bWl8(5vuZF_N24bTiU`+U|a z0XK}wEYZ4FrO*z1b3>zY)|jlt`&=s8!tZ~3y?RvC_jCHKX^h*4JX=(a#Mi60jlSk8 zSPX-#xzNLW{n#Jh3`QMIDfT};qtz_kKCC}Cm~DI4+c%VQWCHnh{g&?@s>uutmiD@= zht)G$HgT)EnG2;J`UnHGdD#T0w>0eKa=BQ(;5Da7VV}>Lmcs;YyQz9rp;gih3>s=y zF^jr>{1dM?;5E$b@EEADnBRs<6A5MdGL3=K4SgIKMsKKbem}Ril2;G&inc(dhCb?{k1*hDELvUZhgYQ?S7tzU=@-6T{nQ*{ zT>NL!4!1y$2sIV7!~Fg@oAXCb56ya~@!UB5t8NxRHJ}Q;L%NxXYw7r*k6~bz;@pkK z{PSY@FJ4y7K({GzQ$Xu3cjq!oyq9+r=k<6S5BTM;v%|IBGNly`K?O)n6MtN{A%Sm;tO~M+fVUQMn+(k1 z3FKk9S}d!~{2)bD38yRJ25r?{U-J+AX;wKU^`LDi@LLi21x+hDj)&794A5`!UU5>=;zkLuOQDszOXE2Nv{&3&9lQxskoZ zu+)zRliM>nb+hyq!j4}u#x)!)mEv%*JY1{}7wf?}Yg31A`H?xdb*Y%ZcCe0U0SSkT z&B5Z$tX%`6YJhYN5Yzxw$!%+ZTn&()h`aPLmwli%(lGqBfA6;M@ga!2Jp8qd$^F7_ z+jPj+cbR{!8aXZE+y1=HL*=$vi_+To3ai+Hj%i9CIv@GG@mVHCX<^?{<&4)stC8== zYzB4+$8B+RC`WJeby&yl^>s+cdT$+)9{GOsZeWK6Bj3%)cRTX^gg9D<=f-;a^K72$ z_iZ{zKl1$)_q;=#c8@!-)}9|I8dK({(?Au_>vg|`9@xlUukT+mWnQjo!8dBM!5V|< zLwp;cqod|+t5vVpTj2U__v4{e^%i{#eH8FV)e+zvSusRA_9~Eosg*mj5aJclC z{rGLXibZ8}^{%)2bxrGvy^Chu z(TvK?PWzr#)U7{Sam;9m9W8OACAT?0-HfT({N3O-HF|c*pEXw(#}2T8E%t{+hV+`A^D5=qV2&&Jy=t)@bo@@y-p>Y0=In z$lc0|j;KKwyPhQ52c3Dz(GJ*nNf;r+$~9hu#`C z$B;ZUWVUf?M#&cVU(;EyBBXRb;-h7LZrD8hs(8`C|8HeKep~nV>@Tv z4OexUo7?!cX%tUzmb7Y8&F&Y=^7^G_Mzg5 z9_eFyhhds4L$);k4MmRS^0fVs)*1@=#X#l)qscLPE5z$CQ*@nyA58GWxEYulexPMUz^G|?8>WZ zNT`N%)sUtdGE_s>FJr0!rKkth^`O2Qv>sB*N&kL3Yp*?R)`azGHm?Y+jj*h;0o`h_ z0z_57=n5F9fH4&?wgSdiz=R5z>2=IexeAqt6D@vJRzfA>1k33?`fcc~P3%d^wR_bA zIMbc8S?^AZ(CrvkLDjA4O%;@_g7Q^RQr3ahwS^Q_V4(_1*0roOb?f*#sLAN=X4|O_ z4C=rtYhdfZTpgI7TyfU#lsrK^Zja*|>S6cth}n2*=`ff&(d~As(Gopc;zmpSXh|3? zdD9-p`|0jWx9^r88*&u9i!{=FwER^Qf$xp*E1ow^Pz^ZV5|hUqH*i1ls@1biX2lj( z=ap26a=ZHNEV{Cr?tse3{tyVSr=L7f? zKrd$9OiIgfX}039v&mG39;YF@x^I)xyC!dv$Y-n1oR324!&t|_s!8C@ZBrE@e1(Kj z(5e&o8`#=otsC%@5@$EK6^qafBK?cvoNLX_M)VpL z`Px56bh@4d?UZTQpKHA1PfdrI(UKpRl$w9~ER3I;iLNew&|~-O^bLvW_10IU#r?53 zdu_ZA^3&btj!3T6+6~@LD!m#7+_IT9FuDe4qwH`5tR02z*Q5takGRro8!a3zKJ}iN z4UG!BG2ScNS=CiQx2Y<}Yy@$f$M9Ngyk|F#`&9Yym)dObx02Fop&kv&dtS~Kd6qsl zcID+SRoN;Va>pdv4Pdkk>k|47BKIs?i+CDlm+w_u%NDsdV{!<;iD0!Pj!mAds7BiW zm3qEqlY6h^#0jJAttr&UrPtAx{2=kF^GEweRl@HO?-!k8z|9=z!|3W_jn! zoEo4%^dGttjCk{Qkss##j8=TJi9p``{Nc^b+gVyJR*TYH_ACGL{C9u&(t>q9Mh%L1 z|MK?lFK-{wYEV>z@;9k8+_ZRqz~?t8p1-|$_UzT4-@kqR{-)1U+_cD6OSGZWc8a;# zAj!9{Z~pk^Pk;I0hqte8{_y+T+n?JXZhvC?^SAbA_VwF;+8@>a{6TlWru}{1{w&&` zWe0f-otN#;UHkJ(5AsN5@wMQ~SG2pYV(T~0ZvXW5_H{4xA8h;E{`UwVp55NOc>n(O z%NMWya`R$7e@=Hlb=M5MTXej?68iI>Zr(k6^ZxePpWgpJ)&GZ^7q8yDc>es=o11TP z+_yi}{;b=d&wZo3c(>a)^4a^_o0ori_wM!kS8q2Bc#O>3b^o#F^a#27R>FN%p44aA z7xw}^f8G8o+Mi$BAK(A^_~Ul|Y^4_;XRXcbFPyrW-SwWt4S$K8GiQwbvH}0YvAvq~ z=H{<2n`;04pAD)!8TA9txgCn95cvDw|9P_5_?MfG`>HYjr*X%34UN+UXcQo}x2NH% z!^5r!fBxwYzfYfOiR&fJ)~n{j4dV0V&1#)*ZnplnWqjL&20q=LDEs;ByIi%CxOe^5 z%wcc%?$i47NhBT{|MtGUF7`wc=eI#qiRYhBY=x!@KR?mJ&LKFNR!6CQF*7x3X(teQ zc8h;$`{m?Lc_i@i%l)YWyzB7){Xp{*@z3wkHtq5R=C`+v&wxL-^7m*b(0JC+c-GVS zz?8Qfi@(uwMseOe0Q8Thk{wj*q8!Vjt>0VvR}(3E%U|lz{?XU1W814)KheoIKRo}_ z5APaVwlxR7UcGAGWoTpVpW4%HA7;6Z1-^UT8`FKa>g%JIT^`zUmicx*U-av_8sb~i z)CGw*i;&xg|FL%^OU~0kc-X6W0^mSV6lcgf%$)EhFY(G`hP}#oVkKknB*Afj;W0RH z;!%&|6RW)vDBYht+tky;)ZE19F2vSCnk8F@2Xcp`BWV3 zG-$U+8;l+CJ0LjSt!moEc`b%T>8B z#HNP%y$QLj`Sdp66V;e!Q5jx-FD&3~i-R-)DHc(X$R_^0M2Sy+4R(*EW)<~$mK$<$ zdFq&D&J%q8^%M3fUnt!1X|u?oES|;Z)o^)&A{3T*rfiu=*EJzu?!s(*NM52gOM(z* zFE#sMxLiOhZ(7wApq{EDnTkMV*rRQwym|wCCUDgnvDNO2W?qzc99&IiNq zg4G8@IuC*&DuVwXTuA)#Q80I`gHK% zjVyhHJb@2?-;yaC6amFyve?_^kaXF!Y}*u!Ib@B(LQy0%Ymk;1pf~e$gwzod*h_}U z8&ClMYy9-VaK1?Q$khdn>5e_pba5nXY^|c7ZM%3$L!M~5ih!hS+|TNGsQ3=dB`r-7 zbrE?5rb8Mr1jo}I&C=as=4FsR9At4piKZf|ioQ|e7VoYy*|gMjOi-r+wfR1nq7-NZ`&QLjirKWQf~1&EcLNO3 zNZk!52@Hw2TdFAc>6B_^QTu?%D!_Q#Q#O}QHfl^R8>rlaKx8QK5*!uG_mPG~1l|}a zGmu~FwGr_r<$?`TlUHKLIxP;?egLqPn~A2F;`v+*@4RZ1N@8FuK^zl;5>(|uq!N|a zSc~^Pe|K^fAnz?LLV|(iNfkbbWkPF(OtpY?a%It#p>jo?V0^aQ6vC1D(uK5^SmJN@ zMw>Ez2-v#uf(A?+JKf6Hm26k*lXMQmwn8Bu@VB!)Q?+|7Lk3H zOj*?be#}Ecc+iqv7VGZ~rB^*ol!HB_B{s-VDxO&C59`>MVb8v)IvXE<2G-+eOGINJ zrF9pwiZ$=5_(R+I)Sk1wV>=fjV-Qi&X^E);mq_+fU#s8b{vtdeO&a1KA!0{}SMKu_ z#5QSbWLO*(0-B(4j0!M$*e6YnDmQ%LuDEt-tXOEUlh{o;mQjT6Iqr?ICzTemiPjMS zw~swp>Q?8NR#J?Rr(kslc0mt+O|eBF6Fw%nFTdtmBoZdq88C;!50~BQ(g#^ie6as4EfGsZxS!x;{3@N zj^~%7#G@WM53NRIy9DN4*3+eZlH*9(E>ws<Q<~s0LZN)T4*mpQBW?$YS6svC zxLUH+>o6E~OvKI!W?h@{?OoO+nFtNKQ;USbM7Lm2Ma@wUz{}J>n)n%?DOlyt(&l93r_0ca!okmOrWK<=pO)oN{LnJ$zqev=8sX^Hd?O~rr zH_EHjD<9vcrVv&d%R-8N|0&-X<6^4D2^{O!<3Q*vf~~6QS6rb)ZF;BaQ0~t*E)Jam z7uvA~QELHCO3vsg-RCk~S^NCTP|Nk)a|jbLuTC>Iy7j)DRW%-1GRocX7I8aj;2kNZ z_(~3OdM?)W4O9E2fL|M|8KJ}ap=FT)je!*_^H{2?RE-eSMid^IdQ_wJ+Eb)6VviY` z9K6P$>Z5b;FNY1SKz>PdFwNtu3BB3NfUq?O8RYHQ_^?^Bi&Yy+H8oUFAr%`EFI52+ zquSl#>IY1=mGW+C{W}_^zm2>4E-z0`SG%bNFOy!N(6)+Jwu}|_0^kCDK|#8|o(%VO z^!Fuv5cYe0nY!RVEBoKR_Hkw3ub(`-FP&D=Fn5KGP;hRWx=JAElC92L?^$3lGQEMaO(zeiIdi|h zsSbB;Ukabppn|C9a|8$5b}XT!i3lIFdI@H%!f!y z)kTOCM2wC-av!F{Y4LI1+t)K`&Tqt74Uq1q!)QcmCPEZECNVKuaB?&ihmnTTo2;yYVLm3w#RfXLk5b@WfAKi@v=+#b#di&lYFiFxP|uw zez=%Y)9Yw&e|vvjqxbdrjETa}U;mD zy*bmetSCv<{9iZxcb}LaQ)%drdgWiVVp6m%%ZmShlM}RFncQP>z#)2-14+~4<0kl@ z(M3K{8@a9jG4a3megBp}yMOVtaQ^poK7Qw?-gBuxXZO^8Z`|15K6c=}`C@O#r%HbL zi9y~p;vdDn+QoB0_R^3IQbL)Z&dC4S!W~-F$1dTX+BrD(sT=UM>ycPwKp)Oh<*gi6 z%j-rajhW*WzuB?>Hl}KMyhgRAT-1|zjIvfAYEU~^E{{cZXnqkiQt)`Ov-MyFwp5TqHsH$*B% z1s1g@>+`~Rd2pLa?{r0I3 z6f#acsLEHFOURykW1f10mSu@q3=d9<4OwX;AkCp*j}~Id7wA4uQv7r2p>E1Z_=Ei* zyrdFYVhoi|zX&XyT1H$P8{bdV5W7SW@}+lFMx-=kFM&G|GRlmqpz)LVk#!wgXjV5td$b-vR&V@y;W1c{L;OHem)T%SsI?+hHM!sMP6Z)6 zoqJE@?k$7Jh%jcbRa+peHem&o3VeqVA_k*Q#O?H|#9>Ikyzssscn){G;k#DU2Px%@6c}=Ij?_wm>x^5yPLOGnK-!7QiJ2&i1_pk-qaIo>ah<{$HS37yE zmoNovLLruTnIu)GnBVazJfE!pbC?OC5i7~BQ8`FW`Cwi>x^S2Yge6fJ(g-kqnj6~x zjB)@KN?RFg+~^karX~7_dKouAr1!TOEW6#>O%@^E7+8Ov?q)B7=F*fpVzam1=j!}h1 z(AzfJ825@Whk3|XcZa$_+gH-u%1L6B$Rn!ztGMa^ z4YDR|-2+GXBDzLLP^ur5!*nORk8~yo5}W@8KcNmuO`%^%DMkHstzff}r4$cxe{4hI zPRL|l`5vLF-Qq3SGmCNS+M%HCqdcb{c9K1OR#lEcIl61wh#iSXh^!Fq-33T>tEH6S z(}_MmAU~6*+|^p8EA+|3V4i;wMR70#={gbawA|v>-XQZR^Io(~FeRFOXYdgH7LN%Bm;qD6ifMp1Ui)^6ECD7WDq!{1Y&lCPqrHmxA zl}vEIp5Sd@&ONJ6vdr3ZEbZB7FnBPgT7W8}j4?1v;a%d1^;7X>E zOJ!3JW7lwNCj{!LtGkXxV?Np-2(Pu5BG zQG>T;R?MzB0Y7lnnR2K`ta?1&Z&E%KKEZvNAYp;t0AaWU9kSCL!}3w(nl(hV*!a5&ZCl#b%;S9HWU}K|a$qeg8jOmbMYpQ~{ zqePL5WlsUQePO4VWG5XJcg3Z~)0vnlhVrES{G`?gW@Qax9~CJXhad2cJz|7QoCwNN zR-F&e?)t!xz{fm4%8kp8i^g7SNN~FJI*c)olj!&~zHp6Tu8*Uu#V?ZAAvyVeiVV3G znzf&@QQSGFQj6fl(J;t($=*klk{jh7-czHFWKGEpFrG0yB&Qe0=O=|}F>LZH{G8P* zAJPrJ#6aG+v=?r1>pY0I6A=^brHAkXl)VNGQ*D;qp^PlTY8o!!z%a7=#k_9{G&H`GYq@E=DMo_jY=K<_~PpODIdmJ}MDUhh%Q- z8O<+kT9wN$9B2`L$H<)xKo`Dmgz^!B93%c=6@G+>_O!1fhjH|7nNY1C_+Z04P-O)8 zAp-~|0~jg;nE8;j@ccqJP!%SE!wObpEozjFjT5Zz8?(hW#DNHNfn>^lY`TTw`i0;f zb5<546~vrbjYUm6WbtLqklneWS<3!pj!4@RHi9!HfOE!!^WKdFMSgXD(HUB9$slp? z=KaUsk)I*bfRJI-0&Au~M1tN1{82wt0$-;kOsiTgpPku5eSE+>@F-o9i2iiRyj6Dn z-HCfU{}3uX=*ekg3tU|lnc`U4`Cl=KQk#?<;fMRY zquqKOE+Rjb)k;}s2aU3}T3Lm%vE6U6KbvBaizMRzSfIQ*pBFSY))tczlb?RSeBJKi zM-82h;z#PZFRFd~c^t}9e0glj(=X1hfxYT`s*!@gGIoi;x9yYc9uIYi-(Z8L#2>&R z-Z}ZqqC7K-nf?pw51gR@ba1&>27_<253};oiog3bi{@A|52&`1tF9wnRgu&^JoasG zpPA}}(r@VdoF=g<*|Z(dY-;;wzpPLWirpG>cJVT{Ch>kb`v^G57lq`;dU5h+cP>X#)xZR?-WoD zbcjRa2u9h?TxS8-xuC6XXv;qu^5A9yxVfOu4>aYsd7#gKY0B5k1bFbAS*7l1#3@A? zBq~1R*Lgm5n}&AbH(~z3C5{o{4^4+|l;)PF+X9xp9f=6KR^o$lGEfOp>L^}vtSB(xo(C=GHU;aSZz?i+kp~CPd+Q=_J`2HB%}_uQMC{0zuGdkqdK% z0%hv|V@^A8Ot3`BFiVExl|O+}XidbWE}%v`Whg5}>e; z^CE_j#R9O@-40iT+e7rev^M9%q8A2klg&AhZ_0nc>>WH!h5 zOq7d|lMOT&0V97wIbGiBmDu#K^899yP@Lofb*8D-QX1q3y3WU<56n%<6Kj?)-b`Z zy9;Xm6m5bLgI9%PWDgX50LhTaznn9G@>V3#gjVsJjU-0)ZUFJNpicp9`XyBN|bX3u%C5X_UgO&Y*4#e@W;Y-R7rQfG3oyp<}wpfk|V8lBB zyOG60@;-wb2nfp9^B>zHqGb3wfEC%K@i(V zmicgtX_F~PU{s*7-(Xo4GtlszaNThCw?<#`y=jf88a zK1SsGkSTs2=!0uc?i?Hj6Cl`afY8!N0l94Zmju+tZ%-&2#QAspd+Q=ji|c*KLwC9e zv*AyyISrhdoEJg7jMMl?u}duyH8~ijPSWyw(yh6^ojbp`O)&vm;xO*9((3VtZba3R z1237x?y7(2xqqJ-udYA;^N#V@?sS#~-E_e@jW)CP;%@p3l+7R__RbrG#41CSeC--! zGRCp^4FGlH0jY^{w(@)_)NhkG#FpqG3k;(1^m4U2lZ_U56UgfYi0{4a@Z+}Bl6@u%=H&Am$i*# zcRk46yiHwRcQw)^L4MLPi$#+-LAN5VWMfr*CpJfCUYAi+2z&w~hNLcq&{&nS`uqNN zj7eu~{wV=ZfY>?PP>7HmOY@8vZS#*Ojq_InIKbz-^sp}n@;$zd&jKRvj-!#vs|2+; zMO@UKTqq9CKI9V$e$9gqPOx2g3(K?$N zrDMq^(FS4~`|-5TOi92SJLxnXQ+iTDT{qu#%CdV!J1PAg9Lh59lZYwj&3Whq&LAXZMf-i{LUXsv zU{&v=?$WH1Y$Au%L-29jUfrJ7YA&wUwMsB?kM%n35jmcxGS$3oQ7;?&vOGYhw6 z=_+EYgU4vnG^~LjY~bq>$h(KHL}rP!!D9fU9$tv}6-&8@AX3bLOLsw}W&=rsKz9PE zm!UL;U(qYyO=hLlY%$E@5Ns@nxiu$7avv-ypm-5m;&d42*ndh8f`A7E$ z+%^ISs$uBtb^%{}$W7Gzx;)(KoF3v?h#N(P zJKu-`8^a@Jwj0vFG*B#1%UX35)@x7r&P~)yoUx^1BEpmgT3aQ|eVD)xp9m1- zY%BUYUok+Y4bcAgIR&N98;CnKt3cKeVo&}mF$S+TsYgo%tYA-<81r_9 z{6-85I=KsUDUEq+*9oNUH)ghS_TRX?hv3d`J^Ax=(kQOnZpv5dm*w&lv=MqSwU_KY zg+*eQC`01l>#R754WS<5qc8EXFgnb6fj0HU?atEcXKl~{b)B-%{&NVv8yXmjO%1Z z+nx=ZuaUi`|N1s<)J@cP3T{*JN!n3&Um9y2;F51a-LP(`He{1+Q8i8(YmK<1TUVvu zB=U)y>aN0i58m{bM{xS!?qI=8TzY}s_t2)d)F`f;-y2E6R9nGO$Us1UF(=7m+aal- zY}%I=UZs?y>q}yWBcv3 z8;#g629bRdR73(l;evodozXxYpwmLl|EuTd_cAFm?~7kG(XM`ovCVAb!H44?PeBU# zrNlu-)xl2NnX#d%01o98K>?Fm0kK}9ZqRHHB8M^>tX*BoDz1SyeoP}jx$>q6leED= z0dIs&?4J^X*}Y_MfJU9yzB{9-iIqiikc97ev24aw9#NHY%KQTgE_Jf_(}jD~=h zFC24!acAn*D2!cW1Zx#Uzhqa@M{=rbB{CY1ZP;?xzYJ{`sE^f6i$(44BYB zhwW-K`L%yr44dhhPg+KC(+tfDlsuCsTx_nsEptZe0e&If8G@-4$*z=9e|^(>wxsA7Mrup@4dvN4wSJfy$pT}j2#?i zeAl)g|NVSs3>36(t}+D|!GWP=6N=wKbH}_F#($$1L*ND$wflqwKpEVQZ}BwbIvx1~ zzkP|-b@6zH9ac-N%eic#BK?-Y-}UTgvnJy!Oh0)@zw(DXN5H&ywHJ`MNwrpXS~GLO zs>Rx~R1pQgb5rNl7JI<+lG(0IdMj?Dzv`n6V&7Cep@1tR35fG3k;=l%#8x-2ghE4Ge-z6ih7EOtj z*h7^kZL*jbD`L<7x1Stlr|UBx{;HkNgk>(3{0G1ra7y&Hh~LWXBhbi=3`!ORVCtAY z*olMQN*0oV_7`1h!MpWXiEd;I!DsHUh2s3$Td%8GpR)!0Rt7rDb9Q3C9W;O)G`;iOBPHd>Kds_*3)!})UnDhSl^ph%S{?nbhjQ$_4q{wb&6K6PVvWc! zNZ7EJ1(s)aDGc&?Cz98W<4I35O$DjCpusNph4_6Q-6z(6cwQ0fam*;YUy&bS80I1P zE?fZ5KMI{0?C1E$Z7htBiX-?DWFd^3kozS*2OU~*qEh+7LKn#mI~II57<7|4I^=HMqi(G zwgO`0QCBi{-)m`=i?Bk%^~_+`MB1Y!-GBaFTjeju)Wxgji;Pfw6R02_hm$dJ8bqV) zFhF>$M-RQ7Q`Gyy{FA6p{Pyi&99PK#yd&;kcU;HU&*}pO;_uBu!nmHPHS#}-@S@){ z|8!*^3z29qm5I?BHN#`cUh?z=3#vcU!x<259sbEn#sa^KN;$r2d?1r?BPy&i*=yIBt zejg6wDRRoPppySmf-b{^TkS;Tz-*hx^#bA`iOA)9AyE91O0|-% z;kFJ9-XSv3BR1G0Fc44m@`tfe3=3wh77`4{)>(Vv1BfEM_W7Bk0zVi{gE5&G)rc$n zlu<`PCFc_2M~H?)mZHn6Cw9&HwvYo>=7*t5=nD1Htg;Kzxl zP^CW>$A;%r1J8L_SxlM1jH+ms_?}`D2gdb?Cp4mu5zO33$YqvxNEO?Xi(L*-*hvVl zHvG^(>a4^Gzw%@&joA?{U5a7#*7r&yIld20C%~ePpKV&Nf+_49lRl$_InDuq$n6P_ z0O)8gsJF1tSU!Hf$t4|HW*aR`d3SoBw&c%OjjUC;zCpUITR7d=YY&Fu&OB#~;s-K7 z3oI`IcR26!S&h#cn6G<@LAF*j{5X{-aXMrXH4yvGGm&IgcY?`ceHmq-02V5w! zPw&7jo+U&onpr4?YXZS0COmSC?j9lT8zp8Ordo~s0k-2Z=g>4dm0(L6ac8o;@2li7 zCTvj+38g8E4J&OsuGFOm|9bh=EkpQfVzX}qD!{JV>bFf6&5Y}5=pxKZL%Zs$(prMyOW zv;8Erj+j7fTu`3C%hzlK2!IT zfIPSyg4%&ZS;m6IpAEV@IOF=EE{y4ka|!H}Kj)%-HxZ!(ERzIOZQ@O(Q&GVB!9;l1 zJ@8rVNvc_gb($4I8?3IbNKD(?Xth~{r0QHk5QPiBC)d+hL~RBDUs;p$y!6o41?VW9 zJa{sOri-SD%M#{geZ8qBWLofI<6Q#y~k3mC1%%ohfI$w4ot=}(&%3^_50$g z5JAK|TuRc>-$N_3pJMV&SNH|G+p#03wT=CF>Jdg9zSJ&IgLXCIifJSj^b(3B1zD0S zv^97N$*qQ?b_s?E(u;YP7(W<=+0}flJL^1ln(llP)S)d+%D?&)cgG=Th(NMXy9I_H zuKWJtIz5MN@~I?HpIF+wBrOdKmh);x8ZEm^jMX@P=2F*0aqE~{-#1@ELB9tM4)8|= zS$xnallx_rXw^JYNmX3XN!1)t$kl9T)X_QQVg|+|K3mu6@#Kq%pYpCjopt8tr}`Ex*$*aVI&-oXvdp5yh*IR$|GXm zawV`^aTMGqwvjt4Xw@?p2Z?Bhx((yWLvJ$Zfz>GlQQ=s3%sr}I=w7lAgq^9k4*B>Y zd%1fJbHYmF-}AN$PBB9eIgd9+B66Mw9y`zF$i$!i%8tVP2%gOuDpoV_5oiOdiS<$v z=_J&SKct#oh-%G5#I@!*v)aDJy+`Wo-jgaL{j(}F|LV%kIwP?b678<qN9pB z^;xaMF}pSd0fgg>!#rR%$KS{Gu3782e2O0&FJL!L+aYOelEK|@a5LI!zmvlpaXW0hR z(KntJl{fvk6in@%diu7TK>C*3nyAhFDc-&4F;Ziqzc|C!GgN}0N2>S+w-gX62XA~o zEpUU}5zf8gSz^piZ0zDo?SlY?%65Dn@O+(Rb=WwJufC-{K6y9Vo%lt2iov90)G2Op z=@z-~h+xs%J&8*Ds+CDnuia1mk)?`~oGs2ZzHF&P6O$NF&Yj*jBYfcu;&%5(}4*=nN0jwisCT|Hcxw7Pu_q> z$+yc&h3DEjMJy=DxXmXUq43m*z2W@9u+q6L)9nv2M!{(nuu=e~OiL0;+yi5aa_em* z=sv!CrP<@hg_byZjFY3Qks)zin{58iNVJJ>nHBW($uS2EYeBTfu;d@n#&%!*hhfh^ zW&ChFN+h@AY_aD%_ z%117K;0CNkX8hC-RO3NR%8Ap1y^5Em*Voz6y1YG-Z*j;nR!Q?dkE?-abcC@8qjfyv z&HuN>|cmt7nX9YzH?mx1xIAYQ>{~JxXfut1YkmOJNX--w_9|* zH+;YE{iB!MH4FL85kfhBT&hdJ_gF6kn&A*#5%~1(5N%?Ihhlu}}#CU7)IQ!XRz@`#ZT< z-Mdl9MYDU&BM{GM96mwhTuXjQwZiKe`L-$?99&)cUgMnnwZ{o*599PF35LTzN?K`; zq$Gl$bPy6yhJ9^hd?b#G%VNT8ss)VW1SL@#2A08tSq0rTU~RE>ZTP-Bo!BmBHT_`^ z;P^b0Do?ExwPKH@1Mu$j55*U)>&xD%vZAdN@^Ipb z8ZhlC3NXnclZRHuF-V&Xb%(bM)V7l7Dr*mKjS`4kFSG4kZLKaHIvM+S+wlRTr1SKr zk6uEh6RgQzF4$RVX#EyUDx}OJ9jhAP+e|=(&fZ-sO3Sx=nLoN(^>rL$1+t}PQ-NQ2 zwaQ0Rt=83D0yGE8kEMh3m0b6KUKLa#T+h{!xHJxz)1^Fx2zpVSK`K(d8gQT94n3Xhzyxh@{zdSSH24h%=$szPj ziz`p^L~+A7_i~}=z&*~W@|IgG-Rx14X?yUSdAxls4kBs1B?|Rl|LILf5xnY$RVWz< z(t|vJen}gMr@gUPD&_vut}lF(ur#6X+0thCng@`XR+~j?-A>(oAkB% zmp@q;1KnAIxqCT^cVs!2=xYf)1G5Lu`^G9u$JI@-Vcjean_c`K0YE=3lf1DHDC}lG{M;sV?&n1GGsV%s> zNw}x_mk40G>tI_224n0|=Gc8TPwDFqaX*3)uoF;b9V7R z9+Z`Qrr5>nks(s9(jiI6v8wokCrLXF#LBBRKRXna%2&u zFL9YZUpkgLQK&5X@1dbhHC4-}K|zmj=QWIUJ_)YYCX?Bf?hH48A37K`*%ogm{J)Yg zz1l6|w-~ec>=Q(0E(qnYW6vs-q(kv5>sHVP^AEWo1Ep$sJh+r?SF9h*9=}?ZAevq& zb!`#nXj;LtUXqxsoP)&)V27SX1*A1?sM^=8jo8jdf3&q>gDP}K0co)6RBVEZ*NX5q zUDru)v~eHQGTt-p#bjyd)5i+TNFVSl-ip@Rx!)~k$Y1Cz-fi}}n3JR7Glz=5)Dtv% z_~KMBTUk29fYMe!QKqu^kCiG8PDQIh)8#`exx^`z5^SCI(kq)dY4pM~au9Q*icV1) zscy2R=}Ka7ug-B|a1Kt)K0$fudA8Ww#YyvsL?VtCN!! zQ=4v>;3B-fwq01ulAC%RUB1@E_qD~Q&VCsptbwNu6gxyShLU|ZT{yR{%um8v%`df# z9%i2GO|aLrrX2JQxHDIH))M2AV`w`1l_sjMHrf-*c$`=jTQlpZpB1gp_lG+ox*smGD+ zYY}Vxm=sbAe|3+_8U4=t~7nw-#1l`eNCaaVNA6= zxZb&`dv-ZHMsIfd1RxH`&f;(N(RS8s5k0HyARWTn3aj@LFKCFEL~1&nY=}?^<}=8u zl8rWfE3K{U-+b$aBa`~yL7XDiHck%Q;bvNcB}Amz_AA)(mD`Yqgp~mXx!Q|1)h*bS zzTUjM?DY0ejXM!vTmyHLHF5MBDYDmMX%5Y6$>{@o6TWd6z$@hfYd&h1Yi3jxV#H8k z2+gX(n}$ugIV2tWtW3IEuForhS-gaA+=IcB)5ZUDFT%h=LU0!BQ@}O)!dU*0UDH_y zW9Z({T-RDri&k|w+-s8=`P+jmQg{YF8L1Nbg zzGyKx^fl^_g3KDN|0BWvvqTPS4GjbrLo%zL5=EDy9-k91u(8TZ7l(AUnS5KxVJmk-MeV*)Z6$-B zWEz@O0`u$zF|c40H;tKpbu8rC2|uWu_vvQC*N>2Tx=SgZ;4K7dpr>^)*ct35vF5Th zRzlV%--+GIvTLV7SDd6mLx$}WnA2i!9@UBYhl=2QJE)~4tQTn7Sd-!XtHt!Pg~yWWjs*QI1Ey!41;nS@A+y2V6!oG!AQ|^INVV}L zc*G_0p@4v#~w-x!2$2E)!*A!AaL|r_N+iPB#bcs z9>stXA2>8$WHHr%0Wx_h;aKv_f8Q7=Mc?rNB-89ArhVTDQm*ZDCwJFk0(mCk5>zN!8vi#TomC zBHZ!$0VCYmh4hr&VUcA~2`$tn1`;(@#95Dm9+Lh!D*xJ;m$o*1UjE|B9=~4BF4fKAEjj#A-}}HhbJ{k3OT>@ zz=z{DN(#D1ZcvRYbgFOzK1BhT*BmIt;=D?nf}heKs5;#Y{!yrX1ffieIQ{m@nRLBt z{?-=MFDEURxUAL%1lT{pq5gRi1~5NSf7?=U+$(;;6D2k-mSdHdY z-?9+w2;+S%Wdz`OT;LDPbi|Fw14LoG1H(%ZJ^QyIuVv-=QA`w7X=T_%Z~ydFd1_r) zz;nwHoXUOW3wW{}^m=Zohurxut6+}rRm{5PQ}%-Xu+`w>%6pd;58|m9u_^xZMs~bP zmdGZ*UdaHzPwA%#FS{e)Q}a0~1ilW;Wbj{?fOHT*cO%nn39vzeT(Y`T+e2J+=Iuu0 zSl0oNAM3JHHp?nnvo&4+Ys^Oo?NNnJ*Z;(~DgPboz0@|7!f5#l=o`2uYL-GI{%)KU z^3Nw3ePR)wzVFhIAX1?zdXXVzT|C>edO=E!b1Y(^cpUY#m=g3?^)|MLG1NYA^GzPH zlbo-ECnT*19?gGk{Z1pt`{z|Do^H_lebLnOqk~*Ym_VW8K3p#NFJ3Bbx18DFhf6!e zPM!M|_-+sCq!&xP^dPaxa{nLFruTUZ;u<75Plgm9aJjdagRstwySdEI11c9B7UY4ash;# z?~nCWELk^4_r8_RIz&p9UzBsz(ju|(s(Gx3b)2>vqX4iF~4GW@i_ZWTb!1Gm3!m@+oa zsO&4bU}v=I&LbtF$qUyA>VPjRs_lf*2hM2t*wB13ULSb}k(6#C=@RG?cxwqsNjilD zWog=1B25O}+k38do4uuUu9-}M|3gdpk~j8g#LpEw~Odv0uH5? z@-b#3Q#K7f_*81OqJgz>kK#I1Rf6E(o>}uDxE- zcH_Rl{K;vL3k@0q#@9^4w_az6L5qQwOVD(hl{($RJ0!t*`9QwxujcV z1g0)t9JddiNpF~2@r`2%`OIUuTjf&I&G{E7x$F}?pL?ed;AG+ll!ER^&!48%572P^ z2Q>WP1D!x*vk#!c+6`dX9`?>IC15725}LMYMbf{pt42#DtF*3A3URyHt+O~}B99+2 zrcY_HFx1Qbq-)US7~%&XP|*Vb$>I-yL^Fo_Y9tB-|1r?O1N5BQrb+Es(0+LnC`K6& z4Ah{-vooArmEIRW>G(&F=OQ?cVm2dtxVhGtKz090YaMe`!E+MbZEg#)MfysT1y+G5 zTv7U5F2&ociKkeQ}?Ogx^@ADdZ8_!QYnhk5z7Xv7(8mop)c0i?G_1 z3R8WNEgZaAw84}ej_!&lyl6J|(u{7xKQqU$#TI0C?lONof^0J2&Kty~jxHjm>SOrLLY`b+W%)kGR3H(G6OC$TAS2oi zi}UXurFPI}gR7i6i0~34^zCiBsbDG8dXMcZ&5*Q3_Q;nfcM%yuq z*~iG&-38tJM-&UMdacGohgO+U{+$@Y+y-CGuC_aZX2=Scv%=a@n;SIy^#NZcRp z$0sroMB@lvzymcBjs0`wC9L^_;6W9aO!QOS#U9cV@>uQFr@aPwMUet#VJfO9je2>{s5*l@{eQh2ROs*N}D! zjl%dW#bX2$c0Pesl%cErA$_arlJ`_L4ZG+&yVQ+V9lY-^b)n5O|E+2ITk&5%>Wz9f zR<<73s)b}OFUpnkR^m7P+Rgg~xKEzBC*Y?ue<5Bf&HNR(fVF))?^l+po4G%h`o+{U zEADFJllWEQ6@f+SM1XNBzz{%OIme!vfD`9^iI(9RS&T`hlI{7sM%S`L+-Y!05IU6G z_Q2q3B`}zXm2Tm%&#g_wa4QrsG89ZJYU;I+iOT{0uJ4+@yVPr^N{sqrD^r9xjMN(+ zk!zzJq}lk|7pfYb#UN-Rzi}VT7D5(xP-*qx_*$qPNBOkl=$v+EEa`7p(%-VAzhgYavVXN$92S zd{1WH4tPrEH7L3Kjz7u1gx|~E-`+#MIayZRv@9+aTX7t!21DBu%yw@01 zc8WDNN>XgFQSyu|`3+f;Ea*qwP7mrD`$`lR^_9*9pXOlA|C=p!ri*jJf%6x|z8|IG zII@eZiX(=e6CvTQx?!P^qM3r^f{+48{s$ufeF)GTBllS=2D>loNUbnp(DWrBR?4dg zZT8vAlSXwSo~$0jBua1CfMjXd9>eZs#^fI48B=_aXH4`#o<3 z795r1!z`M8<(ul;zSXSY@PUB8&XL7IO8orLkVNr6H(FP_EDm{r1RA|QiKg$1l5bSp zMtd)qy0c>wjD>GZ_SUD>oU>M|87G}Vm~$oI2Y^9&FCuMfJc0`u`Hq+}_P!&en7MA> zn&QZMFk@#qDSyh8&l8tObA8(nH+KSI>3)L%ld8J4AjHUeGUD)4pTs37r*mH6)N&i!Fd`zSa;bOofL4pzWn2W;bzs^d4dp{jNpvm^p5Cn(LGGhQ?ljUJ^wfzV^sClGST`Gmoa@Sd>Pao!Ua zH%@zkl8)B?9{Ml!a#0k$Q^lJEl@ZJGJ(h^RMHVH#YQo~islV&Hwe^ku*_tL~4u{hM zj(*0;;cL{mqOstdRP*4%L-!WvrXUP7*kY$K|QXSlm zb2KC(IEoSx9DRuhKH;J)haExuAM_*^M`Vu**FnN$$jSGt4~pH&(ubl;)8l+Dpn;6+ zAOi@~Xav`2A&f87+OH0*Oh*$~eq9%&TY{Z1qz@ll5jdc_^?g?fwUA(A^BWilJxi|x zfnNmNzw(l8Mc^N`5$!Mx8-4MtOofkLZ|rF$Accy@SMpj{KdM%TC1uMzsNSo#^%q6u zK3zXGbN@j4tbAM3A>C$im!G*7Qhc}p2y9S;1SX( z5wk#6Rki-EgkZ;cNi*fNiI?&B;0b@Pqfx z69hKkXI(Wred3pAgv+M2px&ill|*wJ-9NrA{Ho@<#GK`mcJW<8w{&p4XJRCI3y4{= z((TAURzY#cUV+Igr9k1sCrllWevDhZ9r0(=!a9Cccbt2>Nt{3bJKahb5~=*F#!2|^ zy>@TxE7D0cn%2lchj2mG{n5_A9VV)|z;ayJiE9BIm~{wX_)zKkHMPha;QMMzdc&Eh+NG9phDE<>rAT8>`Zv9dOluOfYP20}5_N5<74ISqC z9;7Pf4qafJ3NQo^pLA9Am5S}e?Rg-E6Zd@m9X?^}N3-r-kQU&9>WhpafXR$&AO+hH z*ffU&j)>NckrE0tCJNR*WQSpIUlNjlZEQgPre8i=U)8Nw?C3c$m$J*)O#(_b|79Q! zjles4N!S-51}24Qd^-n{dQ}ZKDGpqk{UWvV&)lUV#{ZplX`BLg6%-@x4A%I>rS?r; z>r(z)ZEBB&9`V||DBEy08zyl4DNP+yZrrAc1LF+IjHwIe?$pg8qW0i~G_3kVte$7fYO{E_3|m&)C5-deB&9+Z;I z8C;L@avx73vYZuD0`>t}9L=e%+Y$h1EkDYdn3uizYaCL&n!dT!b)V&_J!rwv!{<-h zRu-3;EZu(bnyp}GaNXAh@qyauN_pvx{7%5>MmfEUh=7{_Qdoq0=X>w;@=xoY9xMBD za=yz!1Dh-8*}Ui4F;12?LpzT6;h)DVk!&R*At6$x^B#guqjiIn<5 zwNIm~jai^8^*n4c=H}~iIPlE>B~kr>PYpBo3}Y=s2@T-`gXvFH(sPU)o3Y%(k`Sz*N);e6gi(&)n|sO8i`_qvY8o^SAE;);QlNM5BFQ9*6!*RR368_D0s1z2kY7cpY4-yOG9XnPfn{&OBL5E zQTnJ%iEoV}`=k-DBk5oz6Di#RGu{dcqKC|)@<@4NoB?JiYb2k}Mn0R3%mmxQ&S0|l zE*Lx@;Gs*q=n`?Qwx)XfE!ggtPywM&U)#7@n&s$m@QK}XPu4ahyg3Mk@$k4;v-M(R zhx{=?%o$;za-HdSAZb_n9hmL%z9VrR%K`K@I;3+nqi;8}1^M~CSDkjXmk{v485xJJ zv~tBJW1E>u$I9^_FjWns)bBieJt;f`z7F-%`Dz0XIEP_g(C(AecB!5^mXr7Awfo}>O(bvXw%f_-JYB=Z^bNtG^IKVHBs2`y)bfCrV3sq0dIv9|k7>oSd2NlSaT z)P;5B4V;Vcx%ag=;%3{GdT6KWb#Sq5@(&tI_)K;D=$UPnIs%RBL}EE#FEo6iRB88zJMx@6*M+gIBs_pQEGXoL_hfLe`-Nw3TvG=PN#Y>YJ(eau`;tTuy zmhj9XPZVtDJvc5rA{u){6`8b-sIx$4(Syj29XC%K3u?usX$$+T-5cyFV7+p>?}N=%Qb}Tgf`0@22e?L1)iXWhOm#q{kzg_E3`01l>D9|f`{Y2i~=1%MfGT4 zI~_)5c;ghAxFZ^q5g7F6t=HBIW^id#nk9o`+GKUWCff3y>(#n!*(z&N`6QSV}J?u zO})lj_N8trRV2+$c}f7p|5}B%v30AH%zw!f)?g}?XZPlroilL8xS7XmcB!AW`+{C0 zm-^Av*uudhE#swQ3KBIipJlNM7mzZz)-S3`T9o#BH-YrSfW&$%>^9zk$)z(qq`n_S z=*OzpoweO2=fykFV_*aAFt`H#P>Odd%oE1NEr4{bBUYFiWBBo@i~0-b%wDaMaU`Qt zcYQbaCt{;4N`8CnP-6WSiNg{ipkD_>aiB!iO|iKuP4}Q*yCqnXo%_Fi)ZzyM!#t>_ zA)7M|0IJoJ?K_PgC=7G-go3La2ev9yrJR82IfA5;HX}_qb@QswwXdS8-dfX!4MS!E z_z3_sTW%)!cQBbL;rEn(_Uf3K5$Pst0N%E`maPhxN3qUz5IxsX|zsbHS9%SXk$AkiRNaSmgHwd|!9MBQ{Nt4*8g?_7 zZG;LzqM~N9whCGvWW4%wrD;Vt^e?C6e4n65DbjmjoF6C--4jevH*DnZow3P99Q@pF zRp-nr3FDr3ZYlm@Wd$jlx^w)a%{<*tvf^P+5}Dk*aj@vfBT{KZ$rjKQ6LJ1dC^z}< z(Ma)g#xTCa(MrSmrC`_EC`dwzAp%4D;chnbS;YfCYX>j>!@8K^swD4LYS7wk(da-X{CA0I1yRl~-&WQX93j&#V=Zvm#{}(oXq)gaHC~`omcSs0W zkj@O##N-D8@uZGE!j3C-MC8VoTA5mNqtScDy3%+wg)s<|Mo8&pc|5|rh{*j?zQ)4JLNaB&Cr zatON20nNeW>0JF3SXEMQhPcR7oO|47qR@Ndm?3-jQEJ$+8cXdo2ax>4FlaK=m1j7{ z;P$MlrvLsVS{FUK?^jk7@b7Tf?k%;*-QtI(hA5-QEj;Y6d%KjpUIxseCz5;`Jms_UERt# zy~^=vmkH;u5~+iBp!w?^>iX!e4q+8hdPD6SF^dt!)N^AbPj`c`+T`YR5T^dm^rjnd z^Osz*{%17u#4)2W>5b`mdDrw(;nlRSSXzymbESoS!HZiX%0e_Pnh>(0q6I@&#>!*m z!uP^<4b2EuM}Ir<)4hjoe5)E(jC7#)&Aja@gf1r8Fd!%hgfb#wbOq48KM0pW&3SWf+ z1v4{UY~dO#{O9RP+CtXvOj9^xFd%%kz;$myp$a8+@xsQGeAOGzhzvw$mB9(T70(yO z*ivaR!~i)f|LJ1m6OLl|D(sF444h#6!>UoRxAcq3n6U*BE8_>WP*Vcb8;NpN(bKY2 zvG)LLU+VF2$IQdw&Q0gipFWtX+tE7W9L3QC_lGhGcBNa@(q>eTI4eu8*~A0=a>!9N z7sQCSa`Xvm;;?iIkAp~GY?Hc2x+qx0h4LoE-JxwL1_~WQ+?E8!S=$Qmp>`1iK7So@ zwa~gnV6TGxnyA1O4K}3XvsVA_Jnid>;#swO#zwO0;SiB!pg4wsOI)t{N?B|}HYwA= zJ%ZV2^+p(Q|LgFZG*^(f%kei2-UudtX(3`H9p0se*>GZe`c+jF*O^?W8C=8Fl+vu! zkA0up2@A=;k61uhN;%8<^`$oLRyK;>%MMaA^yWwsOndX_AIMo1-#bQvTl%HkSeG?8 zi+=oYTJR$|iGu_0wa*zYThVgNOOfQAsa27upEz{ZjsiES;564Osf1{Zxu&)Mq-E_l z0^v(C$Sw)87*U9t%N+X6F&`w1qD2nqk`vkn_hM9=_2PK%@r1>M*2P4+S)n*(jzuD%n^H=;Pd`|QN_ zUyBMS4WhD=P1DPU@B)LM%<1$eEV*mWg*|;x^4VXJ@1%Zb1kF);Wz7b%$6xCbDqx7X zpeh37)%yHVnkw8Kr920>vL-tgdh2vJjV)4wB}`&CsmVMUtgU@UT_4U0$8+&Xe^EANQCBd^5_PHc<+c( zK@2Aql4D2y0<-an{DiB2TPv8EqdcZr0KiuPn6#WdII8Odi=(UFs7EX83ql(~5;5Gp zBx05hf^O|YEE+TMTPbj}+&%@>d^3o9{h-&yVYn*ekE)1Heh4-*Xu?m>htRy1pYwA3 ztmcd3@@x2U30zt_#12ae>qp#(CX{krqH7yN(Cc1c;n&>&Kv%#`=eSt~zY+|RuslL$ zE$1T2iwmQRf!aG>hmPsE#;!!W^-CBJ9e6!96moAB8+^Wchd#o~<5q7R=w47Pjg67D%62?4U+OKE}hR*DcyI)Y9J!9E#2 zCy*GvDv(atNOVx-o5!Fky5nF316wyR(_^UDfMRIF0mVm}!v5^Lj$=Is4-~>T90np= z7aV}BormUnIiwU|m=dWu4h9I{tj3fc!m(rtw^d+efr#0Em=I2{iEAlX{Xq2V(+_aB zD&A{d-#z{#i}tL7WFWoJle4OEn>Qwtnl}sJ;y1N)4q!vHD%7>Ir$pwyI9rkt18>53 z!OkLNrNagU)+{=92j8?wu4E5WIoLV^hs zZrsz`f0RT#ws^o;YnaDKA2A~hr$=@o1vnUI`RD>aULoj&(Co>e)z-9>O%Fko$^68zcx`4J@l;r|skt>bQ_!NDw z&y&oTv&t6$r%HdKjGlE?3M`k>loY|@gs-g7NR=e6{I?w=tb0!gNH_Z4h5>2t-xGRt zphy>g@+tg=oC#^^TMsi(*<0bam!{~zynm7S8H3ysDR+XDOB7oPE8Hm()ztlzs^v~5 zD|KaMsfspkp9KemgMsZRx3I%W)ZeXyZYo1}rKuyZIEGI^F^(dixT+_mC}?Y?D8q%~ z5bN;Dds3@LLg^_tA9ves_o#)cIE>OE?|nxY5Np{&0Hr29W#&F1IcFvS%1^QteG`c*U6``R?4O7cC*<#QLp_=B za5ExxJG9>GPzb9^yg=Sg9Ns@TUCO4gs&0)_=PJzC!M^9*bgk4#;pAXcqvVa!SWyUnZm>1J?H(}=2%^p;3R`I}d@CDM zJ%t$OlpZi4!$gG{VfzqtMcS82qALKxONua7wtIAT8Hvei?~G_(=L|>ggATHA+aN$) zz++{B-g!<4>c%rBg*#H@_6kUss@bWg;m{Dwy&Rla4&U^#+>(WI!b16(g~9?kb3JJ0 z$jHxS+Hdcd!5$g~N?(G2BS(BRMW6zR%>DUFXc7GBAlqdcUFf5^SHa#Wp;j``(tI8&SCu30BvW_wJBRZq6`C3+>|1oOzD{O1xBpvX-uXi0Mc)0ObbmeE zj4n{I+a~!XQT~J|{}WOEXQDh&d<>)6Txl@4FXxjbo!_PO7r{arEfdks-3*3L_-q}Yc7f5!e~A=rs`UGA++f`nW*~TBt!3vf0+sw==QXC z_Ii(GBW=QCCHy??*Zr)%mAVasEe@nQ*wZobqT@uu<0&8`f2=DFYY$9|;k?M?4fdmA zvXtV2MKhA;>t)ItcO;H%BbZ;$io$eY)3^5rl*`&4W0?bbk^`E9IlpVlSVEYyvoztn zh#V!Xgl)C7{=ec#8hLa!u-R|P-zujp!(YbL`Y7Lb+|t4V>2` z&5^Urn2wwcytf4L&Jn3TnIK2-$Q;C7f`a%zNFM=!bGX>zMM9tle&UVVsaBR>AjifO zi=4k4h)5I`7hZTysP9qC+6XbTGUyqCI&*8{7WTK0fpM}HXRq}}>d^6WmEmSCCZv0( zIcpkIC?`zZlkek_O;>?JHHerq!Z#5uSoWDY9;TrTaP&$&P2A z0BG`CZ^+K|oAl{y2|2Ww^L%|57ltO5x@7xYwhUwem*sO$*gp5wq&wL*Cf>0=NZmOv zF=Te72leRJV=r?0tEgf2!V|*uhXR$-3<@>&^y=%^UL^@ba4tVZ7Uv^{4uk`OCgO=E zeU3Rmfq?SH%o{K63ZjpTb#I8E4AUg5L2Uhq2wqWUiOs}&;srL z^9FFq4Lson{=^OB=J}@OZyL|#Zy~B9nZvqeEOBsyOu{Z}6ba)GA&DAw?#I5a?w?Ki z262w@K?6uI4sUD+>NWDH27gO8Hzj(TyhVv^RM5U;0dA#$$Z}uRCYX-kl(z3WnCKAX z7&K2thhXtwbfi1EtBn=arPM}2LQAY+siPs>7$>>UwbUfH!3nkQ>i(?KCry535w3ITx?`aq>fqI`zy4sWvrr%s%4(Q6LLRtaR*&&pju3=b^C z7qbV|D4*vvOeh%3Wpo;8FNnzd?FCP;f>=3s_(Nv4^@OVm+8dK5J(fqLJNM%FbF~w{ z*T$C8%95lAqY4=eblG2kV|aKlAY{moX=~ZiNcDxN`W|F#skD!&1Ajo>c^{xHS!pM% zw4YdMtgtX0^R`8R(wHuo6%dGZ8#%-tGIEH0W8@Gp^)D-HzN$)Im*i8{7x7Jg)_pCk z5yf^)RVsC3Y|5qBm;P&Hdsbv||Mc*4VGFRB_WwoZgvEf2gJgazkc+Nq%@EjQR1lYt>A5DV);+D8@$LywS;qb=x#l_l5%i>gU6 zXq^yr!bPQec{p_hd#+%8JvUXRvV+?AiogFk{8B&Q?fZiiEFjdpS$*WT3oBDM;)z~-UnmLe8!E<}))Y z-MPPTuCxb=8n)wkJ|xh&;h_0>S7zI9{-B)Yk;*waQaL{zshlju_;JWh^-rr|?)RY) z@{ILE1@TT`;2bx!z&jnu`(F*KLNCpB=Gyfu;VF1UoAK3yAlkpOiHkiYL`)j_S{AQ@v;(ItRN?&V#;{JM)wWO>FSK z_x62Pdn>45j^HB)H>bn@cCJ2YgkwCb6 zsWDxqm$=^5-pW-V`^{A)k(%$vuL8$BZ>^1~|BVr42#15w-tS^3%im2YKZzP6Zc0q0 zLF`5~7>$9bPp4=sTHGo~O(rpbl{JNIz(?a6!gzMrxu##Gl0W}1V|K%tH+cgK!r09( z$PS$>Nf_4UucDC9&HfHQ{d@oJ{O{>r{qO77JM13&$NAr1xNs0C5&|pGu+#qplOpa) z*R@f)b(^c<0_PY-lx6hiBNXU2+s7`mu0(O1(nw)AKtKty@uW zkG4Ps)BZfa5Ld#4Ffv`#Z!zHjylc|F^pUr%|B-b(>+aWNc-8PQ9 z`+4X}D68~_o2^83D+{Tf*wx&x1KgSbIJZwO8Z@^&Gyki zd%%zA9|aELZ_NRVtaL_rJg)foYw;xWsRroTR0HsAsxeh5Z7%wa=yb8=R=B4!EBeM1 z-`0hdl6x+nz!{b}=Rlc*>pH}(Y&)wZ_ZebkWtF1|S61nEdHKcIZ(l3JeJXKuh)kO4 z;IOi$HHBes$$(8-@6L1y*Iq0Ie=ycRZgVTFr?yrVJul0I@IP;7*WNk}1K=OU_vPp| zC=AY6H{foM+xWDGH0~2SgYoN$oTPOUr*R~C7w2r<=2wY7Wm%FTHRp#xp)DR%v9FY| zYS-8xh>{MXlI7qo`4OLel?&W#XtanMeJT7G6MG{9 zMano~4AIVdNr=I2W$NPR6IAveF=1O&0nuLTiv^udt&hs<`ttosSdr^}b56$w&9x!b zNsxLuct_}fSBN+h*bI=jLc6P=m~gG*7%#2a!}B+L>o|tkNC$Df%egVTi3sW!NvK~Y zp^~7`%VjQ&;c2e(Imc`0(BpO8KglB4uOmbSetOXrbpeSQT3k(oFiWDp-E8%XF5jrorLS+ zbN#1{4>x01xche}PrRdNUA!qPiSzme=wGUb^V^u=@=VT?VB8`f1LosCin0c(li-|X z&biT;mcJmIXJzxzm&=YApZ5Y~>wEfS-pbyO@8$KmM7?56`B8&Ceh?_>cz{ee)u+Mp-EN= zkBiZ9W{GX&01cdr^632qapmlxPp9uoEwY_3mZc6n9%l^$n)Uat0%&WSOryMMX>AVUPxKFLL zvCLJ_VOd^1ucX!59v<#)vNy0b8R;xf)izh=Al+sKWkAMAA&&S+DM^ID1;(kX3uL6O zERexeRfFK8v`~(%)aoGGcop_tl!xvd1K36AeYL6Vqg-jd3I37g1Do zIk-u&?(0inS&E}Xq?gck zybpL6jxG*@TKA{M7R%F-rm;wOfjBtF{PlyZkw&pB5f7TL^F3(x#{WeqSaC(MW0{UT z9OpwqQja#r3DYFpX1Hqnv~>BSw&tX5>%Yu6U-ad$uY>b=j{1jSE0*p7AkL2QSeZkj zcYfNLyCMVMo-QW-O{iRKbC!yD`n=P}W21s`^@WYxX>j#=@Au-SGWdITb2@fi>W2bf@;qt_<9$HW-*~dZT@u{xc$=jPn)~1%)V37myYEoJd2Zg9 z((Vx(VLS~v&*xApntdYAx$J<&Qp*m>QlE~**a4o^k!9MgIh@N+AU=+H6&gwSQ5mb- zk;XbVz)I%};*sEPxAo+Bf!ogJB{QNy@QQ#>HCYv~lC&{CX+*7yoj$5!55K-u=BSKG z^;W(pMjx#SX%DJs9L-X_&ad(x7fJ~hhi1{EM)x>D;J^j`<1*{rw2bvNi(t}52lxc7 z;U;y#{m30R&11uto5K7fOG0{!5et9(?V+9|+yKUcf`z{w24r40emNVtV<1|&s|{| z-p+^JWLYTA4104tg2 zRW7Jokqb{3pVhuX`X2UaO>;4{I-oduA#mKig>YLf97$t5c&`ExuC~{CZ13&P-id46 znZvOEalme0jaKA9xrA?5T9=tBgw=?n`AHVS8*Y+?2tb%*AtDbZS?C@yMv+(UF_OCY z^fn))=Q>kJed0_Z^@f^)-T#E#`KG-5b~|avO286RGR214GgHFOQr1mt;dQgZ=Vpn*`R0UUv z$X(44_&ul>bPODK-^yIPOP471LF23jA#Ah#K+R178hSG`gdtNVj5wq$2_qUYF~W#P z%Y`t)QPUrcfaHt^BVy}(BeT|z&?U!2q?#Fl>v6%*UG8w&`w(-lWS%i$(DuwB4HqLf z#I)B)Gc5^CL}wTE!BlO1C~qbHq_;TZ;1I-?mv2l~hC?Z;F&v5!&r%PR2X$0dW`C5* zO6PjXwA26_61A;rnk~VVmJ!OJIeSD(KDjZl^=oDtbsdg(y!l5OEY(OoBN_0>nd62) za>lspKtx8^86d)VGXPR^*^POibw5dAIF=~Xg*<19e+w6bV&O25Dq9tMMyhKVR!u_{!Qw7IPnQN!F zQTxJq`W5z*J+O4Q9ujqSF(6_yG!8k~%#1@0G9zP$nGKsp9|{fy{2{kSS&o`>B+|wc z=3DoP%YgE8q5mn|$94lrpHCiDQOKg>&)?*-j*&G7?Z+?X~ulF&?6i!17 z))*6@-2JOCV>&>3DGs8@^12h2CFWQ*$TV_=G#7d_|GIXjHUtz?I|2%`rf$M2tCF|S0%=^$B};2uq^}( z!#)&%EE7c!0-B=Skv6Yz%;sE|KD$*lSEsEOW!6S1VzsmhYU{g7K5e;3{}6DY)?>m;eYn&EvT5eE`6RK^PQsEl=a zp;8A(7>ZM2V##T$7szR<7^gbLlKH^Qt;XC`%-y#W!isX&3KDqlsj9Uv(NP z`nKaq7CsZi6(s($#4Aw4KFfF)i=!NG0<@Pk&;HH9vNnwki+lNiZv|wQaxS0Eu*F}W z7E7kiU1KuZv8fMkx`6jbtAjR@aJO|I-+c#S$hvwDMt7pT2ESEir{4(Yyi4Fbvrtb4 zToI}NmMk`e9vGeZ{TdS+br!*7d0cO@d|m%msomcXs#tzU&NLG~fb$*pQj1tJaT*$v z@vEJ432rm=-dHPk2i(2DV-D&j-!KN9`!or5zMp~;1gbo&fdbuSK3i)*)LJtoBN%=GaJY-N- zfJ6$*3h-!wQ~@A0lq!HE?*l^2QVJ_!5ke<;4^SU<{U=<#+QGPbw1YAAW>R=YfJX_= z@NvWl1rJ3|LFBWjHcpR4O=Z+WNeMGLXg|dFYd~aG48qP($HYSj>VS9%K^+YbA(%tq z0E4c)I}ppdLGq3FK^$)JK9A}V@3WrdPMs8Wm)TI5c7F8Lk0B)Z^ASdr^JzCW}8e79%;_}sl{ub$S+Nxj%zn7~T0cl{v{GtE&QiD9|xz)p>#7 zof;bBQggRy-cEU&YQL8T{sw(Y)?u5kj{=eIV~qH%k_@p?6Wj+?>??QAFV-Y80p3*G zqp~DN$Y?T*tQ0TerjB#Jpu5}+CE(MbPm-W2epH!!J}A?aq79IXfJ-$Ptebxf6g|1b zzy@;SQDJu;h8T5A`$44COtF(iXC8 zKH)+$76@y9ag$~3Pw=Yma;YCF%bj1oNteaIe5Bx3=Vy=!yDYDNqIPUoSU4|&D?n6+ z+ABQ9T(wuEP}9L)L8n7f7l8noBF96 zF5g69A2iZ{(8syRB!Sx(_DPT{o&gcr2VmsC{$zCVx`zL6%2J@pL^jHx=v`UH-@-L0 z`)T`^oWGVQR46ubFjyAsPxZc9RJr|Kv{qb49^5vGy*? ztt<;++dQS{0#{ zT`nH}ZzI~2E`EUZKjsp=c>?ZHT!!!Ybm_xVrOedMcH*OMJ)B3-3Aj3Vl2Dhjty9WN zwIq7`wjh>feks&WXJBb4>$0+p^@j2gxM7bT?D!%6=dq3}*2mh3(PnprRr6ZisMxQO zx2N?B{&|F8+){0;`5??u$rb!$6K8}T6+XA?t(ZTh9hcU}=vMX1-RfOMDtKRt`2G|E ztUtw#&Tv_D(ItZ?RQ~z>w7i4VU)PZMrUoE8=UpyQwcQM&CpdSI5nj!s@^JB8?BVpN zF#NV2kD2^M%=#RS3rFl(gN0(OOTmIpM~R*5$AwEJa`j*2MCliAJ$qd!l(A)nn@8%Y zcmB2AjnL-x`@E7?YkPRT$=<+fVO;NeU7vsPaM%4NuHRw7-@jY=C~VD~e`5w2v1<`l z)RKjOLB>bCPCem8J7A*)-K#uC#lYept8K1K%%vi95wizabP?$#r0!T}L7r>hk}P(q z1SgaGBzIE1eaI^gMa@SJ^NC6(X|of>qbO@ujr}Mwsb@V%M3r<>0s%>5a*u=c#ecW!Wg zY%*&VE)hkS)ZQlDIWw%9Tc%Y+iaG*2AsRi`UzNbynVvrH^zqm{Gk2Rd>~*n)j~5XO z?w*d}f2u5}0B2QIyUub4mHt`fGBg$t-EsjPvBEB(CxxRs{sI{9R>mDkw5M zaH)(OQfhSb_JUj;OmdjT+)A@6)hX&E21`x`PScAn{DfWgA|y>WZT`Gj>E^vrC~)qH z)q_V^!wKv}vz;d+I?V`0M4JBNg5Z*_aRCVw^TASC>1r+6#5bU)t*x`1$Q+6o8EFRj zV<}B{is#bpb3gl7K%%K+Bq;i9lq!dIq%b2)TfNiyU0J4D!NE_t(VzNbex-}gYF{<( zz?Tl5Mu9^;M1p6CjFiKZN#?i+A*mWCQH|#ceCS-1L*wC!wYi|=u#0g`48wGBAk{)q zJ*y1LWlsm)Xd6-haDKYazrwj?8I zFQgBhV>|u-Bq3lISQb8EKHnUKk?iHt?e3M7tiCmi>qQ}jg=ABPa+ac!dt()2`rsCf z$k+_V)vsCFTfMB9vcjN7hzCNf$QTNgCVd*0pr?9TCFrZ3Rtb8mr&WUfs)fua_=P}H zFjDk1PpgD|&BprNN^+OJp-iEnsiGKHNKiamwbvrwR#xhLb)W`YUwLi>hC0yt78c?` z&T%2!1;sv%yMoxKF_#ScutaNw^U$PB@+x4T+0dv?(+!B}IrVw`*}*=KJssG`@#b$< zx<0l^O8!`fAANRxdel9b2yS~|A{*Goo1tdSA+VGz{tLd^kx+oNNWlo$9Z((Ei@K^B ze6F&;(!8JcCrmor30k7}oaPO8C~b-vp{&yL=MWH>X^?4e@I7t~YdkT~G|aSj2t5W6 zMN0$o8Oz~r8wAE+wXd>u%oEwSJ~WYuYoYWh<8da=VH@XcW%VqNuhJ3{8iVNEetx4M z2hh#}@KaTzDBSQWg7N#%6BYDNx=2(Zu$$E)2;^?Dal+~ivG^3hur~Vicq^UdrmU@e zG8x0!xL}~!&(4%bX>yabl%;BZyxZ-pEWuCH12kX!_6&DE*!=P200eR;+5`z{u!f{e z*(?XQ?Wh`>`*0LujNK`XFmB_7ZS!BAt4g}s-cpIHVmCF4o<;?}+ z)}Q$FqdLm6636)@B_OyvPO6d)4Ywu(qWc0%U^T7>rLCHhBQgPkFieUo+HEFs;Zk7N zR%GOsScqyipYfEI*%1_+meGj8=K_y2N`Y;v?x<*;4Z$#nV&>!oyF6yfN228jOVIXV3 z1@)aaAN5wbv|#OT?o=pi-08)?h&Sm5#OOde5*-bXatWn5!g-K#_bRg49QHT7pVez{ zsNG-Swl}UvucY|8(UiPAy&7S6OHugq;23{tE{ug8a`ZG5l!DRt~rDXZ9^jTE!C8VV~TH}|v{NPWn{KvVhh&{XG+-?Q}f4fMR zb)4)@&uBNp!A{p9Ah+TT8%j>2%N_LOIPP`Ob>>Cvlxf)RUvSu8PlW74wo;eIHe$DI zo=a6Sq*X_$X0bB$QE@WsP=3jlGw6^;98)CU|OGrNNjl)f@>%ig4w+<&9M+A;mScs zuu82E@0EEWeC>Rw<5j;FLUy8BJ-PC>dTP~e<*6!eANNi82fOe$prNPJ2YT#;`9*#& zD<9Fbk+y`7L@)Bk6S+TrJdyk3#}j#U^LV0m<&UQ%UHRjQJ0y8LagD*_iD?WTPl=7e zho2sn)18T`&?3A$(7)KA`DjgfONxxK9@c)_@+Jz z9Wr)h@<9rhQ=CvwVim$T?n}b-7@?fA0}_f1dQI_jkA&z z6uHTEP^lZ;C>j|N4<@Dnk~{w{D`htmqQDXH`BNA~M1CBDjY*%RkUhq=&T^%xUSCjC z9lxNa`hG!8bpL`lg$Ec&OeZivn0{b@@La*bNb3zon7@gSvlG0kp( zFwJg&@XT&tq&2&N$+VLJ!m~~vbZ*RFe%UXi3ZOQc&U_Bl*mV$8lh;8IZC8iDG#4Eb z(`a-^yl%e(O56Dl!6|&n4wGqCh9tUIIV90t%MOWW@HTQsHC2t2Xe*rZ)=(gKBz0-L zF1i7v?VlSUvvY0;yqD6C?#^%fw07DZkm13VlV&COK&SWz}R5RZO8vP;-=eQRkhbTyXuQn*blg0g85c!{R@7SduiD35}ZS-Suu%wqyz zEY?Qp08T)$zm3TiVzzgL@*+!FVfVXE!jOA(<1Cka+x6+FY5YkNX8vpvM978<1+sWA zQXsOQk0J0G&ts(i;Ko6oW=#U36S*eVxF3wxr9tr5FSloe5r zOj|LKp{qksC(Av@qK2)(8TfJN!)Q6%D={?n5ZaLe7k>)VuIl$a56W0H4l|TE~8r z|Fpd(zW-~q)E@ULrS>I1o963LsGN8QzX+(QdT?ofL%zSI$@AchH;~|uyT!TLS2l+D zx%p(!3358L^<8<=*&S%Ut}9#SrWCL9{cu+Ub%J9WV8_{&x``h*r1D=WdhDrCUGcL# zHkVt}fBre|F^=g7_uQ4gxT2GQ6!2ZZxlX#XYw1Elfo&_7)*V}=ezIy+W}={6vC+QN z+T|8l=73$&<5H+qA1C;^g}c|%o`w$M^n$Iww@4!Q(KQP61=09l;9n; zBzEaON;iR89Nb#y9^iIN$>ElLiUJ=53@G1gMWqTI8pH!S2R@ z=DRY87arHmA1oQu0leQ4*=3XOwtlU|yw4iPKu7a&HFy$ZL{4l;UJf6)4AkHIb5`>0 zsjTFY-$C?n?6&QWp7`Bp`9XtCV`zoV_)1xsRlm0Xet!Syr+=)^pJ7v7Ak?;QgeX>7 z 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%0Ak?Gc4!>v;8z|hcLVMH^ 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 z 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�rXA4IVqRq2fZRP06eGD=vE{I%?cxsTZN-fyB6 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

    %~|=1O^fCPet;T@BcV>9$N5Wn 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%0A4D{>Y0q;gPUkOp+P zWw?HJHq@3w9T}7tpIF@I=8+`01XL6l3`co6CQYZKX2Dcf3}PZbbm|sl>ThTmC_FQ8 zW6lHWDawHBbH^kZTz`rw8$oH!FrZ7boYo6&F|$2klqxp1x^@;nw4LE$p9XC0bdX&6o_fvInVP#;z`Z=QxcF`Q(wuC$=AWbn3YGqMM~BqFso18N!6(4*F7 z_8lS&38fOS91Jgn@{FO2XpU_q0p%tuLk~7|0|zJJMuAH1_*g`J3p`W*|9@@?At@3j zsZ??=at~cTC3HhBBe@kB8fNC2Tjg33l3S8;FPGWHrQ}jBo3ItzsJV<~bDOc*{EyG) z`+NK!kImzp+2g(U<@J2Np3m2NJLk#neKIC}(|5g%LB{gt3JIzC-g=2+S}v))w|9!i zsUJ_@Qj8H_Q`5}*`gkz;+JPV=!=!`8`vS+kr^F(JE1`?>q%;|ajwFx49glFJe{^dX zJiA?J29>8eaW48Ldk($7Tfm!tSdhfeFYGJ5Qe>yP58o`Sy35?)E1oQ8fqc(rWEmEpBL*5akUuab?sdwuK2E~OqwFpQeH_x{Mc z^Cus<+&>RiAe35u>EAc(Tm5zF%8UBnZWpe7HJW<>{OT4_G)S_E}{7Txt&zTK8FewtB;b;;>1ggr;XsZQ*^$~l}6SFD>0JJU;C%j+Wu?5 zZfdvhRQ8hSH0l`6`24)B^PY*xeOLE{-8nAcyNB&1^YP1-s;m30pw6x`{tppi8?My> z!N4`i3cjsgJeD|i8xr+%OsgR~O8!md1K$&Rd+!^W|9!Kk@@nTUtK*J$FbDQIFxW18 zyzUuKz|`IczJ&+N_UYLtl$C&rUc@Qv0%BHpX|?52!r|q^`ep^;ltf z8Jgp$X+YQ5StZbgO~x<#$_Y0d6898|QtM;AdXf~%amYXx&*VjmK6rZh(UU!|;?{L} z`#zm3|2Fh#A1>NO{EN^NCz%oZlSQ5v-zT0Zxpp4wt>}C~Yr(jB-Er52>Q}@Mhhz4* zk-S1QbrguDD&EumZd!@&BFgv6qTxnG-+#s3=o3|p-BtUxq4cEhu7mE!gE|-UFLYMj z`IIMOit0iXJ}{}&sI&BZlxHjds86FZS9qTc?Ezu!Q~rCw66y!bBCXw0rFVAiKFEDJ z=Q-L?^2F+WXW8kvvHVHna7J0@h!3e}_L;@a3)k)`xv(FcBHk|AotU`2A zZ`(?LMEGdiI;QYKwWxIxmYR_+nf~)aT}kp4>S*b6i_?`CZKhj?Dr77FzBri%d+~h~ z73AaqKkd<2C9aa5^P2pC?9lfItUPc1Er%{+YjSeiF$0MVQlGnkcCr ze6z6c76yF$Y%{|8>gx3E>hkhA5#F7knEBD#jeGY}my>n-E-6pz#!^n?uHCwY>e8GV z;=eT8xZC&l%IZ|%q{cAM?L&r1j_RIN<>eb+&Obn0d4t8|_Lw)_B{DjLo_5t{j>f#I^8a+OfJX(JbD8h* zK33)HdnCB3=(kb+-a4r}fQy;bngXA7a1X2Ox9P>~!ODLo@9M7+BnjMUJKSNmyWdNY zqkau}-uBpxxVR!+#Gl@h9xA!uR(iqh zjD+R=h*w8F9$kM7et6XVVd*%0C<)>hSUUbB2{QW{cwShLdkG7AFp!g5o!P}#LQLP9 zut2x2)w$NEcG}+d)~KI*)$iRf^kDaFm2J?$4~{)2t6W_!u0T+?PHc?MJc;rlX_dHX zd-#XjlxfyWE-YC!wca{@JlDX}M*SpSFOiAdCoWqyu(@AFBlljQfxi87JE|2kf=RVlaLn%~73~L7dC#89p6W6w*eGsWnF-IK+ofBVC`8sq8NJM%`>0Unn+i_- zn2+L|x6l^fTK}hfzQ*0`^oV;mGZnbsQR~MG67uG_FERIZWDPvv8PUNq<}q#iq+{2$ z>D+^+Rf{7>Mka$y(?3e5Fv+KR?mv$?zD3#76IcOWWo>zV?(Zeb`L;n!so7tkjk5FI=*>nHt*0|ymeYb$Dh-0d#o z3Y$)qe<;N%TNmU*T7T?TmG~Oimb~DJs3S&&;FZHbW+Ws<)*eMZ2NTZD#N>Qzil z>GP|dHf1p_5mb@D+~&Z6TjPXJfu*E_QTs>WdQr^Qs54c{YK@@zMlZ{ejM?JQt*+*4 zv7a<+ZU#ClH2e5mW3rQ(3$smVZP;hSf=TWEZ%^RjTwFmZf)hSPQ zF3$xVcH`mq%U~?`pFJ|vF3Q7Rc$};{ z+v#0N8~D1Db-{j?hdpT@Jvrv1ZSE=G?SQ?PSsCZoSS^0k@bO63C7Ys?lLH^IeVL2) z*pg$9kXPG&XI3uPKULF`huK&*R=Q|(YL~UF-#+2-HLq6l&G8ZZ?4{%6qFbQ0Y^27n z^^vC^tJFdg1D=*o+Q;thQtiHn8Eq=RyXg3FpLT9{DyU6H-T02cuIptXNEa)rGsxxK zV#G5ug}P7VoF+?K2VGjCf9anO;))6O*IE7~WyKzk&dSF{`5SF@f9E6eTe&ZvR7WpK zU$e)U8b51YuegwezEu3v&iufFuHk#{9{jt{C7+V~Pe=(FF{dOp<|*qxTW+2+v`!hh z<~p7dX$T7qZ-UGz{GEeP3zokBbKl<7BUFNV@9IypQGatO!zW=~MAaRqORAo>%4X!| zB2!Y!ubg2z{@Jr{^$6u%i^z>B=}hZG>w6FFw)Bi@+y$~YkmD);MMnS`A1fT=zj%Ff zXDDk-K~3h4hL557U8jqL!=X>s;T>SERR7k;DAhgM|J;EGLUo?+8!Qp`i8^84@bc?b z+qN4Yu6-D&dbz{N(F=c~Nvb0cW0{}x%KADYm#oWG&h@lZ)I&UrymnTjeCbowx)eXg zG8^RLT?u>}?||{7%Rh@!{Q2(&0tx@m0<0@~enMwFZ`w-)qk659mDWEW8v1o7Z- z%Nlt{{#RRhyKLcsX1)33__ZQ*F;Z%6F<~IOu$8#hukU(!q=X6JqUz5qscWRJmAzscrbMaN|efX@9jH zc+yCGF2aUtTlQVcz&84W8iz0*u2uZ**9e)?4!;8>-dX%C;xK8Vh!)*x$PQ8&Yk}Lu zYM(Uv`D+;U0a_o+JvB0!%-~C92z`Z?G_-3!8klF677Y^Id$mvNx?hbQ!N70AnC}RI zo*t071xSyuIOY^bKTbM4^t{l)%?rOe^78`JWW;If7+7$P?)}Dt-DyuJG0=$z%n6F& z*{{D9eztuGgyQzR{ZwUAeJkja-}uXb&i3Z!HMeo;_}4LIUI=aPvgmG7;_0;;2aJ6O z+SZC3-=_pGFStpub{6=bEvo<1m{v0B2|WTYZj@0elIr{_+ayCTB4pi+4VEcfGUrR| z^RW%Y-FnlAq%6ODZ!PMAIr|d~rgh!Jt654_N*Rs+7$0oDDz>_#E8^I=+f%ty)|xlz zQxaV}U)l_5eO<|E&8a-dvwxW&?^c_VQ)9euRcT;kGRNd@XZ7p%yEovs&uD)CRDHhN z@^4jn8K&ue33Xx1>t)S?W`aQI@DBH5HwNyP8RZWi(c3a~$G99|d90VT>Tu}(2JqqW zl>;M*LqEV?oi@Uzwi=$36E8!MZoJrKqQT>>;xh+Sc(I?#^0t^eI%0RzCmVL+06B@+I*Hu?PR?n|Bg_pZ)y9r{~4wMaSQNIQY^FahH3K-k|a>w4~R-$1Cjop>% zN)ApcB{--M9-fx=T~7;+lmNLrhQtLvdZ-~ECG$ogcmEH49{&JoX6&DRSB{>Iq+wfg zHq+|%=PbXFf8ti7F?s#GWZ2yEl-kQ-%-gr?oCD8Ua4M^xYIW^oc&$gLo%kax3xAPu zFGV8$39YO-;>;{!j9f(4Ic4v#%i)Z<+i@dv!QV{M7<8ooteR1XIeV{$xKglZ$}tLG94VHT?U#BqpF(C5|(6wd?9)^s4>0x+d|v zrUQEh3KVz-?j51K+`_)>`C@6X?=9kcXVP1YL4~{sTCRWByo~mgE^`rfI2gP+cio43 zRzmQbn@vdZ!`bT&i}qt7FOrAeU$}e{_^EGIBIOjt^CAYz1q53$`lh;wrA`WFQEU*1}4Uxw>oJd=e9Pc#MOjGNVh~3z|bT-f0^KZPzE6(f6 zBQYW8uNAt)CB|zcqhF|VeD|QAHrO>8h^W4J8rNTaxcv_ENv1>JkfOfPOw@rF z3T=|8mXZuK(_WMlIz8fhk^JKg+WODo>H4+90Uuf`elDxLaL_Lr8iUb!Kf?)2Sc)xoEamE?2o)L+^7k_UckEPhfK*6TZ$ zDk0)Om?D4QT2lXXl7jf{S5?6E?!Eu4J|)!WpVl`=oxP-^9}xHWj-yighlD)NuJcgy zh3k2c!Nn2ra)0v@X-R9(WKgng$GKDLHIinD3}?mT^p?)703U~z<4HU2!LGW$|0jID zB>`4(xcE_!V`=f~@ry5u+jXRZ6Q|721q#e^#A;$xlg;cE6J5^WFXv6%zImYL$U~QB z4aYB8X0&A8UDc8!mcOdL@AN_}@ZjqBk(i%R(SqQY(0 zo%KB~D5R3C@AAJK)gNlI`10UFjF-W&Qx^TVre>i!+Grh~4PefHmnB-XiaW#Ly`yJR18l&xxdXq^rhmkz zC#`DXszj!C{yasAohtA+{b6g=zb_0FcP1&1Uc2b`aN&Jl*r<}$U*o;{YC?)*A(c`f*$kXcEkz|YFvadQCo*C|e)zbmNx&a2e?S91aW%FLWQ`e&v zAA6zjfQTC!!#wuf5l%7T_4@A?u~~ekADwp*|FZ7DvvBOIzs>brpBYa zHO$q+&$TB*Sw5x#Qtl^TAK24wt+DR-vwC*x*usy}6A2&ODJk!-G!;E=t#9sox|1Q& zs7-kO4O_Bu=tQ=B&f9l`2}+SY&AcRXT{QRm&(5Ct*P=$)bK#(=#YbCX@T?%)9OQh# z@$3dJeDHd8M_PgKOmh%1cOWfUrHchm)d;fP1(@l;88=LzHojRdIMYAEaB`yy=EI8`xURtTpB!5pp)T|c zLvM9+;i}Bm4&{->wfe0@tVEkS6)a8?H)TbPzc*=Drz*=XGejB3B!g6n>?Po_s#9j7 zq>0nmgvMdevn2@Pe7A`p=|E8=R(XVKMG;NHUWzwadhA|gF9siA_C<`xjXwsuX1vx^ zf=zlMB#?oH?SLVZVQNL%u^t4FG>i`qzubf3?amIxkUs|&ZB!Wq5BBNHml)yhv28n*0caFmq! zv5qqhTQP5E$-T3eILj>{^5KrKp*HzRxlb9H^Ylwbw?*BEWgJ!+6PQ0`D+)Irajvru z%9j>{=WgBZ4iH2hv^R542-qHIW3fof&Ozx(bG{cZ5?)nex(t$^e6&LADCB*l6mP6# z`tTl@9iuJ?*2>$PQF0pVgr}ded4g`ie1#U*GuRVFXXIbVuQu$EU)2xx6T!yHy^vqm zw-}-d#_nt}09M9n2)XBle6_2fTRlVo){uPXuG^=6UbQ>OLzpkSfzD9zlCc$uvGW1zx+U5TqYWuxEwDvmPxAa_!?J{#s0$ zYfiS>UZYrzDGDmVaXZ)}_N+DDM)7wJoJZB8m`^sF)e>=o)JV!HqKANXNTyhDqlX;t zDvnP5b)w^=hZJzw7h|-Of6Pt%|gz;NQ0>dQ%;x#Exkx%CuXsC2ixC|P(L1P zMfrpC!7@b|-NkeswjfrE8n~X62Gb3;ZO5;;uSop=iROlk6O~m|?qYErjvBq^D)3)!8nB`sUMw|)m18~&(1m)NMY>A>i#WN0`_^}xCf~q=2-guja z+~Kw#Sm0FB8pqTTom$&-mx}f*7YQ&vOwd`Q0M=9Zhp4>M!NuGJN)dKN zTF;$&Ux67pX<%A|ROc4ITq@eT%ok``IY=o$6+g7==FUO&C?;_jMPMK%_hI62B=7n* z=6|ZNR_;xx_+V#~u#&htW|0@$Rhp(0%z|>l_D!C(7!(WUerVvo?HTfjc8t?l*=X1e zbBXifHS;fIdhzUb1!t$Jyw3d%+B^AlBs+GLdT*Ab*+K3-Fh8-{QgFLy$E9c=J~*>1 z27WCLlfYwFgV^r1RY2jjc6JL-Jv$+1rd|-#7mwL#-@4I#x^o2RBYf+{lDi~H4~T`# z;kK=cG`6!UQ_x%AV|zhcEoZ{Z9<%?czWx=lw`KSsg?n7oih}bvOl_5KNdV%5a-n^8 zuNhO-lwTf6GE+jz&xNobriq*_4*%v8>6RrLnP2TOC<}v^8BmP29x4QFJXBz&#BpiU z>0>QyO)CmOe#0Gwql;^Lc4|`#c>r$;LuRoT7tAv(?7I=ydJzX&%2p0Gg?}xxqMXrw zxwN*!5Fo}noEcxfFG2+fG*QOeICfeVvcj?(BYU>4^m+mA+Jmemkj!$CFeB8u%%E=d zger4Bw>QF2keCS!NouXn#v2PTZc4lfXK%cz1f1BPyWQ?t4{ax)&c9@SWXep6bXkC@ zpc;g;@xhwJueetdow{9HyDIWPW_gOq}#Y zgu?>d zi;xILibXK@E}H|H!k*MOzruI}X6q?18M)sg*aGa*+_~uuV6u7=vG#&6yAE!37L018 zz?7PNofK*2eET?+SDD4$72G3&&6I!_)V)}$6{@9QiKn#O=;oGWv5yC<*FG3wIKAGx zyr%hli6IE_zFxLwdKvyKja{F`77otT_8*z?vrwG`_smX5x;Il>wTZbs@YTmVkk6J9 zs#eb~XY2}YeXSzsCe0etSZ$&IN)c4zGW+WAY?VF}_2WTV%djSp{FJL(&8+0IW*m2Z zG<|I4c}fzt&;0~7aOYrTImH~jbwz;*wxT3-m>r+wz05+wKc>NygTbjR`qhcM3QPbK zY(dzyPE7WahAQ)i)3*pGf!xR(cj+2LP8wTIm08$9UOCy?W^sH9j5^;PAb^BiE(-MwwFwpmX1Hkq9H-$I z4ecO*yfr~Vy!;-K+kSC76>-i)B5J5-0FFt-!USQsfP+o52q|&6;>&N_YN7Ee)83=u zYBwS~i`~#cZoA54lQgFaw_FsMdnaGEH(xJ+waho^QO1E`2(WXA2L8BCfDE=;$1>Le(pl|nfSY{oQLb&m^?CdGLi1W#On8KTO(KRH+n2m+iHg+6hJswrp~ zUjYh=U)hw@qcm7i{NgbW%G+9A$lrERkrqie+(dOxptrKf*|CaZ`N`Xqn}SLU34hN-DlNP# z02qS4>blxOjuJjw%()O(rc~`--m~y$bI+t8%H!w@#AK0cd1k`tuRhqWmNYi6gM5HU z&n-y$mo^8|KPC-Ca$_zxq`^EI(%5Ak(Jmc`f~;-kdL%b>zv;9;&iYiqv!$5k3*Cqv zEnJsX`l^tXduP^Cttcd+G`A|ox|LXI|KeUoB>Wq_PvOTU-f%Wg639 zYQenwt!5~FP3r#^r<}DktDb}fzf6N^1QT5&F_5p%m&^}MMgM$cUcVZWlWj%GQBbH8 zA)(XUYYn`;u}BFxQ;4CVz-wcus@6Tr+3vHoW8D@9$Zp(3tcNJW)fs@mv8givdmBs| z%m7^R&a5c=e+(ohS=Y&fss@ewD+E~tn>f;Yh_0GcGl0|pZBeDjnoUf?ss-h2>qQkH zH!0q?Z*%Cz1gEDV#aaw&hS&`#AVD`|vBM{&s)y*a+$3ynP0o_L2`QpIQDKY=@=`920(sVSYWvq9&rFyr?`5+!Q5hkQZK_p?N1z{2AEMiq;me-`dN7RW9 zs*LoF{wzsji>Wfl3n(N0oi{C5osNp;nO2!#*}JyiUXYD#D|`Z##E8B zgDaf?Gu?z%fMBvb8v(5rk9lyU((E)@P>GIQk2GWOUPKGj_Ip@Il8$^7R2t{L-7yP| z9xw0t=m7{a%zI{_8RSujzd!~L`*nz_G_L_1MO}<5DW2lu)v6L?TN3YS>3I{ZUZ3kO~B>j;3@P7v*=p8-dAUn@_gsyatDr60LD6o#2&-Pi&Xx)Yem3E?{Brm{Z)`%x!YLY@_vrr; zmE0m=G7QqcZwsR`&c^t$<3Xx{7XagHD8&9X1dO_PF5|j00!Vax$rhVb795jT;qhW= zP2LA96^uzuAKQ|4bhzfe$9~`Bqlm-7DXEbrYciJb&%oCnLGrKFcS0^)R$<@Q`o`G+ zEU;NeH0o_`6(9mvy1lVZLdXYK>(nPsAERnYz%7JHmwHxL*m9O|OHkYn`6+=N?5R9H z1?iW#VB6~2Jucve!?3Wf69D8LdJ*!$>^9fB;`YN+t<|Tft>P`^KD>>-93O=shhDDd zq`5nRUgat>EyDE&TxZ=*lB`c_o3Z+F?H1AZZ+b-7I|PUhLu{zW1p=;EewiXc`uvpQ zv5wAyc{+5D3zG^eIW0BLIsZp`m7I<3v=wAU*`TI>yg=owcmD`cV6p&%c{o^BkixS9 zeuqc#>M%2?B|23kVY?I4U}nLJ$5!FxJXt*o1_0>}*gdOar^xfYn1`8ZL_r7{WX4Q3 z1FT9SmMz5Y0JW-cva*o(Z*&Lj$SoY1m2R^A9>J7bHs3)iz1->sL|yGq4XUjG(znjt zK71i(iJ~^eI~gp!Fj{x%QWDmN{jX#jtMJGqEMzam-00=PCmCZE#B8=0947|Xj<)xD zz(=fxOjc3UsN^+}0&`ce7jvjbeXHwdA>Tp2J48tuC6i(1`dstZC*V5p%~@G{_C7yy z`M<}fqpFwJj{N%e(oFT+%LkYLv3kBR!#0VHW6pkF>Y%T@Vw*u{`rV*~MmLX!UMexU zPhRbcED8ppPdM}s)HA-GY_*tm&_$}CwVm0%Ih4BY62%xXXjx5a>-pG>y;`0Sq0sSa zI`+Ir3PqYMLQ8fWUumplaTVPMNLc@wm(ETiq)1wZCG0!ec~Z-Y-C>hoa38!@J~q() z0wsi3{sdXS5&c>zg>mdmKbe9i`>%2sH#ed(d~j;Z4WHk;NWF{D-k-fFD2Gtai$ z?+kV38wrBjn83AnpzO=|4gTJi8?ZKuiUh{-Es8?u{kHbF!L4ZSX`0q36D(SYv95RJ zo+S8mGTiay>q{b`ZP@jT>VQqG1^>6Ae#KK+3&q&jSAATm0;ARi$cim0Xs5++j2#mKaPe8nIzphO~d zSS~ZoR>(dyw{CPLTL=%vB%!Vox*BOqD-g~8nq){rm|+u*`^>l$qlAv9|HTFu7Rjfh zGf?}9y2#Jym-JQU$?;OfvF{{SP3pbT_M1;3K8ywYLK9=j(M)<%Ftn`B4}uN5Or*~m zymQBqENL0H4P#o{_&mW=+7X2h6Zq^x|2k9r#&Ytx+<>}z#jsiG-@|yHb*w4v;U*NG z%~&Rj6so9SvYdtd9YC85rr4IO;FwM&8jD{31&kY;5z@vJ_VVMaG1J_+Pp*XBVx%{- zng-|#+BouVJgOi7{97|}^G3LY>x5sa$pi9FO%A{5G7Ul=B%P(N-6v8XCyeKh3zF^V zj6mY-N(@aa1v2SqQb(y|T0cQM0IfX0qg=hgziK!wu97e1Np<1XV8zVIUi)DmlDh%7*r6CA<=khKM<20U*ZjmNMif_9SzNUt#Y<9EU1WX?ta z7%$26gfxbIG#j&}c`_34(FAlUD4KL29zrtfH^ZYF5gjYn7@iCpymAvG8?kEoV_#?k z(+Bb_%!fU{a-G%MUzo^v9hSj;yIWSdYCXkt{}q1&^=@v zDT@A-NrZIq`jt}{jbTtW9mm`o3I*MPd<>hGrtwfS0y8lJWH|jL2*2`1!@QUDR5XA5 z4!AFY(=sGQ4pX_ycu5G{%Ho@!W~j~>ShK_Fk)R*56XrC?uRapF+UD;lF37k(7iEoC zZh*XTvS`155G^9DkNkpumBM2Cq)Y3=4x&>Dnz6TwW1SYfAkHdKdUe43F!ftO$u?Fl zJ#c5r@Qj{DCZcjOb&x}7!lhMC_&LMIVies~eyFbarUEbuE!vtZ`*d(hNx|lEXyzv^ z`gPvsSJI_?u1M%?jceqs*!K26ap5aGv`naZ#sN`qQR^SjF!;%Yg%sMn}Y-kwY3*66UY*1)2&VOaubgUL4d86Ptra`wejwgbJmv> zfar4BQK({XQ#@42)b1=Ee*LoGjh&OzI9tr%qD434_cO-he-_+vmUcmxXaiV zDqqb-{No|5g-Ak4*6APz(1T8^XV+qA-PrFWVfu5AQ99yhRljmFBQfk|-8^ncDOAGU z3z8Ierf!b@qMMk9`5QKq>?(gBXy26=jVMIfTeEHH7d?ovOm9K-(I6dUH#*s{ah$Ug zS~lUm&1^ybhAi6|yK^uCI?0g5$10)s2mMQp$W=axF9+>R$yW>n|E=e9UBx>4qs7o= zgy_ShV-^%^e+L8q^4m$)tpK{cwYHY{;AXZRhYUT5Iaa`F~cvpLy*`6j!_GW2dg zR>Xn?t%#!rwW+RJzrMwIyLM@2(25;Ix0+pLUynDMA@u7ayU+%|2^%f4=phSTLkjwB z@haA9-o9V?5hE{5)?$vnexFu!7Duw8Uzue^)c6;n`brhof3*c|I!|1ZW9dT`V|*b6 zVTBfSdM3BDU{L~kv&LjzKAIQuN4uW~LdUuw|I~4!8oTTI19>?pFoC>PWv;#ZoMBiz z%9&7zE@1{}x!qwn;dxzX3;ETk+q9tm8h-lr!mJj=#F~^Uw)T=D=+EU?5o%%2{uiHe ztZ=>v`a-)t61Wk|1Pflj0h>uar3(wB8@T+KP14NG`%j{Pe^6hm1Dz86w^Py!MeCwa zi+Bc`z*|n?EAb@BV;1@2{$Or#*%VQSb+kp!nJ`wjX{}B=dv7 zuN*FSr}4y~j|Q#w>uiH(ZrdBi=7ixc<5-J7jz7SQ+_D_Od+o8K=w~^C%WNMNOGDKc zs1F3?{Rgvf4ko%UP&|C}H?*O(&@%gk7d{=FkGf1y#y&ikA)Vopj|#G4%hKCij1JW) z`jxuYr=j)}Mo&rf!fU&I`oXdLXCQ&(j4I)&b@Q10Gi_pI`)aO#PMnhTfE9bhA>Z{b zxT{iN!(?F0As-`5c5sqNtZsc3Zs?qj(yY=&4x+Nma|(omV! zYzO+qFM`WP>OfyZ!e&6e;O=?O`s-F>sA!3aH+gYhV1s?LyHv4ZCselD#$D~umV3Wv zfDSvHw&ucKKgikS0wRv!&Cntot^UBSdT}OyT#_t6F9Pcy+8SK0!jsKANayJ{1jlS8 zbdb_$?b~eQ;7g^7?Q&4*X07O&xG25@!KFW18Li^X?s5^>Fn!95ca_=PLRYQQqwyQz zlt5*2&PJ5*-!Ftw@FH9dNJM$U)bISQj+NLA#E#XIa1a%Q;~a zb#=H|3A`pL4wXX~g_MxrN#5f}aZRMiLWX{jcVWK@0t{oJGygiLUjr<7tPHy1qAv0)`sr~VpKwtZ zCWY>+acxfGE7i1$Koya9Aeb<)D-Ac4fKUJR93@6L8uWqO+3d}z!Yd;o4{f5AErfvc zyNoAUvX{7ObOjq4ys(QARL>y?V=(xHCv1p4v4=+|i(z7UB}lNyYn3)6{*C*O0O>AsEZ zYmRI?65=}3d~Q2fk)taZ9$qrlb364Yl(DOnz4FF|$x?K*m*BE_zB}z=U=ImgZS&L4 zL#6yd56O=x45JIDlMpX}rUFh?*m;f-|cWYHJ?b)WFb-Y7-0Hh#~JX-ilH}rZU7g zIYOZ^ZmB;VVDPn*Lg05ewfI4zR}VSV=?@i*_u;mPg{pJb#=)@9%roJB#VhjFh-jFZ zmO>Kbt`bzbK}${RP%QJcat~=+`y*38%;bg7q-L``L|s@kg0{pP#-~5_V`LDzy6Du1 z8>Uch3D*j{;IzcyPF$x!TGgS{>Ty5&=r+>``=61+_6W6}7*8kWUKazrD{Tk( z2`(j`aU8LK0Z?_BewOms3H4`z?KL&yy4RW7OHcX(3uK{GSV0n$TyC0nYuU6#0mtV^?VHpC!fV&zK<(9+O`YLhUPXw&1Ql>af+UdU6N zpS5AQ$ILNj*kaoj6GSU!Mdu@gLNPUn;EA{>#yk}de)*LYOh240xXi5WIiibHLbC{G z)J3MCwDA(m4lzu_)0j4h0w0LH467g;qDc&4PJn%>~dxJP!37V89&& zjbX(*!Jj<{I)bt%8W+$zr8Q5ZCP{byi) zrOAZ7&COpiE&*V#$|Ap30d)I0SeLbss%OglQXeNp&yaa-ySx$h-W)Vy%~qog-ZqTA zch0<>XHR>l)J@t=w==z3?6)lC1aj7u{0AHhe9t^E7}jQh^K`~q+C z=S%bSnz9UU#xOp57(JxMGGz&eW@p@mpu>8U%VRx4=CA)xS6rIo_P#4EfS-o0RBIT! zY}J-+-kY(rh7F;oFVUAqD;4?&aCac6uu+9bP^|!39}iw;9B6Ix?9o9^9++{w?F3D8 zpSVbiktSQzxa!`_G$izTGoIx4Yc|&2YPoD4BhV)S0^GH!yR+e|4-*q&Ep1PF^w>Id zy^K-n+F!5yaS5^|-QCQwICdflsE_Iz4x*zohF4CDs`QW?Y2nVWtq>0S!47n3k3KA# zemH~3by!{MuSsA?62g?~m@5nM4777U`3HKTVfCzmRw^n7AJ|xX#wOFtq{KvoEJEiG z{#e2E+1-J3iS-B8*G>!bqT<78JMFw7Z^MSv=UL?G^E2U=$O&{syooS*Jv$FkA2z2B zxcRWX(3DaWPx8oR4%R}Hy!v3utBIFc(n2oP0;mU;iRTo&?#0hPQk+Fi?XmKdX%w~!77bY{_ zg!M_Ra%v;xpfkeaY`zd7otBv6vd+Ac}$o9D8^HM}84p+I-FMu=Ph@BbDHk~l3g z51Ye>c_PLhnNs+p99I9YNV6YNQ4Vi&XCXj6Y&FD$rWX~p10CrxV}v#tnzgr_EncZf z4Rf0EI)L8@c?b%>KRZ7-k%_QGW_rvPR!w+V#QweUCUZ5 z^kTkt#1%iiJ}VUJ!{5RY!LK~DK5BIj#z=GP_4CCE&^%7^zRUEMkS*wG;Zd!|46m zKPITvAu_I+uT%3}AAmP5M3UTv{-bQfGk%Px3>uZwuh~@l=|<)_{bat$PVx!5uLdi+ zEfsIuo`*6bOnX$%8eY-zW$X^k#a8`bTP8W^8a6yd!3p~v=HQbLX?B*d&*=85)tIKg zduKo}G3ZK-Ml*2>CB_FOOryp{(UZJ?2(2+sK*-E5Eb{wTC|$zBUBDSH{&#n%-FXAB5BNHV(i zU^F&z4>}bO4$tS+()6M!6EwXUIrnbT6}rFn@GS2b?Z3i})^N|a{Q>y}*ZW9rbnyUI zxK_e{(&dvQPQU-0A^+hF=mD5B9T_`_evJa-0Z%#C$J)5J3n)vpTh1~LhQ(*G07qJj zt2$4Zn?@Cg7{es0H3T3>Z@VudH1H@u{^|txd|oE35%&Z9`yHL9(TGt5>UtMSpxZ7* z1IQdJ`ya%D{>5-?k~!qmIre1a49E{`*UI0N8`1w?5xkW$=!GZKuKcTVaw1LC-M^8J z(ZX*Nqs!Yo%H`1khC17=?`&FN}nPAOI_F%cj;)8%T1dcIBL2k!fB7uA3|a=@$qg;~L8 z?D5dyIv+?z*amT)rHOj^U!ClaOKaOO-qzo9JAE|K=!~1Ljjptn#F7;%;}~&n5O+zW zL<31YM7y!DpIC|6-Cnx`j4hUTVTG?zAv6}CaBNZTn6|?4bMnldZ;Fitck2=rfo)Z; z!=u4m_FkGDYvExTBWkM;&}JU$30ebeUO{Lstq=Pou-&)b)FTsSIm`7J89=Y_$^n#N z0XX)JzqN(U#cT?J7h&^(kzA433J5u(fFCm>L3=mxg``AZ4jN)RLWiDqS6UXz)g{^iiXOUC`MNCw0=8An<>X=Ks6vfkc2Qz{SBJML^Lyf|5GOWTbNdcE0CEPXQxo4xqHsUz`uf)SXOMk zhfqd7yj7i0`=btd4yZnsB0^_-azOwko|OxY@tAwUo(EP+hPD|6iY;b5jW$;dmE;$5 z!<^rh zfWMByE#a;um|bKa`=8O3_V-|A>Upj_VQ4`OW=@Q^ z`PzEg7}Xs$A9HbC;h>98%j8LKtTy1P3fo*!vM9yyZ#{OaY0M^u0RqX%sM=^g#wzTfjB zVweB_F5vScs=(_@Se}3xJ7qe7-nPc9Zu);bU42|q=lkwu<;v8xmex#NYt^?kDYc?} zH`l9~nJFtpGv6xnSaFclkkZOkQ!7g(Qn6A?6Ek0kgG#N^N(3^M6pq$hfFMvQkRbYd zsC|C_#fLcHInQ(7*L~gBbw8pH%;=hkvXK+vT&K6Db%b_C_)4@rSt*#;xKUJ|#SRD~W z@_hD+B3{R3CL?4r{dAcSpT!*H9OugLrsnU|8dvNjURn@?Ut^t1$tt&sNdUw1k0 zvjzzoWo|8BCZr8+6f*kfKku?ZzI7v4l3ZN7Gcixb6SivZl{*{|ho6R*`WrH;zekip zROL2iQY09N-{lDk!wm}wiMJC!@9=>dd_~cPY~xna+xr<&sz0NpQeW2Z$c1RKPvmrb zg@C49TqKei#tj*K$w|5S*|0MlLv8T%xzc@Q;)LJ1j>kTHOQ>Un|AO!RbK>N&wJ^z; z$yRr!W|ZayoNU<-&4sIOSD7{rB(K@1e;X_{Y_nTmIiT4PbCq2!R9%CP?x9%2bC8KB zSN)u!zqvrt`8)Xq=!aNu!|KYsxvzy@aeuL8+w9hsJK6oyS_pb{jzcqBN8fwSM&H&H zrk{piMGcAO4RQ}aK5$zZePTOzz|AIt;P{;nlXO?=X#>xVH-6ry;ps2ixYxD(mWg?J zBzayMHMTXH;U>;DVbiFG3!LP;dC}j&wejA|wERUDiN1Ext@#W$|5J z4qT`fY}qFBDdXCG{NZz|`4^Q%>2v7^MqW)pQ-+X=(E$e=U(uk4)UcJM@*p?ajyn)m zGQwBkUy}@`ffTvp`i_XGp=sq>4L0^Vdy}yG3NvM26hBAU0El8{XX?qC5{nZQf#itX zHUKx#JaL2PCTyTbGcUqwH-m9@(<9kJ{g1+h*g)joLh=Tg;QmKW3{Gu`VZ=@v!D{4;ty+*($BgTJ&R-$&X0>}0Wcl|lBb{puWdHz$9F z+hhw_s-;BzIfmscOQ;a@$!TaL?R5>pNp0TdE{M{~u9Gw3AO|?SOgSFv!_@hSVotNY zJCnkNddg!$y zuA27bs94Ai=9DR;y7FX8gy@6^;nwYoCOj9SfAAnIXLzhaKWPlwaw~bcvkNu|xw+Kj zoig@40mn$3%=TnWWKX11$rGRsbmCQ0nL{>YGL+2}xe{30NG~5`OfG?G|1IIY++_Ee z=p!GR{WAR162o}w_zOvfJU0Mqs+f={J>i(JLi#WGz6&kfmyywc??{?B{@~bW5Y{$K zK9h`d3&SyZZIof6(h+g2;%P5K;>wAL&=0>7(it8RmN=g`OdP5TTXcoCZg4g zU|b-J$&Gq;tcX3P5Bawxlhp^OaGV4OUi;uVE;)4B?>fJkJ?^-sBJzFLniW zuzhE*=3xUp$(yi6YO8rJIXt9DslPM$W|`daNLz%@&@|PkRx!sz+UUm$LKb_FGui+V zJC6`^n-jmBoRLpDpk4!0Z--B37I_iehH2qH;mfO61CNi2m_BEfX=}i zb{dYA3eU6cg~SJc9Eor?q`-``Y__emU_0*6t2RM{kXYxc|8{8no~<_H;H7J9XQApc z^r%v^d`l@O$wmrM)lFWb8f==4w9%gxg+#yI>8t-CL0Y^Ve|4k>qV4VB^YG`GXt6CF z)ph9w%yd^QAxLVw9fwqGBDdU~jWl9-!~%ZDrh%wbWcAlQ#+HkdJz$gW0Q4suojxSv zUQTx*EkIs(nwqE?up5%-dqgX1nu*xm<=cfclW>~+ zdmiyNc@*>PFS;-FaBHnmfxkzy5z;g<^WpQ-H;QtS^u(GO$S)(4`q!LTw~U$i$_>RF zWzk-n3qTw)QOE6nR%i=LjfH3Mm$Lh5?{Tx-M^beb@}jYfnyL8m9a$iBi~8 zP?|=)tJ#fNN9}(`OPyJ?SCb8XXydIXqx^?C3^$|I^5kZ>5xOO^yRPILd=riOM9b%C zz6F2R=ZSBd+g;mdz%QiZ@~zG7YX;W}lf2tb{NSN>`VF1CC5bG-8mCX*Dilverw(n- zeQ-xZx^V`QyfSaJ!GjkK{kJ5yXv*OylB_b1zuRt3WONT?vqOdCy@;*TMMKlU<#2Oe zG;|7n+$JBfPnq*|$xgZ$$T#N7A$=Tl6|QXw=g{Jd$utiubm>sfNv%qx{zGc(&@TCP z=x|TN?B z21m8M{1SHW1kbsEDT$iQC^^m4f8<$R!hAk)(cpdd{va*f3f(-kFHfY$;e}dptK_?( zzZ-}2OP8=*SeA%?XHL>y1Z}Uxqq&3Pn}J^9mE49!21WJg5DpAXN5G<&hU6 z4xQR>L=1OFe!?V=uK(inG*l%iXZS zNLRl0h7|_#i$!v#uV`Y=#hll7!#QQHD#EV> z`<-zR2SzIt1DYu?Ig^%t0TyQw^_lxYi-{GEOzbD0TssY~d0lA#6aK>?Tdn?nbcKt4 zp?uvo(M$;>SI_%9B6;Yf|EMW+|F?vwb5J(ywb(#dk|nfqFJiyz+*Hggae7wF{~Fp; zkrsyzKkV=vY2-5e_(Fr84$mYkFXjA%zFcT9`O)2IbU><&++OJ(;uLkwUqtjEG~XWS zWm33P#kBBQ=**$(EM+@;I?|Hhg8c&#){PEkJl)Gn%7myeIblewSq)G3H|MM0?_}WD zEW65X7CKymzJEv%=B%f)KXxuHuI3y{a03l{%g*X4qGf-v&qwn*u41q|oPuoqM7l*% z_W)T+ZbrW<)tUeZy$7(fOfHKn5)v&F)N?z>&MJ*LjHA-9jVwPT{%wk{NEIPVP&cKC;SN8kk&mlg3vVT6Qp70-<^>H$&~mDwP2sd%!TRt5R8y>lHfHLJ|-Q( zba}XO$qcuVck@a~b6vYn^Z&wz`B4wHp0^t+8q;e}VMO-?m(#%c(yJH&>y!h}(x^*A ztmM4$wBLu&IM?~7F#LO~z|MVrDPWZUm#ET@nwabKDlK7x9Ctq)Z1BmSS9NoKs4LFI zy!fkb)oYHD=b6QSNC01GPiFU*z3iHaEU4q=z4CB#8Uw&^z*GK`r`4?-!lcfk^0wE>xs&0bYC4l@|i>jxSv(%hfss|^{lr&G!3?xh`}k*_IPh!+~LM|iKEQc zMHD~LfmWhOQM8vY!?zU>?!h8_MU7yE$VD`m_62+zs?lX5lQjuur1AZ4>#S!P48u1V zoNm{KOy=`N7Rf?Rhkn20ku)Y4>9+q(F`%ytjD@!SOend`^bRJ`OYKiCA*{NDF|<~r z+uaJ9FS9}M;QZpi;Fa4os~orSR67r-@56%^5_LE?p>xxD_O;G#$?a7#YVrZKF4nwp z=}isBzj{yR)09Wu2>Q$FM|99W>f5K>{74XH~wD6_)q)KmY&Rw2W%Qd#$Ry%UlCUVrS z@oHXCwi*ZHlB`?=V*KHNe0rI4C{jHLNL;pbHzUoUWKCYAYmAi@dy0c*N zm7`iKC~US|q4KfrEK0t5;rR^e3@^e*ai@ zhUce;S!_IMHEAnS>oIx^T?2=>(&$U@e&ycWG8#|I&1WZUwachzaoB{ukZh9o#l9HZ zQZUhU2OMO&vaS%Uc|t*ki7_3qlRT5GANpS1$sOq86e_QDL<9}xzU*mJi678FpBJpA z-4bfY#1uqJax+5)j@Cq&M0q)aXs8mVZ3yQK#{WitB6*YkC0==jbLPcQ9=9RH95(~1 zeN68RK0l6$HuH#=`KCznA|-JZfm7=78~VA~kos~CJnvH>eKCG#amx+Mk;260JhsJl z8M!3GQ9*JtcQBk$fquyNB2Hc)b7Sp9T2GqX)55(8gX#q60=!VK9L$jzX^GDJ)u%gC z?d06oqbv7ASU9`P9w(Vw=itXuO_hRLd-PEcMDN|=^GMRUQQEUrwCiDm7!wk(n2_%j z3pK)HHVWuP7SC$s0d-vGGrOU|7q@?w_W3+D=LE;jJj;F?7nTLGq%+X-b_um(BetrL zy{YrseC6N`#Q`alUdR@gd1#_dB;Qv+f%gMa*XiteFKXbAvryzLLi_EiUtb9*%I$^e zkC*Ur@-gq`k|%E%z9l3D(3HOwh2L#4r4_ic<{?>~IRy$?R){e0#8vjf&i9^`+^G5w z!O}FU3)UBT>q?HW3u~1umhaq##g#|d;ioY-1o6{$Xny5!Ya=wg<4g-Yv)9IpN!lcR z2+B)`O<{5nOX7VKboy;U;GY?d*V1sw-t*vi&y1J(X$b}GzsPyArC}guWjK^{denJ~ zPBFWVZ0SzJ#kH)+l24foNs( zYsqU)G_C2dme~#BK|&9;Ri?!Z9FY-0*n2%i&P(~hkl8=Kz5ZKJcJ*r00PxXnYOZpf zC+8XLgbdPRsrxedx`8V3qg*cmQNc(DJ( z6^f^$bBC5izG@4s11xYXQ~;;u7&L(w?P(s<(YT==duPQ!R0HK2ySBy^yB8V75wR9u zd7F=+Ci0U+VNTKk=m9(wXwcDLKLvy=b1Q3VM7F4qKK>&C&`p#;3U?DYfxVOyUMCSH z^{}Gy;-x+7+*q5C+<0=c;;edZjT?3sa!JHWS(U$HoG9(_V}&Aok#?X;>nEx^%bw_* z(I8jrY^6QEti6cN)wiH#C09x9h;tdDRMZ&O5hb#pRmicBS@X zwuG9?m?39VbKFp}3u!L0PW5Tgc8)ifui^zJCqOOmGnL^pdm56P>?R6CvIctcj9Z#J zB(vo`0iw~y2~(rLh?`}OF#V;gWOuBkIzQ45SkT?L>2iV<9hCd|RpLnp6k+z+%x{a(5 zB=W7bpQz@dxh^6OL9up(@KW(gbU)R*cu^MgA)VLki^%n(A7jVUc@C%4XJ9wYP&?@V#0W>?Y)|mTL4U?YOZJsOq*2#T!QlU;PXU z<3G)XF;F4m_5w-bm)LRgb`*EtSt!=W{D|&G`8by8-9Q2C6Ts@Kang%Q?Ts#k{IY<_ zKS~B}9kM$?X3Hm{`KwT55BOEy%J=#=HwaImYx z=d%7JwZ@MctJ5FYkUZ9n($} z{I_4iO(bgvq1BB8=0Z5cFc!wUs*W#I7Bbuh{|sq)?NP@~n+f~5ZU|J4aK<=43zH_8 zTanL0)zpB(4d-?!C%p$7H?nZZ<3py@HkS{n@e#x0UPk@Wj2cS6G`+B_-4y8)gvnI@ z2IFpvr!b$)Aq*xI(tpKE|58i+z5-jGTtq*Tv0qK}S&hXb!%m}vJEp?2QVymFz1K28 zydDSfe@z@VtOv=a-z{!;ujxnXL#74#Gzp+EIO3S z7InCQYaMxO>-&{4;SU+D#3hCHBl8IPw*!pZxRE!k&@U0~V}8rP(a%5{=;MYBK$=Rl zrdSu4TAHZ8cq7?#Gb)N;I?G6RDko`oM zGj@%=t+UKjIoW)EIEu!ZgXhfHTVp$_5&^Aducf(iJL&hOa?@g^j{hstCmS+4HCU;w zA8R|(H!y0%|G9oNnLkGecR(F zN;%Kwce0&_#5J<-2^SdvpQ)~7I1YS^0>+HVf?FtZ?k$_~EH)~1D1gRoOkNAzgdGv_ zP$^v2j)XVxBDjDq`x*bH#4r~8ZwXIzR(%J~rziv((AYSBmMz*!t-o19Evu0;7iL?X z!gT&cnCRpjq#gIOTmE{zypyM^tt8RnjWdeIJT+Xc8dUU|nBL*Zo>5TN{~&zd-erNf z()h+L8s5X$AK`e4Q!SH}8owb6A{b57Y5|CDrYf%Nmrqerj4#RG-DqX~R01TYnO>kritv1uUEi6Q@WXLxUw@FS6eXoD57aTIWkftL$)nWEHlBsFfmn3aO+(7v7Bbhuw z17eoZ4eO8GFlpaMJoF*pJqwj9&|pWyLx^qxHfqa^NPmzAU zWP>kB$x9Ugswp@8BBLEUa`ICDd^+0xI1RTSRHAOmI?duV+~M4AhTEny%Z=Xulm(2| zR|*<#r@8`J&b-c!6Z^W24VFSHudC+Plf&UqP4ZI5my)@1{#GpIPN)g5nGNSR7lIP9 zg&NwN_s2iaKu&dE6yH$m7#~Ur8ctb2aI=XqZ>sFQ-2#Y~?AH%2{=SgqaLwZx;Km!c~8iHrc;T?Z`9P zAyePEV`i}?b2t7?OHW@<;B;xviH%i$@|mg^5`34cp`yKM;-~l^Y5yG5nrJf}bXJ+o zh4wcwM^=e*`Yy6_gh?TyS%Cb29$*Qq5LSD?ZeqiMWV1>%1TW~vjHI0|e zHQmB{Pkq&Bzor*%gA<3AA+ZDOHYi0#`(e|?mE=85_y z$8^g4f1)9FHk+tmetgrO?gmp%GX;K_5-aQDG`;^fj!z|t)(6xoMV}3Ly~$?|dVjsN zwKCw(IuYUUA_9lu!B9V2pU(Zb434pmhaMoKStXSAbYYoGF^V3d4AKvk-LhMpM_d!=$3F`@orQ$ox84p$F&c#h+ z{#yf}1lQ8o8x*szs74;_mgoACcB6Y9w4d~z^n?d<_e0l_drO8#ZZ$127dDHDH4f3M z0E+StDYP%+=l|oXDcQL_`s)`K9hijNr=qukrm_s9-)b~DyI)}k`RUgZZ*A$*Xnuj8 zgwT}1)WXB7lK1^;M%L9#pKgGxGnoUyJgeO-G+1{Gg|@h`<{%9U#c3df29m0~#u*PO zepr_rHcfH7b9nI0-)jI2)=wvvl=Zf4s1xRRTxTCrJjiX#Q+~>gH;X&N^wL+lPZ?9t z53n??YiYT-O>k(4N1ltsD3-leX+5pb!k9w(J&b8Vx>thJ6N#hT`fj>vfsqhB2Ps|1 z%h@e^ag-)_5%h9DG!GVc6XV_}**1v%qISuC;^MYGap>n-UiDe977Joj%Cf#v`|B?x z|05RfFdDLM?*RBvzk=vb)9D4E>81kf?aoCX{)FfD4Y@#_<*-Zt^U;Ab&E^179{nl#c?pmOZ0xdfOrB)A%t5!VBFyV5JE0oT zyEU8rG;~F4vyNC+;)fmkMw-_BzGy$^+49u@w!ca9QpMjv^%R>N@5^i(f6^|reR-dFL@dnVM?+VT`bFuSPtw);P4e8kbY88GMMWw7 z==TJ-uDFs|isSqnPbJh+52kwFTfQ%L1(m&5ah#ws5rQ#KPamP#S7JN|BKzehrR)4ycs#D9eO$lVz~G30{4<0KR|0dI;jUSk zdj~lmqS6D%Sv*ZzUfKTJ{ec0=w68m7!BL;n5bqE#FpQdUT@_!_3YwGFRq4hx)G>|s z4qxo;OYF;v1C}bmwEHY2nrCPp|P(!b^LG z(Gn(KfK9QNO&b>c@l;azvo!J+^X~KhD0CLONp2{5_o?^aImU^9oq-g%cOkDj6h}GN z+!P3;+3G08$%{#(`~y0}!>uOO6UsuLBP15|@m+vJ-|IwZdk4<(2x-2OVVsMxMM z=SI>h&3bsr%R>7a44dce^YVW&YP!($I||d9iz%m|PaAmJ%65;oNWnANYS8v_x?>z( zWPAwOB6r{OI)ZV#ph@fSef+PhB>%W^{*R`ws*?8g>2nl=Kuz%pUHju%gLu(0%3^9Yr?wg1>2$+IrUt(^p$>W~v zfV6)Wn%%8k2o*^;$XmNtgF6zI)7+H0_P>?;qtSq@kS~k;Te5?=f%--hB^}l&Z!d=@rP9-k4qTzv=szG*ZhdX$+$AAD=6lp?$DdN zyo<+YAbW{C=RLT6GS^A+{g>`iz8|S~2vb*L!F?6SQ$75PO;*fYRY#e0I0ucs=LPPj zrm&lfo2hQ3Z;*UNIfhk}bv+w;IiJ@NMx~rJnFufDH!2qm_{?xm;BwGwDY)vp-{8+n z?Sy3>y3iDA)zCEj+18qV_2D(43_<~DV5IURl1SUG%Y3Or@cxpX|3S2XCR>hko^?R_*-;-&n`P_7&BY3{S&1FJrt=^IxyY z;_tPdqz_|4L#DXP)>qiW{Ip}}5mM;&1H!U{<-Rz^EY34^({-gUZs;Ln#QpUV(p|n` zI`}TCFI6>M2Q_#kcgg9qmdXu24CO4R`;-Kmj8p7to7G_FO-|R5BmIH-J(jrzf1m<{=6%Zv9;L>s zNa;=^DQB+yoY!;7AH-QUeFO8#ffN1fZ*;8J+XL%H-9`2c#dc)a6uZfeU{|WtUt+pZ zo@Zd57TCDxb=igDGN$OLMbT;K*%My#Zv2xciJT?Z3$kf+{kMenu2Am>jUKn}rk`Pd zM0tTYnJQA8)b%gPO}|_|QN^Ep)qsY{);h&O`dd8mPV~bq-KSh&=FeuADSk~G9_UR> zFXYTYtsDts4;||!9iAmQ#z6X*FaI@0$F*EN8|{jeO7EZG{=8OBcNqPw_I~+L^UrJ~)W}@8(U;5!n$ELzd`L5i9 zq}1zJKOA#b`U~~UHLNW4+Q8QK6#b3(cHA)2&&?X~D2j7z^pI%_{BULLPobQ|&U>er zeYH__oJBd4$`n%BGAG#i`a&U|dDpR)69EDQ?&gb(C+Z7pS7kxkw9{A>UwJPUKk0nB1_#nRYuK3gWB-A67i;toaU{8yn~m9seU~JSztf%} zZV9^mHpxsC{DF$k+1Jpf)X0AD)4VAfG^Zd^Ps+SCE}HxAtIt5qNGoYrHeX^5crMIc zqu#+dam#8mjgEaOaV1{6rPD=NpsZ3O4WR|6drf|WJ|xlT=--26-K!xb+aFBxD_562$PRfua}PAo*jJWOE%xcDg|VickT= zn1wvk18g~Y7SdVpoWpPvr^$}{OjG|W>uiQi|GL7jy<;IJ^0y7ZN)K%QTeOse8mxDg z8Z(cV6K02v_Q`We&144(lW?N7(G<+6A1N!Z(Ec9g-zCP+8^)KI8xDT>kuAE9o9*EQ z2Img+eu+^dqI9N=teL@R?`-zyO#neL(+lw(anNus^|B461Niaj}=G{$$$V*dWx(!D00E>K~@L#&Y<9pB1#JLoMr zgr0!K^4)7}viQA`w!X5a#-CZL~uCV5a(7+%GkSZN&aI+6(nEl`44QkfrpMF5*SAY%6W7*(Wn_Z_gJoqn ztwCU6;sUak#d8iO^|QeDoK~-gE4n)xe~`I(=HR5d9Y`g(@KG!0;gV&w>B0H5p%m z8}-G)m)XGz&x<-!^0tdSvK2B<(eg)q4Huk6Jfz`O2b11wbf%3tTsLg&d2=B^9p>J8 zy7a$&9-t#%nj`Bvo31>2U5tMbqpL+NAw%9lyrLnErc}byQ$YwgjUI(1` z-Al(04OCn;EGM)vJjx*JhnB)>!$r2}PNJc`#Ye&C7TO!Igj-#y6O9^ufPv0lwUM*~ zz5On-f_4rXnoUUT!m}SVifSYnE}Vs%pTyjpu~ z2`d;?yB5mCRmTW38PxB~XWob$~CZ(`?3Q=q>kpzKaM03?G9 zdhH6rNca3?#X9a5_v8>M#!uw)NHy;}z}P&V%4^1)Vv{PB-`=OP?2*fKAQHpBjMwRI zuon_!49+l&N%u|#?iuEzasg@`pH~rX?Wv& z^97RQRwcg7$ItJ*l>V)XrWTj4bi@yI$r3{n$)an)mXaL)D0 zBo*_`UV*q5UtB&109lqF%Rv69OTkqQO)09I*qCx3WaNFmBF3z~SL*FIOf%)buC+h= z2H#w64YLx*Ne?)`2HMMiTpNB4K=Va<0LTU6;UlE?{0FD_dvmQ)YB})8g7$WfvU>?T&AA=Ss(|mDn7cEyulX9-F1f|63cPY4AcP&uG zM^o`IVdXA#T{_YsBdH$%%*hZ}Ku3dEspJ={;TZh^=mPRr^RQs(MsuOr9!Mmlvpbag zY#HITSVGMn(S4Slle$vFc<}uEz}I zaA4YBpvKwkYjiP+Kqvl7&Q{1<=j-p(*Lj z>!Bk+_}&%wv`CS1_#X#VN?H=5+N@Yf4@>IO86PI$GU>Yq3SNpsgGr}{?w zTjwomWDnlpT(cZmY@gA(Zc~uMGOwL1&K{Z8jIUbS-iQOPF0+NN@e%LV6x<~L zv9fxis4CpMwZ-u@Hj6!fp}8*eKSy5FGY!qjjZ?2vY|Lvwn{yk`b8 z<3RhXyUgY7-i}VE)Yffo=B)TpX9!qd%tLJ*>u zYVLs=4#9yXA=yiEH5bBEnXdO2!9>Ix*F5&7R9^KS96dpU1px0$ zg?1^ysf6i^o&3REF}gpC>~9Z>{tsdTLKXcU4jG}*Z!v!wNSa9BR5r#_ol_GO=SDzD z7A!}Ap!ZMYen=8lu}2!_tKUwvssQ|>B~SnusqO>Q(z&(UrVYhuhG(AnW$_E!E0=$X`DO7!v$d}G`;GrUWfSz<-d#TP zi_!MM@~3OPeJ4krX{8(Zw+39iUh_~d{f=Hh^$LW6USIfRK|>Vwf1YMILk>WP**aO( z$=PUx4I!WlFRRTfN!G3=Ilw-l`s%ipmLZ(nF~bo=IkrIDIqq?F?^|Um8ZS&mA)-mv zTa%S@qYcu;Z{S&lvC?zNlw4jkv=FZ9>VE%5WVyzl^aR-UtC341s)3Nd1qskn*uJab zMl#ojF%R)$^Q>@o*Ak;veMfDVxXT;wDql9#463uC;TdM8EbX)@eS7PSFK!Oxqb2A_ z5QSd<%QMq2pN2~YMm@hc4$z~;CbA=##c`IGvxg)+3(oI&Zb=h=3zAB+U7ruvUzqbe z0lI;lIcYrRx}k(k7CMArX~_dMz(i-<#LEe`qr57R%62Y~dI0j_sF%%8LnnV>4PR|Aqr*#WfhV=D;CuC@5XlZzVsMZtg|?cVf5UrkNx53a1) z0DJe%R>^Kbazj+BT@N-p0I(C7fe0LCKoY`$IT>u0Dj=TF7;Zpe5Rcn$%*LlOgGs2?io*YM$JH8 z9Wcrceviz;nHkd7`MSY#ve{ z27QX9gx6hh5r??Yd-fIfJfX=Kt-$rQ;Vue0ev5-zkej=WCkC(YmS$L?aml1>rjzwA zLV3>I3+x8Pk2MdHlkMT@fcL(MxyNg14h972DfKDjva9i9>NLax-vL163Y?f*aXYF* zf@65xf+h|di8(c=m7V`EYd!M9tdJj63Bt0pNz*=1xgPeVDu{m6@}&_8r0hhZsCUu{ zN^b*^2Z}3RiY~*B; zgS<)o4%>&nlCo0%sR<+h)bJUQnOl@o@J!pIbtt>xfN=hyd`7^?M0y$Oa0_@JL+DfS zmu<-x(XvDpV+5&U5E2)%`tYZFrXvx~|E}vnzd?4WEQDo;_`h;2yRKIbx4oF8P(nnw zI0__K4G#hx-UD}$N~df{0JA}Xi0+O(8_jSyFbyf~27NKR@T3yEt#{(V#3#^~3Kh3S z*MO-j*3xBn2>sEMj_(nm4+a4fo03iDUeAPfSrMLeZ|Z&{di}Kf4MYQf#g%$1O}z)T zU>fpU^?W$>dU7?o^w1c?vdeI|SDy;XpvE5khF$d2QJMgvL9B%O>-aRjaYBIK2 zlWH{q@A15(U83VuQ`+(6@N~tON5*flURs&UjuTez#^Dltir4vzWRP@br6nTv4yse4 zJiy6hAq5<8s-;J%{ceF|E777`Ec3{_mjK$9QNh^IA@1{`4;i)sOVKs zYff_GI9;t=ncP@IsLF&MP3Kt!+v!f3QaytK!D?gfUOL^6q5?AZs3k!kZ1?(rPp(t{ z-$0n4yJLT_Hi`r$G&F*#TcDek)o5@02^bT^x0xzGqkahN-v(DwBJpvxZt&0_E6qLN zN@iVmM$2%P+S8{(_7A9Loh8hF(t6sfdkV)X0if@$ldk zqA&;Ok9QIe_3eW=1!Jqh^m3YV7t5bx^1h6UX`q?uN4#}Td^2z(c5<$?;BJ+$=Xhd+ zVoRZY-(%1wtpy(|DiA&fUiyr?>TGMH4&$%y*+K(NX>G7kvoFQ#rR3>ODbiikeTc&@ z;%Ui$v8{<7p7E3t66G)RWVuafSB!2T6`X19XGf?BCgnF4h#B3$B0YW#H1|C|9W$

    qn$R(FayTO&Y`g!#4!~uCrdzPOL3nkIm+| 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%0D7NW*8zu`pTH| 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 z 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

    ??(nQkk^vOi9-nUDK@7%^j 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

    g%{X|dT1}VE*39ku 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%0A8!Q@BBXs~CA)-^l9axbc1x(@19p({Lr_ zvRQ&}-HO(UdiI}Jqs3HvAb7qMYj!XDqutOyv1d`vjJIzbC*^;_o64JT-E!8ekBtWB zB&=8RnihgQa=kel?yK&OeC=qws2!nuk=bqNwz+R**{e<#;MRxlfHqzqB+zV0jEh4)*27c|n-eixn$oo>4P z_BCjE)r@ncBjPWHT}sJsZXZ$Lks-%Qq~ZvM8%;X{!U6umS;~~TZbtns;wy~`R+;OH zRJUuRzs|Ec>J*F}QN<3X2!G({8n@u=E{obd4xwLkS-CHVd}OS|rc${aMDkfh$_`ft zMmsRAy?K);c0^el8O}e=kL^Ac%1bfgwCCAwy!iGJmCp=psyPhrcgK+WKIlI={c*5} z${G1z$yqrLb>m7q8`%1r$cIfdy)Yr{Fx2>JT0WB+#Y z$Fh~%HyYTt^xb9VWubreLZ}`jYkn&A>~9upE6Cf1f0-lr%I(e3=tTz48d?@FYw5n2 zWvstF(xIaTIn8I{$j78xUK5>~1!vrCZyo{{27hFK`L96j^qtXo-N1Jg!>D^9sfUL! z$(KXUU1^p^z#c)~eDCfUyOJqPL_l?{(hyv+^-cUbS$UFuBX{%BaTlx`nQwOR6zn{N zPo-O|s-C#rkx3<{rmwIds!ThDi<2hg80Ic2Cfno-tl}5~Fc|2=WZYI06KnR=(n(W+tphM~WRmodRcdyV(FPb z7a@LY7rL_TMd;Cbi?kVokb?;h<=^Q0bZ}Cb#RplPOI$qND(E>(s00$L?I}m_+zjSkNLAcu zM!;lmW$h$TRDBU4v)oKr4g6WmAXTGPP>7528()f z^u61Pc<+poQ|>g*T7CSFVt&yUT*th*H*K-(1;3V3rj(UyWvO?WyjDy7TEW}Xcqnb? zc=hB@k$Vcr6uPY0x^~PtMcHqdUb9)TSOa7sJ*DA>^aq&WqINegkqp$66gSed?H;YZ zgSbbEQ^nh_uc-_`52hP#Rodsn1eLRk=&A)9eZp$lPS5+UO3K>89}2jf+(C@G4}T&Q zDCGCj6z(X>_6A5hgnK^M&>OAsZmr%ki!iW6zOMa@OPn!U;$iDzIAzv16_+@8=kgKn zWgebJ<7&^JYB-o6`AJ_a!~KS&>_AQ9wnFA!x!KL8!hyHVW&?Z&QDxu_-Q;9s?`EHM z=&K2qI^KYE1xkOUEzjkmvdKBVNJU4nM~hJSO1yp%bx6j<;XTX#n|8R?2F= z-nruCik zTha`$*$$73;xyb71Z>%h=JX7YvxoczTb#?(Hj;Jm)t}$4VK8!9#nJOa)n1{y z83jjA`zwM|yh-XEo2uLAb-<z5+nN%%COMBMp&I3< z75i~3bQKN6Jz|`R?L|h0`_jH0LJpkH@Cx>)Tx8E%f%_72HcE8Cc)xW=>8p%?`LPVK zVwmn*F)4z^T~}7z-!qgH#d8O_Xqh%ML7s2rp?Hrn7mt{;OpD`OlST_htKLE#Bktsw1x-N2b;;2#59OZlYD8?$@LlQ9)dv#0V_vO2} z0sAz{*W}>*CD)qPML6?$s-Bfg=65Rs_NiJ-I%x1mZ|~bPU4UwgBE+ z_O~Dj^NG>BxKQTm53oG^zuGug#c)nDegqCAvnR2K_J{?BSJbIgDi;zDFTa1BU8KWyqgfGQD4^<12h zTg~|!4Q-KYt!zqB?m(F~;`0qu%9BcVZo=?{%ARO%@xs4H{9359g0FkM_Lnlt`kux_ z*~msXv!u+-eB~Ky#C4)rUcf$67FvEg$1QvA@frm0I&JDEDN;)@#7dHlNlKKuPt}G= z5OS^0MT+e6)0xsjcn{0fi4FF}t&?KAt`E{MLA4g<#_u zQE<+7nLH+Wytv8C$KYEZEjTS^i$WV$rA?iL;XS5}FcQ&;qg|=6 zUCH~!H+TRgo?b;Zm-|&|_--fD|E3V0RIOR@pxkPS8{=;*YC5~In`wz{bMQ_zo;fL< zCq%A~$-Ce_+k$b#=*MTZ2?|(_XR=nz!yX{%t3Sj6kVLZZXj53}j$WEVnp}v1q7Zkr%FTKSTx%S~WpjFx|}2R!tjxRn+&NHf0|lYQwmwU~xP`j1L?g%$(NrO>?q*L4$nrOWpFB zvXj#>^Re*jT+0naXFo1=Pd$8+y57;`m#elATsNHG7={WlU;NhorajX8dCMQ&CA5$J zl{t;y?pYA>KGoFpj2;`+r>uzQEU9FwQTibshwfo|JapJL(71&Z_G=l~5#c(y-l~#I zjk+1vV1@TZNlD+`tg}?eTn(l3WpOg}%*5(th^iB3wBOEU(*hw`xVBYo{OPJptE=mq zHZvQ>l5XdBkPukt9*5Khovnj8angH)z3Pt=R5ybs_7+!@{-Kr!m=ZO^yb&lJFh_tMT)e%U%;AtgCJ`u0W0jcw8Y`DYJ7owCcm@e=F2 zLMCd3x?MS=3AwQ0@)qRtT&g+~VL(MXQF>|~?tKs%UJ}34p3!lTf{g!hzzJh$T0ojc z0n=TNIfeM#GB^`ZnR)?CUyifM<{&yCfeVx8|pL|QJSt_`>m$UTq+rJR<&x2rL{hK zJE(~+rJ;9^8COFW&UNYn#vnC$`pkSr_sdI}xX;2E@Ih@!d|t)WnfdN%&WvC7DaFFu zRt*?~$IIIK2G}0+L1|NBq^Mb3Rn}ES*%!u7W}9CdV5zllr;97I^p|;d0&0bxEVn$d z#P*;WC3J=HH$v;u4nDY3fLa?%f+7ZBja`@dAWbuoqiZQidQt-ILOsR zxW|hQe~7s@o#9jcYxKwAgI?6|fSSyATN$VsLm63oi@NK-)cZRK1!n;fyWy>!%b7SS z#{1IyHEZPk4W(yG<5Wz;m=#nE6QNgbIDV8^;uUfwv;AAG{l8IR{pw5m!!;tnE0eko zpo;XKs8c33ZhhTu0k^+G1D3YRq8X#F502rpUZAq^ckI4tpAwY4kv zDYBrTR2L+YDI<>sD3V^G+%*xaD?d5!g#UgOPcZIOP=*n$h;{gE?O}&%q(6X-=E!DC$FNOY7?l-2VcwpN_QVks;&jLo0sx zl)L>VBPp9(m8Da-{}FDa3(q71e=t1h)t%8~Z#)E|wBbpYI33UI$2S9!DV58|&{N#H zY6}+Ga3prc7|2$UxzuFk+Nb_nlmlZgX;Pum?!nfD3A-qlOnl4+Iy7VQS<|nDAFzYN zdpquTy|o$WyItn{cRqr|TW z$qodl)qW3J9f)Ret*jm8U}`c?9Y3o={5m@YMW#4c+QNS7CIupK6uIrEWi2c-g=1Ri z$-E)9yZF=rudq;UD_8rMhVepz_U5xzp0yqAshgppp91K{mkIF#VDO|v=EJSQB_1A~ zx{hKS|AuDV#ra@4Dn5v9<+pZTQ_s5JxuY-*U@oOwZtTV0PknCrqJp-o-`tE{RU7oI zJ9M|AA`2dsSFZ%k_n?PB9ufmCE%`w}a0#AR(_d5?JHW@3tm;p_oDIgdn-?eE6F|0- zYGgcOm-~01TeG05^@`$B5WbtvJf4Z;oLy;iZ9*^euwka-KJ3>91Dto>Zg%Vh%K;A7 zd;Qyv>VL;*;}1exaGaAX+HdGWKxR9}jlaB&{1d)dZlAG+*3{GM7$3ax=T%B59GL>w z*z>d(eWHMT4VSp*6)h_ydzW;~d(7{RvmjUt)LH2T5q*&UVbtHa7R|&o@eltNzUhX1 zy`4Q$IwkNI#PKk%jhbft>FPUKYKNw7&2e%Hk9U2T5E}U0`bU#L(eGmQ8FDYQaghO*W4V9|7nD z<{oaklrsKhGjtDZ|8kxhw+S?VWzQ_$t*1aJl zYpX^VU-Ddrg!iZ=|H5|h+-Z6dMAGzGo0FL=24)!S7&kr9kY z%vScjtv(Rkxp8n6B=cYb)f;{5NU^npq>7It<+nXO`y7eWerfKT+|yERHa2$l3xUyYSZd(&j;t)J z-_n^Frhi-4GVoT?uAXc8?*#3iz9wl9_=8VBTs{4hfqfviCTCM> zP6YrTx49{nXGG=>cg#-i6L@0bhIMu8pMg)QQWi_?w(ZI;c516y*@Lu2k9lBuM^1Er z=is1pWlISu#Q=$AWv#I{?7c!m#fCOnQ}RGomn8*TOrqbaAEb%iYhz6sD`3~A`_|#+ z$Ea?#6nJo`w#gv%0kdO-!Ah4Grjtw!u*8kBkV^E((L|VS=GFOMB}(fpGC)Aq-n~;= z3Lx(vr@0NkJk&U}@*OhZ(WWtRF7S0}lMT9n+!_;<)dXEvR4-icJ9bNTpM~2i1`?w; zTI&7e;Bk6(fcX3HniMxB6KJ|t` zzM34|MP&V$yV)RXt?{Rjq=L59U$ky>k!kXj_w&JR7k-eu369CD=By|(q{d&-P1($~ z8y)U1rRyEfM`xReCK@2e-ljRfI2|BGrM&2KY;x?GuA=-t&O~I<7hHSM1>jKUbDW+C zlXpj;sZgc{1JCEQqcBFkQ2ll1f0Mj=$EUJOF+(_MMtSL zyAScveEXrjJS1{pY#_GN)3URFey?&@O4swe>kiS>`kx(mJZu5PpU3 zm^ck}Px~EUD2bn^dL=8J}_eg}WB zx|LS*amM*BMlW!_NLem(zUKf9Lu^5=yjv50k#eE7FJ`$?IVVG^Z4a;ZRlUJqim->j zl%M_Cy6j=sVcJS;aqnh7LJ?o1TYQni%uQW_YHZ(RkC}4BXkq@_>E(sGte;o*8Wx~C zebbw@?Jc+|sq8J%v6>ZY-sULaUIR*pifb+JSYipxr%jeC7*Jsv#=RF*%P4%3>V|yV z=t+zoS>g?^XnK)pe$x$0usp#Y?qhHh3q%FW)>Dlb`522mJ&u(&A zvyrvLg(1j&8T8OT1;tbR2;on>TzxYnu#EZ}$9=Q%pn~~Xrk{e&>)`&k^?`N1`3?*p zw97qos*DTbBl7WnPtMBSgS*FnbhtBwDFaq$19&*)tud11%wDgJ6yo5c`rtL z1xm}{>84SotCeHIp4pF>h#7`HCjA#H296CP!E9!q?ETfqR$ZIi6?7xQy1$dW_1V>D z%;)E}mcqnWEtgWI9UEm|J+7Fc(8T^6^8TGw!}}I1y~W;-ef5qwEr@mB0$2jY{gCr^ z>&r(Cdi`|u1^b$)>~k{=j(b7 zQZ9khsj=}l%hEsn89Zk`G{i&O3rbP?p$hm7g7eud35byJK-Vq z$yh{frb;n;bO`k!KAAzVrkj8?U^1eC`4KX$|RSl%vb@-3UQp@o{y zSg5z`po!T4NTZeSk^14Ivhb_wvOg<#3Cv2$G9;D31=-6~v>4htsw34I*j&GOi?!R$ zgBrJrQt*uKT>%Kt_UYw%-wGp46p(^eoJ;gS3?UHR&vESB$~ss8v9hpmmVv+LBL`UA zC0_Es15oVVC+t-wpN5_S>wiDM7TY_{ntCxdMKnqyX%KqwNBN=(UJ?+HlIa$NsK6vX za@9?Ki$sEJV6FgpI@U)=ej!}%fIPpbVQv?wLF%e+VTfF@lb;M)@UM4SeqL2QiTm42pEI%ci%$~#=k z;oAJswY*Bgh-~lG^NSm<$r2u8a2q9K!1K)V&JBI&y>{OI;Lr`7Hjav_N=WFoR{cvyLsykfuU@W$ zp!pddj=9wPZ}U3#SQ(rhHd2Yk#yc{U$ua@_K`!JMU|)K5ccb zJ>?m)x2D>yjAmwN7Ga-z+jDDJ^sIaushxa6Z7KbJ7q_%FocTIc?Wr_2^*Oz8?VIXR zQ5AtDUH5|25d*V}0{GSr;u^Hq{#U?T4x8gDx4@N3nuDdtxSqBfe`SiW*KN5IYx9~e zal7L3(}K|$2z0&vJFoty+UKsM8QUCj^i*q$2kou%_cf^7sKmg;)1tF#6GyU5Z^O^V z?;`yo$Q-P)OTi(WCbi~ACgOay-}+IlSkcp08if>8f_o2@ymEn-Jsi&zM*NtZrFz;~ z+3)-A4lQ%m2>v@_eY~dKx_6&4;fKZ5+N(L)y6;R8HS3Am6Q}(w;8_}o==H=sqx90+ zhkiriG@Io36zHQB%dT7tlt%*P&?473gQs%hCcA6A7s520q)=NIt}JqW*DW|mJ!bXw z0&aBEYq zyN$#^(3qN-4Jr2mPTCJO;*x&dOv|Mzz;7}rD{e|rx3E9Uwr}E8ZZhXSQ!hUV>;hF{ z6%ZPT9A-Kgvk6@=rz*+o^GrUFX{ACyo${zSMA-5nFLtNpJ<`?s?adk6S)nuLY41Ozd6LG43Yg>Q-2~v__zZv@{Bvi)V>N#0wWQ99q`CfQkvGatPguM6{WueQG*M;Bb&pX%Dk;Nb3Y);kRxj2|ei zaB}Yr!Pm|0c&@*+{P*J%cqzMm8G8MMqTSY}m9#E+-lIGp8Lss}HI8)fp1q&2;A_Wq z{bfw##Rjy1`+G^jwR&9Ep4JldyO!chdz2xHsds-R+jL7;7Mwc~m1qW;5OvkY)pTsH ziSNuU-AKog=CT&S1fwj+?vE)LD)Gs7u&1a04R_)qvV1cFRW5%*@=OQzK_`{k;s z$XQlZg)&U`EBl&}*j}4&ItHP%xOrJIIH=B3G(GHvp^yE(>nTHWH=e$VP2?ITH*q-S z;x9`BI}YLgtOdg*;P(4cZK%crK93!TGR-EbV>3B5-p=X$_nU_JEh5UcgB%Qy|N8xV zLrF^`=)M7VOX3Io{)7r99(U1@rR5nH+3>8!O5ymV^Y3%1de0ns`NC7!M+1(RWKppQEUBLab@{gc&(;civzBNCxdH&mDb&Xt9@TuN15xp^L z-&ZjlCtv51eVRTXky~$?HRY{3BMZd7Q6#)j0zv*cj0iC*l!KMx4OSu)Caz#a77S?ugcp&jj}% z3((XRpRYSg-FH|;S5qLivFhy$_%a!|xd!6!c1U4r?y9$b07=gj{1si6e72hV=(^1^ z@A!P{#q}vA4{nv<)s1T@hZ^Q*ZSD7s6Xi*VQtj3^vv26)TNMv4l1`#8WOa$*ezX5= zXtp4gA^EX8r7|yK=FAs&x*^KhCcOReI>w66jwAng);f=WY7O{u2zP7ETH)a$<6;Vr z;9lA@g~Ow0r3A?E&nB_Ms1FwZv?ZR@E&S5zzO_58&-lYW1nx?Yu~vDy^VHX(A>0%( z%i5em=`h`sC2e(x6NDj>W9o6wnY;`sPx%;h|7OgaJ-=mWDur4eviseS2u*Ms zZKKB2C-MY+0Wxe8w|Xga*J=pXy(9FEf9y@rx&%GJ`IFkr)1r}D_X^DyiQ;wcuAjVV zD-h`FF2S2@wg;DGu;|i3{T52F)LjLNP@g1`aqG{d6ur)YD&t2>o)VQ|u95ys;-=gQ zZxpi`iA}%TnbTkL=cu7oZCa;iP8kNG!y`GQ$X>}&|4}Sc2fNh=y5K*3p_PfFh3f+x z1c*i-WtcHqPdg{c0*(;qPx5rWDnj(G9Ooh}JCSHB-9>^?eIjCU}-mRxCEggPbA!u&~-zAiC8YRjPr)7iMCSQAFohVTK^aw_j zQ_urcyiRpt*1{53g9RU5TAV{GyCsQVe&RU!^GT)xcCu#R)AE!0;{j3y&eo~Xt%sK& z;bn%bK=-?#JSbrK$(%fRC6ewgaqDch#`lC5_Lk0a0KazX6`7p`$>HRdg8Q(#p|P9m zpc8e<+p6I-TdH8iqRoeiE|3%~-64dAvL6m({ptqkOQTIGIdfE zutQt#9p6)K`6BG^O?B+v$fLgY(r_n$9ht$Kw{Emj;V(Wngwcf$_t8o2{-Xpj#jI{%~h-1?(ZO;Qewe5pgl zbxIe^EBG3rc*R6jbg`yxjwqSQsh%or83f!Lo3r})O4re_%t@{FS1S26D>21%Q6|EY zqbo1UKokIWpXfAk(6g)!)Byg9I$!F=uc-=PE!IkNO%qJyiUD@0CU5v3(hFM1RKMZS z7&~k1A5>UIKOxKh5bv9$ z*?Igphsjb*1>G@fCFg8%YeG}&A18U!c`=Xq5Y5&*5v>DOz-^(1AVx;DR(lo2ZInz_IpP1>}d{G_S4&&zQ5 zROg#+uHx!CL`z!914oh#h#A=fje%=%F|PgZ1<2l{ht|Vc-$A9;`bKxz^K3t*7ToWe zVp0pJSTS9>Vo-CuB8ND@M{5kCT93501H|}kPc@;?9i;HMig&lYr{#t4&T9#(GJe_G zQrQlr+uHQgpb#XBDs*=l!?+As7}aHSKVwj+T%F&1TSh%V5hU~C?cS41eu;1_{c^J- zd2IeL6QQ?~Zo1W?FNx1kPbtw00N=@iXx{qHkQ5n7&<)a^r-n_fpMB7N3c|boRGYE~ z9&U(Jpq#s1od+Y2q7%gFx`RBZUs|i4J7^5Ta>a3VUd-$iP^pIk1X2!}3p1_tL3-XI z*?Ix8V;<`&YJR$lht`-~=4+{O9soWQ%4&@rppuHikylqmkX~+vaF2G_pq@1V4Rb9k zjgAc#8h;)k4t2|Hjvbr%bXsA$+F99-YiEivVhGUei%`4^XRR0gtvKz&u6W7v0(UB5 zpHtH+TE_kZl>F%7&XXO}CGJ#8Pc3KAsJSl90*(wrU-o1AmN}>E2Vyab4<_9!^3qHs zuo_u=M6jFPXKq?ZY30xb&IB=_t?^?9j@PenbGFp-bo~joR8vL8T7_jr?U?|n>S!Sk znjL{)N8WGhd1U3XMigb4wi%ki#L;RV$#wB4Q!xJK7B=BV%RHEo$BnIyhZ_+FY?m!& za?JuHm7c>HbSUe3Y-oV>hBX>pl_CAix4Ei`$hXO2#*};WrQ^AjiAlS1H(NWOc(h&Guy(amtAX1<8@vBbw(8YBo!iU2;hdmM zx3yCCtz}*wPLRARg8>Rl99wHm`W`6M6#eo?z>%30oq*BQAJ5zF0xLc0ylG)II~DNm zFThib8l{=5csXlwnovKHQDUe(l!bMli*{0((d0XS*Tr{4Yz?xOzsiiKTbkBjQY#J_Gq zEO63{S$4xg5{nIplN##mvjB-UIrmS`{hrdAOX+C#wmZ`mnHc~Znvd7*4tvn{mL$Ha zIM=WI+WS=G*LncjU-du>Pq|{bc_Q^a(7X;W{_p3%-Nbq@l>b#NyQY6Y_rPAkBv#Q> zwei)NGwG(|3ix6V`TJ)Vr?#wLY9Q=@OFruNVm+pKThEx(YqeTue2}x%cfv{N(Sm8! zc9>(HVDdz9tG+%lv2uYc5!3(qgx|pRSK;hSIoi1MgfKz8OiSQhK)@RqJb@Vi8*Xe+ z<5h8`5#fOvoN%}IMO32hkPK6!6_6Pji+K(b7=%&QjvV&kMd@A{$wE>?U8;%OTeE9$ zEMa0!cOE~gqoEbnqY;7sbZJ9DhrPF8!hZN z8W*iLE8kV|9mPS({xewR(eGJ~BM^pi7!n_H9Yo zZujI0{cP}}-Sn^1G&8$~JfHEr`-ZJ5o20FcD@;Uxo5ko2B50B5r5wpbnMv>b`$J8O zI_g4htqjWB#RWQ>-!2bddtoJ`jxVruo~-T{UEZ%jkd)8eKAIr#$WHhBSIm0l_as;G zvJ>l%4&jvj4kYzXz7F1Fk)f%C+|3avM<*ITZ*${!Vy50NqVQwFW)c&}s zq0eAT{P$ai!Q`h}i`E8+TSIr#+h!>erqnLa^Q?v*oFK_@_>Q(UaasMSzbBkzw6tF% z7QJ@k&*(eYquJ@OZNck1ev2!BzsA^Kx1DyFL?|G`9cWGUUu!x$Xu;>3lP8Ag?wOc} z7{sv|&hk>Fle2dNVsURzq5M;AVvL+w7hm!3ep@|vq_gnc^eaoOU+c7!_~hSFe$)Hz zPyEL2!?8V{<~+alH4PjD$A$+tb#ZhorvTR#xOj9BqRg6cF*d zzEf@ zCGfzyszGzS1rEq`}V6~Yo$zH>AQ*8&^i7ADWb(en_GvfWqGlt z?lDtB9LpgG6EU1#f635A!JE-wN|N^q&&BM3S>i0kZn7t?gZcbuQ^wsjTATFr0xl$` z##(kYdEo?~>}xwJxk4xYF@NloqH~?kjGd5;Mdhh^?!#WqYl6q0J-Me8;-A$Lx zpm(!vORF()ardAvEoY~tSaq-G`PcoUp+fWf4lBppEz0t^bPS4L$nxB{j67=CSuTD8 ziWid^eIpRjJuo4cq!i3ME|f~E*p4+4lPZCGT_ay!JsPo{V&o!Ky?sKaHpY)h?R$w> zY<^0*yg^QSI#FO;8Qja#@ObuP!Gtxc%!}24j!8QmO5-LoYK`vV4w4Sa9(lM|b(J%_ z8P*FQFW=lkFEf)S-K!`2{Z>C2g+yArHF>Q?_oN^K2qSw@`Hn}1_L4XoZx4_kU0uq} zegxBcqZG2o2u!=l_R_TB))-le+!QdZG{1FqP9tg~m|6bg*!pP|v9-jKmk7A(Zx>D} z_HJ&{xSFtE-Q7LX;`(h@hnh^YzOr;P{&DV!NXn@W2#uPJntkDJ(E*8kv72zlJfh9Dl?Cc%b=Iaf-@$@xE8fbTgQ1sr?dtzYoW?05(Z#do1*&40HI}pqY z?j*ATN1k=y+!R#rFzaLo*Dt?5^K!|rjaved5Hh_KN!+_wp<<}QizKP8oC>gxUQkr# zMgHp<*7RnNAv#9?U~&S2=S(e0a5K2`CCOf}+!mPe#B;vg`5=!IB>c-{kKoN*YS?8F=L)E8DqqDkH*oHg=1_L{T$r=azjiaU1}_!M*F=wtdFJ&%9~__b7m4 z-{i1f+~HjG9Dt#UCT(|lUR9n{Iz%{uus`ItDSnkP3sHLe;RM2NCfdTfj;S!IR`<3NCxVA{$FRA}+4;hzdWl`b{2bHWFIM_Rt4 z@M}?%)~!@(wSl`;A8QakzM%3q6!IJWM5*>deRG?fD2i*&NPFwibk^a1V}Xi=RC2}z z0qut%fT*&%8kaHZ_UTDq=3dE)ft*ZXFRSOfXZ(Ge&%Gem*ZCvv+1skFlimz2ZJS6? zF*ocztytJCaXOsVN7j%Gz&&nrz>-dZL(!S~6m{}lg7zP?yq$?Z2-P%^eR#sz- z$8~lW09q4wBwFc)yP+a};mPo1u}<+ak49hW{tjmSbwJhj+ot{;H<3Ul26RP|FU6uX zgZ~BykK=VfQ1&UqseAcWBO(qpM_=pw0f|f+YVKaX_IDsH+3x`e&XR`wyO;0&HxSE0 z4na_96}9PAHnZWIA=(t~SNHtx_dtuQVqd~_ZMNi32AB*&X}yGxKhT-}Ql5%=#XD@4 zwF<`VLqq~6(0Hr)0iRf17guqWj4#2Q#=1EKMVVTSsWq<0^F6Ybtf(E<9Jwt4VjFA2 zY&FAziSHmwKJVYz6f9GETH8PpzguQ}VR@zYxPPPqR^P2JbTSQrpcU8A>}}9HER`LX1lF* z7&K9vC)aOt`Si$(-WJACP8vQ{j%6(GOB7)Z`Mq$;Xt$j~bQX98-|ajVuN>>%^wf{$v7LN&9m4UKBspPlA3vc6RXtgq#hf44m%fqV?Or z7nB;saOdfp>zG3r*Qb-yB2Dg1bpGA))yK4u?p~WHvfx+(X+IFF6~CYz9+tPk1);*; z<_e@+(VOyf3*1JgDn10~vKs*8JGgAQaGWq#*#qRLUb<6^9V$qQ#{Loagtu;oEy_(}fY2L2gS`*b;@U(bqfMt!n zQ~z3bC;;~l<>_Ph$5{$kmPSfhZs`?3kZ7D(Z)nrBkYadVdfHIL}_^8bI+567N)HV_lc_Vc2lfs8{D3Ye6_pXQfCt`o!@K z6Y8297xPZOEbCAJLH2tz+E))gA807o!W!UHuJBI3yqIo9p@JH;UiJ@~hC`p1Jvxb zjY%Cr>qWmVS6Sk2*!8Ks%~}Uwhq?Y-SMs--E6dG3j;bnK>3n1GbELp<^TE+$oIDpv z+uAn7!XMMRhS0Sz^ZD$X8&)OTdPeIxDI20I)uI46HP5CWzw8DmJOX-JYw^9ttoUZI z`C`M`ao=^&3?InJA^B^Tc1mD{9xaZShVG;~S9XFxRWf2$WZ^cb{^-oPFg29Ok0qqk zdg&D2Zu_>aCt-6X-+Qg4ds`1~BXW2-Wm|0$+R&jJJIBGUg=Ne;9A*mC!cfs|`G4A; zv81w{bq?E?(ajnW5=17y^qS}$Av{GaqOX2*_XZ3i+g_6o@;47qog)!3TVwB!L1cAWZ$D8vCoV;qzgQY} zPY;IQy4*|roF5OhjV|L$?sG`ZL{H_l`ZXG7#I1#eZVO#MR_`z2l<7+7uhp|(jWT*0 zAn_e81UeHt`kiUJE}~=+zk8L6;00qU>AubTLDxkGyy6+y6Cg~?h7$1e*oYcF4_+}^ zwnFXp3eoPj9@2??Kl7niS7rI6mh%_PGV?ZBYPLU;eb} ziy8ER|69ej$iJ&dnWBpP-zvI;RiymU;53E*Ct@ZWq`YlCg_<)Wy-x;pKxwMeZSlJk zSECfLghnB?c}&AifC}}d9_G_A90I=h_GjDSj;vfLS!r=meyS&uA4_)^=!aMpK*`KW zGUXF>5F8X;_R%nBVhp+&s=fG3r|d=G4H^8-|iWn*^@@OeHH_7OLJUl<#s1&hTfwqGIq3$mkrHs|iH3GMDFAe(=> z&3>lb;RlZBqVMA1ylKgE(EO=QF&g7%^rFIwoAoDD7*lkUYS848!tnn1Lp2t(!Z?f> zPuXP#lCUSo7g%K(nlB^{H+<~CUB-Va3P z1++&kPUhV3NZSP>ev9(Y=(JslZ^=n&DlJsZ=`>ilEEyU6f=;TXapp~-Za&mY!~EdH znH~UqiH22grO7Qru4|&(MTWgML*7Rl?uhh9|958_iW(DfWK@3^u8IbbZ*~xcL2HRs zK>q6;?(#%Y2fXhSOS)`DCz!F`C_27i3CvtcezPTxPtdO4Y3=5&awc#EPaOZH-eZEm zxG&LX0u`}naDi8@01eFg@FfUjf^!Q<@Ahz)$R+6jP;QmGm#i|dp(-xL(Z0lB#qeX% z63hPELYjy@Os{??)hoD}e(R9eAsv`Fh|-Su;M?ozD=fnSI64`g{Pa5W6qSLIK&L>vIknv^pFI`N=&o0B=XplI=M@Gq!Akr@Iz4y>!X ztYRM)u*6il4x=8Y3o5s3MKlA+K^&&P+G-iRd2BYr%mCY-Rvi(CQ9#JxIbyxjou+_s zVr-lj(9s79qYHh0hceVN@b{X8FNuF)k)r$zx)6HiMrnB#i2o1F%R&W(4Jy1OOz~Wge6=l{5`1hi%x8K6m?50l^iR zW#{}JY?y%BV}E@@Z3h>M?b_AJ=v?}HA2mb!OwUNEN4?~F??c{*)NyQ{D&nCdXP$WPqqQOZ>GyrUafGRpW;5gcO z6V&Wo%u1Dh*#V03P<=UFrLnP~;95&2bt(0=1eQZhD2X+^^H;M=Rqx8ffU7Zhn8W(w7^G;@>MQ6Ue|pQ5^agrIS#5AgaUm-O(6D->N3~$ zE(eK)YPb&W*3L(R#v?j7*`478!XmJXi%8*kqmqetaBQboaa44xG$36oPuW~@GSLFu zkFcEP_|FM|*M1-=lv=L==ISqq*|!D~1z!WdfQntsVL$!^N%C*_Gi$A>h@r!@)F5G> z`E3mb88D1Wob$G?7%zSG;`&EE?s*>#z{ygaYV*;5Q9g>(W2jaX9GT#$YDLlljbT%} zk7OD^%X07TU|QG0X2{%P0kg{p7_PoGba0-S?ADb8 zV0*Hz7KPAzn#SOG)jfHuJ3m^Awjf0Y_I`7f!=33IV?BV~9rf-jDvj6{2Vs{DmeRq(v?hei* zp*gPu%CVC3p>ir>F|1*ZNy(`s>yv z`vros)~8QzQcFR?m;RDN@k+7xAb@$J?Z`Pz`r4A-~8vl<}#QU}epZg9=HR_wfa>0tz4d$#?9lcJgbM2v;ib zTH4E+=tm;U47q~iVidY>jPrGjea^f zW`MjtW`*_YS=GrDqx{Yv2QF!ORyN;e)L0%lpRoxys>`BoZMipjNWHr+6@W!PizRxP z1xC9}CTYB=_9z0W(8P!2&W=Hu;Mlj5YxiY+;9;;e#7%dq@gM4~bEP{l6l0IP(4)^x zmo-gWmF7XPMr7n#{WvRu7?kzg1<}Wr2>V(7e0jbuJ!VsDY8vDv~?(f z7aNdfYSgsiw(8yoz|IM~2Sq*09e?Zxb|(?TKj;hmj)-G^ZXL0qTvIko#-DJ2`-{aE z0;oe+`s_FZQ2b^5uLQvHMvjIA@cix_EdRS-Q2>3}5jnuzkbwOm8n)H-1l%xrA?7(W zE-{cpqI%h8h}Qj_Q!DBpW(xGA33(2kP^29orPWdZQ+KUA?7(zNAkg1Z>>IjKdr`(B z`0q39`KPvqgzq{th}p$=Ah!_N8NVV@0x+dD$<^?@8C$TGjr4FOUbF=4^Ec}D+f@$) z!;ICSAg``Mkzhym&M87l_%?_7 zYV#`6&Buj<%F<^S+f~8da{zHe)c)go*kvrxx$R}=BkK>~9QS6+R61&*-WZo$2I-y&2BLI*+Oex7NvNHre`9 zUetRNkGoZrQ?L~D0TLz^P_tTb&=`G-14dxTWGH#E9ng2=6%Gxra(QDt*P&pk8aGg? z8$|-1O|$M@NoddNNw)E|^&E3n-f{3N(?$8Ldu4I$KK(*UI^;6Ez8AL#bv#e5&3f_G ziqodQWLuMS8C*J(Agt6Z@&+GqQFGS5SGc@k_YS7rv7n|%as$6$kjdx(vL8w-D7o97 z>}K<&H7{Qom70sWir5)+L7G2~`*xLmQ%^pxh5bSgj?3Bl^is?=ASEix53Y<$?Gq|* zpx!03>I{uwK&IP^R9oOk0qLzG8H-Il4gNSq#%9o07_mw;)+n;$`}(pa8@5Wb)6tuu z_Y0Q?&t+zWGgdQ`o}R3UIwo62pR((a9ox@XMN*P}qt(D8>MASuTsrsi;Bn;E%1a^J z0M}>Foo~IR>YW6+(5;Mf_?!N(zL3%YOHG22*%qjqbq95eFGZA+$o_e)92Ovllj zkg6Uas55Y$OioAoRP{XCh}*@_P~V0JwZdY;$&^&wA!dvlwmI{@Hjl%(squtVs+H~o zs~bM_(0*TrJ|EIAbb47)TvFkQ@X8@1vrUcv^5d3b9~U5>tj2&e&!M=VtiaAwFwh|{xe7l9*As`xvLU}?bX$)&G87ZV(s zEQjBOQ}EKVrbdb@%-)G6W!{Y?NcOI9;lePIGrkPr*06?)c7}^&4{xvimb$u=W7;3Z zH3@Iyy?)_(WLO|6;U(>&NxRI{-M{<25(RAU!Jh{Z7xCBHy?$y{-mh+~Ul*$JlmfD= z`vup2&$-l`H(vGNW}AJDn!(Qb>ip!f0d1PXwOH{@;E1%s7F)DJ%$l)*Yg{ z&B$?pC5HF$Ov*zCFYmiN^qfY!0fI*A`R1UAS5`I@DVFMQFShY6I>U2vPC`#hlDEpo zlW+wWyxMn(ND7YGq0i#$|H&+a-+(vzT0+S{CxfO3nQR+^n1npEomAHW0D9*=yJ z+<~X?W1~DQBsGUWeP1jQqwLHMf)N5_!c2Hlj8??y6q7&N`;6hPTEIHcmGA94(l6K0 z1lLCy57Ac|mL#lHLxjtKvk@FAl6O+%ZE&3LH0?0O|JP14qD zHt+kYu2`r)3U+hyfrJ}kbuNq%Q(jrv5HW@IkpxRJGq38K(rf-E;I`u@)5m8x6hnP; zzq-YEQa|;CNB2aJeyZvb01%i5+9qwYbIq^W-IV@3=<%EmM>NY`KM2BXyJH%`+|UjooSY_eP`}-v!?F1YKR`0t(A^`ffcAuTjFMl8 zF#NYA0uC0chmj%HL^zz&D_UNcuS=Ev-PRogpnI>V)Q%s72>bJo0@7~qvhF4q$XJOH z+IY89yksuR5+Y5jR)xBcq-KcPdRb>B4NFn=U}`oQxL12KHBti48i3g_X_Y=(G73@B z+uEQ%yM1A&pc6x#3Js3!>qsxotvGF6`wr$+;lWk|aQ^bI0cj++C#(H| zSvj}*reP_?DPSR8)ivCzBEqI|b15mRtlOrlG4o`Qiz$R~JmJF!ZUH!JO#C5lG3~xv z?WSF$D=FJAq)i_a!e5po;Pub76C`A>#a#W3W?pgSM$Au!Q-{IU^LnZ+ z`+B3RIL8)jSZz|T7b)+G+ZvWm%Q(Px;^&1l`yonDdK@dbaa60s1>=iIublaXY(xQf z7QBu)Ia&<72>%r0G>_j;1@kX2^FbTCsblQ!kco z2*TwFjxI__iUd%ShmdbyuWd`sa@e;ZvDtr>Px zk@cL5>+0_zqwrrdMbh9RVWzrS3vn*&T*Zqcr)5DR{JTzo;}X;aw97+cnBJ+VHjlB# zp51LJAWiyPa@c9<{7sRxp0)*co4OyV*<(N!mOfW-Jn-V6?iW&<~mN5AS6lZ?ddQL6?EPZVQ-O z&)d0&HO}Zj(pypP^q%2SNcpr{C>oA_E@QK>RZeP~R0i)M_mFWax8t|2v|NI=GC4CU zeIZWjC!(W`cxH^G?(# z_5p3Ss;LsnGU}D6?P8mQe9sYNrGJja+o_1IA_v2#eGRIv4z?VD`#T!r-L1nDKK}`LzZz|5{v{rGPNWDEQ+S=UJm$Yv+bUy zA_Pq{`64eG?>A?$y2+GA6Y*rfK|4jmC1Mw z+(i9w&Y?^AFdYMF;LYV-wDSP z0k7iotH2b~^o*B1>Gy?+@sn&dPNA7jUb4RdaA$hJWmMI8xiBrUBU@i@ls_mUlV)t$z@CD@t*oGeE{M4YZBS zWy5AIiSWss^Q^UkkORD}?37}VU#kf^>e_Y)a1U8c8N>49m3@c<09hqpyZdHdMc3F0 zT{QBd8bSrR<}yUnQxx!SRk-T53~k696-Z3WwCG!rXuTAQC&;wbjn{P_tj^@Oy)!WV z;4r?E45ZOgK8gzm$TjdHe#+8c6D|GR(y`pTWhw*a*N0II?xPaWR$uBVHQPTX%ZXV%^;hF+61K^!aLRa7 zq+8!DUG^Notyv}XP5kwLEq^Z&t$3u3xT~AbX*=Ul=ELC|(SkpbA^n;SBkLLlnCo1^ z9P5DvRWr=^8YA1B6#>YM*9{Q}Bjf)aaAxgX`g36Yf$0AoFlFuh?~L``dGP=+$~73- z_N*ioQ3Wf*b?&@)vW(5kh{YR*9{v1E^*SE(h+pXD?sTzpgk#QlR=l0A{HsIYjXjjb zuC~`Ra+1_+UUDFSG^N8iye-cu8OIB($=!kH-YTBS zd?$NYp1D_VroUfU2{CECJfrC+X@C6>rHNhkP&hUu*YAv=%{%G{DEfPA52zC;gTpA` znIl)JkHJ{T9faPk&I{B&4-#!<^rmbSToGIeN{pjaSw`-zO)dxs2fZ5q2JJ78K>oo{ zck2FSh2|Gr4366^$el2~J1)e=2d)0P(FU2t@Z_o3ob3;i;tM|-0Bx}NId+H=hK8oPS-#J7-^%No&r1EQ;FY1=hQTOP=`G9OGYwc3O6 ziu#E|2)XsPL}lkiRU?0{~A-GV-?{-7ano+w&ftlEe? zu3kDIRWrw`9+a+H;Jg60&}65*iU)Q_V=dA5zkfT=^e&V3VS~7J{33u z^DFVbfo?Hc1~vwr&Ae5+i`h|`UC#VAOsRp#?QjCdFuHAbQNxK>c49V9FahPqU!RCE3aG97fOy0Wk zq4%$gA^F+YKm*lVA9|g^Yywf^*1ZeiBL%bh8qs$qk$QVw6Y`GmD-1FHF4wY$?gr}l zbE_G#caorw>~xucuiotHUO0JGP)|aS_*j?5?)Y;v9sHW@kba@F!_tXq^;!wEGu?cN zto!tT18)=*^$abBLqP+pl@|n z8~nQf>B{ae`l~L}eOG81(iI`%O`9R71=!4N8LiV;z@}A$6y>Vn^s#b4Hf!1})RA^|Ho8Qw_#mp;yJZHKr&{fH- z8)G%(V$8@gv2gF?&2_|O{x0#|ZLG1L z(^l`EAAvbf=EGXw3EL~uUNA0{I4(QvxXgX+W>e{7b4#S-P3L7Jg&|Es6T;m9^uN`R ztoR3mPbOS=;6XyOXig6bD_f}t}iTUt4oZSI}PT%sU^w( zUG>XqinXkQcVu2D@?Vy5V0XBeOVh-3StHxdnKtR`#d(*mENGLoR#W}YlCDMJG2_7L zcbhBDYS;-oy;I6lICBAH|s_SgJ zGr6TQ7xS-A5i>N@(W80qEJlGj=0t8hn%|+kBtDAQRj1Fk(NLWqJv4C zi(I@_1Mc(GP%>ToV(8FsHY4V0?&w%1ojjxcLddf^zIsVX!k%mkZlr!KJWQ*bk?JSZ zYV0jpTbA0N8`W|ITn0~ki;5edmyWQ8!@UE>0vK_XwLc8nxdI-O;ec@rmH#ZCGLxH&2JZ%CxTz`Y9RXS97kEH-l=PJ4Xbiq*TJK*_Q+x zw4dodv^q_i75N}q(c>R+(0AU8H{Vrgb?z2Nwcg_caa6c`0-udMjSs&3YgJjNGaLli zZL@zXQ29u7+lQeuRyw61b&Shh_im+UNK)$P4ioKduICxRA*FOE;&B)hSv3R6v`V{C zfTp=<32vUmVFYWI8#3moe_UGX?exeqE>)RJ5Uq!ET$cqt{TGwoQ0m?*w_7<%^eHox-hHxlud@px%C!#wf;TjTB}Ph zkhS}O(#H$5jjKHUi{43kmIiaE=+GAm>(w>R(%63AI^h@G3sp05s=(8}mOZ_#y?TZb zD{(*0b1=+A7_hNwTU&1xhugNocSwqQO43p2i*iV42}KC+*Cn!Vb) zASeLO#2oos)NJlma{1-mvL#6T5H2BaRh%N2?e}pI*?P51Y!1FVi1dcSyj>+e-^05P zfV}dh6z)`4WXY|N&aY3X`UT|u z5=;{9`|Q3)PyUMsm`|-+= zU+}LPfv~QYBmH^%%jau#=3@u^LVG0^T!Wge+NDj@4u>0c3$ik>k`CdFvucEPtD~Wc z>xrYGy^gf4XR?5L$I`78n6}ScgBcQA%d#v}=9l-x55nlrOU@b+N`N`DY3r&{Tp(;H zBuYtv+2Cc7Hmn))O;*{2=KrH zVDkD zKl_FPa6B`l!DQ^S^vJZDmGws4{54(UNaD3?AGj_@WIZDxBgzR=Em0MJ+GVsV?P4=| z<%q7aA+7n}!Rx(_>P=*~l0%f4$O@%LbZH=u9d5`&`uf{VMur!Nq;WRA4>UlO=i}N} z#c#Z!E&_VyUh0PxmR>g`ei()>GaBPNklXodM(5@lOwB{K?{>z?jp9*nQe_?2O0_*H zvm^QgD>E0P>mkcqu)SEif_f6av@aXMSy{k3eR&$bc)lS*j;Q6BcF6$MF0!x(@LgRUv9@ggG1==(QSninbZImlyNof zvD=GPnPNt?{`3W$?JV_&XK;)}?>%i)@gFF=xb}k8Guq7Z$$D+lm1mU?Ev^2zvYfv( zq3;i!t?v^K%4Xg;j-2?BJ4mz}LJ)+4s;pPczUKl>V!z?dBSBmy|BuSUL7OYFjJTh_ zZrs$OUdN`eelX%(Cg0f;jMinaFC#Fzoc*?gI$SGkEC94odyfQhnv0z8BCAz&N{94g z%27^t9ui-QQAUg1lvxezEieC{A(TDXrUi?bps!|YFd5o4#b4SXmmmrcMDE{!_ioE+ z?v7~%Ih++Yn5s<2r8e0`fRY?BN2F?zHunMEDE-N&`)=rUmoz`Jy{^KY)#@y{)W}xe zr=RSv&jMk5eSLmE_H^w-CCMMJgysjInUCA4-tVEmY}PFpuNWR+xHOt1dcbDuSNqx_ zac58W;RTO+r7-W{mx0!|UD8m=m9|hd^}C<-T{U1LE5_pWKjb7Ld`2N>hgUw`jM&;E z#(d)$k%o=}34y3$!MA@i_jU_pFXXoc&3uX$V!j8Tp$yb)p^@dC&R+PWTG$rHec`K@ zbnAx86;VQfknNTO4jb%p5klaGReinp7kP6dW~Roz{>0NY`1Odi&fFv2HKS$x)T-dv zU)m3)<#ip|+p8E+O5~7I=)(_49iT%GbAR`u25Guap9!459sItMJ@DrcqE-McL`<>U z5b8A#4F8iS+;+Ve<+I#hxV0xkmU4zzjwe6tjbSQ=!B#_}Cm!1G_=w9=b_cHNREM;? z-Ev6_59bTKL5t5ka)?qF@D!FVT&%0tJfAE^?vR$Jm6pzaa>e!8k&sQ)D5Z^ma9~rh zz_q(}=xfIytCrh1V{Qvfo7#g3Hfr#uwJnMa8kiK=SxX% zkPLk?9Z1ZW%JJL>ST)?YtoEz^50XLMg4^^DcYIF~KW72P!z4w_z#vE>K`pIkvzfA3 zC32}>?N!6O=KJ#fWF6V<$oykEByWsQ1h_6yRzTmh>2goNb(HZcmtnBpyCH9NT$XVA zU_+D}b~hiO08_+UxSdxsq2tHGKO9b(PXZTM{OQT4Q+Y6;1|i_!l{rG;dV&q1+f0YS zqHVc^j@n?6>?IGm$9LjpsOCrd^H;6ivP9B&P=#YzJug7&Zsnc~UjM5JOh3%{JK`F7 z{c3RZr@VB}db3TFgTa+oAquuKiu~&iIU+VKhzsW4>T#P(eDQ!@>UjuiyeN|yiS_*X zV-PTu8w8RfR1UeSVu62E`9(KndCpsrCoM*dJzWrJQoT4_MQ(V^5=$Y$$$!a>_SfCo>A^8rff4ThEtu*S@Ou9`Sy4oB5A_!Ulm@EcHXU@|9 zChhGh0{pL^^LNyg=`+twIDozrRFv1@RzaP$3L%~G2Wf|))GdPLBCikv=3Bq!#yWf>3I?i_> zDAh}NS~E!`%~bMuWg-l*#JEiF@5;R|$=m_; zUViF-eAOzIHQu%XoES@z;!{$W_XvcUe0+gh`o;p4ePCg=!<6@N8}q=6$XUPj?2NX;t*JK7DdDnh%q=hC zbkX-Cl7|Jl({+g6?B`0QLWz&mI@FB zi`mz;!SttB{?}8O-L^r|Gn`jf5xpB87Rq7@pVx=AN3{U!fr*-lZ$FFnsvqS8zP@#6 z&vl?ir%tsj)Gmh79)8n#bmsbf_?884hY=?=`D7>4!(Wg4tWPwEe!_xU;IFCv2J~;k zPZuItTa2JY(I7IfQzfc7-{HB4%~vT~)5_{?IfS7vO={PVRMqtrBR4!0ObX`j62#V+ z_GX6n`a9?GCX@XwAPR(9YstTjyd!KdVJcoDtl2~n;5?$@hw;#Z8n5~#m@^zAIG^-! z(hL0YOZ^Isig?!rek@ZblhS;t-LXNhcpMQ`WB{ygQ7O}>Y0p4P&`Xw@i1Ny>fb{J@ zFlsbTGNXP6rjNvbGAY@9IZ~&@6fW`Jc*Rm5qKwrz*;@nmib~Ui5yIQ_=wkSOw)G2H z%KMaUyuRP`cf*STHd!6tUZOXv-b&vI8v+_xwoBiI;dn;$r;VEnmQ#jf=1ctX)gEWH zTdF~y_$|&P_Yl9eyb`f_?=ur6s2fnsfB5%n=eCI{rJR2Mjp$fcgrkrF6O1xj`Q0{~ zlM@U4=4~I!EN2FNUV7BZ=Uw0(9gAz^e za5n?SBd-Aig$eN|vNbK-&?*Yw)gI^I=-4mfj{MT}alW(kT3S1UAXA?Tng!bfq)YCg zG7;I-6e_&q>zfqSo5WhAo{6%QCotJ7evjy;0J_~YGb)@Lk9>28;+$#=D0gCc7(vG8 zZ)Q&BRLrxn{Ri@VM$M=rpdFdN%U{bA4;?g>FJ063xshK;*w2Vm3$BuKZ(L0u1uv;h zT{wp!3A`Oq7RbLc-I+4k(N;F~&~llqBtx6uQvIu`ion%-XtbKY7)0g_@e74$_`oIk z((h6z-Y}SM(X(cTrkk}Ts~@ood?-Vv|FaZwEHJzviybKbWzhVWE5Rfm+FmJMFJfub)F z@pfY?&XHUxKow#_-R``l9u70!r5l{vZ1=V*5v7DDZ`Eqxf!{cbs9rQ|)v5-hEzbCj zGovBm!0uI>;Tw3C>Um>*3U$grj=VC`q)@N|8gh8Kq>PGKKg~AoAl{ahL?cHa47#bK z!DEH1ul*|Me}_1Y?&+`r9*5dL-_5~Siw{vqsncb;{?I3hv--qu_5^%uG8O0oBYL>fGAiA)*kbtNY zd3aF6!7aV-+?q8)_ZnO+Xoh z8E)OV=2Kr)NA@|E0PK(EJ*%w63&3m?{@F?IED(~clVsFVB-WSZ!G^0n%8TfpTcaQU zBQBSjPV1%{(L;S%#*5)KZ8c}aLUpmg&)m_f&3D)*_Zo1OpkANS?{uW_LFpt5>t%iH z6d;q)VV0)DST_XNlL0(~^rK+)UY8k6 z!avNwo_hwWeHmDzsj!{!gPGv{I9uO*o%uc~Lav@SI^~mEpbq?^nb;Y`0P+;zH*ku_ zZrqy*_#0&p3KWrK6r`=4<3!R>1*#66x0Cl*Re_0mwcz4TUF6m#V1eeBIC<>|M-*8aTE154~4)_lKC+uL3r751JYKO4 z;~>@?$mcCB)J^GOJ8rG8Rr-K9vMB`}4bI?dW^aeiGT(!2ULLkY-c`)NM2vuw{pM~T zANKtU+xX+qHMT^Q$r?<=!|qC^OG4)BfWjEP*nmvW_n)>#7t2H+tERWl3)@63nFq(Z z{G5zMG(H@sHPb5(_vBDLTMg$xS-g`y6Z6_uSsm40dSu`-ZMeH#Fl|^jrTrZw@M9@c zq*Cs8fWFs!)LwT{U6!5Il1M{WM_d5~US@Ao?oPKLbHSRAyFP|ht!H`bRi=pU3nlwR z0ofAcVE;n8#sg7kHw4un#2ddG_BzrGU387LV=1dZVAc8u3uDg%4Ij$GAjsLP>*j-+ z@yr$qe|%|kpZ`YkNibupe^p|6Q7u!H)D|~Zf@&-*6+_+IYFUUp8HJKDrI$m==q08EC z9AB^_mk?NK(Gl|Nf$V=egk0oTo7H+nCh*AQreYEPERCSJ8KMYpWwh#J>IAHxXgY7&K z^>oro?<9Va+K&eb{4ZGL+EJz=XjsFH`;k1$^W;#HCqdQKC<;g*Y$Ka2S!h#Ph562e zx6S4e&hh>5(L6m;%~AT_rg=voR-9Rt0NV8yohVS4s*CYx01vX@hsli11xcdLq^IqZRLO^AXXjoYAuSkRS9%{ZVC}o<`YltlyWp_J_JQ zuiiKwwW(D(o_e|F#ZpTWp)UHY*GD#1^+nw;snwRs!}Li-oT2G$sBw1Ct+VXn=2>WqNA1;yb*sQBs5rozwZc`dUX3|xF>p5eb%)w-zvU1OaZt%}+rgpe zmU!`PapOg9tMdnsH|pE3WKx&GW!KvG8OV5@x()UA0=~hr>7lt_D0+0;FpI@oz`Ig5 zz3#<(sr6bZOffxs;;j{{J`(nd|I04}k5{o?4!K@?vU~1iM)&+Tr^PC`+E;rRTxx4t zK~_IBChg{qG1rAKo^P3j7tVlq4atPaNLgWjIiQUu^Z<=~Z`UtAN4kXVTnDzFYa9xwo+Ov{i~^@=4x9H;g2P=SX!s0FQ3 zGLEUs_qJm4bwK<~AF6;5?$uHT6#_ig>?1Lj;kU{UVm_c3(B^x12^(>rm>#A3 zW{!A2eb^t`fI9b}_}do0Qw}Y~#|mk&bLbWS;a1tg>xwpyYitG6I8L`#96Wnu@xaM{ zhg}@c+5v<{m-(L=!y?Y7>?gcOqZ^%adPwqdY0ikyf*CvzyE&4d57m~7&%s{36QgvL z+`ls9cM>6)E{>LVF&>qm1?zb{K*3_x8>@7OI)QwUcN+J+raRQs21IHs&!lQbYVkIh zF@Acp+Wd<({+BEE$FGUY9@b3=(7X4auJLVzO*s4jNTm+lPKiQfz5WvzF5cP^|KBOl zw(x&Jb~UFnH_1qBKJEhbj6Krb_|KQJo~?<2XmCkt(Ocw-)c=m;tYuz{uo>w{@>Cyw zC!sE_=iugM^PwZ@U*)_C5ah9~SaiXA3{ap@;Z~cx*Bc)LlrfAH=z56!RQny|i`k#F z(IDuIIW;EfQ>o4I5t!(8EFhlogGr{cw~^6V>UH~{y}2Y%0W7>A+k}=3D$3l&JIxF= zaFFSc!|&azK-CLbUE?<^2c5n&O#^Gpui=$`Z>Tn5#vj2p`m38UzmY?u&63v+SO0;{NL&8l{q|&lnfXop!O>{mcwBhS6|1qF-rkz1hL!Ld zSE`;*Z1zB&MQgy0Mg(~k)&=Rp_va?V@w}}kE|?`yibHMQwYq0vPZz$qAoMHU!Qhmr zLKyyh=Z%ey@p?wg4|1<|gaBO@2P8Q}``?Bm{Tngu5k>U(?WbiGcJtP&)zKPE@=2&( zDjUez-~}v^em&sPhcuaFGB&q|2tXoxn5&xQ#!!6dGk*ej9ZAg3w(l6U%daUS__EQ= zFgNVW_JZF62;kWLYboPmZ#bX3Cd8(mW>Y7_(_7ecmN?eBVACPEYr4qidp?yBLdBmE zwW;rU=ZRy|`}jON^yXh(Wa+NpUqT2j$kmLVs7koZU5!P)APJo!NIq9Ou8%Kq*Dm_| z`^ncL#{qRawSsyUXy=O$eR(wQ(y1erCr6*3yD*&K8iB{TG=j?XN1U@B^7E^YZ}H zcLit~+hiYQdT-~&=K<-^tmu77m+(G;#Ha+tO8=rzM(3xkH}!2)VAohOts?0P0bD!1 zfLB#*B`47sLBDaC7k|WhCvH~wznK)tfxqmS{S=rhg?XZNayjf^+}4Xf3|okd%UDP* z0Kv*q8eklgF+Rq5;`=umr%#a1tes%@8W*Jx9O*~$p)qW#Q*AQG3^1>wqAKm28I<;G zjPt38CSc)6?l^pvoYndKrv|y zn`k>^+`|uYob2MHQ$}uKS%x-T58JziD_5|_Yb(;cwx*4iWpOC%pB3rwN_8nc+$DK} zN4t>U_lL}zt;U-@ZN*RXn}N7L3F)OIL+>z^E!}+xDxTs_Ebw>HEpy6K*Pl4kqg6qw z9BKp*Fk6q>e>&jcv#1l*Jra#6n;^cnBD!ZkA0kusb>Ta0Y@^a4=f$WIIS z#nzqAlS6Pl)e&C2mrl1k?t;}|(jcJi>KucW^M%q`i-kV*0s=Q^_BUfLE*K=?SNQ0X(Iq+`^Jb?^;TY z*i7pLoG7hrt($XsI&ar~!Bu6GGX^T;{+F+JeQ&7RoA?yRr9Ie*SfkMm`ugB6pgi`y z;=Gh)FJiN!8E{+mqsx!IpzGxq^sV#`JXbp{rVu%&;BL<&w@nb$u0RND+XRg6t4#jG zczf5|(jW7!ltHi3Hw08pKY~EwZe+NP-L9@{j!0Vii70NRJcN*I{xs+j)!1CbW{&svS6dkEz0OkK(;`z2NSv0`EepH*gaU_JLT?}aI`eyow!T1rx;Hg8_asNrX zID;R~7Na#bW!sYM7%}DgrgoK8oQOt#G{yvYw{`%og_fiH+d{Y~+ce&jDpN=uIXMmCh+MOKibOaI?^KhqtrS=i3*>rXs@iXIH;0MqRC&(zq8B z$&KX>uD+DDU6`Hzg6;aP-(0?g%>-_WS;~+ z*6vZH~M8xCup3iHdq)DM3aMXf0sUJ`&#I=_t<69Fs~gCI+Km?m+Yxe+HtA2nFU zLW;q?!1e8`jSy%quwU;(rg*Ga^8yTh{~H{~ez!HysGYTg=_obe9z2&cgUKRi3i;7b z#$n={r_Q4w%0wekb$JB_w!e~SHwIM#DK(G#W>t}42idUdo^AZbgH(AP1#kGQZ({;? z^HFfz>l!_Tb#`umjqDfcEz*rqVc(9`0j{SYD0n|Cd5`ro2dV8G*h85rsrTD;%5jWL z^KqYy>%d1@v0xhHhD30evx9~D#y30e-E5YwLvt?l@gJ^-hXsdwR`*=afG7l|oG3RK zLvzOl_`WpzKgXJ6ddOf5{htMs@rglux_-^uO&|TLYD%(wx533#^b0Yh=EeM`fLkJH z+{p)*a32lPlEAVHul{Ofnfxfy#(hF|01dY?Doy<<%AxoJB2=ZAYE?m0W==RM-ztsc zpi}Y^0jgQ>qVwgtWsVy4ctpX@b!Ht8rS9gQ8XXS>e zFM}Fq#QKEKGEIJ0=q)9vzX4SqWiszBx=j&>n zme72VUwbH`KK8RA(|QucTxm!`Yy%6gNb374%5D)@fK%@|-IX2JSr%YPk6*9a68&?& zh1jeYY0G3J3$Km_Q#?Iu`s!*g$lClO5<@CA^vD}pvvPQiuBZwu6S(U2AfT$v^d3C$ zi`L6DZ=ALV&oRGQTr(R3Hu0cWe{9ry)Gmh)%e<0r7IZ;ok8DMw=|?WI|ihY z9&X|%xU+tL-r9cwZ&xkIO(KXrtXX`R_3h|u-)@V@X(lwjzMC+hMf4Vt!`E7+Dt^G9 z;$k}d;s!!mv=DnX9VOp!YDKtmM2?$Jy}!0vc)(0HD6xgEaZsk`Z^TM*{CCv*9A-vvZd389l$so}w~`YS3nW32t4M;j(^j9{5)p?yQc0GgO^tfcG$?-wa5 zU9}ADz7rFfMqYP;hpn!d84+rY&i;F5^?B6TpK^V>&a-3#!gVmmVOGDnL0e`piz^}p z7atc%dbZlr*3jVxes`eZHLp7jVrMW<=qDTlIF0ZL-MR?O6SRK#mKU8^*eg`G>LJwg z(A@2LJi-FFQ%?uF`>Yyjr|f{_b?Q2)=3pPRBNy`o9%3Klow{}@7;rlZd65S1@Zs07 zuz$$qNg>n})?qM%tk&J6dTN4_9Lw2N)utIT7msJ6_K=e?W0IHcVql z=H;jxrMP5)?uf$#vy$7Nfl=Qk%KSYZ8O3}N47}1i4O$TX?+>o;!6sJ>6tEYZ^Fa{< z?hkxqN<7HA!xjy1?asM4*Yrsl2Y9sA6}hl5^0FW{`9xxI#W&JRa1?0Srp>ehj>{|j$Z2?0zddR< zR0RwGH~DZDZ$99vW-v~i%W6-f*4w^HND3lO=@Ix7XVhQZ5QqnP6_5~kxcISDac#h^ zEI*#(pRdpw{^6{)!V?2i#_;_kez!ckXHx@V-b2q!DEjF^hH14hE5KL}Pta5&s8X{t z)~_WA2lb&AcLS|$TxiWLtapa9^uLv9N`pGBN23G(}KAccL<$Eon3I>?z zc|p>J;gyZ(h?Fb;T@iHqsDT2udp#Qa4?f}Xfp4ugMwG9t5_`X5rkPGA-ZSdrAc(5D zL)pM>Np?df0@lyyuJfL*!2(z%#EUy1p<1%jNgfw;c)bReTeCq*L2hCWoHX50C@Cw= z-_KXh;2tX!>@@C410q77-73F{e`MBgQ}#~a@>M1ON{k|TZI`n()Sl%rfK2zF>G$K zMVZFu3n0GKmHBw=?*48FHupyE;Efx-wda7)OX33mj~WoEWx=7DlW8bBhj>uo7Uh+_ z}VJpFg8jd^_{)g_XdkQ z>4qws!esv?zKQCdrjhy+26F2XuI)r9-OAh0VGVgLB5kw1&Mba=89O~IE@o@=|5!Tj zc(&U9k5`pErRwfot*Y5cYqivf8Fz=48nxA`Qd+ab3Sw5>9f&Gwr_^4x8zHJKVy5;8 z(ps@1B_xQ*@A5o9f8ceTlXG0>I@kHm_s7ev@0ol%*EplC%ZJwDxvCE-3dpdbDMPMl z;k9(7f2fcj%t1ehp{zUhPHBuxwmZJ&FQHK++U2w1s_(>5x}un!2&XgRW=vZH?HX~y z7xV<#t)DgtsBEib%o*KQ8ot;sa`n17SE^FHR`j|~U8TDFeShWIXtx~Qksz`LxY2#u zi#5sY7%)EnCTQLGH~c90qXXdya^lHmL~geGPNG@8vB{5JUa!fC)6(xo9ZZJS*x_YO zz41ivp%j`PRL6W8`m@0UTa8(Gm)CoI(yR;7oQeJrc=zfs^kkMw|4}!<%Qqv7`T+|E z?xIEok%XWu#nL{={E;-$XIdG&H4c<2Ha`fNO(tgbE!YIM@NNI=d&qqJ!uf(VTb{1p zSLP4B9vA;;qAt_aOD8rk>(nT5miN|Fr$n;Nj|1@b;E&py%3RwHDdGaOtP(fR&q$jb z<<)p=`#kZXP*!9%g?*fb)>4H;9cd()gyldZcE9kcy3(((&|h0THwYuI!jS}JD`(nB zfsJ>~&5fiVQR;Qd)X|C04(iOQpYk90rE(JBA@2+FLUB%75{fy!yCujWm3@3DjP1_c z8}#1q1HXAQi;P%rb|Usi={tojqJBaPoUeB*telyPdj^vm0NmDMS*bbJa!gl6>bX-H z4mmUZy^ih~Fx^N}E{_wOXsSV$4%!DP%IFcowF7U>A935;+fI0oA}sbmoa_5fBggKr zZ3msMOB!nx;ym-bw4ogE!(7lU{r&OtoyCK<)McA`Er@jY!0HZ<#|wwM$OFdAIa5dM z{Z3oh!cLPTsaBt%YVaLgs1xzIhvG>%2MZLp(6l`jrD+_j1kdkVRd7W?R9d&3L2d8j zd-BgFlgOrW=&Q`%BhOMjuHv0eEO00gokz8vCWWuHzEKo3&dHL-n7!|=?%~>Osq60P zdcw7Ec(-LDKSZ;#-4^B|hgIsAOBe9+Zn~?!bIFNmp}kOj8P2g~jRlt_w*o$Zv^A`E zImEylZwo_`wnxTV-ISvinqB2NW=Sou zg~bsDSxNWZvb~IUbPNa&VuHoqu;w93T1JAGe>Phje|#LR<;7_)4#b#Wj}xIKe7o}E z`wYbX)A>Vg!P8nfhZDZP0_NRb<~JVJL#)@>#M5r}2UFD;Xyn-()9p$y>ee6%N3-kD z^L#)4eajXD+E6#&JmW2~rnPNEou9UplNtZ%n`62QvJsDDwH?+ZWwtBP;?9htVf&y4 z@{fb8w$x+(LcRSzg~Gd)dE(A=g7EH6cL4$;U+T+odzB)P`X>IntY36b2;olr8v8@v zTy_<>&)O$<$WHg;p7C4HA695#%;xAXJV-=Lc5A@sw3=|S_PjKD{S!GfPEBiM_Adq& z{0f}I-zdHPjycHf)&9R{jrd$^8FKJLN=VlJ=+DTIjjQ6QE&JbP?CSwv-(j~#$4W@M zZ#-&-clG54#)JAVt{f+21Z7w0+*zHe;&|MrWcl}vR?qr@Ahhs9<_ahlcxb8YJ=~N^ ze5rnKNwxXoHh9>C&R|@>xsz<$fPUD_)%l#SQCWTT4DT;ag}vM23Se2@cMMvKEd}do zpr-GR{M#05=on#98VWO?mc8M2O~7wY0wT2_+8HXEQCIKn`F^i*Ti$Q)J_KJF57X($ z0r~P-P0M+;`f<0?A+-sPRPY9+xI<5gRY5F0j9Ko`$lLYfPjzouuH6I+{_MlWmzH}c z1jL;ybmDr$t0*=Z1b0wPQ$5-^EHCM{B!oDRH}Hm2w3{X5-x_aw@+Tt zl3HN(yxYUlZYF^~-ikjZA`|s7bLNyoA zJNXcD%C85gDlTZs=Eaw%{HQs0tC&%H8ZdbLvRsumWiA7X8o}y)JcmH|J#e~Bp<@Is zCj_WSw-pz$t$5K2E!`%j|T);VJqKig3@j_wOLwx3!VWDl)ud4tx`N&O0`ti4X8$!D0wiP;O zOJ}G*wk1-vDuwOW8IM9ygF8w8vG8KJ&wAQG>EJ`)`=3tviU1m~UyrC|2R)-<*AtgP zUpl~hI*GESYAtg_&>uAQeElzGBznDX3Q3t%OqmRh?W3y~(95(f0JK0;uPperxnI_O zKvdne&u`Y(tuk`*Ky`2R{+#GYr~;7FogT~ub;_FG>&H2SF$qPw?eOEkLiN9x=i9l* z8TmX_-;4i4IR#$0{{~)+-X4E;_(zK^DDW4tZrcvs91eQ{OslE2Vn=Dld1nt4BH_aY zIc0Id`7e>6aFJLTJ2go)Ue`H64Scyy`FM??37U0%-YS_rSydMjc4k0MImO<*tF{Ix zf<7Vx-__Uh@Y@mz+pV8@*To+LY?S{`(T5WByw`jH$EESF-DKTU?>iXSNXSl&Is8&X z_{g8ynW)Fp+V=jPTS*}s3mG1`2fRybf2jPcOD)Gq_%DdCa`~o!&<~Ur;Lt*c;i(f1+YNGXMkN~@vx3@w;*Zoq^ z{QcH24F_O|L+#s?cX5UM&bty-~n^rG;`prWkCobi_fw z$$l2(mNCeW3`u4z3*QGPRtb?F8qE?Edk5;yl$KdPe}k~+UYPmAS-Ky9j}~>+xbQ3a z=cIL@IGrnsi)}jwY$RJ+Z5rk-DU%v&ZtgaT*mxNy2VSP^1}oL99i8WHEAuZmR%y&l zR>y)DiK+4NBqa*>TimHovTyBlI!m^j}NG+ zO+r8wG28w|e@zxpnYupyvJ>(=(1Q{Wx{t^?rvgBMx`O?c`s*!fAjpoJzIK*y96QMC zyR;Hwv*ZczduOBfU8mix;P~ZK8^5T`@WHY~T=X30PLF|ru%K~#?7-0yRo#jX)z@0a z^H8}Wk%at{W~BK$0&DYOBTQ~qocN>3 zD;LO!sWadA@#dNbXg{h zk<&cMp`c|q2H>&aK8cC5EYcFEc{=HEm-h?*CC->KWDQN9VR@mO<7!PK ziqPZ|t3y?9Pvo4tUYVx+^E#+aD-8RKb9g@R?!xz2A?A5WP~9}Ze|qd!`a?OCskS3= zGsFPkALrGs*7k$IF&fpZ%C$3(tJ7B3l*pl7bBc7bhr$eJneQ*DTh<*yO0>{^er~Nh zV~2M0bq~kAz+D1Ym6+k-Cu<~#uVGsiPfzAedn_;$l0gJz-ev69!<%x(`1D^e)7froF!Ka z12jL|Egm*c8jRXpy~kfvl6iVpr4aewE&pt;>i&1jj!Gft(!oCGH$~+5@eeOl`-d8K z7IC{@JiC>Zq~57l_wiF+F7qx%M{LD(S8))j0V06wkAH_Wo&;rSae@ZI$ihKL$<>zO zioV|3COt-yNVMDA=%Prrq{MtI|vu_GEc3xp&-) zgZR98;t)@<;F&;?Z6XP;9KjtXvac!bWho3B3EjQC-qC8SA5sYF4|X=!EJm>JPR`Y& zCN%S+Dh+v&lIo(T2#qtBZC7ZS>$y=F= zN6hz#1*1kS_vDKPNXl5lJ>>t6qVfOlsG1J)W)yc4_1k9HZTY8v?Oe794o3+JR70BF zam(y*@J3UCj4Kyayca>E)P(J5i;Kiq2OzB!BG)*go6KpZBS#4fIR?r~F^kzZvPC3v z0tsKX=17`GQUJBQqvrk5)fWNNV%;2Z9@Wm&vq$N&e-ibm$2MQDLLZ0Z6lHl;Hpc=4 z49|90V4r2J!~$T zZ|1_mQ?{_vlAl`B%!r+Bz71%8dtosl-hLjbV4>MyS|i5>fWZR~XZ%N(ES5YEa`!{G zu4&Mx6HkFh&9-|X8}cI;fFn#fdNlg zb|as>Bn0uc?luF%o^gxqev$V_wOT7S`5+YseG`+~Z$<>XK;zE*gxtfG20l%RhENk- zgKS5D1Z{^lkF-*x#HG-N_o|G@t$n}~gpwP}hR4n2jA5+o%S*U#))8p%t@Y)bis={Lan# zV?R4bDOp`7JUGGgpy>WSzJT93o^9#3;g7qiYG{bUxF}AJ;~<%^1Mw7#8?n!;L6IR& zW59G%COo|fjnaIwGW3#8EUgm8kw5>l(fl$?IHZn#zYp&iqMY=%1F>SCMA~PSya>Z8 zE^;NOW48$nKmJCXlT`31brb30<=L4wgW)KMZ@i1#e3xB&MeXm%KQ)FnkWW^kg>QVw zRO$%IY62Rivis1&k*G-tpeuoE{ne!Ce$xwNl95J5^EuiM7s~8}C!SP_5?S4%Zjhp$ zkgZ>{D7P55Gu3<&G^-m|wNCRcT4{U@h}e&HYV|*!P|Sx$DM@m49B#-xl@wxvEtos$ z!TI!B$GPFd^}nI@9L@>4&GFw`!fhO_YA!Q){h~`&Pnx;}IphhNdFK3~lD6v19WJ{Rc*QP)5V6l6GwQ)qs5No|eagCeni;Eq1QiaW2kp91}qte!ZSZf+hBzZ2& zo~jf%ap)|JgmUB9O9Eu9P3SDCr5qbr-oGy9sJE*Vjc@sG$le6SD-rQR-*LCB|F(q=DEzbL;D@`1E2hNDS>O2 z_Vb>-g`;4~{Q=+6f<{|*#UEv(@r9y+`2V+HH@SOIoG8ahk&K(nUCxs8*Z&gF4!s?0%RhQ2TR9NR~V zxeo;Z#LQ=2FVD?-Q2k9J9+S?50L1>Utbh6%A8d53kV5$ZT9rh~a0yPx6*Oz3GO0yZ zRNA#tKt(*&-Rif-D?{T`v$dK29P`0fo6#I|UHb=xT%4W$I`hGD2OAnC+}#F_p1oVa zdu3D~tdbI=F;?nHhCgAxc2*dBefg({FmgS?>3&fqXF`BX*IJy-)N;sLt)){!eAtXd zu+BcR>RCPmvW~lX7K{fS+@88Hb^%8Zx54f@&2RLOc%JPWzMqz>y^zb%@WMvi2mo#^L<(}JvjKw0RU>5U}JV2wx;{bbHEI-$QgaTPKSyK zn|cD+Z0^5q(VEIyvN9KlE5e&u!|x0@T4DgK{vS+OHrFVrHPlJD_+$6Mc2# zp3G*C9KY13{bz(w1uAp_u)_*cTyhYg)(<4FH`5{?GS}ZQ zFY~<203x-!r$_f&)qMX}-X=ZA9(ZSoWJ_1)_URV~ep+&Ot@_T_o#Ub%NO&9fJWk!d zV(M*~Q?u-B)J%fX`ASj=i)iFQ7(BXHTMmJ=3F|IMqbjpeJ(R27UNt+*(ub&fzW`{n>Em<^qyD1go@Gi zD!uWN#hBhb3&eS5Y3EOBs&sMk6hla9gKk?{f!0eAnz57zq~AF^0{5@qpii*G39>*b zhIXa8Nb8CwdXZdM_H1h8=XCkG;59%4&Pg~@GKqp(ZgO{$0 z=z}&cYj{CM$}`1^7DwzTe;JErsg>aQ#j>>OW?a&hJK?OiduRpsscJ-W-FMdcDfHs{ z*uxM?gN3i}vGM`8%c&KY1hAA zOTIg?4~q0?wK?G2zM&)`Yky54VF8wKZC;_CWIs(-6OAW*t^c~ND2iUhjn_W4-4+I$ za2WhQgg?RqoFx~KV(P3G$t9>J? z3;dqt3XHat&8VJ`j%vr9f)Qg6(3U(q-S22D3TuPJtV+t^IVvqDsBv}1mm3_OyJB>F z2-Z(}{HOpM5$uf%w3-fbE;=>bG64uEoiUkn{in|d z5%d_QH}f`)q6=mq!HHwuM?@6Ov+--9>m;bbAy=U{RO5~tb0MBn=7ju!0+Q8TL?$Si znIHf1NVJ;^+(h51kt$o@ACs-C!Io2-5gOT-fM&@kV74RV1}BNvCjXi{h;(!}*M0xm z`1CEm?{c{Mv0cqIG~l&))$#dFNmM%-8P19^{LVo*K?mtUcB9t=dz+69$C z9px;Dw_9chO^t3>zlc5B&&;;e1O0)g1Wc$A1h38C>#zqJXVnwv zd)?xG5t-SZYBJJmILpDHdY$L0I${LnwmZ8(twLZ!b3)5^NLX$6P9eXUL71m7a<&Vy z(ZtVk>gjR156sm{f?>w5wEJSlc&+^k=(<>y4j&cwmIl`Yz76~q>%;G?Z17%0=)spY zvOq9|fk?0FSBVV;DyuDrFPt76IveMR9aL9oMwf&U-X>3T&2z;J`BJn=dyOw{FLIlw z!vhSynQTP;L*EM^Af(1iQ`n~o)gWiwzJL3Unq|t#xiHe+XgVg$0)Se>nhSu+*iG@G zC@rh@D0f#R=zJkpdIDrFLMNM0d4pb^75m&%QtOwbRM%&Tb$#LIBX%99`KT|IZe$`=N!nO+^scrGi7#=C#NCY6w}c<8ovQlU)yF3Sc8 zpX@8&z8t*v4kDngV(Sd%&J=KFb2C*{_WlBE;|f`OFcK3&$=i&W+yFIa2t6^>j@^L5 z&c*0C=c~;xsmJ#N1>5-|DqQCew^3r3Tyj?~VPI8E4V6i(1<^5;P0wpC8AE^B%BA4T zE`0ie9%J1rqJMERA^MHQe}DOUTC_!9Txx@{=oP(k0Yq_>B$<7(itOzx&1gLN(|+0W zFj+~dfC}v=lr!?-Kxk|u+gWIFI|jTGnw7jA!*|t1B^Vl~jm0i_fbQD>aqH=CT;6{U zxN#K(xzAEL*XKFfrY&g&n<^&lA9?4pO_>?jo_BI8xcA;#a2^i(Un$D`(tc}H#y9eD&dPq3rx`K)Y0O;Bq*8@aw%s~dUT&o= zy0M#H^S`!ZOey=V%3H(0R=Due;=j#joT7W`yUhvK?*Q5BYO~^f+Y%kPL)`nv zbwL`uj>Q&Z&w{^AhE;@UCxUf@;$TeC2LHMo;mx&+$>COJ@8T6f^Ph(6lVg6F^56y> zhbK8lU@U#JJROX#iX78V_H~p6U8ISl0g11&yMZsQ6adyI1i_Ig$4O> zb|M;(;&QHF#}|Wv=-?{WWlU|wQVXQI@jm{*01C6O(y4-fc{|-4HveW5aP*V@5w@)a z0i7jYo@GlM@RRf8udP_(z-s3w<1(ULZ*rxA&HM;jBSmjPb(b}mz<^qy;*4Ocxg-`G z!2dhC_B3(1oC1il4JGXsa}U%O&Lwf*sc_kM|0|f-%49d!{hoth_}}x7OOIa+Cy>s7 zmu7+sscO*wEZf=Ecn)D=`{wz!!Q!Dbr};y=^@hLh`bNxDlu!FJ?n`QJZc{ zILD6{VQx~E>}S0^Kqx}<{8&ve-dDZW~dzNha-T$($~6`F9FvJCg$8t{t}NywRYl{hGt z?u)e#`OES>zq6KZ`>sOBZHq(@Ffg*#njH1#CoY3JUD^%Cdtd}e{R+`SGOL-UBl&{P z!3};JE*%2GcwV0EmqrsrvVCFP(h-D%^a3ugcaakaLr>B7J?_clt8!Lw5LaO}oy6He zTxPN6weNG>T%q0-W$L4rtAK_WN*HM&O}bVo&Vp4}_6-BJ3Z$CO#qNp4Xr2)lNV~cI zaI1Og&}}X8LXicUPm-MR9Lel4 zDvj)h1)zdYDxsJU z;7%d`#fbe@0HmQcDY*|`ox8zjnMh+U!}iLR(H?4n~$gHX0Q+!B)C<7y7eqdV;F?t8 zqzHu-0UR@P@ zrTntv%fJ%|o%q=+Y1o9q(*Vz}oW1<4AjBHDw%s8*jg}xLRn&A+ajFzFFo~$MXtDKK zQ}fz5B@p4=>P#`%DF?03G@O$VLhc-$)Rgt)^X4sqTRwsR`*M&_)v&VVDSXZo7%2Ve z;5+!@F=+Anb~(*CDJ^5~&~b4y!(b=Hq%`nY^tufB*PKA23luMtdka97MsJb3v-A$^ zrRSs6>s$9pK;?T1`DLhN_r+$E4DoB5i>51Nk*n?

    z^NvNzU8Kn-j7o6!~@&Y{nGH1Mzwaju;&&Tg1c^`M_0q! zPzmZz-FOgkK}b$s5+Abmd?YPh{w6_hBcf^af{W& z6e|#%Ctb9<@Ord)^|kr&jLL28+1M#$LXhYd+DQcp^KTE|CyC`eGmH$Y1Zy-jyprpi z??unt10%*YO+P+*{?JZSH#O-=%+tc{7x*T3t+$58<;r)HZJ&K~>jA!qP-SV7j~p~1 z@8pojow_Nb6#luYfG?7{H;e8U_H%4J~1_#y|w!C^v<-=h6+$8Fz;(B%|*Z|-b(u?AYrUtikg-r7COZqAJ~!9f*5HS>|@ z(8T%#lhQDuHSwerY2KY;Z(P0~1hAyi%_^O|8^uQ-UiUWX_+_yJ^LL9H=_+1XmBWA$ z@Gr@fg|k~y!QNG$(uJPn(;U@w?44YYH5C)%`8A&BpNQJ3=@`uQoJpezsp(vid_BJU zmpX&57h~Z{&4+L|`sgcE#MaSqSn3H%)7*&q>e8;<4sAlv*sIq#XkRZRiWOwe# zn`EeTW|F*rLfmG~ro>e+<__AWZMNr~1QSv<#?Hf>{~ z+~@*?$Y=(|xbczK0b*m)?2Nwq@MMB`e8O`wS9`url7l27(R+4Bm}PM^l?-Oc*)=h2YC zvflt0Gu!023jcX9W{~oW#H*Y({_oBP3*$KzL`Uz*^wgw*Swz(~$0xl#=MPSpbkFHA zv5QkdEF}60uGU=eotQBv;?V=j9RQwae9($WnRH4p42}2Jw6gWt@*Mext3T+5Om2AK z4xlGqvgoz;uw>od)w!bGUKsd_l>s3;I6Y!e)=BE>e5c)BXVANE`A9o4o7IXRVnWVyJo~xHXD{ z&&^laYYvTj2#oSd9b!?6n zisDaFEZ9PcNRZFQUyFr@Ed)`8DeI=dw)|Q4N8&3sdyS4=ou+v$ zDK^6DcK6ebh8L_vr`Mvj~_4A?B^r4yB-wcgXm1g=BWJ7>a`VSB$R;2lBG3F@Hu z$t?_d+G;I-k=t5Rf4AhfosK<gA4 zkkmFK@8={UM3KUskZQL|`hQGG<Gpr*aL z!NQ9DBaYuZpEWV^1ic(>jIxcXRMVZ>JS$In0)Q*7nd?@Sj_+0n1wHz2E({1#2+t~#o4T=?F0;+ zBDfh9HPPUM11KeyA(#!B@(E4wzH^L(1Dj1G<2MU{_ubRTW((R&+;#5}eL7TQ;Xz&= zacr5hVf*jcWZ@w_mtIZrv;$i&Dcv{kz#3FsUTg)eEag4-dg<%nuq10GqGbMoz4*z6 zDezx|GMzFAI&q}oCN;=Az&vuc=%tS@an&Uw_CG0KoH29S zc?Zu8ZiRFUl!{MbX6~0B_h^>XGgml}G+i#k1kU+bE&e-q$htPVCS{nLJ{Fcifl_X$ z8zIyib+|{Zl@yz>z^4sYNm8L^_n=+-rsg=g5Dz1^EpttJR(Xy+2NEMuFXv%Ss+d$>R&_Z(gP<^ebm+22SKP z==`Ej!@zK9S+(*UfIwv?EQ=rPdf?Onq$;P<>*UJc1Dw@ga%5^)^+am__$&6Q?!Nuf z=)FUl5^pq)^J*q^0-5fUrYVw$qXmdHBQP($-38LkEKzc(Hl)In6;VbwsH0r>(Mw>q z04PGJ;rMGLDXRtaRBvk<#O&mWcR_qdF4KEQla@}Z!G2TXG9%+F=MD)q88HdfcLJG_ zUZKG?g>sidNdu5-bwk4pHx5v{RIf>{OqEw5{ZjD~7nrX1@8M)+0Ks-bWE+d2jmWt+ z2Nc%tD=s#-{+ZCi&zx~4-+B9k5`B!Wtz8H|<|*#%bLGaOS=5L{s9Gqi=W)J zx0C*U(J$hy0v@g0ZU&C~m5u#2GPTLa8UJkl5Els!=T>t`;dK5}mVmXHGE|ue&Wc>K zC=MC)*ocVA*^+y+(Q}g@Kl4SE{GVPUh}7Pfxnq7Z02@WN5u1mqPGgRUO3*~$S2}!s zBaZD}FBXE0hxNP$v=2hn;gcGr-QYgXT0eP2HCH350h1ocY3yyQ$~^Y~sg1&lWW_h` zB^e5yGU8HS#7!SZm);b_b4OYh5OJaY%Y&W=vUNGAvs_IpKI#X@BTn!1# zGrx&;TBz2L>K}{2M)iVrU}nV(emWbl8S$3Tx*7CG=Rl{vb$b2R1u*1qNq>}Jla*7@ zYzvGMD!X>(r z0$Ip6>YF=v*_S)6sZR^@)z+O(>}M(JK?wyX1;VION+s=?p%P?~^>m@F%t;sKS|7$K z=qR`#SF4Y&FaTNToTy)uJ~dl23Z@Xj{HaNnN+awvg;fmR$_OEQv0*q=D^65(t7_QD0ckZu0Ga2oln>D+f zmz96^DBJe|Asm%C=9MMZ7tly{WTF{O$m3) z8apzng?C{qu6(;ZNY@eDvK_=aIEqfZ--wJFO-?Q2&$uII{9H5Q9i|3|i~H8=YG^jo zv|Ry{?t!oZrRX{YZh_Egb@ylXyvmH0L(w!GYU8`Fr+RyN0##UDr5e@@;u)=*xbfD#P{#>0L&8{MhHN>losd_49E z4hofS)?jLqpLK>7o|*%Ku2BI&ugMbSKvZWhT`EnuHeCb#>nz`?h2=8PWQw3V{3N9M zmVq?&-j1!KefREW$quPV>eb=K%s6iOkP$D@@J{Vf5}8nRcu zcqqm}{t|Vx0VJfe^M6e-=m+y8;}X>;@EriOW<}H%{$edhh)5(*WmHAlsOnho+!1eT zQX}4-^`6v{+GFU|=k$F}5JCT%P`DDy%$nT?IH;VgOVsq^K$UyF`QO^YnUI{DV6Km{ zOa2^RcnGy&R}4D(A!(KeT@Hf402TCP1VH0&VvcA!R0hu z2nasmF6!Ag3*k)kA6#(f_L}uZL?-FTG5Y(2%4~gYslBrm*G3Q=Nc113W9OMUAbkEU z$2|V}x9%@Ut8BVMT5wb&YcY;`K;R8m`ceb)`Y)ksuT@b|2+NE9OmA%E=u_bbK z1O>#rTM8~^xEE_Sv_gvh7PeCveWpy9u^X- ze0!f7EB=vp$f^SKe&q@Vw(qX<8eUv|ZsK&AC@9sO%`(aN7%C0`&o8@fIW4sF$KoDh z14x-;oyb31x8iMq%k-+Th9z%ZO`OuA6$gzZCJD}6Z|KUZvg%Iv^@}=Ism*}Wxa`0I zA56jL*h;W55-i`|wue4`k?Gy}A!Ag)B7)kx-_8oMvfBCu9Ir(EtBo%wfD+KjjyDQo zm5%d=l~Pt()VzHo_sE5U2#w%BY3B4eGmlRZ=$$u8J4E zTJfYrYGSvQey0N-#z}I%nV*5AV9_gA5$6hofnpc0+b^Ni!EaD(rUbi@ceti6zYGo> z{368%D(+?ZfgHg)<#Sm!(=ovQNKD<5sZv7dXpwG#0HqlDd5?q59WUc7@7&R@OjAXM zo^SN(?inZ|@Dafdf-F67GpC7pPPn>xPAG{%oF7y;5j>hF2s8jP2L`Z5n}KRWz5v^y z;VB%{ii;X8zL(GCANsY!bB>50_Cwr&V#H-E@b6VglhL>-fLh2f+6rL+7xy_1!Hs18 zcMrEMF&S}uxSXGyLuku%c7+yl{remQ(GwFeUtS`eV z^1Yw8Ius}H#y>|DXwpg}oMcxzz<*q6XLH@VASXy`3f-=#-+LCm5w+UhyMF#EJA0O= z5f;E|05fF{%#`UjSKx8-BtXqsvtJ#l3Ih{@3cZmQlxBGcOcZ{6h~cC5r0|&U_XGR6 z6uRFF<+^660n3_3&J<%QSydt2J-?`4K<=vyF@0G-*sVl9~< zXUti#Nuvs3VAF7{h}<>xfDdR$j@9ePrc-@5=VKV z#<$kiQcAVZ2UpX93~gTFod&v@nz5H=OUGnfkpJxJ^wFL@lh&3u8j*f~a*j3i!_CmH zpl27_EK%cXws4*B@D(te`mBQ|2}RyZoQN&TNPPXo$-$1HM#{5_kFa8Dtoikn=x zf*cFN;27HQ{<@Anr&1_BH^?q#2!A3Ij$cqIGGup1V~764UzEqsYMGqI{E~E?egK%| zYfo&0J3tZbfYDBP+1>D3TUTb5Le7I1-WtIFj4vH*u&6cPJ2z)OGu|2U{Mn3_OiS0V3_}14@8A1`nw5%myS$n$i>xVzRY}coJTai^u{WiN zi1l&;b+f-m{fZNDm%!sUT2h+gBlpBM-O%{E5W>C!NDPcST<`fprxVwz9}^e~7Ky?F z8-2CmBle0@?%?$hZfQH*M+&uT)G43O*2kz62oLS8Pv;5y2fWN$>jf$(S=f&Ij1d5w z(4MZ9>>{~ZHUgy-C-m6V(eY4TQ1*GMn51bJxq8I{rN;K=`rq#tIyJ&7F>lW7_J znv#{J;C_`3Iz1Hj2~BOvUycJK1F2d0mw#i3hmb%0xvW$))3{Nmp6p+2U8l6fZ7ps( zyl|J$sS3nhDc5_)eyP2ZGw!Oh+Z$D`Diua~GRtQYzf-saUR||qDD>5a?S$wWFSvz7 zB2{gehc+tJSN3E_#-0&8EhleV69B030i)ttsZ3eJ6^K-5`HS!Gb}C5oAjC!(uZ>eu z0THNCG$p5;p@y*sDH@RhRR^vM@M*xV-wo3*rJ10a0pQZWV_UNv(8ae=DN62}ic6Ke z6EXouyd%0eoq%Gb5er5i;SLp8cnYdM}RQxy8p7m zz)oW(`VUmIZKO4jPm`JtupBc8;3~gAVY{AjgCU$lD9M2SEpxa#hh~DNPVeyvz;N%gI=L z`i)PanUs>gBxdM^3b*qN^a^6r-hxu@TGmxwkvu@`!z~1*IXzDCa{m)|3HbHt-Qyp; z5AVR*ohCHzOtsHtelRq45_X`e|uvm?dr{xWT^uq&0W9;gJVt{+D10WE^V!{jK^77K;@y{OuJ3z6q=yj|uq= zSB*tEOJc_FOYY5ZPIr%L3a7pGGqK~_UdZDg`mvK>G-9>Qqt9x)oE9T0ux z8jPfq&a~q)_AUv1+AGgf5&~a|&Ue6%zZY~~Kd$k`+@EKOYka?=8*|B!3nO-062B2B zd#$8EB1vz{J+ZcylQbaYK6FMs9)rLT35PRh>;x1 zd-`e31j0N=rP1tqgv>(4?i*O$mH;Q-1*hAy6OXI%&B6Jk^YI|{T<>ApJUT4Ly z>?%y+=NS^+qEY8EtI^G6n3N>!tSEk^FD`XTmmlw}A?fPatEmPX!8o@oi04C`Gk9go zYCu(%OW0M{{_H8&c@FEhsq}|tmI-3UiaR~!!NHpm>3GTF-VJ3crke;O0oFm`%t^wT zQ4$V2HNi>rW4u;dHz5WF#+xy`G@&}JPM*up5NUgo%$U(`1OMklUBQdbf`la^8A zwrE}fnhavJ;k@_%h}`Fwnr)5M40xX1EbH6V;4K*+8gl8lsSG-sbwnA;fA;8%>Kz~8 z@ocaX=cWhafv)O)Ch!qcfJqU3os{X5RaE0SX+U*XkJd8YR>b`*X!P-oJT`K1L;5*; zufusUS!o7n3OMB1^U^T)#Zax&h@2}++P3!ui_$WOV;hNyJ7<00V=r8r zO93GZ_=lVhar+L)&h(|mE%>ig4m;$zP*xbh%1L~&f2|4|xQ4vget0?V(#28Sc}MKq zk5({lC&TU0&}7M@OTso_MqqCh$Kj3w_I-H9CHEhr&2L634A09;1sy|2o$4!|I}$T0 zLa?%&Y(rj#?lK0yVd{=gMBh3sk@1&6dO6X1AoXFqy|MaENqF`7X0-B#!LD8DAg`OG!`71#fVR4W zyC?3+8LUH@D-9#GgCp@OON84SQQum&Qm$8?pj3rqR+wVyY|+0Mw0}<8se@(SN-U8HgMim& zXu+H{@~;CXzlp=#e}Z8K^Y1kh5(;>S?i((9XM$JIBZEg>@9hKwcr+zuL#yGEt{|xK zA+HQnrWAtlQbb6$tUGN+PjuV0>O(4|txaW02q+R_uu7;*9fBE)Kvyr@1laU>W z;}wE9UbZ~j_KHmGpM($_ivJT&$wt_3#;@~96B{;-u>C+lk<~Ua8Qh0}zAK!gXoBl; zrYkVjgC&rNcj=HArGfB#kR~qlc(kxm{+k7vLKjSFZheX!d+mjy3e`Wb3v5eozuC>t zv+rWrMJ>Iq0erf_fC^)B;4O^Kbe*{W6y{-Z9-ec9A~>B_UpNu(_~TmR<3l?OR|SiN zZXdn4o77o< zygVb~7v03b#JFP}^PRlFgW6)FL;1P`GLLjD&+@h`FjUobPb_o~jo7>Z84HX;5E9!4 z?1^=C`cQ@qXc0Zx;^a+H0q=R1s*!B{sl~(N`|+oiKbFg=;4LdXK59+fir1}ZcZ$BB z9sOft!qI);r~*Qa6@AK0tNemI9xGXt-B7zfunY1rYop)pJNR5sgI#7Q=C)|{7x+as zAzA)zjU`)~Lf=onM zJA`0}kNSObw>$=d3V{Mc@{8anwT1CO_YprRmYJ?*?S%~TR=W*4C$L)LSqJ-TZju+r znPCzM{5;eP$Ep*Ue*w1+^Qm2jA1rIXTXb7-<9P?mJml({qo#!+82oB|dUCb|KfWOq zUisW8zd2J<@wo9e%^ih|E$rvw373=`=MTE9iT*>r+qz!~gmhvYx}#S+)NsPFJil!ZE;Gd)PREn^D@Z1UfissTC_S z)}>+PnG)0{PrE`_F`OZU;V^(3YC_Jo|* zSVu81*3hDVrIGql5*x(-MX9wv|6v=9xs9+}*q;q+neqBg^&0Hquwk0>G4xBPGh>L+ z|6}Rf1DXE*|4H~n?A-0yw3J|?VRWRJfF`;(R7IZ|Ax20dq3|xx!;FtY4fv#W7#eS`b1+Q2$Y76_t@lZ_IzbspqEdVB$MK&qLM~ z+!$8{oGfoS=FBmVCfWyN_KGh0Pda6{BWohLN-7m3>7n=t+Y*24U|R#?wyc)EF7v>Q z5PRi~%u)I-GcqJLb�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

    %K#miN%f+{GtC+CVvV30J#jVDxZ0Nc(N6 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

    syI$ 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

    !+7qDj>RH+>^A-nL8n2 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 z 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%0Awt^JLjGjZq%UDVX=Nn5ubHRowT7wa>K5yy21R9 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%0DOt@c^v<17Q~SIlJ&$)3 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

    jIT^S9 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

  • r8^8I+XJt@`X6&?<4+Fpzi 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¨veW79 zkE?-bDT}>fmq|W4K!}qY($Dau#CD(=m4zhTO7??GsF=k*HyX%|(8ILIy2Q<)3 zh1iqo*?WLzkC|Q}Dw8V-VM>4qo4)}-6E*-jcdj{JZ=wt$cp`k2os~Uoks@CBAx7vch;9f!1 zdh+H<+s4qlpf)YNi}!5V`i4tuqf8U$_BvPZ5vPtvEBVrl2hOq9Cg|C^2{!fm)w7?9 z?G3pKU!kgFW{nIhzB;0CNNA;E-Zsy7?mWq!8Fy_<5mEr{3GXcV53tK5Sux{|Q*;bj zLV!p855a?pjtC`ZkYxD}_JWY1SP0J~z5nkVnn}T-CBaL5zLpf7qlls_Y~ohBuX!}` z20iyWJ4F**vAGl>QqNqJ|8bNlH>Gy#h5Pt5nnY*EB4liaB?XBc7pF^ z6w#8?6m)rTQh=XSYNY}i#3!$_tUU##&G;&sd`mOT?wn*c5bqLOJHrOH zLXKo8jFRM+PljdZZ+I{6&6-r`Oqz)b2pqdR9?9wHh@s;{5^_V`3u3MFW<=NS*Qn~3 z6CF)TfaEdIOZ-r&w;=}vj#YBMukGfm;C%dt*ux;qz z4mQ+I!9z3Jly5({j`3ra$be3>Mur`beo?xN;PF|5Vv$>(#Esz{K|3tBfzZWRbV_$wE-|iDM462}5Khbaea%6xV zRvqN?+s{hgIP}9{<}FZwQX$Y?gYxfvQBVM-ZhrePyoCdCgE0yzaNfx>=j8P5U-2!7 zu3?v?{yP+rVFzRQcK*7cluLWMkm6z6zl^?%uereCVN8(~v3m$&ew_`WrPBP<_B*OGPwy zy^ApejhSeeQ@(>+)0eXpB#P%90?M!fY||U7?C%3BCWxldso|fCdoNYe9P8-?7lW*G z!?@@{8M&y=`iKwH8ESj2Q+T1QeNtT?k_9Eo_^(uM(ppF`WtGc(#lXLU^>&aU(;vJc zYc~E|mij%*Xj84}51Coys92O~NH@}es5bfxYlIABpJyiCX}tFcs7jBS^co~a+wyls zS!Z0FYQfUuv@jb~Ca!y2`XZRDbENW0w*Tnf#X;rY-9w1;rUdg%Cwjv7l*i#O7?_p_ zX(1IKnP9V`RlJs`z?VS2lyKo@Z@QcHE~g;6F&Owcf(kElPWkNw1`p)S?O9pGDQpk`_ceUiKrVCG|gH~CYk`kW8WBw&!SOe3L z=`CB;0k8MPjjrCvHdhniiX+ZPfzceIClJGujxPobco@D2iMwMw-FER+$9`#uN)T50 z@YUhxL#I-NnI^8{X!Etx-Ga%}5X(z-ktGe2b}K@K*G*J>6eiyLr(a~7hEPLKCG1ji z_}V+BT7`)yLzey<8HpzD|3}i5$3waO|D?Dj+`eSVS}MvGLW8l?MJh`v`%)2ECwsQB zUAbjX$Tl-kC|h=8o4SRuj(rs~nHk0y#_x20|MZ%US)S)S=XuUK@6UU|MMrib zT&xDRU2Sw=V6(&2uR+f*P0sj)4GX>uN76$#G;e4tYy^Erp1Re$TM-{t!3%!eqhRX% z@pWau3k#q`w|#iaya+A^rK2*q6I`v)=A;4b`dkvXF>6~^!U^_!I<1Mup~;Rjx{SD= zDLsvTjOf4qzbwGK_`58y4^Y?VMzFu`v^4qQo94@!YW=L~l*!-!@xxD!l{Mv!1+|*j zX}9$jnH@C1Fip&&HZzY4CGWI$J6{Qo59rC_%m$PaexSn{@%iNRFnjWTo{N>WpH+|V z;M)TegYrDB@^1pn&wOM2-b)Um1^P>RZ`x58szaKy7akIiYFbm5*tGz!^e$c)1SUe+ zeB-w}&K0cAs}Z?1@2Kv3mcaCO4F{LXBEqii8k#RneF&4!1wZ?&CM8)=?9+VgDXoQP zWnA1Zqenm7vk^t*6{Sb{{ab$#`0n4 zWXr;6V7w#&Mx~C!M;?>8^3aW6q0VdxTdsV1NqF*s$kuK)2e?J# zTW;sai>n0y^pBFj)a1G;RmwHJ<8z-pX$tH@D1yyzCC0IIhbDoikr77bOTN{{cz}Si z2BgJ$=7XfBhc0nrH>*-VK3=KpolVuZ%9=v^_>CjLklsSnb|f~Mv9W@6-7i&B*Hy*q z7hHiL*5}&K*CjsYLq?4F(_YArl}V7-j}K{vQ$wn5LE>GkvO-eOTEr)SN6- zqkcn{E{59Wz3fla_U~Ovyyd-~2HFN;;zcNv-QLGRCv8XhyuUeWslfR=K+Ez>z$%4& zSabBbjksI;3vfI%-Q3iz`Ae$UdJI%bXeJ^#)zPmZiyYAGxF~1?Oq|@TB$W1LRDr8o z(}I8fp5!m7-~{hfm`D*B8T^;zhNAY@NSO}VHo~75m#dobwH52nGW@NoY6l}AqJzN( zAbucd!)~Ho_xe?u{(05%p@`=Zkg!TU-du|epMlQM>imQVFuD_%!IL+s1+;j*<;sbn z=1(>hsa+%fg(+j*d6`~*T9oPgM;poK$>J;A4vzHOjygtz^J7vaL(RakYli8phMQxP zw1eaG`|CepNb)*H)!{u6;h`b)XBSlZ4}H|6uJqzppK!8%o>k&5|H9UZE?dx#?jb_J zJb29eSHxJkUQ&+G_yd`92Z;{oq%4VXyJ){Ci7?@CBmQk8nn&Xu;O6FCS-qh?2346y z9jL;pkZ)rBhYzyDyh|h1Ta6A}7wSi#=fR&8spGeqjKG9q=B;7A8%-93oYarToV*p@ zuAz>kq74XDyi*y9it>6vm-<7*ndjhotr(7dE0M){@@B?p)l4utfmkjjs1a;jJ zR{58c#lVuUwsjgR~s=yD23zTR!Kid6jntQ`u@zo$n4ThovA3k*!uN4_6;GyRO^g6h6aq@~FFEIJ-G zKdVgVQq&2}=Dr8oX9|7ehW_w~%3$fO-BV7A;dC3Hl7vmC2bguWoa!&)`$$;)v-@Zs zb8SeouWhHAJfP>HBFui;&6Ajo7P9lCsjFbyEkl334o6Qmk?*gkBqISMBN{nye{bMyPhN2B&m|NSOBa_BzRNtIH~Y@VoLr2b3yHa)fNOYs+v-NaE{>4n!#{mV z92Mj(E-Gwe!$X>>e|bzDV`|q{`DUs=CUQ+g$M7N3q&arETU}qFMfzQQ0QIqxm0i)l zsG_jkq*J2qgW8DuCGB1XpVUg9HqTcM*S@Bxp$$Vik#tvqedAwx*98@J^c^(UfBJWH zHJN$5mBEF-=N1l?3E_K&sQ8&MKt04my3B`z{q7mv)>DBiDUlt3NBQo+rr7>$$Ljok zvmp5hnhm?3_$wL|q07zjUOmcMDiln#5id3dlXtl2OWzI(<=K6&e10!ez=|mO%-~>X z2ekuvqO_%|W0)EAUHcfX>+4M;1X_^v>Cx$klF4qzs+RdQ$M28Z8Ap%&c>YT0p6A9Q z29U=?4AN!gu}*kbRa~~?`a91wxqe<6kY%{{!EUn*xwaNA6_i~UaFkDm;b#@9!uo*U z51`Z)x!pe#B?N4tqO|Wo0^bTKIz{O|W3Tfx++U>4ngiJ<9=39xT=?*kpaM#D{MLk* zXjuv0_zjDCtVS}J^AO#~AYwn~NAaMM!&kvxe9(Q=SV58cLhh81 z@MYxRpO&IV)lvkHx5=ll-erkN2$!uTZlTJ+V7oR$r*z{yd^4jBa&dznS7u(^?t-QV z7%f5TEJ-a2SEk0C%iqZM=v#GHUVZW0DtDMyy@n!iKWh7kDDJI$RK|Xk&5LwQ=!N1P zylYpBZ2g?$y)?Y$kAF3k#AVzU(($%wNbz4bGq4A~8T%YtNa#$g3RHWHyN-Q08#?(! zMXDL_SqU|#c==DRS^(giJt2AH(O#sm4AHLs-yKb!kUuxzI!2)~?P*yFO3-M*5nh^W z{Y!4?KeiO2fw;l7;Z@C);on09AWNF|nI^bluFy|dppDWRefQ@Rb8Y{Qw6MroY+h?7#Y2ZwO35DTgZP)jKsB`dEU;W8JCUj)g}~85m4#OCIOnwwK3f zYmSeG8L=O>Ex2Fti_H5QzS=Hv;BNYC-SKk?-`G5cxs-M?+E5ishgXze^wo}~xUqf0 zbIRLgapG;!bmyZX(@hfcyOun!m_ZRnh}sXGERn{i@LND6DOnv+U9T`DvvO23(2rjk zcQRX)I6db54$sWl?O~U-1J6I-F-L?-5x1&|Jl0o8(b;kQ4f(Bl!8<8K^9~MMzV}cB zPZlpxOcnRXv-54rj1wSu$)IdRQKs{{prv4WW|YSr{gOUzT4B96F>70*3C4dzr+RMY zoExBor6h~cFExGv*0-`fGja1Dvgd?^09|6Om%7csdi}4}kc&z9S>QYJ{0Z536v6P| z9$lvv?9t(f)7lHGGB_eAAv0x;wwp8=W9A!Zv3rX&D7`mTen=M7NqJ`tYW{tO^JT=X zMSgODC&TLR#A`fg1;+e<^fWB;!4`j1W7ly8A~7 z&@6l!9!pu85l8?{^B_E`*GaoZ`03QelSkj#atmuz6UB0=FVFbs(zg1$QUE6T2(~v6 z6euo*itYSmAZjCVSoGGXTft<%X2OS#s9nT6r|NgS#PFqq7X$L&nmz|W!5ep5baPLI zdfzIc;{XF-b7-I03hd$%kg55wmC|2&!>^>EIhDp%&aT`PW#d>@kC= zWDPB>!O-~qjiE@!pDzVp+Jtr(2=+{)-aMuj=3Y6wnD8^(IWpJ8*4L^q@&LKwyzG*8 zUQnUC!?oeFTAU>6s^52m9LA0t{5G$Gi?kGXOvOdgp{@^(K{-PjYWz^t4tizg z4G4RR@%?ZmckXI;WnkQ+h8VyHK$C!DWIz}xTSBoQUBK!aB}+!m@h^c4^iX$hk2hZ6 z28Z?hPmh=DUlC+iCy=m`j*Wp#HjQCY_GAyl9%>y#A;ZJFcp=??w9yo|b8YWOWgP4Y z*6$TXJmS|e3<$E4szrbqdaJxK$ciAqJn5ED+)y;rNiKcKPotV%%!%CeYkG3f4D;pF zF}wq3S8{DOyG2>Oi%@bK-jXupRk#Vw(H^d?kd!@G`0+|lWWL&`XhE75_bBD@>)F=? zI4y2(aqv7#ImdTymcO4I-Z>f<99P^>(qy)L7MLa!E;^~zIJHH*E<}kfYILLqBf!** zNpCrayG9_oqk*H4pt6vj=kG^}=d4B<$#FgSjSuAjKD;JpbO2VklI(vD`s+)jHj;@v zUE+L0)3!71jnUU|?-{X=TyNR0pdF;G3TrYBDwT~h?CAi5Vj;-KcVs~i+0PBwdh2Yf3Nd zB+V7V0{H2w!SUCqm`;-&PO+e{OFBbi73!C99vDAQ%AHCH7C0}j07tx$?DZx~=2%!U z^x9H`)0E_~G0$x$^w7u$S9FY0mm$eCNmC1}r)|Tvf$)h4i|$-OVJiBHZy)R~&?&(p zT-x_^a9Clm<S3^*NXkSG;Vu9W`)6ULi0oRO)hD6zYxNAF12*YNAD`=Rrg|CN>Iq zg=RiVJMD(kOW^D0KJLr(ONL|4lemszRNq{H2K{3yTAo+PsH{>D#A13hbH@x~8u~(Y z`KRBE{(IemdI{{9*|G=yHFenwfNqnwz%@cA)qhgy_|5gOe@!)^0i%H_QNptzWu9A@ zf9txMW*UoM=%GG`9RneVfFnP!OW7NCI==V@7%&`{lv{mRQlTu0jVYbLpw~ZH`%sia zEqRniXG4X$3C5d7arCQ+D>^YZH-THhn$-18`4S)3R>Ln-@8|xS`T~fsc=BCGIRD;5 z(9?J_=;^e#g2D?tMA4S225TSuw#82IR_sQ-LwcF0u!Fn}khWav0Oh)<8RgMC1R8t! zM62Q3^=B_$Am}Sxi5TYaI30loUN|ez*`Dq_6+o?V!MtuN3U&r6tp+&xVKIfL)$m6& zF*_@Gu-C)`AFcsK4YP-v6p*^0|7yr(A3WQ_0l+xS{*<2DnFNf>(@QE}8IIp<^QrJ9 zc*90!^HuNR`KL=KhS~{wz#2bT@_l?}xW2i(!k&~<^}w%GwChiZj?vqxx|)-nw&3#^ zzBeY3HQy)e74um znkDIf&yWtGab>-bwT|eofIKx7G|ph)eYD#_%^p6ThFg%(dL;>7PNaQZsMq`mUZVA- zOsUX&Zo@}kW~J9Qd-;Ng&W4u{Zsb{D?A&s1s3a@eNa&IlwnL^vEHcw3a&eGO@O<;P zwAE`u?<`UsB85`G{nHrcehFf@)C|>2J53>%fn}FIMtxDW+7@B7X|zFi*WF~-v=!L{ znfn5T8BWDYXabo=dX*SAuF07^Wnl3k@y2)GvPIgf~&Q@w*=#SqP-DFvO1P(CM! z-CU<1M{I=HCXWK3mTm9zJO`wi=*Q?$roBr1nx?lfT3%jVylC7Lk3Hjx%J=p;U=)O` zwh8)=(!9?+sJ#`KUYu9v5#zqH&x1%4DuYPEK^s zJFw0W-u2y*R9tWYClPswaZh?`F4My53G}{KN`U9Cp<49&Mb|bE%F$uj*R8C>>_r5| z?Xka!`mJL%ut(;7mYE~qNczG4M)z0 zEOmFmK)MPGK9J5N7zrvolKLWzH4L0H=T&f!GD;YFK>Ug31W=rP)l;instgGEgeVvi4P&v1B@Z4!VUP_u!>OP-Us~?Agm1H7{+Bv@qgHR!W#11BDVR@cQYY9KS~rJ6Y%R2A{oA%_ zW_4yprR+tyUBf$pPUppA`ATbiW`=OYBdlea18YZ&Z>{Cd`65tA+twOobri}TNc(Ew zvd1<@oE;pO@!3e=h_owZlGemuZ2)=$ce8h?Y5al&40Bxn&vK^yz2|_s;AeLR+0M0@ zWEGWxaos_h^p7!k^J=bKLcS$&ceUs@rB|T*a9nWL-T6+UXN4v^RckO=^+F4}8Km*d9?tA$-w2d9)-*y2hZ5C&yF4;tsWr`AA zg{BQ$HSZo=Eh`fm{}wVRk-c0Q91p^54+3_%Y9>t_eLIY|qp~4jlKT(?G@o>^;$lRV zUPt2n<_@d2uV3)a%vlJvKJo5xx1s1eQDKtKcKyHTt3{|AAyr=H2GCx~Trj1*uU2jz zX$H@Q1Bac11`}1asTx<{m;ZY2re7b7pJm7iDa@u(D$N}WEUfAw-uv^oHwrFp^? z3_vOnBEowb3tLTfm$!Sl18eT|K6|PMG)y7-=3Uu}_R=?fs^+vo`Fu1HeAzo}#aLomt<}KYix2}N<;37H4$>KJX?nR?kK-0i zegh$Qa<8H1fb$24$lY6Pxdj%KL(_eavs1M#wPw61e|cU2d#!;HQedqzLr)3p+G@O) zvd%f4FZkZ?(51Ddrekz+wt2y12LWaR+JZL;c!%O)gsnAw%il!+XRTcqVC|)A5OlCF z0qO%wwskfePym|H`B-}*gwT5BCUegIb&I54=9y@e-B!C-0tJY(Hmjxb_qv*<1K149 zWC{rba?>cY+0!fRG{7@@b5kF4AW{gcH`gKMR3T&D2?{G3;7j-5WrDBiKdz79OFPGY zlA3>6tgqWxG+8>VlQ{Op@X8do0xQtSEf6C za>(&l<>aV^tY1yFpUZnsTRh{PCd)!MhjW4NlM?EAOjg~i zPm;;ClBiN-9)PWAO>nau?(sDZH*gGgY5yI=`I9lp?zxPZOBZ`y0;GH!p@Rwv>0ar(C#UW_NL*$W^Ue zZec&AOFkoot2VUQv#G|Xlo)G3A|F@y4bEE|57&#kwrXgAM}0w z*WAF?$ubZPPi_>z~RxZoS z9>WL6IrMog>En{X{@ZhzTQbl=0j~bCspn_SUb5DDT(6knf*a{ToNLc@M35%aV|8Ti zlt<>1v2|UEuw9Si+jwt!YN&BRR=dzaPC#sXkJ=^UI5D`*3DmE~&*;|63kDoOnBU*C zz*tK?y%=G*bb88!<=bW-W#czKo|3s&5rgW-UpoT8t%h=*yfnaQCs_7%bG)GjJV;&*r+JTocCjsljtlHo%gET-Z zs=M>27&V$FLJJ&_@$}z>=j(dfeJR`rli8m14~Pd&_oApxtwU446QD{a*GxeQb!5 z+(N%bXR2tYuHAi*ooiHkp+*M{EIA^mgQ3kq9ji<2svu>vq(I+1Jum zimZWmQB9yp%Qf{vkR;5JWtc`sp8$%gUS97{7pD3IVakyrXHYH9&(b@QB_QlZ z$~L(P$6zx7qII=8$L{;pzd@ENG(lvmN}!CF7@2xrBq9yy2@$xoovnWmfIS0QmP@8V zfS|Y^`b%b&&3vqjhkaO1&;Uw3qMLmK6-2q_Mxq|}wP&^dqYt=qp9V|_rxpZw=iWc*x8%*<~WYcTA24oHO zw7rsAbl4`fmxWqT9cWXv*nB|NPCmp*THzIE@}#WW+H3Dxo_gbR360FxLw)b~C1g3V z6*cPv1h~IC2VO`Rcue7;RWzd?K6!K!ox5hs-{%Bt_f-ZriQ<4PRZ{wqAnI z?*BYtITBGe1?aFfy;@O6Dd`I!8;GK4C&*BVmQ{5npUx2kgx4B~WfVCX4a*|#U0v+~ z{M_iJ(>XXIx4n-^+9vJ3lLie~?HrBaE4`^Vna|%sP1_JKs82MctghaUwAEW8}_eTDxB^^2%6LfCz)3RhLkh6GW1Yv6zk*4Zr z_CcQcT@p(oOMxdtGbiA$1hKv)$=iTC!q|}6P>yCAWCKpKzK?5uIH7?SH_+kpZK2cRmAZITV~Ft*UGuZgav+@n zO;6=5f-0(Z_m;Hdb8{qwFRLhf5r!W>)@TPoE5}`vUlCJkpWC7R_KXK_9K4a@wKE2G zne7}WL>F*^eZ?o-$+Xkb=6rLS1jNHwhtE7k*IZ^gX1Bp;2{pjF zouhp6cFwxLCCC9q5bI~Y~ zpfTxJ;9^nbCi?x}4ha;%UhCX%Ne4d4v5<4*s1pg>ufTI7hgaHZG~5Xoa9m7pFk+j4 z4CJd*pWdqR$jQCgIl13bGMd`+lGFwgGU-88)7{bM0Hu&BLm`P6Kw!cKLyJx;A@hHU zmWR6-UzqqI1( z4F}n6r7sYcWUg>V*yBqZRJf5$d3a3ocxi_mxXq~M1%2s@|KQhRmDlLrkeGKu#Mf@M zV0#Vz79&^vC@sHdSF}jBj8ZdjV;R*yeC)XESE~$9^|Of6CvwC72sau+pSICS$`W$N zAuBK2Y+HWR>`pd$E$TkMI8;GWmcfV{t62SVs(-C$(5c=E7_pd&zSl6q^`2L}!g|t0 zo71?0#Xj!i2;JOGVFQ?jp=dcP{Fh8L?FIR8UbQo&g;Rpm6L*%?w!K3Lxd~1teJY0W zrSvV|_@0w0S@pK6pu#ihp9YBIe)!u!I7E26zgY2%T9j>(VV~=G&)f4S{6@oft)i;X z`G@qDTKjXWCOem?k3KMO1!1|5Kijx*Y`O)&*aINVLs@k1uPg-Y&ofZjGN(}y9TBh! z;iNdex#gi0a1m|Dg|j5Fh}}1AGx&t{{l^Pz32gtyM#V9%Ks|kRg>*p0Or+koePilj zSq5AJAks)cr{o8ssTd42%Z3_q8nBQ987>9|ypBBFS{mpwzN|I6FF>o*Qlj5c=e1V*(JI)aaIPC;*1&`Ymglo@3TR96GyaKOk% z^x(TWFv;CphSYiZ_tGa2j5voumCx^yf&>9I0-c76O?FDH)YBP_Z~?_n~w2% zYhvt4x?t^Fz%uHA%7V+BqG2-inicOzoZ>DYLOePOndFaSUsLC?!fN5((Un_0u z!Bzv#t?$_Js10>`V|H+wr974?CULi-2=Na*gQCV!h0a-H`H#;yHoI)hY)5#v8m%uE zwUrIr&@MM17Wp-M0@4k90nP4p3QUkhYLC(;w5k40KhrkrEyJc3eEeKkMhHLqqtVEi zhb(ZA4abKJ!seAruY%IL*F=Lf&5y1Al3TbA7V$KiSlvT9#jEf%MXp?b)NlVIm@8u_ zXTwsfzg#ukZ&VreJBR>8yt;HpFXso%l77~iqs(w!z&K&=bU942N`H5*rep@p1KFv( z!iy$|_HQv@w+zZ-NJw$^!tWmFGr(VKey+QD(@wTtirq1Ic#sV(bB>n z@Nm!B9~2RVCwren*`No~;$0m7J%6yL^#kqdL+ z>TJ$7X8(eMFRm9X`rqvOXCVd%NAk+EVOIm55R?!s@#|~{s);`6q+0`0-t>|d&EdtQ z#qb5k5Z!Lbo(M324w|+JJOGGzTF({bhIDcdaPdy_`e4IO0?}@IrO6w0ehnwDEV19i zR*tZwtQ~uy5Hfe(`tF@H$Wl)M9Gu5g*$ymZ&E)YYKj0pX1+w9KpFos%5c*z!RMI=q z@rX{cPncMQk>7FwI@GjSl=z0KzB$&DR#e9lC;@Bm{$}vT9uP#VoueA?cUg6Luu_a3 z%gEnNYl0EYF(dM_Qc1Rd$cF97+e*qd*X~6;WOS)j{XE1#Lo_Dhw)dPSH;3kD4oo03ZMWWkW#~GZpC$E z&dCO;{?wukHTo4?=E)%JS48{~t>)V$X6SJusril|+NW9u_}OiRTzY=!APtyex=InN zzdDO?mt!W3TBY#G;AV=hX|u5{=PJxc{U5yzag#R8A8=}j-eBKQgu4cj7A3a%=(q28i zPD-T39iBR}Olt^v>Z~GKK9c{JhISi&%T0?6d?e%1d8YY0p>b~nnZ0Ko96vi?eRI7; zK^_a6vmHI(Jo642(79kPkEOzW6wzhHAZaYX_4*UW59znyYNvBxn#>39B#2j4-sIq? zDD~i|Hrn1htoPqgE#Hb7n_Bk)eK%z5u#QszeP+7zt}W$rq7YQ7jKc_i8y*w2U8+MoL+i*Aiol*K}3hifx)SloIQsDLi5F)j`NMw zc7YI73|v!mb1- zoY0=MzwZdMUkw0{44rgzn?1Grg{;SQl@+A>r`Vf2t${Q5E;tzXSZ^& z#Vs#LNAiMtqKlx++Fl}W-g?X%f{VJs^6S9(!<`e({dor6W5fKkwlq#;_zh%a1lov; z@bN?lQ<9!1%&YJnZ*L-bfWG|>rwbklvC)_LVVkd`g*8Fk9LyCr9xkle9EFO7CD`jn z>Xfer0b_73f==Z|{{$r-Fc8BR&$tBj${A9$2b9s;W=~m!lpB^qGyXr(D*VXxmcIDpUP^<3qxP7%#TU^>OEFF3fz_(4U$7 z&Gs&Vg5^_Za?zRF<6FBaT*S#{#Yq0dpITrI78*5Zd#z6ma8})swck7i_D37RDyTW~ z9mMH8AqO15M&_yKhU_`~Ft`s)h52pYmangHqqlnbl2Tv0*;-hA*7j2N+$^ao)Ezq( z=)?W-#9P$#JdsCpRyELUZ;<+^0`^8+amHHO>N`AB@{&TsaJ>N(mEtMAW^*!9t0Eis zucM!|;w$I_do2a)ZOJ!h>@;|D1_IL`pk+0diViB>zpzi2Q(Cy ztbye1;!+;F4|}c_R9?hDd?3BQo zhiKV!%1O(|X1X!ZejdoTlvnl}%1WZd00fFSpxc4B*9S|&R~MZlU)4orIPQ^QRK3qM zBa2N>4EO$iI`fsVv7I7h!t@}2~{`GhE{HUo_O=L5cVH|aMG3w*=N~DW^Mq}A# zP9x1xZ?(=SrARAxAot069aCm^SnMd1tes1KCFAWYg4^-Myb?Br92X6AkavF zc`2u`bBY7Z6jCXAjyj7nPmh9)*-Hbc%%eZE1!*q~*!q47V6($A@mAsN+?$KS4{bZo z@2rT~fZQf(j~GOZN5>?G+Z{?r&MTy^smYkDSdB&A%{+z(AaW%}36;spU%9jS2__$u z(w)mEe3g0g65p!8(L;gJ5 za+J$E3Whyx$6321Gv01KaN6UpK+u0yLbwln<$yBi*Tw^Rm(Ki`5qp{-bUS&~#|&u3 z)>ChP(Ep|mq%R?Q>d~ldAOj>7{(OS?cr)!j`4EJdp^4gSybnNQ$D#KSBI4BVz>lXc z_7{GGB;)M{IO(RX%EpUOR5xo{B%%p;SY%nwO*GMFa-=g%^`9pqiU6`fOc?pG<1{Vp z#tD$f*?mr}21l^$=D0FbAe|AOx^XvTpshec(1yhZ<}X|Ab#AG&F}FtEIwvc7ptYMt z(kG{kXxB<-e`;ImSMnjv>L8!FB?X{z!;PFK6)Y;yByR~~2i)3DOZ)gP9?2H;rmf57 zxauuERR;zZdJ)~+7H%w5_pHf?1uHkQ~Uju zWIO%x%@EJ64=Rs;e0ZCwIuhBM+8L71wi-FKSx$%!liEKYibi@5J3BUH6Q9Wjlo;j<< zu2z;E`;Zj%$1jYcfdWzY{?@82M|sZBIyy&ig|`tIV}jc~NC7LgtGw!5=LmN>uhe39 zgQT7gtVQk`i61m=BK;m6s3Af=VV8=`o5{`B_ijG=QlwJ=o0xf8p>Qxij1&{RD3cx( z{rY*yGtL7&Sq+3W+jbx2_qT^}H}|dqWf>V7bh(Rr*Og-Gx0(T5lrfVygZ1@aFL{M& zRi8fZnhg;$iM$i`n5jzr>CP0O_E|J>jb=|rC;Dvchc0+jz>88vXWQGN=LVG9#V@>P z!VSWFyN`Gu?Cqpy{E7QJh1Y#@guGvy#zB|L183!^+xyLFuR;Sabsy>b_IJ7l>|{^y zLy4`1r1i^7l_K-QpE@)bWecD4c^_15|NGHpYcpLRCa`|P^ zHfaw}pg2yv?fMq4WQ6OQ0b7S*F2iAlbMAE=@{XMA)IK7eR4>k5zOR;es%dqt^`U2p z@`2m!A9|qMqi_GfT)U>1s~~NK4U_VjxZ^K4)lcG?m>E-jr&8`QGzD-XyBeoAb#F=f zz!GkN{pAO|b52odJ^ZEt)?a9E4+^WXVpP!*4sSpGNWyitzC94wHS%CbwIeYMO|C0p ziXv8@7c3suu3Vin)yB3n3%{>$YEIgeO9Pu>b{^J1+U?2hNbDt%3|5ECfn9{jRn)V> zfY`NV&x5NerW)&h{h;S4J9g>U=cqZgv9p~??rryI7+C{_2kAL~#(dN*=?DX-woYMU zS_S5^Y&T;oLlO%(rUWkQjY(HGO4X$6JHjMI6@4RY(Ri`E%}IOnLO+lAV^Jo*)sj(J+aptkMXgZEj$NXMya$Ib4O z1TGE#w8#G&4dcN=Ep2)xFT-0dfu5f%k>@0Csw#SJYwQB8V^L$GiNN#tGz{@jVrAyq zpj-XWc2Vk2*RF$Mwc(pUrb)vptcYC`$Ovg~{#axR#i4<^QIqlm2;pd(0e=bRk z?>VGB%!EsZ5+n*y& zt#Gj##FIzWV*6b4z|YN|5W#7=ndk7+(E8J8r(@}sBU%STNv=r%2oKMm`doWPN)}0R z%Yzr~Nv{1Pka0^|JWlfbs{%DxUBL4crNhsiFZc6x+_f6x#k9W$9r#MSq8{Iq%-b^@S(C#K>+|3*Q zP4z_EFHC3O4p{xkN;rIviFB?t;$jc-)mFfiKMpF0VrO$PFsSY9zD81*u&8j|!81I6 z*ey13dtn{w_{5)y5nW>$h%#+3z?9X(xyo-W<|6i)uEdkSsctO8GmS<`{U?*|g`6RC zYv#xR9ocyqg?BFZW8glG+p}dTx2hWvhK);tYwahJX{=1?j4|qj=cVyQR-%4JKlQ#} z3Dt7fu$21k(_RzwS&fbAo$%}i->xR-RI>bZzJ7)yJja}6eo3bM!yb(uYdy^CtzZDW zivSdVt#igv4&&?cj0cnwm&*6w)`LAwc#P&{Qz-Ay8Gx15FZ~I5j2oc$aj8#@j}N&m zCX9ytvdL{XVxwHNV_Z~ZwE;+Gri*zvI1qUUZFI)R*@u|wI5OEGCvcx_W(Q1ifpnOb=K0jZK`53DEQy&>Pu_ZhFpDK-UNQaR z=RVSh}$2Cy+b4nu*v(t0Jhtp=|wp7nkcqCw7RB9^e>9k({IyP>76tH0p!m8 zb`=L1QtaaTqQHLF5?tT0kJiXq7kC$ieqP7O12deA9VP@DjoCd+z_EzW88%W(-OK0x7KmG>=x*BGyGvz$z`wRXX7SGZ2J>@21ewyt^|B#r4Q z*?+eKq~Woh&IcE9_p7eSV5xdne4kbs1Loyi9WHmcStS~EAuuboIu)4zY|Bs@+IXAV z<~bZUja@@HT3oB8DU(mQ?n291?I4-`ZQ#XCTh$n8tZ)KlDxvA!CEifL-BQm{b$pFm zpaJ8>R578Fz(%03%gWj~@5YGD@4HyRI|*t5w=MdIgRVkRrGXCHgu=Aq|5`?a4*%D} zArxAa{?{@VRH`TIlZu6GLf)60uFPC%V46|SQO*pF{(P!pmahs1w zk*&#O02YdxOGMj_@_Jvw@Q;RI?cr14X1{;|HC1y)TsxvbF(t~sGaGEOSjts<8vqcP z3=ZhG+_Fxg(4`x>?v+`%%onbUeBu}U$dAg1hzsb6!|Z?c<$gl!`9YxnIM&GJK3Ikn ziIE&=Y_J6C$vjIL-^U$_5F>q`i#!hXkT;^Fqv7rSl9=p;sg9==cg+Ns$5pI>()64EGsTEE$*SpIB8>8#Htw9M z@3H*dKn-MYZmK>JW|i7R8~`nL9dFcw&ea3?xg3EEyrjFw1L>?@uHzr-)h?$y5%hr* z;DJ+cm8B_f`3t9M*rH5?AqTyJxKbb~iwwiHY%wsA2;hg>Ll40uB3MK&7DMoHmh-_= zqi|pV`gNy@p<+^lMaVTVU(AxzVALP4036mym|w1#6>0%VbwSda->jbn+{6U}Qrz

    7^z@fNedEE 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

    Uu6OW# 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

      p2luUEJs;B4rcynumgcFsxhI}2W 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

      _9}gS?!;ua|#p$bHs@QkX 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%0DgCD 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⪼h;9C-DINI>?yS#>p{(Q$wtf=qpt7|edE`R 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

      &}q|zzoPez<|0Z_CjM(%ZVJ}BcO}K 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

      2r`1x1<@` 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%0AFynxN7ubj*mJf~8(5m%yd*uz3`6X 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∾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

    DSLJk?$0#P%AT|R7FTZCwwRTAqT|qH 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