@substrat-run/control-plane-api 0.163.0 → 0.165.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.
@@ -0,0 +1,428 @@
1
+ import { CONNECTOR_DISPATCH_KIND_PREFIX, VERTICAL_CONNECTOR_BINDING_PREFIX, connectionProbe, connectorBindResult, connectorCallConnection, connectorCallResponse, CONNECTOR_CALL_STATE_MAX_BYTES, CONNECTOR_CALL_STATE_MAX_KEYS, connectorCallState, connectorDispatchPayload, connectorSweepResult, scopeId as scopeIdSchema, verticalConnectorBinding, verticalConnectorBindingKey, verticalConnectorStateKey, verticalConnectorStatePrefix, } from '@substrat-run/contracts';
2
+ import { isPrimaryScope, runningVersionOf } from '@substrat-run/kernel';
3
+ /** {@link VerticalConnectorReads} over a host's directory and registry, read as `actor`. */
4
+ export function verticalConnectorReadsOf(host, actor) {
5
+ return {
6
+ scope: (tenantId, scopeId) => host.admin.getScopeRecord(actor, tenantId, scopeId),
7
+ serving: async (vertical) => {
8
+ const serving = await host.admin.verticalServing(actor, vertical);
9
+ return serving ? { ref: serving.ref, versionId: serving.versionId } : null;
10
+ },
11
+ prodVersionId: async (vertical) => (await host.admin.listChannels(actor, vertical)).find((c) => c.channel === 'prod')?.versionId ?? null,
12
+ version: (vertical, versionId) => host.admin.getVersion(actor, versionId, vertical),
13
+ connectors: (vertical, versionId) => host.versionConnectors(vertical, versionId),
14
+ };
15
+ }
16
+ /**
17
+ * Which declaration a call runs and where it goes (§6.3, §6.4) — `VerticalConnectorDeps.resolve`.
18
+ * A scoped call runs the scope's RUNNING version (`runningVersionOf`) in the deployment that holds
19
+ * its data: its serving script, else that version's own. A connection-level call runs the
20
+ * vertical's serving version, else its prod channel's. The declaration is read off that version's
21
+ * stored manifest on every call, so a promote that drops a connector stops it at the next one; the
22
+ * hosts are that version's declared `outbound`.
23
+ */
24
+ export async function resolveVerticalConnectorTarget(reads, { tenantId, vertical, scopeId, provider }) {
25
+ let versionId;
26
+ let deploymentRef = null;
27
+ if (scopeId) {
28
+ const scope = await reads.scope(tenantId, scopeId);
29
+ if (!scope || scope.vertical !== vertical)
30
+ return { refused: `scope ${scopeId} is not an install of '${vertical}' in tenant ${tenantId}` };
31
+ if (!isPrimaryScope(scope))
32
+ return { refused: `scope ${scopeId} is a preview or a fork, and those cause no outbound effects` };
33
+ // The serving pointer matters only to a scope on the serving script (`runningVersionOf`).
34
+ const serving = scope.servingRef ? await reads.serving(vertical) : null;
35
+ versionId = runningVersionOf(scope, serving);
36
+ deploymentRef = scope.servingRef ?? null;
37
+ }
38
+ else {
39
+ const serving = await reads.serving(vertical);
40
+ if (serving) {
41
+ versionId = serving.versionId;
42
+ deploymentRef = serving.ref;
43
+ }
44
+ else {
45
+ versionId = await reads.prodVersionId(vertical);
46
+ }
47
+ }
48
+ if (!versionId)
49
+ return { refused: `no version of '${vertical}' runs${scopeId ? ` for scope ${scopeId}` : ''}` };
50
+ const version = await reads.version(vertical, versionId);
51
+ if (!version)
52
+ return { refused: `version ${versionId} of '${vertical}' is not in the registry` };
53
+ deploymentRef ??= version.deploymentRef;
54
+ if (!deploymentRef)
55
+ return { refused: `version ${versionId} of '${vertical}' has no deployment` };
56
+ const fact = await reads.connectors(vertical, versionId);
57
+ if (fact.kind === 'unreadable')
58
+ return { refused: `the connectors version ${versionId} of '${vertical}' declares cannot be read: ${fact.reason}` };
59
+ const declaration = fact.kind === 'connectors' ? fact.rows.find((d) => d.provider === provider) : undefined;
60
+ if (!declaration)
61
+ return { refused: `version ${versionId} of '${vertical}' does not declare the connector '${provider}'` };
62
+ return { declaration, target: { deploymentRef, slug: vertical, tenantId, scopeId, hosts: version.outbound ?? [] } };
63
+ }
64
+ const message = (e) => (e instanceof Error ? e.message : String(e));
65
+ const USE_ERROR_MAX = 600;
66
+ /**
67
+ * The live credential for `row`, as a call carries it. Refused when the live connection for its
68
+ * (tenant, vertical, provider, account) is not `row` itself: the credential that is sent and the
69
+ * connection the call's uses and state are recorded against must be the same row.
70
+ */
71
+ async function openFor(deps, row) {
72
+ const open = await deps.host.admin.openConnection(row.tenantId, row.vertical, row.provider, row.externalAccountRef ?? undefined);
73
+ if (!open)
74
+ throw new Error(`no live '${row.provider}' connection for tenant ${row.tenantId} / vertical '${row.vertical}'`);
75
+ if (open.id !== row.id) {
76
+ throw new Error(`connection ${row.id} is not the live '${row.provider}' connection for tenant ${row.tenantId} / vertical ` +
77
+ `'${row.vertical}' (that is ${open.id}): the credential sent and the connection recorded must be the same`);
78
+ }
79
+ for (const [key, value] of Object.entries(open.secret)) {
80
+ if (typeof value !== 'string') {
81
+ throw new Error(`the stored credential of connection ${row.id} holds a non-string value under '${key}'; a vertical-defined connector is handed strings only`);
82
+ }
83
+ }
84
+ return connectorCallConnection.parse({
85
+ id: open.id,
86
+ tenantId: row.tenantId,
87
+ vertical: row.vertical,
88
+ provider: row.provider,
89
+ externalAccountRef: row.externalAccountRef,
90
+ expiresAt: open.expiresAt,
91
+ secret: open.secret,
92
+ });
93
+ }
94
+ /** The connector's state for one call — the connection's, or one scope's — without its storage prefix. */
95
+ async function stateOf(host, id, scopeId) {
96
+ const prefix = verticalConnectorStatePrefix(scopeId);
97
+ const rows = await host.admin.listConnectorState(id, prefix);
98
+ const parsed = connectorCallState.safeParse(rows.filter((r) => r.value !== null).map((r) => ({ key: r.key.slice(prefix.length), value: r.value })));
99
+ if (!parsed.success) {
100
+ throw new Error(`the connector state of ${scopeId === null ? 'the connection' : `scope ${scopeId}`} does not fit one call: ${parsed.error.issues[0]?.message ?? 'invalid'}`);
101
+ }
102
+ return parsed.data;
103
+ }
104
+ /**
105
+ * Make one call and apply its answer (§6.2, §6.3). A succeeded call's state writes land, then its
106
+ * recorded uses; a failed one's uses only, so a cursor never moves past work that did not land. A
107
+ * call that never produced an answer (a transport throw, a non-200, a body that is not a response)
108
+ * records one failed use and is reported retryable.
109
+ */
110
+ async function applyConnectorCall(deps, connectionId, scopeId, target, request) {
111
+ const unanswered = async (error) => {
112
+ await deps.host.admin.recordConnectionUse(connectionId, { ok: false, error: error.slice(0, USE_ERROR_MAX) });
113
+ return { ok: false, refused: false, error };
114
+ };
115
+ let answer;
116
+ try {
117
+ answer = await deps.call(target, request);
118
+ }
119
+ catch (e) {
120
+ return unanswered(`the call into the vertical's connector did not complete: ${message(e)}`);
121
+ }
122
+ if (answer.status !== 200)
123
+ return unanswered(`the vertical's connector answered HTTP ${answer.status}`);
124
+ const parsed = connectorCallResponse.safeParse(answer.body);
125
+ if (!parsed.success)
126
+ return unanswered("the vertical's connector answered something that is not a connector-call response");
127
+ const response = parsed.data;
128
+ // The uses happened whatever becomes of the state, so every outcome records them; a succeeded
129
+ // call's state lands first.
130
+ const recordUses = async () => {
131
+ for (const use of response.uses)
132
+ await deps.host.admin.recordConnectionUse(connectionId, use);
133
+ };
134
+ if (!response.ok) {
135
+ await recordUses();
136
+ return { ok: false, refused: response.refused, error: response.error };
137
+ }
138
+ // The cap holds the TOTAL a later call carries, not only this call's writes: state that grew
139
+ // past it would refuse every later call, and the connector could never run to delete keys.
140
+ const over = response.state.length > 0 ? await stateCapAfter(deps.host, connectionId, scopeId, response.state) : null;
141
+ if (over) {
142
+ await recordUses();
143
+ return { ok: false, refused: false, error: over };
144
+ }
145
+ for (const w of response.state) {
146
+ await deps.host.admin.putConnectorState(connectionId, verticalConnectorStateKey(scopeId, w.key), w.value === undefined ? null : w.value);
147
+ }
148
+ await recordUses();
149
+ return { ok: true, result: response.result };
150
+ }
151
+ /**
152
+ * Why `writes` may not land on the stored state of `scopeId` (null for the connection's own), or
153
+ * null when the merged state (stored, then the writes, a `null` deleting) fits one call's cap.
154
+ */
155
+ async function stateCapAfter(host, id, scopeId, writes) {
156
+ const prefix = verticalConnectorStatePrefix(scopeId);
157
+ const merged = new Map();
158
+ for (const r of await host.admin.listConnectorState(id, prefix))
159
+ if (r.value !== null)
160
+ merged.set(r.key.slice(prefix.length), r.value);
161
+ for (const w of writes) {
162
+ if (w.value === null || w.value === undefined)
163
+ merged.delete(w.key);
164
+ else
165
+ merged.set(w.key, w.value);
166
+ }
167
+ const fits = connectorCallState.safeParse([...merged].map(([key, value]) => ({ key, value })));
168
+ if (fits.success)
169
+ return null;
170
+ return (`connector state would exceed what one call carries (${CONNECTOR_CALL_STATE_MAX_KEYS} keys, ${CONNECTOR_CALL_STATE_MAX_BYTES} bytes ` +
171
+ `serialised) with ${merged.size} keys: nothing was written; the connector must delete keys`);
172
+ }
173
+ /** The bindings the platform holds for a connection, tombstones and unreadable rows left out. */
174
+ async function storedBindings(host, id) {
175
+ const rows = await host.admin.listConnectorState(id, VERTICAL_CONNECTOR_BINDING_PREFIX);
176
+ return rows.flatMap((r) => {
177
+ if (r.value === null)
178
+ return [];
179
+ const b = verticalConnectorBinding.safeParse(r.value);
180
+ return b.success ? [b.data] : [];
181
+ });
182
+ }
183
+ /**
184
+ * The poll floor for one vertical-defined connection: one call per bound scope, to that scope's own
185
+ * deployment, carrying that scope's state (§6.1). Built per connection, since the pass hands a
186
+ * sweeper only an id. Answers `{ found, failed, landed }`, which the pass reads
187
+ * (`connectorSweepAnswerOf`).
188
+ */
189
+ export function verticalConnectorSweeper(deps, connection) {
190
+ return async (_host, connectionId) => {
191
+ if (connectionId !== connection.id)
192
+ throw new Error(`this sweeper was built for connection ${connection.id}, not ${connectionId}`);
193
+ const rows = (await deps.host.admin.listConnectorState(connection.id, VERTICAL_CONNECTOR_BINDING_PREFIX)).filter((r) => r.value !== null);
194
+ const failed = [];
195
+ let found = 0;
196
+ let landed = 0;
197
+ if (rows.length === 0)
198
+ return { found, failed, landed };
199
+ const opened = await openFor(deps, connection);
200
+ for (const row of rows) {
201
+ const scopeId = row.key.slice(VERTICAL_CONNECTOR_BINDING_PREFIX.length);
202
+ found += 1;
203
+ const binding = verticalConnectorBinding.safeParse(row.value);
204
+ if (!binding.success || binding.data.scopeId !== scopeId) {
205
+ failed.push({ scopeId, error: 'its stored binding does not read as one' });
206
+ continue;
207
+ }
208
+ try {
209
+ const resolved = await deps.resolve({ tenantId: connection.tenantId, vertical: connection.vertical, scopeId: binding.data.scopeId, provider: connection.provider });
210
+ if ('refused' in resolved) {
211
+ failed.push({ scopeId, error: resolved.refused });
212
+ continue;
213
+ }
214
+ if (!resolved.declaration.sweeps) {
215
+ // A connector with no sweep polls nothing; its binding is the dispatch's, not a poll's.
216
+ found -= 1;
217
+ continue;
218
+ }
219
+ const state = await stateOf(deps.host, connection.id, scopeId);
220
+ const outcome = await applyConnectorCall(deps, connection.id, scopeId, resolved.target, {
221
+ role: 'sweep',
222
+ provider: connection.provider,
223
+ connection: opened,
224
+ binding: binding.data,
225
+ state,
226
+ });
227
+ if (!outcome.ok) {
228
+ failed.push({ scopeId, error: outcome.error });
229
+ continue;
230
+ }
231
+ const result = connectorSweepResult.safeParse(outcome.result);
232
+ if (result.success)
233
+ landed += result.data.landed;
234
+ else
235
+ failed.push({ scopeId, error: 'the connector answered a sweep result that does not read as one' });
236
+ }
237
+ catch (e) {
238
+ failed.push({ scopeId, error: message(e) });
239
+ }
240
+ }
241
+ return { found, failed, landed };
242
+ };
243
+ }
244
+ /**
245
+ * Write `connection`'s binding to one scope (§6.1). Refused unless the scope's enforced tuples give
246
+ * the connection the binding's key; the connector's `bind` hook, when it declares one, normalises
247
+ * the options first, and a connector without one takes none.
248
+ */
249
+ async function bindScope(deps, host, connection, target) {
250
+ const { tenantId, scopeId: rawScope, vertical, operation, permission, ...raw } = target;
251
+ if (tenantId !== connection.tenantId || vertical !== connection.vertical) {
252
+ throw new Error(`connection ${connection.id} belongs to tenant ${connection.tenantId} / vertical '${connection.vertical}', not to the scope's`);
253
+ }
254
+ const scopeId = scopeIdSchema.parse(rawScope);
255
+ const grants = await host.connectionGrantsInScope(connection.tenantId, scopeId);
256
+ if (!grants.some((g) => g.connectionId === connection.id && g.permission === permission)) {
257
+ throw new Error(`connection ${connection.id} does not hold '${permission}' on scope ${scopeId} — what it read could not land. ` +
258
+ 'Grant it first (grantToConnection), then bind.');
259
+ }
260
+ const resolved = await deps.resolve({ tenantId: connection.tenantId, vertical: connection.vertical, scopeId, provider: connection.provider });
261
+ if ('refused' in resolved)
262
+ throw new Error(resolved.refused);
263
+ let options = raw;
264
+ if (resolved.declaration.binds) {
265
+ const outcome = await applyConnectorCall(deps, connection.id, scopeId, resolved.target, {
266
+ role: 'bind',
267
+ provider: connection.provider,
268
+ connection: await openFor(deps, connection),
269
+ scopeId,
270
+ options: raw,
271
+ });
272
+ if (!outcome.ok)
273
+ throw new Error(`the ${connection.provider} connector ${outcome.refused ? 'refused' : 'could not complete'} the binding: ${outcome.error}`);
274
+ const result = connectorBindResult.safeParse(outcome.result);
275
+ if (!result.success)
276
+ throw new Error(`the ${connection.provider} connector answered a binding that does not read as one`);
277
+ options = result.data.options;
278
+ }
279
+ else if (Object.keys(raw).length > 0) {
280
+ throw new Error(`'${connection.provider}' takes no binding options (its connector declares no bind); got ${Object.keys(raw).join(', ')}`);
281
+ }
282
+ const binding = verticalConnectorBinding.parse({ scopeId, operation, permission, options, declared: raw, boundAt: deps.now() });
283
+ await host.admin.putConnectorState(connection.id, verticalConnectorBindingKey(scopeId), binding);
284
+ return binding;
285
+ }
286
+ const LISTED_FIXED = new Set(['scopeId', 'operation', 'permission']);
287
+ /**
288
+ * The binder the landing pass binds a vertical-defined connection with (#2316). It lists each
289
+ * binding's DECLARED options, so the pass compares a declaration with what was declared, never with
290
+ * what the connector's `bind` hook normalised it to.
291
+ */
292
+ export function verticalConnectorBinder(deps) {
293
+ return {
294
+ list: async (host, connection) => (await storedBindings(host, connection.id)).map((b) => ({ ...b.declared, scopeId: b.scopeId, operation: b.operation, permission: b.permission })),
295
+ bind: (host, connection, target) => bindScope(deps, host, connection, target),
296
+ // Validated at bind, by the connector. A current binding's options survive unless overridden.
297
+ options: (raw, current) => ({
298
+ ...(current ? Object.fromEntries(Object.entries(current).filter(([k]) => !LISTED_FIXED.has(k))) : {}),
299
+ ...(raw ?? {}),
300
+ }),
301
+ };
302
+ }
303
+ const probeFailure = (error, refused = false) => ({
304
+ ok: false,
305
+ refused,
306
+ accountRef: null,
307
+ accountLabel: null,
308
+ facts: [],
309
+ error: error.slice(0, USE_ERROR_MAX),
310
+ });
311
+ /** A probe call's outcome as the probe routes read it. */
312
+ function probeOf(outcome) {
313
+ if (!outcome.ok)
314
+ return probeFailure(outcome.error, outcome.refused);
315
+ const probe = connectionProbe.safeParse(outcome.result);
316
+ return probe.success ? probe.data : probeFailure('the connector answered a probe that does not read as one');
317
+ }
318
+ function scopeBindingOf(connection, b) {
319
+ return {
320
+ ...b.options,
321
+ operation: b.operation,
322
+ permission: b.permission,
323
+ tenantId: connection.tenantId,
324
+ scopeId: b.scopeId,
325
+ vertical: connection.vertical,
326
+ boundAt: b.boundAt,
327
+ };
328
+ }
329
+ /**
330
+ * What the inspection routes and the relay's connect-time gate ask of a vertical-defined provider,
331
+ * for one (tenant, vertical). `activity`, `credential` and `certificate` are absent, so those
332
+ * routes keep answering 501 / 404 for such a connection.
333
+ */
334
+ export function verticalConnectorInspector(deps, provider, context) {
335
+ return {
336
+ // A probe that cannot run is an answer the verify route shows, never a 500.
337
+ probe: async (host, connection) => {
338
+ try {
339
+ const resolved = await deps.resolve({ tenantId: connection.tenantId, vertical: connection.vertical, scopeId: null, provider: connection.provider });
340
+ if ('refused' in resolved)
341
+ return probeFailure(resolved.refused);
342
+ const opened = await openFor(deps, connection);
343
+ const state = await stateOf(host, connection.id, null);
344
+ return probeOf(await applyConnectorCall(deps, connection.id, null, resolved.target, { role: 'probe', provider: connection.provider, connection: opened, state }));
345
+ }
346
+ catch (e) {
347
+ return probeFailure(`the probe could not run: ${message(e)}`);
348
+ }
349
+ },
350
+ // To the vertical's serving deployment (§6.3), so not the asking scope's. No connection exists
351
+ // yet, so nothing is recorded and no state is applied.
352
+ probeCandidate: async (secret) => {
353
+ const resolved = await deps.resolve({ tenantId: context.tenantId, vertical: context.vertical, scopeId: null, provider });
354
+ if ('refused' in resolved)
355
+ return probeFailure(resolved.refused);
356
+ let answer;
357
+ try {
358
+ answer = await deps.call(resolved.target, { role: 'probe-candidate', provider, secret });
359
+ }
360
+ catch (e) {
361
+ return probeFailure(`the call into the vertical's connector did not complete: ${message(e)}`);
362
+ }
363
+ if (answer.status !== 200)
364
+ return probeFailure(`the vertical's connector answered HTTP ${answer.status}`);
365
+ const parsed = connectorCallResponse.safeParse(answer.body);
366
+ if (!parsed.success)
367
+ return probeFailure("the vertical's connector answered something that is not a connector-call response");
368
+ const r = parsed.data;
369
+ return probeOf(r.ok ? { ok: true, result: r.result } : { ok: false, refused: r.refused, error: r.error });
370
+ },
371
+ bindScope: async (host, connection, target) => scopeBindingOf(connection, await bindScope(deps, host, connection, target)),
372
+ bindings: async (host, connection) => (await storedBindings(host, connection.id)).map((b) => scopeBindingOf(connection, b)),
373
+ };
374
+ }
375
+ /**
376
+ * The `connector:<namespace>.<name>` handler: one routed event, dispatched into the drained scope's
377
+ * own deployment with that scope's binding (or none) and state. Expressed as
378
+ * `connectorDispatchHandler` expresses its outcomes: a refusal settles `failed`, anything retryable
379
+ * throws (the drain settles it `pending`), and a delivered event is `done`.
380
+ */
381
+ export function verticalConnectorDispatchHandler(deps) {
382
+ return async (ctx, request) => {
383
+ const provider = request.kind.slice(CONNECTOR_DISPATCH_KIND_PREFIX.length);
384
+ const payload = connectorDispatchPayload.parse(request.payload);
385
+ if (payload.event.tenantId !== ctx.tenantId || payload.event.scopeId !== ctx.scopeId) {
386
+ return {
387
+ status: 'failed',
388
+ error: `routed event ${payload.event.id} is stamped (${payload.event.tenantId}, ${payload.event.scopeId}), ` +
389
+ `which is not the drained scope (${ctx.tenantId}, ${ctx.scopeId})`,
390
+ };
391
+ }
392
+ const rows = await deps.host.admin.listConnections(deps.actor, { tenantId: ctx.tenantId, vertical: ctx.vertical, provider });
393
+ if (rows.length !== 1) {
394
+ throw new Error(rows.length === 0
395
+ ? `no live '${provider}' connection for tenant ${ctx.tenantId} / vertical '${ctx.vertical}'`
396
+ : `tenant ${ctx.tenantId} holds ${rows.length} live '${provider}' connections for vertical '${ctx.vertical}'; a routed event names none of them`);
397
+ }
398
+ const row = rows[0];
399
+ const resolved = await deps.resolve({ tenantId: ctx.tenantId, vertical: ctx.vertical, scopeId: ctx.scopeId, provider });
400
+ if ('refused' in resolved)
401
+ throw new Error(resolved.refused);
402
+ const opened = await openFor(deps, row);
403
+ const stored = await deps.host.admin.getConnectorState(row.id, verticalConnectorBindingKey(ctx.scopeId));
404
+ let binding = null;
405
+ if (stored !== undefined && stored !== null) {
406
+ const parsed = verticalConnectorBinding.safeParse(stored);
407
+ if (!parsed.success)
408
+ throw new Error(`the stored binding of connection ${row.id} to scope ${ctx.scopeId} does not read as one`);
409
+ binding = parsed.data;
410
+ }
411
+ const state = await stateOf(deps.host, row.id, ctx.scopeId);
412
+ const outcome = await applyConnectorCall(deps, row.id, ctx.scopeId, resolved.target, {
413
+ role: 'dispatch',
414
+ provider,
415
+ connection: opened,
416
+ scopeId: ctx.scopeId,
417
+ binding,
418
+ event: payload.event,
419
+ state,
420
+ });
421
+ if (outcome.ok)
422
+ return { status: 'done', result: { eventId: payload.event.id } };
423
+ if (outcome.refused)
424
+ return { status: 'failed', error: `the ${provider} connector refused event ${payload.event.id}: ${outcome.error}` };
425
+ throw new Error(outcome.error);
426
+ };
427
+ }
428
+ //# sourceMappingURL=vertical-connectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-connectors.js","sourceRoot":"","sources":["../src/vertical-connectors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,EACjC,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,8BAA8B,EAC9B,6BAA6B,EAC7B,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,OAAO,IAAI,aAAa,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,4BAA4B,GAc7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAqF,MAAM,sBAAsB,CAAC;AAoD3J,4FAA4F;AAC5F,MAAM,UAAU,wBAAwB,CACtC,IAAwH,EACxH,KAAsB;IAEtB,OAAO;QACL,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;QACjF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAClE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,EAAE,SAAS,IAAI,IAAI;QACxI,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;QACnF,UAAU,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC;KACjF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAA6B,EAC7B,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAmD;IAE1F,IAAI,SAAwB,CAAC;IAC7B,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,OAAO,0BAA0B,QAAQ,eAAe,QAAQ,EAAE,EAAE,CAAC;QAC3I,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,OAAO,8DAA8D,EAAE,CAAC;QAC/H,0FAA0F;QAC1F,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,aAAa,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAC9B,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,QAAQ,SAAS,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;IAChH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,WAAW,SAAS,QAAQ,QAAQ,0BAA0B,EAAE,CAAC;IACjG,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC;IACxC,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,OAAO,EAAE,WAAW,SAAS,QAAQ,QAAQ,qBAAqB,EAAE,CAAC;IAClG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,SAAS,QAAQ,QAAQ,8BAA8B,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IACnJ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,OAAO,EAAE,WAAW,SAAS,QAAQ,QAAQ,qCAAqC,QAAQ,GAAG,EAAE,CAAC;IAC3H,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAE,CAAC;AACtH,CAAC;AAKD,MAAM,OAAO,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B;;;;GAIG;AACH,KAAK,UAAU,OAAO,CAAC,IAAyC,EAAE,GAAkB;IAClF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC,CAAC;IACjI,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,QAAQ,2BAA2B,GAAG,CAAC,QAAQ,gBAAgB,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC3H,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,cAAc,GAAG,CAAC,EAAE,qBAAqB,GAAG,CAAC,QAAQ,2BAA2B,GAAG,CAAC,QAAQ,cAAc;YACxG,IAAI,GAAG,CAAC,QAAQ,cAAc,IAAI,CAAC,EAAE,qEAAqE,CAC7G,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAiC,CAAC,EAAE,CAAC;QAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,CAAC,EAAE,oCAAoC,GAAG,wDAAwD,CAAC,CAAC;QAChK,CAAC;IACH,CAAC;IACD,OAAO,uBAAuB,CAAC,KAAK,CAAC;QACnC,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;QAC1C,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;AACL,CAAC;AAED,0GAA0G;AAC1G,KAAK,UAAU,OAAO,CAAC,IAAe,EAAE,EAAgB,EAAE,OAAsB;IAC9E,MAAM,MAAM,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CACzC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CACvG,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,0BAA0B,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,2BAA2B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,SAAS,EAAE,CAC5J,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAA2B,EAC3B,YAA0B,EAC1B,OAAsB,EACtB,MAA+B,EAC/B,OAA6B;IAE7B,MAAM,UAAU,GAAG,KAAK,EAAE,KAAa,EAAwB,EAAE;QAC/D,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;QAC7G,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC,CAAC;IACF,IAAI,MAAyC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,UAAU,CAAC,4DAA4D,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,UAAU,CAAC,0CAA0C,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC,mFAAmF,CAAC,CAAC;IAC5H,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7B,8FAA8F;IAC9F,4BAA4B;IAC5B,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI;YAAE,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAChG,CAAC,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,UAAU,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzE,CAAC;IACD,6FAA6F;IAC7F,2FAA2F;IAC3F,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtH,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,UAAU,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,YAAY,EAAE,yBAAyB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3I,CAAC;IACD,MAAM,UAAU,EAAE,CAAC;IACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAe,EACf,EAAgB,EAChB,OAAsB,EACtB,MAAkD;IAElD,MAAM,MAAM,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC;QAAE,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACvI,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;;YAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/F,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,CACL,uDAAuD,6BAA6B,UAAU,8BAA8B,SAAS;QACrI,oBAAoB,MAAM,CAAC,IAAI,4DAA4D,CAC5F,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,KAAK,UAAU,cAAc,CAAC,IAAe,EAAE,EAAgB;IAC7D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC;IACxF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAA2B,EAAE,UAAsB;IAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;QACnC,IAAI,YAAY,KAAK,UAAU,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC;QACnI,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QAC1I,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,MAAM,CAAC,CAAC;YACxE,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,OAAO,GAAG,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9D,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;gBAC3E,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACpK,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;oBAClD,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;oBACjC,wFAAwF;oBACxF,KAAK,IAAI,CAAC,CAAC;oBACX,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE;oBACtF,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,UAAU,EAAE,MAAM;oBAClB,OAAO,EAAE,OAAO,CAAC,IAAI;oBACrB,KAAK;iBACN,CAAC,CAAC;gBACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;oBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC/C,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC9D,IAAI,MAAM,CAAC,OAAO;oBAAE,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;;oBAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,iEAAiE,EAAE,CAAC,CAAC;YAC1G,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAKD;;;;GAIG;AACH,KAAK,UAAU,SAAS,CAAC,IAA2B,EAAE,IAAe,EAAE,UAAsB,EAAE,MAAkB;IAC/G,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC;IACxF,IAAI,QAAQ,KAAK,UAAU,CAAC,QAAQ,IAAI,QAAQ,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,sBAAsB,UAAU,CAAC,QAAQ,gBAAgB,UAAU,CAAC,QAAQ,uBAAuB,CAAC,CAAC;IAClJ,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CACb,cAAc,UAAU,CAAC,EAAE,mBAAmB,UAAU,cAAc,OAAO,kCAAkC;YAC7G,gDAAgD,CACnD,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9I,IAAI,SAAS,IAAI,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,OAAO,GAA4B,GAAG,CAAC;IAC3C,IAAI,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE;YACtF,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC;YAC3C,OAAO;YACP,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,UAAU,CAAC,QAAQ,cAAc,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,iBAAiB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7J,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,UAAU,CAAC,QAAQ,yDAAyD,CAAC,CAAC;QAC1H,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,oEAAoE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5I,CAAC;IACD,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChI,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,EAAE,2BAA2B,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;AAErE;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAA2B;IACjE,OAAO;QACL,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAC/B,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACnJ,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC;QAC7E,8FAA8F;QAC9F,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;SACf,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,OAAO,GAAG,KAAK,EAAmB,EAAE,CAAC,CAAC;IACzE,EAAE,EAAE,KAAK;IACT,OAAO;IACP,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC;CACrC,CAAC,CAAC;AAEH,0DAA0D;AAC1D,SAAS,OAAO,CAAC,OAAoB;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,0DAA0D,CAAC,CAAC;AAC/G,CAAC;AAED,SAAS,cAAc,CAAC,UAAsB,EAAE,CAA2B;IACzE,OAAO;QACL,GAAG,CAAC,CAAC,OAAO;QACZ,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAA2B,EAC3B,QAAgB,EAChB,OAA0E;IAE1E,OAAO;QACL,4EAA4E;QAC5E,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACpJ,IAAI,SAAS,IAAI,QAAQ;oBAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACvD,OAAO,OAAO,CACZ,MAAM,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAClJ,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,YAAY,CAAC,4BAA4B,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,+FAA+F;QAC/F,uDAAuD;QACvD,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzH,IAAI,SAAS,IAAI,QAAQ;gBAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,MAAyC,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,YAAY,CAAC,4DAA4D,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChG,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,YAAY,CAAC,0CAA0C,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1G,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,YAAY,CAAC,mFAAmF,CAAC,CAAC;YAC9H,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;YACtB,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAA+B,CAAC,CAAC;QACnJ,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;KAC5H,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAAC,IAA2B;IAC1E,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;YACrF,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,KAAK,EACH,gBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,gBAAgB,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK;oBACrG,mCAAmC,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,OAAO,GAAG;aACrE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7H,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,MAAM,KAAK,CAAC;gBACf,CAAC,CAAC,YAAY,QAAQ,2BAA2B,GAAG,CAAC,QAAQ,gBAAgB,GAAG,CAAC,QAAQ,GAAG;gBAC5F,CAAC,CAAC,UAAU,GAAG,CAAC,QAAQ,UAAU,IAAI,CAAC,MAAM,UAAU,QAAQ,+BAA+B,GAAG,CAAC,QAAQ,sCAAsC,CACnJ,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxH,IAAI,SAAS,IAAI,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACzG,IAAI,OAAO,GAAoC,IAAI,CAAC;QACpD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC;YAChI,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE;YACnF,IAAI,EAAE,UAAU;YAChB,QAAQ;YACR,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK;SACN,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QACjF,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,QAAQ,4BAA4B,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACzI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@substrat-run/control-plane-api",
3
- "version": "0.163.0",
3
+ "version": "0.165.0",
4
4
  "description": "HTTP surface over HostAdmin — the audited control-plane transport (control-plane.md §4.5)",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
