@kairos-es/core 1.0.0-alpha.4 → 1.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/AppendCondition.js +1 -3
  3. package/dist/cjs/AppendCondition.js.map +1 -1
  4. package/dist/cjs/AppendIsOwned.js +6 -6
  5. package/dist/cjs/AppendIsOwned.js.map +1 -1
  6. package/dist/cjs/ContractStore.js +2 -2
  7. package/dist/cjs/ContractStore.js.map +1 -1
  8. package/dist/cjs/DcbEventStore.js +1 -1
  9. package/dist/cjs/DcbEventStore.js.map +1 -1
  10. package/dist/cjs/Event.js +29 -13
  11. package/dist/cjs/Event.js.map +1 -1
  12. package/dist/cjs/Query.js +1 -1
  13. package/dist/cjs/Query.js.map +1 -1
  14. package/dist/cjs/SubscribeMachine.js +158 -67
  15. package/dist/cjs/SubscribeMachine.js.map +1 -1
  16. package/dist/cjs/inMemory.js +4 -4
  17. package/dist/cjs/inMemory.js.map +1 -1
  18. package/dist/cjs/retryOnConflict.js +4 -10
  19. package/dist/cjs/retryOnConflict.js.map +1 -1
  20. package/dist/cjs/testing.js +2 -2
  21. package/dist/cjs/testing.js.map +1 -1
  22. package/dist/{dts → dts-cjs}/AppendCondition.d.ts +5 -7
  23. package/dist/{dts → dts-cjs}/AppendCondition.d.ts.map +1 -1
  24. package/dist/{dts → dts-cjs}/AppendIsOwned.d.ts +6 -6
  25. package/dist/{dts → dts-cjs}/AppendIsOwned.d.ts.map +1 -1
  26. package/dist/{dts → dts-cjs}/ContractStore.d.ts +3 -2
  27. package/dist/dts-cjs/ContractStore.d.ts.map +1 -0
  28. package/dist/{dts → dts-cjs}/DcbEventStore.d.ts +2 -2
  29. package/dist/{dts → dts-cjs}/DcbEventStore.d.ts.map +1 -1
  30. package/dist/{dts → dts-cjs}/Event.d.ts +31 -20
  31. package/dist/dts-cjs/Event.d.ts.map +1 -0
  32. package/dist/{dts → dts-cjs}/Query.d.ts +5 -5
  33. package/dist/dts-cjs/SubscribeMachine.d.ts +289 -0
  34. package/dist/dts-cjs/SubscribeMachine.d.ts.map +1 -0
  35. package/dist/{dts → dts-cjs}/inMemory.d.ts.map +1 -1
  36. package/dist/{dts → dts-cjs}/index.d.ts +1 -1
  37. package/dist/dts-cjs/package.json +3 -0
  38. package/dist/{dts → dts-cjs}/retryOnConflict.d.ts +1 -7
  39. package/dist/dts-cjs/retryOnConflict.d.ts.map +1 -0
  40. package/dist/{dts → dts-cjs}/testing.d.ts +1 -1
  41. package/dist/dts-esm/AppendCondition.d.ts +21 -0
  42. package/dist/dts-esm/AppendCondition.d.ts.map +1 -0
  43. package/dist/dts-esm/AppendIsOwned.d.ts +78 -0
  44. package/dist/dts-esm/AppendIsOwned.d.ts.map +1 -0
  45. package/dist/dts-esm/ContractStore.d.ts +62 -0
  46. package/dist/dts-esm/ContractStore.d.ts.map +1 -0
  47. package/dist/dts-esm/DcbEventStore.d.ts +64 -0
  48. package/dist/dts-esm/DcbEventStore.d.ts.map +1 -0
  49. package/dist/dts-esm/Event.d.ts +174 -0
  50. package/dist/dts-esm/Event.d.ts.map +1 -0
  51. package/dist/dts-esm/Projection.d.ts +124 -0
  52. package/dist/dts-esm/Projection.d.ts.map +1 -0
  53. package/dist/dts-esm/Query.d.ts +180 -0
  54. package/dist/dts-esm/Query.d.ts.map +1 -0
  55. package/dist/dts-esm/SubscribeMachine.d.ts +289 -0
  56. package/dist/dts-esm/SubscribeMachine.d.ts.map +1 -0
  57. package/dist/dts-esm/errors.d.ts +17 -0
  58. package/dist/dts-esm/errors.d.ts.map +1 -0
  59. package/dist/dts-esm/inMemory.d.ts +76 -0
  60. package/dist/dts-esm/inMemory.d.ts.map +1 -0
  61. package/dist/dts-esm/index.d.ts +40 -0
  62. package/dist/dts-esm/index.d.ts.map +1 -0
  63. package/dist/dts-esm/package.json +3 -0
  64. package/dist/dts-esm/retryOnConflict.d.ts +64 -0
  65. package/dist/dts-esm/retryOnConflict.d.ts.map +1 -0
  66. package/dist/dts-esm/testing.d.ts +39 -0
  67. package/dist/dts-esm/testing.d.ts.map +1 -0
  68. package/dist/esm/AppendCondition.js +1 -3
  69. package/dist/esm/AppendCondition.js.map +1 -1
  70. package/dist/esm/AppendIsOwned.js +6 -6
  71. package/dist/esm/AppendIsOwned.js.map +1 -1
  72. package/dist/esm/ContractStore.js +2 -2
  73. package/dist/esm/ContractStore.js.map +1 -1
  74. package/dist/esm/DcbEventStore.js +1 -1
  75. package/dist/esm/DcbEventStore.js.map +1 -1
  76. package/dist/esm/Event.js +30 -14
  77. package/dist/esm/Event.js.map +1 -1
  78. package/dist/esm/Query.js +1 -1
  79. package/dist/esm/Query.js.map +1 -1
  80. package/dist/esm/SubscribeMachine.js +157 -67
  81. package/dist/esm/SubscribeMachine.js.map +1 -1
  82. package/dist/esm/inMemory.js +5 -5
  83. package/dist/esm/inMemory.js.map +1 -1
  84. package/dist/esm/index.js +1 -1
  85. package/dist/esm/retryOnConflict.js +4 -10
  86. package/dist/esm/retryOnConflict.js.map +1 -1
  87. package/dist/esm/testing.js +2 -2
  88. package/dist/esm/testing.js.map +1 -1
  89. package/package.json +21 -11
  90. package/src/AppendCondition.ts +1 -1
  91. package/src/AppendIsOwned.ts +7 -7
  92. package/src/ContractStore.ts +5 -4
  93. package/src/DcbEventStore.ts +3 -3
  94. package/src/Event.ts +49 -14
  95. package/src/Query.ts +1 -1
  96. package/src/SubscribeMachine.ts +278 -96
  97. package/src/inMemory.ts +6 -6
  98. package/src/index.ts +1 -1
  99. package/src/retryOnConflict.ts +6 -11
  100. package/src/testing.ts +2 -2
  101. package/testing/package.json +1 -1
  102. package/dist/dts/ContractStore.d.ts.map +0 -1
  103. package/dist/dts/Event.d.ts.map +0 -1
  104. package/dist/dts/SubscribeMachine.d.ts +0 -179
  105. package/dist/dts/SubscribeMachine.d.ts.map +0 -1
  106. package/dist/dts/retryOnConflict.d.ts.map +0 -1
  107. /package/dist/{dts → dts-cjs}/Projection.d.ts +0 -0
  108. /package/dist/{dts → dts-cjs}/Projection.d.ts.map +0 -0
  109. /package/dist/{dts → dts-cjs}/Query.d.ts.map +0 -0
  110. /package/dist/{dts → dts-cjs}/errors.d.ts +0 -0
  111. /package/dist/{dts → dts-cjs}/errors.d.ts.map +0 -0
  112. /package/dist/{dts → dts-cjs}/inMemory.d.ts +0 -0
  113. /package/dist/{dts → dts-cjs}/index.d.ts.map +0 -0
  114. /package/dist/{dts → dts-cjs}/testing.d.ts.map +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../src/Event.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,+DAGpB,CAAA;AACD,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C,8DAA8D;AAC9D,eAAO,MAAM,MAAM,EAAE,QAA4B,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,GAAG,0DAGf,CAAA;AACD,MAAM,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,IAAI,CAAA;AAEjC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,CAAA;CACtC;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,WAiBzC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,6DAGrB,CAAA;AACD,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,SAAS,gEAGrB,CAAA;AACD,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,QAAQ,4DAGnB,CAAA;AACF,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ;;;;;;;EAOnB,CAAA;AACF,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C,iFAAiF;AACjF,eAAO,MAAM,cAAc;;;;;;;;;;EAGzB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA"}
