From 4283f236b47bd01ae5cb8dfeb90f61ce678e3f13 Mon Sep 17 00:00:00 2001 From: mayer Date: Sat, 24 Oct 2026 15:59:47 +0800 Subject: [PATCH 1/3] feat: add account management, 429 failover and daily check-in --- .gitignore | 2 + ACCOUNT_MANAGER_ACCEPTANCE.md | 92 ++ ACCOUNT_MANAGER_PLAN.md | 49 + README.md | 102 +- README_zh.md | 76 +- pyproject.toml | 2 +- src/codebuddy_proxy/__main__.py | 291 +++- src/codebuddy_proxy/account_checkin.py | 815 +++++++++++ src/codebuddy_proxy/account_manager.py | 872 ++++++++++++ src/codebuddy_proxy/account_store.py | 513 +++++++ src/codebuddy_proxy/admin.html | 1282 ++++++++++++++++++ src/codebuddy_proxy/admin_api.py | 519 +++++++ src/codebuddy_proxy/billing_proxy.py | 33 +- src/codebuddy_proxy/codebuddy_client_demo.py | 349 +++-- test_account_checkin.py | 825 +++++++++++ test_account_checkin_integration.py | 171 +++ test_account_integration.py | 289 ++++ test_account_manager.py | 788 +++++++++++ test_account_store.py | 320 +++++ test_admin_api.py | 426 ++++++ test_admin_ui.py | 763 +++++++++++ test_backend_profiles.py | 10 +- test_client_login_management.py | 176 +++ test_rate_limit_proxy.py | 555 ++++++++ 24 files changed, 9153 insertions(+), 167 deletions(-) create mode 100644 ACCOUNT_MANAGER_ACCEPTANCE.md create mode 100644 ACCOUNT_MANAGER_PLAN.md create mode 100644 src/codebuddy_proxy/account_checkin.py create mode 100644 src/codebuddy_proxy/account_manager.py create mode 100644 src/codebuddy_proxy/account_store.py create mode 100644 src/codebuddy_proxy/admin.html create mode 100644 src/codebuddy_proxy/admin_api.py create mode 100644 test_account_checkin.py create mode 100644 test_account_checkin_integration.py create mode 100644 test_account_integration.py create mode 100644 test_account_manager.py create mode 100644 test_account_store.py create mode 100644 test_admin_api.py create mode 100644 test_admin_ui.py create mode 100644 test_client_login_management.py create mode 100644 test_rate_limit_proxy.py diff --git a/.gitignore b/.gitignore index c209091..bba3e52 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,8 @@ build/ *.md !README.md !README_zh.md +!ACCOUNT_MANAGER_PLAN.md +!ACCOUNT_MANAGER_ACCEPTANCE.md # VS Code 扩展文件 *.vsix diff --git a/ACCOUNT_MANAGER_ACCEPTANCE.md b/ACCOUNT_MANAGER_ACCEPTANCE.md new file mode 100644 index 0000000..b7bb69d --- /dev/null +++ b/ACCOUNT_MANAGER_ACCEPTANCE.md @@ -0,0 +1,92 @@ +# 账号管理改造验收记录 + +日期:2026-10-24。基线:`origin/main` / `83f60e90eccf5495356b97cb2def79533a38d9a5`。 +分支:`codex/account-session-manager`。方案见 `ACCOUNT_MANAGER_PLAN.md`。 + +## 实现与委派 + +三个子 agent 均按用户指定使用 GPT-6 Luna / max,并在共享分支中按文件边界并行实现,没有代替用户提交或推送。 + +| 负责人 | 交付 | 交回验证 | +| --- | --- | --- | +| A | 独立账号库、两步登录、原子持久化、刷新与重新关联的并发保护、失败回滚 | 最终定向组 31 passed | +| B | 后台登录任务、取消和关闭、容量限制、仅本机管理 API、响应字段过滤 | 12 passed | +| C | 管理页面、双语文档、包资源、页面控制器模拟 | 页面测试 1 passed;wheel 构建及页面内容比对通过 | +| 主 agent | 启动迁移和选择规则、请求入口账号快照、三协议和 billing 集成、独立审阅 | 集成测试 15 passed;全量与打包结果见下 | + +## 已确认行为 + +- `/admin` 与代理共用进程和端口;未关联账号也可启动,管理/模型查询可用,推理返回结构化 401。 +- 国内与 Global 分区,身份包含区域、endpoint 和 uid;不同身份保存到独立文件。索引只包含展示字段,凭据留在每账号 session。 +- 页面支持选择区域、打开独立认证窗口、查询登录进度、取消与重试、关联、切换及删除非当前账号。首次关联自动激活,后续关联保留当前选择。 +- 继续复用原有 state → token → account 协议和认证头。只有同时得到 token 和含 uid 的账户才写入;超时、取消不提交正式账号。 +- 管理请求校验实际 loopback 对端、Host、Origin 和端口;写操作要求专用请求头;管理响应 no-store,账号名以文本渲染。 +- 默认恢复上次 active。显式区域/endpoint/session-file 选择匹配账号;无匹配可空账号启动。默认旧会话首次迁移且源文件保留,删除后不自动重新导入;显式 session-file 可重新关联已删除身份。 +- CLI `--login` 在临时 session 中认证后导入,不会用另一个账号覆盖旧会话文件。 +- 账号在请求进入时、读取请求体之前固定。切换只影响后续请求;旧流、请求重试和 billing 401 刷新不会跨账号或跨 endpoint。 +- 单账号并发认证只刷新一次;旧刷新不能覆盖重新关联的凭据。删除后在途刷新不能重建已删除凭据文件。索引写入失败会回滚磁盘和缓存,回滚期间禁止其他 session writer 进入。 + +## 验证与证据 + +自动化使用模拟上游和临时账号目录,不调用真实 CodeBuddy 认证或推理。 + +```powershell +$env:PYTHONPATH='src' +$env:PYTHONUTF8='1' +.\.venv\Scripts\python.exe -m pytest -q --tb=short +uv build --wheel +git -c core.whitespace=cr-at-eol diff --check +``` + +集成阶段一次全量为 **324 passed / 1 skipped**。追加并发、回滚、页面和请求入口回归后的全量为 **332 passed / 2 failed / 1 skipped**;两项失败均来自未改动的 Windows 进程监控测试:CIM 查询超过 10 秒,以及退出时间与最后采样时间的顺序断言。 + +原始主干的独立 checkout 已复现 CIM 超时;退出时间测试在该 checkout 的单独复验通过。账号改造没有修改 `scripts/watch_processes.py` 或 `test_external_process_monitor.py`。此外修正了原有跨平台权限测试:只在 POSIX 断言 0600,Windows 验证可读写,不把 chmod 当作 Windows ACL 验收。 + +最终无并行构建复验为 **333 passed / 1 failed / 1 skipped**,仅剩同一项已在原始主干复现的 CIM 查询超时(`test_watch_discovers_real_temporary_module`);退出时间断言本轮通过。没有通过删除或跳过测试来掩盖这项失败,也没有扩展修改进程监控模块。 + +新增的六个账号相关测试文件单独复验全部通过,共 **44 passed**:`test_account_store.py`、`test_client_login_management.py`、`test_account_manager.py`、`test_admin_api.py`、`test_admin_ui.py`、`test_account_integration.py`。 + +`uv build --wheel` 成功;wheel 包含 account_store/account_manager/admin_api 和 admin.html,页面内容与源码逐字节一致。保留既有 2.0.7 版本号,未发布安装包。 + +Edge 浏览器实际检查通过:页面加载、切换 Global、选择 Global 和国内区域、弹出独立窗口、模拟关联成功、账号列表刷新且当前选择保持。修复并重新检查成功态隐藏重试/取消按钮。浏览器验收服务器使用独立临时目录和合成账号,模拟登录工厂只访问本机,不修改用户真实账号。验收后停止该临时服务。 + +截图:`F:/Codex/visualizations/2026/10/24/01a16c22-2245-7651-89a9-06eed118ee27/account-manager-preview.png`。 + +## 429 限流与自动切换补充验收 + +新增默认关闭的自动切换开关、每账号冷却状态与管理页倒计时,独立运行状态文件保存开关和冷却截止时间。Retry-After 支持秒数、HTTP 日期、零秒;缺失或无效时使用默认 60 秒。重启恢复状态;冷却过期只解除标记,不主动切回。 + +同一次推理请求可在收到 HTTP 429 且响应尚未开始时,依次尝试同区域且同 endpoint 的其他未冷却账号,每账号最多一次,数量受请求开始时账号数限制。全部限流仍返回最后一次实际 429 与它的原始 Retry-After。401/503 不触发轮换;已开始输出的 SSE 不重放;晚到的旧账号 429 不覆盖手动切换。Billing 仅记录与选择后续账号,不重放签到操作。 + +主 agent 负责主转发和 billing 集成;GPT-6 Luna / max 子 agent B 实现持久化和管理 API,C 实现页面与文档,A 独立新增代理链路验收。新增代理组 test_rate_limit_proxy.py 为 **34 passed**;manager/API 为 **21 passed**;七个账号相关测试文件合跑 **87 passed**。这些用例全部使用临时账号与模拟上游,不消耗真实账号额度。 + +Edge 浏览器已检查默认关闭、开关保存,并通过隔离代理的实际本机 HTTP 请求触发:国内演示账号返回模拟 HTTP 429 后,同一区域备用账号自动接手并返回 HTTP 200;页面显示原账号冷却倒计时和备用账号当前状态。修复并复验了前台刷新与后台轮询竞争导致按钮持续禁用的问题;页面倒计时按本机代理的服务器时间校准,使用本地每秒更新,后台可见页 15 秒同步、隐藏页 60 秒同步。设置保存结果不确定时立即 GET 校准服务器状态。最终主 agent 独立全量复验为 **377 passed / 1 skipped**(7 条既有弃用或测试返回值警告);本轮进程监控用例均通过。主 agent 重建 `dist/workbuddy2api-2.0.7-py3-none-any.whl`,逐字节核对 `__main__.py`、`billing_proxy.py`、`account_manager.py`、`admin_api.py`、`admin.html` 全部与当前源码一致;差异检查通过。截图位于 `F:/Codex/visualizations/2026/10/24/01a16c22-2245-7651-89a9-06eed118ee27/account-rate-limit-preview.png`。临时演示服务已停止,用户实际运行的代理未被替换。 + +## 每账号签到与后台自动调度补充验收 + +自动签到采用一个默认关闭、持久化的全局开关,覆盖全部已关联账号:国内与 Global、当前与非当前账号都独立使用自己的凭据,不改变代理的 active 账号。签到缓存只保存在内存;重启后重新向上游查询当天状态。 + +主 agent 继续将实现分给 GPT-6 Luna / max:A 实现签到服务、定时器与可控时钟测试;B 实现设置迁移、管理 API、签到响应过滤与故障回滚;C 实现每账号查询/签到按钮、开关、状态同步和双语说明。主 agent 独立集成进程生命周期、结构化与控制台日志,新增真实应用链路的模拟上游测试,并审阅最终实现。 + +- 每个账号可手动查询、手动签到;签到前必查,只有明确未签到才发送动作,动作后再次确认。状态未知、活动未开放或查询失败时不自动签到。 +- 按北京时间(UTC+8)每日 00:00 检查所有账号;未签账号各自在当日 00:00–00:10 内随机计划一次复查,仍未签才执行。随机时间以午夜为基准,查询耗时不额外延长窗口。 +- 从关闭切为开启、服务启动时已开启,均立即检查全部账号并按需补签。后台调度随代理运行,关闭管理页仍有效。 +- 关闭开关取消等待任务,发出签到请求前再次检查开关、日期和账号存在性;已发送的请求不重复。取消后清除页面 busy 状态。手动操作不受自动开关控制。 +- 页面自动行为只查询与同步,不自行发起签到 POST,避免绕过后台的随机时间和开关检查。只有手动按钮调用手动签到 API。 +- 同账号串行、全局限制并发;明确拒绝后复查确认未签才允许后续重试;不确定结果保留防重复标记。签到遇到 429 只记录该账号冷却,不触发账号切换。 +- 查询开始/结果、签到开始/确认/失败、跳过、随机计划均记录安全字段;日志不含 token、会话、原始上游响应。并发设置回调重读当前开关,防止过期通知覆盖最终值。 +- 额外修复删除账号时冷却文件写入失败的一致性,并通过两个故障注入用例确认回滚行为。 + +签到状态适配参考仓库贡献者的实际接口记录:`data.active` 和严格布尔值 `data.today_checked_in`;已签到提示码 10001 仍需要状态接口确认。来源:[PR #7 的接口验证记录](https://github.com/hawklithm/workbuddy2api/pull/7#issuecomment-6210892410)。本次没有使用真实账号调用签到上游。 + +最终主 agent 独立全量:**413 passed / 1 skipped / 7 warnings**,耗时 118.61 秒;既有 Windows 进程监控用例本轮通过。最终页面稳定后追加 UI/API/应用签到集成组复验:**14 passed**。子 agent 最终签到相关组 **78 passed**,管理/API 组 **27 passed**,UI/API 组 **8 passed**。 + +主 agent 构建 wheel 成功,逐字节核对 `__main__.py`、`billing_proxy.py`、`account_store.py`、`account_manager.py`、`account_checkin.py`、`admin_api.py`、`admin.html` 全部与源码一致。差异检查通过。 + +Edge 浏览器使用独立临时目录、三个合成账号、模拟上游完成:初始状态查询;对非当前 Global 账号手动签到且当前国内账号不变;打开全局开关后后台逐账号检查,未签到账号补签、已签到账号跳过;刷新后三个账号均显示已签到,active 保持原值。实际检查 JSON 日志含 enable 检查、跳过、动作和确认事件。截图:`F:/Codex/visualizations/2026/10/24/01a16c22-2245-7651-89a9-06eed118ee27/account-checkin-preview.png`。临时验收服务在验收后停止,未替换用户实际代理。 + +## 边界 + +本次完成本地代码和离线/浏览器验收。真实国内与 Global 的账号认证需要实际用户完成登录,尚未作为上游验收;没有替换正在运行的用户代理,没有发布、提交或推送。 + +构建文件、运行日志和测试缓存保持忽略;所有代码、方案、验收文档均可在当前分支检查。原始工作区在改造前为干净状态。 diff --git a/ACCOUNT_MANAGER_PLAN.md b/ACCOUNT_MANAGER_PLAN.md new file mode 100644 index 0000000..06e323e --- /dev/null +++ b/ACCOUNT_MANAGER_PLAN.md @@ -0,0 +1,49 @@ +# 账号与登录态管理升级方案 + +基线:2026-10-24,origin/main `83f60e90eccf5495356b97cb2def79533a38d9a5`。 +工作分支:`codex/account-session-manager`。 + +## 目标与用户流程 + +代理启动时同时提供 `/admin` 管理页;未关联账号也能启动。页面展示账号名、国内 / Global、当前生效状态,允许关联、切换、删除非当前账号。关联时先选择区域,在点击动作中打开独立浏览器窗口,然后跳转到原有登录协议返回的认证地址。代理继续使用原有 state → token → account 轮询协议,成功后保存独立会话;首次关联自动生效,已有账号时关联成功不隐式切换。 + +同一 uid 在不同区域或不同 endpoint 中是不同身份。同身份重新关联更新自身凭据,其他账号不会覆盖。取消、超时、失败均不落入正式账号库。账号切换持久保存,下一次启动恢复;显式 `--global` / endpoint / session-file 用于选择或导入相符账号,不能把不匹配区域的凭据发往另一地址。 + +## 数据与模块 + +1. 新增 `account_store.py`:默认目录 `~/.workbuddy2api/accounts`,可用 `--accounts-dir` 覆盖。版本化索引保存脱敏展示元数据与 active id,每账号独立会话文件。身份由 backend、规范化 endpoint、uid 共同确定;只使用受控 ID 生成路径。原子替换、线程锁、文件最小权限;损坏索引明确报错,绝不静默覆盖。旧会话仅在有效且身份可识别时复制导入,保留源文件。 +2. 在 `CodeBuddyClient` 抽出 `begin_login()` 与 `complete_login(challenge, timeout=300, cancel_event=None)`;`login()` 组合复用二者,保留 CLI 行为。等待 token 和 account 都受总超时、取消控制,account 必须含 uid。增加 `ensure_authenticated(..., allow_login=True)`,管理模式请求只允许刷新,不自动打开登录浏览器。会话写入使用原子替换。 +3. 新增 `account_manager.py`:持有 AccountStore、当前 client,后台登录任务有 pending / succeeded / failed / cancelled 状态;返回 job id、auth_url、简洁错误,绝不返回 token、完整 session、上游原文异常。限制并发登录并回收临时会话和终态任务;关闭时取消任务。切换一次替换整个 client。 +4. 新增 `admin_api.py` 与包内 `admin.html`:同端口服务页面和管理 API,无前端构建依赖。只允许 loopback 访问,并校验 Host / Origin;写操作要求专用请求头,拒绝跨站请求。页面使用 textContent 渲染账号名,管理响应 no-store,不输出凭据。 +5. 主入口集成:启动账号库、导入历史 domestic/global 和显式 session;保留 mock 模式。每次代理请求捕获一个 client 快照,已发送和进行中的流继续使用原账号,新请求使用新账号;billing 的 401 refresh 也锁定原 client。模型列表、health 随当前账号更新。无账号时模型/管理可用,推理返回结构化 401。 + +## 子任务与接口约定 + +- A(存储和认证,GPT-6 Luna / max):负责 account_store.py、codebuddy_client_demo.py、对应测试。AccountStore(root),list_accounts() -> list[dict](id, backend, endpoint, uid, nickname, active),active_account_id -> str | None,import_client(client, activate=False) -> str,get_client(id) -> CodeBuddyClient,set_active(id) -> CodeBuddyClient,active_client() -> client | None,delete_account(id)。begin_login() -> dict(auth_url, state);complete_login 接受该 dict,成功写入 client 自己的独立 session,异常为 CodeBuddyError。import_client 不修改源文件,第一次导入自动生效。 +- B(后台任务与 API,GPT-6 Luna / max):负责 account_manager.py、admin_api.py、对应测试。AccountManager(store),client -> 当前 client | None,snapshot() -> {accounts, active_account_id},activate(id),delete(id),start_login(backend) -> job dict,get_login(id) -> job dict,cancel_login(id),close()。router 工厂 create_admin_router(get_manager),管理前缀 `/admin/api`:GET /accounts,POST /accounts/{id}/activate,DELETE /accounts/{id},POST /logins {backend},GET/DELETE /logins/{id};页面 GET /admin(兼容 /admin/)。写操作 `X-Account-Manager: 1`。job: id, backend, status, auth_url, error, account_id;后台准备登录地址,GET job 用于轮询。 +- C(页面和用户文档,GPT-6 Luna / max):负责 admin.html、pyproject.toml 包资源、README.md、README_zh.md。页面只依赖上述协议;先打开窗口,再 start_login 并轮询 auth_url,成功刷新列表,可取消和重试,失败给出清楚状态,弹窗被拦截提供链接;不展示 session 或 token。 +- 主 agent:负责 __main__.py / billing_proxy.py 集成、启动兼容、跨模块测试、独立审阅和最终验收。子 agent 不提交,不改别人负责的文件,各自运行必要测试直到通过,并反馈命令、结果和未验证边界。 + +## 429 限流与自动切换补充(2026-10-24) + +管理页新增每账号的限流标记、冷却倒计时,以及默认关闭的“遇 429 自动切换账号”开关。开关和冷却截止时间写入独立版本化运行状态文件,不改账号索引或凭据结构。冷却优先读取 Retry-After(整数秒或 HTTP 日期);缺失或无效时采用 60 秒并注明默认估算。过期解除限流标记,不主动切回旧账号。 + +三种推理协议在上游真正返回 HTTP 429、客户端响应尚未开始时,可按开关切换同区域且同 endpoint、未冷却且有可用凭据的账号,再尝试当前请求。每账号最多一次,尝试次数不超过请求开始时账号数量。候选用尽仍返回实际的 429 与对应 Retry-After。迟到的旧请求只能标记其原始账号,不覆盖期间的手动切换。已开始输出的流不重放。 + +签到等 billing 操作透传 Retry-After,并记录原账号限流;若开启自动切换,仅为后续请求更新当前账号,不将该次业务操作重放到另一账号。 + +分工沿用 GPT-6 Luna / max 子 agent:B 负责状态、持久化和 API;C 负责页面、文档、交互测试;A 负责独立代理链路测试;主 agent 实现 HTTP 集成并独立审阅和验收。 + +## 每账号每日签到与自动调度补充(2026-10-24) + +全局自动签到开关控制所有关联账号,不限当前生效账号。列表显示各账号今日状态,提供状态查询与签到按钮;每次使用指定账号自身 client 调用既有 billing 底层接口,不更换当前账号。状态查询/签到复用 POST checkin-status / daily-checkin 和 401 刷新逻辑。根据原贡献 PR #7 的上游记录,以 code=0 且 data.today_checked_in 严格布尔值判断;未知、失败和活动未开放均不得当作未签到直接发动作。 + +自动签到默认关闭,持久化开关。北京时间(UTC+8)每日 00:00 对启用功能下的所有账号检查;未签到者在该午夜后 0–600 秒内安排独立随机时刻,再查未签到才执行签到。关闭开关取消待执行任务;实际 POST 前重检日期、账号是否仍存在和开关。开关从关变开立即检查并补签;服务启动时开关已开也立即检查并补签。 + +服务随代理进程启动和停止,不使用 Codex 应用提醒。每账号互斥并限制总并发,防止页面、启动、开关和定时任务重复执行。跨日状态不能当成今天;每个动作和结果、跳过、失败、调度时间记录到现有普通日志、JSONL 和控制台,只记录账号 ID/区域/日期等安全字段。 + +A 子 agent 负责签到 service/调度及单元测试,B 负责管理器设置迁移与 API,C 负责列表/开关/文档和交互测试;均沿用 GPT-6 Luna / max。主 agent 负责生命周期、日志接入、HTTP 集成测试、独立审阅和最终验收。 + +## 验收 + +离线自动化覆盖:多账号不覆盖、两区域同 uid 隔离、原有会话导入、重启恢复、损坏数据、原子写入;登录 token/account 延迟、取消、超时及失败不写入;API 不泄漏凭据、跨站和非本机管理请求被拒;无账号启动、切换后 health / models / 三种协议新请求使用新账号、在途请求不串号、billing 刷新不串号。全量现有测试需与基线区分;包构建验证页面被包含。浏览器检查管理页加载、关联窗口、状态和布局。真实国内/国际交互登录依赖用户亲自认证,离线模拟通过不能代替真实上游验收。 diff --git a/README.md b/README.md index 959839e..0408162 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ For unexplained Windows process exits, use the [independent process monitor](doc - **DSML parsing** - Automatically detects and converts DeepSeek Markup Language (DSML) tool calls - **Streaming responses** - SSE streaming output, returning generated content in real time, with built-in 60-second timeout protection - **Domestic and international backends** - Uses domestic CodeBuddy by default and switches to the international CodeBuddy service with `--global`, with isolated sessions and model catalogs -- **Multi-account management** - Supports isolation of multiple login states for easy switching between work/personal accounts +- **Multi-account management** - Link domestic and Global accounts, switch the active account, and remove saved accounts from the local admin page --- @@ -51,12 +51,14 @@ uv sync uv run python -m codebuddy_proxy --desensitize ``` -On first use, when login is required: +On first use, start the proxy and open the local account manager: ```bash -uv run python -m codebuddy_proxy --login --desensitize +uv run python -m codebuddy_proxy --desensitize ``` +Then visit `http://127.0.0.1:8787/admin` and link a domestic or Global account. + ## Quick Start ### 1. Start the proxy @@ -65,8 +67,8 @@ uv run python -m codebuddy_proxy --login --desensitize # Use the latest version (recommended) uv run --with workbuddy2api python -m codebuddy_proxy --desensitize -# First use: log in and start -uv run --with workbuddy2api python -m codebuddy_proxy --login --desensitize +# First use: start, then link an account at http://127.0.0.1:8787/admin +uv run --with workbuddy2api python -m codebuddy_proxy --desensitize # International service: first login and start uv run --with workbuddy2api python -m codebuddy_proxy --global --login --desensitize @@ -82,12 +84,23 @@ Listens on `http://127.0.0.1:8787` by default. The proxy supports both CodeBuddy regions. Domestic mode remains the default, so existing startup commands continue to work unchanged. -| Mode | Startup option | Upstream endpoint | Default session file | -| --- | --- | --- | --- | -| Domestic (default) | none | `https://copilot.tencent.com` | `~/.codebuddy-session.json` | -| International | `--global` | `https://www.codebuddy.ai` | `~/.codebuddy-global-session.json` | +| Mode | Startup option | Upstream endpoint | +| --- | --- | --- | +| Domestic (default) | none | `https://copilot.tencent.com` | +| International | `--global` | `https://www.codebuddy.ai` | + +Linked accounts are stored separately by region in `~/.workbuddy2api/accounts`. +Use `--accounts-dir DIR` to choose another local directory. With no explicit +selector, the proxy restores the saved active account. On the first migration, +matching legacy session files are imported once and kept; deleting an imported +account does not import it again. Explicit `--global` or `--endpoint` selects a +matching account, while `--session-file` can import that file again. If there is +no match, the proxy starts without an active account. `--login` uses a temporary +session file to add or refresh an account without replacing a legacy file. -First login and daily startup for the international service: +The account manager can add accounts for either region while the proxy is +running. For a terminal-driven login, the existing `--login` option remains +available: ```bash # First login @@ -103,16 +116,18 @@ If the package is installed as a command, the equivalent short form is `workbuddy2api --global --login`. When running from source, use `uv run python -m codebuddy_proxy --global --login`. -`--global` changes only the upstream service. Codex CLI, Claude Code/CC Switch, -OpenCode, and other clients continue to use the same local proxy URLs. The -selected profile also controls the model catalog returned by `/v1/models`. +`--global` selects the Global backend and a matching account when one exists. +Codex CLI, Claude Code/CC Switch, OpenCode, and other clients continue to use +the same local proxy URLs. The selected profile also controls the model catalog +returned by `/v1/models`. -Domestic and international sessions are intentionally isolated. An explicit -`--session-file` takes precedence, but its saved backend and endpoint must match -the current startup options. The proxy refuses mismatched credentials and does -not modify the original file. +Domestic and international accounts remain isolated. An explicit +`--session-file` is imported only when its saved backend and endpoint match the +current startup options. The proxy refuses mismatched credentials and does not +modify the original file. -For a custom international endpoint, always use a dedicated session file: +For a custom international endpoint, use a dedicated session file when +importing or creating a login from the command line: ```bash uv run --with workbuddy2api python -m codebuddy_proxy \ @@ -309,6 +324,7 @@ Select the model inside OMP with `/model codebuddy/hy3` (or set it as the defaul --global Use the international CodeBuddy backend (default domestic) --endpoint ENDPOINT CodeBuddy backend address (overrides the profile default) --session-file PATH Session file path (isolated by profile by default) +--accounts-dir DIR Account library directory (default ~/.workbuddy2api/accounts) --log-file PATH JSONL log file (default ~/.workbuddy2api/codebuddy-proxy.jsonl) --desensitize Enable desensitization (recommended) --optimize-context Enable message compression (recommended for Codex CLI) @@ -369,15 +385,38 @@ uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-c ### Multi-account switching -```bash -# Account 1 -uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-work.json --login \ - --log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" - -# Account 2 -uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-personal.json --login \ - --log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" -``` +Start the proxy and open [http://127.0.0.1:8787/admin](http://127.0.0.1:8787/admin). +Choose **Domestic** or **Global**, then link the account in the browser window. +The first linked account becomes active automatically; linking another account +does not change the account currently in use. Use **Set active** to switch, or +delete a saved account from the same page. The selection is saved for the next +proxy start. The page and its management API are restricted to local access. + +Automatic account switching after an upstream `429` is off by default. When +enabled, the proxy can try accounts with the same region and endpoint, at most +once per account for each request; if every eligible account returns `429`, the +original `429` is returned. The rate-limited account observes the upstream +`Retry-After` value, or a default 60-second cooldown when that value is missing +or invalid. The setting and cooldowns persist across restarts. The page shows +the remaining cooldown and whether it came from `Retry-After` or the default; +it refreshes account state periodically and immediately when a hidden page +becomes visible again. + +The account list also shows each linked account's check-in status for today +(Beijing time). The **Check in** action is available for every account, including +the active one; it checks the account first and does nothing when today's check-in +is already complete. The global automatic check-in setting is off by default and +applies to all linked accounts without changing the active account. The page saves +this setting and displays status; the proxy performs automatic checks and check-ins +in the background, including when the management page is closed. When enabled, the +proxy checks all linked accounts immediately and on startup. At Beijing midnight it +checks them, waits a random 0–10 minutes, then checks again before signing; disabling +it cancels pending scheduled work. Unknown status is never treated as permission to +sign. The setting persists; after restart, check-in status is confirmed by querying +the upstream service again. + +The command-line `--login` flow and `--session-file` option remain available for +terminal use and importing an existing session. ### Listening on all interfaces (LAN sharing) @@ -393,11 +432,20 @@ All endpoints do not require an extra token in the request by default; the proxy | Method | Path | Purpose | | --- | --- | --- | | GET | `/health` | Query local service and auth status | +| GET | `/admin` | Open the local account manager | | GET | `/v1/models` | Query the CodeBuddy model list | | POST | `/v1/chat/completions` | OpenAI Chat Completions, supports tools and streaming | | POST | `/v1/responses` | Responses API, compatible with Codex CLI | | POST | `/v1/messages` | Anthropic Messages API, compatible with Claude Code / CC Switch | +Account-management endpoints live under `/admin/api` and are restricted to +loopback clients. Write requests require the `X-Account-Manager: 1` header, and +cross-origin requests are rejected. `GET /admin/api/accounts` reports active +account, cooldown, and cached check-in state. `GET /admin/api/accounts/{id}/checkin-status` +checks that account against the upstream service; `POST /admin/api/accounts/{id}/checkin` +checks first and signs only when needed. `GET` and `PATCH /admin/api/settings` read +and save the automatic-switch and automatic-check-in preferences independently. + ### `/health` - health check ```bash diff --git a/README_zh.md b/README_zh.md index 38020a7..ba1cfa7 100644 --- a/README_zh.md +++ b/README_zh.md @@ -15,7 +15,7 @@ Windows 代理无异常记录却自动退出时,使用[独立进程监控](doc - **DSML 解析** - 自动识别和转换 DeepSeek 标记语言(DSML)格式的工具调用 - **流式响应** - 支持 SSE 流式输出,实时返回生成内容,内置 60 秒超时保护 - **国内版与国际版后端** - 默认连接国内版 CodeBuddy,通过 `--global` 切换国际版,并隔离登录态和模型列表 -- **多账号管理** - 支持多个登录态隔离,方便工作/个人账号切换 +- **多账号管理** - 在本机管理页关联国内版和 Global 账号、切换当前账号或删除账号 --- ## 安装 @@ -50,12 +50,14 @@ uv sync uv run python -m codebuddy_proxy --desensitize ``` -首次使用需要登录时: +首次使用时,启动代理并打开本机账号管理页: ```bash -uv run python -m codebuddy_proxy --login --desensitize +uv run python -m codebuddy_proxy --desensitize ``` +然后访问 `http://127.0.0.1:8787/admin`,关联国内版或 Global 账号。 + ## 快速开始 ### 1. 启动 proxy @@ -64,8 +66,8 @@ uv run python -m codebuddy_proxy --login --desensitize # 使用最新版本(推荐) uv run --with workbuddy2api python -m codebuddy_proxy --desensitize -# 首次使用:登录并启动 -uv run --with workbuddy2api python -m codebuddy_proxy --login --desensitize +# 首次使用:启动后访问 http://127.0.0.1:8787/admin 关联账号 +uv run --with workbuddy2api python -m codebuddy_proxy --desensitize # 国际版:首次登录并启动 uv run --with workbuddy2api python -m codebuddy_proxy --global --login --desensitize @@ -81,12 +83,20 @@ uv run --with workbuddy2api python -m codebuddy_proxy --global --desensitize 代理同时支持国内版和国际版 CodeBuddy。国内版仍是默认模式,因此已有启动命令 无需修改。 -| 模式 | 启动参数 | 上游 endpoint | 默认 session 文件 | -| --- | --- | --- | --- | -| 国内版(默认) | 无 | `https://copilot.tencent.com` | `~/.codebuddy-session.json` | -| 国际版 | `--global` | `https://www.codebuddy.ai` | `~/.codebuddy-global-session.json` | +| 模式 | 启动参数 | 上游 endpoint | +| --- | --- | --- | +| 国内版(默认) | 无 | `https://copilot.tencent.com` | +| 国际版 | `--global` | `https://www.codebuddy.ai` | + +关联账号按区域分别保存在 `~/.workbuddy2api/accounts`。可以通过 +`--accounts-dir DIR` 指定其他本机目录。未指定账号选择参数时,代理恢复上次选择的当前账号。 +首次迁移时会导入匹配的旧 session 文件, +并保留源文件;之后删除已导入账号不会再次自动导入。显式 `--global` 或 `--endpoint` +会选择相符账号,显式 `--session-file` 可再次导入该文件。找不到匹配账号时,代理会在无当前账号的状态下启动。 +`--login` 使用临时 session 文件关联或更新账号,不会覆盖旧 session 文件。 -国际版首次登录和日常启动: +代理运行期间可直接通过管理页关联任一区域的账号。也可以继续使用命令行 +`--login` 执行终端登录: ```bash # 首次登录 @@ -101,14 +111,13 @@ uv run --with workbuddy2api python -m codebuddy_proxy \ 如果已将包安装为命令,可使用简写 `workbuddy2api --global --login`。从本地源码 运行时,可使用 `uv run python -m codebuddy_proxy --global --login`。 -`--global` 只切换上游服务。Codex CLI、Claude Code/CC Switch、OpenCode 等客户端 -仍然连接相同的本地代理地址;`/v1/models` 返回的模型列表会随 profile 切换。 +`--global` 选择 Global 后端及匹配的账号。Codex CLI、Claude Code/CC Switch、OpenCode +等客户端仍然连接相同的本地代理地址;`/v1/models` 返回的模型列表会随 profile 切换。 -国内版和国际版登录态默认相互隔离。显式 `--session-file` 的优先级更高,但文件中 -保存的 backend 和 endpoint 必须与当前启动参数匹配。代理会拒绝不匹配的凭据, -并保留原 session 文件不变。 +国内版和国际版账号保持隔离。显式 `--session-file` 仅在其中保存的 backend 和 +endpoint 与当前启动参数匹配时导入。代理会拒绝不匹配的凭据,并保留原 session 文件。 -使用自定义国际版 endpoint 时,应同时指定独立的 session 文件: +从命令行导入或创建自定义国际版 endpoint 的登录态时,应使用独立的 session 文件: ```bash uv run --with workbuddy2api python -m codebuddy_proxy \ @@ -321,6 +330,7 @@ providers: --global 使用国际版 CodeBuddy(默认国内版) --endpoint ENDPOINT CodeBuddy 后端地址(覆盖 profile 默认值) --session-file PATH 会话文件路径(默认按 profile 隔离) +--accounts-dir DIR 账号库目录(默认 ~/.workbuddy2api/accounts) --log-file PATH JSONL 日志文件(默认 ~/.workbuddy2api/codebuddy-proxy.jsonl) --desensitize 启用脱敏处理(推荐) --optimize-context 启用消息压缩优化(Codex CLI 推荐) @@ -381,15 +391,24 @@ uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-c ### 多账号切换 -```bash -# 账号 1 -uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-work.json --login \ - --log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" - -# 账号 2 -uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-personal.json --login \ - --log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" -``` +启动代理后访问 [http://127.0.0.1:8787/admin](http://127.0.0.1:8787/admin),选择 +**国内**或 **Global**,再在新打开的浏览器窗口中完成关联。首次关联的账号会自动设为当前账号; +之后关联其他账号不会隐式切换。可在列表中切换当前账号或删除账号,当前选择会在下次启动时恢复。 +管理页及管理 API 仅允许本机访问。 + +遇到上游 `429` 时自动切换账号的功能默认关闭。开启后,代理只会尝试区域和 endpoint +都相同的账号,每个请求对每个账号最多尝试一次;所有候选账号都返回 `429` 时,仍返回原始 +`429`。账号会遵循上游的 `Retry-After`;该值缺失或无效时,默认冷却 60 秒。此开关和冷却状态 +会在重启后保留。管理页会显示剩余冷却时间及其来源(`Retry-After` 或默认值),并定期同步账号状态; +页面从后台重新显示时会立即同步。 + +账号列表还会显示每个关联账号当天(北京时间)的签到状态。每个账号都有“查询签到”和“签到”按钮, +当前账号也可操作;签到前会先检查,已签到时不会重复签到。全局自动签到默认关闭,适用于所有关联账号, +不会切换当前账号。管理页只保存开关并显示状态,自动检查和签到由代理在后台执行,即使关闭管理页也会继续。 +开启后代理会立即检查全部账号,启动时也会重新检查;此外北京时间每日 00:00 检查所有账号,随机等待 0 至 10 分钟后再检查,确认仍未签到才会执行; +关闭开关会取消等待中的计划。未知状态不会自动签到。开关会持久化;重启后,签到状态以重新查询上游的结果为准。 + +命令行 `--login` 和 `--session-file` 仍可用于终端登录和导入已有 session。 ### 监听所有网卡(局域网共享) @@ -405,11 +424,18 @@ uv run --with workbuddy2api python -m codebuddy_proxy --host 0.0.0.0 --desensiti | 方法 | 路径 | 用途 | | --- | --- | --- | | GET | `/health` | 查询本地服务和认证状态 | +| GET | `/admin` | 打开本机账号管理页 | | GET | `/v1/models` | 查询 CodeBuddy 模型列表 | | POST | `/v1/chat/completions` | OpenAI Chat Completions,支持 tools 和流式响应 | | POST | `/v1/responses` | Responses API,兼容 Codex CLI | | POST | `/v1/messages` | Anthropic Messages API,兼容 Claude Code / CC Switch | +账号管理接口位于 `/admin/api`,只允许本机回环地址访问。写请求必须携带 +`X-Account-Manager: 1`,跨源请求会被拒绝。`GET /admin/api/accounts` 返回当前账号和冷却状态; +每个账号还包含缓存的当日签到状态。`GET /admin/api/accounts/{id}/checkin-status` 会向上游查询; +`POST /admin/api/accounts/{id}/checkin` 会先检查再执行必要的签到。`GET` 与 `PATCH /admin/api/settings` +用于分别读取和保存自动切换、全局自动签到设置。 + ### `/health` - 健康检查 ```bash diff --git a/pyproject.toml b/pyproject.toml index 6692d38..f518f9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ build-backend = "setuptools.build_meta" where = ["src"] [tool.setuptools.package-data] -codebuddy_proxy = ["models_config.*.json"] +codebuddy_proxy = ["models_config.*.json", "admin.html"] [dependency-groups] dev = [ diff --git a/src/codebuddy_proxy/__main__.py b/src/codebuddy_proxy/__main__.py index ed3fe35..9844ba8 100755 --- a/src/codebuddy_proxy/__main__.py +++ b/src/codebuddy_proxy/__main__.py @@ -15,7 +15,9 @@ import argparse import asyncio +import copy from contextlib import asynccontextmanager, nullcontext +from contextvars import ContextVar import base64 import hashlib import io @@ -29,6 +31,7 @@ import platform import sys import time +import tempfile import uuid from contextlib import AsyncExitStack from typing import Any, Optional @@ -44,6 +47,8 @@ BackendProfile, ResolvedBackend, DOMESTIC_PROFILE, + GLOBAL_PROFILE, + resolve_backend, resolve_backend_from_args, ) from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient, CodeBuddyError @@ -51,6 +56,7 @@ from codebuddy_proxy.upstream_request import ChatRequestPreparer from codebuddy_proxy.protocol_response import format_nonstream_response from codebuddy_proxy.process_diagnostics import ProcessDiagnostics +from codebuddy_proxy.admin_api import create_admin_router # 尝试导入高级功能模块(可选) try: @@ -180,8 +186,12 @@ def __init__( verbose_llm: bool = False, logger: logging.Logger | None = None, json_logger: logging.Logger | None = None, + account_manager=None, ): - self.client = client + self._client = client + self.account_manager = account_manager + self.account_runtime = account_manager + self.managed_auth = account_manager is not None self.mock_dir = mock_dir self.log_file = log_file self.enable_desensitize = enable_desensitize @@ -191,13 +201,47 @@ def __init__( self.json_logger = json_logger self.runtime_info = get_runtime_info() self.started_at = time.time() + checkins = getattr(account_manager, "checkins", None) + if checkins is not None: + checkins.configure_logging(self.log_checkin) + + def log_checkin(self, event: str, **fields) -> None: + """Send safe check-in events to existing files and the process console.""" + self.write_log(event, **fields) + summary = json.dumps(fields, ensure_ascii=False) + if self.logger is not None: + self.logger.info("%s: %s", event, summary) + try: + print(f"[Checkin] {event} {summary}", flush=True) + except (OSError, UnicodeError): + pass + + @property + def client(self): + if self.account_manager is not None: + return self.account_manager.client or self._client + return self._client + + @client.setter + def client(self, value): + self._client = value + + def for_request(self): + """Pin the account before any await, including refresh and billing retries.""" + snapshot = copy.copy(self) + snapshot._client = self.client + snapshot.account_manager = None + return snapshot def ensure_auth(self) -> None: """确保已认证;认证失败(token 过期/网络错误/登录未完成)返回结构化 401 而非 500。""" if self.mock_dir is not None: return try: - self.client.ensure_authenticated() + if self.managed_auth: + self.client.ensure_authenticated(open_browser=False, allow_login=False) + else: + self.client.ensure_authenticated() except HTTPException: raise # 已是结构化异常,原样透传(如 503 proxy not initialized) except Exception as exc: @@ -205,9 +249,9 @@ def ensure_auth(self) -> None: status_code=401, detail={ "error": { - "message": "认证失败:token 无效或已过期,请重新登录(--login)", + "message": "认证失败:请在 /admin 关联或切换账号,或重新登录(--login)", "type": "authentication_error", - "details": str(exc)[:200], + "details": type(exc).__name__ if self.managed_auth else str(exc)[:200], } }, ) @@ -257,6 +301,21 @@ def write_body_log(self, event: str, body: bytes, **kwargs) -> None: # 全局状态(在 main() 中初始化) proxy_state: ProxyState | None = None process_diagnostics: ProcessDiagnostics | None = None +_request_state: ContextVar[Any] = ContextVar("account_request_state", default=None) + + +@app.middleware("http") +async def pin_account_at_request_entry(request: Request, call_next): + # Capture before body parsing or other awaits. Each downstream task also + # inherits this context, including streaming responses. + if proxy_state is None or not request.url.path.startswith("/v1/"): + return await call_next(request) + state = proxy_state.for_request() if isinstance(proxy_state, ProxyState) else proxy_state + token = _request_state.set(state) + try: + return await call_next(request) + finally: + _request_state.reset(token) async def install_process_asyncio_diagnostics() -> None: @@ -269,12 +328,47 @@ async def install_process_asyncio_diagnostics() -> None: app.router.add_event_handler("startup", install_process_asyncio_diagnostics) +async def start_account_checkin() -> None: + if isinstance(proxy_state, ProxyState) and proxy_state.account_manager is not None: + await proxy_state.account_manager.checkins.start() + + +app.router.add_event_handler("startup", start_account_checkin) + + +async def close_account_manager() -> None: + if isinstance(proxy_state, ProxyState) and proxy_state.account_manager is not None: + await proxy_state.account_manager.checkins.close() + proxy_state.account_manager.close() + + +app.router.add_event_handler("shutdown", close_account_manager) + + def get_state() -> ProxyState: if proxy_state is None: raise HTTPException(status_code=503, detail={"error": {"message": "proxy not initialized", "type": "internal_error"}}) return proxy_state +def get_request_state(): + pinned = _request_state.get() + if pinned is not None: + return pinned + state = get_state() + return state.for_request() if isinstance(state, ProxyState) else state + + +def get_account_manager(): + manager = getattr(get_state(), "account_manager", None) + if manager is None: + raise HTTPException(status_code=503, detail="Account management is unavailable in this mode") + return manager + + +app.include_router(create_admin_router(get_account_manager)) + + # ============================================================================ # 辅助函数 # ============================================================================ @@ -857,7 +951,7 @@ async def health(): async def checkin_status(): """Accept GET/POST locally; the real upstream billing status endpoint requires POST.""" return await forward_billing( - get_state(), "POST", "/v2/billing/meter/checkin-status", diagnostic + get_request_state(), "POST", "/v2/billing/meter/checkin-status", diagnostic ) @@ -865,7 +959,7 @@ async def checkin_status(): async def checkin(): """POST daily check-in: preserve the upstream HTTP status and raw body.""" return await forward_billing( - get_state(), "POST", "/v2/billing/meter/daily-checkin", diagnostic + get_request_state(), "POST", "/v2/billing/meter/daily-checkin", diagnostic ) @@ -935,7 +1029,7 @@ async def parse_request_body(request: Request) -> Any: @app.post("/v1/chat/completions") async def chat_completions(request: Request): - state = get_state() + state = get_request_state() body = await parse_request_body(request) log_client_request("POST", "/v1/chat/completions", body) @@ -950,7 +1044,7 @@ async def chat_completions(request: Request): @app.post("/v1/responses") async def create_response(request: Request): - state = get_state() + state = get_request_state() body = await parse_request_body(request) log_client_request("POST", "/v1/responses", body) @@ -1013,7 +1107,7 @@ async def create_response(request: Request): @app.post("/v1/messages") async def create_message(request: Request): - state = get_state() + state = get_request_state() body = await parse_request_body(request) log_client_request("POST", "/v1/messages", body) @@ -1052,14 +1146,71 @@ def _normalize_tool_choice(tool_choice: Any) -> Any: return tool_choice +def _retry_after_header(response) -> dict[str, str]: + retry_after = getattr(response, "headers", {}).get("Retry-After") + return {"Retry-After": retry_after} if retry_after is not None else {} + + async def forward_chat( body: dict[str, Any], protocol: str, original: dict[str, Any] | None = None ) -> StreamingResponse | JSONResponse: - """转发 chat 请求到 CodeBuddy 上游,支持流式和非流式。""" - state = get_state() - state.ensure_auth() + """Forward with bounded account failover before sending a client response.""" + state = get_request_state() + manager = getattr(state, "account_runtime", None) + attempted: set[str] = set() + max_attempts = 1 + if manager is not None: + max_attempts = max(1, len(manager.snapshot()["accounts"])) + for attempt in range(max_attempts): + response = await _forward_chat_once(body, protocol, original, state) + if response.status_code != 429: + return response + retry_state = await rate_limited_account( + state, response.headers.get("Retry-After"), attempted, + ) + if retry_state is None or attempt + 1 == max_attempts: + return response + state = retry_state + return response + + +async def rate_limited_account(state, retry_after, attempted): + """Record the original identity; late failures cannot override manual switches.""" + manager = getattr(state, "account_runtime", None) + if manager is None: + return None + try: + account_id = manager.account_id_for_client(state.client) + if account_id is not None: + attempted.add(account_id) + candidate = await asyncio.to_thread( + manager.handle_rate_limit, state.client, retry_after, + excluded_account_ids=set(attempted), + ) + next_id = manager.account_id_for_client(candidate) if candidate is not None else None + state.write_log( + "account_rate_limited", account_id=account_id, switched_to=next_id, + ) + if candidate is None or next_id is None or next_id in attempted: + return None + retry_state = copy.copy(state) + retry_state._client = candidate + retry_state.account_manager = None + return retry_state + except Exception as exc: + # Persistence or selection failures must not hide the provider's 429. + state.write_log("account_rate_limit_record_failed", error_type=type(exc).__name__) + return None + + +async def _forward_chat_once(body, protocol, original, state): + """One account attempt; any returned stream has already passed HTTP preflight.""" + if isinstance(state, ProxyState) and state.managed_auth: + await asyncio.to_thread(state.ensure_auth) + else: + state.ensure_auth() diagnostic("upstream_request", protocol=protocol, **body_summary(body)) @@ -1138,7 +1289,8 @@ async def open_preflight_response(): if protocol == "anthropic" else {"error": error_info} ) return JSONResponse( - status_code=upstream_response.status_code, content=error_payload + status_code=upstream_response.status_code, content=error_payload, + headers=_retry_after_header(upstream_response), ) finally: await upstream_response.aclose() @@ -1155,7 +1307,14 @@ async def open_preflight_response(): ) # 非流式:聚合后返回 - collected = await collect_upstream(url, headers, upstream_body, protocol) + try: + collected = await collect_upstream(url, headers, upstream_body, protocol) + except HTTPException as exc: + if exc.status_code != 429: + raise + return JSONResponse( + status_code=429, content={"detail": exc.detail}, headers=exc.headers, + ) return JSONResponse(content=convert_nonstream(collected, protocol, original)) @@ -1812,7 +1971,8 @@ async def collect_upstream( error_body = await resp.aread() raise HTTPException( status_code=resp.status_code, - detail={"error": {"message": error_body.decode("utf-8", "replace")[:500], "type": "upstream_error"}} + detail={"error": {"message": error_body.decode("utf-8", "replace")[:500], "type": "upstream_error"}}, + headers=_retry_after_header(resp), ) async for line in resp.aiter_lines(): @@ -1973,6 +2133,11 @@ def build_parser() -> argparse.ArgumentParser: ) parser.add_argument("--session-file", type=pathlib.Path, help="会话文件路径(默认按 backend profile 隔离)") + parser.add_argument( + "--accounts-dir", type=pathlib.Path, + default=pathlib.Path.home() / ".workbuddy2api" / "accounts", + help="独立账号库目录;管理页位于 /admin", + ) parser.add_argument("--mock-dir", type=pathlib.Path, help="只使用指定目录中的真实响应 fixture,不访问 CodeBuddy 后端") default_log_file = pathlib.Path( @@ -2017,11 +2182,92 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: return args +def initialize_account_manager(args, resolved_backend): + """Import legacy identities once and restore a persisted active account. + + Reading legacy files never refreshes or rewrites them. A forced login + always uses a temporary session, so --login cannot overwrite an old user. + """ + from codebuddy_proxy.account_store import AccountStore + from codebuddy_proxy.account_manager import AccountManager + + store = AccountStore(args.accounts_dir) + initial_import = not store.index_file.exists() + explicit = bool(args.global_mode or args.endpoint is not None + or args.session_file is not None + or os.getenv("CODEBUDDY_ENDPOINT")) + candidates = [resolved_backend] + for profile in (DOMESTIC_PROFILE, GLOBAL_PROFILE): + candidate = resolve_backend(profile=profile, environment={}) + if candidate not in candidates: + candidates.append(candidate) + selected_uid = None + for candidate in candidates: + # Migration is one-time. Re-reading a legacy file after its account + # was deleted must not silently associate that identity again. + if not initial_import and not (args.session_file is not None + and candidate is resolved_backend): + continue + try: + old = CodeBuddyClient(backend=candidate) + except CodeBuddyError: + if args.session_file is not None and candidate is resolved_backend: + raise + print(f"Skipped incompatible legacy session for {candidate.profile.key}", file=sys.stderr) + continue + account = old.session.get("account") or {} + auth = old.session.get("auth") or {} + if not isinstance(account, dict) or not isinstance(auth, dict): + continue + uid = account.get("uid") + if not uid or not (auth.get("accessToken") or auth.get("refreshToken")): + continue + if candidate is resolved_backend: + selected_uid = str(uid).strip() + known = any( + row["backend"] == old.profile.key and row["endpoint"] == old.endpoint + and str(row["uid"]) == str(uid) for row in store.list_accounts() + ) + if not known: + store.import_client(old) + if args.login: + with tempfile.TemporaryDirectory(prefix="login-", dir=store.root) as temporary: + login_backend = resolve_backend( + profile=resolved_backend.profile, endpoint=resolved_backend.endpoint, + session_file=pathlib.Path(temporary) / "session.json", environment={}, + ) + login_client = CodeBuddyClient(backend=login_backend) + login_client.login(open_browser=not args.no_browser) + store.import_client(login_client, activate=True) + elif explicit: + matching = [row for row in store.list_accounts() + if row["backend"] == resolved_backend.profile.key + and row["endpoint"] == resolved_backend.endpoint + and (args.session_file is None or str(row["uid"]) == selected_uid)] + if matching: + chosen = next((row for row in matching if row["active"]), matching[0]) + store.set_active(chosen["id"]) + else: + store.clear_active() + manager = AccountManager(store) + # The empty fallback preserves the requested profile for health/models. + # Managed requests cannot start browser login or write to a legacy file. + fallback = CodeBuddyClient(backend=resolve_backend( + profile=resolved_backend.profile, endpoint=resolved_backend.endpoint, + session_file=store.root / ".unlinked-session.json", environment={}, + )) + return manager, manager.client or fallback + + def _run_proxy(args: argparse.Namespace) -> int: global proxy_state try: resolved_backend = resolve_backend_from_args(args) - client = CodeBuddyClient(backend=resolved_backend) + manager = None + if args.mock_dir is not None: + client = CodeBuddyClient(backend=resolved_backend) + else: + manager, client = initialize_account_manager(args, resolved_backend) except (CodeBuddyError, ValueError) as exc: print(f"错误: {exc}", file=sys.stderr) return 1 @@ -2031,10 +2277,6 @@ def _run_proxy(args: argparse.Namespace) -> int: logger = setup_logging(log_dir) json_logger = setup_json_logging(args.log_file) - # 处理登录 - if args.login: - client.login(open_browser=not args.no_browser) - # 创建全局状态 proxy_state = ProxyState( client=client, @@ -2045,6 +2287,7 @@ def _run_proxy(args: argparse.Namespace) -> int: verbose_llm=args.verbose_llm, logger=logger, json_logger=json_logger, + account_manager=manager, ) proxy_state.write_log( "startup", @@ -2086,13 +2329,19 @@ def _run_proxy(args: argparse.Namespace) -> int: # 启动信息输出到 stdout print(f"CodeBuddy proxy listening on http://{args.host}:{args.port}") print("Endpoints: /v1/models /v1/chat/completions /v1/responses /v1/messages /health") + if manager is not None: + print(f"Account manager: http://127.0.0.1:{args.port}/admin (local access only)") # 同时记录到日志 logger.info(f"CodeBuddy proxy listening on http://{args.host}:{args.port}") logger.info("Endpoints: /v1/models /v1/chat/completions /v1/responses /v1/messages /health") # 启动 uvicorn - run_http_server(host=args.host, port=args.port, windows_loop=args.windows_loop) + try: + run_http_server(host=args.host, port=args.port, windows_loop=args.windows_loop) + finally: + if manager is not None: + manager.close() return 0 diff --git a/src/codebuddy_proxy/account_checkin.py b/src/codebuddy_proxy/account_checkin.py new file mode 100644 index 0000000..685bfc5 --- /dev/null +++ b/src/codebuddy_proxy/account_checkin.py @@ -0,0 +1,815 @@ +"""Per-account daily check-in automation with fail-closed status handling.""" + +from __future__ import annotations + +import asyncio +from collections.abc import Awaitable, Callable +from datetime import date, datetime, time, timedelta, timezone +import json +import logging +import random +import threading +import time as time_module +from typing import Any + +from fastapi.responses import Response + +from codebuddy_proxy.billing_proxy import forward_billing + + +BEIJING = timezone(timedelta(hours=8), name="Asia/Shanghai") +STATUS_PATH = "/v2/billing/meter/checkin-status" +CHECKIN_PATH = "/v2/billing/meter/daily-checkin" +_SAFE_ERRORS = frozenset( + { + "签到活动未开放", + "签到状态查询失败", + "签到请求失败", + "签到结果未确认", + "账号不存在", + } +) +_REASONS = frozenset({"manual", "startup", "enable", "midnight", "timer"}) + + +class _BillingAdapterState: + """Bind billing_proxy to one saved client without its global failover hook.""" + + managed_auth = True + account_runtime = None + logger = None + json_logger = None + + def __init__(self, client: Any, diagnostic: Callable[..., Any]) -> None: + self.client = client + self._diagnostic = diagnostic + + def ensure_auth(self) -> None: + self.client.ensure_authenticated(open_browser=False, allow_login=False) + + +Requester = Callable[[Any, str, str], Awaitable[Response]] +Clock = Callable[[], datetime | float | int] +Sleep = Callable[[float], Awaitable[Any]] + + +class AccountCheckinService: + """Check and optionally sign each account without changing the active one. + + ``clock`` returns a datetime or Unix timestamp. ``random_delay`` returns a + delay in seconds in the midnight window. Both hooks, plus ``sleep`` and + ``requester``, exist so timer behavior can be tested without waiting. + """ + + def __init__( + self, + manager: Any, + *, + clock: Clock | None = None, + random_delay: Callable[[], float] | None = None, + sleep: Sleep | None = None, + requester: Requester | None = None, + max_concurrent: int = 4, + ) -> None: + if max_concurrent < 1: + raise ValueError("max_concurrent must be positive") + self.manager = manager + self._clock = clock or self._system_clock + self._random_delay = random_delay or (lambda: random.uniform(0.0, 600.0)) + self._sleep = sleep or asyncio.sleep + self._requester = requester or self._forward_request + self._semaphore = asyncio.Semaphore(max_concurrent) + + self._state_guard = threading.RLock() + self._states: dict[str, dict[str, Any]] = {} + self._account_locks: dict[str, asyncio.Lock] = {} + self._post_started: set[tuple[str, str]] = set() + self._logging_callback: Callable[..., Any] | None = None + + self._loop: asyncio.AbstractEventLoop | None = None + self._started = False + self._closed = False + self._stop_event = threading.Event() + self._scheduler_task: asyncio.Task[Any] | None = None + self._tasks: set[asyncio.Task[Any]] = set() + self._task_keys: dict[asyncio.Task[Any], tuple[str, str] | None] = {} + self._random_tasks: dict[tuple[str, str], asyncio.Task[Any]] = {} + + @staticmethod + def _system_clock() -> datetime: + return datetime.now(timezone.utc).astimezone(BEIJING) + + def _now(self) -> datetime: + value = self._clock() + if isinstance(value, datetime): + if value.tzinfo is None: + return value.replace(tzinfo=BEIJING) + return value.astimezone(BEIJING) + return datetime.fromtimestamp(float(value), BEIJING) + + def _epoch(self) -> float: + return self._now().timestamp() + + def _today(self) -> str: + return self._now().date().isoformat() + + def configure_logging(self, callback: Callable[..., Any] | None) -> None: + self._logging_callback = callback + + def _log(self, event: str, **fields: Any) -> None: + safe = { + key: value + for key, value in fields.items() + if key in { + "account_id", + "date", + "reason", + "status", + "http_status", + "next_checkin_at", + } + and (value is None or isinstance(value, (str, int, float, bool))) + } + try: + if self._logging_callback is not None: + self._logging_callback(event, **safe) + else: + logging.getLogger(__name__).info("%s %s", event, safe) + except Exception: + # Diagnostics must never change authentication or check-in behavior. + logging.getLogger(__name__).debug("check-in diagnostic callback failed") + + async def _forward_request(self, client: Any, method: str, path: str) -> Response: + state = _BillingAdapterState(client, self._log) + return await forward_billing(state, method, path, self._log) + + def snapshot(self, account_id: str) -> dict[str, Any]: + """Return the cached state only; never make an upstream request here.""" + + today = self._today() + with self._state_guard: + current = self._states.get(account_id) + if current is None or current["date"] != today: + return self._empty_state(today) + return dict(current) + + @staticmethod + def _empty_state(target_date: str) -> dict[str, Any]: + return { + "date": target_date, + "status": "unknown", + "checked": None, + "last_checked_at": None, + "last_checkin_at": None, + "error": None, + "next_checkin_at": None, + } + + def _state(self, account_id: str) -> dict[str, Any]: + today = self._today() + with self._state_guard: + current = self._states.get(account_id) + if current is None or current["date"] != today: + current = self._empty_state(today) + self._states[account_id] = current + return current + + def _account_lock(self, account_id: str) -> asyncio.Lock: + with self._state_guard: + lock = self._account_locks.get(account_id) + if lock is None: + lock = asyncio.Lock() + self._account_locks[account_id] = lock + return lock + + def _has_account(self, account_id: str) -> bool: + has_account = getattr(self.manager, "has_account", None) + if callable(has_account): + try: + return bool(has_account(account_id)) + except Exception: + return False + try: + return any( + isinstance(record, dict) and record.get("id") == account_id + for record in self.manager.store.list_accounts() + ) + except Exception: + return False + + def _account_ids(self) -> list[str]: + try: + records = self.manager.store.list_accounts() + except Exception: + return [] + result = [] + for record in records: + if isinstance(record, dict): + account_id = record.get("id") + if isinstance(account_id, str) and account_id: + result.append(account_id) + return result + + def _get_client(self, account_id: str) -> Any | None: + if not self._has_account(account_id): + return None + try: + return self.manager.store.get_client(account_id) + except Exception: + return None + + def _enabled(self) -> bool: + try: + return self.manager.get_settings().get("auto_checkin_enabled") is True + except Exception: + return False + + @staticmethod + def _reason(reason: str) -> str: + return reason if isinstance(reason, str) and reason in _REASONS else "manual" + + async def check_status(self, account_id: str, reason: str = "manual") -> dict[str, Any]: + async with self._account_lock(account_id): + return await self._check_status_locked(account_id, self._reason(reason)) + + async def _check_status_locked(self, account_id: str, reason: str) -> dict[str, Any]: + state = self._state(account_id) + client = self._get_client(account_id) + if client is None: + self._set_error(state, "账号不存在") + state["next_checkin_at"] = None + self._cancel_random_task(account_id, state["date"]) + self._log( + "account_checkin_status_skipped", + account_id=account_id, + date=state["date"], + reason=reason, + status="account_missing", + ) + return dict(state) + + previous = dict(state) + state.update(status="checking", checked=None, error=None) + self._log( + "account_checkin_status_check_started", + account_id=account_id, + date=state["date"], + reason=reason, + status="checking", + ) + try: + response = await self._request( + client, "POST", STATUS_PATH, account_id, reason + ) + except asyncio.CancelledError: + if state["date"] == self._today(): + stable = previous + if stable.get("status") in {"checking", "signing"}: + stable = self._empty_state(state["date"]) + state.clear() + state.update(stable) + state["next_checkin_at"] = None + raise + now = self._epoch() + state["last_checked_at"] = now + status_result = self._parse_status(response) + if status_result[0] == "checked": + state.update( + status="checked", checked=True, error=None, next_checkin_at=None + ) + self._cancel_random_task(account_id, state["date"]) + elif status_result[0] == "unchecked": + state.update(status="unchecked", checked=False, error=None) + elif status_result[0] == "inactive": + self._set_error(state, "签到活动未开放") + state["next_checkin_at"] = None + self._cancel_random_task(account_id, state["date"]) + else: + self._set_error(state, "签到状态查询失败") + self._log( + "account_checkin_status_checked", + account_id=account_id, + date=state["date"], + reason=reason, + status=state["status"], + http_status=response.status_code, + ) + return dict(state) + + async def check_in(self, account_id: str, reason: str = "manual") -> dict[str, Any]: + async with self._account_lock(account_id): + return await self._check_in_locked( + account_id, + self._reason(reason), + target_date=self._today(), + require_enabled=False, + ) + + async def _check_in_locked( + self, + account_id: str, + reason: str, + *, + target_date: str, + require_enabled: bool, + ) -> dict[str, Any]: + state = self._state(account_id) + if self._today() != target_date: + self._log( + "account_checkin_action_skipped", + account_id=account_id, + date=target_date, + reason=reason, + status="date_expired", + ) + return dict(state) + status = await self._check_status_locked(account_id, reason) + state = self._state(account_id) + if status["status"] != "unchecked": + self._log( + "account_checkin_action_skipped", + account_id=account_id, + date=target_date, + reason=reason, + status=status["status"], + ) + return dict(state) + if not self._before_post_allowed(account_id, target_date, require_enabled): + self._log( + "account_checkin_action_skipped", + account_id=account_id, + date=target_date, + reason=reason, + status="disabled_or_expired", + ) + return dict(state) + marker = (account_id, target_date) + with self._state_guard: + if marker in self._post_started: + self._set_error(state, "签到结果未确认") + self._log( + "account_checkin_action_skipped", + account_id=account_id, + date=target_date, + reason=reason, + status="already_attempted", + ) + return dict(state) + # Mark before yielding to the requester. A timeout or cancellation + # after this point must not send the same daily action twice. + self._post_started.add(marker) + + client = self._get_client(account_id) + if client is None: + with self._state_guard: + self._post_started.discard(marker) + self._set_error(state, "账号不存在") + return dict(state) + + state.update(status="signing", checked=False, error=None, next_checkin_at=None) + try: + response = await self._request( + client, + "POST", + CHECKIN_PATH, + account_id, + reason, + before_request=lambda: self._before_post_allowed( + account_id, target_date, require_enabled + ), + on_start=lambda: self._log( + "account_checkin_action_started", + account_id=account_id, + date=target_date, + reason=reason, + status="signing", + ), + ) + except asyncio.CancelledError: + if state["date"] == self._today(): + state.update( + status="unknown", + checked=None, + error=None, + next_checkin_at=None, + ) + raise + if response is None: + with self._state_guard: + self._post_started.discard(marker) + state.update(status="unchecked", checked=False, error=None) + self._log( + "account_checkin_action_skipped", + account_id=account_id, + date=target_date, + reason=reason, + status="disabled_or_expired", + ) + return dict(state) + post_kind, _ = self._parse_business_response(response) + if post_kind not in {"ok", "already"}: + if self._explicit_post_rejection(response): + confirmed = await self._check_status_locked(account_id, reason) + state = self._state(account_id) + if confirmed["status"] == "checked": + return dict(state) + if confirmed["status"] == "unchecked": + with self._state_guard: + self._post_started.discard(marker) + self._set_error(state, "签到请求失败") + self._log( + "account_checkin_failed", + account_id=account_id, + date=target_date, + reason=reason, + status="error", + http_status=response.status_code, + ) + return dict(state) + + # Even a successful POST must be confirmed by today's status endpoint; + # code 10001 is only an already-signed hint, never proof by itself. + confirmed = await self._check_status_locked(account_id, reason) + state = self._state(account_id) + if confirmed["status"] == "checked": + state["last_checkin_at"] = self._epoch() + self._log( + "account_checkin_confirmed", + account_id=account_id, + date=target_date, + reason=reason, + status="checked", + http_status=response.status_code, + ) + elif confirmed["status"] != "error": + self._set_error(state, "签到结果未确认") + return dict(state) + + def _before_post_allowed( + self, account_id: str, target_date: str, require_enabled: bool + ) -> bool: + return ( + not self._stop_event.is_set() + and self._today() == target_date + and self._has_account(account_id) + and (not require_enabled or self._enabled()) + ) + + @staticmethod + def _set_error(state: dict[str, Any], error: str) -> None: + state.update( + status="error", + checked=None, + error=error if error in _SAFE_ERRORS else "签到请求失败", + ) + + def _cancel_random_task(self, account_id: str, target_date: str) -> None: + key = (account_id, target_date) + task = self._random_tasks.pop(key, None) + if task is not None and task is not asyncio.current_task() and not task.done(): + task.cancel() + + @classmethod + def _explicit_post_rejection(cls, response: Response) -> bool: + if response.status_code == 429 or 400 <= response.status_code < 500: + return True + value = cls._response_json(response) + if value is None: + return False + code = value.get("code") + return type(code) is int and code not in {0, 10001} + + async def _request( + self, + client: Any, + method: str, + path: str, + account_id: str, + reason: str, + *, + before_request: Callable[[], bool] | None = None, + on_start: Callable[[], Any] | None = None, + ) -> Response | None: + async with self._semaphore: + if before_request is not None and not before_request(): + return None + if on_start is not None: + on_start() + try: + response = await self._requester(client, method, path) + except asyncio.CancelledError: + raise + except Exception: + self._log( + "account_checkin_upstream_failed", + account_id=account_id, + date=self._today(), + reason=reason, + status="error", + ) + response = Response(status_code=502, content=b"") + if response.status_code == 429: + await self._record_rate_limit(client, response.headers.get("Retry-After")) + return response + + async def _record_rate_limit(self, client: Any, retry_after: str | None) -> None: + handler = getattr(self.manager, "handle_rate_limit", None) + if not callable(handler): + return + try: + result = await asyncio.to_thread( + handler, client, retry_after, allow_switch=False + ) + if hasattr(result, "__await__"): + await result + except Exception: + self._log("account_checkin_rate_limit_record_failed") + + @staticmethod + def _response_json(response: Response) -> dict[str, Any] | None: + if not 200 <= int(response.status_code) < 300: + return None + try: + value = json.loads(response.body) + except (TypeError, ValueError, UnicodeDecodeError): + return None + if not isinstance(value, dict): + return None + # Some client wrappers retain the upstream envelope under this key; + # still validate its own business code and data strictly. + upstream = value.get("upstream") + if isinstance(upstream, dict): + value = upstream + return value + + @classmethod + def _parse_business_response(cls, response: Response) -> tuple[str, dict[str, Any] | None]: + value = cls._response_json(response) + if value is None: + return "failure", None + code = value.get("code") + if type(code) is int and code == 0: + data = value.get("data") + return ("ok", data if isinstance(data, dict) else None) + if type(code) is int and code == 10001: + return "already", None + return "failure", None + + @classmethod + def _parse_status(cls, response: Response) -> tuple[str, bool | None]: + value = cls._response_json(response) + if value is None or type(value.get("code")) is not int or value["code"] != 0: + return "unknown", None + data = value.get("data") + if not isinstance(data, dict): + return "unknown", None + if data.get("active") is False: + return "inactive", None + if "today_checked_in" in data: + result = data.get("today_checked_in") + else: + # ``checked`` is retained only for older, explicit boolean fixtures. + result = data.get("checked") + if type(result) is not bool: + return "unknown", None + return ("checked" if result else "unchecked"), result + + async def start(self) -> None: + """Register timers and return immediately; network work runs in tasks.""" + + if self._started or self._closed: + return + self._loop = asyncio.get_running_loop() + self._started = True + if self._enabled(): + self._schedule_catchup("startup") + self._scheduler_task = self._loop.create_task(self._scheduler_loop()) + + def settings_changed(self, enabled: bool) -> None: + """Apply a setting transition safely from either loop or worker thread.""" + + loop = self._loop + if loop is None or loop.is_closed() or not self._started or self._closed: + return + loop.call_soon_threadsafe(self._apply_settings_change, bool(enabled)) + + def _apply_settings_change(self, enabled: bool) -> None: + if self._closed or self._stop_event.is_set(): + return + # Callbacks can arrive out of order from concurrent settings writers. + # The persisted setting at execution time is authoritative. + enabled = self._enabled() + if not enabled: + for key, task in list(self._random_tasks.items()): + if not task.done(): + task.cancel() + self._random_tasks.pop(key, None) + account_id, target_date = key + state = self._state(account_id) + if state["date"] == target_date and state["status"] == "unchecked": + state["next_checkin_at"] = None + # Cancel other automatic work before its POST gate. A task whose + # POST has already begun is allowed to finish its single request. + for task in list(self._tasks): + key = self._task_keys.get(task) + if key is not None and key in self._post_started: + continue + if task is not asyncio.current_task() and not task.done(): + task.cancel() + return + self._schedule_catchup("enable") + + def _schedule_catchup(self, reason: str) -> None: + if not self._enabled() or self._stop_event.is_set() or self._loop is None: + return + target_date = self._today() + for account_id in self._account_ids(): + self._spawn( + self._automatic_checkin(account_id, target_date, reason), + key=(account_id, target_date), + ) + + async def _automatic_checkin( + self, account_id: str, target_date: str, reason: str + ) -> None: + async with self._account_lock(account_id): + if not self._before_post_allowed(account_id, target_date, True): + self._log( + "account_checkin_action_skipped", + account_id=account_id, + date=target_date, + reason=reason, + status="disabled_or_expired", + ) + return + await self._check_in_locked( + account_id, + self._reason(reason), + target_date=target_date, + require_enabled=True, + ) + + async def _prepare_midnight( + self, account_id: str, target_date: str, midnight: datetime + ) -> None: + if not self._before_post_allowed(account_id, target_date, True): + self._log( + "account_checkin_midnight_skipped", + account_id=account_id, + date=target_date, + reason="midnight", + status="disabled_or_expired", + ) + return + result = await self.check_status(account_id, reason="midnight") + if result["status"] != "unchecked": + self._log( + "account_checkin_midnight_skipped", + account_id=account_id, + date=target_date, + reason="midnight", + status=result["status"], + ) + return + if not self._before_post_allowed(account_id, target_date, True): + self._log( + "account_checkin_midnight_skipped", + account_id=account_id, + date=target_date, + reason="midnight", + status="disabled_or_expired", + ) + return + try: + offset = float(self._random_delay()) + except (TypeError, ValueError, OverflowError): + offset = 0.0 + if not (offset >= 0.0 and offset <= 600.0): + offset = min(600.0, max(0.0, offset)) if offset == offset else 0.0 + due = midnight + timedelta(seconds=offset) + due_epoch = due.timestamp() + state = self._state(account_id) + state["next_checkin_at"] = due_epoch + self._log( + "account_checkin_scheduled", + account_id=account_id, + date=target_date, + reason="midnight", + status="unchecked", + next_checkin_at=due_epoch, + ) + key = (account_id, target_date) + old = self._random_tasks.get(key) + if old is not None and not old.done(): + old.cancel() + task = self._spawn( + self._random_followup(account_id, target_date, due), key=key + ) + self._random_tasks[key] = task + + async def _random_followup( + self, account_id: str, target_date: str, due: datetime + ) -> None: + delay = max(0.0, due.timestamp() - self._epoch()) + await self._sleep(delay) + key = (account_id, target_date) + self._random_tasks.pop(key, None) + state = self._state(account_id) + if not self._before_post_allowed(account_id, target_date, True): + if state["date"] == target_date and state["status"] == "unchecked": + state["next_checkin_at"] = None + if self._today() != target_date: + skip_status = "date_expired" + elif not self._has_account(account_id): + skip_status = "account_missing" + else: + skip_status = "disabled_or_expired" + self._log( + "account_checkin_action_skipped", + account_id=account_id, + date=target_date, + reason="timer", + status=skip_status, + ) + return + state["next_checkin_at"] = None + await self._automatic_checkin(account_id, target_date, "timer") + + async def _run_midnight(self, target_date: date) -> None: + target = target_date.isoformat() + midnight = datetime.combine(target_date, time.min, tzinfo=BEIJING) + for account_id in self._account_ids(): + self._spawn( + self._prepare_midnight(account_id, target, midnight), + key=(account_id, target), + ) + + async def _scheduler_loop(self) -> None: + try: + while not self._stop_event.is_set(): + now = self._now() + next_day = now.date() + timedelta(days=1) + midnight = datetime.combine(next_day, time.min, tzinfo=BEIJING) + await self._sleep(max(0.0, (midnight - now).total_seconds())) + if self._stop_event.is_set(): + break + if self._enabled(): + await self._run_midnight(next_day) + except asyncio.CancelledError: + raise + + def _spawn( + self, + coroutine: Awaitable[Any], + *, + key: tuple[str, str] | None = None, + ) -> asyncio.Task[Any]: + if self._loop is None: + self._loop = asyncio.get_running_loop() + task = self._loop.create_task(coroutine) + self._tasks.add(task) + self._task_keys[task] = key + + def done(completed: asyncio.Task[Any]) -> None: + self._tasks.discard(completed) + task_key = self._task_keys.pop(completed, None) + if task_key is not None and self._random_tasks.get(task_key) is completed: + self._random_tasks.pop(task_key, None) + try: + completed.exception() + except (asyncio.CancelledError, Exception): + pass + + task.add_done_callback(done) + return task + + def stop(self) -> None: + """Synchronously signal shutdown and schedule cancellation on the loop.""" + + self._stop_event.set() + loop = self._loop + if loop is not None and not loop.is_closed(): + loop.call_soon_threadsafe(self._cancel_all_on_loop) + + def _cancel_all_on_loop(self) -> None: + if self._scheduler_task is not None and not self._scheduler_task.done(): + self._scheduler_task.cancel() + for task in list(self._tasks): + if not task.done(): + task.cancel() + self._random_tasks.clear() + + async def close(self) -> None: + if self._closed: + return + self._closed = True + self.stop() + current = asyncio.current_task() + tasks = [task for task in self._tasks if task is not current] + if self._scheduler_task is not None and self._scheduler_task is not current: + tasks.append(self._scheduler_task) + for task in tasks: + if not task.done(): + task.cancel() + if tasks: + await asyncio.gather(*tasks, return_exceptions=True) diff --git a/src/codebuddy_proxy/account_manager.py b/src/codebuddy_proxy/account_manager.py new file mode 100644 index 0000000..897bf7c --- /dev/null +++ b/src/codebuddy_proxy/account_manager.py @@ -0,0 +1,872 @@ +"""Account switching and bounded background login management. + +Login credentials are first written to a private temporary session file. The +temporary client is imported into the account store only after authentication +has completed and the job still owns the commit boundary. +""" + +from __future__ import annotations + +from concurrent.futures import Future, ThreadPoolExecutor +from dataclasses import dataclass, field +from datetime import timezone +from email.utils import parsedate_to_datetime +import ipaddress +import json +import math +import pathlib +import re +import tempfile +import threading +import time +import uuid +from typing import Any, Callable +from urllib.parse import urlsplit + +from codebuddy_proxy.account_store import _atomic_json +from codebuddy_proxy.backend_profile import profile_for_key, resolve_backend +from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient, CodeBuddyError + + +class AccountManagerError(CodeBuddyError): + """An expected account-management error safe to show to a local user.""" + + def __init__(self, message: str, *, status_code: int = 400) -> None: + super().__init__(message) + self.message = message + self.status_code = status_code + + +_TERMINAL = frozenset({"succeeded", "failed", "cancelled"}) +_PUBLIC_JOB_FIELDS = ("id", "backend", "status", "auth_url", "error", "account_id") +_PUBLIC_ACCOUNT_FIELDS = ( + "id", + "backend", + "endpoint", + "uid", + "nickname", + "active", + "rate_limited", + "cooldown_until", + "cooldown_remaining_seconds", + "last_rate_limited_at", + "cooldown_source", + "checkin", +) +_RUNTIME_STATE_VERSION = 1 +_RUNTIME_STATE_FILENAME = "account-manager-state-v1.json" +_DEFAULT_COOLDOWN_SECONDS = 60 +_RETRY_AFTER_SECONDS_RE = re.compile(r"^[0-9]+$") + + +@dataclass(slots=True) +class _LoginJob: + id: str + backend: str + created_at: float + status: str = "pending" + auth_url: str | None = None + error: str | None = None + account_id: str | None = None + updated_at: float = field(default_factory=time.monotonic) + cancel_event: threading.Event = field(default_factory=threading.Event) + lock: threading.RLock = field(default_factory=threading.RLock) + future: Future[Any] | None = None + + +class AccountManager: + """Coordinate the account store and bounded, cancellable login jobs.""" + + def __init__( + self, + store: Any, + *, + max_concurrent_logins: int = 2, + retained_job_limit: int = 100, + job_ttl_seconds: float = 15 * 60, + login_timeout: int = 300, + client_factory: Callable[[str, pathlib.Path], Any] | None = None, + ) -> None: + if max_concurrent_logins < 1: + raise ValueError("max_concurrent_logins must be positive") + if retained_job_limit < 1: + raise ValueError("retained_job_limit must be positive") + self.store = store + self._max_concurrent_logins = max_concurrent_logins + self._retained_job_limit = retained_job_limit + self._job_ttl_seconds = max(0.0, job_ttl_seconds) + self._login_timeout = max(1, int(login_timeout)) + self._client_factory = client_factory or self._create_login_client + self._lock = threading.RLock() + self._store_lock = threading.RLock() + self._runtime_lock = threading.RLock() + self._runtime_state_path = self._find_runtime_state_path() + self._settings = { + "auto_switch_on_429": False, + "default_cooldown_seconds": _DEFAULT_COOLDOWN_SECONDS, + "auto_checkin_enabled": False, + } + self._cooldowns: dict[str, dict[str, Any]] = {} + self._load_runtime_state() + self._closed = False + self._jobs: dict[str, _LoginJob] = {} + self._executor = ThreadPoolExecutor( + max_workers=max_concurrent_logins, + thread_name_prefix="codebuddy-login", + ) + from codebuddy_proxy.account_checkin import AccountCheckinService + + self.checkins = AccountCheckinService(self) + + @property + def client(self) -> Any | None: + """Return the currently active client, if the store has one.""" + + with self._store_lock: + return self.store.active_client() + + def snapshot(self) -> dict[str, Any]: + """Return safe account metadata, cooldowns, settings, and server time.""" + + with self._store_lock: + accounts = self.store.list_accounts() + active_id = self.store.active_account_id + server_time = time.time() + with self._runtime_lock: + safe_accounts = [] + for account in accounts: + if not isinstance(account, dict): + continue + safe = { + key: account[key] + for key in _PUBLIC_ACCOUNT_FIELDS[:6] + if key in account + } + account_id = account.get("id") + if not isinstance(account_id, str): + account_id = None + cooldown = self._cooldowns.get(account_id) + deadline = cooldown.get("deadline") if cooldown else None + active_cooldown = ( + cooldown is not None + and isinstance(deadline, (int, float)) + and deadline > server_time + ) + safe.update( + { + "rate_limited": active_cooldown, + "cooldown_until": deadline if active_cooldown else None, + "cooldown_remaining_seconds": ( + max(0, math.ceil(deadline - server_time)) + if active_cooldown + else 0 + ), + "last_rate_limited_at": ( + cooldown.get("last_rate_limited_at") if cooldown else None + ), + "cooldown_source": ( + cooldown.get("source") if active_cooldown else None + ), + } + ) + safe_accounts.append(safe) + settings = dict(self._settings) + for account in safe_accounts: + account_id = account.get("id") + account["checkin"] = self.checkins.snapshot( + account_id if isinstance(account_id, str) else "" + ) + return { + "accounts": safe_accounts, + "active_account_id": active_id, + "settings": settings, + "server_time": server_time, + } + + def activate(self, account_id: str) -> None: + """Make an existing account active and persist the choice in the store.""" + + with self._store_lock: + if not self._has_account_locked(account_id): + raise AccountManagerError("未找到该账号", status_code=404) + try: + self.store.set_active(account_id) + except (KeyError, FileNotFoundError): + raise AccountManagerError("未找到该账号", status_code=404) from None + + def has_account(self, account_id: str) -> bool: + """Return whether an account id is present in the persistent store.""" + + with self._store_lock: + return self._has_account_locked(account_id) + + def account_id_for_client(self, client: Any) -> str | None: + """Find a stored account by its backend, endpoint, and uid identity.""" + + identity = _client_identity(client) + if identity is None: + return None + backend, endpoint, uid = identity + with self._store_lock: + return self._account_id_for_identity_locked(backend, endpoint, uid) + + def handle_rate_limit( + self, + client: Any, + retry_after: Any, + *, + excluded_account_ids: set[str] | None = None, + allow_switch: bool = True, + ) -> Any | None: + """Record a 429 cooldown and optionally switch within the same region.""" + + identity = _client_identity(client) + if identity is None: + return None + backend, endpoint, uid = identity + with self._store_lock: + account_id = self._account_id_for_identity_locked(backend, endpoint, uid) + if account_id is None: + return None + now = time.time() + delay, source = _cooldown_delay(retry_after, now) + deadline = now + delay + with self._runtime_lock: + previous = self._cooldowns.get(account_id) + if previous is not None and previous.get("deadline", 0) > now: + if previous["deadline"] > deadline: + deadline = previous["deadline"] + source = previous["source"] + self._cooldowns[account_id] = { + "deadline": deadline, + "last_rate_limited_at": now, + "source": source, + } + self._save_runtime_state_locked() + + excluded = { + item for item in (excluded_account_ids or set()) if isinstance(item, str) + } + excluded.add(account_id) + with self._store_lock: + with self._runtime_lock: + if ( + not allow_switch + or not self._settings["auto_switch_on_429"] + or self.store.active_account_id != account_id + ): + return None + accounts = self.store.list_accounts() + for candidate in accounts: + if not isinstance(candidate, dict): + continue + candidate_id = candidate.get("id") + if ( + not isinstance(candidate_id, str) + or candidate_id in excluded + or candidate.get("backend") != backend + or candidate.get("endpoint") != endpoint + ): + continue + cooldown = self._cooldowns.get(candidate_id) + if ( + cooldown is not None + and cooldown.get("deadline", 0) > time.time() + ): + continue + try: + candidate_client = self.store.get_client(candidate_id) + except Exception: + # A broken/missing session is not an eligible failover. + continue + if not _client_has_usable_auth(candidate_client): + continue + # This is serialized with explicit activate() calls under + # _store_lock; a manual selection can never be displaced + # by a delayed response from a previously active client. + return self.store.set_active(candidate_id) + return None + + def get_settings(self) -> dict[str, Any]: + with self._runtime_lock: + return dict(self._settings) + + def set_settings( + self, + auto_switch_on_429: bool | None = None, + *, + auto_checkin_enabled: bool | None = None, + ) -> dict[str, Any]: + if auto_switch_on_429 is None and auto_checkin_enabled is None: + raise AccountManagerError("至少需要设置一个账号管理开关", status_code=400) + if auto_switch_on_429 is not None and type(auto_switch_on_429) is not bool: + raise AccountManagerError("auto_switch_on_429 必须为布尔值", status_code=400) + if auto_checkin_enabled is not None and type(auto_checkin_enabled) is not bool: + raise AccountManagerError("auto_checkin_enabled 必须为布尔值", status_code=400) + with self._runtime_lock: + previous = dict(self._settings) + if auto_switch_on_429 is not None: + self._settings["auto_switch_on_429"] = auto_switch_on_429 + if auto_checkin_enabled is not None: + self._settings["auto_checkin_enabled"] = auto_checkin_enabled + try: + self._save_runtime_state_locked() + except Exception: + self._settings = previous + raise + updated = dict(self._settings) + checkin_transition = ( + previous["auto_checkin_enabled"] + != updated["auto_checkin_enabled"] + ) + if checkin_transition: + self.checkins.settings_changed(updated["auto_checkin_enabled"]) + return updated + + def delete(self, account_id: str) -> None: + """Delete an inactive account.""" + + with self._store_lock: + if not self._has_account_locked(account_id): + raise AccountManagerError("未找到该账号", status_code=404) + if self.store.active_account_id == account_id: + raise AccountManagerError("请先切换到其他账号,再删除此账号", status_code=409) + + # Remove persisted runtime state first. If this write fails, the + # account remains untouched; otherwise a deleted identity could + # retain a cooldown on disk and inherit it if re-imported later. + removed_cooldown: dict[str, Any] | None = None + with self._runtime_lock: + removed_cooldown = self._cooldowns.pop(account_id, None) + if removed_cooldown is not None: + try: + self._save_runtime_state_locked() + except Exception: + self._cooldowns[account_id] = removed_cooldown + raise + + try: + self.store.delete_account(account_id) + except (KeyError, FileNotFoundError): + self._restore_deleted_account_cooldown(account_id, removed_cooldown) + raise AccountManagerError("未找到该账号", status_code=404) from None + except Exception: + self._restore_deleted_account_cooldown(account_id, removed_cooldown) + raise + + def _restore_deleted_account_cooldown( + self, account_id: str, cooldown: dict[str, Any] | None + ) -> None: + if cooldown is None: + return + with self._runtime_lock: + self._cooldowns[account_id] = cooldown + self._save_runtime_state_locked() + + def _account_id_for_identity_locked( + self, backend: str, endpoint: str, uid: str + ) -> str | None: + for account in self.store.list_accounts(): + if ( + isinstance(account, dict) + and account.get("backend") == backend + and account.get("endpoint") == endpoint + and str(account.get("uid", "")).strip() == uid + ): + account_id = account.get("id") + if isinstance(account_id, str): + return account_id + return None + + def _find_runtime_state_path(self) -> pathlib.Path | None: + root = getattr(self.store, "root", None) + if root is None: + return None + try: + return pathlib.Path(root).expanduser() / _RUNTIME_STATE_FILENAME + except (TypeError, ValueError, OSError) as exc: + raise AccountManagerError("账号管理状态目录无效,未修改任何数据", status_code=503) from exc + + def _load_runtime_state(self) -> None: + path = self._runtime_state_path + if path is None: + return + if path.is_symlink(): + raise AccountManagerError("账号管理状态文件无效,未修改任何数据", status_code=503) + try: + value = json.loads( + path.read_text(encoding="utf-8"), + object_pairs_hook=_unique_runtime_object, + ) + except FileNotFoundError: + return + except ( + OSError, + json.JSONDecodeError, + UnicodeDecodeError, + _DuplicateRuntimeStateKey, + RecursionError, + ): + raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) from None + if not isinstance(value, dict) or set(value) != {"version", "settings", "cooldowns"}: + raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) + if ( + type(value.get("version")) is not int + or value.get("version") != _RUNTIME_STATE_VERSION + ): + raise AccountManagerError("账号管理状态文件版本不受支持,未修改任何数据", status_code=503) + settings = value.get("settings") + if ( + not isinstance(settings, dict) + or set(settings) + not in ( + {"auto_switch_on_429", "default_cooldown_seconds"}, + { + "auto_switch_on_429", + "default_cooldown_seconds", + "auto_checkin_enabled", + }, + ) + or type(settings.get("auto_switch_on_429")) is not bool + or type(settings.get("default_cooldown_seconds")) is not int + or settings.get("default_cooldown_seconds") != _DEFAULT_COOLDOWN_SECONDS + or ( + "auto_checkin_enabled" in settings + and type(settings.get("auto_checkin_enabled")) is not bool + ) + ): + raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) + cooldowns = value.get("cooldowns") + if not isinstance(cooldowns, dict): + raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) + loaded: dict[str, dict[str, Any]] = {} + for account_id, record in cooldowns.items(): + if ( + not isinstance(account_id, str) + or not account_id + or len(account_id) > 256 + or not isinstance(record, dict) + or set(record) != {"deadline", "last_rate_limited_at", "source"} + or not _finite_number(record.get("deadline")) + or not _finite_number(record.get("last_rate_limited_at")) + or record.get("source") not in ("retry_after", "default") + ): + raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) + loaded[account_id] = { + "deadline": float(record["deadline"]), + "last_rate_limited_at": float(record["last_rate_limited_at"]), + "source": record["source"], + } + self._settings = { + "auto_switch_on_429": settings["auto_switch_on_429"], + "default_cooldown_seconds": _DEFAULT_COOLDOWN_SECONDS, + "auto_checkin_enabled": settings.get("auto_checkin_enabled", False), + } + self._cooldowns = loaded + + def _save_runtime_state_locked(self) -> None: + path = self._runtime_state_path + if path is None: + return + payload = { + "version": _RUNTIME_STATE_VERSION, + "settings": dict(self._settings), + "cooldowns": { + account_id: dict(record) + for account_id, record in self._cooldowns.items() + }, + } + try: + _atomic_json(path, payload) + except Exception: + # Keep private paths and low-level storage details out of manager + # responses. The caller sees only a fixed error message. + raise AccountManagerError("无法保存账号管理状态", status_code=500) from None + + + def start_login(self, backend: str) -> dict[str, Any]: + """Start a login flow and return its opaque job identifier.""" + + if backend not in {"domestic", "global"}: + raise AccountManagerError("backend 必须为 domestic 或 global", status_code=400) + + now = time.monotonic() + with self._lock: + if self._closed: + raise AccountManagerError("账号管理器已关闭", status_code=503) + self._reap_jobs_locked(now) + active_workers = sum( + job.future is None or not job.future.done() + for job in self._jobs.values() + ) + if active_workers >= self._max_concurrent_logins: + raise AccountManagerError("当前登录任务较多,请稍后重试", status_code=429) + + job = _LoginJob(id=uuid.uuid4().hex, backend=backend, created_at=now) + self._jobs[job.id] = job + try: + job.future = self._executor.submit(self._run_login, job) + except RuntimeError: + self._jobs.pop(job.id, None) + raise AccountManagerError("账号管理器已关闭", status_code=503) from None + return self._public_job(job) + + def get_login(self, job_id: str) -> dict[str, Any]: + job = self._find_job(job_id) + return self._public_job(job) + + def cancel_login(self, job_id: str) -> dict[str, Any]: + job = self._find_job(job_id) + with job.lock: + if job.status == "pending": + # This transition is the cancellation linearization point. A + # worker that finishes after it cannot import into the store. + job.cancel_event.set() + job.status = "cancelled" + job.error = None + job.updated_at = time.monotonic() + return self._public_job_unlocked(job) + + def close(self) -> None: + """Cancel outstanding jobs and stop the bounded worker pool.""" + + checkins = getattr(self, "checkins", None) + if checkins is not None: + checkins.stop() + with self._lock: + if self._closed: + return + # The manager lock also guards the commit boundary. If a worker + # already owns it, its commit finishes first; otherwise close wins. + self._closed = True + jobs = list(self._jobs.values()) + + for job in jobs: + with job.lock: + if job.status == "pending": + job.cancel_event.set() + job.status = "cancelled" + job.error = None + job.updated_at = time.monotonic() + + self._executor.shutdown(wait=True, cancel_futures=True) + + def _has_account_locked(self, account_id: str) -> bool: + return any( + isinstance(account, dict) and account.get("id") == account_id + for account in self.store.list_accounts() + ) + + def _create_login_client(self, backend: str, session_file: pathlib.Path) -> CodeBuddyClient: + profile = profile_for_key(backend) + resolved = resolve_backend( + profile=profile, + session_file=session_file, + environment={}, + ) + return CodeBuddyClient(backend=resolved) + + def _temporary_directory(self) -> tempfile.TemporaryDirectory[str]: + root = getattr(self.store, "root", None) + temp_parent: str | None = None + if root is not None: + try: + root_path = pathlib.Path(root).expanduser() + if root_path.is_dir(): + temp_parent = str(root_path) + except (OSError, TypeError, ValueError): + temp_parent = None + return tempfile.TemporaryDirectory(prefix="workbuddy-login-", dir=temp_parent) + + def _run_login(self, job: _LoginJob) -> None: + with job.lock: + if job.status != "pending" or job.cancel_event.is_set(): + return + + try: + with self._temporary_directory() as temp_directory: + session_file = pathlib.Path(temp_directory) / "session.json" + client = self._client_factory(job.backend, session_file) + with job.lock: + if job.status != "pending" or job.cancel_event.is_set(): + return + challenge = client.begin_login() + auth_url, state = self._read_challenge(challenge) + + with job.lock: + if job.status != "pending" or job.cancel_event.is_set(): + return + job.auth_url = auth_url + job.updated_at = time.monotonic() + + client.complete_login( + {"auth_url": auth_url, "state": state}, + timeout=self._login_timeout, + cancel_event=job.cancel_event, + ) + + session = getattr(client, "session", None) + account = session.get("account") if isinstance(session, dict) else None + if not isinstance(account, dict) or not account.get("uid"): + raise ValueError("login did not produce a valid account") + + self._commit_login(job, client) + except Exception as exc: + self._finish_failure(job, exc) + + @staticmethod + def _read_challenge(challenge: Any) -> tuple[str, str]: + if not isinstance(challenge, dict): + raise ValueError("invalid login challenge") + auth_url = challenge.get("auth_url") + state = challenge.get("state") + if ( + not isinstance(auth_url, str) + or len(auth_url) > 4096 + or any(ord(char) < 0x21 or ord(char) == 0x7F for char in auth_url) + ): + raise ValueError("invalid login URL") + parsed = urlsplit(auth_url) + if parsed.scheme.lower() not in {"http", "https"} or not parsed.hostname: + raise ValueError("invalid login URL") + if parsed.username is not None or parsed.password is not None: + raise ValueError("invalid login URL") + port = parsed.port + if port is not None and not 1 <= port <= 65535: + raise ValueError("invalid login URL") + if not isinstance(state, str) or not state or len(state) > 4096: + raise ValueError("invalid login state") + return auth_url, state + + def _commit_login(self, job: _LoginJob, client: Any) -> None: + with job.lock: + if job.status != "pending" or job.cancel_event.is_set(): + return + # Holding the manager lock through import gives close() and + # cancellation a deterministic boundary relative to persistence. + with self._lock: + if self._closed or job.cancel_event.is_set(): + self._mark_cancelled_unlocked(job) + return + with self._store_lock: + should_activate = not bool(self.store.list_accounts()) + account_id = self.store.import_client(client, activate=should_activate) + if not isinstance(account_id, str) or not account_id: + raise ValueError("account store returned an invalid identifier") + job.account_id = account_id + job.status = "succeeded" + job.error = None + job.updated_at = time.monotonic() + + def _finish_failure(self, job: _LoginJob, exc: Exception) -> None: + with job.lock: + if job.status != "pending": + return + if job.cancel_event.is_set(): + self._mark_cancelled_unlocked(job) + return + if isinstance(exc, TimeoutError): + message = "登录超时,请重新尝试" + elif isinstance(exc, (ValueError, TypeError)): + message = "登录信息无效,请重新尝试" + else: + # Do not expose provider text, paths, response bodies, or + # exception representations through the local management API. + message = "登录失败,请稍后重新尝试" + job.status = "failed" + job.error = message + job.updated_at = time.monotonic() + + @staticmethod + def _mark_cancelled_unlocked(job: _LoginJob) -> None: + job.cancel_event.set() + job.status = "cancelled" + job.error = None + job.updated_at = time.monotonic() + + def _find_job(self, job_id: str) -> _LoginJob: + with self._lock: + job = self._jobs.get(job_id) + if job is None: + raise AccountManagerError("未找到该登录任务", status_code=404) + return job + + def _reap_jobs_locked(self, now: float) -> None: + # Job state is monotonic: pending can only become terminal. Read-only + # status/timestamp inspection here is safe while the registry lock is + # held and avoids inverting the per-job -> registry lock order. + for job_id, job in list(self._jobs.items()): + future_done = job.future is not None and job.future.done() + if ( + job.status in _TERMINAL + and future_done + and now - job.updated_at >= self._job_ttl_seconds + ): + self._jobs.pop(job_id, None) + + terminal = sorted( + ( + job + for job in self._jobs.values() + if job.status in _TERMINAL + and job.future is not None + and job.future.done() + ), + key=lambda job: job.updated_at, + ) + while len(terminal) > self._retained_job_limit: + self._jobs.pop(terminal.pop(0).id, None) + + max_jobs = self._retained_job_limit + self._max_concurrent_logins + while len(self._jobs) >= max_jobs: + oldest = next((job for job in terminal if job.id in self._jobs), None) + if oldest is None: + break + self._jobs.pop(oldest.id, None) + terminal.remove(oldest) + + def _public_job(self, job: _LoginJob) -> dict[str, Any]: + with job.lock: + return self._public_job_unlocked(job) + + @staticmethod + def _public_job_unlocked(job: _LoginJob) -> dict[str, Any]: + values = { + "id": job.id, + "backend": job.backend, + "status": job.status, + "auth_url": job.auth_url, + "error": job.error, + "account_id": job.account_id, + } + return {key: values[key] for key in _PUBLIC_JOB_FIELDS} + + +class _DuplicateRuntimeStateKey(ValueError): + pass + + +def _unique_runtime_object(pairs: list[tuple[str, Any]]) -> dict[str, Any]: + value: dict[str, Any] = {} + for key, item in pairs: + if key in value: + raise _DuplicateRuntimeStateKey("duplicate runtime state key") + value[key] = item + return value + + +def _finite_number(value: Any) -> bool: + if isinstance(value, bool) or not isinstance(value, (int, float)): + return False + try: + return math.isfinite(float(value)) + except (OverflowError, TypeError, ValueError): + return False + + +def _client_identity(client: Any) -> tuple[str, str, str] | None: + if client is None: + return None + profile = getattr(client, "profile", None) + backend = getattr(profile, "key", None) + if not isinstance(backend, str): + backend_value = getattr(client, "backend", None) + backend = ( + backend_value + if isinstance(backend_value, str) + else getattr(getattr(backend_value, "profile", None), "key", None) + ) + endpoint = getattr(client, "endpoint", None) + try: + session = _client_session(client) + except Exception: + return None + account = session.get("account") if isinstance(session, dict) else None + uid = account.get("uid") if isinstance(account, dict) else None + if ( + not isinstance(backend, str) + or not backend + or not isinstance(endpoint, str) + or not endpoint + or uid is None + ): + return None + uid_text = str(uid).strip() + if not uid_text: + return None + return backend, endpoint, uid_text + + +def _client_session(client: Any) -> dict[str, Any]: + snapshot = getattr(client, "_snapshot_session", None) + if callable(snapshot): + value = snapshot() + if isinstance(value, tuple) and value: + value = value[0] + else: + value = getattr(client, "session", None) + return value if isinstance(value, dict) else {} + + +def _client_has_usable_auth(client: Any) -> bool: + try: + session = _client_session(client) + except Exception: + return False + auth = session.get("auth") + if not isinstance(auth, dict): + return False + access_token = auth.get("accessToken") + if isinstance(access_token, str) and access_token.strip(): + expires_at = auth.get("expiresAt") + try: + expires_ms = int(expires_at or 0) + except (TypeError, ValueError, OverflowError): + expires_ms = 1 + if not expires_ms or expires_ms > int(time.time() * 1000) + 60_000: + return True + refresh_token = auth.get("refreshToken") + return isinstance(refresh_token, str) and bool(refresh_token.strip()) + + +def _cooldown_delay(retry_after: Any, now: float) -> tuple[float, str]: + seconds: float | None = None + if isinstance(retry_after, int) and not isinstance(retry_after, bool) and retry_after >= 0: + try: + seconds = float(retry_after) + except OverflowError: + seconds = None + elif isinstance(retry_after, str): + value = retry_after.strip() + if _RETRY_AFTER_SECONDS_RE.fullmatch(value): + try: + seconds = float(int(value)) + except (OverflowError, ValueError): + seconds = None + else: + try: + parsed = parsedate_to_datetime(value) + if parsed.tzinfo is None: + parsed = parsed.replace(tzinfo=timezone.utc) + target = parsed.astimezone(timezone.utc).timestamp() + if math.isfinite(target): + seconds = max(0.0, target - now) + except (AttributeError, TypeError, ValueError, OverflowError, OSError): + seconds = None + if seconds is None or not math.isfinite(seconds): + return float(_DEFAULT_COOLDOWN_SECONDS), "default" + return seconds, "retry_after" + + +def is_loopback_address(value: str | None) -> bool: + """Return whether a peer address is a literal loopback IP address.""" + + if not value: + return False + try: + address = ipaddress.ip_address(value) + if isinstance(address, ipaddress.IPv6Address) and address.ipv4_mapped is not None: + return address.ipv4_mapped.is_loopback + return address.is_loopback + except ValueError: + return False diff --git a/src/codebuddy_proxy/account_store.py b/src/codebuddy_proxy/account_store.py new file mode 100644 index 0000000..6438b81 --- /dev/null +++ b/src/codebuddy_proxy/account_store.py @@ -0,0 +1,513 @@ +"""Persistent, credential-isolated storage for CodeBuddy accounts.""" + +from __future__ import annotations + +import hashlib +import json +import os +import pathlib +import re +import tempfile +import threading +from contextlib import nullcontext +from typing import Any +from urllib.parse import urlsplit + +from codebuddy_proxy.backend_profile import ( + normalize_endpoint, + profile_for_key, + resolve_backend, +) +from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient, CodeBuddyError + + +_INDEX_VERSION = 1 +_ACCOUNT_ID_RE = re.compile(r"^acct_[0-9a-f]{64}$") +_INDEX_FIELDS = {"id", "backend", "endpoint", "uid", "nickname"} +_ROOT_LOCKS: dict[str, Any] = {} +_ROOT_LOCKS_GUARD = threading.Lock() + + +def _root_lock(root: pathlib.Path): + key = os.fspath(root) + with _ROOT_LOCKS_GUARD: + lock = _ROOT_LOCKS.get(key) + if lock is None: + lock = threading.RLock() + _ROOT_LOCKS[key] = lock + return lock + + +def _safe_endpoint(value: str) -> str: + try: + endpoint = normalize_endpoint(value) + parsed = urlsplit(endpoint) + except (TypeError, ValueError) as exc: + raise CodeBuddyError("账号 endpoint 无效") from exc + if parsed.username or parsed.password or parsed.query or parsed.fragment: + raise CodeBuddyError("账号 endpoint 不得在地址中包含凭据或查询参数") + return endpoint + + +def _account_id(backend: str, endpoint: str, uid: str) -> str: + identity = json.dumps( + [backend, endpoint, uid], ensure_ascii=False, separators=(",", ":") + ).encode("utf-8") + return f"acct_{hashlib.sha256(identity).hexdigest()}" + + +def _has_auth_token(auth: Any) -> bool: + return isinstance(auth, dict) and any( + isinstance(auth.get(name), str) and bool(auth[name].strip()) + for name in ("accessToken", "refreshToken") + ) + + +def _atomic_json(path: pathlib.Path, payload: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True, mode=0o700) + try: + os.chmod(path.parent, 0o700) + except OSError: + pass + temp_name: str | None = None + try: + fd, temp_name = tempfile.mkstemp( + prefix=f".{path.name}.", suffix=".tmp", dir=path.parent + ) + with os.fdopen(fd, "w", encoding="utf-8") as stream: + json.dump(payload, stream, ensure_ascii=False, indent=2) + stream.write("\n") + stream.flush() + os.fsync(stream.fileno()) + os.replace(temp_name, path) + temp_name = None + try: + os.chmod(path, 0o600) + except OSError: + pass + except OSError as exc: + raise CodeBuddyError(f"无法原子写入账号文件: {path.name}") from exc + finally: + if temp_name is not None: + try: + os.unlink(temp_name) + except OSError: + pass + + +def _capture_file(path: pathlib.Path) -> bytes | None: + if path.is_symlink(): + raise CodeBuddyError("账号文件路径无效") + try: + return path.read_bytes() + except FileNotFoundError: + return None + except OSError as exc: + raise CodeBuddyError("无法读取账号文件进行安全更新") from exc + + +def _restore_file(path: pathlib.Path, contents: bytes | None) -> None: + if path.is_symlink(): + raise CodeBuddyError("账号文件路径无效") + if contents is None: + try: + path.unlink() + except FileNotFoundError: + pass + except OSError as exc: + raise CodeBuddyError("无法清理账号事务文件") from exc + return + temp_name: str | None = None + try: + fd, temp_name = tempfile.mkstemp( + prefix=f".{path.name}.", suffix=".rollback.tmp", dir=path.parent + ) + with os.fdopen(fd, "wb") as stream: + stream.write(contents) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temp_name, path) + temp_name = None + try: + os.chmod(path, 0o600) + except OSError: + pass + except OSError as exc: + raise CodeBuddyError("无法恢复账号文件") from exc + finally: + if temp_name is not None: + try: + os.unlink(temp_name) + except OSError: + pass + + +class AccountStore: + """Store account metadata separately from each credential-bearing session.""" + + def __init__(self, root: pathlib.Path | str | None = None) -> None: + self.root = pathlib.Path(root or (pathlib.Path.home() / ".workbuddy2api" / "accounts")) + self.root = self.root.expanduser().resolve() + self.index_file = self.root / "index.json" + self._lock = _root_lock(self.root) + self._clients: dict[str, CodeBuddyClient] = {} + with self._lock: + try: + self.root.mkdir(parents=True, exist_ok=True, mode=0o700) + os.chmod(self.root, 0o700) + except OSError as exc: + raise CodeBuddyError("无法创建私有账号目录") from exc + if self.index_file.is_symlink(): + raise CodeBuddyError("账号索引文件路径无效") + self._read_index_locked() + + def _session_file(self, account_id: str) -> pathlib.Path: + if not _ACCOUNT_ID_RE.fullmatch(account_id): + raise CodeBuddyError("账号 id 无效") + return self.root / f"account-{account_id}.json" + + def _read_index_locked(self) -> dict[str, Any]: + try: + raw = self.index_file.read_text(encoding="utf-8") + except FileNotFoundError: + return {"version": _INDEX_VERSION, "active_account_id": None, "accounts": []} + except OSError as exc: + raise CodeBuddyError("无法读取账号索引文件") from exc + try: + value = json.loads(raw) + except json.JSONDecodeError as exc: + raise CodeBuddyError("账号索引文件损坏,未修改任何账号数据") from exc + if ( + not isinstance(value, dict) + or set(value) != {"version", "active_account_id", "accounts"} + or value.get("version") != _INDEX_VERSION + ): + raise CodeBuddyError("账号索引文件格式或版本无效,未修改任何账号数据") + accounts = value.get("accounts") + if not isinstance(accounts, list): + raise CodeBuddyError("账号索引中的 accounts 字段无效") + normalized_accounts: list[dict[str, Any]] = [] + seen: set[str] = set() + for record in accounts: + if not isinstance(record, dict) or set(record) != _INDEX_FIELDS: + raise CodeBuddyError("账号索引包含无效字段,未修改任何账号数据") + backend = record.get("backend") + endpoint = record.get("endpoint") + uid = record.get("uid") + account_id = record.get("id") + nickname = record.get("nickname") + if not all(isinstance(item, str) and item for item in (backend, endpoint, uid)): + raise CodeBuddyError("账号索引包含不完整的身份信息") + try: + profile_for_key(backend) + canonical_endpoint = _safe_endpoint(endpoint) + except (ValueError, CodeBuddyError) as exc: + raise CodeBuddyError("账号索引包含无效的 backend 或 endpoint") from exc + if canonical_endpoint != endpoint or _account_id(backend, endpoint, uid) != account_id: + raise CodeBuddyError("账号索引身份校验失败,未修改任何账号数据") + if nickname is not None and not isinstance(nickname, str): + raise CodeBuddyError("账号索引包含无效的 nickname") + if account_id in seen: + raise CodeBuddyError("账号索引包含重复账号 id") + seen.add(account_id) + normalized_accounts.append( + { + "id": account_id, + "backend": backend, + "endpoint": endpoint, + "uid": uid, + "nickname": nickname, + } + ) + active_id = value.get("active_account_id") + if active_id is not None and active_id not in seen: + raise CodeBuddyError("账号索引的 active_account_id 不存在") + return { + "version": _INDEX_VERSION, + "active_account_id": active_id, + "accounts": normalized_accounts, + } + + def _write_index_locked(self, index: dict[str, Any]) -> None: + metadata = [ + {key: record[key] for key in ("id", "backend", "endpoint", "uid", "nickname")} + for record in index["accounts"] + ] + _atomic_json( + self.index_file, + { + "version": _INDEX_VERSION, + "active_account_id": index["active_account_id"], + "accounts": metadata, + }, + ) + + @staticmethod + def _find_account(index: dict[str, Any], account_id: str) -> dict[str, Any]: + if not isinstance(account_id, str) or not _ACCOUNT_ID_RE.fullmatch(account_id): + raise CodeBuddyError("账号 id 无效") + for record in index["accounts"]: + if record["id"] == account_id: + return record + raise CodeBuddyError("账号不存在") + + @staticmethod + def _validated_client_session( + client: CodeBuddyClient, + ) -> tuple[dict[str, Any], dict[str, Any]]: + if not isinstance(client, CodeBuddyClient): + raise CodeBuddyError("只能导入 CodeBuddyClient 会话") + session, _ = client._snapshot_session() + account = session.get("account") + auth = session.get("auth") + if ( + not isinstance(account, dict) + or account.get("uid") is None + or not str(account.get("uid")).strip() + ): + raise CodeBuddyError("账号 session 缺少 uid,不能导入") + if not _has_auth_token(auth): + raise CodeBuddyError("账号 session 缺少认证 token,不能导入") + try: + client._validate_session_metadata(session) + backend = client.profile.key + profile_for_key(backend) + endpoint = _safe_endpoint(client.endpoint) + except (ValueError, CodeBuddyError) as exc: + raise CodeBuddyError("账号 session 的 backend 或 endpoint 无效") from exc + uid = str(account["uid"]).strip() + if not uid: + raise CodeBuddyError("账号 session 缺少 uid,不能导入") + session["backend"] = backend + session["endpoint"] = endpoint + session_account = dict(account) + session_account["uid"] = uid + session["account"] = session_account + metadata = { + "id": _account_id(backend, endpoint, uid), + "backend": backend, + "endpoint": endpoint, + "uid": uid, + "nickname": ( + str(account.get("nickname"))[:200] + if account.get("nickname") is not None + else None + ), + } + return session, metadata + + def _new_client(self, record: dict[str, Any]) -> CodeBuddyClient: + session_file = self._session_file(record["id"]) + if session_file.is_symlink(): + raise CodeBuddyError("账号 session 路径无效") + profile = profile_for_key(record["backend"]) + client = CodeBuddyClient( + backend=resolve_backend( + profile=profile, + endpoint=record["endpoint"], + session_file=session_file, + environment={}, + ) + ) + session, _ = client._snapshot_session() + identity = self._identity_from_session(client, session) + if identity != record["id"]: + raise CodeBuddyError("账号 session 身份与索引不一致") + if not _has_auth_token(session.get("auth")): + raise CodeBuddyError("账号 session 缺少认证 token") + return client + + @staticmethod + def _identity_from_session(client: CodeBuddyClient, session: dict[str, Any]) -> str: + account = session.get("account") or {} + uid = account.get("uid") if isinstance(account, dict) else None + if uid is None or not str(uid).strip(): + raise CodeBuddyError("账号 session 缺少 uid") + endpoint = _safe_endpoint(client.endpoint) + return _account_id(client.profile.key, endpoint, str(uid).strip()) + + def _get_client_locked(self, record: dict[str, Any]) -> CodeBuddyClient: + client = self._clients.get(record["id"]) + if client is None: + client = self._new_client(record) + self._clients[record["id"]] = client + return client + + def list_accounts(self) -> list[dict[str, Any]]: + with self._lock: + index = self._read_index_locked() + active_id = index["active_account_id"] + return [ + {**record, "active": record["id"] == active_id} + for record in index["accounts"] + ] + + @property + def active_account_id(self) -> str | None: + with self._lock: + return self._read_index_locked()["active_account_id"] + + def import_client(self, client: CodeBuddyClient, activate: bool = False) -> str: + session, metadata = self._validated_client_session(client) + with self._lock: + index = self._read_index_locked() + existing = next( + (record for record in index["accounts"] if record["id"] == metadata["id"]), + None, + ) + record = metadata + session_file = self._session_file(metadata["id"]) + if session_file.is_symlink(): + raise CodeBuddyError("账号 session 路径无效") + cached = self._clients.get(metadata["id"]) + # Keep cached-client session writers outside the full disk/cache + # transaction. This covers the rollback interval too, so no writer + # can persist a newer session between restoring the file and cache. + session_guard = cached._session_lock if cached is not None else nullcontext() + with session_guard: + index_backup = _capture_file(self.index_file) + session_backup: bytes | None = None + cached_snapshot: dict[str, Any] | None = None + session_written = False + index_write_attempted = False + try: + if cached is None: + session_backup = _capture_file(session_file) + _atomic_json(session_file, session) + session_written = True + persistent_client = self._new_client(record) + else: + persistent_client = cached + for _ in range(5): + previous_session, generation = cached._snapshot_session() + candidate_backup = _capture_file(session_file) + if cached._save_session( + session, expected_generation=generation + ): + session_backup = candidate_backup + cached_snapshot = previous_session + session_written = True + break + else: + raise CodeBuddyError( + "账号 session 正在更新,请稍后重试关联" + ) + + if existing is None: + index["accounts"].append(record) + else: + position = index["accounts"].index(existing) + index["accounts"][position] = record + if activate or (existing is None and len(index["accounts"]) == 1): + index["active_account_id"] = metadata["id"] + index_write_attempted = True + self._write_index_locked(index) + except Exception as original_error: + rollback_errors: list[Exception] = [] + if session_written: + try: + _restore_file(session_file, session_backup) + except Exception as exc: + rollback_errors.append(exc) + if cached is not None and cached_snapshot is not None: + try: + cached._restore_session_snapshot(cached_snapshot) + except Exception as exc: + rollback_errors.append(exc) + if index_write_attempted: + try: + _restore_file(self.index_file, index_backup) + except Exception as exc: + rollback_errors.append(exc) + if rollback_errors: + raise CodeBuddyError( + "账号关联失败,且事务回滚未能完整恢复" + ) from rollback_errors[0] + raise original_error + self._clients[metadata["id"]] = persistent_client + return metadata["id"] + + def get_client(self, account_id: str) -> CodeBuddyClient: + with self._lock: + index = self._read_index_locked() + record = self._find_account(index, account_id) + return self._get_client_locked(record) + + def set_active(self, account_id: str) -> CodeBuddyClient: + with self._lock: + index = self._read_index_locked() + record = self._find_account(index, account_id) + client = self._get_client_locked(record) + index["active_account_id"] = account_id + self._write_index_locked(index) + return client + + def clear_active(self) -> None: + """Persist an empty active selection while retaining stored accounts.""" + with self._lock: + index = self._read_index_locked() + index["active_account_id"] = None + self._write_index_locked(index) + + def active_client(self) -> CodeBuddyClient | None: + with self._lock: + index = self._read_index_locked() + active_id = index["active_account_id"] + if active_id is None: + return None + record = self._find_account(index, active_id) + return self._get_client_locked(record) + + def delete_account(self, account_id: str) -> None: + with self._lock: + index = self._read_index_locked() + record = self._find_account(index, account_id) + if index["active_account_id"] == account_id: + raise CodeBuddyError("不能删除当前生效账号") + session_file = self._session_file(record["id"]) + if session_file.is_symlink(): + raise CodeBuddyError("账号 session 路径无效") + cached = self._clients.get(account_id) + if cached is not None: + cached._invalidate_persistence() + saved_bytes: bytes | None = None + try: + if session_file.exists(): + saved_bytes = session_file.read_bytes() + session_file.unlink() + except OSError as exc: + if cached is not None: + cached._enable_persistence() + raise CodeBuddyError("无法删除账号 session 文件") from exc + index["accounts"] = [ + item for item in index["accounts"] if item["id"] != account_id + ] + try: + self._write_index_locked(index) + except Exception: + if saved_bytes is not None: + temp_name: str | None = None + try: + fd, temp_name = tempfile.mkstemp( + prefix=f".{session_file.name}.", + suffix=".restore.tmp", + dir=self.root, + ) + with os.fdopen(fd, "wb") as stream: + stream.write(saved_bytes) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temp_name, session_file) + temp_name = None + except OSError: + pass + finally: + if temp_name is not None: + try: + os.unlink(temp_name) + except OSError: + pass + if cached is not None: + cached._enable_persistence() + raise + self._clients.pop(account_id, None) diff --git a/src/codebuddy_proxy/admin.html b/src/codebuddy_proxy/admin.html new file mode 100644 index 0000000..b89fe01 --- /dev/null +++ b/src/codebuddy_proxy/admin.html @@ -0,0 +1,1282 @@ + + + + + + + CodeBuddy 账号管理 + + + +
+
+
CodeBuddy · 本机代理
+

账号管理

+

在这里关联、切换和管理 CodeBuddy 登录账号。账号凭据由本机代理保存,页面不会显示会话内容。

+
+ +
+ +
+
+
+
+

关联账号

+

选择账号所属区域,登录完成后会保存到本机账号库。

+
+
+
+ + +
+
+ +

登录页面会在新窗口打开;请在该窗口完成 CodeBuddy 登录。

+
+ +
+ +
+
+
+

已关联账号

+

当前账号会用于新发起的代理请求。

+
+
+ +
+
+ +
+
+ 遇到 429 自动切换账号 +

仅尝试同一区域、同一服务地址且未冷却的账号;每个请求对每个账号最多尝试一次。默认关闭。

+
+ +
+

正在读取自动切换设置…

+
+
+ 全局自动签到 +

开启后由代理立即检查全部关联账号,并按北京时间计划自动签到。未知状态不会自动签到;关闭后会取消待执行计划。默认关闭。

+
+ +
+

正在读取自动签到设置…

+ + +
+
+
+ + + + diff --git a/src/codebuddy_proxy/admin_api.py b/src/codebuddy_proxy/admin_api.py new file mode 100644 index 0000000..134f7b6 --- /dev/null +++ b/src/codebuddy_proxy/admin_api.py @@ -0,0 +1,519 @@ +"""Loopback-only admin page and account-management API.""" + +from __future__ import annotations + +import ipaddress +import json +import math +import re +import time +from datetime import date as calendar_date +from importlib import resources +from typing import Any, Callable +from urllib.parse import urlsplit + +from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi.responses import HTMLResponse, JSONResponse, Response +from fastapi.routing import APIRoute +from fastapi.exceptions import RequestValidationError + +from codebuddy_proxy.account_manager import ( + AccountManager, + AccountManagerError, + is_loopback_address, +) + + +_WRITE_HEADER = "X-Account-Manager" +_MAX_LOGIN_BODY = 4096 +_MAX_SETTINGS_BODY = 4096 +_PUBLIC_ACCOUNT_FIELDS = ( + "id", + "backend", + "endpoint", + "uid", + "nickname", + "active", + "rate_limited", + "cooldown_until", + "cooldown_remaining_seconds", + "last_rate_limited_at", + "cooldown_source", + "checkin", +) +_PUBLIC_JOB_FIELDS = ("id", "backend", "status", "auth_url", "error", "account_id") +_CHECKIN_STATUSES = frozenset( + {"unknown", "unchecked", "checked", "checking", "signing", "error"} +) +_SAFE_CHECKIN_ERRORS = frozenset( + { + "签到活动未开放", + "签到状态查询失败", + "签到请求失败", + "签到结果未确认", + "账号不存在", + } +) +_CHECKIN_DATE_RE = re.compile(r"^\d{4}-\d{2}-\d{2}$") + + +class _NoStoreRoute(APIRoute): + """Keep admin route failures generic and mark every routed response private.""" + + def get_route_handler(self): + original = super().get_route_handler() + + async def no_store_handler(request: Request) -> Response: + try: + response = await original(request) + except HTTPException as exc: + detail = exc.detail if isinstance(exc.detail, str) else "请求被拒绝" + response = JSONResponse({"detail": detail}, status_code=exc.status_code) + except RequestValidationError: + response = JSONResponse({"detail": "请求格式无效"}, status_code=400) + except Exception: + # Never serialize an exception, provider response, or traceback + # into a local administrative response. + response = JSONResponse({"detail": "管理请求失败"}, status_code=500) + response.headers["Cache-Control"] = "no-store" + response.headers["Pragma"] = "no-cache" + return response + + return no_store_handler + + +def _one_header(request: Request, name: str) -> str | None: + values = request.headers.getlist(name) + if len(values) != 1: + return None + return values[0] + + +def _host_identity(raw_host: str, scheme: str) -> tuple[str, int] | None: + if not raw_host or len(raw_host) > 320 or any(ch.isspace() for ch in raw_host): + return None + try: + parts = urlsplit("//" + raw_host) + if parts.username is not None or parts.password is not None: + return None + if parts.path or parts.query or parts.fragment or not parts.hostname: + return None + hostname = parts.hostname.lower() + if hostname.endswith("."): + hostname = hostname[:-1] + if hostname.endswith("."): + return None + try: + address = ipaddress.ip_address(hostname) + if not address.is_loopback: + return None + canonical_host = address.compressed.lower() + except ValueError: + if hostname != "localhost": + return None + canonical_host = hostname + port = parts.port + if port is None: + port = 443 if scheme.lower() == "https" else 80 + if not 1 <= port <= 65535: + return None + return canonical_host, port + except ValueError: + return None + + +def _origin_identity(raw_origin: str) -> tuple[str, str, int] | None: + if not raw_origin or len(raw_origin) > 512: + return None + try: + parts = urlsplit(raw_origin) + scheme = parts.scheme.lower() + if scheme not in {"http", "https"}: + return None + if not parts.netloc or parts.path or parts.query or parts.fragment: + return None + if parts.username is not None or parts.password is not None or not parts.hostname: + return None + host = parts.hostname.lower() + if host.endswith("."): + host = host[:-1] + if host.endswith("."): + return None + try: + address = ipaddress.ip_address(host) + if not address.is_loopback: + return None + host = address.compressed.lower() + except ValueError: + if host != "localhost": + return None + port = parts.port + if port is None: + port = 443 if scheme == "https" else 80 + if not 1 <= port <= 65535: + return None + return scheme, host, port + except ValueError: + return None + + +def _check_admin_request(request: Request) -> None: + peer = request.client.host if request.client is not None else None + if not is_loopback_address(peer): + raise HTTPException(status_code=403, detail="仅允许本机访问管理页面") + + raw_host = _one_header(request, "host") + host = _host_identity(raw_host or "", request.url.scheme) + if host is None: + raise HTTPException(status_code=403, detail="管理页面 Host 无效") + + raw_origin = _one_header(request, "origin") + if raw_origin is None: + # Missing or duplicated Origin is allowed for reads. Mutations are + # separately protected by the dedicated header below. + if request.headers.getlist("origin"): + raise HTTPException(status_code=403, detail="管理页面 Origin 无效") + return + + origin = _origin_identity(raw_origin) + expected = (request.url.scheme.lower(), host[0], host[1]) + if origin != expected: + raise HTTPException(status_code=403, detail="跨站管理请求已拒绝") + + +def _require_write_header(request: Request) -> None: + if _one_header(request, _WRITE_HEADER) != "1": + raise HTTPException(status_code=403, detail="缺少管理请求标记") + + +def _safe_job(value: Any) -> dict[str, Any]: + if not isinstance(value, dict): + return {key: None for key in _PUBLIC_JOB_FIELDS} + return {key: value.get(key) for key in _PUBLIC_JOB_FIELDS} + + +def _safe_snapshot(value: Any) -> dict[str, Any]: + if not isinstance(value, dict): + return { + "accounts": [], + "active_account_id": None, + "settings": _safe_settings(None), + "server_time": time.time(), + } + accounts = value.get("accounts") + safe_accounts = [] + if isinstance(accounts, list): + for account in accounts: + if isinstance(account, dict): + safe = { + key: account[key] + for key in _PUBLIC_ACCOUNT_FIELDS[:6] + if key in account + } + rate_limited = account.get("rate_limited") + cooldown_until = account.get("cooldown_until") + remaining = account.get("cooldown_remaining_seconds") + last_limited_at = account.get("last_rate_limited_at") + source = account.get("cooldown_source") + safe.update( + { + "rate_limited": rate_limited if type(rate_limited) is bool else False, + "cooldown_until": ( + float(cooldown_until) + if _finite_number(cooldown_until) + else None + ), + "cooldown_remaining_seconds": ( + remaining + if type(remaining) is int and remaining >= 0 + else 0 + ), + "last_rate_limited_at": ( + float(last_limited_at) + if _finite_number(last_limited_at) + else None + ), + "cooldown_source": ( + source if source in ("retry_after", "default") else None + ), + } + ) + safe["checkin"] = _safe_checkin(account.get("checkin")) + safe_accounts.append(safe) + server_time = value.get("server_time") + return { + "accounts": safe_accounts, + "active_account_id": value.get("active_account_id"), + "settings": _safe_settings(value.get("settings")), + "server_time": float(server_time) if _finite_number(server_time) else time.time(), + } + + +def _finite_number(value: Any) -> bool: + if isinstance(value, bool) or not isinstance(value, (int, float)): + return False + try: + return math.isfinite(float(value)) + except (OverflowError, TypeError, ValueError): + return False + + +def _safe_settings(value: Any) -> dict[str, Any]: + auto_switch = value.get("auto_switch_on_429") if isinstance(value, dict) else None + auto_checkin = value.get("auto_checkin_enabled") if isinstance(value, dict) else None + return { + "auto_switch_on_429": auto_switch if type(auto_switch) is bool else False, + "auto_checkin_enabled": auto_checkin if type(auto_checkin) is bool else False, + "default_cooldown_seconds": 60, + } + + +def _safe_checkin(value: Any) -> dict[str, Any]: + """Return only the stable, non-sensitive check-in response fields.""" + + if not isinstance(value, dict): + value = {} + raw_date = value.get("date") + checkin_date = time.strftime("%Y-%m-%d", time.gmtime(time.time() + 8 * 60 * 60)) + if isinstance(raw_date, str) and _CHECKIN_DATE_RE.fullmatch(raw_date): + try: + calendar_date.fromisoformat(raw_date) + checkin_date = raw_date + except ValueError: + pass + status = value.get("status") + if not isinstance(status, str) or status not in _CHECKIN_STATUSES: + status = "error" + error = value.get("error") + if not isinstance(error, str) or error not in _SAFE_CHECKIN_ERRORS: + error = "签到状态查询失败" if status == "error" else None + return { + "date": checkin_date, + "status": status, + "checked": value.get("checked") if type(value.get("checked")) is bool else None, + "last_checked_at": ( + float(value["last_checked_at"]) + if _finite_number(value.get("last_checked_at")) + else None + ), + "last_checkin_at": ( + float(value["last_checkin_at"]) + if _finite_number(value.get("last_checkin_at")) + else None + ), + "error": error, + "next_checkin_at": ( + float(value["next_checkin_at"]) + if _finite_number(value.get("next_checkin_at")) + else None + ), + } + + +class _DuplicateJSONKey(ValueError): + pass + + +def _unique_object(pairs: list[tuple[str, Any]]) -> dict[str, Any]: + result: dict[str, Any] = {} + for key, value in pairs: + if key in result: + raise _DuplicateJSONKey("duplicate JSON key") + result[key] = value + return result + + +async def _read_json_object(request: Request, max_bytes: int) -> dict[str, Any]: + chunks: list[bytes] = [] + length = 0 + async for chunk in request.stream(): + length += len(chunk) + if length > max_bytes: + raise HTTPException(status_code=413, detail="请求内容过大") + chunks.append(chunk) + try: + payload = json.loads(b"".join(chunks) or b"{}", object_pairs_hook=_unique_object) + except (json.JSONDecodeError, UnicodeDecodeError, _DuplicateJSONKey): + raise HTTPException(status_code=400, detail="请求 JSON 无效") from None + if not isinstance(payload, dict): + raise HTTPException(status_code=400, detail="请求 JSON 必须为对象") + return payload + + +def _raise_manager_error(exc: Exception) -> None: + if isinstance(exc, AccountManagerError): + raise HTTPException(status_code=exc.status_code, detail=exc.message) from None + if isinstance(exc, KeyError): + raise HTTPException(status_code=404, detail="未找到请求的账号或任务") from None + if isinstance(exc, ValueError): + raise HTTPException(status_code=400, detail="请求参数无效") from None + raise HTTPException(status_code=500, detail="管理请求失败") from None + + +def _manager_has_account(manager: Any, account_id: str) -> bool: + has_account = getattr(manager, "has_account", None) + if callable(has_account): + try: + return bool(has_account(account_id)) + except Exception: + return False + try: + accounts = manager.snapshot().get("accounts", []) + except Exception: + return False + return any( + isinstance(account, dict) and account.get("id") == account_id + for account in accounts + ) + + +def create_admin_router(get_manager: Callable[[], AccountManager]) -> APIRouter: + """Create the loopback-only `/admin` page and `/admin/api` routes.""" + + router = APIRouter(route_class=_NoStoreRoute, dependencies=[Depends(_check_admin_request)]) + + @router.get("/admin", response_class=HTMLResponse) + @router.get("/admin/", response_class=HTMLResponse, include_in_schema=False) + async def admin_page() -> Response: + try: + html = resources.files("codebuddy_proxy").joinpath("admin.html").read_text( + encoding="utf-8" + ) + except (FileNotFoundError, ModuleNotFoundError, OSError): + raise HTTPException(status_code=503, detail="管理页面暂不可用") from None + return HTMLResponse(html) + + @router.get("/admin/api/accounts") + async def list_accounts() -> dict[str, Any]: + try: + return _safe_snapshot(get_manager().snapshot()) + except Exception as exc: + _raise_manager_error(exc) + + @router.get("/admin/api/settings") + async def get_settings() -> dict[str, Any]: + try: + return _safe_settings(get_manager().get_settings()) + except Exception as exc: + _raise_manager_error(exc) + + @router.patch("/admin/api/settings") + async def patch_settings(request: Request) -> dict[str, Any]: + _require_write_header(request) + payload = await _read_json_object(request, _MAX_SETTINGS_BODY) + allowed_settings = {"auto_switch_on_429", "auto_checkin_enabled"} + if ( + not payload + or not set(payload).issubset(allowed_settings) + or any(type(value) is not bool for value in payload.values()) + ): + raise HTTPException( + status_code=400, + detail="仅接受非空布尔值账号管理设置", + ) + try: + updated = get_manager().set_settings( + payload.get("auto_switch_on_429"), + auto_checkin_enabled=payload.get("auto_checkin_enabled"), + ) + return _safe_settings(updated) + except Exception as exc: + _raise_manager_error(exc) + + @router.get( + "/admin/api/accounts/{account_id}/checkin-status", response_model=None + ) + async def checkin_status(account_id: str) -> dict[str, Any] | JSONResponse: + manager = get_manager() + if not _manager_has_account(manager, account_id): + raise HTTPException(status_code=404, detail="未找到该账号") + try: + result = await manager.checkins.check_status( + account_id, reason="manual_status" + ) + return _safe_checkin(result) + except Exception: + return JSONResponse( + _safe_checkin({"status": "error", "error": "签到状态查询失败"}), + status_code=502, + ) + + @router.post("/admin/api/accounts/{account_id}/checkin", response_model=None) + async def checkin(account_id: str, request: Request) -> dict[str, Any] | JSONResponse: + _require_write_header(request) + manager = get_manager() + if not _manager_has_account(manager, account_id): + raise HTTPException(status_code=404, detail="未找到该账号") + try: + result = await manager.checkins.check_in(account_id, reason="manual") + return _safe_checkin(result) + except Exception: + return JSONResponse( + _safe_checkin({"status": "error", "error": "签到请求失败"}), + status_code=502, + ) + + @router.post("/admin/api/accounts/{account_id}/activate") + async def activate_account(account_id: str, request: Request) -> dict[str, bool]: + _require_write_header(request) + try: + get_manager().activate(account_id) + return {"ok": True} + except Exception as exc: + _raise_manager_error(exc) + + @router.delete("/admin/api/accounts/{account_id}") + async def delete_account(account_id: str, request: Request) -> dict[str, bool]: + _require_write_header(request) + try: + get_manager().delete(account_id) + return {"ok": True} + except Exception as exc: + _raise_manager_error(exc) + + @router.post("/admin/api/logins", status_code=202) + async def start_login(request: Request) -> JSONResponse: + _require_write_header(request) + chunks: list[bytes] = [] + length = 0 + async for chunk in request.stream(): + length += len(chunk) + if length > _MAX_LOGIN_BODY: + raise HTTPException(status_code=413, detail="请求内容过大") + chunks.append(chunk) + try: + payload = json.loads(b"".join(chunks) or b"{}") + except (json.JSONDecodeError, UnicodeDecodeError): + raise HTTPException(status_code=400, detail="请求 JSON 无效") from None + if not isinstance(payload, dict) or not isinstance(payload.get("backend"), str): + raise HTTPException(status_code=400, detail="backend 必须为 domestic 或 global") + try: + job = _safe_job(get_manager().start_login(payload["backend"])) + return JSONResponse(job, status_code=202) + except Exception as exc: + _raise_manager_error(exc) + + @router.get("/admin/api/logins/{job_id}") + async def get_login(job_id: str) -> dict[str, Any]: + try: + return _safe_job(get_manager().get_login(job_id)) + except Exception as exc: + _raise_manager_error(exc) + + @router.delete("/admin/api/logins/{job_id}") + async def cancel_login(job_id: str, request: Request) -> dict[str, Any]: + _require_write_header(request) + try: + return _safe_job(get_manager().cancel_login(job_id)) + except Exception as exc: + _raise_manager_error(exc) + + @router.api_route( + "/admin/{unmatched_path:path}", + methods=["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"], + include_in_schema=False, + ) + async def unknown_admin_path() -> Response: + return JSONResponse({"detail": "未找到管理接口"}, status_code=404) + + return router diff --git a/src/codebuddy_proxy/billing_proxy.py b/src/codebuddy_proxy/billing_proxy.py index af268c8..4ebf3f8 100644 --- a/src/codebuddy_proxy/billing_proxy.py +++ b/src/codebuddy_proxy/billing_proxy.py @@ -26,6 +26,9 @@ def _upstream_response(response: httpx.Response) -> Response: content_type = response.headers.get("content-type") if content_type: headers["content-type"] = content_type + retry_after = response.headers.get("Retry-After") + if retry_after is not None: + headers["Retry-After"] = retry_after return Response( content=response.content, status_code=response.status_code, @@ -52,25 +55,31 @@ async def forward_billing( another concurrent request already updated the access token). If refresh fails, preserve the original upstream 401 instead of blindly retrying. """ - state.ensure_auth() - url = state.client.build_url(path) + # Capture once: an account switch while awaiting a response must never + # refresh the new account or send its credentials to the old endpoint. + account_client = state.client + if getattr(state, "managed_auth", False): + await asyncio.to_thread(state.ensure_auth) + else: + state.ensure_auth() + url = account_client.build_url(path) method = method.upper() kwargs = {"json": {}} if method == "POST" else {} async with httpx.AsyncClient(timeout=httpx.Timeout(10.0)) as client: try: - headers = state.client.auth_headers() + headers = account_client.auth_headers() response = await client.request(method, url, headers=headers, **kwargs) if response.status_code == 401: async with _refresh_lock: - latest_headers = state.client.auth_headers() + latest_headers = account_client.auth_headers() old_token = headers.get("Authorization") new_token = latest_headers.get("Authorization") if new_token == old_token: try: - refreshed = await asyncio.to_thread(state.client.refresh) + refreshed = await asyncio.to_thread(account_client.refresh) except Exception as exc: diagnostic( "billing_auth_refresh_failed", @@ -80,7 +89,7 @@ async def forward_billing( if not refreshed: diagnostic("billing_auth_refresh_failed", path=path, reason="not_refreshed") return _upstream_response(response) - latest_headers = state.client.auth_headers() + latest_headers = account_client.auth_headers() new_token = latest_headers.get("Authorization") if not new_token or new_token == old_token: @@ -96,4 +105,16 @@ async def forward_billing( diagnostic("billing_upstream_failed", path=path, reason=type(exc).__name__) return _transport_error(502, "upstream_connection_error") + if response.status_code == 429: + manager = getattr(state, "account_runtime", None) + if manager is not None: + try: + # A check-in belongs to its original account. Select for future + # requests, but never repeat this business operation as someone else. + await asyncio.to_thread( + manager.handle_rate_limit, account_client, + response.headers.get("Retry-After"), + ) + except Exception as exc: + diagnostic("billing_rate_limit_record_failed", error_type=type(exc).__name__) return _upstream_response(response) diff --git a/src/codebuddy_proxy/codebuddy_client_demo.py b/src/codebuddy_proxy/codebuddy_client_demo.py index e4d2d09..582fea8 100644 --- a/src/codebuddy_proxy/codebuddy_client_demo.py +++ b/src/codebuddy_proxy/codebuddy_client_demo.py @@ -9,10 +9,13 @@ from __future__ import annotations import argparse +import copy import json import os import pathlib import sys +import tempfile +import threading import time import urllib.error import urllib.parse @@ -99,6 +102,10 @@ def __init__( self.platform = platform self.prefix = self.profile.auth_prefix self.session_file = resolved_backend.session_file + self._session_lock = threading.RLock() + self._auth_lock = threading.RLock() + self._session_generation = 0 + self._persistence_enabled = True self.session: dict[str, Any] = self._load_session() def _load_session(self) -> dict[str, Any]: @@ -169,23 +176,77 @@ def _validate_session_metadata(self, session: dict[str, Any]) -> None: "原文件未修改,请使用匹配的 --session-file。" ) - def _save_session(self, session: dict[str, Any]) -> None: + def _snapshot_session(self) -> tuple[dict[str, Any], int]: + with self._session_lock: + return copy.deepcopy(self.session), self._session_generation + + def _save_session( + self, + session: dict[str, Any], + *, + expected_generation: int | None = None, + ) -> bool: persisted_session = dict(session) persisted_session["backend"] = self.profile.key persisted_session["endpoint"] = self.endpoint - self.session_file.parent.mkdir(parents=True, exist_ok=True) - flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC - fd = os.open(self.session_file, flags, 0o600) - try: - with os.fdopen(fd, "w", encoding="utf-8") as stream: - json.dump(persisted_session, stream, ensure_ascii=False, indent=2) - stream.write("\n") - finally: - try: - os.chmod(self.session_file, 0o600) - except OSError: - pass - self.session = persisted_session + with self._session_lock: + if not self._persistence_enabled: + return False + if ( + expected_generation is not None + and self._session_generation != expected_generation + ): + return False + self.session_file.parent.mkdir(parents=True, exist_ok=True) + temp_name: str | None = None + try: + fd, temp_name = tempfile.mkstemp( + prefix=f".{self.session_file.name}.", + suffix=".tmp", + dir=self.session_file.parent, + ) + with os.fdopen(fd, "w", encoding="utf-8") as stream: + json.dump(persisted_session, stream, ensure_ascii=False, indent=2) + stream.write("\n") + stream.flush() + os.fsync(stream.fileno()) + os.replace(temp_name, self.session_file) + temp_name = None + try: + os.chmod(self.session_file, 0o600) + except OSError: + pass + except OSError as exc: + raise CodeBuddyError( + f"无法原子写入 session 文件: {self.session_file}" + ) from exc + finally: + if temp_name is not None: + try: + os.unlink(temp_name) + except OSError: + pass + self.session = persisted_session + self._session_generation += 1 + return True + + def _invalidate_persistence(self) -> None: + """Prevent an old client reference from recreating a removed session.""" + with self._session_lock: + self._session_generation += 1 + self._persistence_enabled = False + + def _enable_persistence(self) -> None: + """Restore writes if a store deletion transaction was rolled back.""" + with self._session_lock: + self._session_generation += 1 + self._persistence_enabled = True + + def _restore_session_snapshot(self, session: dict[str, Any]) -> None: + """Restore in-memory state after an account-store transaction fails.""" + with self._session_lock: + self.session = copy.deepcopy(session) + self._session_generation += 1 def build_url(self, path: str) -> str: """Build a URL from the resolved endpoint and a relative path.""" @@ -259,19 +320,27 @@ def _request( def auth_headers(self, *, access: bool = True, refresh: bool = False) -> dict[str, str]: """构造认证 headers,模拟插件行为""" - account = self.session.get("account") or {} - auth = self.session.get("auth") or {} + self._get_machine_id() + session, _ = self._snapshot_session() + return self._auth_headers_for_session(session, access=access, refresh=refresh) + + def _auth_headers_for_session( + self, + session: dict[str, Any], + *, + access: bool = True, + refresh: bool = False, + ) -> dict[str, str]: + account = session.get("account") or {} + auth = session.get("auth") or {} headers: dict[str, str] = { - # 🔥 关键标识:所有请求都需要这个 header "X-Product-Code": "codebuddy", - # 🔥 IDE 识别信息(服务端用于识别客户端类型) "X-IDE-Type": "vscode", "X-IDE-Name": "Visual Studio Code", - "X-IDE-Version": "1.70.2", # VSCode 最低版本要求 - "X-Product-Version": "4.10.33259736", # 插件版本 - "X-Machine-Id": self._get_machine_id(), + "X-IDE-Version": "1.70.2", + "X-Product-Version": "4.10.33259736", + "X-Machine-Id": str(session.get("machineId") or ""), } - if account.get("uid"): headers["X-User-Id"] = str(account["uid"]) if access and auth.get("accessToken"): @@ -282,12 +351,9 @@ def auth_headers(self, *, access: bool = True, refresh: bool = False) -> dict[st headers["X-Enterprise-Id"] = str(account["enterpriseId"]) headers["X-Tenant-Id"] = str(account["enterpriseId"]) if account.get("departmentInfo"): - # 🔥 新增:部门信息(如果有) headers["X-Department-Info"] = str(account["departmentInfo"]) domain = self._domain_for_token(auth) if domain: - # The extension calls this the domain header. The server accepts - # X-Domain for the plugin protocol. headers["X-Domain"] = domain return headers @@ -343,28 +409,22 @@ def _get_machine_id(self) -> str: """获取或生成机器ID(模拟VSCode的machineId)""" import platform import uuid - - # 尝试从session读取已保存的machineId - saved_machine_id = self.session.get("machineId") - if saved_machine_id: - return str(saved_machine_id) - - # 生成一个稳定的machineId(基于主机名和用户) - try: - hostname = platform.node() - username = os.environ.get("USER") or os.environ.get("USERNAME") or "unknown" - seed = f"{hostname}-{username}" - machine_id = str(uuid.uuid5(uuid.NAMESPACE_DNS, seed)) - except Exception: - # 如果失败,生成随机ID - machine_id = str(uuid.uuid4()) - - # 保存到session - self.session["machineId"] = machine_id - self._save_session(self.session) - return machine_id + with self._session_lock: + saved_machine_id = self.session.get("machineId") + if saved_machine_id: + return str(saved_machine_id) + try: + hostname = platform.node() + username = os.environ.get("USER") or os.environ.get("USERNAME") or "unknown" + seed = f"{hostname}-{username}" + machine_id = str(uuid.uuid5(uuid.NAMESPACE_DNS, seed)) + except Exception: + machine_id = str(uuid.uuid4()) + self._save_session({**self.session, "machineId": machine_id}) + return machine_id - def login(self, *, open_browser: bool = True, timeout: int = 300) -> None: + def begin_login(self) -> dict[str, str]: + """Request an authorization URL and state without opening a browser.""" no_auth = { "X-No-Authorization": "true", "X-No-User-Id": "true", @@ -385,35 +445,92 @@ def login(self, *, open_browser: bool = True, timeout: int = 300) -> None: state = state_payload.get("state") if not state: raise CodeBuddyError("登录状态响应缺少 state") - print(f"请在浏览器中完成登录:\n{auth_url}") - if open_browser: - webbrowser.open(auth_url) - deadline = time.monotonic() + timeout + return {"auth_url": auth_url, "state": str(state)} + + @staticmethod + def _check_login_cancelled(cancel_event: Any | None) -> None: + if cancel_event is not None and cancel_event.is_set(): + raise CodeBuddyError("登录已取消") + + @classmethod + def _wait_for_login_poll(cls, deadline: float, cancel_event: Any | None) -> None: + cls._check_login_cancelled(cancel_event) + remaining = deadline - time.monotonic() + if remaining <= 0: + return + pause = min(1.0, remaining) + if cancel_event is not None and hasattr(cancel_event, "wait"): + if cancel_event.wait(pause): + raise CodeBuddyError("登录已取消") + else: + time.sleep(pause) + cls._check_login_cancelled(cancel_event) + + @staticmethod + def _account_has_uid(account: Any) -> bool: + return ( + isinstance(account, dict) + and account.get("uid") is not None + and bool(str(account.get("uid")).strip()) + ) + + def complete_login( + self, + challenge: dict[str, Any], + timeout: float = 300, + cancel_event: Any | None = None, + ) -> None: + """Poll the challenge until a token and uid-bearing account are ready. + + One deadline covers both polling stages. No session state is saved + unless a token and an account with a uid have both been returned. + """ + if not isinstance(challenge, dict) or not challenge.get("state"): + raise CodeBuddyError("登录 challenge 缺少 state") + try: + timeout_value = float(timeout) + except (TypeError, ValueError) as exc: + raise CodeBuddyError("登录超时时间无效") from exc + if timeout_value <= 0: + raise CodeBuddyError("登录超时时间必须大于 0") + state = str(challenge["state"]) + state_query = urllib.parse.quote(state, safe="") + deadline = time.monotonic() + timeout_value + _, initial_generation = self._snapshot_session() + no_auth = { + "X-No-Authorization": "true", + "X-No-User-Id": "true", + "X-No-Enterprise-Id": "true", + "X-No-Department-Info": "true", + } while time.monotonic() < deadline: - time.sleep(1) + self._check_login_cancelled(cancel_event) + remaining = deadline - time.monotonic() + if remaining <= 0: + break try: token = self._unwrap( self._request( "GET", - f"{self._auth_path('/auth/token')}?state={urllib.parse.quote(str(state), safe='')}", + f"{self._auth_path('/auth/token')}?state={state_query}", headers={**self._enterprise_headers(), **no_auth}, + timeout=min(30.0, remaining), ) ) except CodeBuddyError: - continue + token = None if isinstance(token, dict) and token.get("accessToken"): - # 🔥 关键修复:/login/account 也需要轮询(模拟 VSIX loopGetAccount) - # 服务端在用户浏览器登录后,账户信息可能需要异步准备 account = None - account_deadline = time.monotonic() + 60 # 账户轮询最多60秒 - - while time.monotonic() < account_deadline: - time.sleep(1) # 每秒轮询一次 + while time.monotonic() < deadline: + self._check_login_cancelled(cancel_event) + remaining = deadline - time.monotonic() + if remaining <= 0: + break try: account = self._unwrap( self._request( "GET", - f"{self._auth_path('/login/account')}?state={urllib.parse.quote(str(state), safe='')}", + f"{self._auth_path('/login/account')}?state={state_query}", headers={ # 关键修复:必须包含完整的 enterprise headers(包括 X-Domain) **self._enterprise_headers(token), @@ -422,21 +539,48 @@ def login(self, *, open_browser: bool = True, timeout: int = 300) -> None: "X-No-Enterprise-Id": "true", "X-No-Department-Info": "true", }, + timeout=min(30.0, remaining), ) ) - if isinstance(account, dict) and account.get("uid"): - # 账户信息获取成功 + self._check_login_cancelled(cancel_event) + if time.monotonic() >= deadline: + account = None + break + if self._account_has_uid(account): break + account = None except CodeBuddyError: - # 401 或其他错误:账户信息可能尚未就绪,继续轮询 - continue - - if not account or not isinstance(account, dict): - raise CodeBuddyError("账户信息获取超时") - - self._save_session({**self.session, "auth": token, "account": account}) - print(f"登录成功,用户: {account.get('nickname') or account.get('uid', '')}") - return + account = None + if account is not None: + break + self._wait_for_login_poll(deadline, cancel_event) + + if self._account_has_uid(account): + self._check_login_cancelled(cancel_event) + if time.monotonic() >= deadline: + raise CodeBuddyError("登录超时:未能获取包含 uid 的账户信息") + session, _ = self._snapshot_session() + self._save_session( + {**session, "auth": token, "account": account}, + expected_generation=initial_generation, + ) + return + raise CodeBuddyError("登录超时:未能获取包含 uid 的账户信息") + + self._wait_for_login_poll(deadline, cancel_event) + + self._check_login_cancelled(cancel_event) + raise CodeBuddyError("登录超时:未能获取访问令牌") + + def login(self, *, open_browser: bool = True, timeout: int = 300) -> None: + challenge = self.begin_login() + auth_url = challenge["auth_url"] + print(f"请在浏览器中完成登录:\n{auth_url}") + if open_browser: + webbrowser.open(auth_url) + self.complete_login(challenge, timeout=timeout) + account = self.session.get("account") or {} + print(f"登录成功,用户: {account.get('nickname') or account.get('uid', '')}") @staticmethod def _token_headers(token: dict[str, Any]) -> dict[str, str]: @@ -448,7 +592,18 @@ def _token_headers(token: dict[str, Any]) -> dict[str, str]: return headers def refresh(self) -> bool: - auth = self.session.get("auth") or {} + with self._auth_lock: + return self._refresh_locked() + + def _refresh_locked(self) -> bool: + session, generation = self._snapshot_session() + auth = session.get("auth") or {} + refresh_token = auth.get("refreshToken") + if not refresh_token: + return False + self._get_machine_id() + session, generation = self._snapshot_session() + auth = session.get("auth") or {} refresh_token = auth.get("refreshToken") if not refresh_token: return False @@ -457,7 +612,7 @@ def refresh(self) -> bool: "POST", self._auth_path("/auth/token/refresh"), headers={ - **self.auth_headers(access=False, refresh=True), + **self._auth_headers_for_session(session, access=False, refresh=True), "X-Auth-Refresh-Source": "plugin", }, body={}, @@ -465,19 +620,41 @@ def refresh(self) -> bool: ) if not isinstance(payload, dict) or not payload.get("accessToken"): return False - self._save_session({**self.session, "auth": payload}) - return True - - def ensure_authenticated(self, *, open_browser: bool = True) -> None: - auth = self.session.get("auth") or {} - now_ms = int(time.time() * 1000) - expires_at = int(auth.get("expiresAt") or 0) - if auth.get("accessToken") and (not expires_at or expires_at > now_ms + 60_000): - return - if self.refresh(): - print("access token 已刷新") - return - self.login(open_browser=open_browser) + saved = self._save_session( + {**session, "auth": payload}, expected_generation=generation + ) + if saved: + return True + # A newer login or import completed while refresh was in flight. + current_auth = self._snapshot_session()[0].get("auth") or {} + current_expiry = int(current_auth.get("expiresAt") or 0) + return bool( + current_auth.get("accessToken") + and (not current_expiry or current_expiry > int(time.time() * 1000)) + ) + + def ensure_authenticated( + self, + *, + open_browser: bool = True, + allow_login: bool = True, + ) -> None: + with self._auth_lock: + # A preceding request may have refreshed the token while this + # caller waited for the per-client authentication lock. + auth = self._snapshot_session()[0].get("auth") or {} + now_ms = int(time.time() * 1000) + expires_at = int(auth.get("expiresAt") or 0) + if auth.get("accessToken") and ( + not expires_at or expires_at > now_ms + 60_000 + ): + return + if self.refresh(): + print("access token 已刷新") + return + if not allow_login: + raise CodeBuddyError("当前账号需要重新登录;此请求禁止自动打开登录流程") + self.login(open_browser=open_browser) def stream_chat( self, diff --git a/test_account_checkin.py b/test_account_checkin.py new file mode 100644 index 0000000..39be0a5 --- /dev/null +++ b/test_account_checkin.py @@ -0,0 +1,825 @@ +"""Offline behavior tests for per-account scheduled daily check-in.""" + +import asyncio +from datetime import date, datetime, timedelta, timezone +import json +from types import SimpleNamespace + +import httpx +import pytest +from fastapi.responses import Response + +import codebuddy_proxy.billing_proxy as billing +from codebuddy_proxy.account_checkin import ( + AccountCheckinService, + CHECKIN_PATH, + STATUS_PATH, +) + + +BEIJING = timezone(timedelta(hours=8)) + + +class FakeClient: + def __init__(self, account_id): + self.account_id = account_id + + +class FakeStore: + def __init__(self, account_ids=("acct-a",)): + self.clients = {item: FakeClient(item) for item in account_ids} + + def list_accounts(self): + return [{"id": item} for item in self.clients] + + def get_client(self, account_id): + return self.clients[account_id] + + +class FakeManager: + def __init__(self, account_ids=("acct-a",), *, enabled=False, active="acct-a"): + self.store = FakeStore(account_ids) + self.settings = {"auto_checkin_enabled": enabled} + self.active_account_id = active + self.rate_limits = [] + + def get_settings(self): + return dict(self.settings) + + def has_account(self, account_id): + return account_id in self.store.clients + + def handle_rate_limit(self, client, retry_after, *, allow_switch=True): + self.rate_limits.append((client.account_id, retry_after, allow_switch)) + return None + + +def response(payload, status=200, headers=None): + if isinstance(payload, bytes): + content = payload + else: + content = json.dumps(payload).encode("utf-8") + return Response(content=content, status_code=status, headers=headers or {}) + + +def status_body(checked, *, active=True): + return { + "code": 0, + "msg": "OK", + "data": {"active": active, "today_checked_in": checked}, + } + + +async def wait_event(event): + await asyncio.wait_for(event.wait(), timeout=1.5) + + +def run(coro): + return asyncio.run(coro) + + +class MutableClock: + def __init__(self, value): + self.value = value + + def __call__(self): + return self.value + + def advance(self, seconds): + self.value += timedelta(seconds=seconds) + + +async def never_sleep(_seconds): + await asyncio.Event().wait() + + +def test_startup_when_enabled_checks_every_account_and_supplements_only_unchecked(): + async def scenario(): + manager = FakeManager(("acct-a", "acct-b"), enabled=True, active="acct-a") + calls = [] + completed = asyncio.Event() + status_counts = {} + + async def requester(client, method, path): + calls.append((client.account_id, method, path)) + if path == STATUS_PATH: + count = status_counts.get(client.account_id, 0) + 1 + status_counts[client.account_id] = count + if client.account_id == "acct-a" or count > 1: + if client.account_id == "acct-b" and count > 1: + completed.set() + return response(status_body(True)) + return response(status_body(False)) + return response({"code": 0, "msg": "ok", "data": {}}) + + service = AccountCheckinService( + manager, requester=requester, sleep=never_sleep + ) + await service.start() + await wait_event(completed) + assert status_counts == {"acct-a": 1, "acct-b": 2} + assert sum(path == CHECKIN_PATH for _, _, path in calls) == 1 + assert service.snapshot("acct-a")["status"] == "checked" + assert service.snapshot("acct-b")["status"] == "checked" + assert service.snapshot("acct-a")["last_checkin_at"] is None + assert service.snapshot("acct-b")["last_checkin_at"] is not None + assert manager.active_account_id == "acct-a" + await service.close() + + run(scenario()) + + +def test_enable_transition_immediately_checks_and_supplements(): + async def scenario(): + manager = FakeManager(enabled=False) + calls = [] + completed = asyncio.Event() + + async def requester(client, method, path): + calls.append(path) + if path == STATUS_PATH: + if calls.count(STATUS_PATH) == 2: + completed.set() + return response(status_body(True)) + return response(status_body(False)) + return response({"code": 0, "data": {}}) + + service = AccountCheckinService( + manager, requester=requester, sleep=never_sleep + ) + await service.start() + await asyncio.sleep(0) + assert calls == [] + manager.settings["auto_checkin_enabled"] = True + service.settings_changed(True) + await wait_event(completed) + assert calls.count(CHECKIN_PATH) == 1 + await service.close() + + run(scenario()) + + +def test_midnight_flow_checks_then_rechecks_at_absolute_random_time(): + async def scenario(): + manager = FakeManager(enabled=True) + clock = MutableClock(datetime(2026, 10, 24, 0, 1, tzinfo=BEIJING)) + calls = [] + check_count = 0 + delays = [] + completed = asyncio.Event() + + async def requester(client, method, path): + nonlocal check_count + calls.append(path) + if path == STATUS_PATH: + check_count += 1 + if check_count < 3: + return response(status_body(False)) + completed.set() + return response(status_body(True)) + return response({"code": 0, "data": {}}) + + async def advancing_sleep(seconds): + delays.append(seconds) + clock.advance(seconds) + + service = AccountCheckinService( + manager, + clock=clock, + random_delay=lambda: 120, + sleep=advancing_sleep, + requester=requester, + ) + midnight = datetime(2026, 10, 24, tzinfo=BEIJING) + await service._prepare_midnight("acct-a", "2026-10-24", midnight) + await wait_event(completed) + assert delays == pytest.approx([60.0]) + assert calls == [STATUS_PATH, STATUS_PATH, CHECKIN_PATH, STATUS_PATH] + assert service.snapshot("acct-a")["status"] == "checked" + await service.close() + + run(scenario()) + + +def test_slow_midnight_query_does_not_push_random_window_past_600_seconds(): + async def scenario(): + manager = FakeManager(enabled=True) + clock = MutableClock(datetime(2026, 10, 24, 0, 7, tzinfo=BEIJING)) + delays = [] + + async def requester(client, method, path): + return response(status_body(False)) + + async def capture_sleep(seconds): + delays.append(seconds) + # Hold this task until the assertion has observed the due delay. + await asyncio.Event().wait() + + service = AccountCheckinService( + manager, + clock=clock, + random_delay=lambda: 60, + sleep=capture_sleep, + requester=requester, + ) + await service._prepare_midnight( + "acct-a", "2026-10-24", datetime(2026, 10, 24, tzinfo=BEIJING) + ) + for _ in range(20): + if delays: + break + await asyncio.sleep(0) + assert delays == [0.0] + assert service.snapshot("acct-a")["next_checkin_at"] == datetime( + 2026, 10, 24, 0, 1, tzinfo=BEIJING + ).timestamp() + await service.close() + + run(scenario()) + + +def test_midnight_skips_already_checked_account_without_random_task(): + async def scenario(): + manager = FakeManager(enabled=True) + random_calls = [] + paths = [] + + async def requester(client, method, path): + paths.append(path) + return response(status_body(True)) + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 1, tzinfo=BEIJING), + random_delay=lambda: random_calls.append(True) or 60, + sleep=never_sleep, + requester=requester, + ) + await service._prepare_midnight( + "acct-a", "2026-10-24", datetime(2026, 10, 24, tzinfo=BEIJING) + ) + await asyncio.sleep(0) + assert paths == [STATUS_PATH] + assert random_calls == [] + assert service.snapshot("acct-a")["next_checkin_at"] is None + await service.close() + + run(scenario()) + + +def test_disabling_cancels_pending_random_timer_and_clears_due_time(): + async def scenario(): + manager = FakeManager(enabled=False) + sleep_started = asyncio.Event() + requested = [] + + async def requester(client, method, path): + requested.append(path) + return response(status_body(False)) + + async def blocked_sleep(seconds): + if seconds <= 600: + sleep_started.set() + await asyncio.Event().wait() + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 0, 1, tzinfo=BEIJING), + random_delay=lambda: 120, + sleep=blocked_sleep, + requester=requester, + ) + await service.start() + manager.settings["auto_checkin_enabled"] = True + await service._prepare_midnight( + "acct-a", "2026-10-24", datetime(2026, 10, 24, tzinfo=BEIJING) + ) + await wait_event(sleep_started) + due = service.snapshot("acct-a")["next_checkin_at"] + assert due is not None + await service.check_status("acct-a") + assert service.snapshot("acct-a")["next_checkin_at"] == due + manager.settings["auto_checkin_enabled"] = False + service.settings_changed(False) + await asyncio.sleep(0) + assert service.snapshot("acct-a")["next_checkin_at"] is None + assert requested == [STATUS_PATH, STATUS_PATH] + await service.close() + assert service._random_tasks == {} + assert service._tasks == set() + + run(scenario()) + + +def test_stop_synchronously_signals_and_cancels_pending_random_work(): + async def scenario(): + manager = FakeManager(enabled=False) + sleep_started = asyncio.Event() + paths = [] + + async def requester(client, method, path): + paths.append(path) + return response(status_body(False)) + + async def blocked_sleep(seconds): + if seconds <= 600: + sleep_started.set() + await asyncio.Event().wait() + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 0, 1, tzinfo=BEIJING), + random_delay=lambda: 120, + sleep=blocked_sleep, + requester=requester, + ) + await service.start() + manager.settings["auto_checkin_enabled"] = True + await service._prepare_midnight( + "acct-a", "2026-10-24", datetime(2026, 10, 24, tzinfo=BEIJING) + ) + await wait_event(sleep_started) + service.stop() + assert service._stop_event.is_set() + await asyncio.sleep(0) + assert paths == [STATUS_PATH] + await service.close() + assert service._tasks == set() + assert service._random_tasks == {} + + run(scenario()) + + +def test_two_concurrent_manual_checkins_send_only_one_post(): + async def scenario(): + manager = FakeManager() + status_calls = 0 + post_calls = 0 + post_started = asyncio.Event() + release_post = asyncio.Event() + + async def requester(client, method, path): + nonlocal status_calls, post_calls + if path == STATUS_PATH: + status_calls += 1 + return response(status_body(status_calls > 1)) + post_calls += 1 + post_started.set() + await release_post.wait() + return response({"code": 0, "data": {}}) + + service = AccountCheckinService(manager, requester=requester) + first = asyncio.create_task(service.check_in("acct-a")) + second = asyncio.create_task(service.check_in("acct-a")) + await wait_event(post_started) + release_post.set() + results = await asyncio.gather(first, second) + assert post_calls == 1 + assert status_calls == 3 # Before POST, post confirmation, serialized caller. + assert all(item["status"] == "checked" for item in results) + await service.close() + + run(scenario()) + + +def test_explicit_rejection_confirmed_unchecked_can_be_retried_once_later(): + async def scenario(): + manager = FakeManager() + status_calls = 0 + post_calls = 0 + + async def requester(client, method, path): + nonlocal status_calls, post_calls + if path == STATUS_PATH: + status_calls += 1 + return response(status_body(status_calls == 4)) + post_calls += 1 + if post_calls == 1: + return response({"code": 429, "msg": "limited"}, status=429) + return response({"code": 0, "data": {}}) + + service = AccountCheckinService(manager, requester=requester) + failed = await service.check_in("acct-a") + assert failed["status"] == "error" + assert failed["error"] == "签到请求失败" + assert ("acct-a", "2026-10-24") not in service._post_started + succeeded = await service.check_in("acct-a") + assert succeeded["status"] == "checked" + assert post_calls == 2 + assert status_calls == 4 + assert manager.rate_limits == [("acct-a", None, False)] + await service.close() + + run(scenario()) + + +def test_disable_while_post_waits_for_concurrency_slot_blocks_requester(): + async def scenario(): + manager = FakeManager(enabled=True) + service = None + hold_started = asyncio.Event() + release_hold = asyncio.Event() + post_calls = [] + + async def hold_slot_after_status(): + await service._semaphore.acquire() + hold_started.set() + try: + await release_hold.wait() + finally: + service._semaphore.release() + + async def requester(client, method, path): + if path == STATUS_PATH: + holder = asyncio.create_task(hold_slot_after_status()) + await asyncio.sleep(0) # Queue the holder ahead of the next request. + return response(status_body(False)) + post_calls.append(path) + return response({"code": 0, "data": {}}) + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 1, tzinfo=BEIJING), + requester=requester, + max_concurrent=1, + ) + task = service._spawn( + service._automatic_checkin("acct-a", "2026-10-24", "startup"), + key=("acct-a", "2026-10-24"), + ) + await wait_event(hold_started) + await asyncio.sleep(0) + assert ("acct-a", "2026-10-24") in service._post_started + manager.settings["auto_checkin_enabled"] = False + service._apply_settings_change(True) # Stale enable callback reads persisted off. + release_hold.set() + await task + assert post_calls == [] + assert ("acct-a", "2026-10-24") not in service._post_started + assert service.snapshot("acct-a")["status"] == "unchecked" + await service.close() + + run(scenario()) + + +def test_stale_settings_callback_uses_current_setting_to_cancel_random_task(): + async def scenario(): + manager = FakeManager(enabled=False) + sleep_started = asyncio.Event() + requested = [] + + async def requester(client, method, path): + requested.append(path) + return response(status_body(False)) + + async def blocked_sleep(seconds): + if seconds <= 600: + sleep_started.set() + await asyncio.Event().wait() + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 0, 1, tzinfo=BEIJING), + random_delay=lambda: 120, + sleep=blocked_sleep, + requester=requester, + ) + await service.start() + manager.settings["auto_checkin_enabled"] = True + await service._prepare_midnight( + "acct-a", "2026-10-24", datetime(2026, 10, 24, tzinfo=BEIJING) + ) + await wait_event(sleep_started) + assert service.snapshot("acct-a")["next_checkin_at"] is not None + manager.settings["auto_checkin_enabled"] = False + service._apply_settings_change(True) # Delayed callback from older state. + await asyncio.sleep(0) + assert service.snapshot("acct-a")["next_checkin_at"] is None + assert requested == [STATUS_PATH] + await service.close() + + run(scenario()) + + +def test_stale_off_callback_cannot_cancel_schedule_when_saved_setting_is_on(): + async def scenario(): + manager = FakeManager(enabled=False) + sleep_started = asyncio.Event() + scheduled = [] + + async def requester(client, method, path): + return response(status_body(False)) + + async def blocked_sleep(seconds): + if seconds <= 600: + sleep_started.set() + await asyncio.Event().wait() + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 0, 1, tzinfo=BEIJING), + random_delay=lambda: 120, + sleep=blocked_sleep, + requester=requester, + ) + await service.start() + service._schedule_catchup = lambda reason: scheduled.append(reason) + manager.settings["auto_checkin_enabled"] = True + await service._prepare_midnight( + "acct-a", "2026-10-24", datetime(2026, 10, 24, tzinfo=BEIJING) + ) + await wait_event(sleep_started) + before = service.snapshot("acct-a")["next_checkin_at"] + service._apply_settings_change(False) # Delayed off callback from before the final on. + assert scheduled == ["enable"] + assert service.snapshot("acct-a")["next_checkin_at"] == before + await service.close() + + run(scenario()) + + +def test_safety_logging_records_query_action_schedule_and_skips_without_payloads(): + async def scenario(): + manager = FakeManager(("acct-a", "acct-b"), enabled=True) + events = [] + status_calls = {"acct-a": 0, "acct-b": 0} + + async def requester(client, method, path): + if path == STATUS_PATH: + status_calls[client.account_id] += 1 + return response( + status_body( + client.account_id == "acct-a" + and status_calls[client.account_id] > 1 + ) + ) + return response({"code": 0, "data": {}}) + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 0, 1, tzinfo=BEIJING), + random_delay=lambda: 600, + sleep=never_sleep, + requester=requester, + ) + service.configure_logging(lambda event, **fields: events.append((event, fields))) + await service._prepare_midnight( + "acct-b", + "2026-10-24", + datetime(2026, 10, 24, tzinfo=BEIJING), + ) + await service.check_in("acct-a") + await service.check_in("acct-a") # Checked status is logged as an action skip. + names = [event for event, _ in events] + assert "account_checkin_status_check_started" in names + assert "account_checkin_scheduled" in names + assert "account_checkin_action_started" in names + assert "account_checkin_confirmed" in names + assert "account_checkin_action_skipped" in names + assert all( + set(fields).issubset( + {"account_id", "date", "reason", "status", "http_status", "next_checkin_at"} + ) + for _, fields in events + ) + await service.close() + + run(scenario()) + + +@pytest.mark.parametrize( + "payload,expected_error", + [ + ({"code": 10001, "msg": "already", "data": None}, "签到状态查询失败"), + ({"code": False, "data": {"today_checked_in": False}}, "签到状态查询失败"), + ({"code": 0, "data": {"today_checked_in": "false"}}, "签到状态查询失败"), + ( + {"code": 0, "data": {"today_checked_in": "false", "checked": True}}, + "签到状态查询失败", + ), + ( + {"code": 0, "data": {"active": False, "today_checked_in": False}}, + "签到活动未开放", + ), + ], +) +def test_unknown_or_inactive_status_never_posts(payload, expected_error): + async def scenario(): + manager = FakeManager() + paths = [] + + async def requester(client, method, path): + paths.append(path) + return response(payload) + + service = AccountCheckinService(manager, requester=requester) + result = await service.check_in("acct-a") + assert result["status"] == "error" + assert result["error"] == expected_error + assert result["checked"] is None + assert paths == [STATUS_PATH] + await service.close() + + run(scenario()) + + +def test_boolean_checked_is_strict_and_legacy_boolean_fixture_is_supported(): + async def scenario(): + manager = FakeManager() + bodies = [ + {"code": 0, "data": {"checked": True}}, + {"code": 0, "data": {"checked": 1}}, + ] + paths = [] + + async def requester(client, method, path): + paths.append(path) + return response(bodies.pop(0)) + + service = AccountCheckinService(manager, requester=requester) + old_fixture = await service.check_status("acct-a") + invalid_fixture = await service.check_status("acct-a") + assert old_fixture["status"] == "checked" + assert invalid_fixture["status"] == "error" + assert paths == [STATUS_PATH, STATUS_PATH] + await service.close() + + run(scenario()) + + +def test_disable_during_status_get_prevents_automatic_post(): + async def scenario(): + manager = FakeManager(enabled=True) + get_started = asyncio.Event() + release_get = asyncio.Event() + paths = [] + + async def requester(client, method, path): + paths.append(path) + if path == STATUS_PATH: + get_started.set() + await release_get.wait() + return response(status_body(False)) + return response({"code": 0, "data": {}}) + + service = AccountCheckinService(manager, requester=requester) + task = asyncio.create_task( + service._automatic_checkin("acct-a", "2026-10-24", "startup") + ) + await wait_event(get_started) + manager.settings["auto_checkin_enabled"] = False + release_get.set() + await task + assert paths == [STATUS_PATH] + await service.close() + + run(scenario()) + + +def test_cancelled_automatic_status_query_clears_busy_state_and_allows_manual_checkin(): + async def scenario(): + manager = FakeManager(enabled=False) + get_started = asyncio.Event() + status_calls = 0 + post_calls = 0 + + async def requester(client, method, path): + nonlocal status_calls, post_calls + if path == STATUS_PATH: + status_calls += 1 + if status_calls == 1: + get_started.set() + await asyncio.Event().wait() + return response(status_body(status_calls > 2)) + post_calls += 1 + return response({"code": 0, "data": {}}) + + service = AccountCheckinService( + manager, + clock=lambda: datetime(2026, 10, 24, 1, tzinfo=BEIJING), + requester=requester, + sleep=never_sleep, + ) + await service.start() + manager.settings["auto_checkin_enabled"] = True + task = service._spawn( + service._automatic_checkin("acct-a", "2026-10-24", "startup"), + key=("acct-a", "2026-10-24"), + ) + await wait_event(get_started) + assert service.snapshot("acct-a")["status"] == "checking" + manager.settings["auto_checkin_enabled"] = False + service.settings_changed(False) + await asyncio.gather(task, return_exceptions=True) + cancelled_state = service.snapshot("acct-a") + assert cancelled_state["status"] == "unknown" + assert cancelled_state["next_checkin_at"] is None + assert post_calls == 0 + + manual = await service.check_in("acct-a") + assert manual["status"] == "checked" + assert post_calls == 1 + await service.close() + + run(scenario()) + + +@pytest.mark.parametrize("invalidate", ["deleted", "next-day"]) +def test_random_followup_rechecks_account_and_target_date(invalidate): + async def scenario(): + manager = FakeManager(enabled=True) + sleep_started = asyncio.Event() + release_sleep = asyncio.Event() + paths = [] + clock = MutableClock(datetime(2026, 10, 24, 0, 1, tzinfo=BEIJING)) + + async def requester(client, method, path): + paths.append(path) + return response(status_body(False)) + + async def gated_sleep(_seconds): + sleep_started.set() + await release_sleep.wait() + + service = AccountCheckinService( + manager, + clock=clock, + random_delay=lambda: 120, + sleep=gated_sleep, + requester=requester, + ) + await service._prepare_midnight( + "acct-a", "2026-10-24", datetime(2026, 10, 24, tzinfo=BEIJING) + ) + await wait_event(sleep_started) + if invalidate == "deleted": + manager.store.clients.pop("acct-a") + else: + clock.advance(24 * 60 * 60) + release_sleep.set() + if invalidate == "deleted": + release_sleep.set() + await asyncio.sleep(0) + await asyncio.sleep(0) + assert paths == [STATUS_PATH] + if invalidate == "next-day": + assert service.snapshot("acct-a")["date"] == "2026-10-25" + assert service.snapshot("acct-a")["status"] == "unknown" + await service.close() + + run(scenario()) + + +def test_default_billing_requester_is_bound_to_target_and_records_429_without_switch(monkeypatch): + manager = FakeManager(("acct-a", "acct-b"), active="acct-a") + target = manager.store.clients["acct-b"] + auth_options = [] + + class BillingClient(FakeClient): + endpoint = "https://billing.example" + + def build_url(self, path): + return self.endpoint + path + + def ensure_authenticated(self, **kwargs): + auth_options.append((self.account_id, kwargs)) + + def auth_headers(self): + return {"Authorization": f"Bearer {self.account_id}"} + + manager.store.clients["acct-b"] = BillingClient("acct-b") + client = manager.store.clients["acct-b"] + real_async_client = httpx.AsyncClient + requests = [] + + def handler(request): + requests.append(request) + return httpx.Response( + 429, + content=b'{"code":429,"msg":"slow down"}', + headers={"content-type": "application/json", "Retry-After": "37"}, + ) + + transport = httpx.MockTransport(handler) + monkeypatch.setattr( + billing.httpx, + "AsyncClient", + lambda **kwargs: real_async_client(transport=transport, **kwargs), + ) + + async def scenario(): + service = AccountCheckinService(manager) + result = await service.check_status("acct-b") + assert result["status"] == "error" + assert result["error"] == "签到状态查询失败" + await service.close() + + run(scenario()) + assert len(requests) == 1 + assert requests[0].url.path == STATUS_PATH + assert requests[0].headers["authorization"] == "Bearer acct-b" + assert auth_options == [ + ("acct-b", {"open_browser": False, "allow_login": False}) + ] + assert manager.rate_limits == [("acct-b", "37", False)] + assert manager.active_account_id == "acct-a" diff --git a/test_account_checkin_integration.py b/test_account_checkin_integration.py new file mode 100644 index 0000000..c6df73d --- /dev/null +++ b/test_account_checkin_integration.py @@ -0,0 +1,171 @@ +"""Exercise per-account check-in and automatic triggers through the real app.""" +import asyncio +import json +import threading +import time + +import httpx +import pytest +from fastapi.testclient import TestClient + +import codebuddy_proxy.__main__ as proxy +from codebuddy_proxy.account_manager import AccountManager +from codebuddy_proxy.account_store import AccountStore +from test_account_integration import make_client +from codebuddy_proxy.backend_profile import DOMESTIC_PROFILE, GLOBAL_PROFILE + +ADMIN_HEADERS = {"X-Account-Manager": "1"} + + +@pytest.fixture +def checkin_environment(tmp_path, monkeypatch): + store = AccountStore(tmp_path / "accounts") + ids = {} + for profile, uid in [(DOMESTIC_PROFILE, "first"), (GLOBAL_PROFILE, "second")]: + source = make_client(tmp_path, profile, uid, token="PRIVATE-" + uid) + ids[uid] = store.import_client(source) + manager = AccountManager(store) + state = proxy.ProxyState(manager.client, None, None, account_manager=manager) + monkeypatch.setattr(proxy, "proxy_state", state) + real_async_client = httpx.AsyncClient + seen = [] + signed = set() + + async def handler(request): + uid = request.headers["X-User-Id"] + seen.append((uid, request.url.host, request.url.path, request.method, request.content)) + assert request.content == b"{}" + if request.url.path.endswith("/checkin-status"): + return httpx.Response(200, json={ + "code": 0, "msg": "OK", + "data": {"active": True, "today_checked_in": uid in signed}, + }) + assert request.url.path.endswith("/daily-checkin") + signed.add(uid) + return httpx.Response(200, json={"code": 0, "msg": "OK", "data": {}}) + + def install(custom_handler=None): + monkeypatch.setattr( + httpx, "AsyncClient", + lambda **kw: real_async_client( + transport=httpx.MockTransport(custom_handler or handler), **kw, + ), + ) + install() + yield manager, store, ids, seen, signed, install, handler + manager.close() + + +def app_client(): + return TestClient(proxy.app, base_url="http://127.0.0.1", client=("127.0.0.1", 50500)) + + +def test_checkin_of_inactive_account_preserves_active_and_uses_its_own_credentials( + checkin_environment, capsys +): + manager, store, ids, seen, signed, _, _ = checkin_environment + active = store.active_account_id + with app_client() as app: + response = app.get(f"/admin/api/accounts/{ids['second']}/checkin-status") + assert response.status_code == 200 + assert response.json()["checked"] is False + response = app.post(f"/admin/api/accounts/{ids['second']}/checkin", headers=ADMIN_HEADERS) + assert response.status_code == 200 + assert response.json()["status"] == "checked" + assert response.json()["checked"] is True + row = next(row for row in app.get("/admin/api/accounts").json()["accounts"] + if row["id"] == ids["second"]) + assert row["checkin"]["checked"] is True + assert store.active_account_id == active + assert signed == {"second"} + assert {uid for uid, *_ in seen} == {"second"} + assert {host for _, host, *_ in seen} == {"www.codebuddy.ai"} + assert sum(path.endswith("/daily-checkin") for _, _, path, *_ in seen) == 1 + output = capsys.readouterr().out + assert "[Checkin]" in output + assert "PRIVATE-" not in output + + +def test_signed_account_is_not_signed_again(checkin_environment): + _, _, ids, seen, signed, _, _ = checkin_environment + signed.add("first") + with app_client() as app: + response = app.post(f"/admin/api/accounts/{ids['first']}/checkin", headers=ADMIN_HEADERS) + assert response.status_code == 200 + assert response.json()["checked"] is True + assert not any(path.endswith("/daily-checkin") for _, _, path, *_ in seen) + + +@pytest.mark.parametrize("startup", [False, True], ids=["enable-immediately", "startup-enabled"]) +def test_automatic_trigger_checks_all_accounts_including_inactive( + checkin_environment, startup +): + manager, store, ids, seen, signed, _, _ = checkin_environment + active = store.active_account_id + if startup: + manager.set_settings(auto_checkin_enabled=True) + with app_client() as app: + if not startup: + response = app.patch("/admin/api/settings", headers=ADMIN_HEADERS, + json={"auto_checkin_enabled": True}) + assert response.status_code == 200 + assert response.json()["auto_checkin_enabled"] is True + assert response.json()["auto_switch_on_429"] is False + deadline = time.monotonic() + 5 + while time.monotonic() < deadline and signed != {"first", "second"}: + time.sleep(0.01) + assert signed == {"first", "second"} + assert store.active_account_id == active + assert sum(path.endswith("/daily-checkin") for _, _, path, *_ in seen) == 2 + + +def test_auto_switch_429_does_not_change_active_for_per_account_checkin(checkin_environment, tmp_path): + manager, store, ids, seen, _, install, _ = checkin_environment + active = store.active_account_id + store.import_client(make_client(tmp_path, DOMESTIC_PROFILE, "backup")) + manager.set_settings(auto_switch_on_429=True) + + async def limited(request): + seen.append((request.headers["X-User-Id"], request.url.host, + request.url.path, request.method, request.content)) + return httpx.Response(429, json={"code": 429}, headers={"Retry-After": "19"}) + + install(limited) + with app_client() as app: + response = app.get(f"/admin/api/accounts/{ids['first']}/checkin-status") + assert response.status_code == 200 + assert response.json()["checked"] is None + assert response.json()["status"] == "error" + assert store.active_account_id == active + first = next(row for row in manager.snapshot()["accounts"] if row["id"] == active) + assert first["rate_limited"] is True + assert len(seen) == 1 + + +def test_disabling_while_status_is_pending_prevents_auto_sign(checkin_environment): + manager, _, _, seen, signed, install, original = checkin_environment + status_entered = threading.Event() + release_status = threading.Event() + + async def pending(request): + if request.url.path.endswith("/checkin-status"): + status_entered.set() + while not release_status.is_set(): + await asyncio.sleep(0.01) + return await original(request) + + install(pending) + try: + with app_client() as app: + app.patch("/admin/api/settings", headers=ADMIN_HEADERS, + json={"auto_checkin_enabled": True}) + assert status_entered.wait(3) + response = app.patch("/admin/api/settings", headers=ADMIN_HEADERS, + json={"auto_checkin_enabled": False}) + assert response.status_code == 200 + release_status.set() + time.sleep(0.1) + assert not signed + finally: + release_status.set() + assert not any(path.endswith("/daily-checkin") for _, _, path, *_ in seen) diff --git a/test_account_integration.py b/test_account_integration.py new file mode 100644 index 0000000..3cd4564 --- /dev/null +++ b/test_account_integration.py @@ -0,0 +1,289 @@ +"""Account changes through the real proxy and startup boundary (offline).""" + +import asyncio +import json +from pathlib import Path + +import httpx +import pytest +from fastapi.testclient import TestClient + +import codebuddy_proxy.__main__ as proxy +import codebuddy_proxy.billing_proxy as billing +from codebuddy_proxy.account_manager import AccountManager +from codebuddy_proxy.account_store import AccountStore +from codebuddy_proxy.backend_profile import DOMESTIC_PROFILE, GLOBAL_PROFILE, resolve_backend +from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient + + +def make_client(tmp_path, profile, uid, token=None): + client = CodeBuddyClient(backend=resolve_backend( + profile=profile, session_file=tmp_path / f"{profile.key}-{uid}.json", + )) + client._save_session({ + "auth": {"accessToken": token or f"token-{profile.key}-{uid}"}, + "account": {"uid": uid, "nickname": f"User {uid}"}, + "machineId": "test-machine", + }) + return client + + +@pytest.fixture +def managed(tmp_path, monkeypatch): + store = AccountStore(tmp_path / "accounts") + domestic = make_client(tmp_path, DOMESTIC_PROFILE, "same-uid") + global_client = make_client(tmp_path, GLOBAL_PROFILE, "same-uid") + first = store.import_client(domestic) + second = store.import_client(global_client) + manager = AccountManager(store) + state = proxy.ProxyState(domestic, None, None, account_manager=manager) + monkeypatch.setattr(proxy, "proxy_state", state) + yield store, manager, state, first, second + manager.close() + + +def test_switch_updates_health_models_and_preserves_captured_request(managed): + store, manager, state, first, second = managed + snapshot = state.for_request() + with TestClient(proxy.app) as app: + before = app.get("/v1/models").json() + assert app.get("/health").json()["backend"] == "domestic" + manager.activate(second) + assert app.get("/health").json()["backend"] == "global" + assert app.get("/v1/models").json() != before + assert snapshot.client.profile.key == "domestic" + assert state.for_request().client.profile.key == "global" + assert snapshot.client.session["auth"]["accessToken"] == "token-domestic-same-uid" + assert AccountStore(store.root).active_account_id == second + + +@pytest.mark.parametrize("path,body", [ + ("/v1/chat/completions", {"messages": [{"role": "user", "content": "hello"}]}), + ("/v1/responses", {"input": "hello"}), + ("/v1/messages", {"messages": [{"role": "user", "content": "hello"}], "max_tokens": 10}), +]) +def test_three_protocols_switch_endpoint_and_credentials(managed, monkeypatch, path, body): + store, manager, state, first, second = managed + seen = [] + real_client = httpx.AsyncClient + + async def upstream(request): + seen.append((request.url.host, request.headers["authorization"])) + data = {"id": "test", "model": "test", "choices": [ + {"index": 0, "delta": {"content": "OK"}, "finish_reason": None}, + ]} + return httpx.Response(200, content=("data: " + json.dumps(data) + "\n\ndata: [DONE]\n\n").encode(), + headers={"content-type": "text/event-stream"}) + + monkeypatch.setattr(proxy.httpx, "AsyncClient", lambda **kw: real_client( + transport=httpx.MockTransport(upstream), **kw, + )) + with TestClient(proxy.app) as app: + assert app.post(path, json={"model": "test", "stream": False, **body}).status_code == 200 + manager.activate(second) + assert app.post(path, json={"model": "test", "stream": False, **body}).status_code == 200 + assert seen == [("copilot.tencent.com", "Bearer token-domestic-same-uid"), + ("www.codebuddy.ai", "Bearer token-global-same-uid")] + + +def test_billing_refresh_during_switch_stays_with_original_account(managed, monkeypatch): + store, manager, state, first, second = managed + old_client = state.client + seen = [] + refreshed = [] + real_client = httpx.AsyncClient + + def refresh(): + refreshed.append(old_client.profile.key) + old_client._save_session({**old_client.session, "auth": {"accessToken": "refreshed-domestic"}}) + return True + + monkeypatch.setattr(old_client, "refresh", refresh) + + async def upstream(request): + seen.append((request.url.host, request.headers["authorization"])) + if len(seen) == 1: + manager.activate(second) + return httpx.Response(401, json={"error": "expired"}) + return httpx.Response(200, json={"ok": True}) + + monkeypatch.setattr(billing.httpx, "AsyncClient", lambda **kw: real_client( + transport=httpx.MockTransport(upstream), **kw, + )) + with TestClient(proxy.app) as app: + assert app.post("/v1/checkin").status_code == 200 + assert refreshed == ["domestic"] + assert seen == [("copilot.tencent.com", "Bearer token-domestic-same-uid"), + ("copilot.tencent.com", "Bearer refreshed-domestic")] + assert state.client.profile.key == "global" + + +def test_account_switch_while_streaming_preserves_original_request(managed, monkeypatch): + store, manager, state, first, second = managed + seen = [] + real_client = httpx.AsyncClient + + class SwitchingStream(httpx.AsyncByteStream): + async def __aiter__(self): + chunk = {"id": "stream-test", "model": "test", "choices": [ + {"index": 0, "delta": {"content": "old-account"}, "finish_reason": None}, + ]} + yield ("data: " + json.dumps(chunk) + "\n\n").encode() + manager.activate(second) + yield b'data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}\n\n' + yield b"data: [DONE]\n\n" + + async def upstream(request): + seen.append((request.url.host, request.headers["authorization"])) + return httpx.Response(200, stream=SwitchingStream(), headers={"content-type": "text/event-stream"}) + + monkeypatch.setattr(proxy.httpx, "AsyncClient", lambda **kw: real_client( + transport=httpx.MockTransport(upstream), **kw, + )) + with TestClient(proxy.app) as app: + body = {"model": "test", "stream": True, "messages": [{"role": "user", "content": "hi"}]} + response = app.post("/v1/chat/completions", json=body) + assert response.status_code == 200 + assert "old-account" in response.text + assert "[DONE]" in response.text + assert state.client.profile.key == "global" + assert app.post("/v1/chat/completions", json=body).status_code == 200 + assert seen == [("copilot.tencent.com", "Bearer token-domestic-same-uid"), + ("www.codebuddy.ai", "Bearer token-global-same-uid")] + + +@pytest.mark.parametrize("path,body", [ + ("/v1/chat/completions", {"messages": [{"role": "user", "content": "hello"}]}), + ("/v1/responses", {"input": "hello"}), + ("/v1/messages", {"messages": [{"role": "user", "content": "hello"}], "max_tokens": 10}), +]) +def test_request_pins_account_before_body_parsing(managed, monkeypatch, path, body): + store, manager, state, first, second = managed + original_parser = proxy.parse_request_body + seen = [] + real_client = httpx.AsyncClient + + async def switch_during_body_read(request): + manager.activate(second) + return await original_parser(request) + + async def upstream(request): + seen.append((request.url.host, request.headers["authorization"])) + return httpx.Response(200, content=b'data: {"choices":[{"index":0,"delta":{"content":"OK"}}]}\n\ndata: [DONE]\n\n') + + monkeypatch.setattr(proxy, "parse_request_body", switch_during_body_read) + monkeypatch.setattr(proxy.httpx, "AsyncClient", lambda **kw: real_client( + transport=httpx.MockTransport(upstream), **kw, + )) + with TestClient(proxy.app) as app: + assert app.post(path, json={"model": "test", "stream": False, **body}).status_code == 200 + assert seen == [("copilot.tencent.com", "Bearer token-domestic-same-uid")] + assert manager.client.profile.key == "global" + + +def test_empty_account_starts_and_requests_do_not_open_browser(tmp_path, monkeypatch): + monkeypatch.setattr(Path, "home", lambda: tmp_path) + monkeypatch.delenv("CODEBUDDY_ENDPOINT", raising=False) + args = proxy.parse_args(["--accounts-dir", str(tmp_path / "accounts")]) + manager, fallback = proxy.initialize_account_manager(args, resolve_backend()) + monkeypatch.setattr(proxy, "proxy_state", proxy.ProxyState(fallback, None, None, account_manager=manager)) + monkeypatch.setattr(CodeBuddyClient, "login", lambda *a, **kw: pytest.fail("unexpected browser login")) + with TestClient(proxy.app) as app: + assert app.get("/health").status_code == 200 + assert app.get("/health").json()["authenticated"] is False + assert app.get("/v1/models").status_code == 200 + response = app.post("/v1/chat/completions", json={"model": "test", "messages": []}) + assert response.status_code == 401 + assert "authentication_error" in response.text + + +def test_legacy_import_once_restore_and_explicit_region(tmp_path, monkeypatch): + monkeypatch.setattr(Path, "home", lambda: tmp_path) + monkeypatch.delenv("CODEBUDDY_ENDPOINT", raising=False) + legacy = CodeBuddyClient(backend=resolve_backend()) + legacy._save_session({"auth": {"accessToken": "legacy"}, "account": {"uid": "old"}}) + original = legacy.session_file.read_bytes() + args = proxy.parse_args(["--accounts-dir", str(tmp_path / "accounts")]) + manager, client = proxy.initialize_account_manager(args, resolve_backend()) + assert client.session["auth"]["accessToken"] == "legacy" + client._save_session({**client.session, "auth": {"accessToken": "fresh"}}) + manager.close() + manager, client = proxy.initialize_account_manager(args, resolve_backend()) + assert client.session["auth"]["accessToken"] == "fresh" + assert legacy.session_file.read_bytes() == original + manager.close() + global_args = proxy.parse_args(["--global", "--accounts-dir", str(tmp_path / "accounts")]) + manager, client = proxy.initialize_account_manager(global_args, resolve_backend(global_mode=True)) + assert manager.client is None + assert client.profile.key == "global" + assert len(manager.snapshot()["accounts"]) == 1 + manager.close() + + +def test_cli_login_preserves_legacy_and_existing_accounts(tmp_path, monkeypatch): + monkeypatch.setattr(Path, "home", lambda: tmp_path) + monkeypatch.delenv("CODEBUDDY_ENDPOINT", raising=False) + legacy = CodeBuddyClient(backend=resolve_backend()) + legacy._save_session({"auth": {"accessToken": "old-token"}, "account": {"uid": "old"}}) + original = legacy.session_file.read_bytes() + + def login(client, **kwargs): + client._save_session({"auth": {"accessToken": "new-token"}, "account": {"uid": "new"}}) + + monkeypatch.setattr(CodeBuddyClient, "login", login) + args = proxy.parse_args(["--login", "--no-browser", "--accounts-dir", str(tmp_path / "accounts")]) + manager, client = proxy.initialize_account_manager(args, resolve_backend()) + assert client.session["account"]["uid"] == "new" + assert len(manager.snapshot()["accounts"]) == 2 + assert legacy.session_file.read_bytes() == original + manager.close() + + +def test_cli_login_with_no_legacy_session_or_existing_directory(tmp_path, monkeypatch): + monkeypatch.setattr(Path, "home", lambda: tmp_path) + monkeypatch.delenv("CODEBUDDY_ENDPOINT", raising=False) + + def login(client, **kwargs): + client._save_session({"auth": {"accessToken": "first-token"}, "account": {"uid": "first"}}) + + monkeypatch.setattr(CodeBuddyClient, "login", login) + args = proxy.parse_args(["--login", "--accounts-dir", str(tmp_path / "new" / "accounts")]) + manager, client = proxy.initialize_account_manager(args, resolve_backend()) + assert client.session["account"]["uid"] == "first" + manager.close() + + +def test_deleted_legacy_account_is_not_reimported_on_restart(tmp_path, monkeypatch): + monkeypatch.setattr(Path, "home", lambda: tmp_path) + monkeypatch.delenv("CODEBUDDY_ENDPOINT", raising=False) + legacy = CodeBuddyClient(backend=resolve_backend()) + legacy._save_session({"auth": {"accessToken": "old-token"}, "account": {"uid": "old"}}) + args = proxy.parse_args(["--accounts-dir", str(tmp_path / "accounts")]) + manager, _ = proxy.initialize_account_manager(args, resolve_backend()) + old_id = manager.store.active_account_id + other = make_client(tmp_path, GLOBAL_PROFILE, "other") + new_id = manager.store.import_client(other, activate=True) + manager.delete(old_id) + manager.close() + manager, client = proxy.initialize_account_manager(args, resolve_backend()) + assert manager.store.active_account_id == new_id + assert len(manager.snapshot()["accounts"]) == 1 + assert client.profile.key == "global" + manager.close() + + +def test_explicit_endpoint_ignores_unmatched_default_legacy_session(tmp_path, monkeypatch): + monkeypatch.setattr(Path, "home", lambda: tmp_path) + monkeypatch.delenv("CODEBUDDY_ENDPOINT", raising=False) + legacy = CodeBuddyClient(backend=resolve_backend()) + legacy._save_session({"auth": {"accessToken": "old-token"}, "account": {"uid": "old"}}) + original = legacy.session_file.read_bytes() + args = proxy.parse_args(["--endpoint", "https://staging.example.test", + "--accounts-dir", str(tmp_path / "accounts")]) + manager, fallback = proxy.initialize_account_manager(args, proxy.resolve_backend_from_args(args)) + assert manager.client is None + assert fallback.endpoint == "https://staging.example.test" + assert not fallback.session + assert len(manager.snapshot()["accounts"]) == 1 + assert legacy.session_file.read_bytes() == original + manager.close() diff --git a/test_account_manager.py b/test_account_manager.py new file mode 100644 index 0000000..df031fb --- /dev/null +++ b/test_account_manager.py @@ -0,0 +1,788 @@ +import threading +import time +import json +from datetime import datetime, timezone +from email.utils import format_datetime +from types import SimpleNamespace + +import pytest + +from codebuddy_proxy.account_manager import AccountManager, AccountManagerError +from codebuddy_proxy.account_store import AccountStore +from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient + + +class FakeStore: + def __init__(self, root): + self.root = root + self._accounts = [] + self._clients = {} + self._active_id = None + self.import_calls = [] + self.set_active_calls = [] + + @property + def active_account_id(self): + return self._active_id + + def list_accounts(self): + return [ + {key: account[key] for key in ("id", "backend", "endpoint", "uid", "nickname", "active")} + for account in self._accounts + ] + + def active_client(self): + return self._clients.get(self._active_id) + + def get_client(self, account_id): + return self._clients[account_id] + + def import_client(self, client, *, activate=False): + self.import_calls.append(activate) + profile = client.backend + endpoint = client.endpoint + account = client.session["account"] + existing = next( + ( + item + for item in self._accounts + if item["backend"] == profile + and item["endpoint"] == endpoint + and item["uid"] == str(account["uid"]) + ), + None, + ) + if existing is None: + account_id = f"account-{len(self._accounts) + 1}" + existing = { + "id": account_id, + "backend": profile, + "endpoint": endpoint, + "uid": str(account["uid"]), + "nickname": account.get("nickname"), + "active": False, + } + self._accounts.append(existing) + else: + account_id = existing["id"] + self._clients[account_id] = client + if activate or self._active_id is None: + self.set_active(account_id) + return account_id + + def set_active(self, account_id): + if account_id not in self._clients: + raise KeyError(account_id) + self.set_active_calls.append(account_id) + self._active_id = account_id + for account in self._accounts: + account["active"] = account["id"] == account_id + return self._clients[account_id] + + def delete_account(self, account_id): + if account_id not in self._clients: + raise KeyError(account_id) + self._accounts = [item for item in self._accounts if item["id"] != account_id] + self._clients.pop(account_id) + + +class FakeLoginClient: + def __init__(self, backend, session_file, *, uid, begin_gate=None, complete_gate=None): + self.backend = backend + self.endpoint = f"https://{backend}.example.test" + self.session_file = session_file + self.uid = uid + self.begin_gate = begin_gate + self.complete_gate = complete_gate + self.begin_started = threading.Event() + self.complete_started = threading.Event() + self.session = {} + self.completed_challenge = None + self.cancel_event = None + + def begin_login(self): + self.begin_started.set() + if self.begin_gate is not None: + self.begin_gate.wait(5) + return {"auth_url": "https://login.example.test/authorize?flow=abc", "state": "opaque-state"} + + def complete_login(self, challenge, *, timeout, cancel_event): + self.complete_started.set() + self.completed_challenge = challenge + self.cancel_event = cancel_event + if self.complete_gate is not None: + self.complete_gate.wait(5) + # Deliberately finish successfully even if cancellation won. The + # manager must still prevent this temporary session from being saved. + self.session = { + "auth": {"accessToken": "private-token-value"}, + "account": {"uid": self.uid, "nickname": f"User {self.uid}"}, + } + + +class StoredClient: + def __init__(self, backend, uid, *, endpoint=None, auth=None): + self.backend = backend + self.profile = SimpleNamespace(key=backend) + self.endpoint = endpoint or f"https://{backend}.example.test" + self.session = { + "auth": auth if auth is not None else {"accessToken": f"token-{uid}"}, + "account": {"uid": uid, "nickname": f"User {uid}"}, + } + + def _snapshot_session(self): + return self.session, 1 + + +def _wait_for(manager, job_id, status): + deadline = time.monotonic() + 3 + while time.monotonic() < deadline: + result = manager.get_login(job_id) + if result["status"] == status: + return result + time.sleep(0.01) + raise AssertionError(f"login did not reach {status}: {manager.get_login(job_id)}") + + +def test_login_imports_only_after_success_and_does_not_switch_existing_account(tmp_path): + store = FakeStore(tmp_path) + made_clients = [] + + def make_client(backend, session_file): + client = FakeLoginClient(backend, session_file, uid=f"u{len(made_clients) + 1}") + made_clients.append(client) + return client + + manager = AccountManager(store, client_factory=make_client) + try: + first = manager.start_login("domestic") + first_result = _wait_for(manager, first["id"], "succeeded") + assert first_result["account_id"] == "account-1" + assert manager.snapshot()["active_account_id"] == "account-1" + assert manager.cancel_login(first["id"])["status"] == "succeeded" + + second = manager.start_login("global") + second_result = _wait_for(manager, second["id"], "succeeded") + assert second_result["account_id"] == "account-2" + assert manager.snapshot()["active_account_id"] == "account-1" + assert store.import_calls == [True, False] + assert manager.client is store.active_client() + assert all("state" not in result for result in (first_result, second_result)) + assert all("session" not in result and "token" not in result for result in (first_result, second_result)) + assert tmp_path in made_clients[0].session_file.parents + assert not made_clients[0].session_file.exists() + finally: + manager.close() + + +def test_cancel_wins_if_it_happens_before_login_commit(tmp_path): + store = FakeStore(tmp_path) + completion_gate = threading.Event() + client = FakeLoginClient( + "domestic", tmp_path / "unused", uid="cancelled-user", complete_gate=completion_gate + ) + manager = AccountManager(store, client_factory=lambda backend, path: client) + try: + job = manager.start_login("domestic") + assert client.complete_started.wait(2) + cancelled = manager.cancel_login(job["id"]) + assert cancelled["status"] == "cancelled" + assert client.cancel_event.is_set() + + completion_gate.set() + time.sleep(0.05) + assert manager.get_login(job["id"])["status"] == "cancelled" + assert store.import_calls == [] + assert manager.snapshot()["accounts"] == [] + finally: + completion_gate.set() + manager.close() + + +def test_close_cancels_active_login_and_prevents_store_import(tmp_path): + store = FakeStore(tmp_path) + client = FakeLoginClient("domestic", tmp_path / "unused", uid="closed-user") + + def wait_until_cancelled(challenge, *, timeout, cancel_event): + client.complete_started.set() + client.completed_challenge = challenge + client.cancel_event = cancel_event + assert cancel_event.wait(2) + # Even a completion racing with shutdown must not enter the real store. + client.session = { + "auth": {"accessToken": "private-token-value"}, + "account": {"uid": client.uid}, + } + + client.complete_login = wait_until_cancelled + manager = AccountManager(store, client_factory=lambda backend, path: client) + job = manager.start_login("domestic") + assert client.complete_started.wait(2) + manager.close() + + assert manager.get_login(job["id"])["status"] == "cancelled" + assert store.import_calls == [] + + +def test_login_failure_does_not_expose_exception_text(tmp_path): + store = FakeStore(tmp_path) + + class FailingClient(FakeLoginClient): + def begin_login(self): + raise RuntimeError("provider returned private-token-value and raw payload") + + client = FailingClient("domestic", tmp_path / "unused", uid="never-saved") + manager = AccountManager(store, client_factory=lambda backend, path: client) + try: + job = manager.start_login("domestic") + result = _wait_for(manager, job["id"], "failed") + assert result["error"] == "登录失败,请稍后重新尝试" + assert "private-token-value" not in repr(result) + assert "raw payload" not in repr(result) + assert store.import_calls == [] + finally: + manager.close() + + +def test_login_concurrency_is_bounded_and_invalid_backend_is_rejected(tmp_path): + store = FakeStore(tmp_path) + begin_gate = threading.Event() + client = FakeLoginClient("domestic", tmp_path / "unused", uid="u1", begin_gate=begin_gate) + manager = AccountManager( + store, + max_concurrent_logins=1, + client_factory=lambda backend, path: client, + ) + try: + job = manager.start_login("domestic") + assert client.begin_started.wait(2) + with pytest.raises(AccountManagerError) as capacity_error: + manager.start_login("global") + assert capacity_error.value.status_code == 429 + with pytest.raises(AccountManagerError): + manager.start_login("unknown") + manager.cancel_login(job["id"]) + finally: + begin_gate.set() + manager.close() + + +def test_cancelled_but_running_factory_keeps_its_concurrency_slot(tmp_path): + store = FakeStore(tmp_path) + factory_started = threading.Event() + factory_gate = threading.Event() + made_clients = [] + + def blocking_factory(backend, session_file): + factory_started.set() + factory_gate.wait(5) + client = FakeLoginClient(backend, session_file, uid="u1") + made_clients.append(client) + return client + + manager = AccountManager( + store, + max_concurrent_logins=1, + client_factory=blocking_factory, + ) + try: + job = manager.start_login("domestic") + assert factory_started.wait(2) + assert manager.cancel_login(job["id"])["status"] == "cancelled" + + # Cancellation marks the public state immediately, but the blocked + # worker still occupies the only slot until its future actually ends. + for _ in range(3): + with pytest.raises(AccountManagerError) as capacity_error: + manager.start_login("global") + assert capacity_error.value.status_code == 429 + + factory_gate.set() + deadline = time.monotonic() + 2 + while time.monotonic() < deadline: + with manager._lock: + original = manager._jobs[job["id"]] + if original.future.done(): + break + time.sleep(0.01) + assert original.future.done() + assert len(made_clients) == 1 + assert not made_clients[0].begin_started.is_set() + assert store.import_calls == [] + finally: + factory_gate.set() + manager.close() + + +def test_login_manager_imports_a_real_codebuddy_client_into_account_store(tmp_path, monkeypatch): + store = AccountStore(tmp_path / "accounts") + + def begin_login(_client): + return {"auth_url": "https://login.example.test/authorize", "state": "test-state"} + + def complete_login(self, challenge, *, timeout, cancel_event): + assert challenge == {"auth_url": "https://login.example.test/authorize", "state": "test-state"} + assert timeout == 300 + assert not cancel_event.is_set() + self._save_session( + { + **self.session, + "auth": {"accessToken": "test-token"}, + "account": {"uid": "integration-user", "nickname": "Integration user"}, + } + ) + + monkeypatch.setattr(CodeBuddyClient, "begin_login", begin_login) + monkeypatch.setattr(CodeBuddyClient, "complete_login", complete_login) + + manager = AccountManager(store) + try: + job = manager.start_login("global") + result = _wait_for(manager, job["id"], "succeeded") + assert result["account_id"] + accounts = store.list_accounts() + assert len(accounts) == 1 + assert accounts[0]["backend"] == "global" + assert accounts[0]["uid"] == "integration-user" + assert accounts[0]["active"] is True + assert manager.client.session["auth"]["accessToken"] == "test-token" + assert "test-token" not in repr(result) + finally: + manager.close() + + +def test_rate_limit_snapshot_defaults_and_runtime_state_persist_without_credentials(tmp_path): + store = FakeStore(tmp_path) + client = StoredClient("domestic", "rate-limited") + store.import_client(client, activate=True) + manager = AccountManager(store) + try: + account_id = manager.account_id_for_client(client) + assert account_id == "account-1" + assert manager.get_settings() == { + "auto_switch_on_429": False, + "default_cooldown_seconds": 60, + "auto_checkin_enabled": False, + } + manager.set_settings(True) + + before = time.time() + assert manager.handle_rate_limit(client, "invalid retry value") is None + snapshot = manager.snapshot() + limited = snapshot["accounts"][0] + assert snapshot["settings"]["auto_switch_on_429"] is True + assert snapshot["server_time"] >= before + assert limited["rate_limited"] is True + assert limited["cooldown_source"] == "default" + assert limited["cooldown_until"] == pytest.approx(before + 60, abs=1) + assert 1 <= limited["cooldown_remaining_seconds"] <= 60 + assert limited["last_rate_limited_at"] == pytest.approx(before, abs=1) + + state_file = tmp_path / "account-manager-state-v1.json" + raw_state = state_file.read_text(encoding="utf-8") + assert "token-rate-limited" not in raw_state + assert "accessToken" not in raw_state + finally: + manager.close() + + reopened = AccountManager(store) + try: + assert reopened.get_settings()["auto_switch_on_429"] is True + restored = reopened.snapshot()["accounts"][0] + assert restored["rate_limited"] is True + assert restored["cooldown_source"] == "default" + assert restored["cooldown_until"] == pytest.approx(limited["cooldown_until"]) + finally: + reopened.close() + + +def test_retry_after_zero_and_http_date_are_supported_and_expire_without_poll_writes( + tmp_path, monkeypatch +): + store = FakeStore(tmp_path) + zero_client = StoredClient("domestic", "zero") + date_client = StoredClient("domestic", "date") + store.import_client(zero_client, activate=True) + store.import_client(date_client) + manager = AccountManager(store) + try: + fixed_now = time.time() + zero_deadline = fixed_now + date_deadline = fixed_now + 75 + date_value = format_datetime( + datetime.fromtimestamp(date_deadline, timezone.utc), usegmt=True + ) + monkeypatch.setattr("codebuddy_proxy.account_manager.time.time", lambda: fixed_now) + assert manager.handle_rate_limit(zero_client, "0") is None + assert manager.handle_rate_limit(date_client, date_value) is None + + rows = {item["uid"]: item for item in manager.snapshot()["accounts"]} + assert rows["zero"]["rate_limited"] is False + assert rows["zero"]["cooldown_source"] is None + assert rows["zero"]["last_rate_limited_at"] == pytest.approx(fixed_now) + assert rows["date"]["rate_limited"] is True + assert rows["date"]["cooldown_source"] == "retry_after" + assert rows["date"]["cooldown_until"] == pytest.approx(date_deadline, abs=1) + + persisted_before_expiry = (tmp_path / "account-manager-state-v1.json").read_text( + encoding="utf-8" + ) + monkeypatch.setattr( + "codebuddy_proxy.account_manager.time.time", lambda: fixed_now + 76 + ) + expired = {item["uid"]: item for item in manager.snapshot()["accounts"]}["date"] + assert expired["rate_limited"] is False + assert expired["cooldown_until"] is None + assert expired["cooldown_remaining_seconds"] == 0 + assert expired["last_rate_limited_at"] == pytest.approx(fixed_now) + assert ( + tmp_path / "account-manager-state-v1.json" + ).read_text(encoding="utf-8") == persisted_before_expiry + finally: + manager.close() + + +def test_auto_switch_is_opt_in_region_scoped_and_respects_exclusions(tmp_path): + store = FakeStore(tmp_path) + original = StoredClient("domestic", "original") + excluded = StoredClient("domestic", "excluded") + candidate = StoredClient("domestic", "candidate") + other_region = StoredClient("global", "global") + original_id = store.import_client(original, activate=True) + excluded_id = store.import_client(excluded) + candidate_id = store.import_client(candidate) + store.import_client(other_region) + manager = AccountManager(store) + try: + assert manager.handle_rate_limit(original, "30") is None + assert store.active_account_id == original_id + + manager.set_settings(True) + switched = manager.handle_rate_limit( + original, "30", excluded_account_ids={excluded_id} + ) + assert switched is candidate + assert store.active_account_id == candidate_id + + # A delayed 429 from the old request records the longer deadline but + # cannot rotate away from the account that is now active. + latest = manager.handle_rate_limit(original, "5") + assert latest is None + assert store.active_account_id == candidate_id + row = next(item for item in manager.snapshot()["accounts"] if item["id"] == original_id) + assert row["cooldown_remaining_seconds"] > 0 + assert row["cooldown_source"] == "retry_after" + finally: + manager.close() + + +def test_concurrent_429s_from_same_active_account_only_switch_once(tmp_path): + from concurrent.futures import ThreadPoolExecutor + + store = FakeStore(tmp_path) + original = StoredClient("domestic", "original") + candidate = StoredClient("domestic", "candidate") + original_id = store.import_client(original, activate=True) + candidate_id = store.import_client(candidate) + manager = AccountManager(store) + manager.set_settings(True) + barrier = threading.Barrier(3) + + def rate_limit(): + barrier.wait(timeout=2) + return manager.handle_rate_limit(original, "45") + + try: + with ThreadPoolExecutor(max_workers=2) as executor: + results = [executor.submit(rate_limit) for _ in range(2)] + barrier.wait(timeout=2) + clients = [future.result(timeout=3) for future in results] + assert clients.count(candidate) == 1 + assert clients.count(None) == 1 + assert store.active_account_id == candidate_id + assert store.set_active_calls.count(candidate_id) == 1 + row = next(item for item in manager.snapshot()["accounts"] if item["id"] == original_id) + assert row["rate_limited"] is True + finally: + manager.close() + + +def test_cooldown_max_deadline_manual_switch_and_refreshable_candidate(tmp_path, monkeypatch): + store = FakeStore(tmp_path) + original = StoredClient("domestic", "original") + expired_candidate = StoredClient( + "domestic", + "expired", + auth={"accessToken": "expired", "expiresAt": 1}, + ) + refreshable = StoredClient( + "domestic", + "refreshable", + auth={"refreshToken": "refresh-only"}, + ) + original_id = store.import_client(original, activate=True) + store.import_client(expired_candidate) + refreshable_id = store.import_client(refreshable) + manager = AccountManager(store) + try: + manager.set_settings(True) + fixed_now = 1_800_000_000.0 + monkeypatch.setattr("codebuddy_proxy.account_manager.time.time", lambda: fixed_now) + assert manager.handle_rate_limit(original, "120") is refreshable + assert store.active_account_id == refreshable_id + + # The later shorter default cooldown must not reduce the original 120s. + assert manager.handle_rate_limit(original, None) is None + original_row = next( + item for item in manager.snapshot()["accounts"] if item["id"] == original_id + ) + assert original_row["cooldown_until"] == fixed_now + 120 + assert original_row["cooldown_source"] == "retry_after" + + # Even with automation enabled, an explicit selection is preserved if + # a previously active client's 429 arrives afterward. + manager.activate(original_id) + assert manager.handle_rate_limit(refreshable, "10") is None + assert store.active_account_id == original_id + finally: + manager.close() + + +def test_cooldown_is_cleared_when_account_is_deleted_and_bad_runtime_file_is_preserved(tmp_path): + store = FakeStore(tmp_path) + active = StoredClient("domestic", "active") + inactive = StoredClient("domestic", "inactive") + store.import_client(active, activate=True) + inactive_id = store.import_client(inactive) + manager = AccountManager(store) + try: + manager.handle_rate_limit(inactive, "45") + state_file = tmp_path / "account-manager-state-v1.json" + manager.delete(inactive_id) + state = json.loads(state_file.read_text(encoding="utf-8")) + assert inactive_id not in state["cooldowns"] + assert all(row["id"] != inactive_id for row in manager.snapshot()["accounts"]) + finally: + manager.close() + + state_file = tmp_path / "account-manager-state-v1.json" + corrupted_values = ( + "{broken", + '{"version":2,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60},"cooldowns":{}}', + '{"version":true,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"auto_checkin_enabled":false},"cooldowns":{}}', + '{"version":1,"settings":{"auto_switch_on_429":"true","default_cooldown_seconds":60},"cooldowns":{}}', + '{"version":1,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"auto_checkin_enabled":1},"cooldowns":{}}', + '{"version":1,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"unexpected":false},"cooldowns":{}}', + '{"version":1,"version":1,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60},"cooldowns":{}}', + ) + for corrupted in corrupted_values: + state_file.write_text(corrupted, encoding="utf-8") + with pytest.raises(AccountManagerError) as failure: + AccountManager(store) + assert failure.value.message in { + "账号管理状态文件损坏,未修改任何数据", + "账号管理状态文件版本不受支持,未修改任何数据", + } + assert state_file.read_text(encoding="utf-8") == corrupted + + +def test_failed_cooldown_persistence_aborts_account_deletion(tmp_path, monkeypatch): + import codebuddy_proxy.account_manager as account_manager_module + + store = FakeStore(tmp_path) + active = StoredClient("domestic", "active") + inactive = StoredClient("domestic", "inactive") + store.import_client(active, activate=True) + inactive_id = store.import_client(inactive) + manager = AccountManager(store) + try: + manager.handle_rate_limit(inactive, "45") + state_file = tmp_path / "account-manager-state-v1.json" + original_state = state_file.read_text(encoding="utf-8") + + def failed_write(_path, _payload): + raise OSError("private runtime-state path") + + monkeypatch.setattr(account_manager_module, "_atomic_json", failed_write) + with pytest.raises(AccountManagerError) as failure: + manager.delete(inactive_id) + + assert failure.value.message == "无法保存账号管理状态" + assert manager.has_account(inactive_id) + row = next( + account for account in manager.snapshot()["accounts"] + if account["id"] == inactive_id + ) + assert row["rate_limited"] is True + assert state_file.read_text(encoding="utf-8") == original_state + finally: + manager.close() + + +def test_failed_store_deletion_restores_persisted_cooldown(tmp_path, monkeypatch): + store = FakeStore(tmp_path) + active = StoredClient("domestic", "active") + inactive = StoredClient("domestic", "inactive") + store.import_client(active, activate=True) + inactive_id = store.import_client(inactive) + manager = AccountManager(store) + try: + manager.handle_rate_limit(inactive, "45") + state_file = tmp_path / "account-manager-state-v1.json" + original_state = json.loads(state_file.read_text(encoding="utf-8")) + + def failed_delete(_account_id): + raise OSError("simulated account-store failure") + + monkeypatch.setattr(store, "delete_account", failed_delete) + with pytest.raises(OSError, match="simulated account-store failure"): + manager.delete(inactive_id) + + assert manager.has_account(inactive_id) + row = next( + account for account in manager.snapshot()["accounts"] + if account["id"] == inactive_id + ) + assert row["rate_limited"] is True + restored_state = json.loads(state_file.read_text(encoding="utf-8")) + assert restored_state["cooldowns"][inactive_id] == original_state["cooldowns"][inactive_id] + finally: + manager.close() + + +def test_failed_settings_persistence_rolls_back_memory_and_uses_safe_error(tmp_path, monkeypatch): + import codebuddy_proxy.account_manager as account_manager_module + + manager = AccountManager(FakeStore(tmp_path)) + try: + manager.set_settings(True) + state_file = tmp_path / "account-manager-state-v1.json" + original = state_file.read_text(encoding="utf-8") + + def failed_write(_path, _payload): + raise OSError("private path and token value") + + monkeypatch.setattr(account_manager_module, "_atomic_json", failed_write) + with pytest.raises(AccountManagerError) as failure: + manager.set_settings(False) + assert failure.value.message == "无法保存账号管理状态" + assert "private path" not in str(failure.value) + assert manager.get_settings()["auto_switch_on_429"] is True + assert state_file.read_text(encoding="utf-8") == original + finally: + manager.close() + + +def test_fake_store_without_root_keeps_runtime_settings_in_memory(tmp_path): + store = FakeStore(tmp_path) + del store.root + manager = AccountManager(store) + try: + assert manager.set_settings(True)["auto_switch_on_429"] is True + assert manager.get_settings()["auto_switch_on_429"] is True + finally: + manager.close() + + +def test_legacy_runtime_settings_migrate_on_write_without_losing_cooldowns(tmp_path): + store = FakeStore(tmp_path) + client = StoredClient("domestic", "legacy") + store.import_client(client, activate=True) + deadline = time.time() + 120 + state_path = tmp_path / "account-manager-state-v1.json" + state_path.write_text( + json.dumps( + { + "version": 1, + "settings": { + "auto_switch_on_429": True, + "default_cooldown_seconds": 60, + }, + "cooldowns": { + "account-1": { + "deadline": deadline, + "last_rate_limited_at": deadline - 10, + "source": "retry_after", + } + }, + } + ), + encoding="utf-8", + ) + + manager = AccountManager(store) + try: + assert manager.get_settings() == { + "auto_switch_on_429": True, + "default_cooldown_seconds": 60, + "auto_checkin_enabled": False, + } + assert manager.snapshot()["accounts"][0]["cooldown_until"] == pytest.approx(deadline) + + manager.set_settings(auto_checkin_enabled=True) + persisted = json.loads(state_path.read_text(encoding="utf-8")) + assert persisted["settings"] == { + "auto_switch_on_429": True, + "default_cooldown_seconds": 60, + "auto_checkin_enabled": True, + } + assert persisted["cooldowns"]["account-1"]["deadline"] == pytest.approx(deadline) + finally: + manager.close() + + +def test_checkin_setting_callback_only_follows_successful_transitions(tmp_path, monkeypatch): + import codebuddy_proxy.account_manager as account_manager_module + + manager = AccountManager(FakeStore(tmp_path)) + callbacks = [] + manager.checkins.settings_changed = callbacks.append + try: + manager.set_settings(auto_switch_on_429=True) + manager.set_settings(auto_checkin_enabled=False) + assert callbacks == [] + + manager.set_settings(auto_checkin_enabled=True) + assert callbacks == [True] + manager.set_settings(auto_checkin_enabled=True) + assert callbacks == [True] + + state_path = tmp_path / "account-manager-state-v1.json" + original = state_path.read_text(encoding="utf-8") + + def failed_write(_path, _payload): + raise OSError("private path and token value") + + monkeypatch.setattr(account_manager_module, "_atomic_json", failed_write) + with pytest.raises(AccountManagerError) as failure: + manager.set_settings(auto_checkin_enabled=False) + assert failure.value.message == "无法保存账号管理状态" + assert manager.get_settings()["auto_checkin_enabled"] is True + assert callbacks == [True] + assert state_path.read_text(encoding="utf-8") == original + finally: + manager.close() + + +def test_checkin_rate_limit_records_cooldown_without_switching_active(tmp_path): + store = FakeStore(tmp_path) + checked_client = StoredClient("domestic", "checked-client") + backup_client = StoredClient("domestic", "backup-client") + original_id = store.import_client(checked_client, activate=True) + store.import_client(backup_client) + manager = AccountManager(store) + try: + manager.set_settings(True) + assert manager.handle_rate_limit( + checked_client, "45", allow_switch=False + ) is None + assert store.active_account_id == original_id + row = next( + account + for account in manager.snapshot()["accounts"] + if account["id"] == original_id + ) + assert row["rate_limited"] is True + assert row["cooldown_source"] == "retry_after" + finally: + manager.close() diff --git a/test_account_store.py b/test_account_store.py new file mode 100644 index 0000000..0586913 --- /dev/null +++ b/test_account_store.py @@ -0,0 +1,320 @@ +import json +import threading + +import pytest + +import codebuddy_proxy.account_store as account_store_module +from codebuddy_proxy.account_store import AccountStore +from codebuddy_proxy.backend_profile import DOMESTIC_PROFILE, GLOBAL_PROFILE, resolve_backend +from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient, CodeBuddyError + + +def _client(path, *, profile=DOMESTIC_PROFILE, endpoint=None, uid="user-1", access="access-1"): + client = CodeBuddyClient( + backend=resolve_backend( + profile=profile, + endpoint=endpoint, + session_file=path, + environment={}, + ) + ) + client._save_session( + { + "auth": {"accessToken": access, "refreshToken": f"refresh-{access}"}, + "account": {"uid": uid, "nickname": f"Name {uid}"}, + "machineId": "machine-1", + } + ) + return client + + +def test_import_isolated_and_reassociation_updates_cached_client(tmp_path): + store = AccountStore(tmp_path / "accounts") + source_file = tmp_path / "source.json" + source = _client(source_file) + source_before = source_file.read_bytes() + + account_id = store.import_client(source) + assert store.active_account_id == account_id + cached = store.get_client(account_id) + assert cached.session_file != source_file + assert source_file.read_bytes() == source_before + + replacement = _client(tmp_path / "replacement.json", access="access-2") + replacement_before = replacement.session_file.read_bytes() + assert store.import_client(replacement) == account_id + assert replacement.session_file.read_bytes() == replacement_before + assert store.get_client(account_id) is cached + assert cached.session["auth"]["accessToken"] == "access-2" + + index_text = (store.root / "index.json").read_text(encoding="utf-8") + assert "access-1" not in index_text + assert "access-2" not in index_text + assert "refresh-access-2" not in index_text + assert set(json.loads(index_text)["accounts"][0]) == { + "id", "backend", "endpoint", "uid", "nickname" + } + assert store.list_accounts() == [ + { + "id": account_id, + "backend": "domestic", + "endpoint": DOMESTIC_PROFILE.default_endpoint, + "uid": "user-1", + "nickname": "Name user-1", + "active": True, + } + ] + + +def test_identity_includes_backend_and_endpoint_and_clear_is_persistent(tmp_path): + root = tmp_path / "accounts" + store = AccountStore(root) + domestic = _client(tmp_path / "domestic.json") + global_client = _client( + tmp_path / "global.json", profile=GLOBAL_PROFILE, uid="user-1", access="global-access" + ) + custom = _client( + tmp_path / "custom.json", + endpoint="https://staging.example.test", + uid="user-1", + access="custom-access", + ) + + domestic_id = store.import_client(domestic) + global_id = store.import_client(global_client) + custom_id = store.import_client(custom) + assert len({domestic_id, global_id, custom_id}) == 3 + assert store.active_account_id == domestic_id + + active_global = store.set_active(global_id) + assert active_global.session["auth"]["accessToken"] == "global-access" + with pytest.raises(CodeBuddyError, match="不能删除当前生效账号"): + store.delete_account(global_id) + + store.clear_active() + reopened = AccountStore(root) + assert reopened.active_account_id is None + assert reopened.active_client() is None + # Re-importing an existing account after an explicit clear keeps the store empty. + assert reopened.import_client(global_client) == global_id + assert reopened.active_account_id is None + reopened.delete_account(global_id) + assert all(item["id"] != global_id for item in reopened.list_accounts()) + + +def test_corrupt_index_is_rejected_without_overwrite(tmp_path): + root = tmp_path / "accounts" + root.mkdir() + index = root / "index.json" + index.write_text("{broken", encoding="utf-8") + + with pytest.raises(CodeBuddyError, match="账号索引文件损坏"): + AccountStore(root) + assert index.read_text(encoding="utf-8") == "{broken" + + +@pytest.mark.parametrize( + "session", + [ + {"auth": {"accessToken": "token"}, "account": {"nickname": "No uid"}}, + {"auth": {}, "account": {"uid": "user-1"}}, + ], +) +def test_import_rejects_legacy_session_without_uid_or_token(tmp_path, session): + client = CodeBuddyClient(session_file=tmp_path / "legacy.json") + client._save_session(session) + with pytest.raises(CodeBuddyError, match="缺少"): + AccountStore(tmp_path / "accounts").import_client(client) + assert not (tmp_path / "accounts" / "index.json").exists() + + +def test_inflight_old_refresh_cannot_overwrite_reassociated_token(tmp_path, monkeypatch): + store = AccountStore(tmp_path / "accounts") + account_id = store.import_client(_client(tmp_path / "first.json", access="first-access")) + cached = store.get_client(account_id) + request_started = threading.Event() + release_request = threading.Event() + refresh_result = [] + + def delayed_refresh(method, path, *, headers=None, body=None, timeout=30): + request_started.set() + assert release_request.wait(5) + return {"accessToken": "stale-refreshed-access", "refreshToken": "stale-refresh"} + + monkeypatch.setattr(cached, "_request", delayed_refresh) + thread = threading.Thread(target=lambda: refresh_result.append(cached.refresh())) + thread.start() + assert request_started.wait(5) + + assert store.import_client( + _client(tmp_path / "new-login.json", access="new-login-access") + ) == account_id + release_request.set() + thread.join(5) + + assert not thread.is_alive() + assert refresh_result == [True] + assert cached.session["auth"]["accessToken"] == "new-login-access" + saved = json.loads(cached.session_file.read_text(encoding="utf-8")) + assert saved["auth"]["accessToken"] == "new-login-access" + + +def test_failed_first_import_rolls_back_orphan_session_and_index(tmp_path, monkeypatch): + store = AccountStore(tmp_path / "accounts") + source = _client(tmp_path / "first-import.json", access="new-token") + _, metadata = store._validated_client_session(source) + session_file = store._session_file(metadata["id"]) + write_index = store._write_index_locked + + def fail_index_write(index): + write_index(index) + raise OSError("injected index write failure") + + monkeypatch.setattr(store, "_write_index_locked", fail_index_write) + with pytest.raises(OSError, match="injected index write failure"): + store.import_client(source) + + assert not session_file.exists() + assert not (store.root / "index.json").exists() + assert store.list_accounts() == [] + + +def test_failed_reassociation_restores_session_file_and_cached_state(tmp_path, monkeypatch): + store = AccountStore(tmp_path / "accounts") + account_id = store.import_client( + _client(tmp_path / "old-login.json", access="old-token") + ) + cached = store.get_client(account_id) + previous_session, _ = cached._snapshot_session() + session_file = cached.session_file + previous_file = session_file.read_bytes() + index_file = store.index_file + previous_index = index_file.read_bytes() + replacement = _client(tmp_path / "new-login.json", access="new-token") + write_index = store._write_index_locked + + def fail_index_write(index): + write_index(index) + raise OSError("injected index write failure") + + monkeypatch.setattr(store, "_write_index_locked", fail_index_write) + with pytest.raises(OSError, match="injected index write failure"): + store.import_client(replacement) + + assert session_file.read_bytes() == previous_file + assert index_file.read_bytes() == previous_index + assert cached.session == previous_session + assert store.get_client(account_id) is cached + assert store.list_accounts()[0]["nickname"] == "Name user-1" + assert "old-token" in previous_file.decode("utf-8") + assert "new-token" not in session_file.read_text(encoding="utf-8") + + +def test_import_rollback_holds_session_lock_against_concurrent_writer( + tmp_path, monkeypatch +): + store = AccountStore(tmp_path / "accounts") + account_id = store.import_client(_client(tmp_path / "first.json", access="old")) + cached = store.get_client(account_id) + session_file = cached.session_file + original_restore = account_store_module._restore_file + writer_session, _ = cached._snapshot_session() + writer_session["auth"]["accessToken"] = "writer-access" + writer_session["auth"]["refreshToken"] = "writer-refresh" + rollback_paused = threading.Event() + finish_rollback = threading.Event() + writer_call_entered = threading.Event() + writer_finished = threading.Event() + import_errors = [] + writer_results = [] + + def pause_after_session_restore(path, contents): + original_restore(path, contents) + if path == session_file: + rollback_paused.set() + assert finish_rollback.wait(5) + + monkeypatch.setattr(account_store_module, "_restore_file", pause_after_session_restore) + original_save = cached._save_session + + def observe_writer_call(session, *, expected_generation=None): + if threading.current_thread().name == "session-writer": + writer_call_entered.set() + return original_save(session, expected_generation=expected_generation) + + monkeypatch.setattr(cached, "_save_session", observe_writer_call) + original_index_write = store._write_index_locked + + def fail_after_index_write(index): + original_index_write(index) + raise OSError("injected index write failure") + + monkeypatch.setattr(store, "_write_index_locked", fail_after_index_write) + + def import_replacement(): + try: + store.import_client(_client(tmp_path / "replacement.json", access="new")) + except Exception as exc: # captured for assertions in the test thread + import_errors.append(exc) + + def write_concurrently(): + try: + writer_results.append(cached._save_session(writer_session)) + finally: + writer_finished.set() + + importer = threading.Thread(target=import_replacement) + importer.start() + assert rollback_paused.wait(5) + + writer = threading.Thread(target=write_concurrently, name="session-writer") + writer.start() + assert writer_call_entered.wait(5) + assert not writer_finished.wait(0.2) + + finish_rollback.set() + importer.join(5) + writer.join(5) + + assert not importer.is_alive() + assert not writer.is_alive() + assert len(import_errors) == 1 + assert isinstance(import_errors[0], OSError) + assert writer_results == [True] + persisted = json.loads(session_file.read_text(encoding="utf-8")) + assert persisted == cached.session + assert persisted["auth"]["accessToken"] == "writer-access" + + +def test_deleting_inactive_account_prevents_inflight_refresh_from_recreating_file( + tmp_path, monkeypatch +): + store = AccountStore(tmp_path / "accounts") + removed_id = store.import_client(_client(tmp_path / "removed.json", access="removed")) + keeper_id = store.import_client( + _client(tmp_path / "keeper.json", uid="user-2", access="keeper") + ) + store.set_active(keeper_id) + cached = store.get_client(removed_id) + session_file = cached.session_file + request_started = threading.Event() + release_request = threading.Event() + results = [] + + def delayed_refresh(method, path, *, headers=None, body=None, timeout=30): + request_started.set() + assert release_request.wait(5) + return {"accessToken": "late-refresh", "refreshToken": "late-refresh-token"} + + monkeypatch.setattr(cached, "_request", delayed_refresh) + thread = threading.Thread(target=lambda: results.append(cached.refresh())) + thread.start() + assert request_started.wait(5) + store.delete_account(removed_id) + release_request.set() + thread.join(5) + + assert not thread.is_alive() + assert results == [True] + assert not session_file.exists() + assert all(item["id"] != removed_id for item in store.list_accounts()) diff --git a/test_admin_api.py b/test_admin_api.py new file mode 100644 index 0000000..3f5f79b --- /dev/null +++ b/test_admin_api.py @@ -0,0 +1,426 @@ +from fastapi import FastAPI +from fastapi.testclient import TestClient + +from codebuddy_proxy import admin_api +from codebuddy_proxy.admin_api import create_admin_router + + +class FakeManager: + def __init__(self): + self.login_calls = [] + self.activated = [] + self.deleted = [] + self.settings = { + "auto_switch_on_429": False, + "default_cooldown_seconds": 60, + "auto_checkin_enabled": False, + } + self.checkins = FakeCheckins() + + def has_account(self, account_id): + return account_id == "account-1" + + def snapshot(self): + return { + "accounts": [ + { + "id": "account-1", + "backend": "domestic", + "endpoint": "https://copilot.tencent.com", + "uid": "user-1", + "nickname": "Local user", + "active": True, + "rate_limited": True, + "cooldown_until": 1234.5, + "cooldown_remaining_seconds": 7, + "last_rate_limited_at": 1227.5, + "cooldown_source": "retry_after", + "checkin": { + "date": "2026-10-24", + "status": "checked", + "checked": True, + "last_checked_at": 1220, + "last_checkin_at": 1210, + "next_checkin_at": 1729766400, + "error": None, + "session": {"accessToken": "private-token-value"}, + }, + "session": {"auth": {"accessToken": "private-token-value"}}, + } + ], + "active_account_id": "account-1", + "settings": self.settings, + "server_time": 1227.5, + "raw_session": "private-token-value", + } + + def get_settings(self): + return dict(self.settings) + + def set_settings(self, auto_switch_on_429=None, *, auto_checkin_enabled=None): + if auto_switch_on_429 is not None: + self.settings["auto_switch_on_429"] = auto_switch_on_429 + if auto_checkin_enabled is not None: + self.settings["auto_checkin_enabled"] = auto_checkin_enabled + return dict(self.settings) + + def activate(self, account_id): + self.activated.append(account_id) + + def delete(self, account_id): + self.deleted.append(account_id) + + def start_login(self, backend): + self.login_calls.append(backend) + return { + "id": "job-1", + "backend": backend, + "status": "pending", + "auth_url": "https://login.example.test/auth", + "error": None, + "account_id": None, + "state": "private-state", + "session": {"auth": {"accessToken": "private-token-value"}}, + } + + def get_login(self, job_id): + return { + "id": job_id, + "backend": "global", + "status": "failed", + "auth_url": None, + "error": "登录失败,请重试", + "account_id": None, + "exception": "private-token-value", + } + + def cancel_login(self, job_id): + return {"id": job_id, "backend": "global", "status": "cancelled"} + + +class FakeCheckins: + def __init__(self): + self.calls = [] + self.status_result = { + "date": "2026-10-24", + "status": "unchecked", + "checked": False, + "last_checked_at": 1220.0, + "last_checkin_at": None, + "next_checkin_at": 1729766400.0, + "error": None, + "session": {"accessToken": "private-token-value"}, + } + self.checkin_result = { + "date": "2026-10-24", + "status": "checked", + "checked": True, + "last_checked_at": 1230.0, + "last_checkin_at": 1230.0, + "next_checkin_at": 1729766400.0, + "error": None, + "raw_response": "private-token-value", + } + + async def check_status(self, account_id, *, reason): + self.calls.append(("status", account_id, reason)) + return self.status_result + + async def check_in(self, account_id, *, reason): + self.calls.append(("checkin", account_id, reason)) + return self.checkin_result + + +def _app(manager): + app = FastAPI() + app.include_router(create_admin_router(lambda: manager)) + return app + + +def _client(manager): + return TestClient( + _app(manager), + base_url="http://localhost:8123", + client=("127.0.0.1", 50000), + ) + + +def test_account_and_job_responses_are_sanitized_and_uncached(): + manager = FakeManager() + with _client(manager) as client: + accounts = client.get("/admin/api/accounts") + assert accounts.status_code == 200 + assert accounts.headers["cache-control"] == "no-store" + assert accounts.json() == { + "accounts": [ + { + "id": "account-1", + "backend": "domestic", + "endpoint": "https://copilot.tencent.com", + "uid": "user-1", + "nickname": "Local user", + "active": True, + "rate_limited": True, + "cooldown_until": 1234.5, + "cooldown_remaining_seconds": 7, + "last_rate_limited_at": 1227.5, + "cooldown_source": "retry_after", + "checkin": { + "date": "2026-10-24", + "status": "checked", + "checked": True, + "last_checked_at": 1220.0, + "last_checkin_at": 1210.0, + "error": None, + "next_checkin_at": 1729766400.0, + }, + } + ], + "active_account_id": "account-1", + "settings": { + "auto_switch_on_429": False, + "auto_checkin_enabled": False, + "default_cooldown_seconds": 60, + }, + "server_time": 1227.5, + } + + job = client.get("/admin/api/logins/job-1") + assert job.status_code == 200 + assert job.headers["cache-control"] == "no-store" + assert "private-token-value" not in job.text + assert "exception" not in job.json() + + +def test_write_routes_require_header_and_same_origin_with_port_check(): + manager = FakeManager() + with _client(manager) as client: + denied = client.post("/admin/api/logins", json={"backend": "global"}) + assert denied.status_code == 403 + assert manager.login_calls == [] + + cross_port = client.post( + "/admin/api/logins", + json={"backend": "global"}, + headers={ + "X-Account-Manager": "1", + "Origin": "http://localhost:8124", + }, + ) + assert cross_port.status_code == 403 + assert manager.login_calls == [] + + accepted = client.post( + "/admin/api/logins", + json={"backend": "global"}, + headers={ + "X-Account-Manager": "1", + "Origin": "http://localhost:8123", + }, + ) + assert accepted.status_code == 202 + assert accepted.headers["cache-control"] == "no-store" + assert accepted.json() == { + "id": "job-1", + "backend": "global", + "status": "pending", + "auth_url": "https://login.example.test/auth", + "error": None, + "account_id": None, + } + assert manager.login_calls == ["global"] + + originless = client.post( + "/admin/api/accounts/account-1/activate", + headers={"X-Account-Manager": "1"}, + ) + assert originless.status_code == 200 + assert manager.activated == ["account-1"] + + +def test_settings_read_write_is_protected_strict_and_no_store(): + manager = FakeManager() + with _client(manager) as client: + read = client.get("/admin/api/settings") + assert read.status_code == 200 + assert read.headers["cache-control"] == "no-store" + assert read.json() == { + "auto_switch_on_429": False, + "auto_checkin_enabled": False, + "default_cooldown_seconds": 60, + } + + denied = client.patch( + "/admin/api/settings", + json={"auto_switch_on_429": True}, + ) + assert denied.status_code == 403 + assert manager.settings["auto_switch_on_429"] is False + + cross_port = client.patch( + "/admin/api/settings", + json={"auto_switch_on_429": True}, + headers={ + "X-Account-Manager": "1", + "Origin": "http://localhost:8124", + }, + ) + assert cross_port.status_code == 403 + assert manager.settings["auto_switch_on_429"] is False + + invalid_payloads = ( + {"auto_switch_on_429": 1}, + {"auto_switch_on_429": True, "unknown": "value"}, + {}, + {"auto_checkin_enabled": "true"}, + ) + for payload in invalid_payloads: + response = client.patch( + "/admin/api/settings", + json=payload, + headers={"X-Account-Manager": "1"}, + ) + assert response.status_code == 400 + duplicate_key = client.patch( + "/admin/api/settings", + content='{"auto_switch_on_429":false,"auto_switch_on_429":true}', + headers={"X-Account-Manager": "1", "Content-Type": "application/json"}, + ) + assert duplicate_key.status_code == 400 + assert manager.settings["auto_switch_on_429"] is False + + updated = client.patch( + "/admin/api/settings", + json={"auto_switch_on_429": True}, + headers={"X-Account-Manager": "1"}, + ) + assert updated.status_code == 200 + assert updated.headers["cache-control"] == "no-store" + assert updated.json() == { + "auto_switch_on_429": True, + "auto_checkin_enabled": False, + "default_cooldown_seconds": 60, + } + assert client.get("/admin/api/settings").json()["auto_switch_on_429"] is True + + checkin_enabled = client.patch( + "/admin/api/settings", + json={"auto_checkin_enabled": True}, + headers={"X-Account-Manager": "1"}, + ) + assert checkin_enabled.status_code == 200 + assert checkin_enabled.json() == { + "auto_switch_on_429": True, + "auto_checkin_enabled": True, + "default_cooldown_seconds": 60, + } + + +def test_checkin_routes_keep_shape_sanitize_errors_and_never_change_active(): + manager = FakeManager() + with _client(manager) as client: + status = client.get("/admin/api/accounts/account-1/checkin-status") + assert status.status_code == 200 + assert status.headers["cache-control"] == "no-store" + assert status.json() == { + "date": "2026-10-24", + "status": "unchecked", + "checked": False, + "last_checked_at": 1220.0, + "last_checkin_at": None, + "error": None, + "next_checkin_at": 1729766400.0, + } + assert manager.checkins.calls == [("status", "account-1", "manual_status")] + + denied = client.post("/admin/api/accounts/account-1/checkin") + assert denied.status_code == 403 + assert len(manager.checkins.calls) == 1 + + cross_port = client.post( + "/admin/api/accounts/account-1/checkin", + headers={ + "X-Account-Manager": "1", + "Origin": "http://localhost:8124", + }, + ) + assert cross_port.status_code == 403 + assert len(manager.checkins.calls) == 1 + + checked = client.post( + "/admin/api/accounts/account-1/checkin", + headers={"X-Account-Manager": "1", "Origin": "http://localhost:8123"}, + ) + assert checked.status_code == 200 + assert checked.json()["status"] == "checked" + assert checked.json()["checked"] is True + assert "private-token-value" not in checked.text + assert manager.checkins.calls[-1] == ("checkin", "account-1", "manual") + assert manager.snapshot()["active_account_id"] == "account-1" + + manager.checkins.status_result = { + "date": "2026-10-24", + "status": "error", + "error": "upstream token private-token-value", + "exception": "secret", + } + sanitized = client.get("/admin/api/accounts/account-1/checkin-status") + assert sanitized.status_code == 200 + assert sanitized.json()["error"] == "签到状态查询失败" + assert "private-token-value" not in sanitized.text + + unknown = client.get("/admin/api/accounts/missing/checkin-status") + assert unknown.status_code == 404 + assert client.post( + "/admin/api/accounts/missing/checkin", + headers={"X-Account-Manager": "1"}, + ).status_code == 404 + + +def test_cross_site_origin_host_and_non_loopback_peer_are_rejected(): + manager = FakeManager() + with _client(manager) as client: + cross_site = client.get( + "/admin/api/accounts", + headers={"Origin": "http://evil.example"}, + ) + assert cross_site.status_code == 403 + + bad_host = client.get("/admin/api/accounts", headers={"Host": "evil.example"}) + assert bad_host.status_code == 403 + + remote = TestClient( + _app(manager), + base_url="http://localhost:8123", + client=("192.0.2.4", 50000), + ) + with remote: + response = remote.get("/admin/api/accounts") + assert response.status_code == 403 + assert manager.login_calls == [] + + +def test_admin_page_is_loaded_as_a_no_store_package_resource(monkeypatch): + class Resource: + def joinpath(self, _name): + return self + + def read_text(self, *, encoding): + assert encoding == "utf-8" + return "Account manager" + + monkeypatch.setattr(admin_api.resources, "files", lambda _package: Resource()) + with _client(FakeManager()) as client: + for path in ("/admin", "/admin/"): + response = client.get(path) + assert response.status_code == 200 + assert response.headers["cache-control"] == "no-store" + assert "Account manager" in response.text + + +def test_unmatched_admin_path_is_no_store_and_has_generic_error(): + with _client(FakeManager()) as client: + response = client.get("/admin/api/not-real") + assert response.status_code == 404 + assert response.headers["cache-control"] == "no-store" + assert "private-token-value" not in response.text diff --git a/test_admin_ui.py b/test_admin_ui.py new file mode 100644 index 0000000..de1dc4d --- /dev/null +++ b/test_admin_ui.py @@ -0,0 +1,763 @@ +"""Small browser-free checks for the packaged admin page's inline UI logic.""" + +from __future__ import annotations + +import re +import shutil +import subprocess +from html.parser import HTMLParser +from pathlib import Path + +import pytest + + +ADMIN_HTML = Path(__file__).parent / "src" / "codebuddy_proxy" / "admin.html" + + +class _InlineScriptParser(HTMLParser): + def __init__(self) -> None: + super().__init__() + self._in_script = False + self.scripts: list[str] = [] + + def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None: + if tag == "script": + self._in_script = True + self.scripts.append("") + + def handle_endtag(self, tag: str) -> None: + if tag == "script": + self._in_script = False + + def handle_data(self, data: str) -> None: + if self._in_script: + self.scripts[-1] += data + + +def _inline_script() -> str: + parser = _InlineScriptParser() + parser.feed(ADMIN_HTML.read_text(encoding="utf-8")) + assert parser.scripts, "admin page must have its self-contained controller script" + return parser.scripts[-1] + + +_DOM_HARNESS = r""" +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const vm = require('node:vm'); + +class Element { + constructor(tag = 'div', id = '') { + this.tagName = tag.toUpperCase(); + this.id = id; + this.children = []; + this.dataset = {}; + this.attributes = {}; + this.listeners = {}; + this.className = ''; + this.textContent = ''; + this.hidden = false; + this.disabled = false; + this.href = ''; + this.style = {}; + this.classList = { add: (name) => { + const classes = new Set(this.className.split(/\s+/).filter(Boolean)); + classes.add(name); + this.className = [...classes].join(' '); + }}; + } + append(...nodes) { this.children.push(...nodes); } + prepend(node) { this.children.unshift(node); } + replaceChildren(...nodes) { this.children = [...nodes]; } + addEventListener(name, fn) { (this.listeners[name] ||= []).push(fn); } + async dispatch(name) { + for (const fn of this.listeners[name] || []) await fn({ target: this }); + } + querySelector(selector) { + return selector === 'span' ? this.children.find((child) => child.tagName === 'SPAN') || null : null; + } + setAttribute(name, value) { + this.attributes[name] = String(value); + if (name.startsWith('data-')) this.dataset[name.slice(5).replace(/-([a-z])/g, (_, c) => c.toUpperCase())] = String(value); + } + getAttribute(name) { return this.attributes[name] ?? null; } + removeAttribute(name) { delete this.attributes[name]; } +} + +function makeTimers() { + let nextId = 0; + const timeouts = new Map(); + const intervals = new Map(); + return { + timeouts, + intervals, + setTimeout(fn, delay) { const id = ++nextId; timeouts.set(id, { fn, delay }); return id; }, + clearTimeout(id) { timeouts.delete(id); }, + setInterval(fn, delay) { const id = ++nextId; intervals.set(id, { fn, delay }); return id; }, + clearInterval(id) { intervals.delete(id); }, + }; +} + +function makePageElements() { + const ids = [ + 'notice', 'account-list', 'refresh-button', 'associate-button', 'login-progress', + 'progress-title', 'progress-copy', 'progress-spinner', 'cancel-button', + 'retry-button', 'manual-auth-link', 'auto-switch-toggle', 'settings-status', + 'auto-checkin-toggle', 'checkin-settings-status', 'sync-status' + ]; + const elements = Object.fromEntries(ids.map((id) => [id, new Element(id === 'associate-button' ? 'button' : 'div', id)])); + const label = new Element('span'); + label.textContent = '关联所选区域'; + elements['associate-button'].append(label); + return elements; +} + +function makeDocument(elements) { + const regions = ['domestic', 'global'].map((backend) => { + const button = new Element('button'); + button.dataset.backend = backend; + return button; + }); + const listeners = {}; + return { + regions, + visibilityState: 'visible', + getElementById: (id) => elements[id] || null, + querySelectorAll: (selector) => selector === '[data-backend]' ? regions : [], + createElement: (tag) => new Element(tag), + addEventListener(name, fn) { (listeners[name] ||= []).push(fn); }, + async dispatch(name) { for (const fn of listeners[name] || []) await fn(); }, + }; +} + +function makeWindow(timers, now = () => Date.now()) { + const popup = { + closed: false, + opener: null, + location: { href: '' }, + document: { title: '', body: { textContent: '', style: { cssText: '' } } }, + close() { this.closed = true; }, + }; + return { + popup, + window: { + location: { href: 'http://127.0.0.1:8765/admin' }, + confirm: () => true, + open: () => popup, + setTimeout: timers.setTimeout, + clearTimeout: timers.clearTimeout, + setInterval: timers.setInterval, + clearInterval: timers.clearInterval, + }, + }; +} + +function walk(node) { + return [node, ...(node.children || []).flatMap(walk)]; +} + +const accountFixture = (overrides = {}) => ({ + id: 'existing', backend: 'domestic', endpoint: 'https://example.test', uid: 'u1', nickname: '旧账号', + rate_limited: false, cooldown_until: null, cooldown_remaining_seconds: 0, + last_rate_limited_at: null, cooldown_source: null, + checkin: { date: null, status: 'unchecked', checked: false, last_checked_at: null, last_checkin_at: null, next_checkin_at: null, error: null }, + ...overrides, +}); +const settingsFixture = (autoSwitch = false, autoCheckin = false) => ({ + auto_switch_on_429: autoSwitch, auto_checkin_enabled: autoCheckin, default_cooldown_seconds: 60 +}); +const snapshotFixture = (accounts = [accountFixture()], autoSwitch = false, serverTime = Math.floor(Date.now() / 1000), autoCheckin = false) => { + const date = new Date(serverTime * 1000 + 8 * 60 * 60 * 1000).toISOString().slice(0, 10); + return { + accounts: accounts.map((account) => ({ ...account, checkin: { ...account.checkin, date: account.checkin.date || date } })), + active_account_id: 'existing', settings: settingsFixture(autoSwitch, autoCheckin), server_time: serverTime, + }; +}; + +function startPage(document, window, fetch, clock = Date) { + const script = fs.readFileSync(process.argv[2], 'utf8'); + const DateType = typeof clock === 'function' ? clock : class TestDate extends Date { static now() { return clock.now(); } }; + vm.runInNewContext(script, { document, window, fetch, Headers, URL, AbortController, Promise, Date: DateType, Error }); +} + +async function flush() { await new Promise((resolve) => setImmediate(resolve)); } + +async function verifyTerminalState(status) { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window, popup } = makeWindow(timers); + const writes = []; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (method !== 'GET') writes.push({ url, headers: options.headers }); + let payload; + if (url.endsWith('/accounts')) { + payload = snapshotFixture(); + } else if (url.endsWith('/settings') && method === 'GET') { + payload = settingsFixture(); + } else if (url.endsWith('/logins') && method === 'POST') { + payload = { id: 'job-1', status, account_id: status === 'succeeded' ? 'new' : null, error: status === 'failed' ? '模拟登录失败' : null }; + } else { + throw new Error(`Unexpected API request: ${method} ${url}`); + } + return { ok: true, status: 200, headers: { get: () => 'application/json' }, json: async () => payload }; + } + startPage(document, window, fetch); + await flush(); + await elements['associate-button'].dispatch('click'); + assert.equal(elements['cancel-button'].hidden, true, `${status}: cancel must be hidden after terminal result`); + assert.equal(elements['cancel-button'].disabled, true, `${status}: cancel must be disabled after terminal result`); + assert.equal(elements['retry-button'].hidden, status === 'succeeded', `${status}: retry visibility must match terminal result`); + assert.equal(writes.length, 1); + assert.equal(writes[0].headers.get('X-Account-Manager'), '1'); + assert.equal(popup.opener, null, 'auth popup must not retain access to the admin window'); +} + +async function verifyCancelFailureRecovery() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window, popup } = makeWindow(timers); + const writes = []; + let deleteCount = 0; + let loginReads = 0; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (method !== 'GET') writes.push({ url, headers: options.headers }); + let response = { ok: true, status: 200, payload: null }; + if (url.endsWith('/accounts')) { + response.payload = snapshotFixture(); + } else if (url.endsWith('/settings') && method === 'GET') { + response.payload = settingsFixture(); + } else if (url.endsWith('/logins') && method === 'POST') { + response.payload = { id: 'job-cancel', status: 'pending' }; + } else if (url.endsWith('/logins/job-cancel') && method === 'GET') { + loginReads += 1; + response.payload = { id: 'job-cancel', status: 'pending' }; + } else if (url.endsWith('/logins/job-cancel') && method === 'DELETE') { + deleteCount += 1; + if (deleteCount === 1) response = { ok: false, status: 503, payload: { detail: '模拟取消失败' } }; + else response.payload = { id: 'job-cancel', status: 'cancelled' }; + } else { + throw new Error(`Unexpected API request: ${method} ${url}`); + } + return { ok: response.ok, status: response.status, headers: { get: () => 'application/json' }, json: async () => response.payload }; + } + startPage(document, window, fetch); + await flush(); + await elements['associate-button'].dispatch('click'); + assert.equal(elements['cancel-button'].hidden, false, 'pending login must expose cancel'); + await elements['cancel-button'].dispatch('click'); + assert.equal(deleteCount, 1); + assert.equal(elements['cancel-button'].hidden, false, 'failed cancellation must leave cancel available'); + assert.equal(elements['cancel-button'].disabled, false, 'failed cancellation must re-enable cancel'); + assert.match(elements.notice.textContent, /模拟取消失败/); + assert.ok(loginReads >= 1, 'pending job remains tracked after cancel failure'); + await elements['cancel-button'].dispatch('click'); + assert.equal(deleteCount, 2, 'user can retry cancellation'); + assert.equal(elements['cancel-button'].hidden, true, 'confirmed cancellation hides cancel'); + assert.equal(elements['retry-button'].hidden, false, 'confirmed cancellation exposes retry'); + assert.ok(writes.every((write) => write.headers.get('X-Account-Manager') === '1')); +} + +async function verifyAutoSwitchSettings() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + let remoteSetting = true; + let patchCount = 0; + let settingsReads = 0; + const writes = []; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (method !== 'GET') writes.push({ url, headers: options.headers, body: options.body }); + if (url.endsWith('/accounts')) return jsonResponse(snapshotFixture([accountFixture()], remoteSetting)); + if (url.endsWith('/settings') && method === 'GET') { + settingsReads += 1; + return jsonResponse(settingsFixture(remoteSetting)); + } + if (url.endsWith('/settings') && method === 'PATCH') { + patchCount += 1; + const desired = JSON.parse(options.body).auto_switch_on_429; + if (patchCount === 3) return jsonResponse({ detail: '模拟保存失败' }, false, 503); + remoteSetting = desired; + return jsonResponse(settingsFixture(remoteSetting)); + } + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch); + await flush(); + assert.equal(elements['auto-switch-toggle'].checked, true, 'initial setting must be restored from the server'); + + elements['auto-switch-toggle'].checked = false; + await elements['auto-switch-toggle'].dispatch('change'); + assert.equal(remoteSetting, false, 'turning the switch off must persist'); + assert.equal(elements['auto-switch-toggle'].checked, false); + + elements['auto-switch-toggle'].checked = true; + await elements['auto-switch-toggle'].dispatch('change'); + assert.equal(remoteSetting, true, 'turning the switch on must persist'); + assert.equal(elements['auto-switch-toggle'].checked, true); + + elements['auto-switch-toggle'].checked = false; + await elements['auto-switch-toggle'].dispatch('change'); + assert.equal(elements['auto-switch-toggle'].checked, true, 'failed save must restore the last server value'); + assert.equal(elements['auto-switch-toggle'].disabled, false, 'failed save must re-enable the setting'); + assert.match(elements.notice.textContent, /保存结果未确认/); + assert.match(elements.notice.textContent, /模拟保存失败/); + assert.ok(settingsReads >= 2, 'an unclear save response must trigger a settings resync'); + assert.ok(writes.every((write) => write.headers.get('X-Account-Manager') === '1')); + assert.deepEqual(writes.map((write) => JSON.parse(write.body).auto_switch_on_429), [false, true, false]); +} + +function jsonResponse(payload, ok = true, status = 200) { + return { ok, status, headers: { get: () => 'application/json' }, json: async () => payload }; +} + +async function verifyCooldownPollingAndLocalExpiry() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + let nowMs = 1900000000000; + let accountReads = 0; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (url.endsWith('/accounts')) { + accountReads += 1; + if (accountReads === 1) return jsonResponse(snapshotFixture([accountFixture()], false, 1700000000)); + const retryAccount = accountFixture({ + id: 'retry', nickname: '第二账号', uid: 'u2', rate_limited: true, + cooldown_until: 1700000008, cooldown_remaining_seconds: 8, + last_rate_limited_at: 1699999990, cooldown_source: 'retry_after' + }); + const defaultAccount = accountFixture({ + rate_limited: true, cooldown_until: 1700000003, cooldown_remaining_seconds: 3, + last_rate_limited_at: 1699999997, cooldown_source: 'default' + }); + return jsonResponse(snapshotFixture([defaultAccount, retryAccount], true, 1700000000)); + } + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false)); + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch, { now: () => nowMs }); + await flush(); + assert.equal(elements['auto-switch-toggle'].checked, false); + + document.visibilityState = 'hidden'; + await document.dispatch('visibilitychange'); + assert.equal(accountReads, 1, 'hiding the page must not trigger an immediate poll'); + assert.ok([...timers.timeouts.values()].some((timer) => timer.delay === 60000), 'hidden page must use a slower refresh interval'); + + document.visibilityState = 'visible'; + await document.dispatch('visibilitychange'); + await flush(); + await flush(); + assert.equal(accountReads, 2, 'returning to the page must refresh immediately'); + assert.equal(elements['auto-switch-toggle'].checked, true, 'poll must pick up settings changed in another page'); + const badges = walk(elements['account-list']).filter((node) => node.className === 'pill cooldown-pill'); + assert.equal(badges.length, 2); + assert.equal(badges[0].hidden, false); + assert.match(badges[0].textContent, /00:03.*默认估算/); + assert.match(badges[1].textContent, /00:08.*上游指定/); + + const requestsBeforeTick = accountReads; + nowMs += 1000; + for (const timer of timers.intervals.values()) timer.fn(); + assert.match(badges[0].textContent, /00:02/); + nowMs += 3000; + for (const timer of timers.intervals.values()) timer.fn(); + assert.equal(badges[0].hidden, true, 'expired cooldown badge must disappear without another fetch'); + assert.equal(accountReads, requestsBeforeTick, 'countdown ticks must not send network requests'); +} + +async function verifyOlderSnapshotCannotResetNewSetting() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + let accountReads = 0; + let releaseStaleSnapshot; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (url.endsWith('/accounts')) { + accountReads += 1; + if (accountReads === 1) return jsonResponse(snapshotFixture([accountFixture()], false)); + if (accountReads === 2) return new Promise((resolve) => { releaseStaleSnapshot = () => resolve(jsonResponse(snapshotFixture([accountFixture()], false))); }); + return jsonResponse(snapshotFixture([accountFixture()], false)); + } + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false)); + if (url.endsWith('/settings') && method === 'PATCH') return jsonResponse(settingsFixture(true)); + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch); + await flush(); + const olderRefresh = elements['refresh-button'].dispatch('click'); + await flush(); + assert.equal(typeof releaseStaleSnapshot, 'function'); + elements['auto-switch-toggle'].checked = true; + await elements['auto-switch-toggle'].dispatch('change'); + releaseStaleSnapshot(); + await olderRefresh; + assert.equal(elements['auto-switch-toggle'].checked, true, 'an older in-flight account snapshot must not undo a newer saved setting'); +} + +async function verifyForegroundRefreshOwnsBusyState() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + let accountReads = 0; + let releaseForegroundSnapshot; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (url.endsWith('/accounts')) { + accountReads += 1; + if (accountReads === 1) return jsonResponse(snapshotFixture()); + if (accountReads === 2) { + return new Promise((resolve) => { + releaseForegroundSnapshot = () => resolve(jsonResponse(snapshotFixture())); + }); + } + return jsonResponse(snapshotFixture([accountFixture({ nickname: '后台同步账号' })])); + } + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false)); + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch); + await flush(); + + const foregroundRefresh = elements['refresh-button'].dispatch('click'); + await flush(); + assert.equal(typeof releaseForegroundSnapshot, 'function'); + assert.equal(elements['refresh-button'].disabled, true, 'manual refresh must mark the button busy'); + + document.visibilityState = 'visible'; + await document.dispatch('visibilitychange'); + await flush(); + await flush(); + assert.equal(accountReads, 3, 'visibility sync must run while a manual refresh is pending'); + assert.equal(elements['refresh-button'].disabled, true, 'background sync must not clear foreground busy state'); + + releaseForegroundSnapshot(); + await foregroundRefresh; + assert.equal(elements['refresh-button'].disabled, false, 'foreground completion must clear busy state after a newer background read'); +} + +function findAccountCard(elements, id) { + return walk(elements['account-list']).find((node) => node.tagName === 'ARTICLE' && node.dataset.accountId === id); +} + +function checkinButtons(card) { + const buttons = walk(card).filter((node) => node.tagName === 'BUTTON'); + return { + query: buttons.find((node) => node.textContent === '查询签到'), + sign: buttons.find((node) => node.textContent === '签到'), + }; +} + +async function flushMany(count = 8) { for (let i = 0; i < count; i += 1) await flush(); } + +async function verifyIndependentSettingsWrites() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + const remote = { autoSwitch: true, autoCheckin: false }; + const writes = []; + let releaseStaleSwitch; + let checkinPatchCount = 0; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (url.endsWith('/accounts')) return jsonResponse(snapshotFixture([accountFixture()], remote.autoSwitch, undefined, remote.autoCheckin)); + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(remote.autoSwitch, remote.autoCheckin)); + if (url.endsWith('/settings') && method === 'PATCH') { + const body = JSON.parse(options.body); + writes.push({ body, headers: options.headers }); + if (Object.hasOwn(body, 'auto_switch_on_429')) { + remote.autoSwitch = body.auto_switch_on_429; + const delayedResponse = settingsFixture(remote.autoSwitch, remote.autoCheckin); + return new Promise((resolve) => { releaseStaleSwitch = () => resolve(jsonResponse(delayedResponse)); }); + } + if (Object.hasOwn(body, 'auto_checkin_enabled')) { + checkinPatchCount += 1; + if (checkinPatchCount === 1) remote.autoCheckin = body.auto_checkin_enabled; + if (checkinPatchCount === 2) return jsonResponse({ detail: '模拟自动签到保存失败' }, false, 503); + return jsonResponse(settingsFixture(remote.autoSwitch, remote.autoCheckin)); + } + } + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch); + await flushMany(); + assert.equal(elements['auto-switch-toggle'].checked, true); + assert.equal(elements['auto-checkin-toggle'].checked, false); + + elements['auto-switch-toggle'].checked = false; + const switchSave = elements['auto-switch-toggle'].dispatch('change'); + await flush(); + assert.equal(elements['auto-switch-toggle'].disabled, true); + assert.equal(elements['auto-checkin-toggle'].disabled, false, 'one setting must not lock the other control'); + + elements['auto-checkin-toggle'].checked = true; + await elements['auto-checkin-toggle'].dispatch('change'); + assert.equal(remote.autoCheckin, true); + assert.equal(typeof releaseStaleSwitch, 'function'); + releaseStaleSwitch(); + await switchSave; + assert.equal(elements['auto-switch-toggle'].checked, false); + assert.equal(elements['auto-checkin-toggle'].checked, true, 'a stale switch response must not overwrite the independent check-in setting'); + + elements['auto-checkin-toggle'].checked = false; + await elements['auto-checkin-toggle'].dispatch('change'); + assert.equal(elements['auto-checkin-toggle'].checked, true, 'failed setting save must restore the value confirmed by GET'); + assert.equal(elements['auto-switch-toggle'].checked, false, 'check-in save failure must preserve the 429 setting'); + assert.match(elements.notice.textContent, /模拟自动签到保存失败/); + assert.ok(writes.every((write) => write.headers.get('X-Account-Manager') === '1')); + assert.deepEqual(writes.map((write) => Object.keys(write.body)), [['auto_switch_on_429'], ['auto_checkin_enabled'], ['auto_checkin_enabled']]); +} + +async function verifyCheckinDiscoveryAndActions() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + const serverTime = Math.floor(Date.now() / 1000); + const today = new Date(serverTime * 1000 + 8 * 60 * 60 * 1000).toISOString().slice(0, 10); + const accounts = [ + accountFixture({ id: 'existing', nickname: '当前账号', checkin: { date: null, status: 'unknown', checked: null } }), + accountFixture({ id: 'second', nickname: '第二账号', checkin: { date: null, status: 'unknown', checked: null } }), + accountFixture({ id: 'third', nickname: '第三账号', checkin: { date: null, status: 'unknown', checked: null } }), + ]; + const serverCheckins = { + existing: { date: today, status: 'unchecked', checked: false }, + second: { date: today, status: 'checked', checked: true, last_checkin_at: serverTime, next_checkin_at: serverTime + 86400 }, + third: { date: today, status: 'error', checked: null, error: '' }, + }; + const statusReads = []; + const writes = []; + let concurrentReads = 0; + let maxConcurrentReads = 0; + let activations = 0; + let snapshotHasFreshCheckins = false; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (method !== 'GET') writes.push({ url, method, headers: options.headers }); + if (url.endsWith('/accounts') && method === 'GET') { + const rows = snapshotHasFreshCheckins ? accounts.map((account) => ({ ...account, checkin: serverCheckins[account.id] })) : accounts; + snapshotHasFreshCheckins = true; + return jsonResponse(snapshotFixture(rows, false, serverTime)); + } + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false)); + const match = url.match(/\/accounts\/([^/]+)\/checkin-status$/); + if (match && method === 'GET') { + const id = decodeURIComponent(match[1]); + statusReads.push(id); + concurrentReads += 1; + maxConcurrentReads = Math.max(maxConcurrentReads, concurrentReads); + await new Promise((resolve) => setImmediate(resolve)); + concurrentReads -= 1; + return jsonResponse(serverCheckins[id]); + } + const signMatch = url.match(/\/accounts\/([^/]+)\/checkin$/); + if (signMatch && method === 'POST') { + const id = decodeURIComponent(signMatch[1]); + serverCheckins[id] = { date: today, status: 'checked', checked: true, last_checkin_at: serverTime }; + return jsonResponse(serverCheckins[id]); + } + if (url.endsWith('/activate')) activations += 1; + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch); + await flushMany(12); + assert.deepEqual([...statusReads].sort(), ['existing', 'second', 'third']); + assert.ok(maxConcurrentReads <= 2, 'initial account checks must use at most two concurrent requests'); + assert.equal(writes.filter((write) => write.method === 'POST' && write.url.endsWith('/checkin')).length, 0, + 'initial discovery and snapshot synchronization must never auto-sign'); + + const activeCard = findAccountCard(elements, 'existing'); + const secondCard = findAccountCard(elements, 'second'); + const thirdCard = findAccountCard(elements, 'third'); + assert.ok(activeCard && secondCard && thirdCard); + assert.ok(checkinButtons(activeCard).query && checkinButtons(activeCard).sign, 'the active account also has check-in controls'); + assert.equal(checkinButtons(activeCard).sign.disabled, false, 'a confirmed unchecked account can be signed'); + assert.equal(checkinButtons(secondCard).sign.disabled, true, 'a checked account cannot be signed again'); + assert.match(walk(secondCard).map((node) => node.textContent).join(' '), /下次计划/); + assert.ok(walk(thirdCard).some((node) => node.textContent === ''), 'upstream error text must be rendered as text'); + assert.equal(checkinButtons(thirdCard).sign.disabled, false, 'an error state remains actionable so the server can check first'); + + await checkinButtons(activeCard).sign.dispatch('click'); + assert.equal(serverCheckins.existing.status, 'checked'); + assert.equal(checkinButtons(findAccountCard(elements, 'existing')).sign.disabled, true); + await checkinButtons(findAccountCard(elements, 'existing')).query.dispatch('click'); + assert.equal(statusReads.filter((id) => id === 'existing').length, 2, 'manual query calls the live status endpoint'); + document.visibilityState = 'visible'; + await document.dispatch('visibilitychange'); + await flushMany(); + assert.match(walk(findAccountCard(elements, 'existing')).map((node) => node.textContent).join(' '), /今日签到:已签到/, + 'a later account snapshot must reflect server-side status changes'); + assert.equal(activations, 0, 'check-in actions never switch the current account'); + assert.ok(writes.some((write) => write.method === 'POST' && write.url.endsWith('/checkin'))); + assert.ok(writes.every((write) => write.headers.get('X-Account-Manager') === '1')); + + const readsBeforePoll = statusReads.length; + await document.dispatch('visibilitychange'); + await flushMany(); + assert.equal(statusReads.length, readsBeforePoll, '15-second account snapshots must not re-query known check-in states'); +} + +async function verifyCheckinRechecksAfterBeijingMidnight() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + let nowMs = Date.UTC(2026, 9, 23, 15, 59, 50); + let accountReads = 0; + let statusReads = 0; + let serverCheckin = { date: '2026-10-23', status: 'unknown', checked: null }; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (url.endsWith('/accounts') && method === 'GET') { + accountReads += 1; + return jsonResponse(snapshotFixture([accountFixture({ checkin: serverCheckin })], false, Math.floor(nowMs / 1000))); + } + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false)); + if (url.endsWith('/accounts/existing/checkin-status') && method === 'GET') { + statusReads += 1; + const date = statusReads === 1 ? '2026-10-23' : '2026-10-24'; + serverCheckin = { date, status: 'unchecked', checked: false }; + return jsonResponse(serverCheckin); + } + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch, { now: () => nowMs }); + await flushMany(); + assert.equal(statusReads, 1); + nowMs += 20000; + document.visibilityState = 'visible'; + await document.dispatch('visibilitychange'); + await flushMany(); + assert.ok(accountReads >= 2); + assert.equal(statusReads, 2, 'Beijing date change must trigger one fresh underlying status check'); + await document.dispatch('visibilitychange'); + await flushMany(); + assert.equal(statusReads, 2, 'same-day account polling must not repeat underlying status checks'); + assert.match(walk(elements['account-list']).map((node) => node.textContent).join(' '), /未签到/); +} + +async function verifyAutoCheckinIsBackendOwned() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + let nowMs = Date.UTC(2026, 9, 23, 15, 59, 50); + let setting = false; + const statusReads = []; + const signWrites = []; + const serverCheckins = { + existing: { date: null, status: 'unknown', checked: null }, + second: { date: null, status: 'unknown', checked: null }, + }; + const accounts = [ + accountFixture({ id: 'existing', checkin: serverCheckins.existing }), + accountFixture({ id: 'second', nickname: '第二账号', checkin: serverCheckins.second }), + ]; + const currentBeijingDate = () => new Date(nowMs + 8 * 60 * 60 * 1000).toISOString().slice(0, 10); + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + if (url.endsWith('/accounts') && method === 'GET') { + return jsonResponse(snapshotFixture(accounts.map((account) => ({ ...account, checkin: serverCheckins[account.id] })), false, Math.floor(nowMs / 1000), setting)); + } + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false, setting)); + if (url.endsWith('/settings') && method === 'PATCH') { + const body = JSON.parse(options.body); + assert.deepEqual(Object.keys(body), ['auto_checkin_enabled']); + setting = body.auto_checkin_enabled; + return jsonResponse(settingsFixture(false, setting)); + } + const statusMatch = url.match(/\/accounts\/([^/]+)\/checkin-status$/); + if (statusMatch && method === 'GET') { + const id = decodeURIComponent(statusMatch[1]); + statusReads.push(id); + const result = id === 'existing' + ? { date: currentBeijingDate(), status: 'unchecked', checked: false } + : { date: currentBeijingDate(), status: 'checked', checked: true }; + serverCheckins[id] = result; + return jsonResponse(result); + } + const signMatch = url.match(/\/accounts\/([^/]+)\/checkin$/); + if (signMatch && method === 'POST') { + const id = decodeURIComponent(signMatch[1]); + signWrites.push(id); + serverCheckins[id] = { date: currentBeijingDate(), status: 'checked', checked: true }; + return jsonResponse(serverCheckins[id]); + } + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch, { now: () => nowMs }); + await flushMany(); + assert.equal(elements['auto-checkin-toggle'].checked, false, 'global auto check-in defaults to off'); + assert.deepEqual([...statusReads].sort(), ['existing', 'second'], 'initial unknown states are queried once per account'); + assert.deepEqual(signWrites, [], 'initial status discovery only reads; it does not sign'); + + elements['auto-checkin-toggle'].checked = true; + await elements['auto-checkin-toggle'].dispatch('change'); + assert.equal(setting, true); + assert.match(elements.notice.textContent, /代理正在检查全部关联账号/); + assert.deepEqual(signWrites, [], 'enabling the setting only saves it; the proxy owns automatic check-ins'); + assert.equal(elements['auto-checkin-toggle'].checked, true); + + // Simulate an automatic check-in performed by the backend, then let the page synchronize its snapshot. + serverCheckins.existing = { date: currentBeijingDate(), status: 'checked', checked: true }; + document.visibilityState = 'visible'; + await document.dispatch('visibilitychange'); + await flushMany(); + assert.match(walk(findAccountCard(elements, 'existing')).map((node) => node.textContent).join(' '), /今日签到:已签到/); + assert.deepEqual(signWrites, [], 'background snapshot synchronization never sends a check-in write'); + + // A Beijing date change performs one status GET per newly unknown account, but no automatic POST. + nowMs += 20000; + serverCheckins.existing = { date: currentBeijingDate() === '2026-10-24' ? '2026-10-23' : currentBeijingDate(), status: 'checked', checked: true }; + document.visibilityState = 'visible'; + await document.dispatch('visibilitychange'); + await flushMany(); + assert.equal(statusReads.filter((id) => id === 'existing').length, 2, 'a new Beijing day performs one status check'); + assert.deepEqual(signWrites, [], 'cross-day rediscovery only reads; automatic writes remain backend-owned'); + + // Manual per-account action still uses the write endpoint. + serverCheckins.existing = { date: currentBeijingDate(), status: 'unchecked', checked: false }; + await checkinButtons(findAccountCard(elements, 'existing')).sign.dispatch('click'); + assert.deepEqual(signWrites, ['existing']); +} + +(async () => { + for (const status of ['succeeded', 'cancelled', 'failed']) await verifyTerminalState(status); + await verifyCancelFailureRecovery(); + await verifyAutoSwitchSettings(); + await verifyCooldownPollingAndLocalExpiry(); + await verifyOlderSnapshotCannotResetNewSetting(); + await verifyForegroundRefreshOwnsBusyState(); + await verifyIndependentSettingsWrites(); + await verifyCheckinDiscoveryAndActions(); + await verifyCheckinRechecksAfterBeijingMidnight(); + await verifyAutoCheckinIsBackendOwned(); +})().catch((error) => { console.error(error); process.exitCode = 1; }); +""" + + +def test_admin_inline_script_syntax_and_terminal_controls(tmp_path: Path) -> None: + node = shutil.which("node") + if node is None: + pytest.skip("Node.js is needed to execute the admin page's browser-free mock") + + html = ADMIN_HTML.read_text(encoding="utf-8") + assert re.search(r"(?m)^\s*\[hidden\]\s*\{\s*display:\s*none\s*!important;\s*\}", html) + script_path = tmp_path / "admin-page.js" + script_path.write_text(_inline_script(), encoding="utf-8") + + subprocess.run([node, "--check", str(script_path)], check=True, capture_output=True, text=True) + harness_path = tmp_path / "admin-page-mock.cjs" + harness_path.write_text(_DOM_HARNESS, encoding="utf-8") + subprocess.run([node, str(harness_path), str(script_path)], check=True, capture_output=True, text=True) diff --git a/test_backend_profiles.py b/test_backend_profiles.py index 1ae67db..98bd539 100644 --- a/test_backend_profiles.py +++ b/test_backend_profiles.py @@ -1,5 +1,6 @@ import json import importlib.resources +import os import stat from pathlib import Path @@ -108,7 +109,14 @@ def test_session_profiles_are_isolated_and_saved_with_metadata(tmp_path): assert saved["backend"] == "global" assert saved["endpoint"] == "https://www.codebuddy.ai" assert saved["machineId"] == "machine-1" - assert stat.S_IMODE(saved_file.stat().st_mode) == 0o600 + if os.name == "posix": + assert stat.S_IMODE(saved_file.stat().st_mode) == 0o600 + else: + # Windows does not expose POSIX mode bits as an ACL check. Verify the + # replacement is readable and the atomic writer left no temporary file. + assert os.access(saved_file, os.R_OK) + assert json.loads(saved_file.read_text(encoding="utf-8")) == saved + assert not list(saved_file.parent.glob(f".{saved_file.name}.*.tmp")) mismatch_file = tmp_path / "mismatch.json" mismatch_file.write_text( diff --git a/test_client_login_management.py b/test_client_login_management.py new file mode 100644 index 0000000..da071ff --- /dev/null +++ b/test_client_login_management.py @@ -0,0 +1,176 @@ +import threading + +import pytest + +import codebuddy_proxy.codebuddy_client_demo as client_module +from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient, CodeBuddyError + + +class _Clock: + def __init__(self): + self.now = 0.0 + + def monotonic(self): + return self.now + + def sleep(self, seconds): + self.now += seconds + + +def test_begin_and_complete_login_are_separate_and_require_uid(tmp_path, monkeypatch): + client = CodeBuddyClient(session_file=tmp_path / "login.json") + requests = [] + + def request(method, path, *, headers=None, body=None, timeout=30): + requests.append((method, path, headers or {}, timeout)) + if "/auth/state" in path: + return {"authUrl": "https://login.example.test/start", "state": "state /?"} + if "/auth/token" in path: + return {"accessToken": "access-token", "refreshToken": "refresh-token"} + if "/login/account" in path: + return {"uid": "u-1", "nickname": "Test User"} + raise AssertionError(path) + + monkeypatch.setattr(client, "_request", request) + challenge = client.begin_login() + assert challenge == { + "auth_url": "https://login.example.test/start", + "state": "state /?", + } + assert not client.session_file.exists() + + client.complete_login(challenge, timeout=2) + assert client.session["account"]["uid"] == "u-1" + assert client.session["auth"]["accessToken"] == "access-token" + assert any("state=state%20%2F%3F" in path for _, path, _, _ in requests) + account_request = next(item for item in requests if "/login/account" in item[1]) + assert account_request[2]["Authorization"] == "Bearer access-token" + assert "X-Domain" in account_request[2] + assert all(item[3] <= 2 for item in requests if "/auth/state" not in item[1]) + + +def test_complete_login_total_timeout_covers_account_polling(tmp_path, monkeypatch): + client = CodeBuddyClient(session_file=tmp_path / "never-saved.json") + clock = _Clock() + monkeypatch.setattr(client_module, "time", clock) + account_calls = 0 + request_timeouts = [] + + def request(method, path, *, headers=None, body=None, timeout=30): + nonlocal account_calls + request_timeouts.append(timeout) + if "/auth/token" in path: + return {"accessToken": "access-token"} + if "/login/account" in path: + account_calls += 1 + return {"nickname": "not ready"} + raise AssertionError(path) + + monkeypatch.setattr(client, "_request", request) + with pytest.raises(CodeBuddyError, match="登录超时.*uid"): + client.complete_login({"auth_url": "https://login.test", "state": "s"}, timeout=2) + + assert account_calls == 2 + assert request_timeouts == [2, 2, 1] + assert clock.now == 2 + assert not client.session_file.exists() + + +def test_complete_login_cancellation_during_account_poll_does_not_save(tmp_path, monkeypatch): + client = CodeBuddyClient(session_file=tmp_path / "cancelled.json") + cancel = threading.Event() + + def request(method, path, *, headers=None, body=None, timeout=30): + if "/auth/token" in path: + return {"accessToken": "access-token"} + if "/login/account" in path: + cancel.set() + return {"nickname": "not ready"} + raise AssertionError(path) + + monkeypatch.setattr(client, "_request", request) + with pytest.raises(CodeBuddyError, match="登录已取消"): + client.complete_login({"state": "s"}, timeout=30, cancel_event=cancel) + assert not client.session_file.exists() + + +def test_ensure_authenticated_can_forbid_interactive_login(tmp_path, monkeypatch): + client = CodeBuddyClient(session_file=tmp_path / "empty.json") + monkeypatch.setattr(client, "refresh", lambda: False) + login_calls = [] + monkeypatch.setattr(client, "login", lambda **kwargs: login_calls.append(kwargs)) + + with pytest.raises(CodeBuddyError, match="禁止自动打开登录流程"): + client.ensure_authenticated(open_browser=False, allow_login=False) + assert login_calls == [] + assert not client.session_file.exists() + + +def test_concurrent_ensure_authentication_refreshes_once(tmp_path, monkeypatch): + client = CodeBuddyClient(session_file=tmp_path / "refresh-once.json") + client._save_session( + { + "auth": { + "accessToken": "expired-access", + "refreshToken": "shared-refresh-token", + "expiresAt": 1, + }, + "account": {"uid": "u-1"}, + "machineId": "machine-1", + } + ) + request_started = threading.Event() + release_request = threading.Event() + calls = [] + errors = [] + barrier = threading.Barrier(3) + + def refresh_request(method, path, *, headers=None, body=None, timeout=30): + calls.append((method, path, headers)) + request_started.set() + assert release_request.wait(5) + return { + "accessToken": "fresh-access", + "refreshToken": "rotated-refresh-token", + "expiresAt": int(client_module.time.time() * 1000) + 3_600_000, + } + + monkeypatch.setattr(client, "_request", refresh_request) + + def ensure(): + barrier.wait(5) + try: + client.ensure_authenticated(allow_login=False) + except Exception as exc: # collected for assertion in the test thread + errors.append(exc) + + workers = [threading.Thread(target=ensure) for _ in range(2)] + for worker in workers: + worker.start() + barrier.wait(5) + assert request_started.wait(5) + release_request.set() + for worker in workers: + worker.join(5) + + assert all(not worker.is_alive() for worker in workers) + assert errors == [] + assert len(calls) == 1 + assert client.session["auth"]["accessToken"] == "fresh-access" + assert client.session["auth"]["refreshToken"] == "rotated-refresh-token" + + +def test_login_cli_entry_reuses_begin_and_complete(tmp_path, monkeypatch): + client = CodeBuddyClient(session_file=tmp_path / "cli.json") + seen = [] + monkeypatch.setattr( + client, "begin_login", lambda: {"auth_url": "https://login.test", "state": "s"} + ) + monkeypatch.setattr(client, "complete_login", lambda challenge, timeout: seen.append((challenge, timeout))) + opened = [] + monkeypatch.setattr(client_module.webbrowser, "open", lambda url: opened.append(url)) + + client.login(open_browser=True, timeout=37) + + assert opened == ["https://login.test"] + assert seen == [({"auth_url": "https://login.test", "state": "s"}, 37)] diff --git a/test_rate_limit_proxy.py b/test_rate_limit_proxy.py new file mode 100644 index 0000000..c82e77e --- /dev/null +++ b/test_rate_limit_proxy.py @@ -0,0 +1,555 @@ +"""Offline end-to-end checks for account-aware HTTP 429 handling.""" + +import asyncio +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime, timedelta, timezone +import json +import threading +from email.utils import format_datetime + +import httpx +import pytest +from fastapi.testclient import TestClient + +import codebuddy_proxy.__main__ as proxy +from codebuddy_proxy.account_manager import AccountManager +from codebuddy_proxy.account_store import AccountStore +from codebuddy_proxy.backend_profile import DOMESTIC_PROFILE, GLOBAL_PROFILE, resolve_backend +from codebuddy_proxy.codebuddy_client_demo import CodeBuddyClient + + +MODES = [ + ("/v1/chat/completions", {"messages": [{"role": "user", "content": "hello"}]}), + ("/v1/responses", {"input": "hello"}), + ( + "/v1/messages", + {"messages": [{"role": "user", "content": "hello"}], "max_tokens": 16}, + ), +] +_FUTURE_HTTP_DATE = format_datetime( + datetime.now(timezone.utc) + timedelta(minutes=5), usegmt=True +) +RETRY_AFTER_CASES = [ + pytest.param("17", "17", id="seconds"), + pytest.param(_FUTURE_HTTP_DATE, _FUTURE_HTTP_DATE, id="http-date"), + pytest.param(None, None, id="absent"), +] + + +def _add_account(store, tmp_path, *, uid, token=None, profile=DOMESTIC_PROFILE, endpoint=None): + source = CodeBuddyClient( + backend=resolve_backend( + profile=profile, + endpoint=endpoint, + session_file=tmp_path / f"source-{profile.key}-{uid}.json", + environment={}, + ) + ) + access_token = token or f"token-{profile.key}-{uid}" + source._save_session( + { + "auth": {"accessToken": access_token, "refreshToken": f"refresh-{access_token}"}, + "account": {"uid": uid, "nickname": f"User {uid}"}, + "machineId": "rate-limit-test-machine", + } + ) + account_id = store.import_client(source) + return account_id, store.get_client(account_id) + + +def _environment(tmp_path, monkeypatch, accounts): + store = AccountStore(tmp_path / "accounts") + clients = {} + account_ids = {} + for specification in accounts: + account_id, client = _add_account(store, tmp_path, **specification) + clients[specification["uid"]] = client + account_ids[specification["uid"]] = account_id + manager = AccountManager(store) + state = proxy.ProxyState( + store.active_client(), None, None, account_manager=manager + ) + monkeypatch.setattr(proxy, "proxy_state", state) + return store, manager, state, clients, account_ids + + +def _install_transport(monkeypatch, handler): + real_async_client = httpx.AsyncClient + + def mock_async_client(*args, **kwargs): + kwargs["transport"] = httpx.MockTransport(handler) + return real_async_client(*args, **kwargs) + + monkeypatch.setattr(proxy.httpx, "AsyncClient", mock_async_client) + + +def _request_body(path, body, stream): + return {"model": "rate-limit-test", "stream": stream, **body} + + +def _success_response(content="recovered"): + first = { + "id": "rate-limit-response", + "object": "chat.completion.chunk", + "created": 1, + "model": "rate-limit-test", + "choices": [{"index": 0, "delta": {"content": content}, "finish_reason": None}], + } + final = { + "id": "rate-limit-response", + "object": "chat.completion.chunk", + "created": 1, + "model": "rate-limit-test", + "choices": [{"index": 0, "delta": {}, "finish_reason": "stop"}], + } + payload = ( + f"data: {json.dumps(first)}\n\n" + f"data: {json.dumps(final)}\n\n" + "data: [DONE]\n\n" + ) + return httpx.Response( + 200, + content=payload.encode(), + headers={"content-type": "text/event-stream"}, + ) + + +def _error_response(uid, *, status=429, retry_after="60", body=None): + headers = {"content-type": "application/json"} + if retry_after is not None: + headers["Retry-After"] = retry_after + content = body if body is not None else json.dumps({"msg": f"limited-{uid}"}).encode() + return httpx.Response(status, content=content, headers=headers) + + +@pytest.mark.parametrize("path,body", MODES) +@pytest.mark.parametrize("stream", [False, True], ids=["non-stream", "stream"]) +@pytest.mark.parametrize("retry_after,expected_header", RETRY_AFTER_CASES) +def test_retry_after_is_preserved_for_all_protocol_modes_with_default_off( + tmp_path, monkeypatch, path, body, stream, retry_after, expected_header +): + store, manager, _, clients, account_ids = _environment( + tmp_path, + monkeypatch, + [{"uid": "a"}, {"uid": "b"}], + ) + seen = [] + + async def upstream(request): + seen.append(request.headers["authorization"]) + return _error_response("a", retry_after=retry_after) + + _install_transport(monkeypatch, upstream) + try: + assert manager.snapshot()["settings"]["auto_switch_on_429"] is False + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post(path, json=_request_body(path, body, stream)) + assert response.status_code == 429 + assert seen == ["Bearer token-domestic-a"] + if expected_header is None: + assert "retry-after" not in response.headers + else: + assert response.headers.get("retry-after") == expected_header + + snapshot = manager.snapshot() + limited = next(account for account in snapshot["accounts"] if account["uid"] == "a") + assert isinstance(snapshot["server_time"], float) + assert "cooldown_until" in limited + assert isinstance(limited["cooldown_remaining_seconds"], int) + assert limited["cooldown_remaining_seconds"] >= 0 + assert limited["last_rate_limited_at"] is not None + assert limited["rate_limited"] is True + assert limited["cooldown_source"] == ("retry_after" if retry_after else "default") + assert snapshot["active_account_id"] == account_ids["a"] + assert clients["a"].session["auth"]["accessToken"] == "token-domestic-a" + assert clients["b"].session["auth"]["accessToken"] == "token-domestic-b" + assert len(store.list_accounts()) == 2 + finally: + manager.close() + + +@pytest.mark.parametrize("path,body", MODES) +@pytest.mark.parametrize("stream", [False, True], ids=["non-stream", "stream"]) +def test_same_region_429_retries_once_on_distinct_uid_for_each_protocol_mode( + tmp_path, monkeypatch, path, body, stream +): + store, manager, _, clients, account_ids = _environment( + tmp_path, + monkeypatch, + [{"uid": "a"}, {"uid": "b"}], + ) + manager.set_settings(auto_switch_on_429=True) + seen = [] + + async def upstream(request): + authorization = request.headers["authorization"] + seen.append(authorization) + if authorization == "Bearer token-domestic-a": + return _error_response("a", retry_after="120") + return _success_response("recovered-from-b") + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post(path, json=_request_body(path, body, stream)) + assert response.status_code == 200 + assert seen == ["Bearer token-domestic-a", "Bearer token-domestic-b"] + assert "recovered-from-b" in response.text + assert manager.store.active_account_id == account_ids["b"] + + snapshot = manager.snapshot() + by_uid = {account["uid"]: account for account in snapshot["accounts"]} + assert set(by_uid) == {"a", "b"} + assert by_uid["a"]["rate_limited"] is True + assert by_uid["b"]["rate_limited"] is False + assert clients["a"].session["auth"]["accessToken"] == "token-domestic-a" + assert clients["b"].session["auth"]["accessToken"] == "token-domestic-b" + assert clients["a"].session_file != clients["b"].session_file + assert len(store.list_accounts()) == 2 + finally: + manager.close() + + +@pytest.mark.parametrize( + "candidate", + [ + pytest.param({"uid": "other-region", "profile": GLOBAL_PROFILE}, id="other-region"), + pytest.param( + { + "uid": "other-endpoint", + "endpoint": "https://domestic-alt.example.test", + }, + id="other-endpoint", + ), + ], +) +def test_429_never_uses_candidate_from_another_region_or_endpoint( + tmp_path, monkeypatch, candidate +): + store, manager, _, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, candidate] + ) + manager.set_settings(auto_switch_on_429=True) + seen = [] + + async def upstream(request): + seen.append((request.url.host, request.headers["authorization"])) + return _error_response("a", retry_after="60") + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post( + "/v1/chat/completions", + json={"model": "rate-limit-test", "stream": False, + "messages": [{"role": "user", "content": "hello"}]}, + ) + assert response.status_code == 429 + assert seen == [("copilot.tencent.com", "Bearer token-domestic-a")] + assert manager.store.active_account_id == account_ids["a"] + assert manager.snapshot()["accounts"][0]["rate_limited"] is True + finally: + manager.close() + + +def test_all_same_scope_accounts_are_attempted_at_most_once_and_last_429_is_returned( + tmp_path, monkeypatch +): + _, manager, _, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}, {"uid": "c"}] + ) + manager.set_settings(auto_switch_on_429=True) + retry_after_by_token = { + "Bearer token-domestic-a": "11", + "Bearer token-domestic-b": "22", + "Bearer token-domestic-c": "33", + } + uid_by_token = { + "Bearer token-domestic-a": "a", + "Bearer token-domestic-b": "b", + "Bearer token-domestic-c": "c", + } + seen = [] + + async def upstream(request): + token = request.headers["authorization"] + seen.append(token) + uid = uid_by_token[token] + return _error_response(uid, retry_after=retry_after_by_token[token]) + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post( + "/v1/chat/completions", + json={"model": "rate-limit-test", "stream": False, + "messages": [{"role": "user", "content": "hello"}]}, + ) + assert response.status_code == 429 + assert len(seen) == 3 + assert len(set(seen)) == 3 + assert set(seen) == set(retry_after_by_token) + assert response.headers.get("retry-after") == retry_after_by_token[seen[-1]] + assert f"limited-{uid_by_token[seen[-1]]}" in response.text + assert manager.store.active_account_id in account_ids.values() + assert all(account["rate_limited"] for account in manager.snapshot()["accounts"]) + finally: + manager.close() + + +def test_when_all_other_candidates_are_cooling_request_returns_original_429_once( + tmp_path, monkeypatch +): + _, manager, _, clients, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}, {"uid": "c"}] + ) + manager.set_settings(auto_switch_on_429=True) + all_ids = set(account_ids.values()) + for uid in ("b", "c"): + manager.handle_rate_limit( + clients[uid], "300", excluded_account_ids=all_ids + ) + manager.store.set_active(account_ids["a"]) + seen = [] + + async def upstream(request): + seen.append(request.headers["authorization"]) + return _error_response("a", retry_after="30") + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post( + "/v1/chat/completions", + json={"model": "rate-limit-test", "stream": False, + "messages": [{"role": "user", "content": "hello"}]}, + ) + assert response.status_code == 429 + assert seen == ["Bearer token-domestic-a"] + assert manager.store.active_account_id == account_ids["a"] + limited = {a["uid"]: a for a in manager.snapshot()["accounts"]} + assert all(limited[uid]["rate_limited"] for uid in ("a", "b", "c")) + finally: + manager.close() + + +def test_delayed_old_account_429_does_not_replace_manual_active_account( + tmp_path, monkeypatch +): + _, manager, _, _, account_ids = _environment( + tmp_path, + monkeypatch, + [ + {"uid": "a"}, + {"uid": "b"}, + {"uid": "manual-global", "profile": GLOBAL_PROFILE}, + ], + ) + manager.set_settings(auto_switch_on_429=True) + seen = [] + + async def upstream(request): + authorization = request.headers["authorization"] + seen.append(authorization) + if authorization == "Bearer token-domestic-a": + # The request has already pinned A. A human changes the active + # account while A's upstream response is being processed. + manager.activate(account_ids["manual-global"]) + return _error_response("a", retry_after="90") + if authorization == "Bearer token-domestic-b": + return _success_response("retried-on-b") + pytest.fail(f"ineligible account was used: {authorization}") + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post( + "/v1/chat/completions", + json={"model": "rate-limit-test", "stream": False, + "messages": [{"role": "user", "content": "hello"}]}, + ) + assert response.status_code == 429 + assert "limited-a" in response.text + assert seen == ["Bearer token-domestic-a"] + assert manager.store.active_account_id == account_ids["manual-global"] + states = {account["uid"]: account for account in manager.snapshot()["accounts"]} + assert states["a"]["rate_limited"] is True + assert states["b"]["rate_limited"] is False + assert states["manual-global"]["rate_limited"] is False + finally: + manager.close() + + +def test_billing_429_preserves_status_body_and_retry_after_without_replay( + tmp_path, monkeypatch +): + _, manager, _, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}] + ) + manager.set_settings(auto_switch_on_429=True) + body = b'{"billing":"slow down","request":"single-checkin"}\n' + seen = [] + + async def upstream(request): + seen.append((request.method, request.url.host, request.headers["authorization"])) + return httpx.Response( + 429, + content=body, + headers={"content-type": "application/problem+json", "Retry-After": "45"}, + ) + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post("/v1/checkin") + assert response.status_code == 429 + assert response.content == body + assert response.headers.get("retry-after") == "45" + assert response.headers.get("content-type") == "application/problem+json" + assert seen == [ + ("POST", "copilot.tencent.com", "Bearer token-domestic-a") + ] + assert manager.store.active_account_id == account_ids["b"] + limited = {a["uid"]: a for a in manager.snapshot()["accounts"]} + assert limited["a"]["rate_limited"] is True + assert limited["b"]["rate_limited"] is False + finally: + manager.close() + + +@pytest.mark.parametrize("status", [401, 503]) +def test_non_429_statuses_never_rotate_accounts(tmp_path, monkeypatch, status): + _, manager, _, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}] + ) + manager.set_settings(auto_switch_on_429=True) + seen = [] + + async def upstream(request): + seen.append(request.headers["authorization"]) + return httpx.Response(status, json={"msg": f"status-{status}"}) + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post( + "/v1/chat/completions", + json={"model": "rate-limit-test", "stream": False, + "messages": [{"role": "user", "content": "hello"}]}, + ) + assert response.status_code == status + assert seen == ["Bearer token-domestic-a"] + assert manager.store.active_account_id == account_ids["a"] + assert all(not account["rate_limited"] for account in manager.snapshot()["accounts"]) + finally: + manager.close() + + +def test_started_sse_is_never_replayed_after_upstream_stream_failure( + tmp_path, monkeypatch +): + _, manager, _, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}] + ) + manager.set_settings(auto_switch_on_429=True) + seen = [] + + class BrokenAfterFirstChunk(httpx.AsyncByteStream): + async def __aiter__(self): + chunk = { + "id": "partial-stream", + "object": "chat.completion.chunk", + "created": 1, + "model": "rate-limit-test", + "choices": [ + {"index": 0, "delta": {"content": "stream-started"}, + "finish_reason": None} + ], + } + yield f"data: {json.dumps(chunk)}\n\n".encode() + raise httpx.ReadError("injected failure after first SSE chunk") + + async def aclose(self): + return None + + async def upstream(request): + seen.append(request.headers["authorization"]) + return httpx.Response( + 200, + stream=BrokenAfterFirstChunk(), + headers={"content-type": "text/event-stream"}, + ) + + _install_transport(monkeypatch, upstream) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + response = app.post( + "/v1/chat/completions", + json={"model": "rate-limit-test", "stream": True, + "messages": [{"role": "user", "content": "hello"}]}, + ) + assert response.status_code == 200 + assert "stream-started" in response.text + assert seen == ["Bearer token-domestic-a"] + assert manager.store.active_account_id == account_ids["a"] + assert all(not account["rate_limited"] for account in manager.snapshot()["accounts"]) + finally: + manager.close() + + +def test_concurrent_requests_keep_their_body_and_account_snapshot_isolated( + tmp_path, monkeypatch +): + _, manager, _, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}, {"uid": "c"}] + ) + manager.set_settings(auto_switch_on_429=True) + first_a_started = threading.Event() + release_first_a = threading.Event() + seen = [] + + async def upstream(request): + authorization = request.headers["authorization"] + payload = json.loads(request.content) + prompt = payload["messages"][-1]["content"] + seen.append((prompt, authorization)) + if prompt == "request-one" and authorization == "Bearer token-domestic-a": + first_a_started.set() + await asyncio.to_thread(release_first_a.wait, 5) + return _error_response("a", retry_after="90") + return _success_response(f"answer-{prompt}") + + _install_transport(monkeypatch, upstream) + body_one = { + "model": "rate-limit-test", "stream": False, + "messages": [{"role": "user", "content": "request-one"}], + } + body_two = { + "model": "rate-limit-test", "stream": False, + "messages": [{"role": "user", "content": "request-two"}], + } + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + with ThreadPoolExecutor(max_workers=1) as pool: + first_future = pool.submit(app.post, "/v1/chat/completions", json=body_one) + try: + assert first_a_started.wait(5) + manager.activate(account_ids["b"]) + second_response = app.post("/v1/chat/completions", json=body_two) + finally: + release_first_a.set() + first_response = first_future.result(timeout=10) + + assert second_response.status_code == 200 + assert "answer-request-two" in second_response.text + assert first_response.status_code == 429 + assert "limited-a" in first_response.text + first_tokens = [token for prompt, token in seen if prompt == "request-one"] + second_tokens = [token for prompt, token in seen if prompt == "request-two"] + assert first_tokens[0] == "Bearer token-domestic-a" + assert first_tokens == ["Bearer token-domestic-a"] + assert second_tokens == ["Bearer token-domestic-b"] + assert manager.store.active_account_id == account_ids["b"] + finally: + release_first_a.set() + manager.close() From b380f2c8e5409b0cf509b4bacc97765109ceea76 Mon Sep 17 00:00:00 2001 From: mayer Date: Sat, 24 Oct 2026 18:20:59 +0800 Subject: [PATCH 2/3] feat: add model-scoped cooldowns and bilingual account management Fix check-in status queries to use the current activity endpoint. Persist cooldowns per account and model, and add Chinese/English management UI with regression coverage. --- ACCOUNT_MANAGER_ACCEPTANCE.md | 38 + ACCOUNT_MANAGER_PLAN.md | 14 +- README.md | 22 +- README_zh.md | 11 +- src/codebuddy_proxy/__main__.py | 10 +- src/codebuddy_proxy/account_checkin.py | 5 +- src/codebuddy_proxy/account_manager.py | 201 +++-- src/codebuddy_proxy/admin.html | 981 ++++++++++++++++++++----- src/codebuddy_proxy/admin_api.py | 92 ++- src/codebuddy_proxy/billing_proxy.py | 6 +- test_account_checkin.py | 8 +- test_account_checkin_integration.py | 75 +- test_account_manager.py | 269 +++++-- test_admin_api.py | 43 +- test_admin_ui.py | 487 +++++++++++- test_checkin_proxy.py | 4 +- test_rate_limit_proxy.py | 295 +++++++- 17 files changed, 2133 insertions(+), 428 deletions(-) diff --git a/ACCOUNT_MANAGER_ACCEPTANCE.md b/ACCOUNT_MANAGER_ACCEPTANCE.md index b7bb69d..8aff7a6 100644 --- a/ACCOUNT_MANAGER_ACCEPTANCE.md +++ b/ACCOUNT_MANAGER_ACCEPTANCE.md @@ -85,6 +85,44 @@ Edge 浏览器已检查默认关闭、开关保存,并通过隔离代理的实 Edge 浏览器使用独立临时目录、三个合成账号、模拟上游完成:初始状态查询;对非当前 Global 账号手动签到且当前国内账号不变;打开全局开关后后台逐账号检查,未签到账号补签、已签到账号跳过;刷新后三个账号均显示已签到,active 保持原值。实际检查 JSON 日志含 enable 检查、跳过、动作和确认事件。截图:`F:/Codex/visualizations/2026/10/24/01a16c22-2245-7651-89a9-06eed118ee27/account-checkin-preview.png`。临时验收服务在验收后停止,未替换用户实际代理。 +## 签到状态旧接口误报修复 + +2026-10-24 用户实际账号反馈后确认:旧上游 `POST /v2/billing/meter/checkin-status` 虽然 HTTP 200、code 0,但返回 active=false、today_checked_in=false、空活动时间;使用相同国内账号和认证信息查询当前 `POST /v2/billing/meter/checkin-activity-status`,返回 active=true、today_checked_in=true、有效活动时间。已读取本机安装的 WorkBuddy 客户端代码确认当前状态路径。旧接口的成功响应不足以证明当前活动状态。 + +管理后台签到服务与 `/v1/checkin-status` 均更新为当前上游接口;本机 API 地址不变,仍兼容 GET/POST,向上游发送 POST 和空 JSON。每日签到动作地址保持不变,不回退到会返回无效活动信息的旧状态接口。 + +新增 6 项独立集成回归:国内/Global 各覆盖管理 API、v1 GET、v1 POST,模拟旧接口 inactive、新接口已签,验证展示 checked、原始响应透传、目标账号身份、active 不变,且已签到账号的手动签到请求也不会调用 daily-checkin。同步更新原有请求路径契约与自动任务模拟。定向签到组 **63 passed**。 + +主 agent 使用修复后的实际 AccountCheckinService,仅查询当前国内账号(未启动自动调度),结果为 status=checked、checked=true、error=null。没有发起真实签到动作,没有修改账号设置或重启运行中的用户代理。最终全量回归 **419 passed / 1 skipped / 7 warnings**,耗时 159.09 秒;警告为既有弃用和测试返回值提示。 + +## 账号与模型分别限流补充验收 + +2026-10-24 根据用户补充,推理 429 改为“账号 + 实际请求模型”维度;同账号的其他模型仍可用。每个模型分别保存截止时间、上次限流时间和 Retry-After/默认估算来源,管理页逐项显示模型名和倒计时,单个模型到期不影响其他模型标记。 + +主 agent 负责三协议请求模型传递、日志、billing/签到无模型隔离、方案及独立验收;GPT-6 Luna / max 子 agent B 负责 manager/API/版本化状态与故障回滚,C 负责页面和双语说明,A 负责独立代理回归及只读审阅。模型名称按请求原样保留,不推测别名。 + +自动切换候选仍限定同区域与同 endpoint,但只排除本次请求模型仍冷却的账号。其他模型冷却不排除该候选;每请求每账号最多一次、手动切换保护、Retry-After 原样透传和已经开始输出的流不重放均保留。日志包含 account_id 和 model。没有模型的 billing/签到 429 不记录推理冷却、不切换当前账号。 + +运行状态沿用原文件位置,schema 升级为 v2,以账号/模型嵌套存储;严格验证旧 v1 文件后保留设置,舍弃无法确定模型归属的整账号冷却,不把它扩展到所有模型。只读加载不改写旧文件。保存失败回滚内存,删除失败恢复完整嵌套状态。管理 API 删除旧顶层账号冷却字段,按 `model_cooldowns` 数组逐项白名单输出;拒绝无效或过长模型名及控制字符,页面使用文本渲染。 + +定向验证:manager/API **31 passed**;独立代理链路 **44 passed**;主 agent 将 manager/API/UI/签到/状态透传合跑 **95 passed**。覆盖三协议 × 流式/非流式、同账号模型 A 限流而 B 成功、候选同模型与其他模型冷却的两方向选择、两个不同模型同时收到 429 后分别保留 19/73 秒等待与正确日志归属、无模型请求隔离、状态升级/重启恢复和故障注入。均使用临时目录和模拟上游。 + +Edge 实际浏览器验证同一合成国内账号下 `model-alpha` 与 `model-beta` 显示各自倒计时和上游等待时间来源;备用国内和 Global 账号无错误的整账号标记,自动切换说明明确限定请求模型。仅在隔离的本机演示服务中验证,未使用真实账号额度或操作真实账号设置。截图:`F:/Codex/visualizations/2026/10/24/01a16c22-2245-7651-89a9-06eed118ee27/account-model-cooldown-preview.png`。临时服务验收后停止。 + +主 agent 最终独立全量回归:**433 passed / 1 skipped / 7 warnings**,耗时 126.53 秒;既有监控测试本轮通过。wheel 构建通过,逐字节核对主入口、manager、管理 API、页面、billing 和签到服务均与当前源码一致。差异检查通过。当前真实代理未被重启,修复及模型级状态需在加载新代码后生效。 + +## 管理页中英文切换补充验收 + +页面语言范围包括静态说明、按钮、标题、无障碍标签、动态账号列表/模型冷却/签到状态、设置和网络提示、登录进度及已知后端错误。中文和 English 选择保存在当前浏览器;有效保存值优先,随后跟随浏览器语言。无法访问本地存储时切换仍可用。 + +语言切换仅更新展示,不重新加载页面或额外发请求,不改变 active、区域选择、自动开关、进行中的登录 job 或签到/设置操作。进行中的 busy 状态保留,操作完成后使用当前语言显示结果。用户账号昵称、UID、模型名与 endpoint 保留原文并安全作为文本显示;北京时间调度及时间基准不随显示语言变化。 + +沿用指定的 GPT-6 Luna / max 子 agent:C 实现页面,A 独立扩充实际控制器的 DOM 模拟回归,B 清点后端错误并只读复核国际化和状态保留;主 agent 负责文档、独立测试、浏览器与安装包验收。未将界面语言设置发往上游或修改用户代理配置。 + +主 agent 独立验证:中英文词典各 **182** 项,键集合和模板参数一致,英文词典无误留中文文本。控制器与管理 API 合跑 **8 passed**;追加 HTTP 503 错误通知切换测试,确认保留状态码、不因语言切换重试请求。最终全量 **433 passed / 1 skipped / 7 warnings**,耗时 83.32 秒。修复取消登录后的重试按钮状态回归;未知原型名称错误不误作翻译键,查询成功通知中的状态参数按当前语言解析。 + +Edge 在独立临时目录和合成账号中验证:默认跟随浏览器英文;切换中文后页面标题、无障碍标签、模型冷却、签到及设置文字同步变化;刷新保留中文,再切英文并刷新保留英文;中文查询账号状态后切英文,已有通知中的状态也翻译且账号名保留原文。英文截图:`F:/Codex/visualizations/2026/10/24/01a16c22-2245-7651-89a9-06eed118ee27/account-manager-english-preview.png`。页面测试未执行真实账号操作。wheel 重建并与源码核对,临时演示服务验收后停止。 + ## 边界 本次完成本地代码和离线/浏览器验收。真实国内与 Global 的账号认证需要实际用户完成登录,尚未作为上游验收;没有替换正在运行的用户代理,没有发布、提交或推送。 diff --git a/ACCOUNT_MANAGER_PLAN.md b/ACCOUNT_MANAGER_PLAN.md index 06e323e..fedcdae 100644 --- a/ACCOUNT_MANAGER_PLAN.md +++ b/ACCOUNT_MANAGER_PLAN.md @@ -26,17 +26,17 @@ ## 429 限流与自动切换补充(2026-10-24) -管理页新增每账号的限流标记、冷却倒计时,以及默认关闭的“遇 429 自动切换账号”开关。开关和冷却截止时间写入独立版本化运行状态文件,不改账号索引或凭据结构。冷却优先读取 Retry-After(整数秒或 HTTP 日期);缺失或无效时采用 60 秒并注明默认估算。过期解除限流标记,不主动切回旧账号。 +管理页按“账号 + 模型”展示独立的限流标记和冷却倒计时,以及默认关闭的“遇 429 自动切换账号”开关。同账号某模型冷却不影响其他模型。开关和冷却截止时间写入独立版本化运行状态文件,不改账号索引或凭据结构。冷却优先读取 Retry-After(整数秒或 HTTP 日期);缺失或无效时采用 60 秒并注明默认估算。过期解除限流标记,不主动切回旧账号。 -三种推理协议在上游真正返回 HTTP 429、客户端响应尚未开始时,可按开关切换同区域且同 endpoint、未冷却且有可用凭据的账号,再尝试当前请求。每账号最多一次,尝试次数不超过请求开始时账号数量。候选用尽仍返回实际的 429 与对应 Retry-After。迟到的旧请求只能标记其原始账号,不覆盖期间的手动切换。已开始输出的流不重放。 +三种推理协议在上游真正返回 HTTP 429、客户端响应尚未开始时,可按开关切换同区域且同 endpoint、该请求模型未冷却且有可用凭据的账号,再尝试当前请求。每账号最多一次,尝试次数不超过请求开始时账号数量。候选用尽仍返回实际的 429 与对应 Retry-After。迟到的旧请求只能标记其原始账号,不覆盖期间的手动切换。已开始输出的流不重放。 -签到等 billing 操作透传 Retry-After,并记录原账号限流;若开启自动切换,仅为后续请求更新当前账号,不将该次业务操作重放到另一账号。 +签到等 billing 操作透传 Retry-After;这类请求没有模型维度,不记录推理模型冷却,也不切换账号或重放业务动作。运行状态沿用原文件路径,版本升级到 v2,按账号/模型嵌套保存。v1 开关继续保留;旧冷却因没有模型信息,在严格校验后不再沿用,不扩展为全账号限制。日志包含实际请求账号与模型。 分工沿用 GPT-6 Luna / max 子 agent:B 负责状态、持久化和 API;C 负责页面、文档、交互测试;A 负责独立代理链路测试;主 agent 实现 HTTP 集成并独立审阅和验收。 ## 每账号每日签到与自动调度补充(2026-10-24) -全局自动签到开关控制所有关联账号,不限当前生效账号。列表显示各账号今日状态,提供状态查询与签到按钮;每次使用指定账号自身 client 调用既有 billing 底层接口,不更换当前账号。状态查询/签到复用 POST checkin-status / daily-checkin 和 401 刷新逻辑。根据原贡献 PR #7 的上游记录,以 code=0 且 data.today_checked_in 严格布尔值判断;未知、失败和活动未开放均不得当作未签到直接发动作。 +全局自动签到开关控制所有关联账号,不限当前生效账号。列表显示各账号今日状态,提供状态查询与签到按钮;每次使用指定账号自身 client 调用既有 billing 底层接口,不更换当前账号。状态查询/签到复用 POST checkin-activity-status / daily-checkin 和 401 刷新逻辑。根据原贡献 PR #7 的上游记录,以 code=0 且 data.today_checked_in 严格布尔值判断;未知、失败和活动未开放均不得当作未签到直接发动作。 自动签到默认关闭,持久化开关。北京时间(UTC+8)每日 00:00 对启用功能下的所有账号检查;未签到者在该午夜后 0–600 秒内安排独立随机时刻,再查未签到才执行签到。关闭开关取消待执行任务;实际 POST 前重检日期、账号是否仍存在和开关。开关从关变开立即检查并补签;服务启动时开关已开也立即检查并补签。 @@ -44,6 +44,12 @@ A 子 agent 负责签到 service/调度及单元测试,B 负责管理器设置迁移与 API,C 负责列表/开关/文档和交互测试;均沿用 GPT-6 Luna / max。主 agent 负责生命周期、日志接入、HTTP 集成测试、独立审阅和最终验收。 +## 管理页中英文切换补充(2026-10-24) + +管理页顶部提供中文/English 选择,保存到当前浏览器 localStorage;有效保存值优先,其次跟随浏览器语言,存储不可用时仍可切换。页面标题、语言属性、无障碍标签、静态介绍、动态账号/签到/模型冷却状态、设置提示、登录进度和已知后端错误覆盖中英文。账号名、模型 ID、UID 和服务地址保留原值,以文本安全渲染。 + +语言切换只重新渲染展示,不刷新页面、不额外请求、不变更账号或开关,不取消或重复登录与签到任务;进行中的 busy 状态与操作结果按当前语言显示。页面内部显示明确的北京时间,不因显示语言改变后台调度时区。C 实现页面,A 独立扩充控制器回归,B 只读复核错误映射和并发操作;主 agent 负责文档、独立浏览器/测试/安装包验收。 + ## 验收 离线自动化覆盖:多账号不覆盖、两区域同 uid 隔离、原有会话导入、重启恢复、损坏数据、原子写入;登录 token/account 延迟、取消、超时及失败不写入;API 不泄漏凭据、跨站和非本机管理请求被拒;无账号启动、切换后 health / models / 三种协议新请求使用新账号、在途请求不串号、billing 刷新不串号。全量现有测试需与基线区分;包构建验证页面被包含。浏览器检查管理页加载、关联窗口、状态和布局。真实国内/国际交互登录依赖用户亲自认证,离线模拟通过不能代替真实上游验收。 diff --git a/README.md b/README.md index 0408162..b5f7648 100644 --- a/README.md +++ b/README.md @@ -391,16 +391,22 @@ The first linked account becomes active automatically; linking another account does not change the account currently in use. Use **Set active** to switch, or delete a saved account from the same page. The selection is saved for the next proxy start. The page and its management API are restricted to local access. +Use the language selector at the top of the page to switch between Chinese and +English. The choice is remembered in this browser; without a saved preference, +the page follows the browser language. Switching languages keeps ongoing login +and account operations running. Automatic account switching after an upstream `429` is off by default. When -enabled, the proxy can try accounts with the same region and endpoint, at most -once per account for each request; if every eligible account returns `429`, the -original `429` is returned. The rate-limited account observes the upstream -`Retry-After` value, or a default 60-second cooldown when that value is missing -or invalid. The setting and cooldowns persist across restarts. The page shows -the remaining cooldown and whether it came from `Retry-After` or the default; -it refreshes account state periodically and immediately when a hidden page -becomes visible again. +enabled, the proxy tries accounts with the same region and endpoint, at most once +per account for each request. It skips an account only while the model used by +that request is cooling down there; other models on the same account remain +eligible. If every eligible account returns `429`, the original `429` is returned. +Cooldowns are tracked per account and model, using upstream `Retry-After` or a +default 60 seconds when that value is missing or invalid. The setting and model +cooldowns persist across restarts. Old v1 account-wide cooldowns had no model +identity and are not carried forward during upgrade. The page shows a separate +remaining countdown and source for each model, and refreshes account state +periodically and immediately when a hidden page becomes visible again. The account list also shows each linked account's check-in status for today (Beijing time). The **Check in** action is available for every account, including diff --git a/README_zh.md b/README_zh.md index ba1cfa7..6c647ca 100644 --- a/README_zh.md +++ b/README_zh.md @@ -395,12 +395,15 @@ uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-c **国内**或 **Global**,再在新打开的浏览器窗口中完成关联。首次关联的账号会自动设为当前账号; 之后关联其他账号不会隐式切换。可在列表中切换当前账号或删除账号,当前选择会在下次启动时恢复。 管理页及管理 API 仅允许本机访问。 +页面顶部可切换中文和 English,选择会保存在当前浏览器;没有保存偏好时跟随浏览器语言。 +切换即时生效,不会中断进行中的登录、签到或账号操作。 遇到上游 `429` 时自动切换账号的功能默认关闭。开启后,代理只会尝试区域和 endpoint -都相同的账号,每个请求对每个账号最多尝试一次;所有候选账号都返回 `429` 时,仍返回原始 -`429`。账号会遵循上游的 `Retry-After`;该值缺失或无效时,默认冷却 60 秒。此开关和冷却状态 -会在重启后保留。管理页会显示剩余冷却时间及其来源(`Retry-After` 或默认值),并定期同步账号状态; -页面从后台重新显示时会立即同步。 +都相同的账号;仅当该账号的“本次请求模型”仍在冷却时才会跳过,同一账号的其他模型仍可用。 +每个请求对每个账号最多尝试一次;所有候选账号都返回 `429` 时,仍返回原始 `429`。冷却按账号和模型 +分别记录,遵循上游 `Retry-After`;该值缺失或无效时,默认冷却 60 秒。自动切换设置和模型冷却会在重启后保留。 +旧版 v1 的整账号冷却没有模型信息,升级后不会沿用。管理页分别显示每个模型的剩余冷却时间 +及其来源(`Retry-After` 或默认值),并定期同步账号状态;页面从后台重新显示时会立即同步。 账号列表还会显示每个关联账号当天(北京时间)的签到状态。每个账号都有“查询签到”和“签到”按钮, 当前账号也可操作;签到前会先检查,已签到时不会重复签到。全局自动签到默认关闭,适用于所有关联账号, diff --git a/src/codebuddy_proxy/__main__.py b/src/codebuddy_proxy/__main__.py index 9844ba8..0cdcff4 100755 --- a/src/codebuddy_proxy/__main__.py +++ b/src/codebuddy_proxy/__main__.py @@ -951,7 +951,7 @@ async def health(): async def checkin_status(): """Accept GET/POST locally; the real upstream billing status endpoint requires POST.""" return await forward_billing( - get_request_state(), "POST", "/v2/billing/meter/checkin-status", diagnostic + get_request_state(), "POST", "/v2/billing/meter/checkin-activity-status", diagnostic ) @@ -1168,7 +1168,7 @@ async def forward_chat( if response.status_code != 429: return response retry_state = await rate_limited_account( - state, response.headers.get("Retry-After"), attempted, + state, response.headers.get("Retry-After"), attempted, model=body.get("model"), ) if retry_state is None or attempt + 1 == max_attempts: return response @@ -1176,7 +1176,7 @@ async def forward_chat( return response -async def rate_limited_account(state, retry_after, attempted): +async def rate_limited_account(state, retry_after, attempted, *, model): """Record the original identity; late failures cannot override manual switches.""" manager = getattr(state, "account_runtime", None) if manager is None: @@ -1187,11 +1187,11 @@ async def rate_limited_account(state, retry_after, attempted): attempted.add(account_id) candidate = await asyncio.to_thread( manager.handle_rate_limit, state.client, retry_after, - excluded_account_ids=set(attempted), + model=model, excluded_account_ids=set(attempted), ) next_id = manager.account_id_for_client(candidate) if candidate is not None else None state.write_log( - "account_rate_limited", account_id=account_id, switched_to=next_id, + "account_rate_limited", account_id=account_id, model=model, switched_to=next_id, ) if candidate is None or next_id is None or next_id in attempted: return None diff --git a/src/codebuddy_proxy/account_checkin.py b/src/codebuddy_proxy/account_checkin.py index 685bfc5..da0371a 100644 --- a/src/codebuddy_proxy/account_checkin.py +++ b/src/codebuddy_proxy/account_checkin.py @@ -18,7 +18,8 @@ BEIJING = timezone(timedelta(hours=8), name="Asia/Shanghai") -STATUS_PATH = "/v2/billing/meter/checkin-status" +# The legacy checkin-status endpoint can return an empty, inactive activity. +STATUS_PATH = "/v2/billing/meter/checkin-activity-status" CHECKIN_PATH = "/v2/billing/meter/daily-checkin" _SAFE_ERRORS = frozenset( { @@ -518,7 +519,7 @@ async def _record_rate_limit(self, client: Any, retry_after: str | None) -> None return try: result = await asyncio.to_thread( - handler, client, retry_after, allow_switch=False + handler, client, retry_after, model=None, allow_switch=False ) if hasattr(result, "__await__"): await result diff --git a/src/codebuddy_proxy/account_manager.py b/src/codebuddy_proxy/account_manager.py index 897bf7c..94e937b 100644 --- a/src/codebuddy_proxy/account_manager.py +++ b/src/codebuddy_proxy/account_manager.py @@ -19,6 +19,7 @@ import tempfile import threading import time +import unicodedata import uuid from typing import Any, Callable from urllib.parse import urlsplit @@ -46,14 +47,11 @@ def __init__(self, message: str, *, status_code: int = 400) -> None: "uid", "nickname", "active", - "rate_limited", - "cooldown_until", - "cooldown_remaining_seconds", - "last_rate_limited_at", - "cooldown_source", + "model_cooldowns", "checkin", ) -_RUNTIME_STATE_VERSION = 1 +_RUNTIME_STATE_VERSION = 2 +_LEGACY_RUNTIME_STATE_VERSION = 1 _RUNTIME_STATE_FILENAME = "account-manager-state-v1.json" _DEFAULT_COOLDOWN_SECONDS = 60 _RETRY_AFTER_SECONDS_RE = re.compile(r"^[0-9]+$") @@ -106,7 +104,7 @@ def __init__( "default_cooldown_seconds": _DEFAULT_COOLDOWN_SECONDS, "auto_checkin_enabled": False, } - self._cooldowns: dict[str, dict[str, Any]] = {} + self._cooldowns: dict[str, dict[str, dict[str, Any]]] = {} self._load_runtime_state() self._closed = False self._jobs: dict[str, _LoginJob] = {} @@ -145,28 +143,36 @@ def snapshot(self) -> dict[str, Any]: account_id = account.get("id") if not isinstance(account_id, str): account_id = None - cooldown = self._cooldowns.get(account_id) - deadline = cooldown.get("deadline") if cooldown else None - active_cooldown = ( - cooldown is not None - and isinstance(deadline, (int, float)) - and deadline > server_time - ) + cooldowns = self._cooldowns.get(account_id, {}) + model_cooldowns = [] + for model, cooldown in sorted(cooldowns.items()): + deadline = cooldown.get("deadline") + active_cooldown = ( + isinstance(deadline, (int, float)) + and deadline > server_time + ) + model_cooldowns.append( + { + "model": model, + "rate_limited": active_cooldown, + # Keep the original deadline and source as + # history after expiry; only the active flag + # and remaining duration change. + "cooldown_until": deadline, + "cooldown_remaining_seconds": ( + max(0, math.ceil(deadline - server_time)) + if active_cooldown + else 0 + ), + "last_rate_limited_at": cooldown.get( + "last_rate_limited_at" + ), + "cooldown_source": cooldown.get("source"), + } + ) safe.update( { - "rate_limited": active_cooldown, - "cooldown_until": deadline if active_cooldown else None, - "cooldown_remaining_seconds": ( - max(0, math.ceil(deadline - server_time)) - if active_cooldown - else 0 - ), - "last_rate_limited_at": ( - cooldown.get("last_rate_limited_at") if cooldown else None - ), - "cooldown_source": ( - cooldown.get("source") if active_cooldown else None - ), + "model_cooldowns": model_cooldowns, } ) safe_accounts.append(safe) @@ -215,11 +221,17 @@ def handle_rate_limit( client: Any, retry_after: Any, *, + model: str | None = None, excluded_account_ids: set[str] | None = None, allow_switch: bool = True, ) -> Any | None: - """Record a 429 cooldown and optionally switch within the same region.""" + """Record a model-scoped 429 and optionally switch within the same region.""" + model_key = _valid_model_name(model) + if model_key is None: + # Billing and other model-less endpoints must not affect chat + # failover or impose a cooldown on every model for this account. + return None identity = _client_identity(client) if identity is None: return None @@ -232,17 +244,32 @@ def handle_rate_limit( delay, source = _cooldown_delay(retry_after, now) deadline = now + delay with self._runtime_lock: - previous = self._cooldowns.get(account_id) + account_cooldowns = self._cooldowns.get(account_id) + had_account_cooldowns = account_cooldowns is not None + if account_cooldowns is None: + account_cooldowns = {} + self._cooldowns[account_id] = account_cooldowns + had_previous = model_key in account_cooldowns + previous = account_cooldowns.get(model_key) if previous is not None and previous.get("deadline", 0) > now: if previous["deadline"] > deadline: deadline = previous["deadline"] source = previous["source"] - self._cooldowns[account_id] = { + account_cooldowns[model_key] = { "deadline": deadline, "last_rate_limited_at": now, "source": source, } - self._save_runtime_state_locked() + try: + self._save_runtime_state_locked() + except Exception: + if had_previous: + account_cooldowns[model_key] = previous + else: + account_cooldowns.pop(model_key, None) + if not account_cooldowns and not had_account_cooldowns: + self._cooldowns.pop(account_id, None) + raise excluded = { item for item in (excluded_account_ids or set()) if isinstance(item, str) @@ -268,7 +295,7 @@ def handle_rate_limit( or candidate.get("endpoint") != endpoint ): continue - cooldown = self._cooldowns.get(candidate_id) + cooldown = self._cooldowns.get(candidate_id, {}).get(model_key) if ( cooldown is not None and cooldown.get("deadline", 0) > time.time() @@ -410,22 +437,22 @@ def _load_runtime_state(self) -> None: raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) from None if not isinstance(value, dict) or set(value) != {"version", "settings", "cooldowns"}: raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) - if ( - type(value.get("version")) is not int - or value.get("version") != _RUNTIME_STATE_VERSION + version = value.get("version") + if type(version) is not int or version not in ( + _LEGACY_RUNTIME_STATE_VERSION, + _RUNTIME_STATE_VERSION, ): raise AccountManagerError("账号管理状态文件版本不受支持,未修改任何数据", status_code=503) settings = value.get("settings") + setting_fields = set(settings) if isinstance(settings, dict) else set() + legacy_fields = {"auto_switch_on_429", "default_cooldown_seconds"} + current_fields = legacy_fields | {"auto_checkin_enabled"} if ( not isinstance(settings, dict) - or set(settings) - not in ( - {"auto_switch_on_429", "default_cooldown_seconds"}, - { - "auto_switch_on_429", - "default_cooldown_seconds", - "auto_checkin_enabled", - }, + or setting_fields not in ( + (legacy_fields, current_fields) + if version == _LEGACY_RUNTIME_STATE_VERSION + else (current_fields,) ) or type(settings.get("auto_switch_on_429")) is not bool or type(settings.get("default_cooldown_seconds")) is not int @@ -439,24 +466,56 @@ def _load_runtime_state(self) -> None: cooldowns = value.get("cooldowns") if not isinstance(cooldowns, dict): raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) - loaded: dict[str, dict[str, Any]] = {} - for account_id, record in cooldowns.items(): - if ( - not isinstance(account_id, str) - or not account_id - or len(account_id) > 256 - or not isinstance(record, dict) - or set(record) != {"deadline", "last_rate_limited_at", "source"} - or not _finite_number(record.get("deadline")) - or not _finite_number(record.get("last_rate_limited_at")) - or record.get("source") not in ("retry_after", "default") - ): - raise AccountManagerError("账号管理状态文件损坏,未修改任何数据", status_code=503) - loaded[account_id] = { - "deadline": float(record["deadline"]), - "last_rate_limited_at": float(record["last_rate_limited_at"]), - "source": record["source"], - } + loaded: dict[str, dict[str, dict[str, Any]]] = {} + if version == _LEGACY_RUNTIME_STATE_VERSION: + # A legacy account-wide cooldown cannot safely be assigned to a + # particular model. Validate its full shape, then discard it. + for account_id, record in cooldowns.items(): + if ( + not isinstance(account_id, str) + or not account_id + or len(account_id) > 256 + or not isinstance(record, dict) + or set(record) != {"deadline", "last_rate_limited_at", "source"} + or not _finite_number(record.get("deadline")) + or not _finite_number(record.get("last_rate_limited_at")) + or record.get("source") not in ("retry_after", "default") + ): + raise AccountManagerError( + "账号管理状态文件损坏,未修改任何数据", status_code=503 + ) + else: + for account_id, model_records in cooldowns.items(): + if ( + not isinstance(account_id, str) + or not account_id + or len(account_id) > 256 + or not isinstance(model_records, dict) + ): + raise AccountManagerError( + "账号管理状态文件损坏,未修改任何数据", status_code=503 + ) + loaded_records: dict[str, dict[str, Any]] = {} + for model, record in model_records.items(): + if ( + _valid_model_name(model) != model + or not isinstance(record, dict) + or set(record) + != {"deadline", "last_rate_limited_at", "source"} + or not _finite_number(record.get("deadline")) + or not _finite_number(record.get("last_rate_limited_at")) + or record.get("source") not in ("retry_after", "default") + ): + raise AccountManagerError( + "账号管理状态文件损坏,未修改任何数据", status_code=503 + ) + loaded_records[model] = { + "deadline": float(record["deadline"]), + "last_rate_limited_at": float(record["last_rate_limited_at"]), + "source": record["source"], + } + if loaded_records: + loaded[account_id] = loaded_records self._settings = { "auto_switch_on_429": settings["auto_switch_on_429"], "default_cooldown_seconds": _DEFAULT_COOLDOWN_SECONDS, @@ -472,8 +531,12 @@ def _save_runtime_state_locked(self) -> None: "version": _RUNTIME_STATE_VERSION, "settings": dict(self._settings), "cooldowns": { - account_id: dict(record) - for account_id, record in self._cooldowns.items() + account_id: { + model: dict(record) + for model, record in model_records.items() + } + for account_id, model_records in self._cooldowns.items() + if model_records }, } try: @@ -764,6 +827,18 @@ def _finite_number(value: Any) -> bool: return False +def _valid_model_name(model: Any) -> str | None: + """Return a model identifier only when it is safe to key and persist.""" + + if not isinstance(model, str) or not model or len(model) > 256: + return None + if not model.strip() or any( + unicodedata.category(char) in {"Cc", "Cs"} for char in model + ): + return None + return model + + def _client_identity(client: Any) -> tuple[str, str, str] | None: if client is None: return None diff --git a/src/codebuddy_proxy/admin.html b/src/codebuddy_proxy/admin.html index b89fe01..19ade72 100644 --- a/src/codebuddy_proxy/admin.html +++ b/src/codebuddy_proxy/admin.html @@ -60,17 +60,20 @@ button { color: inherit; } .shell { width: min(940px, calc(100% - 32px)); margin: 0 auto; padding: 52px 0 72px; } .hero { margin-bottom: 28px; } + .hero-top { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 12px; } .eyebrow { display: flex; align-items: center; gap: 9px; - margin-bottom: 12px; + margin-bottom: 0; color: var(--accent); font-size: 12px; font-weight: 750; letter-spacing: .1em; text-transform: uppercase; } + .language-picker { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; } + .language-picker select { min-height: 34px; padding: 0 9px; border: 1px solid var(--line); border-radius: 9px; background: var(--surface); color: var(--text); font: inherit; } .eyebrow::before { width: 22px; height: 2px; border-radius: 2px; background: currentColor; content: ""; } h1 { margin: 0; font-size: clamp(29px, 5vw, 42px); line-height: 1.15; letter-spacing: -.035em; } .lead { max-width: 630px; margin: 12px 0 0; color: var(--muted); font-size: 15px; line-height: 1.7; } @@ -154,6 +157,8 @@ .account-meta { display: flex; flex-wrap: wrap; gap: 5px 14px; margin-top: 7px; color: var(--muted); font-size: 12px; line-height: 1.5; } .account-meta span { max-width: min(100%, 360px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pill.cooldown-pill { background: var(--danger-soft); color: var(--danger); } + .model-cooldowns { display: flex; flex-wrap: wrap; gap: 5px; width: 100%; } + .pill.model-cooldown { max-width: min(100%, 520px); } .checkin-info { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-top: 7px; color: var(--muted); font-size: 12px; line-height: 1.5; } .checkin-info .checkin-state { color: var(--text); font-weight: 680; } .checkin-info .checkin-state.error { color: var(--danger); } @@ -194,9 +199,18 @@
-
CodeBuddy · 本机代理
-

账号管理

-

在这里关联、切换和管理 CodeBuddy 登录账号。账号凭据由本机代理保存,页面不会显示会话内容。

+
+
CodeBuddy · 本机代理
+ +
+

账号管理

+

在这里关联、切换和管理 CodeBuddy 登录账号。账号凭据由本机代理保存,页面不会显示会话内容。

@@ -205,30 +219,30 @@

账号管理

-

关联账号

-

选择账号所属区域,登录完成后会保存到本机账号库。

+

关联账号

+

选择账号所属区域,登录完成后会保存到本机账号库。

-
- - +
+ +
-

登录页面会在新窗口打开;请在该窗口完成 CodeBuddy 登录。

+

登录页面会在新窗口打开;请在该窗口完成 CodeBuddy 登录。

@@ -236,38 +250,38 @@

关联账号

-

已关联账号

-

当前账号会用于新发起的代理请求。

+

已关联账号

+

当前账号会用于新发起的代理请求。

- +
- 遇到 429 自动切换账号 -

仅尝试同一区域、同一服务地址且未冷却的账号;每个请求对每个账号最多尝试一次。默认关闭。

+ 遇到 429 自动切换账号 +

仅排除同一区域、同一服务地址中“本次请求模型仍在冷却”的账号;同一账号的其他模型仍可用。每个请求对每个账号最多尝试一次。默认关闭。

-
-

正在读取自动切换设置…

+

正在读取自动切换设置…

- 全局自动签到 -

开启后由代理立即检查全部关联账号,并按北京时间计划自动签到。未知状态不会自动签到;关闭后会取消待执行计划。默认关闭。

+ 全局自动签到 +

开启后由代理立即检查全部关联账号,并按北京时间计划自动签到。未知状态不会自动签到;关闭后会取消待执行计划。默认关闭。

-
-

正在读取自动签到设置…

+

正在读取自动签到设置…

- +
@@ -281,7 +295,450 @@

已关联账号

const LOGIN_TIMEOUT_MS = 310000; const ACCOUNT_REFRESH_VISIBLE_MS = 15000; const ACCOUNT_REFRESH_HIDDEN_MS = 60000; + const LANGUAGE_STORAGE_KEY = "codebuddy.admin.language"; + const STRINGS = { + "zh-CN": { + "page.title": "CodeBuddy 账号管理", + "language.label": "语言", + "language.select": "页面语言", + "hero.brand": "CodeBuddy · 本机代理", + "hero.title": "账号管理", + "hero.lead": "在这里关联、切换和管理 CodeBuddy 登录账号。账号凭据由本机代理保存,页面不会显示会话内容。", + "login.heading": "关联账号", + "login.description": "选择账号所属区域,登录完成后会保存到本机账号库。", + "login.hint": "登录页面会在新窗口打开;请在该窗口完成 CodeBuddy 登录。", + "region.group": "选择 CodeBuddy 区域", + "region.domestic": "国内", + "region.global": "Global", + "login.associate": "关联所选区域", + "login.preparingButton": "正在准备登录…", + "login.openManually": "手动打开登录页", + "button.retryAssociation": "重试关联", + "button.cancel": "取消", + "button.refresh": "刷新列表", + "button.refreshAria": "刷新账号列表", + "accounts.heading": "已关联账号", + "accounts.description": "当前账号会用于新发起的代理请求。", + "settings.autoSwitch.title": "遇到 429 自动切换账号", + "settings.autoSwitch.description": "仅排除同一区域、同一服务地址中“本次请求模型仍在冷却”的账号;同一账号的其他模型仍可用。每个请求对每个账号最多尝试一次。默认关闭。", + "settings.autoSwitch.loading": "正在读取自动切换设置…", + "settings.autoCheckin.title": "全局自动签到", + "settings.autoCheckin.description": "开启后由代理立即检查全部关联账号,并按北京时间计划自动签到。未知状态不会自动签到;关闭后会取消待执行计划。默认关闭。", + "settings.autoCheckin.loading": "正在读取自动签到设置…", + "footer.note": "账号管理仅供本机使用。切换账号会影响之后发起的代理请求,已经开始的请求会继续使用原账号。", + "empty.loading": "正在读取账号列表…", + "empty.failedTitle": "账号列表暂时无法读取", + "empty.failedText": "请检查本机代理连接,然后点击“刷新列表”重试。", + "empty.noAccountsTitle": "还没有关联账号", + "empty.noAccountsText": "选择上方的国内或 Global 区域,完成登录后账号会显示在这里。", + "account.defaultName": "CodeBuddy 账号", + "account.uid": "UID:{uid}", + "account.active": "当前账号", + "button.checkinQuery": "查询签到", + "button.checkin": "签到", + "button.activate": "设为当前", + "button.delete": "删除", + "checkin.today": "今日签到:{status}", + "checkin.unknown": "未知", + "checkin.unchecked": "未签到", + "checkin.checked": "已签到", + "checkin.checking": "查询中", + "checkin.signing": "签到中", + "checkin.error": "失败", + "checkin.nextPlan": "下次计划:{time} 北京时间", + "checkin.errorContext": "错误详情:{detail}", + "checkin.statusNotice": "「{name}」今日签到状态:{status}。", + "checkin.resultNotice": "签到状态:{status}。", + "checkin.queryFailed": "查询签到状态失败,请重试。", + "checkin.signFailed": "签到失败,请重试。", + "checkin.success": "签到成功。", + "cooldown.badge": "模型 {model} · 冷却 {time} · {source}", + "cooldown.upstream": "上游指定", + "cooldown.default": "默认估算", + "status.switchReady": "已从本机代理读取设置;上游未提供有效等待时间时,默认冷却 {seconds} 秒。", + "status.checkinReady": "自动签到设置已从本机代理读取。", + "status.switchReadFailed": "暂时无法读取设置,自动切换保持关闭;页面会继续重试。", + "status.checkinReadFailed": "暂时无法读取设置,自动签到保持关闭;页面会继续重试。", + "status.saving": "正在保存设置…", + "status.saveUnconfirmed": "保存结果未确认,正在重新读取设置…", + "status.switchUnconfirmed": "暂时无法确认代理中的设置;页面会继续定期同步。", + "status.checkinUnconfirmed": "暂时无法确认代理中的自动签到设置;页面会继续定期同步。", + "status.syncRecovered": "账号状态已恢复同步。", + "status.syncFailed": "暂时无法同步账号状态,页面会在稍后重试。", + "status.syncUnavailable": "账号列表暂时无法同步,请检查本机代理后重试。", + "notice.detail": "详情:{detail}", + "notice.checkinQueryFailed": "查询签到状态失败,请重试。", + "notice.checkinSignFailed": "签到失败,请重试。", + "notice.checkinStatus": "「{name}」今日签到状态:{status}。", + "notice.checkinSuccess": "签到成功。", + "notice.checkinResult": "签到状态:{status}。", + "notice.autoSwitchOn": "已开启遇到 429 时自动切换账号。", + "notice.autoSwitchOff": "已关闭遇到 429 时自动切换账号。", + "notice.autoCheckinOn": "已开启,代理正在检查全部关联账号。", + "notice.autoCheckinOff": "已关闭全局自动签到。", + "notice.settingsSaveUnconfirmed": "设置保存结果未确认,页面会重新同步。{detail}", + "notice.checkinSettingSaveUnconfirmed": "自动签到设置结果未确认,页面会重新同步。{detail}", + "notice.switchSuccess": "已切换到「{name}」。之后发起的新请求会使用此账号。", + "notice.switchRefreshFailed": "账号已切换,但列表暂时无法刷新。请点击“刷新列表”确认当前状态。", + "notice.switchFailed": "切换账号失败:{detail}", + "notice.deleteConfirm": "确定删除「{name}」吗?此操作会移除本机保存的该账号登录态。", + "notice.deleteSuccess": "已删除「{name}」。", + "notice.deleteRefreshFailed": "账号已删除,但列表暂时无法刷新。请点击“刷新列表”确认当前状态。", + "notice.deleteFailed": "删除账号失败:{detail}", + "notice.loginListFailed": "关联已完成,但账号列表暂时无法读取。请点击“刷新列表”确认结果。", + "notice.loginFirstActive": "关联成功。当前没有其他账号,因此已自动设为当前账号。", + "notice.loginAdded": "「{name}」关联成功,当前账号保持不变。", + "notice.loginSuccess": "关联成功,账号列表已刷新。", + "notice.loginCancelled": "登录已取消。", + "notice.loginStartFailed": "无法启动登录:{detail}", + "notice.loginTimeout": "登录超时,请确认本机代理仍在运行后重试。", + "notice.loginTaskPending": "代理尚未确认任务状态,页面会继续查询。", + "notice.loginCancelUnconfirmed": "取消请求未确认:{detail}", + "notice.loginConnectionRestored": "本机代理连接已恢复,正在同步登录状态。", + "notice.loginReadFailed": "无法读取登录状态:{detail}", + "notice.loginUnknownStatus": "代理返回了未知登录状态,正在继续查询。", + "notice.cancelFailed": "取消请求失败:{detail}", + "progress.preparing": "正在准备登录", + "progress.requestAddress": "正在向本机代理请求登录地址。", + "progress.popupOpened": "登录窗口已打开,正在获取认证地址。", + "progress.popupBlocked": "浏览器拦截了新窗口,正在获取认证地址;之后可手动打开登录页。", + "progress.inPopupTitle": "请在新窗口完成登录", + "progress.popupReady": "完成登录后,此页面会自动更新账号列表。", + "progress.popupManual": "新窗口未能打开,或已关闭登录窗口。请使用下方链接手动打开登录页。", + "progress.complete": "关联完成", + "progress.saved": "登录态已安全保存到本机账号库。", + "progress.cancelled": "登录已取消", + "progress.noChange": "没有新增或替换账号登录态。你可以重新发起关联。", + "progress.failed": "关联失败", + "progress.errorDetails": "登录失败详情:{detail}", + "progress.timeoutConfirm": "登录超时,正在确认任务状态", + "progress.cancelRequested": "已请求取消登录任务;页面会继续确认最终状态。", + "progress.readTemporarilyFailed": "暂时无法读取登录状态", + "progress.jobStillTracked": "登录任务仍在跟踪,页面会继续查询。你也可以点击取消重试。", + "progress.unknownStatus": "登录状态无法识别", + "progress.continueQuery": "页面会继续查询任务状态。你可以点击取消,或稍后重试。", + "progress.overFiveMinutes": "登录超过 5 分钟", + "progress.confirmingFinal": "仍在确认任务最终状态;可再次点击取消重试。", + "progress.cannotStart": "无法启动登录", + "progress.loginDetails": "登录错误详情:{detail}", + "progress.cancelling": "正在取消登录任务…", + "progress.cancelRetry": "任务仍在跟踪,页面会继续查询状态;你可以再次点击取消。", + "popup.title": "正在准备 CodeBuddy 登录", + "popup.body": "正在连接本机代理并准备登录页面…", + "source.details": "详情:{detail}", + "source.checkinError": "签到错误:{detail}", + "error.generic": "发生错误,请重试。", + "error.http": "请求失败(HTTP {status})。请稍后重试。", + "error.connection": "无法连接本机代理,请确认代理仍在运行后重试。", + "error.invalidSnapshot": "账号列表响应格式无效,请刷新后重试。", + "error.invalidSettings": "代理返回的设置格式无效,请重试。", + "error.invalidCheckinStatus": "代理返回的签到状态格式无效。", + "error.invalidCheckinResult": "代理返回的签到结果格式无效。", + "error.invalidAuthUrl": "代理返回的登录地址无效,请取消后重试。", + "error.invalidJob": "登录任务响应格式无效,请重试。", + "error.invalidJobId": "代理未返回有效的登录任务编号,请重试。", + "error.unknownJob": "代理返回了未知登录任务状态,请重试。", + "error.startTimeout": "本机代理准备登录超时,请确认服务仍在运行后重试。", + "error.startLogin": "无法启动登录,请重试。", + "error.loginIncomplete": "登录未能完成,请检查登录窗口后重试。", + "error.cancelNotConfirmed": "代理尚未确认取消,请稍后重试。", + "error.connectionTest": "无法读取登录状态,请重试。", + "error.cancelRetry": "请稍后重试。", + "error.accountNotFound": "未找到该账号", + "error.switchBeforeDelete": "请先切换到其他账号,再删除此账号", + "error.settingRequired": "至少需要设置一个账号管理开关", + "error.autoSwitchBoolean": "auto_switch_on_429 必须为布尔值", + "error.autoCheckinBoolean": "auto_checkin_enabled 必须为布尔值", + "error.backendValue": "backend 必须为 domestic 或 global", + "error.managerDirectory": "账号管理状态目录无效,未修改任何数据", + "error.managerFile": "账号管理状态文件无效,未修改任何数据", + "error.managerCorrupt": "账号管理状态文件损坏,未修改任何数据", + "error.managerVersion": "账号管理状态文件版本不受支持,未修改任何数据", + "error.managerSave": "无法保存账号管理状态", + "error.managerClosed": "账号管理器已关闭", + "error.tooManyJobs": "当前登录任务较多,请稍后重试", + "error.loginTimeout": "登录超时,请重新尝试", + "error.loginInvalid": "登录信息无效,请重新尝试", + "error.loginFailed": "登录失败,请稍后重新尝试", + "error.jobNotFound": "未找到该登录任务", + "error.requestRejected": "请求被拒绝", + "error.invalidRequest": "请求格式无效", + "error.adminFailed": "管理请求失败", + "error.localOnly": "仅允许本机访问管理页面", + "error.invalidHost": "管理页面 Host 无效", + "error.invalidOrigin": "管理页面 Origin 无效", + "error.crossSite": "跨站管理请求已拒绝", + "error.missingMarker": "缺少管理请求标记", + "error.requestTooLarge": "请求内容过大", + "error.invalidJson": "请求 JSON 无效", + "error.jsonObject": "请求 JSON 必须为对象", + "error.accountOrJobNotFound": "未找到请求的账号或任务", + "error.invalidParams": "请求参数无效", + "error.invalidSettingsBody": "仅接受非空布尔值账号管理设置", + "error.checkinUnavailable": "签到活动未开放", + "error.checkinStatusFailed": "签到状态查询失败", + "error.checkinRequestFailed": "签到请求失败", + "error.checkinUnconfirmed": "签到结果未确认", + "error.accountDoesNotExist": "账号不存在" + }, + en: { + "page.title": "CodeBuddy Account Manager", + "language.label": "Language", + "language.select": "Page language", + "hero.brand": "CodeBuddy · Local Proxy", + "hero.title": "Account manager", + "hero.lead": "Link, switch, and manage CodeBuddy accounts here. Credentials are stored by the local proxy; session contents are never shown on this page.", + "login.heading": "Link an account", + "login.description": "Choose the account region. The account will be saved locally after sign-in.", + "login.hint": "Sign-in opens in a new window. Complete CodeBuddy sign-in there.", + "region.group": "Choose a CodeBuddy region", + "region.domestic": "Domestic", + "region.global": "Global", + "login.associate": "Link selected region", + "login.preparingButton": "Preparing sign-in…", + "login.openManually": "Open sign-in page manually", + "button.retryAssociation": "Retry linking", + "button.cancel": "Cancel", + "button.refresh": "Refresh list", + "button.refreshAria": "Refresh account list", + "accounts.heading": "Linked accounts", + "accounts.description": "New proxy requests use the current account.", + "settings.autoSwitch.title": "Switch accounts automatically on 429", + "settings.autoSwitch.description": "Skip only same-region, same-endpoint accounts whose cooldown for this request's model is still active. Other models on the same account remain available. Try each account at most once per request. Off by default.", + "settings.autoSwitch.loading": "Loading automatic-switch setting…", + "settings.autoCheckin.title": "Automatic check-in for all accounts", + "settings.autoCheckin.description": "When enabled, the proxy checks every linked account and checks in on its Beijing-time schedule. Unknown status is never signed automatically. Turning it off cancels pending work. Off by default.", + "settings.autoCheckin.loading": "Loading automatic check-in setting…", + "footer.note": "Account management is local only. Switching affects new proxy requests; requests already in progress keep using their original account.", + "empty.loading": "Loading accounts…", + "empty.failedTitle": "Accounts are temporarily unavailable", + "empty.failedText": "Check the local proxy, then select Refresh list to try again.", + "empty.noAccountsTitle": "No linked accounts yet", + "empty.noAccountsText": "Choose Domestic or Global above and finish sign-in to add an account here.", + "account.defaultName": "CodeBuddy account", + "account.uid": "UID: {uid}", + "account.active": "Current", + "button.checkinQuery": "Check status", + "button.checkin": "Check in", + "button.activate": "Set active", + "button.delete": "Delete", + "checkin.today": "Today's check-in: {status}", + "checkin.unknown": "Unknown", + "checkin.unchecked": "Not checked in", + "checkin.checked": "Checked in", + "checkin.checking": "Checking…", + "checkin.signing": "Checking in…", + "checkin.error": "Failed", + "checkin.nextPlan": "Next planned check-in: {time} Beijing time", + "checkin.errorContext": "Error details: {detail}", + "checkin.statusNotice": "{name}: today's check-in status is {status}.", + "checkin.resultNotice": "Check-in status: {status}.", + "checkin.queryFailed": "Could not check today's status. Try again.", + "checkin.signFailed": "Check-in failed. Try again.", + "checkin.success": "Check-in succeeded.", + "cooldown.badge": "Model {model} · cooling down {time} · {source}", + "cooldown.upstream": "upstream specified", + "cooldown.default": "estimated default", + "status.switchReady": "Setting loaded from the local proxy; default cooldown: {seconds} seconds when the upstream provides no valid wait time.", + "status.checkinReady": "Automatic check-in setting loaded from the local proxy.", + "status.switchReadFailed": "Could not load the setting yet. Automatic switching stays off while the page retries.", + "status.checkinReadFailed": "Could not load the setting yet. Automatic check-in stays off while the page retries.", + "status.saving": "Saving setting…", + "status.saveUnconfirmed": "Save result is unconfirmed; reading the setting again…", + "status.switchUnconfirmed": "Could not confirm the proxy setting. The page will keep syncing periodically.", + "status.checkinUnconfirmed": "Could not confirm automatic check-in setting. The page will keep syncing periodically.", + "status.syncRecovered": "Account status synchronization has recovered.", + "status.syncFailed": "Account status could not be synced. The page will retry shortly.", + "status.syncUnavailable": "Account list could not be synced. Check the local proxy and try again.", + "notice.detail": "Details: {detail}", + "notice.checkinQueryFailed": "Could not check today's status. Try again.", + "notice.checkinSignFailed": "Check-in failed. Try again.", + "notice.checkinStatus": "{name}: today's check-in status is {status}.", + "notice.checkinSuccess": "Check-in succeeded.", + "notice.checkinResult": "Check-in status: {status}.", + "notice.autoSwitchOn": "Automatic account switching on 429 is enabled.", + "notice.autoSwitchOff": "Automatic account switching on 429 is disabled.", + "notice.autoCheckinOn": "Enabled. The proxy is checking all linked accounts.", + "notice.autoCheckinOff": "Global automatic check-in is disabled.", + "notice.settingsSaveUnconfirmed": "The setting save result is unconfirmed; the page will sync again. {detail}", + "notice.checkinSettingSaveUnconfirmed": "The automatic check-in save result is unconfirmed; the page will sync again. {detail}", + "notice.switchSuccess": "Switched to “{name}”. New requests will use this account.", + "notice.switchRefreshFailed": "The account was switched, but the list could not be refreshed. Select Refresh list to confirm.", + "notice.switchFailed": "Could not switch accounts: {detail}", + "notice.deleteConfirm": "Delete “{name}”? This removes its saved sign-in from the local proxy.", + "notice.deleteSuccess": "Deleted “{name}”.", + "notice.deleteRefreshFailed": "The account was deleted, but the list could not be refreshed. Select Refresh list to confirm.", + "notice.deleteFailed": "Could not delete the account: {detail}", + "notice.loginListFailed": "Linking completed, but the account list is unavailable. Select Refresh list to confirm.", + "notice.loginFirstActive": "Account linked. It was set as active because there were no other accounts.", + "notice.loginAdded": "“{name}” was linked. The current account was not changed.", + "notice.loginSuccess": "Account linked and list refreshed.", + "notice.loginCancelled": "Sign-in was cancelled.", + "notice.loginStartFailed": "Could not start sign-in: {detail}", + "notice.loginTimeout": "Sign-in timed out. Check that the local proxy is running and try again.", + "notice.loginTaskPending": "The proxy has not confirmed the task status yet. The page will keep checking.", + "notice.loginCancelUnconfirmed": "Cancellation is unconfirmed: {detail}", + "notice.loginConnectionRestored": "The local proxy connection is back. Syncing sign-in status.", + "notice.loginReadFailed": "Could not read sign-in status: {detail}", + "notice.loginUnknownStatus": "The proxy returned an unknown sign-in status. The page will keep checking.", + "notice.cancelFailed": "Could not cancel the task: {detail}", + "progress.preparing": "Preparing sign-in", + "progress.requestAddress": "Requesting a sign-in address from the local proxy.", + "progress.popupOpened": "The sign-in window is open. Getting the authorization address.", + "progress.popupBlocked": "The browser blocked the new window. Getting the authorization address; you can open it manually afterward.", + "progress.inPopupTitle": "Finish sign-in in the new window", + "progress.popupReady": "This page will refresh the account list when sign-in completes.", + "progress.popupManual": "The new window was blocked or closed. Use the link below to open the sign-in page manually.", + "progress.complete": "Account linked", + "progress.saved": "Sign-in was saved securely in the local account store.", + "progress.cancelled": "Sign-in cancelled", + "progress.noChange": "No sign-in was added or replaced. You can start linking again.", + "progress.failed": "Linking failed", + "progress.errorDetails": "Sign-in details: {detail}", + "progress.timeoutConfirm": "Sign-in timed out; confirming task status", + "progress.cancelRequested": "A cancellation was requested. The page will keep checking the final status.", + "progress.readTemporarilyFailed": "Sign-in status is temporarily unavailable", + "progress.jobStillTracked": "The sign-in task is still being tracked. The page will keep checking; you can also select Cancel to retry.", + "progress.unknownStatus": "Sign-in status is unrecognized", + "progress.continueQuery": "The page will keep checking the task. You can cancel or try again later.", + "progress.overFiveMinutes": "Sign-in has taken over 5 minutes", + "progress.confirmingFinal": "Still confirming the final task status. Select Cancel again to retry.", + "progress.cannotStart": "Could not start sign-in", + "progress.loginDetails": "Sign-in error details: {detail}", + "progress.cancelling": "Cancelling sign-in task…", + "progress.cancelRetry": "The task is still being tracked. The page will keep checking; you can select Cancel again.", + "popup.title": "Preparing CodeBuddy sign-in", + "popup.body": "Connecting to the local proxy and preparing the sign-in page…", + "source.details": "Details: {detail}", + "source.checkinError": "Check-in error: {detail}", + "error.generic": "An error occurred. Try again.", + "error.http": "Request failed (HTTP {status}). Try again later.", + "error.connection": "Could not connect to the local proxy. Check that it is running and try again.", + "error.invalidSnapshot": "The account list response is invalid. Refresh and try again.", + "error.invalidSettings": "The proxy returned an invalid setting response. Try again.", + "error.invalidCheckinStatus": "The proxy returned an invalid check-in status.", + "error.invalidCheckinResult": "The proxy returned an invalid check-in result.", + "error.invalidAuthUrl": "The proxy returned an invalid sign-in address. Cancel and try again.", + "error.invalidJob": "The sign-in task response is invalid. Try again.", + "error.invalidJobId": "The proxy did not return a valid sign-in task ID. Try again.", + "error.unknownJob": "The proxy returned an unknown sign-in task status. Try again.", + "error.startTimeout": "The local proxy timed out while preparing sign-in. Check that it is running and try again.", + "error.startLogin": "Could not start sign-in. Try again.", + "error.loginIncomplete": "Sign-in did not finish. Check the sign-in window and try again.", + "error.cancelNotConfirmed": "The proxy has not confirmed cancellation. Try again shortly.", + "error.connectionTest": "Could not read sign-in status. Try again.", + "error.cancelRetry": "Try again shortly.", + "error.accountNotFound": "Account not found", + "error.switchBeforeDelete": "Switch to another account before deleting this one", + "error.settingRequired": "At least one account-management setting is required", + "error.autoSwitchBoolean": "auto_switch_on_429 must be a boolean", + "error.autoCheckinBoolean": "auto_checkin_enabled must be a boolean", + "error.backendValue": "backend must be domestic or global", + "error.managerDirectory": "The account-manager state directory is invalid; no data was changed", + "error.managerFile": "The account-manager state file is invalid; no data was changed", + "error.managerCorrupt": "The account-manager state file is corrupted; no data was changed", + "error.managerVersion": "The account-manager state file version is unsupported; no data was changed", + "error.managerSave": "Could not save account-manager state", + "error.managerClosed": "The account manager is closed", + "error.tooManyJobs": "There are too many sign-in tasks. Try again later", + "error.loginTimeout": "Sign-in timed out. Try again", + "error.loginInvalid": "Sign-in information is invalid. Try again", + "error.loginFailed": "Sign-in failed. Try again later", + "error.jobNotFound": "Sign-in task not found", + "error.requestRejected": "Request rejected", + "error.invalidRequest": "Invalid request format", + "error.adminFailed": "Account-management request failed", + "error.localOnly": "The management page is available only from this computer", + "error.invalidHost": "Invalid management-page Host", + "error.invalidOrigin": "Invalid management-page Origin", + "error.crossSite": "Cross-site management request rejected", + "error.missingMarker": "Missing management request marker", + "error.requestTooLarge": "Request body is too large", + "error.invalidJson": "Invalid request JSON", + "error.jsonObject": "Request JSON must be an object", + "error.accountOrJobNotFound": "Requested account or task not found", + "error.invalidParams": "Invalid request parameters", + "error.invalidSettingsBody": "Account settings must include at least one boolean value", + "error.checkinUnavailable": "Check-in is not available yet", + "error.checkinStatusFailed": "Could not query check-in status", + "error.checkinRequestFailed": "Check-in request failed", + "error.checkinUnconfirmed": "Check-in result is unconfirmed", + "error.accountDoesNotExist": "Account does not exist" + } + }; + const BACKEND_ERROR_KEYS = Object.assign(Object.create(null), { + "未找到该账号": "error.accountNotFound", + "请先切换到其他账号,再删除此账号": "error.switchBeforeDelete", + "至少需要设置一个账号管理开关": "error.settingRequired", + "auto_switch_on_429 必须为布尔值": "error.autoSwitchBoolean", + "auto_checkin_enabled 必须为布尔值": "error.autoCheckinBoolean", + "backend 必须为 domestic 或 global": "error.backendValue", + "账号管理状态目录无效,未修改任何数据": "error.managerDirectory", + "账号管理状态文件无效,未修改任何数据": "error.managerFile", + "账号管理状态文件损坏,未修改任何数据": "error.managerCorrupt", + "账号管理状态文件版本不受支持,未修改任何数据": "error.managerVersion", + "无法保存账号管理状态": "error.managerSave", + "账号管理器已关闭": "error.managerClosed", + "当前登录任务较多,请稍后重试": "error.tooManyJobs", + "登录超时,请重新尝试": "error.loginTimeout", + "登录信息无效,请重新尝试": "error.loginInvalid", + "登录失败,请稍后重新尝试": "error.loginFailed", + "未找到该登录任务": "error.jobNotFound", + "请求被拒绝": "error.requestRejected", + "请求格式无效": "error.invalidRequest", + "管理请求失败": "error.adminFailed", + "仅允许本机访问管理页面": "error.localOnly", + "管理页面 Host 无效": "error.invalidHost", + "管理页面 Origin 无效": "error.invalidOrigin", + "跨站管理请求已拒绝": "error.crossSite", + "缺少管理请求标记": "error.missingMarker", + "请求内容过大": "error.requestTooLarge", + "请求 JSON 无效": "error.invalidJson", + "请求 JSON 必须为对象": "error.jsonObject", + "未找到请求的账号或任务": "error.accountOrJobNotFound", + "请求参数无效": "error.invalidParams", + "仅接受非空布尔值账号管理设置": "error.invalidSettingsBody", + "签到活动未开放": "error.checkinUnavailable", + "签到状态查询失败": "error.checkinStatusFailed", + "签到请求失败": "error.checkinRequestFailed", + "签到结果未确认": "error.checkinUnconfirmed", + "账号不存在": "error.accountDoesNotExist", + "无法连接本机代理,请确认代理仍在运行后重试。": "error.connection", + "账号列表响应格式无效,请刷新后重试。": "error.invalidSnapshot", + "代理返回的设置格式无效,请重试。": "error.invalidSettings", + "代理返回的签到状态格式无效。": "error.invalidCheckinStatus", + "代理返回的签到结果格式无效。": "error.invalidCheckinResult", + "代理返回的登录地址无效,请取消后重试。": "error.invalidAuthUrl", + "登录任务响应格式无效,请重试。": "error.invalidJob", + "代理未返回有效的登录任务编号,请重试。": "error.invalidJobId", + "代理返回了未知登录任务状态,请重试。": "error.unknownJob", + "本机代理准备登录超时,请确认服务仍在运行后重试。": "error.startTimeout", + "无法启动登录,请重试。": "error.startLogin", + "登录未能完成,请检查登录窗口后重试。": "error.loginIncomplete", + "代理尚未确认取消,请稍后重试。": "error.cancelNotConfirmed", + "无法读取登录状态,请重试。": "error.connectionTest", + "请稍后重试。": "error.cancelRetry" + }); + + function detectInitialLanguage() { + try { + const saved = window.localStorage && window.localStorage.getItem(LANGUAGE_STORAGE_KEY); + if (saved === "zh-CN" || saved === "en") return saved; + } catch (_) { /* Storage can be disabled by browser policy. */ } + try { + const navigatorInfo = window.navigator || (typeof navigator !== "undefined" ? navigator : null); + const languages = navigatorInfo && Array.isArray(navigatorInfo.languages) && navigatorInfo.languages.length + ? navigatorInfo.languages + : navigatorInfo && navigatorInfo.language ? [navigatorInfo.language] : []; + if (!languages.length) return "zh-CN"; + return String(languages[0]).toLowerCase().startsWith("zh") ? "zh-CN" : "en"; + } catch (_) { + return "zh-CN"; + } + } + const state = { + language: detectInitialLanguage(), backend: "domestic", accounts: [], activeAccountId: null, @@ -310,16 +767,23 @@

已关联账号

serverClockOffsetMs: 0, refreshTimer: null, countdownTimer: null, - cooldownElements: new Map(), + cooldownElements: [], checkinResults: new Map(), checkinAutoLookupKeys: new Set(), checkinOperations: new Map(), checkinConcurrency: 0, checkinWaiters: [], - syncFailureShown: false + syncFailureShown: false, + noticeDescriptor: null, + progressDescriptor: null, + associateButtonBusy: false, + settingsStatusDescriptor: null, + checkinSettingsStatusDescriptor: null, + syncStatusDescriptor: null }; const els = { + language: document.getElementById("language-select"), notice: document.getElementById("notice"), accountList: document.getElementById("account-list"), refresh: document.getElementById("refresh-button"), @@ -338,14 +802,129 @@

已关联账号

syncStatus: document.getElementById("sync-status") }; - function showNotice(message, kind = "info") { - els.notice.textContent = message; - els.notice.className = `notice visible ${kind}`; + function t(key, params = {}) { + const language = STRINGS[state.language] || STRINGS["zh-CN"]; + const template = Object.prototype.hasOwnProperty.call(language, key) + ? language[key] + : Object.prototype.hasOwnProperty.call(STRINGS["zh-CN"], key) ? STRINGS["zh-CN"][key] : key; + return String(template).replace(/\{([a-zA-Z0-9_]+)\}/g, (_, name) => + params[name] === undefined || params[name] === null ? "" : String(params[name]) + ); + } + + function fixedTextKey(raw) { + const value = typeof raw === "string" ? raw.trim() : ""; + const http = value.match(/^请求失败(HTTP (\d+))。请稍后重试。$/); + if (http) return { key: "error.http", params: { status: http[1] } }; + if (Object.prototype.hasOwnProperty.call(BACKEND_ERROR_KEYS, value)) return BACKEND_ERROR_KEYS[value]; + return null; + } + + function localizedRaw(raw, prefixKey = null) { + const value = typeof raw === "string" ? raw.trim().slice(0, 600) : ""; + if (!value) return t("error.generic"); + const fixed = fixedTextKey(value); + if (fixed) return typeof fixed === "string" ? t(fixed) : t(fixed.key, fixed.params); + return prefixKey ? t(prefixKey, { detail: value }) : value; + } + + function resolveParams(params = {}) { + const resolved = {}; + for (const [name, value] of Object.entries(params)) { + resolved[name] = value && typeof value === "object" && typeof value.i18nKey === "string" + ? t(value.i18nKey, value.params || {}) + : value; + } + return resolved; + } + + function renderNotice() { + const descriptor = state.noticeDescriptor; + if (!descriptor) { + els.notice.textContent = ""; + els.notice.className = "notice"; + return; + } + els.notice.textContent = descriptor.raw !== undefined + ? localizedRaw(descriptor.raw, descriptor.prefixKey) + : t(descriptor.key, resolveParams(descriptor.params)); + els.notice.className = `notice visible ${descriptor.kind}`; + } + + function showNotice(key, kind = "info", params = {}) { + state.noticeDescriptor = { key, kind, params }; + renderNotice(); + } + + function showNoticeDetail(raw, prefixKey, kind = "error") { + const fixed = fixedTextKey(raw); + if (fixed) { + if (typeof fixed === "string") showNotice(fixed, kind); + else showNotice(fixed.key, kind, fixed.params); + return; + } + state.noticeDescriptor = { raw: String(raw || ""), prefixKey, kind }; + renderNotice(); + } + + function showErrorNotice(error, prefixKey, fallbackKey = "error.generic") { + const raw = error && typeof error.message === "string" ? error.message : ""; + if (raw) showNoticeDetail(raw, prefixKey, "error"); + else showNotice(fallbackKey, "error"); } function clearNotice() { - els.notice.textContent = ""; - els.notice.className = "notice"; + state.noticeDescriptor = null; + renderNotice(); + } + + function renderSettingStatus(which) { + const descriptor = state[`${which}StatusDescriptor`]; + const element = which === "settings" ? els.settingsStatus + : which === "checkinSettings" ? els.checkinSettingsStatus : els.syncStatus; + if (!element) return; + const baseClass = which === "sync" ? "sync-status" : "settings-status"; + element.textContent = descriptor ? t(descriptor.key, descriptor.params) : ""; + element.className = `${baseClass}${descriptor && descriptor.isError ? " error" : ""}`; + if (which === "sync") element.hidden = !descriptor; + } + + function setLocalizedStatus(which, key, params = {}, isError = false) { + state[`${which}StatusDescriptor`] = key ? { key, params, isError } : null; + renderSettingStatus(which); + } + + function applyLanguage() { + const root = document.documentElement; + if (root) root.lang = state.language; + document.title = t("page.title"); + if (els.language) els.language.value = state.language; + for (const element of document.querySelectorAll("[data-i18n]")) { + const key = element.dataset && element.dataset.i18n; + if (key) element.textContent = t(key); + } + for (const element of document.querySelectorAll("[data-i18n-aria-label]")) { + const key = element.dataset && element.dataset.i18nAriaLabel; + if (key) element.setAttribute("aria-label", t(key)); + } + renderSettingStatus("settings"); + renderSettingStatus("checkinSettings"); + renderSettingStatus("sync"); + renderNotice(); + if (state.progressDescriptor) renderProgress(); + renderAssociateButton(); + renderAccounts(); + if (state.loginRun && state.loginRun.popup && !state.loginRun.authUrl) showInitialPopup(state.loginRun.popup); + } + + function setLanguage(language, persist = true) { + if (language !== "zh-CN" && language !== "en") return; + state.language = language; + if (persist) { + try { window.localStorage && window.localStorage.setItem(LANGUAGE_STORAGE_KEY, language); } + catch (_) { /* Storage can be disabled by browser policy. */ } + } + applyLanguage(); } function safeDetail(payload, fallback) { @@ -391,21 +970,29 @@

已关联账号

return payload; } - function setButtonBusy(button, busy, label) { - button.disabled = busy; - const span = button.querySelector("span"); - if (!span) return; - if (busy) { - span.dataset.originalText = span.textContent; - span.textContent = label; - const spinner = document.createElement("span"); - spinner.className = "spinner"; - spinner.setAttribute("aria-hidden", "true"); - span.prepend(spinner); - } else { - const original = span.dataset.originalText; - if (original) span.textContent = original; + function renderAssociateButton() { + if (!els.associate) return; + const span = els.associate.querySelector("span"); + if (span) { + span.replaceChildren(); + if (state.associateButtonBusy) { + const spinner = document.createElement("span"); + spinner.className = "spinner"; + spinner.setAttribute("aria-hidden", "true"); + span.append(spinner); + } + span.append(t(state.associateButtonBusy ? "login.preparingButton" : "login.associate")); } + els.associate.disabled = state.associateButtonBusy || Boolean(state.progressDescriptor && state.progressDescriptor.busy); + } + + function setButtonBusy(button, busy) { + if (button !== els.associate) { + button.disabled = busy; + return; + } + state.associateButtonBusy = busy; + renderAssociateButton(); } function makeText(tag, className, value) { @@ -424,6 +1011,42 @@

已关联账号

return button; } + function renderProgress() { + const descriptor = state.progressDescriptor; + if (!descriptor) return; + els.progress.classList.add("visible"); + els.progressTitle.textContent = t(descriptor.titleKey, resolveParams(descriptor.titleParams)); + els.progressCopy.textContent = descriptor.copyRaw !== undefined + ? localizedRaw(descriptor.copyRaw, descriptor.copyPrefixKey) + : t(descriptor.copyKey, resolveParams(descriptor.copyParams)); + els.spinner.hidden = !descriptor.busy; + els.cancel.hidden = !descriptor.cancel; + const run = state.loginRun; + els.cancel.disabled = !descriptor.cancel || Boolean(run && run.cancelInFlight); + els.retry.hidden = !descriptor.retry; + els.authLink.hidden = !descriptor.authUrl; + if (descriptor.authUrl) { + els.authLink.href = descriptor.authUrl; + } else { + els.authLink.removeAttribute("href"); + } + renderAssociateButton(); + } + + function setProgress({ titleKey, copyKey, titleParams = {}, copyParams = {}, copyRaw, copyPrefixKey, busy, retry = false, cancel = false, authUrl = null }) { + state.progressDescriptor = { titleKey, copyKey, titleParams, copyParams, copyRaw, copyPrefixKey, busy, retry, cancel, authUrl }; + renderProgress(); + } + + function setProgressCopy(copyKey, copyParams = {}, copyRaw, copyPrefixKey = null) { + if (!state.progressDescriptor) return; + state.progressDescriptor.copyKey = copyKey; + state.progressDescriptor.copyParams = copyParams; + state.progressDescriptor.copyRaw = copyRaw; + state.progressDescriptor.copyPrefixKey = copyPrefixKey; + renderProgress(); + } + function normalizeSettings(payload) { const settings = payload && typeof payload === "object" && payload.settings && typeof payload.settings === "object" ? payload.settings @@ -463,8 +1086,7 @@

已关联账号

state.autoSwitchOn429 = settings.auto_switch_on_429; state.settingsLoaded = true; els.autoSwitch.checked = state.autoSwitchOn429; - els.settingsStatus.className = "settings-status"; - els.settingsStatus.textContent = `已从本机代理读取设置;上游未提供有效等待时间时,默认冷却 ${state.defaultCooldownSeconds} 秒。`; + setLocalizedStatus("settings", "status.switchReady", { seconds: state.defaultCooldownSeconds }); applied.autoSwitch = true; } if ( @@ -478,8 +1100,7 @@

已关联账号

state.autoCheckinEnabled = settings.auto_checkin_enabled; state.checkinSettingsLoaded = true; els.autoCheckin.checked = state.autoCheckinEnabled; - els.checkinSettingsStatus.className = "settings-status"; - els.checkinSettingsStatus.textContent = "自动签到设置已从本机代理读取。"; + setLocalizedStatus("checkinSettings", "status.checkinReady"); applied.autoCheckin = true; } updateCooldownLabels(); @@ -606,7 +1227,7 @@

已关联账号

updateCheckin(account.id, result, today); return result; }).catch((error) => { - const failed = updateCheckin(account.id, { date: today, status: "error", checked: null, error: error.message || "查询签到状态失败。" }, today); + const failed = updateCheckin(account.id, { date: today, status: "error", checked: null, error: error.message || "签到状态查询失败" }, today); return failed; }).finally(() => { if (state.checkinOperations.get(key) === entry) state.checkinOperations.delete(key); @@ -633,7 +1254,7 @@

已关联账号

updateCheckin(account.id, result, today); return result; }).catch((error) => { - return updateCheckin(account.id, { date: today, status: "error", checked: null, error: error.message || "签到失败。" }, today); + return updateCheckin(account.id, { date: today, status: "error", checked: null, error: error.message || "签到请求失败" }, today); }).finally(() => { if (state.checkinOperations.get(key) === entry) state.checkinOperations.delete(key); renderAccounts(); @@ -657,73 +1278,73 @@

已关联账号

async function manuallyQueryCheckin(account) { const result = await queryCheckin(account); if (!result) return; - if (result.status === "error") showNotice(result.error || "查询签到状态失败,请重试。", "error"); - else showNotice(`「${account.nickname || account.uid || "CodeBuddy 账号"}」今日签到状态:${result.status === "checked" ? "已签到" : result.status === "unchecked" ? "未签到" : "未知"}。`, "info"); + if (result.status === "error") showNoticeDetail(result.error || "签到状态查询失败", "source.checkinError", "error"); + else showNotice("notice.checkinStatus", "info", { + name: account.nickname || account.uid || { i18nKey: "account.defaultName" }, + status: { i18nKey: `checkin.${result.status === "checked" ? "checked" : result.status === "unchecked" ? "unchecked" : "unknown"}` } + }); } async function manuallySubmitCheckin(account) { const result = await submitCheckin(account); if (!result) return; - if (result.status === "error") showNotice(result.error || "签到失败,请重试。", "error"); - else showNotice(result.status === "checked" ? "签到成功。" : `签到状态:${result.status === "unchecked" ? "未签到" : "未知"}。`, result.status === "checked" ? "success" : "info"); + if (result.status === "error") showNoticeDetail(result.error || "签到请求失败", "source.checkinError", "error"); + else if (result.status === "checked") showNotice("notice.checkinSuccess", "success"); + else showNotice("notice.checkinResult", "info", { status: { i18nKey: result.status === "unchecked" ? "checkin.unchecked" : "checkin.unknown" } }); } function updateCooldownLabels() { - const accountsById = new Map(state.accounts.map((account) => [String(account.id), account])); - for (const [accountId, badge] of state.cooldownElements) { - const account = accountsById.get(accountId); - const until = Number(account && account.cooldown_until); - const remaining = Number.isFinite(until) ? Math.ceil(until - serverNowSeconds()) : 0; - if (!account || account.rate_limited !== true || remaining <= 0) { - badge.hidden = true; - badge.textContent = ""; + for (const item of state.cooldownElements) { + const until = Number(item.cooldownUntil); + const remaining = item.rateLimited && Number.isFinite(until) ? Math.ceil(until - serverNowSeconds()) : 0; + if (remaining <= 0) { + item.badge.hidden = true; + item.badge.textContent = ""; continue; } - const source = account.cooldown_source === "retry_after" ? "上游指定" : "默认估算"; - badge.textContent = `限流冷却 ${formatCooldown(remaining)} · ${source}`; - badge.hidden = false; + const source = t(item.cooldownSource === "retry_after" ? "cooldown.upstream" : "cooldown.default"); + item.badge.textContent = t("cooldown.badge", { model: item.model, time: formatCooldown(remaining), source }); + item.badge.hidden = false; } } - function setSyncStatus(message, isError = false) { - els.syncStatus.textContent = message; - els.syncStatus.hidden = !message; - els.syncStatus.className = `sync-status${isError ? " error" : ""}`; + function setSyncStatus(key, isError = false) { + setLocalizedStatus("sync", key || null, {}, isError); } function noteSnapshotFailure(error, background) { if (background) { if (!state.syncFailureShown) { state.syncFailureShown = true; - setSyncStatus("暂时无法同步账号状态,页面会在稍后重试。", true); + setSyncStatus("status.syncFailed", true); } return; } - setSyncStatus("账号列表暂时无法同步,请检查本机代理后重试。", true); - if (error && error.message) showNotice(error.message, "error"); + setSyncStatus("status.syncUnavailable", true); + if (error && error.message) showErrorNotice(error, "notice.detail"); } function renderAccounts() { els.accountList.replaceChildren(); - state.cooldownElements.clear(); + state.cooldownElements = []; if (state.listLoading && state.accounts.length === 0) { - const loading = makeText("div", "empty", "正在读取账号列表…"); + const loading = makeText("div", "empty", t("empty.loading")); els.accountList.append(loading); return; } if (state.listError && state.accounts.length === 0) { const failed = document.createElement("div"); failed.className = "empty"; - failed.append(makeText("strong", "", "账号列表暂时无法读取")); - failed.append(makeText("span", "", "请检查本机代理连接,然后点击“刷新列表”重试。")); + failed.append(makeText("strong", "", t("empty.failedTitle"))); + failed.append(makeText("span", "", t("empty.failedText"))); els.accountList.append(failed); return; } if (state.accounts.length === 0) { const empty = document.createElement("div"); empty.className = "empty"; - empty.append(makeText("strong", "", "还没有关联账号")); - empty.append(makeText("span", "", "选择上方的国内或 Global 区域,完成登录后账号会显示在这里。")); + empty.append(makeText("strong", "", t("empty.noAccountsTitle"))); + empty.append(makeText("span", "", t("empty.noAccountsText"))); els.accountList.append(empty); return; } @@ -736,37 +1357,42 @@

已关联账号

const info = document.createElement("div"); const nameLine = document.createElement("div"); nameLine.className = "account-name-line"; - nameLine.append(makeText("span", "account-name", account.nickname || account.uid || "CodeBuddy 账号")); - const backend = account.backend === "global" ? "Global" : "国内"; + nameLine.append(makeText("span", "account-name", account.nickname || account.uid || t("account.defaultName"))); + const backend = t(account.backend === "global" ? "region.global" : "region.domestic"); nameLine.append(makeText("span", `pill ${account.backend === "global" ? "global" : "domestic"}`, backend)); - if (isActive) nameLine.append(makeText("span", "pill active-pill", "当前账号")); + if (isActive) nameLine.append(makeText("span", "pill active-pill", t("account.active"))); info.append(nameLine); const meta = document.createElement("div"); meta.className = "account-meta"; if (account.endpoint) meta.append(makeText("span", "", account.endpoint)); - if (account.uid) meta.append(makeText("span", "", `UID:${account.uid}`)); - const cooldown = makeText("span", "pill cooldown-pill", ""); - cooldown.hidden = true; - state.cooldownElements.set(String(account.id), cooldown); - meta.append(cooldown); + if (account.uid) meta.append(makeText("span", "", t("account.uid", { uid: account.uid }))); + const modelCooldowns = document.createElement("div"); + modelCooldowns.className = "model-cooldowns"; + const cooldownRows = Array.isArray(account.model_cooldowns) ? account.model_cooldowns : []; + for (const cooldown of cooldownRows) { + if (!cooldown || typeof cooldown.model !== "string" || !cooldown.model.trim()) continue; + const badge = makeText("span", "pill cooldown-pill model-cooldown", ""); + badge.hidden = true; + state.cooldownElements.push({ + badge, + model: cooldown.model, + rateLimited: cooldown.rate_limited === true, + cooldownUntil: cooldown.cooldown_until, + cooldownSource: cooldown.cooldown_source + }); + modelCooldowns.append(badge); + } + if (modelCooldowns.children.length) meta.append(modelCooldowns); info.append(meta); const checkin = checkinForAccount(account); const checkinInfo = document.createElement("div"); checkinInfo.className = "checkin-info"; - const checkinLabels = { - unknown: "未知", - unchecked: "未签到", - checked: "已签到", - checking: "查询中", - signing: "签到中", - error: "失败" - }; - const checkinState = makeText("span", `checkin-state${checkin.status === "error" ? " error" : ""}`, `今日签到:${checkinLabels[checkin.status] || "未知"}`); + const checkinState = makeText("span", `checkin-state${checkin.status === "error" ? " error" : ""}`, t("checkin.today", { status: t(`checkin.${checkin.status}`) })); checkinInfo.append(checkinState); const nextPlan = formatBeijingPlan(checkin.next_checkin_at); - if (nextPlan) checkinInfo.append(makeText("span", "", `下次计划:${nextPlan}`)); - if (checkin.status === "error" && checkin.error) checkinInfo.append(makeText("span", "checkin-state error", checkin.error)); + if (nextPlan) checkinInfo.append(makeText("span", "", t("checkin.nextPlan", { time: nextPlan }))); + if (checkin.status === "error" && checkin.error) checkinInfo.append(makeText("span", "checkin-state error", localizedRaw(checkin.error, "source.checkinError"))); info.append(checkinInfo); const actions = document.createElement("div"); @@ -774,16 +1400,16 @@

已关联账号

const checkinActions = document.createElement("div"); checkinActions.className = "checkin-actions"; const isCheckinBusy = state.checkinOperations.has(checkinKey(account.id)) || checkin.status === "checking" || checkin.status === "signing"; - checkinActions.append(makeButton("查询签到", "button small", () => manuallyQueryCheckin(account))); - checkinActions.append(makeButton("签到", "button small primary", () => manuallySubmitCheckin(account))); + checkinActions.append(makeButton(t("button.checkinQuery"), "button small", () => manuallyQueryCheckin(account))); + checkinActions.append(makeButton(t("button.checkin"), "button small primary", () => manuallySubmitCheckin(account))); checkinActions.children[0].disabled = isCheckinBusy; checkinActions.children[1].disabled = isCheckinBusy || checkin.status === "checked" || checkin.checked === true; actions.append(checkinActions); if (!isActive) { const manageActions = document.createElement("div"); manageActions.className = "manage-actions"; - manageActions.append(makeButton("设为当前", "button small", () => activateAccount(account))); - manageActions.append(makeButton("删除", "button small danger", () => deleteAccount(account))); + manageActions.append(makeButton(t("button.activate"), "button small", () => activateAccount(account))); + manageActions.append(makeButton(t("button.delete"), "button small danger", () => deleteAccount(account))); actions.append(manageActions); } card.append(info, actions); @@ -825,12 +1451,12 @@

已关联账号

if (!quiet) clearNotice(); if (state.syncFailureShown) { state.syncFailureShown = false; - setSyncStatus("账号状态已恢复同步。", false); + setSyncStatus("status.syncRecovered", false); window.setTimeout(() => { - if (!state.syncFailureShown) setSyncStatus("", false); + if (!state.syncFailureShown) setSyncStatus(null, false); }, 3500); } else { - setSyncStatus("", false); + setSyncStatus(null, false); } return true; } catch (error) { @@ -838,7 +1464,7 @@

已关联账号

if (accountRevisionAtStart !== state.accountRevision) scheduleAccountRefresh(0); return false; } - if (!background) state.listError = error.message || "读取账号列表失败,请重试。"; + if (!background) state.listError = error.message || "账号列表响应格式无效,请刷新后重试。"; noteSnapshotFailure(error, background || quiet); return false; } finally { @@ -859,12 +1485,10 @@

已关联账号

return applied.autoSwitch || applied.autoCheckin; } catch (_) { if (revisionsAtStart.autoSwitch === state.settingsRevision && !state.settingsLoaded) { - els.settingsStatus.className = "settings-status error"; - els.settingsStatus.textContent = "暂时无法读取设置,自动切换保持关闭;页面会继续重试。"; + setLocalizedStatus("settings", "status.switchReadFailed", {}, true); } if (revisionsAtStart.autoCheckin === state.checkinSettingsRevision && !state.checkinSettingsLoaded) { - els.checkinSettingsStatus.className = "settings-status error"; - els.checkinSettingsStatus.textContent = "暂时无法读取设置,自动签到保持关闭;页面会继续重试。"; + setLocalizedStatus("checkinSettings", "status.checkinReadFailed", {}, true); } return false; } @@ -881,8 +1505,7 @@

已关联账号

state.autoSwitchOn429 = desired; state.settingsSaving = true; els.autoSwitch.disabled = true; - els.settingsStatus.className = "settings-status"; - els.settingsStatus.textContent = "正在保存设置…"; + setLocalizedStatus("settings", "status.saving"); try { const result = await request("/settings", { method: "PATCH", @@ -891,20 +1514,18 @@

已关联账号

}); const applied = applySettings(result, ++state.settingsReadSequence, revisionsAtStart, "autoSwitch"); if (!applied.autoSwitch) throw new Error("代理返回的设置格式无效,请重试。"); - showNotice(desired ? "已开启遇到 429 时自动切换账号。" : "已关闭遇到 429 时自动切换账号。", "success"); + showNotice(desired ? "notice.autoSwitchOn" : "notice.autoSwitchOff", "success"); } catch (error) { if (revisionsAtStart.autoSwitch === state.settingsRevision) { state.settingsSaving = false; els.autoSwitch.disabled = false; - els.settingsStatus.className = "settings-status error"; - els.settingsStatus.textContent = "保存结果未确认,正在重新读取设置…"; + setLocalizedStatus("settings", "status.saveUnconfirmed", {}, true); } - showNotice(`设置保存结果未确认,页面会重新同步。${error.message ? ` ${error.message}` : ""}`, "error"); + showNoticeDetail(error.message, "notice.settingsSaveUnconfirmed", "error"); if (revisionsAtStart.autoSwitch === state.settingsRevision) { const synced = await refreshSettings(); if (!synced && revisionsAtStart.autoSwitch === state.settingsRevision) { - els.settingsStatus.className = "settings-status error"; - els.settingsStatus.textContent = "暂时无法确认代理中的设置;页面会继续定期同步。"; + setLocalizedStatus("settings", "status.switchUnconfirmed", {}, true); } } } finally { @@ -926,8 +1547,7 @@

已关联账号

state.autoCheckinEnabled = desired; state.checkinSettingsSaving = true; els.autoCheckin.disabled = true; - els.checkinSettingsStatus.className = "settings-status"; - els.checkinSettingsStatus.textContent = "正在保存设置…"; + setLocalizedStatus("checkinSettings", "status.saving"); try { const result = await request("/settings", { method: "PATCH", @@ -936,20 +1556,18 @@

已关联账号

}); const applied = applySettings(result, ++state.settingsReadSequence, revisionsAtStart, "autoCheckin"); if (!applied.autoCheckin) throw new Error("代理返回的设置格式无效,请重试。"); - showNotice(desired ? "已开启,代理正在检查全部关联账号。" : "已关闭全局自动签到。", "success"); + showNotice(desired ? "notice.autoCheckinOn" : "notice.autoCheckinOff", "success"); } catch (error) { if (revisionsAtStart.autoCheckin === state.checkinSettingsRevision) { state.checkinSettingsSaving = false; els.autoCheckin.disabled = false; - els.checkinSettingsStatus.className = "settings-status error"; - els.checkinSettingsStatus.textContent = "保存结果未确认,正在重新读取设置…"; + setLocalizedStatus("checkinSettings", "status.saveUnconfirmed", {}, true); } - showNotice(`自动签到设置结果未确认,页面会重新同步。${error.message ? ` ${error.message}` : ""}`, "error"); + showNoticeDetail(error.message, "notice.checkinSettingSaveUnconfirmed", "error"); if (revisionsAtStart.autoCheckin === state.checkinSettingsRevision) { const synced = await refreshSettings(); if (!synced && revisionsAtStart.autoCheckin === state.checkinSettingsRevision) { - els.checkinSettingsStatus.className = "settings-status error"; - els.checkinSettingsStatus.textContent = "暂时无法确认代理中的自动签到设置;页面会继续定期同步。"; + setLocalizedStatus("checkinSettings", "status.checkinUnconfirmed", {}, true); } } } finally { @@ -989,25 +1607,25 @@

已关联账号

await request(`/accounts/${encodeURIComponent(account.id)}/activate`, { method: "POST", write: true }); state.accountRevision += 1; const refreshed = await refreshAccounts(true); - if (refreshed) showNotice(`已切换到「${account.nickname || account.uid || "CodeBuddy 账号"}」。之后发起的新请求会使用此账号。`, "success"); - else showNotice("账号已切换,但列表暂时无法刷新。请点击“刷新列表”确认当前状态。", "error"); + if (refreshed) showNotice("notice.switchSuccess", "success", { name: account.nickname || account.uid || { i18nKey: "account.defaultName" } }); + else showNotice("notice.switchRefreshFailed", "error"); } catch (error) { - showNotice(error.message || "切换账号失败,请重试。", "error"); + showErrorNotice(error, "notice.switchFailed"); } } async function deleteAccount(account) { - const label = account.nickname || account.uid || "这个账号"; - if (!window.confirm(`确定删除「${label}」吗?此操作会移除本机保存的该账号登录态。`)) return; + const label = account.nickname || account.uid || { i18nKey: "account.defaultName" }; + if (!window.confirm(t("notice.deleteConfirm", resolveParams({ name: label })))) return; clearNotice(); try { await request(`/accounts/${encodeURIComponent(account.id)}`, { method: "DELETE", write: true }); state.accountRevision += 1; const refreshed = await refreshAccounts(true); - if (refreshed) showNotice(`已删除「${label}」。`, "success"); - else showNotice("账号已删除,但列表暂时无法刷新。请点击“刷新列表”确认当前状态。", "error"); + if (refreshed) showNotice("notice.deleteSuccess", "success", { name: label }); + else showNotice("notice.deleteRefreshFailed", "error"); } catch (error) { - showNotice(error.message || "删除账号失败,请重试。", "error"); + showErrorNotice(error, "notice.deleteFailed"); } } @@ -1018,24 +1636,6 @@

已关联账号

} } - function setProgress({ title, copy, busy, retry = false, cancel = false, authUrl = null }) { - els.progress.classList.add("visible"); - els.progressTitle.textContent = title; - els.progressCopy.textContent = copy; - els.spinner.hidden = !busy; - els.cancel.hidden = !cancel; - els.cancel.disabled = !cancel; - els.retry.hidden = !retry; - els.associate.disabled = busy; - els.authLink.hidden = !authUrl; - if (authUrl) { - els.authLink.href = authUrl; - els.authLink.hidden = false; - } else { - els.authLink.removeAttribute("href"); - } - } - function safeAuthUrl(value) { if (typeof value !== "string" || !value.trim()) return null; try { @@ -1058,8 +1658,8 @@

已关联账号

els.authLink.href = authUrl; els.authLink.hidden = false; setProgress({ - title: "请在新窗口完成登录", - copy: run.popup && !run.popup.closed ? "完成登录后,此页面会自动更新账号列表。" : "新窗口未能打开,或已关闭登录窗口。请使用下方链接手动打开登录页。", + titleKey: "progress.inPopupTitle", + copyKey: run.popup && !run.popup.closed ? "progress.popupReady" : "progress.popupManual", busy: true, cancel: true, authUrl @@ -1086,25 +1686,25 @@

已关联账号

const refreshed = await refreshAccounts(true); const addedAccount = job.account_id && state.accounts.find((account) => account.id === job.account_id); if (!refreshed) { - showNotice("关联已完成,但账号列表暂时无法读取。请点击“刷新列表”确认结果。", "error"); + showNotice("notice.loginListFailed", "error"); } else if (beforeActive == null && state.activeAccountId === job.account_id) { - showNotice("关联成功。当前没有其他账号,因此已自动设为当前账号。", "success"); + showNotice("notice.loginFirstActive", "success"); } else if (addedAccount) { - showNotice(`「${addedAccount.nickname || addedAccount.uid || "CodeBuddy 账号"}」关联成功,当前账号保持不变。`, "success"); + showNotice("notice.loginAdded", "success", { name: addedAccount.nickname || addedAccount.uid || { i18nKey: "account.defaultName" } }); } else { - showNotice("关联成功,账号列表已刷新。", "success"); + showNotice("notice.loginSuccess", "success"); } - setProgress({ title: "关联完成", copy: "登录态已安全保存到本机账号库。", busy: false, retry: false, cancel: false }); + setProgress({ titleKey: "progress.complete", copyKey: "progress.saved", busy: false, retry: false, cancel: false }); return; } if (job.status === "cancelled") { - setProgress({ title: "登录已取消", copy: "没有新增或替换账号登录态。你可以重新发起关联。", busy: false, retry: true, cancel: false }); - showNotice("登录已取消。", "info"); + setProgress({ titleKey: "progress.cancelled", copyKey: "progress.noChange", busy: false, retry: true, cancel: false }); + showNotice("notice.loginCancelled", "info"); return; } const detail = typeof job.error === "string" && job.error.trim() ? job.error.trim().slice(0, 600) : "登录未能完成,请检查登录窗口后重试。"; - setProgress({ title: "关联失败", copy: detail, busy: false, retry: true, cancel: false, authUrl: run.authUrl }); - showNotice(detail, "error"); + setProgress({ titleKey: "progress.failed", copyRaw: detail, copyPrefixKey: "progress.errorDetails", busy: false, retry: true, cancel: false, authUrl: run.authUrl }); + showNoticeDetail(detail, "notice.detail", "error"); } async function pollLogin(run) { @@ -1112,16 +1712,16 @@

已关联账号

while (state.loginRun === run) { if (Date.now() >= deadline && !run.timedOut) { run.timedOut = true; - setProgress({ title: "登录超时,正在确认任务状态", copy: "已请求取消登录任务;页面会继续确认最终状态。", busy: true, cancel: true, authUrl: run.authUrl }); + setProgress({ titleKey: "progress.timeoutConfirm", copyKey: "progress.cancelRequested", busy: true, cancel: true, authUrl: run.authUrl }); try { const cancelled = await requestCancel(run); if (cancelled && ["succeeded", "failed", "cancelled"].includes(cancelled.status)) { await finishLogin(run, cancelled); return; } - showNotice("代理尚未确认任务状态,页面会继续查询。", "error"); + showNotice("notice.loginTaskPending", "error"); } catch (error) { - showNotice(`取消请求未确认:${error.message || "请稍后重试。"}`, "error"); + showErrorNotice(error, "notice.loginCancelUnconfirmed"); } } let job; @@ -1129,15 +1729,15 @@

已关联账号

job = await readJob(run); if (run.readErrorShown) { run.readErrorShown = false; - showNotice("本机代理连接已恢复,正在同步登录状态。", "info"); + showNotice("notice.loginConnectionRestored", "info"); } } catch (error) { if (state.loginRun !== run) return; - setProgress({ title: "暂时无法读取登录状态", copy: "登录任务仍在跟踪,页面会继续查询。你也可以点击取消重试。", busy: true, cancel: true, authUrl: run.authUrl }); + setProgress({ titleKey: "progress.readTemporarilyFailed", copyKey: "progress.jobStillTracked", busy: true, cancel: true, authUrl: run.authUrl }); if (!run.readErrorShown) { run.readErrorShown = true; - showNotice(error.message || "无法读取登录状态,请重试。", "error"); + showErrorNotice(error, "notice.loginReadFailed"); } await new Promise((resolve) => window.setTimeout(resolve, POLL_INTERVAL_MS)); continue; @@ -1147,13 +1747,13 @@

已关联账号

return; } if (job.status !== "pending") { - setProgress({ title: "登录状态无法识别", copy: "页面会继续查询任务状态。你可以点击取消,或稍后重试。", busy: true, cancel: true, authUrl: run.authUrl }); - showNotice("代理返回了未知登录状态,正在继续查询。", "error"); + setProgress({ titleKey: "progress.unknownStatus", copyKey: "progress.continueQuery", busy: true, cancel: true, authUrl: run.authUrl }); + showNotice("notice.loginUnknownStatus", "error"); await new Promise((resolve) => window.setTimeout(resolve, POLL_INTERVAL_MS)); continue; } if (run.timedOut) { - setProgress({ title: "登录超过 5 分钟", copy: "仍在确认任务最终状态;可再次点击取消重试。", busy: true, cancel: true, authUrl: run.authUrl }); + setProgress({ titleKey: "progress.overFiveMinutes", copyKey: "progress.confirmingFinal", busy: true, cancel: true, authUrl: run.authUrl }); } await new Promise((resolve) => window.setTimeout(resolve, POLL_INTERVAL_MS)); } @@ -1173,8 +1773,8 @@

已关联账号

if (!popup) return; try { popup.opener = null; - popup.document.title = "正在准备 CodeBuddy 登录"; - popup.document.body.textContent = "正在连接本机代理并准备登录页面…"; + popup.document.title = t("popup.title"); + popup.document.body.textContent = t("popup.body"); popup.document.body.style.cssText = "font: 15px system-ui,sans-serif; color: #334155; padding: 32px; background: #f8fafc;"; } catch (_) { /* Some browsers expose a blank document only briefly. */ } } @@ -1186,10 +1786,10 @@

已关联账号

state.lastLoginBackend = backend; const popup = window.open("about:blank", "codebuddy-account-login", "popup=yes,width=560,height=760,resizable=yes,scrollbars=yes"); showInitialPopup(popup); - setButtonBusy(els.associate, true, "正在准备登录…"); + setButtonBusy(els.associate, true); setProgress({ - title: "正在准备登录", - copy: popup ? "登录窗口已打开,正在获取认证地址。" : "浏览器拦截了新窗口,正在获取认证地址;之后可手动打开登录页。", + titleKey: "progress.preparing", + copyKey: popup ? "progress.popupOpened" : "progress.popupBlocked", busy: true, cancel: false }); @@ -1215,9 +1815,8 @@

已关联账号

}); if (!job || typeof job.id !== "string") throw new Error("代理未返回有效的登录任务编号,请重试。"); run.jobId = job.id; - els.cancel.hidden = false; - els.cancel.disabled = false; if (job.auth_url) movePopupToAuth(run, job.auth_url); + else setProgress({ ...state.progressDescriptor, cancel: true }); if (["succeeded", "failed", "cancelled"].includes(job.status)) await finishLogin(run, job); else if (job.status !== "pending") throw new Error("代理返回了未知登录任务状态,请重试。"); else pollLogin(run); @@ -1227,9 +1826,9 @@

已关联账号

if (popup && !popup.closed) { try { popup.close(); } catch (_) { /* Ignore a browser refusing to close it. */ } } - const message = error && error.name === "AbortError" ? "本机代理准备登录超时,请确认服务仍在运行后重试。" : (error.message || "无法启动登录,请重试。"); - setProgress({ title: "无法启动登录", copy: message, busy: false, retry: true, cancel: false }); - showNotice(message, "error"); + const message = error && error.name === "AbortError" ? "本机代理准备登录超时,请确认服务仍在运行后重试。" : (error && error.message ? error.message : "无法启动登录,请重试。"); + setProgress({ titleKey: "progress.cannotStart", copyRaw: message, copyPrefixKey: "progress.loginDetails", busy: false, retry: true, cancel: false }); + showNoticeDetail(message, "notice.loginStartFailed", "error"); } finally { window.clearTimeout(startupTimer); } @@ -1239,7 +1838,7 @@

已关联账号

const run = state.loginRun; if (!run || !run.jobId || run.cancelInFlight) return; els.cancel.disabled = true; - els.progressCopy.textContent = "正在取消登录任务…"; + setProgressCopy("progress.cancelling"); try { const job = await requestCancel(run); if (job && ["succeeded", "failed", "cancelled"].includes(job.status)) { @@ -1248,10 +1847,10 @@

已关联账号

} throw new Error("代理尚未确认取消,请稍后重试。"); } catch (error) { - showNotice(error.message || "取消请求失败,请再试一次。", "error"); + showErrorNotice(error, "notice.cancelFailed"); if (state.loginRun === run) { els.cancel.disabled = false; - els.progressCopy.textContent = "任务仍在跟踪,页面会继续查询状态;你可以再次点击取消。"; + setProgressCopy("progress.cancelRetry"); } return; } @@ -1260,6 +1859,7 @@

已关联账号

for (const button of document.querySelectorAll("[data-backend]")) { button.addEventListener("click", () => setSelectedBackend(button.dataset.backend)); } + if (els.language) els.language.addEventListener("change", () => setLanguage(els.language.value)); els.refresh.addEventListener("click", () => refreshAccounts()); els.associate.addEventListener("click", startLogin); els.cancel.addEventListener("click", cancelLogin); @@ -1271,6 +1871,7 @@

已关联账号

els.autoCheckin.addEventListener("change", saveAutoCheckinSetting); document.addEventListener("visibilitychange", handleVisibilityChange); window.setInterval(updateCooldownLabels, 1000); + applyLanguage(); (async () => { await refreshAccounts(); await refreshSettings(); diff --git a/src/codebuddy_proxy/admin_api.py b/src/codebuddy_proxy/admin_api.py index 134f7b6..9f9938e 100644 --- a/src/codebuddy_proxy/admin_api.py +++ b/src/codebuddy_proxy/admin_api.py @@ -7,6 +7,7 @@ import math import re import time +import unicodedata from datetime import date as calendar_date from importlib import resources from typing import Any, Callable @@ -34,11 +35,7 @@ "uid", "nickname", "active", - "rate_limited", - "cooldown_until", - "cooldown_remaining_seconds", - "last_rate_limited_at", - "cooldown_source", + "model_cooldowns", "checkin", ) _PUBLIC_JOB_FIELDS = ("id", "backend", "status", "auth_url", "error", "account_id") @@ -210,33 +207,8 @@ def _safe_snapshot(value: Any) -> dict[str, Any]: for key in _PUBLIC_ACCOUNT_FIELDS[:6] if key in account } - rate_limited = account.get("rate_limited") - cooldown_until = account.get("cooldown_until") - remaining = account.get("cooldown_remaining_seconds") - last_limited_at = account.get("last_rate_limited_at") - source = account.get("cooldown_source") - safe.update( - { - "rate_limited": rate_limited if type(rate_limited) is bool else False, - "cooldown_until": ( - float(cooldown_until) - if _finite_number(cooldown_until) - else None - ), - "cooldown_remaining_seconds": ( - remaining - if type(remaining) is int and remaining >= 0 - else 0 - ), - "last_rate_limited_at": ( - float(last_limited_at) - if _finite_number(last_limited_at) - else None - ), - "cooldown_source": ( - source if source in ("retry_after", "default") else None - ), - } + safe["model_cooldowns"] = _safe_model_cooldowns( + account.get("model_cooldowns") ) safe["checkin"] = _safe_checkin(account.get("checkin")) safe_accounts.append(safe) @@ -258,6 +230,62 @@ def _finite_number(value: Any) -> bool: return False +def _safe_model_name(value: Any) -> str | None: + if ( + not isinstance(value, str) + or not value + or len(value) > 256 + or not value.strip() + or any(unicodedata.category(char) in {"Cc", "Cs"} for char in value) + ): + return None + return value + + +def _safe_model_cooldowns(value: Any) -> list[dict[str, Any]]: + if not isinstance(value, list): + return [] + result = [] + for record in value: + if not isinstance(record, dict): + continue + model = _safe_model_name(record.get("model")) + if model is None: + continue + result.append( + { + "model": model, + "rate_limited": ( + record.get("rate_limited") + if type(record.get("rate_limited")) is bool + else False + ), + "cooldown_until": ( + float(record["cooldown_until"]) + if _finite_number(record.get("cooldown_until")) + else None + ), + "cooldown_remaining_seconds": ( + record["cooldown_remaining_seconds"] + if type(record.get("cooldown_remaining_seconds")) is int + and record["cooldown_remaining_seconds"] >= 0 + else 0 + ), + "last_rate_limited_at": ( + float(record["last_rate_limited_at"]) + if _finite_number(record.get("last_rate_limited_at")) + else None + ), + "cooldown_source": ( + record.get("cooldown_source") + if record.get("cooldown_source") in ("retry_after", "default") + else None + ), + } + ) + return result + + def _safe_settings(value: Any) -> dict[str, Any]: auto_switch = value.get("auto_switch_on_429") if isinstance(value, dict) else None auto_checkin = value.get("auto_checkin_enabled") if isinstance(value, dict) else None diff --git a/src/codebuddy_proxy/billing_proxy.py b/src/codebuddy_proxy/billing_proxy.py index 4ebf3f8..8b0d4de 100644 --- a/src/codebuddy_proxy/billing_proxy.py +++ b/src/codebuddy_proxy/billing_proxy.py @@ -109,11 +109,11 @@ async def forward_billing( manager = getattr(state, "account_runtime", None) if manager is not None: try: - # A check-in belongs to its original account. Select for future - # requests, but never repeat this business operation as someone else. + # Billing has no model dimension: it must neither cool down + # inference models nor change the selected account. await asyncio.to_thread( manager.handle_rate_limit, account_client, - response.headers.get("Retry-After"), + response.headers.get("Retry-After"), model=None, allow_switch=False, ) except Exception as exc: diagnostic("billing_rate_limit_record_failed", error_type=type(exc).__name__) diff --git a/test_account_checkin.py b/test_account_checkin.py index 39be0a5..39b7d33 100644 --- a/test_account_checkin.py +++ b/test_account_checkin.py @@ -49,8 +49,8 @@ def get_settings(self): def has_account(self, account_id): return account_id in self.store.clients - def handle_rate_limit(self, client, retry_after, *, allow_switch=True): - self.rate_limits.append((client.account_id, retry_after, allow_switch)) + def handle_rate_limit(self, client, retry_after, *, model=None, allow_switch=True): + self.rate_limits.append((client.account_id, retry_after, model, allow_switch)) return None @@ -407,7 +407,7 @@ async def requester(client, method, path): assert succeeded["status"] == "checked" assert post_calls == 2 assert status_calls == 4 - assert manager.rate_limits == [("acct-a", None, False)] + assert manager.rate_limits == [("acct-a", None, None, False)] await service.close() run(scenario()) @@ -821,5 +821,5 @@ async def scenario(): assert auth_options == [ ("acct-b", {"open_browser": False, "allow_login": False}) ] - assert manager.rate_limits == [("acct-b", "37", False)] + assert manager.rate_limits == [("acct-b", "37", None, False)] assert manager.active_account_id == "acct-a" diff --git a/test_account_checkin_integration.py b/test_account_checkin_integration.py index c6df73d..6c5fe4c 100644 --- a/test_account_checkin_integration.py +++ b/test_account_checkin_integration.py @@ -35,7 +35,7 @@ async def handler(request): uid = request.headers["X-User-Id"] seen.append((uid, request.url.host, request.url.path, request.method, request.content)) assert request.content == b"{}" - if request.url.path.endswith("/checkin-status"): + if request.url.path == "/v2/billing/meter/checkin-activity-status": return httpx.Response(200, json={ "code": 0, "msg": "OK", "data": {"active": True, "today_checked_in": uid in signed}, @@ -86,6 +86,75 @@ def test_checkin_of_inactive_account_preserves_active_and_uses_its_own_credentia assert "PRIVATE-" not in output +@pytest.mark.parametrize("uid", ["first", "second"], ids=["domestic", "global"]) +@pytest.mark.parametrize("entrypoint", ["admin", "v1-get", "v1-post"]) +def test_current_activity_status_reports_already_signed_without_daily_post( + checkin_environment, uid, entrypoint +): + """Legacy status may say inactive while the current activity is signed.""" + manager, store, ids, seen, _, install, _ = checkin_environment + if entrypoint != "admin": + manager.activate(ids[uid]) + active = store.active_account_id + current_payload = { + "code": 0, + "msg": "OK", + "data": { + "active": True, + "today_checked_in": True, + "streak_days": 1, + "start_time": "2026-09-30 00:00:00", + "end_time": "2026-12-31 23:59:59", + "season": 10, + }, + } + + async def activity_status(request): + seen.append((request.headers["X-User-Id"], request.url.host, + request.url.path, request.method, request.content)) + assert request.method == "POST" + assert request.content == b"{}" + if request.url.path == "/v2/billing/meter/checkin-status": + return httpx.Response(200, json={ + "code": 0, "msg": "OK", + "data": {"active": False, "today_checked_in": False, + "start_time": "", "end_time": "", "season": 0}, + }) + assert request.url.path == "/v2/billing/meter/checkin-activity-status" + return httpx.Response(200, json=current_payload) + + install(activity_status) + with app_client() as app: + if entrypoint == "admin": + result = app.get(f"/admin/api/accounts/{ids[uid]}/checkin-status") + assert result.status_code == 200 + assert result.json()["status"] == "checked" + assert result.json()["checked"] is True + assert result.json()["error"] is None + row = next(a for a in app.get("/admin/api/accounts").json()["accounts"] + if a["id"] == ids[uid]) + assert row["checkin"]["status"] == "checked" + # A manual sign request must also recognize today's existing sign. + result = app.post(f"/admin/api/accounts/{ids[uid]}/checkin", + headers=ADMIN_HEADERS) + assert result.status_code == 200 + assert result.json()["status"] == "checked" + else: + method = "GET" if entrypoint == "v1-get" else "POST" + result = app.request(method, "/v1/checkin-status") + assert result.status_code == 200 + assert result.json() == current_payload + assert store.active_account_id == active + + assert seen + assert {user for user, *_ in seen} == {uid} + expected_host = "copilot.tencent.com" if uid == "first" else "www.codebuddy.ai" + assert {host for _, host, *_ in seen} == {expected_host} + assert {path for _, _, path, *_ in seen} == { + "/v2/billing/meter/checkin-activity-status" + } + + def test_signed_account_is_not_signed_again(checkin_environment): _, _, ids, seen, signed, _, _ = checkin_environment signed.add("first") @@ -138,7 +207,7 @@ async def limited(request): assert response.json()["status"] == "error" assert store.active_account_id == active first = next(row for row in manager.snapshot()["accounts"] if row["id"] == active) - assert first["rate_limited"] is True + assert first["model_cooldowns"] == [] assert len(seen) == 1 @@ -148,7 +217,7 @@ def test_disabling_while_status_is_pending_prevents_auto_sign(checkin_environmen release_status = threading.Event() async def pending(request): - if request.url.path.endswith("/checkin-status"): + if request.url.path == "/v2/billing/meter/checkin-activity-status": status_entered.set() while not release_status.is_set(): await asyncio.sleep(0.01) diff --git a/test_account_manager.py b/test_account_manager.py index df031fb..d96a4b6 100644 --- a/test_account_manager.py +++ b/test_account_manager.py @@ -144,6 +144,13 @@ def _wait_for(manager, job_id, status): raise AssertionError(f"login did not reach {status}: {manager.get_login(job_id)}") +def _model_cooldown(account, model): + return next( + (item for item in account.get("model_cooldowns", []) if item["model"] == model), + None, + ) + + def test_login_imports_only_after_success_and_does_not_switch_existing_account(tmp_path): store = FakeStore(tmp_path) made_clients = [] @@ -367,19 +374,28 @@ def test_rate_limit_snapshot_defaults_and_runtime_state_persist_without_credenti manager.set_settings(True) before = time.time() - assert manager.handle_rate_limit(client, "invalid retry value") is None + assert manager.handle_rate_limit( + client, "invalid retry value", model="model-a" + ) is None snapshot = manager.snapshot() limited = snapshot["accounts"][0] assert snapshot["settings"]["auto_switch_on_429"] is True assert snapshot["server_time"] >= before - assert limited["rate_limited"] is True - assert limited["cooldown_source"] == "default" - assert limited["cooldown_until"] == pytest.approx(before + 60, abs=1) - assert 1 <= limited["cooldown_remaining_seconds"] <= 60 - assert limited["last_rate_limited_at"] == pytest.approx(before, abs=1) + assert "rate_limited" not in limited + assert "cooldown_until" not in limited + cooldown = _model_cooldown(limited, "model-a") + assert cooldown is not None + assert cooldown["rate_limited"] is True + assert cooldown["cooldown_source"] == "default" + assert cooldown["cooldown_until"] == pytest.approx(before + 60, abs=1) + assert 1 <= cooldown["cooldown_remaining_seconds"] <= 60 + assert cooldown["last_rate_limited_at"] == pytest.approx(before, abs=1) state_file = tmp_path / "account-manager-state-v1.json" raw_state = state_file.read_text(encoding="utf-8") + parsed_state = json.loads(raw_state) + assert parsed_state["version"] == 2 + assert parsed_state["cooldowns"][account_id]["model-a"]["source"] == "default" assert "token-rate-limited" not in raw_state assert "accessToken" not in raw_state finally: @@ -389,9 +405,13 @@ def test_rate_limit_snapshot_defaults_and_runtime_state_persist_without_credenti try: assert reopened.get_settings()["auto_switch_on_429"] is True restored = reopened.snapshot()["accounts"][0] - assert restored["rate_limited"] is True - assert restored["cooldown_source"] == "default" - assert restored["cooldown_until"] == pytest.approx(limited["cooldown_until"]) + restored_cooldown = _model_cooldown(restored, "model-a") + assert restored_cooldown is not None + assert restored_cooldown["rate_limited"] is True + assert restored_cooldown["cooldown_source"] == "default" + assert restored_cooldown["cooldown_until"] == pytest.approx( + cooldown["cooldown_until"] + ) finally: reopened.close() @@ -413,16 +433,22 @@ def test_retry_after_zero_and_http_date_are_supported_and_expire_without_poll_wr datetime.fromtimestamp(date_deadline, timezone.utc), usegmt=True ) monkeypatch.setattr("codebuddy_proxy.account_manager.time.time", lambda: fixed_now) - assert manager.handle_rate_limit(zero_client, "0") is None - assert manager.handle_rate_limit(date_client, date_value) is None + assert manager.handle_rate_limit(zero_client, "0", model="model-zero") is None + assert manager.handle_rate_limit( + date_client, date_value, model="model-date" + ) is None rows = {item["uid"]: item for item in manager.snapshot()["accounts"]} - assert rows["zero"]["rate_limited"] is False - assert rows["zero"]["cooldown_source"] is None - assert rows["zero"]["last_rate_limited_at"] == pytest.approx(fixed_now) - assert rows["date"]["rate_limited"] is True - assert rows["date"]["cooldown_source"] == "retry_after" - assert rows["date"]["cooldown_until"] == pytest.approx(date_deadline, abs=1) + zero_cooldown = _model_cooldown(rows["zero"], "model-zero") + date_cooldown = _model_cooldown(rows["date"], "model-date") + assert zero_cooldown["rate_limited"] is False + assert zero_cooldown["cooldown_source"] == "retry_after" + assert zero_cooldown["cooldown_until"] == pytest.approx(fixed_now) + assert zero_cooldown["cooldown_remaining_seconds"] == 0 + assert zero_cooldown["last_rate_limited_at"] == pytest.approx(fixed_now) + assert date_cooldown["rate_limited"] is True + assert date_cooldown["cooldown_source"] == "retry_after" + assert date_cooldown["cooldown_until"] == pytest.approx(date_deadline, abs=1) persisted_before_expiry = (tmp_path / "account-manager-state-v1.json").read_text( encoding="utf-8" @@ -431,10 +457,13 @@ def test_retry_after_zero_and_http_date_are_supported_and_expire_without_poll_wr "codebuddy_proxy.account_manager.time.time", lambda: fixed_now + 76 ) expired = {item["uid"]: item for item in manager.snapshot()["accounts"]}["date"] - assert expired["rate_limited"] is False - assert expired["cooldown_until"] is None - assert expired["cooldown_remaining_seconds"] == 0 - assert expired["last_rate_limited_at"] == pytest.approx(fixed_now) + expired_cooldown = _model_cooldown(expired, "model-date") + assert expired_cooldown is not None + assert expired_cooldown["rate_limited"] is False + assert expired_cooldown["cooldown_until"] == pytest.approx(date_deadline, abs=1) + assert expired_cooldown["cooldown_remaining_seconds"] == 0 + assert expired_cooldown["cooldown_source"] == "retry_after" + assert expired_cooldown["last_rate_limited_at"] == pytest.approx(fixed_now) assert ( tmp_path / "account-manager-state-v1.json" ).read_text(encoding="utf-8") == persisted_before_expiry @@ -454,24 +483,127 @@ def test_auto_switch_is_opt_in_region_scoped_and_respects_exclusions(tmp_path): store.import_client(other_region) manager = AccountManager(store) try: - assert manager.handle_rate_limit(original, "30") is None + assert manager.handle_rate_limit(original, "30", model="model-a") is None assert store.active_account_id == original_id manager.set_settings(True) switched = manager.handle_rate_limit( - original, "30", excluded_account_ids={excluded_id} + original, + "30", + model="model-a", + excluded_account_ids={excluded_id}, ) assert switched is candidate assert store.active_account_id == candidate_id # A delayed 429 from the old request records the longer deadline but # cannot rotate away from the account that is now active. - latest = manager.handle_rate_limit(original, "5") + latest = manager.handle_rate_limit(original, "5", model="model-a") assert latest is None assert store.active_account_id == candidate_id row = next(item for item in manager.snapshot()["accounts"] if item["id"] == original_id) - assert row["cooldown_remaining_seconds"] > 0 - assert row["cooldown_source"] == "retry_after" + cooldown = _model_cooldown(row, "model-a") + assert cooldown["cooldown_remaining_seconds"] > 0 + assert cooldown["cooldown_source"] == "retry_after" + finally: + manager.close() + + +def test_cooldowns_are_isolated_by_exact_model_and_candidate_model(tmp_path): + store = FakeStore(tmp_path) + original = StoredClient("domestic", "original") + blocked_for_model_a = StoredClient("domestic", "blocked-a") + cooled_for_model_b = StoredClient("domestic", "cooled-b") + original_id = store.import_client(original, activate=True) + blocked_id = store.import_client(blocked_for_model_a) + model_b_id = store.import_client(cooled_for_model_b) + manager = AccountManager(store) + try: + # Inactive 429s only mark their request model. The candidate cooled for + # model-b must remain eligible for a model-a failover. + manager.handle_rate_limit(blocked_for_model_a, "90", model="model-a") + manager.handle_rate_limit(cooled_for_model_b, "90", model="model-b") + manager.set_settings(True) + + switched = manager.handle_rate_limit(original, "45", model="model-a") + assert switched is cooled_for_model_b + assert store.active_account_id == model_b_id + + rows = {row["id"]: row for row in manager.snapshot()["accounts"]} + assert "rate_limited" not in rows[original_id] + assert _model_cooldown(rows[original_id], "model-a")["rate_limited"] is True + assert _model_cooldown(rows[blocked_id], "model-a")["rate_limited"] is True + assert _model_cooldown(rows[model_b_id], "model-b")["rate_limited"] is True + assert _model_cooldown(rows[model_b_id], "model-a") is None + finally: + manager.close() + + +def test_model_keys_preserve_case_and_model_less_or_invalid_events_are_noops( + tmp_path, +): + store = FakeStore(tmp_path) + client = StoredClient("domestic", "model-keys") + account_id = store.import_client(client, activate=True) + store.import_client(StoredClient("domestic", "model-keys-backup")) + manager = AccountManager(store) + try: + manager.handle_rate_limit(client, "30", model="Model-X") + manager.handle_rate_limit(client, "45", model="model-x") + manager.set_settings(True) + snapshot = manager.snapshot() + row = snapshot["accounts"][0] + assert [item["model"] for item in row["model_cooldowns"]] == [ + "Model-X", + "model-x", + ] + state_file = tmp_path / "account-manager-state-v1.json" + before = state_file.read_text(encoding="utf-8") + + for invalid_model in (None, "", " ", "bad\nmodel", "x" * 257, 7): + assert manager.handle_rate_limit( + client, "120", model=invalid_model + ) is None + + after = state_file.read_text(encoding="utf-8") + assert after == before + assert store.active_account_id == account_id + assert [ + item["model"] for item in manager.snapshot()["accounts"][0]["model_cooldowns"] + ] == ["Model-X", "model-x"] + finally: + manager.close() + + +def test_failed_model_cooldown_write_rolls_back_nested_memory_and_disk( + tmp_path, monkeypatch +): + import codebuddy_proxy.account_manager as account_manager_module + + store = FakeStore(tmp_path) + client = StoredClient("domestic", "rollback") + store.import_client(client, activate=True) + manager = AccountManager(store) + try: + manager.handle_rate_limit(client, "60", model="model-a") + state_file = tmp_path / "account-manager-state-v1.json" + original_text = state_file.read_text(encoding="utf-8") + original_deadline = _model_cooldown( + manager.snapshot()["accounts"][0], "model-a" + )["cooldown_until"] + + def failed_write(_path, _payload): + raise OSError("private runtime-state path") + + monkeypatch.setattr(account_manager_module, "_atomic_json", failed_write) + with pytest.raises(AccountManagerError) as failure: + manager.handle_rate_limit(client, "120", model="model-a") + assert failure.value.message == "无法保存账号管理状态" + + row = manager.snapshot()["accounts"][0] + assert _model_cooldown(row, "model-a")["cooldown_until"] == original_deadline + assert _model_cooldown(row, "model-b") is None + assert state_file.read_text(encoding="utf-8") == original_text finally: manager.close() @@ -490,7 +622,7 @@ def test_concurrent_429s_from_same_active_account_only_switch_once(tmp_path): def rate_limit(): barrier.wait(timeout=2) - return manager.handle_rate_limit(original, "45") + return manager.handle_rate_limit(original, "45", model="model-a") try: with ThreadPoolExecutor(max_workers=2) as executor: @@ -502,7 +634,7 @@ def rate_limit(): assert store.active_account_id == candidate_id assert store.set_active_calls.count(candidate_id) == 1 row = next(item for item in manager.snapshot()["accounts"] if item["id"] == original_id) - assert row["rate_limited"] is True + assert _model_cooldown(row, "model-a")["rate_limited"] is True finally: manager.close() @@ -528,21 +660,22 @@ def test_cooldown_max_deadline_manual_switch_and_refreshable_candidate(tmp_path, manager.set_settings(True) fixed_now = 1_800_000_000.0 monkeypatch.setattr("codebuddy_proxy.account_manager.time.time", lambda: fixed_now) - assert manager.handle_rate_limit(original, "120") is refreshable + assert manager.handle_rate_limit(original, "120", model="model-a") is refreshable assert store.active_account_id == refreshable_id # The later shorter default cooldown must not reduce the original 120s. - assert manager.handle_rate_limit(original, None) is None + assert manager.handle_rate_limit(original, None, model="model-a") is None original_row = next( item for item in manager.snapshot()["accounts"] if item["id"] == original_id ) - assert original_row["cooldown_until"] == fixed_now + 120 - assert original_row["cooldown_source"] == "retry_after" + original_cooldown = _model_cooldown(original_row, "model-a") + assert original_cooldown["cooldown_until"] == fixed_now + 120 + assert original_cooldown["cooldown_source"] == "retry_after" # Even with automation enabled, an explicit selection is preserved if # a previously active client's 429 arrives afterward. manager.activate(original_id) - assert manager.handle_rate_limit(refreshable, "10") is None + assert manager.handle_rate_limit(refreshable, "10", model="model-a") is None assert store.active_account_id == original_id finally: manager.close() @@ -556,7 +689,7 @@ def test_cooldown_is_cleared_when_account_is_deleted_and_bad_runtime_file_is_pre inactive_id = store.import_client(inactive) manager = AccountManager(store) try: - manager.handle_rate_limit(inactive, "45") + manager.handle_rate_limit(inactive, "45", model="model-a") state_file = tmp_path / "account-manager-state-v1.json" manager.delete(inactive_id) state = json.loads(state_file.read_text(encoding="utf-8")) @@ -574,6 +707,30 @@ def test_cooldown_is_cleared_when_account_is_deleted_and_bad_runtime_file_is_pre '{"version":1,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"auto_checkin_enabled":1},"cooldowns":{}}', '{"version":1,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"unexpected":false},"cooldowns":{}}', '{"version":1,"version":1,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60},"cooldowns":{}}', + '{"version":2,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"auto_checkin_enabled":false},"cooldowns":{"account-1":{"\n":{"deadline":1,"last_rate_limited_at":1,"source":"default"}}}}', + '{"version":2,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"auto_checkin_enabled":false},"cooldowns":{"account-1":{"model":{"deadline":1,"last_rate_limited_at":1,"source":"unknown"}}}}', + '{"version":2,"settings":{"auto_switch_on_429":false,"default_cooldown_seconds":60,"auto_checkin_enabled":false},"cooldowns":{"account-1":{"model":{"deadline":1,"last_rate_limited_at":1}}}}', + ) + corrupted_values += ( + json.dumps( + { + "version": 2, + "settings": { + "auto_switch_on_429": False, + "default_cooldown_seconds": 60, + "auto_checkin_enabled": False, + }, + "cooldowns": { + "account-1": { + "m" * 257: { + "deadline": 1, + "last_rate_limited_at": 1, + "source": "default", + } + } + }, + } + ), ) for corrupted in corrupted_values: state_file.write_text(corrupted, encoding="utf-8") @@ -596,7 +753,7 @@ def test_failed_cooldown_persistence_aborts_account_deletion(tmp_path, monkeypat inactive_id = store.import_client(inactive) manager = AccountManager(store) try: - manager.handle_rate_limit(inactive, "45") + manager.handle_rate_limit(inactive, "45", model="model-a") state_file = tmp_path / "account-manager-state-v1.json" original_state = state_file.read_text(encoding="utf-8") @@ -613,7 +770,7 @@ def failed_write(_path, _payload): account for account in manager.snapshot()["accounts"] if account["id"] == inactive_id ) - assert row["rate_limited"] is True + assert _model_cooldown(row, "model-a")["rate_limited"] is True assert state_file.read_text(encoding="utf-8") == original_state finally: manager.close() @@ -627,7 +784,7 @@ def test_failed_store_deletion_restores_persisted_cooldown(tmp_path, monkeypatch inactive_id = store.import_client(inactive) manager = AccountManager(store) try: - manager.handle_rate_limit(inactive, "45") + manager.handle_rate_limit(inactive, "45", model="model-a") state_file = tmp_path / "account-manager-state-v1.json" original_state = json.loads(state_file.read_text(encoding="utf-8")) @@ -643,7 +800,7 @@ def failed_delete(_account_id): account for account in manager.snapshot()["accounts"] if account["id"] == inactive_id ) - assert row["rate_limited"] is True + assert _model_cooldown(row, "model-a")["rate_limited"] is True restored_state = json.loads(state_file.read_text(encoding="utf-8")) assert restored_state["cooldowns"][inactive_id] == original_state["cooldowns"][inactive_id] finally: @@ -684,7 +841,20 @@ def test_fake_store_without_root_keeps_runtime_settings_in_memory(tmp_path): manager.close() -def test_legacy_runtime_settings_migrate_on_write_without_losing_cooldowns(tmp_path): +@pytest.mark.parametrize( + "legacy_settings", + ( + {"auto_switch_on_429": True, "default_cooldown_seconds": 60}, + { + "auto_switch_on_429": True, + "default_cooldown_seconds": 60, + "auto_checkin_enabled": False, + }, + ), +) +def test_v1_runtime_settings_migrate_on_write_and_discard_ambiguous_cooldowns( + tmp_path, legacy_settings +): store = FakeStore(tmp_path) client = StoredClient("domestic", "legacy") store.import_client(client, activate=True) @@ -694,10 +864,7 @@ def test_legacy_runtime_settings_migrate_on_write_without_losing_cooldowns(tmp_p json.dumps( { "version": 1, - "settings": { - "auto_switch_on_429": True, - "default_cooldown_seconds": 60, - }, + "settings": legacy_settings, "cooldowns": { "account-1": { "deadline": deadline, @@ -717,16 +884,19 @@ def test_legacy_runtime_settings_migrate_on_write_without_losing_cooldowns(tmp_p "default_cooldown_seconds": 60, "auto_checkin_enabled": False, } - assert manager.snapshot()["accounts"][0]["cooldown_until"] == pytest.approx(deadline) + original_text = state_path.read_text(encoding="utf-8") + assert manager.snapshot()["accounts"][0]["model_cooldowns"] == [] + assert state_path.read_text(encoding="utf-8") == original_text manager.set_settings(auto_checkin_enabled=True) persisted = json.loads(state_path.read_text(encoding="utf-8")) + assert persisted["version"] == 2 assert persisted["settings"] == { "auto_switch_on_429": True, "default_cooldown_seconds": 60, "auto_checkin_enabled": True, } - assert persisted["cooldowns"]["account-1"]["deadline"] == pytest.approx(deadline) + assert persisted["cooldowns"] == {} finally: manager.close() @@ -764,7 +934,7 @@ def failed_write(_path, _payload): manager.close() -def test_checkin_rate_limit_records_cooldown_without_switching_active(tmp_path): +def test_model_less_rate_limit_does_not_record_or_switch(tmp_path): store = FakeStore(tmp_path) checked_client = StoredClient("domestic", "checked-client") backup_client = StoredClient("domestic", "backup-client") @@ -773,16 +943,13 @@ def test_checkin_rate_limit_records_cooldown_without_switching_active(tmp_path): manager = AccountManager(store) try: manager.set_settings(True) - assert manager.handle_rate_limit( - checked_client, "45", allow_switch=False - ) is None + assert manager.handle_rate_limit(checked_client, "45") is None assert store.active_account_id == original_id row = next( account for account in manager.snapshot()["accounts"] if account["id"] == original_id ) - assert row["rate_limited"] is True - assert row["cooldown_source"] == "retry_after" + assert row["model_cooldowns"] == [] finally: manager.close() diff --git a/test_admin_api.py b/test_admin_api.py index 3f5f79b..7566400 100644 --- a/test_admin_api.py +++ b/test_admin_api.py @@ -30,11 +30,31 @@ def snapshot(self): "uid": "user-1", "nickname": "Local user", "active": True, + "model_cooldowns": [ + { + "model": "model-a", + "rate_limited": True, + "cooldown_until": 1234.5, + "cooldown_remaining_seconds": 7, + "last_rate_limited_at": 1227.5, + "cooldown_source": "retry_after", + "session": {"accessToken": "private-token-value"}, + }, + { + "model": "bad\nmodel", + "rate_limited": True, + "cooldown_source": "default", + }, + { + "model": "x" * 257, + "rate_limited": True, + "cooldown_source": "default", + }, + ], + # Previous account-wide cooldown fields must not leak into + # the public response even if a stale caller provides them. "rate_limited": True, - "cooldown_until": 1234.5, - "cooldown_remaining_seconds": 7, - "last_rate_limited_at": 1227.5, - "cooldown_source": "retry_after", + "cooldown_until": 9999.0, "checkin": { "date": "2026-10-24", "status": "checked", @@ -160,11 +180,16 @@ def test_account_and_job_responses_are_sanitized_and_uncached(): "uid": "user-1", "nickname": "Local user", "active": True, - "rate_limited": True, - "cooldown_until": 1234.5, - "cooldown_remaining_seconds": 7, - "last_rate_limited_at": 1227.5, - "cooldown_source": "retry_after", + "model_cooldowns": [ + { + "model": "model-a", + "rate_limited": True, + "cooldown_until": 1234.5, + "cooldown_remaining_seconds": 7, + "last_rate_limited_at": 1227.5, + "cooldown_source": "retry_after", + } + ], "checkin": { "date": "2026-10-24", "status": "checked", diff --git a/test_admin_ui.py b/test_admin_ui.py index de1dc4d..290d074 100644 --- a/test_admin_ui.py +++ b/test_admin_ui.py @@ -2,6 +2,7 @@ from __future__ import annotations +import json import re import shutil import subprocess @@ -34,6 +35,36 @@ def handle_data(self, data: str) -> None: self.scripts[-1] += data +class _TranslationManifestParser(HTMLParser): + """Collect real translated static nodes for the browser-free DOM harness.""" + + def __init__(self) -> None: + super().__init__() + self.nodes: list[dict[str, object]] = [] + self._stack: list[tuple[str, dict[str, object] | None]] = [] + + def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None: + attributes = {key: value or "" for key, value in attrs} + translated = any(key.startswith("data-i18n") for key in attributes) + node: dict[str, object] | None = None + if translated: + node = {"tag": tag, "attributes": attributes, "text": ""} + self.nodes.append(node) + if tag not in {"area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"}: + self._stack.append((tag, node)) + + def handle_endtag(self, tag: str) -> None: + for index in range(len(self._stack) - 1, -1, -1): + if self._stack[index][0] == tag: + del self._stack[index:] + break + + def handle_data(self, data: str) -> None: + for _, node in self._stack: + if node is not None: + node["text"] = str(node["text"]) + data + + def _inline_script() -> str: parser = _InlineScriptParser() parser.feed(ADMIN_HTML.read_text(encoding="utf-8")) @@ -45,6 +76,7 @@ def _inline_script() -> str: const assert = require('node:assert/strict'); const fs = require('node:fs'); const vm = require('node:vm'); +const translationManifest = JSON.parse(fs.readFileSync(process.argv[3], 'utf8')); class Element { constructor(tag = 'div', id = '') { @@ -56,6 +88,8 @@ class Element { this.listeners = {}; this.className = ''; this.textContent = ''; + this.value = ''; + this.lang = ''; this.hidden = false; this.disabled = false; this.href = ''; @@ -76,11 +110,15 @@ class Element { querySelector(selector) { return selector === 'span' ? this.children.find((child) => child.tagName === 'SPAN') || null : null; } + querySelectorAll(selector) { return walk(this).slice(1).filter((node) => matchesSelector(node, selector)); } setAttribute(name, value) { this.attributes[name] = String(value); if (name.startsWith('data-')) this.dataset[name.slice(5).replace(/-([a-z])/g, (_, c) => c.toUpperCase())] = String(value); + if (name === 'lang') this.lang = String(value); + if (name === 'id') this.id = String(value); } getAttribute(name) { return this.attributes[name] ?? null; } + hasAttribute(name) { return Object.hasOwn(this.attributes, name); } removeAttribute(name) { delete this.attributes[name]; } } @@ -103,34 +141,87 @@ class Element { 'notice', 'account-list', 'refresh-button', 'associate-button', 'login-progress', 'progress-title', 'progress-copy', 'progress-spinner', 'cancel-button', 'retry-button', 'manual-auth-link', 'auto-switch-toggle', 'settings-status', - 'auto-checkin-toggle', 'checkin-settings-status', 'sync-status' + 'auto-checkin-toggle', 'checkin-settings-status', 'sync-status', 'language-select' ]; - const elements = Object.fromEntries(ids.map((id) => [id, new Element(id === 'associate-button' ? 'button' : 'div', id)])); + const elements = Object.fromEntries(ids.map((id) => [id, new Element( + id === 'associate-button' ? 'button' : id === 'language-select' ? 'select' : 'div', id + )])); const label = new Element('span'); label.textContent = '关联所选区域'; elements['associate-button'].append(label); return elements; } -function makeDocument(elements) { +function makeStaticNodes(elements = {}) { + return translationManifest.map((row) => { + const element = row.attributes && row.attributes.id && elements[row.attributes.id] + ? elements[row.attributes.id] + : new Element(row.tag); + for (const [name, value] of Object.entries(row.attributes || {})) element.setAttribute(name, value); + if (!row.attributes || !row.attributes.id || !elements[row.attributes.id]) element.textContent = row.text || ''; + return element; + }); +} + +function matchesSelector(node, selector) { + if (!node || typeof node.hasAttribute !== 'function') return false; + return selector.split(',').some((part) => { + const attributeChecks = [...part.matchAll(/\[([^\]=]+)(?:=["']([^"']*)["'])?\]/g)]; + if (!attributeChecks.length) return false; + return attributeChecks.every((match) => { + const name = match[1].trim(); + const expected = match[2]; + return node.hasAttribute(name) && (expected === undefined || node.getAttribute(name) === expected); + }); + }); +} + +function makeDocument(elements, staticNodes = []) { const regions = ['domestic', 'global'].map((backend) => { const button = new Element('button'); button.dataset.backend = backend; + button.setAttribute('data-backend', backend); return button; }); const listeners = {}; + const documentElement = new Element('html'); + documentElement.lang = 'zh-CN'; + const allElements = () => [...new Set([ + ...Object.values(elements).flatMap(walk), + ...regions, + ...staticNodes, + documentElement, + ])]; return { regions, + staticNodes, + documentElement, + title: 'CodeBuddy 账号管理', visibilityState: 'visible', getElementById: (id) => elements[id] || null, - querySelectorAll: (selector) => selector === '[data-backend]' ? regions : [], + querySelectorAll: (selector) => allElements().filter((node) => matchesSelector(node, selector)), createElement: (tag) => new Element(tag), addEventListener(name, fn) { (listeners[name] ||= []).push(fn); }, async dispatch(name) { for (const fn of listeners[name] || []) await fn(); }, }; } -function makeWindow(timers, now = () => Date.now()) { +function makeStorage(initial = {}, { getThrows = false, setThrows = false } = {}) { + const values = new Map(Object.entries(initial)); + return { + values, + getItem(key) { + if (getThrows) throw new Error('storage read unavailable'); + return values.has(key) ? values.get(key) : null; + }, + setItem(key, value) { + if (setThrows) throw new Error('storage write unavailable'); + values.set(key, String(value)); + }, + }; +} + +function makeWindow(timers, now = () => Date.now(), options = {}) { const popup = { closed: false, opener: null, @@ -138,8 +229,14 @@ class Element { document: { title: '', body: { textContent: '', style: { cssText: '' } } }, close() { this.closed = true; }, }; + const localStorage = Object.hasOwn(options, 'localStorage') ? options.localStorage : makeStorage(); + const navigator = Object.hasOwn(options, 'navigator') + ? options.navigator + : { language: 'zh-CN', languages: ['zh-CN'] }; return { popup, + localStorage, + navigator, window: { location: { href: 'http://127.0.0.1:8765/admin' }, confirm: () => true, @@ -148,6 +245,8 @@ class Element { clearTimeout: timers.clearTimeout, setInterval: timers.setInterval, clearInterval: timers.clearInterval, + localStorage, + navigator, }, }; } @@ -158,8 +257,7 @@ class Element { const accountFixture = (overrides = {}) => ({ id: 'existing', backend: 'domestic', endpoint: 'https://example.test', uid: 'u1', nickname: '旧账号', - rate_limited: false, cooldown_until: null, cooldown_remaining_seconds: 0, - last_rate_limited_at: null, cooldown_source: null, + model_cooldowns: [], checkin: { date: null, status: 'unchecked', checked: false, last_checked_at: null, last_checkin_at: null, next_checkin_at: null, error: null }, ...overrides, }); @@ -177,7 +275,11 @@ class Element { function startPage(document, window, fetch, clock = Date) { const script = fs.readFileSync(process.argv[2], 'utf8'); const DateType = typeof clock === 'function' ? clock : class TestDate extends Date { static now() { return clock.now(); } }; - vm.runInNewContext(script, { document, window, fetch, Headers, URL, AbortController, Promise, Date: DateType, Error }); + vm.runInNewContext(script, { + document, window, fetch, Headers, URL, AbortController, Promise, Date: DateType, Error, + localStorage: window.localStorage, + navigator: window.navigator, + }); } async function flush() { await new Promise((resolve) => setImmediate(resolve)); } @@ -323,21 +425,24 @@ class Element { const { window } = makeWindow(timers); let nowMs = 1900000000000; let accountReads = 0; + const unsafeModel = 'model-'; + const initialModelCooldowns = [ + { model: 'model-a', rate_limited: true, cooldown_until: 1700000003, cooldown_remaining_seconds: 3, last_rate_limited_at: 1699999997, cooldown_source: 'default' }, + { model: unsafeModel, rate_limited: true, cooldown_until: 1700000008, cooldown_remaining_seconds: 8, last_rate_limited_at: 1699999990, cooldown_source: 'retry_after' }, + ]; + const refreshedModelCooldowns = [ + { model: 'model-a', rate_limited: true, cooldown_until: 1700000010, cooldown_remaining_seconds: 7, last_rate_limited_at: 1699999997, cooldown_source: 'default' }, + { model: unsafeModel, rate_limited: false, cooldown_until: null, cooldown_remaining_seconds: 0, last_rate_limited_at: 1699999990, cooldown_source: 'retry_after' }, + ]; async function fetch(url, options = {}) { const method = options.method || 'GET'; if (url.endsWith('/accounts')) { accountReads += 1; if (accountReads === 1) return jsonResponse(snapshotFixture([accountFixture()], false, 1700000000)); - const retryAccount = accountFixture({ - id: 'retry', nickname: '第二账号', uid: 'u2', rate_limited: true, - cooldown_until: 1700000008, cooldown_remaining_seconds: 8, - last_rate_limited_at: 1699999990, cooldown_source: 'retry_after' - }); - const defaultAccount = accountFixture({ - rate_limited: true, cooldown_until: 1700000003, cooldown_remaining_seconds: 3, - last_rate_limited_at: 1699999997, cooldown_source: 'default' - }); - return jsonResponse(snapshotFixture([defaultAccount, retryAccount], true, 1700000000)); + if (accountReads === 2) { + return jsonResponse(snapshotFixture([accountFixture({ model_cooldowns: initialModelCooldowns })], true, 1700000000)); + } + return jsonResponse(snapshotFixture([accountFixture({ model_cooldowns: refreshedModelCooldowns })], true, 1700000003)); } if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false)); throw new Error(`Unexpected API request: ${method} ${url}`); @@ -357,20 +462,37 @@ class Element { await flush(); assert.equal(accountReads, 2, 'returning to the page must refresh immediately'); assert.equal(elements['auto-switch-toggle'].checked, true, 'poll must pick up settings changed in another page'); - const badges = walk(elements['account-list']).filter((node) => node.className === 'pill cooldown-pill'); + let badges = walk(elements['account-list']).filter((node) => node.className.split(/\s+/).includes('model-cooldown')); assert.equal(badges.length, 2); - assert.equal(badges[0].hidden, false); - assert.match(badges[0].textContent, /00:03.*默认估算/); - assert.match(badges[1].textContent, /00:08.*上游指定/); + const modelABadge = badges.find((badge) => badge.textContent.includes('model-a')); + const unsafeModelBadge = badges.find((badge) => badge.textContent.includes(unsafeModel)); + assert.ok(modelABadge && unsafeModelBadge); + assert.equal(modelABadge.hidden, false); + assert.match(modelABadge.textContent, /冷却 00:03.*默认估算/); + assert.match(unsafeModelBadge.textContent, /冷却 00:08.*上游指定/); + assert.equal(walk(elements['account-list']).some((node) => node.tagName === 'IMG'), false, 'model names are rendered as text, never markup'); const requestsBeforeTick = accountReads; nowMs += 1000; for (const timer of timers.intervals.values()) timer.fn(); - assert.match(badges[0].textContent, /00:02/); + assert.match(modelABadge.textContent, /冷却 00:02/); + assert.match(unsafeModelBadge.textContent, /冷却 00:07/); nowMs += 3000; for (const timer of timers.intervals.values()) timer.fn(); - assert.equal(badges[0].hidden, true, 'expired cooldown badge must disappear without another fetch'); + assert.equal(modelABadge.hidden, true, 'one model badge expires independently'); + assert.equal(unsafeModelBadge.hidden, false, 'a later model cooldown remains visible'); assert.equal(accountReads, requestsBeforeTick, 'countdown ticks must not send network requests'); + + await document.dispatch('visibilitychange'); + await flush(); + badges = walk(elements['account-list']).filter((node) => node.className.split(/\s+/).includes('model-cooldown')); + assert.equal(accountReads, 3, 'a regular snapshot refresh updates cooldowns without extra requests'); + assert.equal(badges.length, 2); + assert.match(badges[0].textContent, /model-a.*冷却 00:07/); + assert.equal(badges[1].hidden, true, 'a refreshed non-limited model is hidden'); + const requestsAfterRefresh = accountReads; + for (const timer of timers.intervals.values()) timer.fn(); + assert.equal(accountReads, requestsAfterRefresh, 'refreshed one-second countdown also remains local'); } async function verifyOlderSnapshotCannotResetNewSetting() { @@ -460,6 +582,305 @@ class Element { async function flushMany(count = 8) { for (let i = 0; i < count; i += 1) await flush(); } +function makeLanguagePage(config = {}) { + const elements = makePageElements(); + const document = makeDocument(elements, makeStaticNodes(elements)); + const timers = makeTimers(); + const windowOptions = {}; + if (Object.hasOwn(config, 'localStorage')) windowOptions.localStorage = config.localStorage; + if (Object.hasOwn(config, 'navigator')) windowOptions.navigator = config.navigator; + const { window } = makeWindow(timers, () => Date.now(), windowOptions); + const fetches = []; + const accounts = config.accounts || [accountFixture()]; + const serverTime = Math.floor(Date.now() / 1000); + async function fetch(url, options = {}) { + fetches.push({ url, method: options.method || 'GET' }); + if (url.endsWith('/accounts')) return jsonResponse(snapshotFixture(accounts, false, serverTime)); + if (url.endsWith('/settings') && (options.method || 'GET') === 'GET') return jsonResponse(settingsFixture(false)); + if (url.endsWith('/checkin-status')) return jsonResponse(config.checkinStatus || { status: 'unchecked', checked: false }); + throw new Error(`Unexpected API request: ${options.method || 'GET'} ${url}`); + } + startPage(document, window, fetch); + return { elements, document, window, fetches, localStorage: window.localStorage }; +} + +function staticTranslation(document, key) { + return document.staticNodes.find((node) => node.getAttribute('data-i18n') === key); +} + +function assertEnglishShell(page) { + const { elements, document } = page; + assert.equal(elements['language-select'].value, 'en'); + assert.equal(document.documentElement.lang, 'en'); + assert.match(document.title, /CodeBuddy.*account/i); + assert.match(elements['language-select'].getAttribute('aria-label'), /language/i); + assert.equal(staticTranslation(document, 'hero.title').textContent, 'Account manager'); + assert.equal(staticTranslation(document, 'button.refresh').textContent, 'Refresh list'); + assert.equal(staticTranslation(document, 'button.refresh').getAttribute('aria-label'), 'Refresh account list'); +} + +function assertChineseShell(page) { + const { elements, document } = page; + assert.equal(elements['language-select'].value, 'zh-CN'); + assert.equal(document.documentElement.lang, 'zh-CN'); + assert.equal(document.title, 'CodeBuddy 账号管理'); + assert.equal(elements['language-select'].getAttribute('aria-label'), '页面语言'); + assert.equal(staticTranslation(document, 'hero.title').textContent, '账号管理'); + assert.equal(staticTranslation(document, 'button.refresh').textContent, '刷新列表'); + assert.equal(staticTranslation(document, 'button.refresh').getAttribute('aria-label'), '刷新账号列表'); +} + +async function verifyLanguagePreferenceAndDynamicTranslations() { + const key = 'codebuddy.admin.language'; + const storage = makeStorage({ [key]: 'en' }); + const serverTime = Math.floor(Date.now() / 1000); + const accounts = [ + accountFixture({ + id: 'existing', nickname: '账号甲', uid: 'uid-alpha', + model_cooldowns: [ + { model: 'model-alpha', rate_limited: true, cooldown_until: serverTime + 120, cooldown_remaining_seconds: 120, last_rate_limited_at: serverTime - 1, cooldown_source: 'retry_after' }, + { model: 'embedding-v2', rate_limited: true, cooldown_until: serverTime + 240, cooldown_remaining_seconds: 240, last_rate_limited_at: serverTime - 1, cooldown_source: 'default' }, + ], + checkin: { date: null, status: 'unchecked', checked: false, error: null }, + }), + accountFixture({ + id: 'closed', nickname: '签到活动账号', uid: 'uid-closed', + checkin: { date: null, status: 'error', checked: null, error: '签到活动未开放' }, + }), + accountFixture({ + id: 'unknown-error', nickname: '未知错误账号', uid: 'uid-unknown', + checkin: { date: null, status: 'error', checked: null, error: '__proto__' }, + }), + ]; + const page = makeLanguagePage({ + localStorage: storage, + navigator: { language: 'zh-CN', languages: ['zh-CN'] }, + accounts, + }); + await flushMany(12); + assertEnglishShell(page); + assert.equal(storage.getItem(key), 'en', 'saved language takes priority over browser preference'); + + const accountText = (id) => walk(findAccountCard(page.elements, id)).map((node) => node.textContent).join(' '); + const englishChecked = accountText('existing'); + assert.match(englishChecked, /Today's check-in: Not checked in/); + assert.match(englishChecked, /Model model-alpha .*cooling down .*upstream specified/); + assert.match(englishChecked, /Model embedding-v2 .*estimated default/); + assert.match(englishChecked, /账号甲/, 'account names remain user data and are not translated'); + assert.match(englishChecked, /uid-alpha/); + const englishClosed = accountText('closed'); + assert.match(englishClosed, /Check-in is not available yet/); + assert.match(accountText('unknown-error'), /__proto__/); + assert.doesNotMatch(accountText('unknown-error'), /\[object Object\]|undefined/); + + const requestCount = page.fetches.length; + const originalUrl = page.window.location.href; + page.elements['language-select'].value = 'zh-CN'; + await page.elements['language-select'].dispatch('change'); + await flushMany(); + assertChineseShell(page); + assert.equal(storage.getItem(key), 'zh-CN', 'language selection is persisted'); + assert.equal(page.fetches.length, requestCount, 'switching language must not issue API requests'); + assert.equal(page.window.location.href, originalUrl, 'switching language must not reload or navigate'); + const chineseChecked = accountText('existing'); + assert.match(chineseChecked, /今日签到:未签到/); + assert.match(chineseChecked, /模型 model-alpha · 冷却/); + assert.match(chineseChecked, /模型 embedding-v2 · 冷却/); + assert.match(accountText('closed'), /签到活动未开放/); + + const reloaded = makeLanguagePage({ + localStorage: storage, + navigator: { language: 'en-US', languages: ['en-US'] }, + accounts, + }); + await flushMany(12); + assertChineseShell(reloaded); +} + +async function verifyCheckinQueryNoticeRelocalizes() { + const account = accountFixture({ + id: 'notice-account', + nickname: '签到显示账号', + uid: 'uid-notice', + checkin: { date: null, status: 'unchecked', checked: false }, + }); + const page = makeLanguagePage({ + navigator: { language: 'zh-CN', languages: ['zh-CN'] }, + accounts: [account], + checkinStatus: { status: 'unchecked', checked: false }, + }); + await flushMany(12); + const card = findAccountCard(page.elements, 'notice-account'); + assert.ok(card, 'account card should render before querying its check-in state'); + const queryButton = checkinButtons(card).query; + assert.ok(queryButton, 'account card should expose a manual check-in query'); + await queryButton.dispatch('click'); + assert.match(page.elements.notice.textContent, /签到显示账号.*今日签到状态:未签到/); + + page.elements['language-select'].value = 'en'; + await page.elements['language-select'].dispatch('change'); + assert.match(page.elements.notice.textContent, /签到显示账号.*today's check-in status is Not checked in/i); + + page.elements['language-select'].value = 'zh-CN'; + await page.elements['language-select'].dispatch('change'); + assert.match(page.elements.notice.textContent, /签到显示账号.*今日签到状态:未签到/); +} + +async function verifyHttpErrorNoticeRelocalizes() { + const elements = makePageElements(); + const document = makeDocument(elements); + const timers = makeTimers(); + const { window } = makeWindow(timers); + window.localStorage.setItem('codebuddy.admin.language', 'en'); + const requests = []; + async function fetch(url) { + requests.push(url); + if (url.endsWith('/accounts')) return jsonResponse(null, false, 503); + if (url.endsWith('/settings')) return jsonResponse(settingsFixture()); + throw new Error(`Unexpected API request: ${url}`); + } + startPage(document, window, fetch); + await flush(); + assert.match(elements.notice.textContent, /Request failed.*503/); + elements['language-select'].value = 'zh-CN'; + await elements['language-select'].dispatch('change'); + assert.match(elements.notice.textContent, /请求失败.*503/); + elements['language-select'].value = 'en'; + await elements['language-select'].dispatch('change'); + assert.match(elements.notice.textContent, /Request failed.*503/); + assert.equal(requests.length, 2, 'language changes must not retry failed requests'); +} + +async function verifyLanguageFallbackAndUnavailableStorage() { + const key = 'codebuddy.admin.language'; + const cases = [ + { saved: '__proto__', navigator: { language: 'zh-TW', languages: ['zh-TW'] }, expected: 'zh-CN' }, + { saved: 'fr', navigator: { language: 'en-US', languages: ['en-US'] }, expected: 'en' }, + { saved: 'invalid-language', navigator: { languages: ['zh-Hans-CN'] }, expected: 'zh-CN' }, + { saved: null, navigator: { language: 'de-DE' }, expected: 'en' }, + { saved: null, navigator: undefined, expected: 'zh-CN' }, + ]; + for (const scenario of cases) { + const storage = scenario.saved === null ? makeStorage() : makeStorage({ [key]: scenario.saved }); + const page = makeLanguagePage({ localStorage: storage, navigator: scenario.navigator }); + await flushMany(10); + assert.equal(page.elements['language-select'].value, scenario.expected, `preference ${scenario.saved} should fall back correctly`); + assert.equal(page.document.documentElement.lang, scenario.expected); + } + + const failedReadStorage = makeStorage({}, { getThrows: true }); + const readFailurePage = makeLanguagePage({ + localStorage: failedReadStorage, + navigator: { language: 'en-US', languages: ['en-US'] }, + }); + await flushMany(10); + assertEnglishShell(readFailurePage); + readFailurePage.elements['language-select'].value = 'zh-CN'; + await readFailurePage.elements['language-select'].dispatch('change'); + assertChineseShell(readFailurePage); + assert.equal(failedReadStorage.values.get(key), 'zh-CN', 'a read failure must not disable later writes or switching'); + + const failedWriteStorage = makeStorage({}, { setThrows: true }); + const writeFailurePage = makeLanguagePage({ + localStorage: failedWriteStorage, + navigator: { language: 'zh-CN', languages: ['zh-CN'] }, + }); + await flushMany(10); + assertChineseShell(writeFailurePage); + writeFailurePage.elements['language-select'].value = 'en'; + await writeFailurePage.elements['language-select'].dispatch('change'); + assertEnglishShell(writeFailurePage); + + const absentStoragePage = makeLanguagePage({ + localStorage: null, + navigator: { language: 'zh-CN', languages: ['zh-CN'] }, + }); + await flushMany(10); + absentStoragePage.elements['language-select'].value = 'en'; + await absentStoragePage.elements['language-select'].dispatch('change'); + assertEnglishShell(absentStoragePage); +} + +async function verifyLanguageSwitchDuringPendingOperations() { + const elements = makePageElements(); + const document = makeDocument(elements, makeStaticNodes(elements)); + const timers = makeTimers(); + const storage = makeStorage(); + const { window, popup } = makeWindow(timers, () => Date.now(), { + localStorage: storage, + navigator: { language: 'zh-CN', languages: ['zh-CN'] }, + }); + const fetches = []; + let releaseLoginRead; + let releaseSettingsSave; + async function fetch(url, options = {}) { + const method = options.method || 'GET'; + fetches.push({ url, method }); + if (url.endsWith('/accounts')) return jsonResponse(snapshotFixture([accountFixture()], false)); + if (url.endsWith('/settings') && method === 'GET') return jsonResponse(settingsFixture(false)); + if (url.endsWith('/settings') && method === 'PATCH') { + return new Promise((resolve) => { releaseSettingsSave = () => resolve(jsonResponse(settingsFixture(true))); }); + } + if (url.endsWith('/logins') && method === 'POST') return jsonResponse({ id: 'pending-language', status: 'pending' }); + if (url.endsWith('/logins/pending-language') && method === 'GET') { + return new Promise((resolve) => { + releaseLoginRead = () => resolve(jsonResponse({ id: 'pending-language', status: 'failed', error: '模拟登录失败' })); + }); + } + throw new Error(`Unexpected API request: ${method} ${url}`); + } + startPage(document, window, fetch); + await flushMany(12); + assertChineseShell({ elements, document }); + + const loginStart = elements['associate-button'].dispatch('click'); + await flushMany(12); + await loginStart; + assert.equal(typeof releaseLoginRead, 'function', 'pending login polling must stay active'); + assert.equal(elements['associate-button'].disabled, true); + assert.equal(popup.closed, false); + + elements['auto-switch-toggle'].checked = true; + const settingsSave = elements['auto-switch-toggle'].dispatch('change'); + await flushMany(8); + assert.equal(typeof releaseSettingsSave, 'function', 'settings write must be pending'); + assert.equal(elements['auto-switch-toggle'].disabled, true); + assert.match(elements['settings-status'].textContent, /正在保存设置/); + + const requestCount = fetches.length; + elements['language-select'].value = 'en'; + await elements['language-select'].dispatch('change'); + await flushMany(); + assertEnglishShell({ elements, document }); + assert.equal(fetches.length, requestCount, 'a pending operation is not restarted by translation'); + assert.equal(window.location.href, 'http://127.0.0.1:8765/admin'); + assert.equal(elements['associate-button'].disabled, true, 'login remains busy after switching language'); + assert.equal(elements['auto-switch-toggle'].disabled, true, 'setting remains busy after switching language'); + assert.match(elements['progress-title'].textContent, /sign-in/i); + assert.match(elements['progress-copy'].textContent, /proxy|address/i); + assert.match(elements['settings-status'].textContent, /Saving setting/i); + + releaseLoginRead(); + await flushMany(12); + assert.equal(elements['associate-button'].disabled, false); + assert.equal(popup.closed, true, 'the terminal login result closes its popup normally'); + assert.match(elements['progress-title'].textContent, /Linking failed/); + assert.match(elements['progress-copy'].textContent, /模拟登录失败/); + + releaseSettingsSave(); + await settingsSave; + assert.equal(elements['auto-switch-toggle'].checked, true); + assert.equal(elements['auto-switch-toggle'].disabled, false); + assert.match(elements['settings-status'].textContent, /Setting loaded/i); + assert.match(elements.notice.textContent, /Automatic account switching on 429 is enabled/); + + elements['language-select'].value = 'zh-CN'; + await elements['language-select'].dispatch('change'); + assertChineseShell({ elements, document }); + assert.match(elements['progress-title'].textContent, /关联失败/); + assert.match(elements['notice'].textContent, /已开启遇到 429 时自动切换账号/); +} + async function verifyIndependentSettingsWrites() { const elements = makePageElements(); const document = makeDocument(elements); @@ -585,7 +1006,7 @@ class Element { assert.equal(checkinButtons(activeCard).sign.disabled, false, 'a confirmed unchecked account can be signed'); assert.equal(checkinButtons(secondCard).sign.disabled, true, 'a checked account cannot be signed again'); assert.match(walk(secondCard).map((node) => node.textContent).join(' '), /下次计划/); - assert.ok(walk(thirdCard).some((node) => node.textContent === ''), 'upstream error text must be rendered as text'); + assert.ok(walk(thirdCard).some((node) => typeof node.textContent === 'string' && node.textContent.includes('')), 'upstream error text must be rendered as text'); assert.equal(checkinButtons(thirdCard).sign.disabled, false, 'an error state remains actionable so the server can check first'); await checkinButtons(activeCard).sign.dispatch('click'); @@ -736,6 +1157,11 @@ class Element { for (const status of ['succeeded', 'cancelled', 'failed']) await verifyTerminalState(status); await verifyCancelFailureRecovery(); await verifyAutoSwitchSettings(); + await verifyLanguagePreferenceAndDynamicTranslations(); + await verifyHttpErrorNoticeRelocalizes(); + await verifyCheckinQueryNoticeRelocalizes(); + await verifyLanguageFallbackAndUnavailableStorage(); + await verifyLanguageSwitchDuringPendingOperations(); await verifyCooldownPollingAndLocalExpiry(); await verifyOlderSnapshotCannotResetNewSetting(); await verifyForegroundRefreshOwnsBusyState(); @@ -756,8 +1182,17 @@ def test_admin_inline_script_syntax_and_terminal_controls(tmp_path: Path) -> Non assert re.search(r"(?m)^\s*\[hidden\]\s*\{\s*display:\s*none\s*!important;\s*\}", html) script_path = tmp_path / "admin-page.js" script_path.write_text(_inline_script(), encoding="utf-8") + translation_parser = _TranslationManifestParser() + translation_parser.feed(html) + translations_path = tmp_path / "admin-translations.json" + translations_path.write_text(json.dumps(translation_parser.nodes), encoding="utf-8") subprocess.run([node, "--check", str(script_path)], check=True, capture_output=True, text=True) harness_path = tmp_path / "admin-page-mock.cjs" harness_path.write_text(_DOM_HARNESS, encoding="utf-8") - subprocess.run([node, str(harness_path), str(script_path)], check=True, capture_output=True, text=True) + subprocess.run( + [node, str(harness_path), str(script_path), str(translations_path)], + check=True, + capture_output=True, + text=True, + ) diff --git a/test_checkin_proxy.py b/test_checkin_proxy.py index b55103b..70555d1 100644 --- a/test_checkin_proxy.py +++ b/test_checkin_proxy.py @@ -59,8 +59,8 @@ def install(handler): @pytest.mark.parametrize("method,path,upstream_method,upstream_path", [ - ("GET", "/v1/checkin-status", "POST", "/v2/billing/meter/checkin-status"), - ("POST", "/v1/checkin-status", "POST", "/v2/billing/meter/checkin-status"), + ("GET", "/v1/checkin-status", "POST", "/v2/billing/meter/checkin-activity-status"), + ("POST", "/v1/checkin-status", "POST", "/v2/billing/meter/checkin-activity-status"), ("POST", "/v1/checkin", "POST", "/v2/billing/meter/daily-checkin"), ]) def test_forward_method_url_headers_and_raw_business_body(environment, method, path, upstream_method, upstream_path): diff --git a/test_rate_limit_proxy.py b/test_rate_limit_proxy.py index c82e77e..2bf3199 100644 --- a/test_rate_limit_proxy.py +++ b/test_rate_limit_proxy.py @@ -26,6 +26,8 @@ {"messages": [{"role": "user", "content": "hello"}], "max_tokens": 16}, ), ] +MODEL_A = "rate-limit-test" +MODEL_B = "other-model" _FUTURE_HTTP_DATE = format_datetime( datetime.now(timezone.utc) + timedelta(minutes=5), usegmt=True ) @@ -84,7 +86,23 @@ def mock_async_client(*args, **kwargs): def _request_body(path, body, stream): - return {"model": "rate-limit-test", "stream": stream, **body} + return {"model": MODEL_A, "stream": stream, **body} + + +def _request_body_for_model(model, body, stream=False): + return {"model": model, "stream": stream, **body} + + +def _model_cooldown(account, model): + for item in account.get("model_cooldowns", []): + if isinstance(item, dict) and item.get("model") == model: + return item + return None + + +def _is_model_limited(account, model): + cooldown = _model_cooldown(account, model) + return cooldown is not None and cooldown.get("rate_limited") is True def _success_response(content="recovered"): @@ -128,12 +146,14 @@ def _error_response(uid, *, status=429, retry_after="60", body=None): def test_retry_after_is_preserved_for_all_protocol_modes_with_default_off( tmp_path, monkeypatch, path, body, stream, retry_after, expected_header ): - store, manager, _, clients, account_ids = _environment( + store, manager, state, clients, account_ids = _environment( tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}], ) seen = [] + rate_limit_logs = [] + state.write_log = lambda event, **fields: rate_limit_logs.append((event, fields)) async def upstream(request): seen.append(request.headers["authorization"]) @@ -154,13 +174,23 @@ async def upstream(request): snapshot = manager.snapshot() limited = next(account for account in snapshot["accounts"] if account["uid"] == "a") assert isinstance(snapshot["server_time"], float) - assert "cooldown_until" in limited - assert isinstance(limited["cooldown_remaining_seconds"], int) - assert limited["cooldown_remaining_seconds"] >= 0 - assert limited["last_rate_limited_at"] is not None - assert limited["rate_limited"] is True - assert limited["cooldown_source"] == ("retry_after" if retry_after else "default") + cooldown = _model_cooldown(limited, MODEL_A) + assert cooldown is not None + assert "cooldown_until" in cooldown + assert isinstance(cooldown["cooldown_remaining_seconds"], int) + assert cooldown["cooldown_remaining_seconds"] >= 0 + assert cooldown["last_rate_limited_at"] is not None + assert cooldown["rate_limited"] is True + assert cooldown["cooldown_source"] == ( + "retry_after" if retry_after is not None else "default" + ) + assert "rate_limited" not in limited assert snapshot["active_account_id"] == account_ids["a"] + assert any( + fields.get("account_id") == account_ids["a"] + and fields.get("model") == MODEL_A + for _, fields in rate_limit_logs + ) assert clients["a"].session["auth"]["accessToken"] == "token-domestic-a" assert clients["b"].session["auth"]["accessToken"] == "token-domestic-b" assert len(store.list_accounts()) == 2 @@ -200,8 +230,8 @@ async def upstream(request): snapshot = manager.snapshot() by_uid = {account["uid"]: account for account in snapshot["accounts"]} assert set(by_uid) == {"a", "b"} - assert by_uid["a"]["rate_limited"] is True - assert by_uid["b"]["rate_limited"] is False + assert _is_model_limited(by_uid["a"], MODEL_A) + assert not _is_model_limited(by_uid["b"], MODEL_A) assert clients["a"].session["auth"]["accessToken"] == "token-domestic-a" assert clients["b"].session["auth"]["accessToken"] == "token-domestic-b" assert clients["a"].session_file != clients["b"].session_file @@ -247,7 +277,8 @@ async def upstream(request): assert response.status_code == 429 assert seen == [("copilot.tencent.com", "Bearer token-domestic-a")] assert manager.store.active_account_id == account_ids["a"] - assert manager.snapshot()["accounts"][0]["rate_limited"] is True + limited = manager.snapshot()["accounts"][0] + assert _is_model_limited(limited, MODEL_A) finally: manager.close() @@ -292,7 +323,10 @@ async def upstream(request): assert response.headers.get("retry-after") == retry_after_by_token[seen[-1]] assert f"limited-{uid_by_token[seen[-1]]}" in response.text assert manager.store.active_account_id in account_ids.values() - assert all(account["rate_limited"] for account in manager.snapshot()["accounts"]) + assert all( + _is_model_limited(account, MODEL_A) + for account in manager.snapshot()["accounts"] + ) finally: manager.close() @@ -307,7 +341,7 @@ def test_when_all_other_candidates_are_cooling_request_returns_original_429_once all_ids = set(account_ids.values()) for uid in ("b", "c"): manager.handle_rate_limit( - clients[uid], "300", excluded_account_ids=all_ids + clients[uid], "300", model=MODEL_A, excluded_account_ids=all_ids ) manager.store.set_active(account_ids["a"]) seen = [] @@ -328,7 +362,130 @@ async def upstream(request): assert seen == ["Bearer token-domestic-a"] assert manager.store.active_account_id == account_ids["a"] limited = {a["uid"]: a for a in manager.snapshot()["accounts"]} - assert all(limited[uid]["rate_limited"] for uid in ("a", "b", "c")) + assert all( + _is_model_limited(limited[uid], MODEL_A) for uid in ("a", "b", "c") + ) + finally: + manager.close() + + +@pytest.mark.parametrize("path,body", MODES) +@pytest.mark.parametrize("stream", [False, True], ids=["non-stream", "stream"]) +def test_same_account_model_cooldowns_are_isolated_across_all_protocol_modes( + tmp_path, monkeypatch, path, body, stream +): + _, manager, state, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}] + ) + seen = [] + logs = [] + state.write_log = lambda event, **fields: logs.append((event, fields)) + + async def upstream(request): + payload = json.loads(request.content) + model = payload["model"] + seen.append((model, request.headers["authorization"])) + if model == MODEL_A: + return _error_response("a", retry_after="90") + return _success_response("model-b-works") + + _install_transport(monkeypatch, upstream) + manager.set_settings(auto_switch_on_429=False) + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + limited = app.post( + path, + json=_request_body_for_model(MODEL_A, body, stream), + ) + recovered = app.post( + path, + json=_request_body_for_model(MODEL_B, body, stream), + ) + assert limited.status_code == 429 + assert recovered.status_code == 200 + assert "model-b-works" in recovered.text + assert seen == [ + (MODEL_A, "Bearer token-domestic-a"), + (MODEL_B, "Bearer token-domestic-a"), + ] + snapshot = manager.snapshot() + by_uid = {item["uid"]: item for item in snapshot["accounts"]} + assert _is_model_limited(by_uid["a"], MODEL_A) + assert not _is_model_limited(by_uid["a"], MODEL_B) + assert not by_uid["b"]["model_cooldowns"] + assert manager.store.active_account_id == account_ids["a"] + assert any( + fields.get("account_id") == account_ids["a"] + and fields.get("model") == MODEL_A + for _, fields in logs + ) + finally: + manager.close() + + +@pytest.mark.parametrize("candidate_cooling_model", [MODEL_A, MODEL_B]) +def test_candidate_is_excluded_only_when_requested_model_is_cooling( + tmp_path, monkeypatch, candidate_cooling_model +): + _, manager, _, clients, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}, {"uid": "c"}] + ) + manager.set_settings(auto_switch_on_429=True) + manager.handle_rate_limit( + clients["b"], "300", model=candidate_cooling_model, allow_switch=False + ) + seen = [] + + if candidate_cooling_model == MODEL_A: + requested_model = MODEL_A + expected_retry_uid = "c" + else: + requested_model = MODEL_B + # A is cooled for MODEL_A only and must remain eligible for MODEL_B. + manager.handle_rate_limit(clients["a"], "300", model=MODEL_A, allow_switch=False) + manager.store.set_active(account_ids["b"]) + expected_retry_uid = "a" + + async def upstream(request): + token = request.headers["authorization"] + seen.append(token) + if token == f"Bearer token-domestic-{expected_retry_uid}": + return _success_response("eligible-model-candidate") + return _error_response(token.rsplit("-", 1)[-1], retry_after="30") + + _install_transport(monkeypatch, upstream) + try: + body = { + "model": requested_model, + "stream": False, + "messages": [{"role": "user", "content": "model candidate"}], + } + with TestClient(proxy.app, raise_server_exceptions=False) as app: + result = app.post("/v1/chat/completions", json=body) + starting_uid = "a" if candidate_cooling_model == MODEL_A else "b" + assert result.status_code == 200 + assert "eligible-model-candidate" in result.text + assert seen == [ + f"Bearer token-domestic-{starting_uid}", + f"Bearer token-domestic-{expected_retry_uid}", + ] + assert manager.store.active_account_id == account_ids[expected_retry_uid] + finally: + manager.close() + + +def test_model_none_does_not_record_cooldown_or_switch(tmp_path, monkeypatch): + _, manager, _, clients, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}] + ) + manager.set_settings(auto_switch_on_429=True) + try: + result = manager.handle_rate_limit(clients["a"], "60", model=None) + assert result is None + assert manager.store.active_account_id == account_ids["a"] + assert all( + not account["model_cooldowns"] for account in manager.snapshot()["accounts"] + ) finally: manager.close() @@ -373,9 +530,9 @@ async def upstream(request): assert seen == ["Bearer token-domestic-a"] assert manager.store.active_account_id == account_ids["manual-global"] states = {account["uid"]: account for account in manager.snapshot()["accounts"]} - assert states["a"]["rate_limited"] is True - assert states["b"]["rate_limited"] is False - assert states["manual-global"]["rate_limited"] is False + assert _is_model_limited(states["a"], MODEL_A) + assert not _is_model_limited(states["b"], MODEL_A) + assert not _is_model_limited(states["manual-global"], MODEL_A) finally: manager.close() @@ -409,10 +566,10 @@ async def upstream(request): assert seen == [ ("POST", "copilot.tencent.com", "Bearer token-domestic-a") ] - assert manager.store.active_account_id == account_ids["b"] + assert manager.store.active_account_id == account_ids["a"] limited = {a["uid"]: a for a in manager.snapshot()["accounts"]} - assert limited["a"]["rate_limited"] is True - assert limited["b"]["rate_limited"] is False + assert limited["a"]["model_cooldowns"] == [] + assert limited["b"]["model_cooldowns"] == [] finally: manager.close() @@ -440,7 +597,7 @@ async def upstream(request): assert response.status_code == status assert seen == ["Bearer token-domestic-a"] assert manager.store.active_account_id == account_ids["a"] - assert all(not account["rate_limited"] for account in manager.snapshot()["accounts"]) + assert all(not account["model_cooldowns"] for account in manager.snapshot()["accounts"]) finally: manager.close() @@ -492,7 +649,10 @@ async def upstream(request): assert "stream-started" in response.text assert seen == ["Bearer token-domestic-a"] assert manager.store.active_account_id == account_ids["a"] - assert all(not account["rate_limited"] for account in manager.snapshot()["accounts"]) + assert all( + not account["model_cooldowns"] + for account in manager.snapshot()["accounts"] + ) finally: manager.close() @@ -553,3 +713,94 @@ async def upstream(request): finally: release_first_a.set() manager.close() + + +def test_concurrent_model_429s_keep_cooldowns_and_logs_isolated( + tmp_path, monkeypatch +): + _, manager, state, _, account_ids = _environment( + tmp_path, monkeypatch, [{"uid": "a"}, {"uid": "b"}] + ) + manager.set_settings(auto_switch_on_429=False) + entered = {MODEL_A: threading.Event(), MODEL_B: threading.Event()} + both_entered = threading.Event() + release = threading.Event() + seen = [] + logs = [] + seen_lock = threading.Lock() + logs_lock = threading.Lock() + + def record_log(event, **fields): + if event == "account_rate_limited": + with logs_lock: + logs.append(fields) + + state.write_log = record_log + + async def upstream(request): + model = json.loads(request.content)["model"] + with seen_lock: + seen.append((model, request.headers["authorization"])) + entered[model].set() + if all(event.is_set() for event in entered.values()): + both_entered.set() + await asyncio.to_thread(release.wait, 5) + retry_after = "19" if model == MODEL_A else "73" + return _error_response("a", retry_after=retry_after) + + _install_transport(monkeypatch, upstream) + body_a = { + "model": MODEL_A, + "stream": False, + "messages": [{"role": "user", "content": "parallel model A"}], + } + body_b = { + "model": MODEL_B, + "stream": False, + "messages": [{"role": "user", "content": "parallel model B"}], + } + try: + with TestClient(proxy.app, raise_server_exceptions=False) as app: + with ThreadPoolExecutor(max_workers=2) as pool: + future_a = pool.submit(app.post, "/v1/chat/completions", json=body_a) + future_b = pool.submit(app.post, "/v1/chat/completions", json=body_b) + assert both_entered.wait(5), "both model requests must reach upstream before release" + release.set() + response_a = future_a.result(timeout=10) + response_b = future_b.result(timeout=10) + + assert response_a.status_code == response_b.status_code == 429 + assert response_a.headers.get("retry-after") == "19" + assert response_b.headers.get("retry-after") == "73" + assert len(seen) == 2 + assert set(seen) == { + (MODEL_A, "Bearer token-domestic-a"), + (MODEL_B, "Bearer token-domestic-a"), + } + assert manager.store.active_account_id == account_ids["a"] + + snapshot = manager.snapshot() + by_uid = {account["uid"]: account for account in snapshot["accounts"]} + cooldowns = { + entry["model"]: entry + for entry in by_uid["a"]["model_cooldowns"] + } + assert set(cooldowns) == {MODEL_A, MODEL_B} + assert cooldowns[MODEL_A]["rate_limited"] is True + assert cooldowns[MODEL_B]["rate_limited"] is True + assert cooldowns[MODEL_A]["cooldown_source"] == "retry_after" + assert cooldowns[MODEL_B]["cooldown_source"] == "retry_after" + # The requests are released together; the deadline gap should reflect + # the 54-second difference between their independent Retry-After values. + assert 40 <= cooldowns[MODEL_B]["cooldown_until"] - cooldowns[MODEL_A]["cooldown_until"] <= 68 + assert not by_uid["b"]["model_cooldowns"] + assert len(logs) == 2 + assert { + (entry.get("account_id"), entry.get("model")) for entry in logs + } == { + (account_ids["a"], MODEL_A), + (account_ids["a"], MODEL_B), + } + finally: + release.set() + manager.close() From aa6ea67fad28e08f95c6b80d39b8573cad35e086 Mon Sep 17 00:00:00 2001 From: mayer Date: Sat, 24 Oct 2026 18:45:01 +0800 Subject: [PATCH 3/3] docs: refresh account manager README and screenshot --- README.md | 31 ++++++++++++++++++------ README_zh.md | 23 ++++++++++++------ docs/images/account-manager-checkin.png | Bin 0 -> 1216362 bytes 3 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 docs/images/account-manager-checkin.png diff --git a/README.md b/README.md index b5f7648..7c23774 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,9 @@ For unexplained Windows process exits, use the [independent process monitor](doc - **DSML parsing** - Automatically detects and converts DeepSeek Markup Language (DSML) tool calls - **Streaming responses** - SSE streaming output, returning generated content in real time, with built-in 60-second timeout protection - **Domestic and international backends** - Uses domestic CodeBuddy by default and switches to the international CodeBuddy service with `--global`, with isolated sessions and model catalogs -- **Multi-account management** - Link domestic and Global accounts, switch the active account, and remove saved accounts from the local admin page +- **Multi-account management** - Link domestic and Global accounts, switch the active account, and remove non-active accounts from the local admin page +- **Model-level 429 handling** - Track cooldowns per account and model, with optional same-region failover +- **Daily check-in** - Check in manually or enable background checks for all linked accounts --- @@ -389,18 +391,31 @@ Start the proxy and open [http://127.0.0.1:8787/admin](http://127.0.0.1:8787/adm Choose **Domestic** or **Global**, then link the account in the browser window. The first linked account becomes active automatically; linking another account does not change the account currently in use. Use **Set active** to switch, or -delete a saved account from the same page. The selection is saved for the next -proxy start. The page and its management API are restricted to local access. +remove a non-active account from the same page. The selection is saved for the +next proxy start. Switching affects new requests; requests already in progress +continue with the account selected when they began. + +![Account manager with check-in controls and redacted account identifiers](docs/images/account-manager-checkin.png) + +The screenshot uses synthetic demo accounts. Account UIDs are covered, and no +credentials or session contents are shown. Accounts are kept separately by +backend, normalized endpoint, and user ID in `~/.workbuddy2api/accounts`; use +`--accounts-dir DIR` to choose another local directory. The manager remains +available before any account is linked. Its page and API are restricted to +loopback access, and API responses do not include tokens or session data. + Use the language selector at the top of the page to switch between Chinese and English. The choice is remembered in this browser; without a saved preference, the page follows the browser language. Switching languages keeps ongoing login and account operations running. -Automatic account switching after an upstream `429` is off by default. When -enabled, the proxy tries accounts with the same region and endpoint, at most once -per account for each request. It skips an account only while the model used by -that request is cooling down there; other models on the same account remain -eligible. If every eligible account returns `429`, the original `429` is returned. +Automatic account switching after an upstream HTTP `429` is off by default. +When enabled, a request can fail over only before any response has been sent, +and only to accounts with the same region and endpoint. Each account is tried +at most once per request. The proxy skips a candidate only when the request's +model is cooling down there; other models on that account remain eligible. A +missing or invalid model does not create a model cooldown or trigger failover. +If every eligible account returns `429`, the original `429` is returned. Cooldowns are tracked per account and model, using upstream `Retry-After` or a default 60 seconds when that value is missing or invalid. The setting and model cooldowns persist across restarts. Old v1 account-wide cooldowns had no model diff --git a/README_zh.md b/README_zh.md index 6c647ca..84985ea 100644 --- a/README_zh.md +++ b/README_zh.md @@ -15,7 +15,9 @@ Windows 代理无异常记录却自动退出时,使用[独立进程监控](doc - **DSML 解析** - 自动识别和转换 DeepSeek 标记语言(DSML)格式的工具调用 - **流式响应** - 支持 SSE 流式输出,实时返回生成内容,内置 60 秒超时保护 - **国内版与国际版后端** - 默认连接国内版 CodeBuddy,通过 `--global` 切换国际版,并隔离登录态和模型列表 -- **多账号管理** - 在本机管理页关联国内版和 Global 账号、切换当前账号或删除账号 +- **多账号管理** - 在本机管理页关联国内版和 Global 账号、切换当前账号或删除非当前账号 +- **模型级 429 冷却** - 按账号和模型记录冷却状态,并可选启用同区域账号自动切换 +- **每日签到** - 可手动签到,也可开启覆盖全部关联账号的后台自动检查 --- ## 安装 @@ -393,15 +395,22 @@ uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-c 启动代理后访问 [http://127.0.0.1:8787/admin](http://127.0.0.1:8787/admin),选择 **国内**或 **Global**,再在新打开的浏览器窗口中完成关联。首次关联的账号会自动设为当前账号; -之后关联其他账号不会隐式切换。可在列表中切换当前账号或删除账号,当前选择会在下次启动时恢复。 -管理页及管理 API 仅允许本机访问。 +之后关联其他账号不会隐式切换。可在列表中切换当前账号或删除非当前账号,当前选择会在下次启动时恢复。 +切换只影响之后开始的新请求;已经进行中的请求会继续使用进入时固定的账号。 + +![账号管理页面,展示签到控件并遮挡账号标识](docs/images/account-manager-checkin.png) + +截图中的账号为合成演示数据,UID 已遮挡,不包含凭据或 session 内容。账号按 backend、规范化 endpoint +和用户 ID 区分,分别保存在 `~/.workbuddy2api/accounts`;可用 `--accounts-dir DIR` 更换本机目录。 +尚未关联任何账号时,管理页也可以打开。页面和管理 API 仅允许 loopback 本机访问,API 响应不会包含 token 或 session 数据。 页面顶部可切换中文和 English,选择会保存在当前浏览器;没有保存偏好时跟随浏览器语言。 切换即时生效,不会中断进行中的登录、签到或账号操作。 -遇到上游 `429` 时自动切换账号的功能默认关闭。开启后,代理只会尝试区域和 endpoint -都相同的账号;仅当该账号的“本次请求模型”仍在冷却时才会跳过,同一账号的其他模型仍可用。 -每个请求对每个账号最多尝试一次;所有候选账号都返回 `429` 时,仍返回原始 `429`。冷却按账号和模型 -分别记录,遵循上游 `Retry-After`;该值缺失或无效时,默认冷却 60 秒。自动切换设置和模型冷却会在重启后保留。 +遇到上游 HTTP `429` 时自动切换账号的功能默认关闭。开启后,仅当尚未向客户端发送响应时才会重试, +且只会尝试区域和 endpoint 都相同的账号;每个账号在一次请求中最多尝试一次。仅当该账号的“本次请求模型”仍在冷却时才会跳过,同一账号的其他模型仍可用。 +模型名缺失或无效时不会记录模型冷却,也不会触发自动切换。 +所有候选账号都返回 `429` 时,仍返回原始 `429`。冷却按账号和模型分别记录,遵循上游 `Retry-After`; +该值缺失或无效时,默认冷却 60 秒。自动切换设置和模型冷却会在重启后保留。 旧版 v1 的整账号冷却没有模型信息,升级后不会沿用。管理页分别显示每个模型的剩余冷却时间 及其来源(`Retry-After` 或默认值),并定期同步账号状态;页面从后台重新显示时会立即同步。 diff --git a/docs/images/account-manager-checkin.png b/docs/images/account-manager-checkin.png new file mode 100644 index 0000000000000000000000000000000000000000..d0be4c003defdb51d917b7f3abac24beb14a65f1 GIT binary patch literal 1216362 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 z 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ⅇ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 z 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%0AQ?e*9DBOjL&=zQR07SlSPa0 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%0A4@HWDl`QLJ@ig7 z;`#AL;o>GW&D6yp4Z|oA3I)qUgG7cO93N_}+*WaZ8IL3XctHCkzsgYlaXd)m94-nT zJUVK?58xN6rZm_fVy%oe+}gD+z&}PplWZ$ZGCE%BpqaKkCa-6P3<_Szj-j~Z_TYu8 zG-z$fSK~~jIprW0S|qP(s{2O|Cpo*IhF}(gxYNtSN2H$)v5~t$1O(4YmtkcDwqoiH znbd<(hxb{DcAK}_1#?#zxMHbbYY-^RBDn`7q?`r~MVrL{HvrfRT8Ja2Sn!=RR*-r> zdb-@9M)-$3(dYdeR_;sfv`Zs64@>~&2(PP1_9d(YCL{1BbtBM|uFT1X{t5KYuWl~= z52zn@*0$_iV%m+c8lB>X_c8HiSRtN=@I?43brLYMlwxg~3Hif&(@*CEhDbV_873Lg z2eXH;kyL3Mnz-l!Yqd*B&^55wrJJ_lB3LG?jdC53j6MWR1EE=kG-i=ZkU5fq!Md8J_8%xhly?suo(-O~W}Y?n86 z`K=Yjc@Gv&DOpiehzdci-rNI5mvA3(g`37I7A8W1tDCVw5$oX6!)5=7=BtTwlIME* zafVW+QWGV#{VYwwc?IDnWkIPtV4)cKCJwPj{?L!Dz6P_0n0-STW0IT&p_Q1=a1E|=GX5A6@7N5QD45v%sRr>iL4IgC4ZK`9 z2LM^n{imguOadKEfgv>1Xw{P+!*jPJ2+uY|n1Mk}8~j~tgKv}egb@orhj<5E7B1RM{7}i*SZ`Yw=cBLWkzhAPo}L~igbl{wiO#7y0ZLIn zS>_@5Fo&2RP0C^kito@!>2#8h!x9KojMY zYK0C6lHlUaa{_xZ-(WKy=wxHy_}R#g{1k4Y51VM=HH8ID%CIHPOz-B%390dKYOwDuIdWB1anGp$>AhFxlqNV_OGN9Oi@7Ns$Gl|DdKFmF~e;x0oI^-^xkI1G~M4x(><7m!CY%UD8^%RXG37WJXk6s3bibN z%`KhM3_5LZx5y5xCBM`dKkk#Um##Zb^dK?N7| z@f6fka;eRWWJ4ZMDs3vLb%4@{SY#|g0T6&nzZ3)`dRqO}DN3Kv*+bmJPN_tHZ9l}v z`;C;dp~5f$i($yDb7|R&LpCLkp_@OyjMWVi_x2a0!YbUP*jSq{dI^iAMpJ@_qm>U>qiJ7n>Yd5reHI;xF4tRrEQ2No`y5zcN+||XKAmMHGf{!ru^u760^@!oQgbcOgFM!Qr#b^hWv;|l!r2xin`K^5?C3Q{rpF%o%)z4Ct#IRDeY=k_GaBMp>at=}m}STDgBX z1Z(`QSU@C>eRX8z+A33h3?2n!mA0!4GG#FBmz8&57;G-`=1&BT zp~oU35nkF7o<)Vs1$a+#7O4z%;WQ5b{3O83wp0TqzA}dEbmh~rRp9U8Lkz@4CX@ue z9a&~^)FY)Xl6g?8{2M}*uC^{XF|zp~g1|-|3k-p$${`g_stt%+brK2Id`;GdHt;FT z7@%^v(kF^&TtEb@b#!h8fI19mgpo-VBZ-mub`pV5ln} z<`xb=gK5NOMw!KG$OsXPX}}8FX&nJ&8b$-aS6L+FF0n7ctMzpPEFY&!*>PC}%i~E4ERbP;suPS0<>Zr`8r?b-3R3b4{XhO?!lih|FEx0kFEy(foCNp7bd&=k*A z79TEf3k{mB3$1FLDuCEN_2vT%! zsi`52R7CzUP-G-Z%(dzYHKz!f*uEe^4x)DGc@ZhpqJj< zL**x~u|E&6ecLJ9P?N7T0~_H2+X{I~x{uOKHZsACfm`Njhx-F+1^cnqqGfUbh#M+W z0(mT(*IP1eq3&@0GEm|wx$XN;9xyN#Ln2?0TxrwM2YXGYdZ>#Z-uhcy!+`ZQI?V-@1yPs|c zz1HJPM%`-f|H`EuDj1Z4{5&uqz0${Ettz&Qv8n2dm%4Ou`NEPnDwY_h8W+`c4i`Fb z2RTcj|EW*3UHNrYd+C~~SJ&4SL`}(k9n4W-iz=C3kORf4OzlD1jm(GAOAAq!F*4=H z|F#WtfAXLEzc{rXYp%~W+Rx0EX|Yf&X4x=9-z$Tl;u;$?0=P#Tu)j2=mA7+lB#;VO zd9_Z-lIv+7IZ^R=Q1fu)9*s0G71X;z5IC;NhJ`zQ=l^e;`v6;aJKomN=`zQ)YnE+FpSzL1z3%#s6s=aJXq9w;N^AISFP;=U_Aw=Y>!-Nvne?ww``3A%B~& zL5-ui!DL_qCB&JXKnl^U_Ynq+KbqUF@FamO&W4Qw z$R6nxRAWgOtTqIjC_pj`mTW_0xGKkI^#=BL;KRtm)EZmX0el1#VF3g^h<$)j@^Em0 z4Wr|gGeH}wo!8`-%ZLS1PSYZh;S3u@$8Z&#jg^Vk80%q&xDAA&$4&W|nV5-%`Y>CgrfXfDlI(vccTQ;an<%D#oH0(HK zX1*f{8C>k1Di>WaNe6&F{E8;d)!wL0jeEs=145oB%;elsaOa0nP1Aig?j(>zF`FReolc>cqitKEtmwv2{ zf|=ByAH3)Qt(dDOj3ACLxQIL$5I96paZcSJf=+V1xrbIlmkSAEt%*#!-0X+MNmeC;YagKxi+#A6iqJD)iY|pcLUyc$FSXIMQsJ zr-irAiXUD-FqT?GFo$LFndzSZJqY$&Zz+kMez&l7#=-qD{kLYPUcwW{1?$gBO+Lc| zofUH~a3{wZah{ZLnPd?Sm!(AC#19PXU9h9B<4|bt>0FC&@u(!D6z8VglPJ@iodxflo}s(trJubLqm}qn;&qt}K0+ z_*RbsTNJmpTy7%8YujUi^l>W`IlZrtLgckNS<{AMew(EME>Ey!WJQukez^wnmsP{f zWR)8L7{cAbtCt8llnKnR1Wfd3o@w?WGlOLsi>We~43=k&4BW_pDIKuDt zuADneYoHSLB7zGOhiLg!S8Rh3ihOkfji*`b&=N0aNaj0VRCjz6A9 z#dwP2uLwXTkr2XcR2U+VG?7HW>F=dxrl%2r1yT?q76Md-f*yE5Hjkp7g`Ij+Y``3l z5X&6`nm71Jyf?D485-skg%oRyjjcAs(qKz6Jx>2@GL$+U>;p3kj=HmD6-uMMG0p*M zWjStp1_`A|Z&RjR$IUU|ePMoFRQc|*BSM9mZS4k=3PD_H4h$*_VXTaYN( z*I+CHn&+l+8J%ehorvoMjj9aa_+{V}ieSkkRars;xifB3j0)?+0K7BOkUIomT7Y%T zY@xc3B{LqR3}Z|@19idFNxD*20_>|4*u=C+&Se@#N|GEjLOY}MuwwO89T!|l7ljUv zq!ISO^!WTVI)%1in&X$+RL5v44#43dLt z0Gp|xW?(xdoPA=+c@v#^h8?>Wfw8bn*2z{55;+GMKJ{u#Z@H^kmLhWyAqs4QQqDpk z5248m7RbXew(IPm0ze=o5BK1D7aw`5)gsB>XGxL+Gg*Q?C^kK~oS6we;NS|(unMXO zPXruL45K_Z4}}cFYex#WBeRTAm?7w5gR>zU42n|OAT(9bO1hZN>kY9UF>W-U#)&Sm zEKaz!OkbA4(9fOX$X`O=!6$OmKv2v|XzP!=m0x=xiMS|9+jkjlnr`R=2Lj8z0zX94 ziZ&92fx^;mWPb>R8Z{D-B>PC=UoGv2j%II5Pf&R?Cz}#`=f=~jQW!M&^`p4KAoTMO zw<|Z`$Dqi-IG_H-GFUR3)9lI8dAepmcYS7WlK;l%gXCAaE z$t=;g&`Cf88wIcwsdmw^S)W8poW)WESusrxfO#%5D{d;1QIS9RDkp}SGn86w zZnYU!B7Ax zU2%gZP6gweimi~9Ny=DPYnY$rkg7~_kz&m03>;b!7@l@kgEz07gRfCSnA<@AULL*TjGbKbp<@Ed9^!w+1 z+ftarb6@v$eXsAq*FejUtlTFiZb=dC$kFsz!P-(aFtJ!=wV)JR>{9Bucrb!?N2y^8 zl~5|dvud4gsrQRfTbQVbR(D1FlHQz>=R^PKX?I9yX2f<1vL;@29E}vxVlbpfx5t$O z0*6pS!hVvD1Fs4S63Z|E4garEsw3 zVNXp9tcBT^=inXG1f__IA=BOM-yt?XD1+J=T|M}KWV?!z0}&?0gE57_^>iVOExm{hmnxne~(FQR&`d>pI==Xyx<-W&Y?lTkt;XeEE7L~RFe)s9!ds(K~k`d zFq=Ux@sDv3TR`Y6SSOt$tVLu3LLW*MPvO}^iK>snyc2lZq!V!6 zMQhv=7(A>uIybe0)9*)yXN8QB4jBr_R){TkT3CV>99>lf%79%KjJA}DDfDUW5DBR@ zmSTbf_=GhwU#A%t`Ur!IzpD>qO<4u1%b})z^q-+3302=86&PoVw;}3Js; z1h!yv)>}Uh4)H3*19x|MGT7ftII{0quR5cR+?p~ z3U-?0j}<7wE|nqhO_j6i+v@KN3Nuvd#8O#DirHH_UmxGMUp*4^G@?_tpYejlz&7Ub zckWa>N|tSpX){?Ra$#6os9H@#n`?YxOwx48U0?GZ=5jRcY0}+o_6aqG1r8r0pmtE2 zQo)ikaw69WAWDnDL5;mN$2U%mO)9c0q{HC|BE@G=F~LB;)0L$yprmqlht&A!jk%N% zXbftaI9FjNy+rgavFR|XjP07>l2Z%F3Up*B%{G59vFX!Nt++{&9>!xW#lyQUhx)X z#)+KLcMmW=dwrcjss2dzpU2RHOC^*H{DuUb<{sNOPl5lx8CKS{*I|= zl8@E4DPHpjQ-|flKmPUD{vyS8KQ;qa;gV8M?;B`IunH0BJUXknc`z9>{T4GpESb?E zcyZu1^t2-?Ke1D%GNwt**a9*sviZ{a))cw*A(iopX4at;VPL@mhzdXkn1#57%B)@O znm~qReQ8+fMwOijlL0`YHvcZRgdfWk?lP7dhB6j3ax- z%5p~`){%OKOREtNQnAM?KDJjA;GzZ<6`EYkC5)c709bP1;u6hirXi6Y#vUyQmqavB zPm17;LIx%62ZTv&n?0HOxvU^lGBSy|LA7$B!N%EHhSyBcrdRt&h{t#Uk5j{IhWDeVfIRsap zh@3?3%p#0oy9>+7?CJy5-j(HxsZ0u7j1En#^EDIF_Hk-YniRg z`Rw#CNM@GMa*Lp7r6l3v4>z#K0OU!gA4CeCW)x$D#8i9H7}D-Toa&yW)zMWX#L;aq zSg6NsIF*cgYDXAf1jW1*)P)`;pCT3#(?F%L*f;VBNw7{c7r@cN#TL2^cTMXII(M)l zi{`&p6hYJIYeoDn*gx10MXWWxG`w{yATq;0kc!}Jsi9;cE}7IP#lSl|s@yg+1PO<( zbzav)Kqo9D!dw5;sAfAnzKiGnrrBzJf+tAfW;rBVNiLO?+jz-g^6oW3}HFzwznkt{p!n*jnDZU#gCd(3n)k6U@asKN<9X{!e@FmKA}MiY9+| z;qwDo>rYKdZ?;_i$IB-s-QTQxEK;xjzHsqBUaji*{N8)#&wS7KxexyR=l4rnvR;3o zZ~x(;-8)0_U;gSu&s`mFIzH8@v3m4Gom9yHV%5=u@FjsLBg$eQR~3SbB505jqDV=a z#Eu)53*%`OUpw;!K&E5|AkQt7goA5LWGK%FnZ?$M<>4G~pG66F3R5hrZ8?_1=xGq@ z5Pv3+9V~*Qg;`Q|gQT|TjS$tO2sL;Sg!N267^U<$@L3fh%`^o-N+Gm(x|*W6z^luR z3=)nYer#O5;H;9$L_l&hu8WYX92qRrZB()l6m1N=!~=3ylH^5R78@r6#0#a}Q5DU8 z5wA!5iz#(515%uFfHt5>o!HgRWeBn*@iD~U|9C{QyIGN6U2gJkE_Ti0^>Kz~PZlf5 zEi<7GTIJ$!JYec$)v(9FL8>tI@4p8U2|GB0sq(2>tAIw-=s$zVsf1%K{wE+8xwN%*f1UXw&TcJx)!a!~q6#h6@ju1|ltetc;vIo)5Z+ zqah@@f~r%|(=1l?TKeM%(R`DFLOPm=;FaNf3Nw2zMu*a)M3U(NQ60AaTAMTu`8G$O z=n`5kh*I7L)SvF*0DthYRS-QVh@dNhpa$8fME?!3*ac=CXaiQe17l|}KD0k72$EAR zq}>o8FSMw1=SkAyVnOzx8?iMc6q^Jf(TI%z)Gr4+1o&-nJS17OflkECg~3~nXp4E= zU|u&sK$Y0ak4+c*pW&HXdKOYq#KHmguBS#TdJN&y2n$W5ObHSHIFJNX3-w)PNW)o` zH8lJbYh^rVUvyT~PrF0|$!rN2T0G(DBlcOjK`DHuLK0o$g=rjeFu>Ui%eW`J8C+d5 z&Ysi2GihW>wFn%YgObq5HcBZ(lspAx6!jW6;Puc1*g?U4sgU3)^=uTip5>BBC zw%S}G#TmIip${8DoKU-|+s(e0zB%yy%FNc1?CYDdhu4gb9-gyx!`Zx&_ ze7$epxB#xFhuNUFW+8&L!t`F3LXM*?H~99iuB(-1_N! zLF!}$oL0>|N65ME!@p?j#yUE0l+@igy6({f&E}Sm4q9IuIRDDjA3u9|^xNK%zG-7M zd)`>~Olt2yV%^n=ITxo5)FcfSCiSjPx^}y7_`t3+Z*=sIoZ53X{N3!2*Q~u<_Sgfx z4?H%yFXz@!_RYDkBpx4b>(1OC{P$0CF3ny4-Q1ijWp#bs&yBpBbM3Fmx0FxLJ#-^@ z!}WkiZ~yT3yvYSB@@HwPsA|6K*TJ3r-EDfNq1CyeI%5Y z!_s$00P---W7app5MNUyscO)BA43ohO@NU+*V7jss-@aT4em1^6hMr#GpM?R9^!Pu zeG5;5Ys4jcSPWbxI)lH5rHzF#Esza@V_7_MNaiw&TB&da`NM_L(xahR02=24VkSlC zk9RqmfjpIhNcgzwS-BbP=HeO>6nQq8^-Pq#pC(0#fDic}C>-KdO+bi6!HB_%kmuL}2_wLyraqM2s&bwp9Mu1gMK0V3F+q{gn+w zL9&X}y(I~YmLe6x0Jv)=S>cF|6Ih$l8gJ%wAS8tBg0Tzqz*ilhPVD0h7-(t3D35sO z3HNLff?4dU^5XpQjjb#fTd#@Lj7GxDftr9jO)<8IlPa2p@Qe=tYc6kOZG2WM%VB)O zBd$kxwwlV%BgV#W<1@VB#fFAla#DP`(&M{}BP7 zA7-}1Uy*zbEPjBexI7`pi7hi&2DVu#yJ5x%9knh-4XcvDbg^h@jcMdDN9KF!ol>qC zKY1KX!iwHlHfrj;$RB`M-p=z5GKrOAaDE$Gg-h*cv4~_M2LC1e|j(=cfg|H|jx}FiYQ1py2Un#5qTFO(& z@(fBn_l1F3g=ME$`eIl(pFJHRxq>&)Of*Z*J*i~s;w+d6wTTwa02i-Fa%IW*Z6Qnz zNASw*3^RbCmdQcz`t8v?A8?={ztAMu(TeldxLj)ZOLq}Q*i!TK4@}%JVi1p`?GT3l zZYEz(QUx-nDjbDU*q866zxB>r`E}RMcMg6LHE?|J(@$=6j$J?XnfK7w`_^soO0O`z zc=w`TJJ(!2)v;^QhP=Ts``mRuH~ISezyI2+SEpqU9nATytoQSwtMfiyU3hg%&d71B zm~*b*^ms05_}!?rXAVtVF%+?N?Bb5$PlC@pw{CQF%fg|mowtVHnnIS?hMg@H({6mw z``VTBIsHA^gO_gH__1$R()sAoigjJ{*BozMe|k^S+Qyd;{cX*;Z{Pp^!1wpx9p~H| z_qgm6^K7FrUiaG3me7IXY1z$RlwFVS{L4$T{&{Npr?rFoaxOfQGweP4$JM>Bbo-YM zj<$IZH|`n!DmnRwM@0nn!Q*w8F8^=Z*poQ}`xbtD_NABBw`43lv+dpNlDX^8mL0fs zWX1Il_FUhT^IK2O8(rjH*DCgAuUvXQG-u>s&fc8H%a8s2Ku+KA=mReW zInp=9A$_!?p1|5p!bUV)f@$wBbhtCbWCp~gM)$+&IT(G6kYya^;PUQ8EO!LB1!J=4sJqsFaf zmv00aZ^I4R3?L74*)CIC)H=1Sb{0C002|4y`ifcZszj7UpvulV-=Y_#l<84+N}}W% zENy;PBmOZGMo$FSLVQ$%?nMCjI9=%?JxQp5RuT1CU*H7Ed{!&?g6lNVn+my zE@Cr~`{Eofis%;cR07u8E_$}0#WQMT1GCYbuB@0DRZVUe+{zZRB-&mc75A+1rsf+D5IfLxQx zswAw>GEO(^y5&Q@ittO%7g0XcP^882wFX6M0SkHRs92 zm1D6Hn|qcqxr$j*rJ&r2uPtS2qe+PWY;LKPO5qLS=+rIzKgohzpN<(aF&J{zGnzc7l*+wrTvaZ+qSbWz0koEKga(eB%cpgzPIm9`vE=g!Yp&KL zjt%_OU6x(-?~dPUKRabu^3orkD1UI4Pt0`17R8o(?y2iOdg`;&t6x}jbmYw4@Bcb{ zCG?e+b+@xR@2b4LtFCV-XXI%6hZRXzuV3Bx-@~sD9q3qbaP*nb8!v^{^zEw~yPPvT zm~*smO7E1tW$WAdC7a&J85xS|SRj&GE`I#k!4>POUs*r$}T?`5A^7Jk#H3f4xR*90sOXU0} zGB-sNIlxA<6gGw;FD(xb2*i+*A7hvh)-h~$fPvUy?@>IA{Ly-QA*5%qyi}PRI3&vu zF~R}~Lfj?}jRv9vSP8S3rd^$;OMuhgC&jY#wR!Z}{7?s*i=9V&%@J{k)Bsp`sfyen z|1?kBW}v9pD6ff|xt3kg8k^C?rayv}I%^)k82DSbI7zvfOtR{g=hdWBQW!M_U@Hu* zy%b{aSQa0_R!m3NA(D6k0^$KO4H9u}X_iC{fbC!Wqg~T!e(0Buz9B7 z0cHEq^R){Ory`Q&UVF`fpEt?y*&qS-uNmC2!K?=IF2lq}wQx+~_ay=M*M- zj%Yt*va%^RJT}q}lN|!GXM}=HUn88S^0ZauV0?5CWLJ8EWV?%9^rBV|$U(kpB@B!z z0B)(hmKx7OhHx;p8la*3Pmn?>I-jlyP7x9g(5ct5C;yXV5#<}CW5^k;3Df_i{ho|KZ6gM z;dey=k~IwsU(KrW!UH>W3JW-YIW&K^r-G=UP}cjguSB!4zMT(D667*T&34YHjMazP z_s_?#{V57HQ!-v%Xyu;ZHye!Fu+ktr2yA8z&Sv(YFevrtiJg!EtSqDL! zF2F;aGZKZbMdobO@NKX&5d7`d@v)5ytpT0+aHx!$0%sN7a~c7KF?K=f^rr9Egrwx* z=fzcuNCI%MA~OkxAw{ahv!rB4VI@9=6N+k#hmiJNR@u|p+w<=XDS={~*TE^CFJ>q} zbqo_d@%}oI&crw(=zh^AB0;$F6BFwBbYtQq%MT3!fBoXevvmXgQNuf>b!@4UWz;=bCxb%z(MxjrRoU_h^Gip($%fvg+IZiCE<-^2-$F;f-;q7mI()nRyFItB_TGAH>!a;T zz3J58m87=8uT7tsAM5K|Q*-s5vh4CjnW~=3SFKV7Qp+Zi=bL9f{zaOjI!a|b&6ygEnbtckpNqNR70ZEya;<9R!6 z{yzRG|5gd@HL2uZNg5fIJc-B{BlsCC4R+$&A&AyD>P;!EgupuO==xxzLE&P0vYPmk zAjzuq@Mj%Gt_)36jfwKp0EI6b;sN_WdMQtUMDZ2I&yn)*PYL8|<>82&7|*U3 z>OS_G24Q`)kwG+~b;eYfk1fb0Col}FVjE(B;pR8QF%81;u{$%6uA5MrsSEJx!u*Fd zzXf8LfJZI9gzw4_C1QB){9P@3F?^vg+u?t)j==JXnEyER7HekTS5YjNz<` zwJc93-Hu6OCxR8GK~lv=mZ;ihOcwU@Y(Pwn06urLHVyhJ+~vO^-g%5QbH>y%2NLNP8yT zSe~gv!cL1?xqm*28P@Y~-jehz4b0>b#6?Ca+|bw|!h=K#YBDe~$mDiU1v;CQ{#yFT zo}j)RZbQYC1wXs9Z zgB66)EGu&MueusSwwd^I-9!hEsO;EMbWNBe3_Mu_Gj2lT_A)@s;!f3dWwAT-gj*r1 zs*8kxcvQAR0~o;vO7sjYOGO^)AOy4Vkx?j=AZFmWfQXJZ*N{r4m`U(Ha8R*{9f}_P zj00#OPlhq&kL{#W{s^BhcJh=T9!?yrh3^R-(C9yNh1L%)0`#SNrYqD-GhjHdUtx>~ zuT2voO>hK3-EA**qy;j(i!#N3h+5o$)HDj{p68ZT2oiFv4bj$HN)Ob7D4@lG`4$+~ zXb(}s9MizUCU3hwlB}e__Sm*NV;g1FX!qi-M>Cdb7U+EqD zWlGMko3eYgLv!nXI9Pk@;}^zWjvD$n>U!W{ZFAzGu8D^(-=3J=-FkQ=;P6=QX!k!m zfBG!>+&`zTTKZ{q#k&WG-i}%~{N0|8Q~Q6pC*~fEQKCU~~ zarm3S+5@Kl5bw>{Au``Q%`+%>Tmk^eJ8S$#zs$P-&EEO zFPhrFY})m|?zs6k@5kCN{zGAT&-K3j`)kAZF3dcW?AiDAqV>m0LN~m$)9Z_m4)it* zeKqyodr!WSbnx%5&yBp6-g)ks;N-pslHb}j`r{{^efe95`p@n>lsC|mbA9ivKkvEq z#cu!s!D|*TvKblM7m{Zaj~dLlcjN z09UB=u6C-HJFfZ!*&&=)bT*n0)ROj%@Q`GCxB(7|Athw?WHqpSy&A5Sui9;p(h4TP zsWYI}!alIolqM;0G6}b1{u38bnud6I3ZV~~GZsr?a>KIHO7~X~tw|;GQdl7aKU#t6 z@gy}d3Q6#EHO5pX3{fZ~OTCqjCPJeur3!l1i%RX9;HN2YTXpI_S{f4`qcfqDkm2GB zzbPuf=&z~=HOuFjhZe!8r>6)Z6Y?+i(o>#@0E6_BZDO^6d+kOHIQ>vo zk+Vzvi?v$V9nDu;z)qEr2K-Z{<|Qe+U4^=8ssfu>_=F9T5Y;T zugK6me!_l&-3uwFHW+@*1{O+snC?AbuP6G0E1T3VR_y@k!k>oJF4khGR&fDag{O?L zslfMlOHVUO9${(A4xAM+Uj_?VK+#~DD}JpS287V3Xi)x@GmZ=O0F-EW6)LN+TmpSf zlcAbuQe}nPy4xwy_Nx5qCCd{mhG(eM^kx}=q^vBlw;J4A#5I7kmYA=>8fu&f7olEY zYe;F1lW0xdzv@~CTUm$fe+xgN6t~B-R=C~^3tpq2iLI2 zm>n|p#*fp+8una&cJ7Xc{x&dnZEn=1iDLsF9IyQ~xc2_d&P#= z);xG7YTaPdjHry{orBwo%`Bft7*%+uyg9re=GKU=q&lp zs{7ZQRbHv9PCj;O%HjTsoD0EgGfo?ifAoKg22b8KdE}*s{F82bB@Mp+^{xEYn=PHA zXFFDG_~Dx^i!$FG%+x-5aWLmb=-BYWFHR?|d#V5E8}qMR|5MVryvMrUTJu+4=E&L5 zu@gI9KV5fnsCIbu$CrkqB0qU*)o0%z5Tw|MMk&^sB2$i< zX)thoHz_qXMm0T1OkP;5-OUgyx=N{glF*gHM5N1+T_&5@dI$?IO`5Dh6^1!pUWTx? z0g|*!GI3RACJt3XJ;l+p-tL3*;zVY>13RjO1qssp^x6)M ze?YDvK-C20R>5nmFHL7Q!*Q6_V6PXXJ%uS%22o6z*N|Wj@<&cJr_A52z=px@S+CG7 zf~kS#!O*UO;)DAsVNV|Tf06xTf{#qG2mKN>?f3|d2Y-y7f$bx%Lkwwtk}n(p6jneI zRbm*lC^|G12vQYpUkXDTY!I}bs?93sGI^LxiE zMeOuZBvD08Zpa2Q6dd~O-;EqO@G8z++U&j1;>u{)%G2_Dpp+cIH_$-htV`|>p{l~s zKL9zkKTzv}7f;(&42S>?5%o3N4v0-yf1x$;Vhtn6bFxB&(u(ar=2x(+Sj8+cf%Dn0 za!d2?pN^!44-g0#D;5dFa{Q*^z3*^&Sy>^VK^9mgthe|`Z(ajb*@`KDW`LFIao>i~ zD0V)ZB;GddsU0YdOkqlW4Q^v42m=E7T9!py!dYDuM5lG`l4?1yE@|sFPJ-jyRqO*!j6H!({v%cj5mx7x16y6={+zi_$oQrVMFrfgigdSFHNjr_V_{af{KPyhDQH!?5v zj{a7b{qw}^tEb1h?%A5%w5j&wydPif>Uu8c*L|Zu^^RWHI{Nb;hI)stuDJHm*4lv! z!$HYoHc9h`;qyOqK4*TwnfA!P{{5ou|8Bpur~g{$n6o7D`OvcG+b_KSTHdUS zh2Bw*J@wdxn zxjOi(C1XF89k^x8PkkhR`S2Ihk_R82cCD&+^tFAqE0sB2bI;uRM^xmFv$oiiuPXz5 z+pEFSAnVad&N|wUI&#ip=ol6nHt496;_XL(gq4tw$rdtjff*dI%Q-=wab|@FoY@2Q z6eE^%aCYMO2`Y7}k*|k!+PHT*i#Tpv7lKl^1_CvZWQNJJ9+b^bk)mwmKPm!Xu!7SI zTS29tBC%f6PKf8;c&T0kcTmhHdC{1kL)!x&huX6Mb1h(Y4@Tn@IJz@ZS(Ox+m{3?6 zx3N&fY%H$6h6OrXSJ5r9Q?O5vO2d5#+^{O?o&*igmpTNA)mNizV7O7ZV=+b-v`k@0 zYA~hh$f3v$;rSMPD71Ic^>)mWIGLUbC*-KaVoE_roD~p?J4IMS6@&CZ;jH$lF}X70 ztysM!#AyU!&qpeaRy5nWYM94x%mg43)@R5akax!uoWdJ)mpV}HZ>JMPlW&*dW=X)J z?2~N%$khUjZrpF2S=pG5)hLZ@zI@^ofnxP7^u}zuOkuG0OpJ;`Y6uUQhK@yYME@C6 z-wFe~NIS<9^uPeixP!9ea>y7OLXr*?9|U`H5Ul9&w3a5bnN`I+K123Dm765i2KgBb zol;mM3mJ|&92aI=+*}whsmw-|p?Mn;gVuQxv_^jaG2peX^Amb7FZ@NJVN$ahfOJXy$}CuYcGd^<04rjX_PD zS&=2?;wFSkzBR{IiPe(?%Z#0)!6KF=^o@2|rM5tDkZ^I;gW5#vJ=~;RsSM>k=>a;0 z{1-+Zy=y<)p<&cmyFu?bsP?z2UjKuRy`Y)1X@e5u@Yo>7Bs9*pbC zvaoUNN6V7Xl!~V~)Uoj!&*>!Fz>w?mu?F&iLhRtSlRtRx^1&;q$8*jd&;I#%_TaQT zp5M3fmy_i!`}iUhk0n>u0+l8Hd50tIj7X=Ncr{;mv zk=?+S4=nFEdvi_QtyMV#!H|>YW^Y_n`|n53_iY{fXVk5aqlPXAuN`IClDOxl+}n41 zs!BgC97#oPX3gGZ)_M^ICdm?knA(DGS`%aI?Iwn9lwhFpzGYgZ6T)B`%ui_uzzT+g zI?;*cAIls}1+?<-&PpAIFmq$X;9dzz4+;Ywx>XyiEci`FhC&gMU3eXd#dOUq%yukh zI7v-0Y!}%>n<}G_91F*gwuDJ|%2u!unt&8fz_JE9X>JH8$AK2fE~TI%vay>+1QS4| zO?9}n2`I)G4ehWt4}S2tP(hbdbs>%5+QO0OB@;tlzbuY=IfRK>Sk#3 zqD7-079*C<#&R;vh4- zb!E8mnY~RqtJEyP{VGKbnkRNgY4CZ3lNr`8RwpoD$#_nT5ipgw44p3vDO@21<%hk! zr4(`pTvJqxP_IgYY|dkZVq>M_rwHLDQlhbIox!%4c2wvyeKimR3P?o?3uQL8S5@Us zLbM_7lzE6i=ySUs+JcvhuxVm6j%Yn5v?8I~RE_NX7BRRPEN!4+!dHy{ zYIO+zOuYEU=Kx`MfV!}U2?doT3RQDlj2>ZB?B8uCTS|I|i>3|Co;LY~U4Lx+%Om@* zEX=+#XHDzak+XZ}ZrHkJ-N>TD2fp0@#%Hkw=kIT`fA>!Dsn5Szed61bPcB;)a{Sun zvUN8GGt1^?-E0XCJv+Ln?zfVh)t#U18U5Re>%S$|ys_i(&)u`Hz1tsLeeLnk8}C1;pHN)3Y2v~I=exSvE`1lg#=SsQ zTJ^u}-@c$Q&0719|Ly(6`|Y>F=gqBX89G*b@VA?Fw|Dp6t~!_Ac{M0$AZQvL=iEa# zZ-m}>XV2Q^+bb#uJff=l{yTT{`qu2`vIA8)^()4%_YSwbyJz^LJ=b2^y8lx5vzN`!#(G5KGv5`?~i(1G%DFkff*oWX@Y4Ut8h!P_>iXrMWNWe(O zs=Z=?kQ7RTimYaQJsKJLT+w!0Ag*o(*($lB4O)2UCKNY$jzXq#M`6g({&Zo*X%CmU zQ&oUDDvgs1R-HQ@9hH&mX7b^`Lpox^OvV`e7GE6&f{3_!Snv|OaZJ1D^_vxQseh1^ZeFA+v7>9-SR|=z#j4TPalO4cmXhtMRRDzhRYY;&cyRivj z(L}BSORR=ku|bio7LCmx2|ep=j-*tL0fVTSX79AhClsl217kkjPA2LM;7A3gZXmER z2vJ*`%rT94kx|p~!9N6HpraU1G4Qw67R<52yOXI_Y^dqC#?zUoKqL;7u#&=NP%uBc zCPdhsRhf@rLP_)m?}Qz$GrGD3GY(RM@V8fCB4se9fG8T8z*xD0SYgLoDVWi?pg~iB=b99H&SJKH{n;n5)m6Krkl)jP=K3p9A%CXE_!q6hXEa(QWJ8* ziTDt>aazdrw9^bWm64}Y?{mnLy90M56F|wATk&PG;3hR z=CDWx;4I;Vu{*2`@|uis1!@@fN9I6EJzGz-y+Z3DCDjlH#><~&&Va>t{e96R-K?H7-{GTPUh-PDtv zv99ss^<4*})>e&unmo4Y*v#7Drd4$V=R1EpKlXLqg~Xh%4<5d~bKz6(HdJ(8x-zZ* z=YYqcdwJT2FSHnj7Ss)X90j>&z$0{^ zVcLyvdWY5qPkARcz;|wepo}a?=pXh9@ z*?o5O<2|F_Bxk=g)HRrMq4}}f??gp*^xnHnhb8dN7E5|`&%@*aJs|v4j?7ZdNq09@N7`e;45McgfCG8z0Q_u zBp7rr>SQVR*qp^nQW#Avgqqa=h_UeXHf+I$&?YNVfvb*E=lF4yFw#0b)haV@(j~Kq zR^)jZaEF9voR6_C4RdZ0fG7cAJnA+Jz?v>b&&ng!f})4qGIv8Mq-~?WtH_qe64KMo zJI7&F#_fhbtxt7u9ufHQ(*?qgAuTgJB;h=Z6-T#~8?i=V{bOp6wPGR(c4^GZG^Yew zXgn1VM8k#E5+63UrM_yLQ_AD|FU~NL@K8+R8(es9H{3~xM0;EqD6uHlDLRDK*?`Ds z9DO9ev0{qwfu0Bp#ws=olGf5Ci}X2>=!8rFJ{KhkTNNYM0k4cz7yK8xP!`YJZOETQ zFjO8SLD0n{*h4XzR9MzJdkFI*YEHP37~k;OP89Eai6@9C#-^-u&S5%0=qogH7WOHg zf*6=#bc8hPo5hwRH_gblW{ONP6ZeXc2?{|k^;nDV)FM_j%p*K&e2J-fvQ7L5>>qH# z!5M({IphH<1z*xc8AT?;sTJ=(ZbVO<9%QAaZ@ajoH$h()Ns9;^$Zge;_aQ;*j}Wy| z2;G;=Fy*7(nZ(jtJR1|m5|0<9fpAVLEFQD1Z6f_k&_1F61VS){+==577(jHfXE6eU zT$ItY$V%xi{^Q)727pLhP_e0^{|>|$7}ptoCUu&z054S3Y(TOG93ybArc#TYq?k6u zY6z;j*n}krjg%FunGlM20fYK1vZvNYBl(Mv$$xmmBkoh`O?_!-){ws86ZSyu$6RJO!g(b+pxZ))8C&@Y-; zH?TKqY-io*duz`&A8vi*&{z4LpZ@ou!k8m#U%xc8YvkC9oUek1Z#2B|;ScpeUw-rY zz_hCm*PUK4`)ou>%dzhASy8uEZtZ>h(1{}_GnTAc+jHt{=g_-RFN}^RX2}DU78Y{bmOz6?x5tpi_3CGH|5-1H05vM ziMH!6sJ?r3@VOO-dJeyF?bi*LS8i_Ecrq*|!7F58`QCRY=YMi#UeCbja9`Pi!SIT= z%x@MqKA2g*WB5wRzz3UOIsEg%Cw6>%qdj=!`{dytcbwSQdgjyqlgD#T&mDfDazpIY zgBQJ$ZX7c&t9pL-2Y%;|T>Hb;v5w#umh>ile!eHCd&=nOiSpxzFXTTuVBA;R_I2gJ z(VPVD%Ll&w^3#lO0iLzgt30Vg;q1@3fIwLdW{uA~hvJ|A0 zKv|DrtSdS$GFcs8FWF6wboaQBk*e!4gK^Ysz%>~+7{3S>%21PGnV^P2?7a+^1k7Hk z-FDr-fV|tVS8gkH<6zmYo+n(Wg^jQXHlT0CT2M$U;D=dh-U_QEEfQ@*?yEQof}LVt zoURrlAp!|TpxlkvdEl0^6il6392QgT71M?q(1Whff~87|(vSwaA6bE8s>R_ZSx$s= z7xQQR5+ZYu7mEE2%pvAX**cXiIdSxsE@vc&^}CNi|-EFxXbafN>uK zq7v&PTEU3`;SF{-xsy6BU5JAto*@_8xl*wQCsTQ`pf}`UhgGou1TVFT zdfb8Q(qD)qen?{s<02<(Oc)29X*K%_x|AO#hVXj&L;OUVGF$%Hu~yRL zOi2~g&Iq>8~p*mQRNVDRDd zKYhqJ8``&Y?u)Chz8ySzwsU0UyU;s2&TMEcx!RIC_snaZ?fqE;O*z*C*tYCC6Mk~e z+^ZqW{+YKra=`1yTm4DD+`EVUO0eHvbC5<`6jz#ZPshM#-dQb+ay~mac5@(k>`3p; zL(}?~C9k`^_{!~fGFJC|b9V6FgQM?HTi-J9=)#+q>qajoKXh=-)BSr6pZj?1T*B$^ zk2SpX&YMrXSeAV`IOpcH(QDIw{AqR4)pvG}j3kdwSzVg+c?gOLm zR4jgX=xp+>8;L9GE+5WsUKF|EwY|L&@tbBr5~Q)fK7v`sloCK$!*ZX<7>rr{u|Q(U=Bx5^Z}m1d9^dp13y9c=W}^Vcp;{RmWCg*kYIXy6@oJ>OK6^ z3UDc6So1bXj%c+mR*JRDA!%?B3ns+XGw^f#(`9>@AD*zAx!6aDkI66@Wq=keF0F{M zTslw`Cu#&uygsZr3~MT$W~gWQ_E-brYkb(V;Jj}2fIh7RdUOiYa+R>L<{5>REet2P zjU((63=UFn=@nQ=xYBg7bTi(Dj=1XRVmB-ztd|q)A{GYA%Ki0t94I`T?ixp75t|ZE zJzQp&4`Z5}+T+;;&bdR*6|OhzE~{r5wKk@I&Z0p$wbLJ2bs$f0582o|9pRjIl0~eE zOk7C+Vu`47$b78)OT=t)JiT}WK9MBK;!`EJiM;p;kOU|-SSy!GHn+i51Ocy&?*fJ< zO&GetI6IkmC;E-JnRaK<$@JR@NmOIwBcvyad88Z^W5_c&nb`~ZV4MVRvn$s`ADqEn z8(Fng1#p2-I1?`^@(@k_sU%jiQDB6mg{62J!t5%s+h*?$+{YznhSVi|`;aJ45>fFh z%K>FD3KNq8LaLs5#TiLD;c1A~HV~bLZi!&Y*)%h7w?i7>ld7z?z^QQ>q(aDJ$4jh; zE5c>>gcq6)SJZ?iK!6}jM=b^&J_BJ=gYdngujX;Da)wZ6 z?XoLmUYEdYK}0gAmTnY%Db*L{VYM6iHkW1Es;K@YCsvhY&1gT<3Nc?pJ6_SF{#V}4 zXx^1w4$$!l%u{e=M4@Bj#&k_HE$cA4r;UUQ+aE%15bY(84n}0vGWd(bjS0!#{V{%Q z#YNbz7!3f-37J8hyx0+f+=-=+sDQ_yYC>-ci-lM#%ylHr2BZv_c0N2_IB+4D$k>gw z01O7N_q>W-$hDLWBz0$?kY^py_D1EyhyVKW#d6Gs_(1yUV*eDkFuUR0*`EGz?~d)O zKb-+|QKn54@QuS^nXb@o)R*o%n|;nV(R;(!RqvKJ-g$S+|9(D|bF-pzsCjwh?ewHu z?@wFxl-Jghij`|4Kfk^_XY{>w58e7UH2b?PeZ$Y~_|1{nyWh3+nV$5Q-gx<`Up_zl z<=!t(e%bf(D-W(()^YjJ+5Uqsx0v5p@Yv1n?{>}Yd8YZb2iJZ%x$@>ef;%fuUS5%P zbZ7FgPw*QbMQr@@H~)BrhY;F~`@XqL8}mFCX8m$y;Unu_fAFDuqGtvD{pGz^=jHrz zd()4vHkW(sqnTZ}w&Bji{wuRqKNh*|FYCVl;jWe+e%hS3y)*NR^7C`vjmjDAI=8oo+bw#j1S+(&fk#`V!^ji8MjSZ`Hx*={r+)2X}X%toqZjOQ%H3}4Z4j<&iS~ok0RIMA4NrAj& zCb0|~P3#h8F_|*WhhY^X$AA`^>A5)Z80zVmDgMRSHOB6V7eS#xb7h zD3(_tq$Y7BH45o*tkoa?9Z+*-W)|o^2Fk9@nZcWyXLmBlX|bDbAVk}21%WcTUz|Oe zMQs5P`y4AH^VML1!LeBYRwy(9A55i=x@UMm)sjgSrhV21Y~>-0`asf@1t$opAw9{*k}A5#*L*2E}f9 zM1$CMz%=9#;^L^t)0t>CfgPJDq4*>#SpM6PcMti)VZ>!Fm~ohOSe0->HY4Hp#1KuG zc?73`VF|Vlf*ArnNZ{mN5P3EmL)fspW3d1VWHAM+AO9ZpIN)W5{)xy(RB;wVREdyr zPBjD>E2)E6*IAGXaOB`y?|>X*;x>b$$aYsmuT_zqN#7}mihZ@77*i7HZ)OLW+YG($e5w{{DF+vtTA zYm(1Zbp*fNTAhnEKlZBZU|N*(pG!LPNCa?+BA(PO)<1FehLm}2{O%M}K>SZmw;GX^ zX}8lI(WvL*;!diEVqq`*oi=_V0!gCe;Zph8fw_^VsY!h|ffQ!tavkv`_Rp_|4oln! zd5?@BfHb1WN>=#gzndJv76|Sb{{p(V4>cXtBPgzn)kNz=|#=Q z@()Jc%!_*Pe~Wx_-^Dxe{DYMTy5CuoxoOSz)}BwEdU(klxE~Lp9OizDtWXj2L+AYk zMrNxbSaD$=1;E))+|vnsQz^_ippY*C;S2e{WK3lZzj;c%WL0g>@#=_??0}+JD{;m| zU2f6fT&y9W2uT!qj{b9oEziYsXjL9pCrT zCqN8Bj=9*>7ir@s87}>y^}*W9OCIY!SF!i)Q!E97c84*>5e>Jv_;HPPi|&PI)EO}~ z(a+xf>OYH0ckcT4``vzPkOGj?mQR4(1pzL>YLY@QoswYr2%MQwgimHZ zXp@SYRCqcQyujVd)|ZC_GO~6&ZP(~#6hlhI2N{^6v+g3E6;WFuT2s+PIs^*?y`mil zLe#QQ%f-y-q~_UK^)6%4TiF8S-W@>gY60j%v3lUJ!fpOFf_WVN=jIuZ$Vs~Ud^EU6EOCQ2IH$Gb@b%8TF0qg{2jLy6$bLTDaZNS~k%fOL!L1_lcHR z4z!^c6hDgisdKPtntR{_cUxpVngY(2(HU%9+DR9du5JN9d)f;2KgABlzEl z-$x3_s67JU*j5v+ng04E>+O=dL)Ry5J^S#=^`$L{Tq;`xg^w7l-z!v9wN^_m4-o-D zaxue(uNr?P))@)D=K5G){QPMq13crP30m~3ga+UdE>j#Jbyk1Y%TNMsJf6rp(V4_{ zfjm!bw0rSj1J+5ni5hs#?13>!Wj9`hin5@}B;}Fv?e+gzn8L`MdjJxqNcHXCj=EAQ z$WhRCdDtFzs9yNPlr?K|ew&!{YQmoBqz`RtZde()N))E!6sF~$d^U*_LJ=dgB?2Eb zC}?z~#!7Fb{Qw!a!ZoQzqmmV&hd&}sk;t;D$OU~XCNf8?kOV(ohMbQ*l;9F+Nn6O~0c~ZRk@w?qkKbJQ6-{*ArZhugFF5G_Pq4|zy(==P0)9=fD)nWU? zqz6^8%u0pt-EV!!>r&j4hFm2jQe!NT1M;5v+_ULx8`J=t$nAIDc~|;R`k+VZePcAa z8Syp$aeU{4tEs8|zWYB|^y03HfAXubWXAXjMjDGgfNzjxI-bc)N9r`nMb4_$C$fl7i?E#+1b zS+7mRUkRCM8?AA?xe?HdG^jbP_@H5+k2a-2$XK9lkOOQ@5mL@JdX{J_+2RxnXoc)O zCR|OwI3Jc!Gupz6!@!fv(shFg)MW7WSx(Y9vnj-vXinE?!Uoy@c-rJ5^3z6&W zlKm%YOrt?HOm~?_5IH13x1h2_(S{K{upK%MYzvR{fGs(91sJ6ew7{9K2)oe1}#$(1<@p_>KLrUJNEh!pPbjWFB& zB@cg|m~k+^KO|Nmrhd{(J>b-M03eDoa6-AbLG(08rKP-^TT^(*+9E??@bRG=UAGqD z&kq*=LP+9xFQ*U~Ml|eZYlw&I1kIofz=a^1 z29lmf4lEFHU?}_W5E3RfG-7t33h1XeK&K)27-dghvk_ZWTz4S2dNbjJP~++-_EWRx zw27)h9gEg01v7%RF+A4p_B1f=4j8$)kH6EC9+;%>Aiy!tlbmE-T!G+M$>eiRBXX&5>H^n^|BQwI?5Oi-jPN-j#gR= z1Oo>E;H3Cx9kR~u#2RFhF&-I~6!3K19X4CL1{g!BE}vLTx&+7A;iczER1j~-%P)ym z*z(+Lu;CRL@N3WFa<25&DjW46CGnb&tHCscwmg*`7~8TWWge7bWJH_fc|7uLX5j2j z!hA);b%%-LiB+t$g!?Xd1-&@;f3+x^dGL<<=2wS^%MgYt<8c+~gi-M#5Rj+bZTGSZ za3!~hNjbx$VqgkTHGogq=2>x95OhfPF7ef~;_J-}IN@d56ai^hHi6t&C20CGc{ZN7 zzPYUs!8Us7-3lizu0+zR=sUE+@46s}>!?v-L(QX%GqBf-6+Atftr#XDWW{s_)kPw^ zsQ?e$nhCL_MBq(=HEXW)OrjEy1P@#U4C04ypCe5b0E<5#MT;<7 zv;tc(dSGXH7t_|b4vXK^Jt>hh%-t)9h=3qCle2gfX}aJu)E;|AA8f@uH?R)P$+#A^ zrIare=Yyrv(YiM?xHy{x%qOLC909@me>Viwg$isQ<^d!uwyW^pRBGo@54JQ<@@s_9 z4Sq5|Zt3`cCA^|Q} zky}MUXKEONyuzs_P0Pd$03tSfaxtJ3IRy9&)*K;cW%lHVPz5iD`K%z*5KphOn7wFa z3-lCRu?mPTtTpi`1BL`TXGfjF#LM_9l3e9_JfS0}krdIDEB#Rtr3?d% z8BlDv>(Dh~mo_0{Q5*R+<>7;9gAeG_bYs3)(gaKGv1(}If-6F})-eD9ap};*An44u zG`7`XWHXvx%-^D9MoR{pgfBEFu*sm*vvdzbsYEd1Hvsq!VZf*jP{qVR`)K3FWc*Y^ zF3o+$5u=$Gfxajq4)ZS79IMKGrSh3LBv_m82nbeN9+doPa}~62=$BsP=5n}Xo+jkp zvKpkHCpL_BlN}3G!Uz={RFhG$t=L)3Va;`zq`(56kqA4h<|?7F&dZcNguKOd+uja-^_x&66ah zFW{OxvZ5%AQ_tCNRHw{?*H5#JUqvNN04&{VOwjQ95_thJh`dP*j9mgOp~Gi~GDE-( zgv7W81vD7?oFZn7arJx$d@=|FSe@XfiQj`&2_Vd6U~{MlVuBk*QzvxeRxF<|FXlm_ zbLp^Z;gdtW0$_1E(01b{8qZfCCQUjHBIwXOPPU6X%~u`3(h3hb>Wk!{q7%XDsaP2W zo+E-v_`87gi7brb_818a$)>O09 z$hsVGvl#{{uY0kH-P>XqAJAS^P|AR#g-8_-IP6Byr?I~3S(bEPe<-Z|Sdna8oMD7C zL2gusp!lXr?i%#vG>dTfyR)G1N3tLQSE?5Z+*%l^@l`LtYbKfw8^)g75XhGdx!ITQQ^r|eMLtpl7TK+v z_Q%k+sQW^Fpy5HH^WY&Fiw?ozbTfI@A{%ick5MXe5&%J@6gcYPb&?*#^vmuL%x75R zwr`Xqxq)S8>lcwFMyIaqAla!{0j?#ULjRH?duJEQ(A)@FQo@bIwrX~^^?rJdLH|2ms!2@U& zlr*JToycZbOyc7=DS%sbI6D-(&Hy_Qk0?=NMQ>}6*j~ae#PC;Qw9hm&8RA5aByvI} zSCAx#+vp1G5$-6p0_+i4yzq3i5-Wl{$w}HN`A*edu#e&xwb_vKZjs5}a%CBW4{WT) zlio#w7tfcMMx?Sow&Z-w_Gr8n>8r!l@MC1PxLLUjV>O8Ha(O1q5SSzIlNb~55)=q&`r(IDI)GT^n~ zBL}DwBARQ=VkJ#j1Om}wCp=hnK^T#99yabG5o^9z!!laUupl5bT;IZ>)hJvrHvter zlnI)?J!x*cpp!}#cn9tp_DwLId9~d87AXRSxQJ~EKuHj5Eg;kG#XyHAwj9{_bj&b0 zj?_4WPZ4HhArMRF^BP*y;Cbm95@M|6>RPP)FJiBbu#X8Z%6y-z63Gou; zch`mymLP#L04<2El?47<#6g7D!Vo7j>)svUrhxMYA`r_hFe&k8;sac3(c-YD6DyeI8L_yVHjXS-Z$G?PRh~AmI}GCc-{cJSrv{9N9To$8%xBX?xHllr=H^GY0e3wnfVa8PeJTs%I|I=CfpQ^WH^3tpBA`F|c^ zc7?K0H1^%HusWaNz}U~qBO~_OAm1Eyz#%YRJO;U`qa(fhEo!$U{Y6TF1}bO~`eqTG zTY~Kx?BUH*8WXI2_wYblHeNdbSUuH*R)M)mOkstL-{9}a;e23+AjT(WXmGE*3PwNcX4z^A z(UPRZ++VVhZNG&Jhku?!;JWa|36?bssf4jH$Kj&KM`V}e?u~OumKEDY>pV85(`gaM zz1g`HsdP}K1e#9%4U+`b}ngdm?dFW2iY?w+;&Z-5bm&{k_peQwSkVCMc~Wts~YhiDkNl zMWBM+XOPUhECP|i?vl7XBrzx|3c`7eNnGN=hC-w>GoE4I>+eBMF%=??uc?H`2hZ3k z|BNQb3xH)ny;vJy@Z?a+;iBub>x-e)LMGAO#`{&M32s^R_Twf%pMu#t0{=90T>9084L8h1Ttu?hjIrfG8`__7J@!S!;lO^MPtuI=@` zAMK@S;;ccM`Tcpm&-3~BY#vz&rlSN6q)?GKMz^S@VkUNtc9gAfP1pU?#f=k}gnh>- ze`Lltr0l;GY=|lD#FmMpFgmUK70^=8M=jD7y?!B-(OPSFrjH){#G~@Lg#6@#)7P60 zIdh!=FRv{vczRmW6YE;+)gnE=V1tKhz%_k~(J4f9ZuMYz=(j$w|42HuD_l zy#CfNA7!;fMqISnNC4Qz(eE7T28~5jceb3Kw$-ry!6yNT(J+*%*EoBU<^CtizYM+Z zp2!e0?W}|?sSPc@8dn*L8y%uOX?T_@_=l);#?F&bA0v|DQcjiun(Y<4SQL=sC+X-L zvFRn*XhmIkM5i79oFJs(xWGg{&*eZ<9`pz$i~TUi3n`QSgA28(L%cx^^IkPFC(nm` zy6i=MNoKLW`xEJVFK-nJXo&16!y?#TGS(rCIaS8Xj(e?H?Ty!tA8eUd?PMF^?mna{ zy@rbsJOqfb(qTvJ8kuw}G+a!uI_%`G9t}ek`U)b0{P~-0fHv+OkVN9Dr6A(<{x7!v z#QqipdxMpGon24W3AUch+GzE>^_8)QySXrG^_^8C$?#&eoEw?!S=tiuP0Ev88If+* zP~C0qt+M*hMQ*&ALFSWi{>gkG2$q?oed$_#Q4X-!D@6+gZ)LVHC;c%^!1(UVTg#PV z=e@$nr0CdtGxczS-CJG%Qydwuw}jV~JCfsU9yfUttL8t^QC*Gq*?h|V^SOsx^*Cp{*)(P}3OXZmPnFkSyO525y`3{i+h(U}`nRc@*dA{I2(vHF_` zQDX;5?dYiSep0b$EN92|7v{Fk8H-ZO12>cdq-@4<>4a^XK!1fIP*i-;zJMne>6Go% zbt9{_YeNw1DLZI;=eJrFw>(&wo9mW2cvcB$p)Jih^T**|O(8KsHV^^F|6&GM1}QJj zO!*|S6I2G{g{d_ImGOqc%OO10363KaDt0m8Nhx8%h?clI5HL;OJ==_W8%t8H z?aaI1d-46)Pk(6sXz-U(ym*9@hqMue zbNpah)$Xy@d1+I~Rzz_B+v=SLi_JS==+QS2&2cSI@T%lQoTC)h?527FXYMB{AZ}A;dC`AS4o}s6`NPHvrdk)=VnVE z{e#8D{`HT_hIzFl7yr&+Q~u!A?YCBE^=AtcciuV&*h_WKp1zjE5yyHz?1#Vk1ypCH z{K4t*q=NzElT%0U^*z_tEIszU7Mf4~Q7rSy`8#evpCkQi zahzb+k8Oz6i5+x5pXpO566a|lzcAGQ>8@DEnA&?IJ3Nze;jDPIKPa#BU~LLLX0r;w zPqASrH_>ennmtd)UCm@IC_lAfNK$h3&I-I^|6WOPysyjBHi2YgpW3cnHX};IOLIY; zVSB8WlXJie`y%Gch3SM=H>vyH+By?3om-2u>U_HrEP-_F=HO80#|$>6^2}E?0zk{A zOp>Q_#q`xGp@71L;glu2>$@B=@HJkOVrp5Wt-TY3V(i zhxFVY#}iLw_0+SIb;%>|UwGk(#tv1p<07K_&Hw)PvCAh8&a*HQkv^s4nSG__vR$|d zH0+b(*rI#$Z@=|goJK*+*}>_0dGAi#b!%~#55D;M77x0ZM2+tYn}aAjZCP17%A>=i zN;A$ubyg~2`qA%n6`jaj#WYg@rZV5;S~8Ps6;J18vfW4Hgs+9kHNEF=TC2M9{kNZ- z(cgDmf2;iF>XPCY%Wn?dZn*ov9#g}?gB0!jiUq|^en#Z$9}05$?q=5$T9?Litcz#% zV;g=kss0cpM3Hy|e7WpAKYfHOxMB;P7VyoW{kCCHjHu1(1m0tww0#lmN6y}!E7>JyO!Mw^8Hd1rMibZ^oM92>Y|zeI#_sdM*? z+_+yhaMN3MB2@xtyt1?6K#yC8N-sQ0n`m*lR2zPs#E8kr!I<~U=T7XjN7++gA0C*o zV!WIvYUg1|}wi}H2?Rophl2R*) z)I?x;`_r(%(q(BKNB5b$FCU#Q)wJhRjK-DG>3o{df{37+&zh8c7%Ph6I(3aC#WF}= zpW#u}QpFV;e?*}&K6?@1B4pd?v$`fQ^q&B@k-Qa;)!4w4aiAMOQ35AgBX3@67@c*W z9`|tFOEY5{lfSXRdE!OCKVh!|BaX1N78XZ)h=8t>OFm+{6=;@x8} z8mW#n?=H0rq@NO)B7*LFLp*>oqKb<`HmN^hRMEIRbjFJVRPZPOatUtJ>3YwuPBp?xVIx4lER~}*u!`It#cY< z!Ab%aE?i$}8S39L^Y*drX79IVr#VcoRcjeQ{?v()3|Km~GT?15EnUks6P-MiC)b-! zIUvqlO0_$i^GSNNzN|$k7H#rSIOUIizbdr!TE703|L(~@__rJ>7{7GqMAGfIXIjvM z^-4p<`gl_KyYolASq-7$pMASJeKuv^q6EM|ERGi@iUy@pAECehS8AJZNDnv_Jz!fh z0(&l|GA?SCC9dE?#~>Tec}Q@+yaOp9W(;(q$4(}ilLdl5f7XW`X@bub8}l=nbocDr z#{09^917OiIKBhzn;o7R+uxhuMHG$n4wy9)MPoh33|?0#x!sL-6Q*}U+|bW%HY4fZ}#gS5=<8k)%r&D6wOJD5FirJ?GY zh03E%bE%pepDmth&K41%nY1Al$6#NyY4M=_DrVcuH{O}W5WY2H?mIeq%^-_ zCgb*~|DEQ@!i&?ipjyz}uo+;qCiCwRYP^~HcWUc!Ha(oo6w8HF?@&6k0186dNL#oh ziS5xl$}a(N!cm}RloS%XPtPD5L%laeQ;r;0`JVP z9@TyabY7PX-naB@L4RlvkWSzLywtNT%zq4NNs&U#qi5TE!8-Mgdk%CS{MaJ#Bsbjr zowpd5;wGzsqYagE^3{L#+@F8_r+?$K)x0AsR-r7?|D*x2r;j>+C!B6vIl};?$x|CB zk2Z-&-{|f9TvpoL!_6;mJbOHuy!sj=-^AZ+Y@fKMd3br_V8TaW0|zI;ho1Jb@I}Z6 z_&WM97Uzf03&?$&Dd=|7ma@IL>-zM#*=9#nVsaP4_PDp%%|??3UKZJnh{J>VPWC$X zJ9Ju40lrv&;N&kfcFbLWvad?Bw(?bYmSdZ&E4|Y1PsPL!EAL4PH4N;AB|CdoMSn-Z zc7Q-Di3*ttZQkt1Q?iR6CoLn6G)$nwybog?A|*KGfi=VAVC0W%s3vh+Z-=@Mulc!u z`LBO_*V#*!i0cxOJ?Lf3gO0Y>fq)v=AR%psIXLC7LliddBhw%cXsoeZ@>Zbg3=XXW z7%!w8>@J%!*CNBUhPK|#X%xrHasB4j=|{%8tX3;8W9&gI;Ej0e7tWnw{ zG}%rOiHsHNhAQ1Abg;wD`Qp^{p_XEYQ*c2{Si{}}Bjtq(IdP51ugp*R5c#pRY1KLR z{XU^i zC&R!q%wAkobv>I?{;R1U6yGvWwP&Piz&K)?)=yl^m0MZj)&tDLwHj`ZGsPq6nenbJ z>OP}FZXz|evv;v|rlx@?oxdXIZYt>-DQ8C__uA-csg)$F40b@gUV#qbhNU#U zzBd}bF`-_5-70{g>NSXhBSaG-mo!t+jGNDL94~=yJWaRWc=;HU~rpD@4peGd&G1O#CA=qiqXmW%H0FafNEp}l!Hn0kIzJ5$A zjU+mDLCm(EPFwo!6TN+5B3n#Yu!EbTktUTsEw;wKD5pEf*zU{&hb;^dtO-AMYF#z?&p&+W_jdfz_xcC zvteeDEChe2Wv~QP62NsU_f@Wlh9JExx8f)osIKWFki^Pg!PM}3*mI)e zl|5IeF*-LC(81wGpe#2KD>VVb1!YY;GYYR#u-K&cUNya^}NJu zQ}Spkvy-6C?>s$qbY;&X3E2G6*=?4UiGZw!knG}y^#*_gBdZ7HS~=!Ps?eEC6wAsT zF1)jtZ?R@_IqTb8Tg-M%l#TL_jWSP46XL1rzWdkDZ}|D8Kl!s?>I>84waVDs+fU9+ z%V~tPyb?xFlTCN8f?DwFjwBgv`?bp?=EoI%+4J(rf+cKj(Zje zW@j&!({*EY+rA`-vFDR8duJ+nbn>+DHH!{J zj@#kIWPw(qTxjo3!E~$KmB~VtF^MeB)Kcu?n5-5vdvishq4E9iEf38kj{nhneNMOC zxrX%Ir46~!j{TazuGjNJNwt=!lylI7QZg2w!NMqalzy#LxHrFHIbH1NvgcHSjh$7DfHHLZ*keDKx9&FAu+V?HXYay+EoLrR ze2Go#4a@x(u_}G7OP_h?^HlpgD9TU^jq<0FaW1Oj8!LZC|3Atfgc5hqv z!4eV>fBcyoB(VGbdv4glA93@amfLq^rrb8Q_wy&_{_@Q~{HN;;V?$7?V?B%htFpR# z&+MG1SGtyD%?v5`BPg-??DwPu^M)7=`GS2#kyA(6*Re5_?#%jAZoU7WUW z4w-5Q^}U9(=g-_}8k_w%EU|d~wB_(l5NAH$X@~HzYkG4N;}=d)bKvx~fmYK%o3y=9 z48ASF3FmvBi%j}#zHMJDYdLqwWgWEaMO?Ff5ZIpO{dU|9BrR>u=00Mg?hs(WIC?ur zZJTXxAOe&*KIacz%JzFHcJoe#97%ju@FZT0ln^+n)#IovJ6RHGB>V}d(&YD3s8t=oeswMF>3 zZa5jZQN7en)PFgd1GCZsj!!a)iEeMY8JUy=&I8AsCA1e}nLss_st`|&CsS+Yjjc4p z!yzu5(*vQx$=XuPGK$#YMrocK3aGmqwlfeadcL-#O!HetMq{s_mK5b{upw@g4VEpA z2XdFR4z%4{bpp7gH7(T68E2^8VtP(|+PuVf`&^b6EIgYyGab8hoL-R+Y+4YcVT4{7 z9Jsu$!sf(Em8aKZk&!sEt+yeYZ*8m9@dlFP{TQ76d~Iu)XGIFA`ffjXFy?2^Cf&^o zH~Mn&jO=lyN1zW)HnWB8^PW602Rn^t@we^)4rCdbTD7vV|0{HmDLN}| zCRFXi=Y3oTAWMyRbZXoCNPDDjJusz?LdUNl#$Xf6gKJ+rdi7WS^?^@+?F;|QX5Iwh zO>}Ho%`n=i9ns{emam*Ghp{X+3VHOv(XGqijyaR&E?SJ#q_z-E?&D8omfKF>3KYZn z=W(MVVsDKM{^AJZ6(G%2l!Kn=|9GEq z`SKgDZ76uMeTCi&20K$B>^TItqobG`;uZ?>(~OGxsOD z+xLa|r!6RKL3`wXeJGC`{io+jZOj|AVbBIX-N~JQ^H(pQZ2QZF-}r;RdDAGNIO$IR zr}?9*YYafmfy7@ODCj+ElCekNa1J+2fjnbh$v<8f@V}e>IuL zpf4s+bhC&Gm<$*vjNM}77sW&qLS10wakVnrv4=y9dDZvf_P4O!zbwZ(Uy7R+r6 zZ_+S;_ixNY^gH368FA!DnWdpht(?{*OplEv?HxugjF;+gFS%i)Yi!IcFQ-Q)rptx> zQ2MU?4b+Gpl#cd^%BQxI$@vdRQPvfjf8mFho)?4(3Mgu8r_Q9Bond*R@44fjb7;$i z?W@cwUQ4?QAwhC+M2Fj2}ChZnMfVaur4TE4YHBY&l5=Fn(fj|aXPiau^1Boe@5^BaaDQ3g6VN+W<&2I3i=ck8#@_nnIB|pDiU{)U z>&Hq_OH9I=nA>LAlNnU)(R=gn{cN5#?%u0MF4osU>Pn>P*Xy)_Nnao++*aVvs z3v$|lmwVJ-OKQ`UGuvL31vJpVelmi2W_h*a zhSC$IY{ztI=t(gdqY>6=kTSezm&JOj1izafoz$E7PWvbEIZ*2bx8X`IDCHg$RH>!qAH zcp{`!y404c#y$<}Q4(ah)paT{jAg7`$m|tQFqE82HOBccP+3XlcP97ujiE;Dz^lxi zDH5b*vh4}g?d8qw2Cj1wvN8pU@!)EmNo*}m5!9)3$wKxz-G6;=OL~;YZ#NTOEJ5>9 zP1Ls5Bc4vQg3PGO#5&-DWecaY30Y0AZ%wkxTO&UynMje^4^-}1l&CMDD@4UHx8hOq z6|iTO>KgN2nX(5(BVs>8YA+sT`b;tTO}@-$rm^|^o;c`o>>o2-npVT(mowVN?fR>(dmbZZ(k4;&=0}So4K0Jci^LB*p@khhED3bG z(e*YifmsM8Wx2H^c!^ZyH-kXW-AfHs&y;3%+D%w{i9thY3W-E%{<*nhsBL#AgaDO*vy6Ea<322DOAta=I(62o9%>x z62w}UpvAs^h_DF6&_j&EvN(s$&{JdVngmSPo|8&a1C)7%60Y}7!`=#|c%?JsvS;S- z)8bo`LdKi4;C<Hwai!NH`uABV$rrL;t769*J-A zA}UoiuIRhxGEO5hh+qBo4}9mDxBka}^V2K8dS~Vzf~bSIQ0r>Ycu8_e(e;)9M^X}Y zn*_9Dn~m$!VF8B=5W+#}UNj$x(>w81ZMnfKw3BWDBwoH1D%973md#|zcng@Ql-l*h zTP&hU=XW>H948s{>wKBmx!u;(NiS%8$ueAKP#^hiUJ0JLDt#;CG(u)Mss7}NEkUA{ zZ0F1jKwD3!R1%rj;DlM@mtK2gfUub?;bfY?X*x*4)B<^&=-Y#zn80~x=shOmr{BMe z*nRc=mu0n|m&C?nnxv}r5AKnop;wiimo|pWem&WowsN^(-SEwo%fhPk=9GyqsPq5n zfBX19{?`4UntkJE-~VrZ{AH zl|u(XG4;u@)@*<}c|Zogtc!IKiRd)jnbnd^X1o-_EKjfPy#eWN9L<|}<~O&O3bON% zS};|7KQ30%3$!!#PNYZig$Cz8R1MEM;~Eamg9k%<$j_T9f=!ATlqVtMlG`NjJu+MUM+2d=M_J~F_A zX6fNHjQ(6-mDO-CQn4zdNn^2jFh!8-bZ~PEsvovFizCw><>vC<{mL|f%(+b4I8t-c z)ewiE12%k~f*Q1$za_uG-twL>!D7#mD_craAF$Unaq!H*ZYjUu9y@?T%Hj)&{ zkkfzKTB{2?sSeb5rq`una+j&2D64~6=h4^wj}i9H9bHqz^IUygxbI-O2NM**Q|09T zGmV{-LT(G0dDcU@lK3!j=o@d$*J458cb*ng%c3XpG%PfCVwK5ISPe}Oe0Vpd2|&P) z>kF!HU;Bf<`X~1ufB#co`sT^5KTIllE{{*g?-I=~fkKBEISK)0k!+YhiWJ-&y!=&9 z)rW93{nP6P(#6u=94m~VM4|_~VeO;%+@j$oXHB$oKP12Jx5u_=DMX6@?YB-xL4(nj z_18*`R#jcTLWU3CW0EZdb2^ zaGY3>FqocjDW_p3Ve0gj2pg3+3uLG%coEaxShKnVBCzzVOW2Sz4MiB^lY6IkS@+T1`5u|GGV*D_-L&eHeF9Bi(dMl!p()9wBupZKzauiYX?i0(cOPf-c zEq&vEn5-jm!j}SnKpnt0tbvz=x|P^hnjn6hmi5qlrYbd{v&7oq!}nHp_dEh&gZRdmDFJEvMyGsMhLv3VC4&;upVOnD+&*0@$7dQwKUA>fw zK02SRHP$Xvf8$SWF4qe)B%4Et7!#K- zCZp5BNagZVe6eWcQs;;R2vZe;rs?tV-AKG*1XATj_EQWbyLqgj3yu5RMpbn9|Ml&6 zXQqLb=j!07+BgC|7pviLGh0g{sVNVp>oSq*Z+>C^#M!&mlwIW)HPWjwE;oI4<9@mF z-Ob>?phtX;D7}4_jD9E`p7{M{NPxtMaah!ecC8nTh^kmfNNkd_F{KCu>6(D0+j@6v zd^lQOe{FYf1p-;YHjYQX)&_=%Uonu7P?7&s#~UgDt$;L^p4WHMz}g2I!D*CoOIv_5 z?2=o6=CUPTySfL_sWX^c_h8rap&Vo}WTk2&ihOM=2E5@H@;`p-uiyRrk1g-Geg4E> z{q=)AcVN0#X>_Pox|<@cv>N;AB5KDRi@n2goNv6a)|FWv$~9VH10-A8WMx&kwe5CO zV4v@N-Ur$Ck}i}@Z80&jG|ZQ)V;#ER;OA7xrE9AZ)u5EeMxZh)UsuKHEkD^k3I$u2 z*2Z5yHd9;YeMn^7&`B1oyf>#3&vqptgN(D8tg3dl3=!xOD=eRb*D`sM!$ZHDAJ8F* zo@n+~lw@qqt_LUiYgtsz$o?>MktoT*Faj9ECH0u^$&nYUQ#CBv^88j_b6lG3&z^rP zTu@mT(LvH+PeF?)a#<-oQtgwNp%`d9CFM%22{@!{K@fLpiD>wzle@|M(Jtjpca?dt zD_mOt`NrCx`knvd4}be-f1r8v$NuWvZ@>Oqhc*rOZ%bA5KUM-nHU~*XM6S@T)744R zSfYr-3}Fb2D0+gmEp!_X9&3_Th9>SJ3+qjg{vof>@SrJ*p)81DOjwHE_C%q{_VC2+ zHvKLU%0j zunIM|f%y^qqCtoU>(0t($W<^hvIg!yBPuG7#a~t)$b@schufXBBgS=>e)|KS4&MkTo$LOOE+OMC!uKJMSFPk(Hp+-HrcGJ+8 zT*S7C)fcwx`66b$l;Rc$Rnk*pEAKL5CM)k?5`lW_VmJCJy^&oSrSms^Tw&~NyWZDv z=a?_*d3mfOhTLped0!z+JPn<N9;``jPFspWqg4_klMc zr&U_<%T;8T9aA6>R@7>3YiP8RG!!70l39Hn6T&p|kv*p!S zY~n<+l5TwT+GlXQgKy?nSE77K0ZzGD6Yr2*cvvKmFY?)>(gYNzb#4vG7kYrfHREXl zgY_TwWX+>w)wxKnS)Kf!ygwlr>-Ljj=~A!Kqq@QQln~s39CMnS?@7JYE5%Wm)J#hH zLoON7LtGUt9hKMN=;lUJBUplX?s#iE*ErFg2b}Kdos0yxh6=7+=e5xtpSa|J)R2_u z)vfIkyR|IH*6L|h-dJLP$c#J-4dNUB^e_I)t1te*|L`aOa^+7ZfBpaZo9T-``?>G` zoqw|b3Mpv9X;6v7zHhzG??kJeIgHT9F1*Jfx{_Z%ChD2H^TfgXcgFyd!YPaoCn=y! zmvpPz;WvnKP^4o%XDQv(Ui0L&-MWAG`jx#04x`IK*z`KBwyqS>=o6`ig4sU5?dwg4t>Sk=&eKR}sh(^ZY33hZ3kx$er7HF8_0tO+R^)({dJ^069+eR{t`kspq#=hK ztq(#q8-Vj?tPur*_+8#%sM4Q=LL zPb9>>(*aUM>Y2>yUKE(J^)d<0v7u`JTEY^F(03l%Se;L_Dp{uSMC(-;idbf=8|>rl zOZIwGT~@EhSx!RQ2h@FQp(IH%K1`rNYRb_GMI-g6KMbl#TCyDzi7f<4hYLeIo``Wu z`Ub?(KGp%sOtrzfOa9Ho?YB-56yZ4EerM^Wjlch9fmu%gWt>{2ZRwT2c>elnMgmDR z&%Lx3(dgwCN}l#r`t-9A%JDTSg{N2ExxI4vz2~-XqmpcR@a?xTVc#X7-(}$zO02E+ z_5bzQ#y|S}n?HZ`g;&4!l^YK}^HT@gKGt9L?lUVg_GJ0WBXxK=*gUrrWz;cuR_@Q6 zQ&xOB_}$I?UK>(gCuGL$J-Ay`^3YFv@IJ{1uD(wG;dr$Lmw?UD=VT1MEKz5Yn+U|_ z&Y^+aRKBv$SwYTy4+hei)GOAJsS^py<)PN9=ENW`^Pu_Fha(ov)38UVHxi1jsR;%Z9%o@cKDso-$*y(j+S~KIL17(I)TYPvc(nAPZLm7c zY1`n$B5t}lSlPE|d23@brTi^~KD@V*++O^~oB!_DKi7ZsKm6(c^mFIG_H%!Es^fR= z{pe3WKi~7U?_2&{L)#Fpbb2+#-4xhvyHCNjRrF(L4Aj|&oa?bn3mLLFgOR){fXNjj;|!W=OWqo!FzUucp>|i#A|v1 zIwhVijfp9X~43P2&M7ll?Tlos3UQEU^p>tAD#7L#lOAtEov^S*W! zW_|t1%gq(c&1&sbj|uTU-ZS3_}fY{$fV>pSso%2oCF zS*L0D{au@8FB0hNd2p4a3vR_Qc zmeMGsT&*2EG)rFi1BYjy&6N$-c;wPYKNH7PD*w?4w#s$e{n-ue}#R81(| zD9o<+s{*uWAEyc4TgkVL&s{6;s)l8IoL6z_?PS0{oKsr%Ro4^mm$z=ub8OR~??P={U}QAPnIJpMH)tkU>Ko#Wrm3`aND3seQjKpu z8A(c5%5(#hbb17#Q($eeCwbisfes=;CXV_Eb7wp{>x=el^X<#Y{G0Q@`F!cm|HI!| zfA^W6e*Vkv|KyABe*JI%i$DM76AK3r@j{o~_{=E$?B0YLNe>%jR_o{OG z$c(zoFa!KawZ41Bd*eyXW?V>f4l4YlQ*5Wdz%;|j5V~2|>(cpDvn=>xr@jVk+*x-` ztc^SlcSOSxmLai3^pBidQrgs)tg$C&Jre$IbJLyd*cx^t>WORC6h&oW&tmXIj z{o6DG(&;_>tWFm05c@nxq-H;^GNqbRg~@U?dGwC!c4foTCNsh7I+m$RF_0vi9N8xh z3fFNON6&3bmbh>!?v1GmJw1VOvagkum%Eq|F_}1&ukd?LH&@r7nezpyF9v&In81*w zK-emIx(kxYi5}JH3^;FxWf}pv5C|4WFjR)wO!WV=H$T{IK#DNLsd~S*AySZ5n{eli z62MJ!m!*yzhDrA1s>pyzYgP7IhB^VJfZQA@-rc8D1PINQfbDas!gzh4I_>;_tVsoM z_u;%t=K*}v)PFC5bBBpe97ep$RF8Hkop>DJVYs3nCj%jU+8$nukXi4c#n|4M*LRcc zS8D6FoT>c8Yv2BXrGsDph0b@^|H_~J%HLaA`|Z-V|D=0CkM`6+SoKDePP1O#M}B5i z;-&=>eTMjxIo{}mZIEQuf+q-{kG)`xo%gs)g-5#JHw)vy(t%1-9a0@FRo>BmR1#wE zFbhX~WudsM7


Oqmc^XOCc)(9_Dh$Pv&9Hw34f%!qc*1^4V140Ch>L4 zWcwnLC(Bc2BNr1;|HWAL`XLw4hf}t>>eBty{mS2=ZUPNKz7BXGzI{zCHKZe{|>Ocb5O?Qq%dx)8~KT-~Z{aAG-Iq z`}eNDJ9BtkUjIJ0s_^ zT4vn|oAbS-y450EfBtx%6j}jxCk?{nt6_j-?pEC^I=0w_o0bH}gw7-rc!u)SI1(#+ z4WXs##C3St)djK3w$$>WcZL8$0}BHS`%krAXxJ;(P|whSvQQlN418bGGCKQ%d6fxr zTTN26OfFYTZGcc;N!4@pMv|zx4V4!1#65}E7yIa_JuJh$RWR;c_h{-9J%!p!i58>q zRmXah+tEhd8>=r2e5nxvZ=|vMB82OLS}KL@`d5qtzW&hP)@2J zt5W@B>(jrG`Fi!vcIQrtU0Y8xw{y`4YH2HaFX17Yp42B2yPVvg#8N>ciFLmJ^IS4!l6W~NJwdDH0!72CHWz-u%`dxXto95BWFfPwXWOe9 zVG6=p%IeVfEe~BRMBlcDc6&?o%XzC0FLZNOyka;!zq21sIfwb^EFTzYZ#Kd=gI1GY zmQ51WL$&9l$25%-n~gUlrHEY0sbWBwCf59Up(pFd(C=G=e{(9d;rledrnf4zKUIP4 za~}o__smVX1;WdXf{8r-#)M3-1F<-!0cDO<{@ekl*_FG=^8EMCmC57Zn_V% zDP^0(Z9RLwD3@wg{T534_VFScAYa3Dg+F^{p{AQ zVOk7XM?xSaWy$1P)VH_#CdfWPrddNJWUsnzL6g$<^2UW%*M^F-p0oYrl~ip_meP)N zu4b`n!5AXamI1tA#ud!O(iL{hHbPb zTK@YJ$h$9}y52CH2H@j}fE5HP$1dQhlY51RPZ0d0{Z`U9B%l=!7CPq42dfH%wB<%m zB$0`46!V0BKbq%4t%#uR%XO;R7gM9%LXE1)D6X*DTt#({cG_^e`oSBbySl#O*@Bn1 zIw|c`s%EO8hdLZk*hsx<)TrLh)RXF={3movin1zwC6zQ30YeTCq}YMOVcpZ_<$l(7gj*?^M`js0v)LqH4#eca+0|0YJg2;!Mgm(|kyxg+uVE6yC_>J+S zzw{4iGqx)HoU9VvY`buV(ScnMrd}q$eB#|JI~O$z)w<2ATewxs!WU4$UX_A- zf#XP}{3UKRmG_U!{z-Ysy@ag+c??%mU6za3o0)SxA|dHCbujMa$yRTdNAkXw zZ9+pNzVFWVn}a~Sx?J(Qg!i1+zD`s|8$SxN%P# zg5>bUCGsymIIWF*c-S%i;EO=eD=%&2X0l%(JzB0FvOOn(=H881;9a0%={Jy#Zz6#S zQgrG&=Tp~DGg3(tDFry)ZDq?4c;Tel7J9{!^Tv_(il=Ss=V*Uu@=srv^CP{2GqoA+y|jsQd;_q zk2*fPK80smIWl`uX}3}$!jX_BSJXBZJ%jtIcwHmCwqK4p}GUmwQxq$6a(u{h3_g6 z%%MCZF}{Bl{2h0s8YE5v1ANMD)4qJsbGh;X60kC*g1>x(p)$xN5*@gPI~zSExVw>8 zQiHqnqMzR3WFZuAykQs*cUxW4lZAX7xwKW}Q2Nz}g&3&rI6Rdshn~r~^WMx(OKS#+ zF~-W(WYYV&uL6m5IM#U+C-S{Zhnw+OT@F&bR2eT!V?DlGW8QiCg(r1;bKNxndhFK; z&7@58BWG<=l9qr}*N|3B6BJNh(1`y^h_SCXjTE)p>Cuw)!O3s+zmUz(_f+YPxHU!3 z?#0fiqcj>%4b52cxHJZlDCZ{Yd%+_pf)q$zz7}+-E1_nQE>s+i@lu8&6ppvjhN7<3 zGG7%~+V`A1GfF92e4(CNA(c2fH64~mTMas)Oc1cV^ZCVUrgdPswXLI}4LJF1!A+*C z_~aB8y=&~Q$f}29hID4cg|;T-f6~{wa8sZ`q&;XZR`Kl@Pqd1r^g`aTK)3=u3i$nq z#!QPR(#6MadcL&nG0l@Onr*g)?0N9s<+@4K`>}*~;X8t*A6)F8u4DKP=T*g>{rms% z1%(DGSqJ*uZqmJ0cUF>kguu~nB0SApn!C!%o83us@8bRUwzt)|wm*G0I|)5V9<15E zUam$%Uz?Wb)rYw7aHPLUt-J98tt1Mw2~4vskodeu+Hn>f^}E|`p?*0Tq4p23o)w-1 z%{TkF$4R_V5)2TIyMz9u!se8oT>ZfAakXx{_4TGP|Cp{9qN!4HjOI(%yt1ARX5>_N zY1=Qo_uL$&@YAF5bSjh{=6#v+UzPzwCEgnkXNx=MWs?>3-gdZI+iHt?;_tB5tc*TY z57fTcuv|UyCH?iovF{v_8UV_pzL{KCIQYZ#BqiUR9rR6Ks;F7lwvQhyW+i$l1Q5Y0 zm-V5(k2aB!y!!B4QApS{g_yKb4z@)KxyW5)+xoGCAA4|0p3vz!>Y8+-z{*}VzNycEn$*6`u;777qx zTzGh>$q_h3P!1DHrsq!8=Tj4j_X{Efbz>4WwqVDA{%mLwITG`{Ha<`p8*>dnM>D|e zS7@R}lT~mYdYgy#lBcq| zhK1NI74m6&^lE1EUBkn8G^)=@Pbe?O!Bv^K^Q4!Y3fPO;WV7H{=j@J-5^%2OmgQBN z$KYGJ&W7y78kOpXD;l5`Bs+a^<4=%fQh?l5_g?zsm~l$89t9Z5K$IWA%%{>y@RQlv z^oj3kc21iCE`ZsJsR)a#SJxCsV+CROJFyHAlsK0tjd+Yl$(Fej-;8?tY$(_@jHH(V zbFH$~744}iwZ1r#jC|*5E0(Y3<|O$FOK>V=hWgjH&mI3%WM8b5Te8ukMJCwliVpu? z`B8zt$A6=~JuKyPm&P^)?{V3^{!7J7fdx1QLdVE!>#8ArSSjEC#e88}t6BGH2DG=1 zzu8?%GVu!V<|I|xKS>bxzCaS-&deRoVJEndhls2!I&k%eOU0+cORII!dWEf#-H@2! z0GEol^RZo0ZsW)fA6F zB(?4F&F=&t=>6c_)OZ$Md!@Ly!Pic$d_b@N$cC&)pEyg}w(*8LxY~{mRpZjEf>}$j zwpa2WJ(j)QRP-VwkG|0h_*4y*v@c)q%iBgAr<*h@-uCsWxDxN#&?jg<>D%_BI;o&f zt{)Q4B~OzkHK}zsEM7+G6R##FOb+UPLN(800A_)p3?%p0xIATz{RBsG!OE^c2(Br| z8ARBeO;8@L&kZD1Pkr0Ug2f0K@4t9rqXbYHtVGKI%Oju!io(U7=zYKwA5z=dZ6-}L z{kowUVegsBq%KZ1tP(Mk%}G>9?p5@ck}tF4me0`Yz>kuNH=2L#FU!U>>1xT%zU&Cs zyus~GxFC*6|E<;a}83AsvBd`~K$ z;{}Zw1-ssRZ<&TGB3#>YBN>`gYMu7{Kz2&Cdo8o@AQb}EixFsWV2j-q5+;iywN&O@ zX<;xBm!4c;tRRDTpYX4?Oj*9w3v1e;HSx4BL`rZMdX5<;R|vSi{q|HBmg+$wjA3r3?uNMwQ4wb zr7e7O@$g!X8nEz0PXPg=$`2u*$r|g{1s!3_Sqx=}i09WxGOWg? z_z11yQg^dJLRYK_<_ucb=B38kQdSISoA=J7_NT{B$I+CGbRi~6fV474-340%s`a6? zhCJi?F$Bm#ux?EJDdWd^V!AcC4sELs+$Pt;Jry!~1ZFHlhRRdp*v0gdD)?t{3iF$Z zA89%$5p@Lq>~pe;avg$?NTugDOU}B}WM{x2IrkfTdNuXu>$tuUtj60k*fydQbN9QY>M5UgqyfWG_Zj!0@bXo}j-OY_?^X38;=_J`CnDLGzC30d zQM}^ZHB{!6)nI&=?E1>)?;g6pYcpx*ga+-0@TZ}9J7=Zk)-t9nS}=e{apd4jL)5V-*M{RWoA1YtFMax1fhXeQq= z^4C)Hs~|6*G^3&&WB!B9uS*^)&-ZZMcxDh@KpXn+@BNz^{?2Qf9+P+n0|?A#2!{0Z zy-E^s)6ZXAJFUbp$_=Ldl-Gm#+`PImL4-duMbVcUHzW3htSv`^?l$uYnKR8;j%LdAdE5n_wLsnpqb~dCkPYlUfq;W>2nG1BzOoNgAic@j8eJ5Cq^( zyuE!mEvLoO0;6)sC{#lya(h#m&n4o6F$6RDwAjLy$2TvURTBk7YenV zEp68uZl+aVdq;~Y`_r6D9m4;lg)M4 zl7O)E9+{C6+Nubq;7M$5C?AR8Tguro#Q=i562;hXa>n_5Ql{InQ)h*$9I)_VErDdf z<5~v@{cQBV_N9Pq#!bhbg}dkCy1o#C06JMoS_$Tj0O zU($)wUg{9x49IVnXNqZMV_A%!PtZeK!M9P1ty3qGt`Kh9aR_zxo{e|g@ql$X1X9<4 z5^EUkAvPiTg@wwkT-wBINDRv}(5X3AS<#jB-B&I=tW3Rq?3F|05!h%rlNUL--6Clw zh=rjh-sOle4THe(!amW6?a4&l&u>_jfL%PY!L(BJ$z$hIeyF!?6fxsh)O&>y*N#s_ z4_6#%!tn@b`%L7c{g5u??PI)B`ZiTlHH>&zW|9I-H4zI;>`ehQ=KP6$CyR+)X37XM zIh!B^=rSW4+C;0faFH6)v;uXr`$ylGo@DA@EJP#b$4>WDH>Agb#<DA9nD2*%zN#A;ag{F)kp7G6em#Sn6 zqYk5FEa~c)sHNiVtoMnYi1EWpXWO9Pp4W0pu_wEhp@U&2k4Df|cQRQ>roVV5K>**F zFIq%H#cnvnCzWHXm2*7mgyet!H$19i^0@s~VNKPC%%vo_wpQb~jWh$ZYapH2oR3;u z-7v((!ojE{^%n5#QIsHqYOf=Ik9*+9Hn?kA^^c4*=C^4}vtWx?Xx!BBn?za^Yrg18 zqCbpdG7bR|i0^K%>~`F#TWJuwop({=%kw8(4&BbGQ0sdg!;>>T@*ZG1ZbZ)aA65s| z{Gu3rKTKm4;hzV#+~e0iGj^~LlatWM$O%&VA|fptdp>&ceox&P;?U50JdYroc*B7DuY@-FUshyx5^kFnULI zqVc5NCn%!OuyJ7nCBL6DQ-YrNZF@DajId?~PDv6VH}TSm&jIyvVtMtqGJZU~N4R(3M)~BbcpXkk^mVLCtvn2h$E~-m~FEKS){ep^-{8px%|2 zKOtr_e!S;9)?=JGCAcIq)>Vbr0sP`oW3G$xaMRq;2+t@}<{z6G8}0V6SgRc7)Wiz` zyOvh4H`GMJSa!x~-z0UMmZb?*89Cav1*QcVoJ&gHQZ2vp-C-jnZsM9RF1;gUHf?j> z70VZjliY(qnF$-FZ%tj=oWhk$H3viBBdyDzq>I$J=U)9J&M`{faQ}|Q0bGiHAbJYv zz7*7jyFzWOvaf=dj&@8(y7BP*wZu0#WYa2Le?)#vdDNFalV*ptKN|mLCR(hNzvpnf zIL^_p77}~;xTeg|7F!2AnUvFdOo1ETw+V0h`9{+*l1PU$YKD&HVZF16Ul;rJa;*1# z`F)bl3rB2#ord5yDC%hk#-E@fg_S7RMW1pDDut>FBc4r;dLYn!V9(%-OdK znL@JrJ|+VqK-mM6wKMKE-siE@K(?m;Owx0ThzbkEm;IsH*5X@HnVj?F4qsjuZ$p6W zIai>jPgy!VwKGD@t5J{w(z`X_2$@Rl%V8N7eFNr#%V;o}>&Tv9^(sk2SZuuGRH#jl z(zH(IfV5|=CG<9uK))bG{;8oBItz!Q`G0xPZV6Qvq7 z^y!I|b!jhbNIt>S+0X#H>vo@AUSAWnb|unp05Wm4;|#ljuk& z$Ekic47`~jSoO0$g!W`2HQghly=xl1yW!-+af1@CTYEV7HeM@8e!^lT|#7GlT zG0@S#q8}g2H##h+v1{dO{CnDtm~sxy-pqDePs_!A;wc&^zg5`HKFv4C+{ZYWCxllf zn(yD0P?(T(_Z4)Rgq8%A+Sc9oPrWjyVk+t0U~x+2mXH2UCJW0q-Q8J%R~AHy=MWb< zaN9T*vJHE6%WV6O;H7UBAUMSDe%EgM$%t{+IjZBhJ3T1;KfRkX6^7*1w2;HeCqx7onLjdVoHRJ#4vyc8ZYR;hor3g@m%&g1lRouC)v@=AB#rLArPne@8QkzmRm~cp z%c@fbusnJFtzR6ooW`1aAGW`$MO^S_tUHLHNYSkQ_T#+z0)lTk#;LWvVezy^3;Z8( z+~7lZ6fCl*|CQTKx~aHPI1I?npG{F;K*Tyn)hoE+<(lx=z37X=)oof+1Exzoqq+r$8`%Jn&1*P2Y1bJ^WYj%$GJ^cLFDIpl(a2D&;Cd zJW>ye?T~3*%Ka1Kj4A1!9B8fJIhYN*laaC8D|2VdU;UvvvyQjp#KBfj8O^hMp+y2Q z*(y-9W6Y|QsSVGqYO*Q41{N*OmWZ^*a|*=0H{&2HQ?k8wb$}@E;?d{@x5u;^z8nvh z$@1d+jT5*>tajh6Y66N#BYgdi!?N{`_eohAJ@|=OB>nWbj&u_hEIWE%7}=;RPkc%b zbn(d9AOjW3)nhvjog=Trgg_)bJtkwq+UFhvj`#T416w+rv~wW}1GJERQ(#DXgMVr~ zX8`8|o&gUx#&6$3YhmJ0sLSd^>7Qb2aa_%?s`lx~vFBu=&+@kIAQGCUEmGmpAz z2)f21U|Ag#)%-GRLHv7o3T_82#nBMkqsuQnEZ*e7w{ndjj)zR%qa2gquy<7_eT3Z{M@>2dxp*~H5m zKO4vG(_T1I75Bmm^jV4y+L7lwrfX+N{{#a})XrK9;3;~u#)D`7;C_|u3@_rMM=N!I z-#A|QvEjCcUM3llS zpk?{onBc-p4sw7hSm!$&=!D34^wrn7)Nb+?6s=vphm@6io7X0fU`!E&TEw0>;;^!S zt>M1P^+T6a$*8lIhzQd3>F*8YfYxlvs;G2FN2HR+cR#SD9+W{C2nvlQ=@D_M4N%z> z8AjN*s28fKaTSn8Qi7g1fIdbY zc?HShP6kxG*f$drm_bM8|7^fMs$XzyYcARuYK=`GSTcb%GT_=uhLWfQRQs(R{yKv| zX`y;8{BNt*XCa<+;)P_=dMG_x zK8*kwP3mptUtV1Ey-TG^7W1}x_8Ut|X$4*@zMnUnNAO#``uDb9l0 z10x~*^BpS=tq39VV$bfXjC7SLNb;42f>l#q$(vcbSl+c7=s>5U$B=A@*kX=ZU3Kg{ zv85;x4c?Hgd*dc4;%MaD#Ra1{iy=Hngc2O3#A3OjKp2Zg2|*)^jAy4frVDG{o33Hg z>RBz$5Qw~$=ooP8X_6j#I#lG_wUJk>U0lN1bCbGZ8)8#e^u-TA0HD@*gW+d_K{4I} zhpz^j7h2?{ozi8ReNDmQmp2sD78J<|tXJP%JXtog>|VAwL-l#x7OXvC?5NQIL38SM z?M=Bn*$bbn`N<_a^m?-bLiXBpMA4LsnLZ7#K4OQ4q=yAz9p#{o+iRAArRPq3?*5vd zoTsvfN9R16AiwP;h1Mf-TAjSQu(!3^9B@T4<_DE4Bhrtk zn8 zB4PFIC-9{l=#?PYvFeDd2e4qhR}W#=jkeM`=Gem~-|*t%AIKZ#F!YYERBO@)?V&_K z;*Q0Z#(QM(#$I1xDia`YlDUy>7FFu}KdCX{lWlNk$dju*u`ystxZ|pciD)rTF^CMN z<+j6w&3m!B)v14rH9nEV@m$;Ja8QUQ(4Xt?e82I@gSB8 zZ1xqBmul(3UGf*N_pro@kWGvw-~|yiOD|HHtVP{CZPG6XqW9E|LP}Ov?+tQQGhhVY zWhc-vmEh0~9!a{0%kcnCirB%}mH^?ZgmE%`52{8VqxT&QlCT2A3KqUt((?6+;SEhX zsXSok!G*C71FTR9Pm7}7Qh^ws)qaf&tnyGuh zr|OlVlBWnKaE)vE%QlL~Nr~X;^7rj^$dAHPzc-pSh^jXSdT4~x zd-<}Rx_L+*#iH58pd~&XyE%y5UU2s2nPJ;HCMSOXiiibI?j|RBPa%^nC*HB@&H_*A zDzfKbePNX|ppT&t$R?7iTyR@j>g zBeO5EvFhdRv6cB$VHt9m)ho^k`2a2R8z7$V^(@~1;-*F&f8*5g)~1xLTGRjf_Sbvm zFkBGMfWxQ5tm+#c>=WTk_eZ)5fJkeWVp+0|-D7!wm)nzMEv$<2;%jH;66Cv*`7K?vJ@y87ZQtZblpn5n5ZwG(&h<>c$)G_>A4tJ0M&v49gUQv z`)hjTZMtQIAZ~0ue2K!GC9Flh+A+$Dk=S5C|KB?L-6t&yc(^&lwbCn-NA_l@{j)Dp z(jahRlrVA$h#u?q?-11xUZTW^uCNsIdw(frWJq3cr>&iVTHi%)xx^BmX>H=26`>Pz zm0&f%5ZDSyMtA^~!T{@n;&z0{M7(LdieEmpGhsjub(eqHzfl66y`W)R|4^GAJG;YE zwJ7Bz4OLdVllTgo$}-lUNK5l^NtVL1(uPvk1A4!!X!e4UeeMVU?k~NRA4*Sqn?_4I zF-1nOLHuNg9_<3IesHHr7lh%8t<0ngF0AfZ?N5%E_Fb%SG|qElkJ_^th_8^4FDiEq3osn zoAZ+2)lRvpU7Ek7^||U#Laqb2ml|N5>#9Lp4=7cObi?4mk@vX;<) zgdxrdiv}(lx_Vm^xt|0348rw!FPlfQ-dl*0r1+2g^V?q@|4+AX@A=KR>luzVHmL8_ zhDdVu&Z*7hS|O?mV~X)G73as&E$a&+HAM-b?JCql)32>C^!q^jA{ex&Sws)*3{xbH zSm?lQJ-SJV=)oe(drk*-V8mhns0@Xz9sefSR=_rxteh@^3F1|Mi>*N0T}(#RE`pB` zLo)77ixPkIju$o{I{7@Y6j0F1-J0e#m3#D4Py6;j%%HZFV$)9j6M2u<(XKY)3?#8PxG+gxEc#eP*x|aLTIN?Lc>JIH+{xDRNrK*{GXVJN{!u&lb>c=IF%PdZC;o|K80+lfQS_ z>c`%}m`vJAwn8Oj-;uxq8t#KRjk_0-Tq_-WQL?~=>rX1CYrV2wwFmoHLSQyo!7#YL z!Iw4y+5$@1Az&?7I*0VCfarKDgt4i_*q)M(TF;JX)?|{o^GVl86Z|p8HqqQy5lc3J z?~hR$OZ3P8?vK9pBhTLXna_UW@BiN4{YH(umT_gZ!#RG|raY&T?MPs6uT^wCK|=?( z`v2d$JA?7jyus>@>-y2p+`oJK^zSo5R$2-pb-D+S>Gt+gGVtaN&%F0R3fs8lCJJbZbSYfp(T_T?i5K72gE^Y106D+< zKP@3i7H>5`HgDq&nT;QYiM#LT&wI{oZL28Vv z@wkW2H?RMflAvycoc$zlVdbkKvC%rP{Twl1Cn#-iziwzvZwR{X_o6JU6cSP8C&jQnD-Pu{xSmieBBb^3&*^yXui2gySbX$pJL0@m zvR%T{HU26ay{~7v^Ud+IH-j(}vhSv{egr2GVXIf1b>r3*&-wgP)aL%re{k!z)n6lR zi?9Fr;VVDXSjL}jhD044TXYueYO%Sj)lr`7SX~0o>Ywr)mYFd?U$Wp&YVK+nn-EZe zwU=(uQZ7>!^ih(o64Dm*8Li!0^}m#BH!8kjpw~)ujvn;??c;sF9XoJrL%0n2i@c=r zTgjv$8GD%=RmR2WU*8rCw4F=IU1NiEV!$X1|81fh(~~7|m=2xeifu1W2CwbNWRaVX zrl==d8W;$#kkOe7S$yJab$k|@f6ikKi>HU+UvN?7w2;SELjy`J&>|G(ckdrqz? zGxMGA_wzi@`*~k@m{lnDTt*CvEjC*Hv_=>#@&uvg_KCx3~jK+HHeO53r7 z!f|i7dL+KQBm9Nz%XYtY1p}l}ZUa^*AY6PCf(!VW`9tC08Y0!jixAtK2y)T+$$S-X zwN-7kR-P#73xig115Ti}()SDH#;vjHBYs!hQ<)rr9$*LYw8{2|s(NY)RlYT}+)s>6 zc?58$K<~_HKfrSz%I!4{Yc~)mbS6B`p_n1~Ixj|0(ixIdSWyoJ}^I${h$Dph{p!$P~3{S~i+2n_G+yr&eX z5j_$3HHoXuQZa&=!0*>F3JNDV7ZVy{pA}qhX+hMb-G>y}t}R}EFgh3&W^!i@3KJH% zV^N;C2+0%jEI)k(*KaB61CfZb8s-*wHsi6!r~L5Hlr2{*Q!>V$+r9PA4YDp~h9{hr zffd-D;2Fa1nRiwZp&bDKjkO_~Zwg^CP;u0?Xz)Zd9mH(}Vv0&@%-)#GFNfgaE|nR? z*gcOxVh@KQn$`fas`j88EoIFD=Gm4o%Oqw@9E&_UeL{im-5_bY?C#XzA{@0S(9`e* z(>d8_7{RYG)@?D8uLuF8)NI!O-4k^HyEQuXkH{Dl^qtm#sykQ7bph>P}`2aNKd2}ywV-a3tY<~5xUmmj`|FJLO)O)m#3VvH;1C7Ir67}F% zVaTP)ar04B#7Z6tRde0OzMwXTZ&7pI6Fjd*5nHj=;KSm_bsD);UrA~9efZ;YL2KIj zy=im?U+y|3o_LV)?~&!XeN(9; zg?&M|{S4gAVNca%6)ZG~91@X;N#QA4TnPuDXBH!O#L7$+`z}DHyr$S}3NBZc{l}u^ zHJdWW&dbQ@QtfJdghHKKUwm(T*=Jb@$<<~jy+JZ#=WF+;7My6 zn4GTB*=K@65f6oL6%%}uLmW0NS}#F#Ax0-p7Y#CTlT+x?3p+PsYC*ps;P5-&%`FEe&fBL(Z?UCo^zsJ4}UKR|E&aCONVGx_s zHPFH117eye(W&9=qw)YW;!x1>7*U|Wl}v0W~73=2W<&m_* zkAQ*cYdJUci1c9n`K1nw(t4H7tBkaTlo8N{E)bTn^smIQV_3R)=*&*lNF}%4W`TkwoM#_LeW1<5hCd@szEMfBw6)pz z8dp7dz?)?<@XNCJx6iz~^ZC`iGrpeQEXbkTMxmvD{>ttrIfw~|8GNJ2oMSagxc&e8 z53|>SY(oyId3{3xx5zE+JoOC=N5}~cIzq};X8Yw(76Z8Jy+yl4)Z%BVb9m!U8W`ThBz4b6 z{sC$W-(_Rhaw2vQ)D;lYYc(pQ2v3Bgnq0*DL7n~g&Mb0ZCK3M8%4;GAF>*L@B{0=t z)5+`2o}kVtMD?8{eNseHQQ`IDa^hgF+ZzwP&yRRmevHnnp$@{1!xy;&Lgld3^n502FdS}NF~l^>wh+%6*LWSs zYo?xHwaR^#27aLCcC3K8PdiDNT$I5lAyJ%;iV!x&Kro^YXEs4<6kD7j+tTf$Z?^$8 z4SaOW5pj5d{}{@1Bc8Jk#R^4=+X^j=OBZg{s-}}1LT@BFF?aN)gM9>dn#vINP6$v zrc9LNfbjWDo1H#1C7F|_afG%7Sd|L9>gtf;6kVLZQR@lS|;{e9$<%%?$iR zV|0|#9K+(*qI6}ocg;Q=Gx#0K04!TKVBSEpiwU^WvygYJwsRS$k@Z#?mePBPYn4JNDNoX2>4L8Ten-6#QLXj;d1e~A_uy|-Rz~vLbvahpOB!`g zc)YtOjSlXJo!!u&=#n~fG!1PCJ&VlN0Mv-=6GWSEZ79nU<$$*dxQoM@XBG>#vY=)| z@7vVN$icuy4#N!YB5n|hnihn8yiL|a5cox2)Pr=hT6D`bKzu)oiZdg6Afl}DA}|Qg#N9mE=VyPzIOy*HPB}<;9frz7f^clKukEg zN3lvo3PH4JF|bCn2YYIR)tIB?(&TTg$gs0Z_fj4(V)_}GAcbLMg%8?Una!Z8l1&P? z3d)S4MJ9)q0msf=@l0|o4S-%*;pr1?D5$ZP;m3rC*P)e75L-l=SlH~G4P+iU^zk6` z;PjLDZ*gjClWafDNDmL(o#0@MGLG4f^#W90WPEgop%dp?q7)y_-MJNN=8hKkNd^3xNI1P~n#b6?2t9Qc4HC1}*Dv%aH%Q!AKb8OZ2( z>2d|6jY@)MM8c`O(NY0|um$by&R2oqSB0667a7M1mu)tB;piE(=>>EyYZN;Wktl-~m!fci{v|1#Gj!5%NeDRx#vU;Wi(*F{ zj%&=#{a!2^r7P;?cFjk}2PV-oDM2=pW)CG$_F!n1#5kMfFxagxJblM#MW(D`YlBf` zB;kmMyBws^fdi&f6g^Z?;xa5YE2*!vMr`8-*?e}V_F5Ym0mA4b(83FPMLp#-QhH*2 z8vDy|>cj34&7z5Z6Nx*0brF|$dvMuDZn_6(%5Vq^o;S5Ou1U+qXQ6+DF25+1ce6`;tjO$Gk6(LP>aS1&R9bj?2KP&v(B)YeD`Y43!Meg9>|(R(*1<{TbRYAYddbm+*Pu6>>0B%um(ldbZ<@jnVEVMVAw79$CiKFyx!w?%-r7s|g zH;FJ@uV7*|vHu7~AY(cy&v048AYX0-{m>JD~XL?dG(%d|par1c#-jgDM& zGhTEN7n=8N88rkQAbY+EFh@6;6*w7C?75wEh4k@|15mKWQ&}7YRMC5y#GZ=>V6K2o zso?_gL{yR$u?xYD74up|B8cO8?&Q?rZWHrnnYdI`4-A;uSMxHH5_KRGw7-zrAiq=A z7zl8mLgTcoh~qKUnK`9;IZ#zF(hG6dr&p05A(|0!FkoIOgbqOo?u^m=+$WaV`dQ@UCHu4bViUGLFz&mQL&OkK`bBt@{etawd)2V3Sso3(d zxyKrHGk7~-4{6l}H4X9}b*$&olq2y%<{GNALxUEAI#+}z3c{QGwR-`!O&C@|Hy3F- zH)pILv_z;`jQem&wznnl=5{rl1WbiukIOlyIJ=ZxLYu5)1*=Qp&}oQ)xk&9fOr77= zKv}1Gg#|h#2CG*tE54f()x2)KKsC4Jd4#5k8<HT3RNY7zXQTVFsb!=z= zI#DlHkLuYF&d4b5%_SpLcm-9Gb|H;ofC7jwLNPg2;dqR>oer^61cOf#G1?K9Z=m}~ zE|_5NWz*7RaNlgz{u17hPZ3uY4yALd6@81i;E2tmQ|Tbf|OLb;dT?|6c2Y8G(z%UHHl{y#rC~+EfqK0@EwBd14}-0;IECVIC8Q87?ezCXQEJJ-GpR*7%N! zMF0utAiXY(INCX0iCtel%mHl<+^M!0{9eNqXARBJ0q?o#9zdE7Gx;AiN#I^oQIMj6 zx13H2PIZRN*Ja%k<;X9m7-^v4I0??=O;=+I5SwRJj4m6ALkScY!If4hIo5cC9(|Iz z&>So)HGcxJtPW=DYF|MG*x$CTA2d`qM*eVl=R5dI>xl#B9ygLSZPrH&NveIN%X4V! zgjzj$G6<7tgOcNU3i+^7zV|Z;B^f!_IW|1F73P-RY_A5nD^_vAqzMh_+=Y$+* z?B?c0$)5P(p76#-x^tbALtMLfd8NCO7x;5^rTb-c#K6~#1_K6{tXRG0hKxLrmq61( z&Q1fIFiyW{FR0Y4RM_Q0R-|Hr^Trla?!jhBMBsZG;m(C8C{{z=<_PLdD+_9Xf|8@~ zewq#FKH{NRfVxwwMu4o|O^m~l-)q~W5D5nwu?$Dv&O_A&F{T8U33MKPs)#^;3vXtxA+PDX)fIzcXt-U zH~uw#X32Z4%%I;fcqDS#n;aMFMQf;S3XHk)jN)3ectCW(!r(VN>_O)1E}d)4QEo%Gdv^rg^5AbB%WQd?w* zp{n5W!G<0vc#XS=;8$J4H7scdeS`v8jQ>#-bbO+o8*(YOw0ry~7+X5w0OV zD;`9xa79LI;4PDO6NBVvhDMn#hZEeVR+5rfoR?<67=^zHGISf#grUus!J`N=1tkOr z7^Q=;6!9outu#48(ey>L3l_nr&xh>_eFzGxmrG(MD+(glX&5K|CKlf?%YZ(>pRh`U ze*ocG8Vwu>7-qq_I3f+qSX4ZH+w@tcoD43$FYQx~zXLwWs&3Zg;LI_Q_Pi|XK);TF zmjlzFO`XtWqa+=!&QQV5|LFDC44Zd&-~|_Y;)jo- z>a4+H89Zs0PeVMg7+nobgBD950FtOcOr|%mPLbXehaF0zaO+$wqZ6@8P!*vT0r}S! z#!1{tk@$!!9Btxuhddig8EG3OOGX&L9~(hybQ-7*Fky+NC9W=8>CPZ7174-kkN{SuHbf83TI ziS(ISIZ%}v8Xq8}J~|D0?ru&RT1@1l!m`YO&oBX>5d}b6XvhjdF&sQ1Y?xVOc0=RU zqrhj)N(ikJY*4P8xS3F(K@JqPhm>Hv30miriPIHqP@2VcPN<-AE|CNdpfoc8tsJ9q z8gWa^w_7X7CE*ir^9d~pvl3|%>F`EGg9i(-%L76VLn<`KP|;NJ3;~&;tyVF*a3jFP zXF>^<`&a`VhKFWVcN&v|U|k>?0Q`Y=D?ExqiDe^a+<a2aucoIJh7uLfoI0WP2tQ%8$q?#oLsVwal5hpixEwyb~eOsy*U~9Z?#LC>T(PWO<<$ z%3E9Qi>iW4nyMTTRz!=~Rs&nLa=R6iA%lqs7RyiQa^fU~bLCAu^Fo4QGxQS|khLry z1|a=Sjw)5Jp!|ezHiYFarqHcP64Vmt70#n4Fd?xh474~2YOU-N;JD!FMAVsSU;;Op zWgQ5=qKVh0z?;Zb^t`(^U2eKHL1*_+{>h>v2|4Dp>7;loYL~;mL@ZQn_(*h+xhC}3 zB=UuXgDGPi1a1`5xoB7-<9Zyr6*ii5atsj)4}M>xqbBkc!mQNOpj!nF>e5L|QC z=?W52GB4tpSvcs}C}2{KqN02_Hr-7k@x*!PBzZOfmwccqU(6L;hG1_+V)`}#)=@J@ zNxli2Z?(m6L?LA{sw=0tca)H#$8l;(C)m%V%s0k9>NXu3#F(}h;!hLz(lD1pOw7G; zJM%(n#oCZbP$n>g9gZ<0Bd2Gi=*qcgd2lhocLjrn-RM2M@P9+Ec2iBc964-td%6k_**->-9@2(&`+SUs^k zv=&i?vpB|>9#N9>Yh7^2NGEp+_^W~>jmt-qfoi#|o8AKGVDa)a7;#*m+ZB)Q47gwh z&61r}cmm~s^|pjFgmVbk^I;3HK`9A_ahO5iNIQ3u;Ja@p>ar`BNka~+2uiE5lW32~7&1FMyZ09v$yB9Lp0 z!ts#HivJV)02R7E9Eez|Yh{9Se<}r4_V%O(#~OwYnYC92O-eKfbq(3RL=4gq@lDbN zl$W`*kpGa-8GFLD;a*UK=p=}d7^!lwYF7*h(-|na8v_K0*8zlLHbj{X#atQ10lRGu z@lY7f5q3&8fSF5af{lx9Z*PQfRoHr7ix!%x7G&CiwsBrmlUR&lkuKuvPBb{hVl8$@ zPKH^q7tB#;qtkg>>J^=mN2*I84hm6F134ZPZ$|ftU<#6~gBW-QYO&%9XzS>ij4q?e zt}-IR*$*pbzr%shYMwuhJgXFrWjM~Hk_z6D(-%Zd*v?Z(wVH=oNWt!c&p{(HDg_pk zijIy;+$x*XSrVBVNQ~3l#7V#^5YZy{kB0q@5W2zhpfhmXgCSjIC*BzVY(0Fp8luadhfQhe1BbY9f%|B<8jP5xGw>6d1H}q6gsMvrolZUn7FxE z+D0Y7p)A7yhE^CX`=E50lewK`YFI}9gJE3HLOYKU=Tlu1+V)3y>#MqL;7#JE5Pn20 zOf@=m9*-`N-kf@r!7L*gD=|I_1xzvkm5p{<1;CBK5-yRP)ow`PR8n~!`J)Go%$cVE z8+N3bF^3BJv!%*`b_}Gv) zA_(oZqtcI9FR25m8bw#eQGzok2Oc1V5t?JMkfLLYC83yU`(ZF{n@3`!V&HB>?;{Jh zQ7U6j)|6_i`UrG-jD3hlr$v$X!5cFZ4C|=yFQLAY$zwBnpsmAN3QLV9V}6_icO4(h zJuD7bw7%}ijZ2rN$SfX+9!Tv9ycQk7$Z>>S3`Y}yr`Z2NTnF=p8iUY0RLS?{JM>E( zsiKO?qpZMWHt@{wJW$%WyeP80I8zW2tZ_!lAupHC`kp4Hp*oxv(#h0Kg>*TH-xN$; z&3UiU;<_`1R$UB~8XbtP#n`ApOXQsw8+kQKVy+Sv&>pDd9ni>aE{tfXtVX`fgUY&^ zN#uvZrijv_LQ%A-DG&uU#t!C(Q5E=1ni=N2CPMC|#m6O=lx!`eQ1(M58ZAo(aCc^o ziVQXe%rk)5Zg3D_GZJi8l(GV=+S0{YqdEiOAVmP_HRc%HwLUt~A|6NF!7@LT#U*#j z#d#fo%~A(BVwDO&#n_-SScH7Gwk|k4UYslkm~)#AoUF{sDnWP57TD0-#Y&Z82e6?~ zG3K$Z;I4|7Rw_Ed##GHMk3*JJX|NV)XbIUF)>H-huKnK^m*uCsmdae_Fv|~O2qv8N zdJr3R?6BFy3C}5yS|TM#z%Mu93A0sJo@nxDiWy+sSe2eEFWPm1lW#jPGLt}21(JrW zrnm=NUWII%2f?hER^^h=w(}0rg;UT6pKAoyC6zVYDI!R#yZHoX*W>*}T?hFoke{!o zS|)-@Eq2FGP%Xs-7?IuW`56umEfxy{SsU_^z?*`;;mBfF56`GkNB#2v#KA$v4?8cq zd$WS=C~42&H8NRa1(2WR55*JZ5@u99!$qt(bHW+$Wst%MKz|qf0a#T7C!DduV1_h}H*Mtz2`CW4c}xp^(xE%Z<2 zv+yQJZ=b5J$N*R&bXmc3Bi@mQo;|#pei46(RY9~AbRl#Vpskg0M%ofonTj225&+Le z8+K7C3iX;@e!9G+!{Q8p`;BKJVHh5uYFHBrd!YfAD*F_dh)(h5V9hE_39(6hfW4HC zH>=I@7pex()`7YM?lYcEi^?IMmqTbKnirE7!LcMq6JM&tIbl!5zL3$F#U&^nJ-&OI z6xaC)DL`EAuZSmJws27i_-J`~U@JQ}1W$7tif>p)veL_bJgL8o2dI8 zZD*4Xc9kr+CGI*vSa|2qhm>ofAeGkAoSmk4cypd&n2 zG>*O?VZ;%b4CtMiZO%+6cgJMi)*z%Bz zLNS4S#gc*_Dfwt4?Izk+s2%a(Agyzg&G9rX75=Sr^;BF(VLc=Z;GY;jGqsaDD8Zos zm&2w^|3GbHou!v1NI^`1EU0@fY*uiUQg;_VN$xSB)2La5G3$ui_Bv5~;};1#A*2Jp zX$a_ex+A@lqc{>t8|!Ujgq)JCFib&AA=IfbyP#e|mj##4BD!vmS~U{krfRVY@V;p?2lBxAWj9|H@=ijziJcM5_44aLs0 zNa4&fcw4)MOynjCW&BBgNXRF69}%HJ{{;X?Hiz4QMEudDe=>6o6?b|1I4m~Vipj{D>t-pzps6bo zJ5D#|>1IW^fY87t=wICid$iXAN^Y_K0{DVeNJ)knWwlv^A|onextW-w z0M!MTv+`1cm${j@Ff(KGDuE=pF3>YMBZLVhmW)XpfxspplyWJ?)uK)>U7bTyX$=j$1(2&!xii_6>6^M_7?B7nE~oTPujB%9n*IQ zs{|tTFr}#FIZZ2-|^eNLmr%N?zTaZXWzz(e>4VgC16o(`^pa{bXFaE z_2rBW?`J@@0gBR3SKFCL)nZ#ic#RQ{6pmk5h)EdxatJ-~#PJ`uuH)r_F5UP7dS~r< zog?M)&ne{{EoV+lNuO7g6#9~fw(tp^*D8Gg(Kd~Rp#{Y|GJG7L=>7i_?;LURpBWiz ziyy0uT&+tobl`xPkuxe-ymJiyOT8#Zz2M-aGk@CAW{*Kf_~!&_~n>lT;$`_dGo69 z8na@Ebr9nZFN`#eR>TWt`1Fh#TcvqnUo1!?r#4y*_Bt8#ESSh|_hki--$h_mxLrSO zdXu!)JfO@*v*++~RukJIEIi4!RsEY7+*@F;BBd0Q3Cve>aOlp$C`U~D0CM>{ENlvB z2sk+wm1d>Ld~9Z>Da(ohgftYU3IJ1>k!&%QuMq2mPqajFz)_V#weI%8mGz;VkZ|(d{6wPGF&{AbI4!bN31k{!m_vgVCdw} zqLb_$jm8|^BTs0G;@5sLW7~z6H(uR*GV`i^g&8vJ011m+0SzleD=C zzE12jIkBS&RduSYYA_*lkHYL5Tju1>q&pfzKrhEXy%k?1#Z~5CCgQ_dLMYgC0t2o@ z&B*F-D259jYMe624ip(E6_lHi^=zuknC~e~*2OTVk_&&5eol>P1(*PEvjzOzgSJM1 zow-nAaPZ2H_O0MOt4{`Wn~M*DwcDC$S^ompuCuP z(%;}W5oH833&eJss&oWPRyw5BM=J~L)rVUcE4j2lISXuQC#rSigc4#Wy_+*%5`n?Ebn+g&-av}fcL z@ET`Z@jIuT8~7_@BS^E%!re~>M2O1x_8cz#czZQlQeKwg4gJA`?Lf0EQ;Jg2I+nN4 zd9r2ZRjlmX7Lu$n_`J4fmQxSWN!Uy7%hB0aIT|fLiEv5muV8M8)ZD`e)wf|fu_$g# z0hb?m>RS4*+)SgC=6O`?Tmmyd^8vMSXOKBp;kF_9398r-(`{Q2Xd+O_*c)1H(h*F# zz5fuSMK>DnmJL~(su6H%K@*_fvo~>9YMyxMooFBQ%xKnXh&9ASz)uA^;*NPRpM4lC z5m@h|GKQ&@yONEUvltxpVhF)qHd7xtCe4 zI^#s5j$Kh2jA@C8v%Y7R%d)Z!laJ1M~-<1VRB-lE3?2wtZOHj7GB3u?{!DT(eASX@jM{mAD4VWO~!)z@n20w$@w zgP}qDP+rp1bT)E{Nb!jZYbC{n^6)F@D1m?0R19hh3fN+*7Mw!-570)z)k)?J2ths!T3J@G6 zN1gABc9Z5-?o&Ejg^;Xi2F%G}{{bk&x-@eh9${3#$&H54N*tHFO4Nv?7gef5QQ>RK zDgam;0FY%lFF8j~;FC+M(guSrwy?BkwcuVv*EEQ-bQCQoByVQ-7)}m@x4zAoUg2-x zXPdlK{MMN0#0KuNng&NC+OMjE(9YqJ0YMuvXoU#Fl#;?*TB2F77+9Lb`As7LOmh0 zI+P2Ph|+=a{2?-9VlV-C=kweXiYa%Fa-i;Q7#VzPZVWp~XN9JEm?|{_O4txP;i_H= zPi%-4EJB!|>{Jjd5~>ZV&BmMAB!~myjsOgSK+vW@)@*~dN`{dzQZgXaV!p~&bsmZF z<{qrgrGb&59bVLt+9ru$W8*ESoDgw?3L?9*q>o~k5QRB{&}n*S@sr~l-F|(G*|N*$ z>x~d}0NN7*2w81;V2mBp+9FpbD^%Pvr(?eG_OYcqX03j9X84VLm*U}D(l{vc!Jf3i zcjq8yLe}#C@VCDksjgZN_=ktxUthlP@~Kz%4x6^W?fbHjXlaf*VzeDq$BHl2&bzT^ zbN;-DDLMZvOx0-fS=3sJtZI`=4TWQ!ugxcZT^z}JLiy8wV7>a?>C2brO*-=N($Xid zY<{=oet*tnSq>@GF0?mg{_F3k^3{2PLW6H8Ip8no9SDsLhQ*$a>9Mm zu^`3;$`xg#L4-lU{LYf!s$-Os^fF&097a*cCvqvNKm1-{0osveP)pp6mkR--N~v}M zGSRllTx#@ybTikiP*21tBuZLaTQ8m!z+1E=@V083;vunyde~f@LmdB8piwib*q9Xz z6_n_LR6-qSjYB&e^4G9huMCoa)t0oxtI1Fs=IBb`UpE}80{z@3b|q0 zF;ie;mlk63cFR<6C%E(iI5LfLsCBeyJKzlgyeS@D*vY90*mD#JJrsX^KvHc-=}RG> zVCk-wXM_#IA(P3O1B@G z8*T;g7v>FO6VTZi;m%0i$cmqua$kBpwd3F0_x&q}D2N21NYJ&jE@2d7H4DDpbCO1d z8$)GtC)FWVqs2G#oPapF=t+d0RGQD?>7LvFMp)~d{q)*G1HV0ICedd6|G$nMC!1^j zJrfDAS4B%6Y-Os4^a?Q}DVx=O+xTexZ&FC=NGPErQ0Z}}0o{q&K`jgl}*!#L)j$Yw0tfKI}`XW0?tCK<`!Un5hFWjMp57~ z;0}JN%|H@23DuyZWt4|)#%67ddt?$=9|_+iRBnt;z~$D?Wu?hmk3HMf*j0P!3yDXS zPz-$Tyan9~qcsAs-;UR#gN7fEl26vHESNE4e$74au1gP}3q}|MgxHi{yl~I_8|T6% z&x_a*@V5^>v;v9vU_NDHL(0^eZf|ch(N zs-I1>ZdXG!v@7zRh(km2yLdU&@xx+ICP*I7k$-E6CyQxE#ptbifp~gOI$hd|xF#-k z19Yzkoj4eY*G}sSl~bXS({sAAY#uX|=a$W_0Cj2?Ba`@8a#k}s`f#&ptumpHZSF{r&!QL5Ucn1HA;>@ zXK0FtkwF2^s+;WrM$9ijAfQzR$RlT_=-}keeh{k@#NOUk9i3UJ872tdJK!&Oo7qB( zt3V)DKv~`5G*-Jjqe)ChZHmJu$|xR2w3QaxKNA8!dh^9ZU>M8u@+;juQ>7`s8c$b1 zS8WogD<>*bqGZ|WFz#n{A-N!JN}JIewUrSbIWOs#+HtgbN2E5#Il^pK1$+pX^z{?i zg)d%?oiHbkwF-#RrAvVh!t)=c9#NPyqQZnnFJUXrLbH;S6r$07TJSWg{tib$qBkBC z*yww(z=7BrU^J=X9lpF~5l@ui)mc;Q-)rInS>IOXN7}$xQp5QsX|1@fY4L3gujD9$er4XjgS>N$< z0FZ@l$I8{NIO*jn(X4d2v1BdiUVQPqWyT3Hyhb-eL9r~GVIkL{LxDDLlD9g-jn0Er z9ss@1RhUY!S?dl}*u4P@)yok%giQwqo-Es)LQ&^w<)84DX=*r!px7dY5n!cnjmrTY zY}Y0yo~~Tm9Ci|tBGO#ATO(*VX{2|oE0@E3;S9n#^KBG6sT*{X_kIuVWT#%a#^OtOU{PeN2KQDf^X>^9^u9uuD9&Njq z!n|dtCA5Y3Xki+uS?5EcW+bifoO91>t?gH@_xe46g7QrSKmAXQSo=!=r$hs5G zjTJC=r0ie)ax!B=4zJU2fI*ByzJ=?pLd-;=81(n1cY5MEs#N$Z32+u=Mn8hj;WFAz z)`9>t^M2YJ_^APiO zVZ!N!C~GsQ7`1#f`IcFH0v>wMSKbjoD}e7lAKJ$z4F?X84G5R6A1@MGb!Qa0=SnKR zBy1N@i{l|{N)5J?HxB?(FVu=$RjV|I8@s$`Ps!hz*qqvTq*%8=0KP)w;GAoWzC;)l|C<)V^I~tAsiYf-e zH%n5=z8fc?UxKVGxFe4*yF%%ohsVjdf!ZV>0*a4&S{*6Ry_gM1t~^b(h0_^|F|9wK zkBlI!No4VW7OU3SIgT$vOx2SA;`Tn_#e;FogVLuW@;DfhJ`l5s{T9!bWM;y|rss!x zo)p!{me45oafGO=p`C)41jgHVs_CfQtZso43@AU?_k_#Rm3eg{C9PJkcJVQDpn!E7 z39qS7WHmD|fr4KPVF$NrZe(`lcpTgfIRLe(tkU4pd5_@1qwD1&B3g4JMrOqh&TOLc z(`3P(Q;L|2;1fb=<4qbRvm(aEBs?bC=D`-6Q;pu_Z{5#F zf~!JPq9^hg(epA4+u3-t`-YjGgTriq+Y1Y3Nr73ab>Tzj_I$qcisi~%z5tr4!iPS+ zwCCH4k39U%U(#RssA5f=0o6t=TntuD{?paoOazudazuT2H>*;9IePQN z;P#o(|3Bsu0fXMKFYq3d~nM65sGSL?A%4 z&2dd{jLj~>xN98Tip8a@RM;KBw!myF$1F<7uBb(&7`D+CxxrV}NK7Ir=gVSjU^!hw z+J!MP66uK>q@tzg@w(lEjskX3(Ge_O?&*l*OGS-?{pW0HanRKaL8C*D=V8!9 zwJAShT|%`7CQv$P=Bk)xopB(CGg*?zbf-<{6fb9`0CkO`$BYNtfNcWPyzI8-mIcvL zMC!~b2vw^%dRE<0=*d|rFqFt-3L_bL+A!v7SE}G0xQwppEM(aswet-M{xB9MyvqTh z0m2X2n$+GvF_6H6ITSRl6^1k{PH;SyZY^DXn24xsIi}(r8{11huDgC_(_rbi%>Jh@ zzxUjTmydtk^w9sT{O`+u+x*_m1<&6%sptEJf2_Oo$33f`U%UP@jqB(qld^Axj2qZE z?)uC(=Ov%rJNB2Kl7Ia!Y)JKJtIodphZlEWcMiX`dtqPK?EbPV_MbcLWB+^K&;R{& zVR=x^UzZPA8}Pt{=YCo6=(V76w|*FRdGnGD8@skgy?#%~&U1lzC*FO2_N$lQ*j95i z_UQ0|doJ}~TzEa;rx)sa9?ZV+^|cGDpS=0&>D}j^UUDOHThBe)?wWeNapCp$u=1s! zUR!$U>&${D%m2Ii*1Xs=SNE*=YDMgC@63O<<&8TBJG-+xrww+UpD?=X`6WK*7ERxJ z$o0hLWn=9>#w=XgJb!OrNZo&4JG3V~)M;6{){~3*{^Is`DnAAGb>4e_?uCcE3>?8J z07FqLAF3)?0}b2B3Z2B=ZJ&Mk#MzI(!31q?2vuQT0QS-N+o?u!cq=n0v`2_WD}ZI8 z1i*;{n1<0P{G@RB@bXaKW+B650&{fhd9NQAEG45X2#^*~pm!U}IyXVVk^~b_Fchr2 zM500ZDLGf@6lFvZPs~YyL5T>=|sTb%4*55yhFGCYwbPVsW-q zA5jt=qf?2p!l23;ohR*`3d5evRXJC|g+nDWI48p#MhqjVgO&`xV55!6*P4%L6;k*Mj=j)5{!gkz-%f8HuFcz^K<=Zt8j|L6a zr8S9ZwD|DI(noQ;OeY=JRiiUWTuiACS{KxgkZiRY8g6ZR&o+)o;^i=41FN)(FFhwI zI{;4B!-V!tu(5{(paaImZ&VsO;h+gz_MmuoLnH>AC&i^}V@Za7D+pX?}0ie4Y8;li^SO=bo1y+jw;D3%hStZyxw@ z+=jQl&261LJudVaTS`jDR})@ZGSIVnu*vV%Z^KVkcenR!9y~F1;QUwFuf+ad@#fXe z)4w$A7;`AOr{L7@qi0`<3!8WN<-z__{TCMA>dIJl{@lJF=a2pKyT`g0-dYhh&@;RL z!dv6_oK8D+`L*PWYaae_^R2#!TPGIw4?O$LTgPkbAFKWFv&RPi2;0{kbadfQOMms< z+?Cgs{r#q~_b1=_ZDQ^DiC1neIoWd{Z*}acFSmAN|9&d_O37P?B2K+^Ve?zxtl0PK z{Kt3A{)q#1aN@YZuW$CQ82kIdg=1ge|N5zn1q(9n?ihdh$!lY84IlWkb<@2Oi%(tI z*7y7B#}`*^9_8>%AT%L2<;Qnk3(2?}k;ag<-v@m9-rwtKT>tsS7w6Kqyj10Hd*=5M zPs~pM%Zag(!lP-Nv|!6i|9*iW?>RF$GzdwQi~(8%it4mP8PJjxk~7_fv?%j*I2$q6 zc#BHoaNH9$5-mE2!9?~K-E%luP}+(Y6=Ombs|_(&ZCq zdvI_eP@F!8QMxkRyMleihV+p#lOXPjlN;Gxr?&wRV4UV*xo(qb2 z&o;5`9qEMz9N(r&y*trMJk&+#NatrZF`81tX&AXBfsXPpMvOo+BpIf90HO&V$b=YU#MLAYe_qVA&^__z zURwR^v1fKaUk{3y3JVQ}fJB*UwCy@O)1*0^GY_(D6oe|9;FAtgiAQk6SB=&n8z2_q z`FP8uXHP9*m^EzA{&vi)m;K{(BTd0pBNh$Ih4&sh11i1CLDq}|3aP>j+c;f`(z-&6 zo#~H$-En70&CXzUZ(exUuo`YNq?bo980kRh0n6FC@Hs{j3cw;A&s<6qCc81oku%dEJCT&lQ zEUa;q5!Db8CMx0o#VZ^&9>9TSVoyLa*{UzcIRxylGF+Pglv&q?DuHb%9H^dgHml9r=?RO7ZJhwu z`YMt1VIV3f!nhupitzB;)Ixn z#~b$#LI5bbt!P~b9}w8b;UCjxcx1aJW9@><#rr4Lp6%G%*pgQB=1V&lJk-(^{y@m~ zM`k|u)2Ctm|6MZn*VQFo9xD94d((}Q)ph5pJzBp0`rIoOv9Z^F3;X%>zRr*5#a`Gt zZpKfq?TCGKX33Xf!v@xu>{_(=!|zsHyY*x1(vF9-uU#5@=9T^1e?OSJ`@dbEwye(h zsrOp;)jf5C*OuIOwBzWyj=F{0d89)E|^zn$~&I3O`JNV1CO^X&a<$jlbHE;LMTOS->dS%Jdjnm%x zt+D-7-`35i297`5_2}x~7CpCf`#-N;ym9W*&4EpQyx2X>Yclo3d_0=-rwoBa1!T{%;#U{7=@|0=gX^o<$v-czryn0o`V@ z5d$0rAiPNPHDdN6KqY;ecmae8-joh%);foCjb{$MkKy+2ELy9tV#)5FK7{?ommMJ7 z?d(yqPrgkZ6h}<(D-;`|k%EfDwuSp;LJ_8)G*)g|va|s1S%KY~OF`Eryb}gSz!Byt z?n%~rv1Raf(LiG;?#$2dz-dfZ0aT)@7V%~`@EjX$Kh_kzMQEV_8PEy2X-0NDS+H7V zU=@izxsAYDc1VpXCzJ#CDhn5~JS5g$dN;6@)I}H+n&>7z-34e2y)4j`m_^oPu%-^%`FV(FA^M{FN$yMBVAtUP<3Sv~!22 zLo?!oQ6+btxVUWHyNNR#q!?8AvZcj+2)xWf6B{SK_Z|oXu+>y@BMsg@FMV%_+Pmk} znEQS^`udJ1uucv>$`e1e5Ch(U-C zMZAJmrMBaYJ(42}Kj$i73VJnGPv&$xv@F4fvhEB7I>J~6JX_8tSoT6~kGYMv^A#gH;7Lq>MnQ>-vGs9k>HsjCkp=HRmI;bc7hmbMaOALGql@FeZ zYBZ+1I-$NY!3!Q*!_a<^T@){g88AZvgmW?|C2RwWe<+Xi3#BYPl_<*O(ALA8uC4nM z2(`2lAc&`y&`(fG0wYoEA^CXf2cII^3P;cMTp~C~UWB5{OfnJoK?&Bvr(mLir=ld% z$gU6no;g;B6B|(P6f-Ne7nA0H{`%RYbvO3TzW!s~n}7Z~JiB}OhcAtNY+vLfjj#8A zxb2TGHvKu};e`>qKmY33vyU#lIlTY3lD7`F4jin1?cs4(BOhMteMfieg;UEq`u6`g zura%L=&4)dvlo3-*7DZbv)Q)}bR3Tu7&iQx=kV)atS){0O2o3??x-6G8|Zpz_r6&LuH=oruiv~GlzpJ5y6(|0mkb=<6npXV^%MHV-YVry7JtA-q~I=_R{MO2akBI-yQtclVz`NC<=HhWB-lsmv8Rxx%Bwy4}R)d z`@ptCA5Xj^=(9zye*NLZuLsUg9r&en;Nr8JLuTK4>(sd`$z5?BJ03c>chRgdt?M2e z=)bsm+>P=#SOA`GYpcm@{pyDu&AE@gnx%iv)}By=EmT8wO7o)Tbuj@?#3dB(e4)3z zW7Fjav;Xj0bmRT9>Urbe*Gzrsvo*`_9Jsn|*x;@!uWjn7et1*q@rgg&HRVdrjzhQ3 zE*WV2YQ^T+zn>YlwDw8qzO@;)V=2 z1M^cR7@#M?3vV-cn~^m2iQFijhR>LrIfcf>p;&Zm48|}WVFpx_=pM15Cy;I&;mE4L z4M@6|og@NoEvx|UB~BIyU&sfb*+DFDg?R33RM`qS;t~}ee-6moZi_||uX1R}8x4h` zZdDB4f_)07pZ^|4jj3IkKH!NRcN8YOw5W{TT#+m<4MqnMj#2q|TLku6F+xx{SA#no z%hQvTqQZ=hw)-{Yp3{e5_|PWwHCqx(9$2>|pKrA!6m4jUF{a$5B<@IkziQKyF_r|| znCPY|WdjDrIH0(UWqvnw_Dyp*pxpK|%tjcxI2%10gOZX4gW zofRqFnnW@*R3js7W5wt4^nJM9b%WsCuU=WND1B`r?M{J<=EA%)iV|! zPCyN-^@+DBKJbypL{CF5SybWMphK;R)w7|4sAn;!;lNcic(o&qgYT^N2u!Pb|M&G_ z3$xB1U$&>@js0hK^{?2}HxSXcd()oxrVSMOWqn;zxAlh}`@AW`?$S-QezfQ>CC|+~ z`RDVOde>a)Z(RMwuxWMI|GDYra=}V_C*Yy4!dyi zzGTCSn**nhXJ1)z>HM$(?WHTbBmTMR&+VtK+OuCf^y}a+hxQE)U)po@)|tNEsr@S! z|BzSLxTW^k&APMph3&R`K3f|#XZ`bYYkoaEb)bIJ^_D%Y8*Xhm)mI$$)80p?&${u| z?7oBh!){%fxUn|#>Y}OBeTQafo*i-Mxz!i8F*wN#h_4T5SkNkMA z-@u<=FJpN9t^Z#){yFw??$4J;C-)y{wjX&hc+0IT6|?Uw|8woa{x4exau&S2bLQwf z=2h?Be)oze_oRJNedUD18J@&S&5&yhn|DI%^S8LvfYF5j#73*E>!0?{Nd9j)mZ=F>S=EL34a)hx8b7Z((0fgMua(59f8MBy& zMZJsTN(zr{VrN#cQ^s#$CCJa`t!VL#L%4N&gl<3t)%d@J%^HZd(5|Op=H|f)PKG#9 zN!0#5J`hd5*eM^zRhJ0bKm`vKIK(cvyFNy1t(6$&U6Y~!>v<(HIv$})B)?TOA4(HC zMaUQc`!c!Xa7@GJ&V9w^K**UAtr|sS9gb@ps6c)kaWfP(t)hygLLCPIYaKk_Q9hb- z8PUVUCkntkjDN$qM;^EOb|a$-F$0gS*|muxM1-|_$E@l>h=j~2qyw=m>#1u0=?2JK zx(-~7Nj5N>z4Xcu7fI6|)jwz}3NkE8py81MaT!JCmC=DnMyJ+~`s6@^B>l?a60aNS zl^Zvt!ne9IBe?yOH5s`&ENMQsxtwV;)b3n$;leh73+sq0)(Sxeb51x8^bYx&h|~xT7Xv-1fh~gIW_*D}X-+|y{mw5E3lWS9c*ArDF_Q}3mOgj@Je~T^p~!Rn?|-#%XxZk@%YWAQ zF8l7><-EOT&+Yxs#1|gx2sxjZed+U0kF0-cZN}qepO-D%(Ej_9uDspb{}x&H&XogQ z`-k27W&XBDD(fxxK2|x|xpT%h#~Q~c-}vh1OO-!dS-tDbXBW#qzxnftQ&%4z{A0_Y zZR*XhUf=FLenU_0*7lR-|BSvrb^P}~2E6uq*X30$-ya=5?8gh|UXOV$=)OZS^TJkV z40~+G=IDo;Z|phzoM+U|En!odV}7si?>gCjq;&UF$4ef~d;MQ8oy@#`Wbc^=_nvyN zu6fJj|C&E$^T^bVOV4*KbsdU5Z>xT7_tBSU|2Uy;%~u8I&b)D<kcb7SA4#c!Se zY*G67Eu-*)lIogoRsX7KuL_MU?aax|3tIh~_tyhIT^f6K-)pB@Zkl4IY}nm(X4~v{ ze>HtN?nK?C75lpP3}mj~+k9kf*JlN9EL!;Dx&4c;#hyO9==b3Z_Ff6PG=1NV`TMSh z)gGO=>5Jsa_w!8}zdQN;sv);6f*1wp=XI*CzDo2?Fhr@~)I09B6aqZiPD=Erwen+I*+gabHzN^S*)yBqz zqPsp_s}s#Mh6EZGQarM0%HiiQ(sUHYF;D%X3Gw2GCz(FK%Muf_E;ZLD9!mdRIVT$e zJ@5Y{bP4)24W_p&(DfP1v&N`18cA zP%i;~`PiI5i^h=xu3~N5;yt1#mcO@vZ=+Zd_acHG#i*RDTNYbB7$8K$>ExbK0;;oe zBrYD+(*y^EK*Zw*qE-Ju7OEh=6c2kbryx}u$1Q4|V0cP3gFWn`PMm4d01eudc$*9J zQo3mRzw#B4*HDJSltJi+*q>-dUWO4t1YTkmlaHu~y@rImn8ld0Ow%ady-qU&Gv(aM zZDuvVTr+48#-OeV5$ak%$qWui+C76g2e&s8rrkxhw0k1Zy4;1NO5l7PI3pwLo;xny z=omiG714jRu5L-qxQ<7%E_cknJmK2L4Oc=Uu6!}P|C_}frSE9ok9zs+L*|da>B>C& zZg%F4K9AO?_GB)rc{%;YADy4x`s>ppsv=I*UTr+PYU;qprv^5jy64iq>m^IB)AwCm z_{X0M|JD1=lW%TG4;r}Ix~y;EwM~EQ3hQs^KmU2@l=B-hzb)9j;M))1ethA{{(xiO=k2lt=q|8Cd5|71Mz*qe(k#mzjvcIKu(cX(%KzaAcV-??p;sTc_0gq02j5<|y>slNQ&(i{th;ofx9{?)vG*ho92`EdZrinh$7XIn_6)#& zYWU$MLw<%ct~z@2{nI{g%ldZowwqeNNB3P@JMPgXo!7??Tl8ze=3%e4R1SSJ`$l*6 zLl?JHL@xf%kE;&tyLztn%9hz%hVRZiH2mkXh^xs_#||BwB3H&&gx*;7|D|I#Zj z7QbAQpajx~e6le{LcnU8`G!D6tZeK3pfPhK;jlsu9Q+{(F2Kn_6!vV|g^Pp15!!ZD zV_OVWEziP2-@w4B^DwekL@&x}6xfL!&CgfJLwE>XZ3k}>R&J%Pv?iP~tF?>?QNgv^Fe62VY z5{;&_C&fm1XgOUVw=mvB2`A}@G*|Rwg`U&#Kqo_iaS910m>zqRK)VT_kkl0E0%|Qq zumuR$kfx7~0zhJ%o02UZXPBG6KY{mTLvZNUtT5Nim^Ie|!#55GQWSi#h}2}C=jzJA zj?}7_EN`f)oSrbPMI4_DGv1b~Z<`g$n^S>E1sLhDXs8adGl7un<-!3oI=F(10Oh=k zWH@3Q5i@TkUoMc-V>pYUc|+Gcx^W>J@Z+#K* z%juKR3+k?vFKv5p>Cd*fejy?p6nSpSuw zUk|_avfrN1qW^Me@AmFXdv+XsW@gA|S5jtvwR`ujuCB7F3$B&Fv-jr3r6)W$W&JUJ z!O1ZR0op=LF|2A&a>AHf8*)Y@;=>XfbpI#M^d5Nq!>nt@7l&;ODLZj?&-Ochvh4W0 z{qMhh`|r+wH2sgO`2GEX%~S5ZG<<33u`Oq>zFB#nLvKj&aa0yqVhj*d70?apM&__a z9J7tiN*`Sgp6|^6EW25a-je@?DQYVxaVv!L9v5vZnLH7TN)?TPWF&|PSeq|Gl-16H z_zr%NR_!Zow<{1L@?>~`G7*bQD{hE5oItX@MG~_ZTxKLmen)@}Iq;(8Y|L3*i12D8 z`Q^)f*9&(Ox@^~SNs;5ct{HCiWITpQrGuF{j2@pGG6a<>nYAq0dT?JLuT_@zDRj#C z@73k3(HMF+K%W}Ob@QQF(M1vFNXiFO{U(eIadYF02GS!rn>7xcIQgW&pe8g}gkQ-R z1OX7@pRCqkJ(dV#pKy|BjHiq7I||9K7`1%#l8~MA7M*{3+pW0^I|dKW9%wvu>3DAL zo`Fukh4XuNy>jD)HyG zj8chpe~tJ*Lbm!SqAMg2N z@q*@wms{^$?r*E?{d-4$Rm+E)R=yeHtKGUjzu}nQgRZo@)zi*?aqaoBb)$0DYUgKm zMYz3O8}+gvBD8Uz&&J+U{TJ6qoU}gWv+Mna&(9<(UmtA09$#>vVA-5Io9CKeYkRO^ z!NJkdzux@x&biH-y=NY)+EN+zSLVpw34vd?-0SLgdl|QE_1LD?^sIu0E^Fn=DQChp zM|aFR)qB2!Y{^->a5y7tar-Eyy@TF`sUt{tJ&WvC+3Y z72#qb4bVV56jCR;HMq8Y6HMv{>@?Uz%IYL81~jg*5I-G%AextBUyA~c3cnF=C(+Ip zZMJ8$Dq*uoy~x+_fFSzG=_Jrp5KQe_H&%I4Z9QmtVYnbMALbZ$e%n>8tp-TXd(h95 zl=BYky>{<)+{(W1vN~JGwf5QcuWo65*R=iRf4`o2bK&e${jH8sm)raAPH5>kVWVB= zxaRehsP->2JHm_BuPXQ1R1=(EJ7?OIvtRvE?D?p#py);D{Z}*G`hU5c|DYzaVqn3A zS(*DXx=uxPMilimx%D+gwQqGPd@;18=jjI#jo@U23?(o%l6BeaAR-XE) z^X}#R%9&9W1M_cRwaD!2j%vMezs)C;i&|E<2hv;V30g}UGx@TDcAK3sIO<6+d4DGMSFeDm$a zlXo-)k1l+7G3b+D4a$c%zTWu9NE8gGn-BGUKkDS##t$!i*torPY>$=FH_kX*LVZW95OlXcsyOUP}wcDwQ-dDZMX!$<3jM#JWfC{U>PXbAv6;cH>|{W zDJjW7iNbUVKKf{ltU-oC9^8m!clJ;Y8X?QMcmhp=Sa#Lej%Sx76EZk$k7vUUBuw+2 zAPe{7jekydDX2{^svKWXa-r~*&Ga^xmW;ZNJ!uiE?yYUwb=zY5-B0uXII%ipe*J^w zC#%*RnC9AT>ehLq=+z&&ZRZ{PUYbsv*L}mLBehO{)7^nZ4ReC$u2?rOWJc4WZ!VM< zJxKS>Z@HJ*b*U(F`T7lo{g2$bwmbIb8drwZA53UWTm7=)MDw8#J-T z)#-&-Lh3g5-acIvF=fW17rzvBYi)Y2JlT2p<+7;0Ejx;|KW^{2)YAXJ^zoS{mm!&5 z!SklPxhU(%l=C4cqL#IU73CI84(^}0J|S&Wn@_}v4egHiUngFAvZe64b~c_Mv~B?JKnDug~hd=XN^uyXQ0W8*1_&rx)BkGPvcfxq)jkp9i^w zuHF9mmb2lDb8DWR5Bdu9C&j4*3a{rc2P+zWI8>T+CnN01%(i*wz74HT8nNZ!vC6R8 z%+7$^$uA$R4y_DPelbt;dgl7xTmEjF+STj(U7{YQ*{r#+?auF;8b>IATMX)_5^^W9 zr%bEGS;pFo1?!Iogv2oZzU|ya^M7GObVd{WNcP6dJ@-h zv{lqqdn)Z*f%m|$S&Xz9bA;7a;bJa}gmK=g zp*@nWFrh20B?nnF(L^k*Gtxu*+A6f;RLlUnd@tcHq=MRs*$jRW68{Bdf%t!+Im2Vj zR6uctM4Sr7uWIN_i{{=-E4#by_g^@ibaLdJhw+h3uMgL)3ApdyzQn&j#3l3T#Qlz! zD}Qhezc4=k<@gV~E*=Tbbklz1w)T0_q6D}8c>k!U58gkuyQSwZ$L`nv`s&G!&?To< zYs(AoHWl1x8r9#M*>^3g=is=R_uX34qMi<0ajtQKpQfY0ru)L-v~-(qF4Sj5K5o3< zX*#OCY>Vqt{plTT_q4`-ub1@wbE>dsO=M8mNzzWcGZft4{sW|Hr zcB^xOOWT&Fk%v={13ht#D zTaYM2ac0#6`xe7wxE0WB6_`)?+Jc{ALOMr}h4dgYyGTrA${1CQzJ3^nX28$j;lvCL zw1zz`kK;}NLz1Lf=t^=(M}+C>gQPK0CVb#UL=U{RR5<8~M1Vs&#R3UNy|sM+w#g3g z9G&F)3ImT)x&EhTGLyrBje_Wiyz?#%2mGNK)!h)zH3$L$w%q|0;3}YlIs+DDgFig{ z1p}g$SQ#w9Up8Jy3T%LjZ0L*(!L~u8v2x#N8RuT&3Hq8OwfZ_Ff~)b05zDxb`R7A=>TLQuv-%zvm_|Kc-}lRojr#+Sj_Z4LDl4k5 zQhD!1-MzNA{Ms+AoO-6~;L47_4&OVO-+UtLYp36 zFLz$i=~GWPyetWw*Sl+q>->rLIv+)t`n%+upOU|h8?znoxvGaqK+OKw0KZ_sv@tbf{B@bKg99e9#ta|U>rCU!o zZyx4S`{TIdrhN|_C;t1ur+@6Z6kk^`Yi3~iPu10nH~rD0E$TT|L;>G;x3p5b*el1P{T*&49kf5%Vf@9-&)A57I~MDE7%ZCDLAj3cvuzZ6kR}MZ#REEZ<3I z6BHen6q+1FXOjOb*P5mVA3Zxtkw}LTg|inIOjI9_kn-!^HcpdGacJ^G)#E-;+ob%Y4h^eI~y9? zH|5UM%)OkaoV#L&%l_%#wRG*b>5R$TXwdHZ=%8Qgm-jmh{MsJ9H7}y;QuSJw756&3 zGyA_U+OX>7_xI`{eB7<57pHL-*%TiSrOUN$}W!L7+ z{+fh41y$YougcwCRgE@n-t+wHeVb>xHl)tK*L^#y^GMrT)2P_A>-YPbSB4grEGoG9 zQU2pLhk*`(B%gp27)iGAqwV;nP1$lAns{J2mTYA8Fy#1izh^_We{7yKEBnNMV^{oo z?D0Y4z$c3Xk2dUHUz;0QvcD;J=Ht|mp5&%_tMza7UZ`uWN^h99=<#1W53gMjx_nQW z{0%bVFl!d;GP!kPrwjFtR2V1@Lts*>^i+DW9X^w(l_@4r2yH25IpiiX zX~tnAXk?(w3w2VCa5gmaK&K-6f?d63ocKeLPC@wwKsN+1hvW{y9g7a+QrWUtdnix7 z0k-%TMpsO}!ZF3s7^Nwe^4P1>SFvY}fv<|tZX`G`9>fm9#vJ?ei%=gO%QT zuqmQ@%hYKMf!$*>dz!Oa|CxW`MpXadqSmIU2RkNaY^*yKcFr{Fs6|nsTYJL&-cbLx zS2d=G|GRt6W&h5#{wht^Obsf1M zS=&@twRc#;n{zK8xwGN$`jsvPuRe^3*q+nBJ8J8~Q)kv{3Qum*1g@)e>uGiDFJ0-j zY*W`s7r&lR|87=+5-ip$UNVo=;c&v=`E)|)g8fD9&*C4txIX$UD{A?n^6DwTKSd%)o)*9gJQ29~)AQ3w*;^CC!*ML#(l$rc*>J-c*UZilA zL9Q+~))2Q9K^nY~(WQbeq=c==lj-Lb)3mcJsRoP=pDx0_Nh+HMCqP|{@0CoqB^N%4 zn7U$56RPsEq>X`U^n+M2jWsG(%46^qFi;y~7|r&!ST1SkNHKvT%LT7`UMkJ71MUaz zSbZu$D=`mLs{J5hH8_(Qfnl$V>>zw>=yR_w0eGFImmKDf(I54mX%zyh)`^B)(v@lW zQ8=?QFsrTEk+V)g9;+hmN#NY16iPgXUank9{5n4ZfSiF_jbgQs3! zIV$Q!NdE1nk<(x8bJ=jpCGz64za~d&2Nu38k9wAuWD#+)>G0)E~E9^QQK#vV302~upar=B-CT2w}mcmO2H3$ae#(yw-eH`X=PG+S+7dDZXb z1FgB=G41VXTXF~9yK8v3<*eg}ySHRCkLvt;`ec`ex(h3w`MvyU$?~t>Umj3!C~5iI zHyx%;Dy<>`R;u!{Ea&!RVj@^^s+E}nheSfqCQjCaX$E&6FdlQ1VgE0PR}2wD#EC3E4tgR|JC``A zS?_5~EX_U*7Y0fMsE8~c{9V9UD9dMr7AXld%ov*ly<#2|Y|moQoE0X@0&V+-objPdZ)WRZ|za-%)+N3Zlh=UoI88#vQx()i*uc| zE&X*j$5u}`eC5!8E1S~uA1*5FiM{qi;e*mG_fO}3R(t51tJVcg!9_jkzc)S2iu|X$ zukT#ns=AUvpB@#V59cOq^L?A+{sH>vIGv{A4A+ho&Owy0~-)3uZPU%Smd zT&dab`|ZJw=7?+4Td&Rf%2)fjV_(_K`x_hfU47uY?2j+k?VnY*@B5_v4=)Fg#okA~ zyzLP$qo!7S%I)R2s236Ij~%a`s_q_hJnBW#;dSe#Ew>ueZte2nKV8;yU7K6_8(LPL zd+~DI3fJTR-MzXup{V{`(Z%uqdA|D1+dnz2JL|96-=E%mWJkBQ=v>HwmM*9?gn=b~ zVfWpm_Y@bGxNrXCiSh$&oExP11%45A+dTH&I(_D!nJy=nW}VagbocJJS0|jxf6!E< zJvzPq!5xi_+g-OQ>n@Z>zUt1ey^;Ak&8B-(QPB^+%isCw%@o|||6{QB;1>gg>exuc zjk~&7BUg|S=#UZ$-*IOcd>;3FuQ&%*{&csPA2G_$5abfaSRGsdztps{$3lJ0R`B=_I}WQk#LiYiZrWSeS^ zcZfOrUUFoGuROWs$ZuPJ1~Blbb~TNmyV81iv7GCdV?_FFtR;3^7(4UtKOXT+f5@69QiizPTM$}*2OJt z%S@{aUthdb)87#sRew0DZyO8MrFR@VVzc^tE*D&@iF~#ts^a~xk4+d?b7sMWrl)^x zINf_>dhOZfOa80R-S6$?c&vW8IpnF+?^}-FUuLC-EURMi&o|Ar=4)@RAr~5#61{Cp zGrAHVTsxP#xjO$`XV>)q9I)H5{YLPJro8;#d#g{rd+b*Dt<$gS+W+X=_s_ZJkN@4G zFg0C$Ywh91``!JGhwZddVWlcl*gAR1tuE&74Hh<2 zR}>P`OpjI6p4l3X%c1dSBRvvcLx=3p(hLy0o6X*DnmG{Ik(Tu0*}&9VIh)4Q$jz3&n%-MqU0hH+b6;HYnZzVVrV)6XL`U(Os8 z*m!nkQG<2C^`^JZb<{*@t)qI+wW)lg~w6oB^rzzzAgU4CZ3f(`*ojU)| z&-YYX%aRgo;Hi6;``Cxp& zbj78GzJcdHh%Z|K8l^M%W?L@o38BSV2F96j1p>F?wrQ4^G)cgX>>q@emk4DM3Tw#e zWKUp+iT?v-6?G614?JX^LPS)V#-GzWl#2b9%o3w1aj>9e{-ELT`;Ju!p99)a0R{*Y zt8hPa{+Lk znDoRY9~YHh-0WF}<*~++X|1raPwSw`t=}PAO9^s>mCyTz9-$J*D4;Yc(qBa?f3# zjThSceqFyoJAZwDt;@!TF1@w$`ifhhJokS%eAI>u+iFiYzkk1F{wVG3;FkQBlK64G z&nx>s+qCOcM3c`Rw+ELadn__meR1K&hLVHx25{wJ@kTsu8NQ7fSG>ng@YY8MWN%^_ z^vjV;=N}zQ3hPM99q8|WyXkfNJYPTGOXKq|KKsmcp(b>D<>`ptS2Y8_kKFU8P0!;O zk9PS+xR$Qo*fqI+)ieKRpPkJ5{mvB7*{>GcIaL9r#>A;c2!~^A7K=f zrzD6Xi*xecZYz$JV8AoRvDfFwQj$?}$}qvn5gbxZ+$Dhc#+ewfV0Shg_yWKadlTX3 z>V?WwE+cRpCfySJcUa|N2#&auE4muvE2cp;R=}|`O|i0JQ1l>naf0Gy2ycPxUI)px z2AIR0oVrdV>gDXJ7s3Dv+i7H?XCNBXjYh2=Bvv|3#thW&3l=HDtcDCUVHZ4-gXL-w z2y}}H$6#_P#$W8k2T6cl!5WN&u>y@YQ|c)Ie&Z*5NQ$5et+Tn>mN>!@F+gW9$s~`z z6}iW@U;7YeidX4HS#@`^OiNdrnr?soZN+ch&Kc7p+OI$Ow)vmCvA5J$-`$sTv3hs% zu{oZ9ns3j`59|A@I=8*=US`jQoKROTLCu=1^YuPusR&B*LHy!zXwdv94R zz42Bhqr`n?^pFdHdX-LUzM z>IUr||I_VxMZE{__igjue;?8g>e~0Ba%K984b^Fp2Q7*s52$9@mVd5LAzJz9$AvfF z`ARuU=J~EHJN((rIi^uJFZeyb<==R4MTV_QLyXn(-M;=E-`}6U>Gj3;7p;B$GONGq zl;-Q)FE6*f{mvWT-K|@5e!Wd|{*#cRTI<4R2Q0q4v3rIyWbCcS*KPWi_;{p7W(tx1 z2-zV$crx*fma2S(2>wYv0rKj>YHPBN;e}ojRy+6rdZbYFIykq8U2Uky-pa)VJQ$<0 zw}pdEeKl;asKGToA>sxQ2Mbp#yffKNl+qc(ea62gfo-zbIFXFX!UMhmt!&SDQDWtW8;XQV7xI7UOu(cU+=#qKq0*^A12D9B|qvM$5E)m}oGx_J~ zFCY6icRf5euc$2|DypD*ZQbd+_iI0Bdv`~8Rok7D(=tAo-u&8nZe7^broy`PqQ0Yb zIUk&B{l%?of93~nqmF&!J8#X&0}hB}%b$u>T-?VHSb~*FKQMY!ZqL(f!JDXcxE3^K1-}?2_Z>!$g z-&^3;(VgpBKf&*1YMSr2jidS_=Jg$mEzB#~UGW)(!(GxNVa{>EzS+*+%oLay2mbz_ zkSo^n?pPl`;^MdH(Av3nx!WUy7A(2b`Dk7BLI-8=g@TCHtv@=9SpBeV!_B1ceqCRe zHm}HW$dFA>%r_^829@V|+v!^pk~A8C6d7tT0(~`ZXq}T_A&?=I>>eG~mpDLeop{1P z;YT7^2I>hZbwJe!AO1q1liJ>zIJOE!^SBI0LIt?-$t|UcG?0VBlGH*JjI|2*f3TO3 z12_Wrr%PnNhsThcE7EdkEd_&D2Jx!L8-D}pt8V}}5h)H*Lkvlvf(k?N#)iy38zGY< zZr9)Ji#^GRG{c?-r$Hz*tTTYicJa~)8)EBbUO5YN4kn-jK`~<&xw`1fV=#P(qllBe zrSm?qw8pM!R2g|?q;h0K;|D+^>WIk^1Wj0zjJ1vBGwGid(ZLxF9N+`413x(YM5p7mHy^E0Dho7c%rr;Z+Q>-#%xL;Rhq(D`rKbp9PU!~Ww_ zYkP(|wk|&Sb;RGv_WoDx{q@ba>JR#92m3V+wrTtEVQ%cW{#*0+j0R`z`EQq-58|6u%w-`==3+sxM1Ao{#gZc_1c z`sh1T2ieE`@}0IK$?>uC1v!U$g%243t{AJ0f0$Zd(IBv-3Qqm4rwNg7ity(J$02-j&tQ9Z@T zINKe#P-F0>Gp&c|jiWe!LsKIXuXJ(A@Dpf`*AV=p2wKPwR$)rfs^=}yS+W==jX)Qz zOoKYXiAGd6J26Q%3`%I!*;yy!8hJ+8MkC{5jf>AtDiv`TqEytW5QGG=mM8+tWMRfQ z3Mj(Wk%(um0B@-wKD)S7N}1d`o_)2r+ zu;6yHd~MN@q2sobkr7XP9ag3InI(x=Guzb-4>Ke|5ZYnr0~m_;dxrK*Y}sa@i~`%x zgKx>rAkvgs*I=IP5Fo&0R}nOb^Sbasia9+yhb^DZvjF)l@t~+G458LS71AfP+P-*O z+<&f22`J6>(@Z#&6u$d*(v9nv)-KBW(8vF37Wye399Mw8ARe5q+%czOZnqEC=wms#r-KOK7 z@$>rTHy$0ZsdamGsPma`dBct1`Ufsgs!~1T>hDF|=}vq4?VOv%6Y6%ao3$iGp&#w8 zXJl_x?BSsYjICmuA2yWxSeSq}UWVWrC$&17G4micLvu>UCsUBSV!Sta7vB+{&o(fD z;KI5ypGXXGY%^&d%DR|xT*HQr?$**+ zcPnP&M4)^OxT2YWy)cM(+Yx+vR=M(O0zr2_8 zHa-9GO-EchZaPL3EZuzj(1RuSnm6q`fD!8YgE#YBU;lU~>Tr7)D%sb6?U*{hHqWNV z*{1i3X=vTEjH2#i5kA^2`4`9M-)buA*p@U3XfEt|R(MDGTjv@oZhN*=d_Ks0)w7BT zHhs1&E(Z^IS^%Y2%}xAdDErw-$U;1R%(>q7_mMFkh6cYS3^Tpkym{M+IagChzMXK? zY2s&%il?$r@RVQU%t&ErzzjL#{qt0P))_7?6o~HPszi&*jQ{ku#<8UAK#1HEHBH8fryWFI=bVY7CGp`4HOBUPyS)XZc|i#b zuQgW$g0b!)tW-qakt;7EBqsHn>ywBoF$>|~EWptc{1?Tqp$WCX(UFkAVI-vBY)<+D zR{9s^$;gj1ep7%`Cy2Tz=611z!(hrpZ}AOV>Nf4~JMQh0-*G|NV7=twzFp%oJhlf`?^zaV;wf2T zg;k~~whX?T2Ychj-|sCuob>oT0>D)xl#Px&0VU0|!h98)Bk;ZKJg z5Wi?MFm6LtzFH646iKCqdKV3lH94)?cPaP#LVLE7u)KvW69Ef&Te-zBxFf4a7r51e z#bUx~Qn*plz-dMIsZ6tyu+DaOHBB!!Ft?Pvgqq=zTTp=E$$dKwWB8 z(GcoGIU!|+t4~UChnDC}spCr~o`Y~t5RwHF1~bQrwEG{=D{hj4P-$*HD0qdJFn%@GjCruY zB|Xf`jCc{Yw#m_*@0&&(36T;f-*_@Rc0g*jYTd+j$0M$!<){8?J7L9!s*rme2#<>>u$jXi%osrsR?GvM&bNJ~TM zr|H?DWB>VtDKh5;u7iFrIV&nH(WNv4foU=m+(Ar%#_#Pt?byFb#sQ%v)QvQ zY8p!iwyfIg0rPVCgzpFDJfA(w1A}DBgZIy>8=?fQrpyu57>ZDB061=JV1a zvLT?8KS{n4Dni>hvl2_&8bgzmhLf3TbJZERv5By^I1vS?u#?~r>m1;~paCX@cLucxTW3+&kf!Qtsy+}jC9PgQ4MzX`Md-TFeM44kdV0fg`txNs&i~Z4 zEcoc_qXCnQeQc%`%1*!TZSCu^>2LPgc(=v>Z13^r3cKbrYg!)N9=x(=;>w7g2afB0 ztIb;;^7xme8;*U;9oyFzy|x4S^pDV<+xX&g{)zIZ>h?nIysmR@-9J_KJk3mW>He`Y z?4(aoOxucU%Dk+oCq8FhSM}tv<~n!E|7qyGwl@F%yRPe3H`(rp4032W*S0e9+|(~4 zXm$+Dy$sQdo)5Z9R#>w9@QKxS!-yEfxYN*Vkj==Gy$4*^oSpuvbcJQ_ALlNoE}8W3 zZlG(A`@y%H&#XM#Qh)l*!@oXX_2IF9`MLc(>Uq|Rg21&;ejPP3X=e99xd}HZ+tE0*Uo59*X=7hjH^o#+yW8r;HQsenr%&o;e zS?OwOn~^Sq8HM&l4aXzd3_DM4KGzgRAprXN3U-Q>qbKePf@UEm-!<{{-PYMSa+2N^ zB9cYt?vyIa;2e!Uz?S*DlzQKz z+uBzy#(T4p;cIG7|-M^$nIeA4VSG4AS7 z#rbMtO&U70lg_(F3BwBmf=4h-@H%+Y3GWj<*~ddY%&V&2nfis9SBaE&e(%*0UMYGp zCnh*}E4<$|5Rxx?OqMkofQM4NvTfRb6<>Vm67u^uBk%4mHH?o-GW@uz%$JZ0S(&^hHGJ$ic#w+nXw{dKvg&?* zg%E@36xV6W795rswk7r$^C);y9C`M}(K?YK14R?VGM?(bIXu(!%f~cYf3Fk~poUH_ zO{^biU;Hn*I@)qiwX$Uiu(J)&+LTcYlHGeEtV9f(EKVZiS5gX7%Q4(oHLeylDcKWb zIh{Mk=xl7Q2$++{2nrm)H+JW2X^2X-HnO&6G(~g7^_wQF358p$B)sD2g&co~8_Zky zf$oMemvqA&p?+qFD#JxW36DKNjVZV#5~K}?Jp%;AUPGC}T{w`m@6?M$-?5bG!EB4T zQlAsyI}O=P>xiBKf+Z(B_vNvF|GT~R!G?!z_t-|<*#E5QY;fT9w)Dx{R^L9fYN>c~bltS>o738#&WieH=BBc?nZXu^=RWscqq$q~ZQoz3nx8#))7lkzsLFYH-NETu!~$ z;yU;Fs*}HjBuwo7dCT;$*V*Y^Av@A)-&whFY16fcEtfwGEqnX3Lw9GoG<8kC``*Ig zCJGZhJG?6+&2y66+38Da?)>2~;nNc*nd=!>fKpW=jEKh1pS-hJt^hUzU{t3wNiS*5 zrw@*~w1(s_Qj~ox4KPsPe5wuP1|v*^w6waAY&e8slwx1pBaBK3ac2|l;HQB1OUnT# zCx~3jHOZ0*7Jm$fDm7Q!5E>r26~5_&4fTkC(T_wHp&5Her6NZ4X{fO(dXi*m7sKr< zx^9=%@dnXJ?p3}47$J%Mp16W`iOXAHgK$Z)9?9@d74GBkaC~*CoGiH=62?1-Fbrqm z>;a)p1kw-E`odoaroom_2u7h~*lV(jqe)@o5yPdLe!JB{u8JOvkt=tlfnkk=-6_US zGW_QC)gn#K#4wvnNv?Hhh#w|m!A9XVP_+O=j|v00BZ+uiMeHxhQq8*m5K12-g6=}iQX%&Ns!w%#ef-Awx+>+8d# z*A-4~p5aZq(mB4d(vX)x|VT}w~fHP zU}9kvqr~k^=&3o_`fUYm5wQS!Q@WN)Eq3LQ2m0 zWVNA}JyehDDKJ@JTnOc0N>qwQT{t{)L`3S2CRXNP1a*8OIXz@}@NMgszcqRyp<=cO zP#jfkuEaTDkI^AQ^hNWh=`{K zO}IXrUsFo&ECopQuDHSK^tb=K<=@+v75VVarvAyNAHTh~yZE=nrk#^6u1os#+3n{S zF2&yK{rXoS9qGLkVbfpd*73ZkBe*+hSzYGFgQqqe zbJ^6|`Qg0o@|KQ$S$$86@=r~Rtgnpf8sGP-d*Zrx4^DrcF>T8+=e($nosQiX-J&XH z72JGMy`i>9yM0khVf!lOis>B<*7No|qn3SV$nTv=KHdW3Yb1 zCp>kM;>v=p-B$#xi_%zzb3hKJ$SO%ecv*!~Qm}(2DKLO8SS*QCPOvTDMHwebfifbk zkctTq0bMZ27)#%`Mjn%iKALNswTVn0L(4FT0i?ii;CWg&ITv9pxo?lt!O$03jQ1pa_D#i#z`a{Jyq!TQOS3Igt1wf|HH-CF}@O;S$9q zu|XUmiYs1$i%P5XiVekzg8SX*QWMh<0SW~g=&)bQiQfy)| zlsZA)wS+jW@_74;v!D8Z@}<#m$sPqj96c;H~<2ja@n1b>zZ+P9lNaxpp{5pN+jn0ofbVv}hk8LMFYK|TpSAq;u(n9)(3xed9K zL=R?bpj4Be=O#D{w%CwYk5KTFi5e|#h_T0Mws97%IIVvyOctU&2MgJ`5Jqyp)SuaF zv5l9aw)RH-C%Qli3=af^6YOH>tH^dt5B|SwOzUiRx~v)S7@`Xk)<5XFu*1Op3u2*w z;qcTj)z8ztdkh>obtD|{35H)6>j(}jlcboTe>OYTx$4ZIWorU)7RH#Bo_njAf#Yu5 z+<;lOUgzF__Jx=If~sZHOp?_#3U77wjrTt5`s$M-wlh9{@q=dG!>@*Z_JQp*d`37@ z$$Mv(2kbla{MZ0>ahc)!O{?cE?7N$JJWqLa{?NGOH*)NQetP@Ik&E=FeG-xw`1vOx zrGIK-oO3rPd!9 z=?V||m%`RW4;5P4#VL8Sx@XobN+>*vK{qsKj5fJeir;%2KWoe8WXanDdAJdMsgaqv zr!!wUBZS!ka2^?_)S%QuZAYy12La zs=_(ROOKu;fXfwTpsYl=>v1!&6*m@jr8$_8dk`n&x)e-0M7ji6&Z@F1Ji>EGlO5)v zb_kS$0OF-o=wE6Gi^vQRB4FK&KFl@{PHp%^IqqqutX=(_>_{J2wiyE-07v3I;~mP09VCX0go6O z4SWDxUj(qq=q;k1CQwaFLbUun=p5etgqlpF`N)Zo%_yM}xLYSd`ni96NnvgE42KB}9 zP4FTh9QvXEYo;W?Jicr!?}Ta&MgzzQrG~!D3#_}L+98`v?aHOa42vQXQV;tb%(YA? zMr?qDIvGnrBdOdHp*47n_;f_6A|i<8Iu?aEV+9eVqBH1;4stN#e!|@6GEk&A%1mdj zB4k()kH>2Qp*EqE8^?}^oe)|(x*!&U#MY(olama9e6Y7*yM&rsG>=qDs-!NA9v8pL z(ITfxq!sD0`Qi34N6bw;G9{Haud{6yp33%M-}nP6m6eworfzH0(Ml+!!ofmNj``>@ z5ssDi!t-p6v!sWAHn`CYUC9J4i0NXcs+rxChCcVv@7-|bCCM0g+fejF|9Kyw8TwhZ>Sr7=smP;WJW zax|!pse(+E24^EF7S<%JHko(~2ja)hHjP#`duMhyw+|j5>=iIemll*sUUEKgaqie^ zII|zo_mC($I<=(_$2Xd%l@+>@DbB37e?ja4EkLPISlCO6Ny6vSP}~#}=wVQC zw1jK-2*{YFssWr3Ply@xsMdUM(BPsCK$^kw{NBdrdg3lT*$J)cqyg5)GDif-rm%OG z1R+SbAEXT+)WtUL#0fJ+fRGLISRtFs|CF7dr{tkD+zb6x+p|FJ1bV;5OiE?&45B%5 z4rD7WX*l-?MGYmZSUi9B+S?O4mu#TK>^DBKGYub1c8P&(%aII~fKKsA;65NSf)r$p z86^Ty1`l1Jb|9AmwX}(zibxm5Ub;WRJ9%31p{y6$@oa2^JVsbLA=YviPLwPrApn-k zO#qWI?gr(l^d{8|*OWwAIWNG;u$Y$yYzc^zBP?1ZhFm3mhRo6yoeE6?(2R~1N|IdV zQZo^ABXVW_|I@8|O3Zb8F;-iAqcl9`{c|Z8JUV>rjMwADo~(ZbO&uRJ?~tquB^Nx; z*afjY60l3(jD`U;I*?3++9{Tbh`ebOdkH%ymZ;u&@cfKuk+`FPvL$G?6d!`-h`7lm zoK}#kgvT}60Q@Ra*s2Ad**00vQ?vW2iN@+brh3JH{kB=}g7HyetQfpuHl2wb)ak!u|9YLz%fF>E$Y4TS&i7 zWmx+J44dK=;QaCCxS(=Rlx_>k^2UrQ`TITjHbc!cqu>8CC$88s{i0sXE;DC^O0Chb zP>^J0OqNy$Z;UI$NFjd^LV}yuEoc2^$a)coXw;|92VGSX++!C6lswJ>J)CP)J&}R9rjaQ_3CH$jDRyP?!zy>EqE&KI9i0PW48HK@_rwgXLT`%b z5F3KnQ0`&s2!vO#_h!BZOIlMAl_%VGX>c(RheL&AfTvn!shyoOSWZ-!rHF5E=E24o z3oa=PRq;^54oBN9T5#U7$PK~bS7v0-!)Q!Mw9>GcYgb+^Ux{ex`2y-Ynx zA*{v)O>to&+rH#DzSJe6u|UnhlZ{kEtY>CX*E!QvF%e%O?rIET6+lFMm}yotE!uq1 z*XDpVyhi286c@_%>n(IDSKbVT(vqUZ%p)OV$I^ZA3G6Ba=wXK6~ax&@8TMdeR1BlSDjx$jke3JO} z=uddcNPHtcoWlV}pGQXlUMRti1+tEp*!V)ozrv?*#zPNH`H}>Z#;OyCTEg%dV$MaC z7`Id7AaZw$NeB7B*%WyP&XvIZzCAJ=utNHju^(Y7KzdaNYvF z7H8H6?;JuBuP&*N96?)FO8zl0+1NGlI$R4$B~J$=N^`UuxkgSRnhm9nw}J=l$@AJ+|Ce@#sU(y z`m#d74U+KdKw=XxkP4=c$C#T7PM2BAY+CsdYfwhe$Y=MnFlnbI_~ISp_?h}yS=m|L0~W^u9pX!Y1L9!fo5mSu5j zT<7{prNC`b<7vM0I!%{YL&6t>eBUCfOrm+Dtg*-)g9`?q z@oYzS$W-7u@{RNpHVBbkmW(YxCYV(<&-2Q zHc`UthaVY0P93TeXl_^<&KCMmR>-+k(POCZ3mJRay`jE=11AudonkSH>3^knbWjbF zF>Nr1uY&q+8(_@BR<~#k)ybg6WlF^myIwyf3|B{h7Mwbm=H!rI2|d}t#|;xVpvF^= z-#9?`3n+PFD`X@blStap*b(R)7oEI(LX+)&?{|Ec0#EpkHBj~sf~{c87-}r@ApJNa z-QHd$$y-P7ylDKh=IWu{$p-ShDMObHyIZ||*yWdhxzB$C<^^~8)#yneZvzx&l4rD& z!Zr@m1AQ`4h|U4RNeq(gw(Y;Vpkj2AJ1>#Nw%WFsA=4{{8PU)-aS0twCr)Gw@sW>% zn1~s&k=?e&a(HS3_0fhP{}O8qsVZ5>LKpY)1zhPpj(<_!T2tq~=c4Ac+%^YbcIM$K^oM>1jfEE5>a(rx8I`q(##?95%< zxOA`sb9Sb1p!rEbhxjbfxG)s|aK*@?V^Wu{z_2BK9lvpMY5Hd5i zap&iUOjt9iN#DfFOSx?H9|g}RUp`#WJ2o+yGnp;33owW_QIm8M6tj~oW@g9*WrBoc zQljM39h_ofPRE=#>%psSE7lwk&1Y&hl&YL?g^`g1C`a%xXwm}iMp4x_!;?}!I$OnU zE0`^kxgsVBE&#VH5Lq$s4S14%o;wT{KqbR!1rgdPmwn14ImjGwqd}mQu(ex9qD7U| zSXyKfLn^VlOH2xv76S8Ip<|K^8F+;GrT|>{N(?Nw1?LQ2&`@ol(Es1f$fJf}Ric4a zUmTuuf?!c%O_}~p?M?U|c1gDO_TH+;3*+$euqFpjjJDbz;z;Qt6y6v%!w_+G&=tq9 zUZP)Q$tA!Q9c|oNW!O3r;sP*{m#aT8){_53L*>h*iI+*7>Vw=yTECt1O-LAdwSV zRH1)x&fDNUo`wt$7*WwE(;^9YiB$rNmueF|*plgDL88mt6;O!qWfd}~FoltIF=e2k znjRe+*7#ux-XU!`*D2_DMjC@oa88mSncMSJ=k1J(qgNAv?EfeY9_W%p;t{(&o)KXX z8_$!PhlM;&(E#TeTgFK6=k=qR1HkRn+8;R7g6>4qjGX}JUIP0J?qp1|MA{N}akP*y z0j~@6Ui>kU>jV%$8Fkdt$6G(W@gsEp7m(1Kai#mcY%K|Va~7ez5Oeep0IG64 zhE7_tZrx`f5E;9Ypn0qG@b^O}6)nr=rYE^aQB2e55gk?-N8{lw>0z=qsq&r4mv1ls z_`Z)fY@K9-ipJFs-*0Qy-k9=9RgQ2sn#5Nl82xHlneQRVj4i*~Kv7+0N!vzWVPwn9 zurl9IRfYD+BHPvK0&1j5e5Vix9gVwuIpU4{M}*tnjhuAWgbHza|Q zye1UqDUw7go`HPz-T`u`;T#1ngi=?>Kp-9G)*qNsGj>ffRZBGY^nH#v6_C}*`X_w= zPXLjd4Z^-g7?TDHB*s1{QQVajUbICG&H?&F92jY0&MzpV7viv@dz7(*E3y1lO{k4C zxG&^Xo#8LB(il4#$x_c`4y8Iuaw8KiRXr}O$iy*50(iu?45w0tORh?O9m&WlJriey zmc^1HK;#tTE?J=+1EExbeI-K?>{78=?!o19DC8>UD1fZ!OT9t14pNXqobFV!8$dz~ zw>aBDq@EhFPh(X#RP5s8#am96?Cb*I{3^v!Jr4ds;)95n>x58aD3#NWQP_C5`f3N& zo^lhA^UFYkPMEPW-+<*&F-h*MT&&`_gQgnMX>&X9t5{|d;aLN}glJXCNg-Lw^kT^P z5l%R?>|8vo5~1G6xSI%r0Ej^6A!p(iYaM+`^tMLo_hivWqG@6D_5^)qdX5VpHG-(G zBo3^;Cl%sj$uMTH(EGDy5WgDY6PL2!ICmRa8QT_P5(>3eCY*B9q1oG#y zmek^Q$AW-wL;&QmJRUNAF9~~rYJ)OM0kk&&tn&>Ec2t}o3{=2#^3q+kq;xPDgW>Ve z1X)v2*8n(I2_HBStRW&cCi6fstt|mB28I^EShj4nn+`Y`!_B;utVEwGnlO5U$;=gO zaS^DQP|e{*fn>PjF3Kbzz`eD7$A}ZLxE*^T%X8C>|b?GeHuH6w>4V{G?K(a!8_Jdm4Rnnm1~S} zsn#ootZZvwjw5m++!K0YNJ)WKc22;k)_nM&kOL$@4b)KM!LFGQECL1T&x%HVDC$3S z-#pJe%ua@Q8lXJA1ZK>$CGi@Pi@B3g?s>3dol38OX+`}Ymj193C8ZbX!LhUzR5}m= zwhr=Nz0?|>mH~=lc|~rOU~e$J$4YkGM03p5PKG@3^zFC{DC^^M2OC-iauv9VHFJ2R z0~N%u*h3fz4hK|OfSr*!0|XI)ILT|2YK(?h1`or}i7RJM)Lt12shuWhA&9+Cz)2Ug ztwIQwI40m-GseUtFAif)p8J#_YjOz?%h-B*mAblUXXh2OB%lv6NpZ5I>Exo5#TKVf z=9r~1?0~80K%c_1TE3Q&qMa&E*lSG&u~dxT#ih}mm>!%cB(>-u7%3? z?Sqo|+~CS;qoA=Oi95X!O$L??CSb69*HTP8J+3}gO56k503ranf>3C{7Y4zj%@RyU zcn5UYh(c`xixCjZQ2m$@V+Jj4v>9dmOvT)qyioq7FaOji>EY>uf=$}1E|rbiiroM$ zdlSv{5cyGsusUaxjeoUQPde*wO9GSGCz(4!eM~0^aj(4-UcfM1X=6hB-WMMNmuss) zspzM<_GtBe$HuY!^okZ{?05&!uXm&^5cOMd!WTD>6CE#5Ve`1=ak#nAQfg)i!nCZu zlaw!a*XSTKAt_N_-Sm8}Y2^*3l6Mk!b_8N?>5ShTPLvoTM_~yoAvIP}0Tq%P? zppVCoZVQI!IflJGEBjr<9|$}ZS|&Uh0|jedL#s795}01>(CBktHGKW`;J~=0n=aFt z4&rT2@?k?H1PO-K%E~!n;!Xy-F=Us($Votkv+%wk>fmy~$jwK_uf4b4a)4rCnL_sC z-yL&Z8*Fpi{<3Iy{yxviQ%PF1-4(rJ+Aar`2Y9l8%wc+zS4HnUVPI%08&qb}v~Paf zPSd@ip`O?w19fUubo-jb^B}o;iJ`_auxo7=c}+^MDn)GeP(w3A6JXS8005DqY8A&2 zqeq~jhaoKs<u7Ui01F&*P)$p{) zWvM`vSOV)tmjw3va(-!^SYCDA4_67^&kg|CeX`}}mCi1Ijtt1a5bg)lK zlpZ6ZnMXnQs5<1-%r?vpp9tWu6Tv25OrT*Pg=uTlwlU($BGVE!RUXBZzEnADhiV^Wl~5yPZJLvhFWZUd6>Zi1XWQYevKPCZ7BD=;KdllCENQs0s08S zxdC4lg?yCgj;&SCk9V6PkTpCH3-iDnT{z~KD$P>bm`b=*(bXnf7AK* zK(~%ZS9WPHxlW$-4!{wZ54;SzA6wR&Y{Y4?FzRx3!HsaLz&eE(!V7v3{|Q6|Svgfn z+|JTA3y%`K@@DDS@j}|beLof4N#95%kIPPS7l4QWh-a~@h1*=ZAVsLec{5sA*}m)( zX`V$a4$!?mh9FSVXl~dzDOB{%xF@nRR~zw!FA>{wfy$3!sRGd?E=h8Ndd-@hhr`+k zTK!%~t5*evDe}KrvJv1_xfql-hR>FNG2HpUM`UzRFZzEhoef;gcmMyt=X4w=vQDua z3!QW@*P^wcPCP8pi6R(uHCemAg*sG^`@A(jwQj4RaYvq=-%-TBVtrO5%sf z3|XS28~^9$T>szW_t^DVqfY01Kkv``{d&J{KraLjla|Jksxy^hX5`QD%Zd2MSwaXe zf>Kzx7|q(fo?6BvTmy`yhA2lG z6SLO2!cR7A`p-M-9t>^0u=?_`FGi%xWEv|^PI679AyLM=7R8EOqrQV2RgR5`L;@s} zT>-kedjGNj4NM8U0K}jo?hDf3&he63*D_2X zTLAB7mn(K+B7Aoao*O7tzz1)YOCYOF<290r;{q-K?Nj0-6ay%YnW(j+E|a)%q>3{pabwgOo;#d(fI zeUZ_lkPy46H+SGb=Q$F#bcNGc66#vkVkE0Tt1I+HWg1D1bjp-M--HpD7VJv~G-o!X z#Ewz2$;0G>>c(TRAT2hS%T!(GXUt2JArX<}W{G#iLfYfRp^~I{)l(xtFq?{I)3DRd z(niz~of%ce8(c>B?#bC;-MLj!zN3=ikA!g<8n^%;SoRX-ngq_QA;3jVJ#Y~E`LQY% z0`%a0tUOh^P%EvZFp6tlX!)q2qAL`GWB4FYX&%Y~a75l?9HcqLKyKo?bC#?zFXwiG zbyJYX?yL?cP%l+qy|$i5Uz(jB?Wq4@`-jhteI~=>)E25F){s^O(T=$UuN8ns(J3&B z;<+c%LFea8PuJUPh{@wa^fE97!QYZFap1@q9O2vKk{RV}P0zm~U*;HKlLoiNnyLZ} zuEKcE1^ksYwE-gL{dHjPpqom^XYAJ7EbuEcx|u zJxEe9A7T}R5i1J<3|fsGF_=#bw!;wAi}z@~2;7^7j|jI+MN}cr4Zd?Ar}V6_`HT2gwUCc}9VR)P*Ht zG!zGVxp_9}y{HWqkcJ@$xDtkpobE;#t%7?x*LxXU1b`NBhtw=q!wIE)mr02Bfr~te zBQ|o2%Hc_@XS*jl8D0cLt-0Ru1xX;f?7WlJ%7j=MJaiIF>|5h{|MJbkMdKfSP5t#eQvB2p7N*WGT^s##(&EDp zLb^W6&px!(_lV3&2@t4bObUf<2R>?SaS7`L)wVhiRbfOkmeg5yrhn~hF--h#P+h-xoQUtz{pv%y_s-Rf;4 zeJTMkiToChBOjD_`(^T6DHqnVJ=8k-i4+V=jcG~XWNG9R5+4Cw#DzN^3Si9DEi%qErOXUnlg35JAQg4ynqy#1lgW!V(Ky zS}Y$aeKIRAS{r)}cuS=gG{947)B+{K1+J(PFc zJX>z%X&5s$z+YLR)C1yDK!)YlS7+6~p*6t`aTcIDO=wt3G)SPxtlgF;x#;RGNH}yD zp}63lpr)A%(!$9AtHO)U-C!em`HAWF9KQ&~2rn7;3!s~b!v_RT)KO(0Bxrtx_$*fr`W=i;vF+qt{wGd9cK*J2_96o?p?Msz@e&u|! z?fEjSqXF^3zjKSqECI(Bkce+URiWq80^3o=tc74m1Oi&mWzEF@Qp=U~0d(tvS;aO- zOgZ5q1xuhIRwPe_!afnbDFY;wKlt+8wJl%Q-SMm_V10`r-W1M{ceVvNVdrtAA8!Vh zd0OQ5Ea7u|8Ha;i;P4DK#{Xt=qch4t_L0t4DTtDW>1ljD|BF#LJ+|e zb*7Ld)3O8imizIP@d=DchZi?Y;A~1qdK1<~qj8Plzo_pd;4(#DD#!G-4zLs-yj- zMoCDIa#7eD6@~_-yTGa>dn=kMA_a&)kl7e)0x+=5it}=eLeUn{SMNYFxN$U25ITl$ zNKPacoYNq-2A|iNbILzW{TOGqomtw1U0JF(!zav5e_;A}(I`79L$89-D>fYFRTD~i zGG|P*(VC)y#0mm=NIz|uZjktYfF1C4P44g(R|HFzFYu93zHmdvK`8Du+z+{Y#kL0c zfa!_^CItpg$gLurl$lP{VcrBQWmK@r+FXuDD68@)7=Z9Fz^<+N znQVV7ObN-};9{L?Zek+`cM<<3f&6UP<-gs^WKYJaW(_?BRjf^~5xF0c-?PEgXllV8jts4WWe*^%hEVv|25Y)t;v zSj5*B(lVc3;cnJ#bBzS-)iasBCXa%dxlMf0rNMwA0~lQpdsuG>m;=fHEOyDyd*31d zgUMdULKmI6^3Ag4*R?=9Bat%$5w!TB5~BKNX7zT*7l0NY&UfI)TNfQ{jXU^`AJyKn zg?BI0_KngV8voCkgAZi3t$R|xs;#UrN3EZbO6t{conL@yqgH)H;i><}^brNo`*sEH zMF^++F!jTC`^-&V-I&#}DeU@98=01)#hX@B>gAS_7RxM*3jpEgSm@c+R4WIGK4*$N z`7N8-D(eJa;#x(Wy)jcocVnb`VXFim8X((-kz<;0BBo7X4h!7a`+s&l4J-v{4iEuJ zDhTX219OC76(v{dq7swHlVe_ziC}0>l%SZ(ARECMAZ|Ovk4-7qtJt~ZQ+F}b8q?p) zz*)3^W$z5N&mfaNO@sg;GdM$Zg%=^v9WyhR)?Gqc(;Nvel51Dcm<78MShZ3Y8mtAp z^iCsDHVmYd6mF0Ony@ir9pupcBu`vo6JTmqcsl_OgW8URs0<4NAj|+d1N0O|r!Rgc z3^403c2a`~bf{Aeq8db*>)3&FNRSvw?h>g6ZWa>aP8!;rM7@fEFT;a|6fMr1xiL?^ zi0>NMKIw;&=4UN&Nk^mA>C|U~S#mId|IFbVqGV;F;$5{jq@8cr{q#zrSIL7W$8nK< zZ?rde9*8eIm9zfuFsJ3Kf3#wg<7kZ&D9=Vex^F|nYhOJmOY-T--}mfz)zFu}Ep8Yx z^Ht->B_%JKQfqhr+vpq}3f$zG_i=(cz`qYGZ7J7G2jaqNzdFL7J6_iMwI)#D)iRlV zLFq!5Tz6&P-YVbQ>y-&6#)by!NC#txiWXtZ>wKz-gk3#NKxBuWX`jG4678Q{=^Y?LTh_UbFmw z6^0zB%|aRT%auEqWMzG}SE0Zk-GXHirG`W%$(6zd@r`IhunJxxNSTcHm#ak&6GGxc zQ+wGn4r<+N!mY~LD+uh8mZHwz815Qs)~5L0>Byx`heVg_YYaE5LeuipHKiyLas??9 z6i2zUZXsB%G=5j$8-42whS*UyR%8uNaW`0}A-)w%MOF*8f;$r$<`Np@$tsG!1_Q2} z7n(T;>al3nxpvsVu0^P$1YXS3w)w!>H4L_uKP&X~Y!65)&kbLX>U zf?k5nWwDByq^=19Rf+Uy3K=0m>4RV%D5g?w;4DQ`uWc;2&44tR#mfvZ*5bq)us|)K zMVo*lahJG*iDd$F?y1)0;6a32O|WE5(*%8olGh>!cVfB*dabAHN6?EWQxRj=iljvc zj~(dSP_Au>f;`4SPyly<_ff-=@*zN}v9{v_A)MZWR8t1yjrY&^%bmj;$_u7j@ABT; ze`G{ccisjA*V11p!_fIGax2pykuXphZT z7~VGA*8%qE0i$%xD>4?D39=|iz(yORf_|i_h#{pN3tH4}xa7ipX4^!sI0YpX5*O;V zg<1;A6=g38hDUf+tG$MkOrIoTS49kU6Mu>3Z<}ymWf){pmlN1f%h zDjh46fCEQ=?0bAtck_+Y9ZiliswPGaY_Pk1d(@Wr>r3W!)=k}6|0ffd!2&Yj;~BA(& ztzcfEsp+S&S|wE`PTak^^X~iS5BaS4#jRk^s-EVPL*p~O4xMayS^wqzPnN9v_+(GU zhFfb#Y;Iot>*bs;gGbKXofCIsVtgAZiL39Q+7kDC*7_^c&##GM{I-S>4`CZ!L<85M z$}s_FTMfinJ~|F47?K1H-5xC0ioLzo6pQ^bgAjBAiTY8`%c?hW6k$^E0h5+$M^V$6 zuxNqj3bBw)fi9ONt&}2{WEO?gmT2_r+Oz<@RNyh}ks$V=90X37&77&Q|NrLcT)v!o zwj|7ZmF#=8Y7PHJSVWLu^~;lc+Y2Rp6d1cq7YIjH&Bcq)3sq| zMX?p+2amT_!0h6D>S!z}im|*%!2%K+4w$e~9XM)=8e(J+!a{_KYC+3U>gIsmVy1Kf zRtk*A7I{`>Rr0U?Y)+{aa-CY~Ea3)WB`72{gkSI;a&Z9L|3p%WpdN(DGo_H_Z`{EJBrpWOCs@K-px&5`VPh;3e?Y?)`0oD+P(AVblJh@q37 zLjb#jKphFTm8fO3(!itwKybvF%L?Xx%a_Oz(i1AyXV~i-P`&jw;1B zAYGP5Sksto%=_T4#-cKyRV7Fv-P!0uG=q!ary5a~fQbJyy9d}wm zisQL?vJYjjKSAK|@yDOTzRr6aoP9kLX{i=qSsSKj`Qq-+rx=cBUd=EJKOj*HwLP;8 z-JV}L5?WDLO^kgBmgiq@Fw4zKJ@cyArkL_16F>svgB0p0tlGkzp$vzUp{`K6lUx){ z1)T>Dr#2wc-x}`fZfLy$u3{s1RFpMM(Ylv+W%Jb0nWxHR!#51-KSgF57PvDjw($9~ z_*b3B+YdjTaJXy7;(`AuZmpR4;?%yDZ|5FfJAd&fGdPJn6$S2wa2A+W1>vraC;uhF z7vC$%DLLD(cIm}$-+Qeyv*-50nDf{6J05=TW~S8Nt`D0PCJ~cavJ3AMezIXg$C1OU zqTX5f+1@i=)|uKrE+~>CfBkB2(D|o#-iz-#AOFrx_chx-8R_ueyUXTZNNni2efZTF zr)5p${cR_FCe!1YObPWYhavvqbxnAhd)>zEc7A@+H&NvWA6_q-ySpv2W=BcY#k{+7 z=laU+{1vKE!1rpHVG6|mtQfF|V~s^;!H&UvaoXOD2MZ3499d_aG9e;i?x;Th`1Z|3 zgZ3?nd*pb!E$r~Esxw!go*voL{iM6&R?qGEcl(9h3q8LExOap}{`=S4!D*A;_hZFf zM~9FQ7tBJ49a5YZWhg+N5-~?yKncB?vM}uOl~+RW+Gtq~6dRyxi<6WZ>ktaY#nOnO z3GV@S@Ypnn3zB)G-l#SVG6@-;pxiMGS#O$Vqcs~`?7me8=n1^Wnz=M1oP2fR3uGLv z_pCYNPx3SzT?7*tZa{ygDJQLInjhA6eJ~fJ4ML6XX6bzZl{$pQ8uKHMk|5Z4 zCBbYsiC`V?#STCab>)IRLnnfU&(S#)yFrXuL$Fku1$yDZvWd=)!CZy^m)hWpXoOje zerYUJZhOc&K#{C$BsLzxuq%~hS%hN@QZ25+Ux0coIachrKVO)@nk32DtWi^^QBk8I z755WcFpL>my~ADfkVg|d=!T8Cr2!Z@;Nv2&Zk7H5;}zawiD_sQX>;jq*=R(85ozG( zRxzj;DRWU{tbVpPpwP02Ov79iek_TY+zoXOY z$_LdgHybV5P(yR%6cU=({XVvN^xWe&zO0@xaMZay`7x93c71g@Y-#a>v&EMS z*EAE2aN517;rgWYT`x8*-W;>_Zbx$Gz?k;W!m_K!@%q-yKk(M2F*jD++Lih1rd_LB zPOoV`8JoMT>q_F%qV8~? z?mJx6{Qcd0@AmEFjg7pqs`=mLV|)I7QV`PiQSFVjDXQx|_4`QBIlil*;rZB}KM&7n z3R`;mUR80d_nKQBYc7U-z5MBwm9;tb|4q8u)136`*nBy@!a-A&)EgLd*5$9vGku!tygcJ zI@wvdzO{<4-;O=?)&2fUyDLZDTG4F4y0j^OX`C^-8ss6S!_$$y7tDHx8JVb z60)N4oqd}}58JS!eb>pmr-RPaZ64wicP6!V$>?u2?H3<6AC9_r^IYG~u%e#5*@qi` zT@iC@Wo^-qbwxe@v7NADt(_OC9+co**@~pn8F!-!T+()Vd8vmja{5ShWlHLp51e(= zhaYkH?qjckb8X}6XK6A|mOTF{KK8Ho55?8bE$Eebv9Tki@3PA3+Myu|Bk*m&Yzz-< z4K4}&IAx)@Pl`b-%a==%yVw}8Q4ky=1+X}52VMh>k1JJ?$zOP* z5D+0GTWnj!MgWz_AhAN_C%SE9+@|MZ6Q+|y-G-irpO~j*Y3(F8&&Ih%&+v#_X6zCu z`F6N;)O8*A#A#5)Le5OKJuvtn_jFXj1P&`8Wy3)QvfdVVTPM7F>A4c1u?cT?$vR4M z9ka~_{4l~%4Yif~vVybr=%r9pt0{n*VW7DDt-LyosB>0E>#+5#C}ElNa|RDrJ%?U^xzwjD57Z^ksPG zcH{jf2I}FVE-V-gE)3`FGiB@)=;RVbAAo3?wHTAF9#0R6%@=wQ(m?1``FmDb_oo^N zPEL?mNQ}u(RhJ=U1E8mrmrF-LrgEkmeYHTn7}DwG^!yD*;j*9LTdrXs30s!Mu#I%x ztmHx@NHQuh7SDo?{wjhRSv4V&EzdYpdamTkra(nQV7k@M?nsw3is_F3VFVBCJwK9L&=C(1e$67J7 zT6Fkn?zx)><6kX~Z~LP&bN7n2&5<|a zN^4KONIgF;@?z=bzb-aBsqVL_VxN3@Y}rfS!yQlE z);}(dKJIfjC%?UUOXa?h*=`OE6Kj_&eRlOg-x!~kWiwY_Z#;0O|jg>;wh?rFMptHEpY(u{NE$Id)FT~=Lt|GoH@-h@T8AFcmobLG`L&WE3U zbGUW>`R27xpLCVqb$dS2>*TTtC%#%ZXX*NTweiQYGmcMs-Zrsjj9Ylh@tdDVW{;bf zpO^Rg#lSD-G`5*Sx=)p?dpdMtHrBtLp>7^)&S{$0JoV}N)#t|Xs7CKu8!E3p$ad-= z?%`wGn{(cK?$py(vwPL1a|`A;-B`9h?y2vj9frP=zRiH|s)Cq5_(ZPw zlhg#tD?MqbA#3)=fBeW+P#Rq0bb$rEkbH<8pg^jGKdY9>*Gj8LH*b`w!2;&ugC!vt zAI>}{!|7Fmf+w@zJK#HeJ3D(2JAbhuK*Qg9*jdb? zXVuX}z8F}afdeD1UD!JyO@q5Dswno^zLqYSCA?Cvp=i)6qkNz>YS{@Jz~b`DgpI8W zh$OUurYW#mG4c=?07O^8J!|jJFNvJzPA`i=AkuAT8dEsRI|1}?Y=c*0(b^HRZepEC z;aXA<=WMZ=N`^akE<%Xb`3YUwf#{MgrJeA0`&kxecrp#eax!iVmaQ-)Fnk^9=ngQb zZE-s51-lP^!5m#M@CW~GghGP_m~Hr&Z8+7!2eE>Oj~qUUei@-sl;!qi+vTsx+ZFwGbREw*{82NqR>7DMm9uV|MIT z5y_>~>4d5{axByiD~*u9vI(2c`#pXT5V$=h8bvUCu5>eisFo zdxoz6fbl!z)wakR>zkTptt+Zszb$p+seMtW+8m3!k{jI{et8^tzP9AKDYkxA{JqRI zXY-cd-V|Rnq42jQ>vzpsyZ`)+<@0*S^pw|hUkiD4X6(?_UC+Ll8T;#ysUt&3(P|og z=;7Q41G6J)8~2BeoKf}TufMb}S$Dm$a`j((vu9ph{MPT6n(HHPoIKG~zM=7}1#=JN z$M;0WcN~52vNo=D*7~fut6pnw>%HjY-+%b@B#+#F*{!8u>C+t#XIyD)$mwz{={z3a z(LQn9uC*_kiU&Um_U_1?T2gUfQrp>Ya-L?Ev?a&C{A1sZ*viy#pMCe=L$eNk9N_Wr zVQlll_@^;3%}((Tj;~FfdMkF?ni!vsEj=#?_FC$2xQ7a!v2@vjmk)eyt^4~x@$CcN zT}{#djL1H6vgh2*7YAoL(N{N~X!&^Qv+K6&ep}|0v+m`SS6458_4K2|Eq81uU98{N z^}wm8@s{^J=g6V=Ru#to`N@{mFWx%Uw(0KFnS6cijcqyWo41ZzGGpe;1GhR(2Gth7 zIB@FHTR#8FAMG}D^ZCfBGhf_|k1gxjKQR7a=9)jUil3eJ>AF|a^RQ&ipT`c*yQ(}~ zLqJc+!`rqECtlc=boMUk+`iAJqbjKQdUkRBg04qyjq4sCD7jgAs;b|yS&PGxH@^FB z=fL=9wKH>;tlcwieSPNXCH^xayh0i~Y~x=Po*X#t)E{$C-#K%r;ljk6u9%Y6eKQID z^@)3QuE6_H&6w8EEwOcrz1Ma=x;(V~K>YI;=aSY`3yL80mto_rFzUJ>4JxUd5KSdVs&r8UsuKciZf>&rjNPKHz@Z!by z_m1sLg^>ox(}ryy^RWskBy@s)T8xh!ag1cOr*lrE3}g5M;ArnzKAUwfIFoa@O&z;B z(J$x$KJym9pw8?i|Bq^l z=_j=oe;$$FYsC@(Q6c#5ND?B_>5UPXaSKEWj%RYEs{%GZB~=jlF;S+JR$=8K(Hsv8 zwX)3TMEXw45Q=IJu^s{=H-S)KK_RvGLminb6KpQ%phoNrF53`XK5?fn~-YUmUm_A|%i^wVg=r(RdAln#=4G~;cqlY|^s;@#a z&X1?|m+IJ@+Hl8#8$kvsEGtIFuG1Uv!D2ZL7>j>dl2k#X%Q7kjo9{DheA!G>j|fp} z4TDkU4_FNI3nOm2`&l>;g$T!NkOh9F!;_Due$l zu3Q}pF!cHqvep~CkA^BdR>W#L5l**>(IJS*h8wK_-W@1*A_W>`0UTA>aE)~4F2GY6 zmK@6)g~5!mCmg;buvwV~K!gM|3iAe5OCKm!)mF1XOEh7^+hOBCF%uM)8H|h6vv?A< zp+alOcMMCD+=+RlTMj2eD%MMQ`$LX<-A{00J)Oy8GQ|crg@oJKzhb*Es8#Ra$#^9P z^>SB<1tJVe!RJbZ>jXK!rULB9QzhXS!a@v|lrj|Ge_k1uo&imLT+mBPyfOCNc$k30 z$3Z!Mr)cBAO~MpID=R!#UTwSjHbSIvKa+|KcnSQf30`u)>)qAnggb}72*#GKKN z`8(QO9gewe@A&0bT~XY9JGY+P#an8suT9^w?!u;hHw)s|7e_q&qa|$MYt5$~2hNRq zdEIfz%~8)!Og&ZAaN~~?J8CA5x!LwC^2VA6XQyvDar^8qvAPYN&4qVA&i47MeB1ef z%f9M7)js6n(C&1%j^Ax3Omcg6{R~yC$-c8z5mO&tGE9ey7{#Y1((jZWo;;~`|;4pdy}u`Jv=nA?b*qU z%RPHKn@>ExQC{uV^OsvYiEE+XFLk<=)7-fs@TpZnb|C(cE;P;2G zH??FtE$^=0*EBcz;n3CHO}iUcE<5_c7eNQ+IGrCDabVl|OB;Vb+#L7oC$EijdiJ|p z&+oRA))yar<~@Jy%bwEZcfZM8pO=03R-eJgy&w77o_vlB$;ov?(W3hCD~XF;TfMUO z@uOd!6gF2RH~ZSId68N>q~YgrORk>W5c=LbZ>pS`E3H@@Mx{GOFW>9&&EUBU64Oc- z_U*0y`M0Yd_o~y*9y2S)Us2DEXt(X8@)~XY(hUewe)AO+i&NfVgL|?ZIk{ zQWD+};FsYs3;%{-4Sz5kNk61``) zFN;N{4?@xcXk-MBl}07scW#-dX!6-)X5LOF1s+Z>qcXs6$V`J2E>#kX32rGU_5jUQ zlEa-iHXDb-P}($fHQ;*Ae>6k^3_wD|E0;=w*9!A})0E+Cd|>~K4D@;xjOinbz|%Uj zckeLuj!Ll-8p&o4i}Mt+8Ol{5Yd1cwBC`(c2w6i!(= zo346)qZHNCkHk;4+swrvtsW4%%F5bZSlQuIHtm9>O^BxPRpCZ}Re`+{(-Zfm zJ}nI4A_UPAehgC^bq`({=vS1wdiK^UJgN8W?=`J%C>-D@*Fn7XM-W+q9C;fQBbxqc z!Yz%>dli>0NUdk0_{A!CNBP!b%?1;UjnaJf@x93cG5!NH7Q_!>M9|hu5ifFV)_t6E z_}UT(bXIrbuuN-lWy6liCrzzbGx9N3uqr)sL=9@qmLUSglWX01+QLIxMF;fPOmpS9p$d6y>v_egOdy8DtLJ zpFGDYz2WU+NB7t-=^yy-3i*xi$3~3wR9`xGrPs#F-;Z59d3yKK_a2=K`R}db?zYb6 z?gKt0D~}aE=@)YU-q7{cO%-FN-VJ@#wr|qic|+qLY?v3bcIcGx%^`))FE-X!Y`78o zcvbHMpH}RAJqeE8(7pO8qjE?8>)Nl4e;VFc{FCm2?sLcKRZYhRI8OOc_vsPSw^zQO z``Jf+TPHs|W_t7IPlLuEtgV0JztweK=E<1{j}9LBdH>7r7W90Nw#j2$RKU$gzaEGV zY2Em6K~3zU43%r*_lqhvU&^|xam+t)srUD;KN>!t8NBm!^MBmhH>Mu^{euU=1r4Wr zd`FIJPB>K6`KMy<_Md+$jgD&mAnW-Q=W(~Ml{YOM>{>lB=|a?J`qu61HpTfG{;m4x z#G!}Z{?xJdTCIH4&wEyVv1M9Q@!Q|LJ&PO**q~+dx&Qd$()Kf@?(h65l|S!U9`)@U z>jD1(?{xlrmZw6mxZAO>an<^(yC$rN`th#kz9H%6a-&_QwNW)?^4B`C)3ow8*a+(u zL{+pzVDq>`h%4WQ=l}jNP_m-k{jdeE5Yn84;YdYW!-PgVDGn6OD08QI61223T1vAt zoAFtWfxfU41!Cn(_%{6C(XHY73ldMA;3gJ~PR6i;%vy_aA~1)6g~n8qfa1A?G9T_V<+C)wLphGK~UnT)bL@_jh0qWKi|Z^Dwz zji$~*ty}@A*NH}z?YJbc0~#TYaQimFj2u%C*JE*R_6tM=(3P45a_E7e-nek|`Gwzq?zOGpvKM}YgVYomF;1dmVCjWG38rNA z3J)d5UY@u>h_=?=dDstEJRhF;SPq(wm%mUD=1d_sX79o`_IX82h<4E%@s23~X_pCA zPF1(7US%yaz$!B66np$f?|Har@|QlcGQ-??p{%4Rek zV9DYyKz3#++G&ifU;tB~t+eh?PE8`T3Hsd}xC100GHv^kC#*)W=M#qPSthI#u-V4v zXNJKas*my4eCrfn_UDPQmso4#rhOmKWs7VsdKO6um4NM{a8M{_7f}4A(wS(c ze9T^8a;3^#ksk}mI1P1!w_A&x9i_p<@rx?@(zr(U0;>; z;6_qn{iY4KmOsAc`til&_8Ti}J}P=(SG)WAU(ql7*XGo%y>WT>%V+y;#dck)t#+eB zOS<-5$EuUhj-K~vxw&E2+TU8nXXdn=Em`-nr=|Ck!E>(!T`OG_*Yo?L;#I-tyIC_G z>ip($=ES`5TarJK&-r2dMtf@ypA~1aUdGhKmVNT%z1BaoXI5>#c=M%gO=pv*>`G<+u+ehm(BMo zS=w3kV@OwMZFJ$mw&s&>N7oGYNd7p;Sr_OT{ejhh&m%rRR&{T6(e+b*Um1C0Wy>>{ z;HS^3YcKY^Y-@OO>P6b!hV09Gf;vC?Ywe_(?vuOMpFg)Dr*Qp`e-w>;@A-rFLtEav zQ`h#(@#r5WD?*=t^21rhc6I;IUMi$=BG-k`&3VTQVm2@B7<7Mk&$E+#7KO5Y{HTh9k&5p##TGvN(GVmnmDyM9d0xtO5%^_?L8z^dRF{m*6mk2aK@a z*5%kHbi`~uTk=gDNZ1r@DD#+7f!mNWg<)T4V6e>CrU-9Z^xkV{-u%y-!+)?%8YYqe zz0;uf2p*Ic!$Sz5;CKBr*l1zm19j4<)2p1_|1aZ{#dqENovDjiIq9K`-;va69CFHy zGS|w&=|!J!89l^qU2W1&X=%{gj$jDI9R=A43XWc7g5L@2JbdSah2K*gzZrGy%>0|} z`9pD3)eB)ZacQ=WY`Q=)b%R>J9%NOHB`$2ZH1%vlush22@zC^XzGR894q+*2y^vAK z^vs1NXN$2>%j)gvAQ#qEy^LF7L#*BSmI;F@e;6u4E@+J_Z)JE@@-(Gci!Wi$2Fu4C zj|b5pM-!f57>3b_!-~dB&joS3Cmvd7SM(>K!1xaeQLDaOlZMJtZWd|CB5D=^y5N)M zmMUplMF7h*tnVF}?4iHmD}xeKCz)I^`9S0;Ls$>6DR}q7Zw=Bu3StR9HELFYE{qR^ z;0q%{II~*}thb4s{g|<~s0x5+yRoxBL?h{oEWM_>_+PwDGL>MyMk)0>?nj{O2UST- zla07~bisG_&fkCf{;|Fv94}h2HZr#CaY_5!c<*A)blcY2XRS%sVtTIb?n%97yXMQ| z6E}a}eDmd+l2y%aeJg|Rj~P5<&7;L3G1Ym?Yj<}yF7;_K6nIpgO7700pLV->l&*k&4 zes|mbs-e2)U*8e18B}s7(Wx`Nrtto_SAWbZX$`F1Ip=6&-^eWvwyPgc{i5XZvP0i_ z^^5O0A79)VGkVsV_D2uCpIZF%$E9_ndI!(g^N#G3jDNRZDOkF?>a9~}o0q=ozV)iB zrg7PVGgCVUwzZxODtY#!)9OXnI==6H>#I9~F_Ui3iVy3k+i>fv1+NChx7OYtdZPRP zrrum$J^J|0p35cc%LpJpH+9m>j}E{1duqv*#F+T|HSte!Mn2vdoV#RMwM+2JceV^! z>YsJnbq;+q^|$TYA3GkNcsj1f*wuD?+wX3#(zl#`P`c$b^nzDSHBZ(&?V8=Z zyQDB=rq9#Yot7_{6k>aDz~?gU7g6`>+_#_JK1sNKvMn*1(|1UP)ZF!07povn*p#{KH)_U4OWZ9vJ=3kX_kFZa(`nbA8gl zlBV#Pi~sTX??E%y{(8%M$;z(s4c>Q79GtH!lN4AR>;2N<7nwCdWx#~U^^wi{Nd|XA z5HQ}?aIgjIGg*u(mFS|70qSX#e1%WGf_N=jIx%fpF#HxjO$ z<#n%gMpKqWm>Pg>Dgow0%309U;S^Od(pI_bPGm*IJAs z*DH}A3MLjid;vC+E7==ank-$$-UG2S#~rDX%tlaFwU8bxDF(t|l73nk&j>3eX*L!N zg198wVPd@^`%A(I2<1n=08f76cvz9bP=_!B>FE9;2d~}T{>A8ZvljOg0TN8SNxXG_ z2;$Uk8zE_&fk`&pn*Mgq==U1mzW46*GwuZi*JoFK08K(tAF;vs%Fmpev-z|4x6iJ6 zdB`CNqCJ9Kbifh9GM5O8vwg3&M|}Ts;o#ach4HzchcBs$L}@IT%+u1N;po53F5M5C z-oq@>1Cgey9HAGuWB&;avakw=U8L&7_Jy+R>ANh+mw)0i<_zcC5kyqXyTz+_TcU7p)a>Z2kSA`n3=zWF zs44>01ByHrL#X{UE-66h7?5CB^Wmh&mwo!P2%;Bd7ljqAHC=bLK#%DTJVkheHIT3| z&Os*K37J06nFOW#fDI~gv|7H#-Vt#E)OhTx7ep!TnR=xi!S^0Poaay=0Ewb#eHXl zqzm->c;kt6cYMcv5wrY2|0NIV^R|s^{PN|CVxLuiy=eNu|IaH~V{5-y@#t*cNvDzNAKNp26$dx(0Qd| z@#g5?GahD)JY4eN+|ao02is^l*ZlRu-+9)Ud*5vEZh9x=@gAr3XI6!*t@$M9#g)d? z%-D*lyK)XsjehTs;lXWJLz$NrT;Qh4lnX~%0e*0qn${qaK%FYv+u~nn@9q$aQ-97%4-NDrTtDC;b4*Bbx(^ri%+}akHgZW}^Vycv`igB0D^fcgUA#7Fm`$OS1bpG6X*PO}!{&VK8Nh{A} z?TYL79UPy+rt8}xH&=IlzW86AFD~-(3SP>MdTijZ{|N{%H9AdP)>tvR{@B9>t<7hT z*|Mox)3PD>_!quMe!07ECVlgPCx7fcw0r5&Dlf05ku!F!-jumEFLO;*>iGqW7B>9% z*hPnNH@~VpGjwfZd9i`*tY2NgiT0aonooBQoi@2HgRI*?DS)mRPAbDOA)sImeGNRi zlqB{&gbLE)utBM#^bk#f@iSKG^s-pw*O@Ta#E{fBh zhP(crv+g$MHxF6!=lf0*cGrLdjD(>{&IH?_p?Vw^_)0RgBH@W8$8EiEci}WYybfZ0 zEjICm)1WNX1I=372#Auk60jqFaxl5ErIK(2F`~4Ef8^896-4L@h84?_Omw6~tKd_5 z)`|=IzVf|}dDt}nv&CD#zE9jxsn{YVNQB?UUYh*#wcoFPJNsby(UYHJFiK-;ivUR% zvHH}|$o$jW|F4(&&XkM?_g0^s=lmh;4k3_`X(@QnFC=>!UR@eSJ($b*1qArni=`Ko zWyl9wk@&^$#=cEBhTv$-Mb-KPMz_MiP|e#}GlG5IR!eG>OpVj6bsGL?DoAyB&aJgJ z+1%;ib7Y0XEMUkvoTjkLn>YGZ+tOEKcH#P?ks_L|HC;@;?D@cQ&k^};utH6F2t zo%KRlShK-bd_dTOB+|eal^wBxyokq8hP&j+{*SBWP%c8Mv{YYDB@07M7^!io+|dn^ zrm`->qrC3oWn$t+)5G5%hLcEF@=s@ey!ZC8gVj?u{oj<~sOgLz_&TYqw2F_BPDBND z#`JVM^|Wj&-{#iV$L-bMm$R4eHT$DEw|3TjdFR2M#^c>LoqDbocIVcvf1c@m?4R2! z_jNzs-Ba!}xcJ#yC4U8ZzxZljc|@j`=fzYNFBx{Nr2oWEID!7yL7W?A@)R6)^+M7^8E)G|JxI>uU%c z-Y4Bel1`}EzmESaS2lS01=yQZo6;`ZwTz2zofY3QF#fx&Jp(3U_#TadCB>s$Ll?zG ziIE{&MIIA?$||F<*hbh#cAgpao0*5Jp8L5ypBYCBO^C6FVVqvkF@atwJgsoroj3#o z4pvRQ#@5U~8&O8ep1)C&{r8Layx%Q+us1vS$@Ab>FIw&v3>OR=DA+8hg?km=xC6`S zx~zpyW)hp?BJ^lj9$`bmuSHKhaO2S%5FN0*~z0F0mFC z8rBBU6EK28u>s4cn<4K?P>Z~%0pjorS$jX!y++hB{6NvZ_8DvH+!Jfhl zA32ee_>UXd89@+g4YL?5p{%C9aahLy*$YE(1mUz2LvhS8#cHjvr}0YY$fOy?#1`sq z7CtISv@zT-szNKoZv?{$Ga+Fk98jzV!o|CbVnhDa`|15O>Z8{-fA;XG*TB}#dzE>) zdA6<n zn0LKZuX4?p`taVOQ+Yc^JB-b)bS1=)*bo%bGk<@(pz+k1U5`@_y+wXstOHvT6fe@{ z9Ru5JJ<=5%i$J5Iz?7=PEhAwonjpdvS&yd?_f^9N2h>+IT7kl2s@xCJz6k7+X(YO5 znEcMzLa`mUv7dz@R6hdS>_p;5&u~Af&N5u{um;=-@s$um^QMU;5&`HK``N=ybH%iv zABtZuMsN|FsrFOph3d;1@h``G7GV5Rn`?*}S8PHmayJ*mHJ3E!D*aEOetJQ_8vgK~@{@69j3H$(^}H zT8nX(?Jvpo0fyiK@&@!|I(O07gQq_@n<4%1>G9e0@TnQTOBRB#%1m}zn>T-rT5c@|_V{FH>`J1m@<%E9*c43mEzeqL_D}b-H`q9&yUX!>3lGZm zP1glpd^>!B>G$*j80w{~{p5Z8%Ka}rzq&A2GMSAE%HjKaqg_H1b$&806rXiU^#x5| zy;5cni$$;{Dj1sY3jg%!3o;-N)?u50#f09$FZ9A6StlB>cKtC@y{`>Yf3b|*?e zV!Pj02GiFUg7wzeF-MU5b+9@>r&EVA;O) zj6J(kG}96nHp`OMG|U(P%`GnA-fq_52Fb7nH_gKvYFI)x$2P%{!XF^1m3SVe?c2qQO<5R3n3R#o3{ zyrB41Trm5Z7ixCU$~2H>dF8@0K~k_o9!tkF;$!>ZKTXsoULvGOh29p{i3 zK9?(BmLUKFUq)}SRL8*u({4Sha9?kyrX)KpPR1C{^3jP^6|MZ8q6_p5Ma1ILs*xa~ z=GchA8%uROMX}#${Ti)Uy1=hV-jt~R;xb{>;N(ED7lxO7C4i&MqEiS)xBwB3h+Lv@ z6f8tK2}QGzf`~r@_7uB>qXD)g?iAbqSt1Iw_nctOImyU!pz{C(rhNt#lCjhHg~8>I?0_!P0AI`2(feGxDMm}79sIaIZ_d6 z{D0M|Aho?kvd0Ay!;S1$frmuQ87QzV>KXnzieT??h$FVh5ca2`{6$?tH87WJ_+?c1 z_hMOx<^nTv(#}0+1uUvB-+%Scfnz)Fk1$De(2;iS=o`OKQeQMBN-8JDf)-RV{))%42}?L#e*1ME9C-iOvm9Iz?HDCz=o`no{C!TlQO1hNE%z_4ZM= z6pM(BUiLuu622AW@1TR1u?)6s%597u2BhyzvhcK&2-mQb)abcl`JqpbO-S+JBZ7I2 zSBq9=1U(cH%xGeIsdjc>+&^pWu~~!v>9XBgSd#|?ptN)eRnOk2B9c*rAxpDWX$nv~ z#hVK6M;=?=Yu&hfd8Bf(!pM~Ef#fAHoyUUhD^wnv4A_?eVy&(M=?W+tfTWxvHApWH zvM+=06QO3@QUquRQDW6K=V)|TOo)aQ;psLVFfFw)oJRzBY?x%y=?nVF0clrcO@G5& zH$tH@spTY8N7!gWt-Rz7e7KgDPilds*B^<^90y~H2k0-#PvLa~9hIDr6kr2r3`WHF z+f6bTYsn>w9MK~rurZ@(K`0=(>{o36U|(7^?`4{lHeK;8dV77jk@>@_tgKEjB+5i4 zJ-ZzN^%6&g6+o|CocsxcGvwI9e*%fd{We+5j3Pp|eOoS~F?>e0#@f|o2wz)Vf02X@ z;*S$fN9DotOjf5PtJVjjgiZ0It+YKq;);wvXM(xd@W0#Gk(Q6><$>1Vopkpi78?OV zUqa)W;+T=C692O#u*?O)YAgkk(1-C#g=dDwJ>Y_-rHj9xmI`N6Tn?vAHnEH9(@)#- zMIz9Y0FJCRQ3p#IMaa~-r3f5Ejh3J=xS&(uobyYY;RoAj^gkb1x%0ET?$8+~U^Q5>GFW4Dn1I{EES1GR3*%fF z!j=7dOy4 zk4lcq+6#q(Qmos&$At-vpt&nq7!{|*1$*g6^_Eju%L_^k z|91)qNKjv;7v z0M{h2QeHm>U%e_}D;HXd&Ryg}*$bVBtf}FA6Z*qM)9BE|Xlr^5;VUE5HwZh#P-LRQ zD?<}Ui*#ohr0YNx6KM1ym4c50y0<&P^QO1(&vnjmayB{V_QEnoivflAxImGj0V?Jf zz}>{9jrSNnJuug{(qiBV+l?1?K|wIi^ulri zgh1TQ_-K#7M-c!rK}YKaap+t`It&-BpZy9@JADFsnv z40r|ePrkdDK2de*%sV=*Wh(w6nG?wW6dX7&2MEPHG_WHzUA zvBcn}lXUKgh=!56Y%Lr^bb_^nVQ=AXJ9fe(X5estgqUs2-T1)y3rHSOI-Si&ED92k zkJ%j=Oo5U}!%h<%O9_fS3Y%HfNBq$7Ib~i5wOsQM4sdabto-=XpiUcN%-pp!0qWxaCUZQ-QP3XQWUIpgYp zAC#e0&J2wul{Mj^rGCa?JDzvD4?Q+&F@N1k(-%MKq8;&s8f4NVNZLeS11T!4BN2*8 zlqi)I4rUxev(U|BZEa$k9iApLd%MAcVv^%zgI-7~?oaYtl3ayT2>6XibX0p`o`8;k zhmsGBcPpPw7d*5okeaF$WX(v$@b z3%K{B$gHFf(e6V9E&w2ckV-~nW`#xuy@}{}00?JJFDe3ztYC~9h&O;euTZx9fJQgP zPV&P7dEN*>YTE=%0gy4x$6Oaj+;X;YA|=8yktvjYF=wgCWSOa=qX8#UYsg~92xJ5z zf%PISjgS}*-W~getx@s>y@Uv>>!C`-1JR*@@`g&_?b&bHD1$~QF5rrs7F&uJUxjiM zqcr#rhA(){3I7bOOywN>ZW!@_LU`9aawrctE4)Eg8L^XSV^Pq}6HY@g@>^Yn9bTq~ z0sWQLY`nucrl$#}<4U6=N66sIPKquQzxGU>;eK7qhDnc{N9RvA;tp%=Y$7O02VjDq zodwlnI)b*!Ak1Lnj&H089#lZOK!4zEWG;dnLH9|~6i#en{KVLfZbB07QCdt7L&EI4clJ5-DJ}MyN^vAcjH$RhV1!e*2A##TWSy89S;njPwh!m*VP4(dkK2S zQcy<1fi(exGzn66{Oc&nBoQpZgP;toLw3=@zXu3bGix+mlz3|(pHi<%(Mb@yGrZ+6 z4Yn8KH*{_BxzAFyxY@}C4s)l&lbddk<>SZskV~lH&Uk)|3_crI5+RJ*{o12n`7cdu*Y)9|h zXcvYaF$3`HRbw&q?oS)j7q;GrIxdS@4vG1}pb z0nHE_LQls~CTOx|@Pa8Ql|D>TYcO!{liiz@w!AOhV3c?j(bhqA+}jvR$_HUw4KH7V zw1pSzXl=&gOiAx#?1wWJ&=6)xd>#w1`V>}DBEl&U0;>2gm^*VnV07tqL5#2zaS2cQ zGF(um%aKb7+aA1w7Vw6u>v(XngH0@)#)taa|F>+TlOIToov%U})w(oNO2h_R#v~v% zJCR^Yd_Vj=yRjOO(sgNCey_%7#g859gTQSNKO;ArJE& z$Qhl^oI_#?etg)bcZfV7>a6I=;B_=dVkN>SO-an>bM=+tE!QN_ymK9+N5fHk` zC>df)f8W&a*J&0kR*f}YLbw{60W4Bkwj&?I&wxSRGl-suw~mVv@PVF)i8&rWOGzt( z1j{EKHKxDFmH`q47YCS3LwQx_U<+a<=L*rnWx!|(M8_%sZy2~18f(c_(t`r)g`qMZ ze>Bc<;(l(=-^yxgUKC}7l*%YfhM7+3c%ob|rCULpu6$m{3utP6+59IMcvElAdY$&a#3Nfn~Mp$4$Tx`9O;^B-HJ}O+| z>dEDr(V$E*(E@}w2um%4+AAZ~=#CGwG0KHW*a?D5{%Df+qKQ(J?I4CM;K5PiOue9x z3IChiQVeHw?vMuQN$`yn6Q9yC!Q?Baw^3^)z?R_yLK|3}NH!NVy5P3~FeNkt0`?ed zUDcO)Tpo%(yiN-ZE;kh+@*Lcu#;J zLKc-{go<*v4#;UybV8D|i~sX;^?&?+kNfw#+bUe&@8|P=zm85N%TCFrUwFC2+b>mR z!+FTvZfqJ;obL+%E@s?I5->4boq_-~nX)Q4@jtSboyg#m>o6%$3YGciN5R^Bz=3Y2 z`|MpNavqR#;%i|+Qf8El(&s4t94e1s!Q?dVB0Yi$E@oK+E@M^Z2XIA=nbG9(GD7un z+Gtg&En_UBd7IhifN70rtrHM8;d=DRaLRB>beGh*ipCdV;ACRP4gjyqI*VE!-_^tv zgtZ_nd{Cg!cGVlEPvHQ7bxRhII8~Xvh-}kd!p3FfVM;a=a9lc%F?u7-=}Ef0`Iem| zl{0FHx~of&lUQ02wrLV#Y$$G|gofjKQnFrEaHat#gqX8Q(9+^H*Ws9$XK70MC2=)c zIw%fwNO`fks66TFq%ivDrE()5{hgMq6Os#s8&Yk~gm-jk_7DqA?D>l%s_Q`P!QqM+ zVe)SN8z5=vS&U14CGJ2Nb{II`^*e^*JJcG}YKOjat;IT5|Hla@!f z98ze=8mrghu1QB)DotlM(b6;17p{?5IBtk|>|v<7$Uo&}WOxNGsM4nITDp+E=DYSv z1v@{PETnW!X6eA^<@GNgH2>vmP{#@lf0|);1L>bvn1xi(C&nbEtKJkXEpqWl4o_jW zr3pkXv&RqjUe;b)B}XXHRK7ZLo&D5viz9xYEHRcGal#om#geB)TVm2;g(Tp{k8g{S zS<3(%ehL{Zm58Q9lAw%1RTQsC_1yA=AlgE=@=ORdSS;m-`(Rc06lmY0`u0G(f;JHW zA_DV7$+TU-ZbB7QCxLTfAJ`cWs3-E?iU~m8E5D zdQ?|Zn~+_;2r^7O9tM%P!w$x zH4u`hqi`u>=+%qiN6BY$W+lg{20$;Cv!{t$2Q0ni1(92h`b}h!OZ4Sn&ldebLfHV$ z-tH%;W*sV8l2{!Bv3py}L}`~~mdWsn_LAmEMrA|6|F7jUnC*nKnG{MuGrnLN94apq zRf#Q~xH||sAaXqsADqV4#T@hk_bw_=9i^oOQw`l?&r{nl)j8rb-V?~s&b!SP&5(^t znsEWbh$3+bLl%)3l8 z09B}_DmH1ZoSZxe{v2mrG@c$86_Uu}W((59VlcQ=zfBH?L)_eD(lVuU_}V>>+_IO} zcpPlKGrCiK@82o+YD0E3E;*ZBCsXFy+s8J3a=f(nwz{QuL&k;4lU)foH(S3V@5KJ& zbMrd(EgI)*NlUg=Kl|gjfclALfeyEux8`P_UP$FgaTH_`t>&iOT8Jw2eJdZ_bDsKV zL$z=4;R$bhW*kmUK6K~=OH zfq-_y?h#IBu{?vqIf)}weBxfve_FdMb%+tASQ{mz7VoZ+sf>-5i! zR{>l>5HVJ138}=mY#CG3CE-rYp><7^$#M$gM0C@N$%3HX!UDo2W=Wtdx+2DJ@=Z=L zH-UCBEYiLWn{P@s$Rt(?Bpv1aV;=cv8CVKvx?l;-@nD)t|CuJkxXSAf55cipP4N$l zFz5}p3XrR$A5U60abR2P=n55Q zRj?-Q{mKDk3}Oyqd(9Rh%NK$tnv&!R*Zg^+nD50a4E;Y&?o00DB@*Ge5_xHO&$Li? z8IOI2y-BejhA%2G8bL;|<8%`*icQnw{w_EV7ct=kOQj$1;kHFoN(eQoy^lEjsbFa8RFjtxXdT# zr-h?OdPZR1xYs!@ zrfMPf`;?x5Kq=;>z5OHVt{v_D>V~$;!b=f_J*iU{<+oZD^)4#xF-$8AzW(+PuQf#U zpH=TFsEdfaJX~aa^%^11bTEC+3L4D!KgB3-6F^*4m^#>N-iO6q%v^e0} z&ohj^P5iC2C!~4k*}ak9%*;psv#s-(qk4ApNUFd2$i(zfXB*X*`8`+j`VAKswUwK# z?%TRHy{P{O$ALr5>R!jf*7t*+ZRqOVU=#f3{+uO4G2X*v<|B2Ekwet zCZb?`QCsDN>d=RsT_X?vSQOd#sGtQ4#aMjv$l+-F_uLDwr8*3p_TC-bKUFOPryWAy;@!{ zPC3>o9ge(%Rl#K02{_2i2p>B}N;!nxQkv^TR22m1aLOzwIp!U0g|%2TV!%3(iMI?2 zuvk9b*5g3sD!3mXx`Hw>!sWFq4@ECMDW@%2L{ zSUQ28Xh#(*GP4XWN^LTcHl^o7zk_h8SNpjsIT(EBWQz#W{eJPXSkQLm6iXN#(OIo| z(`G{HfMrUqB^-CA(Xtp8hUvD5rlMuhWG5R*`xy%q?30LGh`WtU3N*6U^;AYDu)s%( z^B&*qk&qxa$e zvP$BGro=@NOHvAPlTJiJGmHVjKxuNQMq-s^hY*qUB6@p0+z6k(0|%)xQOpXWqLdQ% z?XG-o!Wa!IC`|l}FsSPoOjBtCr!bh=vKC-334FyFAAqbJbi_hNi~~)H)Kl}V3FTUH zLM&*6Dx>D;oYr~xztH7fd{V4lqq{X~5n1Bq0-pZFC%f*IWoC`cG!04(^q z8H;!|jY3hzkQtm3Ac+Z{i!8ZL!e9o1lH*JPSg>P^6FU}eAF8%M7*_B_Av9nBMK+=c zps86Xc5QPKCK4HwrHS(5Z#PmB+9R@ky0;6^v|dQ&M2UT|0=4oqegI6+#mkH}=EckC zOqdL-Eg^md1fi5Hivd=ZfN^41<2!?5PJsHe7Xi*pdiu#Wfe^73L&|hEm_Ls zw#GS(`KtF&pySX!uX`WW7YyI>>^ivkUPI?r|FO2zqI>@7 z=ZXeD2V}Mwre?>EDgBLGn@>1y?|=ADpjWGf)o7o)YAiXjtE;bK z31+f6YaPatFeGI3UECM^x9ce*V+9n2LhSlf8TewHx6{s{zxbug_m140m*zaH^=#vC zXWo04mRz}Z=Sa~|WrXj-CF%#2Rt-zi(tc}Pffe^+S;2=j>2D3kFWPf8t@p-$)o^aR zs?~7MoT+~;G_&dZy=>LdgD+kJJhx=w_V;z-{cc0K%^ivh6=G6sJ>mgC2$GG@o!OF* z5HL%n6V^=9N|%)&ix&qIt)Il0NM^A}m*&;+-epdVvKHHvwg#YJZLDR>^23@0Z@jDo z!2CIJHd|*6v>6+gOVkWhHnCFtdAnuwR+x&KcJfH|WK1V~@cN0ony{oOe#=i0ubOuBh%4qth=)!_!vpE2O0`wG^X6WWHo@$rnOxR+Tf{S;hbCBf|l9>Y= z%YjJ$A}P0?6^W!phAmVQ${r_jR8a22i8#bj5CQ`U>aw(?9B9W=IXXiehpdm9CJ;~K zu~&#)=a^C00`riD3pc9q;UOg9wAY4&1$9}UvzIlO{9d|YG*cLlsux_pNVJ_=u4^$> zl#amG3D_I!Z9TW5h&dxuJ!HSBq(k^B44b>-pU-0f+A8R9z!Ev3z&KYR9WldG{a;uEq$H@X@AM$bH*2{O!IyJ1)#Bd^&4M+wWs1yoWj*&$X8{`r9md zT)X@45UZfVzS?6}i$~of)gfK=c|A(}pG*9=K6)+J@I<}WGv_Ubx?XKQ(EO~{BqG5h zvcbmjj#cD+|J$C9UtgOr_he^i`SsDx2aaRO?h70Sjcs-WOuW9ce)N7wWQSpT==-l0 z^_76OLTNkT{Y>MRG)P-W6y8r=3NiJvHfuDHevuPf+MmEQ@^G>6a@`m&e_dtB&b^H*9 znqRdh6<_%Ab1V@JuWV)haCot$GVonf456dIHoRW^cZejx8>dY7*vd8GxRc;_|%v04wP)= zJ{I~0)Q!pwBx5KPj!QgEk|H3M;!bG|g+}qV@)*iFKxmcttg3g#vp)i6@pU)}kPRAL z7{BDv;}nn%Z1+HKa9W%{fhTeIqd~EjWYYe*0*j+b1p#t&fWF=oZI*R@809qWGEJf7 z5}~n_4KFn|>V>h`<$UW+j1rY3LeZG3G-Idr>avs(R!%Xq)hZ$)W;; zLO_!)$cCFNV*E>l2o0_XA;B~~^cwr=ER>=8c5!gz<3i6O55Scw2N!Cn200gnqC!nZ7y8cmAU8uQP_Xb@jE`L_Qq2lpKD-qp*GC z+5AVPJtlK5Y~OS%VfpZ`*7DOtz&)!h?0%GAcHF!4d>w&zD<03@th&6@cTePvl%ct3CI-EM&<&H`O!G z@ww}^-!LoeOiA8;Nx$gy*k9hG6RzZ*jM!I`p8nZ_3CfTB5+~qT5x(Wm5iatvnWO}= ze6)E_OLHp+1`>Ur?6CCSu)^-dT^=lOD&nD_|8W(+06=YBjC@bq*wh!y25o_dR$PGSS)I3ZWV0sXxV3-18gQXP5 z4(}7wm_{*0V=la>DYg{}!~>eVR)YSc@IpW`q4pLQZn}T)@(~Q8pcYn)CslMZvDstp z;J-~1AUcR}?1b9#9On;o-~RcHoJ@-uaX-$sbn@{nb}e^3b!a!Cqlk$3_Trskh=tIH z=8tHZ?M4taJpemOhlrlj(NkdckzJJIt(fqCZ?H6?*tKvvH9>ACv$S+VLLn-MV)imY zqIT<^1-4f@l`A3Xlv72#6*LqM6ddIupJiANj?l;u@t%0=En_pO?{t)I;4H#y2X9;~;jVJq9X7UI&dW?0$Sv!yzVXMMMPql|3%lwIdxAchUr?1=c+;%lad~H2#*POy zVMlW#?@hX0)AnZ2=*g}niw4b#c04*(cWG0`qMYtOf=1Hzg!XRv>G~m6U#erTe*eM3 zJLiK2HUxDiww?=pkmfxYZ9dT9sJi{O_k%0*H(akP8f`Qmywf~5ob7r4LDA48_bFWs zd0*Z6XTIvORix_7OCLI_hitB#tJ!fqIi<1xzm8*B=0g$9BOm-+#RNp?2Q?KFgULmr(bxDWb0{KcmVd zIj!$UpRs?QZ0w)yas9)wC)N9{RxcS!@OmxYGMXqK4_(Wcxp--`s)}~bC2A&#a7PFq ztOP>L!}HKkt(ZOqehuY1moh$uFhxvgA$nLMw z^fHU5StZh2WJS+M?@AiwCr9yiGAaSL;YMcb;JM4>5P`>n51y=W%8_ifbVR-#uvDAf zr%~jMX;=hyi~dQ3+A5&Tp^BJsxcG_zp0oKS@)hSs(G0H%)L_E$nGOIfhZ5jFGew%G z!hla?3Ib1Ot<1TmF$N`a3+*)&^KfU@F>soRuU{C4mg)MSj3)Cg8W;v(jU$+0jHoHI z%&bFgc2-fg8|x;&`00N$Gi{?vQ6O2?eInW87H815lz^kY8^0w|x2( zeYc7D3prL@N^UTdK+fi5$IAfwqkxv&jict;lbySJyfMu2 zr%}!r{7@fT;$+A%Qkr#dXT^_>r}JaHHrq1ahDINIwuJUPNh>pfw!EYZJ;cL*D^_OB z=BCCNF3g;g0LnDhc#(}HguEzNb&K;AVqF#jZ6Q-3QZ&+lC=xgT^+2UQXHyJL zA@ZLi5Mqg&OCHHMvKAR5l19(t8Re%Z z`RP05oJS`iz6H(PN!*?lo#8^zOQRWMA`gv>hgR^?2$Oerb!*4DoqRvliwZtRIiWY+jYw>nRRyk@ZH+~%BDF89q1>n~Idq4yX>+qICde_OrgPP< zh+Uy+ITPMJtI$Cy%FfIn`8iTsTe+J;Mr!oj*BZB0bg2689!s-cT58+d^VSc4cH0_U zzxLJRXO}+Ry?*BV%a_}KwCK=+Ep6+)`>Il(&8R7T%vGNuq1sq3_heIuM_ac=bqRUUU0+V z$wMsa2<)PYqtM&4WkJ;oktB){HzKxY@p{oRYsN*c(BpLUo5E*f1bHRyL{fis>w(|x zt5=!w6h)tB$YDR#rP2%;7;#4kYggMFa9b=CLBs9n@Ps~gJh-!fUK>Q%CsQRzCQv1H4N9$9$Z9lZ5#*4Au zB?>F(c&<}K84livp9Fl><12m(08A>}p@Av09nwK;oov43j^R~aDMz9yc-Fa5g4F~! z2l&EHB+qnKM$?aNO3MyOOE37wTcW0tTi7y}#Nk<>DPft*3zsZQ!x#VcmghGg+fTlz zT-kQxw=F;aR;8nOx8vOe7v0MNpG=c3W=?v&Br4F%KgUwbt^C&$k;;mSYz*12vwe7g6*AE#%X zO1K+PS$Z>IuFbkK=^y*`Z>N0w<45o6eX1KhFLlKU7bO8oqPo(kq@fzR2v|CbEiO6% zSK-VaYqX`o^CTtwDI&&oD!CJ6Fh4f7R=8C*QDLbg zAYbr=oTIUrq+pb1{r^J`xr11%gfcm6wkVfJjIFWrBG+&Z=$VG6XUQDrV%v^EWY2XwB{WNg|oJQMOE%`7( zHIq?#Pus`DjEt4J6C8OJnpg9lm8XbymITb7T`Nv8;ekY)JOgvib1+U2G8}P2V+ob( z1tR05;VtOS&{Uu!sH#pDKMgM(JAgf)T|2kLD_dG7+6;zw4dfIJ8a9Vl{JLmc+wD8I zubZd_4LcXA-?bUOobh#j{qXVTfwSJDc~5h4^S7t}`R)1d2lE~Cho`89B2-1*l^yOw z`!Ys{NJkG-&)7gU*&9AKdx%x(JQTxdUdsLfh&)nHxqq?H&>IwEuh7K5%V8V(U zsvXQp2l%di1Gtg?2CQqD(go2Z5M#N5G6YL#9v$93P~URVXvvd?oQzO@z$>Pz#A3kV zaWn~9q4|~C&I#e9)WcRL{hl+?1ptFeGfogYnZ1^das^QrNPc9SU3Sb7?L8mQ=j)l9~ShyO#oZ&K2+yVfb{3TF)z1i#cgdwt+I%NRBEcu-J|h zdX}}&dm^I%ruN@g3=A<>VJqhVHPW)i96^tx2f$a@W_u|olq()}5Ply?ht?o;(AwDk zAzUrIY{BRgoFxUg{t7KyR4!{uHkuj9mSq*T1{L-XtM28df7AVKa(M5a&^_}*|92^D z_2kw5w(7c!v1ip|PtDV3AFY49CgCj)kB4_RR#(RKzTws15;RcQ_4F0PCAaqGsd`e2 zdQIG$>(6yM+jM_m)BWU8$Zsn`#!AyEu^M}@&%|)Y&iP@b9b~x%KCTK5 znlrTR#z%xbmiGBJwY}DS_ot~_)W>`qU)wX>nm%^gs$t;gpq{pjZ(6r)+&5vF(yY$T z_~O;S8qb}K_&a^1ZI5~g7O4F7o-YdI`_^3BbnwN_rsnMfi}-d5&#yT2;BeZGhs`^N z_l)+9UY*|5H{0vp`!zxC$9o$?9MmR}eaS87DhgXYi#oea$)~Mp9xF3fH+e7d%?((( zyZ39GU57VrYc$KhW|n_-#o{lr{?%GnG<+w0uyU}}`_ZAMf67){fAtEYp_UY`R!C9+ zGWd1cE+~Ju=$^J0u?VXh)#OZ-I#D|N*BcS+0t$tZniWwSqLQaV2SrO;U3`|PrvSZ7 zEF+Wz85%llkhzwfVqB**A_*Epr16PED^3C@MbwW`f)fn}KpzSfA(x;Kd7R(=&IHj0 z_ni1;dOl#kQc;>erf=d*lSz5NYdVK3@?h zgE)|QR^e6Ur&f2N=pBKJaw;>ls&-LP!y(bhHoPg|VBx(io9^1M)yIG7HS5_J_9UX{>2b&5iuRz$8?zkREP5ZP zM$H_F^PN@jc+;i@mYyC)Yx7$-7Coz1^?HOn&e&%7!)KLC+YfIw$UA&s(Pz1J)f?8| zn%i|bpm0H9@W|bOT$}oN$30(lYzllkMp}Bu%mUVq4qK*K^m_?~glm&G6C3o34-gq_&w&T$i(@*74^TkA?@tlv%Gn z|P?;o;7+PX?^wEA@XL=*zx(&SAkH?S0P@$A4HlJ4-JXNQl6x@uy})OTNVl z_$#C8U8wvpxv|7LIoSAsvS898KEeWzMXhu(ha4)#G%Zd*Q=*knt{Z5H1RfroX=JdR z0-MIa%tU3vn1?K=T>dFz8v_N>EUZf{FCfss0DvHgi&%d~r9VS7${zpvwSf3xXP5;A7d&@MK3SH2xLZ*y)bcUBmV|##<1yY z0k+&}C7yE3m5AtIwzy4E^CRmbyakPl0rcTGyswDY(ykov=UB~Tq081o@*f}>xF}*N z=}N8>qazuZC~rkR8p;x!S~~J#?CTmaj-`&h!26;D8HUfSw9{1O`jCdn-BV((E0A*p z(6u=tl+jSY?H5fsixns*cjI-P;$vWWx>NnIdZcR4$luL}x_(giURTZdVO{_0UC+L* z*zj|CmE{_nAl1kuRsWu@$S0{q-4TUNao+Xjm3y}>=x}U3NkL%qklJdr>^$BH zwU=(Ts``f`@3xN(tX|`un?JItpxtcA!^i1kPcugA0wb1Re`Z2)>@BOX6U&SGHZ3Ng zPaRvoXY|hNxvxE_I$qFu+~MKfYxDYYf__dP+vh#DtJ8VU!Y%F1qh%Q**Ba;Nmp>{h zNmz7x=ik3AjQ{H53oGmnd|n(H5%Flo)ZxT}nC`?A=MDs2b=l}&pVzTv&)B}Ah@lT_ zs?S7(gkPGc{;JD;tk!*WDBYpA;e7Lw!Hw>bF&<$zjvRI9G*63s)ELqn@+13AeY$WN-XVt+?yDb73wP5xysKVibNh@aa($ym#%+!P#owvN)M zToUO7f=tyA!A!p0PWDi7D_mNTLz4|5<5jrAJ3ST~qzXdKL0zLAB#oAA1HVpx)&THhCwr8zTBPx}WVoZ9Z(A(S2&qSY7(i-bLp96@$+lhqI3kyxDxG*SqV8 zdydb`zbu`<_+HT1lkuv5{6Fcr9@Kla>q%Nh#6z3N?xU)+aJZj*i~!T6bB$r#yT| z=!24iUHxloi#i{V7A&v#`B{fPEEFR~Ej#yqH7(K7ZQ@!BJ;}^AarN!5*K|yMKj(1$ zP_`kfCt@>{~n0u=oNuFhcl}?YgV%WoF>% z9Pu32UjOnP9f!Y=k>EnldS7k$E<9|6vuIP$=u)nPoP~Fr!R*iAh_yF$mPm_r(=wuS zl2E02v}Wjv*5XPMSV;ueqgJ+DF{Rkl&0bgH<(V608DGXLg6!p0?s@K>GM1sUZW@(? z8Azmv?1s6_31r|k;tveYl&~gLqfOKhsjKjBtS1n}QpZ%Eo-cePNdN={o@_wgD+N1p zWzs}1i$~08WJ=MwJYL5bu>}Yni9&oQh^?0jq!#rwV8Dnj0tNOjQkl4JsN)S~zmv3# z_txFK<5o1X*l|c-<>g*5FstF~mbC2LvA&Fvp_t7J20Jsl6PNyU^uIUuSkR`S)R;YURSo^j)gS~lhP9HS5M(W56VgY}(ng>)SDYJJnY?U%Sx zldhlzVb7L3b}v$W_3S`GZvM$fd%6<8+<3rp(zHvTWd8BG+%_lhz;D|+rh7lUV*c@} zKv`F@V@`qu^DGtkv8;?jpl6J*78f7Pi;Zhv9W(*7Nuovd0hLz zz6nXy=zR~>;k>?=z55d~A})EH3EQ+|xJ%s>)Nr=<-Jt$k8F^d3>1%lGV_10anfus4 z^JwRxij!gLN9V3|9LsR~KR;i=&2rntujhD;hPkj!3dFF<^AVqg#NccSsSlFqy#)2a z^B|g%;bcXbFzMDaMPNgfI$o%Jgh4U-JhD~_fT$v3pk~m;Z7K=x6;G)V!j=UB*<=J1 z6JHg>ZS68$PTi6E`!;d)ibP9cgA%N!UcG8c_fQ?%=ei-2)9U&&FK!&VwUgQLxb zj#6^>s8caXVgDD2E|z$>WH211N3J`kr4W3T5GX zLIfbP5q*;&p;c_m1f|hGGHZdf305v$W`?~~OyO{r(`2>zUy-qdW0H}~l;0*8>lFW_ z3;Gt~ppZK;@M#>kY00Qw`Bb<`ve3dBD3Gv%@$j?J`8u)S+s3@K(c?wWc4hSK4eEQb z>sh#}XJ>Qo3P*Lj)vpfs%e-1wHU0C`=DN=hUTzC0jA(Bjd6K)MBE9)o@(ynIy5#Wt z-G{Dtgdfg5+x>y#YX7l;TQT;kfxfI44?OJta8KktvkfzDEA76D4yz7*FlBtMIxxKP zp6%}yJiBmpMh6I=nWS$`w?Q$; z;VNPppcFSQr-BaqJXjOS^LoXS=7r_2z3ir3E){tynT}Zj;xq>Py~_ zoAUw=S1x$%V14_*n@3k~D}BxV>^GZcnZ=#`?c~4T&F#N&^u&;3#Kn~B*&hZM>l$!R z5y5RoMu~Mvj%d4H;b6ETi7FhC;s*CYulFRZK{BNfrG1W_btilKCdE z4bCanK9UaDsZ5=e9No6^3on-o`J13<1g$7Eqwv?PR2VKCqKu4<(Ljn6N$KAhRcN=2 zveZ#@uY{F^HO;Q$Mi3LK2%}G=rO1_{GzSw;2P-o{IS9)D`U#;R@wJ8dXKz!GNy3$Z zbDi8PIOkA%>~OxgfvY#5Yb%yV$AUn_&$YpbYQfAqlm9j2EF}^k+PP%E1Uy4~qK=$A zIvJoc*uB8qa0lUgauolTNGDO&OOrnj>#L3&+*NcZLZxmxbFa7gaYEC`%k8RutD^o! z$Nn2#BW>mz)El}6KHF3G*yY#Dub*pL_nxhf#qZhU9`v4j@WHIsLDfJ{MRUZ);jEzH zzKos&jm^Vp%>`fmc)dKpe|RW4{DSW;|B=yk{f9#DZz>$5v%0kU!j7We<*I?@xxI#w z1@m|Gp6Tx|db(@upMTyD;;=uN^6iS&GyCQ33$7V|5z*eYqr9NB<;JR-L$#0Z>Ab%8 ze9pY=XW92Y9PLXUd(xe3Kb89I;qMI{3;y{u|NDn?Z@%kYtFENP`cBJl6-(|u>+3xG zz}bcvx(T_f+JhE5Y#VBObh7c`*u&R%%`dt!ed^bZ8&a;CH}?E@QD@`g!Ov{^K0w{E z+_7g<0eSJ5I1UBE0yNt*#HBQxe;l>>{6Eb(yI|r-+l5HW{9C4K?u- z5EGWRjI>;*4B6%UjXAO^P3u;?5yptQ!mG`^?TdR%$%G*oQI^4R=+rdhqd4|}z@Rmy z_`q0e3tzI`c(SX@2-WklWi*_fmipWb0}jqNqd^q_@Nv`-I4754q|Dj8M73C+wS|6G z6EU040M6mdxwk>g@OGx+>XAgqbrPCdW)ifO&+m4`i=1wf9^V!xCIli14>{n+++~PJ z4J~v)_4uWen1~E34~$PL!=4ZYlMsyHk#iPNIjmm_+7Cay;&Re-ia~mD(=!)g(52{8 zsqHF9an4uuDOd=CBBUV3SPPdEwJn4Q!XyWhhs}oW2Ej9;NfJUWE)LKPL`#{Zb%5Wb ztvXdKP~@;VtOTGUycnXsfrdfonY5VL8M^)_JyU}=KlVOHFUUVOA=}JV?Pm{rZVtQu z$zO5pU86D0WBYccg_Uixf9j?hN_HI5c6^$xI@fQUG1%5Mlor(6GCyej{u8b99sGO; zLsSFf-3u4xo>X0oIobH?93ZfwvE`}<$Byi=NRD{4c9*B#Pp_Pge-zwaertbe((gwe z{k7%Fio((Qg6jIlk>!q0&+I?AU~6SwL9=I|_qo=Fd1+5eRa@R!yf}5MOb_a2jnZh1 zZgDL?N*&h)vCg_E6LR(*`u@p+lhw^N4L_YY)cw!nza0F658ryv>{lDl`CjH>3*vo0 zJMd)a!gTY^v2#Z5#Tm~r%E>vCIYEH@Z?ug|k`kj{Aag?oBa1`E z$srX;&W*{ItqP^AaJ-7dG$H;EeIHrz^Km4aw?^NmM@vxb(sVckMhi|{9fhwLiqrP- z<}w~jFcgSH(TLk?#RkHZ8<4*wrUKMD2}X9+yUsh1TL~oWvftTGSqv^I?D!JzIy&+; zyXf<6J4NObb+@r|G20lqMxA$H2a6032-6W^}96sqQ+ z+?U=zFSqcSXa3mH!k!i0d3TPj|J>HJb>;t_<~XWvnh&HDZMOMvbJ*S4M@{D0*1lI6 z{z~w}xHn&2_tnCl{Xy!lgPzLw6m;dP`tn8x8Wx8X10sx;W*bZwE-VH>|`o=@6j{&*c zMwB5?i6iz~m|$mtTf;d^_SKO8C~$>c=yM}L=qng7P{N9WPX2Q44kgJVgb9gb*A5{) z*#yagO0l=m;zdLIrVUt(Cc*+`EwL1Y2MT*N5__N)>Z^nZw%V_FnL`}R-bxn?jP*&D zYzX|wr^=%fEiH=W0Zv*@(zKVHv~x0c^yEhNn=IPa9I~T&&#i<>8Kbw%yZ2`d*ZQs> z>{sKRGdy9?9ksd z`S0`ptzFVf34EWGqxx-c^#sQ-@BZI+rKfc?Z>e{WY@a_;*Sf9CA-5@PAkML`ydwbr z1*n&S(#cd?N!FFIsU@OWCIM`Mr%L+558OK4oEN%nYt4xh6HZ_CFuB@x?$(Dj&yEL& zj126#?^UrP-$gZY;g7x}-uIuKj@xAa?BMGv3oVzKbuzw4R-;`M?5VdX-+HCf^Fk@hNXfe5xkdDV7BF2iGdUvAfZAl zA_RK~-9>#FtQvHyB9nyMSXrVof78q!tvb1Fxh^@ctH=soVxSf6Wd9yvx+{rCVG0%= z$n!Z8)xSvfiYGr$+F=(hE@$8CImpVTET&3)1po~O>jdKNBdK3x2i*%> zjZ=nK%G9E`7D0k7$xB!nYZcv27~^eqW3AKNkU(70mGQOfW;#dB#kYwFQ)B<(+anf) z#8Ye-;Fr{w3T~5SLD;300V3iq(b7*F(%s3yob^){m|OCCTDnan6W)o*AVWbqo0+guv3S5wyMP8)G%Ayjn z?x{e@`G0ge2@?s)cyKkXU_w4K$mt2!e7Y^qz!YzRDz#h`3j@r=qgG&;zq9 z4&W$D^16^W*xMwA%|t=QMn;cyG}9<{N4w`!Fe{=a#9=1-HO3L(T=X2V!ucZ$=qVBN z>lBio*Uog}IK|j1Eb0M556fPrVH1g2a?-^fEKCMQQMT+B2CNnmytl}BYI%WNxCt(# zv`)#)LgkNnSB92W*c2otrS1_RKG(GygxXA0&8&d-A=3!}S>)4{qQ}7R4nV?nF&hjB zg7j>RRpLS1>eap1Y~?3s@0~XcA2{s&cw=7o0Tb25$44@DJUQMRQ5r`XUeN7V zDzf$uwzb`Y6%2VgWaeVC^>I}~#>i!x9sgH#rFGBtl;j;crvkN2wg2y5Z|+J~F_7-e zJK9>aO})D&w4%D`!IS+J2b=0ckA$cXjPF_-aecO->f*60y@$Oz0yh|XA96SwT#9c0 zJI}TcH|$2M9wWs%6LM%p>WwZ(gRX&YqJiS4&%cY@@_4=1VXxueU#py|&yPD?H!dY3Zb8;boNKpAD!R6HDE7&x}}HdAfkCa8!(&SELqUt8tQe zVgyvTn>-&kMD%cl)6&fK4U)pVMAV;g&U!v^R!b0vePMHwApRuZXy^Sp#sJX5LFB2G ziEvpVSx*(&6IvGfnUHi!NpnIATd&~l5PtDP3u;5MCxs!#kD&-NFiOjK z8HAsFO57}KCoX5mkC^jH>EC0<^(b}r1tQAE@J?<1@twx&L}i7_bhx{s_+}wCoIrL6mJ$FB54(;Qpah^R~6et);`{DRSlg8oOBa@F@T zwySg1N4!S1E*TBPhyV>j7WP-f+|R{7WgL*E0IfrT71*CgQ@1f(yG7 zlCBz;m`Z+n%8t4(3pRh4*9MaJq1FB+4teuer#!tfzv$W3w|{Vayme~c*_SVDP<5S9 z4fi;X?t?N9`SUR{B1?DW zmze!{ra!M}Xn9wC{=FkpxA-pHb}D`ISc>^j)}lT8kEH#d!pxEbim*>#3s0rbbT37W zlafqSnJ%O;o;8BPv!_59$QWK-lyml>UloBuWK|0%j_`$%EgUwvr^`YQtQY^hHS?z_ zp>?9I4k-hgGlJ9!2mGA#TLkeiMT%TQbAG>&!g4e#nI?IRshZFrf4EIZj>3LLj*hh@ zJqD(>#+pPcCd}%xWiDFv4ko+XIZFi-7>3_;CSnRrV2B%Ey~a{#|6Uo*v5;gyU`6rYK(%q9BL0Y!ciYf<%WH$o zQV9TwwTml;ukdqXvW4pISMDE*#t=E76W|?l6H+HW2f+9A30$cVLkvzj#&V~NYk=}a zxanl8&D+m<6ikfTRoI{B@KWaDgw0dm?k)3rI>T#a$=%%*O;7%*@C#pjXa3rpg*)J-r{{bVL>-o86IvTDUwOT)WA%jkbA z!^h0`?-$*$=o$lAojPw?rLQ1EMd9S?W2BgUGH+vKM}n!XJ+__FmfofhjEyt9Gm~py zQUp*>cXUI=>cK3M#eT3WHBBV^D+a5e;!_b!N-SGyEDAsx&&jUF8)O-P&&v#*s@Pdj zXie!}DH856u5j7vX)C7yeKKO|l#|v6YKr(&(pDN#ie9||Lc+oiQLA}dq@5fIAlZvd zvcSNYz1h{GvJz1@M->x|^ByS*P;eL}gLews0aZCK=xNJ~75KwiA@r8niVI>9a*E2FDQ%!G50iH?A1oz-B0tBOFgr)MZigs}k1jN6_r2%t?MOqGv=ExJyZD5uH z5ojmbU!-1u9o9)JCV}7P43%9%@0kl*Eja8AYSZCs47*84j9$6);JSvs6-7^mhm&9I>#tcjb@8Z2n7!GzE@GTmw$awl?M*rt~8XOj=y6UW! zj5ZxTv?%0ByDB^Tc#2@?wy7~!%*2}-aEoWDre=N_syB( z)!;b%LP6N z?`|q;suaDJ_0Mcy`g!-Ux{bD`(CdVn#nRFg%L7QjAtNZRDP~3ykJsRS(GKgn#2HCM zDGU*S6d5NA8EzfoFjqb&w)*$cHPD0NVfa%RF`O9^zJ9;w{ZKL&v{fL&=pd7_<^ni~ z^s3sND{5j6M9WvpxV8P83LU3XzQ>*$q@}ON!_i z6GOUiE-+pb6}37?)GO(ELYxz@kNZR%%~OTB%g1**#i&Hypac}zCE&zlPvqc00{cLU z#Sb$;#>8kVxg^O_{Xe{&m@^S^KD-d&N-dx29C@kE>9$=|LSVF|_1%?kzhFR4vrGYc zcb)*9Xyzr3_ME`Z8oR)l*tbcXvy4U{a!TeKkhYH*H0Me%I{+s3z+$3>w2CJy%mOk| zusTH*D*}p*6*8BLMD_^O$8NGA!4al0iCLO*0iGC|!=!E}W4QkI4Mq}+v1by3Enom6 zdo4e0!HJooVsxV1Jj^-3l6YiGq}V^?72RgXa-caWWI8UbMa2Ybz2dB^-yV6O0$QJxAi!G1X^0 zSi3>A#poGe;&PRKqSw~Rm^GxrAsOGJ-jnzLu_V<-D9TB)=ztIDcdZgn~?A}_UO@yMa($FrNB ztS@gKz2&HmMu;^#sDEles;rd#TK@MF??U;E=d*7;{kXY5H<`O1 zwc7lMj$M3lH?FHXH+Fnc(6Gp1$CbWqs;`>&rGM4e(Daw;&V#MB+r`9~Quo*9)-P_P z*!`?ydl3a`=v1x|qpu$ z=iVAIx~;&e5kqHF*hCUKc&SA5jAX)$PZ@a;4}U9Dm|GL50|@CCc#jF?m582aE7KNH<}f zh~LW!hf?5WW>02TBn`L_>^yX*)Qddi3vriC#h4iR|Gxoyf+uW7vyK%s6du2Z?us)JO=rXRSA8|BP4*e|o5l2WN-N)5S^a7r$LSzJiAnxxi6khr?O?r z%)gn55M64;SlYVs7b{7~QAV#%BuB4KDfu{&xUL6C)9qj#eZJgg$H)D$x+DeUufQLxNi7is2 zW3e}LoI8_@>LQmYotft23kpF7I;pq;W=187_?;j*#c=97r?<4@wMFoOgnmRgVd(~oJJ zGzGGDL=Mz+G9ZwN2;U8Ye%tC@JcqJ?IDbr(z(IayI0LMSE!Lt^oTRD*oumo1Idp8z z6{+x++60LKw5$XfL3)KR!P?fvSb_6A&N)i#vT>Z0N(2Wz4FUMP`~}pxX03$6qHW6PAF!+c#rhHxREu?(i(jP<=RPD5ri- z)5y=}LlcAgzn*`!GrZx~RQ0{quTzu8y(^PFY979quKuMtwB>kyU0zY^rX>MhI`*bj z>r4Lk^2^7nCVR$x@cr6%FaDxfcj5ZzGY>I8-WkdbJ(O_WF#JZG<5PrC4;)9bRnImD zJ^L;REHxYRSEdvA+8k zHesMHx^>*)Y1PR6H@$mao|;`{<{ta^JFX?QufL4SM))p&3H2fq9N*er7 zD28assN!S68kDW;L@x$ZGyg2g2^kx5d!P+#{v|02Kv~F!D}g9jBFQiEfn=nqtAVH8 zzQ<|*ToF2ED9Gia^fM(InWpIdLXnz7&6il%#6Q#2rDA_?uh8Us5UZ|DxQLK-;xO#C z*20hFLXU=U`iY8FF-VEVR1H{2if$5yCtp(i_63LlZ_#Fqcxu8LE!+kQbQ^8-Hv(Y- z^i7W5%Y$^b1T=p#UG8)UFoOdA3D<#0`eop!WNo)U)QkwOxybg)!sH7K>l7v2u-Ur4 zRWEbOBdCO_;s+pzP-2ErGm@cg8zrNF5 zby|#!5<*rGTg(B1z=Cz+%jii&e}&M``Zof z$b)srzap~DWyTxvn`du&y=@%fI8~hL{EVEUBrfeF3Mt4}AOwW1OA;TMJOF>}WQz;I zd!;FvvUugYxtG>WNQ>M1(hP?mTHn}uTESn9QXx_B(dAJ(rm>_Jeo9OdX?++*0;{yY zt9)nE>l2gEXRRrbi$I$3w#icnlMwZ3kg?=F>Y##apQ(?wIa3s8^8?|1r8w<{DL5`< zm?=-%5-qkLn8TXifrCOMgyY^M6NkN=gBV@J6tYwO=W$nQ#q0%q6v6pU#Pkv*t|K*^8E@P=o3q2Ho-83Cn@@Bu@$?%mB zi;71$K=)7ywnm_d;0GcxAEg?YHII}ioP<>r>U{7=4D`&~ZG(7sIfPg*ICW6-GA(EM(5(u znO*%ab`9J%bX;us%KQ0V6W(vRYBhS#Wc&HABjzps?xTCkZO`KU4?3>d{Q5^0IT;Ht zg?5^#hJwt!S1%cOEhzlh^0bj7MI)_Ui;m}wc6RsgUtW04ck^3k-%KrEasBRhn+uv8 z=f9Iuoov#%pJ?|7QF`k9+tan^z~WHfyl=A2GMX2L zmfJu?I)?cVAM)<`c30Y$MPtFuJ!+NroY9-hVAnQ<$EAg-Cp_x2 zKTY0c;?Nwf&fOmO;P1umF!Br5BxL_?VL?huPwkbV00BfshH5cbxa@CZ?hukY0h;H3rli)?TrmBquI=f#?sRH zHC0wWS0b{ko7K^-fLc8ZFH3NuuuP594K^aDB<9pWgbgZWv{cP<{VM0Pl222{)1 zE5MwHIRwslx$Om+X>2jP6$f-J0F@>f6&zF4RcX1IN-6%-`{EFtJ!c;%<_psiwsBD? zpk-{ixDD)$;f^__LE2yh&||%TX(@Y(9-b&Oei~8E_OwxH>0660%m!?LK0yK2!q`TI zvf43)A&57UH9)3Te z!ryb=su^~_9h~Ffd$!7Ribu}Q^ryo`-P4N(`hC4OkF_=r-LSI$;pO#tJwaoSTkae= zd|TbSC$i&dw@uH}jQ-n(3qv1zkG6Goytw6_5S{mS zMUM4#4V~*6xfvLE^`lisXMTIL>1=lOnUKiR!&A4Hb_eG!zE>@x@|J`YdUvYt_m9@5 z2R-=0y}c`

PU*dPCi?fA&2G34=*p|w=ep*N;D`;z4%9cBdrzMk{ezC>^A6x2vz>g&Ojuz zi&ZiLH;B_9yUv6N1vdcFC`u(=hu0P+HBUfy4AohVWS)qH+%gWvfQtTSlSk&mcS#we z>mP>BB4ysd-AU6gNS226F#tM9yCs%8jq|e=X$QcNot~RQa?d&uB#<^bcQ0}ZImKwW z;8a+#OshapI6O|M3(=&Q5F%8jt9cvgup8%4RC}V-GsGL&L@Nc3q#*yI6(Ii>kZW=#25iVnJGf~Z=1_`It zk$kgVmcmOLRkTloT8_)A@PsgKVPq_jl)9!2HhXVxgVKixL?hSVlgP3&AOO_8b4tWf zE05EaO9$S^9pF#N*e$lONG}m5d{E-Ry-j8ZIveA>JtRq}3Od&`wVxKtD(nnU^8)C3 z^hpF*Zzl{aPf#*_+@>1Pe1%b!tb_Cjoj?)TjliM^uChI~%z<**iM)+Gf-)=gRB{^E zVkYNQcW0NzJLKYVGTF$(CzT!$f(C_|6@l9%N67)NK-4ML$k6ZY&C6N3J6w@O1$OM^ zo#euioy6Bevvp#|as(TCOv z#S#T zu4dK7N~ZyKCa7nzJIFAFNS9VZNs(yQ=m=DjCKRJb;>7{A(kqh84Y}(^Eu9({-=1{= zA@IpMnJMBwhRe8OWaW%y_=z5KxI`olYVWLu%cACsH z7akK!a?QBqLOOtqWf=tz%Nkc5QI?ReV;VaC|XaSD}I2$U=X8;&AD`e&Ymycjc za~V&H-7Wo$l;Svs@I_Hff(r)0A10*ShEH{DY~ zSHVx8%PN>V%`0hO=(!IHlFR8b5_^>;2lLk)Gb_@@jWF<;x3Xyo|s)Obj| zN!Al5GHoNUMi-nDU@LY3nCq6!Z4Db?(4Vnq$c%uuw8-OTod8ZSQVBbP_QTKFGa!tM zC^s0F;om}Yts_VGW;`BwK(_Jz~>LC|a zHBql7fPF?Z94V5oF!1g;=fq@!=?5L_?xmMh78fb@b>KO6_BHL2nqdAHJAW!^7W7Od z1xktn-vAXY;%(SvL^y;*>;^>V2BP+kY#fbBELKPsb$*x`Fb{prI_yVi6+;X~!S{3V zOOwGhCMf_aj&Kh4nsb|yoOwA~etGzES#rjp;B)EodPXOuft*+k9A6H_%msH3jhl7x z`A#iPNC0RlNQ1b%+9v|8$z^)+f!;zGYsf)UV7nz&;4MN3-F&^%jn0uqoi-uGcg4n3 zFTTX49T-6rOtVfS#OQM^g{jBWSo7t|(N>K$+vjP2#R^sEwqd;=Anh!}` zFJq~oX!|LV*v@?SY%6vdEUY9ZB2A}gKcZcY9?p9P(6I5=A0fTCgk;<6Qm3enDC8bN zV}o6YPo`ZNojfOg-yBYKBo?YDJv30ikP&$zq{Gz%W!&DvM-hlZ)b|jN;NU7I+^6xC3@&hCuZPGQ{8kL2k&K!dVKy-d^&r-4c+{zY8 zvOO%F;q6uVF`NRF8C=)s%%zN?m2flFCIts6X!5d`iWs@VK*3@06sekkR;Z9zRG0@Q zm*Jj|3}sXdEBLcO(g}mBB#5`_u=MS$SOY7@nDVQ+CEEkE2*+NYG;}hRBb&RS2BkTV z7<%_XgAaAcNu*UDHi!|q$%&*2f#6p6b;+DX%7PuZ=f+3T9>Z*lnAt`9ML(wqiiCT0 zxb+M+Az?)VBakv#ln^zzJu5nC^ch4CEAF8Axlt&Iljh(+GMu{UO1@ zvH#<$g3!sTNblBdjI#NC!ZF3Dv$%u%G@-+of(vbxD{XadU~BET9s5A%EIKituA;}< zY7{Ra`R7&`grq*IU5!%^Wgl0~9xsAs78qF~Ijdmp!7=n(-HF_vtDX5?sUw&GZaqW- z9!m|k3bYd?`lt(~Q1f;EZ&97>UYJ$n3N4lNgFH0bD8)H4IsU6F#K*0-w^y&b((yTcp;tXgKD>G*rm!%k{ z#gnXY;7rfubz+CX1TOqbJ+&Rs3a+An{0L1V^iQY>Hse(O7?Ka*kP&6!8}RPUbQf?k z6o$jLN1y%8r#2q6*f{F^ysc#b>W%gH@SZt=9Nhk>VjVW8#-h^Vc}(UND&8vUKH|^P zx`LQQO@`}uAcqHV4kTf~ym%}B0a+HW4jQ9I$Z>ykgu;`va6Sf#BW*eG)p8VWco8@$ zDWfM74NRhx$+=4>3`!$Q6l9UJsHdc3!DVBY2dt3<;U`D_ zMJ4TKCHq$GU4QPvV^X^lR_xiYQf}wZNaqS|zgraFju#8-jB0y>JESC#6KYV?S$(#f# z7Gxo-f}3&J#woj%H%j+!DJjL_aa&>4 zWUWi<&Y^_4)xWYZ;t`tqr=DgIo%K!nqif%SuU< zXCPgwLV5b&Urxn)nWVr7pfJ&5SxzHfil-;h=vJzCS({z$OTbGs%bb0oJX-M zjA1=OQD?Looz_w+TtTc?nF5o`3YmwOLsF*NA$5Gwyl5FRag>a7?A9b4yrm8A{ko$Q zCQD}?^~V}eJa5oJL!h;(9E1=7&4A>b3K7vC&%DS%aRpW=@GT097&UQCpv)tRLzRoA z30jMoY>fRHh`stnB^pKU0Fl4!qPPP-L8r|_WN7wwia;X?Ow4dMpg9w^uU104b@7yL zLhl2~Y(b+7$;u4Lv&4%#`}gygIXA2%+{pdT9l|{(@-(f~ci}OM=SXsT3%#FWHvryP z5(6g-(yQ9o8uHt3FU2~*7--Y&N~<~waIM4*^3dC_Jh|h=!Iuh02JNAD_Hfc~%{2fN z@-9IeV{o}$pc<^ocw;gO+|kX^&nG}5xe`F51A#f479T2Ry2#q|SWrk1N{Qk~_!@r+|faj^JN7Vpxd+1;?< zC|<<9tNbXYR+o{?KoZejK%Yymu8$TN?MBRbDx!zRasv8{6lgZq1I^#=Y=8eee_gOT zVZE7Iz6l;sU~;;ATLw)?(w=5b=G7J=mr5Vwa1p#uFCKs}*yphS|!^nVKDMfb&M zH#3p6WL;1KGOya2$F&91MZdU0+GQ|u+G%!*&k`z0aA4>eABrBC4EEdWu3nPgEF)-U zpE@Pd9W(3Z<;pRS_1sR_h1eIUW{cv!ox>z|lSa?p!JVMCiNA!Ot?= zq}3_^kc%hlNsnydDCIcp)Joh;msn{|`OVa?$Xu$$xkE-{lnDh54SIryL4l>GOu&OL z`Z>WE_1*OA&wev{e09o6W$Eyt4M2esZ={6`P^ejK26VAo;0?{3W`y_nIfMM8(E&sZ zJcO4wVOX&=paJ{K>gm*wt^m2~+0z_9gP?0(V>f3YH$76e9E2NOqX|Bdh(dr;L^IE_) zJ|oG-?aiNnWXx=;3}7cEl?QIEr9mHu35femS{1Hqe2X0D@KAKFPKb04a9AcjdjuQS zWc1JgBVss(AWd4$w*h)paC>eQ-s&8v9;b?;EP^)ArE9PvYUS&NeJFWE{bEKqSH(pi zFa}_tkgG{d2>kQ!K6qtY-lgD&UwW8}PB|&=nw_Nrg{1_oO5}p&;UrwybFPx1Jbo%O zfU7hRmTr@s4xFNE@F0-b7 z@~9X+bDXyxx>9U60o_TP36N?~s581vtWEigdMijN3S}t+m-_f7RW$@c;f=ktPddBK zy}*Hr#v$XOH_iqq&tMw4yjB`a^b-C;X>s{g^y@1~sOAnAOML;*4>wYbH*pUlIMGi9 z%9R4r)o{<@;p3blF4O`NY(Nr^N`jAr6__*`LcxmbIIK6U(EQd;C|*yEY#;&rK!?~B zVBI=M#1e+elC4jBPr<}34V?jchb3jg4OqYlGyzfqqbS;#88PgU0dSL_B^+%5Ivo_} zjk5sMfbj>>Kl6$1EioeYCIU#l7H5IvUFnraE7+#=2q1~Gcn7yrtK(DUplEuY-$6&8 zXyA3k5Teg7VTh!c>4aHS3jsNl0nhowKoSfYK-NH<2Y_feuiY3D3tJ^698bIXQIVuU zx5T;_*oVP3sLq!ELWv6oo!-dk6F>F8R-HKi$u-}5Hs%ECh(dF&tm(9 z>@J??hv<^gZ;T!jBoQwTPv$VgrN9oVrqSaOAj+-UhqD-v6yV`&x&A=d zX702BNh~XjRu=_Cm|7>R?wWuxIDw<27Rb<6zCxp2JB)z^Fo%^05kba)TJREFM$3BG z#<;Q#e&OTo6OF#Mu zN~UHe;5$S^0Q>|c$FSM}6x?o@RPGlUTU-ygg(o#TFUajDfOZzW$n7wQ*uk*+UGaDs zg6nJwI{aM-Ymm;A;!HZN4)`JwP9O&mpY{ zF=P*ki-c5y0>v>fa>K%F5dy<=V+ngf8GPK>2sSLtn#zp=doO#LI+AkV<436o8G(lwRvAyaeV_ft-i67cY zNu{$1Qm5hxB~_emN$TXJ$1jGiEWLtLV}(AMY9LvWvq-k})R_m-?*hKE`$d<^F4j8) z7%d$pi1CjatM{>XTW3P46eMWO?_M>6l?CUAQw zJO?sTPRCl5y}$xe!7wv|nVoU2g^Q|Vq}HMsU0=H{ACP!i!ov{@d`WNcD9Lu{>~;kE z#b88SqGQxz@ZSNr8f&u1iPF}NZU9+`BGFefyXnpoL_c9;oG0;r3L#T~$$&#-{iss# zL;5;#^I%Tk8pZD3-ZI3BwiLG=+u5rEE{f$HyD1IM4Qb)hSVH5!(;i^X*fY>IQZs6| z0#8p*V@hx!+j~UADAwjVHubMRxb3zVhlb`0Msk=`<(DMqPm6~eXv0h#HikCFEi+4~ zX(6q+G&hYCa7njdEgeW&aGpkAiD8q0b4e|Z0;2G0xbu=*y2Wu4$u8wRz&AT0SrZ_! z5KrTuvOs7m9-Ao@_!gakx1c;dzPqI6(%t5aSGXNlFfb7VB`@=8S_@@88d&#ymyfd42?fH4J7L zfe?&_nOTOB1klj8*w%IHu1@{NN8m;4LP6P?g=3T?IuTGH79n^nF~87jf~Y$Oc?)LA zGGLgB1QjV>h0v(C8(;Ul_{Ptk`t+;E-@RIU3Swk45+k|+=q8Z`v5#hIPOZ@pPEk=e z;?81Gi^Eip^BNv;97vf>{`sr{8Nr;1u4J%G?vdyrjzggt8GHwfQW2uvS=ou^C(XVi zTIWDP4S+1)8SGS<0zRSrZk78@?irRSqc)sPoPMY|8J?_WnQauT+T3RA26d|pkau9v zK1JQpndNi<|0;@3+J`{;Miw<- zLjc%86oKim5!;LIT2OxmMgTF187aiMiq`a$?anP_yZ7&Z;k(}rhQ9l(rT=!LbQHoA zL=R!QJ3k}*CU_gVX~DJR7RKGK6d3|=1yvd^Qe)Y0wt0w3Z~@g(tc&9jGa4n--_j?x z9G#fV3D;W~DhiXaY=ue z)(0T?1ZT~;0%PBc>Z)%~MLF}lB5mHe3;rI=1|Wu-mBD2GY#)DV K{5qRHhjABvQ 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

_W8_d+MN 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 z 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 y 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

K|IC>f7 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 F_rNZfoD=4EdfGGxvD5iQMR*Z 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%0A(@$BC`Ojeus0Su9KPXz`-~qOjSb^(L8D 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