@proteinjs/db 1.30.0 → 1.32.0

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 (71) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/generated/index.js +1 -1
  3. package/dist/generated/index.js.map +1 -1
  4. package/dist/generated/test/index.d.ts.map +1 -1
  5. package/dist/generated/test/index.js +3 -1
  6. package/dist/generated/test/index.js.map +1 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/src/CursorWindowPager.d.ts +74 -0
  12. package/dist/src/CursorWindowPager.d.ts.map +1 -0
  13. package/dist/src/CursorWindowPager.js +178 -0
  14. package/dist/src/CursorWindowPager.js.map +1 -0
  15. package/dist/src/Db.d.ts +20 -0
  16. package/dist/src/Db.d.ts.map +1 -1
  17. package/dist/src/Db.js +10 -0
  18. package/dist/src/Db.js.map +1 -1
  19. package/dist/src/MigrationRunner.d.ts +58 -1
  20. package/dist/src/MigrationRunner.d.ts.map +1 -1
  21. package/dist/src/MigrationRunner.js +108 -2
  22. package/dist/src/MigrationRunner.js.map +1 -1
  23. package/dist/src/RecordIterator.d.ts +16 -6
  24. package/dist/src/RecordIterator.d.ts.map +1 -1
  25. package/dist/src/RecordIterator.js +50 -37
  26. package/dist/src/RecordIterator.js.map +1 -1
  27. package/dist/src/schema/SchemaOperations.d.ts +7 -1
  28. package/dist/src/schema/SchemaOperations.d.ts.map +1 -1
  29. package/dist/src/schema/TableManager.d.ts +8 -0
  30. package/dist/src/schema/TableManager.d.ts.map +1 -1
  31. package/dist/src/schema/TableManager.js +71 -23
  32. package/dist/src/schema/TableManager.js.map +1 -1
  33. package/dist/src/tables/MigrationTable.d.ts +10 -0
  34. package/dist/src/tables/MigrationTable.d.ts.map +1 -1
  35. package/dist/src/tables/MigrationTable.js +1 -0
  36. package/dist/src/tables/MigrationTable.js.map +1 -1
  37. package/dist/test/CursorWindowPager.test.d.ts +2 -0
  38. package/dist/test/CursorWindowPager.test.d.ts.map +1 -0
  39. package/dist/test/CursorWindowPager.test.js +213 -0
  40. package/dist/test/CursorWindowPager.test.js.map +1 -0
  41. package/dist/test/index.d.ts +2 -0
  42. package/dist/test/index.d.ts.map +1 -1
  43. package/dist/test/index.js +2 -0
  44. package/dist/test/index.js.map +1 -1
  45. package/dist/test/reusable/RecordIteratorTests.d.ts +13 -0
  46. package/dist/test/reusable/RecordIteratorTests.d.ts.map +1 -0
  47. package/dist/test/reusable/RecordIteratorTests.js +448 -0
  48. package/dist/test/reusable/RecordIteratorTests.js.map +1 -0
  49. package/dist/test/util/DbTestEnvironment.d.ts.map +1 -1
  50. package/dist/test/util/DbTestEnvironment.js +2 -1
  51. package/dist/test/util/DbTestEnvironment.js.map +1 -1
  52. package/dist/test/util/tables/recordIteratorTestTables.d.ts +25 -0
  53. package/dist/test/util/tables/recordIteratorTestTables.d.ts.map +1 -0
  54. package/dist/test/util/tables/recordIteratorTestTables.js +38 -0
  55. package/dist/test/util/tables/recordIteratorTestTables.js.map +1 -0
  56. package/generated/index.ts +1 -1
  57. package/generated/test/index.ts +3 -1
  58. package/index.ts +1 -0
  59. package/package.json +3 -3
  60. package/src/CursorWindowPager.ts +153 -0
  61. package/src/Db.ts +18 -0
  62. package/src/MigrationRunner.ts +114 -2
  63. package/src/RecordIterator.ts +34 -24
  64. package/src/schema/SchemaOperations.ts +7 -1
  65. package/src/schema/TableManager.ts +36 -8
  66. package/src/tables/MigrationTable.ts +11 -1
  67. package/test/CursorWindowPager.test.ts +185 -0
  68. package/test/index.ts +2 -0
  69. package/test/reusable/RecordIteratorTests.ts +190 -0
  70. package/test/util/DbTestEnvironment.ts +2 -0
  71. package/test/util/tables/recordIteratorTestTables.ts +23 -0
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ /**
43
+ * CursorWindowPager (src/CursorWindowPager.ts) at the pure level: effective-sort derivation
44
+ * (id tiebreak appended, explicit id ends the list, byValues rejected), lexicographic anchor
45
+ * conditions, next-anchor derivation (short-window and null-tail exhaustion), anchor
46
+ * encode/decode fidelity, and fresh-query-per-window construction. The db round trip is a
47
+ * constructor-injected stub — no module mocking, the pager's `options.db` seam IS the
48
+ * injection point.
49
+ */
50
+ var moment_1 = __importDefault(require("moment"));
51
+ var db_query_1 = require("@proteinjs/db-query");
52
+ var db_1 = require("@proteinjs/db");
53
+ // Load the reflection source graph so the house Serializer's custom serializers (moments)
54
+ // are registered — anchor encode/decode fidelity rides them.
55
+ require("../generated/index");
56
+ var table = { name: 'pager_test' };
57
+ var staged = { rows: [] };
58
+ var executed = [];
59
+ var stubDb = {
60
+ query: function (_table, qb) { return __awaiter(void 0, void 0, void 0, function () {
61
+ return __generator(this, function (_a) {
62
+ executed.push(qb);
63
+ return [2 /*return*/, staged.rows];
64
+ });
65
+ }); },
66
+ };
67
+ var createQuery = function () { return new db_query_1.QueryBuilder(table.name); };
68
+ var pager = function (sort) {
69
+ return new db_1.CursorWindowPager(table, createQuery, sort, { db: stubDb });
70
+ };
71
+ var internals = function (instance) { return instance; };
72
+ var graphNodes = function (qb) { return qb.graph.nodes().map(function (id) { return qb.graph.node(id); }); };
73
+ var conditionNodes = function (qb) { return graphNodes(qb).filter(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'CONDITION'; }); };
74
+ var logicalNodes = function (qb) { return graphNodes(qb).filter(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'LOGICAL'; }); };
75
+ var paginationNode = function (qb) { return graphNodes(qb).find(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'PAGINATION'; }); };
76
+ var sortNodes = function (qb) { return graphNodes(qb).filter(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'SORT'; }); };
77
+ var row = function (id, seq, at) { return ({
78
+ id: id,
79
+ name: id,
80
+ seq: seq,
81
+ stampedAt: at ? (0, moment_1.default)(at) : at === null ? null : undefined,
82
+ }); };
83
+ beforeEach(function () {
84
+ staged.rows = [];
85
+ executed.length = 0;
86
+ });
87
+ describe('effective sort', function () {
88
+ it('appends the id tiebreak to the consumer sort', function () {
89
+ var instance = pager([{ field: 'seq', desc: true }]);
90
+ expect(internals(instance).effectiveSort).toEqual([
91
+ { field: 'seq', desc: true },
92
+ { field: 'id', desc: false },
93
+ ]);
94
+ });
95
+ it('no sort = pure id order', function () {
96
+ expect(internals(pager()).effectiveSort).toEqual([{ field: 'id', desc: false }]);
97
+ });
98
+ it('an explicit id criterion ends the list (axes after it can never influence order)', function () {
99
+ var instance = pager([
100
+ { field: 'id', desc: true },
101
+ { field: 'seq', desc: false },
102
+ ]);
103
+ expect(internals(instance).effectiveSort).toEqual([{ field: 'id', desc: true }]);
104
+ });
105
+ it('rejects byValues sorts — a CASE ordering has no comparable cursor axis', function () {
106
+ expect(function () { return pager([{ field: 'name', byValues: ['a', 'b'] }]); }).toThrow(/byValues/);
107
+ });
108
+ });
109
+ describe('buildWindowQuery', function () {
110
+ it('the first window carries no cursor conditions — just the effective sort and the window pagination', function () {
111
+ var qb = internals(pager([{ field: 'seq', desc: false }])).buildWindowQuery(null, 30);
112
+ expect(conditionNodes(qb)).toHaveLength(0);
113
+ expect(paginationNode(qb)).toMatchObject({ start: 0, end: 30 });
114
+ expect(sortNodes(qb).map(function (node) { return node.criteria; })).toEqual([
115
+ { field: 'seq', desc: false },
116
+ { field: 'id', desc: false },
117
+ ]);
118
+ });
119
+ it('an anchored window builds the lexicographic continuation: past-on-axis OR (equal-on-axis AND past-on-id)', function () {
120
+ var qb = internals(pager([{ field: 'seq', desc: true }])).buildWindowQuery({ values: [40, 'row-4'] }, 10);
121
+ // Disjunct 1: seq < 40. Disjunct 2: seq = 40 AND id > 'row-4'.
122
+ expect(conditionNodes(qb)).toEqual(expect.arrayContaining([
123
+ expect.objectContaining({ field: 'seq', operator: '<', value: 40 }),
124
+ expect.objectContaining({ field: 'seq', operator: '=', value: 40 }),
125
+ expect.objectContaining({ field: 'id', operator: '>', value: 'row-4' }),
126
+ ]));
127
+ expect(conditionNodes(qb)).toHaveLength(3);
128
+ var operators = logicalNodes(qb).map(function (node) { return node.operator; });
129
+ expect(operators).toContain('OR');
130
+ expect(operators).toContain('AND');
131
+ });
132
+ it('an ascending axis flips the past operator to `>`', function () {
133
+ var qb = internals(pager([{ field: 'seq', desc: false }])).buildWindowQuery({ values: [40, 'row-4'] }, 10);
134
+ expect(conditionNodes(qb)).toEqual(expect.arrayContaining([expect.objectContaining({ field: 'seq', operator: '>', value: 40 })]));
135
+ });
136
+ it('every window builds on a FRESH query — cursor conditions never accumulate', function () {
137
+ var instance = pager([{ field: 'seq', desc: true }]);
138
+ internals(instance).buildWindowQuery({ values: [40, 'row-4'] }, 10);
139
+ var second = internals(instance).buildWindowQuery({ values: [20, 'row-2'] }, 10);
140
+ expect(conditionNodes(second)).toHaveLength(3);
141
+ });
142
+ });
143
+ describe('deriveNextAnchor', function () {
144
+ var instance = pager([{ field: 'seq', desc: false }]);
145
+ it('a short window is exhausted', function () {
146
+ expect(internals(instance).deriveNextAnchor([row('a', 10)], 3)).toBeNull();
147
+ expect(internals(instance).deriveNextAnchor([], 3)).toBeNull();
148
+ });
149
+ it('a full window anchors at its tail row, one value per effective criterion', function () {
150
+ var anchor = internals(instance).deriveNextAnchor([row('a', 10), row('b', 20), row('c', 30)], 3);
151
+ expect(anchor).toEqual({ values: [30, 'c'] });
152
+ });
153
+ it('a full window with a NULL sort-value tail is exhausted (null rows collect at the tail; no anchor)', function () {
154
+ expect(internals(instance).deriveNextAnchor([row('a', 10), row('b', 20), row('c', null)], 3)).toBeNull();
155
+ });
156
+ });
157
+ describe('anchor encode/decode', function () {
158
+ it('round-trips values with type fidelity (moments survive)', function () {
159
+ var at = (0, moment_1.default)('2026-08-10T12:00:00.000Z');
160
+ var encoded = db_1.CursorWindowPager.encodeAnchor({ values: [at, 'row-1'] });
161
+ expect(typeof encoded).toBe('string');
162
+ var decoded = db_1.CursorWindowPager.decodeAnchor(encoded);
163
+ expect(moment_1.default.isMoment(decoded.values[0])).toBe(true);
164
+ expect(decoded.values[0].toISOString()).toBe(at.toISOString());
165
+ expect(decoded.values[1]).toBe('row-1');
166
+ });
167
+ });
168
+ describe('loadWindow', function () {
169
+ it('returns the queried rows with the derived next anchor, querying through the injected db', function () { return __awaiter(void 0, void 0, void 0, function () {
170
+ var instance, window;
171
+ return __generator(this, function (_a) {
172
+ switch (_a.label) {
173
+ case 0:
174
+ instance = pager([{ field: 'seq', desc: false }]);
175
+ staged.rows = [row('a', 10), row('b', 20), row('c', 30)];
176
+ return [4 /*yield*/, instance.loadWindow(null, 3)];
177
+ case 1:
178
+ window = _a.sent();
179
+ expect(window.rows).toBe(staged.rows);
180
+ expect(window.nextAnchor).toEqual({ values: [30, 'c'] });
181
+ expect(executed).toHaveLength(1);
182
+ expect(paginationNode(executed[0])).toMatchObject({ start: 0, end: 3 });
183
+ return [2 /*return*/];
184
+ }
185
+ });
186
+ }); });
187
+ it('returns an exhausted window (null anchor) when the query comes back short', function () { return __awaiter(void 0, void 0, void 0, function () {
188
+ var instance, window;
189
+ return __generator(this, function (_a) {
190
+ switch (_a.label) {
191
+ case 0:
192
+ instance = pager([{ field: 'seq', desc: false }]);
193
+ staged.rows = [row('a', 10)];
194
+ return [4 /*yield*/, instance.loadWindow({ values: [5, 'z'] }, 3)];
195
+ case 1:
196
+ window = _a.sent();
197
+ expect(window.nextAnchor).toBeNull();
198
+ return [2 /*return*/];
199
+ }
200
+ });
201
+ }); });
202
+ it('rejects a nonsensical window size', function () { return __awaiter(void 0, void 0, void 0, function () {
203
+ return __generator(this, function (_a) {
204
+ switch (_a.label) {
205
+ case 0: return [4 /*yield*/, expect(pager().loadWindow(null, 0)).rejects.toThrow(/window size/i)];
206
+ case 1:
207
+ _a.sent();
208
+ return [2 /*return*/];
209
+ }
210
+ });
211
+ }); });
212
+ });
213
+ //# sourceMappingURL=CursorWindowPager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CursorWindowPager.test.js","sourceRoot":"","sources":["../../test/CursorWindowPager.test.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,13 @@ export * from './reusable/DynamicReferenceColumnTests';
5
5
  export * from './reusable/TransactionTests';