@@ -1,179 +0,0 @@
1
- /**
2
- * The subscribe machine every engine's `subscribe` is built from — the in-memory
3
- * store, `@kairos-es/store-postgres` and `@kairos-es/store-sqlite`: the wake queue,
4
- * the wake-source drain, the paged catch-up reconcile, the `> boundary` de-dup (via
5
- * the cursor's exclusive lower bound) and the poll loop that together turn a paged
6
- * read into a live subscription.
7
- *
8
- * It lives in core because delivery semantics are contract semantics. An engine
9
- * supplies TRANSPORT through two STUBBABLE seams — `fetch`, a paged read strictly
10
- * after a cursor, and `listen`, an optional wake source — and inherits the delivery
11
- * behaviour whole, exactly as it supplies mechanics to `makeContractStore` and
12
- * inherits the contract policy whole. Two engines that each grew their own wake
13
- * loop would be identical only by inspection, and `subscribe` is the verb where
14
- * that is least affordable: a divergence there loses events rather than failing.
15
- * Both seams take plain in-memory values in a test, so the wake/poll/de-dup logic
16
- * is exercisable with no live backend at all.
17
- *
18
- * All THREE are the callers, and the count matters to a reader here: it means there
19
- * is exactly ONE delivery algorithm in this repo, and it is the code below. The
20
- * in-memory store is a caller like the rest — it hands in a `fetch` over its log
21
- * `Ref` and its append `PubSub` as a wake source and keeps no delivery logic of its
22
- * own — which is what makes the shared contract suite's subscribe cases a comparison
23
- * of two BACKENDS rather than of two delivery algorithms.
24
- *
25
- * Correctness rests on the periodic position-based reconcile — a re-read from the
26
- * cursor every poll interval — and NEVER on the wake source, which only lowers
27
- * delivery latency below that interval. A subscription with no wake source at all
28
- * is therefore complete and correct, merely slower, which is why `listen` is
29
- * optional in the TYPE rather than by the convention of passing `Stream.never`:
30
- * poll-only delivery is a supported shape, not a degraded one.
31
- *
32
- * ## The precondition every engine inherits: ASCENDING COMMIT ORDER
33
- *
34
- * A position that is committed and VISIBLE must never be below one already
35
- * delivered. Gaps are fine: the cursor is an ascending exclusive lower bound, so a
36
- * number that is allocated and never committed, or never allocated at all, is
37
- * simply a number the machine never sees. Out-of-order commits are not fine. If one
38
- * writer allocates position 5 and another allocates 6, and 6 commits first, a poll
39
- * landing between the two commits delivers 6 and advances the cursor past it — and
40
- * 5 is then lost forever, because no later read looks below the cursor and nothing
41
- * anywhere notices the hole. An engine whose concurrent writers can commit out of
42
- * order MUST serialise them, or this machine will silently skip. An engine that
43
- * takes an exclusive lock on both of its append paths discharges the obligation
44
- * that way; an engine whose append is a single statement discharges it
45
- * structurally.
46
- *
47
- * The obligation is written down HERE, in the algorithm that depends on it, rather
48
- * than in whichever engine happens to satisfy it. It is a property of this delivery
49
- * loop and of nothing else, so an engine author reading only their own source has
50
- * no way to discover that anything downstream needs it — and the failure mode is
51
- * the worst kind there is: no error, no defect, no failing test, just an event that
52
- * a subscriber never receives. A single engine owning both its append path and its
53
- * own wake loop can leave the assumption implicit; a shared machine cannot.
54
- *
55
- * ## `catchUpPageSize` bounds the READ, not the emission
56
- *
57
- * `drainFrom` below PAGES the catch-up read — `catchUpPageSize` bounds each
58
- * `fetch` — but it COLLECTS every page into one array, which is emitted as a SINGLE
59
- * chunk. So peak memory at subscription start is O(backlog) rather than O(page): a
60
- * subscriber joining behind a large log materialises the whole backlog before its
61
- * consumer sees the first element.
62
- *
63
- * That is a memory characteristic and nothing more, which is why ONE chunk is
64
- * enough here: downstream commit boundaries do not depend on the upstream chunking
65
- * at all, because the read side's `Stream.groupedWithin` re-chunks the stream into
66
- * bounded micro-batches whatever arrives (ADR-0007), so a projection's transactions
67
- * stay small even against a one-chunk catch-up. The cost therefore lands on backlog
68
- * memory alone, and it lands hardest on the durable-log-with-in-memory-view mode,
69
- * where an ephemeral view re-catches-up the entire log on every boot.
70
- */
71
- import { Effect, Schema, type Scope, Stream } from 'effect';
72
- import type { Position, SequencedEvent } from './Event.js';
73
- import { ReadLimit } from './Event.js';
74
- /**
75
- * A short catch-up page size default for the reconcile loop. Reads page by page
76
- * until a short page signals the tail is drained, so a large backlog is streamed in
77
- * bounded chunks rather than one unbounded read. Every engine takes its
78
- * `catchUpPageSize` from here — each SQL engine as its config's default, the
79
- * in-memory store as its options' — so backends cannot drift on tuning.
80
- */
81
- export declare const DEFAULT_CATCH_UP_PAGE_SIZE = 512;
82
- /**
83
- * The default upper bound a subscriber waits for a wake before re-reading from its
84
- * cursor ANYWAY (milliseconds). Every engine takes its `pollInterval` from here —
85
- * each SQL engine as its config's default, the in-memory store as its options' — so
86
- * backends cannot drift on tuning.
87
- *
88
- * This periodic position-based poll — not the wake source — IS the correctness
89
- * guarantee: every committed position is reconciled within this interval whether or
90
- * not a wake for it was ever heard. That covers a wake fired before the source was
91
- * fully established, a coalesced or dropped wake, and a wake source that died
92
- * silently and never said so. A wake source only lowers delivery latency BELOW this
93
- * interval; it never carries delivery, so no engine's wake mechanism can make the
94
- * right figure here engine-specific. It trades worst-case delivery latency against
95
- * idle read volume and nothing else. Upstream `postgres_tt.py` picks the same
96
- * one-second fallback poll (`conn.wait(..., interval=1)`).
97
- */
98
- export declare const DEFAULT_POLL_INTERVAL_MILLIS = 1000;
99
- /**
100
- * The two subscribe-tuning config FIELDS, for an engine whose config is a `Schema`
101
- * to spread into its own struct.
102
- *
103
- * These knobs are the machine's, not any engine's: they name what the loop above
104
- * does, the figures they fall back to are the two constants declared beside them,
105
- * and neither is derivable from a backend's own properties — which is why the
106
- * defaults already live here. Shipping the FIELD rather than only the default is
107
- * what closes the last gap in that arrangement. An engine that spreads these gets
108
- * the key NAME, the VALIDATION and the DEFAULT from one place, so a caller who has
109
- * tuned one engine's subscribe reads another's without translating, and the two
110
- * cannot drift in what they ACCEPT any more than in what they assume. Two engines
111
- * hand-authoring the identical `Schema.optionalWith(…)` twice were identical only
112
- * by inspection.
113
- *
114
- * The bounds differ between the two because the quantities do. `pollInterval` is a
115
- * duration, so a fraction of a millisecond is meaningful and only `positive` and
116
- * `finite` matter: at zero or below the loop would spin without ever waiting for a
117
- * wake, and at `Infinity` the periodic re-read — the half that carries delivery —
118
- * would never come, which silently converts the wake source from an optimisation
119
- * into the guarantee. `catchUpPageSize` is a COUNT, so it must be an integer
120
- * (`Schema.Int` excludes `Infinity` with it): the reconcile loop compares a page's
121
- * length against it to decide the tail is drained, and a page of zero would report
122
- * "drained" forever without reading anything.
123
- *
124
- * `exact: true` on both keeps the decoded type at `key?: T` rather than
125
- * `T | undefined`, matching the repo's `exactOptionalPropertyTypes` discipline — an
126
- * absent key, never an explicit `undefined`.
127
- */
128
- export declare const subscriptionTuningFields: {
129
- readonly pollInterval: Schema.optionalWith<Schema.filter<Schema.filter<typeof Schema.Number>>, {
130
- exact: true;
131
- }>;
132
- readonly catchUpPageSize: Schema.optionalWith<Schema.filter<typeof Schema.Int>, {
133
- exact: true;
134
- }>;
135
- };
136
- /**
137
- * The two seams the subscribe machine runs over, plus the two tuning knobs. `E` is
138
- * the engine's own infrastructure error — whatever its reads fail with — and it
139
- * stays on the channel through to `makeContractStore`, which dies it.
140
- *
141
- * ONE type parameter and not two, deliberately: a wake source with an error type of
142
- * its own is `Stream.orDie`d by the caller, yielding a `Stream<unknown, never>`
143
- * that is assignable here under Effect v3's covariant error channel. A second
144
- * parameter would buy nothing and would have to be spelled at every call site. Nor
145
- * is there an `R`: neither seam contributes a requirement, and unused generality is
146
- * not free.
147
- */
148
- export interface SubscriptionDeps<E> {
149
- /**
150
- * Page-read the events strictly after `from`, up to `limit`, ascending by
151
- * position. Returning FEWER than `limit` signals the tail is drained.
152
- */
153
- readonly fetch: (from: Position, limit: ReadLimit) => Effect.Effect<ReadonlyArray<SequencedEvent>, E>;
154
- /**
155
- * The raw wake source: each element is an OPAQUE wake signal. The machine taps it
156
- * into its own wake queue and drains it on a background fibre; it never reads the
157
- * elements, so anything an engine can push on a change will do.
158
- *
159
- * OPTIONAL, and omitting it defaults to `Stream.never` at the point of use — an
160
- * engine with no wake mechanism gets poll-only delivery, which the poll loop
161
- * already makes correct. Under `exactOptionalPropertyTypes` that means omitting
162
- * the key entirely rather than passing `undefined`.
163
- */
164
- readonly listen?: Stream.Stream<unknown, E>;
165
- /** The poll interval in milliseconds (see `DEFAULT_POLL_INTERVAL_MILLIS`). */
166
- readonly pollInterval: number;
167
- /** The catch-up page size (see `DEFAULT_CATCH_UP_PAGE_SIZE`). */
168
- readonly catchUpPageSize: number;
169
- }
170
- /**
171
- * Build the subscription `Stream`: catch up from `after`, then track the live tail.
172
- * The cursor threads through the `unfoldChunkEffect` unfold state, starting at
173
- * `after` and advancing to the last delivered position each batch; the stream never
174
- * completes on its own (always `Option.some`), so the enclosing scope interrupts it
175
- * on close. An `E` mid-stream stays on the channel; `makeContractStore` dies it
176
- * (subscribe is `E = never` on the contract).
177
- */
178
- export declare const subscribeStream: <E>(deps: SubscriptionDeps<E>, after: Position | undefined) => Stream.Stream<SequencedEvent, E, Scope.Scope>;
179
- //# sourceMappingURL=SubscribeMachine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SubscribeMachine.d.ts","sourceRoot":"","sources":["../../src/SubscribeMachine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,OAAO,EAEL,MAAM,EAIN,MAAM,EACN,KAAK,KAAK,EACV,MAAM,EACP,MAAM,QAAQ,CAAA;AACf,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAU,SAAS,EAAE,MAAM,SAAS,CAAA;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,4BAA4B,OAAO,CAAA;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,wBAAwB;;;;;;;CAQ3B,CAAA;AAcV;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,CACd,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,KACb,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC3C,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,MAAM,gBAAgB,CAAC,CAAC,CAAC,EACzB,OAAO,QAAQ,GAAG,SAAS,KAC1B,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAyG5C,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"retryOnConflict.d.ts","sourceRoot":"","sources":["../../src/retryOnConflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,EAAE,MAAM,EAAa,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAqBrD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EACrC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,EAAE,CAAC,CAAC,EACvD,WAAU,QAAQ,CAAC,QAAQ,CACzB,OAAO,EACP,qBAAqB,GAAG,CAAC,EACzB,CAAC,CACgB,KAClB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,EAAE,CAAC,CAI5C,CAAA"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes