Repository navigation
Commit 70ff998
<!-- claude-projects-attribution: {"github_login":"os-sales"} -->
_Requested by **Sales** · [project
thread](https://claude.ai/code/project/chan_01D5bWFY3rFzgJcytD5gD4Uu?thread=cmsg_01D5bWFY3rFzgJcytD5gD4UuMjbPDrsigsyqoKsV4WZQMz)_
Part of #25224
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6348891160, 6364006498
The basis for the `Clause-②: no` line: this is a move. No accept set,
export, route, refusal, code or answer changes. The `.d.ts` bar is
ruling `6348891160` item 1 (on #25222, covering this card).
`@objectstack/plugin-auth`'s published `dist/index.d.ts` and
`dist/index.d.mts` are raw byte-identical to base (0 diff lines, so the
union-order normalisation has nothing to do), with the ruling's positive
control. Its entry exports the same 159 names under ESM and CJS
(measured below). Ruling `6364006498` (Sales's ruling A on this card,
for bodies that read shared unexported helpers) is cited because the
claim runs under it; no body in this cut reads such a helper, so its
`index.ts` name list does not land here.
Cut 8 of the `auth-manager.ts` split: **who may join, and what joining
settles.** Four `AuthManager` method bodies (163 lines) move unedited,
re-indented one level, into one new module,
`packages/plugins/plugin-auth/src/auth-manager-membership-admission.ts`.
#25224 stays open for the later cuts.
This follows the amended claim `6365318480`, which amends `6363170079`
on the file cut 7 left (#25404, landed note `6364312052`). The shape is
cuts 1 to 7's, which is #23050's.
Branch: `claude/project-thread-lg3wrj`, the harness-pinned branch for
this session, restarted from `origin/main` `f0fdd45bbc` after #25404
merged. It names no issue, so the card relation is this body's first
line.
`auth-manager.ts` goes from 8,909 to 8,790 lines. The cut is +321 / −173
over 5 files: 494 changed lines, under the 3,000-line line. It is not a
governed surface (`check-governed-merges.mjs --branch HEAD`: 0 of the 5
paths hit the register). Two commits: the move, and the census documents
`--write` regenerates for it.
## Why this seam
These are the audience gate and what a new user's creation settles:
- `validateAudienceAdmission`: the gate better-auth's
`user.validateUserInfo` callback runs on every user creation. It asks
the manager the bootstrap, invitation and operator-provisioning
questions, gives the audience verdict and refusal codes, and stages the
owner-verified stamp and the self-registration grant;
- `settleMembership`: the membership reconciler's one assembly of
inputs, which both creation seams call, with the live membership policy;
- `landSelfRegistrationGrant`: the self-registration permission set
written for the membership's organization, idempotently;
- `reportUngrantedSelfRegistrant`: the durability-level report of a
grant that did not land.
What stays, and why:
- `settleSelfRegistrationGrant` stays. Its body does
`this.pendingSelfRegistrationGrants.delete(email)` (`:5857`). The
tenant-audit census reads a `this.` receiver's type from class property
declarations only, so in the new module that call is a receiver it
cannot read, and `check-tenant-audit-census` fails with an
untyped-receiver problem (measured on a draft that moved it). Placing it
would need a new `UNTYPED_RECEIVERS` row in
`scripts/tenant-audit-census.mjs`, a ledger that is shrink-only. In the
class, the census reads it as before.
- `sendExistingAccountSignUpNotice` stays: `auth-email-locale.test.ts`
describes the auth mail surface by its call sites (see the finding at
the end).
- The membership-area methods that read a `private static` stay, as
agreed with the seat: reading one from outside the class is TS2341, and
making it public would change the `.d.ts`.
## What moved
| method | base signature line | body lines | members it reads |
|---|---:|---:|---|
| `settleMembership` | `:4899` | 24 | `config`, `getMembershipPolicy` |
| `validateAudienceAdmission` | `:5158` | 112 | `audienceLogError`,
`config`, `enterpriseOAuthProviderIds`, `getAudience`,
`hasPendingInvitationFor`, `isBootstrapCreation`,
`isOperatorProvisioning`, `selfRegistrationSetResolvable`,
`stageOwnerVerifiedStamp`, `stageSelfRegistrationGrant` |
| `landSelfRegistrationGrant` | `:5894` | 19 | `config` |
| `reportUngrantedSelfRegistrant` | `:6057` | 8 | `audienceLogError` |
Lines are base `f0fdd45bbc`. The members come from a walk of every
`this.X` in each body with the TypeScript compiler API. No body has a
bare `this`, `this[...]`, `arguments` or `super`, or a `this` inside a
`function` or a nested class. No body assigns to a `this` member or
reads a module-level declaration of `auth-manager.ts`.
**The one value read of `AuthManager`.** `validateAudienceAdmission`
reads the public static `AuthManager.OPERATOR_PROVISIONING_TICKET_FIELD`
(base `:5183`). So the new module imports `AuthManager` by value from
`./auth-manager.js`, the first cut in the series to do so. That is the
only value read: the module's other `AuthManager` mentions are the host
interface's indexed-access types and comments. It sits inside the
function body and runs only when better-auth calls the gate. The
module's top level is six imports, an interface and four function
declarations, so nothing reads the class while the two modules are first
evaluated.
**Imports.** These leave `auth-manager.ts`, each now with no reader
there, and the new module imports each from the same place:
- `classifyCreationMethod`, `decideAudienceAdmission`,
`AUDIENCE_CONFIG_ERROR` and `type AudienceCreationClass` from
`./audience-posture.js` (the line stays for its six other names);
- `shouldStampOwnerVerifiedAtCreation`
(`./walled-owner-operator-stamp.js`) and `GRANT_SET_NAME_FIELD`
(`./grant-set-name.js`), whose import lines go;
- `reconcileMembership` (`./reconcile-membership.js`). The line stays
for `type MembershipPolicy` and `type ReconcileOutcome`, the second
still `settleMembership`'s return type on the class.
The new module also imports `withSystemReadContext` from
`./objectql-adapter.js`, which `auth-manager.ts` keeps importing.
**Evaluation order.** The three modules whose value import leaves are
now first reached through the new module's import line, later in
`auth-manager.ts`'s import list. Their top levels are declarations and
literal constants. Every module they import (`@objectstack/types`,
`@objectstack/core`, `@objectstack/spec/security`,
`./auth-actor-attribution.js`) is imported by `auth-manager.ts` above
the new module's line. So the change in order cannot be observed.
## The shape
- **The class keeps all four methods** at their places, with their
names, signatures and docblocks: the published `.d.ts` lists each one.
Each body is now a host literal of exactly the members that body reads,
typed as a `Pick` of `MembershipAdmissionHost`, plus `.call`.
- **`MembershipAdmissionHost`** lives in the new module. It names the 11
members the bodies read, each typed as the class member
(`AuthManager['config']`, …).
- **Every method goes as a late-bound closure** (`(...a) =>
this.m(...a)`), so a double or spy set on the manager is still the one a
body reaches: the bootstrap, invitation and operator-provisioning
probes, the two stagings and `getMembershipPolicy` (a live platform
setting) all stay on the class.
- **`config` goes as a getter.** The class reassigns it after
construction (`setRuntimeBaseUrl`, `applyConfigPatch`), so it is read
off the manager when a body reads it, as before.
- **The three `async` methods are no longer `async`.** Each returns the
moved async function's own promise, so a caller awaits the same promise
the body settles. Building the host cannot throw, so no method now
throws synchronously where it used to reject.
`reportUngrantedSelfRegistrant` was synchronous and stays so.
- **The cost:** one small host object per call. The four run on user
creation (and `validateAudienceAdmission` also on the password sign-up
route) and on the self-registration grant's paths, not on every request.
- **Nothing re-exports the new module**, so the published surface does
not move.
## Path readers
**Migrated in this PR:**
- **The tenant-audit census and its two documents.** The moved
`landSelfRegistrationGrant` carries one census site, the
`sys_user_permission_set` insert (base `:5907`). `node
scripts/tenant-audit-census.mjs --write` (the second commit) moves its
row in `docs/audits/2026-08-tenant-audit-write-call-sites.counts.md`
from `auth-manager.ts` to the new file. It also re-measures the
corpus-scale block in both documents, which the checker does not
enforce: measured at `487d57fed` (the move commit), 723 tracked sources
scanned (716 at the last write; 722 at base, 723 at head) and 174
same-named calls subtracted (172 at the last write; 174 at base and
head). No prose figure moves, and `check-tenant-audit-census` exits 0.
- **`find-envelope-limb-removal.test.ts`'s B5 `site:` label**, which
named `auth-manager.ts` as the file of the `sys_user_permission_set`
existence read. That read moves with `landSelfRegistrationGrant`, so the
label names the new file. It is a test-title string only; no gate or
test reads it back.
**Measured as reading no moved line:**
- **`check-dispatcher-error-vocabulary.mjs`** and
**`api-error-code.pin.test.ts`'s `authManagerFiles` floor**: no `new
APIError(` sits in the moved bodies. The gate reads 56 sites found and
56 classified at base and at head.
- **The plugin-factory scans** in `better-auth-schema-parity.test.ts`
and `managed-extension-fields.test.ts`: the imports that leave are local
modules, not plugin factories, and the moved text has no dynamic import.
- **`check-auth-mount-ledger.mjs`** and
**`auth-manager-base-path.test.ts`**: no base-path literal or
declaration sits in the moved text.
- **The system-context census** reads 148 elevation read sites at base
and at head.
- **Callers through the manager**: the suites that drive the four
methods call each through the class method, and all pass at head
(below):
- `audience-posture.test.ts` (the gate's verdicts and refusal codes);
- `logger-receiver-detach.test.ts` (the degradation report's logger
receiver);
- `find-envelope-limb-removal.test.ts` (the grant's existence read);
- `self-registration-grant-first-membership.test.ts` (the grant's
landing);
- `dev-admin-seed-credential-gate.test.ts` (operator provisioning
through the gate; it reads
`AuthManager.OPERATOR_PROVISIONING_TICKET_FIELD` itself);
- `signup-existing-address-refusal.test.ts`.
- **Every symbol anchor into the file.** Before the cut, every
`auth-manager.ts#symbol` anchor in the tracked tree outside changelogs
was mapped with `symbolSegmentResolution` from
`scripts/symbol-anchors.mjs`. There are 29, and all 29 are
`declaration`-class at base, with the 4 bodies blanked, and at head.
None names a moved method. Two name a token the moved text also carries,
and both resolve on declarations that stay: `#AuthManager` (ADR-0135;
the moved gate reads `AuthManager.OPERATOR_PROVISIONING_TICKET_FIELD`)
and `#isBootstrapCreation`
(`docs/qa/platform-checklist/areas/identity-auth.json:1810`; the gate
calls `this.isBootstrapCreation`).
## The decision-letter layer does not move
The seat asks each cut's report for this count at both ends.
`check-adr-anchors`' decision-letter layer reads 2,004 at base
`f0fdd45bbc` and 2,004 at head, and the gate exits 0 at both. The moved
text cites `ADR-0078` without a decision letter, so only the number
layer sees it move: 52,156 citations at both, across 6,632 files at base
and 6,633 at head. No anchor entry is added for the new module, as for
cuts 1 to 7's modules.
## Proof
Builds and suites ran through `os-verify-lock`, and every exit code was
captured before any pipe. Base `f0fdd45bbc`, head `fa0187ad1f` (the move
is `487d57fedd`). A full `turbo run build` ran first. Then `plugin-auth`
was built and its suite run at base, then built and run at head, on the
same dependency dists.
**1. The moved text.**
- For each of the 4 methods, the base class body and the new module's
function body are the same TypeScript token sequence (scanner tokens,
kind and text, trivia skipped, each template literal re-scanned at its
substitutions as the parser does).
- Every line is the base line minus exactly two leading spaces, and the
parameters and return type are the same text.
- Each class method keeps its docblock and signature, with `async`
dropped from the three that had it.
- Result: 4 of 4 pass, 163 body lines.
| method | body lines | tokens |
|---|---:|---:|
| `settleMembership` | 24 | 93 |
| `validateAudienceAdmission` | 112 | 466 |
| `landSelfRegistrationGrant` | 19 | 154 |
| `reportUngrantedSelfRegistrant` | 8 | 22 |
- **Negative control:** one token changed in the module
(`'sys_user_permission_set'` → `'sys_user_permission_sets'` in
`landSelfRegistrationGrant`'s insert) makes that method fail (tokens and
lines DIFFER), and the run exits 1. Restored afterwards; `cmp` against
the saved copy was clean.
- **An independent reading:** `git diff --color-moved=plain
--color-moved-ws=allow-indentation-change f0fdd45 fa0187a` over
the two source files marks 161 of the 165 deleted lines and 167 of the
313 added lines as moved.
- The other 4 deleted lines are the `reconcileMembership` import line
and the three `async` signature lines.
- The other added lines are the stubs' host literals,
`MembershipAdmissionHost`, the module header, the per-function pointer
docblocks and the import blocks.
**2. `.d.ts` and exports (ruling `6348891160` items 1 and 2).**
| file | raw base | raw head | raw diff lines | normalised base |
normalised head |
|---|---|---|---:|---|---|
| `dist/index.d.ts` |
`12679e13f74973b0510551a65b50808e7c3936a2d273cf2f262a9196648c0737` |
`12679e13f74973b0510551a65b50808e7c3936a2d273cf2f262a9196648c0737` | 0 |
`c7a9fa25f118cfec858d770b979767744d27d9757a9ea4063faeea6238c33c01` |
`c7a9fa25f118cfec858d770b979767744d27d9757a9ea4063faeea6238c33c01` |
| `dist/index.d.mts` |
`df57562ff950159e738d790cb7ee82a655ba0fffddafe4153bdcc50c4537336f` |
`df57562ff950159e738d790cb7ee82a655ba0fffddafe4153bdcc50c4537336f` | 0 |
`68f824aea0947d9895b968ed46a7972eaae43ef0f2bda7e3ba9113002233ade6` |
`68f824aea0947d9895b968ed46a7972eaae43ef0f2bda7e3ba9113002233ade6` |
- The normaliser, verbatim (the ruling's one-liner): `node -e 'const
s=require("fs").readFileSync(process.argv[1],"utf8");process.stdout.write(s.replace(/"[^"\n]*"(?:\s*\|\s*"[^"\n]*")+/g,r=>r.split(/\s*\|\s*/).sort().join("
| ")))' dist/index.d.ts | sha256sum`.
- The raw files are already byte-identical, so no union-order swap
occurs in this cut: items 1(b) and 1(d) hold with nothing to account
for.
- **Positive control:** the head `dist/index.d.ts` with one private
member made public (`private validateAudienceAdmission;` →
`validateAudienceAdmission;`, line 2107, a one-line change) hashes raw
`a44eb00dde9098cdcb14efc26e659d46f940a6df42d3cc1759bb78ad6d0f1db8` and
normalised
`df635741a7c0a9d7d3f34be34bc52a32ea6406d9ada1112acd0de9f924990750`. Both
differ from the readings above.
- **Export lists:** ESM `dist/index.mjs` and CJS `dist/index.js` each
have 159 names at base and at head, the same list (the sha256 of the
sorted names is `3abb126f5babb701…` on all four).
- **The bundle:** 18 files in `dist/` on both sides, the same list. Only
`index.js`, `index.mjs` and their two `.map` files differ, as a move of
code inside the bundle must.
**3. Tests and lint.**
- `pnpm exec vitest run --maxWorkers=3` in
`packages/plugins/plugin-auth`: base `Test Files 189 passed (189)`,
`Tests 3580 passed | 10 skipped (3590)`, exit 0. Head: the same counts,
exit 0.
- `pnpm --filter @objectstack/plugin-auth typecheck` (both `tsc`
projects and `check:test-typecheck`): exit 0. `pnpm --filter
@objectstack/runtime typecheck`: exit 0.
- `eslint --no-inline-config` (the root `lint` script's binary and
flags) over the 3 source files: exit 0.
**4. The census and the anchors, at base and at head.**
- The tenant-audit census (`node scripts/tenant-audit-census.mjs
--json`), compared per site with the new module's file name mapped back
to `auth-manager.ts`: 238 sites on both sides, 1 in the new module at
head, 0 per-site differences in object, verb, tenancy, context and
elevation, 0 unresolved and 0 unledgered on both, and every total the
same.
- These checkers were run by hand at base and at head, because
`dispatch-gates` does not derive the ADR one. All six exit 0 at both:
- `check-adr-symbol-anchors`: 2,384 anchors across 142 records, 466
symbol (440 declaration, 26 literal), at both.
- `check-adr-anchors`: 80 anchored files at both; the decision-letter
layer reads 2,004 at both, as above.
- `check-scripts-symbol-anchors` (4,061 anchors),
`check-spec-docblock-symbol-anchors` (5,071 anchors, both read in the
same built tree), `check-system-context-census` (148 elevation read
sites) and `check-platform-checklist` (16 areas, 329 items): the same
reading at both.
**5. Gates.**
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 89 commands for the 5 paths. All 89
ran at `fa0187ad1f` after the full build, and all 89 exited 0.
- `--ran` over the record with each exit code: 89 derived, 89 run, 0
NOT-MEASURED, a derived zero.
- `check-governed-merges.mjs --branch HEAD`: NOT governed, 494 changed
lines.
- **Docs drift** (`node scripts/docs-audit/affected-docs.mjs --json
f0fdd45`, exit 0): 12 pages, 6 of them release-owned. Every one is
listed through `sys_user_permission_set`, a literal
`landSelfRegistrationGrant` carries unchanged. No page restates a rule
this move changes, so no doc edit is owed.
- **Serial constraints** (in the claim): 11 PRs are open, and none
touches `plugin-auth/src`, the census script or its two documents, or a
reader above. `origin/main` is still `f0fdd45bbc`.
## Finding, outside this cut
The population comments in `plugin-auth/src/auth-email-locale.test.ts`
(around `:44`, `:179` and `:857`–`:865`) describe the auth mail surface
as five `sendTemplate` call sites, and say no other file under
`plugin-auth/src` calls one. On base there are six: five in
`auth-manager.ts` and one in `auth-manager-email-sms-delivery.ts` (moved
there by cut 5). This cut touches neither the sends nor the comments,
and the comments are not a gate. Reported on the card for the seat to
triage.
## Changeset
None: `skip-changeset`, per ruling `6348891160` item 4. The published
declarations and export lists are unchanged, and the bundle's bytes move
only because code moved inside it.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01LSXBc2GCBwiAL7vV4kWkyr)_
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01LSXBc2GCBwiAL7vV4kWkyr
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 141056b commit 70ff998
5 files changed
Lines changed: 321 additions & 173 deletions
File tree
- content/docs/permissions
- docs/audits
- packages/plugins/plugin-auth/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
307 | 307 | | |
308 | 308 | | |
309 | 309 | | |
310 | | - | |
| 310 | + | |
311 | 311 | | |
312 | 312 | | |
313 | 313 | | |
314 | | - | |
| 314 | + | |
315 | 315 | | |
316 | 316 | | |
317 | | - | |
| 317 | + | |
318 | 318 | | |
319 | 319 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
93 | | - | |
| 93 | + | |
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
97 | | - | |
| 97 | + | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
| 100 | + | |
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
| |||
132 | 132 | | |
133 | 133 | | |
134 | 134 | | |
| 135 | + | |
135 | 136 | | |
136 | 137 | | |
137 | 138 | | |
138 | 139 | | |
139 | 140 | | |
140 | | - | |
141 | 141 | | |
142 | 142 | | |
143 | 143 | | |
| |||
| 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 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
0 commit comments