Repository navigation
Commit d46b1ff
<!-- claude-projects-attribution: {"github_login":"marchtian"} -->
_Requested by **田騏** · [project
thread](https://claude.ai/code/project/chan_01VmuUhXU9SSUzqJYyXSmYSi?thread=cmsg_01VmuUhXU9SSUzqJYyXSmYSi9paTx1Lu8ENYwwssthfK3h)_
Fixes #29520
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:codemod `scripts/codemod-split-sql-driver.mjs` 生成的
`sql-driver.ts` 拆分。54 个方法体移入 18 个分节模块,127/129 个类外顶层声明移入叶模块
`sql-driver-top-level.ts`。`check-tenant-chokepoint` 扫描全部非测试
`sql-driver-*.ts`,其 dispatch-gates 声明补上 main 新增的
`sql-driver-balanced-group.ts`,自测失败时直接写出要加或删的条目。按裁决 6597555122 第 3
点,按路径读取 `sql-driver.ts`
的读者跟随代码扩到新模块:`sql-driver-compile-refusal-seam.test.ts` 的 `sources`
加入叶模块,`logger-receiver-detach.test.ts` 的 pin ③ 改为列目录读全部
`sql-driver*.ts`,liveness 台账的一条锚点改指叶模块,ADR-0053 锚点登记为三个新模块各加一条。根
`package.json` 加入 devDependency `ts-morph` `^28.0.0`(#29711
后已无包声明它),codemod 从根清单解析。生成文件未手改。
- 为什么改:落实 #29520 第三轮(裁决 6597555122 选项 A)。测试读取清单加入叶模块后,`sql-driver.ts` 从
18,334 行降到 12,460 行,低于 13,000 行的门槛。
- 风险与回滚:纯搬移。54/54 方法体、127/127 顶层声明逐字节相同;撤销拆分可逐字节还原 base;三套驱动测试计数与 base
相同(driver-sql 多 1 条,是 pin ③ 新增的下限用例);门禁读数 base = head。打包 `.d.ts` 按
6441032442 B 的第二归一化判通过,四项读数全部相等,阳性对照抓到去掉的 `private`。回滚即 revert。
- 先看:① 下方「按路径读取 `sql-driver.ts` 的读者」表(哪些读者跟随了代码);②
`scripts/codemod-split-sql-driver.mjs` 的 `CLASS_PATH_READER_NEEDLES`;③
`.d.ts` 读数表。
- 两分钟验证:`pnpm install --frozen-lockfile` 后运行 `node
scripts/codemod-split-sql-driver.mjs --verify --base 0b5b176`,预期
`54/54 moved bodies identical`、`127/127 moved top-level declarations
identical`、`18334 -> 12460 lines`,退出码 0。
- 需要你做的:无新裁决。超过 3,000 行,按四件套交接,待您批准后在您定的窗口落地;本 PR 保持草稿。
## What changes
- **`scripts/codemod-split-sql-driver.mjs`** (round 3): the three
seam-test needles move from `PATH_READER_NEEDLES` into a new
`CLASS_PATH_READER_NEEDLES` table: `unsupportedFilterError(`,
`withheldFilterError(` and `.INVALID_FILTER`.
- The reader of these needles now reads the leaf, so a top-level
declaration carrying one moves to it. That frees the 29 refusal builders
and the 6 declarations that close over them.
- A method carrying one still stays on the class. The test reads no
section module, and it pins `SqlDriver.resolveWithheldFilterRefusal` by
name.
- Measured: dropping the three needles outright moves that method too
(55 methods, 12,449 lines), and the test's enumeration would then go
red.
- A stale class needle refuses, as a stale needle does.
- Two mutants are each refused with 2 failures: the method rule removed,
and the class needles applied to top-level declarations.
- Review fixes: `--help` / `-h` is answered before any guard (it was
refused on a split tree), and `--dts` counts a line-count change as
`diff` does (it read 0), naming the count in `rawDiffMethod`.
- `--self-test`: 45 cases in 5 pinned batteries. A mutant of each review
fix is refused.
- **Root `package.json` and `pnpm-lock.yaml`**: `ts-morph` `^28.0.0`
joins the root devDependencies, beside `typescript`, `yaml` and
`semver`. The codemod now resolves it from the root manifest.
- Why: #29711 removed `ts-morph` from `@objectstack/cli`, and no
workspace package declares it. The codemod resolved it through the CLI,
so on a fresh `pnpm install --frozen-lockfile` its `--verify` and
`--self-test` exited 2.
- The lockfile was written by `pnpm install --lockfile-only` (+25 lines,
nothing else re-resolved). It adds `ts-morph@28.0.0`,
`@ts-morph/common@0.29.0` and `code-block-writer@13.0.3`.
`@ts-morph/common`'s `minimatch` resolves to the `10.2.6` already in the
tree, under the existing `minimatch@<11.0.0` override.
- Proved from clean: every `node_modules` removed, then `pnpm install
--frozen-lockfile`. With only `ts-morph` set aside, the script exits 2
and names the root manifest.
- **`scripts/check-tenant-chokepoint.mjs`**: `DECLARED_WATCH_HINTS`
gains `sql-driver-balanced-group.ts`, which #29911 added on main. The
scan lists the directory, so it already read the module. The self-test's
coupling asserts now name each missing or extra entry, and the one edit
that fixes it.
- Why the list stays literal: the dispatch-gates extractor does accept
`packages/drivers/driver-sql/src/sql-driver-*.ts` and judges it as a
pattern. Through `hintCovers`, though, it covers 31 seam modules and 234
`sql-driver-*.test.ts` files, plus any `.d.ts`. A hint has no negation,
and `?` and `[…]` are not admitted, so no spelling covers the modules
and leaves the tests out. The gate's docblock records this.
- Before the literal was added, the self-test failed with: `Fix: add
'packages/drivers/driver-sql/src/sql-driver-balanced-group.ts' to
DECLARED_WATCH_HINTS in this gate`.
- **`sql-driver-compile-refusal-seam.test.ts`**: `sources` gains
`sql-driver-top-level.ts` under a `[#29520 codemod]` comment, in the
same form as hand cuts 13, 15 and 16. The enumeration prose names the
leaf too.
- This migrates a path reader (#25521 ask 3). It is not an edit of
generated output.
- Ablation: without the new line the test fails 3 of 115 at head (the
positive control and both enumeration sets). With it, 115/115 pass.
- **`logger-receiver-detach.test.ts` pin ③**: it read `sql-driver.ts`
only and asserts an absence, so it stayed green while 3 of the host's 21
log-channel calls moved out. It now lists its directory and reads every
non-test `sql-driver*.ts` (a named list would rot at the next
regeneration), with a floor case that the listing finds more than the
host. It reads 55 calls at base and at head. Ablation: a planted
`(this.logger.error ?? this.logger.warn)(` in
`sql-driver-internal-helpers.ts` turns it red; the old host-only pin
stays green on the same tree.
- **`packages/spec/liveness/query.json`**: the one anchor whose symbol
moved, `unsupportedAggregationFilterError`, now cites
`sql-driver-top-level.ts`. Nothing else in the ledger changes; the other
nine driver-sql anchors still resolve in `sql-driver.ts`.
- **`scripts/adr-anchors/`**: three new ADR-0053 entries, for
`sql-driver-sqlite-serialisation.ts` (`formatOutput`'s folds),
`sql-driver-filter-helpers.ts` (`presentReadValue`'s datetime and audit
arms) and `sql-driver-top-level.ts` (the fold helpers), in the shape
#25521 cut 8 gave `sql-driver-schema-sync.ts`. 18 of the host's 33
ADR-0053 citations moved with that code; the host entry stays for the
stubs and the 15 left. Removing ADR-0053 from one module turns
`check:adr-anchors` red.
- **Unchanged from round 2:**
- lever (a): section modules may import values from `sql-driver.ts`.
This round it exports no staying helper, because every helper the moved
bodies read now sits in the leaf;
- lever (b): one leaf that never imports back;
- the stub host's bound `getBuilder`;
- the widened `check-tenant-chokepoint`;
- the `no-yield` rule;
- no re-indentation.
- **The generated split:** `--write` on origin/main, unedited. On the
latest merge base `0b5b176038`, #29911 changed `sql-driver.ts` (input
sha256 `2d2ebebdba87…`). The resolution took main's
`packages/drivers/driver-sql/src` and kept this branch's two test files,
then regenerated. The same 54 methods and 127 declarations move, and the
result differs from the previous head only by #29911's own change. It
produces `sql-driver.ts`, the leaf, and 18 section modules:
- `lifecycle`, `crud`, `sequence-semantics`, `bulk-operations`,
`aggregation`, `distinct`;
- `window-functions`, `query-plan`, `schema-sync-section`, `rotation`,
`managed-drift`, `internal-helpers`;
- `filter-helpers`, `field-mapping`, `window-function-builder`,
`column-creation`, `database-helpers`, `sqlite-serialisation`.
## Measurements
| Reading | Value |
|:--|:--|
| `sql-driver.ts` lines (`wc -l`) | 18,334 → **12,460** (−5,874). Bar:
below 13,000. **Met** |
| Methods | 54 of 254 move (2,596 body lines out, 616 stub lines in, 36
import lines) |
| Top-level declarations | 127 of 129 move (3,784 lines with their
docblocks). 2 stay, both `path-reader`: `JSON_COLUMN_TYPES` and
`MEDIA_ID_VARCHAR_CHARS`, which the cli pins read |
| Leaf / new files | `sql-driver-top-level.ts` 3,999 lines; all 19 new
files 9,575 lines |
| Byte-identity | 54/54 bodies, 127/127 top-level declarations
identical; undoing the split rebuilds the base byte-for-byte |
| Determinism | output tree sha256
`088547bdc1b4e152d6298d4a1d33b007eec27871e179716a298944b673984170` on
three runs: `--write` in the worktree and two plan runs on main's
unsplit text. Input sha256 `2d2ebebdba87…` |
| Chokepoint readings | base (main, widened gate): 24 `getBuilder()`
bindings, 21 read doors, 3 inserts, 4 tenant predicates, 0 D8 arms
across 15 files. Head: identical across 34 files |
| Export lists | `.d.ts` 92 = 92; runtime CJS 59 = 59 and ESM 59 = 59
(CJS = ESM) |
| Changed lines | 17,073 (+10,528 / −6,545, 30 files) |
### Readers of `sql-driver.ts` by path (ruling 6597555122 point 3)
| Reader | Asserts | Host matches moved | Now |
|:--|:--|:--|:--|
| seam test enumeration | exact set | 26 / 28 | reads the leaf |
| logger-receiver-detach pin ③ | absence | 3 / 21 | reads every
`sql-driver*.ts` |
| `check-tenant-chokepoint` | absence + floors | 18 / 24 | reads 34
files (round 2) |
| liveness `#anchor` citations | presence | 1 / 14 | re-pointed |
| ADR-0053 anchor registry | presence anywhere in file | 18 / 33 | 3 new
entries |
| 5 cli pins, `check-keyed-text-bounds` | presence (slices) | 0 | held
by needles / pins |
| `check-durability-degradation-log-level` | absence (same-file helper)
| 2 / 9 (to `sql-driver-column-creation.ts:53` and `:84`; the host still
counts 9 because two new stubs forward) | repo-wide scan, green |
| ADR / QA `#symbol` anchors, `check-object-def-param-keys`, cli test
cache inputs | presence | 0 | unchanged |
### `.d.ts`: ruling 6441032442 item 1, second normalisation, with ruling
6597555122's header clarification
The normaliser is `dtsnorm.mjs`, sha256
`9e3ca459fb22015c7e77e4576b564ca46076cfd0f366dc00dcec521274f8e911`. The
devx lane rewrote it from the ruling's text. It is a report reading, ⛔
not in `scripts/` (item 3). It does three things:
- It splits each file into top-level statements with the TypeScript API.
Each statement keeps its attached comments byte for byte.
- A leading comment separated by a blank line is a detached file-level
comment. It leaves the statement stream and is compared on its own as a
multiset, so its text still must not change.
- It sorts the statements and the specifier lists inside `import { }` /
`export { }`, and masks chunk hashes. driver-sql emits no chunk.
Base is main `0b5b176038`'s unsplit `src`, built. Head is `5f30cf9f2c`,
built. The readings are the same as round 3's, hash for hash. Each
reading below is the same for `index.d.ts` and `index.d.mts`.
| Reading | Base | Head | Verdict |
|:--|:--|:--|:--|
| Raw sha256 | `0f33bf3f…` | `69d9162d…` | differ; raw diff 19 lines,
`wc -l` 8,846 → 8,847 |
| **Normalised bytes** | `468260520fcc1ac2…` | `468260520fcc1ac2…` |
**identical** |
| **Declared-surface digest** (100 declarations, 585 lines) |
`50e5e5be3c1d…` | `50e5e5be3c1d…` | **equal** |
| **Statement multiset** | 106 | 106 | **equal**: only in base 0, only
in head 0. Before the specifier sort it is 2 / 2, the two
`@objectstack/spec` imports |
| **Export set** | 92 | 92 | **equal**; import specifier set 17 = 17 |
| Detached comments | 2 | 2 | equal texts. The "SQL Driver for
ObjectStack" header now sits before `declare class SqlDriver`, which
ruling 6597555122 does not count |
**Positive control (catches a dropped `private`).** I dropped `private`
from one moved member's stub, `compileFilters`, rebuilt, ran the
normaliser on head against control, then restored and rebuilt. The
rebuilt head `.d.ts` is byte-identical to the earlier head. The control
is caught on three readings:
- normalised hashes differ: `468260520fcc…` vs `73e89389695f…`;
- surface digests differ: `50e5e5be3c1d…` vs `acf70f0378d0…`. It names
`PropertyDeclaration [private] compileFilters` → `MethodDeclaration []
compileFilters`;
- the statement multiset is 1 / 1.
The normaliser exits 1 on both files. Its `--self-test` passes 8 cases,
among them a member reordered inside its class and a changed header
text, both refused.
**Premises.**
- P2: driver-sql `exports` is `.` only. It names `dist/index.*` and no
chunk.
- P3: `git grep 'driver-sql/dist' -- scripts package.json` finds 0 hits.
- (e) Dependents are green against the head dist: the driver-turso and
driver-sqlite-wasm typecheck and suites ran after the head build.
<details><summary>Why most methods stay (counted per method; one method
can carry several)</summary>
`already-moved` 78 · `no-yield` 55 · `non-public-static` 47 ·
`parameter-shape` 21 · `this-write` 19 · `path-reader` 18 · `no-section`
14 · `static` 11 · `comment-in-parameters` 7 · `field-call` 6 ·
`inferred-return-type` 6 · `type-parameters` 3 · `name-taken` 3 ·
`reserved-name` 1. The full table is the script's plan output.
</details>
## Tests
Every run below is at head `5f30cf9f2c` on merge base `0b5b176038`,
after every `node_modules` was removed and `pnpm install
--frozen-lockfile` re-ran. Each ran under one `os-verify-lock` hold
(VERDICT command-exit 0). The base runs used main's unsplit `src`, built
and then restored in place; status was clean afterwards.
- Type-check: driver-sql, driver-turso and driver-sqlite-wasm each exit
0.
- `@objectstack/driver-sql test`: exit 0 at both. 250 files (238 passed,
12 skipped). Base 4074 tests (3858 passed, 216 skipped); head 4075 (3859
passed, 216 skipped): the +1 is pin ③'s new floor case.
- `@objectstack/driver-turso test`: exit 0 at both. 96 files; 2530 tests
(2496 passed, 34 skipped). Base = head.
- `@objectstack/driver-sqlite-wasm test`: exit 0 at both. 40 files; 750
tests passed. Base = head.
- The five `packages/cli` pin tests that read `sql-driver.ts` by path
exit 0:
- unit: 4 files, 62 tests;
- integration (`generate-string-family-width`): 1 file, 30 tests.
- `sql-driver-compile-refusal-seam.test.ts`: 115/115. With the new
`sources` line removed, 3 tests fail (the ablation above).
- `logger-receiver-detach.test.ts`: 12/12; the planted shape fails it
(ablation above).
- `packages/spec` `check-liveness.test.ts` 74/74 and `check:liveness`
exit 0.
- Codemod: `--self-test` 45 cases in 5 batteries; `--verify --base
0b5b176` exits 0 (54/54, 127/127, 12,460 lines); two plan runs on
base's unsplit text give tree `088547bd…` both times, byte-identical;
`--help` on the split tree exits 0.
- `check-tenant-chokepoint` `--self-test` and main run exit 0.
`check:adr-anchors` and `check:adr-symbol-anchors` exit 0.
## Acceptance notes
1. **The bar is met: 12,460 lines.** Round 3 measured 12,456 on the
older base; #29911 added 4 lines to code that stays on the class.
2. **The three needles still bind methods.** That is what keeps the test
green (see What changes). Literally deleting them would move
`resolveWithheldFilterRefusal` into `sql-driver-filter-helpers.ts`,
which the test does not read.
3. **`.d.ts`** passes ruling 6441032442 B's second normalisation on all
four readings, with the control caught. Ruling 6348891160's union-order
bar alone still reads FAIL on these files. Under 6441032442 item 1, that
is the case the second normalisation exists for.
4. **Full `pnpm build`** exits 2 in `@object-ui/app-shell` (`Cannot find
module '@object-ui/mobile'`), outside this change. Every driver and cli
closure used here builds.
5. **Size.** 17,073 changed lines is over the 3,000 threshold. Per
ruling 6597555122 the PR takes the four-piece hand-off and a maintainer
approval, and lands in the window the maintainer sets. It stays a draft.
6. **`skip-changeset`:** the `.d.ts` meets item 1 by ruling 6441032442,
so per item 4 it takes no changeset.
## Verification
- Byte-identity: `pnpm install --frozen-lockfile`, then `node
scripts/codemod-split-sql-driver.mjs --verify --base 0b5b176`.
- `.d.ts`: build `@objectstack/driver-sql` at main's unsplit `src` and
at head. Then run `node dtsnorm.mjs --diff BASE/index.d.ts
HEAD/index.d.ts`, and the same for `.d.mts`. Expect exit 0 and `"pass":
true`. The #29520 report gives the normaliser's path and sha256.
- Chokepoint: `node scripts/check-tenant-chokepoint.mjs` prints the
readings line.
- Re-running in the landing window: merge the latest `main` and take
`main`'s `packages/drivers/driver-sql/src`, keeping this branch's
`sql-driver-compile-refusal-seam.test.ts` and
`logger-receiver-detach.test.ts`. Then run `--write` and commit. If a
regeneration moves different code, re-check the reader table above.
<details><summary>Gates at head 5f30cf9</summary>
- `node scripts/pm/dispatch-gates.mjs --commands` derives 92 families at
`5f30cf9f2c` on merge base `0b5b176038`, the same list as at
`5b19e9ac05`. Each was run alone after the fresh install, with its exit
captured before any pipe: 92 exit 0, `check:tenant-chokepoint` among
them.
- The `--ran` reconciliation reads 92 derived, 92 run, 0 NOT-MEASURED, 0
UNRUN, exit 0.
- Not measured here: the OSV-Scanner job. CI runs it base-relative
because the lockfile changed, and the local proxy refuses `api.osv.dev`.
The only advisory-bearing package the three lockfile additions reach is
`minimatch` 10.2.6, which is already in the merge base's lockfile and
already covered by the `GHSA-g3hv-75wg-m249` exemption.
- Also run: the codemod's `--dts` (ruling 6348891160's bar alone reads
FAIL, as before), the seam and logger tests together (127/127), and spec
`check:liveness`.
- `check:commit-card-trailers` passed on every push.
</details>
Durable attribution: session `session_017ihL2gLghEqeDKTbDTC7Zd`
(`domain:devx#2`, os-dev).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_017ihL2gLghEqeDKTbDTC7Zd
<!-- signed: domain:devx#2 · marchtian ·
session_017ihL2gLghEqeDKTbDTC7Zd -->
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 21510bb commit d46b1ff
30 files changed
Lines changed: 10528 additions & 6545 deletions
File tree
- packages
- drivers/driver-sql/src
- spec/liveness
- scripts
- adr-anchors
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
225 | 225 | | |
226 | 226 | | |
227 | 227 | | |
| 228 | + | |
228 | 229 | | |
229 | 230 | | |
230 | 231 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
52 | | - | |
53 | | - | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
54 | 56 | | |
55 | 57 | | |
56 | 58 | | |
57 | | - | |
| 59 | + | |
58 | 60 | | |
59 | 61 | | |
60 | 62 | | |
| |||
493 | 495 | | |
494 | 496 | | |
495 | 497 | | |
496 | | - | |
497 | | - | |
498 | | - | |
499 | | - | |
500 | | - | |
501 | | - | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
502 | 522 | | |
503 | 523 | | |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
| 33 | + | |
| 34 | + | |
34 | 35 | | |
35 | 36 | | |
36 | 37 | | |
| |||
290 | 291 | | |
291 | 292 | | |
292 | 293 | | |
| 294 | + | |
| 295 | + | |
293 | 296 | | |
294 | 297 | | |
295 | 298 | | |
296 | 299 | | |
297 | 300 | | |
| 301 | + | |
298 | 302 | | |
299 | 303 | | |
300 | 304 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
0 commit comments