rampway 0.3.0 → 0.3.1

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 (40) hide show
  1. package/README.md +29 -0
  2. package/build/src/velocious/auth.d.ts +17 -0
  3. package/build/src/velocious/auth.d.ts.map +1 -0
  4. package/build/src/velocious/auth.js +30 -0
  5. package/build/src/velocious/auth.js.map +1 -0
  6. package/build/src/velocious/control-plane.d.ts +155 -0
  7. package/build/src/velocious/control-plane.d.ts.map +1 -0
  8. package/build/src/velocious/control-plane.js +275 -0
  9. package/build/src/velocious/control-plane.js.map +1 -0
  10. package/build/src/velocious/controller.d.ts +39 -0
  11. package/build/src/velocious/controller.d.ts.map +1 -0
  12. package/build/src/velocious/controller.js +86 -0
  13. package/build/src/velocious/controller.js.map +1 -0
  14. package/build/src/velocious/executor.d.ts +55 -0
  15. package/build/src/velocious/executor.d.ts.map +1 -0
  16. package/build/src/velocious/executor.js +142 -0
  17. package/build/src/velocious/executor.js.map +1 -0
  18. package/build/src/velocious/index.d.ts +28 -0
  19. package/build/src/velocious/index.d.ts.map +1 -0
  20. package/build/src/velocious/index.js +141 -0
  21. package/build/src/velocious/index.js.map +1 -0
  22. package/build/src/velocious/path-matcher.d.ts +18 -0
  23. package/build/src/velocious/path-matcher.d.ts.map +1 -0
  24. package/build/src/velocious/path-matcher.js +48 -0
  25. package/build/src/velocious/path-matcher.js.map +1 -0
  26. package/build/src/velocious/registry.d.ts +19 -0
  27. package/build/src/velocious/registry.d.ts.map +1 -0
  28. package/build/src/velocious/registry.js +36 -0
  29. package/build/src/velocious/registry.js.map +1 -0
  30. package/build/src/velocious/run-store.d.ts +297 -0
  31. package/build/src/velocious/run-store.d.ts.map +1 -0
  32. package/build/src/velocious/run-store.js +482 -0
  33. package/build/src/velocious/run-store.js.map +1 -0
  34. package/build/src/velocious/sanitize.d.ts +23 -0
  35. package/build/src/velocious/sanitize.d.ts.map +1 -0
  36. package/build/src/velocious/sanitize.js +154 -0
  37. package/build/src/velocious/sanitize.js.map +1 -0
  38. package/docs/docker-development-environment.md +103 -0
  39. package/docs/velocious-deployment-api.md +189 -0
  40. package/package.json +22 -3
