Repository navigation
Commit 244d516
feat(plugin-grid,plugin-list,i18n): a grouped grid over a data source with no group header query refuses grouping; the Partial marker is retired (objectui#10881) (#10896)
Fixes #10881
Clause-②: yes
Maintainer ruling F (`5862401217`), executed as ruled. A grouped grid
over a data source that declares no `queryGroupHeaders` refuses grouping
loudly, naming that member, and issues no row query; `ListView` makes
the same refusal before it mounts such a grid; the `Partial` marker is
retired everywhere. Rows handed in WHOLE still group in the browser,
exactly (`useGroupedData` unchanged for that case). Builds on PR
objectui#10878 (option K, merged).
Patch round 2 adds the seat's decision B (contract review `5863494567`,
③ flag 1): rows a host hands in while DECLARING them one page of more
are a window, not whole rows, and a grouped grid refuses them too, with
a sentence of its own.
## What changed
| Item | Where | What it does now |
| --- | --- | --- |
| (1) `ObjectGrid`, no header query | `ObjectGrid.tsx`,
`groupingNeedsHeaderQuery` | `!hasInlineData` and `objectName` and a
`dataSource` whose `queryGroupHeaders` is not a function and a grouping
entry the grid would group by (same entries as `serverGroupedFetch`,
less the readability gate). The load effect returns before Step 2 (no
`find`; the object definition is still read, so a KNOWN masked-only
grouping key flips the refusal off and the flat fetch then goes out).
Render: the load-error panel's own shape (`role="alert"`, heading
`grid.errorLoading`, sentence `grid.grouping.needsHeaderQuery`),
`data-testid="grid-grouping-needs-header-query"`, placed AFTER the
spinner branch, so while the definition read is in flight the grid shows
it is loading rather than an error it may withdraw. |
| (2) `ListView`, no header query | `ListView.tsx`,
`groupingNeedsHeaderQuery` | grid view, a grouping entry with a named
`field` (`collectGroupingFieldRefs`), rows NOT inline (`schema.data`
neither an array nor a `value` provider), `objectName`, a `dataSource`
without `queryGroupHeaders`. The fetch effect stands down (and clears
held rows), a `DataErrorState` (`list.loadErrorTitle` plus the grid's
own sentence, no Retry) replaces the grid, which is never mounted, and
no record-count bar. The toolbar stays, so removing the grouping lifts
it. A toolbar search does not lift it. |
| (3) marker retired | `ObjectGrid.tsx`, `GroupRow.tsx`, ten packs,
tests, docs | the three `grid.grouping.partial*` keys (defaults map and
all ten packs), the `groupingIsPartial` computation and notice,
`GroupRow`'s `partialLabel` / `partialTitle` props,
`groupedPartialDisclosure-7189.test.tsx`; the "Two cases still group in
the browser" section rewritten in `plugin-grid.mdx` and the plugin-grid
README. |
| (4) dated notes |
`.changeset/7189-grouped-grid-partial-disclosure.md`,
`.changeset/7189-server-side-grid-grouping.md` | PR objectui#10878
already added the note review ③ asked for; this PR's change falsified
that note's last sentences, so a second dated note, 2026-09-28, names
them. `7189-server-side-grid-grouping.md` gets one too, for its two
sentences this PR falsified. |
| (5) a host-declared window (round 2, B) | `ObjectGrid.tsx`,
`groupingNeedsWholeRows` | rows handed in (`hasInlineData`) with the
external-pagination props declared (`manualPagination`, `onPageChange`,
a numeric `rowCount`) and `rowCount` above the rows handed (counted on
the rows as handed, not on the `data` state that mirrors them a render
later, so whole rows never flash it), and a grouping entry the grid
would group by. Refused in the same panel idiom (`role="alert"`,
`grid.errorLoading`) with its own sentence,
`grid.grouping.needsWholeRows`: grouping needs every record, so hand the
rows in whole or let the grid fetch them from a source that implements
`queryGroupHeaders`. `data-testid="grid-grouping-needs-whole-rows"`. The
header-query sentence would be wrong there: the host owns the fetch, and
its source may declare the member (pinned). No `rowCount`, or one not
above the rows handed, is whole rows and groups as before (pinned). |
Two new keys, `grid.grouping.needsHeaderQuery` and
`grid.grouping.needsWholeRows`, in `GRID_DEFAULT_TRANSLATIONS` and all
ten packs (the first also in `LIST_DEFAULT_TRANSLATIONS`);
`queryGroupHeaders` stays untranslated inside each sentence.
New changeset `.changeset/10881-grouping-needs-header-query.md`: `minor`
for `@object-ui/plugin-grid`, `@object-ui/plugin-list`,
`@object-ui/i18n`, with the breaking semantics (including the
host-declared window) and the migration (implement `queryGroupHeaders`
and let the grid fetch, or hand the rows in whole). `@object-ui/types`
and `@object-ui/react` are touched in doc comments only (the
`DataSource.queryGroupHeaders` JSDoc sentence that said such a grid
"keeps grouping the rows it fetched", and `NonGridRowCeilingNote`'s
JSDoc citing the retired key); neither package's behaviour or keys move,
so neither is named in the changeset. The presence gate is satisfied by
the one changeset.
Out of scope as ruled and untouched: `ListView` over the objectstack
adapter while a toolbar search is active still hands a grouped grid its
window (objectstack#20358); `ValueDataSource` gains no
`queryGroupHeaders`.
## The PM's assumptions, measured
1. **Census.** Readers of `groupingIsPartial` / `grid.grouping.partial*`
/ `partialLabel` / `partialTitle` / the two marker test ids across
`packages`, `apps`, `content`, `examples`, `e2e`, `scripts`, JSON:
`ObjectGrid.tsx` (defaults, computation, two render sites),
`GroupRow.tsx`, the ten packs (key rows, plus a `rowCeilingNote` comment
in each pack that cited `grid.grouping.partialNotice`),
`nonGridRowCeiling.tsx` (JSDoc citation), `useGroupedData.ts` (doc
sentence), `serverGrouping-7189.test.tsx`,
`groupedPartialDisclosure-7189.test.tsx`, and two test headers citing
the retired file (`gridArrayArmOrderby-8973`,
`gridGroupingMembers-8071`). `apps`, `content`, `examples`, `e2e`: none.
After this PR the same `git grep` over the tree (CHANGELOGs and
`.changeset/` excluded) hits only the new i18n pin, which is the control
that the grep can hit.
2. **Whole versus window in `ListView`.** Decidable from what `ListView`
knows: its fetch effect returns early, before any `find`, when
`schema.data` is an array or a `value` provider (searched rows are
filtered in memory, still the whole matching set); every other shape
reaches `dataSource.find` with `$top: effectivePageSize` and hands that
window down as `data`. The refusal keys on exactly that split, so truly
whole rows never refuse (pinned, and the pin goes red when the `value`
exclusion is ablated, below). **Does `ListView` ever take the round-2
path?** No: it hands a grid host paging only when `paginate &&
serverTotal != null`, and `paginate` is false whenever a grouping is
set. Measured on the one shape in which it hands a GROUPED grid a window
(a source that answers the header query, a toolbar search active): the
grid is handed the rows and no `manualPagination` / `rowCount`, against
a lit control where the same source ungrouped is handed
`manualPagination: true` and `rowCount: 186` (pinned).
3. **The error panels.** The grid's existing load-error idiom, the i18n
path through `GRID_DEFAULT_TRANSLATIONS` / `LIST_DEFAULT_TRANSLATIONS`
(byte-identical to `en`, which `defaults-maps-mirror-en-pack` enforces,
green) and the ten packs; no row query, proven by the `find` call count
against a lit control where the same find-only source, ungrouped, is
queried.
4. **PR objectui#10278** (head `eab4c8e52`). Its hunks in
`ObjectGrid.tsx`: the spec import, the `DEFAULT_*` constants, the
`groupedPageSize` / `serverPageSize` / `fetchWindow` state, the `$top` /
`$skip` params, the load effect's dependency array, `pageSize`,
`groupingPartialWindowFull`, the group pager's select. Lines of its
hunks this PR had to touch: **the load effect's dependency array** (it
renames `serverPageSize` to `fetchWindow` there; this PR appends
`groupingNeedsHeaderQuery`; the line already differs from its base since
PR objectui#10878) and **`groupingPartialWindowFull`** (it re-points it
to `fetchWindow`; this PR deletes the whole marker computation, as
ruled). Round 2 touched none of its hunks: the new predicate sits below
`groupingNeedsHeaderQuery`, and the moved panel sits after the spinner
branch. `groupedPagination.test.tsx` is untouched; in
`ObjectGrid.pageSizeNonPositive-9853.test.tsx` only `groupedSchema`
changed, which none of its hunks holds. For its merge of `main`: its
docs sentence "A grouped view separately fetches a larger batch of rows
to group" no longer describes the grid (a server-grouped grid strips
`$top` / `$skip`, a refused one fetches nothing, inline rows fetch
nothing), and its grouped `fetchWindow` branch is reached only where a
grouped grid still fetches a flat window.
5. **Docs.** The section lived in `content/docs/plugins/plugin-grid.mdx`
and `packages/plugin-grid/README.md` (identical text); rewritten there
as ruled, and in round 2 its whole-rows paragraph names the
host-declared window and its refusal. Also brought true: the `grouping`
row in `content/docs/api/schema-reference.md`, a new paragraph in the
plugin-list README "Grouping Records" section, and the plugin-list
README's sort paragraph (its "the grouped view, which holds every row it
groups" was already false for a server-grouped view and names no
remaining case).
6. **Changeset.** As above: three packages, not five, with the reason;
round 2 corrected its whole-rows sentence to rows handed in WHOLE and
added the host-declared window to the breaking semantics and the
migration.
## Pins (new files) and their red on base
-
`packages/plugin-grid/src/__tests__/groupingNeedsHeaderQuery-10881.test.tsx`
(12):
- a grouped grid over a find-only source renders the refusal naming
`queryGroupHeaders` and `find` is never called; CONTROL the same source
ungrouped is queried once and draws; CONTROL the same grouping over a
source declaring the member is not refused; rows handed in whole (a
`value` provider, and a `data` prop) group as 86/61/31/7/1 with no
refusal and no query;
- round 2: 100 rows handed with `rowCount: 186` render the whole-rows
refusal, draw no group and query nothing; the same window over a source
that DOES declare `queryGroupHeaders` is refused the same way and the
header query is never asked; CONTROL 186 rows with `rowCount: 186` group
exactly as 86/61/31/7/1; CONTROL 100 rows with no `rowCount` group as
handed (86, 14), unrefused;
- round 2: a masked-only grouping key shows `Loading grid…`, never the
refusal, while the definition read is in flight, then the flat rows;
- re-homed from the retired file: under 768px a grouped grid draws its
groups and tables, not cards; CONTROL the same rows ungrouped at that
width are cards with no table.
-
`packages/plugin-list/src/__tests__/ListView.groupingNeedsHeaderQuery-10881.test.tsx`
(4): the refusal naming `queryGroupHeaders`, no grid mounted, no `find`,
no record-count bar; CONTROL ungrouped is queried and handed its window
WITH host paging; CONTROL rows handed in whole reach the grouped grid
whole, no refusal, no `find`; round 2: a grouped grid handed a searched
window is handed no host paging.
- `packages/i18n/src/__tests__/groupingPartialRetired-10881.test.ts`
(21): no pack carries a `grid.grouping.partial*` key; CONTROL the same
walk finds `grid.grouping.needsHeaderQuery`, naming `queryGroupHeaders`,
in all ten.
Red on base, round 1: the three files run with the behaviour-carrying
sources (`ObjectGrid.tsx`, `GroupRow.tsx`, `ListView.tsx`, ten packs)
checked out at `b2683a2c0`, restored from `HEAD` after (hash-compared,
`git diff HEAD` empty): `Tests 22 failed | 7 passed (29)`; the 22 are
both refusal pins and the 20 locale rows, the 7 are lit controls and
whole-rows pins F keeps. Red on base, round 2: the two behaviour files
run with `ObjectGrid.tsx`, `ListView.tsx` and the ten packs at
`638a8250c` (the round-1 head), restored the same way: `Tests 3 failed |
13 passed (16)`; the 3 are the two window refusals and the
spinner-not-refusal pin; the 13 are the round-1 pins, the round-2
controls, the card-view pair and the `ListView` measurement, which pin
behaviour kept. Green on head: grid pin file `Tests 12 passed (12)`,
`ListView` pin file `Tests 4 passed (4)`.
## Ablations (`ablation-replace.mjs`, each restored to the `HEAD` blob
with `git diff HEAD` empty)
- A1 `ObjectGrid` header refusal without `!hasInlineData`: both
whole-rows pins red (`2 failed | 3 passed`).
- A2 `ObjectGrid` load-effect guard deleted: the refusal pin red on the
`find` count (`1 failed | 4 passed`); the panel alone does not satisfy
it.
- A3 `ListView` refusal without the `value` exclusion: the whole-rows
control red (`1 failed | 2 passed`). Declared: the first attempt was an
anchor miss (a quoting slip left the newlines literal) and the second
was refused by the tool because the replacement text was a suffix of the
anchor; neither wrote anything. The third, with a marker in the
replacement, landed; it was re-run at `638a8250c` with the same result.
- A4 `ListView` fetch-effect stand-down disabled: the refusal pin red on
the `find` count (`1 failed | 2 passed`).
- R2-A1 the whole-rows guard neutralized (`groupingNeedsWholeRows`
forced false), at `156eb5103`: both window pins red (`2 failed | 10
passed`).
- R2-A2 its strict "above" loosened to "at least": the `rowCount`-equal
control red (`1 failed | 11 passed`), so the control can fail.
- R2-A3 the card view's `!isGrouped` exclusion removed: the re-homed
grouped-mobile pin red (`1 failed | 11 passed`).
## Existing tests re-decided (none deleted blindly)
- `groupedPartialDisclosure-7189.test.tsx` — retired as ruled. Its
marker and notice cases pin what F retires. Its "does not mark rows
handed to it inline" case is re-decided into the new whole-rows pins;
its "reads the total a HOST supplies" case is re-decided into the
round-2 window refusal (the same render, now refused); its card-view
case is re-homed as a behavioural pin with a lit control; its ungrouped
control asserted only the marker's absence beside a fetch other files
pin.
- `serverGrouping-7189.test.tsx` — the two marker-absence assertions
dropped (nothing left to be absent: a phantom check); its CONTROL, which
pinned page grouping plus two markers over a find-only source, now pins
the refusal and no row query; header text says why.
- `ListView.groupedGridOwnsFetch-7189.test.tsx` — its CONTROL, which
pinned `ListView` handing a find-only source's window to the grid, now
pins that no grid is mounted.
- `groupingProjection-7179`, `gridGroupingMembers-8071`,
`badgeHexCrossSurface`, `maskedColumnSurfaces-10583` (plugin-grid): each
grouped over a find-only double, which F refuses; the doubles now answer
`queryGroupHeaders`, and the projection / header label is read off the
server-grouped path (its row query carries the grid's own `$select` /
`$expand`).
- `expandFls-7215` (plugin-grid): its PIN 7 groups only by an unreadable
key; the double declares the member so the grid still fetches its flat
window, the projection under test.
- `ObjectGrid.pageSizeNonPositive-9853`: its grouped cases hand their
seven rows in whole; the page of groups is the same on either path.
- `ListView.groupingProjection-7179`, `ListView.expandFls-7215`,
`ListView.speculativeFls-7216`: the doubles declare the member, so
`ListView` still fetches the window those pins read (the rows a searched
grouped view is handed, and what the chip counts and export read).
- Two test headers citing the retired file re-pointed.
## Local verification
- At `156eb5103` (the round-2 code; the later `94df46014` only types one
test callback, and that file was re-run there: `Tests 4 passed (4)`):
- `pnpm exec vitest run packages/plugin-grid/`: `Test Files 164 passed
(164)`, `Tests 1535 passed (1535)`.
- `pnpm exec vitest run packages/plugin-list/ packages/i18n/`: `Test
Files 178 passed (178)`, `Tests 2380 passed (2380)`.
- `pnpm exec vitest run scripts/__tests__/`: `Test Files 177 passed | 2
skipped (179)`.
- `defaults-maps-mirror-en-pack` (app-shell): `Tests 15 passed (15)`.
- `type-check` for plugin-grid, plugin-list and i18n after building
their dependency closure: all `Done`; plugin-list re-run at `94df46014`.
- At `94df46014`: `check:i18n-keys`, `check:i18n-drift`,
`check:i18n-dead-keys`, `check:control-bytes`,
`check:new-line-citations` (0 new), `check:changeset-claims` (report),
`check:test-path-roots`, `check:vi-mock-specifiers`, `changeset:check`,
`check-changeset-presence`: exit 0.
- Round 1, unchanged by round 2 and not re-run: `packages/plugin-view/`
with the app-shell `widget-dom-leak-sweep` and
`ObjectView.rowColorRelay-7218`, `packages/react/src/utils`,
`packages/types/` (`Test Files 318 passed (318)` at `dfd9bb187`), and
the `types` / `react` type-checks.
- Lint, narrowed and declared: `eslint --no-inline-config --format json`
over the changed `.ts` / `.tsx` files that exist at `HEAD` (the
population is `git diff --name-only --diff-filter=d`, not a guess): 0
errors; per-file warning counts equal to the previous head for every
modified file (round 2: 14 files against `638a8250c`); the new test
files carry `no-explicit-any` warnings in the idiom of their neighbours.
The config enables no type-aware linting (no `parserOptions.project`),
so this diff cannot move a verdict in an untouched file.
NOT MEASURED locally, declared to CI: `check:readme-exports`
(prerequisite: every package's `dist`; neither touched README gained or
lost a fenced block, and no export name moved),
`check:eager-locale-catalogues` (prerequisite: a console build; this PR
moves no import), the repo-wide `pnpm lint`.
## Acceptance notes
- A host that hands a grouped grid rows AND declares them one page of
more is refused (item 5). This was an open question in round 1; the seat
decided B on the contract review's measurement (`5863494567`, ③ flag 1:
100 of 186 rows with `rowCount: 186` drew two groups, 86 and 14, three
units missing, with nothing on screen saying so, a render the retired
disclosure pin had marked). No in-repo host takes this path: `ListView`
hands a grouped grid no host paging (item 2, pinned).
- Over a source that DOES declare `queryGroupHeaders`, a grouping whose
every key the principal may not read is not asked of the server and
still groups a fetched page (since PR objectui#10878); unchanged here.
- A grouping whose only key is a masked type: over a source without the
member, the grid now shows its spinner until the object definition
lands, then the flat grid (pinned). Over rows a host handed as a
declared window, there is no read to wait behind, so the whole-rows
refusal shows until the definition lands and then withdraws; no in-repo
producer.
- The first five commits carry a `Co-Authored-By` trailer copied from
the harness reminder; the round-2 commits carry the dispatch contract's
model-free pair. History not rewritten (no force-push).
The session that wrote this:
`https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk`.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 775e079 commit 244d516
39 files changed
Lines changed: 1110 additions & 772 deletions
File tree
- .changeset
- content/docs
- api
- plugins
- packages
- i18n/src
- __tests__
- locales
- plugin-grid
- src
- __tests__
- plugin-list
- src
- __tests__
- react/src/utils
- types/src
| 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 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
781 | 781 | | |
782 | 782 | | |
783 | 783 | | |
784 | | - | |
| 784 | + | |
785 | 785 | | |
786 | 786 | | |
787 | 787 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
362 | 362 | | |
363 | 363 | | |
364 | 364 | | |
365 | | - | |
366 | | - | |
367 | | - | |
368 | | - | |
369 | | - | |
370 | | - | |
371 | | - | |
372 | | - | |
373 | | - | |
374 | | - | |
375 | | - | |
376 | | - | |
377 | | - | |
378 | | - | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
379 | 384 | | |
380 | 385 | | |
381 | | - | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
382 | 389 | | |
383 | 390 | | |
384 | 391 | | |
| |||
Lines changed: 55 additions & 0 deletions
| 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 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
142 | | - | |
143 | | - | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | | - | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
148 | 148 | | |
149 | 149 | | |
150 | 150 | | |
| |||
409 | 409 | | |
410 | 410 | | |
411 | 411 | | |
412 | | - | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
413 | 416 | | |
414 | | - | |
415 | | - | |
416 | | - | |
417 | | - | |
418 | | - | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
419 | 421 | | |
420 | 422 | | |
421 | 423 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
128 | 128 | | |
129 | 129 | | |
130 | 130 | | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| |||
398 | 398 | | |
399 | 399 | | |
400 | 400 | | |
401 | | - | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
402 | 405 | | |
403 | | - | |
404 | | - | |
405 | | - | |
406 | | - | |
407 | | - | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
408 | 410 | | |
409 | 411 | | |
410 | 412 | | |
| |||
0 commit comments