6
6
  export * from './reusable/CascadeDeleteTests';
7
7
  export * from './reusable/PreloadReferencesTests';
8
+ export * from './reusable/RecordIteratorTests';
8
9
  export * from './util/testUser';
9
10
  export * from './util/tables/cascadeDeleteTestTables';
10
11
  export * from './util/tables/columnTypesTestTables';
11
12
  export * from './util/tables/crudTestTables';
12
13
  export * from './util/tables/dynamicReferenceColumnTestTables';
14
+ export * from './util/tables/recordIteratorTestTables';
13
15
  export * from './util/tables/tableManagerTestTables';
14
16
  export * from './util/tables/transactionTestTables';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAElD,cAAc,iBAAiB,CAAC;AAEhC,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAE/C,cAAc,iBAAiB,CAAC;AAEhC,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC"}
@@ -21,11 +21,13 @@ __exportStar(require("./reusable/DynamicReferenceColumnTests"), exports);
21
21
  __exportStar(require("./reusable/TransactionTests"), exports);
22
22
  __exportStar(require("./reusable/CascadeDeleteTests"), exports);
23
23
  __exportStar(require("./reusable/PreloadReferencesTests"), exports);
24
+ __exportStar(require("./reusable/RecordIteratorTests"), exports);
24
25
  __exportStar(require("./util/testUser"), exports);