@@ -0,0 +1,297 @@
1
+ /**
2
+ * @param {string} id - Run id.
3
+ * @returns {void}
4
+ */
5
+ export function registerActiveDeploymentRun(id: string): void;
6
+ /**
7
+ * @param {string} id - Run id.
8
+ * @returns {void}
9
+ */
10
+ export function unregisterActiveDeploymentRun(id: string): void;
11
+ /**
12
+ * @param {number} staleRunTimeoutMs - Lease duration.
13
+ * @returns {number} Heartbeat interval strictly below the lease.
14
+ */
15
+ export function heartbeatIntervalMs(staleRunTimeoutMs: number): number;
16
+ /**
17
+ * @param {{activeRunIds: Set<string>, nowMs: number, run: {id: string, heartbeatAtMs: number|null, requestedAtMs: number}, staleRunTimeoutMs: number}} args - Lease data.
18
+ * @returns {boolean} Whether ownership expired.
19
+ */
20
+ export function isRunLeaseExpired({ activeRunIds: localIds, nowMs, run, staleRunTimeoutMs }: {
21
+ activeRunIds: Set<string>;
22
+ nowMs: number;
23
+ run: {
24
+ id: string;
25
+ heartbeatAtMs: number | null;
26
+ requestedAtMs: number;
27
+ };
28
+ staleRunTimeoutMs: number;
29
+ }): boolean;
30
+ /**
31
+ * @param {{id: string, mountIdentifier: string, ownerToken: string}} args - Fence identifiers.
32
+ * @returns {Record<string, unknown>} Update conditions.
33
+ */
34
+ export function terminalTransitionConditions({ id, mountIdentifier, ownerToken }: {
35
+ id: string;
36
+ mountIdentifier: string;
37
+ ownerToken: string;
38
+ }): Record<string, unknown>;
39
+ /**
40
+ * Includes the observed heartbeat so a concurrent renewal defeats stale reconciliation.
41
+ *
42
+ * @param {{mountIdentifier: string, run: Pick<DeploymentRunRow, 'heartbeatAtMs'|'id'|'ownerToken'|'status'>}} args - Fence data.
43
+ * @returns {Record<string, unknown>} Update conditions.
44
+ */
45
+ export function reconciliationConditions({ mountIdentifier, run }: {
46
+ mountIdentifier: string;
47
+ run: Pick<DeploymentRunRow, "heartbeatAtMs" | "id" | "ownerToken" | "status">;
48
+ }): Record<string, unknown>;
49
+ /** Rampway-owned durable deployment state stored through Velocious's database abstraction. */
50
+ export default class DeploymentRunStore {
51
+ /**
52
+ * @param {object} args - Store options.
53
+ * @param {any} args.configuration - Velocious configuration.
54
+ * @param {string} [args.databaseIdentifier] - Database identifier.
55
+ * @param {string} args.mountIdentifier - Authenticated mount scope.
56
+ * @param {number} args.staleRunTimeoutMs - Lease duration.
57
+ */
58
+ constructor({ configuration, databaseIdentifier, mountIdentifier, staleRunTimeoutMs }: {
59
+ configuration: any;
60
+ databaseIdentifier?: string | undefined;
61
+ mountIdentifier: string;
62
+ staleRunTimeoutMs: number;
63
+ });
64
+ configuration: any;
65
+ databaseIdentifier: string;
66
+ mountIdentifier: string;
67
+ staleRunTimeoutMs: number;
68
+ /** @type {Promise<void>|null} */
69
+ readyPromise: Promise<void> | null;
70
+ /** @returns {Promise<void>} */
71
+ ensureReady(): Promise<void>;
72
+ /**
73
+ * @param {string} id - Run id.
74
+ * @returns {Promise<DeploymentRunRow|null>} Run.
75
+ */
76
+ findRunById(id: string): Promise<DeploymentRunRow | null>;
77
+ /**
78
+ * @param {string} key - Idempotency key.
79
+ * @returns {Promise<DeploymentRunRow|null>} Run.
80
+ */
81
+ findRunByKey(key: string): Promise<DeploymentRunRow | null>;
82
+ /**
83
+ * Serializes admission by target then by mount-global idempotency key.
84
+ *
85
+ * @param {{idempotencyKey: string, project: string, revision: string, stage: string}} args - Run request.
86
+ * @returns {Promise<{outcome: string, run: DeploymentRunRow|null}>} Admission result.
87
+ */
88
+ createRunIfPossible({ idempotencyKey, project, revision, stage }: {
89
+ idempotencyKey: string;
90
+ project: string;
91
+ revision: string;
92
+ stage: string;
93
+ }): Promise<{
94
+ outcome: string;
95
+ run: DeploymentRunRow | null;
96
+ }>;
97
+ /** @param {{id: string, startedAtMs: number}} args - Transition. @returns {Promise<void>} */
98
+ markRunning({ id, startedAtMs }: {
99
+ id: string;
100
+ startedAtMs: number;
101
+ }): Promise<void>;
102
+ /** @param {{id: string, heartbeatAtMs: number}} args - Heartbeat. @returns {Promise<void>} */
103
+ heartbeat({ id, heartbeatAtMs }: {
104
+ id: string;
105
+ heartbeatAtMs: number;
106
+ }): Promise<void>;
107
+ /** @param {{id: string, ownerToken: string, finishedAtMs: number, result: any}} args - Transition. @returns {Promise<void>} */
108
+ markSucceeded({ id, ownerToken, finishedAtMs, result }: {
109
+ id: string;
110
+ ownerToken: string;
111
+ finishedAtMs: number;
112
+ result: any;
113
+ }): Promise<void>;
114
+ /** @param {{id: string, ownerToken: string, finishedAtMs: number, error: any}} args - Transition. @returns {Promise<void>} */
115
+ markFailed({ id, ownerToken, finishedAtMs, error }: {
116
+ id: string;
117
+ ownerToken: string;
118
+ finishedAtMs: number;
119
+ error: any;
120
+ }): Promise<void>;
121
+ /** @param {{id: string, ownerToken: string, finishedAtMs: number, error: any}} args - Transition. @returns {Promise<void>} */
122
+ markReconciliationRequired({ id, ownerToken, finishedAtMs, error }: {
123
+ id: string;
124
+ ownerToken: string;
125
+ finishedAtMs: number;
126
+ error: any;
127
+ }): Promise<void>;
128
+ /** @param {{event: string, payload: any, runId: string|null}} args - Audit event. @returns {Promise<void>} */
129
+ addAuditEvent({ event, payload, runId }: {
130
+ event: string;
131
+ payload: any;
132
+ runId: string | null;
133
+ }): Promise<void>;
134
+ /**
135
+ * @param {{runId: string}} args - Query.
136
+ * @returns {Promise<Array<Record<string, any>>>} Events.
137
+ */
138
+ listAuditEvents({ runId }: {
139
+ runId: string;
140
+ }): Promise<Array<Record<string, any>>>;
141
+ /**
142
+ * @param {any} db - Open Velocious database connection.
143
+ * @param {DeploymentRunRow} run - Observed stale run.
144
+ * @returns {Promise<boolean>} Whether this reconciler won.
145
+ */
146
+ _reconcileExpiredRun(db: any, run: DeploymentRunRow): Promise<boolean>;
147
+ /**
148
+ * Reconciles an expired pending/running owner before returning durable state.
149
+ *
150
+ * @param {any} db - Open Velocious database connection.
151
+ * @param {DeploymentRunRow|null} run - Observed run.
152
+ * @returns {Promise<DeploymentRunRow|null>} Current durable run.
153
+ */
154
+ _reconcileExpiredRunIfNeeded(db: any, run: DeploymentRunRow | null): Promise<DeploymentRunRow | null>;
155
+ /** @param {{data: Record<string, any>, id: string, ownerToken: string}} args - Transition. @returns {Promise<void>} */
156
+ _transition({ data, id, ownerToken }: {
157
+ data: Record<string, any>;
158
+ id: string;
159
+ ownerToken: string;
160
+ }): Promise<void>;
161
+ /**
162
+ * @param {string} kind - Lock kind.
163
+ * @param {string} value - Scoped value.
164
+ * @returns {string} Lock name.
165
+ */
166
+ _lockName(kind: string, value: string): string;
167
+ /**
168
+ * @param {any} db - Connection.
169
+ * @param {string} id - Run id.
170
+ * @returns {Promise<DeploymentRunRow|null>} Run.
171
+ */
172
+ _findRunById(db: any, id: string): Promise<DeploymentRunRow | null>;
173
+ /**
174
+ * @param {any} db - Connection.
175
+ * @param {string} key - Idempotency key.
176
+ * @returns {Promise<DeploymentRunRow|null>} Run.
177
+ */
178
+ _findRunByKey(db: any, key: string): Promise<DeploymentRunRow | null>;
179
+ /**
180
+ * @param {any} db - Connection.
181
+ * @param {{project: string, stage: string}} args - Target.
182
+ * @returns {Promise<DeploymentRunRow|null>} Run.
183
+ */
184
+ _findBlockingRun(db: any, { project, stage }: {
185
+ project: string;
186
+ stage: string;
187
+ }): Promise<DeploymentRunRow | null>;
188
+ /**
189
+ * @param {Record<string, any>} row - Database row.
190
+ * @returns {DeploymentRunRow} Run.
191
+ */
192
+ _row(row: Record<string, any>): DeploymentRunRow;
193
+ /**
194
+ * @param {string} context - Context.
195
+ * @param {unknown} error - Failure.
196
+ * @returns {void}
197
+ */
198
+ _emitFrameworkError(context: string, error: unknown): void;
199
+ /**
200
+ * @template T
201
+ * @param {(db: any) => Promise<T>} callback - Work.
202
+ * @returns {Promise<T>} Result.
203
+ */
204
+ _withDb<T>(callback: (db: any) => Promise<T>): Promise<T>;
205
+ }
206
+ export type DeploymentRunRow = {
207
+ id: string;
208
+ mountIdentifier: string;
209
+ project: string;
210
+ stage: string;
211
+ revision: string;
212
+ idempotencyKey: string;
213
+ status: string;
214
+ result: any;
215
+ error: any;
216
+ requestedAtMs: number;
217
+ startedAtMs: number | null;
218
+ finishedAtMs: number | null;
219
+ ownerToken: string | null;
220
+ heartbeatAtMs: number | null;
221
+ };
222
+ export type DeploymentRunStoreContract = {
223
+ findRunById: (id: string) => Promise<DeploymentRunRow | null>;
224
+ findRunByKey: (key: string) => Promise<DeploymentRunRow | null>;
225
+ createRunIfPossible: (args: {
226
+ idempotencyKey: string;
227
+ project: string;
228
+ revision: string;
229
+ stage: string;
230
+ }) => Promise<{
231
+ outcome: string;
232
+ run: DeploymentRunRow | null;
233
+ }>;
234
+ markRunning: (args: {
235
+ id: string;
236
+ startedAtMs: number;
237
+ }) => Promise<void>;
238
+ heartbeat: (args: {
239
+ id: string;
240
+ heartbeatAtMs: number;
241
+ }) => Promise<void>;
242
+ markSucceeded: (args: {
243
+ id: string;
244
+ ownerToken: string;
245
+ finishedAtMs: number;
246
+ result: any;
247
+ }) => Promise<void>;
248
+ markFailed: (args: {
249
+ id: string;
250
+ ownerToken: string;
251
+ finishedAtMs: number;
252
+ error: any;
253
+ }) => Promise<void>;
254
+ markReconciliationRequired: (args: {
255
+ id: string;
256
+ ownerToken: string;
257
+ finishedAtMs: number;
258
+ error: any;
259
+ }) => Promise<void>;
260
+ addAuditEvent: (args: {
261
+ event: string;
262
+ payload: any;
263
+ runId: string | null;
264
+ }) => Promise<void>;
265
+ };
266
+ export const AUDIT_TABLE: "rampway_deployment_api_audit_events";
267
+ /**
268
+ * @typedef {object} DeploymentRunRow
269
+ * @property {string} id
270
+ * @property {string} mountIdentifier
271
+ * @property {string} project
272
+ * @property {string} stage
273
+ * @property {string} revision
274
+ * @property {string} idempotencyKey
275
+ * @property {string} status
276
+ * @property {any} result
277
+ * @property {any} error
278
+ * @property {number} requestedAtMs
279
+ * @property {number|null} startedAtMs
280
+ * @property {number|null} finishedAtMs
281
+ * @property {string|null} ownerToken
282
+ * @property {number|null} heartbeatAtMs
283
+ */
284
+ /**
285
+ * @typedef {object} DeploymentRunStoreContract
286
+ * @property {(id: string) => Promise<DeploymentRunRow|null>} findRunById
287
+ * @property {(key: string) => Promise<DeploymentRunRow|null>} findRunByKey
288
+ * @property {(args: {idempotencyKey: string, project: string, revision: string, stage: string}) => Promise<{outcome: string, run: DeploymentRunRow|null}>} createRunIfPossible
289
+ * @property {(args: {id: string, startedAtMs: number}) => Promise<void>} markRunning
290
+ * @property {(args: {id: string, heartbeatAtMs: number}) => Promise<void>} heartbeat
291
+ * @property {(args: {id: string, ownerToken: string, finishedAtMs: number, result: any}) => Promise<void>} markSucceeded
292
+ * @property {(args: {id: string, ownerToken: string, finishedAtMs: number, error: any}) => Promise<void>} markFailed
293
+ * @property {(args: {id: string, ownerToken: string, finishedAtMs: number, error: any}) => Promise<void>} markReconciliationRequired
294
+ * @property {(args: {event: string, payload: any, runId: string|null}) => Promise<void>} addAuditEvent
295
+ */
296
+ export const RUNS_TABLE: "rampway_deployment_runs";
297
+ //# sourceMappingURL=run-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../../src/velocious/run-store.js"],"names":[],"mappings":"AA4CA;;;GAGG;AACH,gDAHW,MAAM,GACJ,IAAI,CAEuD;AAExE;;;GAGG;AACH,kDAHW,MAAM,GACJ,IAAI,CAE4D;AAE7E;;;GAGG;AACH,uDAHW,MAAM,GACJ,MAAM,CAOlB;AAED;;;GAGG;AACH,6FAHW;IAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAC,GACzI,OAAO,CAKnB;AAED;;;GAGG;AACH,kFAHW;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,GACvD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAInC;AAED;;;;;GAKG;AACH,mEAHW;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,GAAC,IAAI,GAAC,YAAY,GAAC,QAAQ,CAAC,CAAA;CAAC,GAChG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUnC;AAUD,8FAA8F;AAC9F;IACE;;;;;;OAMG;IACH,uFALG;QAAkB,aAAa,EAAvB,GAAG;QACW,kBAAkB;QACnB,eAAe,EAA5B,MAAM;QACO,iBAAiB,EAA9B,MAAM;KAChB,EAUA;IANC,mBAAkC;IAClC,2BAA4C;IAC5C,wBAAsC;IACtC,0BAA0C;IAC1C,iCAAiC;IACjC,cADW,OAAO,CAAC,IAAI,CAAC,GAAC,IAAI,CACL;IAG1B,+BAA+B;IAC/B,eADc,OAAO,CAAC,IAAI,CAAC,CAiD1B;IAED;;;OAGG;IACH,gBAHW,MAAM,GACJ,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC,CAK1C;IAED;;;OAGG;IACH,kBAHW,MAAM,GACJ,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC,CAK1C;IAED;;;;;OAKG;IACH,kEAHW;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GACxE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,gBAAgB,GAAC,IAAI,CAAA;KAAC,CAAC,CAmElE;IAED,6FAA6F;IAC7F,iCADY;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,GAA+B,OAAO,CAAC,IAAI,CAAC,CAWxF;IAED,8FAA8F;IAC9F,iCADY;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,GAA8B,OAAO,CAAC,IAAI,CAAC,CAUzF;IAED,+HAA+H;IAC/H,wDADY;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAC,GAA+B,OAAO,CAAC,IAAI,CAAC,CAG1H;IAED,8HAA8H;IAC9H,oDADY;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAC,GAA+B,OAAO,CAAC,IAAI,CAAC,CAGzH;IAED,8HAA8H;IAC9H,oEADY;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAC,GAA+B,OAAO,CAAC,IAAI,CAAC,CAGzH;IAED,8GAA8G;IAC9G,yCADY;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,GAAC,IAAI,CAAA;KAAC,GAAgC,OAAO,CAAC,IAAI,CAAC,CAczG;IAED;;;OAGG;IACH,2BAHW;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GACb,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAc/C;IAED;;;;OAIG;IACH,yBAJW,GAAG,OACH,gBAAgB,GACd,OAAO,CAAC,OAAO,CAAC,CAiC5B;IAED;;;;;;OAMG;IACH,iCAJW,GAAG,OACH,gBAAgB,GAAC,IAAI,GACnB,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC,CAU1C;IAED,uHAAuH;IACvH,sCADY;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,GAA+B,OAAO,CAAC,IAAI,CAAC,CAWlH;IAED;;;;OAIG;IACH,gBAJW,MAAM,SACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;OAIG;IACH,iBAJW,GAAG,MACH,MAAM,GACJ,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC,CAK1C;IAED;;;;OAIG;IACH,kBAJW,GAAG,OACH,MAAM,GACJ,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC,CAK1C;IAED;;;;OAIG;IACH,qBAJW,GAAG,sBACH;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAC9B,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC,CAK1C;IAED;;;OAGG;IACH,UAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,gBAAgB,CAmB5B;IAED;;;;OAIG;IACH,6BAJW,MAAM,SACN,OAAO,GACL,IAAI,CAOhB;IAED;;;;OAIG;IACH,QAJa,CAAC,YACH,CAAC,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CAQtB;CACF;;QA3ea,MAAM;qBACN,MAAM;aACN,MAAM;WACN,MAAM;cACN,MAAM;oBACN,MAAM;YACN,MAAM;YACN,GAAG;WACH,GAAG;mBACH,MAAM;iBACN,MAAM,GAAC,IAAI;kBACX,MAAM,GAAC,IAAI;gBACX,MAAM,GAAC,IAAI;mBACX,MAAM,GAAC,IAAI;;;iBAKX,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC;kBAC9C,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAC,IAAI,CAAC;yBAC/C,CAAC,IAAI,EAAE;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,gBAAgB,GAAC,IAAI,CAAA;KAAC,CAAC;iBAC5I,CAAC,IAAI,EAAE;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;eAC1D,CAAC,IAAI,EAAE;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;mBAC5D,CAAC,IAAI,EAAE;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;gBAC5F,CAAC,IAAI,EAAE;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;gCAC3F,CAAC,IAAI,EAAE;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;mBAC3F,CAAC,IAAI,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,GAAC,IAAI,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;;AAIxF,0BAAoB,qCAAqC,CAAA;AAhCzD;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;;;;GAWG;AAEH,yBAAmB,yBAAyB,CAAA"}