@@ -27,9 +27,9 @@
27
27
  ],
28
28
  "dependencies": {
29
29
  "hono": "^4.13.13",
30
- "@substrat-run/contracts": "^0.163.0",
31
- "@substrat-run/control-plane-client": "^0.3.14",
32
- "@substrat-run/kernel": "^0.163.0",
30
+ "@substrat-run/contracts": "^0.165.0",
31
+ "@substrat-run/kernel": "^0.165.0",
32
+ "@substrat-run/control-plane-client": "^0.3.16",
33
33
  "@substrat-run/psl": "^0.2.5"
34
34
  },
35
35
  "devDependencies": {
@@ -43,10 +43,10 @@
43
43
  "tsx": "^4.19.0",
44
44
  "typescript": "^7.0.0",
45
45
  "vitest": "^5.0.5",
46
- "@substrat-run/adapter-sqlite": "^0.163.0",
47
- "@substrat-run/connector-fortnox": "^0.4.65",
48
- "@substrat-run/vertical-host": "^0.163.0",
49
- "@substrat-run/connector-planima": "^0.2.60"
46
+ "@substrat-run/adapter-sqlite": "^0.165.0",
47
+ "@substrat-run/connector-fortnox": "^0.4.67",
48
+ "@substrat-run/connector-planima": "^0.2.62",
49
+ "@substrat-run/vertical-host": "^0.165.0"
50
50
  },
51
51
  "publishConfig": {
52
52
  "access": "public"