From 877ff15823ba92ca3f2b25b8b2a3d5155e1aef9c Mon Sep 17 00:00:00 2001 From: AskaEth Date: Sun, 13 Sep 2026 15:20:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(0.5.1):=20=E4=B8=9A=E5=8A=A1=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=AE=A1=E6=9F=A5=209=20=E6=9D=A1=20P0=20=E5=85=A8?= =?UTF-8?q?=E4=BF=AE=20+=20=E8=87=AA=E7=BB=98=E5=AE=89=E8=A3=85=E5=99=A8?= =?UTF-8?q?=20+=20=E7=8E=B0=E5=9C=BA=E5=8F=8D=E9=A6=88=E5=9B=9B=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 算分正确性(6 份只读审查 → 收敛成 5 个病根,均先复现失败再修) - 「人工名次」与「自动名次回写」互斥:原来同一份成绩**发布两次分数不同** (团体报名项 dual 通道 10/8/6 → 25/18/14),现在连发多次逐字节一致 - 删小项时在同一事务作废旧流水并推榜:原来分数**永久残留**在总榜、任何重算都打不到 - 规则包导入整体事务化:原来中途失败会清空名次表且补不回(奖牌全丢); 另加守卫「compare=none 的小项不得配 basis=result/aggregate」 - 末位归零只抹真正落在末位的那一档:原来跨末位的并列组会被整组抹 0 (7 人三人并列第 5 时第 5、6 名的分也一起没了) - 模板「分值表档位超出录取名次」现在拒绝保存:原来静默截断成 0 分 ## 现场反馈(主人实测报的) - 已发布成绩可改:行内「修改本条」+ 成绩格/状态格可点(退回草稿→改→重新发布本组), 与「作废」语义分开;取消路径不产生任何副作用 - 单位积分明细补「运动员 / 来源」列,并显示「已修订 ×N(时间·原因)」: 管理端、大屏覆盖层、xlsx 备注列三处同源 - 单位奖牌榜改为按奖牌独立排名(金→银→铜→单位编码),与积分榜解耦 - 历史孤儿积分流水清理(迁移 0022,只动 result/record_bonus,人工调整分不受影响) ## 新功能 - 团体项目聚合口径二选一:平均(默认)/ 总和(迁移 0023,通道编辑器可切) ## 安装器 - 自绘五页安装界面:无边框、自绘标题栏、DPI 自适应(4K@200% 实测)、 安装/卸载逻辑复用 electron-builder 宏不变;默认「为所有用户安装」并自动放行防火墙 19540 - 构建期校验:安装器素材里的版本号必须与 VERSION 一致,否则构建失败 自检:服务端 14 包 ×2 / 前端 vue-tsc + build + 742 例 ×2 / Console 20 文件 + 68 例 ×2,全绿。 端到端对拍:修前 vs 修后,纯团体 / 双计 / 普通个人三形态**逐字节一致**,仅出 bug 的双通道形态按要求改变。 --- VERSION | 2 +- console/installer/art-gen/gen_art.py | 597 +++++++ console/installer/art/1x/base.bmp | Bin 0 -> 1094454 bytes console/installer/art/1x/brand.bmp | Bin 0 -> 316854 bytes console/installer/art/1x/btn-back-hover.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/btn-back-normal.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/btn-back-pressed.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/btn-browse-hover.bmp | Bin 0 -> 9846 bytes .../installer/art/1x/btn-browse-normal.bmp | Bin 0 -> 9846 bytes .../installer/art/1x/btn-browse-pressed.bmp | Bin 0 -> 9846 bytes console/installer/art/1x/btn-cancel-hover.bmp | Bin 0 -> 11718 bytes .../installer/art/1x/btn-cancel-normal.bmp | Bin 0 -> 11718 bytes .../installer/art/1x/btn-cancel-pressed.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/btn-finish-hover.bmp | Bin 0 -> 11718 bytes .../installer/art/1x/btn-finish-normal.bmp | Bin 0 -> 11718 bytes .../installer/art/1x/btn-finish-pressed.bmp | Bin 0 -> 11718 bytes .../installer/art/1x/btn-install-hover.bmp | Bin 0 -> 11718 bytes .../installer/art/1x/btn-install-normal.bmp | Bin 0 -> 11718 bytes .../installer/art/1x/btn-install-pressed.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/btn-next-hover.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/btn-next-normal.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/btn-next-pressed.bmp | Bin 0 -> 11718 bytes console/installer/art/1x/check-off.bmp | Bin 0 -> 822 bytes console/installer/art/1x/check-on.bmp | Bin 0 -> 822 bytes console/installer/art/1x/page-dir.bmp | Bin 0 -> 686454 bytes console/installer/art/1x/page-finish.bmp | Bin 0 -> 686454 bytes console/installer/art/1x/page-license.bmp | Bin 0 -> 686454 bytes console/installer/art/1x/page-progress.bmp | Bin 0 -> 686454 bytes console/installer/art/1x/page-welcome.bmp | Bin 0 -> 686454 bytes console/installer/art/1x/progress-0.bmp | Bin 0 -> 10998 bytes console/installer/art/1x/progress-1.bmp | Bin 0 -> 10998 bytes console/installer/art/1x/progress-2.bmp | Bin 0 -> 10998 bytes console/installer/art/1x/progress-3.bmp | Bin 0 -> 10998 bytes console/installer/art/1x/progress-4.bmp | Bin 0 -> 10998 bytes console/installer/art/1x/progress-5.bmp | Bin 0 -> 10998 bytes console/installer/art/1x/radio-off.bmp | Bin 0 -> 822 bytes console/installer/art/1x/radio-on.bmp | Bin 0 -> 822 bytes console/installer/art/1x/stage-1.bmp | Bin 0 -> 24678 bytes console/installer/art/1x/stage-2.bmp | Bin 0 -> 24678 bytes console/installer/art/1x/stage-3.bmp | Bin 0 -> 24678 bytes console/installer/art/1x/stage-4.bmp | Bin 0 -> 24678 bytes console/installer/art/1x/stage-5.bmp | Bin 0 -> 24678 bytes console/installer/art/1x/tb-close-hover.bmp | Bin 0 -> 5334 bytes console/installer/art/1x/tb-close-normal.bmp | Bin 0 -> 5334 bytes console/installer/art/1x/tb-close-pressed.bmp | Bin 0 -> 5334 bytes console/installer/art/1x/tb-min-hover.bmp | Bin 0 -> 5334 bytes console/installer/art/1x/tb-min-normal.bmp | Bin 0 -> 5334 bytes console/installer/art/1x/tb-min-pressed.bmp | Bin 0 -> 5334 bytes console/installer/art/1x/titlebar.bmp | Bin 0 -> 91254 bytes console/installer/art/2x/base.bmp | Bin 0 -> 4377654 bytes console/installer/art/2x/brand.bmp | Bin 0 -> 1267254 bytes console/installer/art/2x/btn-back-hover.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/btn-back-normal.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/btn-back-pressed.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/btn-browse-hover.bmp | Bin 0 -> 39222 bytes .../installer/art/2x/btn-browse-normal.bmp | Bin 0 -> 39222 bytes .../installer/art/2x/btn-browse-pressed.bmp | Bin 0 -> 39222 bytes console/installer/art/2x/btn-cancel-hover.bmp | Bin 0 -> 46710 bytes .../installer/art/2x/btn-cancel-normal.bmp | Bin 0 -> 46710 bytes .../installer/art/2x/btn-cancel-pressed.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/btn-finish-hover.bmp | Bin 0 -> 46710 bytes .../installer/art/2x/btn-finish-normal.bmp | Bin 0 -> 46710 bytes .../installer/art/2x/btn-finish-pressed.bmp | Bin 0 -> 46710 bytes .../installer/art/2x/btn-install-hover.bmp | Bin 0 -> 46710 bytes .../installer/art/2x/btn-install-normal.bmp | Bin 0 -> 46710 bytes .../installer/art/2x/btn-install-pressed.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/btn-next-hover.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/btn-next-normal.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/btn-next-pressed.bmp | Bin 0 -> 46710 bytes console/installer/art/2x/check-off.bmp | Bin 0 -> 3126 bytes console/installer/art/2x/check-on.bmp | Bin 0 -> 3126 bytes console/installer/art/2x/page-dir.bmp | Bin 0 -> 2745654 bytes console/installer/art/2x/page-finish.bmp | Bin 0 -> 2745654 bytes console/installer/art/2x/page-license.bmp | Bin 0 -> 2745654 bytes console/installer/art/2x/page-progress.bmp | Bin 0 -> 2745654 bytes console/installer/art/2x/page-welcome.bmp | Bin 0 -> 2745654 bytes console/installer/art/2x/progress-0.bmp | Bin 0 -> 43830 bytes console/installer/art/2x/progress-1.bmp | Bin 0 -> 43830 bytes console/installer/art/2x/progress-2.bmp | Bin 0 -> 43830 bytes console/installer/art/2x/progress-3.bmp | Bin 0 -> 43830 bytes console/installer/art/2x/progress-4.bmp | Bin 0 -> 43830 bytes console/installer/art/2x/progress-5.bmp | Bin 0 -> 43830 bytes console/installer/art/2x/radio-off.bmp | Bin 0 -> 3126 bytes console/installer/art/2x/radio-on.bmp | Bin 0 -> 3126 bytes console/installer/art/2x/stage-1.bmp | Bin 0 -> 98550 bytes console/installer/art/2x/stage-2.bmp | Bin 0 -> 98550 bytes console/installer/art/2x/stage-3.bmp | Bin 0 -> 98550 bytes console/installer/art/2x/stage-4.bmp | Bin 0 -> 98550 bytes console/installer/art/2x/stage-5.bmp | Bin 0 -> 98550 bytes console/installer/art/2x/tb-close-hover.bmp | Bin 0 -> 21174 bytes console/installer/art/2x/tb-close-normal.bmp | Bin 0 -> 21174 bytes console/installer/art/2x/tb-close-pressed.bmp | Bin 0 -> 21174 bytes console/installer/art/2x/tb-min-hover.bmp | Bin 0 -> 21174 bytes console/installer/art/2x/tb-min-normal.bmp | Bin 0 -> 21174 bytes console/installer/art/2x/tb-min-pressed.bmp | Bin 0 -> 21174 bytes console/installer/art/2x/titlebar.bmp | Bin 0 -> 364854 bytes console/installer/art/version.txt | 1 + console/installer/installer.nsi | 1375 +++++++++++++++++ console/installer/uninstaller-stub.txt | 10 + console/package.json | 4 +- deploy/prepare-extra.mjs | 33 + docs/使用手册.md | 61 +- docs/升级说明.md | 89 +- docs/常见问题.md | 30 +- server/internal/domain/aggregate_mode_test.go | 232 +++ server/internal/domain/channel_ranks_test.go | 107 +- .../internal/domain/last_place_zero_test.go | 359 +++++ server/internal/domain/ledger.go | 13 + server/internal/domain/scoring.go | 63 +- server/internal/domain/scoring_test.go | 3 +- server/internal/domain/standings.go | 73 +- server/internal/domain/standings_test.go | 88 ++ server/internal/domain/types.go | 26 +- server/internal/dto/standings.go | 16 +- server/internal/export/load.go | 67 +- server/internal/export/load_test.go | 206 +++ server/internal/export/medals.go | 4 +- .../httpapi/breakdown_revisions_test.go | 233 +++ .../httpapi/channel_aggregate_mode_test.go | 157 ++ server/internal/httpapi/dto.go | 14 + .../httpapi/dual_channel_publish_test.go | 200 +++ .../httpapi/event_delete_ledger_test.go | 142 ++ .../httpapi/last_place_zero_e2e_test.go | 61 + .../profile_award_ranks_overflow_test.go | 250 +++ server/internal/httpapi/repo.go | 46 +- server/internal/httpapi/repo_events.go | 60 +- server/internal/httpapi/repo_misc.go | 89 +- server/internal/httpapi/repo_misc_test.go | 109 ++ server/internal/httpapi/rules_handlers.go | 115 +- .../internal/httpapi/rules_handlers_test.go | 215 ++- server/internal/httpapi/scoring.go | 58 +- .../httpapi/standings_medal_rank_test.go | 103 ++ server/internal/httpapi/system_test.go | 2 +- server/internal/realtime/snapshot.go | 12 +- server/internal/realtime/snapshot_test.go | 3 +- server/internal/revisions/trail.go | 211 +++ server/internal/revisions/trail_test.go | 229 +++ server/internal/rules/aggregate_mode_test.go | 220 +++ server/internal/rules/apply.go | 55 +- server/internal/rules/award_ranks_test.go | 139 ++ server/internal/rules/convert.go | 14 +- server/internal/rules/diff.go | 76 +- server/internal/rules/diff_test.go | 91 ++ server/internal/rules/doc.go | 2 + server/internal/rules/last_place_zero_test.go | 153 ++ server/internal/rules/parse.go | 6 + server/internal/rules/snapshot.go | 51 +- server/internal/rules/types.go | 14 +- server/internal/rules/validate.go | 55 + .../0022_void_historical_orphan_ledger.sql | 27 + .../event/0023_channel_aggregate_mode.sql | 13 + .../migrations/event/migration_0022_test.go | 262 ++++ .../migrations/event/migration_0023_test.go | 99 ++ web/src/admin/api/mock.ts | 61 +- web/src/admin/api/scoring.ts | 17 +- .../components/baseData/ChannelsSection.vue | 121 +- .../baseData/SportsEventsSection.vue | 8 +- .../admin/components/baseData/channelRows.ts | 53 + .../admin/components/baseData/mockBaseData.ts | 7 + web/src/admin/pages/EntryPage.vue | 234 ++- web/src/admin/pages/StandingsPage.vue | 89 +- web/src/admin/pages/entryResultActions.ts | 68 +- .../tests/channels-aggregate-mode.test.ts | 55 + .../tests/channels-count-to-team.test.ts | 55 + web/src/admin/tests/channels-medals.test.ts | 7 +- .../admin/tests/entry-result-actions.test.ts | 230 ++- .../tests/scoring-aggregate-mode.test.ts | 141 ++ .../tests/standings-detail-athlete.test.ts | 152 ++ web/src/display/components/DetailOverlay.vue | 46 +- web/src/display/components/TickerBar.vue | 7 +- .../components/pages/TeamMedalsPage.vue | 8 +- web/src/display/guards.ts | 10 +- web/src/display/mock.ts | 17 +- .../tests/detail-overlay-athlete.test.ts | 174 +++ .../tests/rest-fallback-guards.test.ts | 68 +- web/src/shared/channels.ts | 15 +- web/src/shared/index.ts | 14 + web/src/shared/rules.ts | 6 +- web/src/shared/standings.ts | 152 ++ web/src/shared/tests/standings.test.ts | 222 +++ web/src/shared/types.ts | 36 + 181 files changed, 8747 insertions(+), 371 deletions(-) create mode 100644 console/installer/art-gen/gen_art.py create mode 100644 console/installer/art/1x/base.bmp create mode 100644 console/installer/art/1x/brand.bmp create mode 100644 console/installer/art/1x/btn-back-hover.bmp create mode 100644 console/installer/art/1x/btn-back-normal.bmp create mode 100644 console/installer/art/1x/btn-back-pressed.bmp create mode 100644 console/installer/art/1x/btn-browse-hover.bmp create mode 100644 console/installer/art/1x/btn-browse-normal.bmp create mode 100644 console/installer/art/1x/btn-browse-pressed.bmp create mode 100644 console/installer/art/1x/btn-cancel-hover.bmp create mode 100644 console/installer/art/1x/btn-cancel-normal.bmp create mode 100644 console/installer/art/1x/btn-cancel-pressed.bmp create mode 100644 console/installer/art/1x/btn-finish-hover.bmp create mode 100644 console/installer/art/1x/btn-finish-normal.bmp create mode 100644 console/installer/art/1x/btn-finish-pressed.bmp create mode 100644 console/installer/art/1x/btn-install-hover.bmp create mode 100644 console/installer/art/1x/btn-install-normal.bmp create mode 100644 console/installer/art/1x/btn-install-pressed.bmp create mode 100644 console/installer/art/1x/btn-next-hover.bmp create mode 100644 console/installer/art/1x/btn-next-normal.bmp create mode 100644 console/installer/art/1x/btn-next-pressed.bmp create mode 100644 console/installer/art/1x/check-off.bmp create mode 100644 console/installer/art/1x/check-on.bmp create mode 100644 console/installer/art/1x/page-dir.bmp create mode 100644 console/installer/art/1x/page-finish.bmp create mode 100644 console/installer/art/1x/page-license.bmp create mode 100644 console/installer/art/1x/page-progress.bmp create mode 100644 console/installer/art/1x/page-welcome.bmp create mode 100644 console/installer/art/1x/progress-0.bmp create mode 100644 console/installer/art/1x/progress-1.bmp create mode 100644 console/installer/art/1x/progress-2.bmp create mode 100644 console/installer/art/1x/progress-3.bmp create mode 100644 console/installer/art/1x/progress-4.bmp create mode 100644 console/installer/art/1x/progress-5.bmp create mode 100644 console/installer/art/1x/radio-off.bmp create mode 100644 console/installer/art/1x/radio-on.bmp create mode 100644 console/installer/art/1x/stage-1.bmp create mode 100644 console/installer/art/1x/stage-2.bmp create mode 100644 console/installer/art/1x/stage-3.bmp create mode 100644 console/installer/art/1x/stage-4.bmp create mode 100644 console/installer/art/1x/stage-5.bmp create mode 100644 console/installer/art/1x/tb-close-hover.bmp create mode 100644 console/installer/art/1x/tb-close-normal.bmp create mode 100644 console/installer/art/1x/tb-close-pressed.bmp create mode 100644 console/installer/art/1x/tb-min-hover.bmp create mode 100644 console/installer/art/1x/tb-min-normal.bmp create mode 100644 console/installer/art/1x/tb-min-pressed.bmp create mode 100644 console/installer/art/1x/titlebar.bmp create mode 100644 console/installer/art/2x/base.bmp create mode 100644 console/installer/art/2x/brand.bmp create mode 100644 console/installer/art/2x/btn-back-hover.bmp create mode 100644 console/installer/art/2x/btn-back-normal.bmp create mode 100644 console/installer/art/2x/btn-back-pressed.bmp create mode 100644 console/installer/art/2x/btn-browse-hover.bmp create mode 100644 console/installer/art/2x/btn-browse-normal.bmp create mode 100644 console/installer/art/2x/btn-browse-pressed.bmp create mode 100644 console/installer/art/2x/btn-cancel-hover.bmp create mode 100644 console/installer/art/2x/btn-cancel-normal.bmp create mode 100644 console/installer/art/2x/btn-cancel-pressed.bmp create mode 100644 console/installer/art/2x/btn-finish-hover.bmp create mode 100644 console/installer/art/2x/btn-finish-normal.bmp create mode 100644 console/installer/art/2x/btn-finish-pressed.bmp create mode 100644 console/installer/art/2x/btn-install-hover.bmp create mode 100644 console/installer/art/2x/btn-install-normal.bmp create mode 100644 console/installer/art/2x/btn-install-pressed.bmp create mode 100644 console/installer/art/2x/btn-next-hover.bmp create mode 100644 console/installer/art/2x/btn-next-normal.bmp create mode 100644 console/installer/art/2x/btn-next-pressed.bmp create mode 100644 console/installer/art/2x/check-off.bmp create mode 100644 console/installer/art/2x/check-on.bmp create mode 100644 console/installer/art/2x/page-dir.bmp create mode 100644 console/installer/art/2x/page-finish.bmp create mode 100644 console/installer/art/2x/page-license.bmp create mode 100644 console/installer/art/2x/page-progress.bmp create mode 100644 console/installer/art/2x/page-welcome.bmp create mode 100644 console/installer/art/2x/progress-0.bmp create mode 100644 console/installer/art/2x/progress-1.bmp create mode 100644 console/installer/art/2x/progress-2.bmp create mode 100644 console/installer/art/2x/progress-3.bmp create mode 100644 console/installer/art/2x/progress-4.bmp create mode 100644 console/installer/art/2x/progress-5.bmp create mode 100644 console/installer/art/2x/radio-off.bmp create mode 100644 console/installer/art/2x/radio-on.bmp create mode 100644 console/installer/art/2x/stage-1.bmp create mode 100644 console/installer/art/2x/stage-2.bmp create mode 100644 console/installer/art/2x/stage-3.bmp create mode 100644 console/installer/art/2x/stage-4.bmp create mode 100644 console/installer/art/2x/stage-5.bmp create mode 100644 console/installer/art/2x/tb-close-hover.bmp create mode 100644 console/installer/art/2x/tb-close-normal.bmp create mode 100644 console/installer/art/2x/tb-close-pressed.bmp create mode 100644 console/installer/art/2x/tb-min-hover.bmp create mode 100644 console/installer/art/2x/tb-min-normal.bmp create mode 100644 console/installer/art/2x/tb-min-pressed.bmp create mode 100644 console/installer/art/2x/titlebar.bmp create mode 100644 console/installer/art/version.txt create mode 100644 console/installer/installer.nsi create mode 100644 console/installer/uninstaller-stub.txt create mode 100644 server/internal/domain/aggregate_mode_test.go create mode 100644 server/internal/domain/last_place_zero_test.go create mode 100644 server/internal/httpapi/breakdown_revisions_test.go create mode 100644 server/internal/httpapi/channel_aggregate_mode_test.go create mode 100644 server/internal/httpapi/dual_channel_publish_test.go create mode 100644 server/internal/httpapi/event_delete_ledger_test.go create mode 100644 server/internal/httpapi/last_place_zero_e2e_test.go create mode 100644 server/internal/httpapi/profile_award_ranks_overflow_test.go create mode 100644 server/internal/httpapi/standings_medal_rank_test.go create mode 100644 server/internal/revisions/trail.go create mode 100644 server/internal/revisions/trail_test.go create mode 100644 server/internal/rules/aggregate_mode_test.go create mode 100644 server/internal/rules/award_ranks_test.go create mode 100644 server/internal/rules/last_place_zero_test.go create mode 100644 server/migrations/event/0022_void_historical_orphan_ledger.sql create mode 100644 server/migrations/event/0023_channel_aggregate_mode.sql create mode 100644 server/migrations/event/migration_0022_test.go create mode 100644 server/migrations/event/migration_0023_test.go create mode 100644 web/src/admin/components/baseData/channelRows.ts create mode 100644 web/src/admin/tests/channels-aggregate-mode.test.ts create mode 100644 web/src/admin/tests/channels-count-to-team.test.ts create mode 100644 web/src/admin/tests/scoring-aggregate-mode.test.ts create mode 100644 web/src/admin/tests/standings-detail-athlete.test.ts create mode 100644 web/src/display/tests/detail-overlay-athlete.test.ts create mode 100644 web/src/shared/standings.ts create mode 100644 web/src/shared/tests/standings.test.ts diff --git a/VERSION b/VERSION index 83c008d..8c13cbc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -dev_0.5.0 +dev_0.5.1 diff --git a/console/installer/art-gen/gen_art.py b/console/installer/art-gen/gen_art.py new file mode 100644 index 0000000..cd7fa15 --- /dev/null +++ b/console/installer/art-gen/gen_art.py @@ -0,0 +1,597 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""自绘安装器的位图素材生成器(构建期工具,产物随仓库一起提交)。 + +为什么要有这个脚本:安装器窗口是 NSIS 自绘的无边框窗口(760×480),界面本身就是一堆 +钉死在固定坐标上的位图,NSIS 只负责「把图贴到点上」。窗口尺寸、文案、配色每改一次就要 +重出一整套图,手工导图必然会出 1x/2x 不同步、半像素发虚、缺字形变方框这些问题,所以 +整套素材全部由代码生成。 + +用法: + python3 console/installer/art-gen/gen_art.py + +产出: + console/installer/art/1x/ 常规 DPI 用 + console/installer/art/2x/ 4K@200% 缩放用(同一套常量乘 2) + debug/安装界面预览/06-五页预览.png 人眼验收用的五页联络图(不参与打包) + +改了设计就重跑本脚本,不要手改 art/ 里的位图:改图不改脚本,下次重跑就被覆盖, +而且 1x/2x 会悄悄失去同步。 + +几条硬约定: + - 所有坐标/尺寸都按 1x 设计稿书写,2x 由同一套常量乘 2 得到,不写第二套数值; + - 「✕ / — / ✓ / 圆点」这类符号在 Noto Sans SC 里没有字形,一律用线段和圆画出来; + - 字体只用 noto-sans/sc 目录下的简体字重,tc(繁体)目录缺简体字形,会把字渲染成方框。 +""" + +import os + +from PIL import Image, ImageDraw, ImageFont + +# ---------------------------------------------------------------- 路径 + +HERE = os.path.dirname(os.path.abspath(__file__)) # console/installer/art-gen +REPO = os.path.dirname(os.path.dirname(os.path.dirname(HERE))) # 仓库根 +ART_DIR = os.path.join(os.path.dirname(HERE), "art") # console/installer/art +CONTACT_SHEET = os.path.join(REPO, "debug", "安装界面预览", "06-五页预览.png") + +# 图标源文件放在仓库根,打包脚本和安装器素材共用同一份,避免出现两个版本的应用图标 +ICON_SRC = os.path.join(REPO, "Scoreboard.png") + +# 字体不在仓库里(三套字重加起来 25MB,装进仓库不划算),所以按本机绝对路径引用; +# 换机器构建时把这个常量改掉即可,字体缺失会在 font() 里直接报错而不是悄悄退化 +FONT_DIR = "/home/Aska/Fonts/noto-sans/sc" + + +def repo_version(): + """读仓库根 VERSION(版本号唯一真相),去掉 dev_ 前缀给安装包显示用。""" + with open(os.path.join(REPO, "VERSION"), encoding="utf-8-sig") as fh: + return (fh.readline().strip() or "0.0.0").removeprefix("dev_") + +# ---------------------------------------------------------------- 配色 + +NAVY = "#0b1e3a" # 标题栏 / 品牌栏渐变起点 +NAVY_END = "#16406f" # 品牌栏渐变终点 +CONTENT_BG = "#f6f9fd" # 右侧内容区底色 +TXT = "#16233a" # 正文深色 +TXT_DIM = "#5a6b85" # 次要文字 +BRAND_WEAK = "#8ba6c6" # 品牌栏弱文字 +BRAND_WEAKER = "#6b86a8" # 品牌栏最弱(版本号) +PRIMARY = "#2f9bf0" # 主色 +PRIMARY_HOVER = "#3fa9f5" +PRIMARY_PRESSED = "#1f86d8" +PRIMARY_SOFT = "#f0f6ff" # 次要按钮悬停底色 +PRIMARY_SOFT_DOWN = "#dce9fa" # 次要按钮按下底色 +CYAN = "#4fd8ff" # 品牌栏字标点缀 +BORDER = "#cfdcec" +DIVIDER = "#e3ebf5" +CLOSE_HOVER = "#e5484d" +CLOSE_PRESSED = "#c93b40" +SUCCESS = "#34c759" + +TB_DIVIDER = "#1e3e69" # 标题栏底部分隔线 +TB_TEXT = "#cfe3ff" +TB_MIN = "#96afcd" +TB_MIN_HOVER = "#cfe3ff" +TB_CLOSE = "#bed2eb" +TB_HOVER = "#1b2d4a" # 白色 8% 叠在海军蓝上的等效色 +TB_HOVER_DOWN = "#2d3e56" # 白色 14% 叠在海军蓝上 + +# ---------------------------------------------------------------- 版面 + +WIN_W, WIN_H = 760, 480 +TITLE_H = 40 +SIDE_W = 240 +BRAND_H = WIN_H - TITLE_H + +PAGE_X, PAGE_Y = SIDE_W, TITLE_H +PAGE_W, PAGE_H = WIN_W - SIDE_W, WIN_H - TITLE_H +PAD_L, PAD_T = 32, 28 +CONTENT_W = PAGE_W - PAD_L * 2 # 456 +DIVIDER_Y = 376 # 页面内按钮条的上边线 + +BTN_W, BTN_H = 108, 36 +BTN_Y = 416 +BTN_PRIMARY_X = 728 - BTN_W # 620,右边缘对齐内容区右边线 +BTN_SECONDARY_X = 608 - BTN_W # 500,与主按钮间距 12 + +TB_MIN_BOX = (672, 0, 44, 40) +TB_CLOSE_BOX = (716, 0, 44, 40) + +SS = 4 # 超采样倍数:PIL 画圆/圆角矩形没有抗锯齿,4 倍渲染再缩回来才有干净边缘 + +_font_cache = {} + + +def font(weight, size, k): + """取字重字体;size 是 1x 设计字号,k 是当前渲染倍率(= 输出倍率 × 超采样倍数)。""" + key = (weight, size, k) + if key not in _font_cache: + path = os.path.join(FONT_DIR, "NotoSansSC-%s.otf" % weight) + if not os.path.exists(path): + raise SystemExit("字体缺失:%s(本机请确认 noto-sans/sc 三个字重在位)" % path) + _font_cache[key] = ImageFont.truetype(path, size * k) + return _font_cache[key] + + +def U(k): + """返回 1x 设计坐标 → 渲染像素的换算函数。 + + 统一四舍五入:设计稿里存在 12.5、11.5 这类半像素字号和坐标,不取整会让 + 线条落在半像素上,缩回来变成两行灰边。 + """ + return lambda v: int(round(v * k)) + + +def down(im): + """超采样降采样,得到最终位图。""" + return im.resize((im.width // SS, im.height // SS), Image.LANCZOS) + + +def hgrad(w, h, c0, c1): + """横向线性渐变。品牌栏底色与品牌栏位图共用本函数,两者叠加才不会露出接缝。""" + a, b = ImageColor_rgb(c0), ImageColor_rgb(c1) + im = Image.new("RGB", (w, h)) + d = ImageDraw.Draw(im) + for x in range(w): + t = x / max(w - 1, 1) + d.line([(x, 0), (x, h)], fill=tuple(round(a[i] + (b[i] - a[i]) * t) for i in range(3))) + return im + + +def ImageColor_rgb(s): + s = s.lstrip("#") + return tuple(int(s[i:i + 2], 16) for i in (0, 2, 4)) + + +def box(p, x, y, w, h): + """1x 的 (x, y, 宽, 高) → PIL 的闭区间 bbox(PIL 的右下角是含在内的)。""" + return [p(x), p(y), p(x + w) - 1, p(y + h) - 1] + + +def text_top(d, p, x, y, s, f, fill): + """按「字形可见顶部」定位。 + + 中英文混排时 ascender 高度不一致(数字/英文比汉字矮),直接给 y 会让同一组的 + 几行文字看起来忽高忽低,所以按实际墨迹框归位。 + """ + b = d.textbbox((0, 0), s, font=f, anchor="la") + d.text((p(x), p(y) - b[1]), s, font=f, fill=fill, anchor="la") + + +def text_bottom(d, p, x, y, s, f, fill): + """按「字形可见底部」定位,用于版本号这种按底边距对齐的文字。""" + b = d.textbbox((0, 0), s, font=f, anchor="la") + d.text((p(x), p(y) - b[3]), s, font=f, fill=fill, anchor="la") + + +def text_center(d, p, cx, cy, s, f, fill): + """按墨迹框居中,用于按钮文字。""" + b = d.textbbox((0, 0), s, font=f) + d.text((p(cx) - (b[2] + b[0]) / 2, p(cy) - (b[3] + b[1]) / 2), s, font=f, fill=fill) + + +def dot(d, p, cx, cy, r, fill): + """画圆点。要点符号 fonts 里没有,只能画。""" + d.ellipse([p(cx - r), p(cy - r), p(cx + r), p(cy + r)], fill=fill) + + +def check(d, p, pts, color, width): + """对勾用折线画。✓ 字形在 Noto Sans SC 里缺,硬渲染会出方框。""" + d.line([(p(x), p(y)) for x, y in pts], fill=color, width=p(width), joint="curve") + + +def paste_icon(im, p, x, y, w, h): + """把应用图标等比缩放进 (x, y, w, h) 的方框并居中。 + + 源图自带圆角透明背景,必须带 alpha 贴;另外先裁掉四周透明留白,否则同一张图 + 在标题栏和品牌栏两处的视觉大小会对不上。 + """ + src = Image.open(ICON_SRC).convert("RGBA") + src = src.crop(src.getchannel("A").getbbox()) + tw, th = p(w), p(h) + r = min(tw / src.width, th / src.height) + nw, nh = max(1, int(round(src.width * r))), max(1, int(round(src.height * r))) + src = src.resize((nw, nh), Image.LANCZOS) + im.paste(src, (p(x) + (tw - nw) // 2, p(y) + (th - nh) // 2), src) + + +# ---------------------------------------------------------------- 背景与框架 + +def draw_base(k): + """底层:标题栏 + 品牌栏渐变 + 内容区底色。 + + 品牌栏渐变在这里也要画一遍(上面还会贴 brand.bmp),这样底图本身就是完整的, + 单独看 base.bmp 也不会露出一块空白。 + """ + p = U(k) + im = Image.new("RGB", (p(WIN_W), p(WIN_H)), CONTENT_BG) + im.paste(hgrad(p(SIDE_W), p(BRAND_H), NAVY, NAVY_END), (0, p(TITLE_H))) + d = ImageDraw.Draw(im) + d.rectangle(box(p, 0, 0, WIN_W, TITLE_H), fill=NAVY) + return down(im) + + +def draw_brand(k): + """品牌栏内容。底色是同一段渐变,贴在 base 的品牌栏上无缝。""" + p = U(k) + im = hgrad(p(SIDE_W), p(BRAND_H), NAVY, NAVY_END) + d = ImageDraw.Draw(im) + + # 图标 x 与下方文字的左边距(36)取齐,不留出那 12px 的错位 + paste_icon(im, p, 36, 48, 96, 96) + + text_top(d, p, 36, 172, "赛事积分榜", font("Bold", 26, k), "#ffffff") + text_top(d, p, 36, 219, "S C O R E B O A R D", font("Medium", 11, k), CYAN) + text_top(d, p, 36, 250, "一拖二 · 实时积分大屏", font("Regular", 12, k), BRAND_WEAK) + text_top(d, p, 36, 272, "裁判长管理面板", font("Regular", 12, k), BRAND_WEAK) + # 版本号按「左边距 36 / 底边距 40」定位,底部对齐比顶部对齐更稳 + # 版本从仓库根 VERSION 读(唯一真相):烘焙进位图意味着发新版必须重跑本脚本, + # deploy/prepare-extra.mjs 里有一道校验,版本对不上会直接让构建失败,不会悄悄发错版本 + text_bottom(d, p, 36, BRAND_H - 40, f"版本 v{repo_version()}", font("Regular", 11, k), BRAND_WEAKER) + return down(im) + + +def draw_titlebar(k): + """标题栏:图标 + 标题 + 右侧最小化/关闭。 + + 两个按钮图形按 44×40 按钮框居中画,和 tb-*.bmp 的图形位置严格一致 —— 悬停时 + NSIS 用按钮位图盖住这块区域,位置不一致的话图形会跳一下。 + """ + p = U(k) + im = Image.new("RGB", (p(WIN_W), p(TITLE_H)), NAVY) + d = ImageDraw.Draw(im) + + paste_icon(im, p, 14, 10, 20, 20) + text_top(d, p, 44, 12, "赛事积分榜 安装程序", font("Medium", 14, k), TB_TEXT) + + min_cx = TB_MIN_BOX[0] + TB_MIN_BOX[2] / 2 + close_cx = TB_CLOSE_BOX[0] + TB_CLOSE_BOX[2] / 2 + d.line([(p(min_cx - 7), p(20)), (p(min_cx + 7), p(20))], fill=TB_MIN, width=p(2)) + d.line([(p(close_cx - 6), p(14)), (p(close_cx + 6), p(26))], fill=TB_CLOSE, width=p(2)) + d.line([(p(close_cx + 6), p(14)), (p(close_cx - 6), p(26))], fill=TB_CLOSE, width=p(2)) + + # 底部分隔线画在标题栏位图内部(画在 base 上会被标题栏位图盖掉) + d.rectangle(box(p, 0, TITLE_H - 1, WIN_W, 1), fill=TB_DIVIDER) + return down(im) + + +# ---------------------------------------------------------------- 五个页面 + +def page_base(k): + """页面公共底:内容区底色 + 按钮条上边线。""" + p = U(k) + im = Image.new("RGB", (p(PAGE_W), p(PAGE_H)), CONTENT_BG) + d = ImageDraw.Draw(im) + d.rectangle(box(p, 0, DIVIDER_Y, PAGE_W, 1), fill=DIVIDER) + return im, d + + +def page_head(d, p, k, title, desc=None): + text_top(d, p, PAD_L, PAD_T, title, font("Bold", 20, k), TXT) + if desc: + text_top(d, p, PAD_L, 62, desc, font("Regular", 13, k), TXT_DIM) + + +def draw_page_welcome(k): + p = U(k) + im, d = page_base(k) + page_head(d, p, k, "欢迎安装", "本向导将把《赛事积分榜》安装到这台计算机。") + + items = [ + "一拖二部署:一个服务端,同时带实时积分大屏与裁判长管理面板", + "完全离线运行,不需要外网", + "数据与赛事配置存在当前用户目录,覆盖安装不会丢", + ] + f = font("Regular", 13, k) + y = 118 + for it in items: + b = d.textbbox((p(52), p(y)), it, font=f, anchor="la") + # 圆点对齐每行墨迹的垂直中点,行内英文/数字混排时也不会跑偏 + dot(d, p, PAD_L + 4, (b[1] + b[3]) / 2 / k, 4, PRIMARY) + d.text((p(52), p(y)), it, font=f, fill=TXT, anchor="la") + y += 32 + return down(im) + + +def draw_page_license(k): + p = U(k) + im, d = page_base(k) + page_head(d, p, k, "许可协议", "请阅读以下条款。继续安装表示你接受这些条款。") + + lines = [ + "本软件以 MIT 许可协议发布,你可以自由使用、修改和分发。", + "分发或再发布时,必须保留原始的版权声明与许可声明。", + "本软件按「现状」提供,不附带任何形式的明示或默示担保。", + "因使用本软件造成的任何损失,作者不承担任何责任。", + ] + f = font("Regular", 13, k) + y = 104 + for ln in lines: + text_top(d, p, PAD_L, y, ln, f, TXT) + y += 22 + + # 只画外框,里面的协议正文由真控件渲染(位图放不下整篇协议) + d.rectangle(box(p, PAD_L, 196, CONTENT_W, 176), outline=BORDER, width=p(1)) + return down(im) + + +def draw_page_dir(k): + p = U(k) + im, d = page_base(k) + page_head(d, p, k, "选择安装位置", "安装程序将把《赛事积分榜》装到下面的目录。") + + # 这一条是「目录输入行」的外框:框内左侧跑真编辑框,右侧 96×34 的「浏览…」 + # 按钮位图直接压在外框右端(框高 34 与按钮等高,所以按钮正好卡在框内) + d.rectangle(box(p, PAD_L, 110, CONTENT_W, 34), outline=BORDER, width=p(1)) + + text_top(d, p, PAD_L, 170, "安装模式", font("Medium", 13, k), TXT) + # 文字从 56 起排,左边 24px 留给单选钮位图 + text_top(d, p, 56, 222, "仅为我安装(不需要管理员权限)", font("Regular", 12.5, k), TXT) + text_top(d, p, 56, 262, "为所有用户安装(会弹 UAC,并自动放行防火墙 19540)", + font("Regular", 12.5, k), TXT) + return down(im) + + +def draw_page_progress(k): + p = U(k) + im, d = page_base(k) + # 进度页正文区留空:阶段文案和进度条都用独立位图贴上去(NSIS 换图=换状态) + page_head(d, p, k, "正在安装") + d.rounded_rectangle(box(p, PAD_L, 140, CONTENT_W, 8), radius=p(4), fill=DIVIDER) + return down(im) + + +def draw_page_finish(k): + p = U(k) + im, d = page_base(k) + page_head(d, p, k, "安装完成", "《赛事积分榜》已安装到这台计算机。") + + # 成功标记在内容区水平居中:绿实心圆 + 白对勾 + cx = PAGE_W / 2 + cy = 164 + d.ellipse([p(cx - 24), p(cy - 24), p(cx + 24), p(cy + 24)], fill=SUCCESS) + check(d, p, [(cx - 11, cy + 0.5), (cx - 3, cy + 8.5), (cx + 12, cy - 8.5)], "#ffffff", 3.5) + + # 勾选项文字从 56 起排,左边 24px 留给勾选框位图 + text_top(d, p, 56, 300, "立即运行 赛事积分榜", font("Regular", 13, k), TXT) + text_top(d, p, PAD_L, 336, "安装位置:D:\\Program Files\\Scoreboard_Console", + font("Regular", 11.5, k), TXT_DIM) + return down(im) + + +# ---------------------------------------------------------------- 按钮 + +def draw_button(k, label, w, h, kind, state): + """圆角按钮三态。圆角外填内容区底色,贴到按钮条上才不会露出白角。""" + p = U(k) + im = Image.new("RGB", (p(w), p(h)), CONTENT_BG) + d = ImageDraw.Draw(im) + if kind == "primary": + bg = {"normal": PRIMARY, "hover": PRIMARY_HOVER, "pressed": PRIMARY_PRESSED}[state] + fg, border = "#ffffff", None + else: + bg = {"normal": "#ffffff", "hover": PRIMARY_SOFT, "pressed": PRIMARY_SOFT_DOWN}[state] + border = BORDER if state == "normal" else PRIMARY + fg = TXT + d.rounded_rectangle([0, 0, p(w) - 1, p(h) - 1], radius=p(8), fill=bg, + outline=border, width=p(1) if border else 0) + text_center(d, p, w / 2, h / 2, label, font("Medium", 13, k), fg) + return down(im) + + +def draw_tb_button(k, kind, state): + """标题栏按钮。常态底色=标题栏底色,贴上去和标题栏融为一体。""" + p = U(k) + im = Image.new("RGB", (p(44), p(40)), NAVY) + d = ImageDraw.Draw(im) + if kind == "close": + bg = {"normal": NAVY, "hover": CLOSE_HOVER, "pressed": CLOSE_PRESSED}[state] + fg = "#ffffff" if state != "normal" else TB_CLOSE + else: + bg = {"normal": NAVY, "hover": TB_HOVER, "pressed": TB_HOVER_DOWN}[state] + fg = {"normal": TB_MIN, "hover": TB_MIN_HOVER, "pressed": "#ffffff"}[state] + d.rectangle(box(p, 0, 0, 44, 40), fill=bg) + if kind == "min": + d.line([(p(15), p(20)), (p(29), p(20))], fill=fg, width=p(2)) + else: + d.line([(p(16), p(14)), (p(28), p(26))], fill=fg, width=p(2)) + d.line([(p(28), p(14)), (p(16), p(26))], fill=fg, width=p(2)) + return down(im) + + +# ---------------------------------------------------------------- 控件 + +def draw_check(k, on): + p = U(k) + im = Image.new("RGB", (p(16), p(16)), CONTENT_BG) + d = ImageDraw.Draw(im) + if on: + d.rounded_rectangle(box(p, 0, 0, 16, 16), radius=p(4), fill=PRIMARY) + check(d, p, [(4.5, 8.5), (7, 11), (11.5, 5.5)], "#ffffff", 2) + else: + d.rounded_rectangle(box(p, 0, 0, 16, 16), radius=p(4), fill="#ffffff", + outline=BORDER, width=p(1)) + return down(im) + + +def draw_radio(k, on): + p = U(k) + im = Image.new("RGB", (p(16), p(16)), CONTENT_BG) + d = ImageDraw.Draw(im) + if on: + d.ellipse(box(p, 0, 0, 16, 16), fill="#ffffff", outline=PRIMARY, width=p(2)) + d.ellipse(box(p, 5, 5, 6, 6), fill=PRIMARY) + else: + d.ellipse(box(p, 0, 0, 16, 16), fill="#ffffff", outline=BORDER, width=p(1)) + return down(im) + + +def draw_progress(k, step): + """进度条 0..5 档,20% 一格。 + + 进度条底与凹槽位图尺寸完全一致,NSIS 直接叠在凹槽上即可;填充部分左端保留圆角、 + 右端切齐,符合进度条「推进」的视觉。 + """ + p = U(k) + im = Image.new("RGB", (p(456), p(8)), CONTENT_BG) + d = ImageDraw.Draw(im) + d.rounded_rectangle(box(p, 0, 0, 456, 8), radius=p(4), fill=DIVIDER) + frac = step / 5 + if frac > 0: + # 用整体圆角矩形做蒙版,再按进度裁掉右半边,这样左端圆角自然、右端是直边 + mask = Image.new("L", (p(456), p(8)), 0) + ImageDraw.Draw(mask).rounded_rectangle(box(p, 0, 0, 456, 8), radius=p(4), fill=255) + fill_im = Image.new("RGB", (p(456), p(8)), PRIMARY) + cut = max(1, int(round(p(456) * frac))) + region = (0, 0, cut, p(8)) + im.paste(fill_im.crop(region), (0, 0), mask.crop(region)) + return down(im) + + +def draw_stage(k, text): + """阶段文案位图,贴到进度页 (32,116):进度条上方一行,文案换行=状态切换。""" + p = U(k) + im = Image.new("RGB", (p(456), p(18)), CONTENT_BG) + d = ImageDraw.Draw(im) + f = font("Regular", 12.5, k) + b = d.textbbox((0, 0), text, font=f, anchor="la") + d.text((0, (p(18) - (b[3] - b[1])) / 2 - b[1]), text, font=f, fill=TXT_DIM, anchor="la") + return down(im) + + +# ---------------------------------------------------------------- 汇总 + +def all_art(s): + """逐张产出某个倍率的全部素材。 + + 为什么用生成器:k=8 时单张底图就有 70MB,一次性把几十张都留在内存里没必要。 + """ + k = s * SS + yield "base.bmp", draw_base(k) + yield "brand.bmp", draw_brand(k) + yield "titlebar.bmp", draw_titlebar(k) + + yield "page-welcome.bmp", draw_page_welcome(k) + yield "page-license.bmp", draw_page_license(k) + yield "page-dir.bmp", draw_page_dir(k) + yield "page-progress.bmp", draw_page_progress(k) + yield "page-finish.bmp", draw_page_finish(k) + + for label, name in (("下一步", "next"), ("安装", "install"), ("完成", "finish")): + for st in ("normal", "hover", "pressed"): + yield "btn-%s-%s.bmp" % (name, st), draw_button(k, label, BTN_W, BTN_H, "primary", st) + for label, name in (("取消", "cancel"), ("上一步", "back")): + for st in ("normal", "hover", "pressed"): + yield "btn-%s-%s.bmp" % (name, st), draw_button(k, label, BTN_W, BTN_H, "secondary", st) + for st in ("normal", "hover", "pressed"): + yield "btn-browse-%s.bmp" % st, draw_button(k, "浏览…", 96, 34, "secondary", st) + + for name in ("min", "close"): + for st in ("normal", "hover", "pressed"): + yield "tb-%s-%s.bmp" % (name, st), draw_tb_button(k, name, st) + + for st in ("off", "on"): + yield "check-%s.bmp" % st, draw_check(k, st == "on") + yield "radio-%s.bmp" % st, draw_radio(k, st == "on") + + for i in range(6): + yield "progress-%d.bmp" % i, draw_progress(k, i) + + for i, t in enumerate(["正在解压程序文件…", "正在写入注册表…", "正在创建快捷方式…", + "正在放行防火墙…", "正在收尾…"], start=1): + yield "stage-%d.bmp" % i, draw_stage(k, t) + + +# ---------------------------------------------------------------- 联络图 + +def compose(art, page, overlays): + """按真实层级拼出 760×480 的成品观感图:底图 → 品牌栏 → 页面 → 标题栏 → 按钮/控件。""" + im = Image.new("RGB", (WIN_W, WIN_H), CONTENT_BG) + im.paste(art["base.bmp"], (0, 0)) + im.paste(art["brand.bmp"], (0, TITLE_H)) + im.paste(art["page-%s.bmp" % page], (PAGE_X, PAGE_Y)) + im.paste(art["titlebar.bmp"], (0, 0)) + for name, (x, y) in overlays: + im.paste(art[name], (x, y)) + return im + + +def build_contact_sheet(art): + """五页各拼一张成品图,纵向排成长图给人眼过一遍。 + + 单看素材文件看不出层级和对位问题(例如标题栏图形与按钮位图错位、按钮压住正文), + 所以验收必须看合成结果,而不是逐个位图看。 + """ + # 标题栏按钮和底部按钮条按窗口坐标贴,页面内的控件按「页内坐标 + 页面原点」贴, + # 两类坐标混用很容易少加一次偏移,所以这里用 loc() 明确区分 + def loc(x, y): + return x + PAGE_X, y + PAGE_Y + + tb = [("tb-min-normal.bmp", (TB_MIN_BOX[0], TB_MIN_BOX[1])), + ("tb-close-normal.bmp", (TB_CLOSE_BOX[0], TB_CLOSE_BOX[1]))] + cancel = ("btn-cancel-normal.bmp", (BTN_SECONDARY_X, BTN_Y)) + back = ("btn-back-normal.bmp", (BTN_SECONDARY_X, BTN_Y)) + next_ = ("btn-next-normal.bmp", (BTN_PRIMARY_X, BTN_Y)) + + pages = [ + compose(art, "welcome", tb + [cancel, next_]), + compose(art, "license", tb + [cancel, next_]), + compose(art, "dir", tb + [ + ("btn-browse-normal.bmp", loc(392, 110)), + ("radio-off.bmp", loc(32, 220)), ("radio-off.bmp", loc(32, 260)), + back, next_, + ]), + # 进度页取中间一档(第 3 段 / 60%),静态图里最能说明「安装中」的样子 + compose(art, "progress", tb + [ + ("stage-3.bmp", loc(PAD_L, 116)), + ("progress-3.bmp", loc(PAD_L, 140)), + cancel, + ]), + compose(art, "finish", tb + [ + ("check-on.bmp", loc(32, 298)), + ("btn-finish-normal.bmp", (BTN_PRIMARY_X, BTN_Y)), + ]), + ] + + gap = 16 + sheet = Image.new("RGB", (WIN_W + gap * 2, gap + len(pages) * (WIN_H + gap)), "#202a38") + for i, page in enumerate(pages): + sheet.paste(page, (gap, gap + i * (WIN_H + gap))) + os.makedirs(os.path.dirname(CONTACT_SHEET), exist_ok=True) + sheet.save(CONTACT_SHEET) + print("写出 %s %s" % (CONTACT_SHEET, sheet.size)) + + +def write_version_marker(): + """把烘焙进位图的版本号另写一份纯文本旁证。 + + 为什么需要这个文件:版本号是画在 brand.bmp 像素里的,构建脚本没法从位图反读出 + 版本,因此「素材是旧版本生成的、但打包用的是新版本号」这种错配完全看不出来, + 会悄悄发出一个界面上写着错版本号的安装包。这里把 repo_version() 的结果落到 + art/version.txt,构建脚本拿它和仓库根 VERSION 一比,对不上就让构建失败。 + """ + path = os.path.join(ART_DIR, "version.txt") + with open(path, "w", encoding="utf-8", newline="\n") as fh: + fh.write(repo_version() + "\n") + print("写出 %s" % path) + + +def main(): + art1x = {} + for s in (1, 2): + out = os.path.join(ART_DIR, "%dx" % s) + os.makedirs(out, exist_ok=True) + n = 0 + for name, im in all_art(s): + im.save(os.path.join(out, name)) + n += 1 + if s == 1: + art1x[name] = im # 联络图直接用 1x 成品,不要把 2x 缩一半再用(字会发虚) + print("%s:%d 张" % (out, n)) + write_version_marker() + build_contact_sheet(art1x) + + +if __name__ == "__main__": + main() diff --git a/console/installer/art/1x/base.bmp b/console/installer/art/1x/base.bmp new file mode 100644 index 0000000000000000000000000000000000000000..868b282375718d5e76ad1e9319c92f9cb63429c2 GIT binary patch literal 1094454 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 PfB*pk1PBm#sRG{v-944b literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/brand.bmp b/console/installer/art/1x/brand.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0520ea9f04be040aacd2c5a02118bc05889b0972 GIT binary patch literal 316854 zcmeFa1$bLm)-|joX3H!ygDhJzGm|W4Gc$7>j^nT$W@hH3N!lhUq$wmRw<$MeW@c{x zb#;^*rJ3o>w0-BB_CJ1h?{j=5%Wk~1z0TTe?^B>T{j>##`AETk5%}*@{CCS34rdI< z3o8z1HXgs=$T9wByn#zbfIT9UM4)}9F|q>f*~kv!nnz9$mx*8|a<7fN5H1_}AzV|0 za`QtS3d}+r>L3og8iipFrr;QK^l&5Bq0lTG=;!Xer+fOj*19VC?g!NMx>*P z2`3WjNGB$QrqBqT*wBic%tI$~Vj_wOJrmAs7^0ooD2jGAMT~P%jB~MBl*Blf#9ock zSQk^oxs+WS<#8_M@usMVcQKF31Q#}{5?oD@=vtNNT77NQB)PIto8)SWWY^kc*E&!|)r^=HbTX+4G3Q>gw-^=GO-(|Wggu^Vfu zKht{mRr3an98`a%`ZLv^sec1zBKCQ{XX<}uODfd=Y_#;V zW_~QF|C##vX@3g!BT+vR^&?R~67?fdKN9uxQ$Ihgr_g>_w0N`4-PF%d`@7NQP5nsJ zk3{`Q)Q?2{NYsx+=Wk%P44owJ!x&Xb|@k!U@I)>CLbh1OGOJ%!d&Xg!72Q)oSf z)>CLbh1OGOJ%!d&=zLM^4QYQ0oi9q~KeNN1v7q%7T2G<%6k1QA^%TtNr}Y#%pP%-p z(DNqfyj(gjm!6+O&jX_80sZ~Xo4~PF0JeF3u#oR4;XC4dE9QFb;a1GvFpT>joo}U# zbYkMl`Bpg7iq)UhLT4tfoNuKOIWs}ex1#4;{ekn^a)a#Piw2$n;{u%H7Q)R5v@Hm+ z2cB~Rti@s6U+Ei)2T#>v%-+BK^OO0`k0fb^a@Z4--9OA;S7aY4q}*qFznn>VdMA{Uy6+x8jO*uO?|_UrC27CO^nlE^tCf z!t58csQ}Aq6*>7q*5Df(C)YIPho^dQ7IkQ*S7hf0TGnO;>tlIkNnZ8Yp@ktfc>xxq zEs8~LYT&st)vqem5BXUa<)R3;UprXdtBh5I+v%d5Ns6X?gXZVoz%#aidBOIoDEGyk zIwa~@^^)3b{%EVx5bur5yn1|jL#`k<$TmO3Zc179hRN0HC|+r@-`WWkrOCd!SdT5! z>Ze!cVtdFWXMvMA)UGN$a8-XvX_C*{!3tozBE=uMS0!`?f9{Y*t?VrZfWe;?MxM+t zXQ4B$tpyQynw)P>__J{=lCzv|hg{vGh>`PcDV{0cU|s#cjpzIjYy+Lv3|1`Z(r=tn zi(Eacu5i3Q4FImr2wm8w#+FbjaLV+xnA0emQkI2O46Nn{+svrW2j;W8M}IXS#4HGO-2yFFAL{N!t5Gy`N+32K9`)?4d|97`50o|rD1l+=L=eu zk`Nnh6nF)rZ(vJE@yt|Ju06b)@{Ql-8_3U4GbG{8i#oKLXitb6$kJdPqphlnw4hY4 zF^k%@swf^L4kK0O0;P4?VIU+;`4Ox7OR+s9%$YzMdqz;@#@z5spD{rG?7G6r)Bw=n zD|ikAp2?OFkd}wrujnmW*;fprzN){tINk#Y2biI95Ilo#(ELpCoDzK=AQCL?&=#7e?9AaMY_;2TVS7CJ%Sz!N&8 zB3-nb0=kF51ZIL~K)N8%0@Q`_4VGz;1?A7bjc4R%@QtP2`aVs{rYW^GSz(Yhpx`y+ z3EE{b0Iek45s-$avAnl0Kt$)xXo=;WcgcxdsJnFr2CA^@EMol!O07@Q$#xJ<2-e-p4w>l zqIhqxj-muFU5tl5&dU(*#p-q78wAWme3pkhh=Xm~rBNFuRYUZEUWZgn_y#}=JkPAj z-!{~UERD@zd!bOqw`0h&$Qk+ul;@FV`QABgZDIk{Hz=OXDaXHqXJFV6@3XAifD+-v zk_@Ec1#N1?tU3v_4(J=8%BUFT1=*sW!cYj23&@5z6jent3VrP`bD$de89PB}(d|-G zJq5{`DSR8x1A-h~lHgUEh>D4~KH3fS6q27oHUMc^sEr}UO&{&T7E`GH3}Dmz{M&dY z{MiuiD-*ah=0{4xogmNw)sW`Ok^@=`qsV>`)f1FX5b_A;)KFYTeo@LdDBtMFaz{|ULHP#NpQ-*# z^=CTIoX#_+ekAHg`ZxVZpwQ;?zEJq4_3rXGm-2X1(D~1F{xe*oRIj6Y9o6foUPt{K z)W1Rf8`Qr+{TtN3LH!%l|IC`7v7q`h)t{;UO!a4~KU4jg>d#bvE{buc=V{XOG-*AB z)>FE&-Pxe^6k1QA=V|ukdC+3azKmdJ3(l(0U53r_g!|t*6j>N>7eE8?>H6 z>nXIJLhC8Cow4OriDXkeiT2G<%6k1PViz!&pdJ3(l(0U53r?BTukg5tevw6_- zCg^z+|IT?6v>%qvucPy1$dN#Fex1qEpXgeZ=n9Tu9<(2p`ZuV5gZek9e}norsDFd{ zH>iJu`ZuV5gZejE^9B~wzd`*Q)W1Rf8`Qr+{TtN3LH!%lzd`4V;%p%5-=O{t_9S|; zpz}p(J%!d&Xg!72Q)oSf)>CLbh1OGOJ%!d&Xg!72Q)oR!8R2*}A{|vsIFV3CIx!(M z1?A6_KU4lp`7`Culs{AcO!+hA&y+t?{(O}@gGf{Uoa|a>3b(psw|Yd%)u8;D@@LAQ zDSxK?neu1KpDBN){F(A+%AaeKTuqVeO8xxQ&rkjQ)Xz`-{M64+{ruF=PyPIzSyvCY zqVpK3pPx)gqJDnr=cj%oT2G<%6k1QA^%Po9q4gA6Poeb`T2G<%6k1QA^_0v2dnN)+ zkrimqMs^U_JScyr{F(A+%AYBJru>=mXUd-`f2RDI@@LAQ%@4PtekAHgqJAXmN1}ct z>PMn}B<_>PMn}Br}3K8d6Yj>{!IBZ<PMn}B3azKmdJ3(l(0U53r_g!|t*6j>3azKmdJ1YN=8+e|Wg|a?Yl={Aey9WG&y+t? z{!IBZ<?k*FVu`jL8BGZGfmk0f+b z3!SJRiTaWLTt8AF-?1>v0U_Z#O2Qo_d@LNK?1EV{pCaTD&WZ?Uxxh&l?#Sk6MTFCD zpQouZ;#L*uL_!_ugwTkb0p?%fSr_GO9{MO}gf7Yn0Rs~Glw8gINX0QOMbXYo#5fnn zx|EnljB`mW6Qyy?eX2kIjrC_qxD$|^A7Y;qXu}{G>tMU=0BeHeoB%6=YIFTL+ut(F zcU(cREdy!eJVq&>TNr8wNGl_ql@U&g2uFlUh_xdLU|7nxlZ4vH!?`3B;amjnC?g!q z@vM$?R7G&jLmk0YN7!qG4*F3+z}tYa;D+Latuqpcitn zD2sCin9Jf_bwYbXlmk9BK|0O_oY_3e<6O$)O;Hi=Vjfg~{vX$$#bJQ1eVX^UOg~F? zv`1w|NS41XZwv42iqtk0c@wdKua0l9(Y#aIbn9q1%hrxOlhKbWvYKgieF`lUq!O- zfG(*t$(w;RBGOS8XHBH6nl#iu6Czc$^!JjqiX$sN=smL+&7__k_+ zJwgMVN7w`8mC0U{49R+tBeJwk`QSq$+W>vU#k6hT46Ic}G zNb%f}>E4mW1onXDfn&Sb=+1UGMUH!Sj{E;Cp2eXKxj}XcA#eBG&gK23^|=D2hiH6m|U}Q zO3k{7Rp++PYb}hBhT4=Tc>~G0zMRSw--8Rf4=wE7Khkw--SnGQPuVxW^Z4=!Bh9kH zV2fkR22ZYt0q?-GHz*?=FT1S`qj}$+NKnJZE~ji#$Qz5fSp4Y;fgEpysWRJPnXiGO_|rM z+BLW1-1hmMiuf*7!t%b7bnmgq(!kHmIte(2QV8@qgN>wkaFCe~FB&k!c>&>)F#ED( zKfE1)>Q&>*R*x^2gxPH$ZoXyX@Pwi?eGCs|BQL;WahGn@K&dWe795LOaSg{!aWEG$T8}rXfG_(4u~%Vr1r7_0scu7HVU?bg^C!A6-?G6{?Bx zsLkQ$23jZaIF;$a$CgdV^0NS!$n+hHWL}>eu8DFxvShqI)|245JjD;s0kE@u$0D}R zY~DZ8Ee*3rT2=@^kDY<%h3)E-D<>`K1ggtc_LlK1>JQS0S#Hf$lD8Bl}kG{Sd_%M zwH1UPS=1*Bv7BC(QJ3MrWm;{ITr{~jW!J3cJReTCO!(YwJNi}8O1@=zf*air{+;j) ze;pv56KGqK6tI7^cWH0&q|)qpEvow5h>En}vs>qYHWY-~XZVf-dEPeMym4wBV77Ir zaqEo688zZXo%%%`I&p~I(WQd~&*0A$ss6{8Pc+1N<^@>JsL98=AlOV0N4xKR0~>Fz;=r`LLP3fjdD>5xFzu(;222GRjGc{%d`4av3uur z0Pub4IDA@}>Lcgd92o6x$_;HVj5xfwuUi&1pozO-*fNEAkD1IWO2=6XP|zLB3_E z30R%gAX_=Ud}h6Lc7trBRlR0H*jJil29 zzCrLT4zY*XI2Y7$iF=G@Rj z3wm^sT&Q+4t8(xrJ+!cAVXGXOd1aqrVXGp|l`~wG1*k*oD38BFIcR?VyX0qmyidD4 zzA<08s7pUoUC<;Jfl&j2D+kKk<*}2?vrCfv6p=2_F@SCC><%pG-8{XaQxS(8KH91# z`B@w7u8Z|(EfiuWc=MWRU5dDg#p%`QK~4Drz_?8!!nGvPTO4GC-QuE7?Ub@i0C;+3 z&Tvis+(zk)sywXk-Zfer?@^x}vT159V7#acOQv^o6VR9|9v^K_LUbB+qXO?f|_*)p_J&!IOuNJvN+}l03T_5Y7;mv`{ z0lopTt|;DPc3q({GwVQ`!LIkr>zGw5#(MSmvYE97`WQDzcAy!^#^NB$`mEsFx6Ix? zqw(go)37DnHLK;;O~X*672&q?n`O{0HchG7I#hpg-{PIKnvrt1Osm^I+%(!ELvn7) z37*$jc-!Wg8>du(LLXhyKU9%9L6X_v;!aJ6Gzxkhc6r%8oI!ocXsa^alY^?a zCejg<vVyu`CD}D-Il+?>`0`K+udF zym5jp3IoT=L#>dX+Y7?i43wN$IdSj2_8AqK$CiypNkuKNf&MJ^=g5M`Qat}H@r*6u z(w^d7b2{)R{@C&f$iSV-_?@%b+GVlG!>h)ZL#$H@U7_h|qIuhfTfij-^r`D7*Hkie zB2p!Eh1SRF&)5K>1fz{|lkvGZzGJI1g3hd;v9Mi(6b(p2wc9wg_U1KHk;4JhX%#up z>p+$97Jz~QYEhFO0FD7Q@0JZSkfLYR6`(!>vH^Ah#ba@Y8tEGK!M4JPqe}-Mao{;9 zvfQz44#)-;_!KvfE*Th5$Ew0@^ZYodr}QeKB!OeL4b|hl0J?Huq!S|E%9u8c{E&jm>ay9VDtiCisoL2%MwhF6l{S&`xky{;&hSC!^pmgt50U|EvapdooibuP&Bl+yI!s@y?c z67-F-M2{}1utO4w=#&Z}bhL@Xai>#?Pb0f!B9u;`Z)k}j^g=mgl73q` z;6Z|C0~KvsbAKI_I@VtYCz33j3;zb|M?zIa5#a!z2D1=2FgVARaVz0dF8oL!&q@Jo zNDjEFBOPR6Hj-dVX{a?5A(rwm8<^{0NrF{F6>dj@_>{nznTTMn@NcmGx?;HO7+W1o zcTPnj2b2X>;a2K!YsxqNetd&X(J*opgmQsoQ-pHi7X_*djb_p7{h|z#jh0a$`B#2X z_S9pAfHBv>k7VwzV}K3g923|0MHwVt@r$C8awVK}(JuNc0V|z8%7yidvgSH0SbrTB z=6=!Z`>hyi5$}qic>a6i`6`%==4WDoX7Nm1&i^?U;~gAH0w`J3s_=KPuR4cedbSNHQ%JeyK9)$9I7 zdL2*=eS_v_nxFswlb?w|$LbsCu0oLop}4NU`&W7$X^Ca^=YL19yM8~2E^q7&(E!VY zvA-LAujuS1lAUpZwJ8XHhH6(F=ZgMrqCcBdXcSPG&TdnSw>f_P*4hsYj$-4LYyj&z)C*L~Ro5urTV+XoJo08Ha+Pu?UFq1zfayquPSrt871uyg+MG zPeD(&!q@;y+F+Th&=`z-;S9mqgzA5#KmQ8Pq^hD3Is(1scrJ=@)e0Rokq+168DNIL zPRX}MdF5Al)<)uv6U=qL>hCU&M!UC5Q507%w692TWBR)jP(XClM%Wl4ZOh}FSxA>g zbIaqLs*-?n7jryUC%IK6xRl2_0?*|!4uEud47V!5i9i~-t%`T5jCH6>VIWQMoE2!# zMs^U_JpNDdj20DroY$;+30(aJA@r&Z*3$YLa6T!0*Y{=7gd zHu3|lQ13Q{vBld2>Hh@J0CQ!E&ww@oDOwtA2|T0TjS360F(0Jb+K)^{$(-Tx)fejoMWFfe2PAA$G7p!D306DsLb3xqaF|Kn9)!qw5v*VD~WbkKe6o2?eivTV~d1h>w@T4S-X{yMN^nN5UeYGpJ*%-S#;!5lgW~!B37#3g z5$>25XakGg!G*oJf@5qMYG}-lKyk1lEhxi#Oq(RSPn*<`7Y;8R`cUAV`&ArSJaFTx zDLu+K_>n+7uE(=RXc~@$stQXsuwXcIl(Qn-P8?(b8$X(-cFk^4McAXW8*aK?vs+sW z!U1@Bs5N{?%er-S8Gg-qp`~$dpwKY$=lgMHR_E*(Zd8U@mBzavQ3KNGUTMt_g=-XD zgp1k~8iB2vZ@qa6)4ie<*dSw<#yTHf)Vpn{&cHN)J1axSHD~*uUN^1!N{TKP*$r2u zU)Zy7dRZz!UYqP*8tu?64M*?5@-B5{yt5(Fdfi~@#!2P*o}8H#=_gkVmPXsDf;e+) zvNlaBR|Rt_V!0I0|3`Rc%t(AE#*bv2iS+9$Od0~GEME&u+d$_Ot}sPoTn2`6U`7Wz zR^TaJ(5AtZBpB*2f1@DCCjUx^;mr#+MhLFfNY4L|KLgB4ruF-(e}jcI@C@2qnd*zy zSJ?Q$E|70m^%tYjdrrN$BH61Z-M>CFNETwXdY}ZoGuwt5;Ck&-fiQq1yGVk@&213F z9V!p8s7?39u#SpE_d^T1Tk}ICfgD)+&ukdNNSO|CI2JXjUL`S3V9sD2Ks6HVWJ4lS zH1>nFDV|8tEjfXuF%F;{pcz_$E{Phz`k+gRX*RSf;9$wge)9Oj<2aA_?sp?V)g{J#KhDHBbd;?%ce|Nf%MW(MM zh9j|oy`CxjtulQrV0d2ETa5gSc`}$$fM(V5)PNp!BFIKXYT%x^9n8otX1dok0ZTu- zF}%7Nyw;C|bS>xG7sa{*&%c`Y1yqydJg-Rx^Yi9uwP;k?J*V}a-3zu%uiHGW4r}Sj5bgL2(UCIQsa+fCiqvdMn>^1-i*?3{Q_RgL2 zv4BS!-7E0(Z=2Cf@XRW8tY4Ifb&Si-Jg)F(fEgXK-HKQwx@|L>V7j}WZy-fuO9->* z!ZsBw&;|Zu(K*#270S?r5{cnpT!-c;F>M3$3T|9A8NkMt5O{{r zf&CzoGl&ER7vRpi31u)s&ub7bXqL@yESy_kfKQQ`^+G#?h^yjTHf3V)!k|H94@j%| z7QpRzb+kHc9Iy=*&CupV*Sa)Mr16Q`I9$65!z$vP>r&j2t3f#$GrW&4AK#W608L}> zoYsZSg(V`JrS0+^GwN%TTpH5caWzs7iswHK&!8C@zE%^8voQGR;KIH`=+3?p*zO^4 z6Aukl=YwNtqTRub2lQ#Fo*c|RLVwDkMg3?+S9wgXLPJ!90$_xOLy$PW7}Lb z4+7FG*pHmkA(UV$HHk|F8R@pT&~RbtJI2pjEM)mOB#M}KPFw6%k!$}o%h4dPkV z**k_CFh&V{c>hSp?%B<|W;NZtb7V$&`V>PVR6A?~bplI+&_))>S=Obwd)LUSUOloj z6c0m$Rk6qx`#}gDhZpsLR~#JaxM|g-V@vw>&S^QbZaVrO4=v~d4*`XS=1df6sz3jE ze1n-^m+1#F*$Oil*~s>{B9Vn*1)=uYewL6g_RQ-937J%yiJ^1oPwCYp?V8iJdaz>c z#3~lg=9I&nZ~VjjOh||>+HFpQq(dsgJQ=2c&}>VHze7o0p9@4$o1xwC-9bZsy9!mM)T~} z>2=7=m>AYsD3Aq>5&LpRn{l9Qn_Jb+1i0(ydxevx#8ewC)OJ#mT#U?wWLjs{ES46{9K#jR*C#Px1}=PQ60i* zO7}XvpbLuh6)>ABEELaw7M__(cbFryC1iGmSA*RZVl#*`3Wx`WBi*ub=AusB;l%^< znia85obiSV7uo%0sq*I&iHD<%)s-g1CL`UpZ zD@K~7Q1+mBtn4cS!M=Iz)McHTnlvAXZzD~Tn^#X+)n}Mel7b98sEI?zidJB|v{Q}z ztO>VP^R3W|1zMsGLk70fN7{mNAP=trbQg5tPHBwe+`8P={e~4i+GSmMgH+zKerQ>z zYGtnuch>Y9kb9xdfk-1Q@1E7PXLj?66@z%%_UW}?(Z-vN9r=MZ2~IRWvl7Rjh-YF+ z`e*(PqCYq0ML=`L&;S%r%98!joeG)(3cY2h5y=^gPI(-<3sG3XOr%4L`Y=q!6d*8* z`f#&T9wP~{G3^Sk@Mi|hM*p)`kB|X`EA+Uzy~Ip`(!L_Rs5p?2Mfw^7ABp zA{0D*r2X<99T>Gb+^W*J89csh5N`pkz`7>I1B`k~QPORjhAR?WP)q@TX81;gl_Anb z9X7Tp)A!_x38_oxyO zy$E$ek2)Up6m-S@Grf*6^Zye+KT}T;*kh=dab{yNpu1+U?7job&_cVs*8tAEdZ4sh z9)$+Od5sd_76lZHmuV~Divz}>zZ(gBxH<>yg5ev9?odULlQA&~QgdB~FBIm}>!xF) z2Splf<4Zb}kToh3dDsu4yn^8~jhTKW5a<$lXVwo*(#L~oU?&Lv%$$<~lLqSD@h&ad z0k>|P(UR?tn-D#SzCrMOdhOJW6U&x$DpvMrR&=RXbgNf(tCw~tFyd)iaRS9N3+6vj zulu+BqT!D4Zxko`f^sN?E*M|XR1i7ZroqM#>l}Ye1mPPPE6NtTu`sW9%lTKt=j-^! zZ{QjHnLxTQ$O53v^W{{h`Xc3Go=joTIJC#20uG4-z79R=;N%brV<#-gGpZ`65>72k zgGL9>2I_;*H&96#)W&U|T0Ofa7p^3fyc<#Y&J3u}^s7vCFND~uMI+`+kAZ{?ahgr+jBwg&hx?DEq*X5F!S&`P9 z*#*aWJ&sef@ffu;F&!S=r7j~%NRC{{oTYh%FGuv2Gj9D6D{fuu+%HGert+Qh%KZ$s|QnJQM#jGBb&PmY-?=AUz-UdjB)Y z%zuOY41XQl42y-ipZ{0+nVxUO9tMQPU*$ZYe``N@Wuy$n^RM=Ugg^f?zG3WAVLDUT z{uH#RFhToM0_`)+%>4gteS_lJj67ezAEbE3F~@B5u_I;ZdB<1geX%7%qHnO*>-z^O ze{N3WF_F$|F^kr89upa+Xv^TSff--sLFaGKd0+pgzCrm0j->B5Mn-@=B9nxXY*4@?!O!G6&0Ll+VV4&#L_-FnN^Lh&157PZ04m&%DAU`_S9 z|Fl1a_1FD&y_@a_*(swJeS#(l+SqJ`Zb1@Eo0V}sKk2ukc>W9d`GMY?KyI?T zO#;t4)ytLvGyf`{CE*Ob)4Xhw+^y5SZGm%h{)}eW+yMJj4-7G|g>nL5vycXi3n8rp z*|T`g^S6_R;ecZX&p6ar66%m2V4oLYk1GO)$!ajF&Nxp-hWAt;b5k5_uM{|9fVnxI z4KdD`+*lA`m+x;U4|5=pM!ywWs{nXeDAy2W!ZR?h40q5(IHDB=V8&G=aM0rD@Hm`0 z!3@+@@f}KHTue=caV}cC>G%%na0i2knX`d`8x+r^>it*2Gq9TJZ*PcqT{9>=x;SBO zQy3BSkcW-X#lS`ekW0G-#}+4!w(`k+nSjaXNY~l^_I)bfgCp@fXU5cLd*lY%6G$^) z4t2ntLA^ggIDk66GN>lQ9avQf9dUAZm&|8Ib;#`6kU5C@(8?4y0%?p(>X!S=tPPpp z5IU-Wtm}}B_GpmBo$BO)ndAaB@ zoKhUnukg_coiO|vGYux`{03CMKr(v08!~zG>qD!P-I!D9nbRd)XOsqxHia%|4DFV9 zYX!{l69m#UKmR50i~(O6es(=7zptOwzIIM>aaYFIPixQb$N+|owAnE)h+CZK`r2L6 zPaaX-vpoaX`}bxcJ4yWdHb*;g#D8-#jOM>w;`R%-d^~{lbZE|kV5^X)yP>oAU49m8l5hs=^%}Ka%st z9TKEs;1=1tCdKWmM^v9Yqq(QfElT{UF!488^sG- z`H61UDegAMmnD7kghqp7P4FjMGB29UD?JJZ+GQH%t`%a#>fC&O_d2@^iHF z7muiJ-|vu4 zIpI#0pB><;h;&T#vN=2&|G`Chjz5!-#Ub1hCK>9%AF}=IG*Qk3&mY~dz!#p|oc7`w zG44Z`!+wz9`H5q>x2;Wy=30PP7Y1_)c_w&9X1;xGN`jMBn!EKRga0ot8X9vvfM;as znUz8Kv?<2}BmDtdeBoPnO3$oHE(o+QLk14vE@|ig{7TU~cS+wmC;9ey{e8PKkd5(7 z1i|wIdon?u-@72cX=$PuZ|6iD@x$b2;Q6aZRcreqz@h=^y)&Y}d0fpr3f6ILil%t} zU&eEO2(#l`))Vpe1v&EVw&~Fz5)3yEut&Q7`8j>B+BZAE4tF4QFjwF?!ZFR;_WbsY z$B*V_`PyMFu9OcE!|Brp6q_cCGJI?SOK^-$lY~FLS_C@r{WH4v?o&+A`-4#+2?NjI z8xQQwdjA3Ct!q=x@5@@=DZoScDg^k(L;JGcJTE^o8h>_U>Rab!;4Lz~Ls6`=IM8n0 zK;$=<)FtsQn34o319*OLZ`Pv+vL(S>NEuq86Dagom(A$zM`rrkvibRgd*$WHZly`CXV#{CeMt>^EQjD=#Pfpy?F9z3r#7T6 zXbyw)aRtxz!1LSZW&38w-n%FBqX(585-%g3T_Ad_=nVhUwVYB@IE&6?nu=+D^teRxrRkz9Ry^g=p>#sgbr};F1ZhKuUf?Ljh#c$_@kfdX&vo= z<9OV`6FMZ`kl?gY41Y#$ziC-w0EZLrWSPRVHs{Y^xu;enhK=P!Sd9TzA3L0r7hs3{ z3@M{a;tfVLqdYL%+Xj0>y~z2yr?uOsMghji&m?0bhhI9Bb6`#^c(^pg9!N&|HR1VK z?%A~|8SYleE|wd|N8k-e^g3J#e_qzc&+)P?46u7>f7Y9KNPuldk*0iu9Vzoa+;4?E zoEyYdN4tFUxaQ>Yq?$~RO;e)4ijlD~&m1W?-N$xr12$YG+lHd+vORXsj@dj#goMn< zabXTf$nV`Nf96y{r_={;hfgl4K_ReD#G}wRfal%AG2cI{9cc<(+|GaD7BTjQAR9!K z%MGx5@`hYw$i;2^^%I1vdn3w{TtTf-L&1LV>En4X-YT9^5d_Ba?PcAuh4BS}c95O1 z83aSVxFh4sr!=#wgZdP{Pn^jA_#tI^q8rjRBs&BsM_q>dyLZcect*FpGaQ&_@hlJJ zK64`P<=YEK>O;0n7Jl)B=EAmg?D$B2u1a?M;Ykg)s7u@UP;7pDQ9r9PNEhiy_k(|- z`A9^v8#DyGdZ+Z$hm>#JBU{=f$PHx1hcfzeI1;$sNOKtOfAXO6wL7J=>q3xzHV>=1$2c@3dYoGN(sWd3tE72LKlwIRnt5{mOQ8MK2f z@0%0*)EO}zdf`;TLBhAl$3BEy^VUeXX zeC?1|b#X3$sHsGFrR0qYc!sZSelTh-c+?(ippMKJg`k%o%!O(J9S=y(^fgK!SE}B~ z(xAlof%X7)PJkV>H3DX~-i=2Kg1C4BqzMFY&TJKp^+7q_O~G7oFxU8y9ZKPBeGrhw zx-ghw7nR9wP@YjhL|P_bHbFYZSrzW62y?)vcnD;J4dh#t{~$g?^pInywGqs0eNY$a zgv}tHpa|g_gigrJv_AOPst*!KBTJ*dI~NebPS9xKApDuR@|jeObX^d_ByFsbfeD_C zB|_%FL6ia^P-DXg472raEC5}kViMQ`n#>zl{Toi^{tW_Vf@dI>^=}{>6EHJ3jRErp zbCWrV9t&nDH0p!qcqYX`=Gbl{17X3;uxJc&{R49ez;^DhGz? zJQ+GqhH+@nekUY)sBfk%jid(tg(8wCjK%f(GsQDo^`>~Hc)nUpxl$h_!*Us09SO7kZpxo2e`ZE-1T%rMwRuqf zY+moC{F(A+mT8a$<)o{8P4#EWpDBN){Fzni z$b#}`%AYBJru_N8dOmCzCX1Sei~f#!id?`g*qmZcIj+&`1Q?d<0x;ty+6n&| zp3xpF3$qgkSr!IcNkeTE5e}Ltm*0VBmB3EPw^4@MXoZ-;h%F)7tXvE+u0Xi4@ygV7 zWj-$#?XjitZs@%tDm3^rz+4o~%vLH(aQlaTQFL7~jaP_7x5`9bWs*BHYt(FH!S#Hj zEXJWMhFc!z$bz{t-nllJSDV7CNpdBD{9KdhTovzFo#0rL}^j3L7O-{I4vxUM744LGujEu zFe@pFTO_hC7TFtwHrj9tb?BJ#IOF)-E0F#bo{^k8B@sOeQEPrkRf2O(5)WW*%=9f0 z+LXuG*QL6fAf4#al;Pc;AKaE7)R^H_CbFuIcc@R{Q9Nh;sdxs>NcSFl&n+ikc;@l* zx1Kz>Y5B-NW1}NmpMU!Ho3Fq6;`29Net!Fs88SXISP7^md_x=Us*83* zV3_&!^=@QfY4ErQ?mYedci$qW*DGY9;{an>h~*92R^D~fAw{Sq;BAg)%*)kA+TVU` z*Zwv08gs)8QH~{Xt_C5-ak##6`H4#x&(3I2sQH$-Q=Y(M(ls+3m#5)dY??Rl+~W^k zzI6XHk6gU}?8#kArd20BKu9JIbE@PU2AeEZ?!|9vtAgrzrQ}#$`Yz z`*mke9?T1{R75%x)`5je=%R^oD-5w7tSDrk#x90ii$FhgG49$ZSA;llT%I2Xq2SxG zkY+o(37#LlaF%@ejAo74Z)~e1>hfa`kUMK<_DBOcC2>4J+SuRisu9?=Nkn)P;R$#X z4VGkTB5aYUZ#l4q{Ta@mI?|LIrr}#wB)T(rPUNXV$3AxN9qbdx;_-XWmB%@=l;e6l zfA-;fc;H$fPd_5}$@RfIPL_$R8R9|t z^A+a&2l)n)bGEDedPCt&g2H{U#T&+SX5w6pvfS-K#|D%W>Rp8q%ylBz8Jgi1+∾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 literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-back-pressed.bmp b/console/installer/art/1x/btn-back-pressed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ca4ce0d5be0b72b6a34101f84e1a56a277c3c95b GIT binary patch literal 11718 zcmeI2drVVT9LL#T{;_1y#BD5-%{gHpFpa!KU_)UUh~PG(VY1;IbIEink0l^7&_C2o zaOyBwX7*r<$u<()3^+2u>5veRM|n!+)s|8yt%bIf(g(L^-_y$ojx-#xiK z_uNa*=YD^`-@QG*t?@PfZuY-mwBFc0#Q#;Q?RR1%9?D%flSDhc2K5kLVKpaC6YHb9fc zntb%oL*Oj<%ErVJma_pyURCN)QfR&^iHX(g>>Y>=4mqs58n;duH(8s<`l&bV%m= zySOj}DCqERb$RIz7f)w=xGORMFy9FEE4g%*(MX9_ZgPuI=o;?R43E0-m14U&ke;My+1$OA)Y3YjntEpDnz{QXHGFwg)_yc) zchGYyy6P%zj6QpRVoH1@v5loAB}8~VqZHRqYNSj2@bkZ5*!EW$A!9_ZK#qWNCe?k= z*tehOoXO3>(l30P3d!kZ?Noj?UG7KkMEN~$)eoIY`vCa`$sH0+*yM|T z+jeb6SghDYsV&EpqORoj0^I9 zJ1TgzuLT%K`dXBocfQNd9hS5nKbQ<()+@wXS$pfP(#Gp0WAeL82@o&EJTvTXz8&ea z3Qo6Wod+z!(>)<%9TE*5QJ_WyOzhBhmf1To0LeEsDFJsOcBALchz&6tJ#i@{sVM)| zxLRz0*A|~upCrEtg|jhsX<+iqkd248uU;Nk^+HrSNvlrU=0NyT_4eGk(Ny_swEt>& zcV|o8>Gb{E0$=KDxC!g6{}WF>7=W<3H1ybCX832g`NgLiE3S|U75ml(;c=fYO-zV~ zx`FM%KBYy4gb;*<=$Bu>1z|{4lEzyIunydmM=&13mxDZ(W3slfK}3E`)}i^bgOSi* zTfe6Gt1}E^#7ocy_s8RdePFM8KYKDY#kRDL%y&E-kty10wg-9Br#n0kJNt_PNFuWj zcGMEf=r^AoL%Ly~GjUU#z9x5H;4!DLUlP+t09^b`ku?wm5ch_~_1$%qNH?s}mu_d= z)1jZBd5eeBQ^RBzKU3TV>etF1oBd50`>aj>m!;g{pCO(5!;=cGws=)L_oLmc57pmbDYKgfPPA^nT{5LBU#i{@R literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-browse-hover.bmp b/console/installer/art/1x/btn-browse-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..88e885d3d35aba989a2a77bfe773ecff3cc685d4 GIT binary patch literal 9846 zcmeI2dr(wW9LMR8{?Hkn9)I}CMl2OAA8DW!prR-unv8;v@vRAjkHkdHd}E@855`wM zTQvxskW3H+HAPS(5J^HLwq*eULH2cb_wM7~)AzSm2v>(`8WtznowIk&J@>G~?{mMu z-}#+~&xFX{F1C*cu5S3w#kVKEFS&Ha)x~85o?q`MeQgc62quGI(xZrsS*r56i_5j~ zej1slM&@O^qS6)$84JTls(a z^!3c3YKsMi!+bzs3_yTIiaAh}s4geL=pQkIx~&&L;5h&R7AYVbGq;dQLjR2 zd>2jYQlr$tu3KaOR;fsQ6prH~aP=s#(WHHshiY7SCfwVpqO+G z-C9}L4(0nhPfRUtRj zJ)j?X4qop-KJ>;d#$PX|6y;S`G-OIZ%@@?86LfA2@Gev)}pDs^iu+_solSI?TEhJM!xfA?50ROxsj1vQCy&^Qi?_` z;4~A6ntAkJsXCAk{w2XCp@_LbkqcfF9KHw$-gwAtglO77m)R4E2_YJW5RXEX}BIwD}BWV07_4VA`(#HeX$L=NVIk;`hn zm2p0H^J=TrDlf?C`|8W*P927^VZq~5PoHec2O=3gz_sFj0iJ#~Yx3TxHK_2anvwmw zgO4a$1#KNLl8YhQ!^?Qc$;O8&>c>$XkHE0Se9*Cc=wHPcjUh}l!PrAPHoCTR$xQi? ziQ=ck=R{LJio#rv9tAq@2>F& zcQH}08Z;qO{6d4qS)nLVh(EB?t4~+uy*tdxlWVsOA_ww;)J0xr)YQR>oXg31*Dm_K z*K1MW*!7F&iJ}-5E+CGsb*4f1*#x?VC(6 zLN?Wq4SvHBmH!`yf34E5sa<4Nrw4l8PEp|9|-xuccRSF#t&Uy*rhP`&W_@5KkV+idL>8WCw#szMt^zu2KDaKov*6*&N`}56L5PBzO&JvdOIE z>3Yj4r|JC5QS%EC=^V%u7bG6vk1PoO72wg=t4|jsHldUK;1PQ^MoN637T*D`ng@yt z39?`x53^n~-lOlns5KjwEjqRL>+H*^g*ShB9{O{rg#o1NB2AEFi!-5P_BqY6}t=q;Lkx z;;8Vtsy_>9#Nl;hK0YSSSYJhxR-*>f6TqQK3T1%*-lCT6>0my#>A*iL8+Mk09%kj3 zzuOXE>V_78lF~oqe)Px&`Niea{HvFQWY-6cQcGjSu0t!{+Udu+zG~;55+7P$#S*l0 zecoP~P1fhJh2h-avFFode+OG&v_$XRA8Z^8p4=aF?l0ShQ49?#+5voOf0?%6o#zvz d^BB)MpI|%a;ymBd%=s4Q`KZT-!Jc_O>TkNwoJ;@! literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-browse-normal.bmp b/console/installer/art/1x/btn-browse-normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..578bcc5cdfe5b6a238816bad5b36faf4267a341e GIT binary patch literal 9846 zcmeI2dr(w$6vt_%neq=Er)JV3Ge}V(#lZkgAV4sM#V8PvhL@uV79g3JrjiNypc~>z`~38%n;KZ_YybZ1&&=2V zBM8yOU*U-lB~<9{01ts>b7Q^XyxB2fq3|Lz?fl)F1rQ`%ox8St7!u?UxuabyEPI%e zaLVzWw^lEB`BvUFKR1UxzFuuDkEH$mQAfY@cXNQ5Tt0e|qKm)66CVYeBQ4EMCJW~_ z*3~{NzPCbiR_TMH4Xc*MM}^l2E4w;64(|y(vUexBHXxM(9pWnbXo&fec@}!}BSR0M ztKg5!y6P$<8XJ(Pl!tN1|2BtrO&Bnq_~85~9X{E-DahLm%|pBVOcrV)LJ(RXx!R{C zCnD((VC0FYqHOt`832f;lckZnt$BG#aYuW*{+t;%ax&>?;}RIxfPU+#Y99H><%puf z>)DZC1%rvOtYpdTXD=ir;PiZ5He5RQi!vVsiPbV~)ac#e>Gb`PgAn@qdM$Kc10Og} zw7C%sy((plE)~nCYVyZNJos;M<%8802Z7ON@;+U8ISLfU#s#8^VMXp7_8W zl-`~mcyTK)=gy71bp|@#jy4AZwn6XfVy6;6lFrVp4(r`)%)H*S+Va6VY|d7zT;Da> zY;RrucQJX|RA1|2^>!M~Wpep`|E&iCyeVu_lh3$VuWqWZgC$~ZLdeiTc;bW8MhS4= z=q|8$EN+X749mEf0!kY#4Dq`kyV?)&Vdk&yuFl&9xw!6k3iB~6w=_43D$D8g_HOse z%esQDDVe-*4m|N8@5)OakWecU*4K!#(=T8=X{fCZ^mM+=jz1wmelWn$Wc>Pzz60D;3*?u;NY_;7 z6)bFgoCK-Ki4h_Di4O)JYyCH{3QA8&a$2)eDwWzA=|&wn7`(&h^zrZVvojvty$zT7 zaDQBqJn^B6TP>`xTBdbu-=`Q}^0G44uUG^W_~UT&^PQO2z6t&;bT^YMd`!5`Obv`k9<~+&BR$wdIVCB^6CaEh@aW#3g+F}FESpi{BEm2@lT4BD zMW8R1h|q{zTYid(z~T_`vuW*WXiAHVYz&uRAR_xIta;+2>=DJ%0DIe?WU8^QZfam= z9Ijx#qd%>fwXyb=4bc5wu73&yUip9ntxv{vOg4DydtAfGHsF=d*v?QC4Yy%*q~V0& z29w>ILOzr2>i_yZ;-kJlKN>tHlIi}u`uWZ%eArB<=R4}>gCqDb!9&RfIO^xi!}tu% o5!~}-Jc3uhpP-CL<^2Tp`z=T%Y-7CNLWr1m71ZxXjd(xmAB1RYa{vGU literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-browse-pressed.bmp b/console/installer/art/1x/btn-browse-pressed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a8f2830535d3da17e784f92b8f37651fd757ba52 GIT binary patch literal 9846 zcmeI2X;4#F7=~$o^hcek9s8qH>$p?_ow|#*q9}@pB3hwhwJul`mk~FdVi~k`rPXo4 ztrZ+xuwb#YDkv6o+}J@tlo*mgBA1Ymg@h26B;=mHC)bIQs?)J1wk6ETos)A9nVcu@ z_kQ2K=S~j%+RerCHwH%!yh8EnkJlS6t~k25Ov3q`ces~j00*<7)of@%V+k?I@3mw{ z>Qel*r@WfFSi_RBa4a7XfP!Q47>==xWl3w^9x%~gi*A3IVPMJ(OlcQuWmq_t4+ua3 zAZBBmg_52%o2hJ4gN$|MrY5yXEj22{Mx~@{HH8=p$MOLIC;$Xl%mzKQ)S9;!BlHxQ z$oNLNz}O({iVX|L@|6;x01#l|JO_$0)Rj{>@+xD4sH-_`NiNvo#l zoNzb-GCqI+3*f-C+xZ#Pb7)v~dGT-r1(Njsf=;Sucq@XY zdVBQxBl$QnX|Mfq!rQ&)+=(L-Vxt?Y%L&_*awOJoSpVSh!{&?|;ybio`l-Wgb3HIR zmXaOygGhlGcC1~x*x#$ZvcR+VyGOTeBBUiNCB7spjUrNsBNxxvzIG`wHL68r!lLVG z3HyU54EGw~TA2M?#Jm|%VIgXUXHZKHZ{4saWIAb6{Ga$hKdh!!R#`B9pes|6TbYwN z>cj55{H(ySgA;#wWP)Am!**|64vYx5Rw+O0TtbVK4;mBQd-@FSeE^a(sB+Vj zC8f7iqB4`R2I6^v5xwBl%c{;7RoH#&8+sa_S%Sp#<`9LJTL;B)K z2)k}U;Gr$+2_el44?+STRxbl>_&g{9CJ=FQ0u!!7U0o)?1fxyO@UpUTQ2xTNiLXsl zSW_JY@YBwy{%^b7`1K@VTPUA1M{W5)KV$p!NItad&gFB7d$uGU*nT@b`AX6;i0bz5 zXNX>AR!iXX6Wl&H8@H3R$PJ3>@Xw~eW9XHvPLiE zhtKiNPfsqodVbpQkCxA#9JBIEmTg-ZG_?~Sq^)JMd=~nB8ajP^Sm30vSw11&BNq6M zT^iuc%gKb5flpmU?mVB-mrfo+F2je%gwKyzu>c*sy_gt>Q=Mju@ULoW}n(HCF z&0!(8(oUImQZ9U`6j2LV%!if=T83H>3N1}7PW`vy3%~5coJ^EG2rekUuCgHeTmt+A z=?o6T@!1{`N{C)iko`&D_mov7Y4Q7D&OgWPobquWM9uMCn`e4@=olW#ORf%wEUn@5 z*S_`Czh6K2hBSYfwc^rS=YQOTDhTlv;OPMaiCQ)fL5GMy2Iu%dEmMc~L$=B|eI#V! z$aY2bjM46}=x^67Ilb?@+|1PS>lZp+!&QcT{ij1Mk=)CfGNkYKk>Pp`1Do|9IS?pX z)RNf9@Vtzay-}-ad=WiT+o)deDEY* zGk>xtvK0!U8Kc}#Ucy*VJ)$|5jNSd2E{C&CSO;nnxeygH9kf(&7%{2D%)K0B9CYAR zxO_ka=^j16H7P6?mnVP&$e8~+$T)G|(`a6rVO+eQ9)*NK*SWh{;(}|Ds{%R+?=J?S2tIqrL&k(20 z{dwp9&NKMf?C)R;jNYPm?hjf$|LOff=l=4Oo%CnzFVih}=kp2J{(H{z3G@*T=kqP} UVV>tb-{O2eif)oV@A;@d0a|_ib^rhX literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-cancel-hover.bmp b/console/installer/art/1x/btn-cancel-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..068909015f8b853ab1b1ce511bfbe19ce9f9315a GIT binary patch literal 11718 zcmeI2c~DhV9LMRuYRYP+(%dq`Ew=%rlGQC15ua?KNI+<^h%kt#iA#zQ=(sXA)i@T_ z$TXIkOBpU1=5qnY1vM7s!FwRGynW-{ckexY&wJQl0zGwnkC}JhoO|ZXeZO~S?&tl! zzwPj;; zB|++9A9b;>rN=;MRss|V-~bUo0hg8AeSij@CkAl=Yz*f%o2BP@rIc4R@JgX|BS3*j z0SAaEC~*Ox-3O@SIZk(Sx$e*cP9-Jym>JTk6I#y%00$nZk^&c?0Uc-3!6)_NLhZr% zlwPNv=sJjAK@3Wv^-KV8fC!)n0W_eq#z1%`uaZ&hdO0zug!cag0IE|5Xh3J3M2zQh zsS^UP0MK>CD;uehX$-Xa34$eXLC(rX z0JJb{5EwqX|5zC|^dE-2UWtYmvG#quQFnuXf7OTmQ~RpFF;o&pPt1Dj`|_5^+{MQN zmeVP^&>7X#481j&n2^V6t@cliRd4aFUoZp~Rx77`IyD{Ax;9BQ}*B1!l>d+FNL_yc=)$9&+W zRkRYGkvB_XgZ#uN4znixhGmI0m13Ufq_?gFPZ=Yrs$f~BxwdNV)Cn^ujQH{EU4&!s zU)YzVgBem`G6w12SN}YEKvr{|W7#dAW~^K^-=I~6`?$r=_UmYoMfkZ#P4jG))Np2l z$ZJw|Vl+@oZdCe@8`{xWi!q?J$Qlb)ro{&N;JlQHi z?Rnml&i-~pr)-b(_n1CzcuatoNvohbCFUye8IK_YS|v4Y4YgqSebJT^KmYJ+$v5Xp zkFQ>`FexGsM4gQxL}$UsZ_HSn85eP_;$nJ?2yk|7S`7!gc^U z{*$nPoa8vwU5W4LHxlMdONpKXbji`7fo`MH7KFmkNf{CXhS`bpJN4R)=@?M8A`*UC zuzuw8E_qoggr{U^W0^~*j^$@BZMl7O`a8pJUMkZnTjjDlI<=~3)9S>zGn`P%U4BUT zt!px-41FoW*UfYID{GQsImAB2y-0ue-5Xa0dyH;tsKLC`HAiD=CPY?!&2P-$Aoo$B z?~M=f94GRc`2Jh3rY{r`;&gM$eTD=RE)>eLEW9pl!CX+feEK-}m<^h!X;XgMw+9Xe zj2%t&$&ta;mFL?VYp0JNUVpvZY|5<*zq)U-7r8!Rr` zihR;-@C)DW%-_2$7nVrHyB0F`OST=HA5txA=>8kByZo$F40f!~TDLTzxxUtO*vpw8 zh40SafRx+Y^>w+ljt~jTykA}X6ne-IHP*|x-7sns1>|XZC_V(JVUI`%Fi5!v*oWy#f+S{A~h!^?&QJ! z@F+~ObSk0ZWvFX$CMb8s$I&`f$DM1JzsOq)3#2+eqXxkbmCf~^r7xDtZrfeX4rWNn zV7W)vAP;_c6C~M{6IwDu>RQ-^=){_urTY)qh#)*~)acur>#km;i8|epuq?V^=}cO- zzAX3vLig6k+)Cwd*<+;KfD2T46YyFeLQ&flpyT7=lfN&Z^#T0JpKrqx`hk}1?KZt_ zr9Srk|1cEJq#lE$l_5Qo!qJ{^Hfn=%AA;QNY!pY#!WsSJFzj|lk5UJEJSxvNcf?eC0hC=)Xv#nE7()*oTZpksNw8ZtJz!SYF{;+LM^e4#nQdj G68{6RmVmMV literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-cancel-normal.bmp b/console/installer/art/1x/btn-cancel-normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8ecd088a4b493a382086074e67931768a830db22 GIT binary patch literal 11718 zcmeI2e^69a6vyeGre@4)rc#m!4HZf z?)l6)_nw(|+FU<*DNQuW&j;ME+f~3lA=ZihI{W1 zbTmrZ8rW-E0)PWV00mrHbVN`oXKIRVfuTd;Nm|umBDasX+-l08NWg zMajW-sJoR`P!nvM0|9^nE0tLClS@^qIXuI-Ri+RD8qlftK`NAJc1ba0nn@^4^3forX_|?SsSH^~ z(+`d4?W@5V0*g|qBz(jop-9lHwHSEFB)gl%!u2=EbYMeg)j}QxjU6?tyt{+kG#Nb$e?I275X?e7C*qZnOH* z`H!Ga(@N$8^&=aQAqmXR_6JqpU+(H?gZU?NGqd)E%SJ~7xSYK^-NeGaKo?FBZ!18- zC;gmkGvmU51@v63%`mHhMhm(-i}~qcUR?53KirtVVnBxQBK(tz^3Uy_U&ggE3*g#& zY_{}w+Wcc>1;TT;s{?PNMX0CqxO|NK;l{i5_N$%{3VK9+0x-OIrmXUt^6$R-;>Hh^ z*$I2&gS??OQ}{DY{?BCtGK4JzV?laiTGXC<^|w;O16{0NC@svx)UE1k7LS@BiXkf~ ziol5r^vX$&861#oUuPQW>z)|m19S-?KAv`KlSBQXY0L}}q;i?8AT2R7RvoQqXHFKa zdEBJ%&;iIGgGk4HyZU-jcB-Jei?_l2w_oo{hlV6#5uEmeqWoyTSBa*2v3}c9@WXfV zGC5|;1G)AN=1=k8i~=i}Y;?CPr>y8LFOC%=7f5JL;1f33Jh|&v?XX+tvt^UF;|A=L zTUI{s4pSd z_xGlTexZQ3@x`{5X2dw0P@$mCzFQdM?`g~ok7gw83w#Z6x<4%7KtvGE>r=;%V6Ow! zqnXJEV_pZGJ2z{bEKQ^RJ$t)4aZGc}o{aEzO$goz{rF&ScN+_1j%AgKF3vfKV2t!} zbFy5K6&DU-=}{pUJ}iZBv+8OP&jAAVz^j+Pg@86ZIC$y&+0RawAfJ52blIn;O3sy@ zfF`C$zNFF8U$+!uxtO0;bSM=zmlW{xQsUrd4(3m%MFwL(M9S^-(h6kSgvj`~{Fk~~ z$e)y*1bHNiZksG9ii!>J{JHi9#*Hn<#{LhtLDuJGzus?~?Ry1$q=+~~j^}1X`+LOh z@{I82A=6He+9MS763u|^oY;UJ-G8>*KKB^hvf)nM)-}(98`c6Ql5?n`5#W034d{pD z46XmEDmOV684Eutx-dHxhs%|UuctNt*x~eym@ph74_cZ}A3p+}+tt^c*RG_-$N!Ru z-%d-E^b0X)R1BvDMFvSW2*{*Oiv@$DQfX^*6G_x(dD>!68PE@jX+Qx8%m!{VS&b>^ zlO;?YGJ>8ts5jZ*3>RW4pv?k&Ay3w6?f;sgPL?j7GRtt`Yzag5-ROKts&`=WZj^mT zKTn35Q;fW$XKO{~#Zc{pB#;4+ty$8U;Zz=_tyx0p7h5~0E5?Uv=hzxfgybBrS!y^5 SMs*z>TTA?JMby*Q68{Y_UY~OS literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-cancel-pressed.bmp b/console/installer/art/1x/btn-cancel-pressed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c41dec9fa979fd815eead74fcd1fcc1570bd7159 GIT binary patch literal 11718 zcmeI&c}x^n90zdxvoSR`X;Z3IqhhsQsPzCBFAxM3kQGlv%Arz45upu28*Qzqt)@g8 zo7xy{YVk_is%TL$)KykN1Q$7Wp|A^kvdgt6d(FOnhcPWxR#&k=vqRoa$jsXz^Wpb< z@6F85Ka@Ykqw8ljwiED4!p94rK^~sidU#~x_?;olr)vi`l*L3@jA#x*Y$}2AMyl>i zaK|Z*mTgZ7fCV@p0u;Cyx5t3iPKSe-_+P=zP>^A+$+JkyEz&Z!Jta^M91sBtTtK6& zon4X!2Sw50cb;pNJ+x_CZLM;vT5Q!w*!HA=S_~Wz0Sa6|107{CASO-xud#FMiWdq01qN+oqFNE1TkMqafx;p&xE$97T9LL3E9AJj3I!CL7v^6r<%P4jC zF)M4Coi=s7qpcBJrYF@Rwrd)gL;snTGtvQJh->duh~Q(>G$^Z!<&XGqV3f>qA*@Jy z6O?e2=oPTSQS?_;7h`KfPfbHdgFxR{iEe!k2-pE&sH#KY5u*x9#MZWdXMDz{wP$m( z)&!)^yU5XqpiK^v&5*X+gBZCO?_!$$c%Bd#RYbqys?}YHfLhM}NwnAl25`P+EBN{0VW{Ey}Dpn6@P?hHGq-M$DZWy=1OhQpxr6j+{4L zT6x#r-W2XLDK&;m99rltm@r&fb&n7O&=lf|{V54ifj%&IH$x;NuKME1qceuR4iheC zN}%_caNo&=d1rM>QRMvT3n#q0e(@ZWvKD!YL@qD*^@HI=F@0g0=EgQkt$x+)mXZfa<0fnnOlh)#VQ zeo5UJL5Pm%5GW+~)rJvV_7!OTyA=Y?VDG6UD$3g5!`nJr? z>!hO6StEufuMf>RkbxyPU{%%kh*pN425I&E{0m6-9}Z+>?b=jVT;M-xBu)|^y0G}_ zIi$Q<(Z>&v``HlVKkhyRMft%q#$o;Z&A!YC&Qwey2+Q~t0db)Vql0`m26GUTa!f1j zO%=Q=5gc!DH9q2ddk(&S<~UZ2zGL3Pjp5<+ZNN0(gzEaf4aNR9#N8SHaxQ`mahM(# zxi2{mlS@8wmg>MHOHU<8UY#5fi=N2bUC|MGg-FD|_U+zOOwd?E`i=9%>QN&q#k#1u zri5yhxRoJf@QjOeNU@5hxhyTDQ%(P_l_4b&rGGb?MO}{v4j_dRbBj$sZ4g(~6y;;t zLm%q8>3;4*Gy0Fd%GS?u$XpA2fY80+mc-d*LKXd)uYilD)5@6q1v^dsDt%nh9uS7T zx@uJ&RC{%X-kSga4SOr#N~Arz&l861JE>=L^>~yqq~A%g??zv8KhSSx8RcAGv OY%Q^?h11SziT?s(Vu}g? literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-finish-hover.bmp b/console/installer/art/1x/btn-finish-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6d452c42204eace27d3bc5e275b1a54dfae10e1a GIT binary patch literal 11718 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 G68`}v0~yBv literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-install-normal.bmp b/console/installer/art/1x/btn-install-normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c4c0fc43497ccabb5e4252269dc5f5c1648740e7 GIT binary patch literal 11718 zcmeI2X-r&I6vr{fsBvjcj9b+%)m z6eutZ6j=(imI?&zv@8}WRRN(m)Rq<)i7Ic}%+X#i!lU`x( z`at>PjLX5~-EO}l3Ah}914IA?Tw!h_02R^Db+I**aVOAO^O@Y($j{n5|0a+dOAxse zfD6!cMI5m}P2<1+m`@=%(2Zc0@TD!CxPZpKy2ijHqe{l;BeuIKVpxLA>dvFbO1BjW~~Nq@sM05a8(0%?n9TyaFvB1A2s ziT@olN!(6g^23u&ZfIgAhW>|eCIb@yA*lj^7Dw*H{G9BT zJK2(@boK&z(@k{dTqgH6CVw$$X3oKbMKNMsnH{Yhtu+*0^)>Q)-hnLv9Xjc(xm@K+ zZTPT!sFKN!MnCoCHC**8hQw+oI^^HB^9>)dB@ci+SNWXcYcK>qSM?H;y?|J$)eO?@ z1O%aJy?X2iLlw2*L&0xXb32|@2bx1z(NjkV*qnthKLV}jUQAGrw@Mv(c;M^a7n(mc zeNy3=QL0?WG+zlD7WJoo$iB`lBhUVhOFV&5C|{?H>Ix*5<{iV z;2YMV8QA_5opCcwHk#(~o;BLgLG{m{l>R!M8^mbH&_cSR4z{6_m?-1pVU3$_wOl-O z#Y1YL1%dMAN`Jk<4{kN?&de)H1HLr3zSCTK;`Y=&yOS!Y@p|C*EfG!xq5V0=Umq@`$$z2f)nE_19ffoap z|Fa9_?sBm$EBM_Tn!iWxu8`WZrLH3RUuTTdoKcLF$QCpx9he9602?k~}yQ={~H0F%y%vEB|I&TbMwPw8(^k2Nd4Mr6)# zPwi9}o=H!Cy>ws;!IHli;;a6?7wF`kYN2JL>@7tY4CyKsDbj&L*;^JUe~bp|aW^F< zv-X^>bC8f=@rwk8O1%ntfi#=Wx`kvlnR7@#(iO;eK_XxO0akX3uO1Aklq={>HzN0j z1VNGgDKju+IZ-|{^$l;lAU$?F+2Z^0CelDsYjblZy#94L0G8|+fBiHP9ui0~q2P{S z^(wN&L%>ASQd!NJ03)7};Ek8#5!6l+@!+r{xE!XH#*H?ot0$iCd<;jo6RvqplBfSD zvC;|WNBl;1^S?~MK2rIYzm8diW61>de8f*g9`kI}KBGS!V5e%3qi6Iebs!6NyH;eX z03m0iwIV3Fv1^v5Zi@e?St6xhcJ160jPNYAbEE{(uHl?K!?V|L+O@=!*649+iT?sM CrXI=w literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/btn-install-pressed.bmp b/console/installer/art/1x/btn-install-pressed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8014a8b3b69845d431db65dcbd8ad3e22f1a1f0e GIT binary patch literal 11718 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 PS>mOXa+&1{XNmsuB(dSVD@ zF-w?Vp_*T!Cx8KFaKn8Wa4t->7%Q$j2f>N}lZ?!YYewU~-~MP_Y!hXkYH>j_`i#N{ zcDBJkA544j<|8YnXl@ziMvNySEr!R9w<=iU{my9AaQJz?woUxa(~R7{+BaS*$R7M3 zbefQKYYI7@rMlqN&=ASWG`j@rL|OQ{+%x;!9PrM~0a4}xf!Gq{&`KlrI1>I{IfMz5 z_t^QS6^K|APdF%+9)~Brr&70iL^F$?a=2yn^N_$+HcSAI`y}Ekfv*Q#58eD&u-Fel WiE}gR2eeS2-vW-Q<9_>ZKmP)9P3DgP literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/page-dir.bmp b/console/installer/art/1x/page-dir.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f312928ceb52c0a71600a4962c57e18de079be35 GIT binary patch literal 686454 zcmeFZ1(X~~ey=;e&pyY`$JgF_eSN*&T`zccc87U1Od5@tr4f&qnVFfT7Be$5LyH+( z&}vC7YDvuu#r3|(=q|OS)~ugl)~fl{DU~84BLlvS{8L1B@e190{ml#JQ;dHv^Y5?! z#|tm)_=^`__=^{QZn9tait~s6?gi(clfjSQovW`1h=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz*=0iP>dUl9-i5fA|p2ocClxv#GXh=2%)fCz*LgcO7l zA|L`HAOa!)fv^vhX@DXi0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa%rCkgmmIe)TDxE1&b4%wX>ZZ}aQ`tL`;lbiK~Jn`mb z^L6sGof(+JVQ4B+xbR^pKa?n38)+Z46>5TOA1mM-<`;9?r5<}2s_E>JjaOM(J8A*$xqJD1QR3Fr3_|NKje z8nPLhxi+hCi=kUkcsd2WF7jEx4_P$Mpkg)5)T=QjwWO z)>F7-XmmxERHg|0hy)yA5)3jY5t5;HgO5Hwo^&H{g295bIl+LJ!_buG!7MnHZ^lr- zPIB_OF26FLhpNaohlMVoaZ|rjr&BUut_t|b4>j>b{h`C4&y!y{RThXK#DdeVIb%xZ zOC)*{`uNGGm}%Pigeoi|L7%-Yz!0XOTj!%uhZ+cObu(DN|OY(1b$g|+qTlr=b zU*WGA(bFF@MpLZdDtk$eQ!rpgQShOR&2(rp&6`c!e}U4f9SU`G5X9QC7sM{zbB7t85)x5}pC>Kh{>(8$C_~?Z0sn;)ho_DhfOKIF z=VqkzYu6;@VVsp|6d-d{?@qB-qkLYM&+Az|e|n>e-wf*1GC4kus`9eZ#`Wt)dD1*t z0l%M`ube$`Y~PNiRle=qsOH(DkuS(K)<)@Dxw0F~*yEm?y%Y(t2(U*pIZ#!+&K)=_+ zg+(^x;{kW)^=Mx2^66t-a_>g;oCza#tX;lu^V)Mq4=~K+2X}KaQn;2;--)?Q=TAiL zYFw#A&lcY&J-i1Yh75M)q2Hh)lDc zrzH2qos&uVfXC(cdG6eZ=B}MOw2zF(n=qH#s}@Wi)4zRFzt`>exEQjLMZv)0Y2)Wl z9%HI;ENz<3N=@w2sOHhV+oMh$yKwx_g%gL)9XojG?8(K`CrldJmoXZth(dJS6IXV+ z-{)PwWG*)`J@H}B=JgmmS201>ESR}_#D_lS~twiO1BFA$ewM3 zIyPrcP~olUOM^PMM5vm62K-xBEooY%Bz=fFbu{2Jnm0A!LC==;xgE@we(jp(WoOXg zn5c72E0?VO?Z=x}EaWPt#QMc^CJ*iF&NI`1PBL(NXE|h&jOx|#*0oEpa_3~&u^-;O zbx4=id$(@by`e69s$tiLRU9Hfx;3diX-FT^d6{Ya zwysrS``V=m58|TEoE*`kL%+6-$-H^>V(E8Zx*c=HskR8!VA}G!(h?u+*|c_ej}G5` z{XzThtKYbCk>_#8y5+S>d{q9!*LJR7NrOrE@0>XjnVXgIec3O^_UkrraG!3?>L%Q~ zwP5ntW>rhio-i`{;u!{2B!46Qg24#`dkpE^ilHM;VxupA_WPfI^Tu!cv}xSDdYPtG zOEI*L^{ZF<lo*WZq;SM6n z%fA0ICEL`l)VgK`zVyFcy{ctDc%^HT+LWYN;{7}DCv895Rxhpa;cGW8pWm}({p4Z& zzAy6yeLi(?Z{<(l0?4&X7XY(#P8ipGaklbn$F@c#BSOW_79 z?3}36$2-*jjz%w?J;8-WHF#W{8s4LQxes0$*}HRGY>e$N4f%XN6i|(?KbSdwBzJkj zz@D?lkKo#!>sC+(>{dz5oiKvFwX0jXZJo*_4)5B^(58(V^xfCRY7{TlyH&%i^c3!U zW?BlFJW92{{RCBY%se2b160CY^LxFk=1!kKX%vqD58D0PH(FFL%jMLW^x&T9q~ABV zQ_G2idggaq+Cc>VOaz=~(8P!kL5(UDNA4jjtXEEE?A434N_@YZuSph9FT(yz#pNw<3s}@Z~GN8b6>r20X>6GgN;lVL14G zcVeypAulU~s*IZO`{Hh0=W)i)DtViDqN&csn8 zdv%;JxHrkts6f0m!GYeGd2F+ZEW~vRZAV%zJYv1)4YgLU%dQFZk#!M z+*qYoW<&uWLaEB<@2r?T+3)vfrzQJ*-iRT+Q4I)5L>s-r9>xr=U+ydTQBUE|fgPKG zX>+*h+qYiq-n`!I@x#|HoHc9QFg!>4&snVT@5_9NMkbA-pFe3d3H-#RGb2dM8aouR zS^dlRj_upYA#(D$JbJv=M)e?*V=ndxbL+cdJ) zm+`){(wS`LDu@&{Cqt7{2@&`&CE$oz<85Hv3daogwN9AyRs(mlAVqnYrZV_5;k!nA}3?}cO#xKq+8oE@BfiVf^7(aLjfz?5+B@KF?Skv?~%Pb)-0IOr%fZuteiWo zf4iohJYz^d4cX{8M`&Y4lAvj%6A3;Ead#?x@@AA1Swe3TnISsloH0=X%i;8)eGF~a z#x>hkEg?)%yW}Sboc-H35pTisGFk??jd|>GVP@}KZwyqTCH&Ma_1UsnlSp6^&lx`) zESV{ZxB#@cf9rY_E9C)e$~&y-QyEr!29=F@{RR|SKZ@o00K=6A-J z!Ba-`&p#yAfxnQPQ2opIQCLf6L@b&*9tpf~%D82-r=r?=wD{hX4EPAmaqF>)xxbY@ zc^i#@7Q>5yC+L_?*Q3sHANOor-L`IJbP%(PIG)dICJAG-c7=&S8Gj*&Uf_}fy9Q zkEIQSj7dNKp@&Y)*#uauAZ=c)OvCbDC&inX#@(CIjDjATi_C)-KnAv{T@h1ubldzELP`e@k0fdP)cX5YT&7Fp!W&L8NHwwZmD+Gg) zTh|wV{kP26)-}sBy%Xc^G^&jV_op8oLqkZr3HjPW>!fqZzMX zI_JPK(rj?&R(62#cWzRc=tOd20&AlvQ_kW>5wkM)t0<3v9-1}iXD9`zV*HQk*A-D; z=Dk1A%EZCF2yG!?xzQ2B`i<<_;qn=?iUboZaGHDKL-ed;gYU>hZu2`oVl-|7QGH}S zgb-^;$Xy#&l0ap!3{4qs3hNXkHZGfw!JL+qK*VP9u)e5Q>lS5aq_QSL{Df&^m=yY8 zz;n}WM$&`3rk;TB$nLE@ThynC-mM!FXiAEI7=P~;-YXs`CFwunopo&r?Af&XcYpl? zt}gj&7tV}6e;WJ8NPEBk>ba9lJo0Z`zQ8)#xB)#T4e4#-Y5lu%c$0-H#}cseflDY! zbA$v**oS3a#AqD1?k(yMXx|j`3GL4*wk5EbLIQ0_tPcXY*_k{P*0p3B5A4{SvveCp zM#8B%Kv;F#nx!0~SQrK2GA4#?TE8OjXCZ(jaVDhsIkam_hwrOqXQta=5jmJ}*xMvn z+Uwu8i76Be66NM$$4Vzaii7a=tG`ChAig-2la)^B__LROj?w6G=i$+_Vaen1w69l{ zJvo}SZBLbZ2pTw?sU-dj8GMyth6M?!gC!8T#)H(F9{Cr z((2yLXs1+g!_s-^&4tq@qD*m5a5oqfd%zG}KcE+IJ)Fw}ZEIH|?nD~n)-Hx36$v}w zroqVZ6!Q1m&j$M(kLW+xRlkqa5%%rQe9MO3BkIDL3O!Jp&%c3|Z)pOK|ZV4lPV<-XjvZ4(AFnZz-8 z7_nd@hW48^b{NkKn==WOvz&@X`0%&?fc=SN#wcQajrBwXHLaM%G-nl?@}=H=iG0L( z$+usuP8_L9Ne+3UZ5#>VhG$W~+?VNy(8oXc_|}{@JAYzhc#cqHY>_Hg>=nZAIoVn4 zQK6N@xLc(Q((UI6ARbvCP3hP|?w&5V(SW-ejzg5|}fv!-4+c@(4s($5?_ zT(9&O*s&;C0tjgd4~RDW8}veu=mZiK(MoT#Qj^eygzShT-Da~T0yW!gwnR+%pRu3n z>4}6lK@S;h-BO>X#5>WIU~uZl0hr1LbHJ>I)3=PIcy^%C`Tg5A?Af#i$;Nh5f@8RE z)@{Kh!4m`mVi^HTunPjo3Gr+<;){dBDQpRazOLJQwm1rg51HXBZ)5_`*t zKH)HOh#p4^-!+TBepYe`OL93)r6fMwv1VD*%HQHOOd8r}XxG-53bc;T!lWJAtqnBL zynwZ{!Z0c1FObHTVA6uum1XwS^=eh0Wp@(zs#JLM+LimUCXz`3tA^Nci>8}DX$*Ih ze2~%>wgL6?WnUSNB>7A;LQMFxq!mYcdiE;kMx%lh9A*#@_ zW_g@hLPk8f)>@9-wgJ(E$xZZoOy91Unuu{5M`8}=fAW_>g9NTAQ;_@E|0XWY_NUG* z7fqW$;D~RBdR37IHjPJs0H*+bLoeWfvm2I35yFso3m$sHgZn&pp*>5)8HRLiZ5!CU zViAvCsIhxDu40CnMMGy(&B?=&tY}~g+5!j!qCKI)MFw7oa#Mhi5fKj(CTL9fI4c9o z5XroH!Axp)wvePEDyw|<&d&9#T-ljuB39VP^zYHGZj~O*>fs78inUATv%`~aw3%0O5jjF z306+Afh&LdHXB^A8SoLiJXN+-wv$TgY&) z@HbKSXkmO4I|o+InTi&pLMAiYXj#m{u;-9hQ3znJTQqyk!kOz9&&Fvb^U-cDPo8lM zJ?_43o1pScfBar{d||^_hl^Iq7kiChCTB+X?t~v|%Gi&6z0T`qCo0?IIyI@;Tj{qPOdSrPazCE!e9KjIFP3`OvSv`1!AfPEm? z_Uw&u3Y#B73T!LQ%_#^7`+Y3@AtC#;Z9@D3$w^4uv78&3-?oi0yys0Eh1ld;l*_95 z({Ug8Vr_0+y~L*Rulu)eMgfEvBDiy-8oUZY@EOk<_neRsks{h%IC(6VGsRd%MczgX z>(4ez-nT-?VCk`=123j~^SYEozu>|kbvLhEM0A%>bMMxTh>$m~_zh9|E{$umG-=|` z{zoq{g;3jTp;5E=hxj1IqIHaO+KrAn$6gmK-Z?#^wea6 z5`-5H?cR=mK^P(G%qe$vIwg%>4tSI9-~Q-#|Hp2iwR!=k16Vc;n0!8 ziYEZ?-Ha*q&hI-lsJ?Tw z+#0!aOWo3+WBec3wT%^avtsM_Fca_!n^gLiC40hgxJcLxXgXd!Ak0orxIx)zNo+hI zqR98b?dvSoxbpG{_YLdTmIS*-aj~#|d0mm%kuf&DD@&txmv8UZ4JHli4?to;Ihkq5 zTlOBH8geqzO^D3w>O>_KeA$7qE+m|#m}|kmvwIbsSqQ?n63n0~IgEatXC@zY5z9P+xH6VNa(-U5Nvd6qq{ zT+B19edG^YTQS~vWQ>&adE#QP@g{|{_&bs4!F#{_JCxDV*;5ux8HWXkY03sv#16u3 z``YDrBI}pTxqagrZa$VFCS`2QRg6r8n^~(Z_=6RN;ajVi{rN;cJT4Pe;A{7~WTYk& zMEc~#eqbo~m&Cs16e1lIB-mjEF+2_&0qUV464>W-6`_aP zVZ8ie%^ujXk%S3x`@9!V943~+sGWFGE_N*94rzuk!OMg5!JS(Oso4q(cfP1}{(Awu zHVDrYX9pJ@!;QkXBEiS>${~+Ue)h=zi>FTzU_ovZf8&rBpC8`2VQyl;&sEF^mV3|| zME>noTUOz%QnUSm3w08(;ubi!-Za5XV{O``oR3}M0y26$EjfV@7BdQgPi%)T2^<7= zE)hoK#WYsQaa2(R_F9&AIn1w!J{4@>;fBxw@)5IUbFT@@INOX(+&(K{-hDpBl*75; z{dd%NpEga1pkjOUYSplN(>js7Ys2ejdHFknym>kJGD~Jm za(b)HNPnKqnV~791R)3l$i#cGC)rDBURB1_EA;1*Of<%MYk>KGX{vh1@)Nn zj-!G6EKp4O9vO#bq(->WL&p;-=%i5%j&*9s!tb*>|8%~IPWZe8rtESy>V{AvLqHgs zy|RvOvR66nnx@&JjA0*Y3;AXXa1}H{U!*02W!;uI3<;~*&9BeLkl8OvCR!d*%zh-M z5b~A3BVh{U|2d8zi$46-6keY>ckBRPwmtL3mf%lnn11GEV|DPp7?(4yUIV|`aP$7UYwgk*= zviHSVQ_jbd|3{6uS@<}GK860+5$)O&_D1L5cPGo7a{dkmD=FaRFx0LRBJgJAoRRgzne^~EMsQ#aG9mm{6mxPY__*`nzJYo^Ys~x zV-q&#i4K@^Vx!^)x?g`XPI2o~p?X&QB&DTKDoB!>%)IqGxMdE2y8gW2<+|1I=K z&uoFGex24C=OcY&l!%EiIL0vbJaLJ`C;x|2PRjiGK}s57`;^Q^fNRQ%pbCQ zG%=pI!~y=;pY1Jt3qnk&!EB8#_&!mI^}%gs;mh-jIRkgnPtK?(>d~PH{5S*<;Gwzw z!!0uNkwu}xc6yWZ#8u>n$~RQ;bK&a zG%K8A(?)(4(t{iV&7QJW>(iI~$T^1m<30b6Bg!A(GnhP9|1)lJ2&Mt}_}5m>G_&7O zN%9}7`6>BN$!8TPT*;5j|5?pFaZ{dEO!*=p0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+VL-s=$|-Ub&&n^da9Cs(%^@s?ma9>S zfC&6V2zc|d`4%3mH#f_hmqpIgr;zjZtS8qLu-||uFX;D>HfQs)L%M);(Ce~?_LL_# z^NF^&imIN-^yOtcC9^_R`CQ~YSuE6nP{Nj{KcSp|dxAzOObxaYlPJJKnjX?6`e4u6 zlD12s95QK|OivCaGtIA)D6$Wa3fN+y!j6WePKUr__r=M4)PYd7TafY)a7Tfi+3p_HEV z&{XC3n6rMbt&OBBJDp2RRX(>l<$RD@RuLehLamtE^3_UyyG~g@`4kHV1NK@|>{(w| zPQdAdt@epx&r%jPpI@5b5~rVj2aBJPm>h$MbipU!wL&=5C94x{b52(aN*4T2*6%j@(GJiIQ-)Dv%>P(QvyDZ5rcui`o(jqeffT~YNg_0V@@C1m;B%^ zmjna81(U~o`_@Z~rjF<6#^npGYgL>wtY7qn)8;Iv5ope5;nZ=oJGys! zgK}R_7}U$M^5+ZiU`9$JEp}>HBRx6Z=gy&TJJv3n7cna7{+-SZYsOx?3@CR_2EW_a zF7MO25#!yte#P=xletHMfRCZ|YFU5d@&$LUM;k5Rb&u)WmCj$kbiRADx}XE#(^Qos z0wVAeA%H!P^k`eB@~-tO_iSEQ>65nxb!v$iK~{8cR%V;Ymm8MM za|BK%iU2{qea*6+>sOX|<9Emz1P-bJQJI{WfG|gFBBn~b`Qn9>M-i%JKX~Qr(Syya zmCjB}PEStQy=l$x9v!~>`h)i0SHE%PA~x!db<1m&_^AAcuTdd}EAs8kk;vSvjPJ{S zIksQ7iG%xeYgQMDx?u9yW>rhio-i`{;u)V~13!J6&|Gv9Njs!-D+DGo->Lwczk9=~ z@5_8afskH6h8w*Q47RCN@$AvaoQ%|Zr9bDoBfGbDtY1AV6E)Foc#rlJ$VpGWarykY zcWXSiR7>QBCV9xN@>Od|wr-xM%b4ksE%W2^QHh*Dqc8>Xl#Z z-)bBRBV%o(C>W$LLW#^!bOPD3VX4s|`?jn{_?Le74+nQ_;t&J=!R;HSWWi_psKLd4 z{l99L{Iq`AFIUc+;rE!J3QFhN#WQpX+ZC}^;8p~26TW=qSK|kC_jyf_sz_&n)rX+p zcPHjbtr8#SWn~1sZYTI-w15ec1cUpxtZQ1e6bYjj9K+rTc4cEmBOWiDIE=r5w4}g^ z$X#8V)Fy$H9@V=O3Aa^wC2~y!pGmo7ZyIe4Mov6D-QhZcy&4 zaRa(9nK>CJ2uBIYKY!Bb@*lo_I|gGuaA@b2x}`p^`o+5_lm~Zi+N-0_oofGmRh#A) zqn+Qas}`L-cF^t0>(Q)k?^X>qE}M_SO?(iye#t!RdPJW;<@31KEt)-~OKW@W)eEO< z7XPqso2IDR`vt&P&6_@T!~k0$D>bo6m68BNo8u4C2b1sj1ZXlV9dsxQFcwMpr|?i{ zj3V$8C%~E}!hwjy{;lhg1Oz3J5Y@kWzs!4obVP-V0w8i{o1g?1Z^^fRpB#T54}!&l zwF_ruXQUDFKvr}1^x=KOd$c=oa4!OOkFinB2Up^ipZ$-0Th@_Aj!_lT#+8$C>d?Ni z{kt`-TyjXawq@S`BLOH1pl)o`-G*5bAKY6pcN(FpBYStOSumqdn?{sbId@wBc1=Bb zIVh2*@0|%}1%oq24<-~tg5jhl+^1utDU9&nw|Q-o%HMM6jElIsFZtm;pUX&K!e}jP zl&14)dM`d_!U(IBd$(>lWAq@(!>!8a@5IGkbFK|m`{G@zZHWl2Suk_=##Q~> z8}V+HI6=IBeBlL}BL_E!U${*lHE8CTp(vO5yRo#DnVj(8_RTN;_zN_9+^rkjQ#Wfs z!60{Y=I9|L>~NljtQ-*#fv_gPx~Exl?AYKt^a2Tj_7_hcA>h-fLh&8zRv@24@dO*M zM))B7DT(B-^vRp9yd2D66MAAf;Pf%9Xo5)Jyz#rbr9KDGuOvCbDC&fP?^X|>)GVi~9@1`U1%-O)HgL~W5uGp_#lhJ*ssV}u~M;9!|#xpPAJ_IbLo7U_g+SL=4BgyfjAQG zfZy-8);KnHyE>JzjafU0K7X2aiC-Pvv(5N8J2ziCeH^a=>3Tit92PsL2pRQm-Kc4m zQpI2Y4FVkBs#nVf3=mu#j_lRZuI&P?LHV!oo2HByILTRGm^!>a=m;p85S>vUIfT?q zV9gQQ_ikKGihoF4u5qOjBv_pxB4?vpcu7m9PoU>0xw@r4W4(iMaa%C>=^NSf4OUC0 z8>fb_(&aP9$t386qQT+9l`yK`(F3YmQjUtn(5wvL-#!06Q7s$r2=919FCNG-IbQQ4|6= zF;Qm-4c&{4saxvPizf~Tg2CmpC--XAfD1#BB~0A$1A5G!Fd}mMM&#k_@xzbo-d6p~ z_p&q7SrkZ(k4tzEhlIrXy>;!<-$8R zV_5s>+PGF0<>KSg5+4u-NyTS*#-15uCT9PYvnS}0aUcBN%(N6VMTHMvOHGPDzHcWI zn^UgbY(`r9+fU+d--N*Yh*3ab#d%b(j;t3`1F8f$kFXulvjah`n^!Lqy}y0!60xSM z7tasw+!8$%b@mi;IOgIReu;OnEMk_1eQt>1bP(z}d*bM+Lwim}?mBn!So5l-p+VD* z^JVrmp&ZTjtzcly!kN>@4DH{pS;bG@oD(s6+Q@+@S)a#j+@hg5k*qI&>e_G68+jXj&znG zNF(jHt~6_)M2a$##&e(jp!AJHWYV+x?5SnWlAUOasq1%asCv~meydA9m+)^6rxrJzp9 zPx`iN_T5(>0IE;h#w;awY*4*dtNQpvPLL;X^57n}OD&u_9<{<=qlh7WCJpUNVp#Wf zjD<|dvnYT~UiST$@i@*OJ4l@@5X>1rqDiF^tp2kC&Xy+{CB(;~K=}_}ZC$fsv#O=I zBk;k?Xi>c^fj)GHDdF>8k2=fBOR0BWvY{ldC6dO~+g2~(63UQXF=r~7taJmJk=FRS z*vOt8+5R+j^bpqB#}Dj58Dd=gQY`?%2+YE4l@{z?pNEHN+E0@T|(LLLb?cH(maAe!sl@Qk#P910G>gl705L}Ha zeuF$Yck}=TYKQNuv-=2pwN35HZR=KHJpxm1H^_f##*w*r=H$L@o2Cr!hbkd~xVse{#hUWd zg3C&H_K0#7ArTu1A-H6hj2BNE|MJiNlIRM%MiKb*nW1rt77y>GW5ck0@g+S)kwJ353$lxZBAjEXpaZ*klG^;T4CXHD*Wh|l| z1D;-(mzkCvA4k-v<~JX$TRa;es48&aL(y(-P7dN4JwlzHoGc2n zL_+I0P{?y9af=q&;A%%_bumFXVs~7ErfXKM^yM?hd_Fe8CIJ7zZL`scy#XjS0!Iv- zxlKN0$>+0WjG9DqLh7$;Q$N3K0&XBzusIozE+HY_=g03=Zqow$`^F=U2j72Co}9+kOaS z(dV^`=S~|r;J}W}>`=vkUp8wBBASH;HulguX7}hmomqyC7}~G$r*E;cFkx_?N*}*D zuw#qygL;*C>qXw_pyr+HmJ^6OxNGa|al^K)UC!oP7JLux-o9?p93n!|7tT1Inz7-V zS1+5JnM&WF#LFNYmM``yYta01Ed>blA=QCQe^>*;G2x4M#(kMQtS^Ec>?l?)toYIE z)xLa>yMrr-a>*ZHFi2!+%gRL@va1R`#h~U#jHX3;)x3Hc_SxdLkVauqCXdbpgT&43 zO>vgy^&*1^h`>*dfX8|J2{(ZyjSy-3Bz6~7^P(xq{2q9|nY z3bNU2`uH1I_F97QY}CYBCKy66Kl#BuzS!7!C=c)5LaDKnDmft@3!F?7;Sc!f72s1m`RpB5jpt7pkA$2tW=OxbO{`OpnUa8Gb>`S1Jfmf^CZ9QakO8ucd+KoH zm2)TTlKPM?t!9iFoROMLxQxA9K;z9akK2Vx;{86HBXj{gX_u7_w$!q4Ky(N)cW*>< z7f7s_J%#ul2^<=HE1WMZc?QBSg;{GryxYyRtk>W{M4dg!l0>Hl-(9_MmfKgmh zbkl)d+pzpc^yolEyuV=AuTe26598SK#9N2>Xw=3jyd=utH}Rqz%jogQG`c$p^ROTJzLZ# z)`V0+GMlei-t{17uvA-AFH`dE7um71YQe1A*DkZTj6~&a2zHsWd5Ik_tctSYNk|9n z!&dzFe))H}4@+lHSu}-x{^NMDn&=j<`Vv~<^)W(8>zB;AedF5AYgbsDB@!MRbM@-^ zQx9%k514(bMFhZ2XM#aOH$;=X9`~(lmx(`Owo?@mv$l1s4(!mJDAxU3HxBLEOn-pG@4Cfv*suy89D#Dh zUS$hb)z99sE7bJr+J)0#N9^<7H?7m#nd3$P$1DLjp&si8t)4$~K!@h!&^??!TItrL zHos_rwF_sHzk2=*)`pX6Neo5p*^G1&zGiu1#vOMb_5*Q<(o6 zqX>vVkp!$DMcT8sAA#`XhxNz2Y^+BV#PR)RV|xd&h=&xe5JAmZq#}P^0TY@C z1|cboWTN7{&TJNceP%_#M0E;2?1mb^U!{2b!MB|v(u8yVX`^I0;fe58jkPZxpUnLWagfY zt7w$?3<(bDJg?)ioPpzmbX_%X8f()mI$*SufCdU>^}OjzW<;>!Z1y7sgR{mBvoE`u zo&p40%O!mIBN!;YOQ(+-Pf#n)&z@S(nsUk)f$$^Xh%d7%o|hDeDif9ueK}>uYvh|* zrsNP|#kWWZX2HU|fRMkSi45clyD(}i;g=c^WzIL#s3b=UndY2KawubLV4ph_CgKua zWOjbdpB^&1jQ+${8PjKan_m^(DEwv96yHz|e;~+_1BC?XQ%N>$LcrN=_0+k?GMrTp zN;-d3Hb2ajW7UD}w(Yq?$!Ge&-%2X7+CaYIb4oteMChPscgbTq+bybfu9ZmgzygwTh4|A^$%d77=p+Od6PzfbK&EjMd8a$ zfuhW_XXO`JxX4UL9vYv*cH>#UjwCn57@d)&MSb%-^GKsvz4qj9h|d$9w@p9M$xwd` zpU0bqUf~)n%qM+@tJ(XXBJJ%k1oH9>j+Eb<>r`Xe#gz`PPnbcqp^(z7* zAOa%rV-s-Y1cUxyFc|RU8F^kvZX=(AL0{1C@w*+>KuN!clKdjoJvo_HwsRHN+8S)< zZ5dlFn#Jk@Q?qF+81%X+mS0J37MD{XUrkWJ>oR4yxIoJ&Ap#;G0wVCE5kMLTe4f~= z7tb9%=yzm0`T>u?Xaq+-$KSn~{P14D>n79d&Wpcu^U%)CsR{S3=tg)W(j6I|cj@%8 zysWf<*G1=du3M3C@7B#L7fv7A=adW}{2evnKXq_#W=cZP=gvrur>%l|j8-z8p^dEc zg;U3EUA2TVKN<%$BmyEJ0wQ1u7%ScD>D#vPJ3s&1vhTkirQtJ8W6G zm;yd`E;_~QcD1cj`Ga5o?Bjp^M>L30Qh5p}HSwVhHgO>qS(_t>{Zfc5iw0fB$7d-0ePX8kxeuAknHHhl5%X z0TB=Z5eN|odd=zppBtAiR{P@J-~8nZFaP~tjOp7YKJKo`4R`}y4}QdmUL6}&`1%JBXfDTxUD^T!V2MARr=?7;Sorw;8K+@*EI;9ej7?*Dx8 z$6w$DL=5hYnz(l1bSQ$8>eER!;dhH+ns$8*GYnJ%9R*8=ZKvn$s%|ko4q{QE^`0*RxzWJ|f z7tLbT;OO4%i>61g5>f0o|9kGl5v(|zKYobX*qdZ)?$)f%m_9}U@ws^N$cMlEhgh?~ z5s*fBbdR(zO9Vtf1b!?6X8(`RllXrViS=CZYXH8i-XX?Uf69_uB_^vGO096g{+_G`ylAr(KpK&D` zRxB}oV9!m<7ZiW}H+h+<>_nn~1fvLufCz}dk4(U9F%9@*qoZ1WSFUlTZ(7tSU;e|_ z5a}5I4a$8*K&j<-Ws&MlDwn(+bLGs@1CxjL^SE8TTQwNhzZ;u~O1=A1qYB?NuU5KY zh2phKe%z*Z#jMmMWIhq3H~;TnfAPm(5@Kpsw+d&6b#LFleX|igJ68Yl{l0A)qdVBM zv}o$MQN25{h%jyBz~SB7tzI~L%835ezI=}jO(wLJSH# zbrzc+aeeaO9<~FWJsL^c**FyBErV#YOzbEAQ>(-$6+e3Y>(_q6D)a3dF>FTKy>T@z z#>_E84(!@?WcOBARyx*$-$oU`X;P(R>39FYhSg?O zOSi675kKVws~b+l=~0KJAVfd}L_h@oO9?o70hwRn!`BH45$z{@)Ukf`ZcS=8s!+T^ z`L7#Q{+9O(%6;&PJ0~OH_agu2Paex6GT&aU8dU!DZI+>N4Jv)|W}T9sRQc>}-g>(g zb9G+CsIu?B(!X8P$n6`C?%#tK!0yu%hxYew-LPxpT1WQnN_rS~{qhC2Dn$(GGjVV) zz7q!Zj2POle6d$~$6?0UVQhbGSibnRsPnvYr-cToMG+7I5%`e_u=>1r)0*Y8Coi2b zamBnDY(V|pU%xPQ#DEoZr!Sou!Ddu~MSgc)MoLnZ&)*?r#QMUZPA$%!I1;&S!=6oR z*qAhD+_1xYckbW1J~ckhIu51Y`Mr6m`N3VbD&Yc92Bq`$tH1u@6cCf^6s4B%HsPYIB}7 zw1CI_%{_CiqdT5eO!*=p0wN#+KPCYy#*1u`Q{Y z;6I5#_VcV4@_>+f`%>!dDCd`iz9Jw3A|L|)5dub>B3k{=sn_6f^unzuZ%(?;C9gqF zlL&}_2>izgxUvzaskfqxULZd2&VByARxhC1T-koFOREebAOa#F0{{EgCT_L?9#YIKm?vg0%0Ij!(a%{)i4-BxXvz(O9VvVc_a`9 zLNyGA@I1~O^;rZ&AY2KAflv*DA%yGf(zrxG1fE9%VIWk)U+I6FL_h?dM*?9WRKs8h&*RKdpG80f!j(W62-PqcLb%Q@jY|YX;CUnv20}FqhVVSj z9Q9cQL?B!Vgn>{EgCT_L?9#YIKm?vg0%0Ij!(a%{)i4-BxXvz( zO9VvVc_a`9LNyGA@I1~O^;rZ&AY2KAflv*DA%yGf(zrxG1fE9%VIWk)UkmAxUvzaskfr2;d#{y?mRk=YD>Kx<@}P+R|G^r1VrFJLcoYqqZi!Ir@!F% zIKDi23UZW0KmY zKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmY zKmYKmYKmYKmYKmYKmYKmYKmYKmYKmhTos-9;r^Se;KmT1LLI8j zBpySZV}@x4{^YI6zobxAR0n9iFsp)rJl6B4GnFF(KQRJ1!GJdy^doUY314?Ndn&6n0AHP{64$H|Y1|f63wN90ojjCgJl~iRaWA zbUwa4N4=e!=BNgwiY1ZKnxZAz?EM*YH@{m6KoCT;=7IQ(J(J z6$WC5?3{h9GX>@8WB!O9tK8|f=}$0VO41*A7Ls^DuiFlU0s)UJB;p)~rXvjh3Dsaw z!-T2=UZ;FcFz9oNdYzh`8%m3&t!H+rpp*ZGd+I2id=!OxZiZu8F_WR7w$MGYbHEJw zsV}|tJ8ZM)eBm!M${Dqpinelosl0Ig!GJSTpXX7gnH~WSy}4O*l1j{PZkDORVQxEM z8glyS++1^o%{NUrYTYE5Ii@zax*pYE#1NhylyXEMdzYp8*o!ZMRbl?pvMnQ_-I z(~#edgv{me`uP(v=TF$?$l-hA!l{S1u9?e`22`4ro{{u0GdZ3w36qJ0EJA!)CE`wv zzektoNmAS`zsE)8ccU-nrYD=B1$@wOsx=ac1guPsCl7jj5kXN$_n(Q}k^1l+Jv8d_ zF*DUDshspA`b+`>S*ZzukXZBN<)kI$Wu{Tv?W^bAIT2{$gDx^?9ow}8Wt zm|~1~qA%uUq^2j{Pr4Uty5w=urBi#iB;38p?V|uUG&?O3!VHST(6w~F@YnSJ-*8VI zSxq~pDdf2svNJuee0JNJg`O{ zUOXN-x>KWFtL9^NA-H&aax>G$cW*vzK*!ZH#%y0U>p^TZnU_u+T2g&zVEI(KqzbBWYadwh~pK7prHEy?6c6&J}a7 zo;vLJy0{}M&P@t1{P;UJj_umCU`+p&(?+4%3=rc57`c2payv9; z59>}zlf!?;$TvekM+5@i2eDTfIQeHHx6K;bohIxl3ND>Ef;$8rsYA+n#vtiz(DSg|a2sn&7x^MTY z1@~eut(`TVLnjzjAhaKi9Zvzb?uYK_tYO_5H8*|xve~EhZM}E>vLi4(T*a{6IhiY` zjgIKudiUxD%%V^y88W9Y9gCbfxC^}vDPYs%yDaGj$1Kx;Q@}Iw%D^xlD`+Jz6k-_HSIiciobG z>z42vxoO4vIT4flwlh=6(co839X8q|7(9D$*ZR2;bRah~)hHdhdi=o3sUx#e;u-0h zS>v`Yowa7>Sd5t;P^tFj>Q@B9mw-_XJcifKome+#B2x7Hk-gW>pO`+d6JqE1?oD}F z=@f{+bA8i-$+x4Ukj7^Z>`c6W_xP@jcVjN`h)wL->fVj32mr_8GNLB>%n@W4;>}83 za(L=59NtTUsu1ob~ zI1&S~Ne(6XlCxlRU+jDm01Sqh6tu~}Kj-!qr7}@^&=(EQVr*xGf zGz4A-YnUK!9iI-_h;zYNgf=1(KgHB$AdkItJdy( zmeF50wU z3OO927pC^_z({wloQM9}zI+b9J6FwTqRtx9&Cv@kOq4aV#!u|olKQRX!zHfFw7l$$ zh2sX0W}dtAa*u9bclO{;s=ag~5@X4<_?YYWv~E?72!t&GBfZTM1Eyp8vPr{w)-64_ zWzAE2w-Wy#(>(7U7txQihj#H;jqTEer;>a=Jb)N`n-@*vxi;2U(0~5WZaj26ajaYl z5DejoJAGj1?BPAoAgA{4K#=mtBdL&+u|y1rspn?$bZ4a`qKOFI+=;%hXASjZqPvKM zWF$YtRzzhWsQo@KB9Rt-9uHxe`J?+H0Ifkth4V-DzJB2(6`~+GOY1gpL?ZgkQ6x51 z($M4L(O9;04B?5L=?GP46(ATy+$|b6fU{Rl9>Nj8ks(dfCgA3XBYx>E0+X>H-oAFv znuUny1DjSH-MQi5rWND5H8WultkVNK@sCh#r~^k!2I(a7(36WF;YWS!->{5gXaNR7 zf`Hh#ZcVfCn|yAh894~9sAKy{AfoSFy^xcUid?;Y^#Xv%jNGscrMYX(qMfVgKuaVW znUqCOQ8PyM#`%*uMj#g+xFJKR>QCKMOae!78&{DJ>IqSw^x*E9{oCe@MUUvRb6m*DfF0x(1hl9DKc%Q$~=$ zP~rY2+`ZxRdZLc+UpdV<5oQ$5oWuY?O;b6IqWXe@cG)-aRY*qRUX+c%4wfk+hedJ+Nc{`lViv`_R_aC-!V6Q+naCY4gb03|nES@md1rnf18h zZ^tZ~Je-GR%c5zwqNC=H?0wRCE|AIg(LivyveR+25eS5XR!tjyV)v$*L%QZ>r6)hU zyL$Q<0_87fTpw&)Ox^26iHU*Xl(`P9AxlID{KA(>#x6kvizk zN=GkX`}w?XbjnG`qK-Lt0(1Ii)M=h&$GX05r3dAa&j?HsIMbJDv96kCsu=NW=0weViF(OzLucb?JLG#;Pdcy z4Cd~&bH}4kA3@_7W#lYg_}qDDF_u@>&7P2O=X$=6^Z0Z9C+{gjn>7SFX4Z*Pk}jP* zNDRl7myM-O(@Q1{;s)WB%o*N;GSAWr=zYh{G3)sGdSTjVCv@h=0YTC4S~;J1Bh!Ou zCHI|>4wYNIfMG!T+S#M4rjI58D1`aJ&8yH*@U-q2x{1K%g(G`!UOo!}`@MPP{E6M0 zAL#|7n~d7U7sHn%CWaSA4Wl|VurrPRo3A?;n}jaG8KwN#qRHdvBt1kR%n3LP2kzV~ z%w3*Vo*h2;+DJJbdFRN)%x_;lhpmXHB!++s&l5MGX*Hz8@~I;US!`S|g;TL+`7en3 zK-7pbgnTcbIN;P!D2{}Ta3UlG^O2=nmdr$hteiRu@r9d@Td{2N2pYmGAxguw7~7-? z2=Kfku6M0oz%#pZ)dHHp>fW|=W@6kemNO>zZ9BSiBaFSwv=p9q)KhjwI^IflMhd3& zs_A2JQbK~u-cT!}wl1E*5;?-0OK1+^KtTJ;TF+mp)6(N1`$X;L~e^MXbrB0NE^{UV{ggg9%q4Kf`m7@{p3Crkq z{S*~uLuz<8i^dN$+?>5P+lZX6UuurLE{t=e78(bS42_JSMvk#IbnEhYu7Wl$4?^4L zHjdtz13OS6v6s#=1P%+Ez6=xZ3FU$g{o#9RmUILD?Mqob=`nL?H|_NGk58 zSri-ArVb_$ain>p`fzu!EAUU5A#~V8EQ3C1Kd}ug%;kU-p9mBXVDjS;AWveV&hoe+ z&0;Q`LbhCwIy+-<*QF6dqR*c~?m0Vi%u{KE$<+&3%NU|O$XLHTN{C!G((sG4!6i?Q zyM_E5-nK4cpRfS+;9sx;h$>k$ZXgT6_gRbx1_`{N8j>HzAz|2HgW&DoxC$-+VG2y~ z)P}1_=sbaua#rc_)NLaQ^t7EgR=eMlT%Lyo!Yn9{HsEw{c#uoUzqeCK%tN zIW7;wL0ljTSY$*#Jf;_@+3z8|!}>CEfU(dP4?g`zA064TZqM4q=mo^lp>1mkKJaVw zLbqltZXVvYmhRCpBrs##w|)t+=p8HOaF#>T42{+SYj}C`Sf8ERzdc%m&{w z+nU{kk5~|kZ;a*R_gu1 zduj`#FDZEE+C^@q@w}Y-f;hc#@$|Fw!sQb<7yY^F=+5<{I@Cv(r6kduR6Ky{)Y z3D5xny8?qBMNAG}s?`g0o(1~ZL%VZpCiiKBPsfG$q^Kmn&x6JXAc_?$g8?G{tqVh$ z&?hG~qB+DiZCC-D)vnOL2-jMGB?36$l=rxD`*a;!+5~-Q5DjU5IUx@Au|yhE0O>`_Ab(>DQYx zXEXcu&6_v>*}d|=_rCG&WtZ`rW8ly|`I zmtQC?*wt(*U(`raH`fea8p(s24zMib-};d0Ww zxE)&PnZixo`dI738yAl_uYLPHg$0VWMssQspKhK%fmii1H0a)yGw@^Fah$j}=>_x} zfZ&fnAsR_m#+@=ECa{k8ubpSMSoqig(NR(GQP5?y;DYg$V+Y*0j|7`=057``$Dc@U z1Fc|A*S)*Z#6kJ_86r z{ntbG1%dxC0xC(BpO22%@{=Qq3U{r3d`3znN&(5Q(!7o6aCm4i#uYM9eNH<1%Mk2X z1TXIp(Qqatfw(_;0JRPS@c7OR!nNdzkc~;WPz5f}99uqRWV~Kj&p0vBQO9;|B(93R z&0CT{Fuyg`&jg4;6Q{sgK>SiGaqiGA&V^5b=|~9!!UV-Zk`d-8QUZ;JD7b$57&?eD z1Sm3gNd2{XLEm&ZD6Djp8rCm8F|*;shzk%ChY`X@IO4qS)PbFNH;P2sv4OGz ze@{20ma1PM_BwYG4ALdnBd84WRJo8#u7}}~R4R^gc_Qc;78*e26-vs_!!0Z%m_yK> z3SsnuhZ{ht(F}s+sPkI14`~3zrol7XP=z3X$}{?_Y$YTl1lP)6M`ymC?4s$$s>_N zt41^alrDq)BQPERR<-cQO@XPyOCpJj*vDnpBL<%~;@r`Fcx0#dZ%47>^zm&%jPuRG zt{@|tSU=Z@Q--E^_UIl-Sp-dBCef;32+0Yt2D1lfxT1i`Yjjk&+nwtqT`O%EUrWL* z<|}~)Al0EYc#DM}rv$$B-S^b@#Zx8BV`He@ zLy$&=hj4eo0(|iZ&`|hgs2*@;ZkXSQabhBP3QWuhi1)d7?V<{lTvqkze9En4CODy- zov5+ZY9*M0#vub4QjSJ8O1V)AL?U*tT|z*4$%G-R9mjEJtr0IBhjr)6M!puL5Z_PS z8I&(B0A-JqcryYc6LjDef0I}|H8PwIZ27|TsuJpgR7s28a7H4+UxFT7BKIXJMCQ*# zb_9X{8Up-YU>h`ZPGJ$|@r0hOV0G?XI)&9uJD+0r;tHtB+|$S4C5Wzu1_x0=j9ra4 zK^jtUfG@O$H7e5m;T?DY>@=#6UH;t4vJ%kdghWv{yVfj%JjXsn%V3q0|H+RXfy@u{ z#NIy;-O~qmaoOw4TcjCj`E)?`Vh}>+6Q9-Mj&mU=;ZM*PWHG^o`4TxVb!Qp;HI$MD+FP+qFC+e)z>IvRCJb`3K; z?7Rj_1f@x00A3YW1f8BJvheEi)rG(7o_ak;J|lj)^(Z3>E5H+$9#erZ3ilUQpA;$X z4qh9~64p2|5%ea;0R2Igoz*jVJBC}&Eq?Ln4(ifr%mDUr;z$)><7VL+=zZE5&4?2z z8WTT@GqQtj;uQg|)29t*HikT8+F{{1mNBtm;2ZVEfDB7wo1(UiUv$p$s`yxfVy+f~{N^Cn7SO zXf=Tb)z4U7Pl;$sb%XsOqljrDQXmcB*ikVQz(Rc+S|(g2w7jAn)X{J+Xd<;|{uxUv zVAHZd0rHlgzp|*~;*dXtiB;~pBH`5n9n6il@Ee>9%N70n--%Td5%!UIEU?L!ss$aMql{5yU~uFsm`d19irnIwip@_FGiFzT7kgT z#j;96I2)P^;rZbDMdBtPfcC^*1tPuS7ntHmX@~GoL@stUd`m>IKNSR=%S@zK`_?FQ z0kbkLUxCG?kxxqkQap08oP}$L8{}@Ps`EEUJVtxxJ=IgfDIkK6WsYlxJwVEqDwI%6 zqZNCAs5(Pw?TiSw+jM-yu0^fB6@vR?yL@8@cgaM99l+71JEvwJbg~Q};>mYS@!%u^>h^ z7GJdqcH^xg;rR$1q~G#tXh3~NCZIPBh56RjXk00i*TEV!DZN?<_{4AKrI}Mw-4Ih+ z^(e8QnAtWDv0-Jb9m*MXV3z~c>6oXQwq9X1@d)Oaf9sw`+Sb2K0Eb^X=l)gzjnQ&zH$j$=wr?h{LOvc(|l|0sKe34w#|rzao2cjC+$_A1Uk!3TNyXq z98Gov0YM-!0*0VV+?Yf(y{m&t6GCbs2ef`ks%4UnfDB36n6yQUnxyS!i|P=s=4?Cf z8re8?yo5J&mOhJaXJqrO-Z9VhH+R%g1|Y_Oh8k5%N$V}K&^BhU|9ebBC}sHfPLM_V#uro$I5T&Rc*Xgo4Gy%-HcBYEN5gt6i4YLlA-4xN#wR#GS2qL%5@1AtKo3g)rntKPc6KL z1~KPg4-w13F|r!Qc&4ZQN49o8iiu($QO{;S2pWeLwSt^+xc!1Ts>S$Y8v2so{;JQL zXoa`G`PP2UvM&e-0)jwtMgXyiXmo#af7|Nc*g-I2LTg#=>GtUK(fvDrU-|oQ^VThz z^ZSyyo0czhUbA%frZxMVH(WXG!gaA0^y53%m(8BKbHggHXOHzVr{?wYD4DPzzqN~I zJ53#X=jsI>6KtwXqb8&m|7P)z*sCgfc@8Qwhkex1BcjOxQUPK2m*qDAdvhJ2;-?MAwdEC+BR`W z_x{FZ3$$#!fAi|7K3(b*&0Q>W$^xHS@_l5UMAp<_mHM)K^9HlV{j_)6hWj_K@DLyRaQLG;HypZCbS?!dA(~jx7+9Jz6yE@@<_~waYgu z=TISchD)c^)8uE58_~N}xxB+XH9)%x3k&E4v+5PF)KJD zUzILUyJ#-d3L3{D-FsE?XGH~^J$_hszI?`YM2`-Y@?OQ`ElP5T%GSCa%n|)Q_(+}4;Ij(hbOlMIlkHd4PwB$*t^dOTdo$b?NnNsHcNVR|Y ziRIC)Yti9hgFCnE-l9>XvW1Fg`S`mkB}Vq{JfcVYpL%w%-)IEV5?Mb+d-iPExc~P} z{XCwVu8L>`K|l}?1d=lXnu>Y;C5#oQUu1=!WR{?f18{ae?=-2Ux{W3YyV5_fkn!RG~ zue2|nHO2k$eK;u24$Xo|zt4H&q@jJktyr{d&U7WSepEI`nsI}B4e!yuY|gaBGp8*1 z*+-S~WE#??^|cFUP-H4zz*CYJ&F;{!`i5l-kL=o3C0~|Gc{6j~13S0PpZrUw#3Ky#T7d|}S02{g#!=@YJBI5X|1feWVmvS7-XmGh=Ui#bgj zk2WlmJx$A6<(#ICn>%3?pZa<{Gaj#_o^3~ehjb~>EGrkxT0VOk*JW`tM0=Yd5q)ZJ2&c=%3m<88W62f!yyMQ!{fWxbst_Q4ef)$UoK}l*r)Ez8r-~m zPK|Fo@l#*B)(iLu_&erNXZ|{Xz`uC%I4xJsxD?Hl0_TY1Y#r3Yzf^o7CMIUWkX}VI zrUZxn?VI;&_g(+*Uv0b{(7t)2a)pX!OfmiEA#_If*#j>7f`A|(2qb?5bX2sK>LJBCG{D1-;rac&-7lSX`EBN86d6jP)aRdcZ~E1> z^QY;2Xvdb~nNy)$oYyWJH>d|H3CH2*KAl5(+OK~4q!C}hUqCNl((_1Y^~h$cmH0S1 z3-X8PhR=(q^-JW#b-Hrqgw+}y5gMrTsdOA1y;CU72fbQ0+O%TH?@Q)wSUTU_(3qQ6 zEN)x3QlYdT%ozP6^TEMM{@($ap&%d#2m%QZFdjGGv2l$8Y2Mqk-0AN1E5o|AMe;)p zjqKSGLLT8ZesE8R^eKL5TL0qd6KD_&b)o~bhld1Uh~sN$y?_WMV~7@HI1YfH=ko?- z3Sf9^l|d#dhB`+X5A8K#$1yP%T#tTJu_(Huc$U;`wF-YRc3_XCvnE&0mldypa6{xv zqsAd&5-bTnDzY3M>F@19thqy@>ckgtOt!6A+ObiM!s$~$5OJP}(BMDTE~`}}_mmL> zd_CRcHH(Tnn|i^xia=hc{xqOa+7CG+&khb7jA9pR>UT6T;2hj{DAXDf|y(?6^I+O(GBu1x`V&B3}>(=M~LT?u&G&5>7{0fm2s6 zl%u9Yj>hE+S1p(gVyAw|{7>${HN|jV3K{J60#pyWfbcp#5zdaj3dkY?&=Ust;;m`( z$LobYXb|EHtBs(^%6T))ZN=Q_G`6l?!6BXa3zFR-2nYiIMg%aqBeWRoVwlHURxY+i zLz@JV^ACSc)BsNbj^&qrUCGHA+OYitUfJzIc4UP2EZagGFbI3YnN|YwG=&{KfI&L9Acsvr}HWKVinmn1X;H@J}KT7Hf?R z^7SNFlYnp2Y9)(hPG$NF$VR9b1Y_HJmD!&mY;if(lS%M#za58e~UaEa{Cef zr~v8+KDStQtY2~G+GV%ZJi-q+xBhy?bHzi2uXkmBfuj? zz6_=&;__*iv&RmGg#_)~u$u4${U6-C@@k&uUTidB>$n)}&5LJlUp|ij$2-s|L-;SG zSJf+#k4reQf44s3=x%2cXem$dFmjm)aByA~ceYx`4)`HY3JY1gYZuQW!%D>zmOHIq zGI#ZYnXBi|q_J7G(nQz^uh5y8{y%vW|Bcp&%vlf+1d=HN2w04BGEPbF&y~Vb`twf^ z;K;W##}7MA8MAuf95V9>=|adXb)1B_E|o29`>(2!Zi*5?9Z=_`Ptao@MHe407(q|UR5b`LCJvRE;gWD>;5En-Xqk6&YC9z9d-kM7&W_28e!_wS?*`uM(`E(dm>IQZw$KmVXKTV+_q#s1i}4X1A3uv($C@5kpO z#auss3L=Z4Z1MEC*jty+kpYXUI%m{Vpi`7SBGj%l=6I^rsBvph>dS^@3NdG<%Ha*m z6l_rXOE!FyZz~lg>s3KyjTF5g2nYg#z`p_k`Uw5}ry*my2q22KA-&47E*5$~s zAKIotT&GgSTqUxkQY3$-lqd)!Khm3sGh6oeEF|j0#>PSl1^Rlz*pT*faQkKgwn$y9 zZcK5))+7sEI(6LN%L8VK+#Uu*$dlBxpGZV(?Cy=L*Ds#4ap?k80x*9jaf%ALG7uW* z)VSuFMRTYlU|Z@qnGH3xX_*t5PCM4GB!9`*<2m`OFg$y<{*GQl4N+_G{NdecBL<@2 zkmS^|Vd^tsR1EvfjYOjvqlY4-S;2##Nu|7*@I<&e@}p?vLN>2hNG2`RSy-T-3QtEz zuo4Jrh(bBM06HkMKPuwkt*aML{)N|b>hL~trP$7&bQ#jQRk2JT|Jb$l`IE7xheaNgzc1=qhAN7rcoE4~#nNkKpm5Cm)qLdve?PqF$3cW#|KaTH0L$jsT}NB-QW z3ub)P{8_0Zm@{D%#LJxVBWI8Q$>Zq*-5*8?G9TGXf~XoIIs)%t*4Pn*AR<_%FX&}*F9 zwtZwl4+0T2;3&RV?Z&bplyZy!|tRwh8`XJf1$plBa$di@kLAPk-*)Wr^dIi>`m^UOpZ#s5QoV=U9}& zhTrDLA04B3erlGTW)ZfArwa1*B0-22QjZ{HSb_;Ui??I}8Dx=_`e-PfoF7;gP8&x% zjUfTPhjwlq+O;i%>kX~JN9G@;d5CDIsbkC*c8nsv*Z?0-BGkAH$a8oke1V%6&l03y z<}UkpT{v;{yvq?@aSAB$J8@t)_CHsuYNewi5AN8qcHu0d^P871+`MAZ#$`^MS1tXe ze>Z#(oQqWpW^P`&m>3No(SdGj7S6hM?xZU2Ho_vw|H~jV6a)kTK>!4dMO0K23>62$)sQ<1-wvNc2GP^|cMz>=={zHy3CW2=(WG*5q%OsALH@qj{78P5 zwt(ah^79Vz@eK6w2nqIwy+QR*yo?&+yo|uK+2N0+_G%Q$K{gaI?vS8BKhJ06!3Ozx zp^^%wd4Kw-!9f85ejd*Pyxf)cF;?^DC1$DRP&^MT4dR`RiZg6` z$`H^3EVYfCL|n739ZSa1j{GE_e{h%9EQrlVtWZZ@5CK`1u!{%_g@GqF(WXv?V1FM} z16e)vA!LB;WmuM>qXL2w1H!>XY+3%49a24QTX_dqBPtXiqsVLGKz%roivb;)5gmpy zVtNO+Z(GJKpw$je(nKoAfFk|6?0SVc#m4UofA!br@!WH>LF#>S`Bkrs;LPSUa%h^#AT{>HucJ(T+Uovm~ zlKJx{{>3Zp7Yy&-?&7KA9?zcea0=Q(P-n*K8K@+qwmLOWtcZ*V-@a}cbqYON zG-8cGe=qm%zp6^);@G~Oe6(fN5(3{W2I%j}VydDS#9a~u1c84C0#s~8hQDNGA(BOr zoCp3;f}K5O%w1wCnOT>I;}5u?C_QT(}Ow@7=l{LX0^)zI}~GL^^Q^ z<56*Hb#5-41k^%lEDg#O!~wx~(6Mz&Ezqqj9s&V{57O572&IE!g2fWOkPM9?nUWwN z2)q^n!(WJi^Wo_;$M$ST3aU`A$_0ucAltWXvvaP0-MxB&0tdK#9oUVHia^RCAsLXv zaTY=YeQ_elTqW0t5kmaEiS|P5L$*`!>o{f@&+cKxJhq8LdXtz+Mvz|GRFxhl{EG?? zgG55$vnWTxPt13$wim|oN>oPZXFBktHe88An0 zu>WnIjuNoOA5mr&qhoDSoCrb#^f5)87L_FS^SlF!-R|GGj4Y*5ANa=Cm?*tADLt{< z^@cuTWb#)Z+`7i;s4^gj2jd*cY~ROrYC}XbzDjKJ_h!KgY8;rSF+G*S1mI+)@|ez3 zhxe*Tw~^OmJ2qZ8D zq~l17ARq_`0?8Huy@a*BQedh!p-n=m6(Ys>Q+2zqF?x}E@eN_o*e@+E20gp?Y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%u;|ciPHQGc#1VlgtL?BGSRhp|!1VlgtL_h?> z1i}hJ1rZPd5fA|pfWS9CP^JlrfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y z2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0P zh=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%u{Rp^geRVZ{cP$%*fV=kVHwBMNV-^7s z5CIX0B!EbdeEX%!L7zLsU(jzh{`a{rX4UY&ndz6p@_*47wcB{BzL-(}Ul35AB5<)1 zFjlcKj3bOpYbrO9Iks82(vMNy=%`x0)Q!L9rd!*FS6^MVvo#e3rp^CCj7JXJmV@59 zP{0@Pd>Pdc9)Q>FuBqI%Z1%Fr!&gilxpU=wcXdV3=V>~^aQg^o%}4U3YZ`ZZwv#rR zRFj!DZSRb&StUI*>ZJJ~n;l}kk7h?T9$oarQ@<(WaAwX)e+ z&N78BJn#z}G&{?gQE8V5e4_}|h5R1-)kMe`QEy~>HFDKd@+I|{a0>PHRB8xE`u`n^>p1-sWQV!(cP zqc*m^nNEZRFjHfAek1vPu4;z4ZqCHT;|G@)7gQ7%>{u~x!I=I&PhI3ulxfdVks2-B zXOouU`taE!hfO)$o&qrKMCwOnusFijjJd|(MMKq3{LD-PJ~x*vU}j<3H#DGUGyVEX zXUYuNTqe`Lo=o`c=0wi1hK6%qJ91uWY_2{$8y`i_G_J3-9|`k;afPv*y>n2TkC_?3 z!CjkntzNiy-O@elmhif3)q>Kztf1d#doYkAhZ=FE?AXkJBQK>>rt{`gpjo5QHhf~~ z!48<&+0THj(W?kt(geKjjSHqC1`}g;dTOhT@OIQhSwRj4bMDDwRzdjPuEi4uubnd? zVbA8=^y7|>2qx{{wQ%f!tdt|6fWNk)Wb>lw#o4D0>{x$r*T(pr8)%udZ|8yS>kmh5 z^SY{$06SLBi{7|AcI%q`Ti5Vv3R_n1S-Tk7n}0e5c^>c>rQit0vug+QqyMb&5LI^bMZ3NCf67F;CK^`7<9B7>Y%!`kcg2Ht)bwih0_l0-QxAQ zU6rNTsmTLBe7UkHm)@MNjLpm#n6Ia{(wriQW8yMEf_{4<1JHOYrhh}v5ta6>sR{a< z3@JPw3UyUw-r7pjj7hp{D~s|>Zw%PEC=Ak7QDVmF$X?ncG1EoU%`g~~$Av;PBGEb4 zNJ3coJypf|hFj3@)P$H6n{97S)Qm>`c~KvZvbG-pcXc^qt3S%fSZs+Pr?bEj@(uxC zbtwaIqHxZvn{^(feN9;r{g_#J>(Z0rlVf)uI}mm3z+PS{Ge>h3j9C(-CC-{@Yy35H zWy4pB0boejc`*w!k@`zu%oV0k!6h>_K0YDMN6RTVgo{{zY$(L+m=1?FxjMFiUPa)N zBH;Jb7UyIn?Af|>($Lw%dLECD#z-m-Y+_7(F{E91I-v~}4W8;U8& zI?b+0z1!_xw+ux<@#;n@5y~T#B5v<4EVP!o&g+=LS*e- zw}f#*Z0D*4Tb9hCGVfH%>X~D0|4A`Bm>rdDG&mBooq{!w5!%cyJf!e=Xoi@~IDU9c zmk$cF(iwST^maxyXGCv?QJR;@g#h^6k-ew&?}#hJ7>rLB3Nh2uM-O@GT-#U7o7Cqs zMmw>0yCeH{A`fYkm69~If5+*Ay382dl`^M5iA?SPIotN-a}j_H3=J4TBaj%g!=88E zs6LE@iE}#e;xvu#@d-+tZV{?AUOQ*vxb7dtZC^(n-=jt2 z2O*!a_5;Q?_J+LJXCdIR+D;Gxi^dJ$oWX!E<9OoGc5mdQANRQHP-JKv zJI+Pp23A*;F)1@PC;N=X1+x3Ig!~3c6yU4Z}ER1KtXaix}@;URJLgtAhj4CrF$>(+< z&(XP9zX`iHdFyJK$f!s!p zI5%_XXKxy%6AGcBR!$#H&sizSgFk(}I5#8p(0=;l^T3I?MyqCwrPV2D6@ojQfm9ZBr zd{g+=oJiP@8Ad{O{k%yi4#XxVA7-lCRpS_t#fT;o1PJ(v6>pd~nQtgkG56&0fZxk^ zKNt)qMsK4{Le#dn?Q4lI9o(}8#{o@&Fh~0s{!R?U2<&F2niZi0qvnn5!`SQ}{s>_! z+B>Q(h-{&Z3?wo}0~EpJKA#y8YX5w0hCvZ=v3$yKTZj0<95v+tF_1!Jg^7)L>Shh; zwrHHO&ksdyMcuF;`#BDU6$)W0kL~*5@dHtmu~#SeZBOCU(F9x}JILq_%fbo~q*3da z(jcrCCiiKdo_vrR=E$rmFrK9ohf;tB?J2CDF$Qr>!9+sLU!b87JQA~GWXE?)axC1zZ&rqEi=IJ8N8{ z^EwKViSzNW4RG<$n1o!0w|~nhO~;~GJ#*aFB{K`NPU2&h^v)Hx05>h1ZuO%XIgSt0$Mu^rCh|(5nh7zX5SgPr z>O?}!)BzottvN*~R9T7x+kNxm>DUR8qs3oy`tfrS3o_EcgG)j<%N*m-V^U6VQqF=1 zT&e^J&N!l&2*$)-NC_i7kje;_()=t_b_5#12Vy4p{+pM~oYJ=g_9227pMCrCIcsK( zPd{>iW_(GBBVpN6-mqW_?f?Z8$KkzODPZNI7YJEk;o~nH+`WnIP}DYr5;cq=EF7>H z`I?_cFPQehpba}?iZ2{Hkp4|fJ6IoDL31JWsH79Z8YGe9c5FnP)>W6=FFq$-Ic+4J z5a>Y4A;bcHKXMy!hkrqEgSghDKJDGLRYW01b$YJ^@f8Zq8PN-^gzJI3MCbIrDinG~ z+%26vV%g+j=q3~mU8N@-q>|9e$s_SrAUiYN<8*FT3z&l2g(&X-!AsR;#b~klqx&*T z&H_@Os|tIbU<=L@nwlv%)^!MmEW2`O_$fr5H)_K&`efpm_o#a);W^G3-m^I8)Yxtx zVJ*-nl{kG&la{27rVZ$bnwZ$DEye>i%qWZ+V*^~A2v4xOq=1N7bG_iqA_!6fP_#6z zgxk1C1bdoaDcqUtw4}zdV)J!Ig<<&}>-37s zs}0W-LFi|>l(%m0`ej(rn88MIghB*%P-@1BX!t|k5{R?!_HS7=V^9~$OqRgAt=zO= z+L`mNM%o)~HEURp@KJ=wxPpYUhJE&?^;u}JVC;Y$E9TlBu(?a}bFlUaJW_)z6h@tT zI5s>UK6_`?3tVdiHL87^JW<^TVMMRN$0gYq(XFQmoeD|@du?Z<;rzAOPYhp^w&W(h@q%_hY6k;)z9n7xP z3kH1H3gM8El3bdfjl4xkoj#E?p;ucX{In!yPOK&)B?&KM@F%abu!;p&gi{D*$8KF) zl#>~=X$8_gKkF1pVVfl<&E5OmX9>cP_+WN~@zIIL;-d$A__B#nklS=boEcJ|&*-+Q zqO3eW+vYDg3VW6FLf8hBigQk*#aQl@lb(X_mX;XDl|qo>2a$Sk%=iHFT5S^aL6bcX z2DnDZ>Z5T{w4@HfOTHBkj_`g)>QR(SSwS|EnKs7{?mK!Qio%J6eVi209j3twgvj&a z*U(_W*#2X?eaKu=4#nasGI%NpBod=Losvwm(8IolfMXf%}^V{hLo8RdMeUiV1g*?^1>XVd@J& z`J7Inr0_*i;SwWIOTO4$Q?X+u=9BqD;IQ__mU%^7v*43>2vPKCld}ATB&OY)9J_~g zIJRtJIH3?RCDNV9c4XS|gVB8BNPUvkWwno4{ul6J>#|N20kv<-nk5qkBkuNZTZd4h zl6-e>EDMrg1^mI7kRhOlUl5H`}_*dglq zV>Jso6bj^sGmal2e1tZ^oMxOTsktM1nXddsOi_8_U^F>sWd4qo3s{81Fi36Zo=U-w zAWXy|Xc-P!GkZKsWe_7JIj3pB#Agrdj(DuAuGqhIHS!IlM#wbCJv*fAv}9*Qybx9K zBI>PqObEyfiNAmkfQ-tC?Qi8R%~atmYd0>1)+xEVbpm zaS%8o3W7u`W;T(Zb#o>d&(5U&qX{mNLUMB7eim?{(IRQ&olZq`htErQB#BsGv~}5R zvP&p&lO1rI&iSZ7fRI;F&S_4HUcfwn&+MT+Ktv#hF`r64819_8lbT`q5LXb<&9yT& z{MqsgC`y|z<`5d#>2M0N&&wjN6#dh~(bzqBMkr`}E+f*p-@#prCSnSlt0?<4HU^au zqvdlFBxR2wVe$*~&$@-!Juo3uMdsbioBkbo6J1O39SiV`B1`2*p^NN=}h}@tcm@RA0ay= z76N6brx4-Chhi^*4vcwPq9tvX*5t?Q<3G-*AY+D9KW1}MXQrj~Gj-7i;S@xltGW^` zgMI-QJ##wK*iOVCtq-l(N{6sfg5jPW8fVU8JP{}1&IiLe#LPE59ova{ZIJCwjd{;M zr&*)U%@mw~kKN0F&zfIA<5ZUy7-AmShur_8VlAJpfcuOUI zI$y8@J2tGGJ_^&9Z)jRl!m;=mWIG{rbO+%k!amrFG^32ZFyF{fh_vEzaT=Iz>)SXBFL@j8lY%p(Nklm?+POD@L=4#hq8unVCQkkWla<1m9-OJ! z9yp!TIYAX)c%}$jBkcoz!b+_6AzjYG0Ff@P0^cH zm@IH@RU{%iNc&np!iKqrn>Fv;MdpNA^aw_*HwLx`hYBGDY>st$z$p-|9@P)GFD zhWwsTz>7$9x~&cceWB)mK6icNP>>!P4zCS2Y%WEE-n#m|eov&Zr&%;ri-3-!<*(d^MV-{W}LfM?u=Vqq$^#QM`;g2btY0pv4;C*gq zzClz{eT``vjOh7m^QmY+p#h742waK;j12t3zp#)rE&YgM1SzGogZVuJp9p&InL zD@zJ0it>?#G^0UrZf0Wa-q>AR*y5vh9EpoMkr?l)EDLz*IO_PJxRfIYDWH#nKF_g) z*sZIVB**V#ud_8=4sRWjHfHxrhre$e<_P!mPm`Gh!dC>2%0^jy_c>kX2vZ8{lQ>RZP(Vk-&($ble(~lhq1$?%p zgsljOfCyaV1dzrU`-k@Je)Zvd-hJlbx1W0O{TCi@^DKo2D7^RlqwhTZ;JeR0^2$TM zJG_6dx2~q+J1;MqHa5J_U=RhF&^-H$Moy^ zVXKx8|LT|Pm&`NfzqQhh40qR5lnn3Q{`0q9YS;R?t{=2cJ9?O-kiBWihZjs4`_3~D zb$IKgTGS100uBp*LI1M3(}s5a?3IV_HgBCj<4`z8zR@7T;PJx;Uijmk>{&5q>MIZb z&hK@j6i^@3eDre5jmzc-0{(WbpMUI*YxeKjN@XzMU$bx)Q{bpJ&pzUBTauTxXVaSK ztsA1ZZ9qb9U%NbN+r|fPxnjz&ela_@?cK6&_r}%5xmiB1=hcVre(07fQ4{??|M;c* zf4zA6_?2^~^=tn=G7zcBKRWbz+~WuKeCF<3T0j1WWwWP-{7vIXSlYD}rO15RkLcBD z!k}IhOf1MvJjeJTL%Osb+rN8#WdlZfrUp-B35%b zC~C_(BejX`d+V^+k={u4eLJ^oT(;nm+pbJX7g*ha=Yrz% zyIldl4{5)2=0r|`LPMg{QdbJsq4`!z=o?lWbh zM~r8L(oBfnMIkl$@WZ!Wm2)bUGJl=hyt-x8VhRnxs0JsfVQLq-@u1;}fCyZA1Zr(W z$dO?o+yo*gl*jb#I<(towvtz4hlfIaKYM@a%t@8yrG479x%b+iQZr-p;1Rt#Zdf}1 z#ruA{WX8mx-)DS~Q0SefA40#B7Z(ic)_&%gA*h>O8&)O7??1F}PrKKj!?Q4oAmAU~ z<8zbsRJyrlY*Ch>-HuQj3WxO89_&hjV6(xmT-*0^=W;c_f za`Mo=uRe13sJ`7s^zMRUnmb_xmG$nA)PV?yfCyal1Q4f~!N@mq0hqxVCz6qk$?-8y z-gN_!8A2-vG>>B^cl)3hS)E@$A#-D1~S4`4uKHVwS^^)p#G| z4zBv{-*kEJwXPq&`SHswKYi_)JAeND;XOJK!?ALHSoaQ*dI9Y~pL95JaBoMD8fD=G zyZnT$hV}S-#oTG1yz*2|<|*4g=NjexCAGPa+Ki-iP7ftkx>6aDd5hWYdyK_ZR z9wDnyeL7c{7n4me4v4$f?c^6edFAQpBL_0I+R9SD-%r?T;gqp98aA?5$2sGNGwg)u zoeZ15)FTPc-gE1oE$h*Sa4^cq#F5Uv&g#-LMdUGwfCzjI2w0nW-;T{M-ghSo!i3Fz z9#R7)KI4Q+tl8Y_(|3s2Cm)L6v2MkYxM){R)$DP@a3W}vb2_#4WA~yy>h;2F&u(14 zfO=%6%^*-deLRWyQe|l|<;^P=5)qm@yx-V<-FRD9U5;+5t183c81VT=C<~v@=c%ng zW+IsxPibKuN#svnedfWNe?dlLaF@2D`*a!9`P1HQ+aUSdzV_^%&1*>z=Vhc}#^b6G z;orVtB@rZ&9qSg)p}b+~yhm=mYQf|&*-nIq_!UR>@9-g^u->1(>*vI->YDNra>tww zT|itb=ye-s%84c+;opD$F@|a*W@sPl)R2A7PEYCh&MU-=4(!=pRaUZP^|EpOyW@St zN9`m8w{7*(Eh`t(Gm5715~i=g2SYkb1VrGHC1AtmL_hEdjFhe_=e1vl53zwMu-EE^ z0UbYn1ey8CauV&242#(jwR8`ZlL>c&(Ay$DkD0__X3(&tPVId(t~ zVnLt3-D<{|VUvd71q|ctq(UYS>o;rM@T|0B9K<>z^4ItXlZW@mH=#XmDU-7x@lF1k zHb{O~b;Z-ay9KR5iXk^6ovGm~z53`q#D7p;?>_sm@set)$Y|uAO5L+{BiV=hZ@dic z6SZ}H?B1Qkkw*418FO?Qufw{xCmD@Kn=@|Mn10>ZHDOTC+yCd^y0m$1c(2a=I($IP zN~@AC+3%MoE&^Xi0?0seudN>Z4T%6kC1xFIAV9VhN$7EzI}vPzhlN1SN+ARx+2M9X zb&RpywheDnlM-Hj@VDfCS!nuZ%Lm9l?8Sh0x!6cdBgt!PsYg&JFX@coJwG4Wx9ih)-$H78P}k20%Qy*(YAo%N{Ok=&=IvOwa`&dyMC=z& zpRje^s%5h#v-pQh!S;2_S^PsBj5S4g4f}U)Mq#a(H+|;lA&=a8_58`BnHM!Ib7iJP z#t`Q2x;jpM{SW?uoCS)BfYQ1pb4!bhN{jLi@7we2?{8%>E{mN|7PuAfJo7M$;DZ;R zFblMvd5G~X_aEtoZT!bp-Dv&IfZ z5tt4GWWCKYCjvf0y0%?DcLo^&^upYUBPrvCpl-}Wf{MLV$=)xRrni(yE1XW{nw&bFpB`m{kjB zb2{QkhO%5D6{7y<^<`OICt3goz6U zgP7UeQ0(=3Nai9xX-24rmaQJR>&=$;^Uw*J*&D}lPNfj@@A2{5I2YVO*7K8hSUAcG zSQY~HYWps4pSv$FpMUh^uWxwm(R)cfKX>o#?>+Y@eu2>o&H`Q5W!-c2PgqICeRFPC z&2zuMjdTV;oZBwyV_cuT@xsYu?!pcX?bePZuPnj+^<_U`BxCybAazn+lpk#L2qrB? z5&;nqfs2{|@*LybJdDEU!(}jcw3&zDRU(t?Z%OdD2)}S=^sz&6M-T4jR$o#BRi#B9 zS2d9$625G_wJsP@BV;D+IhI50Uh|rlg{Ht(C)&dQ0J_Xqs3!rh>~Sy^iCyms_XC`4tacVDg7 zaRKhUCRalCw+;N4pk5V5fFi|7Xh=-H0V3) zm~Hac%02Vy_ZS(=!$|GsJX?+xeOdxN|#$ z?IiM*6EO>FP!nw2%0Zda*;T%gEmal)5fFi|9f7d$Y%+4{5%}TFHsdwC+4iwXbl~tn@)WlUl!X;J#O5f88?r>ZhWwc`EwaC!?-zwePk! z5B$E<;TOlJcH5q}EVJ@>$mi$4pr;P^;TwQLQxE|W5P?ga0M@?W?PvsF@NmiAF)5v1 zi@oc~sH+~|dqvBrtDlRx@%eo>x7vT(OZ&`5;e~y-JQs5lI^yxDE1!tElDB=5-`)J!YVaCbnFhC0kNS9g@0INiwZwh!dtD)4P>#db_amW^i+~7R$^^(PqY=tn`6Ews zXc=`C;@wL7=87OvDKsymK2RdhL|^yV-YYsKzL-{V7{|f5AzHTNab3zEFwI>AMBr;g zzzS`oH-V#f4%~~ik8EdaF7q$EhA7j^`|ltPLFj2+_NUbu30TH+a z31GbwKAM)+_mRDqJ8nYLobs2|0_SS~%KkeDPjyaw(e0@Y5KvOCLAeGI5CIXm_z0NQ zM}g3`+{I2p!7L^EKiyCbcnuR$y5gSrbX)Yr_j$Mk?IKNC1VkW`fbkUk!PN4D&&J$< zI{31Sj{YcdUWAB z!qGmrvO+1nB9TnDa?oGx$3SNn0TB>^FaZ-m@`q-e9KbCGUuyM{y~p{&6+!cs=%A;f zt|8Ij^|<_srHFtCh=2%O1O%|sgFatQWy%ZtZf-8O&r^d)e>(a)?sv0h|9M)Te;1nQ zvAw_8mA9N|5;xO@wUr7YAOa#F0$&LM>nu!2?amX8xH0+sGCaH&rNC2?+8=(lM^fvj zqp#&TNPlulqSgLe30}23^c2rf`br4sq#_^!A|L``0)BUG$mh$iI%%YO%!MvMa&ADl zd~$kURuY9mp{)f=xdZNhla)Xp@gTmv`K#qJgfEQ>A|L`H@RblS4?zlqmSl`WEMK6r zV3op@^uB0>U?^x+!`zG!5AXT;1@;hjI>H6V`?$Jq@;d>aPe0}Jm3$I(QV|dV5eO3? z;oCN$C6Sz$_J8qRY>`SKfKCVnPz^jG6&*1py&pF|u=F%6?Z15CmYm8H{9c1@a|>S` z6+}P;MBpz;0P%|uMigIQY9LZ6_>EEsq7L|@5D4=7ZK3W-uRAN6E;LCIsW|X8_`Qam z%06ENOA-E(A3~i=1VrGXB4C3^h++it7lweEC50}VcpM{%S}=R>HOihu}QR0Mb`QOFnSm;A2z zUFLKDyaIU#guhKR<0e>7fwzzDG0)cHK(xS)!j(of1U$T^S08;n_P5W++;pBkoBIpI zviJeex8v@usVfe7r5f~;Jt80iBJkA^;Ff{*ho0f~v~$UDl)^L7*UvsZ9D(0RDbzo3 zwf;#;Pwc%iu5<@&JOMYaNfmM2-GK1Fz|4hh`9jPs3?sYpxKhs-mHnW>h=2%OA_Pp* z+3Trv<-Za8yXRtVK9>MTFQ7H{6s<$rhu0nP!#a2hVVfUej(6}{>|NtB!kO_4j#sD_{kC~e4J@W_|BsR6w}&N{gy zT6*E)`J8AZA|L{n4uP;wDD6M4aOn+*nZ5GU}R6i7(ao zs+^k|Od5Ksb5lceJre0Agv(YhB$Y%-FI+mGL(NnKMBw5f&=5x|cr)&v^Xmnx8hAzQ zpFb{yYGBE0=OZtB0(C4~wYNf#Na?^&g1)l<&anJHSHX!RU45ivkMzRD^EuH-L_h>C zDFUblzt__x@nsf>o?qZwNq!-1kpE;KCYy_Zl3p1kNB*N4rk@&URRgc6hW3Y_;fdVm zx!(=F@NCSD?;g0XwyuO5+oTsRhEIsbAOa$AsS&XEJ1;yvil09?kHl^w_AlgZE9d#B z+X_so+AdGZsy&G>z>kEUO94?&oT_Ki8{9dqpL@R4K8l*J2#CN%LcsY==g|JbjmBR% zM>hFFv_SJV82@Z^yQ6SbST(SUm6oUmb~Qf)#l&sbv(g9YQQH^E$3w#q0TH+a37FKg z&sSWN`Re{(b5Ge>#dUK5et|Xg#*g(p8-0CRby8S0>?_%NuESs6cl(o3zl<&1q@?pD z_)*l9ML+~D9s(we@AY*%^6D3^H9D6(KTkcOAyztZQ^Tp6d(^ zi98=;lFp?y*&(l2$%TvO6QYrbfCyY_1Z;|7TkfJSe01J<P0{VMBpz^z-QL12KpzrdBQxf;!pX3=5tB@^VE}8;2!6<58PYsDj?0FAkts{y6cQ0 zAOa$AE&?_IU0$32cHHlg)n`ovoJYd{X}fH?Ik9A~mLZ+%x~N_RL_h?-LIO@SDVS0g z&&_DulGc1R>7OS2&vg`!QQ|qP>$7L;2IsHvqU+QmAOa$AegZ}{1VY>MmXZiIs^Q!} z`g|^Fe@Zjk;y6W0}yf+JQu~9vA|L`H@HHji_tX&QA>dQ)DqNf~o@Xeb z9eBpk3;S+HJ0S3RW!VybM8tMm!!C0Z1W_XnVek0VZkbib=_=@T>;AQ`>E}Vi76B0u z0ZYJf96UsRxciK}K)1wKUXA@V3zi59@rs(jkFeYGF*orXBq|?|x&j9Qz3^$mlZ!IO z=2V?TBbcQ}?rJ3z^tloN5fFiI00D$~eOL+c?)4SbWb!L-`~c{{qaSohZ1rZ`-MA8L ztz&=J{?IdhlHZwevj6tHWto-7&27{HG=ksJ2sPgT6qYKmYKmYKmYKmYKmYKmY zKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmY zKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmY zKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmYKmY zKm;y?fZtsk-e~W4*YNgS2R7g3udDIZo$nCSXI+iy&^b|L&*9!oq0vceIfRh}JWWSZ ze@H}E)I<)zcExLbOV0a+n>~BvYs4Yv>#FInotZY8Nd4I_U@%PxG#+-tHF795Vsh5& z<&4>39x;(79O^GhM1!-=^sJS1WoKkx!#y`?++=UKnF=Bx0v9y_cWo%(4f(wxpF0%r zG1QRx3-Y#!u=UkdJ9`67rsK2^(MfX|Zd(TFITSRdjotxz0JH@D%95>CI!#Xg8lJP}wk;TGL^O zSvS%?^Z*|-HD**VT5HXDLFe}%55Z-nqV2~Fo0&Q)tR8G*_2G=!9N5rXy&9!4HGrxg z9)t9`9V}LHF#P~~ISa>H9YNVNcE)_BH%H?~zO`4mX-&Xq&)87!^xur6GgB^vnf{qE z+s{&nOIb&y*~>Y6?lTP{bWlV8jn$tTh=2%u)db9!*XJoK$SyC)sVOTe&N&_Mx>FCw zW}P_Vswi=Ut-oHZ1&!?GyPTVT+|)QAX&OT*^X zTm<;0BmI_69+sV!ym`^|;|HPwKF@~vQh1yiQ>|D2XqFomsIq);&E%R6;^Qtx)`I=E}YlzyLc3dX}O z+Rq==_eji+V8GAmMsi;5)Qu%k+VrC-!bPdsq)Eb2!A2vB7zx`XXa9Pb7`_ z{GH_3J#?EGwQbdmG2^;@gm&X?Qp}F6OJ*UpmQNYM+psii0)cK3s=L=L8rS{f$$i^1 z!tlo1vE4q3+rAEghH&1sdg18K?@#UDamUK}NM`ype?k9|{kw*=ZM|j5Ob8hup^&Sp zoKa2a`RUS0Lt&D4>I9Vxl4Gaz{~U%i*tlTofgS6!(~dd<(};Z|hHI-9PZ%<~%ln%b z&u|XeJ!4Q86b)i_&8+c^XJW6mbZa-tj0bhV7&vypn0})>y$8T~qxt}cSIQ$le|N!{ z{&WR2CXRwwF?Hlo2NzezTp)Mt*sdRD98WYeF+$sDz^Dz&C-?bm=c)yep=Ybb=8x(Z zzjK2brr(Q3Fp4`EIF)p8_VAuSW=Qt)z~NOT`4fA!8`I_ez3Z3O)l@E>G;IC+Da$4g zt0>B2Z}>Vkxe$6Q0wQqn5a4@?K*JhbHDhdfVfLc&gF=3vsSJg%pO5U@6~Ai}q9ZNw zz`D5;=a24(Qb;|tKNRqrFSyr@MS5uOmc-~CCzIll?V~!jL3$+Z-<7a?Gtvnk1X*Nt zNB*f3vxatO;s|`CJ+{3OG67#<=1F8oZAB@)@jhw)?m-{Faw1_Lk_zEtMa+)u_%42m=`9pO{v_|;MFG9DXxu;?3Y0}o+EK)w8E|70(M&Vo z#itn7{w=(cn(~sWl7i||vr(w2C`mcAe`vcm5X(kF`aSpsDTiWLOdB=1Z->Lt+fxq5 zBAihH`?s#CtFGXb1(|7UW{u4_k%TaWKv8bi{w=GsQj=FsAI%i9Pa1av*@(5jXYFG8 znKq!)n64iz7~Oy6v{4LzVSDPTPai#mTs3}2MG5+MeD{x0DBG6LDJ{ru7+xXR5x+2D zYgwqMl%-YXXl?zbyb!Em~I&}*ObD-u>cE~ZEin$O*z3ZN2%tVNO=*S}aD0K#$;1Q0JG@m>QHoA6 zv4~IzqcmyXP6`Os%;Sl*m1TGVSh@HxRPI`}0Li&!*__Qw7(kntjVq|6EqaQcv1V7# z9LsxTV-xa5FNFO0r&5s5n87AobY3a8<$h?)>iS#kdDUfreGzu zeLc8)v-KD1^+G5FlX;{2qLPds#C%-UxCT})82AA{T42ubUKj~L8~o{O=vhv^dgeH6 zgPB9Rt(-A-&WK*Qr%s?Ti?UDUr5|UgoRW!5>hqa{B7oP)$A)Mmjuoe4oIbAy-ywF} zT3SjkH2Dzftq5Ff1dLz|`twhxte7^E=roZBKQbriC%&<1(e#76HsTiPOgui3K5_ z2?s%dpfm!6zzhBe1E7G7iohqP!CSABUzk6pKk6nJ47#f;0)YV06%219^FkqFEXc!k zb0%gSGyVd9`5CF>dwhbVIuRd@#xcssiFNxubqHi^Y=S3+nQ8StPK3)~^+Lhv)G7Vi z6C_7up@tBZY+hHDg+qrp6vnjnx(hN=7mOW1plRKl38zmaO&`=H&XINYSf++*bJtW5 zCPK(#U@w_4BzEf>;y9Spt|%=|j@yH2?XIhF6Mhec=8f!~ zdMFkjXWD>{v|&7irWTJMgz=xBaS{nXs#BY+)T6XSXrqGjPNxP4={TyBfgO!?^nwX1 z1-XbcYtRe9uwKBML)5d&By^nIL|89yMyB8>9e;I6Arr?}IvTepE9FSm$rCi&xNvG& zae>uJs1?GDd;n$)?rQW)T@7Ql1_KwGN`s=h9A5@&0q2gZ23y`G>e z1jsC3IdL!syOe^JZyV-K-nnwVdFOLuP9tZ~IAk-Cw}{ql%jOViKYjEtMFcUV(32D}>2DP1{Ly_0RV^4haNfvp zeqj*a)50+WIF>d>EC&Kyqs8L}(%xu5f=jL{1U{ZuAmHOF0HmR}erPdrNqg5V;e)|z z%;uHIcDx32$&AAiTsC<)mlancF?u^OA}*_StcW9_F$o?5&`}}*C+_6u+SRAFBUE#f z52W6TfCzlW1dxgWFX0^wKfbw$ta^*lPi1cOrWMi*iSX0m#s$+b+SksR7`DV%XKY_FuWy^@v4l4*nYDKIcqV0pxz|OX^T+gKc39o4gJQmsOJa;(2>MvLgdI+l zX8ZCvs2H}bOK0y`wGbd|K_@Z6M9?^?NeS!cO+q!KCLTchq$MRx>eC*9eB$r{G^4Y2 z%S7FoF_IR43Ri_5@Q)CWjD)3DyxNP7_N8HF$`OP-(w$N97S(z3NPN9s@VM}msw>Kw zJ4QQ_oCc+NS>$4Rz4MG&|Kmh~OmEJy)g=W)*w}ER(3q!^52h!@lNI7Jv5tvmh-G>} zkAs3j_-|^z4t7nKQxou8?_*5=)icH>?AaQ(Z5{b>E(aQxcpce!<7l9;nB%cSq?=JI zM39PeGawVQX(gQymEzJfWjj*?xqgvq)BKKYpjQzPfs2g*VGV3=1P!X{2$ zT8I&NEItYgd}OCKL`#kyj6ptN9y>YBy@}D=$a~TffzOhd13Nb02w+%R9|5B@e#Zvl z57s_Mm=j^f;P3IqlVmCpamYGs%bKbRQoSr_9N*(pu#iDUJ|i1v4eLRJxg-0aL`ZYb z9@=BZ;BJ_#C=tXR@)7&Fd+R6Ii!`>509t??E20v)gqm zxPTeckhZTANn;5R zX%4h18->b}!i*D%s1={bjUl~j^#bNdUIqi6S7tP0NLM0SM5uy(9}{7P681knnyaQV z_3(b8ZR{m_gI<`@uLFXY6{P4L)y|Xv3m4l5UgHq~ z5jZ~q zi(nvO&z6B7y;4z}Z~C`!a)6=+#FLT{uc0~5jwVdkPAVFEc&HD z8i-gE%zM1q6730F6vT|dT~MZ^JaA#SWL5(*m*rE?3$xeEo{*m8Tv-zR!+M}B;&yK2 za?>7-PaFxofZ{emA)m)nUE!{C;aH)<$m4iDZdOC#P(Y-Kzi|Ffp!SM@2wa>5$Tef7 zR~F}Euaa8D%qHSNUVwE(M1=4WSb`X{c{RZz6GU3IfZGbn3bOD5oH%m`u|@`HRO7K7Aq?&(2w=YBDka$0yz`1k^>JwW;Tol~IJ2_lW}`RUNMtyyY| zw?h07EcD5uh3SL4hG90xt{M>#fs34gm4OMnHW8@7L13K^Uv1W?V=)pHA(VuqB|35H zSRzqw!V9cfWl0QjkDwC^TDZUXczhJL@xCpq$U&eNkcay=ucU_dg;^(&ignfHbu|?% zXh)h^S%hI98AqDfvn_f7Nn)cS2plWToO_>xoHv!6^p z#4;-MS9W?z{LYQ6_U9G@BJ-SR?X2;{vKWuer!&*DUJC-|Mst-HV@2ByVe6``AsWUs z>Bs7YX#+cP+rr|BLkS;|V`XLU!ZH03o~)H3z>efcDKJ8m(e5>iIVtO`@Qjev43&jF ztkGrqluL3m5z7R*xD${#ytl3zYrM9+gr!I5JJuti$fghKY+NmF?#N0fDU%qpgWwM# zwK*et;{xE6%^x#h&hXxJj+cQiU>9-W)`1SyfL7&(GJ;pcvh4VoIQqzFkf0xhLgI$N z6cH`d?v%dm$x85+86%eZ3uYlh|iD!#Yey4t1_@$dH!hiE%ByCKW?c&5YZl}z8aHU!l;N}_a7|01Km}E z_b<;J+!Yy!ctn76KNcxtj7%gg9t0sKZci{#cPBYZAOhQ%mGi_*@JEnv$U5RAj(l?- z&E(kRXsE)BG^8Bi3ncKyh12?f@Dd~3wtO}M3V(sLFBx-YM0me>X2D(>L?u= zP3-*{i-N)%;@1Y=84t!bVuSus+xvDA zxx#*~sjB3@Gsb{7aq8%ys`3)va>JU*M~~`@j^H*8yatw6p;k~sd)6(@J$al3SA>Ze zA+sQ>OInAy8^^?nSurVGHdABXng>|fxmf*<#|Lx2*NfbyE5`1q1DjZ>^VHR{cfpte z?wTrwVGeZHj_dwW=85|Iot?m72!F8GTTi3NSa@c2?!b>;M$60`+8rYS<%Np3gW*6f zB7|d7jniX8(EL=l6xDRvHjDhjhQr@&J2NW85=X=4Kexp z8@h2KJawoZ5)G!YS%_;Uh*QA&C{9iI4rM{G$lP{eqEdd6CgkYp4VQr%#!b)8@=?4q zhKHaw8UM!5Gqk71nSwK(MM>^yL#B~ZFzbND}*qHuFqW^Yk+# z*zHDWnq4$FQ&a!=Py|AFGda+PC+VH3bjVO|L-9s7nxupCU?o;gI-3ztjRBfw_K9$2 zsl18OH`&66AY;wutpDVsX1yyafaxG(8Lb)i7d)=bv@y3iM?9*up&V)SI-NVu$}^b= zH{BvL?Zz3|Ye&c-2+uR4rQX3}YMipO3mW#`>IleoF(-}9f>P&kwGOm!&$dqv!;7&$a+(*=XTD{&vHluNe;h2m`yrq z^0w)a8v3W1-E{xjxe%#d1VlgtL_h>YKmYKmYKmYKmYKmYKmYKmYpa}ucd)%|4mU{P;V+1$hqX%3dDtX&$Q9qyatfglF@( zPV;N>_7~(Eb>gnImG#eCbA+>b#u^Vc<=LudJEMJcl6j0?!!zp`u+;@tQ<%r?H6Dh2 z8>uhs)AKl~bI6$|ES;IV)Px9#fCz{{V*&_Fo}yfmmz9-voPv35DStjU562EmT?#y| z*~n*pdn^3}Vw~q)NABfOrTpZ5K^8wi7XC8=-?l+GJ1W5JDlf`2avRO!{1Wu3<40&? zcJK?w&J$4UCAO(F&+zBRcWNq1c;Ym_`)qUsYRPCZ^YrQChYv(PrPI{=&67M$8|LVE zK$LmZw)q)Q^Vhr$;!ehU_><6tM|KsqU9iz8zs&jtb z43Ua~ z(GOpGqUCRHeDbav?Do?AckSP~nTPyWRg{hC+x4!?|0DNw8b1ud2>HD*ervR*qV$a? z{`%Xgl6h@WqB)S0}7b3S=h-v|*90TD1i4asjMFPM4lzyIC! zKlt`9{;9r{AN})l_ue*bjv~d^tScae2>b%n>u^|Ezv&aHRyl)sRx+CP5=2%JwJY%-?H4kcKHqe z@ol#2zW*)iKYQZ^8bwB#^Z^h75fA|pI12%9U2$&a(S+FbOXm;n(yrA5cm3+e-}&Xg z{M9wz``d?ZxpKwa>2oKJdgQiiZur5sQ3`C2-hR#eDPv2E^7(~IgmLVyt;4%_NIDoB zw|nbt|MPEmUH-$-eY*_l_Ssu4@2ByyS(DZ*oP|?x(~th?u{*Bm+x~;?>sI0#;Ey2u z`K`Aj2V!V{@3sG9bjpAIbNt>NCgFfy@O!ZQul?TNeblPu!I(V3Hx_$NsiyYarwe0e{&;x;fDYChqkXhi6&*3&r)3Wb$KKmKtw-w`!$qlS&)@(y5R?dE6OGh z?SpoplN*2dj~(B6xvr+l9P9jin8`TsGhWW$kps~W+;sVM-~anI&pu3^0lCdy^aB3E zsNS7y8;*M9wyRMeaeKB=GjVWlTn`jVL1sFB$L0Uf;ey9&d(pu9yg4* z&^=fGBrEM0zrBoVc;ksb5d0Zpav45%O$9#?ymaQI(<#ZMD(HOQj!o!@J1_gef+=HO zefS>s&6@ zQ$2n6Em!^P-^>_2nD)u>`|w;yk^k-ouOuLy{M2wa*3 zJT;X*PuQN-ncp#4AfPXlWyjaV9-a% z=))JEB>3~ei;uT!{d~uFUw!tTTkpKgbV3*kkK>M?{rj6O?|=WrCqI7qsSaY+3M`k@kZ+e=>dakg3D_&z>-f^`E!@&%Yt($sNoZKVtH*zRPD%hLxwb zGBfokrarf)ojRVxqNc>ys8gxOCk*O!^>_at>E?Bd=jLZ;W}iHfdn%QULe8mFLO|I3 z+^WXfRGOhF$T$;yBEjvHzjf{R{+72aCF1S%X4l^$+bOe7l_g2lWkuvT=;76e@5W!~ z^4@FJl@-;M*b$3JXA z2KlG;_q&-}kIi3YNg>jh{4bLKbn5XTUE6*3#`D|(U0z)9|JytFps1=ij&GWpHkzeo zYG&G~OpT=G>7q6sSbj>sBK zolMgP6%7Glq0iY1>!L#Cf6aV%&M;@so_qK5f%*OJ?|E?w;r}sSqw{B&92&UpTpef+JS5+${gOA zIF3N}K+kp^8{Lt%HZ|+pEvOrElXh<1#6=S3mTC|I5fA|psF^@nNf8AIVF5$PL5djl zV)!T@#C!LLjdkGDyGxYap9+F;0YmZLGYAu~EqvtA_?U1`i)ZGwVO|N7#~(lXBc*M9 zJsu=xee&m=_vgg*?${Flf1i#m`+BrObmJ5v+|c*Y)=254bKf!|nwq%E7uCu+`*))n zsu|zAg3cUa{W_RA6iVZy;yO`e3|v?k6mLg|;iTgFu`e>VY#^Ra#WW^Ey=ht7%pD}6c zhEH~E-PES84V^-XL6y;@jz{BKIFYa&)~{NYJZp;SgW+t=#5LQ!`=baVM*8F)K5!&^ zSI)jHuIKktCpa6X4Qk@h?(a%V9e9>F2??tg|2&HlROs3Dch^J&L_h>?CSZI)9dSw`|dIY^iWB_)OQBO21vlgw4h4cJz2DeutU zUGrmO2prQuqet7O#3qp8g#`sv7UMO_&pU@e?$D?fEtT>wUdTIpn(QNvx^~s5m01%) z?zP#lIQC~|P};zmX|hyh^yq|R%BN3P&PntcXBXeafw+Uv3nUt~Z)l5)3T4IpMTIrW z1vP|gi}iy1yfY_{RctVg^$Kq0pcN4i0TB=Zi-1!vl&@R*9+d*PeUP`7{3J#^B_wF| z!g>dYo3q10_yB@(4YRK`7aUmePv*;}C(1`oh4pjIMr>ID2+36mlS zF3g$s2AYU~0^tUHN_6%hLn$dX2F1jl)3nZWn4&rT1BieKh=2&(l7OWbK3={U0m}_G zB09=G9FGw73zI`ezZo`$qJzlMzEO6+$RNL{mxmK#7~t6!*S%FfR_tuMdhWLqYf_Rf zUpUVh@ZMy6l@>ELke!4oI3bJOS~nj0ROg65UqThH`+Ls_e-)Df@lI?SHx%YT%IsOB zFfC!so|%#uO9dQyWN|{Q^X*Kc74ODP!6YFj&Ni1`@ay*^`A94hF-P@a;P8_YTFKEZRc>**)3^kQ3OOl1Vq5n3#%5+MP_<7tJn4}lYqoe zJV+!XA#y2a!<0a}n)P}{>UuV>->O!{{XZ=!jvvjTVMXiOwu!+3wA3RCOtApTOYFp~ z;8>hay*fNV&MI@x$(ad8U(Pd4mg1s9*w(pu1M|JssAr?o5z2yCgOv?sT@u^6v}njY zY33xCULf8**4GQwLt(Ww%sj}Cnrqx*gf_+p`b-J6V?Oj~cRzi$(Nn+vbhzB1>NfS+ z76B0ufocg@9Wah$XD*JPK{$9t@@x!&p?G^;?2qzA0i}JI%7G?T)jWUahL|`S z!^F*TA5pw8)^`x|ANK7DdcL2>J+&v;{dlXmv+jjNKmaO#)bdDCP5x@4ZJhEkwTjTo`}X4+Xax7qOUyDt(o=E9tD1ovfg z88k$~|AU=E>4EdJs@GOl;`)uO2Yuocat(s!4u^vd+f-O!N^INwIqoBBE=X0~_T>hC z5k(eU^fVCx5fFhI2q0j|J|$1pG(O^IAu|4tjq6rV4YhClXeB}AqAR8+l54Q1(narT zo#!CCHG0fTp~JnYU*KtOh-jk2$YFxZfnHCqU$KNmlA2hw?)JGJK6Qz7Ghu)6RUQLD zY$E!V5v9e2C1wNruS@=#1v@*jCO$}dXUyP%JkYJ+O1=p_Pm8kpyXqmHHT)0gBM}e* z5vY+sfz{*GdAt4(**geoOa5a5RNVUWXa={E>Pl} literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/page-license.bmp b/console/installer/art/1x/page-license.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f7ff993ca3551f17a08af2fa0ac5bd55cbd55d26 GIT binary patch literal 686454 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/page-progress.bmp b/console/installer/art/1x/page-progress.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7b7e5cc365614108d63b058b5be2aaa3fae771e1 GIT binary patch literal 686454 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 P1QY>9KoR)GAn^YHrwWPT literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/progress-0.bmp b/console/installer/art/1x/progress-0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b8c5f5c67efae1ececf16bd16182907c1507b14a GIT binary patch literal 10998 zcmeI&F$#k)7>41vIXQcT;sHE>d++Sf!E>Yzk`}tCfnuSbN$ml|A;K#rLc}1C@aH#4 zbDb*_j#~9arOS-Tb=sZURXB}7b$<4f zv%9y<`0R+N4fTmbkw@Q5MvW^4p^lauE3z+5!^p|AX%y7_TwY(~UtLYe;gKXaZ*#GG!m8=s z#tktl2di1=pF(#V9(ObdKmY>&6Nvr8Jr0s~rwS*y~i_L=Id27*^pMih@j00N2tUi~KO zc$JR=0uac80CfPo`dcH)BCdER1T-a}>Hw@;;Z;rJpWg=rGAHm}w_=|aUd5{rfIub$ HKKrbmOE`Co literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/progress-2.bmp b/console/installer/art/1x/progress-2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..47ea5994d8704977e56e1c110076bf568692e939 GIT binary patch literal 10998 zcmeI2F$%&k6hQ0dIfP=-}=h^f(?s7j^LnosZ{2yv8I{GP5sN7_3jw^!rvw68 z1T6DvAEjEo#XyWJV%9>c5J(cht6DL|WC%zCmMODV6-s2Ptbu$ZfL9R(1pXp`SCdH^ zzyA>dy!uy6{aAlvC?f<|2f(YT1n??eg@7&rwGP0(RjO5@v@Np_cvUy1n4fV1pM5LN US>e@G0(dp!mf-a@2}I|tUdE$?w*UYD literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/progress-3.bmp b/console/installer/art/1x/progress-3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b009bb0ac8b3b83e197d7323325fa66ac1c5c999 GIT binary patch literal 10998 zcmeI2F%E(-6hL8fa&|R37#EE(jt=hLL674Ba8VbJzzIxr@C>>bbudU`2_lJzv8jLdF>6sE z0D(LL^Nw(;;d&AULF65x>xlw^e**FC@`~^2GfwsF@kR2H<*C@cZIsK? z=P1>BT@J;#EM_gF3IPZ}K#u@kjd@kR+Lm0kDvYdDsewQM0{R5-YSODJf>-qtG{1fj zfIvh5um15WbpX5y0SKfdfLD`VRdoRNtx|qbQOf240+}U%S7ToN?ptxr3a>%{0x1dL K)nBhh=d9kBH=Y#$ literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/progress-5.bmp b/console/installer/art/1x/progress-5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..61eb44c24d3db1375647146bdac76ee8d58ff91f GIT binary patch literal 10998 zcmeI&F%E(-7>41pIXSz_KwM-njt=hLK@KGgaq$S8z`?;Y;1x)$A#ouX|5mL#?besj zLP}tGhA-uBx4Y*;*<&qzCheLiHIZwgW_J86&o9$Yvjft-hM{k7UA@=Uk`n<05I|tG zfCQ<;sSVZUaoXGub6w@5zs8FQAb>#h0=WdK#A)9)U0vuh)yGxzCQR26KmY+h0SVGF zHKA&L|Cy=!VNyat009KP0xnM74e^2i0tg`BBVgi`IsgR_1Q0+VjKHrBASG7Tt-_G< aAA|q`Q49Rnt=MNps3L#>0zm}aKC3t7bg=RO literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/radio-off.bmp b/console/installer/art/1x/radio-off.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7e3558d4d81cccbc07fc9aae4f4f5cfd1e365800 GIT binary patch literal 822 zcmbV~O%8%E5QS^p8s#j4gtYo|tz8Ys#$Nr!6fc zYmAbZaIi%Xk{0ZhB3QjkFGXgwy1xwsApvkHMscJg;z46Z8T}RjFu=U2@J6Gx#l~=7 z0xJMufKP{QTa}&Cm-5tbu@W%AG)pAATJd9Xm)1$Z0OQ=WlEY%(d|>XJ!}!4O3H{&D V^9;SOt}8?Rd=@iX`-#IK;z(oRi~4(;aZtdkT=C!y%#7if`q zp(fYFLbA9! z3tL;N-_YY$K6^IHh#;Xv!~zgLP1q|LU5Rpgn!mr6{~kmv05Cc8{DmD=|DXupge@{A zlf}eui3I=#96wyJR!_R(<|&hYx{iiTg5*z}bisgW!bi`|=hM=#TdBwGu(PWIk07Cx zCB^`NN$YwwT4BhNaTi*6Ow%=>pPuu@xdmrQq+1@vs G`}_^4dA*Hd*nC}ON%qc9?d ziw8V5=zEpWS)cBNTR-kBTcii12c!p1=>bh~YyayoOo3XO;t}PWF&u zEWULfF4A{-_?kGnloja#=>h41(|BNaV`aRzZFc1K%wYHA>yF93&biUPss66XK2e|O zZQ~MNrz)PEwWWr_^tHLEn!Kcj!i>hkjFz%IS|~NSNeAYw(e9R^jwVf2HkaqBvJ={? z3Kfr&vbDNUk@?hMp$?0=qq^9-yEQ$~HNkXZ#tvgf<8rLK#k{`kbvdv@oz4g5P3-Fv zi5VMHIxa|cUXBx*e&LwgfQFg);mCb8n4Pe(gV^1XW0W_ zT7GOu#HG&@gDw>&gy%mA4*vS%?5M!P_|Ss5M|qF$gQ5awH0AC5R7&tw)AAfx*WFb4 z@_A0^g-=Aip}eEI2ozeH9L|jn0+*hrM86sC#R!gtYVMj=GsA8foYUiSU3uegz%8>{>H%Kq{!!~F$Hm9AUQn<_`TUiQAI3cL6j_2JGJLmiDS zyEQH3IFruYAzwTM8VGS&`?QJs(l*W`l0Y1yWE%Mo=2c!p1;{nwzw&cZ$ z;bT3mRM=K0JqQqB;&%w*r+L;FX3`(sINDY_4tCQ*Z-{-jaVT!L-I5z~-)*zh<)^?o z%hDdd8Sd$MS>0Tg8-Mpg?~BU5mo=KEHWg<u&OllF zTWZVGV?`g2(``GjY;UAIyt=>n78vBwXl|=4XedZiRn=v)C{SEY%ZUjBmTi_jR?E}C zPLU>r1+ROsy(!|-7a-^A+;sHSuR!w6wMB6Y^Ww#!wO1E46=w=-);+Ajlan7@0j}|h z$8ItB_Gw%y`$!K+51eri!1NSFDR>$(&{nT13ftaFw_(Ubh2rU~g-A{&-JoX>t^oC=#h5*Rmq+g#GYo zR>a+uht~$%8jSY**kCG0M^1Fm>YH&k@o6D9wpM{ng#{C3V}rbpt*Q{UL9`o($H~I6U z?9B;UjdV5N`|?kzA=iNpG*5^t+Ggm5PXWx72UqB?DsEL(5J5P(@8how!c`j1`hEQ3L(+1;ZYrkh&OTHhlFg|EDtr5?%nm3IlP4#z12AqfJg3n!b z&r4FG%Ti-dVwr*h)&b)?Ym3>Dcad9baub`&^DDFBL%#hheHw}~UOvyIFoo(BQ7y02 z4l1I)cGZ?L@bUG3BQgkR*YmH$jH-%O%nDcMr$Jqyl`{*d&PgCT#^Wqb4AGxPG-rZw z^heo%+Y8}BRS+LyuKx@51EiIT!P)$;B%fM(;K&08hyirQ*4V&Rq|wIW%-Z}Eq)~7c z4hEzU?k8+S2R9pMr*(U65gh;|MD29j_q}@Pr!p%J?G&{Zatp4)Y|#Pc#|BE0B0w_{ zg;%|%r8n@^<(V;rTwoc^7JN>A5Reram>6`qDl1;k*Alr^G^U~GYTEkZ3@}S9Y-wtk z^Yp+gDj*o*CyJ}COK33U`hs-OwInIhys^S4apdKIR4aVSbhO$iuII1KG}th==^K1?Kc zDPG4CH90YE_Yde}#URI1_?I>5b){yKo+7VrmXfxN*U1;}VB zR1+P*>i}{UV;8(UGY-AP4xx5PDM?Dz*$MRpscgW3EMQj0E0Kkj5q_I_(N~E#!S|rP zBpZ0x{vYho2=>m7^cBR1BDX%h^L|v`8 zn9q*(w^bJfef8%TrP)rK_s)~$D9-L$Vbk~8_dIVnZ zoOZ%+3}H#4kB^07NnGh@jAB6@R2T0ZBMn&U0B1=;PSPaQWL@Y4P5jm?$$sDLj)&V${Z?X?B6Rd-Em=&RtB*X>%I90Jfvk|PPV$KLve z99IY-xJNh3?oN3|Y*R@V)0mcK4O|t=L%g*g#NGa0gzr@^U@OR;+leGQHT0SkF9_}Q z(CeZ0M&eByD+|y<)9PYY&OiE`Gv5<2yn-YA5M|c+dFzkoVpw^Vyykx_f zVuij>x8A86lENu{F1tw&NDutHJ%FT%4oR9l#19mDa`PK<>8*R)>}qLb;}0_=oe9_h z&|sv9r2r#4^qlB>oY}~;qZb5H$d8HLjTL6oTRLM+py={!-V+g}LV-m86fH}$Sy6#h zjt*2@J-y1;pnAFVdfff3bw)zz)W9pgEb!gd*zdpA1NxTj^~lTTfnQRj&>xUtA>LFd zh^6EqtS!tePL5=T-{E@!vY$zp*#J z9`0x&8)1I5@8|tHAfHZpKziUO^Z=Po2$Bhb7gHZzMNULAW%tcS*od1`hby9tvK(3?okWC4Rp5c_#|@~_8=Xe35spH}WXsIAu>y(|54l*t6scD1z9)Ly`Bsab1bWa* z#aF9+o%+|Z9o#ZLXr+bE698V#D>6$F8OTy-t#}6Y9eve2&{_waQovG(G;=Ydn8(Ok*hfyCo zNDw8OMz^EC33I3b`wbGah`*f${2mo9nf>UJ3TvS8onox;okrtQe4NE1#nfV{h|J&COjEw`eo+Hb56eETkm5(dpVncyx97~ooyLBe(ZEnc?;MSbqJKjZ$1rU)t6NTaO7U$mv=I(Q zhA}%nxtwllePI7O$iKjG(yx&udAkrA-d~JZ#7r- zHCGbcs4F1|dNzBnmit^Ai__!fDW`9@)iWQz+wpqlMPdAr#)32^0ISoj9uB$IY%Rr? zp5Ezk*;fR;GSwg)Zfw}*r=HxS*{%H>Y;vvJ z;8i4|5Woa_7obcg27Gx7*k2#g!e^YLV*0zV_35|1|Yv zSl6|J*u(d_Tm4&`1J`N?JFX7*wB^ShDoZ{^aOZl%@Qr3w2|}K?+v);d&+OO;b7N;R zN+{%BU#9WW^z&^&YZ(45N5;{8#TSpmz%^MHcne1FYpP5;@_BcCnHmx*SMCx4iGW1l zgCL+QtkaFgg4E{^ZWACB3opcY9Bagp4TgjQSLUY6l1@ez<^j)UY4S-!SGSv)J^&9w zux|UZYkk>mU-50){a&|Yd7&siM)7YUVlDo(+vbzL`{z){Ri1@fP2M(MJQ|GM_m@{M zo-zyEhV{kS%;R4Ly<2AgI>+w1(z{(v+rycEEzP`uC$R+Rp(gvn=+I4$!bvc+%JlOl zuj*TlRWmU7j37`#f$@6-n`^e#(kuwpxoV@Q4}zrZL?R#&kO)`^pdmF)tIthjd9G_3 zOo-B3TYRZ1fsogYQ3(^8ylOy?B^QswV5V28!k(Q@J{`#qiJ@nET=T-L`CY^ ziqtdgkRGS788ItvOT)H#cBfj0kR-OzR=IUXj~Tl}{iv zuwh^b40be#Q`1(}6+bhifA_jA-Upht#Ym>M&5eR2AE-r4W!bCa@8 zd}EuP|1oaV-Cw78;O8KKqBy71T3uxuRa~@fn@L} z^WzRvf#7+wgg^_2;NJEtmyy2X_xh(s zA5~|@W7ram-@m=Jv8suTm{FIT_S`LeR)@nG^0`S`jSct5?)z&=;t6Q#T3I$ER+@Ms`TKt% z3yUutr9G4>y3$orRIn(9D(h|*+SMF$5@|Uz`hfmXzi+5s31*%AX6D%g@1{NN@V}u- z5=?No*}x~5&D<6ypRu}cF3HR}eE==pT%1{(eQ{;(2Z+};H*+QJ>`-STqBQr+f5>?u zUmx~$EX_`lx_Z>tzO`vrFf7(y2fc2)ZGnsJm6sdxk_X!xydF0n2g5g7>`Qp9x?_1B z;(a+bf_~=w)4x4*(@9eh+p590Dbx^za8Vj($l}o`50& z=gOjUbqTLEu(cV@Gw5FW>~EgiE~Q|APJ|Pysk|~n3&UAc;nj|+0upny*;T+0{W>z12uK7Z0uclR z8LDBl*}~K_m_zsgv4^640IMY?B)o^)*;bxIfOtb*;sdAwC|5&UVi#DxD_jIYJ-FF6 zJ25&v`e5eSLzF622f`N6!;x|(#)U0e=~Gm2>DZU>Gy0Q@Vm_KmLJHYT&4AzIGKUif z%BzMtMXJl%tWN~i@?*odxI$`-<^0vl$*-P2=CmT^^y=I+0Ugp3$?CApyBzDIgS{1L zXI&1v)8u?oY}N~!MXKXFyRhMEpQhZeycZ3BykLR2@0H?8n zzGIfBTEu7_DcXnJh%Nqv!H7xmLxAE71;HPck6Mb6xxISv1ciwmdat+bW@AP5r8ojQ z=erDomJI{T;?b>+aL}KB?qJaCs>@E87#R#J3J$PYUZv3qVwHkb3b&kV%QP-eIYYoH zYME){C&1+LCqW`05s(OcC}kBj4Mw*Rhbb>{ealh&sS$9V7m4-S6RG@ z0%T>~-&#Z7%Ik7OrK<$H3egx2%}RT;WS*d9rh$~L&r2@4a1@11P@8kHE;p$vBX)Uq3dI^xsvini z*^fj(BJeRI0B6FG$Tn-IC={L)u{b(OOW^|`AYo1+BXx}hz9|KT&I((JqPK|;!EDtWY#fi6*Ifax0YVMI`f zg(T*?QJ58sW&V>mCKLwDMn z2`@ELShefFHh0B$tRlayg{Or0e2W7G)kBzkaUi@?dTO0Ujm4aQV&9q1t_jFfiGV~v zBJc|l*#2cxZ;{M9u19p>TaCAWCE(8_F{|0zomf{8v8?o?@0#Pjdp_dUb~^0M9HO6< Yu|z;3AQ6xVNCYGT5&?<8|0x3h1@x2J2mk;8 literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/stage-3.bmp b/console/installer/art/1x/stage-3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cae71a6242b195d1ff2cc347c704e29674021c5c GIT binary patch literal 24678 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 BPpSX_ literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/stage-4.bmp b/console/installer/art/1x/stage-4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7bf25d65b9cd29eb8b124f97316af7665c1d505c GIT binary patch literal 24678 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/tb-close-pressed.bmp b/console/installer/art/1x/tb-close-pressed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c09d452d1a761c17b12bb06436243e311889b3d1 GIT binary patch literal 5334 zcmeH|%TB^T6o&N$T)FTOT;K(Q1;wf$Vl+_}xb<#gqQ)4X!o(Lau6zRHYUiP#1u*(2#)t^pFvXxR7?CnWmKK>2&6s|DSW}o6$Pk^h3h68$Vn1zrC$Xk00TA zxPyLr0GBaOOq@aip@2|8DDck|@X2wX+_b!VhhubFw`z%comzL+R5X@>tC{P6$P`}-= z&BpvioMW7yK4adO=a1VP25^%tG6k#$AZB1dYKJXCrsxV35tLo3bru-pg48GiSal+v z2LO)8$M=eTb_nmhFNfVQ6M!M6V}{$`Dir&EDdQBI(j0sH)<1>zhZ6! zUZYF}yme^^QxNBwLKvX3Vq?&j3(ck|3t$A#0-h;kN-kI0SkHis;wI{Vb)o#OE~d-n z^4)DQ;AORu*MTaAT{$^sRn)p#4Gd?Wf-glVm~uIcpH5(m4#hlD^zh(eE|{`H2a=T3 qXjTV+ffJk-eJr@G_-v8#JYs0Tpr1P!`ionkfKWgvAQbo$3VZ^-t{?LN literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/tb-min-hover.bmp b/console/installer/art/1x/tb-min-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..efd79ba5bed137a6425945b4a9de4317ef96b86b GIT binary patch literal 5334 zcmZ?ry(Yo{24+A~1Bi8?G$VrqSbPCc{sR16BBkKDB+!mTv^zqs=M$CLkG9{m6M5GVS4|Np;NwTXWAN&>)$qn0y(ZUA~J z*i7Zvs%hu9EjOcYWPqHaVW2PTo3f{Iaq dZ2KsCGz3ONU^E0qLtr!nMnhmU1O`S{4lK2s`g$yUvodI+JFa)CQwd0+1;~WW~1ZO>G zbrI@1!&;ulT!zzCL-gY2S@#btyR~QWoxMwNA)xHzqpMQfjSWSafzGB@XaL<{A0waZ5F#>c0&{J{l=BEzty>#aI#nZ=tBrbIE z6iBu#Db(LwHQZjGT5f=t1B?!TGZjBmWkLv~Cd5XYiV=bAk#JDHAPUjQ0mzOSWsioy WXb6mkz-S1JhQMeDjE2C#h5!I9C2&9h literal 0 HcmV?d00001 diff --git a/console/installer/art/1x/titlebar.bmp b/console/installer/art/1x/titlebar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f08a5e456f1f4ade8580465450d6ab93e15465b7 GIT binary patch literal 91254 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/base.bmp b/console/installer/art/2x/base.bmp new file mode 100644 index 0000000000000000000000000000000000000000..16d9d805ac14152ec68c03a7f379b6c5051dc58f GIT binary patch literal 4377654 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 zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U 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 OD50x~<^tXX+y4NtYzJ=u literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-back-normal.bmp b/console/installer/art/2x/btn-back-normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d04113393011ee5fe29bc0ec582bab7c31bc2d03 GIT binary patch literal 46710 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-back-pressed.bmp b/console/installer/art/2x/btn-back-pressed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..914a3438a6ba4cabf86f7421c0281beb5ea072b8 GIT binary patch literal 46710 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-browse-hover.bmp b/console/installer/art/2x/btn-browse-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8da86b154ffc25cf2639a6fc51535999058a009f GIT binary patch literal 39222 zcmeI530PEB8^^~j&D=NKaaRJO`e;oO>>u_jlj(E@$rP zJ2)stqkMw!yB&TGiM4*&>*4c&nRzyKa1 zAaT(-_Fbz<5+#wzGwmCn7u7)bWgAQUJR$3X%voenl6hXXGBRtDt!nY=9v~4jByI?u zvj6~K02qJ-zyKZui9148vm}Z_ZmMy6XkKJptv1v27m!b5E$D-0SQnMt>ywPgmKMg6&WqT6V<@HZ@gr@BMX9T)>1nby;^*? z2M8oBU;q*T19$)uphCa^oBWZ>ED1cFjjUt-X&mV;C^6utlB4#3y$1jTkl=aXL6AVh z2z~Wk0X)n;L{GtyiL_Vs_pmi z9)SMgZ2$(?03JhZuwg?tQJX4rj1pdc7=Fc3acUiJ?g0d)82|%p0FQocJHzIukr<`K z7NsXte$*Z)x(9SX1;79sz@v`|#B2m4lvRGzXQy~Qpzx#505*UJ^Pp6Iiq~&NKb5|7 z)|nrgNvQIp@>7x?@Hu`YMkktbMROiD+&fBwLs8gq_nPVvr3XBoAIV%0Bo|D%g;G%< zYp}sHvMk6lC)>=RsNj@EPuB_-nKhstFji<&#GY~rXPt|kN$1vlW7~uI$tMRAS2PBR z8^J8j&C$zpu3wQw&KV(xl2O2rW{(@; zUqKVptXAI+{@=w!$$}LXM8r{LA%5@n9xdyQdcNnfIa80u?Y87)5l4bWp@_7N%(F-L z?V2_AwTZ)D7(ev6@nKXZ3`Kc<*4wXKJarh;%AIfR11xzYKQwS~%#Ev;-h1`M&>o#w zeKwd`wP;Su$24yZ?qk;FNSv9(ZC3@djp}2l;!KS8_V};?!}|n<_UzoH{$u?*HZ$ei z0)!H0%DI{PO5dQ)ewEu+E7P*FrgQzuVZ9z-6)`s>B?%Bw3j+Js`BPmRRST?Bv0e4D z?P@rc>Sb}&z^-ld*|*SC!L7Yt7kMNsYta zoC%|3ffE$l1~n5CewKMh|f-H0#=BXc)<&=Z$v_S?QNf zANgkW^7luE_6}&=u6h}8(zip?)r&u34R=A&?oBbB{2qNKpz+T2tInTFK+ES64xT^$ z8x+?|!GXB-;l11Omyn|Kesb(F3XkLm(xGQuv`rZqiU5)#?qKyfvc=#_5dcrsKcs?KyiJXApM0ncc0$^PGllX4a;_&OLZQ9=uYMO!{HA#N^2W%; zFnd7hi$MWTG^~mX2~M(^Zf%H+hzy@``q!Tn-te_JqtA?7o;`j+OoB-ZsqOeWx?PQO z7-(P{OUU`k^0t_$fSToTWZ{&t5O=S(4XQ!n}O>;bMw>4AmZpGzurYa*Bf9S{W+SMpO zdDM_1`LQLPIohM8U)Ltp6|Ew0x@^qs-Sov0SU&v%n`Kx$be$b_gF)T%V@J>UG=Bv*>20u1fAhNVMdMO<6o~`@_ zbZM!*m5Ol<;{El9t*xqPCcXC3L-_gq2(-%M4Xd2`uKpXC-lnB6s=yIw5|K9a*evrlzZ0C>u^4;2% zl8xMO#jY049XZ&&X-)Xrn?7Fx$wG$!s*>_^B5t?9TUl+UAP8H(T+z6k2CC-rnWOmT z92yi@LsnYy1NkA{$Ur?ZcW+a!1hhCf!6}Kuun1?6LZH}noI*9s$HFD>1aZ0ZDMy{s zwc*+Ppy$b5qLdcCCkq+rL?yKN&afBYG$Ay!>XSJVgrq2?67hpLz{L~sV9#zs=iW>? zux%qoK)MTkFs8{?UG{U2w{q7%qqGl=@L#`T5dznCeL@OH;Lao*9MZEh z%Grd2*tKgRs=%{fFaHFWOn>8LeNKiagd#ngAIdxMjLnck4=j`qo@iPAA$ASSA&fz= zct;HAA?6QrVlnx-{5$NQda$k+O@AkL)$$E1BVr>Xwya*hD|XG!4XZbQu@t+pk&9!$ zSc>2PVnH42Rf<^}j{7?7AG=`>udPj04aU$X8dZhs2a3T7LBg3wKmRn?MtOZ;2=ojN z5<(J}a{eS)>8<>5;ijlho!czXQL6s=hk8JOXCzD4E}R+GyZhPr0~BQDEm_yEAU*@@ z1&=T?Ts>OVyOsP0(N$dghre(lKA={4#CebnX;MyuVXH}bP16drfr1VHNAgRvN}A4o zkKthC{29)&w#TOSe6tP_Y(N4B@HUblf+e3Hft@;PNZaaVP^P^eh6G$bKZ50U%B7Gt z4RHxB-23fU!;ou`#G?42 zIDp6^DK>HVpm&GA04H65-z`|*du?znjb`eoFhSsw&mNmU=`C$~ieNR_40mk^G@0^7 zJ@<5@vYOZW2P4)kxk((&LMhqJV`mtM|9kV$oR4E0m2pX_AGSQ3A7vCUBi_5?>s91i ziB3&(#W^&)W} zP8ij?O8G_8C*-83gtTqgtfFS+JS0jaUP;GCe>@wx+9#XUKJoJ&=qqaErQ0r;ku#UE=;dZUp86&6zM-mc+#~C&ID~Y106?Gl92#8@&ueC+sW5 z`Jyl*;yHFB#~V3uC>)m!kL5>6mqYHDm0{IoX)~^2dKluv$ehBV#-xibewC5N>fWRV z9CTPw z!G$M=9UtgDXM4s23>X(4O1kU8{NOR?l@#jd3ug82*!y|Fq z5xZvHvV|L?K8=l961y^D)90VU+)6%k46ih?`%}K5g*=!a5|b?N+OWE7n_7n(m&5C-j zF7jM{5TG-`s=<^Dj9<_X$W!3KmoW7-=^ShxOe(V{Pf6}}dz+#z_`tDZ(=MJxlA=%h z{Q1x1zYA>o<@1OMAZeAJbROCUZBBo4SmUyq*<(ilIVFiEV+tZBr1cB*H)f?Pt=$XP zP`pT>c#dzqcfwQoQT#8wMV3MGozfGm0UC)4$J|OuLZD{C%gSoU;D~_P%L1JO4+O^j|FUwN&CB}p z_#tH2Nvk-;{Rji6(FfZ!<=$}wUrjY?k>H?7L1^5iWnbL&WPTKR6$tm9_&|<56;+fr z$X7KsXLt(X0chFFy~b%5PPz(DeusEGKZOY0A?qSH0G>O0?yb2)h^yQWx?kuUM|_tb z-;nS9V|S4c)Zgk5m7o804|{j}F8rwPuk&tk|KtCiGe21GQhk5sKi!rQ8@-(C9LoKl4!G|z+9?9*i5P1%@QU`Z003YB7@&Co2Jj$AtR`1@?ja=d zoFoWr;#w>ak2SurOtWdvXe^e>r~N7dJVPc{np2B6_kbZ2f`+&ubch}R5C$8%0||fu zJRS&7K0*w}HF#vaHU)7Z!`5eY(f)Z+epoD3zrLGca|jj-Q;RqEz~&GL8sb)j?hgQf z0bl?UWbioKJa%9T{mmLhm`u2Y$>mbxn1pcCk0bQ7SZaWN9W7a?7Vqo<2p1xb4TiWO Rbch}R5C+gZK%y{I{tM(Ycu)WU literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-browse-normal.bmp b/console/installer/art/2x/btn-browse-normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7e4d77522312785d116bae06f8ceccf222e2d319 GIT binary patch literal 39222 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-cancel-hover.bmp b/console/installer/art/2x/btn-cancel-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..04c777c469db2d87605141adf3b54f5a89b55696 GIT binary patch literal 46710 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 MR8usyc=J~M7lmOeqW}N^ literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-finish-hover.bmp b/console/installer/art/2x/btn-finish-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e641c60d8a25de540bd4f42b5e9d3fb3ebfbe862 GIT binary patch literal 46710 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 iMma>jGDlwvErHJS#?UESJRtv$7;_79IoL?Ms_ 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 Gc>e=*dP*<= literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-install-normal.bmp b/console/installer/art/2x/btn-install-normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dafe63afba8c6c8a14340ccf41ff55b18262a98c GIT binary patch literal 46710 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-install-pressed.bmp b/console/installer/art/2x/btn-install-pressed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8e9c4be08b093b2f680b708e8c534dda75b5b4d1 GIT binary patch literal 46710 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 Aa{vGU literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/btn-next-hover.bmp b/console/installer/art/2x/btn-next-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e9b5b46b10c03db0cdc54a28fcf5e99de6564c70 GIT binary patch literal 46710 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 zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j{J$7>3Mim}0)I%r#z+b%pnw7jD4>7>3Min! zcm-<4{=eSC!Yx!l0R( zs(96n8{Kvv>&K05cYa>7ZtSSGA7M^jXS;6|Gg)oz*pcl!zOw0eV z4H)0%u_|6|w{0S~q*!gNqzy8wt;t8Z;$RgYDJJ-A+oM*z`(HHCSXbRxs{i*-Hr(1` zw(AgQejE0-OV*8xGq&ygcIV`y_D4?uKGpn@IHTel;}!Ru7I~=HyYh`FA9{8nPJlF% z-xJ=WSh8)VES*BdYFq7BtiOD>Y5(IXi^p57lv@3nR~y?LH?DMF9Wyd-cB^l!+{adL zP54h%KEA!E{2@0iD>%Vsw+;RmJP~bl;6vE@&z+bMrGHr6*bmKxf-&6aA%@#%IqKChJp+I=_8WXff@@AX)W1H4os>>f`$+QdQ73Kf=#){pU;HvTp|Jd)QFRQO1oR~oPQOK}N zIuNDt9jwOk?htUYOv*d77ZlZu&0$zxKH>jciDS?;)aA9cI!5I!VFx2m$1dd9j}wni zwLUJaC+$M9%P|qBR*Rq3pDLHb6Jw|48d`k3{O*6pOwPC3>e0go|JLsZ_JwU8-_B0V z?qs!goZFb>B`0_p#<`srsyXQ>a~EphB>cDTivLx6{l`)+cTE8W{%QgwPoxE- zh7KAxa#&84+6r*bEY;Nv{k7j~&pi6_6AwQB$bBzA@zCcVbt64&sA&rF(|StZfAPsj zo!@F~sBe`(mue$+eetpTV}8qg0g2iJH(ztZ#b=KlK7?;+`|W(B)KJGao_E4w{rY^v zba4;ovrONA)73X#a`qipU-Iy6*MIim2Skj;N@B|!>c8mO?dkjPVDDO|#k^Zz*Y~@x z?z*;9&n|CMn#*V3c<%8VFFEI~YcFG~-gx$LWSGx-Vpa7ueZKtko*O!m$`@bprzav1 zs;_zG!Mi?u_jSG{r^t=P*hQ7%aTPLGWeH%@4WQPxKYFMZvMI5A?v}HeDi6~-8WtP`A6<0%NPfm zh$tPP7F*K1O|e;#_aWkn%nJp@qpC-bXsECK;j7QyedW1QT~i>J_N%Vf2k+j}>4H12 zx%BSqI`!`Q9-rliRBmlrtp3CI-Z=4qz2oC;PQuEC$2ZMNB8Np7oVF*X+Z+q#L`}y; z6v+~Iwc5zMr)jn6DPx`gpG}l+;PLwvrNHx*nmS~9N#vNZ$4j*()~AI^VI#f zhkAWYyXO@j=klx>J>sf!Pr2;0EeGK6M4gl_<8$7z&4t#MqV2cj(~{Hs=WoA^l84%HWSltM-QRt^`#Z0F{!!Q1sTASoz3bKW-A_O4 z!jf$Bh{3--aqn%9-F5Rb58V0FH=nb0AAj)9Q}=P$5O=@w#qb*Y}y`(4$uI^DG@ca1Hn88hPA3(mOv zy33i4b>dk&_JcQGj@&^*T|T2?etqqr0YBe#>ABZkc*gY?o_X&LSEjvgKC$!l-s8PD zzy9Q-gxz8<+Un&wasH&E!&w?1Y^dYFwYxA|!ahFt&^;G%K#OvQHiwmSvvJ=(-*S5-fN3Q_ zLcn~|wOOmG7M-SQ!6~X1nYwC)Ij6bi{L>;yjaWKD`d@zTv(eJ?@4w9^l_5Q=N_XH= zr!!BQf6^+_&{lU~(z0#WTAsBH{k1P?PT4MUDmFAxA{nuWI@FBM}Ac`0|Xxp`xTXwc7KkY$QBIXzC&uf0| z=||bGOHMhKHM0%tb)1{+Tx{BSb)2s1z#TRpM-W>Zq3_sHBX-|(&4s3{dgZByS(uL( ztNNo8Y2zF3yYWhPYN?qf*?h&tPCIhmSi?-b3lB+HOKvc#pQ9XD@>s&y8dk@zVc>k?4jyhodCFY&Gs_N?VP9YzG1_NMk0=?_&Iv79YB8R@dug5*2Y%V*K>Z( zSrtcwGjPSZr+x3$7fO*UX+8w`Xp(1~sjBMc%g&3>j%j@+PiUu7DRjkFG*89`G@q8u zCCtSEYO~ska^r^D;P<>T1A@-)>@d0NJ5YpZ|y?rYBZg{G+DH@x*NFN!wb*t%?x zZRRL&k|4IsER&sf#C{`&4laV#%8&DPl&F(i-(acvS6^`E5rcls0eR&zOsB=FDOK2X z`Gr?sVCE0re7RTG_qh7VXt(?N=)E_4ec1KTUACN~s)|dD-K@M`;*@SCZQ6LYnM3;7 zM_t!ic(y(NwhmV=)eOYv^Hjyv&1JsqY*QS*+twq746Lsi$C5vO`{f!7&brN-%MST% z0PBD8u?JXki5cR`-E4(LzU=+c9-FSowS3G!b^x>3fH*Bn^=M$ieQfV7*B?D%SkBl6 zT4Up<-8;`WN!2Nb?Zb3&Tw?bd>IVGq?TT|vv%q9=67piJj@onk+UjQfSd2q8a>$ws z&%VQYDSmc*GB1M<$4`XiJw57AF`JEHmhres^4b>28~>vE+;$$oP!!($3p( z`r-Q_#vS06D=y^1seEzIzvaq{xi_-Q=N^A3Ypy(qm1juH${iML{Zr&w5=iUJW;(%I z*Pg_ZZ7Q`{FBj4H1j?J#TpM1VQ*n$q$}Mj=tP}0LWMXf4_vL5Ft#7yX3d08d8dqO} zZM!PxD4>7>e-Qz0yrfNEeEi{#>#anRvBgS@_vrjKH_ujyLfo8dt0~66;_QFke&t1X zUDxT#v;Vnn$GMlEV=79sNsMCo+UhYQhwZxY>Z{B*W1lZSA+jy*z!4)gM8WSmi_J+g z`u*p4it{TXxndcU*s^(IbX7q{72Lf2!10Q)Eg( z<-ZR3#}+Gh>^ObZ!c#@SaP9eL^!+}<8=^S&g58Yi#!~n9-XM_1oETt}Wfyw-!MjQg z37G|QON{!O+Hqrk>;Ln?JN|8@xu@TA^L4gdZ7D)5@*~LazUf-*6ou}r>zmJdAGgoW zL{_ZoAAeu}mQELTd*`)3y(4u|>(Ow^q5oj}UwrI7)}Ny+GM-Fdcj1`}OkTC>d@~Yg zv5y2E3r`ub)-tn9&dl|em}jfimnJwoe79{*Idt!<&pYkh;|^VR*2#C-Xtlw=^iL^u z6wgvaK?>gWtyg+=|KR?cuU=~A$xc3S4_3|*#3#SVE|p59C-1#&;i)I1Se|JPS@A9t z6WYP_ZpeJvle36y)bac7a{7_`bGCn(s&a@Y3Hu{oTwmMe^%t)?_q52)w0FAlMNw|t z|EJroxR7v*661>SFYt2((5Z**d+gpjkr&{y%7;5Puh>YAX=+%->4DfIx8IO=c0#+* zGD8tNPTV?dFy{%uGgtS%TW>UU;IDBBltZJuHkOS1!ib?{>sWH+;NK>kU)W{CRS92n z0H4F=@%<(mUwy$@R-13eH=lo^)%NozaUWX}RW0SbLmZ>JngKuc+3RoXu+B?PIfjLv zeekZ!Pd|}^a{E=6{NwNIk%7X5`5f-*abwRv;c(`VM`q5~y?bzy^y=Q_{1cDh9J~Fh zi@Ut}Dyv##s;Z5bU62fBe2S~MR6l4y-@Uh3kNBKC^`m#+GIrGPIKH`Lqp^|d$Yp1p z;=B_MXZd_4^Hx5rzx?$5>(4w!Ua8yLuaXzrew`K8SZLN%L($ZZC@{l)C|C48TW{DT zSzFz!d*_39*qmJOK3i@;?uMhlnz?;(L!;gyZeJgM@UKJmVzW7Q`QE5?O82+#zWC&t z3(jCW*-eTv?z`z~wm+&ZS{}rvjc=%B%@5yp!)7Zi%Br~H_TF-Xdv3Ub>{Z@{<`XQP zE%^p`(Law~ajt3CU2M)ZI9LnJ-0HQ)LbI&9_*~@BFF)hNv|-ITbk><)Y!5Z0)Q@nO z*nTPjxo~c~@}m6b9amlaz|B{a(~Ql=r?GKhzn{n`oqE_lNB?7o^G`a0Y8sM{Xn|I- zQz)_|;ra`Y-hc5a#~!!u&L*nrB3bfoGii@5%xvmU$aCX#?6tHNS@ z1^3cX!v?bfWZx*qAT7(+c#&XnX!z#Dy87Hx`4k`Fcky%9F$WVl5Qi{_ zuZtwC)NsV^+YrnU#xRo&_;=2k;)_NO9rVFluaYd15dd(lMP?_=CQ*w88fv?}^E%<{ zN^?z1ghS**P(7Hsm~u%Y5yHqJ1Bs<+@t#*modV9pAq@@nG@v3mW^KD|yhgMXYHWP; z&YQ?S5U!tiz-}LX@Gc+EpZaqdG_Oz!NQ;}0dza=^Bm?!3XORIjYL@N9%D?BjB?Ps!$e(X%_NDyk1SN%BU< z?^4~?Yb>+f+RH~~Fg0h2bAZM+>DWDa-|b{ia?lmQNqQ@Ox7XCIyqytR*Vk5Gan?WC z40ePUSsSzoHHnulIrTVl!|Y40!6AU528RPNoTB*DR;`jQ&dJ8c$L_p&z7ADuFFMDs zefzM%>FOx`+V7{658iXt`DY>yVdWiXh%X|BBn~9FB3qG5x%1lCyKH;l_L~!Y){GfN ztD#o$Ugh_;JDoF<-+%cT8F{h{N9?vWwPdlgMaCpe=llX0H+E{m`2{j=1j%eLRYkW_ z9DVuuG|p-FMKSg5S6{mKRvRom^W<;6@FXVr#K^&0=ht5(_Ku^Of1?7br=K{z+mjT$zD`h`{Io$=dGdlpN6`EmCpXPlH1 zj5(BIaJ_I+kvXOQjyWTT4&Hy8jk$#P+h(JmzyF3gMLZd2RAVEpo|c+v(pI;r;N^5` zS=@cdPFoON_xqmQeRP*#nS9ETUm#*9ca!o9(Jz42QVqd9mcxD29^2NGj{@`4Pt^DI z?EH4e=_g46YWemUcU>A&HFCWZDzCP{Oq`Y!FN_&EJWjld=sH)L3?1|<*AxeOm3gK= zBXu4Aotz`}F zrQCaInoCI$K|6gJxR;)OM1+XkOC!N*Y@|8y5;IPE)-eY$U751PjlHgBYVW{&!9l1mYWsQV3|%&%pkD@4mhh zksBrdusnRnO?(j*D+I2auec~NL*G6T;Sh)9^eYVO>uKsk3yKYwn*Zd3_Wbbux9PvI z$kZJO(kNpm3C?Sd-=zjJ4wMY9JkRui*bzfGA$g4+Hn^s``jI?gp?EUL)kUE zMim~*a=9hyhVQ@pgy@~1k*xP^S6)p0;E-SY<;a$zfPJ>w;JHWcd+wpTxnNH^a1X9B zx-f9tA)CVir3PgCbynnzrOcO^td<%jmb~orh-L}Y>HpHd&o_{Al8|3cm0yidKX50J zAz|UiAG}8&4VI_bPe4jcR%9XhxTjxWD}9>-$Lh#};o={Z87#1r@2y47k+tvcUK zoz6O$i-@qF$~bbGkx{LyAxE>+Op{Sn-Q)eYzwFiHr6(TV>u>9leWplZABAzX0MQPd56{YlT>-Mid)>ABQMatEVoAXPp#w=!xzh^cmfmU1i1IW@IQ&H05? zb~JAE$bGh4pDfjpyKnn(x6XaO{+xQiRp+Pnb6U>BxW?0^!I{7{+y4iS$n4a0a*N9~ zP{p@6p@0Gk{51tgadJ{}`ROMRRFEnW*ToIFT;7scQoEPbNQV14g?NN92W-0u1=PG7 zA1~EWh(vaPO7J|h5|b2)PZ6<`Sm$6hQpwaFX=3sVRA($R>*Ocwzw3D?96-OWA@r%$(bgl^B`YDDxAMPHmsp;$S-}_Fz)=MY(*(9%dljN{6hItq#C?M3+KxG z0;?irB>qh85N2uWoY;b>o%E{`VSLkUNu;MKaOHa`N2S!1k~D;gpZC~o?K`i%Jj&nV zC&t)hONv!7O?~=vkKFsOL-wX(VyT%rthMMI^ao+TSegKgh=_=bX;Mb;588gSZP!|M zqh%JLd^lQDSCp?7>zv4m3`l@M86EL9t7;YGvz`b`(tc42O>U0;qMHn-7Mnz(%*L|- zAEetg{W7TGdi2g4`I9xbyAAmp$sZB>kz*w+VMjJuZlV05Y5fLE%?H8;OU}!5F_WAW zO_8G$N1MTLB19}T5F*laf2Db*yY~Fk`S!{mLOX(6@(~|*p{ZVp!^FGPcCpJerC^%V zIPFC=i%MZe-EV#S@a<$Ma>*pyTr+me{@ZRszHf_FI(B{gwaWD~-R+$>Hd%IIa_fY* zaefk5a{84@Puz3cD)Y@iB?a*ed102!!A!d{6PTIf>UUm#X8Ad$roeW{ul?yr%+}_Q zF!4w83lyFY8#sXd;#vTt-52?|+L{_JOyb+h{6h3Q_~r}NK#WSeCf+4@TWgUy2p6xt z@XRtU=pFn#V+8bt!VDWZ&rKjP~DGU4ncZmnWGlsz~US zL;EY1;hM^|LX3F84P>LG7a%L~x0O5o+V{uEbyw7Zvi>+3CQ!dnj^SA{&>HIx+mham_~lqI`hz z*X1a>|Bv7AzR8-opoV~!vxUXz4nJnp2sVaN1#-L8xv&=;9kRE4Hh-LD>Bq6_#%qvK zZK}AWAHb;L6e*Bjz?u8=!?)i+M=%;;l4aXxs|}%EY#Le^-v3+QA1I2SKz@O*pz@0^ zZTczI?y%lUR59eL>O3dkImN2 zC0FHz^s;;gzlzJg^aprD~$qKKAnEdS)aw^E6-+s3QY zQ9V|dTKzFx26>Q!cif`BmTJnT>w;Su?~`D0rIU4Hn)PH)e=DGX0)J(JNOwqF>T2mE zOS(g8XB4)SgW*WLNR@^U=EZ#8`K{lNbYUP(r{p%LZY4fmJB}oYGQe1j+UJTSkDD!( z?p@w^aq;OoP`+B+ekV}BkaH`1kcG)F5P%W$6F!aaMWZGv!LPj_LcYp-JDWjDO;1Sz zKay{fY2IZfX-z{z!<)}PNm6yyIj1nq9OmfA0K2 zfc5ZGJ$hv4*I%Mcd;KNnC7(jjyZ#dMkdzaU$J=$)X|vlYVQwnJOi?#wvxn@w<%)Ao zLm>SmgTtiO&KxpgHn#bQ-L@fi{jJ|mXC8eJ!2t2eGY{TP$CKhf|Dj!o3{I(mrp3$6 zJ~a(OQU~M~o0l4hb1vw)^**xd5J8$C5BqNg}C<1su;w#c`R!EH-OA-&W<4okhm1Z+U z_?!&nWm2D@=IfDV{?IE{SgJp2kL@_3_iB#G#zMK-|gKuZ@%o@WB);yo5dg^k4*i`XEEeaBdy<~Y1uVR?fJ6_rPC~v zhCd1o3|W#onk8nKgllAkhqtqk*5OrU===Q*Y2oCaKXG_kwsvU3US`CcYybC^$cG*~BVOWQe`0u6?YpdPku#+Jo$ zzVGMnzNR|^r|T2<+``&&{ZXegPh_1Z?6*s8^*Blt@@n(e#>%7oe<H;7szq{jNabAQKCYNM_NKs z6U`;VTX|!mO;@T*<-o;j+~}ME|MbJoG%6$Epxl5wMdr;V2~C$t8m}zxEbWoF9_f0( zojk9t*x+JGF$!@I}wAMXJZP zaYOs&laH30ZEA91+~{(8)U+di@B;Kx3Min!|B^s7w`hor0IBUVvrS1!4mVqF*X(0X z<*&c^tWB0%v^Ra6OAT~zqdP6-bu>24sasBMsc@$_l(3u{_7ri&IC#9Ge5_PYQPtXu z&c4UyYm;(!05KBXy=K1Bf&N%u&`rbD6Ur1S}yfH65_5h`z6X*b# zcdhsx0!511I-!Xc#UFQlkHXa**ISvijQSl~T(CVqeDftCF*OAgkJAsAL&JKCbyiFe zx-`VbSNweSNzW7Z-;HM5NA9uRzybYe#l6uo3+=q&YSFK-{PWGHy@*d}|3F5Nd8E-5 z>-_z2G}81^9W6=LS$s~KY7^_W{df^bliA@UVHb|wdq)DulMdLOs37K~2#N@8uPxSl z=(g+Gj3}tg;djNLwYij-Q)t}Cp%fn8chgm5X(@p$?@IIkh|M=?)dRO&(>$v@#do#c zLb8Z#`9a%nj(poumH0-Y-ly)nz2o#9BK%8bk3?T|6(Q(?mx9O9qec!N^b1``c+sO_ z)QI6UmY{tFy>9vDh<2*SFbEF;9v!He6S>ru=K#wfnP!&DHe(E*(nGgjPb(UR$Dtq1 zpKJWaG0ImTTTK3!GImaNI$6`Ei_j~-m14PZwC2j~ktqJ9BR@0qyTojHYvXXI$~E$0 zYb`uG10RtAr?K4OyKdd?E8g0DTcYLVW}B+AzccG0Y~z9@*MIn~Ta^z^W6ju6R9RB+ zPU{q!M{%$C{_|dB4H%$|Q-wG)UwY@Ba2O5S=#m_^kq?dR-qR1J2H+|LNN= zsFmQ7AvaN+3Bg;cqY{c9G~6WFedZMJ785zkKoLh&6|J<`Z+(AcN2q&RX4a{8T7MND z*@10Qtx$X_CgMVCU?@DssiV@0rgv2Ca3=in^N+L{qh<}X2XDD{i5aWtUCuJJ7ot>z z8|Dj-+&hu^1->QrB2|>+`~us_5ka+bOIU{Q;y3d-eCapiAk}j+a1BzOkw3x$T(B%z z`B|0+kk(D)1vp(Ps-hPRqYBWsofrMA(WZO#UDsbhda?4n(^Kn2u9KQg?w_Ptbb`+H zkBrz{oB(_UcO5cQ+)@~PIDLD?6!fC7IVfr#o!fA7D8 zS^)Y3rlA4}Xqj31_S28oSa7y=JI?dt*Po}@brj{XYc4b^&qN?4BBG11r?HW-Wf;8l z=WoAYnop(QAT9P$ z=eJ*Z@}bwBdF;K{USJH#b_4#(FKRWNf~&@EZ@o$?Pwfob%X!jj8JdVt*jSFGf1!PH zpRYcnH54)M&6l1#nmpd%Uuiv3J2r|Lc~Kx=Uj8>Sq)lrh2x*xidgHk#FnRIu2Z(_O z|I(LuhJkPy%6{aqp$s>)(3Bl`g2u?OHf9a)z4{y-N-Ec1Y!X}2_F-7$;fOF9j;Veeu~Ul%D#ZsUJkja`q%q7Y^G?rb zRB?8-`l+j-7dacBui}a~n;u&hRw=*0SZZ7p)btTV{oZTtpqO(So@v4giyhBjL1$7r zFH?S7Usp?w01MFjiQ5jt>@XccZ*BD+o2^B7&+#Qx%Vo>d5fH?FnA+#Fo~8rT?S1MO zxOU=$kw+M}+a_!NebptS?7G~rhv1z0n%u^Z-X*Pyi=!b^sv%+xyQfF7yTC!rJ3{WBD3=UHF+U$)G}0Loxp=18 z$deD+gKCRgueg9|S|Tku)8vfyz%(~-R#hxqd3xjvmQF?#q%$@bx!QTFswjb>B_a6* zuDee@?81->7oL11{cd=1%Z2poPd}#NC2e~q+#V@^QLy}8ej#=tWsuq0{KN608she= zE+W&%WyQ>VsHhLz+k~qiueHRZ;lE4SbCSXMZz| ztU_2w;>Eb2^rY+AwKLJeNAJH``QmX-%)jr(s}`GXlIt&O(SL!1nBxnRL;!P%p^lp6lSujNDxbP#HciorWPPld7}DqbCjl#BL^P&cdC4+?2F;t z346$ARVIQ=N0Jn^-aXe@Y_9c}oR1!M88e!!&@`7^SoJu%RT3l7ZIHK^&!_S$b}b6W z8Y#GrqDQt)2I@W(kzEyi4?yn#$IyX&|YF5e&@hD$^aLg zow$_j2JK#muQ-2bgG9+8UAb?+=CT;eYlcZ_Zp}6`o(wBody&~Gvt47snQ3jpvnM!e zOjCkNf64Whn426EtD@BnTUEJ(v5}=ZG8#0er@%Ic1e`6!GMSfN_R%L|sriVv*{Pgg zVBB4TPnzUW9!`^Q`s|SDqeywXwW8Jiwreg&D{ za?nTYzAbMZx#xC#mU^yS5*r(n2DT+{MdJ;I#H5QWK_6f3rqxd1`4hUaUsP-!F=9XY|oF^bmd9jEp zQ8zSM#lM*o-xO*h8xk+Gf&CjLKF)uH~Tcvf1Il^$Ld^Abv5Ls zQ#;8LPm7~ldOPDI{fYbnUr)cJx;m;gai9R7E#xQq@=RI9Gbkx7k2XB1u$^hfE1)1E z3d7SKH6K%2RmEp0ZAfQtx|@|~d_{{mDk;cLa=*=^D&=UlY2h{}Ozdn!!?&OHB>2zO zsoY2zYKeM;H5ZwUqZuD;@27vCZ^`ssHvaKci*qkdlHbcOa zi^>RMe%cVGn`Be{COeytQT__7P~rh|Way$b;K-qj7)-;n73Z4%hKtX7|BY8zC!-L& z_xekWkjCA9yS0}i1)&>Jx^iP|UT%6MK)K0NUS~cVxw~?vaZzwqu!WUxJxka7DXSPr z0h_i(BE`Ntp@0Gk{M7_<97t(ADO&2qKw{fKPc({gF8b$D+%vg>^J0Poni!r~F3-$2 zUP@y~@_1|k)d3NmGRXf7Jlt(+ieb}0<&D(*(i)cRL;h6T{6gHW>uPVk;vz!I73P{I z7Y)%Vk3W~6eM-`lc3v~YOq%ZS)ouGPBbEbq*sPA0;i;`o@m9~yZ!JIjG_+P?n2soEkDN#v^Dq^WQ8Y^M!{8o_$H=H4 zL?#ST&U0NE+MN-2KJ5H16)sE7JO%wpd7=cxag;+AFa9K})%C4c$@CS&txV(zpAUC# z<;8m9XjVkp0adD}P0p?xtxgopx93+5s_7%+)Zo2#e&dKFwpN<{}Oq0dnIawPoy8x}S zBODq}eu3s6#Fm_*ZTl3bZ!dA+BFtW5o}a(_5`Si5&a(|@nZvLu`TXZ-#sQ7zZYE;gr`1V^9eUl0ScOc9Mtj5FU=sX8$q$;)In#uws>h-~k|v+*L=!!*CiPvtq4 zzjL>sV$Rx&&BVbz9{Z;@n6>5UiV8 zvQa=mmXM=B9NQH0ms=s`v5)fOCo(3_QsKUo`?_)lrd8E)AyW=OF*|J_L8j7=vx^%} z6i}oXkKdfA92aT^8T*%qxDm0(Tg2)d&4#+4zxxUq7NA^$TNBM)&Pjc&#)lu@J2CYO z4e_{kLR?z%M~zr&Y{U0bLQZ{R9{HK$g=9W?$gnUfX>o6CI^4D62<*8j#Q+rLP!_bk z|GpmO=QO*bK;V-YIyFBBXB^oLs_oid&iRy}ik5N%Zg*@|+)1brKJoxUWiC>(hs8CR zC%7v2-*!`S#B6PDU&roD;3N!|3Fa4)Tj|j|Zlv6R6N49DP5afy@41az5E1^4>#tmN zhzptY!`YiAd^T(?`WV{&KPp^S&}Lk?#wxdWqx4-N8h&;P~fj7z%8A|(iEZ7 z)`HG=jB`Tz#kd)yAY(_5B%NY`9D!4KNO4V3Dw}V-gzF5cN_F-f*LJ$?ig;?zo!55S zaov?Dz5JDSxhZ+#Q$5~$lftfCwwA|78uCj&?*BPGO36wiB~EmHq~9FX9E{jcw14L{ zm%aY{Qxr+j3$OC^(i0CcpG?i-(@)ZBd?XHEPAI7+AfJ+-Qd%M=k71o6z@w~^q?~}0 z>6pX#pY^q|Kw~4#cq+$7syq{jdnwW+hFrJf@3qQEEjP$qwCJ)*B@T~#`>j7uo!~cp zKzNE1k1%GWL7r{IfFbzv*06Z1Kdp4gN025`utxLv{1z>32#2ENIYO5f?Y__>7w}uZ zAJ_$cI2Oy#F>SB(XzVjy8NLZA*ysiany#dY%qV{TcJjJvUp6 zL4hcW{7>Z4pIRAI2 zYsV2cMsuuR`VQ{@Go3n_X5@MD3t#o>F*Lt5;OE?Gi;Ar+S6z}m@;`s`#n6ERaw9H& zr^qu7L|l^P`h|a|zjLfAg?~i#jA==T$kAlrQ_g?t2Z?)WI7FP5?=WP3X`z%`!bBLE z`jU`e$Ylr|h1jYHP=^qIa)Zi8oZr-&kYD)en=d#&$+L6%?Y!YCv}Wgep&>feC_HtJ zR&eQvP+J#|;rp~lSBk6&*Li~B%JWQj*3mI2bjmL@^#S4ZE?#_fLqlyIABpBVJUB6; z*_^A29>2}cUtm7#>2%gf^k0bPlqI?vHBe)<{G3yB>QY95a4Ng_m1#zG;K>m^Q^)Ou zK%T3C5*V7wC*w9xj^%i`Grt0Lgw*u}Hq2ZO$z`sdOMqc*>#su(o1H^0iFuGyP&{ zVT&zi1>eqYX0cDY)7q`-(o>J;Q*qqOxd|r}P(T3%a$?Q+oWwaKKn!J1P#upYD%arW zdn|>hm4%0SCZ*Yw;pC@q7B~50_S%t#B00c2`(RU?-}(77 z`{!04^l4?>j7^qXm@;P)#|b}wfu}q1)ouGPv3G>u0aqIVKwTX*Df3iS zbvomu)coM%=O4cJu4^x)>Y>N`Z&D3GZ34e}+%_+AZBz|VLjEVx!F;$cO9Sv0bxf_U zo!F|BG_#SU!Yy(Qm3f3bO(|=tG090bA7pL$Te`maGI`A00Y55ba{egoHKm0#I^tow zRIhy8t;;p%ox1pRlVAAHqnV~umR;t#0|bgOkWoePY~`W+qxB0#et~M5WoDg%?vMo+%XX&`;vR7@=!CbBf_v8gtQ|1zxro@Q|O9VlqA>ldyh@m;*6p-NF11W zH@_7{)49KM8u6+87N1R(2yA4W_9?$Wfi~HSu5Z3VAV(J%9va^6>!bJH*!YQ=m~fuA>2M5hC%?ec8>#XbH);eUm=T#% zj#T+|+?3E@{5rCtl!U~+qEuoBiTO!5Xd1`zTt^Id#%+-3J#OP%&MBm4g2zD9`)2t$ zrs0y$tK~Gv`Gsi0ltw&b{@vGgBELYbG1F*dmW+V;QZr9N$rXRHJUha>IUOXaqJD7V zN4LnU^|t~FDDXciz)iC9Mb$rTZb{8~3MWmVqvpD?KF2?Kv1pWAUr&rpd`=3^?KjV7 zf^ePi`|X#WsjiMeS19^pg4WR_2RXlRW_oBc1y)Dwk(yQSz76C5@Gi|tNe*b|9}N#u z+?c~HD)EVpS%Acm%*)6T!zpqn39fuGr2NR?!>Lp5IQ?WaWX;=C9I2d8(yWO5!kOt= za!oO3M4o?ad?eNxX<}pa!l3z6YM{b8e&^@#-M3kJ?&;_!p5qg?hXHCn?a_q}n6xC1 z;bnHC0r{3k?6E!J3XN^ZA5q#y8}g>tu3OWv_UOH~r#nE*i4keGBL0j4f=Uep1q4F8 z(vb48CAq_9E|5Isuze|cBcnmQO*V}h7Wy*Kq$mEIE}pDPz{c?P6wwx`WZ^d9iQI0D zq02ekd6>}3@=W^YvO-#15LhOi27lXPvG^h~2;3hy1jy%8hzB)tUKJg><5-m9k;>82XW`k3z8LwEWEdze$rKfHk~UWd z07#Jt3)3EnQ#2Qk&;^@Im~KHd(Bf9l*tSgYXP!eFKV~xLmQLq0O*V~O$ppII$A*ok zJyMRnsXwA`HRDK(q{UQS4R?5M8aXHU>eG*MpQnY&w3XIWB!&frh z+;aKzj%zNZ(Pq)$D(^Lw(M!%W83Vr2qk;1zjTsg73vt?%^9%Gr;Pg0V@10nA<}HM& zvnCrt`442p)z?(8^ZJW;;=rehv!z(Z2?Z2T;IAW)Z_eBdTm4XT%`oyb7Hu`Z_>+ok zqRre7mvk*BZRPrf7z@4l;Yn&m{Q@KZlM2vunI5?00(iwEx0YRqVsi%iBXO?`?NTD% zc=dUw(v+IUKT#aF*qoHb#qU-xW-dBsWwcftL6QcxK{iUb{mbK9)~u>A=}9IYKk)OyHH ze<%K-nEj%E9mA7+`+V^UZG?zj`4r`BH2!D6D+UGSvBfk(UUs%=PCsIQrkO+0E*({9 z!$bLM!8MT+Ihkf9G?t(rI^R_!rU70m-Ehg-b63R^lR1Tc{{9=9aIZAiv_x_A5vIJf zApc@xoy_?&(|+Nly{%udXT^8`YYHRA`@DAQ*h0e@F#~p#~W-$R17UT zCoQy#Q5+`{`QKlR&0xc7sZe8L^awhKl3$?T4bS@GPp&V1Gyc-3Ap>)MfhKSi+vd08 z>@Byx$oT~-0SRPz?DYJ;U`p1gPvb_O9Tp0lcI$r+<_ z6a7#)vgBkV13PW>)}O1YiXNtMd{fm11DElNKEL$YX>6n*It6cMGtD7r3Q$K3A+NRpoE4Q%31wfN1Vr@%8imQU<_Au|{+=T!`xRdJZ|TV$!Y#TCh1@j)jPP(XpdlmM9p?urahN#QMn z{t=S#qKWBCPd?1}GYnHho8C0P>8-o~Os>>30fBy=?Djc>4;v& zjiGHVeSS%TPd;cb;tirio-feq#ak5g(MqQ%oy&(Z!dLPOJ-gBHm0SkVPUVZhmE^wd ze3oG*AE_K4DQ{AdU!Y)_vMhEywzIugB=-yn)h53X`&d`Q0FqEs|ITB=SV>KK3NuML zA!r^~kg$z46tDQAnsHd+Pho7-$frb;hVz}@c|c|B>X=y&-somq%6NW?c=aZ!q4NvV(D zZ#Nodv>LIW%9>Q4vh8^%9)9dTJ5dHmJqV@B58irxel|4u1wtAcS{%09HUt}Vb)+OP z57l+t-aB#lI3jsRm^tqxO@o=_IeTonCgER%8D*|wXW33_n*Kz4B-W5Zlo+Olfojjr8Sa%cghoefK&uy5B6X%|W?$}I)P}?vRqnq)pMAFGK~hSux2csRzB&`ojU-f^pqG-r^5%SA%%#d3~DQ`J^wUnf`0z~ zYpReq%0GSgHK8&+9e(+_4-4?3NoujScF#{vm)tpRovT|;C3}`ZraxWIbVNE;S4+=RB037z7@D5co|$}O zez8+5`TlD!Qf^PCiLcK4Skw^p?%st4T^uq>xv!6rFiSjW8$e#fRP;lkqv*m@cA#R2 z>Cr<6<+u1pF5@4WnM?v0*~U5UOYr1HdsG+pBnfmFfJ4w=sHd<+Nnm&yxT zXYq6i`aCW<(^Pcv?)vuY^mkw;rPEujzSMs_zra4SzdU7(3<3kU(jcR7R_(6qJLRHyep4(@`;(2AU5H-!gzI-*dpXa&B9f=jH8-vK&bo9TDBmJ@DjCE3Pjn~vKJrIFW zt)c{*P??+#&!Az%(I}bEBa*eeQ?nDS} z+5$5XS~K15PjO7yP4&R(@)^f9oAiG+clSE;?_Yx9%mU=sct!^&SV|FMgw?!9#TuB%VgCz{-pl!Rg$<;AHs|6&H9Ao5}QuIn!6?n+8ciFXlQ5Oq|(XrNB(i+K2KxfdS8#VkJE zBn)-J0}-gorxz;SA(^1XG9g4x7sxMkdGlp@Ktx-Jaxh#>Bol&)97ghqrXLE-iLP_g zm-4&`|IeeQa<{dn`~rg=@i;j?!&k)3KaJN%a6(|f_)E->IV5?hJpg~UJ3dl`1dSy+ z6p-4|vv^EA-uKs{H9pP1=~zKi{5*%`c+98~1i&iY9|tx>K^G?MZc zl)fIi^VSrq$L=vdhF49m^mJxADKi39Q)`NHxil-R9Wx@9Z){{ZDbl`j{X(AC^qWS) z7(RCQ%`N7}A2C?fA3YoMUhwqcj?+)dfrh0>YFQO|kd%nipom9ty-$HEAqr)x&p#4n zq{LBtJU3nb?u$?UvBkOsGn{V>bwxxS8tlz+BkwaG6;X)qyWtNca&bIgdLHPtbED8qQtTZb-Alo*pupm#v-?nIb?(eGpISnwo(+8Jd8azUVQu`?fqB znVL9;Bt3SYUFZ!>B?6h*H5Z<}%bTyT*>PIZEqedmI3a29Pk9C3g}}tT;wDlaA1UVq z=`2852UR5Gf@uaH_s{FDAe80S%0Nc6+TyWmQNxm6yi5M>xrgqKDykHmhkQdVx0Lld z&PB5;&Sc)o=N>UOW%5N2vb=l_zqt=H1aWG2)Krqso%7bKE};mWCW7Q&ZolU8d#>+9 zzafSp8Z@Bq7OO0|;nEAz2a4xH=K2L1I#PT=myM-nnjB;vQBj%CZF_QZIkSvn* z=0q#|6kEc1#b;00Zx{M5aX+VtBadcdoAb4nZ&vg%;SA5i9h30o>LhOCm{9H!Pl6~n zl;VhUnKD8bH@Ea)j^?Io#Wy;kfC38qr37-KR@{zhCYlGLXHJTWr=!BXc(>h&9BQT; zZ1i{LhWyz_@py$+Khf+q%8?EuztFpTjE_XMGBD#LpC(nv>A{lb4PztFJX)*BP1 zuDjTrEn4FXse8BR70pc=!g zlFJ|=BQ_?Ip$Ih3=Qn@y*y1-|c#6)Ot?~;Qp8#pt;DNODWfV$EjDPVrRd z(ph>S)U#xVRtXMWxbzLYU=PCsHlkfSMb%M!?xk&N;~;t;-w z@iS>b!Be+lPO6aN>C#xyl8Ww}!-ouHJ|_TgRj#M$+=#YwQLM^?m^sHDzV&*h8Rdp9 z)gN_vhe3F#Q0U1BIbGhP5ycWSPJY>G$M^2hwd-3i)0Tj9fb+a^olLXZoL|^{#l<;B zJOPjuvQx!k>CB1eFVJx&TE(R2FR({>fwcQ2hEJibJ54NzZK9r~X_U_9V%S_1OcxSz zF|?|pTWhcGUC1u6qddmplOA0eRx~~R;Z35Qwt&UP{D}zyOTuQ_{*ftu`-P|8dF2H< zUlV&%%|z@&T#>-AWo*|bhlaFO$?AcYRAb^0s zMhqFa;nE94)26g=v9`*Ie1=nEz>%W*kGdW{!UzvMJ&jKl8}sKg|v_V!Cp^IiN59r!Da8^O;HsV^@7yi=zgu`l_BwohiM z{9dOOP(XpdjsUlG%6Vu>OF&-tk5oRdjXh-xNtLcV`(KpN5$P38@lyn~ z9ckr8%Pe@%j=72cR`D)D)b86d1j>LPzon>|kF%1Tbe_2X?(Et+(R*SJ8eJ4G3RKB) zknbQIVj$LHJ`*H@{N__R1yA^lITOXyv{PDQ#z}a<1o;I_C_H@krDrL$Uv7@6IH0)? zBOwYs%}IjupUhujj;Sbz_HMv`KL^!+Wx(BEJx;A`3Ha4Dl5u_MDTsmWorZ@>`hBXCT7?#j%?S9yjJV^6Mv??Z~jI9bb{4O(qQtPN~*Ej{&48oHycG{@0o?O*PulaQsn~Qu$?vusL9BMY- z#0r;oC(@{HMSg*Yf0dVNApWPSf_C*?-+qnq0bUILLq~YB00gUKZ@a(yMw*|WpZE%) zdm&#O^t3kWOyl&(H_7O3KSk4p(DK5`-7%sXtN1wKH^YlzPMs!$EyuYwYB>8&7Ywre zukf7Z0e$JAz@w1KEYO*y?{{DI@AEY^4rIgWX~jgocNHrvCYaAnV8Bn`pL@dLjAaz( z!(7vFjnh|xZ7z;`e4NfBgMXth30Vf(`CN7Gsh6F8B5mZjoT+~tF?3Kd>Jcj^w@Vjt zN)qS?UDO^H6EvV=pxZbVQc;2a$E#l}H_T}T6j0!QMj+w=p6zw~p(H>&2`B|-B}P7{ z_=^O+?VY*pj^`wd{tKiOw2~zvr8zYHlrK2>sOKNO@5gUGCk13Z=NxwkH*?0vBgUYJ zkJ0V8fp>f7HCpxXF3kYq@kw>nl!H+|MrB8CT@a5g?$(7W^%duymV~%hx6ZkxQ+~JA zZ$8Cm88#%RJ~^47V2X5yHp8?Gp#Unsn5Ka=jWp=NQ8}M?`I9t-kMO~^yPpHs*x;5w zj1#-Y!m|+$wVWM)u~P*aF(;j}DP~WDF{V*c%cG~#*@1#tnh>uz*YxB*$ZIfqDw&Sr zMOhq0#57vS-MWctXstuzF}jnm{Fl9Y5OS<#Y* zW5o2gpY~)v?|%1LFT$tFl)Bi?-nsH>N7({4=Ij7~J8*FA25u`4|xlITgM*j=?wvZ*GdW*LzvrhS| z*+Oa?amYP?nPAic+AeZZaY7CsI=FZ%FF^YfvSV~}C<0g3z!6~}DcZ%6T?L_d@kBGS zPHbV0@z?-N=x{`xRPpSRRst+g`NQy}@zgfj^_72Ep2-&;yPuOGx6q3@m0gYExs53T zPbVk2HuCAzQ;-wkgSgS}fKkh65+5}tyEhN1TGXWE38Km$zy6H#hr1l@k+xiQDGIm0 z?A?P>@vlDZMQtFXeUc+6Z&%a*aB&WB=Cqp6pRM+kKRF!5sg-dUJDSWsPk3bcR=HH1 zTh&$NGqCb`Z7jo~VRX|K=bR?@nc_~!EA%qnre~O}4wQ;?I_qTmTtrn)`Pzx|q@g|+ z%TOi91=#AvJt3~vRQyt`p9$`VYy;g@4%}`t`Z1A%$eF&pOsuxl@bDcsG8!0(6!%GX zoOY*C&QSh#mWi8KO*Ol)%q&yUzbtOvf4nTEa;uzHKmi5*Hw2>YwNzp>%XvFgk?@h? zQR~gkpE!#6oFXZvi==9NyBxP}n!@(~iE^{29=MYdd&c>s6D7F=N|Pv|C0Qgc8aUu* zdf`z7boOzF?y~Xf)DH75_ibWGzV3&wKhM1(DieLaz5LTai4!dfa!1AT%<=qRs?VF6 z(}*9w{PdvhHzTei6{vg>K5B>Jb!-XVV*rPHE)x@)HlG1)@;B%}?|_jICmr`oX`^JewW)wO=&bAcI5b zmHVM{+?qa^x?9rJd6B6mefW+WVrFVc-}G+95RR3*IWf}_GxOYy3(uhW2SFp#?e1(| z6#*Cv5H{0=ko1}^z=V{{X%+1h-<#v2i~e;ql}(I=NG$;EOeg`S%K%|&{vg9t3JVh;HZWNPWdxX}u8PM2C)G!Mp7thtyVoZwUOQ&&^WtehaDm)|df-pY4lXr1CX zmV?h03zScr1Qmyp+!;9www5wdI!edN(<2Ys{nUSCCP#!X$xjMC|HQ+Yt~^G0!#I0a znme9VF>>g@2{cZN)28V5o4VWd`J(sA^UOd_IdzFmkB2K3h>3d2=PUPuPQbJ{y{Pd#iOLe}qj`dG_t&MV|tbLLR>Ne=_Y2UvEtsmN~E z)T$T7W4|gMEy3ked0i6^^DSTX{)j=n7%?FCer0FLQ&TY%gFh_N zRI5_1KxwW|q0f6BNR9jgBS;VfQ*1&o%-xTum|dU<9r>tWq*R}-;yj$ap@A{zxcf1V z9Me(SpYmvIbLG*gq${R#K{|#DO)<$mH(bGHkM9a9K9bJ?@(Vm#nm9ar@+ms3-IN}( z5DgTsxRBoz<52RzvB-bk(&+*kYq6;u5eBxc6f0KF1oPSQ=BtS>Xz#8PS%%a>iIjqF zJD>IF(sVPA-oz~`3s@(|j@7jP)AFRM+>-RcrVq86&!223?{VF6XW*RAqi__N1s2Fq zbo}RrcEd$yvM|S`?RuP}fC38q1qHZ;l9DnC-%)$+KzSfZd`>zUyOQ!No?H<3%yP-k zgne2>p^c3soxQttrdz@G>#Rt+L)=Xw(sU~)%&M*K*XP?;o_d751H+-v9Ae18rh;xZ zDW{%IzsHfn4kPiPkZ`7|COT+Ki@v2#-FF8&_`AtBAB=sh$aF9r`HoTpZ37qqDFzQ8J30>n z*=jNVEcT8GLK?amve!&7Ceo+fJM(cy3Su)TI?kV^H3DKZiJ=Ac?N?viq*wm-Vr`XT z6FJRiiO*>%O+hQ2WK)N9;`8yQu=&)Y0*KN}x_b=x@%#V7-g!VvQFLp25DchfFo7aD zgCtRc2#N#&0f~x;sDLCz%n1<`RI(yT1QkUQQ9%$SN69(ooZ|_cFyZ`9bH3C~&q% zbP+mgda3h&cB`iT{{3e-V1ybsurzzGMU*5-WBB6-3nYH&ZUNVLOzkP$lBOPBlcSe{ zzXIcem9($A<^Ll)+!TWsFM1Sg-3mod9Xo6?@g@i2jbrAHl@Ul*U^;Lr8p*uw&_>PX z)yG8PTY~4?;=iZT{V)mL0(K|aQy9UP#>bX-?FHi=xgo6~3z|x83@Ow2@MJ;MLj$l@ z81R3zR6gb@2*u?W&B0_%3i^QAqyZ)XHcu8zjGdcUCE289u+t@Jf7_ot|6IgIpU2;l zf9^;UYqG@->Wc{fW^lh_`*-8+WxE+|U|@t*7nv43uxlGH2$-q0D*18S!wD9{@e*ar z<6rV09McUF5-^?IfM4^9U1K@yebl?Z*kkt<2s;qmP2P+YkMQE?S?)I9cQP7n1*-;q6R#8k6Q`%>VNK&7>Irv)~_OHuhcXfPeWh5BQ&H zsDO!a2Cq9ddvxC}XP}9Z{FMK{Y5bIYUX;W4UkxTNdK$}&ruNpj^%ZQX)t2;ld@Q4; zgzOQmjKttZNeiT+Hp7c?6^a6tGPKVJX8C5Uugg#oTm@&?!W?Z(IuZOISnZm9_i}dl zlRPJ{ztD#Ho$yoP4Y;y>=jHkc$L`hrB@BT}_7?j;WfpHj-Cc;pS?HpdbxI9LO9w{$pl56aBNWbj}PGr*kj7BsaH!d1NnsdfONO{TD$8?5F)u zTF_s$HWr^(IMFu3=vJO@@wRHXi_7PnmrCZx8wagCgwu>xst5BY2VA45Tx5C z@@Puwl3*KBI>j#~)WXaAr|e?q4BglMzS8~<6h`sRFlf_)b!7 z>VKNq7U!mEy{Z3Ut5UyvqJOgf4;KsdmXJyHf4HgtElAZ)5fFi^oPg13DgAHmO8)&! zb4-s4?f;7}Su@3uj(lIT=6tiCU;W0Jb3DVhn}tc@|*1p zu&3&_^sk&m8wL38wLJJdHlxh9z zZ3a*N6TjuOJCAAA|KKk6ou<(9(=V%7b3mR&LtsGk_+8p?1%s99uMC!H@Xn%ZfV?zQ^8`< z5!@)ek`(vd^2rNRPm-plSVQiuf1`C-~w5-dLkL z;x44JMN{6^?|!GKNrIKTg}9GXC&yD1QM8A~yTy~#89eTbbM);cR1-Ji7EU_@sXa>w zS3-jGyy!*?B>7WwoSWM6f%q7I+(q*$dErYQF1>0tx-5|65WvpopSd$n9XUWT zdnEGA$(V?x!fOzkiIBy9GfNZ z-LL`gywvv7w_h3l>4!__{FUG{niG4(+&Qs`vQlT)mJMHg{N6{ec3d=bDkZGWG39-6 zfBZOh<-*xC&uKOK%4o0@tsz=&EvC~)55a`;N%WF~%LkuP{rhZLw=y>JT(C~3Rn+O0 zr=+o=oX@GFhZg+xM@;0|fX^|n!X7sK!PDMH=~3B^jcZyyTKUhPzf0h?rEZ!z?es30 zHSL40otDj=8SwkkC~WU*FIoG~!jE31ct+c!=8X2hXA zJAgc4^cNq$-et_-Pxoxyz)NwT9p+Pi`tJ81zFDzgHm4#^AGbD+10#TZb<}kfm0K}v zDPf6hTJ_J=3Ey&gAU@Wujpnh>Bm6jW=zE=?J9qMEuzc$O`F;GDes8^e`sl&5fg_Jo zuOpQ+#zHhN;-9%Q`o8t@!kK^aa)U*^vG#G2yhph4I|?fH1V6v8U&fAbyQnSfJfQd2 zZ%6fcz4M7f`+!f|{+jf|nd674oU?Sx@M^gcHTb=8-+eXk*nvIl1Cy(M{ciM--tWXk zou}uA*L>{2?x{b0d-jBjj<;Z_@=fz>+cvCNY+f-xnSk%lpT47;?cB7MyYsx^x7NN0 zh=2%)fCz}dwMM`Z9tqPY{gB1u89U^&{kygm&64iEJ8tgza{B|jwBAM;HmG@U&rYsNZfM}O!tvps_R8V$6u8-w_XZD_ zm%06BgZ4SPfA{@)vlqJ6Q!MLsg)@7KXG@QL!H6eXas2SXXO0;WMPn#z z#oOFJCs!_TTfUo2&1G)SxMt~m@OTPbV;2j=Q&tvx$eCMTSXa4r{xs%7a9EruV zyZ1GgLQvlOXHA*Zw0il9_hei2_n(14P-&ZcU5Jcxp5oJYUdf%#Q>EZ-b;}odrOlI= zHf#S`aQ@UWr&=E}+o5X4_E#;Q_gF9_vNKI2oz`uFT@{&1jD0s7{a3&8s zRSVtT;*m-pbbE2~_h0YEvhdkCrr`KISMA!e{@bqxwr%hT{oyW;2P4tvjdNcO%>Wt= z=+NwOUU93(Dz|&07Cr5`hL0rQINq+&V|0d+Ij-Nec^y}U1E+cBMLV80ynn3MZmpZN zf3nU?%^&aB%-!mBYSEzUQ;j;cY|yb;y|CktQ*zI?jda&j#|}5IdH=mPnEqC^&>gR} zYc+eyqzjJmNNdf@a(XgvfqT&gJ`rb5(TCeLszt9ZmGg$(Td=S$8gcdkyR>SU??%tI z^{XiV!-yfdJ)ZiNN=*6bTe=OH-j^@(+!^eYqFK`q?D+f}o zQ;KK5;fcy+&YnC*$4g?Z*kY;2I%d<;3hMzZAGR!*|05o;`i?`{9Gp zLgV`1TEtz58u;N`W$(PT;4PlE^=texZdBB{(`f3=YgRO=R+fWx z$`)F+WIob`n!_0y^%5V8+8@yKjjsoOGWLu9h?A;??<{@WP0n;iP)JjZX^7Lu4y{@= zcjJmBTh^`lVdRiPw_f-0Yn`d{gRU>!?(sCJRAR>DpZJrB37S4Lwmn>(6NRRym8iDpYo`( z6^rI{eY!DKVKhBb^4{Nn92;N|7x{8Z!6)T>ymWX>DV z%(S89qYq-L7{$dzz^3)Dv}sx-vxll$*L`SY|Bsh1m=zA>U+sI1pP2ux4y|eb^j|QY zQl7+d>$H**&iQW4Fz(C#l)p@Sfg$cfnKGb$xrExV7r=#1=1*%cFj-SLQ+o8IH$I-x zZHfYF+nntQdavxfbQ_y0vY?M=%`PKUueZ)0DO+ z>vm{fpLboY@SS_NZ45Wi+}Q+nu>1VJxZ?-+)+txyp(1zHC~?oj#qSPn_dJ+CSE*b# z(cl`z?|HbGd;D%nZe6sAfw^)}`zHu8OU+|s>m^93`e@~bhuH{_pYAMni=pDuS-rrn#@)9j6_mi6lX5`WTZ z>AjeW)P>1lf3RzoE=2qn$mnVIaD~}ZC(|db;oRf7mNiS}jXrnUwHKV41I!m-|6)dg z+G)nkjjG(YV&R;GK;YoA@0M^>)WLhGF8_4fnlh zM+8Jb1VlgtMBrK=VC4rsLigV288f(_qi_-~L`D2Cawv+6G0C?&Jag{!Nyhv!7LFe| z*r91%R7CBv1%Dg=jU$bWn6M-B7b4HU-=$rVEa|Eiyd7^1s!C!q7}cHl)91C$`EE)# zW{|lr5;p|g4RbJxYs;GD49R}-MpyQ?Z(Q5=&2EfBqr-c3?}+H);49BIqn%%V{6719 z7-4?$q4KEK0E4k%cZ@i5@}GHs<3oZWkoS5In(&K{-;ZP@mXAMv`GVQqpKVt5j$6=R zD6YXDy~7wXXArK&gz?2koIbH^-pr_TPWglc<`j^)|IC@;_xtv2-H5=ZwiY!j8Bd{v zgo)n_$9yP}{rVp5TCDzOA(xxGI0`)Uj2Hc{E_uYhBTOM4^WDyEsV6DeWDZW&UO=le z{ycW*XXcX2n_rkTZX|b^^~W!^wFu)!OXtHP;7@BW;AO<1I`a!0!FuGIF7aT#oF@Wsr|NeIokYDFn9N zc*`*tF8n;^tNa-=j2`$2`w^#(yJy*#g`+88n!+UoHn|sk;$WD`)*@4%eZ^i7`?k(60d`#!Z zE@)k+8o$kE4_Dm1)tEmVTs&(!y^9~(yPcjpclv}W8k&LuQT1YZXs2s0@J8s~yt_wA z=WATGERz@fazA+aMeHC(31XrmTR!>##sX6n2b`Hfs=|t~U5@!UI>X$lzj6zAc7p=i zL_h>YKmht-yuhGDrj0Sc~ zqHrii&4?Vo-_JyYYcE)lwtT^y<~8m|2{Z1Ek9YapnHk!Ri98pNmh<_sK^Vj~UhYn` zrm4zF;A0#xoX?5F2N`mI{QlyM{4+uD)0p8Mn?H`ILp42iUjc+4L*J&LKj;BsB%;rU zd6MTk4=U^R7oJ+Vcs^1*f5vq4rcH*JF{a#4z>ncTgBcmdW85A_y|bBmu1ssi$HqoS z;_mf8zFbH4?ZOf1l2!c=?FGEHd|ofyqRyPeUZ5NB=Y?~p`NpRRdtvUMzk0pi=<}z& z@o`MGB(@ifQyH(%8yk(-CURu*_hT^A+SIF#rG~dmrF*lZej8W4k9nCV9xT0g`=$^) z6Lmt%tv^pVE1s7!)?V1R!`cf*Ij8n{?fF*pihbKD88D;ezBu{=W?-Il#xo6bk^%p9 z%NALChZoI#F)jI~bMiu&WVz>hkNr8&2{~>z=9u_t&@fXzK8CoAdDDKQ9@~r~2lgVc zu{Rq$Q1Z;l;}{+IRzZ&ri8UG@bAig4)uJVkF*P`y!Po_%n22zDfx`AB#zaMY_)2?b z?&zEcc5Pp`d~v0`*-PZOex&1O#-mY;s$4|YUcidCHJBeb2Ee(~waXX6Uckt+t>yRP zi;H=$%X9pW-fG|48%HQdz%?qV4Y#Yqdv{j4H&?S773qFFZ}=P0z6gkb2#A0Ph`_Z& zz{rV&1lL|*AI*T6;hX)~3sLWPc^;FYO}&Snef(iY)O&UB;EgjL7p}B$St0YdkgGm_ z_f?!I(C`e=8|UXlI@xjTalC*iiFXIS9PJuD!tigX9%phPU?LibCdQ^%y?CB$FCgBm zh{7A3xBzAu9=JCLL$Ww~Q`?1zGkg#D;B{QePaQjiu69)!mGh*gLPvR042KzX9gbBr z0Bzr@R^@MoevYFNr_9rZg*I?4^=w_Ya_Z0Dz1jX5CMJqyP4{4d+nDA+E>b!+>O2-u zY?O(89zEb=D810AR>KEN;^i`Gz{lsEIBTmjL(ljxMriE|n*GNwj9ufw#Vx!SCt^&) z(8I~i2TSRa^9$h@+8a$8Hwp`G$?U(lk^R)VuK;fRp}!LT{{3ePU~&SuxB+ z67TxyI@O+g;?XqX7oKbM7#)Du>I~Ee{oJr6cWqjShVRj?6@&Abhgd84-QiFaecp7N z@Xxe~<&3>RU!^40I_LS-7tVAYm-xN$6yaVjaPy2#2n@d_ zIvz6-luuG1ys-8~KmK?DHBA1O`<7UIvHnyZvSa7-Q^&DlpRM z&IKePgM4Mo7WqLGFvIm^v#|~#wwO`xxJMiJ5A;lcq2J?&_7TG1%nqEjxk=GBR=vvK88>;*hYd_LT$&0wz)!_H*ESN%R@D&hWnvaMV+m$F8&`+dvj&oV+Wv9Vxh zOq?s<8aYP4O1(<}`CI2)APQd@lvrS9o%D8jmnn0p3 zXJS2!m^2M{GTgegUD{r7hPb)VycB1k+xCQs-+Wc*)^v=Mj~dvI5o`$af-tPc4E=n> zXCI9k*cVryk~wc;N{9kPua6$ok8lzcxQ$=1weiivGQQ30z{?0vn92q22)WsCPtx|9 ze!?C#V2v_E5f^hIK4klFt=lTwHjYr(+6!$SfB3~G>*6ByLgU&gY)xvv(4=;kr=IB1 zuH{iP7ZVJncRK*}bZ*s<*o4llo~V#JGh_Apc5EK|Wq%C4uLt$zn-OWrt%0Fw)W|G3Q|QmF&A~A$Uy*d7OhT53w?6GodtL0M;mNr zEfQD}O)#|gI~?JY++N`E=>W_}aCQ)JLwDRlcn%rE_>4;D`ec~8pl3?dgI@^v7t4rm~NVRlA*EVsx znRY}#1VlgtL_h?t1p-zjrf4tl_zasPB&Pg07L~$qIui$uP;mndQWz&kxFTsW1c*5; zk@H3ZV~rGXhAyp${j%=|kCZB~o|LTtKclaRE22uz96!Q%tew6uT@Ki~%96$_@xpvv2p&!5Bq*^&# zJDC0;-V?{6y*suNlgp#wXhf<~T8>Og>AfS^g7yoKV?WzAtRVsyk9w5ni6e*bzNt~- z-lh*%WL!N|g!HHD7(XX49D&BcaDkW7U6S&oJXRIa-&G3T-nwozJigqkIK`jnK-^t| zqy1j9z=SQ3w!L7Qfd{@ne&wP$JQvAJxe9rYxc+7A@QQb5shmGoxjSzKEHf`e0TU<7 zm^S+uRv2hF_89D@K&J9{WvWu(_PP~{lF}*=N~!9+0?WX74G{xg?yfA&YgS@b$R*?M zUZ$YR}4cN8i`A${#PhQz}7=0Sd@6UVbC#2MBgJT?2@@Nc5GNf z0xr4)5dq9tu`!ELt?(U0K-fR|#>Ea_CY;~68GXrVkFgg3f_Y-?1@7W>zXYr;`WVI| z-f@O%DEHLo@Ab%kQ@WtNKnM1D$&ysF6vou;`*&<6^cWk*jbGp{Zf~)_i|@V~z*(%+ zk^N1=tMF+ibL)`H7WOZJMIXINtn{tCwHhVz9@)PqJ|+^omHCBG;}eKmXOe{kQ;Y-D zD1P^>KPDNDp$QaA%zS&}$d1K)4Y{P~if)rG76^MyIw%4nAOa#F0wQo#5Gn zP#{PebYRuOchxGB|H+5Sq1$msNv>6rkg@WHw2h2Zw{1`(J{IAJV#mQLuyfRUWp1_DBnkF*&JTZQC3t z9}J@8;?~xKy}f3P?90Mlpi5hOfg|=EO_?y3DF)nrXbUZO?FDB- zgr!N0A;1eduxo3jdvn$j|@o7Uf>kNzeGg-HvVg*K0<{s;d8;1?5QqQj2!iul$DWBJyy9` zw(Fe*)R-2C_QuAb7117l|7MI1V^#$GFE**eat~C_5!wTGbP&Vl_)(BFl_>y*Kv8$) zb7w+p5#~uco$hU$9oV^*@~=Pt6ebCg2qGn)*<(B_)>J8Y$3sQ) z5XEVWF?&KA@NB1Hh+)Ebe;YrBQyk|iyHSrL4ilK~;1(saXE0;V&OkIKhK*}xK;9X9 z&%{y%c*VN~C`JJ+nvywhB$xgRjTndyKBL>bw0Epv`}yl(JiCpab_JUeb@4HH`w+Uz zXgM(gSYBkc_9WwD6Bk2*BQl__`)46MH!NT5 zZtIsX-ne=hDPfsYz>j_7>J>!zx@UtsCVT2^OiN#^vEx2_=T(NRiQu5Ou;Fq~fOD-f z1yK9gYYi)xM)cZK?BMJ~wpBvuAHUxm!}b+ef25~sS0N+ov-KawLQJxu zfuE`OP?5~(FicV$47c@Idx50}Ne|5Uzw6TlIy*B$hyi{6`{9F}BVqGOtfcH@Ky~U# z*`-r?TBaQsH#7LtRy5!P9=sHmh+{*t|-=6nm zATw$gE~kE1;gGThbz~31)-)`X%ZP)7#}>(a9a)L~n*8&}uXklO0iW|Nq`~)l8&xTT z=RC{!`r_lzibXP~$06L*6LQNjgS6zm40zE%9LMPeUHyFHS|%F|NsZ7{p;K#?%qyMi zX1tYV&~8vBqeLzB8k^5nZJ6;JVLNp2YLI3)eJ|IWOe0|gm!*hF@8`ttja6>KcKhD0=4F6_}vCFTtpHA^ZgV#cve z@NB`)gd=wLB#FIXmFL-0$1%8YzhN1*zkW6AvRSXQN#BmN1`(%{Y*;{ydn09&9C!c3 zpNCvPHXkpq9%8&)8gDnefJmdX`0qan!Ql0g1=pN4`F~6S6g$rRP9%G8^=unCw9iRiX(Jr*B^;^XCA~BBY20Dv)$XYWKBc%O&gqQ@q=Q*B7A;< zs_f5%WK+a7U_|3YguHj6Z+!Gpu$vW@1AZQv^s|kt-N#%HPu=zDMyyBzPxiTQSd)VD z3)l-BG|>kejjI)jo+!!u0*Rq)hhbfnVp%hoRk_W_bRm8zD_M?#n}wEypa$r1YWe)X z`PE>#vrmKV?er}IA|L`HAOa$A)e|7ffdBh1`0I~Nt4-F^8Ivb4glKgILXO9`Qh`xT z6pl^6&R{0%b3IxnKM5OIkPDZFa8Z|p7^f(3>gYihfnuon!uiw4{z93^vs9hM9hiNf zfNjJ3U7ttjT5kte-8pBYkZQy@BhHzUuyY4A6%9|d2>xRScBA@OBF)$`0YA#Be4ea0 zX%mlZhF+cFcQhVtK70HK--JkdphC}-MDJ;T+-MEx5aavgR|E!U&JZQ7Hcu_UhKAN(HshJEwYw+Ol_EH zCJ;LjG492B0Yx%rnB(O0PkxpH!4EcUSoTgUXgT$2+ZL?Xux|OH$cXc}29c~ad}Dp> z$aAN0ovK#kE+?kI$Y4G$E4LojZl>p$L3loxgz>R&zw~V5s%0=g8$MWy?^>nvSIV2? zky7{CBSgnMS-pJ6ruEF~8_v4PVfI3n4q?foOob_b42nU$-pY4lx+!7#kxbjj9uON{ zuVPWG0DcSD3nvdBApH@^dzsq9kB$pjaFD3*pT`Vip9RP1W_Z4JYEd7P7TWd!ohBu* z7fb*?vtX>;K}ja&m|T13rMB;PeUW9Oi9>m-L!0-yJdZ;i(d&J<7eU#fRiVS{#PJPsi&$F^X`6q|6~NCGFHDgxuw zk%Q#MA?GA(I-_c=F8yY3KcveygUyI#+JlYO93TNHY9F`%xY$_ClS5`ruApDK6~mY$ z44xxwTs1=T5I=0FeRur@qI%;QtUZ6m+7t+2R4dsyNoB)0YK)Ufby&ZiO{$gO!7#oV z*EJ)tOXvKB!o)Y8h+Uj^*m)pdj&iv(Gb@45Hb*#aPjLi)o6@<+t$Hi_9K^dD{~7BA zWW<=wMC6ahql2Xf)-PMchPBNTfpP^} z%OYZ2nvwkQDVQYP(qUpIP?%g`bpz&WtUtV+U$AB%XBqddTp$ zSSUs|SyzQ}%D(p{v!=h$xITU?oF{m}8IWg8K7s*x%9yM81ib9q-gWlGQ9=pYHL67> zUVMaF*QttzC(5IIo-By)HuWARNP%S?@bV&0FQFxr;hSIwwq2Xo*}O(zXJ_f08E>|K zZuhoL1T4@?AIP8cf&94;{3&j{Qxr0{L;Yf7j{Lk&@LA$xNm#^-Sif=^cjQ_kP*yLU zZ?YKqyjY#Qch-zH4QN^ymnT9(T0HUq`y62jHma>z@?Ii4!tDjd=jk)#$a<+&Lmq@_ z3%g-K5M)6hhI_>9w`|z(fs)LWP5y2)sNBwArx->J=tGn6%VKh5{D{FAeK<{-^$-am zkBh;tuWF$?nMboBKg9Ku!?tA3jLu@yLH8lkMMLomc7B0B$$i9wU=;Inz(ybr$o>{E zg$RYP{hT9Z?zox2Z5Ehw1GjCLus>lO(&&CTFNHVT7SOi{h=2%)fCz}d)k?r9C|^8D z@0&eb0j-X!5B^9j#1`}?!BNB+)g(-kNX($$vSUPGW#HwGbZJzzjPcw^oPP!h6uy}i z*}UGLzW$O*NXv=BM~!d^(!~}-(XqS&VZ7WrJUG-H2ew1d1fqt`FW4b#v*y&_zfZ(+ zaeTb_%MK>H1KK_x6DR@y##Kw7Yf!UevwB9kwP?Ujr&f(nWvJFiO64PA=1VO&?rhEL zqrn*CCE1ZVVzl4mr0!(coO;k{pT5(b4I_)2@ge$^Fz2DY-(~-;j?Xe0jNn9y6E}(n z2+*U74`*T4y--# z(`{im^{E2=NJ6=BQa>tam;E|cbc0iKomdUn3k||;hVMvdVB!(C!*fBDUIf-H2Ucv3CXX)(ebU%K=?!DXs z+7ST}5CIVo0TH;030QS;WZ!NC6`6>T&?R$TKYHLNMiK<)7kmtpR=hjg(fzy7GgjqV z{lF>=1#e0B&z!#;{Sefg#swv%56;-dvSnaEJEfE67zz+MZ3B&QbZ4@F@m1njNs^CZ zXH*s!CYr(MDEnpnG|It=*J9Cw;q-|K-?hNN9|o41*$F^)eH_8rqAd$(`ixp_S{8ZveJ`c=eeU>U_;i2h;3 z&;mE7Uo`VioV7Nsa?Wm8je9(agUBnpXWJ&?IGB0C9yDFc?`2FIZA`)<2duI07*|Jj zE)A{(XO0Z&`9`UnHyqft%_(CnKD=TuKumB-n7zQdX~nYKH1pR9rdWUrtyO5hok){J z)*{DERY&*lLCHT;r zMOG`*3=<^cWA20b1=n7%uZ$->cj73{Y*v0>^4t2wnVhbUVPz{p|8vCWjqB3t304o} zt>K$Q7&}McNdx#f;46rA%sz$9v-sjkQHAxvObu_``hdCi0y7j?;^$7CX!h{^cv77| zeFD!wW*nUL7s_!{-j10p^To4~N|$O`ErqFvH)HFIp^^(_J-AOa#F z0wQpA6R_*IA|M%SWhj`DUebyp9+)^lY$K`}gn#*&CPt#gCd!xc&zu%EvIQ7uo%#DOWKS)U`GyIj zzoa(nV~@K&W!A|mhk`ZwbQJT2SZTNEZe7U{Twg>_l)-78|ONd0UsaE5h zRhWnLeh2Yylknj6gw}F5Bgx`o2!^G3YfZ?i6AD2zM<|W7 z_5z}k+qs{azx{*-G;!>3_lVuOg6?ERApYtM6o33iSL(T>V6!H}+-Z~XFo6%V16WUy z=gv$RJ&afkr-q~`#($%tk)%QcDCnk*g0%G`gv0}xS zAHR=V8U@%W86R`uqwXCUkY~Kzj+|S2fxBbbF@+R;{xsh|ju?WyF!#^N=Eym7g!P@7 zg<hjU#TSZm}m&cUB|wNZcjI+r1e-c)`vfyd`b-}6^}T5oFVth zO~Dxa^XKo`HzV*7XDN`}Uf_j>Cbn$Fm-THL6J{;C*YKmD>yle|+xk_ZgMNOAFF*4n zQ#ob@Lu0m^Ut-8??@%;L2Eu|UY{7QE%=`kbfOJ2SV%ZyoH(vW9AOa#F0wN#+S3Lo%Er0!XB; z&hm}&XHb!$MfOovc97OcFK-;F-5J|_;=xkEu}zeiFOC6EL>eyr#7A=>f|*EL6efQn z@Q`Py7aWr~m1Hw3VWsyB`{V=ENL*9|1H6by6Qq3NC<{GDoBr(IhcwCr(3&)${wRWv&3^AKL2uFy}J3SuMm#dMC&~iTOS1f(2V;i2RM2;I!&JQYkLdp~^94?U55FGx z30_GQ8}VtcU&fArp?zd}uW^C%dT}=6^`XGMHY&$!l562kX6+G9G5f$i-|X8z@#7-W z$N2e#B7%WN&tdxP{VvbcjGaj1YnHr+i6M{@bZ@VsyE2Jld&G)_cK- zSZoSH6}}$W7j-&juu*g8PI41eu?(hsr^$E%# zofIxrXuqT-oy?`yUO+A~qcre?H$tsV^xvOGe~DL&jiE?%!uf;bIoKKpc5boFgQSgL zKmfCF17-zjRO{bg0*ewC8uslGLT(vO$FGdhdwT?}TPzFl3uY+WsA6CIylKC6eYy#r zJnl{R@7(g+_hXm?;s`IOM2?KxH#jdhRDw=Be#8)Wm2H<5J3Kz6-1Qge4CdK=anIDN zj$kG!E?Gl|fA-P4o!j9WL|hO1L;Jjk7ZZz>(^~9M3R?rjz8CaA5kM?QP9|GSjMTT= zE8de8^O?vC8o;ButzvPCyV9Ak7d)W&nNR~eY=msEpdL$F6u$L30^XT?VfKv+*-U0v zZ~Vbs+sft6L{Pc;4Vpe+<^rs}5OLbXFN_(~4};q2`2j4Q`VW*~{Sh+FvOVv7o1I3r zUVO4H)+nn&AKAAnJbr;2Q8Ov9=y-O*jz@NztsM~%0TB=Z5fFiEhX6{0U|zIh^`d!@ z6S%MA0zq<7Mze8#K5NG6Pgy?=BnKM~+fk7b#LO1B`8u2G--cUSI|7wrKWqP4K$=av zPaHAoi{-IGCsY1!xRwqtfm0Cn0!|T(4C5<>T0`UEaY4*1fvaYnX!0XD$wHY#D1F<_ zD5&_j7?ST>MTfnBlRVjqBF>&M(-S6vs!6ZPGsZ@qMOl${hPerQoNxY&ICp05wBL$m zO=>SV3Mv89=Ip5x(UjNhk=v`dkar1QE#0n|khvN3j&BfrZeXNvqrrK#n8gUswlx?eeAVo77>N1IHwiIN|zr z?#yY-B_5Wet_xpXM?P5{30X>ZY$S)UvBmy^*IZ&B? z@@m^=74OcPB!0mfAn$Z~7JI?|mSr!vZ%sQQAOa#F0wQp&5wKB>_|Gu@iQ5lSjW}5x zMJndaM$Q)E2$F5)Aj7H*!y-0Z@xu;t6D$O9^2os&#qYtfgm_p)J{gC~+?H|Mx>ZK- zN1j8WCD~AMm@QyOOCx~swPwbF846-ij~+CO4kO-dI!Cl0qJ?6V$FqXS1ymol12UBu zrD)M1g4kcE#>SQ09UL?zPy}Eb6USJU`yg?TJHHG9zrEa^4=OtKx4daNV&~Wjxe{#IcZ8wn! zG)W@O%kO4LXAF%FP3xA-k#X~yWu{41aK^`?0}-6t*RRIuJ$z$S88@EY+qaDD-v>{j zI^~P3Tr_vbrnT5CZZWRnT52HtmikW~InejbZUnPqVZGm_ox8o;`8kG{8G$c%S7!2p zvd;p1?pbH&d9ETDgm=Nrf*G;5xo2r;*k{U*V{t`eyxKiBq}SWUvtDOB^OJu_z2(Fy zbLP$Vt$7zVu`R|U%jykqCPD1`9{vx z{RMoDqH(Y>p8&)22yguB7+tq=8ud<>n>X!u=e!9{Aq8ua_yv1+mieP3h)l^eKcBzb z1LZ&I+fkHqe=_ue@QdDRZ`OA{vTvt7xMl51Of!@`OC${G{T}OU;HqRd_J{O&kEt1^ zY<6$iz*AWB3VQ*I&o$mzwVY+OS!tc$UG1_3jlDpavw39uq(qCGr|bS~(S8oT@+u96}k0wN#+A|L|)#|aosh4OSfoGawXilk)qF_cEf7WGX! z`X}oo-I~-PbrLD`N!MvTf7}N&f}h39x_3Yt4gZt`jEr6e81N@F*l}LE=-cC7625~n zr#zCfc=ilPL^cwWl64d9%}Dji#q(K<%}Oc40T{2whr~`>oH}~Ad5wyc$LgT~vB^|x zrXl=(yxDQO=<<}4B{h^il{nl^t)6IHwd{R&WMYJt;ANAGDRh<{%HyrUdS}!?t1x0> zq9X9EBHDuTTi31Hv0)A4_N-VP6CH&($9y1T5+l0%cJ091s^Bf@hxU1w{hb@vaGbM@ zhZ8ybZ`XIWa2)X#Aj@cp>^Jf(EN1PE4K9nYaOPB=n#GqPoP1-x@)@t}u(miWSnip-3(*f`$Bf=$U zm|&i)TZxUcWAjE_eTrwliNJRDiN@s{yMwlohG@s;4JOZ$QztQ;?8AA~Jls2z^tq4Sgr0_u>GDLZC@mz=*br%TO zod1kTk~YW5MVZi}T}v|IGuJ?QXRQ80ns|wKKDBq-CMFlY8#Vwr$Dk+^0i@+;AQz>_ z;#sq&OhVESbz8G!UgYBOBL~UtPb@9YKfzmsB15@RG6#%{4@34RoP1{3M4c%=ED;B0 z)&u>%&(%a4o&awv*-mn5$x`V&0m&;kUzt3wr+I zk?a|meBpNP5q7X^xRxATJR`N)3j4g)sc4oP7(5>}u;1u`gf@RjI56P`?BMf5A0WPf z`J=%fy**~gr#OId76&jwRPe@O?P-R`>3GZ$RJbQAj`~FJBK{vLlAG+fSe@9OL{DHk zA$jFqp*eEjy843ipKx`!hHFSBZu^FpG zqd1E!cW7D6%$2z|7pMc@X>3X7%@iJtXez|b!5}mkbsDA zgWf$l+hnlb7?W&2{1&#IG}YZ0%f)eJ=Hv-D#G>*r9~0;D5zLk6o>dKTRsFxC^v@(zp?LO#Si0H*73~P1+*9?Vn}^jqgTJpE%z1 z95))mJgN84p6#^OM6V3^IPJ~Gu&{t2S0(QWbQ0Rh5)7EVjQO)~ds>Q*lk}joY@$Qn zJ9F|+*ibgxEq5F>;A6fI@7)1Ombc^eS>|AOH;zz@)C5HI@RPN62Z_3eIW~!Qp))!x9?{DOPS;<&E39Y2DC1 zADHEvnFF|t=jAH+&=?vYs0E%{dmk$gDk z5RToe`%8>DTbQ(poBmHW1MQ*|G}`;hK4IbN#=y;*$ zO?zfgXGK5+L_h>YKm@LS0!S1`Q<#Mcu2>wX_UX5Qz6b50Xno3`M-rdyKA8Y(&%HY;Myc$r2fAX-j~)7j@q}GYA#(kZR{u?*DkQSF75JZoMrViB$HcP8YNRa zWrU*Rua*34@KmC4`~T^KyLYjbUvabDdj9Kn(th0r%O%wKf9w_f@1b*kDMSifp|S8E zY?y5cRR4o@swxo>0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIXm90KtdBH6q#QI}KLE#pn|5?^ezt(G14 zk~DXsX#kfbFJq7ULe1m86!XPiqP5-_Q!IIH|LTZ+3L231!~Ux}RagW>KmK=7ZOzHe2S<}f1ma_C z`Q!yc_4uhLthGKP<3mP7_}w|^7Bk1g3>HqsUx+~bC%;R04R)VLOYp{p?r#2jNh2kB zB|0JkA|L`HAOa#F0wN#+|IGx9u`qG$h)Lr{?%ul57k9zRW1a|kpIlUPBtAL<;Y_jl z(|_N*dYMttiA6h_JR#uUxp8fu*E-Le{>R~cy8_{=+Z*eaH?>`eObB>QC9%=#mMxn8 z%Xt38cCbh}81VbP8#bWZGtH(>7{@*(e;zaJ=P_SVE&F^B|Ka@k(>d&4v0(Ps13#gL z1b;l=lrj76C*bAJw5%BO6u#()vtx&R*1c`>w>mtta^dU*4ux4C;rG?P2#A0Ph=2%) zfCz|y2wY_ZjId7#ESxc=Shn<~bKUe%k-J*geQ5AU@2vf2QG(Bms|Vs^QPlRS9d#Xn z_U8D(y*qn#?|9#xx74dpbnE)n0bjgp0wCApqR&(2GeV?vfwNl>f`EK(3`t2yrbC&x$EllXx;_;jw z&quFzq}sVtf6brKQzWyeX34y7cYJoks((0$nPX+VEx&fzqK?fTuXJzryEAw`d*@Z3 zH{Kr~6M5!Dho<%3Y~OnP@WCkmlSdBNXW??w9&fDiUy6>fGYIC}7k}#5AzD=;`}HMr z-cUSy1}faTZY4I0ZQE7W8T2?JAOa#F0wN#+A|L`Hkeon#Y;@0VFV-rPze=GyP{l>F zq${2+{R8*rc&_0ilfNGm6J?Y?wg5gnb{62|k%Pnf_C%|fz4MmJ1#T;l(bJ<{OJ95( za@{I+qrMr>kB?pS_n(j7U+lsBxhPipwwvy~(Ub2+&wY2?QoCHCzHhy3rWF$WaWT=O z27JQZxo_c29tyX3q|(3---?e3hCEpP-=kfNLbs;>{JkF3y^p~$a->Ocz!bowfhBCKjY*wS< zjLAPS{EkRIc5v_TPd`HKm%06B^fqVfRw(kr$S)$#ow39F4AEmLtXw$f_`$u_xcFh@ zkRn;qHGHtt>c#V>{PgXo?{t5mNo@?1nkDXGO5ot09c}7WN03t$mc^HSdv0E{0=7o7 z6LjEA8CVmbd)sErDOh{KHYV!a>A!!U*t$+NuBEBHdvs!sgA18ED3$XD=1N-Csyu7T zq*&uRWjviQC~!~W>DoMAz1DpND%_o=%xxLV-Ia;LG@wes+nd+C|Gm!b#*Y}hciSdR z53ZUyd4hS;yR&v~)i5gJ{KRj*Dw6rSR<$0Cccw-BahDmyZ5~9M2#A0Ph=2%)fCz|y z2>e$Qu--?AWIo3a?VtF~i02yAtax|Ua(CTYD%XwgcX@tjpZ98($jd&{3isV{bNxys zMi1(H=EPBRfj5q4XCffr_m3U=S^k?mkCeQ(%TtY}|2kpJpuQz?T#vmF=je7*IN&>V zc>m7L8#b=`2g3x9CT1V{zS)f#3UfBWL`H|aeN5bebyy0w7h6Gw|Z{#cm{p=7R8u$VTJ{Jfw_-k2ljGg%bMksr|_`@dw7aawXy|7KmY;OZxU`bDJ^cMuzO&dqDY0RAJT@>MN#NBP{Du@oN2mlMw%#^HY$HT2x6 z<4EWPUp#(FLFF7D6BBuUNbh%%+0~2PUEpRiI^yr>!v3vml-?sb8CIrNN4I~zTnvY-6sz13j_kMJloWrU%>QWHUt-=Gsg}^ zoH@ztMu(<#sp`px%0E;0A5aR;zCj5CIVo0TB=Z5fA|pxJC#h_)VT7KKplW9rs25_D$y+`uU9=Qje;X$uDyfigH2P!0xL4b?WbVKQ3w+eQ!m- z@zi6LH?Lha;`81N@86Tb^F-y+zyCN6M(TA_J|KyFX>~w401bgALcVA`y z%<;q67d49CU8_t1CNdr^ou6O|0v`xups83i%m{FhQ$#56r}bhAk2t{M@cVqTr%b|^ z>7k;z5A57Zwf4h{jy`{yePSZ8L8z7lP=SCSE93mBV>L?T#iQxukwbp3iPyMBdW9ZS z1VlgtL_h>YKmJd3=5!4nC}lDfIiI5k_P*Qc zIrMqm@`aD=-@`G&4fbx^c>lfGA1RqP^4#gyUwDeVN!DICb@X6^N+lmEd{>R)_s~u( z8loYX1i?0`UNjHJ!o$VPK~7;Z5T`)U1Qmwc3wDl!@Mmi;?B258@AopXV#}Bb4sRTx z&?T~Gc)E5Kj2D0W1^l%lPM=sfbE;{t-y6Q5gF250h=2%)fCz|y2#A0PT-^lBP`L?t zKGC9PB?19RVZ>NHL-ZI9GbT?s@34MjzGLGWG&$}`EgpHG&@IyC)uvICBD5C5}7W@zci+MV>iHGS%=mn8aS#vvmUoihUyMH+6LXu18Dd<6+6; zkqHkhXC=7s+O#hMA|L`HAOa#F0wN#+S3Lo{#u;**Pz46+i3K?7jPs+A@%E2% zRzQ2LT}w;`3M`%Tm#d;(GDc}9Bs|}^_TA|{C~eY~ve_VFCJrzbh>|XsI}=0t#&;-R z4$>2mL)9(De#LvT-FN4$EZM+f4GiK_+w4DnDR@gdoROGcAdK4B3jzPh!}~cE6L}W9 z0P6s|Am&2!H$y(-rcJ7qJ9Xs1g@`jOwLpvmr!X!EvIuV^o=!25=X_!QNV_(z_4$}z zIL|4*seJLQX{N!q-#qoFZ~4=mn@HJ8a^11CBLX5I0wN#+A|L`HAOcq-0Yo*M75wjZ zYD`H(V*=mYD(&nY}}%(qEu#6ryeVf}i(_+;&u z+dSFz>Be?r2?KH^b#B?P>(fm-G^CGFNB8ZjU#ax5L;FX3+KWXNm<7Q4puqikvtxI$;jHFdHwcJ)@3#4PAwaBYSDld zoI5mo9LJ<81mIJIQv4!Km}3d+4>J3+P$4DLn{`}>D9d>u?CcJK1nPE`=^;% z;MMR=*z=LSJDHN;j`%^n{LGV&S1eY!!0i|^!~1=B?+u<0x;!7MD$#$L^{8F85b09q z(J;qeApI#j%wmv;i3t>JmeRLnBzqDQ6POhkBOK%uk54h47e^@)!xGkUjdv0~z6gkb z2#A0Ph=2%)z%@(2k@pEi6SGKJp-i3v89gkTK$rlb1gwdGM8_+MC<79i22W))E1EId zkHDskJzhAIC#T2r-LQekY|leab(}F6NeAH)uGKhFFpHe z+ZHH)q7v{&>eA{7G<>&bny_(@m6Si|`U18_AU+m*!53>R8cGuTP_59N%mtLle*JgD z22eS%48^lu-|&HwJ=(Qm!G-XxN4u8POs*t6l;-|vCNg+Z$6g3vsytLQPyI^8>sBaQ zr+kse$`-_|U?zn>If!o(1(=4wP{LjyD-_qt8R?q+f#|_SKm!puT*M8Pspgkk1Bu@H!y?WJzLa=CNOVZjKM`hu;qCHRBP)#twhl zOK=l1ixjXhLtO0BwX34EyFK&doT&`#2X<{J7^@) z)8;#T%a^lip*tz>+6&IRj)^*V>fDK==T9CZR@&K)hIWo|kW@<-qRx|i2_u454ea@* zwKcBsexk=00TB=Z5fA|p5CIXmh6yBHF#&~aKg28(s(>JO(v60WruttWu?#Gf@b*h> z5&W0~Oa$Q7Gx(#o@%dp9=fit;L`R$@|I)OH-~ajZ_tPi+@Z0z?^(qv_USJr1#%~ju z=9o5dJo$*`Oqs-V0JZT_;-b#`yzyJtt+Y|hRSVxq+EqfWX~p1PZxae(rvO+S!GuEC zjX(@%O*fW%z{+s_k*JNC0%Ia2&aE2$>do1J9~%eTq-2ikzZvo=d6SszpgqAYIzrP8 z;l#8r0wN#+A|L`HAOa$AbrV1#v(j<@_g`;O^T8n>z3q*UBcUj%O8tJ{+NJZ6`epCB z^_4bF5$!Bz#CaTGe`xB^CTWGaV2x5z`4fH?JSm>n$RYiATm6 ziFpdMhVqUrNlgu3Y~!kBacBDW%l=7Dxy;?;&(y0{+-1VlgtL_h>YKmYKm*PK~ zkYjgXAP|d{NP?+TnzRC?IF~f#o#a{XmiS2_6!^+N*b4{$^~y{ioq0f z4ic1shf<#O9%fspigv31h=2%)fCz|y2#A0Ph`?1(z}gF4pK3%xq!y1nFtY#0U-j!b z{L>GKfM$o-=kdb_Q*RHAx~E9i-KcxV+ZzFdxUQyvT4KmWsB^Q3+K<&DwDr_ z?o2y2t_hVf>$OoKQxdG>P`^?MvLU6i6`?VYl)9HS;BccNds4j$#mJsir+ncjDwkKg^_jaF}aLx zFk|}+u;cK9<4}^b{K*JB$J;#qu(cO_#=FTM6BR)iGG|fpgYkDI!5;I{a)wiP98r(?k4pd5fA|p z5CIVo0TB=Z5x7POm@omqpV;9S8b8*p^^>fC;BGi6z5Hx*#{3y+XKP;L{#TxDZVo0c z!;)>JHf2Hq(<9)GKd^IK^O}_~A{e5_M~J`&q&wPs|BfwNH>_c8xYdj2ty(m9&C&%+ zXHRGGHJp5U_jqZ|vL(0@tzJBL^^$qZ=g(sLfQ8a%8wLojL_{~d@@!L;Mx1Ti2~{PBGx0{1c!O69VjwJ8|UTvyVTF&(G?m3n+)15P`!rO6EPd zYg>}b$ZLvw5}H4hA1SQnfY*I5b_S$JyB39RO-~*tDhc>~fBpL73ymJ@-nKdGyWt~* znCGT1w`qzk!$Q@hW5U2;b!G}+2mLT&2sRP*7y~5DjUaA}5#|^0&Z>1^0oIs1f9BL@ z?{+tfL}X9TGH@r49wr*XJZanoZ6Y87A|L`HAOa#F0wQpY5MUS|IUT;CoJpz5n18XX z>2XPNLZJf;^@o>n_qp7HGRrY11ftKKI&=Im!k)Q+wM*s~$(*jj-C6c+-;8FDcjKMo zFPuMh?6La_dvVf9qyfdKz;ewpIP}NH<>ocM7@#|gKCtTVrwcvbWBG0pqbKV;~ zggM(I%uQgS5EH#>@m%K!W{B@H-=kd~uK)Y55f)wX?ySU0@7l6~*$P6W2laZJ=5ych zwq0hmDkcIVAOa#F0wN#+A|L`+83Ch;<6{r)-TCYHUw_c`g>CCr+9CQ&J|-8kG&2rA zCWWcr&suMc`4i5-`pzr>ZN)a<#4^W3oaysg=MGKl5rbeVPsPc{6!!av_5I+f+SPyh zdYEkn2aQvZNy>WS!&lmOd8*Nd<%`kt965eq?>jHGefgOtw3!vBF)r*)FWGVmV4E;` zG562OG;C;}cUkBei(|)z)qnqPlCo03wTv#OHkA^tC|2AO?`II z9{qp$irUaMC2?vBR^kh`FziU&<+nMkZ6=Rv zuuc<0VIsKs6H~%3HzavsiGT=*fCz|y2#A0Ph(H(tJB-grzN`PkboJ#q@W)15x1|&> zG^Z}Fa&$X|Q*1`^N}M}hd7HW1S(7dp)NJcdvHdzI0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOio7z4w5#qDc4t{ont+@7~?Jdw1{VT{ow@IVX4BWX?HY26IF)00I&O3yLa*zy45G6>?Ip@senUmh{Q*};H&k4f;W`I|JeEM_f>C;_Z^{whtzvro^szpEq zL_h>YKmYKmYKmYKmY zKmYKmYKmYKmYKmYKmYKmH{zzue>;)`^ed`v;UJwBh5CIVo0TB=Z z5fFh>jewV_vKLOC5rn-^YKmY;6xITQazEhbKOg|kc*6ti+~7-fCz|y2#A0PoLmA@ zswbDfzq@MTRHy~zK?FoV1VlgtL_h>YAd`TUY9^Bte?+x#;+gA?A|L`HAOa#F0wN#+ z`4Es&&4*HLpQBo+ZNf@l1VlgtL_h>YKm^+9M#PT6=8sPg%8)KP#On0wN#+ zA|L`HAOa$AA_+*To=Doc?xkADMMlR(KmiE&(aklgr=VUA1s3)PnLL z0wN#+A|L`HAOa$gNkB?9lgWucqFOld%ymZ*5CIVo0TB=Z5fFiV2uP{sL#ejUQ7zOq zVWlquA|L`HAOa#F0wQp11f*1tja$uLrCO+2o=QywL_h>YKmf{4KmO7-OO_jgwv|Jcxh@h=2%)fCz|y2xJnFQq5#?;*Y2nPCRqn zQ3OOl1VlgtL_h>YARhu!s`*f=?Q>KMwM|&*i+~7-fCz|y2#A0P92)^C)nnsUvsbAW zYL=%`69Ewr0TB=Z5fA|ps3`(csx?LOc+ycV91lHRD*_@Q0wN#+A|L`HP#@@J(pML+~ZKmyXg<4P^L_h>YKmYPM^p8KWthn}t#0TB=Z5fA|p5CIXWJpxjywZ}I9lvNA)v(lL&AOa#F z0wN#+A|L`Ml7N)ziKLzDUaEy$WOQ5vL_h>YKmYKm=-vfRt)YkvyJs zR13#LPuGfo2#A0Ph=2%)fC$tc0V&nmW1D}ZIxYetAOa#F0wN#+B5-mENU5G&{{HT&g;Svxlm`(I0TB=Z5fA|p5P?hr zQmUCuPW%zo!ii_DJBok^h=2%)fCz|y2;@URN;Mx!wSA6ip|%MteGw1=5fA|p5CIVo zfny^erFv}KYW6DCLe272Y9b&4A|L`HAOa#F0yRZIO0}j)9#1-|h2x>8Yehf=L_h>Y zKm2D2tXB?_a-|Em~US@>8=)SgGYhpweE56cYKm7J)p3i{roI^BD3LE#s=3WPIj1f!hV!F_$O}FS#Yp)u)zL zB46;dgW(kX2|-q?IWxG*T~Zh{DxX5|ZLpI{)7nX9vf-lH{*lTRB%9ApGQnz}<#0M= z@AxxdWz74I!QG8sNftiA30ZbrW6ngH<;=84(mw@9pUEI)1C`o>gPA+N>NAgLKVrEm z%#**}-5y(OFj?DG_FIHF`1~L7G@T#v^){5 z$fXA36{VHQ`Yt=S;IvMyw20KWBpdMJL@Z*d#VTUuW}%SP{5MOGGLqXwEK{PyE6Q9x zD?j3qGJltBImu#ArAnGL=XQQ&((J{f08dZZsvwp;EgntFB$v@*RZ*gjY!sgRRe3nwlW-D@KZn>RLKLwzoG@m@Don!66{>74Y zm#T5{kalMH&qO>@`6rjetOb&k0k6zqs?s?jZe%L|#d5a))a9u(qvdwQZecB%op8p2 zCX`H>ldERij;9)iJ10v^PTet;+syoDJCeG!d;E{}IkmD>&2aUZv71K9;T$V3HESi` zYg7EK)~c)4(B1um5AleX+5V^Ih@a#tS=Ux^Y4^&jecBHT&57z}iiJ^^}>Rr5dC zuxvqT;lZSGiCpKc-m~N2uC45(clTw*@n}Wi{@pX)9<+JY;<6xFWMR}g ztZ>I<9k)x3bhu>wl6go7r`VHZut(yt$hsvT4txE@O)D3%&*f!Bhsp{=oBesPwBSH# z!NIhz%8L$>KKVJkcjwy0bLqP)b8E-Tiw^FcG`RPqLA|F8?MH@}&YlJbGEjM1HkB3h zeVoZHW{ep;_nk3zFs;*f9qz&zlctS&bJoO>3ua8*y=5JF2rg&GiXV@1--&~IeK2vv zu1#y`)`PqIZ-K)>6h*cTo$RH4nySgSY57~snly6Gl(#7ksV#hO(tBfvP!{_t7FjuO z=DexnHmzJtb=wjDFIywwTWW{R)S&yfb?x%4YnD+!z6zJx?^|l|=m+D65AND-be~ry zzSWakmlYk3RiGsE%|9(F9;-O8YwO6Kofb@==vxTcF4(t=W<&GLdTU7Hsot}7J&K4X zM?0k8+t;u9V8V!!!w1N_ubRqixYn|J^SYJu-e2+Id&}p(w`Sq&LwmM!VlEBFeaXz0 z)k{b9>bz&mdKzIO7TvaP#p3thF)d0hJF5g?Sy5at74)5m?_P->q z3bHhh;CyxrW;DVhOgo`k*{}W<$xC99-J8}9?be=JbM28Q1>^LHn>|o8#i89g?Ao-J zN(}DBPOu-&UiyATX?gMCf_*y=?%Kvv!;cK@#O$N0SZIW#ws__gemzPLABfsWW#vFy z`aT0I6=kIM{Pi)-0OSyIr$4UwM{-ygPirft_39k)T~A zn++PwC8eW~%iyG#f<@0sI6nl|*1 zNGy79@?+PY)%w0V9UI==zvI(LaZHlJ1AAOIgjOo0>!ho)ZZuZ0e%btCuXlX@;oBa) z_Nnq*e6Qud*HUFacO>VvT$(t{F z^5zTQ=+q`py=nlX<@Be`@4OOv*4u{c1^$H0zHJ+u)xG@j>(6a;N9d82q|0Ol()y{}uNd0>#dtght7jj&xnGAC?4xH2_U~%fpkAXJ zFMv;rJFj}N;a!8eJdXubU@9Vkd?f`BlM)4H0+M^#oaqBzYD0-g?eM;x@knJO@ipsi zU5*_`#Zl_#9=`SId#~e0BYJkSwpUeI@n?!ydZA3)Bw}0EETi!Zdi6PS1yZs{jkmb- zYG#cVTvAea=#{4)YH-cJUV8GrS(8Sg%?xR(9ahf~pS_kFc%t49m>lVKZ#a>chg z3JOS;*arnaBhBx)vh{t}KYh=&{8-Vdd9v(>C53`B&1fwxf&*uIE0xBOVwm~ASuvYe zEqUasfAo63Nv0tTb9apylGwsDE(|4paQL-+=AoPU{oywxhFO>D$b7cB1o*Vi#qUpH z*EKmx8r`#PW1knEYIFY$ZSK3Fdz*$B{`RvR%6#?k^{ohqfCz}dM}`1D{s`Jt3ucWQ z*u78t=IA>56gK*o@dIDqxoNHSKCuex7G2M1eOWxZZt47f9a_@Cp|RWCS7+gSlT9zB zWECgCr=ql|=zUXz!7C@C!Oc~nOVDWEu(tBJn=0X1(-VW%>f;sZd&&;%PlfKTgIphGDB@P zx#i+@iy7&NSCkZNTfYip;fWj0>)hmifZI4ic`5pH-}X&dZ3p-6#39`Dwo7P}mMcG4 zlZbC$zk;&NpE{ld$wu=#u9`M-pq2DUnmH4fKT;#lDaw;{c5YameDpfBV1#JV%qiQ~ ztuT*zQofQ+H?Zi(2r5cxGn5f;!z)kKZ~xfskJmYu=fahxI`_4&vT36Rf)3|HK4tg( zQNq|Jt?t1TJ-_iy7xE*3X@4NcV4d-61v#*58zu(7)yqG8Z{>nn{E$Kn z#|2LV$>wTQIxYetAOa%rktKi-@*b^d#lby0P__&)AebM&{v0}4`mck#iMVk8Vi86G zkUG}Y-gH6R2XCTZ+iwap>2yN((*5CSM4S05h{T{fCVn6qso1q~H9qk1Z}z}R-l_3@ z)@{Wi?+hQ%^3JOfLL`eB;`?{5^|a}j*t||)(19#@dx3*4 mS=hfV{ZaErnbnln# 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 z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ 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
  • By9S6$K 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/page-progress.bmp b/console/installer/art/2x/page-progress.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a36b409616aa2c9a534411f23b09f0e09118427b GIT binary patch literal 2745654 zcmeI*2bdmZ*+1;{Q(pw6*M!~@I)qRKq&E=|UaBY{9kBp5z=9xBL_tv$DPjdgQB;c5 z0D%NTgal~<5lBb~NgzGhzW?7mv-{*>OA-Pk`CiUFhGll1duHxAcXJ%qHFw)}zpY1a zP*;3yo&VO)e@lO;uI{uC*42HWZsp=|U0ptZXvwM-eMy_fB*pk1PBlyK!8AZ0@EkFY9l~^ z009C72oNAZfB*pk1PBlyK!5-N0t5)WEdia82oNAZfB*pk1PBly(4#=ZjD>xKg&Gnd zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ 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 z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg 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%0A77#pv$j8-^JKl2!eqq)B@^R*Y9 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 z5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y z0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCT zAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ z1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}Iw zKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S- z2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YU zfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv z5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y z0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCT zAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ z1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}Iw zKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S- z2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YU zfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv z5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y z0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCT zAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ z1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}Iw zKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S- z2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YU zfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv z5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y z0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCT zAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ z1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}Iw zKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S- z2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YU zfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv z5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y z0)apv5C{YUfj}Ve{}lqQ6URx@-sHAP<69?;^*Jq%v?+YT*w%?sddoCERh3-c)$sUq z)U!NQ71eZ+>(g1W-fER9pK3m>jct0xNB^2D(Ane!MMF20pM3UK`99v>Hpx>{K~jd& zW#zMv()#|%!y7XYkW)Nb)F+rSsbRlRw<`-b=qKWDt0PQozs*EG>O) z&rN989U7bHpD8Kx?(Z#Csu$Z+le?-~mEVceG!Ks{+S}1ODL=2*@=#Ijw#gcy4&AF) z-O=gQb!vF6B^A;-DFNP9!}^P4Xivy={iQM1Q_iku>t(i0P6eh{q+#Zwv0~K_>MU92 zDXX3C*9S(r3I4lU&)k`t8I`$kgep*&rZsZD0)cd`b z)-_b>nd^&ieyWENl?tCU9(s9vrVrOuqY60n!7~Fm#CltLsYzG;BSRn%2m}Iwz`qj$ z_Kt~TM%;4g*|%PH&ZM!U(pJ*vl5T%#Z)<(`wHI!=4&&wXUO!gOP}J=)l)A4VIW74IlLSO9O7cdcx=t>h6 !vvr^80VU_Tpm?yzuCK&p&dX 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 z z>6V45dTl=z5PYcGwtS76BYA+H&Ypqj zVWd4514}!r?4}>28Hv)Ol}i?$bNJo}BZwzZdK{1tThd8v9~D+otG1rv3d>9&XA!uO zN|X?zJ@AXJbk+o-RATO4@ zx{&7$YD};)m?j@pJZ?^vuZ8*=9}dO{T%o@HqTAJH9!J2%i;v#RRU8SQ>-tD1D%V`Y z5n4qyS0tdi=bw7!A-hB4@qjvT%irRpWG&smK1Me(8js;1{F%UFZe8g))2AG@(_e_f zIBferkw2p1VXfO0!NybFE#A>Nn3pNNtaZ#dPU@Zvq3F{?wUlfE|s{c@q^S*xN12$o!G}@ zP_1siq6uJ~l~>VV(ixGOHJw~MZx*5u8DC#}<}rMPswkPWS**_~TH+m{F#FgSmMxsy z;O?6qyRF`nci!;8Kd%bm6gj~0U;m+gn$qb0zyCt2!Vf<2-_;eQF{zecZBrw|YVLO=)z0U;m+gus710;sid zs)xWw3iE$Wm+ijh5%e!|(dTw_&>|Wt>HL4G{^FPvFtpE_jRja4qLS?VQVmc&LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z m0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwC@1pY5o;6xh$ literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/progress-0.bmp b/console/installer/art/2x/progress-0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6f3f9d898d0b575301a0c8a9349f8035dd4699f3 GIT binary patch literal 43830 zcmeI*K}y3w6b9gkdvWOzJV6iO-n)4Zui-_kh!BHVtc@wQ_&Ou0ZUZfu<|}C$QqsS@-Fa1A#^+gemCjf3{li6m=Mz=6=~j8$uG{bS{lo*%hY{*C|v0t5&UAV7e?ULeKM zh^Bo^%?It<%TiKxSD63-0t5&UAV6Ro0ufCkp#DbIb^Enwmi6O4(~hH&+CzW<0RjXF z5FjvRfe5G(Q#WbO>XaSyod5v>1PBlyKw!)Q`2j0)R>wR>+D3o?0RjXF5SXq&J+~Ub zbVuK;4*~=T5FkK+KnVhtu98;?5FkK+009C72oNAZfB*pk1PBlyFj&AX*1>cxBtU=w z0RjXF5ID3zt{~uft3x~ceF6js5FkK+0D&O_>3OSIB4Eh1CCtv%F9HMz5FkK+0D;m4 zBCN&|tm*}nK91T?fB*pk1PBl~J%PSnfO@Q_H@JF4fB*pk1PBl)UEp6m)^3#}Yqw~2 z{i^4s_fGo>5FkK+009C73KmFlG@@zFsDJm{RGU==fr1Cuq+$XD2oNAZfI#5_c{PBT Kvl`K~PpUr>;(^5g literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/progress-1.bmp b/console/installer/art/2x/progress-1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..75dda3e5a5a8f1226bf1413967adae6dfd611402 GIT binary patch literal 43830 zcmeI*zfQtX7>D5+cjM@yi35p)s4<4wxO)p;1>S>hMk6LgCr2lDHuVm0SBNnbB8NaJ z1p&X7h&0edhf?so=Ac*%wNG-$uV2oegTvIF;eVy%`-VKu77b%rel8d*{&7QIe_R?o z1_unI>o&VByX!i=e!o-7+qrb@c3+uEmEBRCQK+mA1Dobg$g9)up_~x`1Q0*~0R()3 zhE;Gr-UpFYh5<-rwR*m)ZuUs3lvM))ul&^jm|zvmY2%efJ&%xAxx0C|;9 z2?P*8009ILm;nLuYG8(uo^{l)t0u3`Ko6ax@kRWr2q1s}0tiGTz<2=iYN!BtmAr}o z0tg_000MCf$anzeTZN{zu&Sdz$H}X4_t1#$Qh8eh5I_I{1m;G-pKrx_R^-)C0rDz& z6#)bgKmY**;ui4sW@Wzsed?uuy;AaO+&y$|ZhnD6009ILKp+Bv;eG+$E?4Zw`qv<* z$={P#Bj|cWPy`S_009IL_>I8meyrV=EqPU%?8+)zTvam(WwIRWq{W>y$*7~3NnRzd zB7gt_2q1vK^aZSf1X@>iVwJM$ut{Wf9T^zVDdp{4+Fvms$@Z+FqdG?u-T!`0UY&jq c<%|d*fB*sr=q(_t0mz0{-k4P>sD6jlFX#}?YXATM literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/progress-2.bmp b/console/installer/art/2x/progress-2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a286cb23e30a5403312ebbea695a2905a7f31fb9 GIT binary patch literal 43830 zcmeI*yKWOf6b9f$^oWuMx=0j+n^0;*&m+K7gm<7sAO*<@6(tSyDd7#m1H=(R*+h7w zWV62DgyXd^Gy!{~NwN8&aW0O%(tgFvuko3gCr?*CWcAlde7_x!S68#_di=bS-Kd|> z;{TtoO&`-IvTQs!9{0=fpgK7{9qn$Fo2v)!9~YhFV*P%xeorGnfWVmo8xM-NO9vmH zmA$<(-!AudGy((&5Fl_)f#dye{UZNa9i9xUNlcx#2&?huusZ(oGBRp!ZK>$o5mwI} zpk;Uh1ZD#As)$a2009Ci1oCc#-oe5CpS&8WbyyvKdft0;tLWS zfunr8AG55(YP9=x5>sPlRl({d&mL}{z@h^3YRX>voCRRsPJjS`)(Au`Yq|L%R!r1o z09IEKAV6Rd0eMwkB|v}xfz$$dH zX~azt__u((Dz6eCK!89BfxH`mb`U4A#m37@9nY$+l>mYN g2*|4`dTG}rK!CvI7Kq&d;y|lO&1y`j{tm0Z0M&H^HUIzs literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/progress-3.bmp b/console/installer/art/2x/progress-3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..712409665a94dd22bb95abbc5f4b33efa9280bc8 GIT binary patch literal 43830 zcmeI*KTpCy7{~D%cjM@y8__}h7sG7aeG9${eGiUC6HO2&M<)k2Mtuk94#XHL+9Oa( zLBOXaq5}}qyCydMnj%O;72VF0SsiQ-}s{GmY+K(raQJss7%C8evqc_fkd;}0c0D-Xp zd6kHc00I#N?22Sszfu3mtCCu~Ui0qIIbTuv4OQ47tP)lcKmY**%m|QIBlOf^Ot3QAJ{upP-~$mr0D*)GkXJQ(YA#0rfw!ux7!Xzhkk$}D z009ILh(Un7O4vXE0TTk`RpwYBfB*sr#3evpHPKV2r%aJ=ioi4h>H*?vr4#zkJ8l~R z1Q0MNKwc%UB7lIlfYbvp--^7700Iag5SIXXRlBF2Hr&K{1kxf9&bMMctGHTeg98+N z6aok!kWc~gDtQ$F1hfT$y;<2WAfdegw~YV-2>gEm@~U=Eot7~)pb(fOFy1d9*yW1- zSpR>U&mAIw00K!AAg@m9f{CCAAn+G~-}|xlJFetaIb>H>+2YE%$f!KavBt2dOAd&1l4==;Y|+&Zd3?+_l7*9>iV) z*K3OfpI&1nfkKyFiT5K{S`N~1zwna(`{ud#dGvVoLsEXM#^+n{cyT#NuEz7Fl+B*|#d8};+ipg24_I%sd@n`_od{ax%G4vTS2og5KXu`|>O@YG=KXHE#>6iyD}w z00amSAV7e?R6t%8(N7gfTanub-Q9nAHB#%a*!%dT^Xf*{ypzRWj+NEvIP!u30RjXF z5Lldmyn1R{bFviJPg}*WpOeTMWdO0V+Ie|Bd-p(6wX8~j009C72vjE^uZpH;3hbxf z`?1P8EDqXV$1yclRxPV8ZvN<<2@oJafB=D$0`lsaX-zHbL?CKe^UbH(n?_j%;O;5{ z1PBlyK!8An0`jW7dagj)ircTs-2mKRRpHn?IlFX*009C72-H(RUOhLh`GKA7*fF52 z1d!GU5FkK+009D(3&^YD=zIe5YIRlR^_)AqY61iZ5Fjv1Kwh0Mttn(x4MHF*6p1PBly zK%gc9@~XT#Ti|#<)=@u?yc$PzWsMeBo%Kf6v>j{Z8+z2_|B}ljK!5-N0>=g9)!AvS z&daKK+KS5`L?_l*R-GOZSqDWF1{}1v^3An!$AA^>S(j7Eb9@wgO@IIa0tEhV0eMwk VJs}Xg0YpQqam{KhsQwMBe*nbCXs!SN literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/progress-5.bmp b/console/installer/art/2x/progress-5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a1002d774ea23c67ca1ef7c83eff88a698ef0a30 GIT binary patch literal 43830 zcmeI*v2N2q9Kc~CcErd+w@3_4un_8u*m(t>qPznm0;!c8m>4^;XM{IMA0ktXP~tj~ zDgV0^QKZbVrF>PAM$Te=xBP6K?_R$-yDIYES$sZ=_lJi?@i_iJD4yiwMg0E#(eAxF zP!wIe?rv6H+x))0-7e;<+4;|}uj*=CPs@7x+=~DK0t5&UAV7e?K?KT3& zmzPSlr*XM|S>ZbY0t5&UAV7dX8EG1U8kw5stX`)~jXSF*teUS&fB*pk1PBlyFcg8i zK;15`SF?BZN)?T;2DRg9Hc=AV7cs0RjYi7pNxY z1ITp(1PBlyK!5;&K?>Z>2k^YrAV=!Vwp*i|1sop2aH~|6#2oNAZpnrk?_6x8dt6n8QfB*pk1PBlqjKH4# zSi755+L(3I#CBIPF<^Nyigm8+bv2kFbGwxQ0RjXF5Fl_o0_g#(l%vx!(sb9TDOTHc w{%rEztn=0EJg*oqmaLMM009C72oNAZ;D7=VtK$gK$kFX$9%sU~9M($duZRsubJ4rzukf}n>nvsXLhi$wd`fq6_tt(M2(x*VuvuF^P*{P49mdvV{oH)FRs zzHdl&n-r;}2>~+1c^s_ctc8b|q=D!6A19sbp>rwu?rPF*QIyOu!_fo4Ih1~1j6SX?+4pgzZX9x(Kbj&#eDqZE-N{uSK#5G%}qfC4Bp zY98cC#Oz{##%?2vLoNLSeCeV90tz5l;CS)-4@2kNA3lkwVxJq{>RX$G5@7!UI1BK# zbB((!nQQr!AJKFqv@JWw1f(GVCF~d1>)wp+ zu2}E7am&sr9q4Fc2o2_-% T_ruQ{7cNIM2Furk0zOo~gii37nIfy-%vzR9dbAI?+Pg<*YnlGm9TF$Oqpi;}BiB1dw02sia z#KA$ARF}Bl0tS?5?@N1q#(8wvS~zDd4%o#(yE1H7MnoA#6P*|W05E_-A#p)J)`}0e zSseQ9%~`vgwdT`yX~?dP*|l-{EoZ5Tf=Z{eG(@m+78DSP?qecdZj))3$DHkdb6?%G z=6cCnA!`*g*8Ev=b!pORT%@uzNs~fnF{2DshCu-lbcp=Jgb&&zgJ@?Xc6WK;prC>#Ixz$QU=mNndLANwoA6th7u)|%;)pZmUd@s6%C%toWx|5w zxQ7J*07h1-IS`3n&qGQCic+bP9(oj(g?=rbZm-?rK}!j9mhd>?v{I;`LQN(|0Rxz_ zAWbavLn;nEC634>Nqe(EF;||a{SPIj94iq$18G9H@UH=&9GaNxg&?4m2o^2I0x%9)?AuaOL4Hda+OD(j)oRj zRub+zD7uAzZBaxFM9^uc)W#tQSqwAhC-#V3=U8&#*SAF1vsMb6`JWo@>swA^3I!E3 zb^NsnK>-~iG=K sDKhtc6qh2C-*<5rGI~Fe*DYbf)cvYs!rc8(nJ{_3l_s#F{@?xlH_bkmNB{r; literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/stage-1.bmp b/console/installer/art/2x/stage-1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..801be65b795474914541aab3634a9c49a2ec4a7f GIT binary patch literal 98550 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 aKow90Q~^~$6;K6K0aZX1PzByVf&T-RS)khh literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/stage-2.bmp b/console/installer/art/2x/stage-2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8d11bc21cde0ee9cc14fa4d02103ba3aa18780f5 GIT binary patch literal 98550 zcmeI5=XaDxmWP?M-}m$W0sCS9f<0%?%$z;znK6!I9I%PT7=vw$zz7f^k`N*qn~a43 zlQWncMG`rR3_^g&3MhwGcdOGrx2pTqs}8a-X3Xx~K1EYqZ@u+a{aPQMzIE%~*WPW; z`a>sq{U`tagMYLCrBkPW=l?%+`ZwM?bvnxR6aU)D{4))_h5XH0Q~^~$6;K6K0aZX1 zPz6*0RX`O`1yli5Kow90Q~^~$6;K6K0aZX1Pz6*0RX`O`1yli5Kow90Q~^~$6;K6K z0aZX1Pz6+h{|5>LyiGx$=Or%0=V5%Oyu=5+G#6jDKC%#_nA7M~SQ>TFvtyFFZ~VU~ zi_TdUPz6*0RX`O`1yq4J1zK6i647(MC*{&`i!Z_}9OPMyAM^>kcAz{5;zk0#NT?+e z3YgMj9@G@KH2aa~#-{Q7{A@7NJ**wgY2jnQ+lUAqFR^>Q=o1^w6AAj!D-sD(kw%|~ z)wNy?a8(4gl5#aRNRs1n2*Oon6}vr2AJ^?d!tD>}>fHWNdQ}xr1yli5Kow90RDqYG z00pN8QMg;UG*&#}fX~}dd-v-3@(0D#g(qd$P^`G?PNS`ap|#jJ&VWfO;TEs2 zsjmK6X>IxAnzG0Bm8IOpG?EY+;1>=E+(v>-1`}mR#6n|6Av&Y5P%OBops4f?wf-O}~?neT`u5|X)R+ii-q{Fkv zCCq{TsR)x>s-8YD^JL-yZs$QsWRdSnF4QPrGi_f z_lidL=)7i54kUN@=haK5j9T?W*2?cEP*#}t)w8l!&6;TIww(@(Cy%^-rXUgyiN&uK zfRiv%(BGVwGh+PbT_%3nHLL%JlfL>ScVarz6N{zmUV*(9U+uF}9=B)pB7buubNj`? z?V}lo(OSHoohugJzI29#2>7-5PVe8gb?F=~@sYuhW#76bhqkObxMgK)*}O7;)AIaH zD_UFZ)y*r8Y+KV@R~-ojw=bJFb#U*7>I$R_hk|I8-u1Qd{oc>{rpKv$TaWMBIQ`qt z8s#d49ND>Y;ovTR9`ort6Z(I+cJ5?fQ$6i*60un3Q~BinjG><`oi_UH!Clp5kD@qj zz_pDsLaH*d&r^T%{Bd7nErgr`Ym?|7_h|j73aA3AfGVI0r~<0M%ToYi0T+k7|L4)Y z-^%>-?TG_E8r%21kv-lR*|W6(Q83}?UT?*<(`Qugw}yW3-+7ZpV9T?#V|lf#6Ely(K4v#gnl1n_5Y}~C9M}7c+i;x+qs3k>{Lq@Dhsw$ zmp)uOZ_1X%KkQhsV9(mTb@Qf->GRI)QC~GT)L@Ma`J#x$WI(|K87ud|7lt#qzd{r)mD9%{`u(MZ{IFF#fllKV8^<_@BIn&S{3W@ z#;BfeBIDT4{w|Gm?Gur;CzX=B*+Hl5DjK5txFde{HqI|>GrSC!0F0aZX1Pz6*0 zRp3=r05jpGV+VGv%00Mc)u!Cw(8fu#BtGx|1-g>F{o9e+QNOj4Sk^aVd8l%N@ zYiVvsMXGV_vT5#mZCp45GQ4)?C~a;FDwbFbm^Uw+1OnkqY>#)ZT`+x8BeB7`@`rbS z7}1|q0Qn@(^GT`nEJTvg*2uCm5y0I&I4Ro0lIIU&CTKHLdsjafA8z zpeTAtI^4Ycu;{AaQ!j?whMJkf`ccp%EY7RZ7q(~`aRvb3=Z^VCo?;B4_VS@ED_Q2f z>lgXx=GEwr1(|td+p>9MKKuLTyzjBuVthK`R0UK4RX`O`1yli5;P+6#XTg#cg}^JxGVvZEhHh(ad|2vs!`X zMi7hQYpe^0!?!M+VDh_HMoH6G@de#&igGtBlS17u@rJd~cyRLy z#<_9s7_C68u_}82OJF|i_ip=XE;eltms?sq4Ri>Fg8SDmP0Fj7Pno&j(-01e1IF-A z{&wraNruI_7r@@Kcox4zeqKC_^IA;l{NX(q(it35eOP?mPEujj{HeT(KPq)%s(>n> z3aA3AfGPkJ!a1Q(==P=4>|f)qNu3sO&KCBd;nj+VcSFGz_|R#0Ds2sYve%41fMZ|f zs>7Vz!dan)%2La#;Hz`VR@`5Q*>HDAubm2r7_KRMl>OBwOQ(*;R_PwZ)`43gI=^qj z!fBa(-ktGnp9&lU+B&=1p4el9e(#Ez<00Ew8DEw?xC8ZZd-N&>%utYf*>j&cykBF@ zvk)hznj2+}rclQrp|Z}`^t3wQDVo{mo#{jR zJiT{Iq=><)ovJmBvM-PKDerMw$pS;-Bw%?}rs1*}yB8Y{cyWHf*J9q-G;vxGPWD({ zotoB*OW-9&(bcoFAzQ|=b93`5EwqQj!Gi7U#(mxeZ(*EQnGcAIef8?8!_@8X3t78y zD!?Uxp1>-O3UbxcVENfSF|Dfts(>n>3aA3AfGY3`DqvaYg?ZHm5e-66arRYb$%1no zY%(O3%7yPqEx0pwJ`lsqL#4FI%OM z-w5IL^QTQ5(6zSwiQUkT^6KE;c(($&b2GmIX!!{sE(8+XppAW%0cAdZ&xt*o7iJA* zf1gEdT`~vH)lt3P6mQj7qy;8Mwd{WJq_4XH(%D~r{L}O?Pwy4U@{N;&Gb^pA0;+&2 zpbDr0s(>o+YAOKvfG#h>s{*3o5Qm8_9NEKAr6ol;f7X=ZXbznsxYeDAYY5b!#2Pe-#f0{0E3= zD%ML2e&&2VR?3X-o!xu%aU(c`oIkRA_{V?Y7#bd_*i>0H{AqnbQ~0lPQ6l-L}>+VNqyefcc5=+V92%=+R( z46|2H8v81q9@co<;$1d#&LXC~H})|qW|5V4;pO+&yp zD~=*@{q>_NpbDr0s(>n>3aA3Vl>(NX+UHgAUk&)#r#55)oY)dY6hX~^pRk{}ToOLC z`so9=|EfgnkFuP^fC4+=)umHMQ8$2x1FHC-V*GTkNDgP=ekmT9a)_zjmvrE{JUuZ) zfO|~p%$&|}CPA*&&!37-)q*q=xOeRWAou-<{)9!v4>pdU+l*t*Of48cSo}-FA*`}Q zsU=E)i4Sm{_y8;rE3OkCfJ?-%B@CAns8%eo;c#KWKJfVRiG1o1DRxx+SA|z=DrsSo zV?KMg^xiE@))G}99Cmn>dNAgwU_nvz2?dG@&-|D*ln4e3#t(UX=O%4nKkrvg97LR5 ztHjxZ7ts$0UofKk>zfwMtg9?HvugdZVEdqdncfd6$yB$kr5{K#T9v@dIWv{rwFKreVO`uz>ihL3W~#Y+q|r z2H=Le^7||dec;@Tp?z(p0Nz*qFmZ8C2Dih0ZZn+_V~g+EqkDI+oC654ohB_MH!eN8 zbBmz;?1`T_u#H&)rKx0LOrm&^7z-Z*{0E4N0IAZSumIRIf!Jsa*cc5a9mk?VcW?!BKlEr|tQ4GlY=w5H9z4u4L{+qc)A)k8jr89&GIJsvFbq=`! zoR(KH8q;E;S9LbgR`FYqCeu~>dJaMbJ6zMm!V0>Nzk!m(UM zB!06T-L{r@>aqTkev6)`_WsOWalbf{N~evgfGVI0r~;~hDxeDd3I%?dR|j;(vUhyX zmSa0N9NV>#LINhvB@v5W?1Uzpryxxv@}TG{iJ3?cKwwW|qH;hT5F@aEo0I{AdVzBk zCttv{A$>Rp#NdqJMonuAC6K;EzwiHHYfOGuIs>PXWAB`Sietj0YS{IX@d^VYVWWU# zTwXz9M!@QrG<%eL96Vk5Xbi%BHst|boLxDUkFE8{wzbGY)G1bngDW48Y?H>L+t-uv z>duvOpt2=BvRwJR9N^5^MC*wkB$STMIQFM_s3Q_+Gw_;jX z1yli5Kow90Q~_1s1r=zYSFwEJ4@p`jHk2_2+5$(B7irSKZfx$070x(7S|3ZiSc!Fy zeUGe3pb!*9jsOgX^yJ;&)Ih!faBlJB5v}X1(LM# z(XzU*tLsII1QwW^J>1o1tHBT{x5OY>i@}pD44|oS`=FlWX0?Tn6w(b)rWmk?>g`9< z(vz#)#l7>!4nk7+@czw9n{sD@mvAG6bg_h5-LrNH=3*c}XJGf)BfsQS8X3X1FQ3oV zShv~SvU_#z#@z27-M$89;_SgJ&mP>#cTL8D<=>67C)ea#2nBFvAc_|#%b~66Qpxm6 zyIcwfF)!1fyUrcj#R&X4Ip3gGQ~^~$6;K6K0aZX1_)QeByo&X2^rvs{UbQF=IV7Id zfUXw~?=HT44&z(VMO#jBa_8=q^XAk~%q0NtP;)Hk`kABfDrej4E6boqqTkz;0pgOH zDqld`WC6~)075XB>{OU5?dE$N99j@`y-W01=k}BplNSL01ahP@TMk|kl0d#G;&-L|B4S<*+Cddi1yli5Kow90 zRDpIBu)KQf;;FPQf7-fab`)J=AYtRL);}wyJ%JTlGg~?18w+G)&zeOL9fm#tRfx{m z;;2ZzfT}W(jPq7);{zmzOxdK4gfZ2^lTYr-0U}JcW*V3@6N`i@b!O5|#V#3t2C`y- zj;m)+!Y`CmP>jx{6gPUS%N~=g7W~7!ymVUT!=h_gCEZV?&RPDB#9tMFk3_1TJirmc zh9j^i%Sii$`4j^zS1%vW$EJPpsF-{uI%_0yaMSXU-SKFZ=&AI#^W-;zjh}$|I$G+a z(pXc`+|+nv>uOBmSWUgnO-;3xcoDd}*&7+bSu*BdBP>1=L^Eh3X0)AeH1@Y)D)t-} zZU&N`pzWpP_HFH>3aA3AfGVI0r~<0M^C|#kVFj%!eRz25>cstY%d5|l<+n1%)p#Zm zerxf1o9eCqBxYD)D+7Uob7VWMEMdP43zzMylodv8WHftuf-X}^bdjGL%RGK&xFEb z`9xub&}cWs1>`{=4hD=V`K?%jF;2R>MJE8dbAsu?9e8!y(m8SQ0Z2zh3v0x~_Wa@9 z)O}5ob~Y9t-~x3gK7g2=Nq5`Ei&c2m;AQ0W{%ylPevKGbwkhFVd>a_SSt*Q)?AC47 z)hNoCcDWkgE+WX6700)6-Snd>pbDr0s(>n>3aA1vrhtw156;Bzr(0g_NPa6O0GRP^ zy#nwYFq`b@vdQlET4uw(+E`sd%q60;O2j1k$BMnzuEN>+2l?Qx5+bG!=t_ZFIr5WO zjC<|tI9Oslv`E&L!IFb$!0XAIG=d#={5;)Uov0*peC8v9B@$Ee@|zC!Q7WFho=v7BKFdo=Z>QT-8jb187}fYakhx~P7>AXR(#>oqvGpOAGSoECFvv7>=l!Dc)Gn5PZI+OF(Tq=$rg3O$jFR9eS&Zd^KL)aqFi3Dsp|a}ltMlU$sZ zS}}7xG5k$?79H5@zka5`rk(n2c@>EWDS&e+F1U-bqa`o z)4MlY2##7^0Z7|Iy}7A@&;e`afD@ULuA$g@+QRl?eYF+QJEzx~I0vxk|voDt4uvAY7)0i5Lbgah3h%6#NR)tcFp z03HaF`4he=MnQm6ji;{4*X$`Q*iSHda$WhGo0{vY3?s?axZe zuFCFz(ba3Gj$mmds(&hf0OKJb8BqxX1v97ORRfBoUcE>kyk5aMII!ceYDu-Zp_Uv{ znSI{DMFA&RacqziPo@aUhLI(`E2o@pEi|#r9MHdo<2IR!sqC^kdGs}fmMzzlMW7NV^Ni4n@?IQN=VN@09TV^^JSv5LVt0l6R{ zp`J3O%-(Njkjkn@XQEDVbc>+$oVTJ*OUlyo4esJzMo6@;noa!BjdRCv7=SkOH!jDG zfhTtK4}gV*8_cZbad z5PP4qW5q&3x#E&R@PF#Dc1bHhq5r1b?n>3aA3AfGY6nC_uDN z_cn1{9WyBLx3A+~Mo0_?%HxRKRr%!p?2%uQQdX!>Vpw&ESB)hz zjE^qvpd^sR7Rp{fBe<8(UcbM&kw{jAJS71ZSKG1NGCglYZOQe*`!~!XGR~3Rx>9nZ z5cotTuGT#(C1I;MTqc(&SdTHTve7R~YsG9Ke4dr?lIR2{c5fQ=?tfi5b;w-BUn1cZ z4t7w1HY;s=cug;<0;+&2pbDr0s(>o+QWcOr?lyMOn8CBvQrb>Sdm-Y=f+WiVWM@_ zJlm4@{l4`}6Ro?6U!qu>;}1zOE>>vquaGZAUU8?Wn>3aA3AfGVI0r~;~hDxeCe0;+&2pbDr0s(>n>3aA3A tfGVI0r~;~hDxeCe0;+&2pbDr0s(>n>3aA3AfGVI0r~;~hD)2ih@V~AIeNq4b literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/stage-3.bmp b/console/installer/art/2x/stage-3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3211e837934687b030ea3029f6702c848764cfe6 GIT binary patch literal 98550 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/stage-5.bmp b/console/installer/art/2x/stage-5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3cb58b964943bc5b0f96db7466f85697153550b0 GIT binary patch literal 98550 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 literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/tb-close-hover.bmp b/console/installer/art/2x/tb-close-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3c668c6bd99ae1aa3a94d01d0d560472e74a7b3e GIT binary patch literal 21174 zcmeI%%T5zf7zgnB0R?>m>7(8Au5?`XS(<3;St*cY*% z^IgEv=X-+xe>pGv(FGh95_$e8KmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rjLa z6S$fj>k|ozk9mjF0FEX^0~%_QnsuXr;t{_V4{1tM7_A88HaC8!lKHuqV~WMOynizH zdaJy-Q3_nnU7L3!dE&u<0Ps)bwqBOI-R`GsJ?wWD6+j3~_KMeQ`h#>46v{;f5N0F! z-R%P)wA&pVKWFQRaGMDt2s^I~!*&~oZndgEepFH`L4c5q=5Jmv93JY@5NV4|3NwPP zcRQUP1rh|3YJ~)98w+ad=^~yZD9{|66axq-h#$7?Oc`mS7J_t5Xi;z~x4u@a*`^qV zfCK>o{(It`p1TU5hY#7N@G64P*`)9`f=vooA?#&zkPbom1l7~QnnWX_B08f@Pn-#a z(NXd7eJ%6Mm?wBU63nq-jS9>S`Ww!@nhs`!fvBk0jcEbeZvNql_xc1YLZ2c$t)=ho zS1P(7p!t#%ndfCJNf0)}%6jQKhDgk>UOfHVXmt9)APyhiRncvtvF;Y>3MrZA36d8$ z$_Y%c*<6Dt)MRT_%?J_zBJi(a5WvCa8pL{Mg|1i;WOP7+tlrtL)toKI6l%D+s>2X4 zI-suz`<*Sv%y(Akd<255BCYcZ?;^!f1oT1=K)P zp!m11&0EU_7axO891RaHc*U3){3*3}cMhrP3Q&Lo6rcbFC_n)v1pWg@s3dp* literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/tb-close-normal.bmp b/console/installer/art/2x/tb-close-normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f27517c46a8c9d3f2b760bf6ada0ef39e24e3de1 GIT binary patch literal 21174 zcmeI%NlX(_7zgkv0NV-gh)i$1YA%fK{)7tcxIR|w3%s5;0+&{X}aVM^L~Bb_uluqKfj?! znEOk|<1U=XaTek<2$6Ucgc^L_Vr1vs8+gdtvYrkSAOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5?E;h`?dx7(q%OF@e02D_y5%vT}X*og{$q|y1|QUqIvQrzqH5z zt|?eA%B-0{$c$O5l_ERVXbu)?%8E)4XP85TobAD0NG^F3^g7-sT(K3*eC(*NyKD*f z(=;kXgb<<1RxthEIqYmYnQO*N?nVU=(xX<_mLL7u*E-($XnMd=Uss`?f{ldg^GANY zYa4s@@Y|bbpung|iwxw50tgw=YYxPjh8&GQ`dUXj?tgmu;P-%2C50SeqRS2k9FV+P zR-7E}$B_fZKkhcw6i||vFzjfY?0pUgl@v+@P+(M4*$R;>_(EW*DLXbOF;pnYO&D=D zO}STutMy!*?}cSmJ`Hq z;D02@L&?Laz-lwjC{&jgAsOl$!NaJS9qhPu?Ly_b{Hgx-m4L7)1y%)EVtwyz!ST8K zF<$C59OR)fPcb){j=Gw$u3!|pqGge6ePnZL8MM{J}I;*uZ<<3W3CxnPoBoZSA1Ir2Q z2`Fa8%2Y!+#$ET>4J#K*EG~u|4On=?L}d-aY4_bBAT3~2RGhXVSD+@i%Ys-t{WwV2tdt($Qa^lB3?XG*bb9Zb^jqvAjzZ#tdMXJgFV4Nx4tI$RW zV4L?;UV_yUgZhiFh*GcEaixhqf;Xsu`UJ+cMi)wqPtco< zvY-hh3T0zLL^r(!(yRZ|51UEHwx^wibEe;S&-c0h#z++rp66n8hH@L)8aXL9r62j z*KsoLOZG~EvfGDa&lWPs!Eq!uJ)tB8N^KvCF3e}@_4>yTJEQjAq5=qx;TR<^;Mch>ywgu&Lvc#zBI0EB=q zIdl3;u~?ykP+24?v?#k)7#^N%;FPqA<$Xk$Yc74=#b0Aj-+0Uzojtydki z2rW@jD2UFKivRa0#tDOf(4@dzBYbT&mn~zk2n1}6=CKxevWY3lbWqiCg8sR8_y%31 zYa}-JXk&L*44NqzsGE5EdfVqrAZ@QR(++=U&Y$+j36YElf=0b)o={{+&OyvsI?21z z50;1mfq@fr7Ls!i$-gt_WqJha9p)ZxT)(=C6@~_d>~zeWW$b!a?GVsApshf&+0%5a z>))C4f({5Yi`0!PEEpAC5$M@jn?e%7+7z@-+tUQ9b5uV4HFI_c|GcZ_I&C&vMiH=ejRb8z zEm48w>uZIJGb??(4AN%%U(WI1Tt{QKZ>E3$D!o|R!UU?PM@ba7!s)%e>i2KOQQ(4SW^0qLHAjiG3qb zCU{3|FbD0;@Hq>x01L1H3$OqSumB6N01L1H3$OqSumB6N01L1H3$OqSs3PzOQ!I?w literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/tb-min-hover.bmp b/console/installer/art/2x/tb-min-hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2a93df2c9fae8b4e8f3018d5ba304155428f089c GIT binary patch literal 21174 zcmeI!IZFdU7{>AS3y2zv#H-M#A)Zx0LDUGEWDNub4-(=RuoXipKZc!(g@vU-!N$hI z3pE5!)ToVkTWFyX#+RfIfo!ph|K*t}c9z}YH}4GV4X%%9*~=rnOWK6AkhBubF1@DB z$@q3@u4QjX7ig;{2q1s}0tg_000IagfB*srAbEU@_3>?)A6V-1t#0gBxRpx8aW49xcAgn z=Kk>KW=}wh&-e9i<{>p3_F2n8>f!hHKz&@Pmvi-cVL+s)zV6~vdT)K1RqDal;u!Tf zcUI?<8_UOu#bjcs_#CY*BsW*4Lp=jcm6kXka$81@N^hgh;5cm}oM%g#bI9?>W}H9;Hq#hsPL8FbGYc`c<#sNUSo^ZWliHXBXvU7s;nhh0~)(jjb=wa ze;IDB#v4*1E)zij0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R%b}n0K31PlsRKJEw(RrhrZ7w`%=XscJ>0eu4}+>oCZ`wQ~OJ{`~#+l`lxnwP%r0|NBX?o9H(O5{&GlqEcMFa_d`K;!sp$Y@<^ZGr;GmD4;#mnRUtJ4E@5y(_6+Y|~dxd`qnlpd20BqMDSc78|LT7dn^`FBz5=^hM`Q-J_+=42yE-?J67Eez0UcO zvox+tKQye|-g@cb_WJGl{`Kij>hSUMn9Oq#H0z})uUZ(;kl8v_&ew~Rn=6W=Va;ai zF;o1F>?QjL#o<;o+dpXc)>tqC2q1s}0tg_000IagfB*srAbd^RAN!8D7XSbN literal 0 HcmV?d00001 diff --git a/console/installer/art/2x/titlebar.bmp b/console/installer/art/2x/titlebar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1d33b1afda7448ee7e2cfb161f5f2f4fdaa413b1 GIT binary patch literal 364854 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 zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@ zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMtdM~1-v1An8* A&;S4c literal 0 HcmV?d00001 diff --git a/console/installer/art/version.txt b/console/installer/art/version.txt new file mode 100644 index 0000000..4b9fcbe --- /dev/null +++ b/console/installer/art/version.txt @@ -0,0 +1 @@ +0.5.1 diff --git a/console/installer/installer.nsi b/console/installer/installer.nsi new file mode 100644 index 0000000..571976c --- /dev/null +++ b/console/installer/installer.nsi @@ -0,0 +1,1375 @@ +; ============================================================================= +; 赛事积分榜 安装器 —— 完全自绘的五页向导 +; +; 这是 electron-builder 的「自定义 installer 脚本」(package.json 的 build.nsis.script)。 +; 只换 UI 层:安装/卸载/升级/快捷方式/注册表/防火墙全部复用 electron-builder 模板里的宏, +; 一个字节的安装逻辑都不重写 —— 现场装机成功率不被这次改版动摇。 +; +; 为什么整窗去边框、铺满位图: +; 设计要求是 760×480 的固定版面(左侧品牌栏 / 顶部标题栏 / 右侧内容区 / 底部按钮条)。 +; 系统标题栏和原生按钮条在不同 Windows 版本上高度都不一样,要对齐只能自己画。 +; 所以:去掉窗口边框 → 内层对话框铺满整个客户区 → 位图当画布 → 标准按钮条被盖住, +; 但仍然是「程序化翻页」的工具(点我们的按钮 = 点被盖住的系统按钮)。 +; +; 页面流程:P1 欢迎 → P2 许可协议 → P3 安装位置与安装模式 → P4 正在安装 → P5 完成。 +; P1/P2/P3/P5 是 Page custom(nsDialogs 自建内层对话框,POC 已验证); +; P4 必须是**真正的** instfiles 页,原因有两个,都不是偏好问题: +; 1. 安装段(Section)只在 instfiles 页上执行。不用 instfiles 页就得把整段安装逻辑塞进 +; 一个函数,静默安装、取消中断、进度刷新全得自己重写 —— 那才是真正的风险源; +; 2. WriteUninstaller / 卸载段的执行时机也依赖这条路径。 +; 代价是 instfiles 页自带的内层对话框(原生进度条 + 详情列表)只能藏起来, +; 在上面再盖一层我们自己的对话框。 +; +; 高 DPI(现场是 4K@200%): +; ManifestDPIAware true + 运行时读 LOGPIXELSX,所有坐标 = 1x 设计值 × dpi / 96, +; 一个绝对像素值都不许写死在控件上;素材出 1x/2x 两套,dpi ≥ 144 用 2x, +; 并且给 LoadImage 传目标 cx/cy,让系统在 125%/150% 这类中间档位上兜底缩放。 +; 字号不加倍:NSIS 的 CreateFont 自己会按系统 DPI 把点数换成像素,再乘一次就双倍了。 +; ============================================================================= + +; ── 素材位置 ──────────────────────────────────────────────────────────────── +; 走 ${PROJECT_DIR}(electron-builder 注入的绝对路径)而不是相对路径: +; electron-builder 是把脚本喂给 makensis 的 stdin、并把 makensis 的工作目录设成它的模板目录, +; 相对路径落点不确定。 +!define ART_SRC "${PROJECT_DIR}\installer\art" + +; ── 版面常量 ──────────────────────────────────────────────────────────────── +; 全部是 art-gen/gen_art.py 里的 1x 设计值,改素材就要回来改这里(两边必须一致)。 +!define WIN_W 760 +!define WIN_H 480 +!define TB_H 40 +!define SIDE_W 240 +!define BRAND_H 440 +!define PG_X 240 +!define PG_Y 40 +!define PG_W 520 +!define PG_H 440 +!define PAD_L 32 +!define CONTENT_W 456 +!define BTN_W 108 +!define BTN_H 36 +!define BTN_Y 416 +!define BTN_PRIMARY_X 620 +!define BTN_SECONDARY_X 500 +!define BROWSE_W 96 +!define BROWSE_H 34 +!define TB_MIN_X 672 +!define TB_CLOSE_X 716 +!define TB_BTN_W 44 +; 页面内控件 → 窗口坐标 = 页内坐标 + (PG_X, PG_Y),这里直接写成窗口坐标 +!define LIC_EDIT_X 273 +!define LIC_EDIT_Y 237 +!define LIC_EDIT_H 174 +!define LIC_EDIT_W 454 +!define LIC_CHK_X 272 +!define LIC_CHK_Y 432 +!define PATH_EDIT_X 273 +!define PATH_EDIT_Y 151 +!define PATH_EDIT_W 357 +!define PATH_EDIT_H 32 +!define BROWSE_X 632 +!define BROWSE_Y 150 +!define RADIO1_X 272 +!define RADIO1_Y 260 +!define RADIO2_X 272 +!define RADIO2_Y 300 +!define SIZE_TXT_Y 336 +!define STAGE_X 272 +!define STAGE_Y 156 +!define STAGE_W 456 +!define STAGE_H 18 +!define PROG_X 272 +!define PROG_Y 180 +!define PROG_W 456 +!define PROG_H 8 +!define FIN_CHK_X 272 +!define FIN_CHK_Y 338 +!define FIN_PATH_Y 376 + +; 颜色取自 gen_art.py 的配色常量(SetCtlColors 收 RRGGBB,不是 BGR) +!define CLR_TXT "0x16233a" +!define CLR_DIM "0x5a6b85" +!define CLR_BG "0xf6f9fd" + +; ── 变量 ─────────────────────────────────────────────────────────────────── +; electron-builder 的模板(assistedInstaller / installSection)引用了这些变量, +; 平时由 installer.nsi 主模板声明;我们用自定义脚本,得自己声明,名字必须一致。 +Var newStartMenuLink +Var oldStartMenuLink +Var newDesktopLink +Var oldDesktopLink +Var oldShortcutName +Var oldMenuDirectory +Var appExe +Var launchLink + +; 自绘界面状态 +Var hPage ; 当前页的内层对话框 +Var hBg +Var hBrand +Var hTitleBar +Var hMin +Var hClose +Var hNext +Var hBack +Var hCancel +Var hBrowse +Var hFinish +Var hCheck +Var hRadio1 +Var hRadio2 +Var hPath +Var hLicEdit +Var hStage +Var hProg +Var stMin +Var stClose +Var stNext +Var stBack +Var stCancel +Var stBrowse +Var stFinish +Var uiPage ; 0=无页面,1..5=当前页;定时器靠它判断还能碰哪些控件 +Var timerId +Var gDpi ; 系统 DPI(LOGPIXELSX) +Var gArt ; 本次要用的素材目录($PLUGINSDIR\1x 或 \2x) +Var gCx +Var gCy +Var gBw ; Track 宏把基准宽高放这里,转交给 SetBmp +Var gBh +Var tmpName +Var tmpPath +Var tmpTxt +Var /GLOBAL IsPowerShellAvailable +Var artReady +Var licOk ; 许可页勾选 +Var runApp ; 完成页「立即运行」 +Var modeAll ; 安装模式单选:1=为所有用户,0=仅为我 +Var instStarted ; 安装是否已经开工(Tick 里触发,只触发一次) +Var keepShortcuts ; 快捷方式保留策略,由安装流程写定(上游在安装段里声明,我们提前到全局) +Var dragging + + +; ── include ──────────────────────────────────────────────────────────────── +; MUI2 不是为了它的页面,是为了 LangString / MUI_LANGUAGE: +; electron-builder 注入的 messages.nsh(以及 assistedMessages.nsh)用的是 MUI 的 LangString, +; 没有 MUI2 直接编译不过。我们的页面全是 Page custom,一个 MUI_PAGE_* 都不插。 +!define MUI_DISABLE_INSERT_LANGUAGE_AFTER_PAGES_WARNING +!include "MUI2.nsh" +!include "nsDialogs.nsh" +!include "WinMessages.nsh" +!include "LogicLib.nsh" +!include "FileFunc.nsh" +!include "StrContains.nsh" +!include "common.nsh" +!include "multiUser.nsh" +!include "allowOnlyOneInstallerInstance.nsh" +!include "installUtil.nsh" +!include "installer.nsh" + +; 安装模式初值逻辑(照抄 templates/nsis/assistedInstaller.nsh 的 initMultiUser): +; 上次怎么装的还怎么装;命令行 --allusers / --currentuser 压过它; +; 都没有时看 INSTALL_MODE_PER_ALL_USERS_DEFAULT(= package.json 的 selectPerMachineByDefault)。 +; 我们不 include assistedInstaller.nsh(它会插一堆 MUI 原生页面),所以这个宏得自己带一份, +; 否则 uninstaller.nsh 的 un.onInit 里那句 !insertmacro initMultiUser 直接找不到宏。 +!macro initMultiUser + !ifdef INSTALL_MODE_PER_ALL_USERS + !insertmacro setInstallModePerAllUsers + !else + ; 静默安装跳过「内层进程 / 非管理员」这道判断:它俩走 UAC 插件的 UAC::_, + ; 而静默模式下没有页窗口,插件会在这一句上不返回(本机 wine 实测卡死 60 秒)。 + ; 静默安装要提权时由安装流程开头那段($installMode == "all" + ${Silent})自己处理。 + ${IfNot} ${Silent} + ${If} ${UAC_IsInnerInstance} + ${AndIfNot} ${UAC_IsAdmin} + SetErrorLevel 0x666666 + Quit + ${EndIf} + ${EndIf} + + !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED + !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires administrator privileges." + !endif + !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED + !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User privileges." + !endif + !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE + !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer." + !endif + + StrCpy $hasPerMachineInstallation "0" + StrCpy $hasPerUserInstallation "0" + ReadRegStr $perMachineInstallationFolder HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation + ${if} $perMachineInstallationFolder != "" + StrCpy $hasPerMachineInstallation "1" + ${endif} + ReadRegStr $perUserInstallationFolder HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation + ${if} $perUserInstallationFolder != "" + StrCpy $hasPerUserInstallation "1" + ${endif} + + ${GetParameters} $R0 + ${GetOptions} $R0 "/allusers" $R1 + ${IfNot} ${Errors} + StrCpy $hasPerMachineInstallation "1" + StrCpy $hasPerUserInstallation "0" + ${EndIf} + ${GetOptions} $R0 "/currentuser" $R1 + ${IfNot} ${Errors} + StrCpy $hasPerMachineInstallation "0" + StrCpy $hasPerUserInstallation "1" + ${EndIf} + + ${if} $hasPerUserInstallation == "1" + ${andif} $hasPerMachineInstallation == "0" + !insertmacro setInstallModePerUser + ${elseif} $hasPerUserInstallation == "0" + ${andif} $hasPerMachineInstallation == "1" + !insertmacro setInstallModePerAllUsers + ${else} + !ifdef INSTALL_MODE_PER_ALL_USERS + !insertmacro setInstallModePerAllUsers + !else + !ifdef INSTALL_MODE_PER_ALL_USERS_DEFAULT + !insertmacro setInstallModePerAllUsers + !else + !insertmacro setInstallModePerUser + !endif + !endif + ${endif} + !endif +!macroend + +; ── 编译期替 electron-builder 补的两处 ────────────────────────────────────── +; 1) 自定义脚本下 electron-builder 不做 BUILD_UNINSTALLER 那一趟,UNINSTALLER_OUT_FILE +; 被留成空值,而 include/installer.nsh 里有一条无条件的 +; File "/oname=${UNINSTALL_FILENAME}" "${UNINSTALLER_OUT_FILE}" +; 空路径直接编译失败。真卸载器由安装段末尾的 WriteUninstaller 现写, +; 这里顶一个占位文件上去只为让编译过去(安装时会被立刻删掉再重写,见安装段)。 +!ifdef UNINSTALLER_OUT_FILE + !define /redef UNINSTALLER_OUT_FILE "${PROJECT_DIR}\installer\uninstaller-stub.txt" +!else + !define UNINSTALLER_OUT_FILE "${PROJECT_DIR}\installer\uninstaller-stub.txt" +!endif + +; 2) MUI_INSERT 是在第一个 MUI_LANGUAGE 处展开的,界面初始化钩子必须在那之前定义。 +!define MUI_CUSTOMFUNCTION_GUIINIT "GuiInit" + +; 「应用还在跑吗」的检查。不查的话覆盖安装时 CopyFiles 会一路失败, +; 用户最后只看到一个「无法关闭,重试/取消」的框,根本不知道要先关程序。 +; 逻辑取自 allowOnlyOneInstallerInstance.nsh 的 CHECK_APP_RUNNING,但不能直接插那个宏: +; 1. 它的宏体带 Var /GLOBAL CmdPath / PowerShellPath,一个脚本只能插一次, +; 而那一次已经被 un.checkAppRunning 占掉(我们 include 了 uninstaller.nsh); +; 2. 卸载器侧的 Call 只能指向 un. 开头的函数,安装器又调不了 un. 函数, +; 所以两边各要一个入口,共用下面这一份宏体。 +; 另外 $CmdPath / $PowerShellPath / $IsPowerShellAvailable 都由 un.checkAppRunning +; 那次展开声明(所以本文件里这一整段必须在 !include "uninstaller.nsh" 之后)。 +!macro AppRunningCheck + StrCpy $CmdPath "$SYSDIR\cmd.exe" + StrCpy $PowerShellPath "$SYSDIR\WindowsPowerShell\v1.0\powershell.exe" + !insertmacro ProbePowerShell + !insertmacro _CHECK_APP_RUNNING +!macroend + +; IS_POWERSHELL_AVAILABLE 的宏体自带 Var /GLOBAL IsPowerShellAvailable, +; 两边各插一次会报「already declared」,所以那句 Var 已经提到文件开头的变量区, +; 探测逻辑原样抄在这里(十几行,抄一份比去改上游模板安全)。 +!macro ProbePowerShell + ; 先用一个必然返回 7 的命令确认这是「真的」PowerShell。 + ; 上游模板直接问 Get-Command Get-CimInstance,但假壳(wine 自带的 powershell.exe 就是, + ; 任何参数都 exit 0)会让这个探测和后面那条 Get-CimInstance 查询一律「成功」, + ; 于是安装器误判「程序正在运行」,去杀一个不存在的进程、卡在重试框里。 + ; 这类假壳在现场也可能出现(安全软件挂的 shell 代理),所以宁可多花一次子进程。 + nsExec::Exec `"$PowerShellPath" -C "exit 7"` + Pop $0 + ${if} $0 != 7 + StrCpy $IsPowerShellAvailable 1 + ${else} + nsExec::Exec `"$PowerShellPath" -C "if (Get-Command Get-CimInstance -ErrorAction SilentlyContinue) { exit 0 } else { exit 1 }"` + Pop $0 + ${if} $0 == 0 + nsExec::Exec `"$PowerShellPath" -C "if ((Get-ExecutionPolicy -Scope Process) -eq 'Restricted') { exit 1 } else { exit 0 }"` + Pop $0 + ${endIf} + ${if} $0 != 0 + StrCpy $0 1 + ${endIf} + StrCpy $IsPowerShellAvailable $0 + ${endIf} +!macroend + +; ── 卸载段 ───────────────────────────────────────────────────────────────── +; 卸载逻辑与 un.onInit 直接用 electron-builder 的模板(uninstaller.nsh),一个字节都不改: +; 升级、快捷方式回收、防火墙规则回收的行为与上游完全一致。 +; 卸载器的界面仍是原生外观 —— 素材只有安装器那一套、5 张页面位图全带「安装」字样, +; 硬套上去只会更难看。 +; +; ⚠️ 为什么这里要自己给 BUILD_UNINSTALLER: +; electron-builder 平时编两趟(安装器一趟、卸载器一趟),靠 BUILD_UNINSTALLER 这个 +; define 区分两边的代码路径(典型的是 getProcessInfo.nsh:安装器定义 _GetProcessInfo、 +; 卸载器定义 un._GetProcessInfo)。自定义脚本只有一趟编译,安装器和卸载器的代码同处 +; 一个文件里,所以只能给「卸载器这一段」自己划一个作用域: +; · 定义 BUILD_UNINSTALLER → 让 un. 侧拿到 Call un._GetProcessInfo(否则卸载器里的 +; Call 不许指向非 un. 函数,直接编译不过); +; · include 完之后 !undef,安装器侧的代码照旧走 _GetProcessInfo。 +; 顺带这也让 un.onInit 里的 initMultiUser 走到「卸载器需要提权」的那条分支, +; 与上游卸载器编译结果一致。 + +!macro customCheckAppRunning + Call un.CheckAppRunningImpl +!macroend + +!define BUILD_UNINSTALLER +!include "uninstaller.nsh" + +; getProcessInfo.nsh 的 un._GetProcessInfo 只在 BUILD_UNINSTALLER 那一趟里定义; +; 我们的单趟编译里补一个,宏体用的还是上游那份 FUNC_GETPROCESSINFO。 +Function un._GetProcessInfo + !insertmacro FUNC_GETPROCESSINFO +FunctionEnd + +Function un.CheckAppRunningImpl + !insertmacro AppRunningCheck +FunctionEnd +!undef BUILD_UNINSTALLER + +!insertmacro addLangs + + +; ── 通用函数 ─────────────────────────────────────────────────────────────── + +Function CheckAppRunningImpl + !insertmacro AppRunningCheck +FunctionEnd + +; 按 DPI 缩放基准值。栈:基准像素值 → 返回缩放后的像素值。 +; 只用 $R8/$R9:所有调用方都用 $R0..$R7 放自己的临时值,S 不能踩它们。 +Function S + Exch $R9 + Push $R8 + IntOp $R8 $R9 * $gDpi + IntOp $R8 $R8 / 96 + StrCpy $R9 $R8 + Pop $R8 + Exch $R9 +FunctionEnd + +; 贴位图。栈:句柄 文件名 消息 基准宽 基准高。 +; 文件名只有名字(如 base.bmp),目录由 $gArt 决定;cx/cy 用控件的目标像素尺寸, +; 于是 2x 素材在 150% 这类非整数倍下也能由系统缩到刚好。 +Function SetBmp + Pop $R4 ; 文件名 + Pop $R3 ; 句柄 + Pop $R2 ; 消息 + Pop $R1 ; 基准宽 + Pop $R0 ; 基准高 + StrCpy $tmpPath "$gArt\$R4" + Push $R1 + Call S + Pop $R5 ; 目标宽 + Push $R0 + Call S + Pop $R6 ; 目标高 + System::Call 'user32::LoadImageW(p 0, w "$tmpPath", i 0, i $R5, i $R6, i 0x0010) p .R0' + ${If} $R0 == 0 + Return ; 素材没加载出来就保持原图,宁可画面旧一点也不画成空白 + ${EndIf} + System::Call 'user32::SendMessageW(p $R3, i $R2, p 0, p $R0)' + ; 立即重画:安装段执行期间消息泵不一定马上转到,进度不能等到空闲才更新 + System::Call 'user32::InvalidateRect(p $R3, p 0, i 1)' + System::Call 'user32::UpdateWindow(p $R3)' +FunctionEnd + +; 建控件。栈顺序见宏;类名/样式是编译期文本,坐标是 1x 设计值。 +!macro NewCtl CLASS STYLE BX BY BW BH OUT + Push ${BX} + Call S + Pop $R0 + Push ${BY} + Call S + Pop $R1 + Push ${BW} + Call S + Pop $R2 + Push ${BH} + Call S + Pop $R3 + nsDialogs::CreateControl "${CLASS}" "${STYLE}" 0 $R0 $R1 $R2 $R3 "" + Pop ${OUT} +!macroend + +; 贴位图(参数按 1x 设计值写,内部转成像素) +!macro SetBmpBase HWND ONAME W H + Push ${H} + Push ${W} + Push ${BM_SETIMAGE} + Push ${HWND} + Push ${ONAME} + Call SetBmp +!macroend + +!macro SetBmpStatic HWND ONAME W H + Push ${H} + Push ${W} + Push ${STM_SETIMAGE} + Push ${HWND} + Push ${ONAME} + Call SetBmp +!macroend + +; 位图按钮:创建 + 贴常态图 +!macro NewBmpBtn BX BY BW BH OUT ONAME + !insertmacro NewCtl "Button" "${BS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}" ${BX} ${BY} ${BW} ${BH} ${OUT} + !insertmacro SetBmpBase ${OUT} ${ONAME} ${BW} ${BH} +!macroend + +; 悬停跟踪:栈里带齐「基准矩形 + 句柄 + 当前状态 + 位图基名」。 +; 状态机 0=常态 1=悬停 2=按下,和 art/ 的三态位图一一对应。 +!macro Track HWND STATE ONAME BX BY BW BH + StrCpy $gBw ${BW} + StrCpy $gBh ${BH} + Push ${BX} + Push ${BY} + Push ${BW} + Push ${BH} + Push ${HWND} + Push ${STATE} + Push "${ONAME}" + Call HoverBtn + Pop ${STATE} +!macroend + +; 光标位置换算 + 命中测试 → 需要时换位图。栈:基准x 基准y 基准宽 基准高 句柄 状态 位图基名(base)。 +; 用 $R0..$R6 干活、$R7 存结果 —— SetBmp 只踩 $R0..$R6,所以 $R7 能活到返回。 +Function HoverBtn + Pop $R0 ; 位图基名 + Pop $R1 ; 当前状态 + Pop $R2 ; 句柄 + Pop $R3 ; 基准高 + Pop $R4 ; 基准宽 + Pop $R5 ; 基准 y + Pop $R6 ; 基准 x + Push $R6 + Call S + Pop $R6 ; x + Push $R5 + Call S + Pop $R5 ; y + Push $R4 + Call S + Pop $R4 ; w + Push $R3 + Call S + Pop $R3 ; h + ; 右/下边界(命中测试用半开区间) + IntOp $R4 $R4 + $R6 + IntOp $R3 $R3 + $R5 + StrCpy $R7 0 + ${If} $gCx >= $R6 + ${AndIf} $gCx < $R4 + ${AndIf} $gCy >= $R5 + ${AndIf} $gCy < $R3 + StrCpy $R7 1 + System::Call 'user32::GetAsyncKeyState(i 1) i .R8' + IntOp $R8 $R8 & 0x8000 + ${If} $R8 != 0 + StrCpy $R7 2 + ${EndIf} + ${EndIf} + ${If} $R7 != $R1 + ${If} $R7 == 0 + StrCpy $tmpName "$R0-normal.bmp" + ${ElseIf} $R7 == 1 + StrCpy $tmpName "$R0-hover.bmp" + ${Else} + StrCpy $tmpName "$R0-pressed.bmp" + ${EndIf} + Push $gBh + Push $gBw + Push ${BM_SETIMAGE} + Push $R2 + Push $tmpName + Call SetBmp + ${EndIf} + Push $R7 +FunctionEnd + +; 定时器回调:光标 → 客户区坐标 → 逐控件做悬停/按下 → 标题栏拖动。 +; 不做窗口子类化(POC 结论):60ms 轮询足够跟手,也没有子类化回调崩掉整个安装器的风险。 +Function Tick + System::Call '*(i, i) p .R0' + System::Call 'user32::GetCursorPos(p R0)' + System::Call 'user32::ScreenToClient(p $HWNDPARENT, p R0)' + System::Call '*$R0(i .R1, i .R2)' + System::Free $R0 + StrCpy $gCx $R1 + StrCpy $gCy $R2 + + ${If} $uiPage == 0 + Return + ${EndIf} + + ; 标题栏两个按钮每页都在 + !insertmacro Track $hMin $stMin "tb-min" ${TB_MIN_X} 0 ${TB_BTN_W} ${TB_H} + !insertmacro Track $hClose $stClose "tb-close" ${TB_CLOSE_X} 0 ${TB_BTN_W} ${TB_H} + + ${If} $uiPage == 1 + !insertmacro Track $hNext $stNext "btn-next" ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + !insertmacro Track $hCancel $stCancel "btn-cancel" ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + ${ElseIf} $uiPage == 2 + !insertmacro Track $hNext $stNext "btn-next" ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + !insertmacro Track $hCancel $stCancel "btn-cancel" ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + ${ElseIf} $uiPage == 3 + !insertmacro Track $hNext $stNext "btn-next" ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + !insertmacro Track $hBack $stBack "btn-back" ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + !insertmacro Track $hBrowse $stBrowse "btn-browse" ${BROWSE_X} ${BROWSE_Y} ${BROWSE_W} ${BROWSE_H} + ${ElseIf} $uiPage == 4 + !insertmacro Track $hCancel $stCancel "btn-cancel" ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + ; 安装在这里开工:等第一个 tick(窗口已经画完)再动手,然后完工后翻到 P5。 + ; 为什么不用 NSIS 自带的 instfiles 页:那一页在跑安装时只泵它自己的消息, + ; 我们挂在 StdUtils 定时器上的悬停/进度刷新全都收不到回调(实测:P4 上按钮不悬停、 + ; 定时器不触发)。改成自绘页 + 定时器驱动,消息泵一直是通的。 + ${If} $instStarted == 0 + StrCpy $instStarted 1 + Call DoInstall + GetDlgItem $0 $HWNDPARENT 1 + SendMessage $0 ${BM_CLICK} 0 0 + ${EndIf} + ${ElseIf} $uiPage == 5 + !insertmacro Track $hFinish $stFinish "btn-finish" ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} + ${EndIf} + + ; 标题栏拖动。用系统拖动循环(HTCAPTION)而不是自己算位移:跟手、贴边、最大化吸附都免费。 + ; 判定用「屏幕级的左键状态」,所以必须把标题栏按钮那块从拖动区里扣掉, + ; 否则点最小化/关闭会连带开始拖窗(POC 踩过)。 + ${If} $gCy >= 0 + ${AndIf} $gCy < ${TB_H} + ${AndIf} $gCx >= 0 + ${AndIf} $gCx < ${TB_MIN_X} + System::Call 'user32::GetAsyncKeyState(i 1) i .R3' + IntOp $R3 $R3 & 0x8000 + ${If} $R3 != 0 + ${If} $dragging != 1 + StrCpy $dragging 1 + System::Call '*(i, i) p .R4' + System::Call 'user32::GetCursorPos(p R4)' + System::Call '*$R4(i .R5, i .R6)' + System::Free $R4 + IntOp $R5 $R5 & 0xFFFF + IntOp $R6 $R6 & 0xFFFF + IntOp $R6 $R6 << 16 + IntOp $R5 $R5 | $R6 + System::Call 'user32::ReleaseCapture()' + System::Call 'user32::SendMessageW(p $HWNDPARENT, i ${WM_NCLBUTTONDOWN}, p 2, p $R5)' + ${EndIf} + ${Else} + StrCpy $dragging 0 + ${EndIf} + ${Else} + StrCpy $dragging 0 + ${EndIf} +FunctionEnd + +; ── 素材嵌入 ─────────────────────────────────────────────────────────────── +; 逐个文件写 File 而不是 File /r:素材缺一张就在编译期报错, +; 而不是运行期画出一块空白(装机现场没有回头补素材的机会)。 +!macro ArtFiles SUB + SetOutPath "$PLUGINSDIR\${SUB}" + File /oname=base.bmp "${ART_SRC}\${SUB}\base.bmp" + File /oname=brand.bmp "${ART_SRC}\${SUB}\brand.bmp" + File /oname=titlebar.bmp "${ART_SRC}\${SUB}\titlebar.bmp" + File /oname=page-welcome.bmp "${ART_SRC}\${SUB}\page-welcome.bmp" + File /oname=page-license.bmp "${ART_SRC}\${SUB}\page-license.bmp" + File /oname=page-dir.bmp "${ART_SRC}\${SUB}\page-dir.bmp" + File /oname=page-progress.bmp "${ART_SRC}\${SUB}\page-progress.bmp" + File /oname=page-finish.bmp "${ART_SRC}\${SUB}\page-finish.bmp" + File /oname=btn-next-normal.bmp "${ART_SRC}\${SUB}\btn-next-normal.bmp" + File /oname=btn-next-hover.bmp "${ART_SRC}\${SUB}\btn-next-hover.bmp" + File /oname=btn-next-pressed.bmp "${ART_SRC}\${SUB}\btn-next-pressed.bmp" + File /oname=btn-install-normal.bmp "${ART_SRC}\${SUB}\btn-install-normal.bmp" + File /oname=btn-install-hover.bmp "${ART_SRC}\${SUB}\btn-install-hover.bmp" + File /oname=btn-install-pressed.bmp "${ART_SRC}\${SUB}\btn-install-pressed.bmp" + File /oname=btn-finish-normal.bmp "${ART_SRC}\${SUB}\btn-finish-normal.bmp" + File /oname=btn-finish-hover.bmp "${ART_SRC}\${SUB}\btn-finish-hover.bmp" + File /oname=btn-finish-pressed.bmp "${ART_SRC}\${SUB}\btn-finish-pressed.bmp" + File /oname=btn-cancel-normal.bmp "${ART_SRC}\${SUB}\btn-cancel-normal.bmp" + File /oname=btn-cancel-hover.bmp "${ART_SRC}\${SUB}\btn-cancel-hover.bmp" + File /oname=btn-cancel-pressed.bmp "${ART_SRC}\${SUB}\btn-cancel-pressed.bmp" + File /oname=btn-back-normal.bmp "${ART_SRC}\${SUB}\btn-back-normal.bmp" + File /oname=btn-back-hover.bmp "${ART_SRC}\${SUB}\btn-back-hover.bmp" + File /oname=btn-back-pressed.bmp "${ART_SRC}\${SUB}\btn-back-pressed.bmp" + File /oname=btn-browse-normal.bmp "${ART_SRC}\${SUB}\btn-browse-normal.bmp" + File /oname=btn-browse-hover.bmp "${ART_SRC}\${SUB}\btn-browse-hover.bmp" + File /oname=btn-browse-pressed.bmp "${ART_SRC}\${SUB}\btn-browse-pressed.bmp" + File /oname=tb-min-normal.bmp "${ART_SRC}\${SUB}\tb-min-normal.bmp" + File /oname=tb-min-hover.bmp "${ART_SRC}\${SUB}\tb-min-hover.bmp" + File /oname=tb-min-pressed.bmp "${ART_SRC}\${SUB}\tb-min-pressed.bmp" + File /oname=tb-close-normal.bmp "${ART_SRC}\${SUB}\tb-close-normal.bmp" + File /oname=tb-close-hover.bmp "${ART_SRC}\${SUB}\tb-close-hover.bmp" + File /oname=tb-close-pressed.bmp "${ART_SRC}\${SUB}\tb-close-pressed.bmp" + File /oname=check-off.bmp "${ART_SRC}\${SUB}\check-off.bmp" + File /oname=check-on.bmp "${ART_SRC}\${SUB}\check-on.bmp" + File /oname=radio-off.bmp "${ART_SRC}\${SUB}\radio-off.bmp" + File /oname=radio-on.bmp "${ART_SRC}\${SUB}\radio-on.bmp" + File /oname=progress-0.bmp "${ART_SRC}\${SUB}\progress-0.bmp" + File /oname=progress-1.bmp "${ART_SRC}\${SUB}\progress-1.bmp" + File /oname=progress-2.bmp "${ART_SRC}\${SUB}\progress-2.bmp" + File /oname=progress-3.bmp "${ART_SRC}\${SUB}\progress-3.bmp" + File /oname=progress-4.bmp "${ART_SRC}\${SUB}\progress-4.bmp" + File /oname=progress-5.bmp "${ART_SRC}\${SUB}\progress-5.bmp" + File /oname=stage-1.bmp "${ART_SRC}\${SUB}\stage-1.bmp" + File /oname=stage-2.bmp "${ART_SRC}\${SUB}\stage-2.bmp" + File /oname=stage-3.bmp "${ART_SRC}\${SUB}\stage-3.bmp" + File /oname=stage-4.bmp "${ART_SRC}\${SUB}\stage-4.bmp" + File /oname=stage-5.bmp "${ART_SRC}\${SUB}\stage-5.bmp" +!macroend + +; 只解当前 DPI 需要的那一套:两套都解要写 26MB 临时文件,首次显示会明显卡一下。 +Function EnsureArt + ${If} $artReady == 1 + Return + ${EndIf} + StrCpy $artReady 1 + InitPluginsDir + ${If} $gDpi >= 144 + StrCpy $gArt "$PLUGINSDIR\2x" + !insertmacro ArtFiles 2x + ${Else} + StrCpy $gArt "$PLUGINSDIR\1x" + !insertmacro ArtFiles 1x + ${EndIf} +FunctionEnd + +; 系统 DPI。ManifestDPIAware 之后进程不会被人为放大,只能自己按这个数缩放版面。 +Function PickDpi + System::Call 'user32::GetDC(p 0) p .R0' + System::Call 'gdi32::GetDeviceCaps(p R0, i 88) i .R1' ; LOGPIXELSX + System::Call 'user32::ReleaseDC(p 0, p R0)' + ${If} $R1 < 96 + StrCpy $R1 96 + ${EndIf} + StrCpy $gDpi $R1 +FunctionEnd + +; 内层对话框铺满整个客户区:MUI 外层框架(页眉 / 品牌字 / 原生按钮条)全被盖住, +; 自绘位图才有完整的 760×480 画布。 +Function NewPage + nsDialogs::Create 1018 + Pop $hPage + ${If} $hPage == error + Abort + ${EndIf} + ; 悬停/拖动全靠这个 60ms 轮询(POC 结论:比窗口子类化稳,代价是光标移动要等一个 tick)。 + ; 建在这里而不是 .onGUIInit:StdUtils 的定时器要挂在页对话框上才跑得起来。 + ${If} $timerId == 0 + ${StdUtils.TimerCreate} $timerId Tick 60 + ${EndIf} + Push ${WIN_W} + Call S + Pop $R0 + Push ${WIN_H} + Call S + Pop $R1 + System::Call 'user32::SetWindowPos(p $hPage, p 0, i 0, i 0, i $R0, i $R1, i 0x0004)' + ; 上一页的句柄全部作废:定时器靠这组变量判断「还能碰谁」 + StrCpy $hBg 0 + StrCpy $hBrand 0 + StrCpy $hTitleBar 0 + StrCpy $hMin 0 + StrCpy $hClose 0 + StrCpy $hNext 0 + StrCpy $hBack 0 + StrCpy $hCancel 0 + StrCpy $hBrowse 0 + StrCpy $hFinish 0 + StrCpy $hCheck 0 + StrCpy $hStage 0 + StrCpy $hProg 0 + StrCpy $stMin 0 + StrCpy $stClose 0 + StrCpy $stNext 0 + StrCpy $stBack 0 + StrCpy $stCancel 0 + StrCpy $stBrowse 0 + StrCpy $stFinish 0 +FunctionEnd + +; 全窗共用的底:背景 → 品牌栏 → 页面位图 → 标题栏 → 标题栏按钮。 +; 栈:页面位图名(空字符串 = 该页不贴页面位图,比如安装中页自己控制进度) +Function Chrome + Pop $tmpName + !insertmacro NewCtl "Static" "${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}" 0 0 ${WIN_W} ${WIN_H} $hBg + !insertmacro SetBmpStatic $hBg "base.bmp" ${WIN_W} ${WIN_H} + !insertmacro NewCtl "Static" "${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}" 0 ${TB_H} ${SIDE_W} ${BRAND_H} $hBrand + !insertmacro SetBmpStatic $hBrand "brand.bmp" ${SIDE_W} ${BRAND_H} + ${If} $tmpName != "" + !insertmacro NewCtl "Static" "${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}" ${PG_X} ${PG_Y} ${PG_W} ${PG_H} $hProg + !insertmacro SetBmpStatic $hProg "$tmpName" ${PG_W} ${PG_H} + ${EndIf} + !insertmacro NewCtl "Static" "${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}" 0 0 ${WIN_W} ${TB_H} $hTitleBar + !insertmacro SetBmpStatic $hTitleBar "titlebar.bmp" ${WIN_W} ${TB_H} + !insertmacro NewBmpBtn ${TB_MIN_X} 0 ${TB_BTN_W} ${TB_H} $hMin "tb-min-normal.bmp" + !insertmacro NewBmpBtn ${TB_CLOSE_X} 0 ${TB_BTN_W} ${TB_H} $hClose "tb-close-normal.bmp" + ${NSD_OnClick} $hMin OnMin + ${NSD_OnClick} $hClose OnClose +FunctionEnd + +; 自绘文字标签:对话框默认底色是灰的,不显式设色就会在页面上贴出一块灰, +; 所以一律用「底色 = 内容区底色」把标签融进位图。 +; 栈(后压先弹):文本 字号 基准高 基准宽 基准y 基准x +!macro AddLabel BX BY BW BH SIZE TEXT + Push ${BX} + Push ${BY} + Push ${BW} + Push ${BH} + Push ${SIZE} + Push "${TEXT}" + Call Label +!macroend + +Function Label + Pop $R0 + Pop $R1 + Pop $R2 + Pop $R3 + Pop $R4 + Pop $R5 + Push $R5 + Call S + Pop $R5 + Push $R4 + Call S + Pop $R4 + Push $R3 + Call S + Pop $R3 + Push $R2 + Call S + Pop $R2 + nsDialogs::CreateControl "Static" "${SS_LEFT}|${SS_CENTERIMAGE}|${WS_CHILD}|${WS_VISIBLE}" 0 $R5 $R4 $R3 $R2 "" + Pop $R6 + SetCtlColors $R6 "${CLR_TXT}" "${CLR_BG}" + CreateFont $R7 "Microsoft YaHei UI" "$R1" "400" + SendMessage $R6 ${WM_SETFONT} $R7 1 + ${NSD_SetText} $R6 "$R0" +FunctionEnd + +; 栈(后压先弹):样式 基准高 基准宽 基准y 基准x → 返回控件句柄 +!macro NewEdit STYLE BX BY BW BH OUT + Push ${BH} + Push ${BW} + Push ${BY} + Push ${BX} + Push "${STYLE}" + Call MakeEdit + Pop ${OUT} +!macroend + +Function MakeEdit + Pop $R5 + Pop $R0 + Pop $R1 + Pop $R2 + Pop $R3 + Push $R0 + Call S + Pop $R0 + Push $R1 + Call S + Pop $R1 + Push $R2 + Call S + Pop $R2 + Push $R3 + Call S + Pop $R3 + nsDialogs::CreateControl "Edit" "$R5" 0 $R0 $R1 $R2 $R3 "" + Pop $R6 + SetCtlColors $R6 "${CLR_TXT}" "0xffffff" + CreateFont $R7 "Microsoft YaHei UI" "12" "400" + SendMessage $R6 ${WM_SETFONT} $R7 1 + Push $R6 +FunctionEnd + +; ── 按钮动作 ─────────────────────────────────────────────────────────────── +; 标准按钮条被自绘层盖住了,但按钮还在:点它等于点系统按钮,翻页/取消都由 NSIS 自己走。 +Function GoNext + GetDlgItem $0 $HWNDPARENT 1 + SendMessage $0 ${BM_CLICK} 0 0 +FunctionEnd + +Function GoBack + GetDlgItem $0 $HWNDPARENT 3 + SendMessage $0 ${BM_CLICK} 0 0 +FunctionEnd + +Function GoCancel + GetDlgItem $0 $HWNDPARENT 2 + SendMessage $0 ${BM_CLICK} 0 0 +FunctionEnd + +Function OnMin + ; 最小化走系统命令:自绘窗口没有系统按钮,但 ShowWindow 一样有效 + System::Call 'user32::ShowWindow(p $HWNDPARENT, i 6)' ; SW_MINIMIZE +FunctionEnd + +Function OnClose + Call GoCancel +FunctionEnd + +Function OnLicCheck + ; 用 != 1 而不是 == 0:LogicLib 的 == 是字符串比较,$licOk 初值是空串,"" == 0 为假 + ${If} $licOk != 1 + StrCpy $licOk 1 + !insertmacro SetBmpBase $hCheck "check-on.bmp" 16 16 + ${Else} + StrCpy $licOk 0 + !insertmacro SetBmpBase $hCheck "check-off.bmp" 16 16 + ${EndIf} +FunctionEnd + +Function OnLicNext + ${If} $licOk != 1 + ; 没同意就不让走:这是许可页唯一的硬性要求 + MessageBox MB_OK|MB_ICONINFORMATION|MB_TOPMOST "请先勾选「我已阅读并同意」再继续。" + Return + ${EndIf} + Call GoNext +FunctionEnd + +Function OnModeUser + StrCpy $modeAll 0 + !insertmacro SetBmpBase $hRadio1 "radio-on.bmp" 16 16 + !insertmacro SetBmpBase $hRadio2 "radio-off.bmp" 16 16 +FunctionEnd + +Function OnModeAll + StrCpy $modeAll 1 + !insertmacro SetBmpBase $hRadio1 "radio-off.bmp" 16 16 + !insertmacro SetBmpBase $hRadio2 "radio-on.bmp" 16 16 +FunctionEnd + +; 「浏览…」:系统文件夹选择框没有 NSIS 包装,用 System::Call 直接调 shell32。 +; BROWSEINFO = { hwndOwner, pidlRoot, pszDisplayName, lpszTitle, ulFlags, lpfn, lParam, iImage } +; ulFlags = BIF_RETURNONLYFSDIRS(0x1) | BIF_NEWDIALOGSTYLE(0x40) +Function OnBrowse + System::Call 'ole32::CoInitialize(p 0)' + StrCpy $R6 $HWNDPARENT + System::Alloc 260 + Pop $R7 + System::Alloc 32 + Pop $R0 + System::Call '*$R0(p $R6, p 0, p $R7, p 0, i 0x41, p 0, p 0, i 0)' + System::Call 'shell32::SHBrowseForFolder(p R0) p .R1' + ${If} $R1 != 0 + System::Call 'shell32::SHGetPathFromIDList(p R1, t .R2)' + System::Call 'ole32::CoTaskMemFree(p R1)' + ${If} $R2 != "" + StrCpy $tmpTxt $R2 + ${NSD_SetText} $hPath "$tmpTxt" + ${EndIf} + ${EndIf} + System::Free $R7 + System::Free $R0 +FunctionEnd + +Function OnFinish + ${If} $runApp == 1 + Call StartAppNow + ${EndIf} + ; 结束安装器。这里踩过两个坑:页面回调里 Quit 不生效(窗口不退、反而被推去下一页), + ; 对主窗口发 WM_CLOSE 也不生效;能真正退出的只有点系统那个「取消」按钮。 + ; 先把错误码归零,别让「正常装完」的退出码看起来像被取消。 + SetErrorLevel 0 + GetDlgItem $0 $HWNDPARENT 2 + SendMessage $0 ${BM_CLICK} 0 0 +FunctionEnd + +Function OnFinCheck + ${If} $runApp != 1 + StrCpy $runApp 1 + !insertmacro SetBmpBase $hCheck "check-on.bmp" 16 16 + ${Else} + StrCpy $runApp 0 + !insertmacro SetBmpBase $hCheck "check-off.bmp" 16 16 + ${EndIf} +FunctionEnd + +; ── 进度分段 ─────────────────────────────────────────────────────────────── +; app-64.7z 是一次 Nsis7z::Extract 调用,拿不到百分比;所以进度按「宏观步骤」分段 +; (解压 → 注册表 → 快捷方式 → 防火墙 → 收尾),不画假进度条。 +; NSIS 的 Call 不收参数,用法统一走这个宏 +!macro StageCall N + Push ${N} + Call Stage +!macroend + +; 栈:段号 1..5 +Function Stage + Pop $R0 + ${If} ${Silent} + Return + ${EndIf} + ${If} $uiPage != 4 + Return + ${EndIf} + ; 段号先搬进全局变量:SetBmp 会踩掉 $R0..$R7(它的局部值都放那儿) + StrCpy $tmpTxt $R0 + StrCpy $tmpPath "stage-$tmpTxt.bmp" + Push ${STAGE_H} + Push ${STAGE_W} + Push ${STM_SETIMAGE} + Push $hStage + Push $tmpPath + Call SetBmp + StrCpy $tmpPath "progress-$tmpTxt.bmp" + Push ${PROG_H} + Push ${PROG_W} + Push ${STM_SETIMAGE} + Push $hProg + Push $tmpPath + Call SetBmp +FunctionEnd + +; ── P1 欢迎 ──────────────────────────────────────────────────────────────── +Function PageWelcome + ${If} ${Silent} + Abort + ${EndIf} + StrCpy $uiPage 1 + Call NewPage + Push "page-welcome.bmp" + Call Chrome + !insertmacro NewBmpBtn ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hCancel "btn-cancel-normal.bmp" + !insertmacro NewBmpBtn ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hNext "btn-next-normal.bmp" + ${NSD_OnClick} $hCancel OnClose + ${NSD_OnClick} $hNext GoNext + nsDialogs::Show +FunctionEnd + +; ── P2 许可协议 ──────────────────────────────────────────────────────────── +; 中文摘要烘焙在 page-license.bmp 里;英文原文(LICENSE)用真编辑框显示, +; 因为它比框大一截、必须能滚 —— 位图放不下整篇协议。 +Function PageLicense + ${If} ${Silent} + Abort + ${EndIf} + StrCpy $uiPage 2 + Call NewPage + Push "page-license.bmp" + Call Chrome + + ; 先按可写建,灌完文本再设只读:以只读样式创建的编辑框会被刷成灰底, + ; 后期用 EM_SETREADONLY 设的只读框底色还是白的(SetCtlColors 再兜一层)。 + !insertmacro NewEdit "${ES_MULTILINE}|${ES_AUTOVSCROLL}|${WS_VSCROLL}|${WS_CHILD}|${WS_VISIBLE}" ${LIC_EDIT_X} ${LIC_EDIT_Y} ${LIC_EDIT_W} ${LIC_EDIT_H} $hLicEdit + File /oname=$PLUGINSDIR\license.txt "${PROJECT_DIR}\..\LICENSE" + FileOpen $9 "$PLUGINSDIR\license.txt" r + lic_loop: + ClearErrors + FileRead $9 $8 + IfErrors lic_done + SendMessage $hLicEdit ${EM_REPLACESEL} 1 "STR:$8$\r$\n" + Goto lic_loop + lic_done: + FileClose $9 + ; FileRead + EM_REPLACESEL 会把插入点一路推到末尾、视图跟着滚到底; + ; 用户进这一页看到的应该是协议开头,所以显式回到顶部 + SendMessage $hLicEdit ${EM_SETSEL} 0 0 + SendMessage $hLicEdit ${WM_VSCROLL} 6 0 ; SB_TOP + SendMessage $hLicEdit ${EM_SETREADONLY} 1 0 + + !insertmacro NewBmpBtn 272 432 16 16 $hCheck "check-off.bmp" + ${If} $licOk == 1 + !insertmacro SetBmpBase $hCheck "check-on.bmp" 16 16 + ${EndIf} + !insertmacro AddLabel 296 430 300 20 12 "我已阅读并同意上述条款" + ${NSD_OnClick} $hCheck OnLicCheck + + !insertmacro NewBmpBtn ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hCancel "btn-cancel-normal.bmp" + !insertmacro NewBmpBtn ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hNext "btn-next-normal.bmp" + ${NSD_OnClick} $hCancel OnClose + ${NSD_OnClick} $hNext OnLicNext + nsDialogs::Show +FunctionEnd + +Function PageLicenseLeave + StrCpy $uiPage 0 +FunctionEnd + +; ── P3 安装位置 + 安装模式 ───────────────────────────────────────────────── +Function PageDir + ${If} ${Silent} + Abort + ${EndIf} + StrCpy $uiPage 3 + Call NewPage + Push "page-dir.bmp" + Call Chrome + + !insertmacro NewEdit "${ES_AUTOHSCROLL}|${WS_CHILD}|${WS_VISIBLE}" ${PATH_EDIT_X} ${PATH_EDIT_Y} ${PATH_EDIT_W} ${PATH_EDIT_H} $hPath + ${NSD_SetText} $hPath "$INSTDIR" + !insertmacro NewBmpBtn ${BROWSE_X} ${BROWSE_Y} ${BROWSE_W} ${BROWSE_H} $hBrowse "btn-browse-normal.bmp" + ${NSD_OnClick} $hBrowse OnBrowse + + !insertmacro NewBmpBtn ${RADIO1_X} ${RADIO1_Y} 16 16 $hRadio1 "radio-off.bmp" + !insertmacro NewBmpBtn ${RADIO2_X} ${RADIO2_Y} 16 16 $hRadio2 "radio-off.bmp" + ${NSD_OnClick} $hRadio1 OnModeUser + ${NSD_OnClick} $hRadio2 OnModeAll + ; 初始勾选跟随 $installMode:initMultiUser 已经按「上次装法 / 命令行 / 默认」定好了模式 + ${If} $installMode == "all" + StrCpy $modeAll 1 + !insertmacro SetBmpBase $hRadio2 "radio-on.bmp" 16 16 + ${Else} + StrCpy $modeAll 0 + !insertmacro SetBmpBase $hRadio1 "radio-on.bmp" 16 16 + ${EndIf} + + ; 位图上的「需要空间 约 260 MB」是设计稿的占位数字,用真实体积盖掉 + !ifdef ESTIMATED_SIZE + IntOp $R0 ${ESTIMATED_SIZE} / 1024 + StrCpy $tmpTxt "需要空间 约 $R0 MB" + !insertmacro AddLabel ${PG_X} ${SIZE_TXT_Y} ${CONTENT_W} 20 11 "$tmpTxt" + !endif + + !insertmacro NewBmpBtn ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hBack "btn-back-normal.bmp" + !insertmacro NewBmpBtn ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hNext "btn-next-normal.bmp" + ${NSD_OnClick} $hBack GoBack + ${NSD_OnClick} $hNext GoNext + nsDialogs::Show +FunctionEnd + +Function PageDirLeave + StrCpy $uiPage 0 + ; 手改过就以输入框为准(浏览按钮也是写回这个框) + ${NSD_GetText} $hPath $R1 + ${If} $R1 != "" + StrCpy $INSTDIR $R1 + ${EndIf} + StrCpy $R2 $INSTDIR 1 -1 + ${If} $R2 == "\" + StrCpy $INSTDIR $INSTDIR -1 + ${EndIf} + ; 和 electron-builder 的目录页同一套规矩:路径必须以应用目录名结尾, + ; 否则用户填 D:\Games 会把整个文件树倒进 D:\Games 而不是 D:\Games\Scoreboard_Console + ${StrContains} $R3 "${APP_FILENAME}" $INSTDIR + ${If} $R3 == "" + StrCpy $INSTDIR "$INSTDIR\${APP_FILENAME}" + ${EndIf} + + ${If} $modeAll == 1 + ; 「为所有用户安装」:照抄 multiUserUi.nsh 的提权范式。 + ; 提权成功后是**另一个进程**在跑整个向导(它已经是管理员,会重新走到这一页并直接接着往下), + ; 外层进程在 ${Case} 0 里 Quit,避免两个进程同时写同一份文件。 + ${IfNot} ${UAC_IsAdmin} + ShowWindow $HWNDPARENT ${SW_HIDE} + !insertmacro UAC_RunElevated + ${Switch} $0 + ${Case} 0 + ${If} $1 = 1 + Quit + ${EndIf} + ${If} $1 = 3 + ${OrIf} $2 = 0x666666 + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(loginWithAdminAccount)" + ${EndIf} + ${Break} + ${Case} 1223 ;用户取消了 UAC + ${Break} + ${Case} 1062 + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "登录服务未运行,无法提权。" + ${Break} + ${Default} + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "提权失败,错误码 $0" + ${Break} + ${EndSwitch} + ShowWindow $HWNDPARENT ${SW_SHOW} + BringToFront + Abort ; 留在本页:提权没成时让用户改选「仅为我安装」 + ${Else} + !insertmacro setInstallModePerAllUsers + ${EndIf} + ${Else} + !insertmacro setInstallModePerUser + ${EndIf} +FunctionEnd + +; ── P4 正在安装 ──────────────────────────────────────────────────────────── +; 自绘页:分段进度由 DoInstall 里的 Stage 调用推动(7z 一次解压拿不到百分比)。 +; 不用 NSIS 自带的 instfiles 页,原因见 Tick 里的注释。 +Function PageInstall + ${If} ${Silent} + Abort + ${EndIf} + StrCpy $uiPage 4 + Call NewPage + Push "page-progress.bmp" + Call Chrome + !insertmacro NewCtl "Static" "${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}" ${STAGE_X} ${STAGE_Y} ${STAGE_W} ${STAGE_H} $hStage + !insertmacro SetBmpStatic $hStage "stage-1.bmp" ${STAGE_W} ${STAGE_H} + !insertmacro NewCtl "Static" "${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}" ${PROG_X} ${PROG_Y} ${PROG_W} ${PROG_H} $hProg + !insertmacro SetBmpStatic $hProg "progress-0.bmp" ${PROG_W} ${PROG_H} + !insertmacro NewBmpBtn ${BTN_SECONDARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hCancel "btn-cancel-normal.bmp" + ${NSD_OnClick} $hCancel OnClose + nsDialogs::Show +FunctionEnd + +Function PageInstallLeave + StrCpy $uiPage 0 +FunctionEnd + +; ── P5 完成 ──────────────────────────────────────────────────────────────── +Function PageFinish + ${If} ${Silent} + Abort + ${EndIf} + StrCpy $uiPage 5 + Call NewPage + Push "page-finish.bmp" + Call Chrome + + !insertmacro NewBmpBtn ${FIN_CHK_X} ${FIN_CHK_Y} 16 16 $hCheck "check-off.bmp" + ${If} $runApp == 1 + !insertmacro SetBmpBase $hCheck "check-on.bmp" 16 16 + ${EndIf} + !insertmacro AddLabel 296 336 300 20 13 "立即运行 赛事积分榜" + ${NSD_OnClick} $hCheck OnFinCheck + + ; 台上的实际安装目录(位图里写的是设计稿的占位路径) + StrCpy $tmpTxt "安装位置:$INSTDIR" + !insertmacro AddLabel ${PG_X} ${FIN_PATH_Y} ${CONTENT_W} 18 11 "$tmpTxt" + + !insertmacro NewBmpBtn ${BTN_PRIMARY_X} ${BTN_Y} ${BTN_W} ${BTN_H} $hFinish "btn-finish-normal.bmp" + ${NSD_OnClick} $hFinish OnFinish + nsDialogs::Show +FunctionEnd + +Function PageFinishLeave + StrCpy $uiPage 0 +FunctionEnd + +; ── 界面初始化 ───────────────────────────────────────────────────────────── +; 去系统边框 + 固定 760×480(按 DPI 缩放)+ 居中。 +; MUI 的外层框架本身用不上,但它是 $HWNDPARENT、是标准按钮条的宿主, +; 所以不能不要,只能去边框、盖住、把标准按钮当程序化翻页的工具。 +Function GuiInit + Call PickDpi + System::Call 'user32::GetWindowLong(p $HWNDPARENT, i -16) i .R0' + IntOp $R0 $R0 & 0xFF30FFFF ; 清 WS_CAPTION / BORDER / DLGFRAME / SYSMENU / MIN / MAX + System::Call 'user32::SetWindowLong(p $HWNDPARENT, i -16, i R0)' + Push ${WIN_W} + Call S + Pop $R0 + Push ${WIN_H} + Call S + Pop $R1 + System::Call 'user32::GetSystemMetrics(i 0) i .R2' + System::Call 'user32::GetSystemMetrics(i 1) i .R3' + IntOp $R2 $R2 - $R0 + IntOp $R2 $R2 / 2 + IntOp $R3 $R3 - $R1 + IntOp $R3 $R3 / 2 + ${If} $R2 < 0 + StrCpy $R2 0 + ${EndIf} + ${If} $R3 < 0 + StrCpy $R3 0 + ${EndIf} + System::Call 'user32::SetWindowPos(p $HWNDPARENT, p 0, i $R2, i $R3, i $R0, i $R1, i 0x0014)' + Call EnsureArt +FunctionEnd + +; ── .onInit ──────────────────────────────────────────────────────────────── +; 逐项对照 electron-builder 的 templates/nsis/installer.nsi,只去掉 setInstallSectionSpaceRequired +; (那是给组件页算体积用的,我们没有组件页)。 +Function .onInit + ; 显式赋 "0":下面 NewPage 里用 $timerId == 0 判断「建过没有」, + ; 而 LogicLib 的 == 是字符串比较,空串跟 0 不相等,会一次都不建(踩过) + StrCpy $timerId 0 + StrCpy $uiPage 0 + StrCpy $instStarted 0 + SetOutPath $INSTDIR + ${LogSet} on + !insertmacro check64BitAndSetRegView + ; 静默安装跳过单实例检查:这个宏的头一句是 BringToFront,而静默模式压根没有窗口, + ; 实测在这种情况下会挂死(wine 下 45 秒不返回 —— 安装器就卡在这儿永远装不完)。 + ; 交互安装照常查:那才是「用户重复双击」真正会发生的地方。 + ${IfNot} ${Silent} + ${AndIfNot} ${UAC_IsInnerInstance} + !insertmacro ALLOW_ONLY_ONE_INSTALLER_INSTANCE + ${EndIf} + !insertmacro initMultiUser + !ifmacrodef customInit + !insertmacro customInit + !endif + StrCpy $runApp 1 +FunctionEnd + +; ── 页面序列 ─────────────────────────────────────────────────────────────── + +Page custom PageWelcome +Page custom PageLicense PageLicenseLeave +Page custom PageDir PageDirLeave + +Page custom PageInstall PageInstallLeave +Page custom PageFinish PageFinishLeave + +; 空跑的 instfiles 页(放在页面序列最后):NSIS 要求「有安装段就必须有 instfiles 页」, +; 否则 -WX 下直接报 warning 8000 编译不过。在 PRE 回调里 Abort 掉、页面不会显示, +; 而 P5 的「完成」是直接结束安装器(见 OnFinish),根本走不到这一页。 +PageEx instfiles + Caption " " + PageCallbacks SkipInstfiles "" "" +PageExEnd + +Function SkipInstfiles + Abort +FunctionEnd + +; ── 安装流程 ─────────────────────────────────────────────────────────────── +; 「立即运行」用 electron-builder 的 StartApp 宏(common.nsh):它内部走 ExecShellAsUser, +; 以**登录用户**身份启动 —— 「为所有用户安装」那一趟进程是提权过的,直接 Exec 会让应用 +; 继承管理员令牌,装完跑起来的会是个管理员身份的客户端(数据目录/开机自启都跑到别人家去)。 +; 这个宏里带一句 Var /GLOBAL startAppArgs,整个脚本只能插入一次,所以包成一个函数给两处调。 +Function StartAppNow + HideWindow + !insertmacro StartApp +FunctionEnd + +; 安装流程本体。放在函数里而不是 Section 里,是为了让 P4 能是自绘页(原因见 Tick)。 +; 顺序逐行对照 electron-builder 的 templates/nsis/installSection.nsh。 +Function DoInstall + ; 静默安装没有 UI 可选安装模式,per-machine 这一趟要在这里补提权。 + ; 比上游多一个 $installMode == "all" 的条件:上游只在「已有 per-machine 安装」时提权, + ; 而我们把默认模式改成了「为所有用户」,全新静默安装(/S)就会默认往 Program Files 写, + ; 不提权必然写不进去 —— 现场用脚本装机时这一步比交互装机更要紧。 + !ifndef INSTALL_MODE_PER_ALL_USERS + !ifndef ONE_CLICK + ${if} $installMode == "all" + ${andIf} ${Silent} + ${ifNot} ${UAC_IsAdmin} + ShowWindow $HWNDPARENT ${SW_HIDE} + !insertmacro UAC_RunElevated + ${Switch} $0 + ${Case} 0 + ${Break} + ${Case} 1223 ;用户取消了 UAC + ${Break} + ${Default} + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0" + ${Break} + ${EndSwitch} + Quit + ${else} + !insertmacro setInstallModePerAllUsers + ${endIf} + ${endIf} + !endif + !endif + + InitPluginsDir + + ${IfNot} ${Silent} + SetDetailsPrint none + ${endif} + + StrCpy $appExe "$INSTDIR\${APP_EXECUTABLE_FILENAME}" + + # must be called before uninstallOldVersion + !insertmacro setLinkVars + + ; 非 one-click 时只在最外层进程里查:提权出来的内层进程和用户看到的可能是同一个应用, + ; 两个进程同时抢着关它会互相打架(上游 installer.nsh / installSection.nsh 就是这么分的)。 + ; 静默安装没有窗口,那句 UAC_IsInnerInstance 走插件、会卡住不返回,所以直接查。 + ${If} ${Silent} + Call CheckAppRunningImpl + ${Else} + ${ifNot} ${UAC_IsInnerInstance} + Call CheckAppRunningImpl + ${endif} + ${EndIf} + + StrCpy $keepShortcuts "false" + !insertMacro setIsTryToKeepShortcuts + ${if} $isTryToKeepShortcuts == "true" + ReadRegStr $R1 SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" KeepShortcuts + ${if} $R1 == "true" + ${andIf} ${FileExists} "$appExe" + StrCpy $keepShortcuts "true" + ${endIf} + ${endif} + + ; 覆盖安装:先跑旧卸载器(它自己会带 --updated / --keep-shortcuts) + !insertmacro uninstallOldVersion SHELL_CONTEXT + !insertmacro handleUninstallResult SHELL_CONTEXT + ${if} $installMode == "all" + !insertmacro uninstallOldVersion HKEY_CURRENT_USER + !insertmacro handleUninstallResult HKEY_CURRENT_USER + ${endIf} + + SetOutPath $INSTDIR + + !insertmacro StageCall 1 + !insertmacro installApplicationFiles + !insertmacro StageCall 2 + !insertmacro registryAddInstallInfo + !insertmacro StageCall 3 + !insertmacro addStartMenuLink $keepShortcuts + !insertmacro addDesktopLink $keepShortcuts + + ${if} ${FileExists} "$newStartMenuLink" + StrCpy $launchLink "$newStartMenuLink" + ${else} + StrCpy $launchLink "$INSTDIR\${APP_EXECUTABLE_FILENAME}" + ${endif} + + !ifmacrodef registerFileAssociations + !insertmacro registerFileAssociations + !endif + + !insertmacro StageCall 4 + !ifmacrodef customInstall + !insertmacro customInstall + !endif + !insertmacro StageCall 5 + + ; 真卸载器在这里现写。先删掉 installApplicationFiles 落下来的那个占位文件, + ; 免得「万一没写成功、$INSTDIR 里却留着一个假卸载器」这种最坏情况。 + Delete "$INSTDIR\${UNINSTALL_FILENAME}" + WriteUninstaller "$INSTDIR\${UNINSTALL_FILENAME}" + + + + !ifdef ONE_CLICK + !ifdef RUN_AFTER_FINISH + ${ifNot} ${Silent} + ${orIf} ${isForceRun} + Call StartAppNow + ${endIf} + !else + ${if} ${isForceRun} + Call StartAppNow + ${endIf} + !endif + !insertmacro quitSuccess + !else + ; 交互安装的「立即运行」在 P5 上处理;静默安装只能靠 --force-run + ${if} ${isForceRun} + ${andIf} ${Silent} + Call StartAppNow + ${endIf} + !endif +FunctionEnd + +; 安装段的两条路: +; 交互安装:安装段根本不会执行(页面序列里的 instfiles 页被 Abort 掉了), +; 安装流程由 P4 的定时器调 DoInstall 跑; +; 静默安装(/S):没有页面可走,段就是唯一入口 —— 这一步走的是 electron-builder +; 原生的「段在 instfiles 页上执行」,和上游同一条路。 +; 之所以不把静默安装也塞进 .onInit:实测那样会在 wine 里挂死(.onInit 阶段还没有 +; 页对话框,DoInstall 里的界面相关动作没有宿主)。段这条路是上游验证过的。 +Section "install" INSTALL_SECTION_ID + ${If} ${Silent} + Call DoInstall + !insertmacro quitSuccess + ${EndIf} +SectionEnd diff --git a/console/installer/uninstaller-stub.txt b/console/installer/uninstaller-stub.txt new file mode 100644 index 0000000..801520d --- /dev/null +++ b/console/installer/uninstaller-stub.txt @@ -0,0 +1,10 @@ +placeholder file for custom-script builds +======================================== + +本文件只是 electron-builder 模板宏 installApplicationFiles 需要的一个「肯定存在」的 +File 源文件。用了自定义 installer 脚本(build.nsis.script)之后 electron-builder 不再 +预编卸载器,UNINSTALLER_OUT_FILE 被留成空值,而那条 File 命令是无条件的 —— +不顶一个真文件上去,makensis 会直接以「no files found」失败。 + +安装时这个文件会被解到 $INSTDIR 下、紧接着被删掉,再由 WriteUninstaller 写出真正的 +卸载器(见 console/installer/installer.nsi 的安装段末尾)。它不会留在用户机器上。 diff --git a/console/package.json b/console/package.json index 0828522..360de96 100644 --- a/console/package.json +++ b/console/package.json @@ -1,7 +1,7 @@ { "name": "scoreboard-console", "productName": "Scoreboard Console", - "version": "0.5.0", + "version": "0.5.1", "private": true, "author": "AskaEth", "description": "赛事积分榜 · 桌面宿主:守护 Go 服务端并把大屏投到扩展屏", @@ -73,12 +73,14 @@ "artifactName": "${productName}-${version}-${arch}.${ext}" }, "nsis": { + "script": "installer/installer.nsi", "oneClick": false, "allowToChangeInstallationDirectory": true, "createDesktopShortcut": true, "shortcutName": "赛事积分榜", "license": "../LICENSE", "include": "resources/installer-custom.nsh", + "selectPerMachineByDefault": true, "language": "2052" } } diff --git a/deploy/prepare-extra.mjs b/deploy/prepare-extra.mjs index 817970c..ad9e4d2 100644 --- a/deploy/prepare-extra.mjs +++ b/deploy/prepare-extra.mjs @@ -33,6 +33,21 @@ for (const doc of docsToStage) { console.log(` ${doc.label} staged from ${source}`) } +// ---- 1b. 自绘安装器脚本的编码检查 ------------------------------------------- +// 本机手工跑 makensis 时必须带 UTF-8 BOM,否则脚本里的中文直接被判成 Bad text encoding; +// electron-builder 那边传了 -INPUTCHARSET UTF8,构建机上没 BOM 也能过 —— 两边口径不一致, +// 出问题时只会表现为「本地编不过、构建机编得过」这种最难查的差异,所以统一要求带 BOM。 +const installerScript = join(root, 'console', 'installer', 'installer.nsi') +if (existsSync(installerScript)) { + const head = readFileSync(installerScript).subarray(0, 3) + if (!(head[0] === 0xef && head[1] === 0xbb && head[2] === 0xbf)) { + console.error(` [installer] ${installerScript} 缺少 UTF-8 BOM:本机 makensis 会报 Bad text encoding`) + console.error(' [installer] 修复:用编辑器另存为「UTF-8 with BOM」,或跑 python3 -c "…" 补 BOM') + process.exit(1) + } + console.log(' installer script has UTF-8 BOM') +} + // ---- 2. installer custom script --------------------------------------------- // electron-builder 的 nsis.include 只收一个文件,所以许可页文案、安装目录记忆与防火墙规则写在同一个 .nsh 里。 const signatureFile = join(root, 'deploy', 'signature.local.txt') @@ -171,6 +186,24 @@ if (version === '') { process.exit(1) } +// ---- 3b. 安装器素材的版本号核对 --------------------------------------------- +// 安装界面的版本号是「烘焙进位图」的(console/installer/art/*/brand.bmp 的品牌栏), +// 位图里读不出文本,所以 gen_art.py 另外写了一份 art/version.txt 作旁证。 +// 不核对的话会出现「安装界面写着 v0.5.1、装的其实是 0.5.2」——这种错只在装完之后 +// 被人一眼看到,而且很容易随包发出去;宁可构建直接失败,也不要发错版本号。 +const artDir = join(root, 'console', 'installer', 'art') +if (existsSync(artDir)) { + const artVersionFile = join(artDir, 'version.txt') + const artVersion = existsSync(artVersionFile) ? readFileSync(artVersionFile, 'utf8').trim() : '' + const wantVersion = version.replace(/^dev_/, '') + if (artVersion !== wantVersion) { + console.error(` [art] 安装器素材里的版本号与 VERSION 对不上:素材=${artVersion || '(缺失)'},VERSION=${wantVersion}`) + console.error(' [art] 修复:跑 python3 console/installer/art-gen/gen_art.py 重新生成素材,然后提交') + process.exit(1) + } + console.log(` installer art version matches (${wantVersion})`) +} + // 必须纯 ASCII:cmd.exe 会错解 .bat 里的非 ASCII 文本(见本文件头部说明)。 // 用 CRLF:与 .gitattributes 里 *.bat 的约定一致,cmd 在 Windows 上按 CRLF 读最稳。 // 只 set 不加 setlocal:build.bat 用 call 调它,变量要留在调用方的环境里。 diff --git a/docs/使用手册.md b/docs/使用手册.md index 61e97af..e9db23b 100644 --- a/docs/使用手册.md +++ b/docs/使用手册.md @@ -109,7 +109,9 @@ | 状态 | 下拉选择:**有效**、**DNS 弃赛**、**DQ 取消**、**DNF 未完赛**、**退赛** | | 积分(自动) | 随成绩实时计算,仅供参考 | | 备注 | 自由填写,示例文本是 `可留空` | -| 操作 | 已发布的行显示 **「作废本条」**(已作废的行改显示 **「重新录入」**);草稿行这里是 `—`(草稿本来就能直接改)。详见 4.10 | +| 操作 | 已发布的行并排两个按钮 **「修改本条」**(退回草稿改一改,改完重新发布本组)与 **「作废本条」**(这一条不算了);已作废的行改显示 **「重新录入」**;草稿行这里是 `—`(草稿本来就能直接改)。详见 4.10 | + +> 已发布的行里,**成绩格与状态格可以直接点**:点一下弹出确认框(写明会退回草稿、榜单先把它退下来、改完需重新发布本组),确认后才退回,点「取消」什么都不做。名次格与备注格点不动。 **成绩写法**:能接受的写法比过去多,中文输入法下的全角冒号 `1:06`、全角数字也认。 @@ -179,7 +181,7 @@ 3. 确认框会写明:`本组还有 N 人没有成绩,本次将发布已填的 M 人;其余保持未发布,补录后再发布即可。本次影响 … 个单位,最大分差变化 … 分。发布后立即上屏并重算积分榜。`——**看完再确认**,系统只发布已填的那 M 人,不会把没成绩的人当成 0 分发出去(末句在延迟结算下会换成「名次与榜单等该组全部录完后再更新」,见下面); 4. 确认后这批成绩立即上屏;**实时结算(默认)下,名次与积分先按已发布的这部分算**,大屏立刻有内容(延迟结算下先不动,见下); 5. 下一批跑完,回到本页补录成绩,再点一次「发布本批」——系统会把两批放在一起重算名次与积分,先发的部分自动跟着更新; -6. 全部发完后按钮不再显示「本批」(并变为不可用),此时该组视为已全部发布。**只错一条**时不必撤销整组发布,用该行的「作废本条 → 重新录入」(见 4.10);整组都要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。 +6. 全部发完后按钮不再显示「本批」(并变为不可用),此时该组视为已全部发布。**只错一条**时不必撤销整组发布,点那一格(或该行的「修改本条」)退回草稿改完重发即可(见 4.10);整组都要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。 > 只有「会被算错」的写法才会挡住发布(见 4.4);空格子只是「还没录」,属于提醒,不影响发布。审核页(第 5 节)也是同一套口径:只有写错或缺名次才挡「发布整组」,空成绩只是本次跳过。 @@ -197,7 +199,7 @@ 2. 系统作废该组已产生的积分流水,大屏回退到发布前状态; 3. 修改后重新发布即可。全程留痕,可在「变更历史」查看。 -> **只错了一条成绩时**,不必撤销整组发布、把别人的成绩也一起翻下来——用该行「操作」列的「作废本条 / 重新录入」即可,见 4.10。 +> **只错了一条成绩时**,不必撤销整组发布、把别人的成绩也一起翻下来——点那一格(或该行的「修改本条」)退回草稿改完重发即可,见 4.10。 ### 4.8 勾选与批量操作(退赛 / 恢复 / 移出报名) @@ -236,33 +238,38 @@ - **权限**:读得到成绩的人都能看到这块卡片(访客只读,输入框置灰并写明原因);**能保存的是录入员及以上**(与成绩录入同权限)。示例数据模式下不能保存; - 团体名次是**独立保存**的:点「保存团体名次」只提交这块卡片,不会顺手发布成绩;成绩仍然要另外「发布」。 -### 4.10 单条作废 / 重新录入(手滑填错了怎么办) +### 4.10 单条修改 / 作废 / 重新录入(手滑填错了怎么办) -已发布的成绩行在表格里仍然是**锁着的**(成绩、名次、状态、备注都改不了)——这是有意的:已发布的行已经上屏、已经计分,允许就地改会让「看到的榜单」和「改到一半的数据」对不上。要改就必须先明确地把它退回来。表格最后一列 **「操作」** 就是这件事的入口,只有已发布的行才有按钮。 +已发布的成绩行在表格里仍然是**锁着的**(名次、备注改不了)——这是有意的:已发布的行已经上屏、已经计分,允许就地改会让「看到的榜单」和「改到一半的数据」对不上。要改就必须先明确地把它退回来。入口有两个,效果一样: -**两个按钮,什么时候用哪个** +- **直接点那一格**:已发布的**成绩格**与**状态格**点得动,点一下会弹出确认框,写明「这一条会退回草稿、榜单先把它退下来、改完需重新发布本组」;点「取消」**什么都不做**(成绩、榜单、大屏都不动),点确认才退回来。名次格与备注格仍然点不动; +- **点表格最右端「操作」列的按钮**,只有已发布的行才有按钮。 + +**三个按钮,什么时候用哪个** | 按钮 | 什么时候出现 | 做什么 | | --- | --- | --- | -| **作废本条** | 这一行是**已发布且正常**的成绩 | 让这**一条**成绩退出名次与积分(同组其它人重新排名),但**不改**它的原始记录——需要改回来时还是用「重新录入」 | -| **重新录入** | 这一行是**已作废**的(红徽标「已作废」) | 把这一条**退回草稿**(原来填的成绩还在格里,直接改就行)、不再计入名次与积分,之后就能像普通草稿一样编辑;改完再发布本组 | +| **修改本条** | 这一行是**已发布且正常**的成绩 | 把这一条**退回草稿**(原来填的成绩还在格里,直接改就行),名次与积分先按「没有这条成绩」重算,改完再发布本组。**只是填错了改用这个**——它不会把这一条标成「已作废」 | +| **作废本条** | 同上 | 让这**一条**成绩不再算数(同组其它人重新排名):成绩文字还留在格里,录入列变成红徽标「已作废」,**不计入名次与积分**。这一条确实不算了才用它 | +| **重新录入** | 这一行是**已作废**的(红徽标「已作废」) | 把这一条**退回草稿**(同「修改本条」),改完就能像普通草稿一样重新发布 | -两个按钮**都必须填写原因**(确认框里的「作废原因 / 退回原因」),留空时确认键点了也不会提交——原因会写进审计日志,事后能查清是谁、什么时候、为什么动的这一条。 +三个按钮**都必须填写原因**(确认框里的「修改原因 / 作废原因 / 退回原因」),留空时确认键点了也不会提交——原因会写进审计日志,事后能查清是谁、什么时候、为什么动的这一条。 **点完会立刻发生什么** - 服务端在同一个事务里**按当前已发布成绩重算**该小项该组的名次与积分,并**立即推送大屏**; - 这一步**不受**「分批发布时实时更新榜单」这个延迟结算开关影响(它改的是「这条成绩算不算数」,不是「录了多少」),不会出现「榜上还有分、成绩却已经撤了」; -- 两者都会留痕:**审计日志**(第 13 节)里的动作分别是 `result.void` 与 `result.reopen`,含操作人、时间与填写的原因。注意「变更历史」(第 12 节)记的是**发布 / 撤销发布**这类整组版本,单条作废 / 重新录入**不会**在那里新增一个版本节点。 +- 三个动作都会留痕:**审计日志**(第 13 节)里的动作分别是 `result.void`(作废)与 `result.reopen`(修改 / 重新录入),含操作人、时间与填写的原因。注意「变更历史」(第 12 节)记的是**发布 / 撤销发布**这类整组版本,单条的修改 / 作废 / 重新录入**不会**在那里新增一个版本节点。 -**手滑填错了怎么办:两条路** +**手滑填错了怎么办:三条路** -1. **只错了一条**(最常见):在那一行点 **「作废本条」** 填原因 → 这一条退出名次与积分、大屏立刻更新 → 同一行点 **「重新录入」**(此时按钮已变成它)填原因 → 退回草稿,该行可以编辑了 → 改对成绩 → 再点页头的 **「发布」**(该组还有别的已发布成绩时显示为「发布本批」,见 4.6)。全程只动这一条,同组别人的成绩一直留在榜上; -2. **整组都要改**(例如整组被判罚、名次口径整体调整):点页面上的 **「撤销发布」** → 修改 → 重新发布(见 4.7)。这条会把该组已产生的积分流水整体作废再重发,大屏会先回退一次。 +1. **只错了一条、要改对**(最常见):在那一行点 **成绩格**(或点 **「修改本条」**),确认框会写明后果,填「修改原因」→ 确认:这一条退回草稿、大屏按「没有这条成绩」重算 → **直接改格里的内容** → 再点页头的 **「发布」**(该组还有别的已发布成绩时显示为「发布本批」,见 4.6)。全程只动这一条,同组别人的成绩一直留在榜上; +2. **这一条根本不该算**(成绩无效、重复录入等):同一行点 **「作废本条」** 填原因 → 这一条不再计入名次与积分(成绩文字还留在格里,录入列变成红徽标「已作废」)。以后要让它重新算数,用同一行的 **「重新录入」** 退回草稿改完再发布。**只是填错了用第 1 条**——用「作废」会在榜上留下一条作废痕迹; +3. **整组都要改**(例如整组被判罚、名次口径整体调整):点页面上的 **「撤销发布」** → 修改 → 重新发布(见 4.7)。这条会把该组已产生的积分流水整体作废再重发,大屏会先回退一次。 -> 只错一条时**优先用第 1 条路**:撤销发布会让整组的分数先消失再回来,大屏在中间会闪一下;作废 / 重新录入只影响这一条。 +> 只错一条时**优先用第 1、2 条路**:撤销发布会让整组的分数先消失再回来,大屏在中间会闪一下;单条修改 / 作废只影响这一条。 -> 需要先「存草稿」再点这两个按钮:作废 / 退回会重算并整表刷新,未保存的编辑会被刷新覆盖,页面会拦下并提示。 +> 需要先「存草稿」再动这些入口:修改 / 作废 / 退回会重算并整表刷新,未保存的编辑会被刷新覆盖,页面会拦下并提示。 --- @@ -371,11 +378,15 @@ - 列:名次、单位、总分、金、银、铜、变化、明细; - 「变化」列显示名次升降(如 `↑2`、`↓1`); -- 点「展开」下钻该单位的积分明细,右侧面板显示合计与每一条得分来源(项目、组别、运动员、成绩、名次、积分),每一分都可溯源。 +- 点「展开」下钻该单位的积分明细,右侧面板显示合计与每一条得分来源(项目 / 组别、运动员、来源、成绩、名次、积分),每一分都可溯源; + - **「运动员」列**:团体项目、按队内平均算出的团体分、以及人工调整这几类没有单个运动员的明细,这一列显示**单位名**(单位的团体分就是该单位挣的);人工调整没有项目也没有运动员,显示 `—`; + - **「来源」列**:这一分是怎么来的——`成绩`(正常计分)、`破纪录加分`、`人工调整`,与导出的「来源」列用词一致; + - **被改过的成绩带一个「已修订 ×N」小角标**(N = 发布后被改过的次数),鼠标悬停在角标上会显示**最后一次修订的时间、原因与操作人**;没改过的行没有角标。 ### 8.2 单位奖牌榜 / 个人积分榜 - 单位奖牌榜显示金、银、铜与合计; +- **单位奖牌榜有自己的名次与顺序:金牌多的在前,其次比银牌、铜牌,最后按单位编码排**——它不看总分,所以「金牌多但总分低」的单位在这里排在前面,在单位总分榜上却靠后,这是口径不同,不是数据错了; - 个人积分榜显示运动员、单位、个人总分与奖牌数; - 单位奖牌榜那一列的「明细」展开的是**同一个单位积分明细面板**(见 8.1),不是奖牌专属明细;但这份榜单本身有专属的逐枚奖牌导出(见 8.3); - 个人积分榜**没有明细列**(不能点开下钻),但它的逐条得分来源也有专属导出(见 8.3)。 @@ -386,7 +397,7 @@ - **导出总明细**(单位总分榜卡片头):导出 `单位积分总明细.xlsx`——一张带「单位」列的总表,外加每个**有数据**的单位一张分表;没有积分的单位不出分表; - **导出奖牌明细**(单位奖牌榜卡片头):导出 `单位奖牌明细.xlsx`——第一张总表逐枚奖牌列出「单位 / 大项 / 小项 / 组别 / 名次 / 奖牌 / 运动员、队」,`奖牌` 列是 `金牌` / `银牌` / `铜牌`;其后每个**有奖牌**的单位一张分表(列同上、去掉「单位」,末尾一行小计 `金 X / 银 Y / 铜 Z`),没有奖牌的单位不出分表。口径与「单位奖牌榜」一致:同一个报名项在「个人+团体」这类双计通道下只记一枚奖牌,不会重复计数; - **导出个人明细**(个人积分榜卡片头):导出 `个人积分总明细.xlsx`——第一张总表逐条列出「单位 / 运动员 / 大项 / 小项 / 组别 / 名次 / 成绩 / 得分 / 来源」;其后每个**有得分**的单位一张分表(按单位分,不按人分),没有得分流水的人不出现在表里。`得分` 是记到个人的原始分,**与「个人积分榜」逐个数字一致,且不乘榜单口径里的个人项目得分折算系数**(那个系数只作用于单位总分); -- **导出该单位明细**(右侧单位明细面板头部):先展开某个单位再点,导出 `单位积分明细.xlsx`(列:序号、大项、小项、组别、运动员、名次、成绩、来源、积分、备注,末行是「合计」)。单位奖牌榜展开的也是这个单位积分明细面板,所以想按单位逐条看时同样用它; +- **导出该单位明细**(右侧单位明细面板头部):先展开某个单位再点,导出 `单位积分明细.xlsx`(列:序号、大项、小项、组别、运动员、名次、成绩、来源、积分、备注,末行是「合计」)。**备注列会写下修订痕迹**:被改过的成绩写「已修订 ×N;最后一次 <时间> <原因>」,没改过的行留空——与屏幕上那个角标是同一句话,事后拿表格对账不会对不上。单位奖牌榜展开的也是这个单位积分明细面板,所以想按单位逐条看时同样用它; - 这些导出都是只读下载(访客也能用),不需要写权限;导出过程中按钮会变成「导出中…」并禁用,避免重复下载。 ### 8.4 推送明细到大屏 @@ -569,8 +580,13 @@ 2. 点「新增通道」逐条配置,同一「名次范围 + 名次来源」只能有一个通道; 3. 点「保存全部」整体替换该小项的通道配置; 4. 标记为「不计分」的小项,通道可以保存但不参与积分计算; -5. 「名次来源」选「按队内平均」时,把同一个单位(或个人)在该组别的成绩**取平均**后排名,并列按积分模板的并列口径处理(默认顺延);平均值分母取录入页选的「平均值口径」——`只算有效成绩`时是本单位有有效成绩的条数(一个人都没有效成绩的单位不参与团体排名、不得分),`全部报名人员都计入`时是本单位在该组别的报名条数(没成绩的按 0 计入)。报名表里 `status` 不是 `registered` 的报名项(弃赛 / 取消)既不算参与,也不进分母; -6. 每条通道有一个「计入单位总分」开关,默认打开。关掉后该通道的分只记在个人头上,不进单位总分——「个人+团体」项目的个人通道就靠它做到只记个人; +5. 「名次来源」选「按队内平均」时,把同一个单位(或个人)在该组别的成绩**汇总成一个值**后排名,并列按积分模板的并列口径处理(默认顺延)。汇总口径在该行的**「聚合口径」列**上选,两个按钮点一下即切换: + - **平均**(默认):团体成绩 = 该单位成员成绩的**平均值**。分母取录入页选的「平均值口径」——`只算有效成绩`时是本单位有有效成绩的条数(一个人都没有效成绩的单位不参与团体排名、不得分),`全部报名人员都计入`时是本单位在该组别的报名条数(没成绩的按 0 计入); + - **总和**:团体成绩 = 该单位成员成绩的**总和**(没成绩的人按 0 加与不加都一样)。 + - **各队人数相同时,两种口径排出来的名次完全相同**;人数不同时可能不同(这时按你们要的口径选,默认是「平均」)。改完点「保存全部」生效,该小项立即重算; + - 报名表里 `status` 不是 `registered` 的报名项(弃赛 / 取消)既不算参与,也不进分母; + - 不是「按队内平均」的通道这一列显示 `—`(对它没有意义); +6. 每条通道有一个「计入单位总分」开关。**新建通道时的默认值按小项类型给**:**普通个人项目 / 团体项目默认勾选**;**「个人 + 团体」项目的个人通道默认不勾**(这类项目的个人分本来就只记个人榜、不并入单位总分)。关掉后该通道的分只记在个人头上,不进单位总分——「个人+团体」项目的个人通道就靠它做到只记个人;**所以现场要留意自己那一行的实际勾选状态**; 7. 每条通道还有一个**「奖牌通道」**列,里面是两个开关(都默认打开): | 开关 | 默认 | 关掉之后 | @@ -804,7 +820,7 @@ 1. 顶部可筛选小项,以及「全部时间 / 近 24 小时 / 近 7 天」; 2. 左侧时间轴最新在上,节点显示动作(发布 / 撤销发布 / 编辑)、项目、操作人、时间与备注; 3. 点节点,右侧显示操作人、影响单位与成绩前后对比(diff); -4. 本页**不提供一键回滚**。纠错请到「成绩录入」:只错一条走「作废本条 → 重新录入 → 修改 → 重新发布」(见 4.10),整组要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。 +4. 本页**不提供一键回滚**。纠错请到「成绩录入」:只错一条走「点成绩格(或「修改本条」)→ 改 → 重新发布本组」(见 4.10),整组要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。 --- @@ -978,6 +994,9 @@ ### 17.3 明细覆盖层 - 管理端推送单位积分明细后,大屏右侧弹出半屏覆盖层,显示该单位每一分的来源; +- 覆盖层的表头是**项目 / 组别、运动员、名次、成绩、积分**五列:团体项目、按队内平均算出的团体分这类没有单个运动员的明细,「运动员」列显示**单位名**(不显示 `null`、也不留空格); +- **破纪录加分**那一类明细会在项目名后面多一个小标签 `破纪录`,一眼看出这几分不是名次分(人工调整的项目列本来就写着「人工调整」,不再重复打标签); +- **被改过的成绩**在那一行下面多一行小字,形如 `10:42 已修订(成绩录入笔误)`——大屏不能悬停、观众也离得远,所以时间只写几点几分、原因超过十几个字会截断(完整的时间、原因与操作人在管理端明细的角标悬停里看); - 默认 **60 秒后自动关闭**并恢复轮播; - 管理端「关闭大屏明细」可立即关闭。 @@ -1002,7 +1021,7 @@ 草稿不会上屏。需要点「发布」(或 `Alt+Enter`),发布成功后立即更新。 **Q:发布后发现有错怎么办?** -只错一条成绩:到「成绩录入」找到那一行,点「作废本条」→ 再点「重新录入」→ 改 → 重新发布,只动这一条(见 4.10)。 +只错一条成绩:到「成绩录入」找到那一行,**点那一格(或点「修改本条」)→ 填原因 → 确认 → 改对 → 重新发布本组**,只动这一条(见 4.10)。 整组要改:点「撤销发布」→ 修改 → 重新发布。撤销会作废该组积分流水,大屏回退;全程可在「变更历史」追溯。 **Q:并列名次怎么显示?** diff --git a/docs/升级说明.md b/docs/升级说明.md index 6fb1412..2dcac39 100644 --- a/docs/升级说明.md +++ b/docs/升级说明.md @@ -6,7 +6,94 @@ --- -## dev_0.5.0(当前版本) +## dev_0.5.1(当前版本) + +### 一句话 + +**两条数据迁移、三处计分口径变化、安装器换新,升级后建议重新导入一次新版规则包**:迁移 `0022` 把「小项已被删除、积分流水却还挂在榜上」的历史脏数据一次性作废(**只影响分数,不影响名次与奖牌,人工调整分不受影响**);迁移 `0023` 给计分通道加一列「聚合口径」(默认「平均」,不切就与升级前一样);**单位奖牌榜改为按奖牌数独立排名,可能与积分榜顺序不同**;安装界面全面重做(**安装逻辑不变**)。 + +### ① 数据迁移:两条(0022 / 0023) + +**`0022` —— 历史孤儿积分流水一次性作废**(现场可能少几分,那是升级前就该清掉的分) + +- **它清理什么**:升级前删掉一个「只按单位录名次、没有报名行」的小项时,它名下**已经产生**的积分流水会留在库里、并且没有被作废——分数继续算在单位总分里,但这个小项已经不存在,此后任何一次重算都再也碰不到这些流水(只能改库才能清)。 +- **只作废「成绩流水」与「破纪录加分」**:这两类流水一定挂着小项,空小项 = 小项已被删除。**人工调整分不受影响**——人工调整本来就可以不挂小项,是合法的,不会被误清。 +- **影响面**:**只影响分数**。这些流水本来就没有名次、也没有奖牌,所以**名次与奖牌一件不变**;作废后这些分在**单位总分与单位积分明细里一起消失**(不会出现「榜上无分、明细有分」)。它是**作废不是删除**:流水行与作废时间都留着,并注明是升级时清理的历史数据,事后查得到。 +- **怎么确认**:启动一次 Console,在运行日志或 `logs\operations\` 当天文件里能看到迁移记录(`已应用迁移 … name=0022_void_historical_orphan_ledger.sql`)。**现场确认删过「带分的小项」的机器上,相应单位的总分会少一点**——那是清掉了历史脏数据,不是这次升级算错了。 +- **想核对到条**:升级前先导出一次单位积分明细存底(「积分榜」页的「导出该单位明细」或「导出总明细」),升级后再导一次对比,就能看出少了哪几条。 + +**`0023` —— 计分通道新增一列「聚合口径」**(只加列、不动既有数据) + +- 老通道一律取默认**「平均」**(团体成绩 = 该单位成员成绩的平均值),**升级前后榜单一分不差**;想改成「总和」的,到「基础数据 → 计分通道」手工切(见《使用手册》10.4)。 + +### ② 三处口径变化(现场看到的数字 / 顺序可能不同) + +**1)「末位归零」:末位不再丢分** + +- 本版随包规则包里两个模板的「末位归零」都设成**关**:**参赛人数少于表里档位数时,最后一名按表拿分**(例:3 人参赛、模板有 6 档,第 3 名按表拿 6 分),不再被抹成 0。重新导入规则包会把库里这个开关一起写成「关」——**此前在模板页手工勾过它、或导入过把它勾上的规则包**的机器,这一步之后末位分数会变(这是定稿口径:规则里没配的名次分数就是 0 分,分只按表发)。 +- 另外,**开关打开时也只抹「真正落在最末那一档」的那一条**:并列档位从更靠前的名次起步、区间跨过末位的并列组**不再被整组抹 0**,按他们并列到的名次照表拿分(7 人里三人并列第 5、前六档表 → 每人按第 5 名拿分;升级前是 0 分)。 +- **名次与奖牌不受影响**:这一段改的只是「这一组拿多少分」。 + +**2)单位奖牌榜改为按奖牌数独立排名** + +- 顺序与名次:**金牌 → 银牌 → 铜牌 → 单位编码**,**不再跟着单位总分榜**。所以「金牌多、总分低」的单位在奖牌榜上排前面、在单位总分榜上排后面——**这是口径不同,不是数据错了**(升级前奖牌榜沿用总分榜顺序,会出现「金牌多的排在后面」)。 +- 三处同一个口径:管理端「积分榜 → 单位奖牌榜」、大屏的单位奖牌榜页、大屏底栏滚动的奖牌 Top3。 +- 「导出奖牌明细」(`单位奖牌明细.xlsx`)逐枚列出奖牌的总表不受影响;各单位**分表的先后仍按单位总分排**(得分高的在前),与奖牌榜的顺序不同,这不是错。 + +**3)同分并列段的排列按规则包的排序口径** + +- 总积分榜(及个人积分榜)里**总分相同**的单位那一段内,先后按规则包里的排序口径排——本赛会包的默认是 **总分 → 金 → 银 → 铜 → 单位编码**。 +- 重新导入规则包会把这条口径按规则包的值写回库里(本赛会包是 **总分 → 金 → 银 → 铜 → 单位编码**):**此前导入过排序口径写法不同的规则包**的机器,这一段里单位的先后可能变化——**变的是顺序,分数与奖牌都不变**,看到顺序变了不要当成故障。 +- **单位奖牌榜不受这条影响**:它固定按金 → 银 → 铜 → 单位编码(见上面第 2 条)。 + +### ③ 安装器换新(界面重做,安装逻辑不变) + +- 安装程序(`Scoreboard Console-<版本>-x64.exe`)**界面全面重做**:欢迎 / 目录 / 许可 / 进度 / 完成各页与按钮换成新素材,并**支持 4K 高 DPI**(系统缩放到 200% 时界面按缩放后的尺寸排布,字与按钮不会糊成一团)。 +- **安装逻辑一个字没改**:装到哪、装什么、桌面快捷方式(「赛事积分榜」)、卸载方式、覆盖安装时先静默跑一遍旧卸载器、数据与配置在 `%LOCALAPPDATA%\ScoreboardConsole\`(**覆盖安装不会丢**)——全部与升级前一致。 +- 默认安装模式是**「为所有用户安装」**(装到 Program Files,安装时提一次权);**这台机器上次装过时,向导沿用上次的装法**,静默安装也可以用 `/allusers` / `/currentuser` 指定。这一趟**仍然自动放行防火墙入站 19540**(在防火墙里能看到规则 `Scoreboard Console (TCP 19540)`),局域网大屏不用再手工放行;选「仅为我安装」的机器要手工放行(命令见《部署指南》7.5)。 + +### ④ 升级后建议:把新版规则包重新导入一次 + +**做法**:管理端「导出 → 规则包 → 选择 YAML → **预览差异** → 确认导入并全量重算」,导入随本次发布的新版规则包。 + +**为什么建议做**:旧包缺少本次修正的通道配置(几个双计项目的团体通道口径、纯团体项目该走「按成绩自动排名」还是「人工名次」等),**不重新导入就不会生效**。 + +⚠️ **动手前先看清这个前提**:**导入会按规则包重写各小项的计分通道配置**——规则包覆盖到的小项,库里现有的通道会被整包替换。所以: + +- **建议先导入、再按需要手工微调个别项目**;顺序反过来(先微调再导入),手工改动会被这次导入覆盖掉; +- 导入前先看「预览差异」里列出的通道增删改,确认没有把现场专门配过的项目改掉;发现被改,导入后到「基础数据 → 计分通道」改回来即可(保存后该小项会重算); +- 导入会**全量重算积分并刷新榜单**,尽量安排在**没有正在进行的项目**时做; +- 导入后正是上面那三处口径变化的生效点,请对着 ② 逐条看一遍榜单。 + +### ⑤ 升级时可能遇到的拦截(这两处以前会静默通过) + +- **导入规则包时**:如果这份规则包存在**配置冲突**——典型情形是某个小项的**名次是靠人工录入的**(例如球类、拔河这类由裁判判名次的项目),规则包却给它配了**「按成绩自动排名」**(或「按队内平均」)的通道——导入会被**整包拒收**,一个字节都不写,并直接说明**是哪个小项、为什么不行、怎么改**(给这个小项单独写一段人工名次的通道配置,或调整规则包的匹配条件别套到它身上)。升级前这种情况是「先把通道换掉、紧接着重算时才报错」,名次表会停在半空(分数还在、奖牌却清零),自愈与重试导入都会因为同一个小项再失败一次——**现在不会留下这种坏状态**。 +- **保存积分模板时**:如果**分值表里配的名次超过了「录取名次」**(例如分值表配到第 7 档、录取名次还留着 6),保存会被**拒绝**并说明怎么改:要么把录取名次改成 7、要么改成 0(0 = 不按名次封顶),要么删掉超出录取名次的那几档(例子里的第 7 档)。升级前这种配置能安静存下来,但第 7 档及以后在榜上恒为 0 分,界面上看不出任何异常——**现在会在保存这一步就说清楚**。 + +### ⑥ 升级后 5 分钟核对 + +1. 启动一次 Console,看运行日志 / `logs\operations\` 当天文件:应能看到 `0022` 与 `0023` 两条迁移记录,没有别的报错; +2. 刷新管理端「积分榜」:**单位总分榜、个人积分榜的数字与升级前一致**(除了 `0022` 清掉的历史脏数据);**单位奖牌榜的先后可能变了**(现在按金 → 银 → 铜排); +3. **看到「同分单位的先后变了」不要当故障**:重导规则包会把排序口径按规则包的值写回(本赛会包是 总分 → 金 → 银 → 铜 → 单位编码),**变的是顺序,分数与奖牌一件不变**(见 ② 第 3 条); +4. 打开「基础数据 → 计分通道」,选中一个双计项目(例如团体引体向上),确认「聚合口径」一列是**「平均」**——不切换就与升级前口径一致; +5. 打开「成绩录入」页:已发布的行右侧应**并排**「修改本条」与「作废本条」两个按钮;点一下成绩格会弹确认框(**点「取消」什么都不做**); +6. 按 ④ 导入新版规则包,导入后核对该项目的计分通道与榜单; +7. 用《上线检查清单》过一遍。 + +### ⑦ 详细说明在哪 + +| 想了解 | 看 | +| --- | --- | +| 已发布成绩怎么改(修改 / 作废的区别) | 《使用手册》4.10;《常见问题》Q98 | +| 单位明细里的运动员 / 来源 / 已修订 | 《使用手册》8.1、8.3、17.3 | +| 团体分的「平均 / 总和」口径 | 《使用手册》10.4;《常见问题》Q15 | +| 单位奖牌榜为什么与积分榜顺序不同 | 《使用手册》8.2 | +| 导入被拒 / 保存模板被拒是什么原因 | 本文件 ⑤ | +| 迁移与安装 | 本文件 ① ③;《部署指南》3.1、7.5 | + +--- + +## dev_0.5.0 ### 一句话 diff --git a/docs/常见问题.md b/docs/常见问题.md index 225e3af..5adfab8 100644 --- a/docs/常见问题.md +++ b/docs/常见问题.md @@ -34,7 +34,7 @@ 草稿不上屏。需要「发布」(或 `Alt+Enter`),发布后 1 秒内大屏更新。 **Q8:发布错了怎么改?** -撤销发布 → 修改 → 重新发布。撤销会作废该组积分流水,大屏回退到发布前状态,过程可在「变更历史」查看。**只错了一条成绩时不必撤销整组**,用那一行的「作废本条 → 重新录入」即可,见 Q98。 +撤销发布 → 修改 → 重新发布。撤销会作废该组积分流水,大屏回退到发布前状态,过程可在「变更历史」查看。**只错了一条成绩时不必撤销整组**,点那一格(或那一行的「修改本条」)退回草稿改完重发即可,见 Q98。 **Q9:为什么「发布」是灰的?** 常见原因:未登录、服务端断开、示例数据模式,或存在**会阻止发布**的校验错误(秒位 ≥ 60、成绩写法无法识别、手动名次项目缺名次)。**没录成绩不算错误、不挡发布**(见 Q77)。成绩格的报错会把**那一格的实际内容**打出来并对症给改法(见 Q75、Q76)。 @@ -58,7 +58,7 @@ - **个人通道**:按个人成绩排名、套个人积分模板给分,分只记在个人积分榜; - **团体通道**:按团体成绩排名、套团体积分模板给分,计入单位总分。 -个人通道的「计入单位总分」关掉了才不进单位总分:按规则包里的「个人+团体」模板生成的通道,个人通道默认就是不勾的(手工新建通道时默认勾选,以页面上实际的勾选状态为准)。到「基础数据 → 计分通道」选中该小项就能看到每行通道的勾选状态,关掉的行在「大项 / 小项」的通道摘要里带「不计入单位总分」徽标。 +个人通道的「计入单位总分」关掉了才不进单位总分:按规则包里的「个人+团体」模板生成的通道,个人通道默认就是不勾的。**手工新建通道时的默认值也按小项类型给**:普通个人项目 / 团体项目默认勾选;**「个人 + 团体」项目的个人通道默认不勾**——所以**以页面上实际的勾选状态为准**。到「基础数据 → 计分通道」选中该小项就能看到每行通道的勾选状态,关掉的行在「大项 / 小项」的通道摘要里带「不计入单位总分」徽标。 想让个人分也折算进单位总分,把个人通道那一行勾上并「保存全部」,然后对该组成绩**撤销发布 → 重新发布**——积分流水是发布时按当时的通道配置生成的,不重新发布不会变。规则包对个别小项写了例外配置时以例外为准。 @@ -69,7 +69,8 @@ - 平均值的分母有两种口径,选中该小项后在「成绩录入」页的工具栏下方用**「平均值口径」**单选切换,点选即保存(小项级设置,该小项的组别共用,不用重新点保存): - `只算有效成绩`(默认):分母是有有效成绩的人数; - `全部报名人员都计入`:分母是该单位在本组别的报名条数,没成绩的按 0 计入。 -- 改完口径、要让已发布的成绩按新口径重算,需要对该组**撤销发布 → 重新发布**(草稿不受影响,改口径本身在点选时就已保存);发布之前可以先看右侧「实时积分预览」,它已经按新口径显示各单位的分数变化。 +- **团体成绩怎么汇总**:到「基础数据 → 计分通道」选中该小项,那条团体通道的**「聚合口径」**列可选 **`平均`**(默认,团体成绩 = 该单位成员成绩的平均值)或 **`总和`**(团体成绩 = 该单位成员成绩的总和)。点一下即选中,点「保存全部」生效、该小项立即重算。**各队人数相同时两种口径排出来的名次完全相同**,人数不同时可能不同;上面那条「平均值口径」只对 `平均` 有意义——换成 `总和` 后,它只决定「一个人都没有成绩的单位算不算 0 分参与排名」。 +- 改完口径、要让已发布的成绩按新口径重算,需要对该组**撤销发布 → 重新发布**(草稿不受影响,改口径本身在点选时就已保存);发布之前可以先看右侧「实时积分预览」,它已经按新口径显示各单位的分数变化。改「聚合口径」不用这一步——它保存时就重算。 - 报名表里 `status` 不是 `registered` 的报名项(弃赛 / 取消资格)既不算分子也不算分母。 **Q16:某个单位一个人都没有效成绩,团体项目怎么算?** @@ -410,6 +411,8 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点 单位奖牌榜那一列的「明细」展开的仍是**同一个单位积分明细面板**,所以想按单位看时也可以在那上面点「导出该单位明细」;但单位奖牌榜本身另有专属的逐枚奖牌导出(卡片头「导出奖牌明细」,见 Q71),个人积分榜也有专属的逐条得分导出(卡片头「导出个人明细」,见 Q70、Q72)。另外「导出 → 结果导出」里的「单位积分明细」也能先选一个单位再导出。这些导出都是只读下载,访客也能用。 +> 明细面板与这份导出里的列:**运动员**(团体项目、按队内平均的团体分、人工调整这几类显示单位名或 `—`)、**来源**(`成绩` / `破纪录加分` / `人工调整`),以及**被改过的成绩**:面板上带「已修订 ×N」角标(悬停看最后一次修订的时间、原因与操作人),导出的**备注列**写「已修订 ×N;最后一次 <时间> <原因>」。没改过的行没有角标、备注留空。 + **Q70:个人积分榜能导出明细吗?** 能。个人积分榜的**卡片头**有「导出个人明细」按钮,导出 `个人积分总明细.xlsx`:第一张总表逐条列出「单位 / 运动员 / 大项 / 小项 / 组别 / 名次 / 成绩 / 得分 / 来源」,其后每个**有得分**的单位一张分表(按单位分,不按人分;没有得分流水的人不出现在表里)。`得分` 是记到个人的原始分,与「个人积分榜」逐个数字一致,**不受榜单口径里的个人项目得分折算系数影响**(那个系数只作用于单位总分),详见 Q72。 @@ -635,20 +638,23 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点 先看是**只错一条**还是**整组都要改**——两条路的影响面完全不同: -**① 只错一条(最常见)**:到「成绩录入」找到那一行,用最右端「操作」列的按钮: +**① 只错一条(最常见)**:到「成绩录入」找到那一行,**点成绩格(或点状态格),也可以点最右端「操作」列的「修改本条」**: -1. 点 **「作废本条」**,填 **「作废原因」**(必填,留空点了不提交)→ 确认。这一条立刻退出名次与积分,同组其它人重新排名,**大屏立即更新**; -2. 同一行的按钮这时变成 **「重新录入」**,点它、填 **「退回原因」**(必填)→ 这一条退回草稿,变成可以编辑的行; +1. 点下去会弹出确认框,写明「这一条会退回草稿、榜单先把它退下来、改完需重新发布本组」,并要你填 **「修改原因」**(必填,留空点了不提交)——**点「取消」则什么都不做**(成绩、榜单、大屏都不动); +2. 确认后这一条退回草稿,名次与积分先按「没有这条成绩」重算,**大屏立即更新**;原来填的成绩还在格里,直接改就行; 3. 把成绩改对,再点页头的 **「发布」**(该组还有别的已发布成绩时显示为「发布本批」,见 Q77)。同组别人的成绩一直在榜上,不会被翻下来。 -**② 整组都要改**(例如整组被判罚、名次口径整体调整):点「撤销发布」→ 修改 → 重新发布(见 Q8)。它会把该组已产生的积分流水整体作废再重发,大屏先回退一次。 +**② 这一条根本不该算**(成绩无效、重复录入等):同一行点 **「作废本条」**,填 **「作废原因」**(必填)→ 确认。这一条不再计入名次与积分,同组其它人重新排名、**大屏立即更新**;成绩文字还留在格里,录入列变成红徽标「已作废」,状态格变成「退赛」。以后要让它重新算数,用同一行的 **「重新录入」** 退回草稿改完再发布。**只是填错了要用 ① 的「修改」,不要用「作废」**——「作废」会在榜上留下一条作废痕迹。 -两个按钮的细节: +**③ 整组都要改**(例如整组被判罚、名次口径整体调整):点「撤销发布」→ 修改 → 重新发布(见 Q8)。它会把该组已产生的积分流水整体作废再重发,大屏先回退一次。 -- **已发布的行是锁着的**(成绩 / 名次 / 状态 / 备注都改不了)——这是有意的:已发布就意味着已经上屏、已经计分,允许就地改会变成「榜单上是旧数、表格里是新数」;要改必须先明确地把它退回来,所以给了「作废本条 / 重新录入」这一对按钮,而不是直接解锁; -- 作废与退回都**立即重算并推大屏**,**不受「分批发布时实时更新榜单」这个延迟结算开关影响**(它们改的是「这条成绩算不算数」,不是「录了多少」); -- 两者都会**留痕**:审计日志(见使用手册第 13 节)里的动作分别是 `result.void` 与 `result.reopen`,含操作人、时间与填写的原因。「变更历史」记的是**发布 / 撤销发布**这类整组版本,单条作废 / 退回不会在那里新增一个节点; -- 有个前提:点之前先把未保存的编辑「存草稿」——作废 / 退回会重算并整表刷新,页面会拦下并提示。 +三个入口的细节: + +- **已发布的行仍然锁着**(名次、备注改不了),但**成绩格与状态格点得动**:点一下只弹出与「修改本条」同一个确认框,不确认就什么都不会发生——这是有意的,已发布就意味着已经上屏、已经计分,**绝不能「点一下成绩就悄悄从榜上退下去」**;要改必须先明确地把它退回来,所以给了「修改本条 / 作废本条」这一对按钮,而不是直接解锁; +- **「修改」与「作废」的区别**:**修改**是「这一条填错了,退回草稿改一改再发」,不会把这一条标成「已作废」;**作废**是「这一条不算了」,成绩留在表里但不再计分。改错字用「修改」,别用「作废」; +- 修改 / 作废 / 退回都**立即重算并推大屏**,**不受「分批发布时实时更新榜单」这个延迟结算开关影响**(它们改的是「这条成绩算不算数」,不是「录了多少」); +- 三者都会**留痕**:审计日志(见使用手册第 13 节)里的动作分别是 `result.reopen`(修改 / 重新录入)与 `result.void`(作废),含操作人、时间与填写的原因。「变更历史」记的是**发布 / 撤销发布**这类整组版本,单条的修改 / 作废 / 退回不会在那里新增一个节点; +- 有个前提:点之前先把未保存的编辑「存草稿」——修改 / 作废 / 退回会重算并整表刷新,页面会拦下并提示。 **Q99:误批准了破纪录怎么办?** diff --git a/server/internal/domain/aggregate_mode_test.go b/server/internal/domain/aggregate_mode_test.go new file mode 100644 index 0000000..f113b12 --- /dev/null +++ b/server/internal/domain/aggregate_mode_test.go @@ -0,0 +1,232 @@ +package domain + +import ( + "reflect" + "testing" +) + +// 聚合口径(通道的 aggregate_mode:avg 按成员平均 / sum 按成员总和)的引擎口径。 +// +// 现场要在「平均」与「总和」之间临时定口径(团体引体向上这类双计项目领导还没拍板), +// 所以这里钉住三件事:缺省必须是 avg(升级前后榜单一分不差)、人数相同时两种口径排名一致、 +// 人数不同时两者可能不同(现场不能默认它们等价)。 + +// aggScore 用指定汇总口径跑一次团体聚合通道,返回「单位 → 平均/总和值、名次、积分」。 +func aggScore(t *testing.T, ev Event, mode AggregateMode, entries []Entry, results []Result) EventScore { + t.Helper() + ch := teamAggregateChannel(2) + ch.AggregateMode = mode + return mustScore(t, EventScoreInput{ + Event: ev, Category: testCategory(), + Channels: []ScoreChannel{ch}, + Profiles: map[int64]ScoringProfile{2: teamTop6()}, + Entries: entries, Results: results, + }) +} + +// TestAggregateModeEqualRosterSameRanking:各队人数相同时 sum 与 avg 的排名与积分完全一致。 +// 这是现场选口径的依据——人数整齐时选哪种都不影响榜单,人数不齐时才会分叉。 +func TestAggregateModeEqualRosterSameRanking(t *testing.T) { + // 三队各 2 人,compare=desc(越大越好)。总和 = 平均 × 2,是同一个单调变换。 + entries, results := fixture([]participant{ + {entryID: 1, athleteID: 1, teamID: 1001, value: 18}, + {entryID: 2, athleteID: 2, teamID: 1001, value: 20}, + {entryID: 3, athleteID: 3, teamID: 1002, value: 16}, + {entryID: 4, athleteID: 4, teamID: 1002, value: 14}, + {entryID: 5, athleteID: 5, teamID: 1003, value: 12}, + {entryID: 6, athleteID: 6, teamID: 1003, value: 10}, + }) + ev := teamEvent(1) + ev.Compare = CompareDesc + + avg := aggScore(t, ev, AggregateAvg, entries, results) + sum := aggScore(t, ev, AggregateSum, entries, results) + + // 名次与积分逐队一致(录取前六名,三队都有分);汇总值本身当然不同(19 平均 / 38 总和)。 + avgOutcome := aggregateByTeam(t, avg) + sumOutcome := aggregateByTeam(t, sum) + for _, teamID := range []int64{1001, 1002, 1003} { + if avgOutcome[teamID].rank != sumOutcome[teamID].rank || !nearlyEqual(avgOutcome[teamID].points, sumOutcome[teamID].points) { + t.Fatalf("人数相同时两种口径的名次/积分应一致:单位 %d avg=%+v sum=%+v", + teamID, avgOutcome[teamID], sumOutcome[teamID]) + } + } + if !reflect.DeepEqual(pointsByTeam(avg.Ledger), pointsByTeam(sum.Ledger)) { + t.Fatalf("人数相同时两种口径的流水应一致:avg=%v sum=%v", + pointsByTeam(avg.Ledger), pointsByTeam(sum.Ledger)) + } + // 顺带钉住名次本身:1001 平均 19 / 总和 38 → 第一。 + got := aggregateByTeam(t, sum) + if got[1001].rank != 1 || got[1002].rank != 2 || got[1003].rank != 3 { + t.Fatalf("sum 口径名次 = %+v,期望 1001/1002/1003 依次第 1/2/3 名", got) + } +} + +// TestAggregateModeRosterDiffersFlipsRanking:各队人数不同时两种口径的排名会不同。 +// 1001 队 2 人(10 + 1)、1002 队 1 人(9):平均看 1002 强,总和看 1001 强。 +func TestAggregateModeRosterDiffersFlipsRanking(t *testing.T) { + entries, results := fixture([]participant{ + {entryID: 1, athleteID: 1, teamID: 1001, value: 10}, + {entryID: 2, athleteID: 2, teamID: 1001, value: 1}, + {entryID: 3, athleteID: 3, teamID: 1002, value: 9}, + }) + ev := teamEvent(1) + ev.Compare = CompareDesc + + avg := aggregateByTeam(t, aggScore(t, ev, AggregateAvg, entries, results)) + sum := aggregateByTeam(t, aggScore(t, ev, AggregateSum, entries, results)) + + // 平均:1001 = 5.5 第二、1002 = 9 第一。 + if !nearlyEqual(avg[1001].value, 5.5) || avg[1001].rank != 2 || avg[1001].points != 10 { + t.Errorf("avg:1001 应 5.5 第 2 名 10 分,实际 %+v", avg[1001]) + } + if !nearlyEqual(avg[1002].value, 9) || avg[1002].rank != 1 || avg[1002].points != 15 { + t.Errorf("avg:1002 应 9 第 1 名 15 分,实际 %+v", avg[1002]) + } + // 总和:1001 = 11 第一、1002 = 9 第二。 + if !nearlyEqual(sum[1001].value, 11) || sum[1001].rank != 1 || sum[1001].points != 15 { + t.Errorf("sum:1001 应 11 第 1 名 15 分,实际 %+v", sum[1001]) + } + if !nearlyEqual(sum[1002].value, 9) || sum[1002].rank != 2 || sum[1002].points != 10 { + t.Errorf("sum:1002 应 9 第 2 名 10 分,实际 %+v", sum[1002]) + } + if avg[1001].rank == sum[1001].rank { + t.Fatalf("人数不同时两种口径的名次不应相同:avg=%+v sum=%+v", avg, sum) + } +} + +// TestAggregateModeDefaultsToAverage:缺省(不带 aggregateMode / 老库老客户端)就是 avg, +// 结果与显式写 avg 逐字段一致——现有数据与现有用例的行为一字不变。 +func TestAggregateModeDefaultsToAverage(t *testing.T) { + if got := (ScoreChannel{}).aggregateMode(); got != AggregateAvg { + t.Fatalf("零值通道的汇总口径 = %q,期望 avg", got) + } + // 认不出的取值也退回 avg,不是退回 sum(库里有 CHECK,但内存里的对象仍要兜住)。 + for _, bogus := range []AggregateMode{"", "average", "AVG", "SUM", "biggest"} { + if got := (ScoreChannel{AggregateMode: bogus}).aggregateMode(); got != AggregateAvg { + t.Errorf("取值 %q 应退回 avg,实际 %q", bogus, got) + } + } + + // 与 TestAggregateAvgMode 同一个现场(compare=asc,越小越好):1001 一人有成绩 10、一人没成绩; + // 1002 两人各 4 / 6。valid 口径下 1002 平均 5 第一(15 分)、1001 平均 10 第二(10 分) + // ——这是升级前的既有结果。 + legacy := []struct { + name string + mode AvgMode + build func() ([]Entry, []Result) + want map[int64]aggregateOutcome + }{ + { + name: "valid", + mode: AvgModeValid, + build: func() ([]Entry, []Result) { + return fixture([]participant{ + {entryID: 1, athleteID: 1, teamID: 1001, value: 10}, + {entryID: 2, athleteID: 2, teamID: 1001, noValue: true}, + {entryID: 3, athleteID: 3, teamID: 1002, value: 4}, + {entryID: 4, athleteID: 4, teamID: 1002, value: 6}, + }) + }, + want: map[int64]aggregateOutcome{ + 1002: {value: 5, points: 15, rank: 1}, + 1001: {value: 10, points: 10, rank: 2}, + }, + }, + { + name: "all", + mode: AvgModeAll, + build: func() ([]Entry, []Result) { + return fixture([]participant{ + {entryID: 1, athleteID: 1, teamID: 1001, value: 10}, + {entryID: 2, athleteID: 2, teamID: 1001, noValue: true}, + {entryID: 3, athleteID: 3, teamID: 1002, value: 4}, + {entryID: 4, athleteID: 4, teamID: 1002, value: 6}, + }) + }, + want: map[int64]aggregateOutcome{ + 1001: {value: 5, points: 15, rank: 1}, + 1002: {value: 5, points: 15, rank: 1}, + }, + }, + } + for _, tc := range legacy { + t.Run("既有结果不变/"+tc.name, func(t *testing.T) { + entries, results := tc.build() + ev := teamEvent(1) + ev.AvgMode = tc.mode + + // defaultScore:通道不带 aggregateMode(老库数据 / 老客户端保存的通道)。 + defaultScore := aggScore(t, ev, "", entries, results) + explicitAvg := aggScore(t, ev, AggregateAvg, entries, results) + + // 「缺省」与「显式 avg」必须逐字段一致(连流水顺序都一致)。 + if !reflect.DeepEqual(defaultScore.Ledger, explicitAvg.Ledger) { + t.Errorf("缺省口径的流水与显式 avg 不一致:\n缺省 %+v\n显式 %+v", defaultScore.Ledger, explicitAvg.Ledger) + } + if !reflect.DeepEqual(defaultScore.Ranked, explicitAvg.Ranked) { + t.Errorf("缺省口径的名次与显式 avg 不一致:\n缺省 %+v\n显式 %+v", defaultScore.Ranked, explicitAvg.Ranked) + } + + got := aggregateByTeam(t, defaultScore) + for teamID, want := range tc.want { + have := got[teamID] + if !nearlyEqual(have.value, want.value) || have.rank != want.rank || !nearlyEqual(have.points, want.points) { + t.Errorf("单位 %d = %+v,期望 %+v", teamID, have, want) + } + } + if got := pointsByTeam(defaultScore.Ledger); !reflect.DeepEqual(got, pointsByTeam(explicitAvg.Ledger)) { + t.Errorf("缺省口径的单位总分与显式 avg 不一致:%v / %v", got, pointsByTeam(explicitAvg.Ledger)) + } + }) + } +} + +// TestAggregateModeSumWithAvgMode:sum 只累加有效成绩,avg_mode 在求和口径下只剩 +// 「一个有效成绩都没有的单位算不算 0 分参与排名」这一条作用(valid 不参与 / all 参与)。 +func TestAggregateModeSumWithAvgMode(t *testing.T) { + build := func() ([]Entry, []Result) { + return fixture([]participant{ + {entryID: 1, athleteID: 1, teamID: 1001, value: 10}, + {entryID: 2, athleteID: 2, teamID: 1001, value: 1}, + {entryID: 3, athleteID: 3, teamID: 1002, value: 9}, + // 1003 全队一条有效成绩都没有:valid 不参与、all 按 0 参与(与平均口径同规则)。 + {entryID: 4, athleteID: 4, teamID: 1003, noValue: true}, + }) + } + + t.Run("valid:没成绩的单位不成桶", func(t *testing.T) { + entries, results := build() + ev := teamEvent(1) + ev.Compare = CompareDesc + ev.AvgMode = AvgModeValid + got := aggregateByTeam(t, aggScore(t, ev, AggregateSum, entries, results)) + if !nearlyEqual(got[1001].value, 11) || got[1001].rank != 1 { + t.Errorf("1001 应总和 11 第 1 名,实际 %+v", got[1001]) + } + if !nearlyEqual(got[1002].value, 9) || got[1002].rank != 2 { + t.Errorf("1002 应总和 9 第 2 名,实际 %+v", got[1002]) + } + if got[1003].rank != 0 || got[1003].points != 0 { + t.Errorf("1003 全队没成绩,不应参与排名,实际 %+v", got[1003]) + } + }) + + t.Run("all:没成绩的单位按 0 参与、排在最后", func(t *testing.T) { + entries, results := build() + ev := teamEvent(1) + ev.Compare = CompareDesc + ev.AvgMode = AvgModeAll + got := aggregateByTeam(t, aggScore(t, ev, AggregateSum, entries, results)) + // 求和:1001 = 11 第一;1002 = 9 第二;1003 = 0 第三(加 0 不改变其它队的和)。 + if !nearlyEqual(got[1001].value, 11) || got[1001].rank != 1 { + t.Errorf("1001 应总和 11 第 1 名,实际 %+v", got[1001]) + } + if !nearlyEqual(got[1002].value, 9) || got[1002].rank != 2 { + t.Errorf("1002 应总和 9 第 2 名,实际 %+v", got[1002]) + } + if !nearlyEqual(got[1003].value, 0) || got[1003].rank != 3 { + t.Errorf("1003 应总和 0 第 3 名,实际 %+v", got[1003]) + } + }) +} diff --git a/server/internal/domain/channel_ranks_test.go b/server/internal/domain/channel_ranks_test.go index 1f3d824..151e3f0 100644 --- a/server/internal/domain/channel_ranks_test.go +++ b/server/internal/domain/channel_ranks_test.go @@ -44,12 +44,30 @@ func teamPullupInput(teamRanks []TeamManualRank) EventScoreInput { } // writeBackComputedRanks 模拟 httpapi 的 applyComputedRanks: -// 只把个人通道(scope=athlete)算出的名次写回对应成绩的 results.rank。 +// 只把个人通道(scope=athlete)算出的名次写回对应成绩的 results.rank, +// 且要给 manual 通道的「录入位」让路(工单 A-1 / A-2,与 httpapi.scoring.go 同口径): +// 配了 [athlete,manual] 时整项不写回,配了 [team,manual] 时团体报名项(AthleteID=0)不写回。 +// 这里少一条判断,模拟出来的「第二次发布」就会跟真实系统不是一回事。 func writeBackComputedRanks(in EventScoreInput, ranked []RankedResult) { + athleteManual, teamManual := false, false + for _, ch := range in.Channels { + if ch.Basis != BasisManual { + continue + } + switch ch.Scope { + case ScopeAthlete: + athleteManual = true + case ScopeTeam: + teamManual = true + } + } for _, rr := range ranked { if rr.Scope != ScopeAthlete || rr.ResultID == 0 || rr.Rank <= 0 { continue } + if athleteManual || (teamManual && rr.AthleteID == 0) { + continue + } for i := range in.Results { if in.Results[i].ID == rr.ResultID { in.Results[i].Rank = rr.Rank @@ -58,6 +76,93 @@ func writeBackComputedRanks(in EventScoreInput, ranked []RankedResult) { } } +// TestTeamEntryDualChannelPublishTwiceIsIdempotent 是工单 A-1 的引擎侧回归: +// team 类型小项 + 3 条团体报名项(athlete_id 为空)+ 双通道 [athlete/result, team/manual]。 +// 团体报名项的 results.rank 是「单位名次」的录入位,个人通道的自动名次不许写进去, +// 否则第二次发布团体手工通道会把个人名次当成团体名次再发一遍分(10/8/6 → 25/18/14)。 +func TestTeamEntryDualChannelPublishTwiceIsIdempotent(t *testing.T) { + entries, results := fixture([]participant{ + {entryID: 1, teamID: 1001, name: "甲队", value: 90}, + {entryID: 2, teamID: 1002, name: "乙队", value: 80}, + {entryID: 3, teamID: 1003, name: "丙队", value: 70}, + }) + ev := teamEvent(1) + ev.Compare = CompareDesc + in := EventScoreInput{ + Event: ev, Category: testCategory(), + Channels: []ScoreChannel{ + {ID: 1, EventID: 1, Scope: ScopeAthlete, Basis: BasisResult, ProfileID: 1}, + teamManualChannel(2), + }, + Profiles: map[int64]ScoringProfile{1: individualTop6(), 2: teamTop6()}, + Entries: entries, Results: results, + } + + first := mustScore(t, in) + writeBackComputedRanks(in, first.Ranked) + second := mustScore(t, in) + + if !reflect.DeepEqual(first, second) { + t.Fatalf("两次发布的计分结果不一致:\n第一次 %+v\n第二次 %+v", first, second) + } + for _, r := range in.Results { + if r.Rank != 0 { + t.Fatalf("团体报名项的 results.rank 被自动名次写回,得到 %+v", r) + } + } + // 团体手工通道没有录入名次:两次发布都只有个人通道的 10/8/6。 + got := pointsByTeam(second.Ledger) + for _, want := range []struct { + teamID int64 + points float64 + }{{1001, 10}, {1002, 8}, {1003, 6}} { + if !nearlyEqual(got[want.teamID], want.points) { + t.Fatalf("单位 %d = %v,期望 %v(团体名次未录,不该多出团体分):%v", + want.teamID, got[want.teamID], want.points, got) + } + } + if len(second.Ranked) != 3 { + t.Fatalf("名次明细 = %d 条,期望只有个人通道的 3 条:%+v", len(second.Ranked), second.Ranked) + } +} + +// TestAthleteManualRankNotOverwritten 是工单 A-2 的引擎侧回归: +// [athlete,result] 与 [athlete,manual] 共存时,results.rank 是人工录入的个人名次, +// 自动名次不许覆盖它;反复「发布 → 写回」必须得到同一份结果。 +func TestAthleteManualRankNotOverwritten(t *testing.T) { + // 成绩 30 / 29(compare=asc:数值小的靠前 → 自动名次本该是 乙1 第 1、甲1 第 2); + // 人工名次反着填(甲1 第 1、乙1 第 2)。 + entries, results := fixture([]participant{ + {entryID: 1, athleteID: 101, teamID: 1001, name: "甲", value: 30, rank: 1}, + {entryID: 2, athleteID: 102, teamID: 1002, name: "乙", value: 29, rank: 2}, + }) + in := EventScoreInput{ + Event: individualEvent(1), Category: testCategory(), + Channels: []ScoreChannel{ + athleteResultChannel(1), + {ID: 2, EventID: 1, Scope: ScopeAthlete, Basis: BasisManual, ProfileID: 1}, + }, + Profiles: map[int64]ScoringProfile{1: individualTop6()}, + Entries: entries, Results: results, + } + + first := mustScore(t, in) + writeBackComputedRanks(in, first.Ranked) + second := mustScore(t, in) + + if !reflect.DeepEqual(first, second) { + t.Fatalf("两次发布的计分结果不一致:\n第一次 %+v\n第二次 %+v", first, second) + } + if in.Results[0].Rank != 1 || in.Results[1].Rank != 2 { + t.Fatalf("人工名次被自动名次覆盖:甲=%d、乙=%d,期望 1 / 2", in.Results[0].Rank, in.Results[1].Rank) + } + // 自动通道 8/10 + 人工通道 10/8:两队各 18 分。 + got := pointsByTeam(second.Ledger) + if !nearlyEqual(got[1001], 18) || !nearlyEqual(got[1002], 18) { + t.Fatalf("两队应各 18 分(自动 + 人工),得到 %v", got) + } +} + // TestTeamPullupPublishTwiceIsIdempotent 是 P0 回归: // 「发布 → 把个人名次写回 results.rank → 再发布一次」两次的 Ledger 与 Ranked 必须逐字段一致。 func TestTeamPullupPublishTwiceIsIdempotent(t *testing.T) { diff --git a/server/internal/domain/last_place_zero_test.go b/server/internal/domain/last_place_zero_test.go new file mode 100644 index 0000000..aed5a8f --- /dev/null +++ b/server/internal/domain/last_place_zero_test.go @@ -0,0 +1,359 @@ +package domain + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "strings" + "testing" +) + +// 任务 F:修正「末位归零」的语义。 +// +// 修复前的判据是「本组占用的名次区间是否包含末位名次」: +// +// startRank <= lastRank && lastRank <= startRank+size-1 +// +// 并列组只要跨过末位就整组 0 分,于是 7 人里三人并列第 5(占 5/6/7)时, +// 第 5 名的 2 分与第 6 名的 1 分被一起抹掉(审查报告 01 的 P1)。 +// +// 修复后的语义:**末位那一档(名次 == lastPlace)不得分**,并列组按起始名次取分, +// 所以只有起始名次正好落在末位档的组才归零——那种组必然只有一个人(startRank == lastPlace +// 蕴含 size == 1,因为 lastPlace 是所有组占用名次的最大值)。区间跨过末位的并列组不归零。 +// +// 修复前后实测对照(个人成绩通道,模板 10/8/6/3/2/1,lastPlaceZero=true): +// +// ① 7 人三人并列第 5(占 5/6/7):修前 [10 8 6 3 0 0 0] → 修后 [10 8 6 3 2 2 2] +// ② 5 人独占第 5 名: 修前 [10 8 6 3 0] → 修后 [10 8 6 3 0](真末位,继续归零) +// ③ 6 人两人并列第 5(占 5/6): 修前 [10 8 6 3 0 0] → 修后 [10 8 6 3 2 2] +// +// 名次(Rank)不受本修复影响:修复只改「这一组拿多少分」,不改谁排第几。 + +// scoreValueChannel 用个人成绩通道(basis=result)跑一次计分,返回 entryID 1..len(values) +// 逐条的积分与展示名次。 +func scoreValueChannel(t *testing.T, profile ScoringProfile, values ...float64) ([]float64, []int) { + t.Helper() + entries, results := fixture(lineupValues(values...)) + es := mustScore(t, EventScoreInput{ + Event: individualEvent(1), Category: testCategory(), + Channels: []ScoreChannel{athleteResultChannel(9)}, + Profiles: map[int64]ScoringProfile{9: profile}, + Entries: entries, Results: results, + }) + pts := pointsByEntry(es.Ledger) + ranks := rankByEntry(es.Ranked) + out := make([]float64, len(values)) + outRanks := make([]int, len(values)) + for i := range values { + out[i] = pts[int64(i+1)] + outRanks[i] = ranks[int64(i+1)] + } + return out, outRanks +} + +// scoreManualTeamChannel 用团体手工名次通道(basis=manual + scope=team)跑一次计分, +// 返回按录入顺序(单位 1001、1002 …)的积分。 +func scoreManualTeamChannel(t *testing.T, profile ScoringProfile, ranks []int) []float64 { + t.Helper() + teamRanks := make([]TeamManualRank, 0, len(ranks)) + for i, rk := range ranks { + teamRanks = append(teamRanks, TeamManualRank{TeamID: int64(1001 + i), Rank: rk}) + } + es := mustScore(t, EventScoreInput{ + Event: teamEvent(1), Category: testCategory(), + Channels: []ScoreChannel{teamManualChannel(9)}, + Profiles: map[int64]ScoringProfile{9: profile}, + TeamRanks: teamRanks, + }) + pts := pointsByTeam(es.Ledger) + out := make([]float64, len(ranks)) + for i := range ranks { + out[i] = pts[int64(1001+i)] + } + return out +} + +// scoreAggregateChannel 用团体聚合通道(basis=aggregate)跑一次计分,每个单位一条报名项, +// 返回按单位 1001、1002 … 顺序的积分。 +func scoreAggregateChannel(t *testing.T, profile ScoringProfile, mode AvgMode, values ...float64) []float64 { + t.Helper() + ps := make([]participant, 0, len(values)) + for i, v := range values { + ps = append(ps, participant{ + entryID: int64(i + 1), athleteID: int64(100 + i + 1), teamID: int64(1001 + i), + name: "选手" + string(rune('A'+i)), value: v, + }) + } + entries, results := fixture(ps) + ev := teamEvent(1) + ev.AvgMode = mode + es := mustScore(t, EventScoreInput{ + Event: ev, Category: testCategory(), + Channels: []ScoreChannel{teamAggregateChannel(9)}, + Profiles: map[int64]ScoringProfile{9: profile}, + Entries: entries, Results: results, + }) + pts := pointsByTeam(es.Ledger) + out := make([]float64, len(values)) + for i := range values { + out[i] = pts[int64(1001+i)] + } + return out +} + +// TestLastPlaceZeroOnlyZeroesLastPlaceTier 覆盖工单任务 F 要求的三种形态。 +func TestLastPlaceZeroOnlyZeroesLastPlaceTier(t *testing.T) { + profile := individualTop6() + profile.LastPlaceZero = true + + cases := []struct { + name string + values []float64 + wantPoints []float64 + wantRanks []int + }{ + { + // 修复前这里断言的是 [10 8 6 3 0 0 0]——整组被末位判据误伤,第 5、6 名白丢 2+1 分。 + name: "① 7 人三人并列第 5(占 5/6/7):不归零,按第 5 名给分", + values: []float64{1, 2, 3, 4, 5, 5, 5}, + wantPoints: []float64{10, 8, 6, 3, 2, 2, 2}, + wantRanks: []int{1, 2, 3, 4, 5, 5, 5}, + }, + { + name: "② 5 人独占第 5 名:这一档就是末位,归零", + values: []float64{1, 2, 3, 4, 5}, + wantPoints: []float64{10, 8, 6, 3, 0}, + wantRanks: []int{1, 2, 3, 4, 5}, + }, + { + name: "③ 6 人末位与第 5 名并列(占 5/6):起始名次 5 < 末位 6,不归零", + values: []float64{1, 2, 3, 4, 5, 5}, + wantPoints: []float64{10, 8, 6, 3, 2, 2}, + wantRanks: []int{1, 2, 3, 4, 5, 5}, + }, + { + name: "7 人两人并列第 6(占 6/7):不归零,按第 6 名给分", + values: []float64{1, 2, 3, 4, 5, 6, 6}, + wantPoints: []float64{10, 8, 6, 3, 2, 1, 1}, + wantRanks: []int{1, 2, 3, 4, 5, 6, 6}, + }, + { + name: "7 人独占第 7 名:真末位,归零", + values: []float64{1, 2, 3, 4, 5, 6, 7}, + wantPoints: []float64{10, 8, 6, 3, 2, 1, 0}, + wantRanks: []int{1, 2, 3, 4, 5, 6, 7}, + }, + { + name: "仅 1 人参赛:唯一参赛者就是末位,归零", + values: []float64{1}, + wantPoints: []float64{0}, + wantRanks: []int{1}, + }, + { + // 全场并列时起始名次是 1,没人在「末位那一档」上,所以都不归零。 + name: "7 人全场并列第 1:起始名次 1 ≠ 末位 7,不归零", + values: []float64{1, 1, 1, 1, 1, 1, 1}, + wantPoints: []float64{10, 10, 10, 10, 10, 10, 10}, + wantRanks: []int{1, 1, 1, 1, 1, 1, 1}, + }, + { + name: "2 人并列第 1(占 1/2):不归零,两人同分", + values: []float64{1, 1}, + wantPoints: []float64{10, 10}, + wantRanks: []int{1, 1}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + points, ranks := scoreValueChannel(t, profile, tc.values...) + assertPointsAndRanks(t, points, ranks, tc.wantPoints, tc.wantRanks) + }) + } +} + +// TestLastPlaceZeroTeamManualAndAggregateChannels 把同一条语义钉在另外两类名次来源上: +// 团体手工名次(篮球 / 足球等纯团体项目的主路径)与团体聚合通道共用 groupPoints, +// 末位判据必须同样只抹末位那一档。 +func TestLastPlaceZeroTeamManualAndAggregateChannels(t *testing.T) { + manual := teamTop6() + manual.LastPlaceZero = true + aggregate := teamTop6() + aggregate.LastPlaceZero = true + + t.Run("团体手工名次:7 队独占末位 → 第 7 名归零", func(t *testing.T) { + got := scoreManualTeamChannel(t, manual, []int{1, 2, 3, 4, 5, 6, 7}) + assertFloatSlice(t, "各队积分", got, []float64{15, 10, 8, 4, 2, 1, 0}) + }) + + t.Run("团体手工名次:三人并列第 5(占 5/6/7)→ 不归零", func(t *testing.T) { + got := scoreManualTeamChannel(t, manual, []int{1, 2, 3, 4, 5, 5, 5}) + assertFloatSlice(t, "各队积分", got, []float64{15, 10, 8, 4, 2, 2, 2}) + }) + + t.Run("团体手工名次:录入漏顺延 1,2,2,3,4,5,6 → 只抹被占用的末日档(第 6 名)", func(t *testing.T) { + // lastPlace 取「所有组占用名次的最大值」:录入员按最自然的顺延理解写 1,2,2,3,4,5,6 时, + // 最后一个队展示的是第 6 名,就是这份录入里的末位,仍应归零。 + got := scoreManualTeamChannel(t, manual, []int{1, 2, 2, 3, 4, 5, 6}) + assertFloatSlice(t, "各队积分", got, []float64{15, 10, 10, 8, 4, 2, 0}) + }) + + t.Run("团体手工名次:5 队独占第 5 名 → 归零", func(t *testing.T) { + got := scoreManualTeamChannel(t, manual, []int{1, 2, 3, 4, 5}) + assertFloatSlice(t, "各队积分", got, []float64{15, 10, 8, 4, 0}) + }) + + t.Run("团体聚合:6 队末位与第 5 名并列(占 5/6)→ 不归零", func(t *testing.T) { + got := scoreAggregateChannel(t, aggregate, AvgModeValid, 1, 2, 3, 4, 5, 5) + assertFloatSlice(t, "各单位积分", got, []float64{15, 10, 8, 4, 2, 2}) + }) + + t.Run("团体聚合:5 队独占末位 → 归零", func(t *testing.T) { + got := scoreAggregateChannel(t, aggregate, AvgModeValid, 1, 2, 3, 4, 5) + assertFloatSlice(t, "各单位积分", got, []float64{15, 10, 8, 4, 0}) + }) +} + +// TestDefaultConfigScoringUnchanged 是「默认配置逐字节不变」的回归: +// lastPlaceZero=false(现场多数小项在用)时修复只动了 `if profile.LastPlaceZero` 里面的判据, +// 这个分支根本不进,所以任何形态的结果都必须与修复前一致。这里把值直接写死。 +func TestDefaultConfigScoringUnchanged(t *testing.T) { + profile := individualTop6() + + cases := []struct { + name string + values []float64 + want []float64 + }{ + {"7 人三人并列第 5", []float64{1, 2, 3, 4, 5, 5, 5}, []float64{10, 8, 6, 3, 2, 2, 2}}, + {"6 人两人并列第 5", []float64{1, 2, 3, 4, 5, 5}, []float64{10, 8, 6, 3, 2, 2}}, + {"5 人独占第 5 名", []float64{1, 2, 3, 4, 5}, []float64{10, 8, 6, 3, 2}}, + {"7 人无并列", []float64{1, 2, 3, 4, 5, 6, 7}, []float64{10, 8, 6, 3, 2, 1, 0}}, + {"1 人参赛", []float64{1}, []float64{10}}, + {"2 人并列第 1", []float64{1, 1}, []float64{10, 10}}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + points, _ := scoreValueChannel(t, profile, tc.values...) + assertFloatSlice(t, "积分", points, tc.want) + }) + } + + manual := teamTop6() + t.Run("团体手工名次", func(t *testing.T) { + got := scoreManualTeamChannel(t, manual, []int{1, 2, 3, 4, 5, 6, 7}) + assertFloatSlice(t, "各队积分", got, []float64{15, 10, 8, 4, 2, 1, 0}) + }) + + t.Run("团体聚合", func(t *testing.T) { + got := scoreAggregateChannel(t, manual, AvgModeValid, 1, 2, 3, 4, 5, 5) + assertFloatSlice(t, "各单位积分", got, []float64{15, 10, 8, 4, 2, 2}) + }) +} + +// defaultConfigGoldenSHA256 是 defaultConfigScoreDump 的签名,取自**修复前**的代码 +// (2026-09-13 任务 F 开工时记录)。覆盖:成绩通道 1..9 人 × 19 种成绩形态 × 三种并列口径、 +// 团体手工名次 14 种录入形态、团体聚合两种 avg_mode × 8 种成绩形态。 +// 这些形态在默认配置(lastPlaceZero=false)下一分都不该变。 +const defaultConfigGoldenSHA256 = "2c7425cb7371d584ca435403cea0ec9c03d069e6f08f6fdc21531845702b11f8" + +// TestDefaultConfigScoringDumpUnchanged 是本任务对「lastPlaceZero=false 逐字节一致」的全量兜底: +// 逐个形态的积分拼成一份签名与修复前对比。失败时会把完整签名打出来,方便定位是哪个形态变了。 +func TestDefaultConfigScoringDumpUnchanged(t *testing.T) { + dump := defaultConfigScoreDump(t) + sum := sha256.Sum256([]byte(dump)) + got := hex.EncodeToString(sum[:]) + if got != defaultConfigGoldenSHA256 { + t.Fatalf("lastPlaceZero=false 的计分结果与修复前不一致:\n签名 = %s\n期望 = %s\n\n%s", + got, defaultConfigGoldenSHA256, dump) + } +} + +// defaultConfigScoreDump 把默认配置下各形态的逐条积分拼成一份稳定文本。 +// 构造只依赖引擎输出,不依赖 map 遍历顺序,所以修复前后跑出来的文本可以直接比对。 +func defaultConfigScoreDump(t *testing.T) string { + t.Helper() + var lines []string + add := func(name string, points []float64) { + lines = append(lines, fmt.Sprintf("%s => %s", name, formatPoints(points))) + } + + valueShapes := [][]float64{ + {1}, {1, 2}, {1, 1}, {1, 2, 3}, {1, 1, 1}, {1, 2, 2}, + {1, 2, 3, 4}, {1, 2, 3, 5}, {1, 1, 2, 3}, {1, 1, 1, 1}, + {1, 2, 3, 4, 5}, {1, 2, 3, 4, 4}, {1, 2, 3, 4, 5, 5}, + {1, 1, 1, 1, 1, 1, 1}, {1, 2, 3, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 6, 6}, + {1, 2, 3, 4, 5, 6, 7}, {1, 2, 3, 4, 5, 6, 7, 8}, {1, 2, 3, 4, 5, 6, 7, 8, 9}, + } + for _, tie := range []TieMode{TieSkip, TieAverage, TieHigher} { + for i, values := range valueShapes { + points, _ := scoreValueChannel(t, nineProfile(tie), values...) + add(fmt.Sprintf("result/%s/shape%02d/%s", tie, i, formatPoints(values)), points) + } + } + + manualShapes := [][]int{ + {1}, {1, 2}, {1, 1}, {1, 2, 3}, {1, 1, 1}, {1, 2, 2}, {1, 2, 4}, + {1, 2, 3, 4, 5}, {1, 2, 3, 4, 4}, {1, 2, 3, 4, 5, 5}, + {1, 2, 3, 4, 5, 6, 7}, {1, 2, 2, 3, 4, 5, 6}, {1, 2, 3, 4, 5, 5, 7}, + {1, 1, 1, 1, 1, 1, 1}, + } + for i, ranks := range manualShapes { + got := scoreManualTeamChannel(t, teamTop6(), ranks) + add(fmt.Sprintf("manual-team/%02d/%s", i, formatInts(ranks)), got) + } + + aggregateShapes := [][]float64{ + {1}, {1, 2}, {1, 1}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5, 5}, + {1, 2, 3, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 6, 7}, {1, 1, 1, 1, 1, 1, 1}, + } + for _, mode := range []AvgMode{AvgModeValid, AvgModeAll} { + for i, values := range aggregateShapes { + got := scoreAggregateChannel(t, teamTop6(), mode, values...) + add(fmt.Sprintf("aggregate/%s/%02d/%s", mode, i, formatPoints(values)), got) + } + } + + return strings.Join(lines, "\n") + "\n" +} + +func assertFloatSlice(t *testing.T, what string, got, want []float64) { + t.Helper() + if len(got) != len(want) { + t.Fatalf("%s 条数 = %d,期望 %d(%v)", what, len(got), len(want), got) + } + for i := range want { + if !nearlyEqual(got[i], want[i]) { + t.Errorf("%s 第 %d 项 = %v,期望 %v(完整:%v)", what, i+1, got[i], want[i], got) + } + } +} + +func assertPointsAndRanks(t *testing.T, points []float64, ranks []int, wantPoints []float64, wantRanks []int) { + t.Helper() + assertFloatSlice(t, "积分", points, wantPoints) + if len(ranks) != len(wantRanks) { + t.Fatalf("名次条数 = %d,期望 %d(%v)", len(ranks), len(wantRanks), ranks) + } + for i := range wantRanks { + if ranks[i] != wantRanks[i] { + t.Errorf("第 %d 条名次 = %d,期望 %d(完整:%v)", i+1, ranks[i], wantRanks[i], ranks) + } + } +} + +func formatPoints(fs []float64) string { + parts := make([]string, len(fs)) + for i, f := range fs { + parts[i] = fmt.Sprintf("%v", f) + } + return "[" + strings.Join(parts, ", ") + "]" +} + +func formatInts(is []int) string { + parts := make([]string, len(is)) + for i, v := range is { + parts[i] = fmt.Sprintf("%d", v) + } + return "[" + strings.Join(parts, ", ") + "]" +} diff --git a/server/internal/domain/ledger.go b/server/internal/domain/ledger.go index 6b9472c..4bafa80 100644 --- a/server/internal/domain/ledger.go +++ b/server/internal/domain/ledger.go @@ -10,6 +10,18 @@ type TeamPoints struct { // SumByTeam 汇总各单位得分:总分 = 仅记单位的流水 + 系数 × 记到个人的流水。 // weight <= 0 时按 1 处理,避免零值把个人分抹掉。 // count_to_team = 0 的流水(如「个人+团体」项目的个人通道)只记在个人头上,不计入单位总分。 +// +// 刻意不按 EventID 过滤(也不该有人来「补」这条过滤): +// - 「event_id 为空」不等于「孤儿流水」。人工调整(source_type='adjustment')本来就允许不挂小项, +// 有 event_id 为 NULL 的合法行(写入口 repo_misc.go 的 createAdjustment,由迁移测试钉住), +// 一刀切过滤会把合法的调整分一起吞掉; +// - 就算再收窄到 source_type='result',过滤也只是「让分悄悄消失」:没有作废人、没有作废原因、 +// 没有审计行。积分变动必须可追溯,所以作废只能发生在写侧(如 deleteEvent 在同一事务里 +// 按 void_reason 作废),而不是读取时假装看不见; +// - 同一个「删掉的小项」在别处仍会被读到:单位积分明细(httpapi/repo_misc.go 的 teamBreakdown) +// 是另一条 SQL,过滤这里只会变成「榜上无分、明细有分」的新矛盾。 +// +// 因此本函数只认调用方给它的流水:要让它少算分,就在写侧把流水作废掉。 func SumByTeam(entries []LedgerEntry, weight float64) map[int64]TeamPoints { if weight <= 0 { weight = 1 @@ -33,6 +45,7 @@ func SumByTeam(entries []LedgerEntry, weight float64) map[int64]TeamPoints { // SumByAthlete 汇总每个运动员的个人总分(原始分,不折算系数)。 // 不计入单位总分的流水(count_to_team = 0)照样算在个人头上,个人榜不受影响。 +// 与 SumByTeam 同口径,同样不按 EventID 过滤(理由见 SumByTeam 的注释)。 func SumByAthlete(entries []LedgerEntry) map[int64]float64 { out := make(map[int64]float64) for _, e := range entries { diff --git a/server/internal/domain/scoring.go b/server/internal/domain/scoring.go index 93bfc83..5ec8dff 100644 --- a/server/internal/domain/scoring.go +++ b/server/internal/domain/scoring.go @@ -365,16 +365,18 @@ func groupByManualRank(cands []candidate) []tieGroup { // rankGroups 给每组分配积分并产出名次明细。 func rankGroups(in EventScoreInput, ch ScoreChannel, profile ScoringProfile, groups []tieGroup) []RankedResult { - lastRank := 0 + // lastPlace 是本组别被占用的最大名次档,也就是「末位」那一档:skip 口径下各组的占位 + // 连续铺满 1..N,它正好等于实际可排名人数 N。末位归零只抹这一档,见 groupPoints。 + lastPlace := 0 for _, g := range groups { - if r := g.startRank + len(g.members) - 1; r > lastRank { - lastRank = r + if r := g.startRank + len(g.members) - 1; r > lastPlace { + lastPlace = r } } var out []RankedResult for _, g := range groups { - pts := groupPoints(profile, g.startRank, len(g.members), lastRank, in.Event, in.Category) + pts := groupPoints(profile, g.startRank, len(g.members), lastPlace, in.Event, in.Category) for _, c := range g.members { out = append(out, rankedResult(in, ch, c, g.startRank, pts)) } @@ -383,14 +385,18 @@ func rankGroups(in EventScoreInput, ch ScoreChannel, profile ScoringProfile, gro } // groupPoints 计算一组并列者拿到的分。 -// 三种口径都先确定这组「占用了哪些名次」:startRank .. startRank+size-1。 -func groupPoints(profile ScoringProfile, startRank, size, lastRank int, ev Event, cat EventCategory) float64 { +// 三种口径都先确定这组「占用了哪些名次」:startRank .. startRank+size-1; +// lastPlace 是本组别被占用的最大名次档(末位那一档,skip 口径下等于实际可排名人数 N)。 +func groupPoints(profile ScoringProfile, startRank, size, lastPlace int, ev Event, cat EventCategory) float64 { if startRank <= 0 || size <= 0 { return 0 } - // lastPlaceZero 是对「最后一名」的覆盖;并列在末位的整组都按最后一名处理, - // 否则同组出现 0 与 1 两种分数,违背「并列同分」的语义。 - if profile.LastPlaceZero && startRank <= lastRank && lastRank <= startRank+size-1 { + // lastPlaceZero 只把「末位那一档」置零:判据是起始名次**正好落在这档**。 + // 这种组必然只有一个人(startRank == lastPlace 意味着 size == 1,因为 lastPlace 是所有组 + // 占位名次的最大值)。并列组若从更靠前的名次起步、区间跨过末位,组内多数人本可拿到录取线内的分, + // 整组归零会把他们一起抹掉——7 人里三人并列第 5(占 5/6/7)时,第 5 名的 2 分与第 6 名的 1 分 + // 都该照发,而他们并不是「末位那一档」。 + if profile.LastPlaceZero && startRank == lastPlace { return 0 } @@ -459,13 +465,21 @@ func rankedResult(in EventScoreInput, ch ScoreChannel, c candidate, rank int, po return rr } -// scoreByAggregate 实现 basis=aggregate:把同一主体(单位/运动员)在本组别的成绩取平均, +// scoreByAggregate 实现 basis=aggregate:把同一主体(单位/运动员)在本组别的成绩汇成一个值, // 得到团体成绩后按项目的 compare 方向排名(并列沿用模板的 tieMode,默认顺延)。 -// 平均值分母由项目的 avg_mode 决定: +// +// 汇总口径(通道的 aggregate_mode,缺省 avg): +// - avg:团体成绩 = 成员成绩的平均值; +// - sum:团体成绩 = 成员成绩的总和。 +// +// avg 的平均值分母由项目的 avg_mode 决定: // - valid:分子 = 有效成绩之和,分母 = 有有效成绩的人数;一个人都没成绩就不参与排名、不得分; // - all:分子 = 有效成绩之和(没成绩的按 0),分母 = 该主体的报名人数。 // 没有报名项的主体不会成桶,自然不参与。 // +// sum 只累加有效成绩(没成绩的人按 0 计入和不计入是一样的和),所以 avg_mode 在这里只剩一个作用: +// 决定「一个有效成绩都没有的单位算不算 0 分参与排名」——valid 不参与、all 参与,与 avg 完全一致。 +// // 弃权 / 失格(status 非 registered)的报名项既不算参与也不算进分母,与「不占名次」的既有口径一致。 func scoreByAggregate(in EventScoreInput, ch ScoreChannel, profile ScoringProfile) ([]RankedResult, error) { if in.Event.Compare == CompareNone { @@ -510,18 +524,24 @@ func scoreByAggregate(in EventScoreInput, ch ScoreChannel, profile ScoringProfil b.valid++ } } + sumMode := ch.aggregateMode() == AggregateSum + allMode := in.Event.avgMode() == AvgModeAll agg := make([]candidate, 0, len(order)) for _, id := range order { b := buckets[id] + if b.valid == 0 && !allMode { + // 一个人都没有效成绩的单位不参与团体排名,也不得分(两种汇总口径都一样)。 + continue + } var value float64 - if in.Event.avgMode() == AvgModeAll { + switch { + case sumMode: + // 求和口径:只累加有效成绩(没成绩按 0 计入与否不改变和)。 + value = b.sum + case allMode: // 分母 = 报名人数:没成绩的人按 0 计入,也就是只累加有效成绩之和。 value = b.sum / float64(b.roster) - } else { - if b.valid == 0 { - // 一个人都没有效成绩的单位不参与团体排名,也不得分。 - continue - } + default: value = b.sum / float64(b.valid) } c := candidate{entry: b.entry, subject: b.subject, value: value} @@ -531,16 +551,17 @@ func scoreByAggregate(in EventScoreInput, ch ScoreChannel, profile ScoringProfil sortCandidatesByValue(agg, in.Event.Compare) groups := groupByValue(agg) - lastRank := 0 + // 与 rankGroups 同一个口径:lastPlace = 被占用的最大名次档(聚合结果同样是 skip 占位)。 + lastPlace := 0 for _, g := range groups { - if r := g.startRank + len(g.members) - 1; r > lastRank { - lastRank = r + if r := g.startRank + len(g.members) - 1; r > lastPlace { + lastPlace = r } } var out []RankedResult for _, g := range groups { - pts := groupPoints(profile, g.startRank, len(g.members), lastRank, in.Event, in.Category) + pts := groupPoints(profile, g.startRank, len(g.members), lastPlace, in.Event, in.Category) for _, c := range g.members { rr := RankedResult{ EventID: in.Event.ID, diff --git a/server/internal/domain/scoring_test.go b/server/internal/domain/scoring_test.go index ab6b4ee..ae23d4c 100644 --- a/server/internal/domain/scoring_test.go +++ b/server/internal/domain/scoring_test.go @@ -31,7 +31,8 @@ func TestGroupPointsTieModes(t *testing.T) { {"skip 超出录取名次", nineProfile(TieSkip), 9, 1, 9, 0}, {"空模板口径按 skip", ScoringProfile{AwardRanks: 8, Rules: nineProfile(TieSkip).Rules}, 2, 1, 8, 7}, {"lastPlaceZero 抹掉最后一名", ScoringProfile{AwardRanks: 8, LastPlaceZero: true, Rules: nineProfile(TieSkip).Rules}, 1, 1, 1, 0}, - {"lastPlaceZero 抹掉并列末位整组", ScoringProfile{AwardRanks: 8, LastPlaceZero: true, Rules: nineProfile(TieSkip).Rules}, 2, 2, 3, 0}, + // 末位档是 3(三人参赛),这组从第 2 名起步、区间跨过末位 → 只吞末位那一档,不整组归零。 + {"lastPlaceZero 不牵连跨末位的并列组", ScoringProfile{AwardRanks: 8, LastPlaceZero: true, Rules: nineProfile(TieSkip).Rules}, 2, 2, 3, 7}, {"权重相乘", nineProfile(TieSkip), 1, 1, 8, 9}, } for _, tc := range cases { diff --git a/server/internal/domain/standings.go b/server/internal/domain/standings.go index f3c3035..37b8e6a 100644 --- a/server/internal/domain/standings.go +++ b/server/internal/domain/standings.go @@ -19,6 +19,13 @@ var ( defaultAthleteTieBreak = []string{TieBreakPoints, TieBreakGold, TieBreakSilver, TieBreakBronze, TieBreakName} ) +// 单位奖牌榜的排序口径(主人 2026-09-13 拍板):金牌 → 银牌 → 铜牌 → 单位编码。 +// +// 它**故意不读** StandingsInput.TieBreak:那套键是给总积分榜与个人榜的, +// 规则包里写的 `points,gold,...` 一进来,奖牌榜就又变回"总分优先", +// 会出现"金牌 6 枚的单位排在金牌 2 枚的后面"(06 报告 P1④)。 +var defaultMedalTieBreak = []string{TieBreakGold, TieBreakSilver, TieBreakBronze, TieBreakTeamCode} + // StandingsInput 是排名聚合的输入:流水 + 名次明细 + 单位/运动员基础信息。 type StandingsInput struct { Teams []Team @@ -27,6 +34,7 @@ type StandingsInput struct { Ranked []RankedResult // TieBreak 是排序键顺序(如 points/gold/silver/bronze/teamCode/name); // 空表示用默认口径。配置里的键优先,其余按默认顺序补齐,保证结果全序。 + // **只作用于总积分榜与个人榜**:单位奖牌榜固定按金→银→铜→单位编码排(defaultMedalTieBreak)。 TieBreak []string // IndividualToTeamWeight 个人积分折算进单位总分的系数;<=0 时按 1 处理。 IndividualToTeamWeight float64 @@ -61,6 +69,19 @@ func medalEligible(rr RankedResult) bool { // BuildTeamStandings 生成总积分榜。 // 总分 = Σ(仅记单位的流水) + 系数 × Σ(记到个人的流水);排序按 in.TieBreak,缺省为总分 → 金 → 银 → 铜 → 单位编码。 func BuildTeamStandings(in StandingsInput) []StandingsRow { + rows := buildTeamRows(in) + sort.SliceStable(rows, func(i, j int) bool { return lessTeamRow(rows[i], rows[j], in.TieBreak) }) + for i := range rows { + rows[i].Rank = i + 1 + } + return rows +} + +// buildTeamRows 汇总出「每个单位一行」的原始数据(含兜底补行),不排序、不填名次。 +// +// 单位总分榜与单位奖牌榜的行集合必须完全一致(同一批单位、同样兜底), +// 差别只在排序与名次;两条路都从这里出行,避免哪天只给一个榜补了兜底行。 +func buildTeamRows(in StandingsInput) []StandingsRow { weight := effectiveWeight(in.IndividualToTeamWeight) sums := SumByTeam(in.Ledger, weight) medals := teamMedals(in) @@ -87,22 +108,19 @@ func BuildTeamStandings(in StandingsInput) []StandingsRow { rows = append(rows, buildTeamRow(Team{ID: id}, sums[id], m)) } } - - sort.SliceStable(rows, func(i, j int) bool { return lessTeamRow(rows[i], rows[j], in.TieBreak) }) - for i := range rows { - rows[i].Rank = i + 1 - } return rows } // BuildMedalStandings 生成单位奖牌榜。 -// 排序口径与总积分榜一致(总分优先),只是列不同,保证两块榜的单位顺序不会打架。 +// +// 行集合与总积分榜相同(同一份输入、同一套兜底),但**名次与顺序自成一套**: +// 金 → 银 → 铜 → 单位编码,与总分无关(主人 2026-09-13 拍板)。 +// 因此绝不能复用总积分榜的 Rank——那正是「金牌多的排在金牌少的后面」的来源。 func BuildMedalStandings(in StandingsInput) []MedalRow { - teamRows := BuildTeamStandings(in) - out := make([]MedalRow, len(teamRows)) - for i, r := range teamRows { - out[i] = MedalRow{ - Rank: r.Rank, + teamRows := buildTeamRows(in) + out := make([]MedalRow, 0, len(teamRows)) + for _, r := range teamRows { + out = append(out, MedalRow{ TeamID: r.TeamID, Code: r.Code, Name: r.Name, @@ -112,11 +130,42 @@ func BuildMedalStandings(in StandingsInput) []MedalRow { Silver: r.Silver, Bronze: r.Bronze, Total: r.Gold + r.Silver + r.Bronze, - } + }) + } + sort.SliceStable(out, func(i, j int) bool { return lessMedalRow(out[i], out[j]) }) + for i := range out { + out[i].Rank = i + 1 } return out } +// lessMedalRow 是单位奖牌榜的排序:金 DESC → 银 DESC → 铜 DESC → 单位编码 ASC。 +// 只用 defaultMedalTieBreak 这几个键(不掺 StandingsInput.TieBreak),最后用单位 ID 兜底, +// 保证任意两行都有确定先后(结果全序)。 +func lessMedalRow(a, b MedalRow) bool { + for _, key := range defaultMedalTieBreak { + switch key { + case TieBreakGold: + if a.Gold != b.Gold { + return a.Gold > b.Gold + } + case TieBreakSilver: + if a.Silver != b.Silver { + return a.Silver > b.Silver + } + case TieBreakBronze: + if a.Bronze != b.Bronze { + return a.Bronze > b.Bronze + } + case TieBreakTeamCode: + if a.Code != b.Code { + return a.Code < b.Code + } + } + } + return a.TeamID < b.TeamID +} + // BuildAthleteStandings 生成个人积分奖牌榜。 // 排序按 in.TieBreak,缺省为总分 → 金 → 银 → 铜 → 姓名;个人榜的奖牌只统计个人项目(团体项目奖牌归团体榜)。 func BuildAthleteStandings(in StandingsInput) []AthleteStandingsRow { diff --git a/server/internal/domain/standings_test.go b/server/internal/domain/standings_test.go index b18c16e..8bd50d3 100644 --- a/server/internal/domain/standings_test.go +++ b/server/internal/domain/standings_test.go @@ -147,6 +147,94 @@ func TestMedalStandings(t *testing.T) { } } +// medalRanked 造一条能拿奖牌的名次明细:一个小项一条,避免被「同一主体只记一枚」去重掉。 +func medalRanked(teamID, eventID int64, rank int) RankedResult { + rr := mkRanked(teamID, ScopeTeam, rank) + rr.EventID = eventID + rr.CategoryID = 1 + return rr +} + +// medalPodium 给一个单位凑出金/银/铜若干枚(各占一个小项),firstEventID 用来错开小项。 +func medalPodium(teamID, firstEventID int64, gold, silver, bronze int) []RankedResult { + out := make([]RankedResult, 0, gold+silver+bronze) + next := firstEventID + for i := 0; i < gold; i++ { + out = append(out, medalRanked(teamID, next, 1)) + next++ + } + for i := 0; i < silver; i++ { + out = append(out, medalRanked(teamID, next, 2)) + next++ + } + for i := 0; i < bronze; i++ { + out = append(out, medalRanked(teamID, next, 3)) + next++ + } + return out +} + +// TestMedalStandingsIndependentOfPointsBoard 是 06 报告 P1④ 的回归用例(主人 2026-09-13 拍板): +// 单位1 金牌 6 枚但只有 10 分,单位2 金牌 2 枚却拿了 30 分。 +// 修前:单位奖牌榜直接沿用总积分榜的顺序与名次,单位1 排在单位2 后面(观众看到"金牌多的排后面")。 +// 修后:奖牌榜按金→银→铜排,单位1 榜首;总积分榜仍按总分排,单位2 榜首——两个榜解耦。 +func TestMedalStandingsIndependentOfPointsBoard(t *testing.T) { + ledger := []LedgerEntry{ledgerFor(1, 10), ledgerFor(2, 30)} + ranked := append(medalPodium(1, 1, 6, 0, 0), medalPodium(2, 101, 2, 0, 0)...) + in := StandingsInput{Teams: testTeams(1, 2), Ledger: ledger, Ranked: ranked} + + points := BuildTeamStandings(in) + if len(points) != 2 || points[0].TeamID != 2 || points[0].Rank != 1 || points[1].TeamID != 1 || points[1].Rank != 2 { + t.Fatalf("总积分榜必须仍按总分排(单位2 30 分在前,名次 1):%+v", points) + } + + medal := BuildMedalStandings(in) + if len(medal) != 2 { + t.Fatalf("奖牌榜行数 = %d,期望 2", len(medal)) + } + if medal[0].TeamID != 1 || medal[0].Rank != 1 || medal[0].Gold != 6 { + t.Fatalf("奖牌榜榜首应为金牌 6 枚的单位1 且名次 1:%+v", medal) + } + if medal[1].TeamID != 2 || medal[1].Rank != 2 || medal[1].Gold != 2 { + t.Fatalf("奖牌榜次席应为金牌 2 枚的单位2 且名次 2:%+v", medal) + } + // 名次重排了,但总分列仍照实带出:单位2 在奖牌榜上依然是 30 分。 + if !nearlyEqual(medal[1].Points, 30) { + t.Fatalf("奖牌榜的总分列 = %v,期望 30", medal[1].Points) + } + + // 规则包的 tie_break 以 points 打头,也不能把奖牌榜拉回总分口径。 + configured := in + configured.TieBreak = []string{TieBreakPoints, TieBreakGold, TieBreakSilver, TieBreakBronze, TieBreakTeamCode} + if got := BuildMedalStandings(configured); got[0].TeamID != 1 || got[0].Rank != 1 { + t.Fatalf("tie_break=points,… 时奖牌榜榜首 = 单位 %d,期望仍为金牌多的单位1:%+v", got[0].TeamID, got) + } +} + +// 奖牌相同时才比下一级:银 → 铜 → 单位编码,名次始终是 1..n 的全序。 +func TestMedalStandingsSortChain(t *testing.T) { + cases := []struct { + name string + ranked []RankedResult + want int64 + }{ + {"金相同比银", append(medalPodium(1, 1, 1, 0, 0), medalPodium(2, 101, 1, 1, 0)...), 2}, + {"金、银相同比铜", append(medalPodium(1, 1, 1, 1, 0), medalPodium(2, 101, 1, 1, 1)...), 2}, + {"奖牌全同按单位编码 A < B", append(medalPodium(1, 1, 1, 0, 0), medalPodium(2, 101, 1, 0, 0)...), 1}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + rows := BuildMedalStandings(StandingsInput{Teams: testTeams(1, 2), Ranked: tc.ranked}) + if rows[0].TeamID != tc.want { + t.Fatalf("榜首 = 单位 %d,期望 %d:%+v", rows[0].TeamID, tc.want, rows) + } + if rows[0].Rank != 1 || rows[1].Rank != 2 { + t.Fatalf("名次 = %d/%d,期望 1/2", rows[0].Rank, rows[1].Rank) + } + }) + } +} + func TestAthleteStandings(t *testing.T) { ledger := []LedgerEntry{ ledgerForAthlete(1001, 1, 10), diff --git a/server/internal/domain/types.go b/server/internal/domain/types.go index eed0265..61a77d5 100644 --- a/server/internal/domain/types.go +++ b/server/internal/domain/types.go @@ -35,6 +35,17 @@ const ( AvgModeAll AvgMode = "all" ) +// AggregateMode 聚合通道(basis=aggregate)的汇总口径:把同一主体的成绩汇成一个值的方式。 +// 与 AvgMode(平均值内部的分母口径)是两个维度,可以组合,见 scoreByAggregate。 +type AggregateMode string + +const ( + // AggregateAvg 按主体成员成绩的平均值排名(缺省口径,与升级前行为一致)。 + AggregateAvg AggregateMode = "avg" + // AggregateSum 按主体成员成绩的总和排名。 + AggregateSum AggregateMode = "sum" +) + // ResultType 成绩的物理量类型,决定比较与展示方式。 type ResultType string @@ -229,7 +240,8 @@ type EventCategory struct { // ScoreChannel 计分通道 = 「排谁的名次」+「名次从哪来」+「用哪张积分表」。 // 一个项目可配 0..N 个通道;0 个表示只排名不计分。 -// basis=aggregate 按同一主体成绩的平均值汇总,分母由项目的 avg_mode 决定。 +// basis=aggregate 把同一主体的成绩汇总成一个值再排名:汇总口径由本通道的 aggregate_mode 决定 +// (avg 平均 / sum 求和),平均值内部的分母口径由项目的 avg_mode 决定。 type ScoreChannel struct { ID int64 `json:"id"` EventID int64 `json:"eventId"` @@ -237,6 +249,9 @@ type ScoreChannel struct { Basis Basis `json:"basis"` ProfileID int64 `json:"profileId"` SortOrder int `json:"sortOrder,omitempty"` + // AggregateMode 是 basis=aggregate 通道的汇总口径;空值按缺省(avg)处理, + // 只对 aggregate 通道有意义,其它通道即使带着该字段也不参与计算。 + AggregateMode AggregateMode `json:"aggregateMode,omitempty"` // CountToTeam 决定该通道产出的流水是否计入单位总分;nil 表示按缺省(计入)处理。 // 「个人+团体」项目的个人通道置 false:分只记在个人头上,不进单位总分。 CountToTeam *bool `json:"countToTeam,omitempty"` @@ -462,6 +477,15 @@ func (c ScoreChannel) countToTeam() bool { return c.CountToTeam == nil || *c.CountToTeam } +// aggregateMode 未配置或配错时按 avg 处理(与库里的默认值一致): +// 缺字段的老数据、老客户端保存的通道都维持「按成员平均」的既有口径。 +func (c ScoreChannel) aggregateMode() AggregateMode { + if c.AggregateMode == AggregateSum { + return AggregateSum + } + return AggregateAvg +} + // CountsToMedals 未配置时按 true 处理:只有显式关闭的通道才不发奖牌。 func (c ScoreChannel) CountsToMedals() bool { return c.CountToMedals == nil || *c.CountToMedals diff --git a/server/internal/dto/standings.go b/server/internal/dto/standings.go index 8d41c72..85626e0 100644 --- a/server/internal/dto/standings.go +++ b/server/internal/dto/standings.go @@ -6,6 +6,9 @@ import "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" // // 字段名与 web/src/shared/types.ts 的 StandingRow 对齐:大屏与管理端共用一份解析逻辑, // 不能再把 domain.StandingsRow 的 points/code/medals 直接下发。 +// +// 两个榜共用这一行:rank 是总积分榜名次(总分优先),medalRank 是单位奖牌榜名次 +// (金 → 银 → 铜 → 单位编码,与总分无关)。金牌多但总分低的单位,medalRank 会比 rank 靠前。 type StandingRow struct { TeamID int64 `json:"teamId"` TeamCode string `json:"teamCode"` @@ -14,6 +17,7 @@ type StandingRow struct { Color *string `json:"color"` LogoPath *string `json:"logoPath"` Rank int `json:"rank"` + MedalRank int `json:"medalRank"` Gold int `json:"gold"` Silver int `json:"silver"` Bronze int `json:"bronze"` @@ -23,12 +27,21 @@ type StandingRow struct { } // StandingRows 把 domain 榜单转换成线上结构。 +// +// rows 是总积分榜(顺序与 Rank 都按总分),medal 是同一份输入算出的单位奖牌榜 +// (顺序与名次按金→银→铜)。两个榜的行集合相同,这里用团队 id 把奖牌榜名次并进每一行, +// 于是 REST / WS 快照 / xlsx 导出三处拿到的奖牌榜口径完全一致(同一个 domain.BuildMedalStandings)。 +// // teams 用于补齐颜色/logo 等 domain 榜单没带的展示字段;rankChange 快照没有对比基准,与 REST 一致下发 null。 -func StandingRows(rows []domain.StandingsRow, teams []domain.Team) []StandingRow { +func StandingRows(rows []domain.StandingsRow, medal []domain.MedalRow, teams []domain.Team) []StandingRow { byID := make(map[int64]domain.Team, len(teams)) for _, t := range teams { byID[t.ID] = t } + medalRanks := make(map[int64]int, len(medal)) + for _, m := range medal { + medalRanks[m.TeamID] = m.Rank + } out := make([]StandingRow, 0, len(rows)) for _, r := range rows { @@ -39,6 +52,7 @@ func StandingRows(rows []domain.StandingsRow, teams []domain.Team) []StandingRow TeamName: r.Name, ShortName: nilIfEmpty(r.ShortName), Rank: r.Rank, + MedalRank: medalRanks[r.TeamID], Gold: r.Gold, Silver: r.Silver, Bronze: r.Bronze, diff --git a/server/internal/export/load.go b/server/internal/export/load.go index fdc0ee3..c53aacf 100644 --- a/server/internal/export/load.go +++ b/server/internal/export/load.go @@ -1,6 +1,7 @@ package export import ( + "context" "database/sql" "encoding/json" "fmt" @@ -9,6 +10,7 @@ import ( "time" "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" + "git.yeij.top/AskaEth/Scoreboard/server/internal/revisions" ) // Meta 是导出件抬头里的赛事信息;留空的字段自动回落到赛事库的 settings。 @@ -646,7 +648,8 @@ func loadTeamDetailRows(db *sql.DB, teamID int64) ([]TeamDetailRow, error) { SELECT COALESCE(s.name, ''), COALESCE(e.name, ''), COALESCE(c.name, ca.name, ''), COALESCE(a.name, ''), `+teamDetailRankExpr+`, COALESCE(r.result_text, ''), COALESCE(r.unit, ''), - l.source_type, l.points, COALESCE(l.void_reason, ''), COALESCE(l.athlete_id, 0) + l.source_type, l.points, COALESCE(l.void_reason, ''), COALESCE(l.athlete_id, 0), + COALESCE(l.event_id, 0), COALESCE(l.entry_id, 0) FROM score_ledger l LEFT JOIN events e ON e.id = l.event_id LEFT JOIN sports s ON s.id = e.sport_id @@ -673,13 +676,15 @@ func loadTeamDetailRows(db *sql.DB, teamID int64) ([]TeamDetailRow, error) { defer func() { _ = rows.Close() }() var out []TeamDetailRow + // 每条流水背后的成绩身份((小项, 报名项),口径见 internal/revisions),用来补「备注」列的修订痕迹。 + keys := make([]revisions.Key, 0, len(out)) for rows.Next() { var r TeamDetailRow var source string - var athleteID int64 + var athleteID, eventID, entryID int64 var resultText, unit string if err := rows.Scan(&r.SportName, &r.EventName, &r.Category, &r.AthleteName, &r.Rank, - &resultText, &unit, &source, &r.Points, &r.Remark, &athleteID); err != nil { + &resultText, &unit, &source, &r.Points, &r.Remark, &athleteID, &eventID, &entryID); err != nil { return nil, fmt.Errorf("export: 扫描积分明细: %w", err) } // 成绩与分项成绩表 / 个人明细同口径(走 displayResult),否则同一场比赛的同一个成绩 @@ -687,14 +692,70 @@ func loadTeamDetailRows(db *sql.DB, teamID int64) ([]TeamDetailRow, error) { r.ResultText = displayResult(resultText, unit) r.Source = sourceLabel(source) r.individual = athleteID != 0 + keys = append(keys, revisions.KeyFor(source, eventID, entryID)) out = append(out, r) } if err := rows.Err(); err != nil { return nil, fmt.Errorf("export: 遍历积分明细: %w", err) } + attachRevisionRemarks(out, keys, loadRevisionTrails(db, keys)) return out, nil } +// loadRevisionTrails 取这些成绩的修订痕迹;查不出来只留空,导出照旧出。 +// +// 导出件与屏幕上写的必须是同一句话(口径见 internal/revisions):明细在屏幕上挂着 +// 「已修订 ×2」,xlsx 里一个字没有,事后拿表格对账的人就不知道该信哪份。 +func loadRevisionTrails(db *sql.DB, keys []revisions.Key) map[revisions.Key]revisions.Trail { + trails, err := revisions.Load(context.Background(), db, keys) + if err != nil { + return nil + } + return trails +} + +// attachRevisionRemarks 把修订痕迹写进「备注」列:`已修订 ×2;最后一次 10:42 成绩录入笔误`。 +// +// 没改过(或追不出来)的行备注留空 —— 这个列本来只写「作废理由」,而作废的流水不会出现在这里, +// 所以正常行本来就是空白,只有真被改过的成绩才会多出一句话。 +func attachRevisionRemarks(rows []TeamDetailRow, keys []revisions.Key, trails map[revisions.Key]revisions.Trail) { + for i, key := range keys { + if i >= len(rows) { + return + } + trail, ok := trails[key] + if !ok || trail.Count == 0 { + continue + } + text := fmt.Sprintf("已修订 ×%d", trail.Count) + if clock := revisionClock(trail.At); clock != "" { + text += ";最后一次 " + clock + if trail.Reason != "" { + text += " " + trail.Reason + } + } else if trail.Reason != "" { + text += ";" + trail.Reason + } + if rows[i].Remark == "" { + rows[i].Remark = text + } else { + rows[i].Remark += ";" + text + } + } +} + +// revisionClock 把 result_revisions.created_at 转成 `HH:mm`(本地时区)。 +// +// 库里存的是 datetime('now') 的 UTC 但不带时区,按 UTC 解析再转本地 —— 与前端 +// shared/format.ts 的 toDate 同一口径,否则导出件上的 10:42 会比大屏早 8 小时。 +func revisionClock(at string) string { + parsed, err := time.ParseInLocation("2006-01-02 15:04:05", strings.TrimSpace(at), time.UTC) + if err != nil { + return "" + } + return parsed.Local().Format("15:04") +} + func rankLabel(rank int, isTie bool) string { if rank <= 0 { return "" diff --git a/server/internal/export/load_test.go b/server/internal/export/load_test.go index 1b22ae1..26b3779 100644 --- a/server/internal/export/load_test.go +++ b/server/internal/export/load_test.go @@ -3,8 +3,15 @@ package export import ( "context" "database/sql" + "encoding/json" + "path/filepath" + "regexp" + "strings" "testing" + "github.com/xuri/excelize/v2" + + "git.yeij.top/AskaEth/Scoreboard/server/internal/dto" "git.yeij.top/AskaEth/Scoreboard/server/internal/realtime" ) @@ -27,6 +34,10 @@ func TestExportStandingsMatchesSnapshot(t *testing.T) { if len(wb.Team) != len(snap.Standings) { t.Fatalf("单位数不一致:导出 %d,快照 %d", len(wb.Team), len(snap.Standings)) } + medalRank := make(map[int64]int, len(wb.Medal)) + for _, m := range wb.Medal { + medalRank[m.TeamID] = m.Rank + } for _, s := range snap.Standings { idx := -1 for i := range wb.Team { @@ -43,6 +54,10 @@ func TestExportStandingsMatchesSnapshot(t *testing.T) { row.Bronze != s.Bronze || row.Medals != s.MedalTotal || row.Rank != s.Rank { t.Errorf("单位 %d 口径不一致:导出 %+v,快照 %+v", s.TeamID, row, s) } + // 单位奖牌榜的名次也必须同源:xlsx 的奖牌榜名次 = 快照下发的 medalRank。 + if got := medalRank[s.TeamID]; got != s.MedalRank { + t.Errorf("单位 %d 的奖牌榜名次不一致:导出 %d,快照 %d", s.TeamID, got, s.MedalRank) + } } } @@ -138,6 +153,107 @@ func TestLoadStandingsHonoursTieBreak(t *testing.T) { } } +// 单位奖牌榜独立于积分榜(主人 2026-09-13 拍板,06 报告 P1④): +// T1 有 1 金但只 5 分、T2 无牌却 10 分——总积分榜 T2 在前,奖牌榜必须 T1 在前。 +// 三处同源:xlsx 的「单位奖牌榜」sheet 与 WS 快照下发的 medalRank 都出自 domain.BuildMedalStandings。 +func TestLoadStandingsMedalBoardIndependentOfPoints(t *testing.T) { + db := openEventDB(t) + seedEvent(t, db) + // 与 TestLoadStandingsHonoursTieBreak 同一份造数:T1 金牌 1 / 5 分,T2 无牌 / 10 分。 + for _, s := range []string{ + `UPDATE score_ledger SET points = 5 WHERE team_id = 1`, + `UPDATE score_ledger SET points = 10 WHERE team_id = 2`, + } { + if _, err := db.Exec(s); err != nil { + t.Fatalf("造数据 %q: %v", s, err) + } + } + seedChannelRanks(t, db) + + wb, err := LoadStandingsWorkbook(db, Options{}) + if err != nil { + t.Fatalf("导出总表: %v", err) + } + if wb.Team[0].Code != "T2" { + t.Fatalf("总积分榜仍按总分排,榜首 = %q,期望 T2", wb.Team[0].Code) + } + if len(wb.Medal) != 2 || wb.Medal[0].Code != "T1" || wb.Medal[0].Rank != 1 || wb.Medal[0].Gold != 1 { + t.Fatalf("奖牌榜应按金牌排,榜首 = %+v,期望 T1(1 金、名次 1)", wb.Medal) + } + if wb.Medal[1].Code != "T2" || wb.Medal[1].Rank != 2 { + t.Fatalf("奖牌榜次席 = %+v,期望 T2(名次 2)", wb.Medal[1]) + } + + // WS 快照(大屏推送)必须给出同一套奖牌榜名次。 + hub := realtime.NewHub(db, testLogger()) + defer func() { _ = hub.Close() }() + snap, err := hub.Snapshot(context.Background()) + if err != nil { + t.Fatalf("读取 WS 快照: %v", err) + } + rows := make(map[string]dto.StandingRow, len(snap.Standings)) + for _, r := range snap.Standings { + rows[r.TeamCode] = r + } + if rows["T1"].MedalRank != 1 || rows["T2"].MedalRank != 2 { + t.Fatalf("快照的奖牌榜名次 = T1:%d T2:%d,期望 1 / 2", rows["T1"].MedalRank, rows["T2"].MedalRank) + } + // 两套名次确实解耦:T1 总分低,总积分榜名次仍是 2。 + if rows["T1"].Rank != 2 || rows["T2"].Rank != 1 { + t.Fatalf("快照的总积分榜名次 = T1:%d T2:%d,期望 2 / 1", rows["T1"].Rank, rows["T2"].Rank) + } + + // xlsx 的「单位奖牌榜」sheet 必须照同一个顺序落表(表头下一行就是第一名)。 + path := filepath.Join(t.TempDir(), "standings.xlsx") + if err := ExportStandingsXLSX(db, path, Options{}); err != nil { + t.Fatalf("导出总表 xlsx: %v", err) + } + f, err := excelize.OpenFile(path) + if err != nil { + t.Fatalf("打开导出件: %v", err) + } + defer func() { _ = f.Close() }() + sheet := sheetNamed(t, f, "单位奖牌榜") + sheetRows, err := f.GetRows(sheet) + if err != nil { + t.Fatalf("读取 %s: %v", sheet, err) + } + // 表头之前还有大标题 / 副标题 / 空行,按表头文字定位,别写死行号。 + head := -1 + for i, row := range sheetRows { + if len(row) > 0 && row[0] == "名次" { + head = i + break + } + } + if head < 0 { + t.Fatalf("%s 里找不到表头行:%v", sheet, sheetRows) + } + if len(sheetRows) < head+3 { + t.Fatalf("%s 数据行数 = %d,期望表头 + 2 行", sheet, len(sheetRows)-head-1) + } + // 列序:名次 / 单位代码 / 单位名称 / 金牌 / 银牌 / 铜牌 / 奖牌合计 / 总分。 + first, second := sheetRows[head+1], sheetRows[head+2] + if first[0] != "1" || first[1] != "T1" || first[3] != "1" { + t.Fatalf("奖牌榜首行 = %v,期望 1 / T1 / 1 金", first) + } + if second[0] != "2" || second[1] != "T2" { + t.Fatalf("奖牌榜次行 = %v,期望 2 / T2", second) + } +} + +// sheetNamed 按后缀取工作表名:导出件的工作表名带赛事名前缀(如「测试运动会 · 单位奖牌榜」)。 +func sheetNamed(t *testing.T, f *excelize.File, suffix string) string { + t.Helper() + for _, name := range f.GetSheetList() { + if strings.HasSuffix(name, suffix) { + return name + } + } + t.Fatalf("导出件里没有以 %q 结尾的工作表:%v", suffix, f.GetSheetList()) + return "" +} + // 停用但仍有积分的单位要显示编码/名称,不能是空行。 func TestLoadStandingsShowsInactiveTeam(t *testing.T) { db := openEventDB(t) @@ -605,6 +721,96 @@ func TestEventRowsIncludeDraftsKeepsDraftValues(t *testing.T) { } } +// 「备注」列要带上修订痕迹:屏幕上挂着「已修订 ×2」而导出件一个字没有, +// 事后拿表格对账的人就不知道该信哪份。判定口径见 internal/revisions。 +func TestTeamDetailRemarkCarriesRevisionTrail(t *testing.T) { + db := openEventDB(t) + seedEvent(t, db) + seedDetailRevisions(t, db) + + wb, err := LoadTeamDetailWorkbook(db, 1, Options{}) + if err != nil { + t.Fatalf("读取积分明细: %v", err) + } + rows := teamDetailRows(wb.Rows, wb.IndividualToTeamWeight) + if len(rows) < 2 { + t.Fatalf("明细行数 = %d,期望含合计行", len(rows)) + } + // 备注是第 10 列(下标 9)。按「来源」找行,不按下标 —— 行序由名次决定,别把断言写死在行号上。 + for _, row := range rows { + switch row[7] { + case "成绩": + if got, ok := row[9].(string); !ok || + !regexp.MustCompile(`^已修订 ×1;最后一次 \d{2}:\d{2} 成绩录入笔误$`).MatchString(got) { + t.Errorf("成绩行备注 = %v,期望 `已修订 ×1;最后一次 HH:MM 成绩录入笔误`", row[9]) + } + case "破纪录加分": + // 破纪录加分是站在成绩旁边的另一笔分,不继承成绩的修订痕迹(见 revisions.KeyFor)。 + if got, _ := row[9].(string); got != "" { + t.Errorf("破纪录加分行备注 = %q,期望留空(改的是成绩,不是这笔加分)", got) + } + } + } + // 合计行的备注留空,不被带上。 + if got, _ := rows[len(rows)-1][9].(string); got != "" { + t.Errorf("合计行备注 = %q,期望留空", got) + } +} + +// 没改过的成绩备注必须留空 —— 导出侧同样不许出现「其实没改过却写了已修订」。 +func TestTeamDetailRemarkEmptyWhenNeverRevised(t *testing.T) { + db := openEventDB(t) + seedEvent(t, db) + // 只发布过一版(有基线、没改动):能追溯,但一个字都不该写。 + writeRevision(t, db, "2026-09-13 02:40:00", "", []map[string]any{ + {"entryId": 1, "resultText": "11.58", "resultValue": 11.58, "unit": "s", "status": "ok"}, + }) + + wb, err := LoadTeamDetailWorkbook(db, 1, Options{}) + if err != nil { + t.Fatalf("读取积分明细: %v", err) + } + rows := teamDetailRows(wb.Rows, wb.IndividualToTeamWeight) + if got, _ := rows[0][9].(string); got != "" { + t.Errorf("没改过的成绩备注 = %q,期望留空", got) + } +} + +// seedDetailRevisions 造一条「发布 → 改成绩 → 重新发布」的历史:张三那条 11.58 被改成 11.42。 +// 两条修订都带上同小项另一条成绩,证明「别人改了」不会把修订痕迹算到自己头上。 +func seedDetailRevisions(t *testing.T, db *sql.DB) { + t.Helper() + writeRevision(t, db, "2026-09-13 02:40:00", "", []map[string]any{ + {"entryId": 1, "rank": 1, "resultText": "11.58", "resultValue": 11.58, "unit": "s", "state": "published"}, + {"entryId": 2, "rank": 2, "resultText": "11.90", "resultValue": 11.90, "unit": "s", "state": "published"}, + }) + writeRevision(t, db, "2026-09-13 02:58:00", "", []map[string]any{ + {"entryId": 1, "rank": 1, "resultText": "11.42", "resultValue": 11.42, "unit": "s", "state": "published", + "note": "成绩录入笔误"}, + // 名次 2 → 1 是改张三的成绩后引擎重算的,李四这条自己没动过。 + {"entryId": 2, "rank": 1, "resultText": "11.90", "resultValue": 11.90, "unit": "s", "state": "published"}, + }) + // 同一报名项上再挂一条破纪录加分流水:它不该继承成绩的修订痕迹。 + if _, err := db.Exec(`INSERT INTO score_ledger(team_id, athlete_id, event_id, entry_id, result_id, + source_type, source_id, points) + VALUES (1, 1, 1, 1, 1, 'record_bonus', 1, 3)`); err != nil { + t.Fatalf("写入破纪录加分流水: %v", err) + } +} + +// writeRevision 往 result_revisions 里插一版快照(字段名与 httpapi.resultDTO 对齐)。 +func writeRevision(t *testing.T, db *sql.DB, createdAt, message string, results []map[string]any) { + t.Helper() + raw, err := json.Marshal(results) + if err != nil { + t.Fatalf("序列化快照: %v", err) + } + if _, err := db.Exec(`INSERT INTO result_revisions (event_id, action, snapshot_json, message, created_at) + VALUES (1, 'publish', ?, ?, ?)`, string(raw), message, createdAt); err != nil { + t.Fatalf("插入修订: %v", err) + } +} + // equalCells 逐格比较两行;float64 与 string 都按值比。 func equalCells(got, want []any) bool { if len(got) != len(want) { diff --git a/server/internal/export/medals.go b/server/internal/export/medals.go index a34a2d6..508ca57 100644 --- a/server/internal/export/medals.go +++ b/server/internal/export/medals.go @@ -157,7 +157,9 @@ func medalRow(r MedalDetailRow) []any { } // LoadMedalDetailWorkbook 读取全部奖牌来源。 -// 单位顺序沿用「单位奖牌榜」(与单位总分榜同序),没有奖牌的单位不出分表。 +// 单位顺序按「单位总分榜」(teamStandingsOrder,得分高的在前),**不跟单位奖牌榜**: +// 奖牌榜已独立按金→银→铜排(domain.BuildMedalStandings),两份顺序本来就不一样。 +// 没有奖牌的单位不出分表。 func LoadMedalDetailWorkbook(db *sql.DB, opts Options) (MedalDetailWorkbook, error) { if db == nil { return MedalDetailWorkbook{}, ErrNoDatabase diff --git a/server/internal/httpapi/breakdown_revisions_test.go b/server/internal/httpapi/breakdown_revisions_test.go new file mode 100644 index 0000000..19d9445 --- /dev/null +++ b/server/internal/httpapi/breakdown_revisions_test.go @@ -0,0 +1,233 @@ +package httpapi_test + +import ( + "fmt" + "net/http" + "testing" +) + +// breakdownItems 读某单位的积分明细行。 +func breakdownItems(t *testing.T, env *testEnv, client *http.Client, teamID int64) []map[string]any { + t.Helper() + status, env2 := env.do(client, http.MethodGet, + fmt.Sprintf("/api/standings/teams/%d/breakdown", teamID), nil, false) + if status != http.StatusOK || !env2.OK { + t.Fatalf("读积分明细应 200,得到 %d %+v", status, env2.Error) + } + rows := decodeData[map[string]any](t, env2)["items"].([]any) + out := make([]map[string]any, 0, len(rows)) + for _, row := range rows { + item, ok := row.(map[string]any) + if !ok { + t.Fatalf("明细行不是对象: %+v", row) + } + out = append(out, item) + } + return out +} + +// publishTrailResults 走真实的草稿 + 发布接口发布一批成绩(每次换一个 requestId,不走幂等缓存)。 +func publishTrailResults(t *testing.T, env *testEnv, client *http.Client, eventID int64, tag string, + rows ...map[string]any) { + t.Helper() + if status, env2 := env.do(client, http.MethodPut, "/api/results/draft", map[string]any{ + "eventId": eventID, "requestId": tag + "-draft", "results": rows, + }, true); status != http.StatusOK { + t.Fatalf("存草稿应 200,得到 %d %+v", status, env2.Error) + } + if status, env2 := env.do(client, http.MethodPost, "/api/results/publish", + map[string]any{"eventId": eventID, "requestId": tag + "-publish"}, true); status != http.StatusOK { + t.Fatalf("发布应 200,得到 %d %+v", status, env2.Error) + } +} + +// 「发布 → 裁判发现点错、退回草稿改一遍 → 重新发布」之后,明细要能说清这条成绩被改过、 +// 最后一次因为什么改、什么时候 —— 现场观众看到的分要是解释得清的。 +// +// 同时钉住「重新发布会产生新流水行」这件事:修订痕迹跟着 (小项, 报名项) 这条线走, +// 换了流水 id 照样追得到。 +func TestBreakdownCarriesRevisionTrailAfterRepublish(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + publishTrailResults(t, env, client, ids.event, "trail-1", + map[string]any{"entryId": ids.entryA, "resultValue": 11.58, "resultText": "11.58", "unit": "s", "status": "ok"}) + items := breakdownItems(t, env, client, ids.teamA) + if len(items) != 1 { + t.Fatalf("明细行数 = %d,期望 1", len(items)) + } + firstLedger := items[0]["ledgerId"] + if got := items[0]["revisionCount"]; got != float64(0) { + t.Fatalf("刚发布、没人改过的成绩 revisionCount 应为 0,得到 %v", got) + } + if items[0]["lastRevisionAt"] != nil || items[0]["lastRevisionReason"] != nil { + t.Fatalf("没改过的成绩不该有修订时间 / 原因: %+v", items[0]) + } + + // 裁判发现成绩录错:退回草稿(写理由)→ 改成正确值 → 重新发布。 + var resultID int64 + if err := env.ev.QueryRow(`SELECT id FROM results WHERE entry_id = ?`, ids.entryA).Scan(&resultID); err != nil { + t.Fatalf("读成绩 id: %v", err) + } + if status, env2 := env.do(client, http.MethodPost, fmt.Sprintf("/api/results/%d/reopen", resultID), + map[string]any{"reason": "成绩录入笔误"}, true); status != http.StatusOK { + t.Fatalf("退回草稿应 200,得到 %d %+v", status, env2.Error) + } + publishTrailResults(t, env, client, ids.event, "trail-2", + map[string]any{"entryId": ids.entryA, "resultValue": 11.42, "resultText": "11.42", "unit": "s", + "status": "ok", "note": "成绩录入笔误"}) + + items = breakdownItems(t, env, client, ids.teamA) + if len(items) != 1 { + t.Fatalf("明细行数 = %d,期望 1", len(items)) + } + item := items[0] + if item["ledgerId"] == firstLedger { + t.Fatalf("重新发布应作废旧流水、写一条新流水(旧 id %v),得到 %v", firstLedger, item["ledgerId"]) + } + if got := item["revisionCount"]; got != float64(1) { + t.Fatalf("改过一次的成绩 revisionCount 应为 1,得到 %v(%+v)", got, item) + } + if got := item["lastRevisionReason"]; got != "成绩录入笔误" { + t.Fatalf("最后一次修订原因 = %v,期望 成绩录入笔误", got) + } + if at, ok := item["lastRevisionAt"].(string); !ok || at == "" { + t.Fatalf("最后一次修订时间应下发,得到 %v", item["lastRevisionAt"]) + } + if got := item["lastRevisedBy"]; got != "recorder" { + t.Fatalf("最后一次修订的操作人 = %v,期望 recorder", got) + } + + // 未登录访客(大屏读的就是这个接口)拿得到「被改过、什么时候、为什么」, + // 但拿不到「是谁点错的」—— 那是裁判自己看的账,与 /api/revisions 只对 recorder 开放同一口径。 + guest, _ := env.client() + items = breakdownItems(t, env, guest, ids.teamA) + if got := items[0]["revisionCount"]; got != float64(1) { + t.Fatalf("访客也该看到修订次数,得到 %v", got) + } + if got := items[0]["lastRevisionReason"]; got != "成绩录入笔误" { + t.Fatalf("访客也该看到修订原因,得到 %v", got) + } + if got := items[0]["lastRevisedBy"]; got != nil { + t.Fatalf("访客不该拿到操作人姓名,得到 %v", got) + } +} + +// 一次都没改过的成绩不能标成「已修订」——这是最要防的误报。 +// +// 两次发布之间引擎会重算名次、把 state / verified_at 重写一遍,同小项别人的成绩也在变; +// 这些都不该让一条没动过的成绩挂上角标。 +func TestBreakdownKeepsUnchangedResultUnrevised(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + publishTrailResults(t, env, client, ids.event, "trail-1", + map[string]any{"entryId": ids.entryA, "resultValue": 11.58, "resultText": "11.58", "unit": "s", "status": "ok"}, + map[string]any{"entryId": ids.entryB, "resultValue": 11.92, "resultText": "11.92", "unit": "s", "status": "ok"}) + // A 单位这条成绩一个字没改,只是把别人的成绩改了一次再发布(名次会跟着重算)。 + var resultID int64 + if err := env.ev.QueryRow(`SELECT id FROM results WHERE entry_id = ?`, ids.entryB).Scan(&resultID); err != nil { + t.Fatalf("读成绩 id: %v", err) + } + if status, env2 := env.do(client, http.MethodPost, fmt.Sprintf("/api/results/%d/reopen", resultID), + map[string]any{"reason": "计时有误"}, true); status != http.StatusOK { + t.Fatalf("退回草稿应 200,得到 %d %+v", status, env2.Error) + } + publishTrailResults(t, env, client, ids.event, "trail-2", + map[string]any{"entryId": ids.entryB, "resultValue": 11.60, "resultText": "11.60", "unit": "s", "status": "ok"}) + + items := breakdownItems(t, env, client, ids.teamA) + if len(items) != 1 { + t.Fatalf("明细行数 = %d,期望 1", len(items)) + } + for field, want := range map[string]any{ + "revisionCount": float64(0), + "lastRevisionAt": nil, + "lastRevisionReason": nil, + "lastRevisedBy": nil, + } { + if got := items[0][field]; got != want { + t.Fatalf("没改过的成绩 %s 应为 %v,得到 %v(%+v)", field, want, got, items[0]) + } + } +} + +// 破纪录加分这张流水是站在成绩旁边的另一笔分:它不继承成绩的修订痕迹。 +// 挂上去等于对外说「那笔加分被改过」,而现场改的是成绩 —— 那是误报。 +func TestBreakdownRecordBonusDoesNotInheritTrail(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + publishTrailResults(t, env, client, ids.event, "trail-1", + map[string]any{"entryId": ids.entryA, "resultValue": 11.58, "resultText": "11.58", "unit": "s", "status": "ok"}) + var resultID int64 + if err := env.ev.QueryRow(`SELECT id FROM results WHERE entry_id = ?`, ids.entryA).Scan(&resultID); err != nil { + t.Fatalf("读成绩 id: %v", err) + } + if status, env2 := env.do(client, http.MethodPost, fmt.Sprintf("/api/results/%d/reopen", resultID), + map[string]any{"reason": "成绩录入笔误"}, true); status != http.StatusOK { + t.Fatalf("退回草稿应 200,得到 %d %+v", status, env2.Error) + } + publishTrailResults(t, env, client, ids.event, "trail-2", + map[string]any{"entryId": ids.entryA, "resultValue": 11.42, "resultText": "11.42", "unit": "s", "status": "ok"}) + + // 同一报名项再挂一条破纪录加分流水(与 writeLedgerTx 产出的形态一致:带 entry_id / result_id)。 + env.exec(t, `INSERT INTO score_ledger (team_id, athlete_id, event_id, entry_id, result_id, + source_type, source_id, points, count_to_team) + VALUES (?, ?, ?, ?, ?, 'record_bonus', 1, 3, 1)`, + ids.teamA, ids.athleteA, ids.event, ids.entryA, resultID) + + items := breakdownItems(t, env, client, ids.teamA) + if len(items) != 2 { + t.Fatalf("明细行数 = %d,期望 2(成绩 + 破纪录加分)", len(items)) + } + for _, item := range items { + switch item["sourceType"] { + case "result": + if got := item["revisionCount"]; got != float64(1) { + t.Fatalf("被改过的成绩应报 1 次修订,得到 %v(%+v)", got, item) + } + case "record_bonus": + if got := item["revisionCount"]; got != nil { + t.Fatalf("破纪录加分不继承成绩的修订痕迹,得到 %v(%+v)", got, item) + } + default: + t.Fatalf("意外的来源类型: %+v", item) + } + } +} + +// 聚合流水(按队内平均)与人工调整没有「一条成绩」可追:整组字段留空,不许猜一个数字出来。 +func TestBreakdownAggregateAndAdjustmentHaveNoTrail(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + env.exec(t, `INSERT INTO score_ledger (team_id, athlete_id, event_id, entry_id, result_id, + source_type, source_id, points, count_to_team) + VALUES (?, NULL, ?, NULL, NULL, 'result', 99, 15, 1)`, ids.teamA, ids.event) + env.exec(t, `INSERT INTO score_ledger (team_id, athlete_id, event_id, entry_id, result_id, + source_type, source_id, points, count_to_team) + VALUES (?, NULL, NULL, NULL, NULL, 'adjustment', 1, 5, 1)`, ids.teamA) + + items := breakdownItems(t, env, client, ids.teamA) + if len(items) != 2 { + t.Fatalf("明细行数 = %d,期望 2", len(items)) + } + for _, item := range items { + if got := item["revisionCount"]; got != nil { + t.Fatalf("追不出来源的流水 revisionCount 应为 null,得到 %v(%+v)", got, item) + } + } +} diff --git a/server/internal/httpapi/channel_aggregate_mode_test.go b/server/internal/httpapi/channel_aggregate_mode_test.go new file mode 100644 index 0000000..8e150ce --- /dev/null +++ b/server/internal/httpapi/channel_aggregate_mode_test.go @@ -0,0 +1,157 @@ +package httpapi_test + +import ( + "fmt" + "net/http" + "strings" + "testing" +) + +// 聚合口径(通道的 aggregateMode:avg 平均 / sum 总和)的 REST 契约与端到端效果。 +// +// 契约: +// - 请求体写 sum 能存下、读回来还是 sum; +// - 不写该字段(旧客户端 / 老配置)落成缺省 avg,响应里不下发——老数据的响应体一个字节都不变; +// - 认不出的取值 400 拦下,而不是静默按 avg 处理(拼错的配置会静默改口径,现场看不出来)。 +// +// 效果:现场切换口径后重算,单位总分(此处看流水)必须按新口径走。 +func TestChannelAggregateModeSwitch(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + client := recorderClient(t, env) + + var teamProfile int64 + if err := env.ev.QueryRow(`SELECT id FROM scoring_profiles WHERE code = 'team_top6'`).Scan(&teamProfile); err != nil { + t.Fatalf("读取团体积分模板: %v", err) + } + + // 团体引体向上:A 队 2 人(10 + 1)、B 队 1 人(9)。 + // 总数:A 11 > B 9;平均:A 5.5 < B 9 —— 两种口径的名次正好互换。 + ev := env.insert(t, `INSERT INTO events (sport_id, code, name, event_type, result_mode, result_type, compare, scored, multiplier, status) + VALUES (?, 'TEAM_PULLUP', '团体引体向上', 'individual_team', 'auto', 'count', 'desc', 1, 1, 'ongoing')`, ids.sport) + cat := env.insert(t, `INSERT INTO event_categories (event_id, name, multiplier, sort_order) VALUES (?, '男子', 1, 0)`, ev) + athA1 := env.insert(t, `INSERT INTO athletes (name, gender, team_id, active) VALUES ('甲', '男', ?, 1)`, ids.teamA) + athA2 := env.insert(t, `INSERT INTO athletes (name, gender, team_id, active) VALUES ('乙', '男', ?, 1)`, ids.teamA) + entryA1 := env.insert(t, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) VALUES (?, ?, ?, ?, 'registered')`, ev, cat, ids.teamA, athA1) + entryA2 := env.insert(t, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) VALUES (?, ?, ?, ?, 'registered')`, ev, cat, ids.teamA, athA2) + entryB1 := env.insert(t, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) VALUES (?, ?, ?, ?, 'registered')`, ev, cat, ids.teamB, ids.athB) + + chans := fmt.Sprintf("/api/events/%d/channels", ev) + + // setMode 通过 REST 写通道配置;mode 为空串表示不带该字段(模拟旧客户端)。 + setMode := func(mode string) []map[string]any { + t.Helper() + channel := map[string]any{"scope": "team", "basis": "aggregate", "profileId": teamProfile, "sortOrder": 1} + if mode != "" { + channel["aggregateMode"] = mode + } + status, resp := env.do(client, http.MethodPut, chans, map[string]any{"channels": []map[string]any{channel}}, true) + if status != http.StatusOK || !resp.OK { + t.Fatalf("写通道(aggregateMode=%q)应 200,得到 %d %+v", mode, status, resp.Error) + } + return decodeData[[]map[string]any](t, resp) + } + storedMode := func() string { + t.Helper() + var mode string + if err := env.ev.QueryRow(`SELECT aggregate_mode FROM event_score_channels WHERE event_id = ? AND basis = 'aggregate'`, ev).Scan(&mode); err != nil { + t.Fatalf("读取落库的聚合口径: %v", err) + } + return mode + } + listedMode := func() (string, bool) { + t.Helper() + status, resp := env.do(client, http.MethodGet, chans, nil, false) + if status != http.StatusOK || !resp.OK { + t.Fatalf("读通道列表应 200,得到 %d %+v", status, resp.Error) + } + got := decodeData[[]map[string]any](t, resp) + raw, ok := got[0]["aggregateMode"] + if !ok { + return "", false + } + return raw.(string), true + } + teamLedger := func() map[int64]float64 { + t.Helper() + rows, err := env.ev.Query(`SELECT team_id, SUM(points) FROM score_ledger + WHERE voided = 0 AND event_id = ? GROUP BY team_id`, ev) + if err != nil { + t.Fatalf("统计单位流水: %v", err) + } + defer func() { _ = rows.Close() }() + out := make(map[int64]float64) + for rows.Next() { + var teamID int64 + var points float64 + if err := rows.Scan(&teamID, &points); err != nil { + t.Fatalf("扫描流水: %v", err) + } + out[teamID] = points + } + return out + } + + // 1) 缺省:不写 aggregateMode,落库是 avg,响应里也不下发该字段(老数据响应体不变)。 + channels := setMode("") + if _, ok := channels[0]["aggregateMode"]; ok { + t.Errorf("缺省口径(avg)不应出现在响应里,得到 %+v", channels[0]) + } + if got := storedMode(); got != "avg" { + t.Fatalf("不带 aggregateMode 落库 = %q,期望 avg", got) + } + + // 录成绩并发布:B 队平均 9 第一(15 分),A 队平均 5.5 第二(10 分)。 + status, resp := env.do(client, http.MethodPut, "/api/results/draft", map[string]any{ + "eventId": ev, + "results": []map[string]any{ + {"entryId": entryA1, "resultValue": 10, "unit": "个", "status": "ok"}, + {"entryId": entryA2, "resultValue": 1, "unit": "个", "status": "ok"}, + {"entryId": entryB1, "resultValue": 9, "unit": "个", "status": "ok"}, + }, + }, true) + if status != http.StatusOK || !resp.OK { + t.Fatalf("保存草稿应 200,得到 %d %+v", status, resp.Error) + } + status, resp = env.do(client, http.MethodPost, "/api/results/publish", map[string]any{"eventId": ev}, true) + if status != http.StatusOK || !resp.OK { + t.Fatalf("发布应 200,得到 %d %+v", status, resp.Error) + } + if got := teamLedger(); got[ids.teamB] != 15 || got[ids.teamA] != 10 { + t.Fatalf("avg 口径下单位流水 = %+v,期望 A=10 B=15", got) + } + + // 2) 现场切成总和:改通道配置即触发重算,名次互换(A 11 > B 9)。 + channels = setMode("sum") + if channels[0]["aggregateMode"] != "sum" { + t.Errorf("sum 口径应原样读回,得到 %+v", channels[0]) + } + if got := storedMode(); got != "sum" { + t.Fatalf("sum 口径落库 = %q,期望 sum", got) + } + if got, ok := listedMode(); !ok || got != "sum" { + t.Fatalf("通道列表应带 aggregateMode=sum,得到 %q(下发=%v)", got, ok) + } + if got := teamLedger(); got[ids.teamA] != 15 || got[ids.teamB] != 10 { + t.Fatalf("sum 口径下单位流水 = %+v,期望 A=15 B=10", got) + } + + // 3) 切回缺省:不带该字段保存后,口径与落到 avg 的榜都要回来。 + setMode("") + if got := teamLedger(); got[ids.teamB] != 15 || got[ids.teamA] != 10 { + t.Fatalf("切回 avg 后单位流水 = %+v,期望 A=10 B=15", got) + } + + // 4) 认不出的取值 400,且不能把已配好的口径改坏。 + status, resp = env.do(client, http.MethodPut, chans, map[string]any{ + "channels": []map[string]any{ + {"scope": "team", "basis": "aggregate", "profileId": teamProfile, "sortOrder": 1, "aggregateMode": "average"}, + }, + }, true) + if status != http.StatusBadRequest || resp.Error == nil || !strings.Contains(resp.Error.Message, "aggregateMode") { + t.Fatalf("非法聚合口径应 400 并点明 aggregateMode,得到 %d %+v", status, resp.Error) + } + if got := storedMode(); got != "avg" { + t.Fatalf("被拒的请求不应改动落库口径,得到 %q", got) + } +} diff --git a/server/internal/httpapi/dto.go b/server/internal/httpapi/dto.go index d916dce..79d986f 100644 --- a/server/internal/httpapi/dto.go +++ b/server/internal/httpapi/dto.go @@ -56,6 +56,10 @@ type channelDTO struct { Basis string `json:"basis"` ProfileID int64 `json:"profileId"` SortOrder int `json:"sortOrder"` + // AggregateMode 是 basis=aggregate 通道的汇总口径:avg 按成员平均 / sum 按成员总和。 + // 请求体里缺省(空串)按 avg 处理,不带该字段的旧客户端保存通道时口径不变。 + // 响应里只下发非缺省值(sum);缺省(avg)不下发,老数据的响应体因此一个字节都不变。 + AggregateMode string `json:"aggregateMode,omitempty"` // CountToTeam 决定该通道产出的流水是否计入单位总分;请求体里缺省(null)按 true 处理, // 「个人+团体」项目的个人通道传 false。响应里始终是具体值。 CountToTeam *bool `json:"countToTeam"` @@ -188,6 +192,16 @@ type breakdownItemDTO struct { ResultText *string `json:"resultText"` Points float64 `json:"points"` CreatedAt string `json:"createdAt"` + + // 修订痕迹(口径见 internal/revisions):这条成绩发布之后被改过几次、最后一次因为什么改、什么时候。 + // + // 三个字段一起看:RevisionCount 为 nil 表示**追不出来**(没有版本基线),为 0 表示追出来了、 + // 确实没改过;前端只在 > 0 时显示「已修订 ×N」角标。宁可为空也不误报。 + // LastRevisionReason / LastRevisedBy 都可能为 nil:现场没写原因、操作人已删号时就是空的。 + RevisionCount *int `json:"revisionCount"` + LastRevisionAt *string `json:"lastRevisionAt"` + LastRevisionReason *string `json:"lastRevisionReason"` + LastRevisedBy *string `json:"lastRevisedBy"` } type teamBreakdownDTO struct { diff --git a/server/internal/httpapi/dual_channel_publish_test.go b/server/internal/httpapi/dual_channel_publish_test.go new file mode 100644 index 0000000..7730461 --- /dev/null +++ b/server/internal/httpapi/dual_channel_publish_test.go @@ -0,0 +1,200 @@ +package httpapi_test + +import ( + "database/sql" + "fmt" + "net/http" + "testing" +) + +// 本文件钉住工单 A-1 / A-2 两条「同一份数据发布两次结果不同」的失败场景。 +// 两者的共同根因是 results.rank 一列身兼两职——它既是自动算出的个人名次的回写位, +// 又是人工名次的录入位: +// +// A-1:团体报名项(athlete_id 为空)的 results.rank 被个人通道自动回写, +// 下一次发布时又被团体手工通道的兜底读成「团体名次」,团体分凭空多出一份 +// (发布 #1 得 10/8/6,发布 #2 变 25/18/14); +// A-2:[athlete,result] 与 [athlete,manual] 共存时,自动名次覆盖人工名次, +// 人工通道的输入被就地改写 → 第二次发布才算对(发布 #1 得 18 分、#2 得 20 分)。 + +// seedDualChannelTeamEvent 建工单 A-1 的形态:team 类型小项 + 3 条团体报名项 +// (athlete_id 为空,正是《报名名单导入规范》要求的团体项目填法)+ 双通道 +// [athlete/result, team/manual](自带规则包曾给 TEAM_PULLUP 配的就是这两条)。 +func seedDualChannelTeamEvent(t *testing.T, env *testEnv, ids seedIDs) (eventID, categoryID int64, entries []int64) { + t.Helper() + eventID = env.insert(t, `INSERT INTO events (sport_id, code, name, event_type, result_mode, result_type, + compare, scored, multiplier, status) + VALUES (?, 'EMIX', '混合配置试验', 'team', 'auto', 'count', 'desc', 1, 1, 'ongoing')`, ids.sport) + categoryID = env.insert(t, `INSERT INTO event_categories (event_id, name, multiplier, sort_order) + VALUES (?, '男子', 1, 0)`, eventID) + env.exec(t, `INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order) + VALUES (?, 'athlete', 'result', ?, 0)`, eventID, profileIDByCode(t, env, "individual_top6")) + env.exec(t, `INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order) + VALUES (?, 'team', 'manual', ?, 1)`, eventID, profileIDByCode(t, env, "team_top6")) + + teamC := env.insert(t, `INSERT INTO teams (code, name, short_name, sort_order, active) + VALUES ('C', '第三分公司', '三司', 2, 1)`) + for _, teamID := range []int64{ids.teamA, ids.teamB, teamC} { + entries = append(entries, env.insert(t, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) + VALUES (?, ?, ?, NULL, 'registered')`, eventID, categoryID, teamID)) + } + return eventID, categoryID, entries +} + +// resultRank 读一条成绩的手工名次(NULL 与 0 都表示「没填」)。 +func resultRank(t *testing.T, env *testEnv, entryID int64) int { + t.Helper() + var rank sql.NullInt64 + if err := env.ev.QueryRow(`SELECT rank FROM results WHERE entry_id = ?`, entryID).Scan(&rank); err != nil { + t.Fatalf("读报名项 %d 的名次: %v", entryID, err) + } + if !rank.Valid { + return 0 + } + return int(rank.Int64) +} + +// resultRanksDump 导出某小项每条成绩的手工名次,用于断言「自动名次有没有被写回 results.rank」。 +func resultRanksDump(t *testing.T, env *testEnv, eventID int64) string { + t.Helper() + return tableDump(t, env, fmt.Sprintf(`SELECT entry_id, COALESCE(rank, 0) AS rank, COALESCE(result_value, 0) AS value + FROM results WHERE event_id = %d ORDER BY entry_id`, eventID)) +} + +// A-1:团体报名项 + 双通道,连发 1~3 次必须逐字节一致。 +func TestPublishTwiceWithTeamEntryAndDualChannelIsIdempotent(t *testing.T) { + env, ids, client := recorderWithSeed(t) + eventID, _, entries := seedDualChannelTeamEvent(t, env, ids) + + publishResults(t, env, client, eventID, "a1-p1", + map[string]any{"entryId": entries[0], "resultValue": 90, "resultText": "90", "unit": "次", "status": "ok"}, + map[string]any{"entryId": entries[1], "resultValue": 80, "resultText": "80", "unit": "次", "status": "ok"}, + map[string]any{"entryId": entries[2], "resultValue": 70, "resultText": "70", "unit": "次", "status": "ok"}, + ) + + // 团体报名项的 results.rank 是「单位名次」的录入位(团体手工通道的兜底来源), + // 个人通道算出的自动名次不许写进去——写进去第二次发布就会被当成团体名次再发一遍分。 + if n := countRows(t, env, `SELECT COUNT(*) FROM results WHERE event_id = ? AND rank IS NOT NULL`, eventID); n != 0 { + t.Fatalf("团体报名项的 results.rank 被自动名次回写,得到 %d 行:\n%s", n, resultRanksDump(t, env, eventID)) + } + if total := activeLedgerTotal(t, env); total != 24 { + t.Fatalf("首次发布应只有个人通道的 10+8+6=24 分(团体名次未录),得到 %v", total) + } + + ledgerFirst := ledgerActiveDump(t, env) + ranksFirst := channelRanksDump(t, env) + for _, tag := range []string{"a1-p2", "a1-p3"} { + publishEvent(t, env, client, eventID, tag) + if total := activeLedgerTotal(t, env); total != 24 { + t.Fatalf("%s:重复发布后合计应为 24(团体手工通道没有名次可发),得到 %v", tag, total) + } + if got := ledgerActiveDump(t, env); got != ledgerFirst { + t.Fatalf("%s:同一份数据重复发布流水应完全一致:\n第一次 %s\n本次 %s", tag, ledgerFirst, got) + } + if got := channelRanksDump(t, env); got != ranksFirst { + t.Fatalf("%s:同一份数据重复发布名次应完全一致:\n第一次 %s\n本次 %s", tag, ranksFirst, got) + } + } +} + +// A-2:同一 result 同时被「自动名次通道」与「人工名次通道」消费时,人工名次不被覆盖。 +func TestManualAthleteRankNotOverwrittenByComputedRank(t *testing.T) { + env, ids, client := recorderWithSeed(t) + // 在既有的 [athlete,result] 之外再加一条 [athlete,manual](唯一约束按 scope+basis 允许共存)。 + env.exec(t, `INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order) + VALUES (?, 'athlete', 'manual', ?, 1)`, ids.event, profileIDByCode(t, env, "individual_top6")) + + // 成绩 30 / 29(compare=asc:数值小的靠前)→ 自动名次本该是 乙1 第 1、甲1 第 2; + // 人工名次反着填(甲1 第 1、乙1 第 2),两次发布都必须按人工名次算。 + publishResults(t, env, client, ids.event, "a2-p1", + map[string]any{"entryId": ids.entryA, "resultValue": 30, "resultText": "30", "unit": "次", "status": "ok", "rank": 1}, + map[string]any{"entryId": ids.entryB, "resultValue": 29, "resultText": "29", "unit": "次", "status": "ok", "rank": 2}, + ) + + if rankA, rankB := resultRank(t, env, ids.entryA), resultRank(t, env, ids.entryB); rankA != 1 || rankB != 2 { + t.Fatalf("人工名次被自动名次覆盖:甲1=%d、乙1=%d,期望 1 / 2", rankA, rankB) + } + // 自动通道 8/10 + 人工通道 10/8:A 18 分、B 18 分。 + if got := teamPoints(t, env, client, ids.teamA); got != 18 { + t.Fatalf("首次发布后 A 应为 18 分(自动 8 + 人工 10),得到 %v", got) + } + + ledgerFirst := ledgerActiveDump(t, env) + ranksFirst := channelRanksDump(t, env) + for _, tag := range []string{"a2-p2", "a2-p3"} { + publishEvent(t, env, client, ids.event, tag) + if rankA := resultRank(t, env, ids.entryA); rankA != 1 { + t.Fatalf("%s:人工名次又被改写,甲1=%d,期望 1", tag, rankA) + } + if got := teamPoints(t, env, client, ids.teamA); got != 18 { + t.Fatalf("%s:重复发布后 A 应仍为 18 分,得到 %v", tag, got) + } + if got := ledgerActiveDump(t, env); got != ledgerFirst { + t.Fatalf("%s:同一份数据重复发布流水应完全一致:\n第一次 %s\n本次 %s", tag, ledgerFirst, got) + } + if got := channelRanksDump(t, env); got != ranksFirst { + t.Fatalf("%s:同一份数据重复发布名次应完全一致:\n第一次 %s\n本次 %s", tag, ranksFirst, got) + } + } +} + +// 修 A-1 时不能把「team + basis=result」这条路的团体名次一起修断: +// 纯团体项目的团体名次(从 channel_ranks 读)必须照旧产出。 +func TestTeamResultChannelStillRanksTeams(t *testing.T) { + env, ids, client := recorderWithSeed(t) + eventID, categoryID, teamEntry := seedTeamEvent(t, env, ids) + + publishResults(t, env, client, eventID, "team-result", + map[string]any{"entryId": teamEntry, "resultValue": 45.20, "resultText": "45.20", "unit": "s", "status": "ok"}, + ) + if n := countRows(t, env, `SELECT COUNT(*) FROM channel_ranks + WHERE event_id = ? AND category_id = ? AND scope = 'team' AND basis = 'result' AND rank = 1`, + eventID, categoryID); n != 1 { + t.Fatalf("纯团体项目(team + basis=result)应产出团体名次,得到 %d 行:%s", n, channelRanksDump(t, env)) + } + if got := teamPoints(t, env, client, ids.teamA); got != 15 { + t.Fatalf("纯团体项目 A 应得 15 分,得到 %v", got) + } + publishEvent(t, env, client, eventID, "team-result-again") + if got := teamPoints(t, env, client, ids.teamA); got != 15 { + t.Fatalf("重复发布后 A 应仍为 15 分,得到 %v", got) + } + if n := countRows(t, env, `SELECT COUNT(*) FROM score_ledger WHERE voided = 0`); n != 1 { + t.Fatalf("纯团体项目应只有 1 条流水,得到 %d 条:%s", n, ledgerActiveDump(t, env)) + } +} + +// 团队手工名次(channel_manual_ranks)与团体报名项兜底两条来源并存时,以录入的团体名次为准; +// 个人通道的自动名次不得插进团体名次的来源。 +func TestTeamManualRanksSurviveComputedRankWriteback(t *testing.T) { + env, ids, client := recorderWithSeed(t) + eventID, categoryID, entries := seedDualChannelTeamEvent(t, env, ids) + + if status, env2 := putTeamRanks(t, env, client, eventID, categoryID, []map[string]any{ + {"teamId": ids.teamA, "rank": 1}, + {"teamId": ids.teamB, "rank": 2}, + }); status != http.StatusOK { + t.Fatalf("写团体名次应 200,得到 %d %+v", status, env2.Error) + } + + publishResults(t, env, client, eventID, "a1-manual", + map[string]any{"entryId": entries[0], "resultValue": 90, "resultText": "90", "unit": "次", "status": "ok"}, + map[string]any{"entryId": entries[1], "resultValue": 80, "resultText": "80", "unit": "次", "status": "ok"}, + map[string]any{"entryId": entries[2], "resultValue": 70, "resultText": "70", "unit": "次", "status": "ok"}, + ) + // 个人通道 10/8/6 + 团体手工名次 15/10。 + if total := activeLedgerTotal(t, env); total != 24+25 { + t.Fatalf("首次发布合计应为 49(24 个人 + 25 团体),得到 %v", total) + } + ledgerFirst := ledgerActiveDump(t, env) + publishEvent(t, env, client, eventID, "a1-manual-again") + if total := activeLedgerTotal(t, env); total != 49 { + t.Fatalf("重复发布后合计应仍为 49,得到 %v", total) + } + if got := ledgerActiveDump(t, env); got != ledgerFirst { + t.Fatalf("流水应完全一致:\n第一次 %s\n本次 %s", ledgerFirst, got) + } + if got := teamPoints(t, env, client, ids.teamA); got != 10+15 { + t.Fatalf("A 应为个人 10 + 团体 15 = 25 分,得到 %v", got) + } +} diff --git a/server/internal/httpapi/event_delete_ledger_test.go b/server/internal/httpapi/event_delete_ledger_test.go new file mode 100644 index 0000000..ba8c59d --- /dev/null +++ b/server/internal/httpapi/event_delete_ledger_test.go @@ -0,0 +1,142 @@ +package httpapi_test + +import ( + "fmt" + "net/http" + "testing" +) + +// 本文件钉住审查 01 的 P0:删除小项必须让它的积分流水一起离榜。 +// +// 现场形态是「球类那种」小项——纯团体、名次按单位直接录进 channel_manual_ranks, +// 一条报名项都没有。这种小项正是唯一能被 DELETE /api/events/{id} 删掉、却又在榜上有分的东西: +// 有报名数据的小项会被守卫拦下(见 TestDeleteEventStillBlockedByEntries)。 + +// seedTeamManualOnlyEvent 建一个「只有团体名次、没有报名数据」的小项:纯团体 + 一个组别 + +// 一条 scope=team/basis=manual 通道,不建任何 entries(有 entries 就删不掉了)。 +func seedTeamManualOnlyEvent(t *testing.T, env *testEnv, ids seedIDs) (eventID, categoryID int64) { + t.Helper() + eventID = env.insert(t, `INSERT INTO events (sport_id, code, name, event_type, result_mode, result_type, + compare, scored, multiplier, status) + VALUES (?, 'BASKET', '篮球', 'team', 'manual', 'score', 'desc', 1, 1, 'ongoing')`, ids.sport) + categoryID = env.insert(t, `INSERT INTO event_categories (event_id, name, multiplier, sort_order) + VALUES (?, '男子', 1, 0)`, eventID) + addTeamManualChannel(t, env, eventID) + return eventID, categoryID +} + +// standingsRaw 取积分榜原始响应体(逐字节比较用,比逐字段断言更严格)。 +func standingsRaw(t *testing.T, env *testEnv, client *http.Client) string { + t.Helper() + status, env2 := env.do(client, http.MethodGet, "/api/standings", nil, false) + if status != http.StatusOK || !env2.OK { + t.Fatalf("读积分榜应 200,得到 %d %+v", status, env2.Error) + } + return string(env2.Data) +} + +// P0 回归:删掉「只有团体名次、没有报名数据」的小项后,它的流水必须被作废、榜单必须跟着变。 +// +// 修之前:DELETE 返回 200,但流水只是被外键置空 event_id(voided 仍是 0), +// 分数永久留在榜上,此后任何按 event_id 的重算都打不到这些行(审查 01 的实测证据)。 +func TestDeleteEventVoidsTeamManualLedgerAndRepushesStandings(t *testing.T) { + env, ids, client := recorderWithSeed(t) + + // 基线:还没有这个小项时的榜单,删除后必须逐字节回到这里。 + baseline := standingsRaw(t, env, client) + + eventID, categoryID := seedTeamManualOnlyEvent(t, env, ids) + // 名次是现场直接按单位录的,没有报名项也没有成绩行;录入即重算,分当场进榜。 + if status, env2 := putTeamRanks(t, env, client, eventID, categoryID, []map[string]any{ + {"teamId": ids.teamA, "rank": 1}, + {"teamId": ids.teamB, "rank": 2}, + }); status != http.StatusOK || !env2.OK { + t.Fatalf("写团体名次应 200,得到 %d %+v", status, env2.Error) + } + + // 前置条件:删除前这个小项确实在榜上有分,否则这条用例证明不了任何事。 + if n := countRows(t, env, `SELECT COUNT(*) FROM score_ledger WHERE event_id = ? AND voided = 0`, eventID); n != 2 { + t.Fatalf("前置条件:小项应有 2 条有效流水,得到 %d 条:%s", n, ledgerActiveDump(t, env)) + } + if got := teamPoints(t, env, client, ids.teamA); got != 15 { + t.Fatalf("前置条件:A 总分应为 15,得到 %v", got) + } + if got := teamPoints(t, env, client, ids.teamB); got != 10 { + t.Fatalf("前置条件:B 总分应为 10,得到 %v", got) + } + if gold := teamGold(t, env, client, ids.teamA); gold != 1 { + t.Fatalf("前置条件:A 应有 1 金,得到 %d", gold) + } + standingsBefore := standingsChangeRows(t, env) + + status, env2 := env.do(client, http.MethodDelete, fmt.Sprintf("/api/events/%d", eventID), nil, true) + if status != http.StatusOK || !env2.OK { + t.Fatalf("删除小项应 200,得到 %d %+v", status, env2.Error) + } + + // 1) 流水是作废(保留行 + 作废原因),不是没有痕迹地消失。 + if n := countRows(t, env, `SELECT COUNT(*) FROM score_ledger WHERE voided = 0`); n != 0 { + t.Fatalf("删除后不该还有有效流水(孤儿会永久留在榜上),得到 %d 条:%s", n, ledgerActiveDump(t, env)) + } + if n := countRows(t, env, `SELECT COUNT(*) FROM score_ledger + WHERE voided = 1 AND void_reason = '小项删除,本小项积分流水一并作废'`); n != 2 { + t.Fatalf("应留下 2 条带作废原因的流水作为审计痕迹,得到 %d 条", n) + } + // 作废行此刻的 event_id 已被外键置空:能作废成功本身就说明 UPDATE 排在 DELETE FROM events 之前, + // 顺序反了这里就是 0 条(上面两条断言会先失败)。 + if n := countRows(t, env, `SELECT COUNT(*) FROM score_ledger WHERE event_id IS NULL AND voided = 1`); n != 2 { + t.Fatalf("作废行应保留下来(event_id 置空),得到 %d 条", n) + } + + // 2) 榜单不再受它影响:分数、奖牌、名次全部回到建这个小项之前的形态。 + if after := standingsRaw(t, env, client); after != baseline { + t.Fatalf("删除后榜单应逐字节回到该小项存在之前:\n之前 %s\n之后 %s", baseline, after) + } + if got := teamPoints(t, env, client, ids.teamA); got != 0 { + t.Fatalf("删除后 A 不该再有分,得到 %v", got) + } + if got := teamPoints(t, env, client, ids.teamB); got != 0 { + t.Fatalf("删除后 B 不该再有分,得到 %v", got) + } + if gold := teamGold(t, env, client, ids.teamA); gold != 0 { + t.Fatalf("删除后 A 不该再有金牌,得到 %d", gold) + } + + // 3) 派生数据随之消失(外键级联),下钻不会再列出一堆查不到出处的名次。 + if n := countRows(t, env, `SELECT COUNT(*) FROM channel_ranks WHERE event_id = ?`, eventID); n != 0 { + t.Fatalf("删除小项后 channel_ranks 应随外键级联清空,得到 %d 行", n) + } + if n := countRows(t, env, `SELECT COUNT(*) FROM channel_manual_ranks WHERE event_id = ?`, eventID); n != 0 { + t.Fatalf("删除小项后 channel_manual_ranks 应随外键级联清空,得到 %d 行", n) + } + + // 4) 榜单变了就必须推给大屏:只有 events void 一条信号时,大屏会一直停在旧分上。 + if after := standingsChangeRows(t, env); after <= standingsBefore { + t.Fatalf("删除小项应推一次 standings:之前 %d 条,之后 %d 条", standingsBefore, after) + } + if n := changeLogCount(t, env, "events", "void"); n != 1 { + t.Fatalf("删除小项应照旧写 1 条 events void 变更,得到 %d 条", n) + } +} + +// 守卫没被改动:有报名数据的小项仍然删不掉,且被拦下时一条流水都不许作废。 +func TestDeleteEventStillBlockedByEntries(t *testing.T) { + env, ids, client := recorderWithSeed(t) + publishResults(t, env, client, ids.event, "guard", + map[string]any{"entryId": ids.entryA, "resultValue": 11.58, "resultText": "11.58", "unit": "s", "status": "ok"}, + map[string]any{"entryId": ids.entryB, "resultValue": 11.92, "resultText": "11.92", "unit": "s", "status": "ok"}, + ) + ledgerBefore := ledgerActiveDump(t, env) + standingsBefore := standingsRaw(t, env, client) + + status, env2 := env.do(client, http.MethodDelete, fmt.Sprintf("/api/events/%d", ids.event), nil, true) + if status != http.StatusConflict || env2.Error == nil || env2.Error.Code != "CONFLICT" { + t.Fatalf("有报名数据的小项应 409 且报错可读,得到 %d %+v", status, env2.Error) + } + if after := ledgerActiveDump(t, env); after != ledgerBefore { + t.Fatalf("被拦下的删除不该动作何流水:\n之前 %s\n之后 %s", ledgerBefore, after) + } + if after := standingsRaw(t, env, client); after != standingsBefore { + t.Fatalf("被拦下的删除不该动榜单:\n之前 %s\n之后 %s", standingsBefore, after) + } +} diff --git a/server/internal/httpapi/last_place_zero_e2e_test.go b/server/internal/httpapi/last_place_zero_e2e_test.go new file mode 100644 index 0000000..9d129aa --- /dev/null +++ b/server/internal/httpapi/last_place_zero_e2e_test.go @@ -0,0 +1,61 @@ +package httpapi_test + +import ( + "net/http" + "testing" +) + +// 末位归零的端到端回归(任务 F):现场模板勾着 last_place_zero=1,7 人里三人并列第 5 +// (占 5/6/7)时,第 5 名的 2 分与第 6 名的 1 分不该被一起抹掉——修复前这里是 10/8/6/3/**0/0/0**。 +// 走的是真实接口:存草稿 → 发布 → 写 score_ledger → 积分榜,覆盖引擎之外的那一段。 +func TestLastPlaceZeroTieCrossingKeepsEarnedPointsE2E(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + // 现场模板勾着「末位归零」。 + env.exec(t, `UPDATE scoring_profiles SET last_place_zero = 1 WHERE code = 'individual_top6'`) + + // 补 5 个单位 + 7 条报名项(A、B 用 seed 的)。 + entries := []int64{ids.entryA, ids.entryB} + codes := []string{"A", "B", "C", "D", "E", "F", "G"} + for i := 2; i < 7; i++ { + teamID := env.insert(t, `INSERT INTO teams (code, name, short_name, sort_order, active) VALUES (?, ?, ?, ?, 1)`, + codes[i], "单位"+codes[i], codes[i], i) + athleteID := env.insert(t, `INSERT INTO athletes (name, gender, team_id, active) VALUES (?, '男', ?, 1)`, "选手"+codes[i], teamID) + entryID := env.insert(t, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) + VALUES (?, ?, ?, ?, 'registered')`, ids.event, ids.category, teamID, athleteID) + entries = append(entries, entryID) + } + + // 成绩 1,2,3,4,5,5,5 → 名次 1,2,3,4,5,5,5(三人并列第 5,占 5/6/7)。 + values := []float64{1, 2, 3, 4, 5, 5, 5} + results := make([]map[string]any, 0, len(entries)) + for i, entryID := range entries { + results = append(results, map[string]any{"entryId": entryID, "resultValue": values[i], "status": "ok"}) + } + if status, env2 := env.do(client, http.MethodPut, "/api/results/draft", + map[string]any{"eventId": ids.event, "results": results}, true); status != http.StatusOK || !env2.OK { + t.Fatalf("保存草稿应 200,得到 %d %+v", status, env2.Error) + } + if status, env2 := env.do(client, http.MethodPost, "/api/results/publish", + map[string]any{"eventId": ids.event}, true); status != http.StatusOK || !env2.OK { + t.Fatalf("发布应 200,得到 %d %+v", status, env2.Error) + } + + _, env2 := env.do(client, http.MethodGet, "/api/standings", nil, false) + points := map[string]float64{} + for _, row := range decodeData[[]map[string]any](t, env2) { + points[row["teamCode"].(string)] = row["totalPoints"].(float64) + } + // 个人前六名表 10/8/6/3/2/1:三个并列第 5 的单位都拿第 5 名的 2 分,末位那一档(第 7 名) + // 本来就没配分,所以这里看不到任何「被归零」的痕迹。 + want := map[string]float64{"A": 10, "B": 8, "C": 6, "D": 3, "E": 2, "F": 2, "G": 2} + for code, w := range want { + if points[code] != w { + t.Errorf("单位 %s 总分 = %v,期望 %v(完整:%v)", code, points[code], w, points) + } + } +} diff --git a/server/internal/httpapi/profile_award_ranks_overflow_test.go b/server/internal/httpapi/profile_award_ranks_overflow_test.go new file mode 100644 index 0000000..2709548 --- /dev/null +++ b/server/internal/httpapi/profile_award_ranks_overflow_test.go @@ -0,0 +1,250 @@ +package httpapi_test + +import ( + "fmt" + "net/http" + "strings" + "testing" +) + +// 本文件钉住工单 E 的失败场景:「分值表档位」与「录取档位数(awardRanks)」不一致时的静默截断。 +// +// 算分引擎只在 award_ranks > 0 时按名次截断(domain/scoring.go 的 basePoints), +// 而保存模板(repo.go 的 replaceProfileRules)原先只看名次是否重复、是否 >= 1, +// 从不看两边的档位数是否对得上:配到第 7 档、录取名次还留着 6 时,7 档照样落库—— +// 模板页上第 7 档写着 2 分,榜上恒为 0 分,界面上看不出任何异常(审查 01 P1)。 +// 现在保存与规则包导入两条路都在写入前拒收,并给出同一句人话说明。 +// awardRanks = 0 表示不按名次封顶(既有语义):必须继续放行,且第 7 档真能得分。 + +// sevenRankRules 是配到第 7 档的分值表(第 7 档 2 分);与前六档分值互不相同,便于按分数定位名次。 +func sevenRankRules() []map[string]any { + return []map[string]any{ + {"rank": 1, "points": 10}, {"rank": 2, "points": 8}, {"rank": 3, "points": 6}, + {"rank": 4, "points": 5}, {"rank": 5, "points": 4}, {"rank": 6, "points": 3}, + {"rank": 7, "points": 2}, + } +} + +// sixRankRules 是种子模板 individual_top6 的现行六档分值表,用于对照「正好覆盖」。 +func sixRankRules() []map[string]any { + return sevenRankRules()[:6] +} + +// addIndividualEntries 给种子小项补 n 个运动员与报名项,返回新增的报名项 id +// (个人项目一人一条,沿用种子里的单位与组别)。 +func addIndividualEntries(t *testing.T, env *testEnv, ids seedIDs, n int) []int64 { + t.Helper() + out := make([]int64, 0, n) + for i := 0; i < n; i++ { + athlete := env.insert(t, `INSERT INTO athletes (name, gender, team_id, active) VALUES (?, '男', ?, 1)`, + fmt.Sprintf("补录%d", i), ids.teamA) + out = append(out, env.insert(t, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) + VALUES (?, ?, ?, ?, 'registered')`, ids.event, ids.category, ids.teamA, athlete)) + } + return out +} + +// 甲:分值表配到第 7 档、录取名次只到 6 → 新建与更新都必须拒绝,且库里一个字节都不动。 +func TestProfileAwardRanksMustCoverRuleRanks(t *testing.T) { + env, _, client := recorderWithSeed(t) + + // 新建:改前是 200 + 7 档全落库(第 7 档永远算 0 分)。 + status, resp := env.do(client, http.MethodPost, "/api/scoring-profiles", map[string]any{ + "code": "P-TRUNC", "name": "录取六档配到七档", "awardRanks": 6, "rules": sevenRankRules(), + }, true) + if status != http.StatusBadRequest || resp.Error == nil || resp.Error.Code != "VALIDATION_FAILED" { + t.Fatalf("awardRanks=6 + 第 7 档应 400 VALIDATION_FAILED,得到 %d %+v", status, resp.Error) + } + // 文案要能让现场自己改:点明超出的档位、当前录取名次、以及「0 表示不封顶」这个出口。 + for _, want := range []string{"第 7 档", "第 6 档", "0 表示不按名次封顶"} { + if !strings.Contains(resp.Error.Message, want) { + t.Fatalf("400 文案里缺少 %q:%q", want, resp.Error.Message) + } + } + if n := countRows(t, env, `SELECT COUNT(*) FROM scoring_profiles WHERE code = 'P-TRUNC'`); n != 0 { + t.Fatalf("被拒的模板不该落库,得到 %d 行", n) + } + + // 更新:带上同一份七档分值表,同样拒绝,且模板姓名次表都不许改。 + before := profileRuleRanks(t, env, client, 1) + status, resp = env.do(client, http.MethodPut, "/api/scoring-profiles/1", map[string]any{ + "code": "individual_top6", "name": "个人项目前六名", "awardRanks": 6, "rules": sevenRankRules(), + }, true) + if status != http.StatusBadRequest || resp.Error == nil || resp.Error.Code != "VALIDATION_FAILED" { + t.Fatalf("更新成 7 档应 400 VALIDATION_FAILED,得到 %d %+v", status, resp.Error) + } + if !strings.Contains(resp.Error.Message, "第 7 档") { + t.Fatalf("更新路径的 400 文案也应点明超出的档位,得到 %q", resp.Error.Message) + } + if after := profileRuleRanks(t, env, client, 1); len(after) != len(before) { + t.Fatalf("被拒的更新不该改名次表,得到 %v → %v", before, after) + } + + // 更新但**不带** rules:只把录取名次调小,一样会把库里已有的第 6 档截断,同样要拦。 + status, resp = env.do(client, http.MethodPut, "/api/scoring-profiles/1", map[string]any{ + "code": "individual_top6", "name": "个人项目前六名", "awardRanks": 5, + }, true) + if status != http.StatusBadRequest || resp.Error == nil || resp.Error.Code != "VALIDATION_FAILED" { + t.Fatalf("把 awardRanks 调小到 5 应 400 VALIDATION_FAILED,得到 %d %+v", status, resp.Error) + } + if !strings.Contains(resp.Error.Message, "第 6 档") { + t.Fatalf("文案应点明库里已有的超档档位,得到 %q", resp.Error.Message) + } + var stored int + if err := env.ev.QueryRow(`SELECT award_ranks FROM scoring_profiles WHERE id = 1`).Scan(&stored); err != nil { + t.Fatalf("读录取名次: %v", err) + } + if stored != 6 { + t.Fatalf("被拒的更新不该改录取名次,得到 %d", stored) + } + + // 对照:正好覆盖(第 6 档 + awardRanks=6)与不封顶(第 7 档 + awardRanks=0)都必须放行。 + if status, resp = env.do(client, http.MethodPut, "/api/scoring-profiles/1", map[string]any{ + "code": "individual_top6", "name": "个人项目前六名", "awardRanks": 6, "rules": sixRankRules(), + }, true); status != http.StatusOK || !resp.OK { + t.Fatalf("正好覆盖应 200,得到 %d %+v", status, resp.Error) + } + if status, resp = env.do(client, http.MethodPost, "/api/scoring-profiles", map[string]any{ + "code": "P-UNCAPPED", "name": "不封顶前七名", "awardRanks": 0, "rules": sevenRankRules(), + }, true); status != http.StatusOK || !resp.OK { + t.Fatalf("awardRanks=0 + 第 7 档应 200,得到 %d %+v", status, resp.Error) + } +} + +// 乙:awardRanks=0 表示不封顶——保存要成功,而且第 7 档必须**真能得分**。 +// 这条走完整链路(保存模板 → 把它挂到小项的计分通道 → 录 7 条成绩 → 发布 → 读流水), +// 只测校验函数的话,说不出「第 7 档到底算不算分」。 +func TestProfileAwardRanksZeroScoresSeventhPlace(t *testing.T) { + env, ids, client := recorderWithSeed(t) + + status, resp := env.do(client, http.MethodPost, "/api/scoring-profiles", map[string]any{ + "code": "P-UNCAPPED", "name": "不封顶前七名", "awardRanks": 0, "rules": sevenRankRules(), + }, true) + if status != http.StatusOK || !resp.OK { + t.Fatalf("awardRanks=0 + 第 7 档应保存成功,得到 %d %+v", status, resp.Error) + } + saved := decodeData[map[string]any](t, resp) + profileID := int64(saved["id"].(float64)) + if saved["awardRanks"] != float64(0) { + t.Fatalf("awardRanks=0 应原样落库,得到 %v", saved["awardRanks"]) + } + if ranks := profileRuleRanks(t, env, client, profileID); len(ranks) != 7 { + t.Fatalf("7 档分值表应全部保留,得到 %v", ranks) + } + + env.exec(t, `UPDATE event_score_channels SET profile_id = ? WHERE event_id = ?`, profileID, ids.event) + extra := addIndividualEntries(t, env, ids, 5) + // 成绩按录入顺序递增,7 人正好排出第 1~7 名(第 7 名成绩最差)。 + publishResults(t, env, client, ids.event, "award-uncapped", + map[string]any{"entryId": ids.entryA, "resultValue": 10, "resultText": "10", "unit": "秒", "status": "ok"}, + map[string]any{"entryId": ids.entryB, "resultValue": 11, "resultText": "11", "unit": "秒", "status": "ok"}, + map[string]any{"entryId": extra[0], "resultValue": 12, "resultText": "12", "unit": "秒", "status": "ok"}, + map[string]any{"entryId": extra[1], "resultValue": 13, "resultText": "13", "unit": "秒", "status": "ok"}, + map[string]any{"entryId": extra[2], "resultValue": 14, "resultText": "14", "unit": "秒", "status": "ok"}, + map[string]any{"entryId": extra[3], "resultValue": 15, "resultText": "15", "unit": "秒", "status": "ok"}, + map[string]any{"entryId": extra[4], "resultValue": 16, "resultText": "16", "unit": "秒", "status": "ok"}, + ) + + // 七个名次各拿一档分:第 7 名拿到 2 分就证明第 7 档没被截断。 + want := []struct { + entry int64 + points []float64 + }{ + {ids.entryA, []float64{10}}, + {ids.entryB, []float64{8}}, + {extra[0], []float64{6}}, + {extra[1], []float64{5}}, + {extra[2], []float64{4}}, + {extra[3], []float64{3}}, + {extra[4], []float64{2}}, + } + for i, tc := range want { + if pts := activeLedgerPoints(t, env, tc.entry); !equalFloats(pts, tc.points) { + t.Fatalf("第 %d 名的报名项 %d 应得 %v 分,得到 %v", i+1, tc.entry, tc.points, pts) + } + } +} + +// 规则包导入路径同一口径:YAML 里的 awardRanks 与 profiles[].rules 不一致时, +// 导入必须整体拒收(改前会安静导入,第 7 档在库里永远算 0 分)。 +func TestRulesImportRejectsAwardRanksOverflow(t *testing.T) { + env := newTestEnv(t) + client := adminClient(t, env) + + const pack = `format: scoreboard-rules +formatVersion: 1 +meta: { code: award-overflow, name: 第 7 档超出录取名次 } +standings: + individualToTeamWeight: 1 + tieBreak: [points, gold, silver, bronze, teamCode] +profiles: + - code: individual_top6 + name: 个人项目前六名 + awardRanks: 6 + tieMode: skip + rules: + - { rank: 1, points: 10 } + - { rank: 2, points: 8 } + - { rank: 3, points: 6 } + - { rank: 4, points: 5 } + - { rank: 5, points: 4 } + - { rank: 6, points: 3 } + - { rank: 7, points: 2 } +channelTemplates: + - match: { eventType: individual } + channels: + - { scope: athlete, basis: result, profile: individual_top6 } +` + before := countRows(t, env, `SELECT COUNT(*) FROM scoring_profile_rules r + JOIN scoring_profiles p ON p.id = r.profile_id WHERE p.code = 'individual_top6'`) + status, raw := env.doRaw(client, http.MethodPost, "/api/rules/import", []byte(pack), "application/yaml", true) + if status != http.StatusBadRequest { + t.Fatalf("导入第 7 档 + awardRanks=6 的规则包应 400,得到 %d %s", status, raw) + } + if !strings.Contains(string(raw), "第 7 档") { + t.Fatalf("导入失败的提示应点明超出的档位,得到 %s", raw) + } + after := countRows(t, env, `SELECT COUNT(*) FROM scoring_profile_rules r + JOIN scoring_profiles p ON p.id = r.profile_id WHERE p.code = 'individual_top6'`) + if after != before { + t.Fatalf("被拒的导入不该动库里的分值表,得到 %d → %d 档", before, after) + } + + // 对照:同一份包把录取名次改成 0(不封顶)就能导入。 + status, raw = env.doRaw(client, http.MethodPost, "/api/rules/import", + []byte(strings.Replace(pack, "awardRanks: 6", "awardRanks: 0", 1)), "application/yaml", true) + if status != http.StatusOK { + t.Fatalf("awardRanks=0 的同一份规则包应导入成功,得到 %d %s", status, raw) + } + if got := countRows(t, env, `SELECT COUNT(*) FROM scoring_profile_rules r + JOIN scoring_profiles p ON p.id = r.profile_id WHERE p.code = 'individual_top6'`); got != 7 { + t.Fatalf("导入成功后应有 7 档,得到 %d", got) + } +} + +// 库里**已经存在**的越档模板(修好之前从模板页存下的那种)必须照常导得出来: +// GET /api/rules/export 与赛事项目包是现场备份与排障的入口,把它们一起 500 掉是更大的事故 +// (同类伤疤:TestUpdateProfileCodeRequiredKeepsRulesExportUsable)。 +// 所以这条检查只在写入侧生效:导出原样给出,再导回来才拒。 +func TestLegacyAwardRanksOverflowStillExports(t *testing.T) { + env := newTestEnv(t) + client := adminClient(t, env) + + // 绕开接口直接写库,模拟「修好之前存下的」第 7 档 + awardRanks 6(现在两条写入路径都已拦下)。 + env.exec(t, `INSERT INTO scoring_profile_rules (profile_id, rank, points) + SELECT id, 7, 2 FROM scoring_profiles WHERE code = 'individual_top6'`) + + exported := env.exportRulesYAML(t, client) + if !strings.Contains(exported, "rank: 7") { + t.Fatalf("越档模板应原样导出,实际\n%s", exported) + } + + // 同一份导出内容导回来:写入侧必须拒,且提示点明超档的那一档。 + status, raw := env.doRaw(client, http.MethodPost, "/api/rules/import", []byte(exported), "application/yaml", true) + if status != http.StatusBadRequest { + t.Fatalf("把导出的越档规则包导回来应 400,得到 %d %s", status, raw) + } + if !strings.Contains(string(raw), "第 7 档") { + t.Fatalf("提示应点明超出的档位,得到 %s", raw) + } +} diff --git a/server/internal/httpapi/repo.go b/server/internal/httpapi/repo.go index ca54c00..26f8442 100644 --- a/server/internal/httpapi/repo.go +++ b/server/internal/httpapi/repo.go @@ -10,6 +10,7 @@ import ( "strings" "git.yeij.top/AskaEth/Scoreboard/server/internal/middleware" + "git.yeij.top/AskaEth/Scoreboard/server/internal/rules" ) // 本文件是赛事库(event.db)的读写层。store 包只负责连接与迁移, @@ -1290,6 +1291,29 @@ func validateAwardRanks(awardRanks int) error { return nil } +// validateProfileAwardCoverage 拦住「分值表档位超出录取名次」的静默截断。 +// +// 与上一条不同,这里不是字段取值范围的问题,而是两个字段**合起来**不成立: +// award_ranks > 0 时算分引擎把超出名次的档位一律当 0 分(domain/scoring.go 的 basePoints), +// 保存侧却从不校验两边的档位数,于是「分值表配到第 7 档、录取名次还留着 6」能安静落库—— +// 模板页上第 7 档明明写着 2 分,榜上却是 0 分,界面上看不出任何异常(审查 01 P1)。 +// 与其让人配一份算不出分的表,不如在保存时拒绝,并把两种改法直接写进错误里。 +// +// list 传「保存后实际生效的档位」:本次带了 rules 就是它,没带就是库里现有的(只改 awardRanks +// 一样能把已有档位截断)。文案与规则包导入侧共用 rules.AwardRanksOverflow,两条路给同一句话。 +func validateProfileAwardCoverage(awardRanks int, list []profileRuleDTO) error { + maxRank := 0 + for _, r := range list { + if r.Rank > maxRank { + maxRank = r.Rank + } + } + if msg := rules.AwardRanksOverflow(awardRanks, maxRank); msg != "" { + return badRequest(msg, nil) + } + return nil +} + func (s *server) createProfile(ctx context.Context, in profileDTO) (profileDTO, error) { in.Code, in.Name = strings.TrimSpace(in.Code), strings.TrimSpace(in.Name) if in.Code == "" || in.Name == "" { @@ -1306,6 +1330,9 @@ func (s *server) createProfile(ctx context.Context, in profileDTO) (profileDTO, if err := validateAwardRanks(in.AwardRanks); err != nil { return profileDTO{}, err } + if err := validateProfileAwardCoverage(in.AwardRanks, in.Rules); err != nil { + return profileDTO{}, err + } tx, err := s.ev.BeginTx(ctx, nil) if err != nil { return profileDTO{}, internal(err) @@ -1363,6 +1390,19 @@ func (s *server) updateProfile(ctx context.Context, id int64, in profileDTO) (pr if err := validateAwardRanks(in.AwardRanks); err != nil { return profileDTO{}, err } + // 没带 rules 时按库里现有的档位校验:只把 awardRanks 调小,一样会把已有档位截断。 + // 这一步必须在开事务之前读(赛事库只开一条连接,事务里再查会自锁)。 + effectiveRules := in.Rules + if effectiveRules == nil { + cur, err := s.profileRules(ctx, id) + if err != nil { + return profileDTO{}, err + } + effectiveRules = cur + } + if err := validateProfileAwardCoverage(in.AwardRanks, effectiveRules); err != nil { + return profileDTO{}, err + } tx, err := s.ev.BeginTx(ctx, nil) if err != nil { return profileDTO{}, internal(err) @@ -1400,15 +1440,15 @@ func (s *server) updateProfile(ctx context.Context, id int64, in profileDTO) (pr return s.getProfile(ctx, id) } -func replaceProfileRules(ctx context.Context, tx *sql.Tx, profileID int64, rules []profileRuleDTO) error { +func replaceProfileRules(ctx context.Context, tx *sql.Tx, profileID int64, list []profileRuleDTO) error { if _, err := tx.ExecContext(ctx, `DELETE FROM scoring_profile_rules WHERE profile_id = ?`, profileID); err != nil { return internal(err) } // 名次去重:主键是 (profile_id, rank),模板页把两行填成同一个数字就会撞 UNIQUE, // 报出来是 500 + 英文约束原文。事务虽然会回滚,但错误无法自解释,现场只能去猜。 // 先自己查一遍,报清是哪一名重复(与上面 rank < 1 的 400 同一层)。 - seen := make(map[int]bool, len(rules)) - for _, r := range rules { + seen := make(map[int]bool, len(list)) + for _, r := range list { if r.Rank < 1 { return badRequest("积分名次必须 >= 1", r) } diff --git a/server/internal/httpapi/repo_events.go b/server/internal/httpapi/repo_events.go index a796d47..53d229f 100644 --- a/server/internal/httpapi/repo_events.go +++ b/server/internal/httpapi/repo_events.go @@ -269,6 +269,18 @@ func (s *server) bumpEvent(ctx context.Context, tx *sql.Tx, eventID int64) error return bumpVersion(ctx, tx, "events", eventID, "upsert", ev, middleware.User(ctx).ID) } +// deleteEvent 删除小项:作废它名下的成绩流水,再删通道 / 组别 / 小项本身。 +// +// 守卫只挡「已有报名数据」,所以「只有团体名次、没有报名项」的小项(球类那种形态, +// 名次直接按单位录进 channel_manual_ranks)走得通。这类小项删除时,它产生的流水必须 +// 在同一个事务里显式作废:score_ledger.event_id 是 ON DELETE SET NULL,先删小项就只把 +// 外键置空(voided 仍是 0),分数留在榜上、而此后任何按 event_id 的重算都打不到这些行, +// 变成「永久残留、只能改库」(审查 01 的 P0)。 +// +// 作废而不是删除:保留流水行作为审计痕迹(谁在什么时候因为什么作废)。范围与 +// writeLedgerTx 的作废范围同口径——只动引擎产出的成绩分与破纪录加分,人工调整 +// (source_type = 'adjustment')不在此列,它由 point_adjustments 管,删小项只把它的 +// event_id 置空。 func (s *server) deleteEvent(ctx context.Context, id int64) error { has, err := exists(ctx, s.ev, `SELECT 1 FROM entries WHERE event_id = ? LIMIT 1`, id) if err != nil { @@ -282,6 +294,16 @@ func (s *server) deleteEvent(ctx context.Context, id int64) error { return internal(err) } defer func() { _ = tx.Rollback() }() + + actorID := middleware.User(ctx).ID + // 必须排在下面那条 DELETE FROM events 之前:event_id 一被置空,这条件就再也匹配不上。 + if _, err := tx.ExecContext(ctx, + `UPDATE score_ledger SET voided = 1, voided_by = ?, voided_at = datetime('now'), void_reason = ? + WHERE voided = 0 AND event_id = ? AND source_type IN ('result', 'record_bonus')`, + nullID(actorID), "小项删除,本小项积分流水一并作废", id); err != nil { + return internal(err) + } + for _, stmt := range []string{ `DELETE FROM event_score_channels WHERE event_id = ?`, `DELETE FROM event_categories WHERE event_id = ?`, @@ -291,7 +313,11 @@ func (s *server) deleteEvent(ctx context.Context, id int64) error { return internal(err) } } - if err := bumpVersion(ctx, tx, "events", id, "void", map[string]any{"id": id}, middleware.User(ctx).ID); err != nil { + if err := bumpVersion(ctx, tx, "events", id, "void", map[string]any{"id": id}, actorID); err != nil { + return err + } + // 流水作废会直接改榜单内容:不推 standings,大屏会一直停在旧分上(要等下一次发布才刷新)。 + if err := s.bumpStandings(ctx, tx, actorID); err != nil { return err } if err := tx.Commit(); err != nil { @@ -607,7 +633,7 @@ func (s *server) listChannels(ctx context.Context, eventID int64) ([]channelDTO, return nil, err } rows, err := s.ev.QueryContext(ctx, - `SELECT id, event_id, scope, basis, profile_id, sort_order, count_to_team, + `SELECT id, event_id, scope, basis, profile_id, sort_order, aggregate_mode, count_to_team, count_to_medals, count_to_team_medals FROM event_score_channels WHERE event_id = ? ORDER BY sort_order, id`, eventID) if err != nil { @@ -619,14 +645,19 @@ func (s *server) listChannels(ctx context.Context, eventID int64) ([]channelDTO, for rows.Next() { var ( c channelDTO + aggregateMode string countToTeam int countToMedals int countToTeamMedals int ) - if err := rows.Scan(&c.ID, &c.EventID, &c.Scope, &c.Basis, &c.ProfileID, &c.SortOrder, &countToTeam, + if err := rows.Scan(&c.ID, &c.EventID, &c.Scope, &c.Basis, &c.ProfileID, &c.SortOrder, &aggregateMode, &countToTeam, &countToMedals, &countToTeamMedals); err != nil { return nil, internal(err) } + // 只下发非缺省口径(sum):avg 是缺省值,老数据的响应体因此一个字节都不变。 + if aggregateMode == string(domain.AggregateSum) { + c.AggregateMode = aggregateMode + } c.CountToTeam = boolPtr(countToTeam != 0) c.CountToMedals = boolPtr(countToMedals != 0) c.CountToTeamMedals = boolPtr(countToTeamMedals != 0) @@ -647,6 +678,15 @@ func channelFlag(v *bool) bool { return v == nil || *v } +// channelAggregateMode 读请求体里的聚合口径:缺省(空串)落成 avg, +// 保证不带该字段的旧客户端保存通道时口径不变(与库里的默认值一致)。 +func channelAggregateMode(c channelDTO) string { + if c.AggregateMode == string(domain.AggregateSum) { + return string(domain.AggregateSum) + } + return string(domain.AggregateAvg) +} + func (s *server) replaceChannels(ctx context.Context, eventID int64, in []channelDTO) ([]channelDTO, error) { tx, err := s.ev.BeginTx(ctx, nil) if err != nil { @@ -672,14 +712,20 @@ func (s *server) replaceChannels(ctx context.Context, eventID int64, in []channe default: return nil, badRequest("通道 basis 非法", i) } + switch c.AggregateMode { + case "", string(domain.AggregateAvg), string(domain.AggregateSum): + default: + return nil, badRequest("通道 aggregateMode 只能是 avg/sum", i) + } if c.ProfileID == 0 { return nil, badRequest("通道 profileId 必填", i) } if _, err := tx.ExecContext(ctx, - `INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order, count_to_team, - count_to_medals, count_to_team_medals) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, - eventID, c.Scope, c.Basis, c.ProfileID, c.SortOrder, boolToInt(channelCountsToTeam(c)), + `INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order, aggregate_mode, + count_to_team, count_to_medals, count_to_team_medals) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + eventID, c.Scope, c.Basis, c.ProfileID, c.SortOrder, channelAggregateMode(c), + boolToInt(channelCountsToTeam(c)), boolToInt(channelFlag(c.CountToMedals)), boolToInt(channelFlag(c.CountToTeamMedals))); err != nil { if isUniqueViolation(err) { return nil, conflict("同一 scope+basis 只能配置一个通道") diff --git a/server/internal/httpapi/repo_misc.go b/server/internal/httpapi/repo_misc.go index 41d89a7..0c59513 100644 --- a/server/internal/httpapi/repo_misc.go +++ b/server/internal/httpapi/repo_misc.go @@ -15,6 +15,7 @@ import ( "git.yeij.top/AskaEth/Scoreboard/server/internal/dto" "git.yeij.top/AskaEth/Scoreboard/server/internal/export" "git.yeij.top/AskaEth/Scoreboard/server/internal/middleware" + "git.yeij.top/AskaEth/Scoreboard/server/internal/revisions" ) // ---------- settings ---------- @@ -476,6 +477,7 @@ func splitSettingList(raw string) []string { // standingsSnapshot 构造与 GET /api/standings 完全同构的整张榜单, // 供 change_log 的 standings replace 载荷使用(契约要求 data 是榜单数组)。 +// 总积分榜与单位奖牌榜都要算:前者的顺序是数组顺序,后者的名次由 medalRank 带走。 func (s *server) standingsSnapshot(ctx context.Context, q queryer) ([]dto.StandingRow, error) { in, err := s.loadStandingsInput(ctx, q) if err != nil { @@ -485,7 +487,11 @@ func (s *server) standingsSnapshot(ctx context.Context, q queryer) ([]dto.Standi if err != nil { return nil, err } - return dto.StandingRows(domain.BuildTeamStandings(in), domainTeamsFromMap(teams)), nil + return dto.StandingRows( + domain.BuildTeamStandings(in), + domain.BuildMedalStandings(in), + domainTeamsFromMap(teams), + ), nil } // domainTeamsFromMap 把 teams 表的 DTO 还原成 domain.Team,供 dto.StandingRows 补齐展示字段。 @@ -668,9 +674,12 @@ func (s *server) teamBreakdown(ctx context.Context, teamID int64) (teamBreakdown } // 名次不再只读 results.rank:那是个人名次(见 applyComputedRanks), // 团体名次与聚合名次只落在 channel_ranks,读旧列会让下钻的名次列整列变空。 + // 组别与导出口径一致(export.loadTeamDetailRows 的 COALESCE(c.name, ca.name, '')): + // 「按队内平均」产出的聚合流水 entry_id 为空,取不到报名项的组别,得用 ca 回推的那个。 rows, err := s.ev.QueryContext(ctx, - `SELECT l.id, l.source_type, l.event_id, ev.code, ev.name, cat.name, - l.athlete_id, a.name, `+breakdownRankExpr+`, r.result_text, l.points, COALESCE(l.created_at, '') + `SELECT l.id, l.source_type, l.event_id, ev.code, ev.name, COALESCE(cat.name, ca.name), + l.athlete_id, a.name, `+breakdownRankExpr+`, r.result_text, l.points, COALESCE(l.created_at, ''), + l.entry_id FROM score_ledger l LEFT JOIN events ev ON ev.id = l.event_id LEFT JOIN entries e ON e.id = l.entry_id @@ -694,17 +703,21 @@ func (s *server) teamBreakdown(ctx context.Context, teamID int64) (teamBreakdown defer func() { _ = rows.Close() }() out := teamBreakdownDTO{TeamID: team.ID, TeamCode: team.Code, TeamName: team.Name, Items: []breakdownItemDTO{}} + // 每条流水背后那条成绩的版本身份;聚合流水 / 人工调整没有报名项,留零值(追不了就不追)。 + keys := make([]revisions.Key, 0, 16) for rows.Next() { var ( item breakdownItemDTO eventID, athleteID sql.NullInt64 + entryID sql.NullInt64 eventCode, eventName sql.NullString categoryName, athleteName sql.NullString rank sql.NullInt64 resultText sql.NullString ) if err := rows.Scan(&item.LedgerID, &item.SourceType, &eventID, &eventCode, &eventName, - &categoryName, &athleteID, &athleteName, &rank, &resultText, &item.Points, &item.CreatedAt); err != nil { + &categoryName, &athleteID, &athleteName, &rank, &resultText, &item.Points, &item.CreatedAt, + &entryID); err != nil { return teamBreakdownDTO{}, internal(err) } item.EventID = i64Ptr(eventID) @@ -718,10 +731,76 @@ func (s *server) teamBreakdown(ctx context.Context, teamID int64) (teamBreakdown if item.AthleteID != nil && *item.AthleteID != 0 { item.Points *= weight } + // 只有成绩流水本身带得上修订痕迹(见 revisions.KeyFor):破纪录加分 / 人工调整 / 聚合流水留零值。 + key := revisions.Key{} + if item.EventID != nil { + key = revisions.KeyFor(item.SourceType, *item.EventID, entryID.Int64) + } + keys = append(keys, key) out.Items = append(out.Items, item) out.TotalPoints += item.Points } - return out, rows.Err() + if err := rows.Err(); err != nil { + return teamBreakdownDTO{}, internal(err) + } + s.attachBreakdownRevisions(ctx, out.Items, keys) + return out, nil +} + +// attachBreakdownRevisions 给明细行补上修订痕迹(谁在什么时候因为什么改过这条成绩)。 +// +// 查不出来只记日志、不报错:修订痕迹是「解释这一分怎么来的」的补充信息,追溯失败不该让 +// 整张明细打不开 —— 现场要看的是分,不是角标。此时字段保持 nil,前端显示为空。 +// +// 操作人姓名只发给 recorder 及以上:这个接口是公开的(大屏也读它),而「谁点错的」 +// 属于裁判自己要看的账,不该跟着 JSON 一起下发给未登录的访客 —— 与 /api/revisions +// 只对 recorder 开放是同一个口径。时间与原因照发:那是给观众的解释,不是人名的账。 +func (s *server) attachBreakdownRevisions(ctx context.Context, items []breakdownItemDTO, keys []revisions.Key) { + if len(keys) == 0 { + return + } + trails, err := revisions.Load(ctx, s.ev, keys) + if err != nil { + s.logger.Warn("读取成绩修订痕迹失败,明细按「未修订」展示", "err", err) + return + } + showActor := middleware.User(ctx).Role.Allows(auth.RoleRecorder) + actorIDs := make([]int64, 0, 4) + byActor := make(map[int]int64) + for i, key := range keys { + trail, ok := trails[key] + if !ok { + continue + } + count := trail.Count + items[i].RevisionCount = &count + if count == 0 { + continue + } + at := trail.At + items[i].LastRevisionAt = &at + if trail.Reason != "" { + reason := trail.Reason + items[i].LastRevisionReason = &reason + } + if trail.ActorID != nil && showActor { + actorIDs = append(actorIDs, *trail.ActorID) + byActor[i] = *trail.ActorID + } + } + if len(actorIDs) == 0 || s.sys == nil { + return + } + names, err := s.userNames(ctx, actorIDs) + if err != nil { + s.logger.Warn("读取修订操作人姓名失败,只显示时间与原因", "err", err) + return + } + for i, id := range byActor { + if name := names[id]; name != "" { + items[i].LastRevisedBy = &name + } + } } // ---------- records ---------- diff --git a/server/internal/httpapi/repo_misc_test.go b/server/internal/httpapi/repo_misc_test.go index ea49878..2fa053c 100644 --- a/server/internal/httpapi/repo_misc_test.go +++ b/server/internal/httpapi/repo_misc_test.go @@ -162,6 +162,115 @@ func TestTeamBreakdownAppliesIndividualWeight(t *testing.T) { } } +// 单位积分明细的「组别」列不能整列变空:聚合通道(按队内平均)产出的流水 entry_id 与 result_id +// 都为空,从 entries 取不到组别,接口要按「单位在本小项只参加了一个组别」回推那一个 +// (与 export.loadTeamDetailRows 的组别回推口径一致)。 +func TestTeamBreakdownAggregateRowKeepsCategory(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + // 模拟聚合通道产出的流水:entry_id 与 result_id 都为空(见 isAggregateLedger)。 + env.exec(t, `INSERT INTO score_ledger (team_id, athlete_id, event_id, entry_id, result_id, + source_type, source_id, points, count_to_team) + VALUES (?, NULL, ?, NULL, NULL, 'result', 99, 15, 1)`, ids.teamA, ids.event) + + status, env2 := env.do(client, http.MethodGet, + fmt.Sprintf("/api/standings/teams/%d/breakdown", ids.teamA), nil, false) + if status != http.StatusOK || !env2.OK { + t.Fatalf("读积分明细应 200,得到 %d %+v", status, env2.Error) + } + items := decodeData[map[string]any](t, env2)["items"].([]any) + if len(items) != 1 { + t.Fatalf("明细行数 = %d,期望 1(只插了一条聚合流水)", len(items)) + } + item := items[0].(map[string]any) + if got := item["categoryName"]; got != "男子" { + t.Fatalf("聚合流水的组别 = %v,期望 男子(按单位唯一参加的组别回推)", got) + } + // 聚合分不对应单个运动员,运动员列为空是合理的(前端降级成单位名);但组别不能跟着空。 + if name, ok := item["athleteName"]; ok && name != nil { + t.Fatalf("聚合流水不该带运动员名,得到 %v", name) + } +} + +// 正常发布的个人流水(走报名项)必须带齐「谁 · 哪个项目 · 哪个组别」: +// 大屏明细的「运动员」列就靠这一行数据,任何一项为空都会让现场只看到项目与名次。 +func TestTeamBreakdownIndividualRowCarriesWhoAndCategory(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + env.do(client, http.MethodPut, "/api/results/draft", map[string]any{ + "eventId": ids.event, + "results": []map[string]any{ + {"entryId": ids.entryA, "resultValue": 11.58, "resultText": "11.58", "unit": "s", "status": "ok"}, + }, + }, true) + if status, env2 := env.do(client, http.MethodPost, "/api/results/publish", map[string]any{ + "eventId": ids.event, + }, true); status != http.StatusOK { + t.Fatalf("发布应 200,得到 %d %+v", status, env2.Error) + } + + status, env2 := env.do(client, http.MethodGet, + fmt.Sprintf("/api/standings/teams/%d/breakdown", ids.teamA), nil, false) + if status != http.StatusOK || !env2.OK { + t.Fatalf("读积分明细应 200,得到 %d %+v", status, env2.Error) + } + items := decodeData[map[string]any](t, env2)["items"].([]any) + if len(items) != 1 { + t.Fatalf("明细行数 = %d,期望 1", len(items)) + } + item := items[0].(map[string]any) + for field, want := range map[string]any{ + "athleteName": "张伟", + "categoryName": "男子", + "eventName": "100米跑", + "resultText": "11.58", + } { + if got := item[field]; got != want { + t.Fatalf("明细行的 %s = %v,期望 %v(大屏明细要能说清是谁在哪个项目拿了多少分)", field, got, want) + } + } +} + +// 单位在同一小项参加了多个组别时回推不出组别,明细宁可留空也不猜(与导出一致)。 +func TestTeamBreakdownAmbiguousAggregateCategoryStaysEmpty(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + otherCat := env.insert(t, `INSERT INTO event_categories (event_id, name, multiplier, sort_order) + VALUES (?, '女子', 1, 1)`, ids.event) + otherAthlete := env.insert(t, `INSERT INTO athletes (name, gender, team_id, active) + VALUES ('王芳', '女', ?, 1)`, ids.teamA) + env.exec(t, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) + VALUES (?, ?, ?, ?, 'registered')`, ids.event, otherCat, ids.teamA, otherAthlete) + env.exec(t, `INSERT INTO score_ledger (team_id, athlete_id, event_id, entry_id, result_id, + source_type, source_id, points, count_to_team) + VALUES (?, NULL, ?, NULL, NULL, 'result', 99, 15, 1)`, ids.teamA, ids.event) + + status, env2 := env.do(client, http.MethodGet, + fmt.Sprintf("/api/standings/teams/%d/breakdown", ids.teamA), nil, false) + if status != http.StatusOK || !env2.OK { + t.Fatalf("读积分明细应 200,得到 %d %+v", status, env2.Error) + } + items := decodeData[map[string]any](t, env2)["items"].([]any) + if len(items) != 1 { + t.Fatalf("明细行数 = %d,期望 1(只插了一条聚合流水)", len(items)) + } + if got := items[0].(map[string]any)["categoryName"]; got != nil { + t.Fatalf("两个组别都参加时组别应留空(不猜),得到 %v", got) + } +} + // 只排名不计分(scored=0)的项目即使配了计分通道,也不得在大屏奖牌榜产出奖牌; // 导出侧已按 ev.scored = 1 过滤,两边口径必须一致,否则奖牌榜与成绩册对不上。 func TestStandingsExcludesUnscoredEventMedals(t *testing.T) { diff --git a/server/internal/httpapi/rules_handlers.go b/server/internal/httpapi/rules_handlers.go index 30aecb4..2a1a757 100644 --- a/server/internal/httpapi/rules_handlers.go +++ b/server/internal/httpapi/rules_handlers.go @@ -2,6 +2,9 @@ package httpapi import ( "context" + "database/sql" + "errors" + "fmt" "io" "net/http" @@ -129,17 +132,18 @@ func (s *server) importRules(w http.ResponseWriter, r *http.Request) (any, error }, nil } - res, err := rules.Apply(s.ev, cs) + res, rows, err := s.applyRulesAndRecompute(r.Context(), cs, middlewareUserID(r)) if err != nil { - return nil, internal(err) - } - // 分值一变,历史成绩的积分与名次必须全量重算。 - rows, err := s.recomputeAllEvents(r.Context(), middlewareUserID(r)) - if err != nil { - // 规则已经落库、重算整体回滚,现场处于「新规则 + 旧积分」; - // 必须显式告知调用方,不能报成功让操作员以为重算已完成。 - s.logger.Error("规则导入后重算失败", "err", err) - return nil, internalMsg("规则已导入,但积分重算失败,成绩与积分尚未同步;请重试导入", err) + // 配置本身就不成立(compare=none 的小项被配上 basis=result 等):落地前就拒了, + // 一个字节都没写,属于 400 而不是「服务端异常」。 + var conflict *rules.CompareConflictError + if errors.As(err, &conflict) { + return nil, badRequest(conflict.Error(), nil) + } + // 其余情况是重算在某个小项上失败,整包(规则 + 积分 + 名次)已跟着回滚, + // 榜单维持导入前的状态。原始错误带着「哪个小项、因为什么」,由 detail 一起回给现场。 + s.logger.Error("规则导入失败,已整体回滚", "err", err) + return nil, internalMsg("规则包未导入:积分重算失败,本次规则与积分改动已整体回滚,榜单维持导入前的状态(原因见后)", err) } s.audit(r.Context(), "rules.import", "rules", 0, nil, res) return rulesImportResult{ @@ -151,22 +155,80 @@ func (s *server) importRules(w http.ResponseWriter, r *http.Request) (any, error }, nil } -// recomputeAllEvents 全量重算所有项目的积分流水与名次,用于规则包导入等会改变分值的场景。 -// 整个重算共用一个事务:任一项目失败就全部回滚,不会留下「只重算了一部分」的中间状态。 -// 返回写入的积分流水条数,供导入结果回报。 +// applyRulesAndRecompute 把「规则包落地」与「全量重算」放进**同一个事务**,成功才提交。 +// +// 这两步必须同事务:换通道会先删 event_score_channels,而 channel_ranks.channel_id 挂的是 +// `ON DELETE CASCADE`,名次会跟着被清空、靠紧接着的重算重建。以前两步各自提交,重算一失败 +// (例如某个小项配不出名次)名次表就停在空表状态:榜单「分还在、奖牌全 0」,而且自愈与重试导入 +// 都会因同一个小项再次失败,无人可解(审查 04 P0-1,实测 2 行 → 0 行、金牌 1 → 0)。 +// 现在要么整体成功,要么整体回滚到导入前。 +// +// 返回落地统计与重算写回的流水条数(后者供导入结果回报)。 +func (s *server) applyRulesAndRecompute(ctx context.Context, cs *rules.ChangeSet, actorID int64) (*rules.ApplyResult, int, error) { + tx, err := s.ev.BeginTx(ctx, nil) + if err != nil { + return nil, 0, internal(err) + } + defer func() { _ = tx.Rollback() }() + + res, err := rules.ApplyTx(tx, cs) + if err != nil { + return nil, 0, err + } + rows, err := s.recomputeAllEventsTx(ctx, tx, actorID) + if err != nil { + return nil, 0, err + } + if err := tx.Commit(); err != nil { + return nil, 0, internal(err) + } + return res, rows, nil +} + +// recomputeAllEvents 全量重算所有项目的积分流水与名次(自带事务),用于改积分模板等 +// 会改变分值的场景。返回写入的积分流水条数,供调用方回报。 func (s *server) recomputeAllEvents(ctx context.Context, actorID int64) (int, error) { - rows, err := s.ev.QueryContext(ctx, `SELECT id FROM events ORDER BY id`) + tx, err := s.ev.BeginTx(ctx, nil) if err != nil { return 0, err } - var ids []int64 + defer func() { _ = tx.Rollback() }() + + total, err := s.recomputeAllEventsTx(ctx, tx, actorID) + if err != nil { + return 0, err + } + if err := tx.Commit(); err != nil { + return 0, err + } + return total, nil +} + +// recomputeAllEventsTx 在调用方的事务里全量重算,自己不提交。 +// +// 整个重算共用调用方这一个事务:任一项目失败就全部回滚,不会留下「只重算了一部分」的中间状态; +// 规则包导入正是靠这一点把「换通道」与「重算」绑在一起(见 applyRulesAndRecompute)。 +// +// 每个小项的失败都带上小项编码与名称:只回一句「basis=result 的通道要求小项配置 compare=asc/desc」, +// 现场在一场几十上百个小项的赛事里定位不到是哪一个,也就无从修起。 +func (s *server) recomputeAllEventsTx(ctx context.Context, tx *sql.Tx, actorID int64) (int, error) { + rows, err := tx.QueryContext(ctx, `SELECT id, code, name FROM events ORDER BY id`) + if err != nil { + return 0, err + } + type target struct { + id int64 + code string + name string + } + var events []target for rows.Next() { - var id int64 - if err := rows.Scan(&id); err != nil { + var t target + if err := rows.Scan(&t.id, &t.code, &t.name); err != nil { _ = rows.Close() return 0, err } - ids = append(ids, id) + events = append(events, t) } if err := rows.Close(); err != nil { return 0, err @@ -175,21 +237,15 @@ func (s *server) recomputeAllEvents(ctx context.Context, actorID int64) (int, er return 0, err } - tx, err := s.ev.BeginTx(ctx, nil) - if err != nil { - return 0, err - } - defer func() { _ = tx.Rollback() }() - total := 0 - for _, eventID := range ids { - score, err := recomputeLedgerTx(ctx, tx, eventID, 0, actorID, "rules-import") + for _, ev := range events { + score, err := recomputeLedgerTx(ctx, tx, ev.id, 0, actorID, "rules-import") if err != nil { - return 0, err + return 0, fmt.Errorf("小项 %s(%s)重算失败:%w", ev.code, ev.name, err) } // 名次随分值一起变化,必须回写 results,否则奖牌榜与积分榜互相矛盾。 if err := applyComputedRanks(ctx, tx, score.Ranked); err != nil { - return 0, err + return 0, fmt.Errorf("小项 %s(%s)回写名次失败:%w", ev.code, ev.name, err) } total += len(score.Ledger) } @@ -197,8 +253,5 @@ func (s *server) recomputeAllEvents(ctx context.Context, actorID int64) (int, er if err := s.bumpStandings(ctx, tx, actorID); err != nil { return 0, err } - if err := tx.Commit(); err != nil { - return 0, err - } return total, nil } diff --git a/server/internal/httpapi/rules_handlers_test.go b/server/internal/httpapi/rules_handlers_test.go index bc4a55f..b36db13 100644 --- a/server/internal/httpapi/rules_handlers_test.go +++ b/server/internal/httpapi/rules_handlers_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "io" "net/http" + "reflect" "strings" "testing" ) @@ -183,8 +184,152 @@ func TestRulesImportReturnsContractFields(t *testing.T) { } } -// 重算失败必须显式报错,且整个重算在同一事务里回滚,不能留下「新规则 + 部分新积分」(P1-12)。 -func TestRulesImportRecomputeFailureRollsBackAndReports(t *testing.T) { +// rulesPackTemplateOnly 是一份「只按 eventType 匹配、不看 compare」的规则包:individual 小项 +// 一律被配上 basis=result。库里若存在 compare=none(名次靠人工录入)的个人小项,这份模板 +// 就会给它配上一条根本跑不起来的通道——这正是审查 04 P0-1 的触发条件。 +// 模板分值与本仓库默认模板一致,保证测试里的差异只出现在通道上。 +const rulesPackTemplateOnly = `format: scoreboard-rules +formatVersion: 1 +meta: { code: test-template-only, name: 只按 eventType 匹配的规则包 } +standings: + individualToTeamWeight: 1 + tieBreak: [points, gold, silver, bronze, teamCode] +profiles: + - code: individual_top6 + name: 个人项目前六名 + awardRanks: 6 + tieMode: skip + rules: + - { rank: 1, points: 10 } + - { rank: 2, points: 8 } + - { rank: 3, points: 6 } + - { rank: 4, points: 3 } + - { rank: 5, points: 2 } + - { rank: 6, points: 1 } + - code: team_top6 + name: 团体项目前六名 + awardRanks: 6 + tieMode: skip + rules: + - { rank: 1, points: 15 } + - { rank: 2, points: 10 } + - { rank: 3, points: 8 } + - { rank: 4, points: 4 } + - { rank: 5, points: 2 } + - { rank: 6, points: 1 } +channelTemplates: + - match: { eventType: individual } + channels: + - { scope: athlete, basis: result, profile: individual_top6 } +` + +// rulesPackFixedBroken 是同一份规则包加上「坏小项改用 basis=manual」的 override: +// 导入失败提示就是这么让现场自己救回来的(compare=none 的小项只能用人工名次通道)。 +const rulesPackFixedBroken = rulesPackTemplateOnly + ` +eventOverrides: + - eventCode: Z_BROKEN + channels: + - { scope: athlete, basis: manual, profile: individual_top6 } +` + +// seedCompareNoneEvent 造一个 compare=none 的个人小项并发布一条人工名次。 +// 发布走真实接口,好让它占住一行 channel_ranks——那份名次就是「被级联清空就补不回来」的数据。 +func seedCompareNoneEvent(t *testing.T, env *testEnv, client *http.Client, ids seedIDs, code, name string) int64 { + t.Helper() + eventID := env.insert(t, + `INSERT INTO events (sport_id, code, name, event_type, result_mode, result_type, compare, scored, multiplier, status) + VALUES (?, ?, ?, 'individual', 'manual', 'none', 'none', 1, 1, 'ongoing')`, ids.sport, code, name) + categoryID := env.insert(t, + `INSERT INTO event_categories (event_id, name, multiplier, sort_order) VALUES (?, '男子', 1, 0)`, eventID) + var profileID int64 + if err := env.ev.QueryRow(`SELECT id FROM scoring_profiles WHERE code = 'individual_top6'`).Scan(&profileID); err != nil { + t.Fatalf("读取积分模板: %v", err) + } + env.exec(t, `INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order) + VALUES (?, 'athlete', 'manual', ?, 0)`, eventID, profileID) + entryID := env.insert(t, + `INSERT INTO entries (event_id, category_id, team_id, athlete_id, status) + VALUES (?, ?, ?, ?, 'registered')`, eventID, categoryID, ids.teamA, ids.athleteA) + + status, resp := env.do(client, http.MethodPut, "/api/results/draft", map[string]any{ + "eventId": eventID, + "requestId": "draft-" + code, + "results": []map[string]any{{"entryId": entryID, "rank": 1, "status": "ok"}}, + }, true) + if status != http.StatusOK || !resp.OK { + t.Fatalf("保存手工名次应 200,得到 %d %+v", status, resp.Error) + } + status, resp = env.do(client, http.MethodPost, "/api/results/publish", map[string]any{ + "eventId": eventID, + "requestId": "publish-" + code, + }, true) + if status != http.StatusOK || !resp.OK { + t.Fatalf("发布手工名次应 200,得到 %d %+v", status, resp.Error) + } + return eventID +} + +// 审查 04 P0-1 的回归:库里存在 compare=none 的个人小项时导入只按 eventType 匹配的规则包。 +// +// 导入前 channel_ranks 有 3 行(M100 两条 + 手工小项一条)、A 队 1 金;旧代码在这里会把通道 +// 先换掉(channel_ranks 被外键级联清空)、随后重算在手工小项上报 ErrCompareRequired, +// 结果是 3 行 → 0 行、金牌 1 → 0,而自愈与「重试导入」都以同一个错误失败,无人可解。 +// 修完之后:要么整体成功,要么整体回滚到导入前;名次表**不允许**变成空的。 +func TestRulesImportWithCompareNoneEventRollsBackOrSucceeds(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("admin", "admin-pass", "admin") + client, _ := env.client() + env.login(client, "admin", "admin-pass") + env.publishTwoResults(t, client, ids) + seedCompareNoneEvent(t, env, client, ids, "Z_MANUAL", "手榴弹投准") + + beforeRanks := channelRankCount(t, env) + beforeMedals := medalsByTeam(t, env) + beforePoints := env.ledgerPointsByTeam(t) + if beforeRanks != 3 { + t.Fatalf("导入前应有 3 行通道名次(M100 两条 + 手工小项一条),得到 %d", beforeRanks) + } + + status, raw := env.doRaw(client, http.MethodPost, "/api/rules/import", []byte(rulesPackTemplateOnly), "application/yaml", true) + + // 两种结局都算对:整体成功,或整体回滚回导入前。名次表变空就是失败。 + if status == http.StatusOK { + if got := channelRankCount(t, env); got == 0 { + t.Fatalf("导入返回成功却把通道名次清空了(%d → 0)", beforeRanks) + } + return + } + if status < http.StatusBadRequest { + t.Fatalf("导入既没成功也没失败,status=%d %s", status, raw) + } + // 报错要说人话:哪个小项、因为什么。 + for _, want := range []string{"Z_MANUAL", "手榴弹投准", "compare=none"} { + if !strings.Contains(string(raw), want) { + t.Errorf("导入失败提示缺少 %q:%s", want, raw) + } + } + // 名次表必须回到导入前的状态(不是空的)。 + if got := channelRankCount(t, env); got != beforeRanks { + t.Fatalf("导入失败应整体回滚,通道名次 %d 行 → %d 行", beforeRanks, got) + } + if got := medalsByTeam(t, env); !reflect.DeepEqual(got, beforeMedals) { + t.Fatalf("导入失败后奖牌榜应不变:before=%+v after=%+v", beforeMedals, got) + } + afterPoints := env.ledgerPointsByTeam(t) + if !reflect.DeepEqual(afterPoints, beforePoints) { + t.Fatalf("导入失败后流水应不变:before=%+v after=%+v", beforePoints, afterPoints) + } +} + +// 审查 04 P0-1 的第二个回归:重算失败时,「换通道」必须一起回滚。 +// +// 现场形态是旧代码留下的:库里已经有一个跑不起来的小项(compare=none 却配了 basis=result 通道), +// 规则包没有覆盖它(模板只匹配 individual,它是 match 类型),于是全量重算必然在它身上失败。 +// 旧代码此时通道替换已经提交,M100 的 channel_ranks 被级联清空 → 榜单「分还在、奖牌全 0」, +// 重试导入以同一个错误失败。修完后:整包回滚(名次表维持原样), +// 并且按提示给坏小项写一条 override 再导入就能修好——恢复得回来。 +func TestRulesImportRecomputeFailureRollsBackChannelReplacement(t *testing.T) { env := newTestEnv(t) ids := env.seed(t) env.createUser("admin", "admin-pass", "admin") @@ -192,17 +337,17 @@ func TestRulesImportRecomputeFailureRollsBackAndReports(t *testing.T) { env.login(client, "admin", "admin-pass") env.publishTwoResults(t, client, ids) + // 坏小项:compare=none(排不出名次)却配了 basis=result 的通道,还有一条已发布成绩。 + // 规则包的 individual 模板匹配不到它(event_type=match),所以它的通道不会被导入覆盖。 + broken := env.insert(t, + `INSERT INTO events (sport_id, code, name, event_type, result_mode, result_type, compare, scored, multiplier, status) + VALUES (?, 'Z_BROKEN', '损坏项目', 'match', 'auto', 'none', 'none', 1, 1, 'ongoing')`, ids.sport) + brokenCat := env.insert(t, + `INSERT INTO event_categories (event_id, name, multiplier, sort_order) VALUES (?, '男子', 1, 0)`, broken) var profileID int64 if err := env.ev.QueryRow(`SELECT id FROM scoring_profiles WHERE code = 'individual_top6'`).Scan(&profileID); err != nil { t.Fatalf("读取积分模板: %v", err) } - // 第二个项目 compare=none 却配了 basis=result 通道,重算到这里必然报错。 - // 项目编码排在 M100 之后,保证替换到的第一个通道属于 M100。 - broken := env.insert(t, - `INSERT INTO events (sport_id, code, name, event_type, result_mode, result_type, compare, scored, multiplier, status) - VALUES (?, 'Z_BROKEN', '损坏项目', 'individual', 'auto', 'time', 'none', 1, 1, 'ongoing')`, ids.sport) - brokenCat := env.insert(t, - `INSERT INTO event_categories (event_id, name, multiplier, sort_order) VALUES (?, '男子', 1, 0)`, broken) env.exec(t, `INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order) VALUES (?, 'athlete', 'result', ?, 0)`, broken, profileID) brokenEntry := env.insert(t, @@ -211,33 +356,53 @@ func TestRulesImportRecomputeFailureRollsBackAndReports(t *testing.T) { env.insert(t, `INSERT INTO results (event_id, entry_id, result_value, result_text, unit, status, state, rank) VALUES (?, ?, 11.0, '11.00', 's', 'ok', 'published', 1)`, broken, brokenEntry) - before := env.ledgerPointsByTeam(t) - pack := env.exportRulesYAML(t, client) - changed := strings.Replace(pack, "profile: individual_top6", "profile: team_top6", 1) - if changed == pack { - t.Fatalf("规则包里没有可替换的计分通道") + beforeRanks := channelRankCount(t, env) + beforeMedals := medalsByTeam(t, env) + beforePoints := env.ledgerPointsByTeam(t) + if beforeRanks != 2 { + t.Fatalf("导入前应有 2 行通道名次(M100 两条),得到 %d", beforeRanks) } - status, raw := env.doRaw(client, http.MethodPost, "/api/rules/import", []byte(changed), "application/yaml", true) + status, raw := env.doRaw(client, http.MethodPost, "/api/rules/import", []byte(rulesPackTemplateOnly), "application/yaml", true) if status != http.StatusInternalServerError { - t.Fatalf("重算失败应 500,得到 %d %s", status, raw) + t.Fatalf("坏小项让重算失败,应 500,得到 %d %s", status, raw) } - if !strings.Contains(string(raw), "积分重算失败") { - t.Fatalf("错误信息应说明重算失败,得到 %s", raw) + // 人话:必须指名是哪个小项、因为什么,现场才定位得到。 + for _, want := range []string{"Z_BROKEN", "损坏项目", "compare"} { + if !strings.Contains(string(raw), want) { + t.Errorf("重算失败提示缺少 %q:%s", want, raw) + } + } + // 换通道与重算同事务:失败即整体回滚,名次表回到导入前(不能变成空的)。 + if got := channelRankCount(t, env); got != beforeRanks { + t.Fatalf("重算失败应整体回滚,通道名次 %d 行 → %d 行", beforeRanks, got) + } + if got := medalsByTeam(t, env); !reflect.DeepEqual(got, beforeMedals) { + t.Fatalf("重算失败后奖牌榜应不变:before=%+v after=%+v", beforeMedals, got) } - - // 规则本身已经落库(Apply 先提交),但第一个项目的重算必须随第二个项目一起回滚。 var code string if err := env.ev.QueryRow(`SELECT p.code FROM event_score_channels c JOIN scoring_profiles p ON p.id = c.profile_id WHERE c.event_id = ?`, ids.event).Scan(&code); err != nil { t.Fatalf("查询导入后的计分通道: %v", err) } - if code != "team_top6" { - t.Fatalf("规则应已落库(通道改为 team_top6),得到 %q", code) + if code != "individual_top6" { + t.Fatalf("通道替换也必须回滚,得到 %q", code) } - after := env.ledgerPointsByTeam(t) - if after[ids.teamA] != before[ids.teamA] || after[ids.teamB] != before[ids.teamB] { - t.Fatalf("重算失败应整体回滚,流水不应变化:before=%+v after=%+v", before, after) + afterPoints := env.ledgerPointsByTeam(t) + if !reflect.DeepEqual(afterPoints, beforePoints) { + t.Fatalf("重算失败后流水应不变:before=%+v after=%+v", beforePoints, afterPoints) + } + + // 可恢复:按提示给坏小项补一条 basis=manual 的 override,再导入就成功,且名次表被重建。 + status, raw = env.doRaw(client, http.MethodPost, "/api/rules/import", []byte(rulesPackFixedBroken), "application/yaml", true) + if status != http.StatusOK { + t.Fatalf("修正坏小项后导入应 200,得到 %d %s", status, raw) + } + if got := channelRankCount(t, env); got <= beforeRanks { + t.Fatalf("修正后名次表应被重建(含 Z_BROKEN 的一行),得到 %d 行", got) + } + if got := medalsByTeam(t, env); got[ids.teamA].Gold == 0 { + t.Fatalf("修正后奖牌榜应恢复,得到 %+v", got) } } diff --git a/server/internal/httpapi/scoring.go b/server/internal/httpapi/scoring.go index fa00857..c48fe32 100644 --- a/server/internal/httpapi/scoring.go +++ b/server/internal/httpapi/scoring.go @@ -86,7 +86,7 @@ func loadCategoriesQ(ctx context.Context, q queryer, eventID int64) ([]domain.Ev func loadChannelsQ(ctx context.Context, q queryer, eventID int64) ([]domain.ScoreChannel, error) { rows, err := q.QueryContext(ctx, - `SELECT id, event_id, scope, basis, profile_id, sort_order, count_to_team, + `SELECT id, event_id, scope, basis, profile_id, sort_order, aggregate_mode, count_to_team, count_to_medals, count_to_team_medals FROM event_score_channels WHERE event_id = ? ORDER BY sort_order, id`, eventID) if err != nil { @@ -98,14 +98,19 @@ func loadChannelsQ(ctx context.Context, q queryer, eventID int64) ([]domain.Scor for rows.Next() { var ( c domain.ScoreChannel + aggregateMode string countToTeam int countToMedals int countToTeamMedals int ) - if err := rows.Scan(&c.ID, &c.EventID, &c.Scope, &c.Basis, &c.ProfileID, &c.SortOrder, &countToTeam, + if err := rows.Scan(&c.ID, &c.EventID, &c.Scope, &c.Basis, &c.ProfileID, &c.SortOrder, &aggregateMode, &countToTeam, &countToMedals, &countToTeamMedals); err != nil { return nil, internal(err) } + // 汇总口径只认 sum:avg(含缺字段的老库)保持零值,由引擎按缺省 avg 处理。 + if aggregateMode == string(domain.AggregateSum) { + c.AggregateMode = domain.AggregateSum + } // 只把显式关闭的通道落成指针,缺省时保持 nil(等同计入单位总分 / 发奖牌)。 if countToTeam == 0 { c.CountToTeam = boolPtr(false) @@ -545,14 +550,30 @@ func resultStatusPtr(s domain.ResultStatus) *string { // 团体通道(scope=team)与聚合 / 团体手工名次(ResultID=0)一律不碰这一列—— // 它们过去把个人名次覆盖成团体名次,双通道项目第二次发布会把同一份名次再发一次分(P0)。 // +// 这一列还是 manual 通道的**输入**(个人手工名次走它、团体报名项的团体名次也走它兜底), +// 所以命中「人工名次的录入位」时必须让路,否则同一份数据第二次发布会算出另一个结果: +// +// - 小项配了 [athlete, manual]:每一条成绩的 results.rank 都是操作员填的输入, +// 自动名次覆盖它 → 人工通道下一轮读到的是自动名次(工单 A-2:A 队 18 → 20 分); +// - 小项配了 [team, manual] 且该行是**团体报名项**(AthleteID == 0):它的 results.rank +// 是「单位名次」而不是个人名次(domain.collectTeamManualCandidates 的兜底来源), +// 写进自动的个人名次后会被当成团体名次再发一遍团体分(工单 A-1:10/8/6 → 25/18/14)。 +// // 同一 result 命中多个个人通道时取一条:basis=result 优先(这一列本来就是成绩名次), // 其次通道 id 小者,保证同一份输入每次写回同一个值。 func applyComputedRanks(ctx context.Context, tx *sql.Tx, ranked []domain.RankedResult) error { + inputs, err := manualRankInputEvents(ctx, tx, ranked) + if err != nil { + return err + } best := make(map[int64]domain.RankedResult) for _, rr := range ranked { if rr.Scope != domain.ScopeAthlete || rr.ResultID == 0 || rr.Rank <= 0 { continue } + if in := inputs[rr.EventID]; in.athleteManual || (in.teamManual && rr.AthleteID == 0) { + continue + } cur, ok := best[rr.ResultID] if !ok || preferComputedRank(rr, cur) { best[rr.ResultID] = rr @@ -566,6 +587,39 @@ func applyComputedRanks(ctx context.Context, tx *sql.Tx, ranked []domain.RankedR return nil } +// manualRankInputs 描述一个小项把 results.rank 当作「人工名次录入位」的两种通道形态。 +type manualRankInputs struct { + athleteManual bool // [athlete, manual]:每条成绩的 results.rank 都是人工录入的个人名次 + teamManual bool // [team, manual]:团体报名项的 results.rank 是人工录入的团体名次 +} + +// manualRankInputEvents 查出这些名次所属小项里,哪些把 results.rank 当输入用。 +// 只查 ranked 里出现的小项:没有名次可写回时不需要这一趟查询, +// 而「有没有 manual 通道」必须看库(不能只看 ranked——名次还没录时该通道不产出明细)。 +func manualRankInputEvents(ctx context.Context, tx *sql.Tx, ranked []domain.RankedResult) (map[int64]manualRankInputs, error) { + if len(ranked) == 0 { + return nil, nil + } + out := make(map[int64]manualRankInputs) + for _, rr := range ranked { + if rr.EventID == 0 { + continue + } + if _, done := out[rr.EventID]; done { + continue + } + var athlete, team int + if err := tx.QueryRowContext(ctx, + `SELECT COALESCE(MAX(CASE WHEN scope = 'athlete' AND basis = 'manual' THEN 1 ELSE 0 END), 0), + COALESCE(MAX(CASE WHEN scope = 'team' AND basis = 'manual' THEN 1 ELSE 0 END), 0) + FROM event_score_channels WHERE event_id = ?`, rr.EventID).Scan(&athlete, &team); err != nil { + return nil, internal(err) + } + out[rr.EventID] = manualRankInputs{athleteManual: athlete != 0, teamManual: team != 0} + } + return out, nil +} + // preferComputedRank 判断候选 a 是否比已选中的 b 更该写回 results.rank。 func preferComputedRank(a, b domain.RankedResult) bool { if (a.Basis == domain.BasisResult) != (b.Basis == domain.BasisResult) { diff --git a/server/internal/httpapi/standings_medal_rank_test.go b/server/internal/httpapi/standings_medal_rank_test.go new file mode 100644 index 0000000..12e2acb --- /dev/null +++ b/server/internal/httpapi/standings_medal_rank_test.go @@ -0,0 +1,103 @@ +package httpapi_test + +import ( + "encoding/json" + "net/http" + "testing" +) + +// TestStandingsMedalRankIndependentOfPoints 是 06 报告 P1④ 的接口级回归用例 +// (主人 2026-09-13 拍板:单位奖牌榜独立按金→银→铜排序,与积分榜解耦)。 +// +// 造数:A 拿 1 金 10 分,B 拿 1 银 8 分,再给 B 记一笔 30 分的人工调整(不发奖牌)。 +// 期望:总积分榜仍按总分排(B 38 分第一),单位奖牌榜把 A 排第一(gold 1 > 0)。 +// 修前两个榜同序,奖牌榜会把金牌 1 枚的 A 排在金牌 0 枚的 B 后面,正是报告里的现象。 +func TestStandingsMedalRankIndependentOfPoints(t *testing.T) { + env := newTestEnv(t) + ids := env.seed(t) + env.createUser("recorder", "recorder-pass", "recorder") + client, _ := env.client() + env.login(client, "recorder", "recorder-pass") + + if status, body := env.do(client, http.MethodPut, "/api/results/draft", map[string]any{ + "eventId": ids.event, + "requestId": "draft-1", + "results": []map[string]any{ + {"entryId": ids.entryA, "resultValue": 11.58, "resultText": "11.58", "unit": "s", "status": "ok"}, + {"entryId": ids.entryB, "resultValue": 11.92, "resultText": "11.92", "unit": "s", "status": "ok"}, + }, + }, true); status != http.StatusOK { + t.Fatalf("保存草稿应 200,得到 %d %+v", status, body.Error) + } + if status, body := env.do(client, http.MethodPost, "/api/results/publish", map[string]any{ + "eventId": ids.event, + "requestId": "publish-1", + }, true); status != http.StatusOK { + t.Fatalf("发布应 200,得到 %d %+v", status, body.Error) + } + + // 人工调整只加分不发奖牌,正好用来造「金牌多、总分低」。 + env.exec(t, `UPDATE settings SET value = 'true' WHERE key = 'manual_adjustment.enabled'`) + if status, body := env.do(client, http.MethodPost, "/api/adjustments", map[string]any{ + "teamId": ids.teamB, "delta": 30, "category": "bonus", "reason": "接口用例造数", + }, true); status != http.StatusOK { + t.Fatalf("人工调整应 200,得到 %d %+v", status, body.Error) + } + + // REST:GET /api/standings 的 rank 与 medalRank 必须是两套口径。 + _, resp := env.do(client, http.MethodGet, "/api/standings", nil, false) + assertMedalRankDecoupled(t, "REST /api/standings", decodeData[[]map[string]any](t, resp)) + + // 大屏那条路:standings 变更的载荷(change_log 里固化的那份,WS 原样推送)同源。 + var payload string + if err := env.ev.QueryRow(`SELECT payload_json FROM change_log + WHERE entity_type = 'standings' ORDER BY id DESC LIMIT 1`).Scan(&payload); err != nil { + t.Fatalf("读取 standings 变更: %v", err) + } + var pushed []map[string]any + if err := json.Unmarshal([]byte(payload), &pushed); err != nil { + t.Fatalf("standings 载荷应为数组: %v (%s)", err, payload) + } + assertMedalRankDecoupled(t, "WS standings 载荷", pushed) +} + +// assertMedalRankDecoupled 断言榜单载荷里「积分榜按总分、奖牌榜按金牌」两套名次并存。 +func assertMedalRankDecoupled(t *testing.T, label string, rows []map[string]any) { + t.Helper() + // 字段缺失时给一句人话,不要用裸类型断言(旧服务端的载荷里没有 medalRank)。 + num := func(row map[string]any, key string) float64 { + value, ok := row[key].(float64) + if !ok { + t.Fatalf("%s:字段 %q 不是数字(缺失 / 类型不对):%v", label, key, row[key]) + } + return value + } + + byCode := make(map[string]map[string]any, len(rows)) + for _, row := range rows { + code, _ := row["teamCode"].(string) + byCode[code] = row + } + if len(byCode) != 2 { + t.Fatalf("%s:应含 2 个单位,得到 %d(%v)", label, len(byCode), rows) + } + a, b := byCode["A"], byCode["B"] + + // 总积分榜:B 靠 30 分人工调整反超,仍是 38 分第一。 + if got := num(b, "totalPoints"); got != 38 { + t.Fatalf("%s:B 总分 = %v,期望 38(8 + 调整 30)", label, got) + } + if num(b, "rank") != 1 || num(a, "rank") != 2 { + t.Fatalf("%s:总积分榜名次应 B 在 A 前(B 38 分),得到 A:%v B:%v", + label, a["rank"], b["rank"]) + } + + // 单位奖牌榜:A 有 1 金(B 无牌),名次必须独立算成第一。 + if num(a, "gold") != 1 || num(b, "gold") != 0 { + t.Fatalf("%s:奖牌数不对,A 应 1 金、B 应 0 金:%v %v", label, a, b) + } + if num(a, "medalRank") != 1 || num(b, "medalRank") != 2 { + t.Fatalf("%s:单位奖牌榜名次应 A 第一、B 第二(按金牌),得到 A:%v B:%v", + label, a["medalRank"], b["medalRank"]) + } +} diff --git a/server/internal/httpapi/system_test.go b/server/internal/httpapi/system_test.go index 3e4f4c7..3b57816 100644 --- a/server/internal/httpapi/system_test.go +++ b/server/internal/httpapi/system_test.go @@ -266,7 +266,7 @@ func TestSettingsAndStandingsJSONContract(t *testing.T) { } assertKeys(t, "standings[0]", rows[0], []string{ "teamId", "teamCode", "teamName", "shortName", "color", "logoPath", - "rank", "gold", "silver", "bronze", "medalTotal", "totalPoints", "rankChange", + "rank", "medalRank", "gold", "silver", "bronze", "medalTotal", "totalPoints", "rankChange", }) } diff --git a/server/internal/realtime/snapshot.go b/server/internal/realtime/snapshot.go index 7a75f89..1b38bf9 100644 --- a/server/internal/realtime/snapshot.go +++ b/server/internal/realtime/snapshot.go @@ -232,15 +232,21 @@ func loadStandings(ctx context.Context, tx *sql.Tx, snap *Snapshot, teams []doma activeTeams = append(activeTeams, t) } } - rows := domain.BuildTeamStandings(domain.StandingsInput{ + in := domain.StandingsInput{ Teams: activeTeams, Ledger: ledger, Ranked: ranked, TieBreak: splitTieBreak(values["standings.tie_break"]), IndividualToTeamWeight: atofDefault(values["standings.individual_to_team_weight"], 1), ExcludeTeamEventMedals: !boolDefault(values["standings.medal_counts_team_events"], true), - }) - snap.Standings = dto.StandingRows(rows, teams) + } + // 单位奖牌榜的名次独立于总积分榜(金→银→铜→编码),随 medalRank 下发; + // 与 REST、xlsx 导出走的是同一个 domain.BuildMedalStandings。 + snap.Standings = dto.StandingRows( + domain.BuildTeamStandings(in), + domain.BuildMedalStandings(in), + teams, + ) return nil } diff --git a/server/internal/realtime/snapshot_test.go b/server/internal/realtime/snapshot_test.go index 37ac326..c1f92db 100644 --- a/server/internal/realtime/snapshot_test.go +++ b/server/internal/realtime/snapshot_test.go @@ -120,7 +120,8 @@ func TestSnapshotWireContract(t *testing.T) { if len(rows) != 1 { t.Fatalf("榜单行数应为 1,得到 %d", len(rows)) } - for _, key := range []string{"teamId", "teamCode", "teamName", "totalPoints", "medalTotal", "rankChange", "gold", "rank"} { + // medalRank 是单位奖牌榜的独立名次,必须随快照下发,否则大屏奖牌页只能退回积分榜名次。 + for _, key := range []string{"teamId", "teamCode", "teamName", "totalPoints", "medalTotal", "rankChange", "gold", "rank", "medalRank"} { if _, ok := rows[0][key]; !ok { t.Fatalf("standings 缺少契约字段 %s: %s", key, top["standings"]) } diff --git a/server/internal/revisions/trail.go b/server/internal/revisions/trail.go new file mode 100644 index 0000000..4bda53e --- /dev/null +++ b/server/internal/revisions/trail.go @@ -0,0 +1,211 @@ +// Package revisions 从 result_revisions 的版本链里还原「这条成绩被改过几次、最后一次因为什么改」。 +// +// 两个消费方:单位积分明细的屏幕展示(httpapi.teamBreakdown)与 xlsx 导出(export.loadTeamDetailRows)。 +// 口径必须同源 —— 屏幕上写着「已修订 ×2」而导出件写「已修订 ×1」,就是同一份数据两处打架, +// 所以查询与判定都收在这里,调用方只负责排版。 +// +// 判定「被改过」的判据(保守优先,宁可不显示数字也不误报): +// - 身份用 (event_id, entry_id):results.entry_id 唯一,且「退回草稿 / 作废成绩」只改这一行的 +// 状态、不换报名项,重新发布也只会作废旧流水、写新流水。所以按这条线数历史版本, +// 不会被「重新发布产生新流水行」打断(ledger_ids 写入侧早已不写,result_id 也会随发布变化)。 +// - 只比「录进去的成绩」本身:成绩文本 / 数值 / 单位 / 并列 / 状态。 +// 刻意不比 rank 与 state:名次是引擎每次发布按当前成绩重算的(别人改了成绩,我的名次也会变), +// state 是发布动作自己写的,两者都会在「这条成绩一个字没改」的情况下逐次发布都不同。 +// - 至少要见过两次快照才可能报数:第一次出现是基线,不计;一次都没出现过(例如升级前就发布、 +// 没有版本记录)则整条不返回,调用方据此显示为空。 +package revisions + +import ( + "context" + "database/sql" + "strings" +) + +// Key 是一条成绩在版本链里的身份:同一个小项里的同一个报名项。 +type Key struct { + EventID int64 + EntryID int64 +} + +// KeyFor 返回一条流水在版本链里的身份;返回零值表示这条流水追不了修订痕迹(调用方按空显示)。 +// +// 只认**成绩流水本身**(source_type = 'result'):破纪录加分与人工调整是站在成绩旁边的另一笔分, +// 把成绩的修订次数挂到它们头上,等于对外说「那笔加分被改过」—— 那不是事实,正是要避免的误报。 +// 聚合流水(按队内平均)与团体手工名次没有单个报名项,同样返回零值。 +func KeyFor(sourceType string, eventID, entryID int64) Key { + if sourceType != "result" || eventID == 0 || entryID == 0 { + return Key{} + } + return Key{EventID: eventID, EntryID: entryID} +} + +// Trail 是一条成绩的修订痕迹。Count == 0 表示追溯成功但没有改动过(调用方不应显示角标)。 +type Trail struct { + Count int + // At 是最后一次改动落库的时间,SQLite datetime('now') 的原样字符串(UTC,不带时区)。 + At string + // Reason 是最后一次改动的原因;确实没记录过就是空串 —— 宁可不写也不编。 + Reason string + // ActorID 是最后一次改动的操作人(指向系统库 users,跨库不能建外键,解析姓名由调用方负责)。 + ActorID *int64 +} + +// Queryer 是 *sql.DB / *sql.Tx 的最小公共面。 +type Queryer interface { + QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) +} + +// snapshotColumns 从快照里的每条成绩对象上取出的字段。 +// +// 取的就是 httpapi 的 resultDTO 序列化后的 JSON 键(该类型不导出,改字段名要同步这里)。 +// 只取判定用得到的几项:rank / state / verifiedBy 之类故意不取,见包注释。 +const snapshotColumns = `json_extract(v.value, '$.entryId'), + COALESCE(json_extract(v.value, '$.resultText'), ''), + json_extract(v.value, '$.resultValue'), + COALESCE(json_extract(v.value, '$.unit'), ''), + COALESCE(json_extract(v.value, '$.isTie'), 0), + COALESCE(json_extract(v.value, '$.status'), ''), + COALESCE(json_extract(v.value, '$.note'), '')` + +// chunk 是一次 IN 查询里最多带几个 Key:事件与报名项各一个 IN 列表,参数个数翻倍, +// SQLite 的宿主参数上限(默认 32766)不该被一次明细请求摸到。 +const chunk = 100 + +// Load 汇总这些成绩的修订痕迹。返回的 map 里只包含「在版本链里出现过」的 Key。 +// +// 读不出来(快照损坏等)时返回错误,由调用方决定降级:明细是展示层的东西, +// 不该因为追溯不出来就整个接口失败。 +func Load(ctx context.Context, q Queryer, keys []Key) (map[Key]Trail, error) { + out := make(map[Key]Trail) + seen := make(map[Key]bool) + unique := make([]Key, 0, len(keys)) + for _, k := range keys { + if k.EventID == 0 || k.EntryID == 0 || seen[k] { + continue + } + seen[k] = true + unique = append(unique, k) + } + for start := 0; start < len(unique); start += chunk { + end := start + chunk + if end > len(unique) { + end = len(unique) + } + batch := unique[start:end] + eventIDs := make([]any, 0, len(batch)) + entryIDs := make([]any, 0, len(batch)) + wanted := make(map[Key]bool, len(batch)) + for _, k := range batch { + eventIDs = append(eventIDs, k.EventID) + entryIDs = append(entryIDs, k.EntryID) + wanted[k] = true + } + // json_each 把快照数组摊成一行行成绩,只把命中的那几行传回来 —— + // 事件攒了几十版快照、每版几百条成绩时,不值得整个 JSON 拉回来在 Go 里解析。 + query := `SELECT r.event_id, r.created_at, COALESCE(r.message, ''), r.actor_id, ` + snapshotColumns + ` + FROM result_revisions r, json_each(r.snapshot_json) v + WHERE r.event_id IN (` + placeholders(len(eventIDs)) + `) + AND json_extract(v.value, '$.entryId') IN (` + placeholders(len(entryIDs)) + `) + ORDER BY r.event_id, r.id` + args := append(append([]any{}, eventIDs...), entryIDs...) + if err := scan(ctx, q, query, args, wanted, out); err != nil { + return nil, err + } + } + return out, nil +} + +// snapshotValue 是一条成绩在某一版快照里的「录进去的成绩」。 +type snapshotValue struct { + text string + value sql.NullFloat64 + unit string + tie int + status string +} + +// changed 判断这一版是不是和上一版录的不是同一个成绩了。 +// +// 浮点按原值比较:正负零、NaN 这类边界在成绩录入里不会出现(服务端只接受有限数), +// 而 11.58 与 11.580000000000002 这种舍入差异本就不该被当成「改过」。 +func (v snapshotValue) changed(o snapshotValue) bool { + if v.text != o.text || v.unit != o.unit || v.tie != o.tie || v.status != o.status { + return true + } + if v.value.Valid != o.value.Valid { + return true + } + return v.value.Valid && v.value.Float64 != o.value.Float64 +} + +func scan(ctx context.Context, q Queryer, query string, args []any, wanted map[Key]bool, out map[Key]Trail) error { + rows, err := q.QueryContext(ctx, query, args...) + if err != nil { + return err + } + defer func() { _ = rows.Close() }() + + prev := make(map[Key]snapshotValue, len(wanted)) + for rows.Next() { + var ( + eventID, entryID int64 + createdAt, message string + actorID sql.NullInt64 + note string + value sql.NullFloat64 + text, unit, status string + tie int + ) + if err := rows.Scan(&eventID, &createdAt, &message, &actorID, &entryID, &text, &value, + &unit, &tie, &status, ¬e); err != nil { + return err + } + key := Key{EventID: eventID, EntryID: entryID} + if !wanted[key] { + continue + } + cur := snapshotValue{text: text, value: value, unit: unit, tie: tie, status: status} + // 第一次出现只是基线(「发布」本身不是修订),从第二次起才谈得上「改没改」。 + if before, ok := prev[key]; ok { + if before.changed(cur) { + trail := out[key] + trail.Count++ + trail.At = createdAt + trail.Reason = reasonOf(note, message) + trail.ActorID = nil + if actorID.Valid { + id := actorID.Int64 + trail.ActorID = &id + } + out[key] = trail + } + } else { + if _, ok := out[key]; !ok { + out[key] = Trail{} // 见过的标记:Count 0 = 追溯成功、没改过 + } + } + prev[key] = cur + } + return rows.Err() +} + +// reasonOf 取这次改动的原因,先具体后笼统: +// +// - results.note 是这条成绩自己的备注,「退回草稿 / 作废成绩」时写下的理由就落在它上面; +// - r.message 是修订行自带的消息,目前只有发布时「跳过 N 条只填了成绩文本的草稿」这一种, +// 是**发布级**说明,挂到某一条成绩头上未必对,所以只在前者没有时才用。 +// +// 两个都没有就返回空串:调用方只显示时间,不编原因。 +func reasonOf(note, message string) string { + if s := strings.TrimSpace(note); s != "" { + return s + } + return strings.TrimSpace(message) +} + +func placeholders(n int) string { + if n == 0 { + return "" + } + return strings.TrimSuffix(strings.Repeat("?,", n), ",") +} diff --git a/server/internal/revisions/trail_test.go b/server/internal/revisions/trail_test.go new file mode 100644 index 0000000..c3faa0d --- /dev/null +++ b/server/internal/revisions/trail_test.go @@ -0,0 +1,229 @@ +package revisions_test + +import ( + "context" + "database/sql" + "encoding/json" + "testing" + + _ "modernc.org/sqlite" + + "git.yeij.top/AskaEth/Scoreboard/server/internal/revisions" +) + +// 一版快照里的成绩,字段名与 httpapi.resultDTO 的 JSON 对齐(只列判定用得到的)。 +type snapResult struct { + EntryID int64 `json:"entryId"` + Rank *int `json:"rank"` + ResultText string `json:"resultText"` + ResultValue *float64 `json:"resultValue"` + Unit string `json:"unit"` + IsTie bool `json:"isTie"` + Status string `json:"status"` + State string `json:"state"` + Note *string `json:"note"` +} + +type revision struct { + eventID int64 + message string + actorID any + created string + results []snapResult +} + +func newDB(t *testing.T, rows []revision) *sql.DB { + t.Helper() + db, err := sql.Open("sqlite", "file::memory:?cache=shared") + if err != nil { + t.Fatalf("打开内存库: %v", err) + } + t.Cleanup(func() { _ = db.Close() }) + if _, err := db.Exec(`CREATE TABLE result_revisions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, event_id INTEGER NOT NULL, action TEXT NOT NULL, + snapshot_json TEXT NOT NULL, actor_id INTEGER, message TEXT, created_at TEXT NOT NULL)`); err != nil { + t.Fatalf("建表: %v", err) + } + for _, row := range rows { + raw, err := json.Marshal(row.results) + if err != nil { + t.Fatalf("序列化快照: %v", err) + } + if _, err := db.Exec(`INSERT INTO result_revisions (event_id, action, snapshot_json, actor_id, message, created_at) + VALUES (?, 'publish', ?, ?, ?, ?)`, row.eventID, string(raw), row.actorID, row.message, row.created); err != nil { + t.Fatalf("插入修订: %v", err) + } + } + return db +} + +func f64(v float64) *float64 { return &v } +func str(v string) *string { return &v } + +// result 造一条成绩快照;名次与 state 每次都不同,用来证明它们不参与判定。 +func result(entryID int64, rank int, text string, value float64, state string) snapResult { + return snapResult{ + EntryID: entryID, Rank: &rank, ResultText: text, ResultValue: f64(value), + Unit: "s", Status: "ok", State: state, + } +} + +func load(t *testing.T, db *sql.DB, keys ...revisions.Key) map[revisions.Key]revisions.Trail { + t.Helper() + trails, err := revisions.Load(context.Background(), db, keys) + if err != nil { + t.Fatalf("Load: %v", err) + } + return trails +} + +// 发布 → 改成绩 → 重新发布:能读出「改过 1 次」、最后一次的时间与原因。 +func TestLoadCountsRepublishAfterEdit(t *testing.T) { + db := newDB(t, []revision{ + {eventID: 1, created: "2026-09-13 02:40:00", results: []snapResult{ + result(11, 1, "11.58", 11.58, "published"), + result(12, 2, "11.92", 11.92, "published"), + }}, + {eventID: 1, created: "2026-09-13 02:50:00", results: []snapResult{ + // 退回草稿:只有 state 变,成绩一个字没动。 + result(11, 1, "11.58", 11.58, "draft"), + result(12, 2, "11.92", 11.92, "published"), + }}, + {eventID: 1, message: "", actorID: 7, created: "2026-09-13 02:58:00", results: []snapResult{ + result(11, 1, "11.42", 11.42, "published"), + result(12, 3, "11.92", 11.92, "published"), + }}, + }) + + trails := load(t, db, revisions.Key{EventID: 1, EntryID: 11}, revisions.Key{EventID: 1, EntryID: 12}) + got := trails[revisions.Key{EventID: 1, EntryID: 11}] + if got.Count != 1 { + t.Fatalf("11 号成绩改过 1 次,得到 %d", got.Count) + } + if got.At != "2026-09-13 02:58:00" { + t.Fatalf("最后一次修订时间 = %q", got.At) + } + // 12 号成绩一个字没改,只有名次被引擎重算(2 → 3):不能算修订。 + if other, ok := trails[revisions.Key{EventID: 1, EntryID: 12}]; !ok || other.Count != 0 { + t.Fatalf("没改过的成绩不该报修订,得到 %+v(存在=%v)", other, ok) + } +} + +// 原因优先取这条成绩自己的备注(「退回草稿」写下的理由),修订行的 message 只作兜底。 +func TestLoadPrefersResultNoteAsReason(t *testing.T) { + db := newDB(t, []revision{ + {eventID: 1, created: "2026-09-13 02:40:00", results: []snapResult{ + result(11, 1, "11.58", 11.58, "published"), + }}, + {eventID: 1, message: "跳过 3 条只填了成绩文本的草稿", actorID: 7, created: "2026-09-13 02:58:00", + results: []snapResult{func() snapResult { + r := result(11, 1, "11.42", 11.42, "published") + r.Note = str("成绩录入笔误") + return r + }()}}, + }) + got := load(t, db, revisions.Key{EventID: 1, EntryID: 11})[revisions.Key{EventID: 1, EntryID: 11}] + if got.Reason != "成绩录入笔误" { + t.Fatalf("原因应取成绩备注,得到 %q", got.Reason) + } + if got.ActorID == nil || *got.ActorID != 7 { + t.Fatalf("操作人 = %v,期望 7", got.ActorID) + } +} + +// 没有备注时退回修订行的 message;两者都没有就是空串(调用方只显示时间,不编原因)。 +func TestLoadReasonFallsBackToMessageThenEmpty(t *testing.T) { + db := newDB(t, []revision{ + {eventID: 1, created: "2026-09-13 02:40:00", results: []snapResult{result(11, 1, "11.58", 11.58, "published")}}, + {eventID: 1, message: "现场复核后更正", created: "2026-09-13 02:58:00", + results: []snapResult{result(11, 1, "11.42", 11.42, "published")}}, + {eventID: 1, created: "2026-09-13 03:10:00", results: []snapResult{result(11, 1, "11.30", 11.30, "published")}}, + }) + got := load(t, db, revisions.Key{EventID: 1, EntryID: 11})[revisions.Key{EventID: 1, EntryID: 11}] + if got.Count != 2 { + t.Fatalf("改了两次应报 2,得到 %d", got.Count) + } + if got.Reason != "" { + t.Fatalf("最后一次没写原因就应留空,得到 %q", got.Reason) + } + if got.At != "2026-09-13 03:10:00" { + t.Fatalf("最后一次修订时间 = %q", got.At) + } +} + +// 一次都没在版本链里出现过(没有基线)时不返回该 Key —— 调用方据此显示为空,而不是 0。 +func TestLoadOmitsKeysWithoutBaseline(t *testing.T) { + db := newDB(t, []revision{ + {eventID: 1, created: "2026-09-13 02:40:00", results: []snapResult{result(11, 1, "11.58", 11.58, "published")}}, + }) + trails := load(t, db, revisions.Key{EventID: 1, EntryID: 11}, revisions.Key{EventID: 1, EntryID: 99}, + revisions.Key{EventID: 2, EntryID: 11}) + if _, ok := trails[revisions.Key{EventID: 1, EntryID: 99}]; ok { + t.Fatalf("没出现在任何快照里的成绩不该有痕迹") + } + if _, ok := trails[revisions.Key{EventID: 2, EntryID: 11}]; ok { + t.Fatalf("别的项目下的同号报名项不该被认成同一条成绩") + } + if got := trails[revisions.Key{EventID: 1, EntryID: 11}]; got.Count != 0 { + t.Fatalf("只发布过一次的成绩应追溯得到、且没改过,得到 %+v", got) + } +} + +// 「作废 / 改判」改的是状态不是成绩文本:也算改过(否则现场看不出这格被改判过)。 +func TestLoadCountsStatusChange(t *testing.T) { + db := newDB(t, []revision{ + {eventID: 1, created: "2026-09-13 02:40:00", results: []snapResult{result(11, 1, "11.58", 11.58, "published")}}, + {eventID: 1, created: "2026-09-13 03:00:00", results: []snapResult{func() snapResult { + r := result(11, 1, "11.58", 11.58, "published") + r.Status = "dq" + return r + }()}}, + }) + if got := load(t, db, revisions.Key{EventID: 1, EntryID: 11})[revisions.Key{EventID: 1, EntryID: 11}]; got.Count != 1 { + t.Fatalf("改判(状态变化)应算改过 1 次,得到 %+v", got) + } +} + +// 同一条成绩的小项下别的成绩反复改,不能把它的修订次数带上去。 +func TestLoadKeepsEventsApart(t *testing.T) { + db := newDB(t, []revision{ + {eventID: 1, created: "2026-09-13 02:40:00", results: []snapResult{ + result(11, 1, "11.58", 11.58, "published"), result(21, 1, "22.10", 22.10, "published"), + }}, + {eventID: 1, created: "2026-09-13 03:00:00", results: []snapResult{ + result(11, 1, "11.58", 11.58, "published"), result(21, 1, "21.80", 21.80, "published"), + }}, + {eventID: 2, created: "2026-09-13 03:10:00", results: []snapResult{result(11, 1, "11.42", 11.42, "published")}}, + }) + trails := load(t, db, revisions.Key{EventID: 1, EntryID: 11}, revisions.Key{EventID: 1, EntryID: 21}, + revisions.Key{EventID: 2, EntryID: 11}) + if got := trails[revisions.Key{EventID: 1, EntryID: 11}].Count; got != 0 { + t.Fatalf("同一小项里别人改了,自己不算改过,得到 %d", got) + } + if got := trails[revisions.Key{EventID: 1, EntryID: 21}].Count; got != 1 { + t.Fatalf("真正改了的那条应报 1,得到 %d", got) + } + if got := trails[revisions.Key{EventID: 2, EntryID: 11}].Count; got != 0 { + t.Fatalf("另一个小项里的同号报名项不该受牵连,得到 %d", got) + } +} + +// 破纪录加分 / 人工调整 / 聚合流水没有「一条成绩」可追:KeyFor 不给它们身份, +// 免得把成绩的修订说成「那笔加分被改过」。 +func TestKeyForOnlyAcceptsScoreLedger(t *testing.T) { + if got := revisions.KeyFor("record_bonus", 1, 11); got != (revisions.Key{}) { + t.Fatalf("破纪录加分不该挂成绩的修订痕迹,得到 %+v", got) + } + if got := revisions.KeyFor("adjustment", 1, 11); got != (revisions.Key{}) { + t.Fatalf("人工调整不该挂成绩的修订痕迹,得到 %+v", got) + } + if got := revisions.KeyFor("result", 0, 11); got != (revisions.Key{}) { + t.Fatalf("没有小项的流水追不了,得到 %+v", got) + } + if got := revisions.KeyFor("result", 1, 0); got != (revisions.Key{}) { + t.Fatalf("聚合流水没有报名项,追不了,得到 %+v", got) + } + if got := revisions.KeyFor("result", 1, 11); got != (revisions.Key{EventID: 1, EntryID: 11}) { + t.Fatalf("成绩流水应给出身份,得到 %+v", got) + } +} diff --git a/server/internal/rules/aggregate_mode_test.go b/server/internal/rules/aggregate_mode_test.go new file mode 100644 index 0000000..6716970 --- /dev/null +++ b/server/internal/rules/aggregate_mode_test.go @@ -0,0 +1,220 @@ +package rules + +import ( + "database/sql" + "errors" + "strings" + "testing" + + "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" +) + +// 聚合口径(basis=aggregate 的 avg / sum)在规则包这条路上的口径: +// 解析认 avg/sum、缺省即 avg;导入落库补成具体值;导出只写非缺省值(sum), +// 规则包里显式写 avg 与不写等价,不该被当成一次「通道改动」。 +// +// 现场背景:团体引体向上这类双计项目的团体通道,领导还没定按平均还是按总和, +// 两种都要能在规则包里表达,且默认仍是升级前的平均值口径。 +const aggregateModePackYAML = `format: scoreboard-rules +formatVersion: 1 +meta: { code: demo-rules, name: 示例规则包 } +standings: { individualToTeamWeight: 1, tieBreak: [points, gold, silver, bronze, teamCode] } +profiles: + - code: team_top6 + name: 团体项目前六名 + awardRanks: 2 + tieMode: skip + rules: + - { rank: 1, points: 15 } + - { rank: 2, points: 10 } +recordBonus: { enabled: false, mode: max } +manualAdjustment: { enabled: false, reasonRequired: true } +channelTemplates: + - match: { eventType: individual } + channels: + - { scope: athlete, basis: result, profile: team_top6 } +eventOverrides: + - eventCode: EVT_SUM + name: 团体引体向上(总和) + channels: + - { scope: team, basis: aggregate, profile: team_top6, aggregateMode: sum } + - eventCode: EVT_AVG + name: 团体引体向上(平均,显式写缺省值) + channels: + - { scope: team, basis: aggregate, profile: team_top6, aggregateMode: avg } +` + +// seedAggregateEvents 建两个可排名的团体小项(compare 必须有方向,否则 aggregate 通道用不了)。 +func seedAggregateEvents(t *testing.T, db *sql.DB) { + t.Helper() + sportID := insertID(t, db, `INSERT INTO sports (code, name) VALUES ('demo-sport', '示例大项')`) + for _, ev := range []struct{ code, name string }{ + {"EVT_SUM", "团体引体向上(总和)"}, + {"EVT_AVG", "团体引体向上(平均,显式写缺省值)"}, + } { + if _, err := db.Exec(`INSERT INTO events (sport_id, code, name, event_type, result_mode, result_type, compare, scored, multiplier) + VALUES (?, ?, ?, 'individual_team', 'auto', 'count', 'desc', 1, 1)`, sportID, ev.code, ev.name); err != nil { + t.Fatalf("插入项目 %s: %v", ev.code, err) + } + } +} + +// TestParseAggregateMode 守解析:avg / sum 都认,缺省即 avg,拼错的取值必须报错。 +func TestParseAggregateMode(t *testing.T) { + pack, err := Parse([]byte(aggregateModePackYAML)) + if err != nil { + t.Fatalf("Parse: %v", err) + } + overrides := map[string]Channel{} + for _, ov := range pack.EventOverrides { + overrides[ov.EventCode] = (*ov.Channels)[0] + } + if got := overrides["EVT_SUM"].AggregatesBy(); got != domain.AggregateSum { + t.Errorf("aggregateMode: sum 应解析成 sum,实际 %q", got) + } + // 显式写 avg 与不写等价(缺省值),解析结果都要是 avg。 + if got := overrides["EVT_AVG"].AggregatesBy(); got != domain.AggregateAvg { + t.Errorf("aggregateMode: avg 应解析成 avg,实际 %q", got) + } + // 普通通道(basis=result)不写该字段时同样是缺省 avg,不影响任何行为。 + tmpl := pack.ChannelTemplates[0].Channels[0] + if tmpl.AggregateMode != "" || tmpl.AggregatesBy() != domain.AggregateAvg { + t.Errorf("缺省通道的汇总口径应为空(等价 avg),实际 %q", tmpl.AggregateMode) + } + + // 拼错的取值必须报错:静默按 avg 处理会让现场以为切到了总和。 + bad := strings.Replace(aggregateModePackYAML, "aggregateMode: sum", "aggregateMode: biggest", 1) + if _, err := Parse([]byte(bad)); !errors.Is(err, ErrValidation) { + t.Fatalf("非法聚合口径应报校验错误,实际 %v", err) + } else if !strings.Contains(err.Error(), "aggregateMode") { + t.Errorf("报错应点明 aggregateMode 字段,实际 %v", err) + } +} + +// TestApplyAndExportAggregateMode 守落库与导出: +// sum 落库并导出回来;显式 avg 落库成 avg、导出时按缺省省略(导出 → 导入不产生多余差异)。 +func TestApplyAndExportAggregateMode(t *testing.T) { + db := openEventDB(t) + seedAggregateEvents(t, db) + + next, err := Parse([]byte(aggregateModePackYAML)) + if err != nil { + t.Fatalf("Parse: %v", err) + } + if _, err := Apply(db, &ChangeSet{Next: next}); err != nil { + t.Fatalf("Apply: %v", err) + } + + modeOf := func(code string) string { + t.Helper() + var mode string + if err := db.QueryRow(`SELECT c.aggregate_mode FROM event_score_channels c + JOIN events e ON e.id = c.event_id WHERE e.code = ? AND c.basis = 'aggregate'`, code).Scan(&mode); err != nil { + t.Fatalf("读取 %s 的聚合口径: %v", code, err) + } + return mode + } + if got := modeOf("EVT_SUM"); got != string(domain.AggregateSum) { + t.Errorf("EVT_SUM 落库 = %q,期望 sum", got) + } + // 缺省口径也落成具体值 avg,引擎侧不必再判空。 + if got := modeOf("EVT_AVG"); got != string(domain.AggregateAvg) { + t.Errorf("EVT_AVG 落库 = %q,期望 avg", got) + } + + exported, err := Export(db, Meta{Code: "demo", Name: "导出"}) + if err != nil { + t.Fatalf("Export: %v", err) + } + exportedMode := map[string]string{} + for _, ov := range exported.EventOverrides { + exportedMode[ov.EventCode] = (*ov.Channels)[0].AggregateMode + } + // sum 是非缺省口径,必须写进导出文件,否则「导出 → 导入」会把总和口径丢成平均。 + if exportedMode["EVT_SUM"] != string(domain.AggregateSum) { + t.Errorf("EVT_SUM 导出 = %q,期望 sum", exportedMode["EVT_SUM"]) + } + // avg 是缺省值,导出文件里不出现,往返比对不会凭空多出差异。 + if exportedMode["EVT_AVG"] != "" { + t.Errorf("EVT_AVG 导出 = %q,期望省略(avg 是缺省值)", exportedMode["EVT_AVG"]) + } + + // 导出的包重新导入:库里已有 sum / avg,差异必须为空。 + cur, err := Load(db) + if err != nil { + t.Fatalf("Load: %v", err) + } + reparsed, err := Parse(mustMarshal(t, exported)) + if err != nil { + t.Fatalf("重新 Parse 导出结果: %v", err) + } + cs, err := Diff(cur, reparsed) + if err != nil { + t.Fatalf("Diff: %v", err) + } + if !cs.Empty() { + t.Fatalf("导出再导入不应有差异: %+v", cs.Channels) + } +} + +// TestDiffIgnoresExplicitDefaultAggregateMode 守差异比对: +// 规则包显式写 avg 与库里缺省值等价,不能被当成「通道改动」而触发一次无意义的重算。 +func TestDiffIgnoresExplicitDefaultAggregateMode(t *testing.T) { + db := openEventDB(t) + seedAggregateEvents(t, db) + + next, err := Parse([]byte(aggregateModePackYAML)) + if err != nil { + t.Fatalf("Parse: %v", err) + } + if _, err := Apply(db, &ChangeSet{Next: next}); err != nil { + t.Fatalf("Apply: %v", err) + } + cur, err := Load(db) + if err != nil { + t.Fatalf("Load: %v", err) + } + + // 库里 EVT_AVG 是 avg(导出时按缺省省略),规则包再显式写一遍 avg:语义相同,不该有差异。 + if cs, err := Diff(cur, next); err != nil { + t.Fatalf("Diff: %v", err) + } else if !cs.Empty() { + t.Fatalf("显式 avg 与缺省 avg 等价,不应有差异: %+v", cs.Channels) + } + + // 对照:把 EVT_AVG 换成 sum 就必须报出一次通道改动(否则现场改了口径却不重算)。 + target := strings.Replace(aggregateModePackYAML, + "{ scope: team, basis: aggregate, profile: team_top6, aggregateMode: avg }", + "{ scope: team, basis: aggregate, profile: team_top6, aggregateMode: sum }", 1) + changed, err := Parse([]byte(target)) + if err != nil { + t.Fatalf("Parse 改口径后的规则包: %v", err) + } + cs, err := Diff(cur, changed) + if err != nil { + t.Fatalf("Diff: %v", err) + } + hit := false + for _, ch := range cs.Channels { + if ch.EventCode == "EVT_AVG" { + hit = true + } + } + if !hit { + t.Fatalf("把口径从 avg 改成 sum 必须报出通道改动,实际 %+v", cs.Channels) + } +} + +// insertID 执行一条 INSERT 并返回自增 id。 +func insertID(t *testing.T, db *sql.DB, query string, args ...any) int64 { + t.Helper() + res, err := db.Exec(query, args...) + if err != nil { + t.Fatalf("执行 SQL 失败: %v\n%s", err, query) + } + id, err := res.LastInsertId() + if err != nil { + t.Fatalf("获取 id: %v", err) + } + return id +} diff --git a/server/internal/rules/apply.go b/server/internal/rules/apply.go index 94a675f..c43ddfa 100644 --- a/server/internal/rules/apply.go +++ b/server/internal/rules/apply.go @@ -17,14 +17,44 @@ type ApplyResult struct { EventsSkipped []string `json:"eventsSkipped,omitempty"` } -// Apply 把差异预览落地。规则包语义是「全量覆盖」,因此按 Next 的目标状态同步, -// 而不是逐条套用 diff 列表——这样重复导入同一份规则包是幂等的。 +// Apply 把差异预览落地(自带事务)。 +// +// 规则包语义是「全量覆盖」,因此按 Next 的目标状态同步,而不是逐条套用 diff 列表—— +// 这样重复导入同一份规则包是幂等的。 // 只填了 Next 的变更集(例如确认导入时重新 Parse 上传内容)同样可以调用,等价于强制全量导入。 // +// Apply 不负责重算积分:分值一变,调用方必须全量重算(devdocs 02 §7.3)。 +// 需要「换通道」与「重算」同事务时用 ApplyTx(规则包导入走的是那条路,见其注释)。 +func Apply(db *sql.DB, cs *ChangeSet) (*ApplyResult, error) { + tx, err := db.Begin() + if err != nil { + return nil, fmt.Errorf("开启事务: %w", err) + } + defer func() { _ = tx.Rollback() }() + + res, err := ApplyTx(tx, cs) + if err != nil { + return nil, err + } + if err := tx.Commit(); err != nil { + return nil, fmt.Errorf("提交导入事务: %w", err) + } + return res, nil +} + +// ApplyTx 在调用方给定的**未提交**事务里落地规则包变更,自己不提交。 +// +// 为什么要有这个入口:换通道会先 `DELETE FROM event_score_channels` 再插新行,而 channel_ranks +// 的 channel_id 挂的是 `ON DELETE CASCADE`——通道一删,该通道的名次就跟着没了。名次由紧随其后的 +// 全量重算重建,两者分属不同事务时,只要重算失败(例如某个小项配不出名次),名次表就停在 +// 「已经被清空、又补不回来」的中间态:榜单分还在、奖牌全 0,而且自愈与重试导入都会因同一个小项 +// 再次失败(审查 04 P0-1,实测 2 行 → 0 行、金牌 1 → 0)。 +// 共用一个事务后,重算失败即整包回滚,名次表回到导入前的状态。 +// // 落地顺序:模板 → 通道 → 删除无主模板 → 项目开关 → 赛事设置。 // 通道先改完再删模板,避免「模板被换掉」时误判引用。 -// Apply 不负责重算积分:分值一变,调用方必须全量重算(devdocs 02 §7.3)。 -func Apply(db *sql.DB, cs *ChangeSet) (*ApplyResult, error) { +// 现状快照在**本事务内**读取(loadSnapshot(tx)),保证看到的就是即将写入的这份数据。 +func ApplyTx(tx *sql.Tx, cs *ChangeSet) (*ApplyResult, error) { if cs == nil || cs.Next == nil { return nil, ErrNilChangeSet } @@ -33,7 +63,7 @@ func Apply(db *sql.DB, cs *ChangeSet) (*ApplyResult, error) { return nil, err } - cur, err := Load(db) + cur, err := loadSnapshot(tx) if err != nil { return nil, err } @@ -42,12 +72,6 @@ func Apply(db *sql.DB, cs *ChangeSet) (*ApplyResult, error) { return nil, err } - tx, err := db.Begin() - if err != nil { - return nil, fmt.Errorf("开启事务: %w", err) - } - defer func() { _ = tx.Rollback() }() - res := &ApplyResult{EventsSkipped: unknown} // 1. 模板全量 upsert,并建立「编码 → id」映射供通道引用。 @@ -85,8 +109,9 @@ func Apply(db *sql.DB, cs *ChangeSet) (*ApplyResult, error) { if !ok { return nil, fmt.Errorf("项目 %s 的通道引用了不存在的模板 %q", code, ch.Profile) } - if _, err := tx.Exec(`INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order, count_to_team, count_to_medals, count_to_team_medals) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, eventID, string(ch.Scope), string(ch.Basis), profileID, i, + if _, err := tx.Exec(`INSERT INTO event_score_channels (event_id, scope, basis, profile_id, sort_order, aggregate_mode, count_to_team, count_to_medals, count_to_team_medals) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, eventID, string(ch.Scope), string(ch.Basis), profileID, i, + string(ch.AggregatesBy()), boolToInt(ch.CountsToTeam()), boolToInt(ch.CountsToMedals()), boolToInt(ch.CountsToTeamMedals())); err != nil { return nil, fmt.Errorf("写入项目 %s 的计分通道: %w", code, err) } @@ -149,10 +174,6 @@ func Apply(db *sql.DB, cs *ChangeSet) (*ApplyResult, error) { } res.SettingsWritten++ } - - if err := tx.Commit(); err != nil { - return nil, fmt.Errorf("提交导入事务: %w", err) - } return res, nil } diff --git a/server/internal/rules/award_ranks_test.go b/server/internal/rules/award_ranks_test.go new file mode 100644 index 0000000..a2aaa97 --- /dev/null +++ b/server/internal/rules/award_ranks_test.go @@ -0,0 +1,139 @@ +package rules + +import ( + "errors" + "strings" + "testing" + + "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" +) + +// 本文件钉住工单 E:分值表的档位超出「录取档位数(awardRanks)」时必须拒收。 +// +// 算分引擎只在 award_ranks > 0 时按名次截断(domain/scoring.go 的 basePoints), +// 而本包原先只拒 awardRanks < 0:一份「配到第 7 档、录取名次还留着 6」的规则包能过校验、 +// 安静导入——第 7 档在模板页上写着分,榜上恒为 0,界面上看不出任何异常(审查 01 P1)。 +// awardRanks: 0 表示不按名次封顶(既有语义),这种包必须继续放行。 + +// sevenRankPackYAML 是「配到第 7 档」的规则包;录取名次由用例替换成 6 / 0。 +const sevenRankPackYAML = `format: scoreboard-rules +formatVersion: 1 +meta: { code: demo, name: 第七档 } +profiles: + - code: p7 + name: 前七名 + awardRanks: 6 + tieMode: skip + rules: + - { rank: 1, points: 10 } + - { rank: 2, points: 8 } + - { rank: 3, points: 6 } + - { rank: 4, points: 5 } + - { rank: 5, points: 4 } + - { rank: 6, points: 3 } + - { rank: 7, points: 2 } +channelTemplates: + - match: { eventType: individual } + channels: + - { scope: athlete, basis: result, profile: p7 } +` + +// 录取名次 6、分值表到第 7 档:导入必须整体拒收,且说明要说清「哪一档超了」「怎么改」。 +func TestParseRejectsAwardRanksOverflow(t *testing.T) { + _, err := Parse([]byte(sevenRankPackYAML)) + if !errors.Is(err, ErrValidation) { + t.Fatalf("第 7 档 + awardRanks=6 应报 ErrValidation,实际 %v", err) + } + var ve *ValidationError + if !errors.As(err, &ve) { + t.Fatalf("应返回 *ValidationError,实际 %T", err) + } + var found bool + for _, is := range ve.Issues { + if is.Path != "profiles[0].awardRanks" { + continue + } + found = true + // 现场要能照着改:说清超出的档位、当前录取名次,以及「0 表示不封顶」这个出口。 + for _, want := range []string{"第 7 档", "第 6 档", "0 表示不按名次封顶"} { + if !strings.Contains(is.Msg, want) { + t.Fatalf("说明里缺少 %q:%s", want, is.Msg) + } + } + } + if !found { + t.Fatalf("问题应挂在 profiles[0].awardRanks 上,实际 %+v", ve.Issues) + } +} + +// 这条检查只在**写入**侧生效:导出(Marshal)走的是 Validate,必须继续容忍越档模板。 +// 库里修好之前存下的历史配置如果让导不出来,GET /api/rules/export 与赛事项目包(备份)会一起 500, +// 而它们正是现场排障与备份的入口——所以导出侧宁可原样导出,由用户在模板页上改。 +func TestMarshalStillAllowsLegacyAwardRanksOverflow(t *testing.T) { + pack := &RulePack{ + Format: FormatName, + FormatVersion: FormatVersion, + Meta: Meta{Code: "legacy", Name: "历史越档模板"}, + Profiles: []Profile{{ + Code: "p7", Name: "前七名", AwardRanks: 6, TieMode: domain.TieSkip, + Rules: []Rule{{1, 10}, {2, 8}, {3, 6}, {4, 5}, {5, 4}, {6, 3}, {7, 2}}, + }}, + } + if err := pack.Validate(); err != nil { + t.Fatalf("导出侧校验不该拦越档模板,实际 %v", err) + } + if _, err := Marshal(pack); err != nil { + t.Fatalf("越档模板必须还能导出,实际 %v", err) + } + // 但同一份配置从导入进来时就要被拒(Parse → ValidateForImport)。 + if _, err := Parse([]byte(sevenRankPackYAML)); !errors.Is(err, ErrValidation) { + t.Fatalf("导入侧应拒收越档模板,实际 %v", err) + } +} + +// 两种合法形态不得被误杀:正好相等(第 6 档 + awardRanks 6)、不封顶(第 7 档 + awardRanks 0)。 +func TestParseAcceptsAwardRanksCoveringRules(t *testing.T) { + cases := map[string]string{ + "正好相等": strings.Replace(sevenRankPackYAML, "awardRanks: 6", "awardRanks: 7", 1), + "不封顶": strings.Replace(sevenRankPackYAML, "awardRanks: 6", "awardRanks: 0", 1), + } + for name, yaml := range cases { + t.Run(name, func(t *testing.T) { + pack, err := Parse([]byte(yaml)) + if err != nil { + t.Fatalf("应解析成功,实际 %v", err) + } + if got := len(pack.Profiles[0].Rules); got != 7 { + t.Fatalf("分值表应保留 7 档,实际 %d", got) + } + }) + } +} + +// AwardRanksOverflow 是保存模板与导入规则包共用的判定,边界直接钉在函数上。 +func TestAwardRanksOverflowBoundaries(t *testing.T) { + cases := []struct { + awardRanks int + maxRuleRank int + overflow bool + }{ + {0, 10, false}, // 0 = 不封顶 + {-1, 10, false}, // 负数由别处拦,这里不重复报 + {6, 0, false}, // 没有分值明细 + {6, 6, false}, // 正好覆盖 + {7, 6, false}, // 录取名次多于档位:合法(后面几档没人拿得到) + {6, 7, true}, + {6, 10, true}, + } + for _, tc := range cases { + msg := AwardRanksOverflow(tc.awardRanks, tc.maxRuleRank) + if tc.overflow != (msg != "") { + t.Fatalf("awardRanks=%d maxRuleRank=%d 应 overflow=%v,实际 %q", + tc.awardRanks, tc.maxRuleRank, tc.overflow, msg) + } + } + // 超出的档位取的是「最大的那一档」,不是第一条超出的档位。 + if msg := AwardRanksOverflow(6, 10); !strings.Contains(msg, "第 10 档") { + t.Fatalf("应点名最大的超档档位,实际 %q", msg) + } +} diff --git a/server/internal/rules/convert.go b/server/internal/rules/convert.go index 4b56f15..17fef24 100644 --- a/server/internal/rules/convert.go +++ b/server/internal/rules/convert.go @@ -32,14 +32,16 @@ func (p Profile) ToDomain(id int64) domain.ScoringProfile { } // ToDomain 把通道转成 domain.ScoreChannel;profileID 由调用方按模板编码查出。 -// 三个开关缺省(true)时不落指针,保持与「库里只有显式关闭的通道才写 0」一致。 +// 三个开关缺省(true)时不落指针,保持与「库里只有显式关闭的通道才写 0」一致; +// 汇总口径落库时补成具体值(avg / sum),缺省即 avg。 func (c Channel) ToDomain(eventID, profileID int64, sortOrder int) domain.ScoreChannel { out := domain.ScoreChannel{ - EventID: eventID, - Scope: c.Scope, - Basis: c.Basis, - ProfileID: profileID, - SortOrder: sortOrder, + EventID: eventID, + Scope: c.Scope, + Basis: c.Basis, + ProfileID: profileID, + SortOrder: sortOrder, + AggregateMode: c.AggregatesBy(), } if !c.CountsToTeam() { out.CountToTeam = BoolPtr(false) diff --git a/server/internal/rules/diff.go b/server/internal/rules/diff.go index 143f70c..502fd3f 100644 --- a/server/internal/rules/diff.go +++ b/server/internal/rules/diff.go @@ -4,6 +4,9 @@ import ( "errors" "fmt" "sort" + "strings" + + "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" ) // ChangeKind 是差异类型。 @@ -181,14 +184,18 @@ func resolveTargets(cur *Snapshot, next *RulePack) (map[string][]Channel, []stri } if ov, ok := overrideByCode[ev.Code]; ok && ov.Channels != nil { targets[ev.Code] = append([]Channel(nil), (*ov.Channels)...) - continue - } - for _, t := range next.ChannelTemplates { - if matchEvent(t.Match, ev) { - targets[ev.Code] = append([]Channel(nil), t.Channels...) - break + } else { + for _, t := range next.ChannelTemplates { + if matchEvent(t.Match, ev) { + targets[ev.Code] = append([]Channel(nil), t.Channels...) + break + } } } + // 目标通道算出来了,落地前先确认它在这个小项上跑得起来(见 checkCompareCompatible)。 + if err := checkCompareCompatible(ev, targets[ev.Code]); err != nil { + return nil, nil, err + } } var unknown []string @@ -201,6 +208,57 @@ func resolveTargets(cur *Snapshot, next *RulePack) (map[string][]Channel, []stri return targets, unknown, nil } +// CompareConflictError 是「规则包给 compare=none 的小项配了需要比较方向的通道」这一配置错误。 +// +// 带小项编码与名称是必须的:导入失败的提示如果只说「basis=result 的通道要求小项配置 +// compare=asc/desc」,现场在一场几十上百个小项的赛事里根本找不到是哪一个。 +type CompareConflictError struct { + EventCode string + EventName string + // Bases 是冲突的通道口径(result / aggregate),按通道出现顺序、已去重。 + Bases []string +} + +func (e *CompareConflictError) Error() string { + return fmt.Sprintf("小项 %s(%s)配置的是 compare=none(名次靠人工录入),规则包却给它配了 basis=%s 的通道:"+ + "这类通道要先按成绩排出名次,compare=none 时排不出来,导入后这个小项算不了分。"+ + "请在规则包里为它写一段 eventOverrides,把 channels 改成 basis=manual"+ + "(个人名次用 scope: athlete,团体名次用 scope: team),或调整通道模板的 match 条件别匹配到它。", + e.EventCode, e.EventName, strings.Join(e.Bases, "、")) +} + +// checkCompareCompatible 拦下「compare=none 的小项被配上 basis=result / basis=aggregate 通道」。 +// +// 为什么要在这里拦:这两种口径都要先按成绩排名,而 compare=none(名次靠人工录入)没有名次可算, +// domain.ScoreEvent 会直接返回 ErrCompareRequired。以前这条配置能过,代价是导入「先换通道」已经提交 +// (换通道时 channel_ranks 被外键级联清空)、紧接着的全量重算才报错,名次表就停在空表状态, +// 而且自愈与重试导入都会因同一个小项再次失败(审查 04 P0-1)。 +// 现在改成在**落地之前**整包拒收:一个字节都不写,失败提示直接指出哪个小项、为什么。 +// +// 只校验本次要写入的目标通道(模板套用与显式 override 一视同仁):库里既有的、规则包没覆盖到的 +// 通道不动它——那属于「改配置」而不是「导入规则包」的事,越权清理会误伤别人手工配好的设置。 +func checkCompareCompatible(ev EventInfo, channels []Channel) error { + if len(channels) == 0 || ev.Compare != domain.CompareNone { + return nil + } + var bases []string + seen := map[string]bool{} + for _, ch := range channels { + if ch.Basis != domain.BasisResult && ch.Basis != domain.BasisAggregate { + continue + } + if seen[string(ch.Basis)] { + continue + } + seen[string(ch.Basis)] = true + bases = append(bases, string(ch.Basis)) + } + if len(bases) == 0 { + return nil + } + return &CompareConflictError{EventCode: ev.Code, EventName: ev.Name, Bases: bases} +} + func diffChannels(cur *Snapshot, targets map[string][]Channel) []ChannelChange { curByCode := make(map[string]EventInfo, len(cur.Events)) for _, ev := range cur.Events { @@ -240,7 +298,8 @@ func diffChannels(cur *Snapshot, targets map[string][]Channel) []ChannelChange { } // channelsEqual 逐字段比较目标通道与库中通道。 -// Channel 含 *bool 字段,整体比较会退化成比较指针地址,这里按补齐缺省后的值比。 +// Channel 含 *bool 字段,整体比较会退化成比较指针地址,这里按补齐缺省后的值比; +// 汇总口径同理按「缺省即 avg」比,避免规则包显式写 avg 与库里缺省值被当成一次改动。 func channelsEqual(a, b []Channel) bool { if len(a) != len(b) { return false @@ -249,6 +308,9 @@ func channelsEqual(a, b []Channel) bool { if a[i].Scope != b[i].Scope || a[i].Basis != b[i].Basis || a[i].Profile != b[i].Profile { return false } + if a[i].AggregatesBy() != b[i].AggregatesBy() { + return false + } if a[i].CountsToTeam() != b[i].CountsToTeam() { return false } diff --git a/server/internal/rules/diff_test.go b/server/internal/rules/diff_test.go index 4bd342f..2c292cb 100644 --- a/server/internal/rules/diff_test.go +++ b/server/internal/rules/diff_test.go @@ -1,6 +1,8 @@ package rules import ( + "errors" + "strings" "testing" "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" @@ -258,6 +260,95 @@ func TestResolveTargetsClearsChannelsForUnscored(t *testing.T) { }) } +// compare=none 的个人小项(名次靠人工录入)不能被配上 basis=result / basis=aggregate 的通道: +// 这两种口径都要先按成绩排名,而 compare=none 没有名次可算,算分时必然返回 ErrCompareRequired。 +// 以前这条配置能过,代价是「先换通道」(channel_ranks 被外键级联清空)已经提交、紧接着的重算才失败, +// 名次表停在空表状态且补不回来(审查 04 P0-1)。现在必须在落地之前整包拒收。 +func TestResolveTargetsRejectsCompareRequiredChannelOnCompareNoneEvent(t *testing.T) { + cur := currentSnapshot(t) + cur.Events = append(cur.Events, EventInfo{ + ID: 9, Code: "EVT_MANUAL", Name: "手榴弹投准", + EventType: domain.EventTypeIndividual, ResultType: domain.ResultTypeNone, + Compare: domain.CompareNone, Scored: true, Multiplier: 1, + Channels: []Channel{{Scope: domain.ScopeAthlete, Basis: domain.BasisManual, Profile: "individual_top6"}}, + }) + + next, err := Parse([]byte(nextPackYAML)) + if err != nil { + t.Fatalf("Parse: %v", err) + } + + t.Run("模板套出来的 basis=result 被拦下", func(t *testing.T) { + _, _, err := resolveTargets(cur, next) + var conflict *CompareConflictError + if !errors.As(err, &conflict) { + t.Fatalf("compare=none 的小项被配上 basis=result 应报 CompareConflictError,得到 %v", err) + } + if conflict.EventCode != "EVT_MANUAL" || conflict.EventName != "手榴弹投准" { + t.Errorf("错误里必须指名是哪个小项,得到 %+v", conflict) + } + // 人话:说清哪个小项、为什么、怎么改。 + msg := conflict.Error() + for _, want := range []string{"EVT_MANUAL", "手榴弹投准", "compare=none", "basis=result", "eventOverrides", "basis=manual"} { + if !strings.Contains(msg, want) { + t.Errorf("错误信息缺少 %q:%s", want, msg) + } + } + + // 预览阶段就必须失败:不能预览说「就改这些」,落地时才炸。 + if _, err := Diff(cur, next); !errors.As(err, &conflict) { + t.Errorf("Diff 也应报 CompareConflictError,得到 %v", err) + } + }) + + t.Run("显式 override 写 basis=result 一样被拦下", func(t *testing.T) { + patched := *next + patched.EventOverrides = append(append([]EventOverride(nil), next.EventOverrides...), EventOverride{ + EventCode: "EVT_MANUAL", + Channels: ChannelListPtr([]Channel{{Scope: domain.ScopeAthlete, Basis: domain.BasisResult, Profile: "individual_top6"}}), + }) + var conflict *CompareConflictError + if _, _, err := resolveTargets(cur, &patched); !errors.As(err, &conflict) { + t.Errorf("override 显式写了 basis=result 也应拦下,得到 %v", err) + } + }) + + t.Run("override 改成 basis=manual 即放行", func(t *testing.T) { + patched := *next + patched.EventOverrides = append(append([]EventOverride(nil), next.EventOverrides...), EventOverride{ + EventCode: "EVT_MANUAL", + Channels: ChannelListPtr([]Channel{{Scope: domain.ScopeAthlete, Basis: domain.BasisManual, Profile: "individual_top6"}}), + }) + targets, _, err := resolveTargets(cur, &patched) + if err != nil { + t.Fatalf("basis=manual 不该被拦:%v", err) + } + if got := targets["EVT_MANUAL"]; len(got) != 1 || got[0].Basis != domain.BasisManual { + t.Errorf("EVT_MANUAL 的目标通道 = %+v,期望一条 basis=manual", got) + } + // 规则包没覆盖到的其它小项不受影响。 + if got := targets["EVT_IND"]; len(got) != 1 || got[0].Basis != domain.BasisResult { + t.Errorf("EVT_IND 的目标通道 = %+v,期望模板给的 basis=result", got) + } + }) + + t.Run("不计分的小项不参与校验", func(t *testing.T) { + unscored := currentSnapshot(t) + unscored.Events = append(unscored.Events, EventInfo{ + ID: 10, Code: "EVT_OFF", Name: "不计分手工名次", + EventType: domain.EventTypeIndividual, ResultType: domain.ResultTypeNone, + Compare: domain.CompareNone, Scored: false, Multiplier: 1, + }) + targets, _, err := resolveTargets(unscored, next) + if err != nil { + t.Fatalf("只排名不计分的小项不该被拦:%v", err) + } + if got, ok := targets["EVT_OFF"]; !ok || len(got) != 0 { + t.Errorf("不计分小项的目标通道 = %+v,期望空", got) + } + }) +} + // 「个人+团体」模板:match.eventType 支持 individual_team,并按 athlete + team 两条通道展开。 // 校验层不认识这个取值时会直接报错,因此 Parse 成功本身就是「不报未知类型」的断言。 // 这也是默认双计模板:个人通道按个人成绩排名且不计入单位总分,团体通道按平均成绩计分。 diff --git a/server/internal/rules/doc.go b/server/internal/rules/doc.go index 74e1e11..290ae4a 100644 --- a/server/internal/rules/doc.go +++ b/server/internal/rules/doc.go @@ -15,4 +15,6 @@ // yaml, err := rules.Marshal(out) // // 导入必须先预览再落地,且落地后必须由调用方全量重算积分(规则包一变,历史积分都得跟着变)。 +// 调用方若能把「落地」与「重算」放进同一个事务(规则包导入就是这么做的),用 ApplyTx 代替 Apply: +// 换通道会按外键级联清空 channel_ranks,两步分开提交时重算一失败名次表就补不回来了。 package rules diff --git a/server/internal/rules/last_place_zero_test.go b/server/internal/rules/last_place_zero_test.go new file mode 100644 index 0000000..5c37709 --- /dev/null +++ b/server/internal/rules/last_place_zero_test.go @@ -0,0 +1,153 @@ +package rules + +import ( + "strings" + "testing" +) + +// 随包规则包(rules/2026-驭电利刃杯军事运动会.yaml)里两个模板的「末位归零」都是关的: +// 主人 2026-09-13 的最终口径是「规则里面没配置的名次分数就是 0 分」——分只按表发, +// 系统不该替他多发或扣分。这个开关做的是另一件事:参赛人数不超过表里档位数时, +// 把名次最末的那一位也抹成 0(3 人参赛 + 6 档模板 → 第 3 名本该按表拿 6 分,却被归零), +// 那件事主人没要。一旦这里变成 true,重新导入规则包就会把这个开关静默打开,末位又丢分。 +// +// 为什么不直接读 rules/ 目录那个文件:规则包不进版本库(.gitignore 的 rules/*), +// 换台机器跑测试就读不到。所以这里放一份与随包文件同构的节选样本(只有本用例用得上的字段), +// 测的是「解析链路不会丢掉这个开关」——Parse → Canonical → ToDomain 任一环丢字段都会被抓到。 +const militaryGamesPackYAML = `format: scoreboard-rules +formatVersion: 1 +meta: + code: 2026-yudianliren-military-games + name: 2026 驭电利刃杯军事运动会 · 积分规则 + version: 1.1.0 + updatedAt: "2026-09-13" + author: AskaEth + note: 个人/团体项目均录取前六名 +standings: + individualToTeamWeight: 1 + tieBreak: [points, gold, silver, bronze, teamCode] + medalCountsTeamEvents: true + showIndividualBoard: true + showIndividualMedals: true +profiles: + - code: individual_top6 + name: 个人项目前六名 + awardRanks: 6 + lastPlaceZero: false + tieMode: skip + rules: + - { rank: 1, points: 10 } + - { rank: 2, points: 8 } + - { rank: 3, points: 6 } + - { rank: 4, points: 3 } + - { rank: 5, points: 2 } + - { rank: 6, points: 1 } + - code: team_top6 + name: 团体项目前六名 + awardRanks: 6 + lastPlaceZero: false + tieMode: skip + rules: + - { rank: 1, points: 15 } + - { rank: 2, points: 10 } + - { rank: 3, points: 8 } + - { rank: 4, points: 4 } + - { rank: 5, points: 2 } + - { rank: 6, points: 1 } +recordBonus: + enabled: false + mode: max + levels: + - { code: meet, name: 赛会纪录, points: 2 } +manualAdjustment: + enabled: false + reasonRequired: true +channelTemplates: + - match: { eventType: individual } + channels: + - { scope: athlete, basis: result, profile: individual_top6 } + - match: { eventType: team } + channels: + - { scope: team, basis: manual, profile: team_top6 } + - match: { eventType: match } + channels: + - { scope: team, basis: manual, profile: team_top6 } + - match: { eventType: individual_team } + channels: + - { scope: athlete, basis: result, profile: individual_top6, countToTeam: false } + - { scope: team, basis: aggregate, profile: team_top6 } +eventOverrides: + - eventCode: TEAM_PULLUP + name: 团体引体向上 + channels: + - { scope: athlete, basis: result, profile: individual_top6, countToTeam: false } + - { scope: team, basis: aggregate, profile: team_top6 } + - eventCode: FLIGHT_FITNESS + name: 飞行人员战斗体能 + scored: false +` + +func TestParseLastPlaceZeroDisabledForBothProfiles(t *testing.T) { + if n := strings.Count(militaryGamesPackYAML, "lastPlaceZero: false"); n != 2 { + t.Fatalf("内嵌样本应给两个模板各写一处 lastPlaceZero: false,实际 %d 处(样本与随包文件不同构了)", n) + } + + pack, err := Parse([]byte(militaryGamesPackYAML)) + if err != nil { + t.Fatalf("解析随包规则包样本失败: %v", err) + } + + index := pack.ProfileIndex() + for _, code := range []string{"individual_top6", "team_top6"} { + prof, ok := index[code] + if !ok { + t.Fatalf("随包规则包里缺少模板 %s", code) + } + if prof.LastPlaceZero { + t.Errorf("模板 %s 解析后 lastPlaceZero=true,应随主人的最终口径为 false(只按表发分)", code) + } + // 导入会把模板转成 domain.ScoringProfile 落库,转换丢字段同样等于「静默打开」。 + if dom := prof.ToDomain(0); dom.LastPlaceZero { + t.Errorf("模板 %s 转成 domain.ScoringProfile 后 lastPlaceZero=true,落库时会被打开", code) + } + } +} + +// 上面那条只有在「开关真会被读出来」时才有意义,所以补反向对照: +// 同一份样本把值改成 true / 整行删掉,解析结果必须跟着变—— +// 证明拿到 false 是因为 YAML 里写着 false(或没写),而不是解析器恒给 false。 +func TestParseLastPlaceZeroFollowsYAML(t *testing.T) { + cases := []struct { + name string + yaml string + want bool + }{ + { + name: "显式 true", + yaml: strings.ReplaceAll(militaryGamesPackYAML, "lastPlaceZero: false", "lastPlaceZero: true"), + want: true, + }, + { + name: "整行删掉(未配置,与显式 false 等价)", + yaml: strings.ReplaceAll(militaryGamesPackYAML, " lastPlaceZero: false\n", ""), + want: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.yaml == militaryGamesPackYAML { + t.Fatal("样本没有被改动,用例跑不出结论") + } + pack, err := Parse([]byte(tc.yaml)) + if err != nil { + t.Fatalf("解析样本失败: %v", err) + } + for _, prof := range pack.Profiles { + if prof.LastPlaceZero != tc.want { + t.Errorf("模板 %s 的 lastPlaceZero=%v,期望 %v", prof.Code, prof.LastPlaceZero, tc.want) + } + } + }) + } +} diff --git a/server/internal/rules/parse.go b/server/internal/rules/parse.go index 59c4fda..6addff0 100644 --- a/server/internal/rules/parse.go +++ b/server/internal/rules/parse.go @@ -44,6 +44,12 @@ func Parse(data []byte) (*RulePack, error) { if err := canonical.Validate(); err != nil { return nil, err } + // 导入是写入路径:在解析阶段就拦下「这份配置算不出分」的情况(例如分值表配到第 7 档、 + // awardRanks 还是 6,第 7 档进来就会静默变 0 分)。导出侧不走这里——历史库里已经存在的 + // 越档模板照样要能导出来(见 Validate 与 ValidateForImport 的注释)。 + if err := canonical.ValidateForImport(); err != nil { + return nil, err + } return &canonical, nil } diff --git a/server/internal/rules/snapshot.go b/server/internal/rules/snapshot.go index 2789563..ba48114 100644 --- a/server/internal/rules/snapshot.go +++ b/server/internal/rules/snapshot.go @@ -19,7 +19,18 @@ type EventInfo struct { Scored bool Multiplier float64 AwardMedals bool - Channels []Channel + // Compare 是排序方向。必须读出来:basis=result / basis=aggregate 的通道要先按成绩排名, + // compare=none(名次靠人工录入)的小项配不了它们(见 resolveTargets 的守卫)。 + Compare domain.CompareMode + Channels []Channel +} + +// queryer 是 *sql.DB 与 *sql.Tx 共有的读接口。 +// Load 既要在库上读,也要在导入事务**内部**读:ApplyTx 必须看到与自己写入同一个事务的一致视图, +// 否则「读到的现状」可能已被别处的改动覆盖,按过期现状算出的目标通道会写错。 +type queryer interface { + Query(query string, args ...any) (*sql.Rows, error) + QueryRow(query string, args ...any) *sql.Row } // Snapshot 是赛事库当前的规则状态:规则包 + 项目目录。 @@ -40,19 +51,22 @@ func (s *Snapshot) EventByCode(code string) (EventInfo, bool) { } // Load 从赛事库读取当前规则状态。规则包元数据(meta)库里不存,保持为空。 -func Load(db *sql.DB) (*Snapshot, error) { +func Load(db *sql.DB) (*Snapshot, error) { return loadSnapshot(db) } + +// loadSnapshot 是 Load 的实现体,接受 *sql.DB 或 *sql.Tx。 +func loadSnapshot(q queryer) (*Snapshot, error) { pack := &RulePack{ Format: FormatName, FormatVersion: FormatVersion, } - profileByID, profiles, err := loadProfiles(db) + profileByID, profiles, err := loadProfiles(q) if err != nil { return nil, err } pack.Profiles = profiles - settings, err := loadSettings(db) + settings, err := loadSettings(q) if err != nil { return nil, err } @@ -60,7 +74,7 @@ func Load(db *sql.DB) (*Snapshot, error) { pack.RecordBonus = recordBonusFromSettings(settings) pack.ManualAdjustment = manualAdjustmentFromSettings(settings) - events, err := loadEvents(db, profileByID) + events, err := loadEvents(q, profileByID) if err != nil { return nil, err } @@ -114,8 +128,8 @@ func Export(db *sql.DB, meta Meta) (*RulePack, error) { return &canonical, nil } -func loadProfiles(db *sql.DB) (map[int64]string, []Profile, error) { - rows, err := db.Query(`SELECT id, code, name, tie_mode, record_bonus_mode, award_ranks, last_place_zero +func loadProfiles(q queryer) (map[int64]string, []Profile, error) { + rows, err := q.Query(`SELECT id, code, name, tie_mode, record_bonus_mode, award_ranks, last_place_zero FROM scoring_profiles ORDER BY code`) if err != nil { return nil, nil, fmt.Errorf("查询积分模板: %w", err) @@ -150,7 +164,7 @@ func loadProfiles(db *sql.DB) (map[int64]string, []Profile, error) { return nil, nil, fmt.Errorf("读取积分模板: %w", err) } - ruleRows, err := db.Query(`SELECT profile_id, rank, points FROM scoring_profile_rules ORDER BY profile_id, rank`) + ruleRows, err := q.Query(`SELECT profile_id, rank, points FROM scoring_profile_rules ORDER BY profile_id, rank`) if err != nil { return nil, nil, fmt.Errorf("查询积分模板明细: %w", err) } @@ -178,8 +192,8 @@ func loadProfiles(db *sql.DB) (map[int64]string, []Profile, error) { return byID, profiles, nil } -func loadSettings(db *sql.DB) (map[string]string, error) { - rows, err := db.Query(`SELECT key, value FROM settings`) +func loadSettings(q queryer) (map[string]string, error) { + rows, err := q.Query(`SELECT key, value FROM settings`) if err != nil { return nil, fmt.Errorf("查询赛事设置: %w", err) } @@ -207,8 +221,8 @@ func settingByKey(db *sql.DB, key string) (string, error) { return value, nil } -func loadEvents(db *sql.DB, profileByID map[int64]string) ([]EventInfo, error) { - rows, err := db.Query(`SELECT e.id, e.code, e.name, s.code, e.event_type, e.result_type, e.scored, e.multiplier, e.award_medals +func loadEvents(q queryer, profileByID map[int64]string) ([]EventInfo, error) { + rows, err := q.Query(`SELECT e.id, e.code, e.name, s.code, e.event_type, e.result_type, e.compare, e.scored, e.multiplier, e.award_medals FROM events e JOIN sports s ON s.id = e.sport_id ORDER BY e.sort_order, e.code`) if err != nil { @@ -225,11 +239,12 @@ func loadEvents(db *sql.DB, profileByID map[int64]string) ([]EventInfo, error) { sportCode string eventType string resultType string + compare string scoredRaw int multiplier float64 awardMedalsRaw int ) - if err := rows.Scan(&id, &code, &name, &sportCode, &eventType, &resultType, &scoredRaw, &multiplier, &awardMedalsRaw); err != nil { + if err := rows.Scan(&id, &code, &name, &sportCode, &eventType, &resultType, &compare, &scoredRaw, &multiplier, &awardMedalsRaw); err != nil { return nil, fmt.Errorf("读取项目: %w", err) } index[id] = len(events) @@ -240,6 +255,7 @@ func loadEvents(db *sql.DB, profileByID map[int64]string) ([]EventInfo, error) { SportCode: sportCode, EventType: domain.EventType(eventType), ResultType: domain.ResultType(resultType), + Compare: domain.CompareMode(compare), Scored: scoredRaw != 0, Multiplier: multiplier, AwardMedals: awardMedalsRaw != 0, @@ -249,7 +265,7 @@ func loadEvents(db *sql.DB, profileByID map[int64]string) ([]EventInfo, error) { return nil, fmt.Errorf("读取项目: %w", err) } - chRows, err := db.Query(`SELECT c.event_id, c.scope, c.basis, p.code, c.sort_order, c.count_to_team, c.count_to_medals, c.count_to_team_medals + chRows, err := q.Query(`SELECT c.event_id, c.scope, c.basis, p.code, c.sort_order, c.aggregate_mode, c.count_to_team, c.count_to_medals, c.count_to_team_medals FROM event_score_channels c JOIN scoring_profiles p ON p.id = c.profile_id ORDER BY c.event_id, c.sort_order, c.id`) if err != nil { @@ -264,11 +280,12 @@ func loadEvents(db *sql.DB, profileByID map[int64]string) ([]EventInfo, error) { basis string code string sortOrd int + aggregateMode string countToTeam int countToMedals int countToTeamMedals int ) - if err := chRows.Scan(&eventID, &scope, &basis, &code, &sortOrd, &countToTeam, &countToMedals, &countToTeamMedals); err != nil { + if err := chRows.Scan(&eventID, &scope, &basis, &code, &sortOrd, &aggregateMode, &countToTeam, &countToMedals, &countToTeamMedals); err != nil { return nil, fmt.Errorf("读取计分通道: %w", err) } idx, ok := index[eventID] @@ -280,6 +297,10 @@ func loadEvents(db *sql.DB, profileByID map[int64]string) ([]EventInfo, error) { Basis: domain.Basis(basis), Profile: code, } + // 只把非缺省的口径写进导出文件:avg 是缺省值,写了会让「导出 → 导入」凭空多出差异。 + if aggregateMode == string(domain.AggregateSum) { + ch.AggregateMode = string(domain.AggregateSum) + } // 只把显式关闭的通道写成 false:导出文件里不出现缺省值,往返比对才不会凭空多出差异。 if countToTeam == 0 { ch.CountToTeam = BoolPtr(false) diff --git a/server/internal/rules/types.go b/server/internal/rules/types.go index 508fad7..cd50e17 100644 --- a/server/internal/rules/types.go +++ b/server/internal/rules/types.go @@ -96,11 +96,15 @@ type Rule struct { } // Channel 是计分通道:排谁的名次 + 名次从哪来 + 用哪张积分表。 -// basis=aggregate 按同一主体成绩的平均值汇总,分母由项目的 avg_mode 决定。 +// basis=aggregate 把同一主体的成绩汇总成一个值再排名:汇总口径由 AggregateMode 决定 +// (avg 平均 / sum 求和),平均值内部的分母口径由项目的 avg_mode 决定。 type Channel struct { Scope domain.Scope `yaml:"scope" json:"scope"` Basis domain.Basis `yaml:"basis" json:"basis"` Profile string `yaml:"profile" json:"profile"` + // AggregateMode 是 basis=aggregate 通道的汇总口径:avg 按成员平均(缺省)/ sum 按成员总和。 + // 只对 aggregate 通道有意义;缺省(不写)等价于 avg,与库里的默认值一致。 + AggregateMode string `yaml:"aggregateMode,omitempty" json:"aggregateMode,omitempty"` // CountToTeam 决定该通道产出的流水是否计入单位总分;缺省 true。 // 「个人+团体」项目的个人通道写 false:分只记在个人头上,不进单位总分。 CountToTeam *bool `yaml:"countToTeam,omitempty" json:"countToTeam,omitempty"` @@ -112,6 +116,14 @@ type Channel struct { CountToTeamMedals *bool `yaml:"countToTeamMedals,omitempty" json:"countToTeamMedals,omitempty"` } +// AggregatesBy 返回补齐缺省值后的汇总口径:未配置或写 avg 时按 avg(与库里的默认值一致)。 +func (c Channel) AggregatesBy() domain.AggregateMode { + if c.AggregateMode == string(domain.AggregateSum) { + return domain.AggregateSum + } + return domain.AggregateAvg +} + // CountsToTeam 返回补齐缺省值后的开关(缺省 true)。 func (c Channel) CountsToTeam() bool { return boolOrDefault(c.CountToTeam, true) } diff --git a/server/internal/rules/validate.go b/server/internal/rules/validate.go index aa649ee..c0c9215 100644 --- a/server/internal/rules/validate.go +++ b/server/internal/rules/validate.go @@ -51,6 +51,13 @@ func (l *issueList) addf(path, format string, args ...any) { } // Validate 校验规则包。格式 / 版本不符立即返回哨兵错误,其余问题一次性汇总。 +// +// 它服务的**不只是**导入:导出(Marshal → Validate)走的是同一条路,而导出正是现场备份与排障的 +// 入口(GET /api/rules/export、赛事项目包里的 rules.yaml)。因此这里只放「这份文件是不是一份 +// 能读懂的规则包」,不放「这份配置能不能算分」——库里修好之前存下的历史配置(awardRanks 与 +// 分值表对不上的模板)如果让导不出来,等于把备份入口一并打掉(同类伤疤见 +// httpapi 的 TestUpdateProfileCodeRequiredKeepsRulesExportUsable)。 +// 写入前才该拦的检查放在 ValidateForImport。 func (p *RulePack) Validate() error { if p.Format != FormatName { return fmt.Errorf("%w: format=%q,期望 %q", ErrNotRulePack, p.Format, FormatName) @@ -92,6 +99,31 @@ func (p *RulePack) Validate() error { return nil } +// ValidateForImport 是导入侧在 Validate 之外额外拦下的「这份配置根本算不出分」检查。 +// +// 目前只有一条:分值表的档位超出录取档位数(awardRanks)。见 AwardRanksOverflow。 +// 单独成一个方法而不是塞进 Validate,是因为 Validate 同时被导出路径用着——历史库里已经存在的 +// 越档模板必须照样能导出(否则备份与规则导出会 500),但绝不能再从导入这条路进来。 +func (p *RulePack) ValidateForImport() error { + var l issueList + for i, prof := range p.Profiles { + maxRank := 0 + for _, r := range prof.Rules { + if r.Rank > maxRank { + maxRank = r.Rank + } + } + if msg := AwardRanksOverflow(prof.AwardRanks, maxRank); msg != "" { + // 走 %s 而不是把 msg 当格式串:文案以后加个百分号就会把消息打坏。 + l.addf(fmt.Sprintf("profiles[%d].awardRanks", i), "%s", msg) + } + } + if len(l.issues) > 0 { + return &ValidationError{Issues: l.issues} + } + return nil +} + func validateTieBreak(l *issueList, tieBreak []string) { seen := make(map[string]bool, len(tieBreak)) for i, key := range tieBreak { @@ -145,6 +177,24 @@ func validateProfile(l *issueList, path string, prof Profile, seen map[string]bo } } +// AwardRanksOverflow 在「分值表的档位超出录取档位数」时返回一句人话说明,没问题时返回空串。 +// +// 为什么要拦:算分引擎只在 award_ranks > 0 时按名次截断(domain/scoring.go 的 basePoints), +// 于是「分值表配到第 10 档、录取名次还留着 6」这种配置能安静落库——第 7~10 档在模板页上看着有分, +// 算出来恒为 0,榜上没有任何异常提示(审查 01 P1)。 +// 模板保存(httpapi/repo.go 的 validateProfileAwardCoverage)与规则包导入(ValidateForImport) +// 共用这一句说明:同一份配置在两条路上必须得到同样的说法,现场才能照着改。 +// +// awardRanks <= 0(0 表示不按名次封顶)是既有语义,一律放行,并在文案里把这个出口告诉用户。 +func AwardRanksOverflow(awardRanks, maxRuleRank int) string { + if awardRanks <= 0 || maxRuleRank <= awardRanks { + return "" + } + return fmt.Sprintf("你配了第 %d 档,但录取名次(awardRanks)只到第 %d 档,第 %d 档及以后不会计分:"+ + "要么把录取名次改成 %d 或 0(0 表示不按名次封顶),要么删掉第 %d 档之后的档位", + maxRuleRank, awardRanks, awardRanks+1, maxRuleRank, awardRanks) +} + func validateRecordBonus(l *issueList, rb RecordBonus) { if rb.Mode != "" && rb.Mode != domain.RecordBonusMax && rb.Mode != domain.RecordBonusSum { l.addf("recordBonus.mode", "只能是 max / sum,当前 %q", rb.Mode) @@ -226,6 +276,11 @@ func validateChannels(l *issueList, path string, channels []Channel, profiles ma } else if !profiles[ch.Profile] { l.addf(cpath+".profile", "引用了不存在的积分模板 %q", ch.Profile) } + // 汇总口径只有 avg / sum 两个取值;不写 = avg(缺省),拼错的取值必须报错而不是被当成 avg。 + if ch.AggregateMode != "" && + ch.AggregateMode != string(domain.AggregateAvg) && ch.AggregateMode != string(domain.AggregateSum) { + l.addf(cpath+".aggregateMode", "只能是 avg / sum,当前 %q", ch.AggregateMode) + } // 落库有 UNIQUE(event_id, scope, basis) 约束,这里先挡住,避免导入时才炸。 key := string(ch.Scope) + "/" + string(ch.Basis) if seen[key] { diff --git a/server/migrations/event/0022_void_historical_orphan_ledger.sql b/server/migrations/event/0022_void_historical_orphan_ledger.sql new file mode 100644 index 0000000..70bf3b3 --- /dev/null +++ b/server/migrations/event/0022_void_historical_orphan_ledger.sql @@ -0,0 +1,27 @@ +-- 清理升级前留下的「孤儿流水」:删掉一个「只有名次、没有报名项」的小项时 +-- (球类那种形态,名次直接按单位录进 channel_manual_ranks),名下的成绩流水 +-- 被 score_ledger.event_id 的 ON DELETE SET NULL 置空,而 voided 仍然是 0 —— +-- 分数留在榜上,此后任何按 event_id 的重算都再也打不到这些行,只能改库。 +-- +-- 写侧已经补上了「删小项时在同一事务里作废」(httpapi/repo_events.go 的 deleteEvent), +-- 但**升级前已经产生**的那批不会被自动清掉,现场确认删过带分的小项。这条迁移就是那一次性清理。 +-- +-- 只作废 source_type IN ('result', 'record_bonus'): +-- - 这两类流水全部由计分引擎产出,引擎一直把 EventID 写进库(domain/scoring.go), +-- 所以「event_id 为空」只可能来自小项被删后的置空,即孤儿; +-- - 人工调整(source_type = 'adjustment')**合法地**就是 event_id 为 NULL +-- (写入口 httpapi/repo_misc.go 的 createAdjustment,见 domain/ledger.go 的说明), +-- 一刀切会把合法的调整分一起吞掉。 +-- +-- 作废而不是删除:流水行要留着当审计痕迹(voided_at + void_reason 说明「谁也没做,是升级清理」)。 +-- voided_by 刻意留 NULL:这次清理没有人操作,编一个操作人就是假账。 +-- +-- 幂等:条件里的 voided = 0 让重复执行只剩空更新;迁移本身还由 schema_migrations 记账只放行一次, +-- 所以「重复启动 / 手工重放这条 SQL」都不会重复作废,也不会覆盖已有流水的作废时间与理由。 +UPDATE score_ledger + SET voided = 1, + voided_at = datetime('now'), + void_reason = 'event_id 已失效(历史孤儿)' + WHERE voided = 0 + AND event_id IS NULL + AND source_type IN ('result', 'record_bonus'); diff --git a/server/migrations/event/0023_channel_aggregate_mode.sql b/server/migrations/event/0023_channel_aggregate_mode.sql new file mode 100644 index 0000000..99f571a --- /dev/null +++ b/server/migrations/event/0023_channel_aggregate_mode.sql @@ -0,0 +1,13 @@ +-- 聚合通道(basis=aggregate)的汇总口径。 +-- +-- 背景:团体分要能现场在「按成员平均」与「按成员总和」之间切。此前只有平均值一种口径 +-- (平均值内部的分母口径是 0017 加的 events.avg_mode),这里把「汇总方式」按通道存下来。 +-- +-- 只加列、不动既有数据行:老通道一律取默认值 'avg',升级前后榜单一分不差。 +-- 取值: +-- avg:团体成绩 = 该主体成员成绩的平均值(缺省,与升级前行为一致); +-- sum:团体成绩 = 该主体成员成绩的总和。 +-- 汇总口径与 avg_mode 是两个维度:sum 下 avg_mode 只决定「一个有效成绩都没有的单位 +-- 算不算 0 分参与排名」(valid 不参与 / all 参与),见 domain/scoring.go 的 scoreByAggregate。 +ALTER TABLE event_score_channels ADD COLUMN aggregate_mode TEXT NOT NULL DEFAULT 'avg' + CHECK (aggregate_mode IN ('avg', 'sum')); diff --git a/server/migrations/event/migration_0022_test.go b/server/migrations/event/migration_0022_test.go new file mode 100644 index 0000000..5739ea4 --- /dev/null +++ b/server/migrations/event/migration_0022_test.go @@ -0,0 +1,262 @@ +package event + +import ( + "context" + "database/sql" + "io" + "io/fs" + "log/slog" + "reflect" + "testing" + + "git.yeij.top/AskaEth/Scoreboard/server/internal/realtime" + "git.yeij.top/AskaEth/Scoreboard/server/internal/store" + "git.yeij.top/AskaEth/Scoreboard/server/migrations" +) + +// 孤儿流水的统一口径:计分引擎产出的成绩分与破纪录加分,但 event_id 已被置空。 +const orphanLedgerCond = `voided = 0 AND event_id IS NULL AND source_type IN ('result', 'record_bonus')` + +// 0022 一次性清理升级前留下的孤儿流水:删掉「只有名次、没有报名项」的小项时, +// score_ledger.event_id 被 ON DELETE SET NULL 置空而 voided 仍是 0,分数留在榜上、 +// 之后任何按 event_id 的重算都打不到这些行。写侧(deleteEvent)已补上作废,这条迁移管历史那批。 +// +// 三条底线: +// - 只清 result / record_bonus。人工调整合法地就是 event_id 为 NULL,一刀切会吞掉合法调整分; +// - 作废而不是删除,留 voided_at + void_reason 当审计痕迹,且不能覆盖已有的作废理由与时间; +// - 幂等:连跑两次,榜与每一行都必须一模一样。 +func TestMigration0022VoidsHistoricalOrphanLedger(t *testing.T) { + db := openEventDB(t) + applyBefore(t, db, "0022") // 回到「升级前」:库结构到 0021 为止,0022 还没跑过 + + // 造现场:E1 是还在的小项;E2 是那种「只有团体名次、没有报名项」的小项,被删掉过。 + stmts := []string{ + `INSERT INTO teams(code, name) VALUES ('T1', '第一分公司')`, + `INSERT INTO sports(code, name) VALUES ('SP1', '田径')`, + `INSERT INTO events(sport_id, code, name, event_type, result_mode, result_type, compare, status) + VALUES (1, 'E1', '100米跑', 'individual', 'auto', 'time', 'asc', 'published')`, + `INSERT INTO events(sport_id, code, name, event_type, result_mode, result_type, compare, status) + VALUES (1, 'E2', '篮球', 'team', 'manual', 'none', 'none', 'published')`, + // 行 1:健康流水,挂在还在的 E1 上。 + `INSERT INTO score_ledger(team_id, event_id, source_type, source_id, points) + VALUES (1, 1, 'result', 1, 10)`, + // 行 2、3:升级前的孤儿——删 E2 时 event_id 被置空、voided 还是 0(这条迁移要清的就是它们)。 + `INSERT INTO score_ledger(team_id, event_id, source_type, source_id, points) + VALUES (1, 2, 'result', 2, 4)`, + `INSERT INTO score_ledger(team_id, event_id, source_type, source_id, points) + VALUES (1, 2, 'record_bonus', 2, 2)`, + // 行 4:合法的人工调整,event_id 本来就允许为空,必须原样保留(防误伤的关键一条)。 + `INSERT INTO score_ledger(team_id, source_type, source_id, points) + VALUES (1, 'adjustment', 9, 7)`, + // 行 5:升级前已经被正确作废过的孤儿,理由/时间都不能被这次清理改写。 + `INSERT INTO score_ledger(team_id, event_id, source_type, source_id, points, voided, voided_at, void_reason) + VALUES (1, 2, 'result', 3, 1, 1, '2026-09-01 08:00:00', '小项删除,本小项积分流水一并作废')`, + } + for _, s := range stmts { + if _, err := db.Exec(s); err != nil { + t.Fatalf("造升级前数据 %q: %v", s, err) + } + } + // 旧删除路径:老 deleteEvent 只删小项本身(子表先删),流水只被外键置空。 + if _, err := db.Exec(`DELETE FROM events WHERE id = 2`); err != nil { + t.Fatalf("按旧路径删除小项 E2: %v", err) + } + + // 升级前:两条孤儿还活着,且分真的挂在榜上(这就是现场看到的错榜)。 + if got := queryInt(t, db, `SELECT count(*) FROM score_ledger WHERE `+orphanLedgerCond); got != 2 { + t.Fatalf("升级前应有 2 条孤儿流水,得到 %d", got) + } + if got := boardPoints(t, db, 1); got != 23 { + t.Fatalf("升级前孤儿分应还在榜上(10+4+2+7=23),得到 %v", got) + } + + // 走真实升级路径(main.go 打开旧库后补跑的就是它),跑两次验幂等。 + if err := store.MigrateEvent(db); err != nil { + t.Fatalf("第 1 次迁移: %v", err) + } + afterFirst := dumpLedger(t, db) + if err := store.MigrateEvent(db); err != nil { + t.Fatalf("第 2 次迁移: %v", err) + } + if got := dumpLedger(t, db); !reflect.DeepEqual(got, afterFirst) { + t.Errorf("重复迁移改动了流水:\n第一次 %+v\n第二次 %+v", afterFirst, got) + } + if got, want := countRows(t, db, "schema_migrations"), migrationCount(t); got != want { + t.Errorf("迁移登记数 = %d,期望 %d", got, want) + } + // 幂等还要经得起「迁移被重放」:store.migrate 的注释写明,schema_migrations 少一行 + // (手工删行 / 从别处拷来的库)就会把跑过的迁移再跑一遍。这里直接重放这条 SQL 的正文, + // 结果必须与第一次一致——不改动分值,也不重写已作废流水的作废时间。 + if _, err := db.Exec(readMigration(t, "0022")); err != nil { + t.Fatalf("重放 0022: %v", err) + } + if got := dumpLedger(t, db); !reflect.DeepEqual(got, afterFirst) { + t.Errorf("重放 0022 改动了流水:\n重放前 %+v\n重放后 %+v", afterFirst, got) + } + + // 作废是作废、不是删除:五行流水一行不少。 + if got := countRows(t, db, "score_ledger"); got != 5 { + t.Fatalf("升级后流水行数 = %d,期望 5(作废要留审计痕迹,不能删行)", got) + } + if got := queryInt(t, db, `SELECT count(*) FROM score_ledger WHERE `+orphanLedgerCond); got != 0 { + t.Errorf("升级后仍剩 %d 条存活孤儿流水", got) + } + + // 工单①:行 2、3 两条孤儿被作废,且写明时间与原因;voided_by 留空表示「不是人做的,是升级清理」。 + for _, id := range []int64{2, 3} { + var ( + voided int + voidedBy sql.NullInt64 + voidedAt sql.NullString + voidReason sql.NullString + ) + if err := db.QueryRow(`SELECT voided, voided_by, voided_at, void_reason FROM score_ledger WHERE id = ?`, id). + Scan(&voided, &voidedBy, &voidedAt, &voidReason); err != nil { + t.Fatalf("读流水 %d: %v", id, err) + } + if voided != 1 { + t.Errorf("孤儿流水 %d 应被作废,voided = %d", id, voided) + } + if !voidedAt.Valid || voidedAt.String == "" { + t.Errorf("孤儿流水 %d 缺少作废时间: %+v", id, voidedAt) + } + if !voidReason.Valid || voidReason.String != "event_id 已失效(历史孤儿)" { + t.Errorf("孤儿流水 %d 的作废原因不对: %+v", id, voidReason) + } + if voidedBy.Valid { + t.Errorf("孤儿流水 %d 的 voided_by 应留空(没有操作人),得到 %d", id, voidedBy.Int64) + } + } + + // 工单②:合法调整分原样保留——没被作废、没有理由、分值不变。 + var ( + points float64 + voided int + voidedAt sql.NullString + voidReason sql.NullString + ) + if err := db.QueryRow(`SELECT points, voided, voided_at, void_reason FROM score_ledger WHERE id = 4`). + Scan(&points, &voided, &voidedAt, &voidReason); err != nil { + t.Fatalf("读调整流水: %v", err) + } + if points != 7 || voided != 0 || voidedAt.Valid || voidReason.Valid { + t.Errorf("人工调整被误伤: points=%v voided=%d voided_at=%+v void_reason=%+v", points, voided, voidedAt, voidReason) + } + // 行 1:健康流水(小项还在)不受影响。 + if got := queryInt(t, db, `SELECT voided FROM score_ledger WHERE id = 1`); got != 0 { + t.Errorf("挂在还活着的小项上的流水被误作废: voided = %d", got) + } + // 行 5:早已作废的那条保留自己的理由与时间,不被这次清理重写。 + var ( + oldAt sql.NullString + oldReason sql.NullString + ) + if err := db.QueryRow(`SELECT voided_at, void_reason FROM score_ledger WHERE id = 5`).Scan(&oldAt, &oldReason); err != nil { + t.Fatalf("读老作废流水: %v", err) + } + if !oldAt.Valid || oldAt.String != "2026-09-01 08:00:00" || + !oldReason.Valid || oldReason.String != "小项删除,本小项积分流水一并作废" { + t.Errorf("老作废痕迹被改写: voided_at=%+v void_reason=%+v", oldAt, oldReason) + } + + // 榜单:孤儿分(4 与 2)消失,只留下健康分 10 与合法调整 7。连跑两次后仍是 17。 + if got := boardPoints(t, db, 1); got != 17 { + t.Errorf("升级后单位总分应只剩 10+7=17,得到 %v", got) + } + + fkRows, err := db.Query(`PRAGMA foreign_key_check`) + if err != nil { + t.Fatalf("外键检查: %v", err) + } + defer func() { _ = fkRows.Close() }() + if fkRows.Next() { + t.Error("清理后存在外键悬挂") + } +} + +// readMigration 取出嵌入的赛事库迁移正文(按文件名前缀找), +// 用于在测试里直接重放某一条迁移,验证 SQL 自身的幂等。 +func readMigration(t *testing.T, prefix string) string { + t.Helper() + + fsys, err := fs.Sub(migrations.EventFS, "event") + if err != nil { + t.Fatalf("定位迁移目录: %v", err) + } + names, err := fs.Glob(fsys, prefix+"*.sql") + if err != nil { + t.Fatalf("列出迁移: %v", err) + } + if len(names) != 1 { + t.Fatalf("迁移 %s*.sql 命中 %d 个文件: %v", prefix, len(names), names) + } + body, err := fs.ReadFile(fsys, names[0]) + if err != nil { + t.Fatalf("读取迁移 %s: %v", names[0], err) + } + return string(body) +} + +// boardPoints 走真实的大屏读路径(实时快照)取某单位的总分: +// 「孤儿分是否还挂在榜上」要按大屏看到的口径判定,而不是数 score_ledger 的行数。 +func boardPoints(t *testing.T, db *sql.DB, teamID int64) float64 { + t.Helper() + + hub := realtime.NewHub(db, slog.New(slog.NewTextHandler(io.Discard, nil))) + defer func() { _ = hub.Close() }() + snap, err := hub.Snapshot(context.Background()) + if err != nil { + t.Fatalf("取榜单快照: %v", err) + } + for _, row := range snap.Standings { + if row.TeamID == teamID { + return row.TotalPoints + } + } + t.Fatalf("榜单里没有单位 %d: %+v", teamID, snap.Standings) + return 0 +} + +// ledgerRow 是流水行的完整快照,用于比对「连跑两次」有没有改动任何一格。 +type ledgerRow struct { + id int64 + points float64 + voided int + voidedBy sql.NullInt64 + voidedAt sql.NullString + voidReason sql.NullString +} + +func dumpLedger(t *testing.T, db *sql.DB) []ledgerRow { + t.Helper() + + rows, err := db.Query(`SELECT id, points, voided, voided_by, voided_at, void_reason + FROM score_ledger ORDER BY id`) + if err != nil { + t.Fatalf("读流水: %v", err) + } + defer func() { _ = rows.Close() }() + + var out []ledgerRow + for rows.Next() { + var r ledgerRow + if err := rows.Scan(&r.id, &r.points, &r.voided, &r.voidedBy, &r.voidedAt, &r.voidReason); err != nil { + t.Fatalf("解析流水: %v", err) + } + out = append(out, r) + } + if err := rows.Err(); err != nil { + t.Fatalf("遍历流水: %v", err) + } + return out +} + +func queryInt(t *testing.T, db *sql.DB, query string, args ...any) int { + t.Helper() + + var n int + if err := db.QueryRow(query, args...).Scan(&n); err != nil { + t.Fatalf("查询 %q: %v", query, err) + } + return n +} diff --git a/server/migrations/event/migration_0023_test.go b/server/migrations/event/migration_0023_test.go new file mode 100644 index 0000000..c518511 --- /dev/null +++ b/server/migrations/event/migration_0023_test.go @@ -0,0 +1,99 @@ +package event + +import ( + "database/sql" + "strings" + "testing" + + "git.yeij.top/AskaEth/Scoreboard/server/internal/store" +) + +// 0023:聚合通道(basis=aggregate)的汇总口径 aggregate_mode。 +// +// 三条底线: +// - 老库升级后每一行都拿到默认值 avg —— 升级前只有「按成员平均」一种口径,榜单必须一分不差; +// - 其它列与行数一行不动(这是纯加列迁移); +// - 取值只允许 avg / sum,拼错的取值在写侧就被 CHECK 挡下; +// - 幂等:连跑两次不报错、不重复登记。 +func TestMigration0023ChannelAggregateMode(t *testing.T) { + db := openEventDB(t) + applyBefore(t, db, "0023") // 回到「升级前」:库结构到 0022 为止 + + var teamProfile int64 + if err := db.QueryRow(`SELECT id FROM scoring_profiles WHERE code = 'team_top6'`).Scan(&teamProfile); err != nil { + t.Fatalf("读取团体积分模板: %v", err) + } + stmts := []string{ + `INSERT INTO teams(code, name) VALUES ('T1', '第一分公司')`, + `INSERT INTO sports(code, name) VALUES ('SP1', '田径')`, + `INSERT INTO events(sport_id, code, name, event_type, result_mode, result_type, compare, scored, multiplier, status) + VALUES (1, 'TEAM_PULLUP', '团体引体向上', 'individual_team', 'auto', 'count', 'desc', 1, 2, 'published')`, + } + for _, s := range stmts { + if _, err := db.Exec(s); err != nil { + t.Fatalf("造老库数据 %q: %v", s, err) + } + } + if _, err := db.Exec(`INSERT INTO event_score_channels(event_id, scope, basis, profile_id, sort_order, count_to_team) + VALUES (1, 'team', 'aggregate', ?, 1, 1)`, teamProfile); err != nil { + t.Fatalf("造老库通道: %v", err) + } + + // 升级前:这一列还不该存在。 + var probe sql.NullString + if err := db.QueryRow(`SELECT aggregate_mode FROM event_score_channels`).Scan(&probe); err == nil { + t.Fatal("升级前不应存在 aggregate_mode 列") + } else if !strings.Contains(err.Error(), "aggregate_mode") { + t.Fatalf("查询报错应点明缺列 aggregate_mode,实际 %v", err) + } + + if err := store.MigrateEvent(db); err != nil { + t.Fatalf("升级赛事库: %v", err) + } + + // 老行取默认值 avg,其它列原样。 + var ( + scope, basis, mode string + countToTeam int + sortOrder int + ) + if err := db.QueryRow(`SELECT scope, basis, aggregate_mode, count_to_team, sort_order + FROM event_score_channels WHERE event_id = 1`). + Scan(&scope, &basis, &mode, &countToTeam, &sortOrder); err != nil { + t.Fatalf("读取升级后的通道: %v", err) + } + if scope != "team" || basis != "aggregate" || countToTeam != 1 || sortOrder != 1 { + t.Fatalf("升级不应改动既有列:scope=%q basis=%q count_to_team=%d sort_order=%d", scope, basis, countToTeam, sortOrder) + } + if mode != "avg" { + t.Fatalf("老通道的汇总口径 = %q,期望默认值 avg(等于升级前的「按成员平均」)", mode) + } + + // 取值只有 avg / sum:拼错的必须被 CHECK 挡下,而不是静默当成某个口径。 + if _, err := db.Exec(`INSERT INTO event_score_channels(event_id, scope, basis, profile_id, sort_order, aggregate_mode) + VALUES (1, 'athlete', 'aggregate', ?, 2, 'biggest')`, teamProfile); err == nil { + t.Fatal("非法 aggregate_mode 应被 CHECK 拒绝") + } + if _, err := db.Exec(`INSERT INTO event_score_channels(event_id, scope, basis, profile_id, sort_order, aggregate_mode) + VALUES (1, 'athlete', 'aggregate', ?, 2, 'sum')`, teamProfile); err != nil { + t.Fatalf("写入 sum 口径应成功: %v", err) + } + + // 幂等:再跑一次不报错、行数不变、登记仍只有一条。 + if err := store.MigrateEvent(db); err != nil { + t.Fatalf("重复升级应无副作用: %v", err) + } + var rows, registered int + if err := db.QueryRow(`SELECT COUNT(*) FROM event_score_channels`).Scan(&rows); err != nil { + t.Fatalf("统计通道: %v", err) + } + if rows != 2 { + t.Fatalf("通道数 = %d,期望 2", rows) + } + if err := db.QueryRow(`SELECT COUNT(*) FROM schema_migrations WHERE name = '0023_channel_aggregate_mode.sql'`).Scan(®istered); err != nil { + t.Fatalf("查询迁移登记: %v", err) + } + if registered != 1 { + t.Fatalf("迁移登记数 = %d,期望 1", registered) + } +} diff --git a/web/src/admin/api/mock.ts b/web/src/admin/api/mock.ts index 8079511..7235d5c 100644 --- a/web/src/admin/api/mock.ts +++ b/web/src/admin/api/mock.ts @@ -697,25 +697,40 @@ class MockDb { } } - return this.teams - .map((team) => { - const bucket = totals.get(team.id) ?? { points: 0, gold: 0, silver: 0, bronze: 0 } - return { - teamId: team.id, - teamCode: team.code, - teamName: team.name, - shortName: team.shortName, - color: team.color, - logoPath: team.logoPath, - rank: 0, - gold: bucket.gold, - silver: bucket.silver, - bronze: bucket.bronze, - medalTotal: bucket.gold + bucket.silver + bucket.bronze, - totalPoints: round(bucket.points), - rankChange: null, - } - }) + const rows: StandingRow[] = this.teams.map((team) => { + const bucket = totals.get(team.id) ?? { points: 0, gold: 0, silver: 0, bronze: 0 } + return { + teamId: team.id, + teamCode: team.code, + teamName: team.name, + shortName: team.shortName, + color: team.color, + logoPath: team.logoPath, + rank: 0, + medalRank: 0, + gold: bucket.gold, + silver: bucket.silver, + bronze: bucket.bronze, + medalTotal: bucket.gold + bucket.silver + bucket.bronze, + totalPoints: round(bucket.points), + rankChange: null, + } + }) + + // 单位奖牌榜的名次与总积分榜无关(金 → 银 → 铜 → 单位编码),示例数据照服务端同一口径算, + // 数组顺序仍保持积分榜顺序(服务端就是这么下发的:rank 管顺序,medalRank 单独带)。 + const medalRank = new Map() + ;[...rows] + .sort( + (a, b) => + b.gold - a.gold || + b.silver - a.silver || + b.bronze - a.bronze || + a.teamCode.localeCompare(b.teamCode), + ) + .forEach((row, index) => medalRank.set(row.teamId, index + 1)) + + return rows .sort( (a, b) => b.totalPoints - a.totalPoints || @@ -724,7 +739,7 @@ class MockDb { b.bronze - a.bronze || a.teamCode.localeCompare(b.teamCode), ) - .map((row, index) => ({ ...row, rank: index + 1 })) + .map((row, index) => ({ ...row, rank: index + 1, medalRank: medalRank.get(row.teamId) ?? index + 1 })) } athleteStandings(): AthleteStanding[] { @@ -784,6 +799,12 @@ class MockDb { resultText: result.resultText, points, createdAt: result.recordedAt ?? new Date().toISOString(), + // 示例数据没有版本链(result_revisions 只有真实服务端才写),四个字段一律 null: + // 追不出来就显示为空,界面正好演示「没改过」那一档,不编一个假的修订次数。 + revisionCount: null, + lastRevisionAt: null, + lastRevisionReason: null, + lastRevisedBy: null, }) } } diff --git a/web/src/admin/api/scoring.ts b/web/src/admin/api/scoring.ts index 29595f1..915648a 100644 --- a/web/src/admin/api/scoring.ts +++ b/web/src/admin/api/scoring.ts @@ -1,4 +1,4 @@ -import { normalizeAvgMode, normalizeCountToTeam } from '@/shared' +import { normalizeAggregateMode, normalizeAvgMode, normalizeCountToTeam } from '@/shared' import type { AvgMode, ChannelBasis, @@ -182,16 +182,20 @@ function sortManual(cands: Candidate[]): void { } /** - * 聚合通道:先把同一主体的成绩取平均,再按平均值排名(scoring.go scoreByAggregate)。 + * 聚合通道:先把同一主体的成绩汇总(avg 取平均 / sum 求和),再按汇总值排名 + * (scoring.go scoreByAggregate)。 * - * 分母由 avgMode 决定:valid 只算有有效成绩的人;all 把该主体的全部报名项都算进去, - * 没成绩的按 0 计入。scope=athlete 的主体是运动员,缺 athleteId 的行按服务端口径跳过。 + * 汇总口径来自通道的 aggregateMode(缺省 avg);平均值分母由 avgMode 决定: + * valid 只算有有效成绩的人;all 把该主体的全部报名项都算进去,没成绩的按 0 计入。 + * sum 只累加有效成绩,avgMode 在这里只决定「一个有效成绩都没有的主体算不算 0 分参与排名」。 + * scope=athlete 的主体是运动员,缺 athleteId 的行按服务端口径跳过。 */ function aggregateCandidates( rows: readonly ScorableRow[], channel: ScoreChannel, avgMode: AvgMode, ): Candidate[] { + const sumMode = normalizeAggregateMode(channel.aggregateMode) === 'sum' const order: number[] = [] const buckets = new Map() for (const row of rows) { @@ -200,7 +204,7 @@ function aggregateCandidates( const value = row.status === 'ok' ? row.resultValue : null let bucket = buckets.get(subject) if (bucket === undefined) { - // valid 口径下没有任何有效成绩的主体不参与排名。 + // valid 口径下没有任何有效成绩的主体不参与排名(两种汇总口径都一样)。 if (value === null && avgMode !== 'all') continue bucket = { row, total: 0, valid: 0, registered: 0 } buckets.set(subject, bucket) @@ -220,9 +224,10 @@ function aggregateCandidates( registered: number } const count = avgMode === 'all' ? bucket.registered : bucket.valid + const value = sumMode ? bucket.total : count > 0 ? bucket.total / count : 0 return { row: bucket.row, - value: count > 0 ? bucket.total / count : 0, + value, rankIn: 0, subject, teamId: bucket.row.teamId, diff --git a/web/src/admin/components/baseData/ChannelsSection.vue b/web/src/admin/components/baseData/ChannelsSection.vue index cd3e68b..eea7a8a 100644 --- a/web/src/admin/components/baseData/ChannelsSection.vue +++ b/web/src/admin/components/baseData/ChannelsSection.vue @@ -1,12 +1,18 @@ @@ -55,6 +58,7 @@ const autoClose = computed(() => (detail.value?.autoCloseSeconds ?? 0) > 0)

    项目 / 组别 + 运动员 名次 成绩 积分 @@ -63,10 +67,20 @@ const autoClose = computed(() => (detail.value?.autoCloseSeconds ?? 0) > 0) {{ item.eventName ?? '人工调整' }} {{ item.categoryName }} + + {{ breakdownSourceTag(item) }} + {{ breakdownAthleteName(item, teamName) }} {{ item.rank ?? '—' }} {{ item.resultText ?? '—' }} {{ item.points }} + + + {{ breakdownRevisionLine(item) }} +
    @@ -142,7 +156,10 @@ h2 { } .row { display: grid; - grid-template-columns: 1fr 110px 160px 130px; + /* 覆盖层是 16:9 屏幕右侧的一半:五列都要在 960px 内读得清,姓名列给得最宽。 + 后四列按内容定宽(名次只有一位数、积分两三位),省下来的宽度全给「项目 / 组别」—— + 破纪录加分那一行还要在项目名后面挤下一个来源标签(见 .col-source)。 */ + grid-template-columns: minmax(0, 1fr) 190px 76px 140px 96px; align-items: center; gap: 12px; padding: 14px 8px; @@ -160,6 +177,14 @@ h2 { text-align: right; font-variant-numeric: tabular-nums; } +/* 项目名 / 运动员名(团体项目退回单位名)可能很长:省略号收尾,不把名次成绩挤出行外。 */ +.col-name, +.col-athlete { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} .col-points { color: var(--gold); font-weight: 700; @@ -170,6 +195,25 @@ h2 { font-size: 20px; color: var(--text-dim); } +/* 破纪录加分 / 人工调整这类「非普通成绩」的来源标签:跟在项目名后面,不单占一列。 */ +.col-name em.col-source { + padding: 2px 10px; + border-radius: 8px; + border: 1px solid var(--primary-line); + font-size: 19px; + color: var(--primary-text); +} +/* 修订痕迹:整行小字,比正文矮一号、颜色更淡,不跟成绩抢注意力。 */ +.col-revision { + grid-column: 1 / -1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 20px; + letter-spacing: 1px; + color: var(--text-dim); +} .empty { flex: 1; display: grid; diff --git a/web/src/display/components/TickerBar.vue b/web/src/display/components/TickerBar.vue index e17d893..4759746 100644 --- a/web/src/display/components/TickerBar.vue +++ b/web/src/display/components/TickerBar.vue @@ -1,5 +1,6 @@ @@ -25,7 +27,7 @@ const rowFont = computed(() => fitRowFont(rows.value.length, BOARD_AVAILABLE_PX) 合计
    - {{ row.rank }} + {{ row.medalRank }} {{ row.teamName }} diff --git a/web/src/display/guards.ts b/web/src/display/guards.ts index 1efa27e..f08fde2 100644 --- a/web/src/display/guards.ts +++ b/web/src/display/guards.ts @@ -194,9 +194,12 @@ export function parseStandingRow(source: unknown): StandingRow { const gold = num(rec.gold) const silver = num(rec.silver) const bronze = num(rec.bronze) + const rank = num(rec.rank) return { ...parseTeamRef(rec), - rank: num(rec.rank), + rank, + // 单位奖牌榜名次独立于总积分榜(金→银→铜);旧服务端不下发它,退回总榜名次(旧行为)。 + medalRank: num(rec.medalRank, rank), gold, silver, bronze, @@ -542,6 +545,11 @@ export function parseBreakdownItem(source: unknown): BreakdownItem { resultText: strOrNull(rec.resultText), points: num(rec.points), createdAt: str(rec.createdAt), + // 修订痕迹:老服务端不下发,一律解析成 null(= 追不出来),界面据此不显示角标。 + revisionCount: numOrNull(rec.revisionCount), + lastRevisionAt: strOrNull(rec.lastRevisionAt), + lastRevisionReason: strOrNull(rec.lastRevisionReason), + lastRevisedBy: strOrNull(rec.lastRevisedBy), } } diff --git a/web/src/display/mock.ts b/web/src/display/mock.ts index 24f21e5..ed5abb3 100644 --- a/web/src/display/mock.ts +++ b/web/src/display/mock.ts @@ -70,7 +70,7 @@ const STANDING_SEEDS: readonly StandingSeed[] = [ ] function buildStandings(): StandingRow[] { - return MOCK_TEAMS.map((item, index) => { + const rows: StandingRow[] = MOCK_TEAMS.map((item, index) => { const seed = STANDING_SEEDS[index] ?? STANDING_SEEDS[STANDING_SEEDS.length - 1] const row = seed ?? { rank: index + 1, totalPoints: 0, gold: 0, silver: 0, bronze: 0, rankChange: null } return { @@ -81,6 +81,7 @@ function buildStandings(): StandingRow[] { color: item.color, logoPath: item.logoPath, rank: row.rank, + medalRank: 0, gold: row.gold, silver: row.silver, bronze: row.bronze, @@ -89,6 +90,20 @@ function buildStandings(): StandingRow[] { rankChange: row.rankChange, } }) + + // 单位奖牌榜的名次独立于总积分榜(金 → 银 → 铜 → 单位编码);示例数据照服务端同一口径算, + // 数组顺序仍保持积分榜顺序(服务端就是这么下发的:rank 管顺序,medalRank 单独带)。 + const medalRank = new Map() + ;[...rows] + .sort( + (a, b) => + b.gold - a.gold || + b.silver - a.silver || + b.bronze - a.bronze || + a.teamCode.localeCompare(b.teamCode), + ) + .forEach((row, index) => medalRank.set(row.teamId, index + 1)) + return rows.map((row) => ({ ...row, medalRank: medalRank.get(row.teamId) ?? row.rank })) } function buildEvents(): Event[] { diff --git a/web/src/display/tests/detail-overlay-athlete.test.ts b/web/src/display/tests/detail-overlay-athlete.test.ts new file mode 100644 index 0000000..dc14326 --- /dev/null +++ b/web/src/display/tests/detail-overlay-athlete.test.ts @@ -0,0 +1,174 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +import { parse } from 'vue/compiler-sfc' +import { breakdownAthleteName, breakdownRevisionLine, breakdownSourceTag, type BreakdownItem } from '@/shared' + +/** + * 大屏积分明细覆盖层的「运动员」列。 + * + * 现场裁判长的原话:推到大屏的明细只有项目 / 名次 / 成绩 / 积分,看不出「谁在哪个项目拿了多少分」, + * 这种明细说服不了观众单位名字为什么升上去。数据(athleteName)服务端一直有,是覆盖层漏了这一列。 + * + * 项目没有 jsdom 与组件测试工具,这里沿用仓库既有做法:`.vue` 模板用源码契约断言 + * (列头顺序、每个格子绑了什么),文案内容交给 `breakdownAthleteName` 这个纯函数用例守。 + */ + +const OVERLAY_SOURCE = readFileSync(new URL('../components/DetailOverlay.vue', import.meta.url), 'utf8') + +/** 取模板里以某个固定串开头、到下一个
    为止的片段(这些行里没有嵌套 div)。 */ +function block(startPattern: RegExp): string { + const found = startPattern.exec(OVERLAY_SOURCE) + assert.ok(found !== null, `模板里应有 ${startPattern}`) + const rest = OVERLAY_SOURCE.slice(found.index) + const end = rest.indexOf('') + assert.ok(end > 0, '行片段应以 结束') + return rest.slice(0, end) +} + +interface Cell { + cls: string + inner: string +} + +function cellsOf(fragment: string): Cell[] { + return [...fragment.matchAll(/([\s\S]*?)<\/span>/g)].map((match) => ({ + cls: match[1] ?? '', + inner: (match[2] ?? '').replace(/\s+/g, ' ').trim(), + })) +} + +const HEAD_ROW = block(/
    /) +const BODY_ROW = block(/
    /) + +function styleText(source: string): string { + const { descriptor } = parse(source, { filename: 'style.vue' }) + return descriptor.styles[0]?.content ?? '' +} + +function cssRule(style: string, selector: string): string { + const escaped = selector.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + const match = new RegExp(`${escaped}\\s*\\{([^}]*)\\}`).exec(style) + assert.ok(match !== null, `样式里应存在 ${selector} 规则`) + return match[1] ?? '' +} + +function item(over: Partial = {}): BreakdownItem { + return { + ledgerId: 1, + sourceType: 'result', + eventId: 1, + eventCode: 'M100', + eventName: '100米跑', + categoryName: '男子', + athleteId: 7, + athleteName: '张伟', + rank: 1, + resultText: '11.58', + points: 10, + createdAt: '2026-09-13 10:00:00', + revisionCount: null, + lastRevisionAt: null, + lastRevisionReason: null, + lastRevisedBy: null, + ...over, + } +} + +test('列头按「项目/组别 · 运动员 · 名次 · 成绩 · 积分」排列,运动员插在项目与名次之间', () => { + const labels = [...HEAD_ROW.matchAll(/([^<]*)<\/span>/g)].map((match) => + (match[1] ?? '').trim(), + ) + assert.deepEqual(labels, ['项目 / 组别', '运动员', '名次', '成绩', '积分']) +}) + +test('明细行渲染运动员格,绑定的是团队共用的降级函数', () => { + const cells = cellsOf(BODY_ROW) + assert.deepEqual( + cells.map((cell) => cell.cls), + ['col-name', 'col-athlete', 'col-rank', 'col-result', 'col-points'], + ) + assert.equal(cells[1]?.inner, '{{ breakdownAthleteName(item, teamName) }}') +}) + +test('项目 / 名次 / 成绩 / 积分四列原样保留(是加列不是改列)', () => { + const cells = cellsOf(BODY_ROW) + assert.match(cells[0]?.inner ?? '', /item\.eventName \?\? '人工调整'/) + assert.equal(cells[2]?.inner, "{{ item.rank ?? '—' }}") + assert.equal(cells[3]?.inner, "{{ item.resultText ?? '—' }}") + assert.equal(cells[4]?.inner, '{{ item.points }}') +}) + +test('个人流水那一行大屏上看得见是谁:运动员格是姓名,四个老格子照旧', () => { + const row = item() + const rendered = [ + row.eventName ?? '人工调整', + breakdownAthleteName(row, '第一分公司'), + row.rank ?? '—', + row.resultText ?? '—', + row.points, + ] + assert.deepEqual(rendered, ['100米跑', '张伟', 1, '11.58', 10]) +}) + +test('团体项目流水没有运动员名:降级成单位名,不出现空白格或 null', () => { + const row = item({ athleteName: null, athleteId: null, sourceType: 'result' }) + const cell = breakdownAthleteName(row, '第一分公司') + assert.equal(cell, '第一分公司') + assert.doesNotMatch(cell, /null|undefined/) +}) + +test('覆盖层是 16:9 右半屏:五列加间距放得下,姓名列留得够宽', () => { + const row = cssRule(styleText(OVERLAY_SOURCE), '.row') + const tracks = /grid-template-columns:\s*([^;]+);/.exec(row) + assert.ok(tracks !== null, '.row 应声明 grid-template-columns') + const parts = (tracks[1] ?? '').trim().split(/\s+(?![^(]*\))/) + assert.equal(parts.length, 5, '五列:项目/组别、运动员、名次、成绩、积分') + + const gap = Number(/gap:\s*(\d+)px/.exec(row)?.[1] ?? 0) + const fixed = parts.reduce((sum, part) => sum + Number(/(\d+)px/.exec(part)?.[1] ?? 0), 0) + // 1920 宽的 16:9 屏幕:覆盖层占右半边 960px,减去左右内边距 44px×2。 + const available = 960 - 44 * 2 + assert.ok(fixed + gap * (parts.length - 1) <= available, `五列 ${fixed}px + 间距会挤出右半屏`) + + const nameTrack = /minmax\(0,\s*1fr\)/.test(parts[0] ?? '') + assert.ok(nameTrack, '项目 / 组别列应可伸缩') + const athleteWidth = Number(/(\d+)px/.exec(parts[1] ?? '')?.[1] ?? 0) + assert.ok(athleteWidth >= 180, '运动员列至少 180px,单位名才不至于只剩几个字') + + const athlete = cssRule(styleText(OVERLAY_SOURCE), '.col-athlete') + assert.match(athlete, /text-overflow:\s*ellipsis/, '长姓名 / 单位名要省略号收尾') + assert.match(athlete, /white-space:\s*nowrap/) +}) + +/** + * 「这几分怎么来的、有没有被改过」——大屏不能悬停,所以: + * - 非普通成绩(破纪录加分)在项目名后面打一个来源小标签; + * - 被改过的成绩多一行整行小字 `10:42 已修订(成绩录入笔误)`。 + * + * 两处都只在需要时才渲染(v-if),没改过的行连元素都没有 —— 大屏行高与加这一行之前完全一致。 + */ +test('来源标签只在非普通成绩时渲染,普通成绩不打(行高与列宽都不受影响)', () => { + assert.match(BODY_ROW, /v-if="breakdownSourceTag\(item\)"/) + assert.match(BODY_ROW, //) + assert.equal(breakdownSourceTag(item()), '') + // 大屏标签用短词:项目名后面那一行放不下「破纪录加分」五个字。 + assert.equal(breakdownSourceTag(item({ sourceType: 'record_bonus' })), '破纪录') +}) + +test('修订小字占满一整行(grid-column: 1 / -1),不与五列抢宽度', () => { + assert.match(BODY_ROW, /v-if="breakdownRevisionLine\(item\)"/) + assert.match(BODY_ROW, /class="col-revision"/) + assert.match(BODY_ROW, /\{\{ breakdownRevisionLine\(item\) \}\}/) + const css = cssRule(styleText(OVERLAY_SOURCE), '.col-revision') + assert.match(css, /grid-column:\s*1\s*\/\s*-1/, '修订小字要横跨整行,不能挤第六列') +}) + +test('没改过的成绩不渲染小字,渲染出来的也只有一行短句', () => { + assert.equal(breakdownRevisionLine(item()), '') + const line = breakdownRevisionLine( + item({ revisionCount: 1, lastRevisionAt: '2026-09-13 10:42:00', lastRevisionReason: '成绩录入笔误' }), + ) + assert.doesNotMatch(line, /null|undefined|NaN|×1/) + assert.ok(line.length <= 30, `大屏一行小字要短:${line}`) +}) diff --git a/web/src/display/tests/rest-fallback-guards.test.ts b/web/src/display/tests/rest-fallback-guards.test.ts index 0bcd3ea..90a13ea 100644 --- a/web/src/display/tests/rest-fallback-guards.test.ts +++ b/web/src/display/tests/rest-fallback-guards.test.ts @@ -1,7 +1,8 @@ import { test } from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' -import { parseAthleteStandings, parseStandingRows } from '../guards' +import { breakdownRevisionBadge, breakdownRevisionLine } from '@/shared' +import { parseAthleteStandings, parseStandingRows, parseTeamBreakdown } from '../guards' /** * REST 兜底也要过 guards(P2 C39)。 @@ -42,8 +43,73 @@ test('单位榜 REST 数据同样过 guards', () => { assert.equal(rows[0]?.rankChange, null) }) +test('奖牌榜名次 medalRank 原样收下;旧服务端缺它时退回总榜 rank', () => { + const withField = parseStandingRows([{ teamId: 1, rank: 4, medalRank: 1, gold: 2 }]) + assert.equal(withField[0]?.medalRank, 1) + + // 旧服务端 / 老缓存里没有 medalRank:那时奖牌榜与积分榜同序,退回 rank 才是对的,不能给 0。 + const legacy = parseStandingRows([{ teamId: 1, rank: 4, gold: 2 }]) + assert.equal(legacy[0]?.medalRank, 4) +}) + test('loadRest 的两条路都走 guards,不再把裸值塞进 ref', () => { assert.match(USE_SCOREBOARD_SOURCE, /applyStandings\(parseStandingRows\(standingsResult\.value\)\)/) assert.match(USE_SCOREBOARD_SOURCE, /athletes\.value = parseAthleteStandings\(athletesResult\.value\)/) assert.doesNotMatch(USE_SCOREBOARD_SOURCE, /athletes\.value = athletesResult\.value/) }) + +/** + * 修订痕迹也要过 guards:大屏是无人值守的,服务端(尤其升级前的老版本)不下发这几个字段时 + * 必须解析成 null(= 追不出来),绝不能让 undefined 漏进模板变成「已修订 ×undefined」。 + */ +test('明细行的修订痕迹缺字段时收成 null,不显示角标', () => { + const items = parseTeamBreakdown({ + teamId: 1, + teamCode: 'A', + teamName: '第一分公司', + totalPoints: 10, + items: [{ ledgerId: 1, sourceType: 'result', eventName: '100米跑', points: 10, createdAt: '' }], + })?.items + + const row = items?.[0] + assert.equal(row?.revisionCount, null) + assert.equal(row?.lastRevisionAt, null) + assert.equal(row?.lastRevisionReason, null) + assert.equal(row?.lastRevisedBy, null) + assert.ok(row !== undefined) + assert.equal(breakdownRevisionBadge(row), '') + assert.equal(breakdownRevisionLine(row), '') +}) + +test('明细行的修订痕迹在位时原样收下并渲染成小字', () => { + const row = parseTeamBreakdown({ + teamId: 1, + teamCode: 'A', + teamName: '第一分公司', + totalPoints: 10, + items: [ + { + ledgerId: 1, + sourceType: 'result', + eventName: '100米跑', + points: 10, + createdAt: '', + revisionCount: 2, + lastRevisionAt: '2026-09-13 02:42:00', + lastRevisionReason: '成绩录入笔误', + lastRevisedBy: '张三', + }, + ], + })?.items[0] + + assert.equal(row?.revisionCount, 2) + assert.equal(breakdownRevisionBadge(row), '已修订 ×2') + assert.match(breakdownRevisionLine(row), /^(\d{2}:\d{2} )?已修订 ×2(成绩录入笔误)$/) + // 脏值(字符串 / 负数)不算「改过」,宁可不说也不能误报。 + const dirty = parseTeamBreakdown({ + teamId: 1, teamCode: 'A', teamName: 'A', totalPoints: 0, + items: [{ ledgerId: 1, points: 0, revisionCount: 'x' }], + })?.items[0] + assert.ok(dirty !== undefined) + assert.equal(breakdownRevisionBadge(dirty), '') +}) diff --git a/web/src/shared/channels.ts b/web/src/shared/channels.ts index 315c175..373b829 100644 --- a/web/src/shared/channels.ts +++ b/web/src/shared/channels.ts @@ -5,10 +5,13 @@ * 页面直接读会得到 undefined;统一在这里补默认值,读取处不必各写一份兜底。 */ -import type { AvgMode, Event, EventInput, ScoreChannel } from './types' +import type { AggregateMode, AvgMode, Event, EventInput, ScoreChannel } from './types' export const AVG_MODES: readonly AvgMode[] = ['valid', 'all'] export const DEFAULT_AVG_MODE: AvgMode = 'valid' +export const AGGREGATE_MODES: readonly AggregateMode[] = ['avg', 'sum'] +/** 聚合通道默认按成员平均汇总;缺字段的老数据 / 老服务端都按它处理。 */ +export const DEFAULT_AGGREGATE_MODE: AggregateMode = 'avg' /** 通道默认计入单位总分;关掉后该通道的分只记在个人头上。 */ export const DEFAULT_COUNT_TO_TEAM = true /** 通道默认发奖牌;老服务端不下发该字段时的口径。 */ @@ -24,6 +27,16 @@ export function normalizeAvgMode(value: unknown): AvgMode { : DEFAULT_AVG_MODE } +/** + * 聚合通道的汇总口径归一化:缺字段 / 认不出的取值一律按缺省 avg 处理。 + * 只对 basis=aggregate 的通道有意义,其它通道即使带着该字段也不参与计算。 + */ +export function normalizeAggregateMode(value: unknown): AggregateMode { + return typeof value === 'string' && (AGGREGATE_MODES as readonly string[]).includes(value) + ? (value as AggregateMode) + : DEFAULT_AGGREGATE_MODE +} + export function normalizeCountToTeam(value: unknown): boolean { return typeof value === 'boolean' ? value : DEFAULT_COUNT_TO_TEAM } diff --git a/web/src/shared/index.ts b/web/src/shared/index.ts index fa06807..50fc2f6 100644 --- a/web/src/shared/index.ts +++ b/web/src/shared/index.ts @@ -9,7 +9,9 @@ export * from './types' export { ApiClient, ApiError, createApiClient } from './api' export type { ApiClientOptions, QueryParams, QueryValue } from './api' export { + AGGREGATE_MODES, AVG_MODES, + DEFAULT_AGGREGATE_MODE, DEFAULT_AVG_MODE, DEFAULT_AWARD_MEDALS, DEFAULT_COUNT_TO_MEDALS, @@ -17,6 +19,7 @@ export { DEFAULT_COUNT_TO_TEAM_MEDALS, eventInputOf, hasAggregateChannel, + normalizeAggregateMode, normalizeAvgMode, normalizeAwardMedals, normalizeCountToMedals, @@ -24,6 +27,17 @@ export { normalizeCountToTeamMedals, } from './channels' export { readTeamRanksView, readTeamRanksViews } from './teamRanks' +export { + breakdownAthleteName, + breakdownCategoryName, + breakdownRevisionBadge, + breakdownRevisionCount, + breakdownRevisionLine, + breakdownRevisionTitle, + breakdownSourceLabel, + breakdownSourceTag, + medalBoardRows, +} from './standings' export { GUEST_ROLE, isGuestRole, isGuestUser } from './session' export { resolveAssetUrl } from './asset' export { RealtimeClient } from './realtime' diff --git a/web/src/shared/rules.ts b/web/src/shared/rules.ts index 9f81a97..403d900 100644 --- a/web/src/shared/rules.ts +++ b/web/src/shared/rules.ts @@ -6,7 +6,7 @@ * 校验口径与服务端 rules.Canonical 对齐,避免前端拿到的规则包和实际生效规则不一致。 */ -import { normalizeCountToTeam } from './channels' +import { normalizeAggregateMode, normalizeCountToTeam } from './channels' import { asRecord, emptyToNull, @@ -229,6 +229,10 @@ function normalizeChannels(raw: unknown): RuleChannel[] { // 保留「未配置」与「显式开启」的区别,导出页才能如实显示规则包原文口径。 if (typeof rec.countToMedals === 'boolean') channel.countToMedals = rec.countToMedals if (typeof rec.countToTeamMedals === 'boolean') channel.countToTeamMedals = rec.countToTeamMedals + // 汇总口径同样是三态:只在规则包显式写了 avg / sum 时落到对象上(缺省 = avg,不写)。 + if (rec.aggregateMode === 'avg' || rec.aggregateMode === 'sum') { + channel.aggregateMode = normalizeAggregateMode(rec.aggregateMode) + } out.push(channel) } return out diff --git a/web/src/shared/standings.ts b/web/src/shared/standings.ts new file mode 100644 index 0000000..09423a0 --- /dev/null +++ b/web/src/shared/standings.ts @@ -0,0 +1,152 @@ +import { formatClock, formatDateTime } from './format' +import type { BreakdownItem, MedalRow } from './types' + +/** + * 单位奖牌榜的服务端顺序(金 → 银 → 铜 → 单位编码)。 + * + * 排序与名次都由服务端算好(`domain.BuildMedalStandings`,REST / WS 快照 / xlsx 导出同一个函数), + * 大屏页与管理端页只按 `medalRank` 排行、按 `medalRank` 显示名次——**两边各写一套金/银/铜重排 + * 迟早会和导出件对不上**,这正是 P1-14 修过的老问题。 + * + * 旧服务端 / 老缓存不下发 `medalRank` 时退回总积分榜名次:那时奖牌榜本来就与积分榜同序, + * 显示成 0 或空才是真的错。 + */ +export function medalBoardRows(rows: readonly MedalRow[]): MedalRow[] { + return rows + .map((row) => ({ ...row, medalRank: row.medalRank > 0 ? row.medalRank : row.rank })) + .sort((a, b) => a.medalRank - b.medalRank) +} + +/** + * 单位积分明细「运动员」列的文案(管理端明细表与大屏明细覆盖层共用)。 + * + * 借用同一份的原因是:这一列的意义是回答「单位这一分是谁挣的」,两边各写一套降级 + * 迟早会变成「大屏空白格、管理端写团体」这种对不上的情况。 + * + * 团体项目 / 聚合通道(按队内平均)/ 人工调整的流水没有 athleteId,服务端下发 + * `athleteName` 是 null,这类行不能留空白格也不能打出 `null`:退回该流水的归属单位名—— + * 团体项目里单位就是拿到这一分的「谁」。连单位名都没有(理论上不会)时退到「团体」。 + * 人工调整本就没有项目与运动员,项目列已写明「人工调整」,这里给「—」不重复叨叨。 + */ +export function breakdownAthleteName( + item: Pick, + teamName: string, +): string { + const name = item.athleteName?.trim() ?? '' + if (name !== '') return name + if (item.sourceType === 'adjustment') return '—' + const team = teamName.trim() + return team === '' ? '团体' : team +} + +/** + * 单位积分明细「组别」列的文案。 + * + * 组别的来源有两处(报名项的组别、聚合流水按单位回推的组别),服务端回推不出来时是 null + * (单位在同一小项参加了多个组别,见 teamBreakdown);这里统一给占位符,不留空白格。 + */ +export function breakdownCategoryName(item: Pick): string { + const name = item.categoryName?.trim() ?? '' + return name === '' ? '—' : name +} + +/** + * 单位积分明细「来源」列的文案。 + * + * 词与 xlsx 导出侧完全一致(服务端 `export.sourceLabel`:成绩 / 破纪录加分 / 人工调整)—— + * 明细的意义就是「屏幕看到的和导出的对得上」,两边各写一套措辞迟早被当成两份数据。 + * 取不到 / 认不出的来源按「成绩」显示:老服务端不下发时它本来就是成绩流水。 + */ +export function breakdownSourceLabel(item: Pick): string { + switch (item.sourceType) { + case 'adjustment': + return '人工调整' + case 'record_bonus': + return '破纪录加分' + default: + return '成绩' + } +} + +/** + * 大屏明细覆盖层要不要给这一行打「来源」标签:返回空串表示不打。 + * + * 大屏只有 960px 的半屏,穷得放不下第六列: + * - 普通成绩(result)是绝大多数,打了只是给每一行加噪声,直接省略; + * - 人工调整流水没有项目名,项目列本来就写着「人工调整」,再打一个标签是同义重复; + * - 破纪录加分是站在成绩旁边的额外分(项目列写的是小项名),必须打出来才看得懂这几分哪来的。 + */ +export function breakdownSourceTag(item: Pick): string { + if (item.sourceType === 'result') return '' + if ((item.eventName ?? '').trim() === '') return '' + // 大屏用短词「破纪录」:它要挤在项目名后面一行小字里,五个字会把项目名挤没; + // 管理端明细与 xlsx 导出仍是完整的「破纪录加分」。 + if (item.sourceType === 'record_bonus') return '破纪录' + return breakdownSourceLabel(item) +} + +/** 修订次数:追不出来(null / 缺字段)与没改过(0)都是 0,只有 > 0 才谈得上「已修订」。 */ +export function breakdownRevisionCount(item: Pick): number { + const count = item.revisionCount + if (typeof count !== 'number' || !Number.isFinite(count) || count <= 0) return 0 + return Math.floor(count) +} + +/** 管理端明细行尾的淡色角标文案;没改过返回空串(不占位、不留空角标)。 */ +export function breakdownRevisionBadge(item: Pick): string { + const count = breakdownRevisionCount(item) + return count === 0 ? '' : `已修订 ×${count}` +} + +/** + * 管理端角标的悬停文案:`2026-09-13 10:42 · 已修订 ×2(成绩录入笔误)· 张三`。 + * + * 屏幕放不下的一律塞进悬停里:完整时间、完整原因、操作人。缺哪段就少哪段, + * 一点都不剩(没改过)时返回空串,调用方连 title 都不用挂。 + */ +export function breakdownRevisionTitle( + item: Pick, +): string { + const count = breakdownRevisionCount(item) + if (count === 0) return '' + const parts: string[] = [] + // formatDateTime 解析不出来时给的是占位符「—」,那不是时间,别挂到悬停里。 + const at = formatDateTime(item.lastRevisionAt ?? null) + if (at !== '—') parts.push(at) + const reason = (item.lastRevisionReason ?? '').trim() + parts.push(reason === '' ? `已修订 ×${count}` : `已修订 ×${count}(${reason})`) + const by = (item.lastRevisedBy ?? '').trim() + if (by !== '') parts.push(by) + return parts.join(' · ') +} + +/** 大屏小字里原因最多留几个字:一行小字放不下长理由,超了截断,完整理由在管理端悬停里。 */ +const REVISION_REASON_MAX = 14 + +/** + * 大屏明细覆盖层的一行小字:`10:42 已修订(成绩录入笔误)`;没改过返回空串。 + * + * 大屏不能悬停,还坐着离屏幕十几米的观众,所以这一行必须短、必须一眼看懂: + * 时间用 HH:mm(当天哪一刻改的),次数只在改过不止一次时写(一次是常态,×1 是噪声), + * 原因截断到十几个字。宁可少写一个字,也不能让观众看到看不懂的术语。 + */ +export function breakdownRevisionLine( + item: Pick, +): string { + const count = breakdownRevisionCount(item) + if (count === 0) return '' + const reason = (item.lastRevisionReason ?? '').trim() + const bracketed = + reason === '' + ? '' + : `(${reason.length > REVISION_REASON_MAX ? `${reason.slice(0, REVISION_REASON_MAX)}…` : reason})` + const mark = count > 1 ? `已修订 ×${count}` : '已修订' + const at = revisionClock(item.lastRevisionAt ?? null) + return at === '' ? `${mark}${bracketed}` : `${at} ${mark}${bracketed}` +} + +/** `HH:mm`(本地时区);解析不出来返回空串——宁可不写时间,也不写「--:--」。 */ +function revisionClock(iso: string | null): string { + const full = formatClock(iso) + return full.startsWith('--') ? '' : full.slice(0, 5) +} diff --git a/web/src/shared/tests/standings.test.ts b/web/src/shared/tests/standings.test.ts new file mode 100644 index 0000000..1375f32 --- /dev/null +++ b/web/src/shared/tests/standings.test.ts @@ -0,0 +1,222 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { + breakdownAthleteName, + breakdownCategoryName, + breakdownRevisionBadge, + breakdownRevisionCount, + breakdownRevisionLine, + breakdownRevisionTitle, + breakdownSourceLabel, + breakdownSourceTag, + medalBoardRows, +} from '../standings' +import type { BreakdownItem, MedalRow } from '../types' + +/** + * 单位奖牌榜的顺序与名次由服务端算好(金 → 银 → 铜 → 单位编码,见 domain.BuildMedalStandings), + * 前端只按 medalRank 应用。这一层要钉住的是: + * 1. 名次用 medalRank,不拿总积分榜的 rank(否则"金牌多的单位排后面"会在界面上复现); + * 2. 奖牌榜顺序与积分榜顺序确实是两套(金牌多但总分低的单位排前面); + * 3. 旧服务端不下发 medalRank 时退回 rank,不显示成 0。 + */ + +function row(over: Partial & Pick): MedalRow { + return { + teamCode: `T${over.teamId}`, + teamName: `第${over.teamId}队`, + shortName: null, + color: null, + logoPath: null, + rank: 0, + medalRank: 0, + gold: 0, + silver: 0, + bronze: 0, + medalTotal: 0, + ...over, + } +} + +test('奖牌榜按 medalRank 排行:金牌多但总分低的单位排在前面', () => { + // 服务端口径:A 金牌 1 枚(总榜第 2),B 一块牌没有(总榜第 1)。 + const rows = [row({ teamId: 1, medalRank: 2, rank: 2, gold: 1 }), row({ teamId: 2, medalRank: 1, rank: 1 })] + + const board = medalBoardRows(rows) + + assert.deepEqual(board.map((item) => item.teamId), [2, 1]) + assert.deepEqual(board.map((item) => item.medalRank), [1, 2]) + // 传入的数组不被就地改动(积分榜那块还在用它)。 + assert.deepEqual(rows.map((item) => item.teamId), [1, 2]) +}) + +test('名次取 medalRank,不拿总积分榜的 rank 顶替', () => { + const board = medalBoardRows([row({ teamId: 7, rank: 5, medalRank: 3, gold: 1 })]) + + assert.equal(board[0]?.medalRank, 3) + assert.equal(board[0]?.rank, 5, '总积分榜名次原样保留,两套名次并存') +}) + +test('旧服务端 / 老缓存没有 medalRank 时退回 rank,不显示成 0', () => { + const board = medalBoardRows([row({ teamId: 1, rank: 2 }), row({ teamId: 2, rank: 1 })]) + + assert.deepEqual(board.map((item) => item.medalRank), [1, 2]) +}) + +/** + * 单位积分明细的「运动员」列:现场要能一眼看出这一分是谁挣的, + * 团体项目(服务端不下发 athleteName)必须退回单位名而不是空白格或 null。 + */ +function item(over: Partial = {}): BreakdownItem { + return { + ledgerId: 1, + sourceType: 'result', + eventId: 1, + eventCode: 'M100', + eventName: '100米跑', + categoryName: '男子', + athleteId: 7, + athleteName: '张伟', + rank: 1, + resultText: '11.58', + points: 10, + createdAt: '2026-09-13 10:00:00', + ...over, + } +} + +test('明细行有运动员时显示运动员名', () => { + assert.equal(breakdownAthleteName(item(), '第一分公司'), '张伟') +}) + +test('团体项目(athleteName 为空 / null / 只有空白)退回单位名,不留空白格也不显示 null', () => { + for (const athleteName of [null, '', ' ']) { + const cell = breakdownAthleteName(item({ athleteName, athleteId: null }), '第一分公司') + assert.equal(cell, '第一分公司') + assert.doesNotMatch(cell, /null|undefined/) + } +}) + +test('单位名也拿不到时退到固定占位,不留空白格', () => { + assert.equal(breakdownAthleteName(item({ athleteName: null }), ' '), '团体') +}) + +test('人工调整没有运动员,项目列已写明人工调整,这里不重复', () => { + const cell = breakdownAthleteName( + item({ sourceType: 'adjustment', athleteName: null, athleteId: null, eventId: null, eventName: null }), + '第一分公司', + ) + assert.equal(cell, '—') +}) + +test('运动员名去掉首尾空白,不把空格当成「有名字」', () => { + assert.equal(breakdownAthleteName(item({ athleteName: ' 张伟 ' }), '第一分公司'), '张伟') +}) + +test('明细行「组别」列拿不到组别时给占位符(聚合流水跨组别回推不出来)', () => { + assert.equal(breakdownCategoryName(item()), '男子') + assert.equal(breakdownCategoryName(item({ categoryName: null })), '—') + assert.equal(breakdownCategoryName(item({ categoryName: ' ' })), '—') +}) + +/** + * 明细行的「来源」:屏幕与 xlsx 导出必须是同一套词(成绩 / 破纪录加分 / 人工调整), + * 否则同一场比赛的同一分在两处叫两个名字,对账的人不知道该信哪份。 + */ +test('来源文案与导出侧 sourceLabel 同一套词', () => { + assert.equal(breakdownSourceLabel(item({ sourceType: 'result' })), '成绩') + assert.equal(breakdownSourceLabel(item({ sourceType: 'record_bonus' })), '破纪录加分') + assert.equal(breakdownSourceLabel(item({ sourceType: 'adjustment' })), '人工调整') +}) + +test('老服务端下发认不出的来源时按成绩显示,不显示成英文枚举', () => { + const label = breakdownSourceLabel(item({ sourceType: 'whatever' as BreakdownItem['sourceType'] })) + assert.equal(label, '成绩') +}) + +test('大屏只给「破纪录加分」这类非普通成绩打来源标签', () => { + assert.equal(breakdownSourceTag(item()), '', '普通成绩不打标签:一行行都写「成绩」只是噪声') + // 大屏那一行要短:用短词「破纪录」,管理端与导出仍是完整的「破纪录加分」。 + assert.equal(breakdownSourceTag(item({ sourceType: 'record_bonus' })), '破纪录') + assert.equal(breakdownSourceLabel(item({ sourceType: 'record_bonus' })), '破纪录加分') + // 人工调整流水没有项目名,项目列本来就写着「人工调整」,不再重复打标签。 + assert.equal(breakdownSourceTag(item({ sourceType: 'adjustment', eventName: null })), '') + assert.equal(breakdownSourceTag(item({ sourceType: 'adjustment', eventName: ' ' })), '') +}) + +/** + * 修订痕迹:「被改过」是现场裁判长最想知道的(分错了又改了一遍吗),也是最不能误报的。 + */ +test('没改过(0)与追不出来(null / 缺字段)都不显示角标,只有 > 0 才算已修订', () => { + for (const revisionCount of [0, null, undefined, -1, Number.NaN]) { + const row = item({ revisionCount }) + assert.equal(breakdownRevisionCount(row), 0, `revisionCount=${String(revisionCount)} 不该算已修订`) + assert.equal(breakdownRevisionBadge(row), '') + assert.equal(breakdownRevisionLine(row), '') + assert.equal(breakdownRevisionTitle(row), '') + } + assert.equal(breakdownRevisionBadge(item({ revisionCount: 2 })), '已修订 ×2') + assert.equal(breakdownRevisionBadge(item({ revisionCount: 1 })), '已修订 ×1') +}) + +test('大屏小字:时间 + 已修订(原因),改过不止一次才写次数', () => { + const one = item({ + revisionCount: 1, + lastRevisionAt: '2026-09-13 10:42:00', + lastRevisionReason: '成绩录入笔误', + }) + // 库里存的是 UTC(SQLite datetime('now') 不带时区),按本地时区展示。 + const clock = new Date('2026-09-13T10:42:00Z') + const hhmm = `${String(clock.getHours()).padStart(2, '0')}:${String(clock.getMinutes()).padStart(2, '0')}` + assert.equal(breakdownRevisionLine(one), `${hhmm} 已修订(成绩录入笔误)`) + assert.doesNotMatch(breakdownRevisionLine(one), /×1|null|undefined/) + + const twice = item({ revisionCount: 2, lastRevisionAt: '2026-09-13 10:42:00' }) + assert.equal(breakdownRevisionLine(twice), `${hhmm} 已修订 ×2`) +}) + +test('大屏小字:原因太长就截断,没写原因就只显示时间与「已修订」', () => { + const long = breakdownRevisionLine( + item({ revisionCount: 1, lastRevisionAt: '2026-09-13 10:42:00', lastRevisionReason: '裁判在后台把成绩点错了又重新改了一遍' }), + ) + assert.match(long, /…)$/) + assert.ok(long.length <= 30, `一行小字要短,得到 ${long.length} 字:${long}`) + + const noReason = breakdownRevisionLine(item({ revisionCount: 1, lastRevisionAt: '2026-09-13 10:42:00' })) + assert.doesNotMatch(noReason, /(|null|undefined/) +}) + +test('大屏小字:时间解析不出来时不写「--:--」,也不留前导空格', () => { + const line = breakdownRevisionLine(item({ revisionCount: 1, lastRevisionAt: null, lastRevisionReason: '笔误' })) + assert.equal(line, '已修订(笔误)') + assert.equal(breakdownRevisionLine(item({ revisionCount: 1, lastRevisionAt: '不是时间' })), '已修订') +}) + +test('管理端悬停:完整时间 + 次数 + 原因 + 操作人,缺哪段就少哪段', () => { + // 悬停里是完整时间(本地时区),与大屏小字同一份 UTC 串。 + const date = new Date('2026-09-13T10:42:00Z') + const stamp = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String( + date.getDate(), + ).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}` + assert.equal( + breakdownRevisionTitle( + item({ + revisionCount: 2, + lastRevisionAt: '2026-09-13 10:42:00', + lastRevisionReason: '成绩录入笔误', + lastRevisedBy: '张三', + }), + ), + `${stamp} · 已修订 ×2(成绩录入笔误) · 张三`, + ) + // 现场没写原因、操作人已删号:只留时间与次数,不编也不留空括号。 + assert.equal( + breakdownRevisionTitle(item({ revisionCount: 1, lastRevisionAt: '2026-09-13 10:42:00' })), + `${stamp} · 已修订 ×1`, + ) + // 时间也解析不出来时,至少还有次数。 + assert.equal( + breakdownRevisionTitle(item({ revisionCount: 3, lastRevisionAt: 'x', lastRevisedBy: ' ' })), + '已修订 ×3', + ) +}) diff --git a/web/src/shared/types.ts b/web/src/shared/types.ts index d92f8bd..21af6ec 100644 --- a/web/src/shared/types.ts +++ b/web/src/shared/types.ts @@ -83,6 +83,13 @@ export type ChannelBasis = 'result' | 'manual' | 'aggregate' */ export type AvgMode = 'valid' | 'all' +/** + * 聚合通道(basis=aggregate)的汇总口径: + * `avg` 按主体成员成绩的平均值排名(缺省);`sum` 按成员成绩的总和排名。 + * 与 avgMode 是两个维度:`sum` 下 avgMode 只决定「一个有效成绩都没有的单位算不算 0 分参与排名」。 + */ +export type AggregateMode = 'avg' | 'sum' + export interface ScoreChannel { id: number eventId: number @@ -90,6 +97,11 @@ export interface ScoreChannel { basis: ChannelBasis profileId: number sortOrder: number + /** + * basis=aggregate 通道的汇总口径:`avg` 按成员平均 / `sum` 按成员总和。 + * 缺字段 = avg:老服务端不下发它(缺省值不下发),归一化见 normalizeAggregateMode。 + */ + aggregateMode?: AggregateMode /** false 表示该通道产生的分只记在个人头上,不进单位总分。 */ countToTeam: boolean /** @@ -399,7 +411,15 @@ export interface TeamRef { } export interface MedalRow extends TeamRef { + /** 总积分榜名次(总分优先)。奖牌榜的名次是另一套,见 medalRank。 */ rank: number + /** + * 单位奖牌榜的名次:金 → 银 → 铜 → 单位编码,与 totalPoints 无关。 + * + * 服务端按这套口径算好下发(`domain.BuildMedalStandings`,REST / WS 快照 / xlsx 同源); + * 前端只按它排序与显示,**不自己按金/银/铜重排**,否则名次会与导出件打架。 + */ + medalRank: number gold: number silver: number bronze: number @@ -446,6 +466,20 @@ export interface BreakdownItem { resultText: string | null points: number createdAt: string + /** + * 这条成绩发布之后被改过几次(口径见服务端 `internal/revisions`)。 + * + * `null` = 追不出来(聚合流水、人工调整、没有版本基线),`0` = 追出来了但没改过。 + * 只有 > 0 才显示「已修订」角标 —— 宁可不说,也不能把没改过的成绩标成改过。 + * 老服务端不下发这几个字段,所以都按可空解析(null)。 + */ + revisionCount?: number | null + /** 最后一次改动的时间(SQLite UTC 串,展示时按本地时区格式化)。 */ + lastRevisionAt?: string | null + /** 最后一次改动的原因;现场没写就是 null,界面上不编。 */ + lastRevisionReason?: string | null + /** 最后一次改动的操作人显示名;查不到(已删号 / 老服务端)就是 null。 */ + lastRevisedBy?: string | null } export interface TeamBreakdown { @@ -844,6 +878,8 @@ export interface RuleChannel { scope: ChannelScope basis: ChannelBasis profile: string + /** basis=aggregate 通道的汇总口径;缺省视为 avg(规则包不必写缺省值)。 */ + aggregateMode?: AggregateMode /** 缺省视为 true;「个人+团体」模板的个人通道会显式写 false。 */ countToTeam?: boolean /** 缺省视为 true(该通道发奖牌);规则包显式写 false 才不发。 */