25
26
  __exportStar(require("./util/tables/cascadeDeleteTestTables"), exports);
26
27
  __exportStar(require("./util/tables/columnTypesTestTables"), exports);
27
28
  __exportStar(require("./util/tables/crudTestTables"), exports);
28
29
  __exportStar(require("./util/tables/dynamicReferenceColumnTestTables"), exports);
30
+ __exportStar(require("./util/tables/recordIteratorTestTables"), exports);
29
31
  __exportStar(require("./util/tables/tableManagerTestTables"), exports);
30
32
  __exportStar(require("./util/tables/transactionTestTables"), exports);
31
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,uDAAqC;AACrC,8DAA4C;AAC5C,yEAAuD;AACvD,8DAA4C;AAC5C,gEAA8C;AAC9C,oEAAkD;AAElD,kDAAgC;AAEhC,wEAAsD;AACtD,sEAAoD;AACpD,+DAA6C;AAC7C,iFAA+D;AAC/D,uEAAqD;AACrD,sEAAoD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,uDAAqC;AACrC,8DAA4C;AAC5C,yEAAuD;AACvD,8DAA4C;AAC5C,gEAA8C;AAC9C,oEAAkD;AAClD,iEAA+C;AAE/C,kDAAgC;AAEhC,wEAAsD;AACtD,sEAAoD;AACpD,+DAA6C;AAC7C,iFAA+D;AAC/D,yEAAuD;AACvD,uEAAqD;AACrD,sEAAoD"}
@@ -0,0 +1,13 @@
1
+ import { DbDriver, Table, DefaultTransactionContextFactory } from '@proteinjs/db';
2
+ /**
3
+ * RecordIterator's iteration contract under CONCURRENT WRITES — the offset-window drift class.
4
+ *
5
+ * Offset paging frames every window by position (`OFFSET n`), so a row deleted behind the
6
+ * iterator slides an unvisited row into the already-consumed range (SKIP), and a row inserted
7
+ * ahead of the consumed prefix slides a consumed row back into the next window (DUPLICATE).
8
+ * Cursor windows frame by the tail row's sort values instead, so concurrent writes can never
9
+ * shift the frame. These tests mutate the table exactly at a window boundary (window size 3,
10
+ * mutation after the 3rd yield) and assert the OUTCOME: every seeded row visited exactly once.
11
+ */
12
+ export declare const recordIteratorTests: (driver: DbDriver, transactionContextFactory: DefaultTransactionContextFactory, dropTable: (table: Table<any>) => Promise<void>) => () => void;
13
+ //# sourceMappingURL=RecordIteratorTests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordIteratorTests.d.ts","sourceRoot":"","sources":["../../../test/reusable/RecordIteratorTests.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EAGR,KAAK,EACL,gCAAgC,EAGjC,MAAM,eAAe,CAAC;AAIvB;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,WACtB,QAAQ,6BACW,gCAAgC,qBACxC,MAAM,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,eAkKhD,CAAC"}