@g9tm/syncdata 1.5.4 → 1.5.5
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.
- package/dist/client/engine.js +8 -1
- package/dist/client/engine.js.map +1 -1
- package/dist/client/runs.d.ts +4 -0
- package/dist/client/runs.js +1 -0
- package/dist/client/runs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/client/engine.js
CHANGED
|
@@ -438,6 +438,7 @@ export class G9SyncEngine {
|
|
|
438
438
|
let modelProblems = [];
|
|
439
439
|
const synced = [];
|
|
440
440
|
let pushed = 0;
|
|
441
|
+
let accepted = 0;
|
|
441
442
|
let rejected = 0;
|
|
442
443
|
let conflicts = 0;
|
|
443
444
|
let downloaded = 0;
|
|
@@ -513,6 +514,7 @@ export class G9SyncEngine {
|
|
|
513
514
|
try {
|
|
514
515
|
const totals = await this._pushAll(negotiated, subscriptions, hello.maxPushRows, hello.maxPushBytes, tracker, changes, ct);
|
|
515
516
|
pushed = totals.pushed;
|
|
517
|
+
accepted = totals.accepted;
|
|
516
518
|
rejected = totals.rejected;
|
|
517
519
|
conflicts = totals.conflicts;
|
|
518
520
|
}
|
|
@@ -715,6 +717,7 @@ export class G9SyncEngine {
|
|
|
715
717
|
outcome,
|
|
716
718
|
error,
|
|
717
719
|
pushed,
|
|
720
|
+
accepted,
|
|
718
721
|
rejected,
|
|
719
722
|
conflicts,
|
|
720
723
|
downloaded,
|
|
@@ -817,6 +820,7 @@ export class G9SyncEngine {
|
|
|
817
820
|
}
|
|
818
821
|
async _pushAll(negotiated, subscriptions, serverMaxRows, serverMaxBytes, tracker, changes, ct) {
|
|
819
822
|
let pushed = 0;
|
|
823
|
+
let accepted = 0;
|
|
820
824
|
let rejected = 0;
|
|
821
825
|
let conflicts = 0;
|
|
822
826
|
const references = subscriptions.map(toSubscriptionRef);
|
|
@@ -864,6 +868,9 @@ export class G9SyncEngine {
|
|
|
864
868
|
if (report.upserts + report.deletes > 0)
|
|
865
869
|
this._raiseRowsApplied(report, G9ESyncPhase.Pushing);
|
|
866
870
|
pushed += batch.rowCount + batch.commands.length;
|
|
871
|
+
// What the server TOOK (its acknowledgement), not "sent minus refused": a row refused on the device (too large) is in
|
|
872
|
+
// `rejected` but was never sent (LES-0071).
|
|
873
|
+
accepted += report.accepted + report.commandsCompleted;
|
|
867
874
|
rejected += result.rejections.length;
|
|
868
875
|
conflicts += result.conflicts.length;
|
|
869
876
|
tracker.report(pushed);
|
|
@@ -878,7 +885,7 @@ export class G9SyncEngine {
|
|
|
878
885
|
if (batchRows < targetRows)
|
|
879
886
|
batchRows = Math.min(targetRows, batchRows * 2);
|
|
880
887
|
}
|
|
881
|
-
return { pushed, rejected, conflicts };
|
|
888
|
+
return { pushed, accepted, rejected, conflicts };
|
|
882
889
|
}
|
|
883
890
|
async _download(runId, plan, tracker, ct) {
|
|
884
891
|
var _a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/client/engine.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client/G9CSyncEngine.cs, .Execution.cs and .Reconcile.cs: one engine per local database, with a\r\n// prioritised run queue (status queries never wait for a running sync) and background runs that yield to user runs.\r\nimport { G9EMoveOutPolicy, G9ESyncDirection } from '../abstractions/enums.js';\r\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\r\nimport { guidToN, newGuid } from '../abstractions/guid.js';\r\nimport { G9SyncParameters, compareOrdinal } from '../abstractions/parameters.js';\r\nimport type { G9Long } from '../abstractions/long.js';\r\nimport { delay, linkSignals, onAbort } from '../internal/abort.js';\r\nimport { sha256, toHex } from '../internal/sha256.js';\r\nimport { utf8Encode } from '../internal/utf8.js';\r\nimport {\r\n G9EPullPartKind,\r\n G9ESubscriptionAction,\r\n type G9DtChangesAvailable,\r\n type G9DtHelloResult,\r\n type G9DtNegotiatedTable,\r\n type G9DtPullPlan,\r\n type G9DtPushRequest,\r\n type G9DtPushResult,\r\n type G9DtReconcileRequest,\r\n type G9DtReconcileSummary,\r\n type G9DtSubscriptionDefinition,\r\n type G9DtSubscriptionState,\r\n type G9DtSyncChunk,\r\n syncErrorToException,\r\n} from '../protocol/dtos.js';\r\nimport { openRowBatch } from '../protocol/rowBatch/reader.js';\r\nimport type { G9SyncClientModel } from './model.js';\r\nimport { G9ESyncPhase, G9SyncProgressTracker, phaseName } from './progress.js';\r\nimport {\r\n G9ESyncOutcome,\r\n G9ESyncPriority,\r\n G9SyncRun,\r\n canCoalesce,\r\n describeModelProblem,\r\n isTransientError,\r\n makeRunResult,\r\n normalizeError,\r\n outcomeName,\r\n priorityName,\r\n requestSignature,\r\n resolveEngineOptions,\r\n resolveRequest,\r\n type G9ResolvedEngineOptions,\r\n type G9ResolvedSyncRequest,\r\n type G9RowsAppliedEvent,\r\n type G9SubscriptionOptions,\r\n type G9SyncEngineOptions,\r\n type G9SyncHealth,\r\n type G9SyncLogLevel,\r\n type G9SyncModelProblem,\r\n type G9SyncRequest,\r\n type G9SyncRunResult,\r\n} from './runs.js';\r\nimport {\r\n G9ApplyReport,\r\n G9ESubscriptionState,\r\n toSubscriptionRef,\r\n type G9ApplySlice,\r\n type G9ChangeFeedEntry,\r\n type G9ChangeFeedKeyFilter,\r\n validateChangeFeedKeyFilter,\r\n type G9LocalCommand,\r\n type G9LocalCommandWriter,\r\n type G9ELocalCommandState,\r\n type G9LocalRowEntry,\r\n type G9PendingSummary,\r\n type G9PushBatch,\r\n type G9QuarantinedRow,\r\n type G9RetainedRow,\r\n type G9SyncClientStore,\r\n type G9SyncRejection,\r\n type G9SyncRunReport,\r\n type G9SyncSubscriptionRecord,\r\n} from './storeTypes.js';\r\nimport type { G9SyncTransport } from './transport.js';\r\n\r\nconst STAT_CONNECTING = 'Connecting';\r\nconst STAT_PLANNING = 'Planning';\r\nconst STAT_PUSH_PER_K_ROW = 'PushPerKRow';\r\nconst STAT_DOWNLOAD_PER_K_ROW = 'DownloadPerKRow';\r\nconst STAT_APPLY_PER_K_ROW = 'ApplyPerKRow';\r\nconst STAT_RECONCILE_PER_SUBSCRIPTION = 'ReconcilePerSubscription';\r\n\r\ninterface QueuedRun {\r\n run: G9SyncRun;\r\n priority: number;\r\n order: number;\r\n}\r\n\r\n/**\r\n * The client sync engine (`G9CSyncEngine`): one per local database. Owns a prioritised run queue, so status queries\r\n * never wait for a running sync and background runs yield to user runs.\r\n */\r\nexport class G9SyncEngine {\r\n readonly model: G9SyncClientModel;\r\n private readonly _store: G9SyncClientStore;\r\n private readonly _transport: G9SyncTransport;\r\n private readonly _options: G9ResolvedEngineOptions;\r\n private readonly _lifetime = linkSignals();\r\n private readonly _queue: QueuedRun[] = [];\r\n private readonly _pokedTables: { [lower: string]: string } = {};\r\n private readonly _rowsAppliedListeners: ((event: G9RowsAppliedEvent) => void)[] = [];\r\n private readonly _runCompletedListeners: ((result: G9SyncRunResult) => void)[] = [];\r\n private readonly _unsubscribePokes: () => void;\r\n\r\n private _initialized = false;\r\n private _initializing: Promise<void> | null = null;\r\n private _clientId = '';\r\n private _order = 0;\r\n private _current: G9SyncRun | null = null;\r\n private _suppressions = 0;\r\n private _autoTimer: ReturnType<typeof setInterval> | null = null;\r\n private _pokeTimer: ReturnType<typeof setTimeout> | null = null;\r\n private _wake: (() => void) | null = null;\r\n private _worker: Promise<void> | null = null;\r\n private _disposed = false;\r\n /** The model problems last logged, so the warning is said once per distinct set (ADR-0061). */\r\n private _reportedModelProblems: string | null = null;\r\n\r\n constructor(store: G9SyncClientStore, transport: G9SyncTransport, model: G9SyncClientModel, options?: G9SyncEngineOptions) {\r\n if (!store) throw new TypeError('A store is required.');\r\n if (!transport) throw new TypeError('A transport is required.');\r\n if (!model) throw new TypeError('A model is required.');\r\n this._store = store;\r\n this._transport = transport;\r\n this.model = model;\r\n this._options = resolveEngineOptions(options);\r\n this._unsubscribePokes = transport.onChangesAvailable((changes) => this._onChangesAvailable(changes));\r\n }\r\n\r\n get clientId(): string {\r\n if (!this._initialized) throw new Error('Call initialize first.');\r\n return this._clientId;\r\n }\r\n\r\n get isRunning(): boolean {\r\n return this._current !== null;\r\n }\r\n\r\n get queuedRuns(): number {\r\n return this._queue.length;\r\n }\r\n\r\n get isBackgroundSuppressed(): boolean {\r\n return this._suppressions > 0;\r\n }\r\n\r\n /** Raised after rows were written locally (download, reconciliation or canonical push results). Returns the unsubscribe function. */\r\n onRowsApplied(listener: (event: G9RowsAppliedEvent) => void): () => void {\r\n this._rowsAppliedListeners.push(listener);\r\n return () => remove(this._rowsAppliedListeners, listener);\r\n }\r\n\r\n onRunCompleted(listener: (result: G9SyncRunResult) => void): () => void {\r\n this._runCompletedListeners.push(listener);\r\n return () => remove(this._runCompletedListeners, listener);\r\n }\r\n\r\n /** Provisions local tables and capture, and starts the run worker. Idempotent. */\r\n initialize(signal?: AbortSignal): Promise<void> {\r\n if (this._initialized) return Promise.resolve();\r\n if (!this._initializing) {\r\n this._initializing = (async () => {\r\n try {\r\n await this._store.initialize(this.model, signal);\r\n this._clientId = await this._store.getClientId(signal);\r\n this._initialized = true;\r\n this._worker = this._workerLoop();\r\n } finally {\r\n if (!this._initialized) this._initializing = null;\r\n }\r\n })();\r\n }\r\n return this._initializing;\r\n }\r\n\r\n // ================================================================ subscriptions\r\n\r\n /** Adds (or returns) a subscription. Its rows arrive on the next run that includes it. */\r\n async subscribe(name: string, parameters?: G9SyncParameters | null, options?: G9SubscriptionOptions | null, signal?: AbortSignal): Promise<G9SyncSubscriptionRecord> {\r\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A subscription name is required.');\r\n await this.initialize(signal);\r\n const state = await this._store.getServerState(signal);\r\n const definition = state.definitions.find((d) => d.name === name) ?? null;\r\n const ephemeral = options?.ephemeral ?? definition?.ephemeral ?? false;\r\n const ttlMs = options?.ttlMs ?? (definition && definition.ephemeral && definition.ttlSeconds > 0 ? definition.ttlSeconds * 1000 : null);\r\n const record = await this._store.ensureSubscription(name, parameters ?? new G9SyncParameters(), ephemeral, ttlMs, options?.adoptExistingRows ?? false, signal);\r\n await this._store.updateSubscription(record.key, { accessed: true }, signal);\r\n return record;\r\n }\r\n\r\n /** Removes a subscription; rows no other subscription holds follow the server's move-out policy. */\r\n async unsubscribe(name: string, parameters?: G9SyncParameters | null, signal?: AbortSignal): Promise<void> {\r\n await this.initialize(signal);\r\n const state = await this._store.getServerState(signal);\r\n const policy = state.definitions.find((d) => d.name === name)?.moveOutPolicy ?? G9EMoveOutPolicy.Delete;\r\n await this._store.removeSubscription(G9SyncParameters.buildSubscriptionKey(name, parameters ?? null), policy, signal);\r\n }\r\n\r\n async getSubscriptions(signal?: AbortSignal): Promise<G9SyncSubscriptionRecord[]> {\r\n await this.initialize(signal);\r\n return this._store.getSubscriptions(signal);\r\n }\r\n\r\n // ================================================================ runs\r\n\r\n /** Queues a run. Identical plain requests already waiting are coalesced into one run. */\r\n run(request?: G9SyncRequest | null): G9SyncRun {\r\n if (!this._initialized) throw new Error('Call initialize first.');\r\n const resolved = resolveRequest(request);\r\n if (canCoalesce(resolved)) {\r\n const signature = requestSignature(resolved);\r\n for (const queued of this._queue) {\r\n const r = queued.run;\r\n if (!r.isStarted && canCoalesce(r.request) && r.request.priority === resolved.priority && requestSignature(r.request) === signature) return r;\r\n }\r\n }\r\n const run = new G9SyncRun(resolved);\r\n this._queue.push({ run, priority: resolved.priority, order: this._order++ });\r\n const current = this._current;\r\n let preempted: G9SyncRun | null = null;\r\n if (current !== null && current.request.priority === G9ESyncPriority.Background && resolved.priority > G9ESyncPriority.Background) {\r\n current.preempted = true;\r\n preempted = current;\r\n }\r\n this._signal();\r\n if (preempted) {\r\n preempted.cancel();\r\n this._log('information', 20001, `Background run ${preempted.runId} pre-empted by run ${run.runId}`);\r\n }\r\n return run;\r\n }\r\n\r\n /** Queues a run and awaits its result. */\r\n sync(request?: G9SyncRequest | null): Promise<G9SyncRunResult> {\r\n return this.run(request).completion;\r\n }\r\n\r\n /** While the returned scope is alive, background runs are skipped. Call the returned function to end it. */\r\n suppressBackground(): () => void {\r\n this._suppressions++;\r\n let done = false;\r\n return () => {\r\n if (done) return;\r\n done = true;\r\n this._suppressions--;\r\n };\r\n }\r\n\r\n /** Queues a background push+pull of every non-heavy subscription on a fixed interval. */\r\n startAutomaticSync(intervalMs: number): void {\r\n if (!(intervalMs > 0)) throw new RangeError('The interval must be positive.');\r\n this.stopAutomaticSync();\r\n this._autoTimer = setInterval(() => this._tryQueueBackground(null), intervalMs);\r\n }\r\n\r\n stopAutomaticSync(): void {\r\n if (this._autoTimer !== null) {\r\n clearInterval(this._autoTimer);\r\n this._autoTimer = null;\r\n }\r\n }\r\n\r\n // ================================================================ queries\r\n\r\n /**\r\n * Records a command (ADR-0025): the server executes the handler registered for `name` on the next push, once, in\r\n * device order. `applyLocally` writes its local effects immediately, in the same transaction.\r\n */\r\n async executeCommand(\r\n name: string,\r\n payloadJson: string,\r\n applyLocally?: ((writer: G9LocalCommandWriter, signal?: AbortSignal) => Promise<void>) | null,\r\n version = 1,\r\n signal?: AbortSignal,\r\n ): Promise<G9LocalCommand> {\r\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A command name is required.');\r\n if (typeof payloadJson !== 'string') throw new TypeError('The payload JSON is required.');\r\n await this.initialize(signal);\r\n return this._store.enqueueCommand({ name, version, payload: payloadJson }, applyLocally ?? null, signal);\r\n }\r\n\r\n /** Frees space taken by an UPLOAD-ONLY table: removes uploaded rows without uploading a delete. */\r\n async forgetUploadedRows(localTable: string, keys?: readonly string[] | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.forgetUploadedRows(localTable, keys ?? null, signal);\r\n }\r\n\r\n async getCommands(state?: G9ELocalCommandState | null, limit = 200, signal?: AbortSignal): Promise<G9LocalCommand[]> {\r\n await this.initialize(signal);\r\n return this._store.getCommands(state ?? null, limit, signal);\r\n }\r\n\r\n async getPendingSummary(signal?: AbortSignal): Promise<G9PendingSummary> {\r\n await this.initialize(signal);\r\n return this._store.getPendingSummary(signal);\r\n }\r\n\r\n async getRejections(signal?: AbortSignal): Promise<G9SyncRejection[]> {\r\n await this.initialize(signal);\r\n return this._store.getRejections(signal);\r\n }\r\n\r\n async getQuarantined(signal?: AbortSignal): Promise<G9QuarantinedRow[]> {\r\n await this.initialize(signal);\r\n return this._store.getQuarantined(signal);\r\n }\r\n\r\n async restoreQuarantined(localTable: string, key: string, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.restoreQuarantined(localTable, key, signal);\r\n }\r\n\r\n /** Throws away every staged pull, so the next run plans afresh. Returns whether there was one. */\r\n async discardStagedPull(signal?: AbortSignal): Promise<boolean> {\r\n await this.initialize(signal);\r\n return (await this._store.discardAllStagedPulls(signal)) > 0;\r\n }\r\n\r\n async discardQuarantined(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.discardQuarantined(localTable ?? null, key ?? null, signal);\r\n }\r\n\r\n async getRetained(signal?: AbortSignal): Promise<G9RetainedRow[]> {\r\n await this.initialize(signal);\r\n return this._store.getRetained(signal);\r\n }\r\n\r\n async retryRejected(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.retryRejected(localTable ?? null, key ?? null, signal);\r\n }\r\n\r\n /**\r\n * Gives up the local change of rejected rows and takes the server's copy (LES-0070, .NET `RevertRejectedAsync`): a row the server\r\n * never had is removed locally, any other is fetched again by the next run with `forceReconcile` - run one after this. Nothing is\r\n * uploaded. Omitted arguments widen the scope.\r\n */\r\n async revertRejected(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.revertRejected(localTable ?? null, key ?? null, signal);\r\n }\r\n\r\n async readChangeFeed(localTable: string, afterSequence: number, limit = 1000, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]> {\r\n await this.initialize(signal);\r\n return this._store.readChangeFeed(localTable, afterSequence, limit, signal);\r\n }\r\n\r\n /**\r\n * The change feed for one table narrowed to the keys `keyFilter` selects (plus every deletion), so a projection of one site does\r\n * not walk the entries of every other one (`ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`).\r\n */\r\n async readChangeFeedFiltered(localTable: string, afterSequence: number, limit: number, keyFilter: G9ChangeFeedKeyFilter, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]> {\r\n validateChangeFeedKeyFilter(keyFilter);\r\n await this.initialize(signal);\r\n return this._store.readChangeFeedFiltered(localTable, afterSequence, limit, keyFilter, signal);\r\n }\r\n\r\n /** The highest sequence readChangeFeed can return today (a watermark above it belongs to a store that no longer exists). */\r\n async getChangeSequence(signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.getChangeSequence(signal);\r\n }\r\n\r\n /** The highest sequence ever purged from the change feed; 0 when nothing was (ADR-0059). */\r\n async getChangeFeedFloor(signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.getChangeFeedFloor(signal);\r\n }\r\n\r\n async adoptExistingRows(signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.adoptExistingRows(signal);\r\n }\r\n\r\n async markDirty(localTable: string, keys: readonly string[], signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.markDirty(localTable, keys, signal);\r\n }\r\n\r\n async getHealth(signal?: AbortSignal): Promise<G9SyncHealth> {\r\n await this.initialize(signal);\r\n const state = await this._store.getServerState(signal);\r\n return {\r\n clientId: this._clientId,\r\n isConnected: this._transport.isConnected,\r\n isRunning: this.isRunning,\r\n queuedRuns: this.queuedRuns,\r\n serverEpoch: state.epoch,\r\n lastHelloUtcMs: state.lastHelloUtcMs,\r\n pending: await this._store.getPendingSummary(signal),\r\n subscriptions: await this._store.getSubscriptions(signal),\r\n recentRuns: await this._store.getRecentRunReports(10, signal),\r\n };\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n this.stopAutomaticSync();\r\n this._unsubscribePokes();\r\n this._lifetime.abort();\r\n const abandoned = this._queue.splice(0, this._queue.length);\r\n for (const { run } of abandoned) {\r\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'The sync engine was disposed.') }));\r\n }\r\n this._current?.cancel();\r\n this._signal();\r\n if (this._worker) {\r\n try {\r\n await this._worker;\r\n } catch {\r\n // shutting down\r\n }\r\n }\r\n if (this._pokeTimer !== null) {\r\n clearTimeout(this._pokeTimer);\r\n this._pokeTimer = null;\r\n }\r\n }\r\n\r\n // ================================================================ worker\r\n\r\n private _signal(): void {\r\n const wake = this._wake;\r\n this._wake = null;\r\n if (wake) wake();\r\n }\r\n\r\n private _dequeue(): G9SyncRun | null {\r\n if (this._queue.length === 0) return null;\r\n let best = 0;\r\n for (let i = 1; i < this._queue.length; i++) {\r\n const a = this._queue[i] as QueuedRun;\r\n const b = this._queue[best] as QueuedRun;\r\n if (a.priority > b.priority || (a.priority === b.priority && a.order < b.order)) best = i;\r\n }\r\n return (this._queue.splice(best, 1)[0] as QueuedRun).run;\r\n }\r\n\r\n private async _workerLoop(): Promise<void> {\r\n while (!this._lifetime.signal.aborted) {\r\n const run = this._dequeue();\r\n if (!run) {\r\n await new Promise<void>((resolve) => {\r\n this._wake = resolve;\r\n });\r\n continue;\r\n }\r\n run.isStarted = true;\r\n this._current = run;\r\n try {\r\n await this._executeRun(run);\r\n } catch (exception) {\r\n this._log('error', 20002, `Unexpected failure executing run ${run.runId}`, exception);\r\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Failed, error: normalizeError(exception) }));\r\n } finally {\r\n this._current = null;\r\n }\r\n // A pre-empted background run still owes its work: queue it again behind the run that pre-empted it.\r\n if (run.preempted && run.request.priority === G9ESyncPriority.Background) this._tryQueueBackground(run.request.subscriptions);\r\n }\r\n }\r\n\r\n private _tryQueueBackground(subscriptions: readonly string[] | null): void {\r\n if (!this._initialized || this.isBackgroundSuppressed || (this._options.hooks && !this._options.hooks.isNetworkAvailable) || this._lifetime.signal.aborted) {\r\n return;\r\n }\r\n this.run({ priority: G9ESyncPriority.Background, subscriptions });\r\n }\r\n\r\n private _onChangesAvailable(payload: G9DtChangesAvailable): void {\r\n if (!this._options.pullOnChangesAvailable || payload.tables.length === 0) return;\r\n for (const table of payload.tables) this._pokedTables[table.toLowerCase()] = table;\r\n if (this._pokeTimer === null) this._pokeTimer = setTimeout(() => this._flushPokes(), this._options.changesDebounceMs);\r\n }\r\n\r\n private _flushPokes(): void {\r\n const tables = Object.keys(this._pokedTables);\r\n for (const key of tables) delete this._pokedTables[key];\r\n this._pokeTimer = null;\r\n if (tables.length === 0 || !this._initialized) return;\r\n const signal = this._lifetime.signal;\r\n void (async () => {\r\n try {\r\n const state = await this._store.getServerState(signal);\r\n const names: { [name: string]: true } = {};\r\n let any = false;\r\n for (const d of state.definitions) {\r\n if (!d.heavy && d.tables.some((t) => tables.indexOf(t.toLowerCase()) >= 0)) {\r\n names[d.name] = true;\r\n any = true;\r\n }\r\n }\r\n if (!any) return;\r\n const keys = (await this._store.getSubscriptions(signal)).filter((s) => names[s.name] === true).map((s) => s.key);\r\n if (keys.length > 0) this._tryQueueBackground(keys);\r\n } catch (exception) {\r\n if (!signal.aborted) this._log('warning', 20003, 'Handling a server change notification failed', exception);\r\n }\r\n })();\r\n }\r\n\r\n private _raiseRowsApplied(report: G9ApplyReport, source: G9ESyncPhase, slice: G9ApplySlice | null = null): void {\r\n for (const listener of this._rowsAppliedListeners.slice()) {\r\n try {\r\n listener({ report, source, slice });\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A RowsApplied handler threw', exception);\r\n }\r\n }\r\n }\r\n\r\n private _log(level: G9SyncLogLevel, eventId: number, message: string, error?: unknown): void {\r\n const logger = this._options.logger;\r\n if (!logger) return;\r\n try {\r\n logger.log(level, eventId, message, error);\r\n } catch {\r\n // A logger must never break the sync.\r\n }\r\n }\r\n\r\n // ================================================================ execution\r\n\r\n private async _executeRun(run: G9SyncRun): Promise<void> {\r\n const request = run.request;\r\n const startedUtcMs = Date.now();\r\n const changes = new G9ApplyReport();\r\n const problems: G9DtSubscriptionState[] = [];\r\n let modelProblems: G9SyncModelProblem[] = [];\r\n const synced: string[] = [];\r\n let pushed = 0;\r\n let rejected = 0;\r\n let conflicts = 0;\r\n let downloaded = 0;\r\n let downloadedBytes = 0;\r\n let reconciled = 0;\r\n let error: G9SyncException | null = null;\r\n let outcome: G9ESyncOutcome = G9ESyncOutcome.Succeeded;\r\n\r\n const tracker = new G9SyncProgressTracker(run.runId, (p) => run.publish(p), () => this.queuedRuns, this._options.progressMaxHz);\r\n try {\r\n if (request.priority === G9ESyncPriority.Background && this.isBackgroundSuppressed) {\r\n tracker.complete(G9ESyncPhase.Canceled);\r\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'Background sync is suppressed.') }));\r\n return;\r\n }\r\n\r\n const linked = linkSignals(run.cancellation.signal, this._lifetime.signal);\r\n const ct = linked.signal;\r\n const cancelRegistration = onAbort(ct, () => tracker.setCancelPending());\r\n let hostScope: { dispose(): void | Promise<void> } | null = null;\r\n\r\n try {\r\n const history = await this._store.getPhaseStatistics(ct);\r\n const pending = request.push ? await this._store.getPendingSummary(ct) : null;\r\n this._planPhases(tracker, history, request, pending ? pending.totalRows : 0);\r\n if (this._options.hooks) hostScope = await this._options.hooks.beginRun(run, ct);\r\n\r\n // ---------------------------------------------------------------- 1. connect + hello\r\n tracker.enter(G9ESyncPhase.Connecting);\r\n await this._ensureConnected(ct);\r\n await this._store.collectExpiredEphemeral(Date.now(), ct);\r\n const subscriptions = await this._store.getSubscriptions(ct);\r\n const hello = await this._withRetry(\r\n (token) =>\r\n this._transport.hello(\r\n {\r\n clientId: this._clientId,\r\n appVersion: this._options.appVersion,\r\n protocolVersion: 1,\r\n tables: this.model.tables.map((t) => t.toWire()),\r\n subscriptions: subscriptions.map(toSubscriptionRef),\r\n },\r\n token,\r\n ),\r\n ct,\r\n );\r\n if (hello.error) throw syncErrorToException(hello.error);\r\n await this._store.saveHello(hello, ct);\r\n if (hello.unknownTables.length > 0) {\r\n this._log('warning', 20016, 'The server does not know these client tables (they will not sync): ' + hello.unknownTables.join(', '));\r\n }\r\n\r\n // A column declared with the wrong type syncs in NEITHER direction (ADR-0061): say it on every run's result, and once\r\n // per distinct set in the log.\r\n modelProblems = [];\r\n for (const table of hello.tables) {\r\n for (const column of table.typeMismatchColumns) {\r\n modelProblems.push({ code: G9SyncErrorCodes.ModelTypeMismatch, table: table.name, column: column.name, clientType: column.clientType, serverType: column.serverType });\r\n }\r\n }\r\n if (modelProblems.length > 0) {\r\n const described = modelProblems.map(describeModelProblem).join('; ');\r\n if (this._reportedModelProblems !== described) {\r\n this._reportedModelProblems = described;\r\n this._log(\r\n 'warning',\r\n 20022,\r\n `The client model declares ${modelProblems.length} column(s) with a type the server does not have; they sync in NEITHER direction until the model is fixed: ${described}`,\r\n );\r\n }\r\n if (this._options.failOnTypeMismatch) {\r\n throw new G9SyncException(G9SyncErrorCodes.ModelTypeMismatch, 'The client model declares column types the server does not have; those columns would not sync: ' + described);\r\n }\r\n }\r\n\r\n const negotiated = hello.tables;\r\n const definitions: { [name: string]: G9DtSubscriptionDefinition } = {};\r\n for (const d of hello.definitions) definitions[d.name] = d;\r\n const states: { [key: string]: G9DtSubscriptionState } = {};\r\n for (const state of hello.subscriptions) states[state.key] = state;\r\n\r\n // ---------------------------------------------------------------- 2. push\r\n // A FAILED PUSH MUST NOT COST THE PULL: the failure is rethrown after the pull, never swallowed.\r\n let pushFailure: { error: unknown } | null = null;\r\n if (request.push && pending && (pending.totalRows > 0 || pending.pendingCommands > 0)) {\r\n tracker.enter(G9ESyncPhase.Pushing, pending.totalRows + pending.pendingCommands);\r\n try {\r\n const totals = await this._pushAll(negotiated, subscriptions, hello.maxPushRows, hello.maxPushBytes, tracker, changes, ct);\r\n pushed = totals.pushed;\r\n rejected = totals.rejected;\r\n conflicts = totals.conflicts;\r\n } catch (exception) {\r\n if (ct.aborted) throw exception;\r\n this._log('warning', 20019, `Run ${run.runId}: the push failed; continuing to the pull so the device keeps receiving, then reporting the failure`, exception);\r\n pushFailure = { error: exception };\r\n }\r\n }\r\n\r\n if (request.pull) {\r\n // ------------------------------------------------------------ 3. select subscriptions (+ dependencies)\r\n const selected = await this._selectSubscriptions(request, subscriptions, definitions, problems, ct);\r\n const usable: G9SyncSubscriptionRecord[] = [];\r\n for (const subscription of selected) {\r\n const state = states[subscription.key];\r\n if (\r\n state &&\r\n (state.action === G9ESubscriptionAction.Unknown || state.action === G9ESubscriptionAction.InvalidParameters || state.action === G9ESubscriptionAction.Forbidden)\r\n ) {\r\n problems.push(state);\r\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: actionCode(state.action) }, ct);\r\n // Forbidden: these rows are no longer this caller's to hold (ADR-0048).\r\n if (state.action === G9ESubscriptionAction.Forbidden) {\r\n const released = await this._store.releaseSubscriptionRows(subscription.key, ct);\r\n changes.merge(released);\r\n if (released.total > 0) {\r\n this._log(\r\n 'warning',\r\n 20018,\r\n `Subscription ${subscription.key} is forbidden; released its rows (${released.revokedDeleted} deleted, ${released.revokedQuarantined} quarantined, ${released.revokedRetained} retained)`,\r\n );\r\n this._raiseRowsApplied(released, G9ESyncPhase.Reconciling);\r\n }\r\n }\r\n continue;\r\n }\r\n usable.push(subscription);\r\n }\r\n\r\n // ------------------------------------------------------------ 4. reconcile\r\n const now = Date.now();\r\n const toReconcile = usable.filter((s) => needsReconcile(s, request, states, definitions, now));\r\n tracker.expect(G9ESyncPhase.Reconciling, toReconcile.length * historyOf(history, STAT_RECONCILE_PER_SUBSCRIPTION, 2500));\r\n if (toReconcile.length > 0) {\r\n tracker.enter(G9ESyncPhase.Reconciling, toReconcile.length);\r\n let done = 0;\r\n for (const subscription of toReconcile) {\r\n try {\r\n const report = await this._reconcileSubscription(subscription, definitions[subscription.name] as G9DtSubscriptionDefinition, negotiated, ct);\r\n changes.merge(report);\r\n reconciled += report.total;\r\n if (report.total > 0) this._raiseRowsApplied(report, G9ESyncPhase.Reconciling);\r\n } catch (exception) {\r\n if (isSyncException(exception) && !exception.retryable && exception.code !== G9SyncErrorCodes.Canceled) {\r\n problems.push({ key: subscription.key, action: G9ESubscriptionAction.Reconcile, message: exception.message });\r\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: exception.code }, ct);\r\n } else {\r\n throw exception;\r\n }\r\n }\r\n tracker.report(++done, -1, null, subscription.key);\r\n }\r\n }\r\n\r\n // ------------------------------------------------------------ 5. plan (or resume a staged pull)\r\n tracker.enter(G9ESyncPhase.Planning);\r\n const failedKeys: { [key: string]: true } = {};\r\n for (const p of problems) failedKeys[p.key] = true;\r\n const current: { [key: string]: G9SyncSubscriptionRecord } = {};\r\n for (const s of await this._store.getSubscriptions(ct)) current[s.key] = s;\r\n const plannable = usable.filter((s) => !failedKeys[s.key] && current[s.key] !== undefined).map((s) => current[s.key] as G9SyncSubscriptionRecord);\r\n\r\n // A stage is kept PER GENERATION (ADR-0060); what makes one resumable is that the epoch, permissions, columns and\r\n // the cursors it was planned from are all still exactly what they were.\r\n const generation = stageGeneration(hello, plannable, states, negotiated);\r\n const pruned = await this._store.pruneStagedPulls(Date.now() - this._options.stagedPullMaxAgeMs, this._options.stagedPullsMaxBytes, generation, ct);\r\n if (pruned > 0) this._log('information', 20021, `Removed ${pruned} staged pull(s) past their age or the byte cap`);\r\n\r\n // Snapshot files are offered unless one already failed in this run (ADR-0072): a file is a faster way to the same rows,\r\n // never the only one, so a file the server cannot build or the device rejects costs one replan as rows - not the run.\r\n let allowFiles = this._options.acceptSnapshotFiles;\r\n for (let attempt = 0; ; attempt++) {\r\n const problemsBefore = problems.length;\r\n const syncedBefore = synced.length;\r\n let runId: string | null = null;\r\n try {\r\n const staged = await this._store.getStagedPullForGeneration(generation, ct);\r\n let plan: G9DtPullPlan;\r\n if (staged && staged.createdUtcMs > Date.now() - this._options.stagedPullMaxAgeMs) {\r\n plan = staged.plan;\r\n runId = staged.runId;\r\n this._log('information', 20012, `Resuming staged pull ${runId} (${plan.totalRows} rows planned)`);\r\n } else {\r\n const backfills = await this._store.getPendingBackfills(ct);\r\n const files = allowFiles && this._store.describeSnapshotFiles ? this._store.describeSnapshotFiles(negotiated) : null;\r\n plan = await this._withRetry(\r\n (token) =>\r\n this._transport.planPull(\r\n {\r\n clientId: this._clientId,\r\n subscriptions: plannable.map(toSubscriptionRef),\r\n tables: negotiated.map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\r\n backfills: backfills.slice(),\r\n frameVersion: this._options.maxFrameVersion,\r\n ...(files ? { snapshotFiles: files } : {}),\r\n },\r\n token,\r\n ),\r\n ct,\r\n );\r\n if (plan.error) throw syncErrorToException(plan.error);\r\n runId = guidToN(newGuid());\r\n const plannedFromCursors: { [key: string]: string | null } = {};\r\n for (const s of plannable) plannedFromCursors[s.key] = s.cursor;\r\n await this._store.beginStagedPull(\r\n { runId, plan, createdUtcMs: Date.now(), backfills, generation, plannedFromCursors, stageSequence: 0 },\r\n ct,\r\n );\r\n }\r\n\r\n for (const skipped of plan.skipped) {\r\n problems.push(skipped);\r\n if (skipped.action === G9ESubscriptionAction.Reconcile || skipped.action === G9ESubscriptionAction.ResyncRequired) {\r\n await this._store.updateSubscription(skipped.key, { state: G9ESubscriptionState.NeedsReconcile }, ct);\r\n }\r\n }\r\n\r\n for (const c of plan.cursors) synced.push(c.key);\r\n const fileParts = plan.parts.filter((p) => p.kind === G9EPullPartKind.SnapshotFile);\r\n if (fileParts.length > 0) {\r\n this._log('information', 20025, `The pull carries ${fileParts.length} snapshot file(s) for ${fileParts.reduce((sum, p) => sum + p.rows, 0)} row(s)`);\r\n }\r\n tracker.expect(G9ESyncPhase.Downloading, Math.max(200, (plan.totalRows / 1000) * historyOf(history, STAT_DOWNLOAD_PER_K_ROW, 350)));\r\n tracker.expect(G9ESyncPhase.Applying, Math.max(100, (plan.totalRows / 1000) * historyOf(history, STAT_APPLY_PER_K_ROW, 250)));\r\n\r\n // ------------------------------------------------------------ 6. download (resumable)\r\n tracker.enter(G9ESyncPhase.Downloading, plan.totalRows, plan.estimatedBytes);\r\n const totals = await this._download(runId, plan, tracker, ct);\r\n downloaded = totals.rows;\r\n downloadedBytes = totals.bytes;\r\n\r\n // ------------------------------------------------------------ 7. apply (atomic, or in committed slices)\r\n tracker.enter(G9ESyncPhase.Applying, downloaded);\r\n const applied = await this._store.applyStagedPull(\r\n runId,\r\n (rows) => tracker.report(rows),\r\n (slice) => {\r\n if (slice.report.total > 0) this._raiseRowsApplied(slice.report, G9ESyncPhase.Applying, slice);\r\n },\r\n ct,\r\n );\r\n changes.merge(applied);\r\n break;\r\n } catch (exception) {\r\n if (\r\n attempt === 0 &&\r\n !ct.aborted &&\r\n isSyncException(exception) &&\r\n (exception.code === G9SyncErrorCodes.SnapshotFileUnavailable || exception.code === G9SyncErrorCodes.SnapshotFileCorrupt)\r\n ) {\r\n this._log('warning', 20026, `A snapshot file failed (${exception.code}); the staged download was discarded and the pull is planned again as rows`, exception);\r\n if (runId !== null) await this._store.discardStagedPull(runId);\r\n problems.length = problemsBefore;\r\n synced.length = syncedBefore;\r\n allowFiles = false;\r\n tracker.enter(G9ESyncPhase.Planning);\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------- 8. post steps\r\n for (const step of request.postSteps) {\r\n tracker.enter(G9ESyncPhase.PostStep, 0, 0, step.name);\r\n await step.action({ run, changes, progress: (fraction) => tracker.reportFraction(fraction) }, ct);\r\n }\r\n\r\n // Rows retained after revocation by a RetainWhile rule are re-checked once per run (ADR-0026).\r\n changes.revokedDeleted += await this._store.reevaluateRetained(ct);\r\n\r\n // The pull has been applied and its cursors committed; now the push failure decides the run's fate.\r\n if (pushFailure) throw pushFailure.error;\r\n\r\n outcome = rejected > 0 || problems.length > 0 ? G9ESyncOutcome.CompletedWithRejections : G9ESyncOutcome.Succeeded;\r\n tracker.complete(G9ESyncPhase.Completed);\r\n } catch (exception) {\r\n if (ct.aborted) {\r\n outcome = G9ESyncOutcome.Canceled;\r\n error = new G9SyncException(G9SyncErrorCodes.Canceled, run.preempted ? 'Pre-empted by a higher-priority sync.' : 'The sync was canceled.', { cause: exception });\r\n tracker.complete(G9ESyncPhase.Canceled);\r\n } else {\r\n error = normalizeError(exception);\r\n outcome = G9ESyncOutcome.Failed;\r\n tracker.complete(G9ESyncPhase.Failed);\r\n this._log('warning', 20011, `Run ${run.runId} failed with ${error.code}`, error);\r\n }\r\n } finally {\r\n cancelRegistration();\r\n linked.dispose();\r\n if (hostScope) {\r\n try {\r\n await hostScope.dispose();\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A host scope handler threw', exception);\r\n }\r\n }\r\n }\r\n\r\n const durations = tracker.durations;\r\n const phaseMs: { [phase: string]: number } = {};\r\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\r\n const result = makeRunResult({\r\n runId: run.runId,\r\n outcome,\r\n error,\r\n pushed,\r\n rejected,\r\n conflicts,\r\n downloaded,\r\n applied: changes.total,\r\n durationMs: Date.now() - startedUtcMs,\r\n subscriptions: synced,\r\n problems,\r\n modelProblems,\r\n changes,\r\n phaseMs,\r\n });\r\n\r\n try {\r\n await this._persistRun(run, result, durations, startedUtcMs, downloadedBytes, reconciled);\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A run report handler threw', exception);\r\n }\r\n\r\n this._log(\r\n 'information',\r\n 20010,\r\n `Run ${run.runId} finished ${outcomeName(outcome)}: pushed ${pushed}, downloaded ${downloaded}, applied ${changes.total} in ${result.durationMs} ms`,\r\n );\r\n run.complete(result);\r\n for (const listener of this._runCompletedListeners.slice()) {\r\n try {\r\n listener(result);\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A RunCompleted handler threw', exception);\r\n }\r\n }\r\n } finally {\r\n tracker.dispose();\r\n }\r\n }\r\n\r\n private _planPhases(tracker: G9SyncProgressTracker, history: { [key: string]: number }, request: G9ResolvedSyncRequest, pendingRows: number): void {\r\n const connecting = historyOf(history, STAT_CONNECTING, 800);\r\n const pushing = request.push && pendingRows > 0 ? Math.max(300, (pendingRows / 1000) * historyOf(history, STAT_PUSH_PER_K_ROW, 1200)) : 0;\r\n const planning = request.pull ? historyOf(history, STAT_PLANNING, 700) : 0;\r\n const downloading = request.pull ? 2000 : 0;\r\n const applying = request.pull ? 1500 : 0;\r\n tracker.plan(G9ESyncPhase.Connecting, connecting);\r\n if (pushing > 0) tracker.plan(G9ESyncPhase.Pushing, pushing);\r\n if (request.pull) {\r\n tracker.plan(G9ESyncPhase.Reconciling, 0);\r\n tracker.plan(G9ESyncPhase.Planning, planning);\r\n tracker.plan(G9ESyncPhase.Downloading, downloading);\r\n tracker.plan(G9ESyncPhase.Applying, applying);\r\n }\r\n const core = connecting + pushing + planning + downloading + applying;\r\n for (const step of request.postSteps) {\r\n const hint = step.weightHint;\r\n tracker.plan(G9ESyncPhase.PostStep, historyOf(history, 'PostStep:' + step.name, hint >= 0.9 ? core * 9 : (core * hint) / (1 - hint)), step.name);\r\n }\r\n }\r\n\r\n private async _selectSubscriptions(\r\n request: G9ResolvedSyncRequest,\r\n all: G9SyncSubscriptionRecord[],\r\n definitions: { [name: string]: G9DtSubscriptionDefinition },\r\n problems: G9DtSubscriptionState[],\r\n ct: AbortSignal,\r\n ): Promise<G9SyncSubscriptionRecord[]> {\r\n const byKey: { [key: string]: G9SyncSubscriptionRecord } = {};\r\n for (const s of all) byKey[s.key] = s;\r\n const wanted = request.subscriptions;\r\n let roots = wanted === null ? all.slice() : all.filter((s) => wanted.indexOf(s.key) >= 0 || wanted.indexOf(s.name) >= 0);\r\n if (request.priority === G9ESyncPriority.Background && wanted === null) {\r\n roots = roots.filter((s) => !(definitions[s.name] && (definitions[s.name] as G9DtSubscriptionDefinition).heavy));\r\n }\r\n const ordered: G9SyncSubscriptionRecord[] = [];\r\n const visiting: { [key: string]: true } = {};\r\n const done: { [key: string]: true } = {};\r\n\r\n const visit = async (record: G9SyncSubscriptionRecord): Promise<void> => {\r\n if (done[record.key] || visiting[record.key]) return;\r\n visiting[record.key] = true;\r\n const definition = definitions[record.name];\r\n if (definition) {\r\n for (const dependency of definition.dependsOn) {\r\n const parentDefinition = definitions[dependency.name];\r\n if (!parentDefinition) {\r\n if (dependency.required) {\r\n problems.push({ key: record.key, action: G9ESubscriptionAction.Unknown, message: `Required dependency '${dependency.name}' is not available.` });\r\n }\r\n continue;\r\n }\r\n let parent = byKey[dependency.name];\r\n if (!parent) {\r\n parent = await this._store.ensureSubscription(\r\n dependency.name,\r\n new G9SyncParameters(),\r\n parentDefinition.ephemeral,\r\n parentDefinition.ephemeral ? parentDefinition.ttlSeconds * 1000 : null,\r\n false,\r\n ct,\r\n );\r\n byKey[parent.key] = parent;\r\n }\r\n await visit(parent);\r\n }\r\n }\r\n done[record.key] = true;\r\n ordered.push(record);\r\n };\r\n\r\n // Creation order. Two subscriptions created in the same millisecond keep it through their slots (handed out lowest\r\n // free first), then the key, ordinal (JS `<` compares UTF-16 units, like StringComparer.Ordinal) — never the order\r\n // the store happened to list them in (by key: a random GUID decided which site's rows came first, LES-0052).\r\n const sorted = roots\r\n .map((r, i) => ({ r, i }))\r\n .sort((a, b) => a.r.createdUtcMs - b.r.createdUtcMs || a.r.slot - b.r.slot || (a.r.key < b.r.key ? -1 : a.r.key > b.r.key ? 1 : 0) || a.i - b.i);\r\n for (const { r } of sorted) await visit(r);\r\n return ordered;\r\n }\r\n\r\n private async _pushAll(\r\n negotiated: G9DtNegotiatedTable[],\r\n subscriptions: G9SyncSubscriptionRecord[],\r\n serverMaxRows: number,\r\n serverMaxBytes: number,\r\n tracker: G9SyncProgressTracker,\r\n changes: G9ApplyReport,\r\n ct: AbortSignal,\r\n ): Promise<{ pushed: number; rejected: number; conflicts: number }> {\r\n let pushed = 0;\r\n let rejected = 0;\r\n let conflicts = 0;\r\n const references = subscriptions.map(toSubscriptionRef);\r\n // The server's limits win over the device's preference; bytes keep a margin for the header and compression variance.\r\n const targetRows = Math.max(1, serverMaxRows > 0 ? Math.min(this._options.pushBatchRows, serverMaxRows) : this._options.pushBatchRows);\r\n let batchRows = targetRows;\r\n const batchBytes = serverMaxBytes > 0 ? Math.floor(serverMaxBytes * 0.9) : Number.MAX_SAFE_INTEGER;\r\n for (;;) {\r\n const batch = await this._store.buildPushBatch(negotiated, batchRows, batchBytes, ct);\r\n if (!batch) break;\r\n rejected += batch.rejectedLocally;\r\n if (batch.rowCount === 0 && batch.commands.length === 0) break; // only rows that can never be uploaded were left\r\n\r\n const request: G9DtPushRequest = {\r\n clientId: this._clientId,\r\n batchId: batch.batchId,\r\n subscriptions: references,\r\n tables: batch.tables.slice(),\r\n commands: batch.commands.slice(),\r\n // Canonical rows come back in the columns the DEVICE holds (LES-0035).\r\n heldTables: negotiated\r\n .filter((t) => batch.commands.length > 0 || batch.tables.some((p) => p.tableId === t.tableId))\r\n .map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\r\n frameVersion: this._options.maxFrameVersion,\r\n };\r\n let result: G9DtPushResult;\r\n try {\r\n result = await this._withRetry((token) => this._transport.push(request, toChunks(batch), token), ct);\r\n if (result.error) throw syncErrorToException(result.error);\r\n } catch (exception) {\r\n if (isSyncException(exception) && exception.code === G9SyncErrorCodes.RejectTooMany && batchRows > 1 && batch.rowCount > 1) {\r\n // The server rolled the WHOLE push back for too many rejections (ADR-0063): halve and resend the smaller prefix\r\n // under the same batch id, so the valid rows get through and the bad ones are parked one by one.\r\n batchRows = Math.max(1, Math.floor(Math.min(batchRows, batch.rowCount) / 2));\r\n this._log(\r\n 'warning',\r\n 20023,\r\n `Push batch ${batch.batchId} of ${batch.rowCount} rows was rolled back for too many rejections; sending it again as ${batchRows} rows so the valid rows get through`,\r\n );\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n\r\n const report = await this._store.applyPushResult(batch, result, ct);\r\n changes.merge(report);\r\n if (report.upserts + report.deletes > 0) this._raiseRowsApplied(report, G9ESyncPhase.Pushing);\r\n pushed += batch.rowCount + batch.commands.length;\r\n rejected += result.rejections.length;\r\n conflicts += result.conflicts.length;\r\n tracker.report(pushed);\r\n this._log(\r\n 'debug',\r\n 20014,\r\n `Pushed batch ${batch.batchId}: ${batch.rowCount} rows, ${result.rejections.length} rejected, ${result.conflicts.length} conflicts, replayed ${result.alreadyApplied}`,\r\n );\r\n\r\n if (report.accepted + report.rejected + report.conflicts + report.commandsCompleted === 0 && !result.alreadyApplied) {\r\n this._log('warning', 20015, `Push batch ${batch.batchId} changed no row state; stopping the push loop for this run`);\r\n break;\r\n }\r\n if (batch.rowCount < batchRows && batch.commands.length < batchRows && !batch.truncated && !result.alreadyApplied) break;\r\n // After a split: grow back towards the normal size.\r\n if (batchRows < targetRows) batchRows = Math.min(targetRows, batchRows * 2);\r\n }\r\n return { pushed, rejected, conflicts };\r\n }\r\n\r\n private async _download(runId: string, plan: G9DtPullPlan, tracker: G9SyncProgressTracker, ct: AbortSignal): Promise<{ rows: number; bytes: number }> {\r\n // maxRetries counts failures in a row WITHOUT progress (the .NET twin, DownloadAsync): progress is the DURABLE resume point\r\n // moving, not a chunk arriving - segments after the last checkpoint are written again on resume.\r\n let failures = 0;\r\n let lastFailedAt: { stagedRows: number; stagedBytes: number } | null = null;\r\n for (;;) {\r\n const resume = await this._store.getResumePoint(runId, ct);\r\n let rows = resume.stagedRows;\r\n let bytes = resume.stagedBytes;\r\n if (resume.complete) return { rows, bytes };\r\n if (lastFailedAt !== null && (resume.stagedRows > lastFailedAt.stagedRows || resume.stagedBytes > lastFailedAt.stagedBytes)) failures = 0;\r\n tracker.report(rows, bytes);\r\n try {\r\n // Inside the try (the .NET twin, DownloadAsync): a reconnect that fails while the network is still down is one more\r\n // transient failure, not the end of the run.\r\n await this._ensureConnected(ct);\r\n for await (const chunk of this._transport.pull(plan.token, resume.continuation, ct)) {\r\n await this._store.stageChunk(runId, chunk, ct);\r\n if (chunk.isFinal) return { rows, bytes };\r\n rows += chunk.rowCount;\r\n bytes += chunk.payload ? chunk.payload.length : 0;\r\n tracker.report(rows, bytes, null, chunk.subscriptionKey ?? null);\r\n }\r\n throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The pull stream ended before its final chunk.');\r\n } catch (exception) {\r\n if (\r\n isSyncException(exception) &&\r\n (exception.code === G9SyncErrorCodes.TokenExpired ||\r\n exception.code === G9SyncErrorCodes.TokenInvalid ||\r\n exception.code === G9SyncErrorCodes.ResyncEpoch ||\r\n exception.code === G9SyncErrorCodes.ResyncAuthChanged)\r\n ) {\r\n await this._store.discardStagedPull(runId);\r\n throw exception;\r\n }\r\n if (!ct.aborted && isTransientError(exception) && failures < this._options.maxRetries) {\r\n this._log('warning', 20013, `Transient pull failure, retry ${failures + 1}: ${messageOf(exception)}`);\r\n await delay(this._backoff(failures), ct);\r\n failures++;\r\n lastFailedAt = resume;\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n }\r\n }\r\n\r\n private async _withRetry<T>(operation: (signal: AbortSignal) => Promise<T>, ct: AbortSignal): Promise<T> {\r\n for (let attempt = 0; ; attempt++) {\r\n try {\r\n await this._ensureConnected(ct);\r\n return await operation(ct);\r\n } catch (exception) {\r\n if (!ct.aborted && isTransientError(exception) && attempt < this._options.maxRetries) {\r\n this._log('warning', 20013, `Transient call failure, retry ${attempt + 1}: ${messageOf(exception)}`);\r\n await delay(this._backoff(attempt), ct);\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n }\r\n }\r\n\r\n private _backoff(attempt: number): number {\r\n return Math.min(30000, this._options.retryBaseDelayMs * Math.pow(2, attempt)) * (0.85 + Math.random() * 0.3);\r\n }\r\n\r\n private async _ensureConnected(ct: AbortSignal): Promise<void> {\r\n if (!this._transport.isConnected) await this._transport.connect(ct);\r\n }\r\n\r\n private async _persistRun(\r\n run: G9SyncRun,\r\n result: G9SyncRunResult,\r\n durations: { [key: string]: number },\r\n startedUtcMs: number,\r\n downloadedBytes: number,\r\n reconciledRows: number,\r\n ): Promise<void> {\r\n const diagnostics = result.changes.diagnostics;\r\n const phaseMs: { [phase: string]: number } = {};\r\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\r\n const report: G9SyncRunReport = {\r\n runId: run.runId,\r\n startedUtcMs,\r\n durationMs: result.durationMs,\r\n outcome: outcomeName(result.outcome),\r\n priority: priorityName(run.request.priority),\r\n errorCode: result.error ? result.error.code : null,\r\n errorMessage: result.error ? result.error.message : null,\r\n pushed: result.pushed,\r\n rejected: result.rejected,\r\n conflicts: result.conflicts,\r\n downloaded: result.downloaded,\r\n applied: result.applied,\r\n downloadedBytes,\r\n subscriptions: result.subscriptions.slice(),\r\n phaseMs,\r\n triggersSkipped: diagnostics.triggersSkipped,\r\n foreignTriggers: diagnostics.foreignTriggers.slice(),\r\n applyTransactions: diagnostics.transactions,\r\n indexesDeferred: diagnostics.deferredIndexCount,\r\n indexRebuildMs: diagnostics.indexRebuildMs,\r\n liveIndexReasons: { ...diagnostics.liveIndexReasons },\r\n unchangedRows: result.changes.unchangedRows,\r\n };\r\n await this._store.saveRunReport(report, this._options.keepRunReports);\r\n\r\n if (!result.isSuccess) return;\r\n const samples: { [key: string]: number } = {};\r\n const connecting = durations[phaseName(G9ESyncPhase.Connecting)];\r\n if (connecting !== undefined) samples[STAT_CONNECTING] = connecting;\r\n const planning = durations[phaseName(G9ESyncPhase.Planning)];\r\n if (planning !== undefined) samples[STAT_PLANNING] = planning;\r\n const pushingMs = durations[phaseName(G9ESyncPhase.Pushing)];\r\n if (result.pushed >= 100 && pushingMs !== undefined) samples[STAT_PUSH_PER_K_ROW] = pushingMs / (result.pushed / 1000);\r\n const downloadingMs = durations[phaseName(G9ESyncPhase.Downloading)];\r\n if (result.downloaded >= 500 && downloadingMs !== undefined) samples[STAT_DOWNLOAD_PER_K_ROW] = downloadingMs / (result.downloaded / 1000);\r\n const applyingMs = durations[phaseName(G9ESyncPhase.Applying)];\r\n if (result.downloaded >= 500 && applyingMs !== undefined) samples[STAT_APPLY_PER_K_ROW] = applyingMs / (result.downloaded / 1000);\r\n const reconcilingMs = durations[phaseName(G9ESyncPhase.Reconciling)];\r\n if (reconcilingMs !== undefined && reconciledRows >= 0 && run.request.pull) {\r\n samples[STAT_RECONCILE_PER_SUBSCRIPTION] = reconcilingMs / Math.max(1, result.subscriptions.length);\r\n }\r\n for (const step of run.request.postSteps) {\r\n const stepMs = durations['PostStep:' + step.name];\r\n if (stepMs !== undefined) samples['PostStep:' + step.name] = stepMs;\r\n }\r\n if (Object.keys(samples).length > 0) await this._store.recordPhaseStatistics(samples);\r\n if (result.applied > 0) await this._store.purgeDeletedFeed(this._options.keepDeletedFeedEntries);\r\n }\r\n\r\n // ================================================================ reconciliation (D-07)\r\n\r\n private async _reconcileSubscription(\r\n subscription: G9SyncSubscriptionRecord,\r\n definition: G9DtSubscriptionDefinition,\r\n negotiated: G9DtNegotiatedTable[],\r\n ct: AbortSignal,\r\n ): Promise<G9ApplyReport> {\r\n const tables: G9DtNegotiatedTable[] = [];\r\n for (const name of definition.tables) {\r\n const table = negotiated.find((t) => t.name.toLowerCase() === name.toLowerCase());\r\n // UploadOnly: the device's own rows, nothing on the server to compare them with.\r\n if (table && table.direction !== G9ESyncDirection.UploadOnly) tables.push(table);\r\n }\r\n\r\n const request: G9DtReconcileRequest = { clientId: this._clientId, subscription: toSubscriptionRef(subscription), tables: [], frameVersion: this._options.maxFrameVersion };\r\n for (const table of tables) request.tables.push(await this._store.computeDigest(subscription.key, table, ct));\r\n\r\n const serverRows: { [tableId: number]: Map<string, { version: number; hash: G9Long }> } = {};\r\n let summary: G9DtReconcileSummary | null = null;\r\n for await (const chunk of this._transport.reconcile(request, ct)) {\r\n if (chunk.isFinal) {\r\n summary = chunk.reconcileSummary ?? null;\r\n break;\r\n }\r\n if (!chunk.payload) continue;\r\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\r\n while (reader.nextSection()) {\r\n let rows = serverRows[reader.tableId];\r\n if (!rows) serverRows[reader.tableId] = rows = new Map();\r\n while (reader.readRow()) rows.set(reader.key, { version: reader.version, hash: reader.rowHash });\r\n }\r\n }\r\n if (!summary) throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The reconcile stream ended before its summary.');\r\n\r\n const report = new G9ApplyReport();\r\n let handedToSnapshot = false;\r\n for (const mismatch of summary.mismatched) {\r\n const table = tables.find((t) => t.tableId === mismatch.tableId);\r\n if (!table) continue;\r\n const server = serverRows[table.tableId] ?? new Map<string, { version: number; hash: G9Long }>();\r\n const buckets = new Set<number>(mismatch.buckets);\r\n const serverKeys = new Set<string>();\r\n server.forEach((_value, key) => serverKeys.add(key));\r\n const local = await this._store.readLocalEntries(subscription.key, table, buckets, serverKeys, ct);\r\n const localByKey = new Map<string, G9LocalRowEntry>();\r\n for (const entry of local) localByKey.set(entry.key, entry);\r\n\r\n const fetch: string[] = [];\r\n const addMembership: string[] = [];\r\n const moveOut: string[] = [];\r\n server.forEach(({ hash }, key) => {\r\n const entry = localByKey.get(key);\r\n if (!entry) fetch.push(key);\r\n else if (entry.dirty) {\r\n // A pending local change is never overwritten here; a row visible again still gets its membership back.\r\n if (!entry.member) addMembership.push(key);\r\n } else if (!entry.hash.equals(hash)) fetch.push(key);\r\n else if (!entry.member) addMembership.push(key);\r\n });\r\n for (const entry of local) {\r\n // Rows with pending changes are released too; the store's revocation policy decides (ADR-0026).\r\n if (entry.member && buckets.has(entry.bucket) && !server.has(entry.key)) moveOut.push(entry.key);\r\n }\r\n\r\n // A difference this large is a download, not a repair (ADR-0066).\r\n if (this._options.reconcileSnapshotThreshold > 0 && fetch.length >= this._options.reconcileSnapshotThreshold) {\r\n const released = await this._store.applyReconcile(subscription.key, table, [], addMembership, moveOut, definition.moveOutPolicy, ct);\r\n report.merge(released);\r\n handedToSnapshot = true;\r\n this._log(\r\n 'information',\r\n 20024,\r\n `Reconciling ${subscription.key} / ${table.name} would fetch ${fetch.length} rows (threshold ${this._options.reconcileSnapshotThreshold}): released what left, and leaving the rows to a staged snapshot pull`,\r\n );\r\n continue;\r\n }\r\n\r\n // Fetched and applied in groups (ADR-0066).\r\n const groupKeys = Math.max(Math.max(1, this._options.fetchKeysPerRequest), this._options.reconcileApplyRows);\r\n let pendingMembership = addMembership;\r\n let pendingMoveOut = moveOut;\r\n let fetched = 0;\r\n for (const group of chunked(fetch, groupKeys)) {\r\n const frames: Uint8Array[] = [];\r\n const returned = new Set<string>();\r\n for (const keys of chunked(group, Math.max(1, this._options.fetchKeysPerRequest))) {\r\n const fetchRequest = {\r\n clientId: this._clientId,\r\n subscription: toSubscriptionRef(subscription),\r\n tableId: table.tableId,\r\n keys,\r\n columns: table.columns.map((c) => c.name),\r\n frameVersion: this._options.maxFrameVersion,\r\n };\r\n for await (const chunk of this._transport.fetchRows(fetchRequest, ct)) {\r\n if (chunk.isFinal || !chunk.payload) continue;\r\n frames.push(chunk.payload);\r\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\r\n while (reader.nextSection()) {\r\n while (reader.readRow()) returned.add(reader.key);\r\n }\r\n }\r\n }\r\n // A key listed but not returned left the subscription between listing and fetch.\r\n const groupMoveOut = group.filter((k) => !returned.has(k) && (localByKey.get(k)?.member ?? false));\r\n for (const key of pendingMoveOut) groupMoveOut.push(key);\r\n const applied = await this._store.applyReconcile(subscription.key, table, frames, pendingMembership, groupMoveOut, definition.moveOutPolicy, ct);\r\n report.merge(applied);\r\n pendingMembership = [];\r\n pendingMoveOut = [];\r\n fetched += group.length;\r\n }\r\n if (fetched === 0 && (pendingMembership.length > 0 || pendingMoveOut.length > 0)) {\r\n report.merge(await this._store.applyReconcile(subscription.key, table, [], pendingMembership, pendingMoveOut, definition.moveOutPolicy, ct));\r\n }\r\n this._log(\r\n 'information',\r\n 20020,\r\n `Reconciled ${subscription.key} / ${table.name}: ${mismatch.buckets.length} buckets differed, fetched ${fetch.length}, adopted ${addMembership.length}, moved out ${moveOut.length}`,\r\n );\r\n }\r\n\r\n await this._store.updateSubscription(\r\n subscription.key,\r\n handedToSnapshot\r\n ? // No cursor: the plan step of this run sees an initial pull and stages a snapshot.\r\n { clearCursor: true, state: G9ESubscriptionState.Active, clearError: true, reconciled: true }\r\n : {\r\n cursor: summary.cursor,\r\n definitionHash: summary.definitionHash,\r\n authHash: summary.authHash,\r\n state: G9ESubscriptionState.Active,\r\n clearError: true,\r\n reconciled: true,\r\n },\r\n ct,\r\n );\r\n return report;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------- helpers\r\n\r\nfunction remove<T>(list: T[], item: T): void {\r\n const index = list.indexOf(item);\r\n if (index >= 0) list.splice(index, 1);\r\n}\r\n\r\nfunction messageOf(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error);\r\n}\r\n\r\nfunction historyOf(history: { [key: string]: number }, key: string, fallback: number): number {\r\n const value = history[key];\r\n return value !== undefined && value > 0 ? value : fallback;\r\n}\r\n\r\nfunction needsReconcile(\r\n subscription: G9SyncSubscriptionRecord,\r\n request: G9ResolvedSyncRequest,\r\n states: { [key: string]: G9DtSubscriptionState },\r\n definitions: { [name: string]: G9DtSubscriptionDefinition },\r\n nowMs: number,\r\n): boolean {\r\n if (subscription.state === G9ESubscriptionState.NeedsReconcile) return true;\r\n const state = states[subscription.key];\r\n if (state && (state.action === G9ESubscriptionAction.Reconcile || state.action === G9ESubscriptionAction.ResyncRequired)) return true;\r\n if (subscription.cursor === null) return false;\r\n if (request.forceReconcile) return true;\r\n const definition = definitions[subscription.name];\r\n return (\r\n definition !== undefined &&\r\n definition.reconcileIntervalMinutes > 0 &&\r\n (subscription.lastReconcileUtcMs ?? subscription.lastSuccessUtcMs ?? subscription.createdUtcMs) < nowMs - definition.reconcileIntervalMinutes * 60000\r\n );\r\n}\r\n\r\n/**\r\n * Everything a staged pull's rows depend on (ADR-0046): the server's epoch, the exact set of subscriptions with their\r\n * definition and authorisation hashes, and the negotiated columns. The cursor is deliberately NOT part of it (ADR-0060).\r\n */\r\nexport function stageGeneration(\r\n hello: G9DtHelloResult,\r\n plannable: readonly G9SyncSubscriptionRecord[],\r\n states: { [key: string]: G9DtSubscriptionState },\r\n negotiated: readonly G9DtNegotiatedTable[],\r\n): string {\r\n let text = guidToN(hello.epoch) + '\\n';\r\n for (const subscription of plannable.slice().sort((a, b) => compareOrdinal(a.key, b.key))) {\r\n const state = states[subscription.key];\r\n text += subscription.key + '\\u001F' + ((state ? state.definitionHash : null) ?? subscription.definitionHash ?? '') + '\\u001F' + ((state ? state.authHash : null) ?? subscription.authHash ?? '') + '\\n';\r\n }\r\n text += '\\n';\r\n const tables = negotiated.map((t, i) => ({ t, i })).sort((a, b) => a.t.tableId - b.t.tableId || a.i - b.i);\r\n for (const { t } of tables) text += String(t.tableId) + '\\u001F' + t.columns.map((c) => c.name).join(',') + '\\n';\r\n return toHex(sha256(utf8Encode(text)));\r\n}\r\n\r\nfunction actionCode(action: number): string {\r\n switch (action) {\r\n case G9ESubscriptionAction.Unknown:\r\n return G9SyncErrorCodes.UnknownSubscription;\r\n case G9ESubscriptionAction.Forbidden:\r\n return G9SyncErrorCodes.SubscriptionForbidden;\r\n default:\r\n return G9SyncErrorCodes.InvalidParameters;\r\n }\r\n}\r\n\r\nfunction chunked<T>(items: readonly T[], size: number): T[][] {\r\n const out: T[][] = [];\r\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\r\n return out;\r\n}\r\n\r\nasync function* toChunks(batch: G9PushBatch): AsyncGenerator<G9DtSyncChunk> {\r\n let sequence = 0;\r\n for (const frame of batch.frames) yield { sequence: sequence++, payload: frame, rowCount: 0, isFinal: false };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/client/engine.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,oHAAoH;AACpH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,eAAe,EACf,qBAAqB,EAYrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EACL,cAAc,EACd,eAAe,EACf,SAAS,EACT,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GAWf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EAIjB,2BAA2B,GAa5B,MAAM,iBAAiB,CAAC;AAGzB,MAAM,eAAe,GAAG,YAAY,CAAC;AACrC,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAC1C,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAClD,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAC5C,MAAM,+BAA+B,GAAG,0BAA0B,CAAC;AAQnE;;;GAGG;AACH,MAAM,OAAO,YAAY;IA0BvB,YAAY,KAAwB,EAAE,SAA0B,EAAE,KAAwB,EAAE,OAA6B;QArBxG,cAAS,GAAG,WAAW,EAAE,CAAC;QAC1B,WAAM,GAAgB,EAAE,CAAC;QACzB,iBAAY,GAAgC,EAAE,CAAC;QAC/C,0BAAqB,GAA4C,EAAE,CAAC;QACpE,2BAAsB,GAA0C,EAAE,CAAC;QAG5E,iBAAY,GAAG,KAAK,CAAC;QACrB,kBAAa,GAAyB,IAAI,CAAC;QAC3C,cAAS,GAAG,EAAE,CAAC;QACf,WAAM,GAAG,CAAC,CAAC;QACX,aAAQ,GAAqB,IAAI,CAAC;QAClC,kBAAa,GAAG,CAAC,CAAC;QAClB,eAAU,GAA0C,IAAI,CAAC;QACzD,eAAU,GAAyC,IAAI,CAAC;QACxD,UAAK,GAAwB,IAAI,CAAC;QAClC,YAAO,GAAyB,IAAI,CAAC;QACrC,cAAS,GAAG,KAAK,CAAC;QAC1B,+FAA+F;QACvF,2BAAsB,GAAkB,IAAI,CAAC;QAGnD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,QAAQ;QACV,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,qIAAqI;IACrI,aAAa,CAAC,QAA6C;QACzD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,cAAc,CAAC,QAA2C;QACxD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,kFAAkF;IAClF,UAAU,CAAC,MAAoB;QAC7B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC/B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACjD,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBACvD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,IAAI,CAAC,YAAY;wBAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBACpD,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,iFAAiF;IAEjF,0FAA0F;IAC1F,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,UAAoC,EAAE,OAAsC,EAAE,MAAoB;;QAC9H,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC5G,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,MAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,mCAAI,IAAI,CAAC;QAC1E,MAAM,SAAS,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,mCAAI,KAAK,CAAC;QACvE,MAAM,KAAK,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxI,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,mCAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/J,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oGAAoG;IACpG,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,UAAoC,EAAE,MAAoB;;QACxF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAA,MAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,0CAAE,aAAa,mCAAI,gBAAgB,CAAC,MAAM,CAAC;QACxG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAoB;QACzC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,wEAAwE;IAExE,yFAAyF;IACzF,GAAG,CAAC,OAA8B;QAChC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;gBACrB,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC;YAChJ,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,SAAS,GAAqB,IAAI,CAAC;QACvC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC;YAClI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YACzB,SAAS,GAAG,OAAO,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,kBAAkB,SAAS,CAAC,KAAK,sBAAsB,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,OAA8B;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,4GAA4G;IAC5G,kBAAkB;QAChB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,EAAE;YACV,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAED,yFAAyF;IACzF,kBAAkB,CAAC,UAAkB;QACnC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;QAC9E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;IAClF,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,2EAA2E;IAE3E;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,IAAY,EACZ,WAAmB,EACnB,YAA6F,EAC7F,OAAO,GAAG,CAAC,EACX,MAAoB;QAEpB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACvG,IAAI,OAAO,WAAW,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC1F,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3G,CAAC;IAED,mGAAmG;IACnG,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,IAA+B,EAAE,MAAoB;QAChG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAmC,EAAE,KAAK,GAAG,GAAG,EAAE,MAAoB;QACtF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAoB;QACtC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAoB;QACvC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,GAAW,EAAE,MAAoB;QAC5E,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,kGAAkG;IAClG,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAA0B,EAAE,GAAmB,EAAE,MAAoB;QAC5F,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,EAAE,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAoB;QACpC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAA0B,EAAE,GAAmB,EAAE,MAAoB;QACvF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,EAAE,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,UAA0B,EAAE,GAAmB,EAAE,MAAoB;QACxF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,EAAE,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB,EAAE,aAAqB,EAAE,KAAK,GAAG,IAAI,EAAE,MAAoB;QAChG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,sBAAsB,CAAC,UAAkB,EAAE,aAAqB,EAAE,KAAa,EAAE,SAAgC,EAAE,MAAoB;QAC3I,2BAA2B,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjG,CAAC;IAED,4HAA4H;IAC5H,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,kBAAkB,CAAC,MAAoB;QAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,IAAuB,EAAE,MAAoB;QAC/E,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAoB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;YACxC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACpD,aAAa,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACzD,UAAU,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC;SAC9D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;;QACX,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9K,CAAC;QACD,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,0EAA0E;IAElE,OAAO;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;IACnB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAc,CAAC;YACtC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAc,CAAC;YACzC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAAE,IAAI,GAAG,CAAC,CAAC;QAC5F,CAAC;QACD,OAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAe,CAAC,GAAG,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAClC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACvB,CAAC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,oCAAoC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;gBACtF,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YACtH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,qGAAqG;YACrG,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU;gBAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChI,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,aAAuC;QACjE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3J,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;IACpE,CAAC;IAEO,mBAAmB,CAAC,OAA6B;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;QACnF,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACxH,CAAC;IAEO,WAAW;QACjB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACrC,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,KAAK,GAA6B,EAAE,CAAC;gBAC3C,IAAI,GAAG,GAAG,KAAK,CAAC;gBAChB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBAClC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;wBAC3E,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;wBACrB,GAAG,GAAG,IAAI,CAAC;oBACb,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,GAAG;oBAAE,OAAO;gBACjB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClH,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,8CAA8C,EAAE,SAAS,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAEO,iBAAiB,CAAC,MAAqB,EAAE,MAAoB,EAAE,QAA6B,IAAI;QACtG,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,6BAA6B,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,KAAqB,EAAE,OAAe,EAAE,OAAe,EAAE,KAAe;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,WAAW,CAAC,GAAc;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,IAAI,aAAa,GAAyB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,GAA2B,IAAI,CAAC;QACzC,IAAI,OAAO,GAAmB,cAAc,CAAC,SAAS,CAAC;QAEvD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAChI,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBACnF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7K,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC3E,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;YACzB,MAAM,kBAAkB,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACzE,IAAI,SAAS,GAA+C,IAAI,CAAC;YAEjE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9E,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK;oBAAE,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAEjF,sFAAsF;gBACtF,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBACvC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAChC,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CACjC,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,CAAC,UAAU,CAAC,KAAK,CACnB;oBACE,QAAQ,EAAE,IAAI,CAAC,SAAS;oBACxB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;oBACpC,eAAe,EAAE,CAAC;oBAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAChD,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC;iBACpD,EACD,KAAK,CACN,EACH,EAAE,CACH,CAAC;gBACF,IAAI,KAAK,CAAC,KAAK;oBAAE,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,qEAAqE,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtI,CAAC;gBAED,sHAAsH;gBACtH,+BAA+B;gBAC/B,aAAa,GAAG,EAAE,CAAC;gBACnB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;wBAC/C,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;oBACzK,CAAC;gBACH,CAAC;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrE,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;wBAC9C,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;wBACxC,IAAI,CAAC,IAAI,CACP,SAAS,EACT,KAAK,EACL,6BAA6B,aAAa,CAAC,MAAM,6GAA6G,SAAS,EAAE,CAC1K,CAAC;oBACJ,CAAC;oBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;wBACrC,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,iGAAiG,GAAG,SAAS,CAAC,CAAC;oBAC/K,CAAC;gBACH,CAAC;gBAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;gBAChC,MAAM,WAAW,GAAmD,EAAE,CAAC;gBACvE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW;oBAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAA6C,EAAE,CAAC;gBAC5D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,aAAa;oBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAEnE,2EAA2E;gBAC3E,iGAAiG;gBACjG,IAAI,WAAW,GAA8B,IAAI,CAAC;gBAClD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,IAAI,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC;oBACtF,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;oBACjF,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;wBAC3H,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;wBACvB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;wBAC3B,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;wBAC3B,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC/B,CAAC;oBAAC,OAAO,SAAS,EAAE,CAAC;wBACnB,IAAI,EAAE,CAAC,OAAO;4BAAE,MAAM,SAAS,CAAC;wBAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,qGAAqG,EAAE,SAAS,CAAC,CAAC;wBAC9J,WAAW,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBACrC,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,wGAAwG;oBACxG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;oBACpG,MAAM,MAAM,GAA+B,EAAE,CAAC;oBAC9C,KAAK,MAAM,YAAY,IAAI,QAAQ,EAAE,CAAC;wBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;wBACvC,IACE,KAAK;4BACL,CAAC,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,iBAAiB,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,CAAC,EAChK,CAAC;4BACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BACrB,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;4BACxI,wEAAwE;4BACxE,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,EAAE,CAAC;gCACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gCACjF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gCACxB,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oCACvB,IAAI,CAAC,IAAI,CACP,SAAS,EACT,KAAK,EACL,gBAAgB,YAAY,CAAC,GAAG,qCAAqC,QAAQ,CAAC,cAAc,aAAa,QAAQ,CAAC,kBAAkB,iBAAiB,QAAQ,CAAC,eAAe,YAAY,CAC1L,CAAC;oCACF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;gCAC7D,CAAC;4BACH,CAAC;4BACD,SAAS;wBACX,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC5B,CAAC;oBAED,4EAA4E;oBAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACvB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC/F,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC,CAAC;oBACzH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC3B,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;wBAC5D,IAAI,IAAI,GAAG,CAAC,CAAC;wBACb,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE,CAAC;4BACvC,IAAI,CAAC;gCACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAA+B,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;gCAC7I,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCACtB,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC;gCAC3B,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;oCAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;4BACjF,CAAC;4BAAC,OAAO,SAAS,EAAE,CAAC;gCACnB,IAAI,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,QAAQ,EAAE,CAAC;oCACvG,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;oCAC9G,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gCAChI,CAAC;qCAAM,CAAC;oCACN,MAAM,SAAS,CAAC;gCAClB,CAAC;4BACH,CAAC;4BACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;wBACrD,CAAC;oBACH,CAAC;oBAED,iGAAiG;oBACjG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;oBACrC,MAAM,UAAU,GAA4B,EAAE,CAAC;oBAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ;wBAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;oBACnD,MAAM,OAAO,GAAgD,EAAE,CAAC;oBAChE,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAA6B,CAAC,CAAC;oBAElJ,kHAAkH;oBAClH,wEAAwE;oBACxE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;oBACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;oBACpJ,IAAI,MAAM,GAAG,CAAC;wBAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,WAAW,MAAM,gDAAgD,CAAC,CAAC;oBAEnH,wHAAwH;oBACxH,sHAAsH;oBACtH,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;oBACnD,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;wBAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;wBACvC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;wBACnC,IAAI,KAAK,GAAkB,IAAI,CAAC;wBAChC,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;4BAC5E,IAAI,IAAkB,CAAC;4BACvB,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;gCAClF,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gCACnB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gCACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,wBAAwB,KAAK,KAAK,IAAI,CAAC,SAAS,gBAAgB,CAAC,CAAC;4BACpG,CAAC;iCAAM,CAAC;gCACN,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gCAC5D,MAAM,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gCACrH,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAC1B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtB;oCACE,QAAQ,EAAE,IAAI,CAAC,SAAS;oCACxB,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC;oCAC/C,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oCAC9F,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE;oCAC5B,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;oCAC3C,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iCAC3C,EACD,KAAK,CACN,EACH,EAAE,CACH,CAAC;gCACF,IAAI,IAAI,CAAC,KAAK;oCAAE,MAAM,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCACvD,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gCAC3B,MAAM,kBAAkB,GAAqC,EAAE,CAAC;gCAChE,KAAK,MAAM,CAAC,IAAI,SAAS;oCAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gCAChE,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAC/B,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC,EAAE,EACtG,EAAE,CACH,CAAC;4BACJ,CAAC;4BAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gCACnC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gCACvB,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,cAAc,EAAE,CAAC;oCAClH,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gCACxG,CAAC;4BACH,CAAC;4BAED,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;gCAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;4BACjD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,YAAY,CAAC,CAAC;4BACpF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,oBAAoB,SAAS,CAAC,MAAM,yBAAyB,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;4BACvJ,CAAC;4BACD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;4BACpI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;4BAE9H,uFAAuF;4BACvF,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;4BAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;4BAC9D,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;4BACzB,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;4BAE/B,yGAAyG;4BACzG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;4BACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAC/C,KAAK,EACL,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAC9B,CAAC,KAAK,EAAE,EAAE;gCACR,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oCAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;4BACjG,CAAC,EACD,EAAE,CACH,CAAC;4BACF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;4BACvB,MAAM;wBACR,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACnB,IACE,OAAO,KAAK,CAAC;gCACb,CAAC,EAAE,CAAC,OAAO;gCACX,eAAe,CAAC,SAAS,CAAC;gCAC1B,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,uBAAuB,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,mBAAmB,CAAC,EACxH,CAAC;gCACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,2BAA2B,SAAS,CAAC,IAAI,4EAA4E,EAAE,SAAS,CAAC,CAAC;gCAC9J,IAAI,KAAK,KAAK,IAAI;oCAAE,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gCAC/D,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC;gCACjC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;gCAC7B,UAAU,GAAG,KAAK,CAAC;gCACnB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gCACrC,SAAS;4BACX,CAAC;4BACD,MAAM,SAAS,CAAC;wBAClB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,iFAAiF;gBACjF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACrC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtD,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpG,CAAC;gBAED,+FAA+F;gBAC/F,OAAO,CAAC,cAAc,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAEnE,oGAAoG;gBACpG,IAAI,WAAW;oBAAE,MAAM,WAAW,CAAC,KAAK,CAAC;gBAEzC,OAAO,GAAG,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC;gBAClH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;oBACf,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC;oBAClC,KAAK,GAAG,IAAI,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBACjK,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;oBAClC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;oBAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBACtC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,gBAAgB,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,kBAAkB,EAAE,CAAC;gBACrB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC;wBACH,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;oBAC5B,CAAC;oBAAC,OAAO,SAAS,EAAE,CAAC;wBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE,SAAS,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,OAAO,GAAgC,EAAE,CAAC;YAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAW,CAAC,CAAC;YAC9F,MAAM,MAAM,GAAG,aAAa,CAAC;gBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO;gBACP,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,QAAQ;gBACR,SAAS;gBACT,UAAU;gBACV,OAAO,EAAE,OAAO,CAAC,KAAK;gBACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY;gBACrC,aAAa,EAAE,MAAM;gBACrB,QAAQ;gBACR,aAAa;gBACb,OAAO;gBACP,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;YAC5F,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;YAED,IAAI,CAAC,IAAI,CACP,aAAa,EACb,KAAK,EACL,OAAO,GAAG,CAAC,KAAK,aAAa,WAAW,CAAC,OAAO,CAAC,YAAY,MAAM,gBAAgB,UAAU,aAAa,OAAO,CAAC,KAAK,OAAO,MAAM,CAAC,UAAU,KAAK,CACrJ,CAAC;YACF,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3D,IAAI,CAAC;oBACH,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAA8B,EAAE,OAAkC,EAAE,OAA8B,EAAE,WAAmB;QACzI,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1I,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,OAA8B,EAC9B,GAA+B,EAC/B,WAA2D,EAC3D,QAAiC,EACjC,EAAe;QAEf,MAAM,KAAK,GAAgD,EAAE,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;QACrC,IAAI,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzH,IAAI,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACvE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAgC,CAAC,KAAK,CAAC,CAAC,CAAC;QACnH,CAAC;QACD,MAAM,OAAO,GAA+B,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,MAAM,IAAI,GAA4B,EAAE,CAAC;QAEzC,MAAM,KAAK,GAAG,KAAK,EAAE,MAAgC,EAAiB,EAAE;YACtE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE,OAAO;YACrD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC5B,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;oBAC9C,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACtD,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBACtB,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;4BACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,wBAAwB,UAAU,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;wBACnJ,CAAC;wBACD,SAAS;oBACX,CAAC;oBACD,IAAI,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAC3C,UAAU,CAAC,IAAI,EACf,IAAI,gBAAgB,EAAE,EACtB,gBAAgB,CAAC,SAAS,EAC1B,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EACtE,KAAK,EACL,EAAE,CACH,CAAC;wBACF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;oBAC7B,CAAC;oBACD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,mHAAmH;QACnH,mHAAmH;QACnH,6GAA6G;QAC7G,MAAM,MAAM,GAAG,KAAK;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnJ,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,MAAM;YAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,UAAiC,EACjC,aAAyC,EACzC,aAAqB,EACrB,cAAsB,EACtB,OAA8B,EAC9B,OAAsB,EACtB,EAAe;QAEf,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACxD,qHAAqH;QACrH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACvI,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACnG,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACtF,IAAI,CAAC,KAAK;gBAAE,MAAM;YAClB,QAAQ,IAAI,KAAK,CAAC,eAAe,CAAC;YAClC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,CAAC,iDAAiD;YAEjH,MAAM,OAAO,GAAoB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,SAAS;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,aAAa,EAAE,UAAU;gBACzB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;gBAChC,uEAAuE;gBACvE,UAAU,EAAE,UAAU;qBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;qBAC7F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9E,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;aAC5C,CAAC;YACF,IAAI,MAAsB,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrG,IAAI,MAAM,CAAC,KAAK;oBAAE,MAAM,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,eAAe,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,aAAa,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;oBAC3H,gHAAgH;oBAChH,iGAAiG;oBACjG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC7E,IAAI,CAAC,IAAI,CACP,SAAS,EACT,KAAK,EACL,cAAc,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,QAAQ,sEAAsE,SAAS,qCAAqC,CACrK,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtB,IAAI,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC;gBAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YAC9F,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,sHAAsH;YACtH,4CAA4C;YAC5C,QAAQ,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACvD,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YACrC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CACP,OAAO,EACP,KAAK,EACL,gBAAgB,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,QAAQ,UAAU,MAAM,CAAC,UAAU,CAAC,MAAM,cAAc,MAAM,CAAC,SAAS,CAAC,MAAM,wBAAwB,MAAM,CAAC,cAAc,EAAE,CACvK,CAAC;YAEF,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACpH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,KAAK,CAAC,OAAO,4DAA4D,CAAC,CAAC;gBACrH,MAAM;YACR,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,GAAG,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,cAAc;gBAAE,MAAM;YACzH,oDAAoD;YACpD,IAAI,SAAS,GAAG,UAAU;gBAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,IAAkB,EAAE,OAA8B,EAAE,EAAe;;QACxG,4HAA4H;QAC5H,iGAAiG;QACjG,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,YAAY,GAAuD,IAAI,CAAC;QAC5E,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;YAC7B,IAAI,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;YAC/B,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC5C,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC;YAC1I,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC;gBACH,oHAAoH;gBACpH,6CAA6C;gBAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC;oBACpF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC/C,IAAI,KAAK,CAAC,OAAO;wBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;oBAC1C,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC;oBACvB,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAA,KAAK,CAAC,eAAe,mCAAI,IAAI,CAAC,CAAC;gBACnE,CAAC;gBACD,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,+CAA+C,CAAC,CAAC;YAC9G,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IACE,eAAe,CAAC,SAAS,CAAC;oBAC1B,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,YAAY;wBAC/C,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,YAAY;wBAChD,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,WAAW;wBAC/C,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,iBAAiB,CAAC,EACxD,CAAC;oBACD,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBAC3C,MAAM,SAAS,CAAC;gBAClB,CAAC;gBACD,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACtF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,iCAAiC,QAAQ,GAAG,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACtG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzC,QAAQ,EAAE,CAAC;oBACX,YAAY,GAAG,MAAM,CAAC;oBACtB,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAI,SAA8C,EAAE,EAAe;QACzF,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAChC,OAAO,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACrF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,iCAAiC,OAAO,GAAG,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACrG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;oBACxC,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IAC/G,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,EAAe;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,GAAc,EACd,MAAuB,EACvB,SAAoC,EACpC,YAAoB,EACpB,eAAuB,EACvB,cAAsB;QAEtB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,MAAM,OAAO,GAAgC,EAAE,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAW,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAoB;YAC9B,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,YAAY;YACZ,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;YACpC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5C,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAClD,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACxD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,eAAe;YACf,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;YAC3C,OAAO;YACP,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE;YACpD,iBAAiB,EAAE,WAAW,CAAC,YAAY;YAC3C,eAAe,EAAE,WAAW,CAAC,kBAAkB;YAC/C,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,gBAAgB,EAAE,EAAE,GAAG,WAAW,CAAC,gBAAgB,EAAE;YACrD,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;SAC5C,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAEtE,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO;QAC9B,MAAM,OAAO,GAA8B,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC;QACpE,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;QAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACvH,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,aAAa,KAAK,SAAS;YAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,aAAa,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC3I,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAClI,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QACrE,IAAI,aAAa,KAAK,SAAS,IAAI,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3E,OAAO,CAAC,+BAA+B,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACtG,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACtE,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACnG,CAAC;IAED,yFAAyF;IAEjF,KAAK,CAAC,sBAAsB,CAClC,YAAsC,EACtC,UAAsC,EACtC,UAAiC,EACjC,EAAe;;QAEf,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAClF,iFAAiF;YACjF,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,gBAAgB,CAAC,UAAU;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,OAAO,GAAyB,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC3K,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAE9G,MAAM,UAAU,GAA0E,EAAE,CAAC;QAC7F,IAAI,OAAO,GAAgC,IAAI,CAAC;QAChD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;YACjE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,GAAG,MAAA,KAAK,CAAC,gBAAgB,mCAAI,IAAI,CAAC;gBACzC,MAAM;YACR,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,SAAS;YAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;YACvG,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC5B,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI;oBAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;gBACzD,OAAO,MAAM,CAAC,OAAO,EAAE;oBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,gDAAgD,CAAC,CAAC;QAE3H,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,MAAM,GAAG,MAAA,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,mCAAI,IAAI,GAAG,EAA6C,CAAC;YACjG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACnG,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;YACtD,KAAK,MAAM,KAAK,IAAI,KAAK;gBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAE5D,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;gBAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,KAAK;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACvB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACrB,wGAAwG;oBACxG,IAAI,CAAC,KAAK,CAAC,MAAM;wBAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7C,CAAC;qBAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAChD,IAAI,CAAC,KAAK,CAAC,MAAM;oBAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,gGAAgG;gBAChG,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnG,CAAC;YAED,kEAAkE;YAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,0BAA0B,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,0BAA0B,EAAE,CAAC;gBAC7G,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBACrI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACvB,gBAAgB,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,IAAI,CACP,aAAa,EACb,KAAK,EACL,eAAe,YAAY,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,MAAM,oBAAoB,IAAI,CAAC,QAAQ,CAAC,0BAA0B,uEAAuE,CAC/M,CAAC;gBACF,SAAS;YACX,CAAC;YAED,4CAA4C;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAC7G,IAAI,iBAAiB,GAAG,aAAa,CAAC;YACtC,IAAI,cAAc,GAAG,OAAO,CAAC;YAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAiB,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;gBACnC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;oBAClF,MAAM,YAAY,GAAG;wBACnB,QAAQ,EAAE,IAAI,CAAC,SAAS;wBACxB,YAAY,EAAE,iBAAiB,CAAC,YAAY,CAAC;wBAC7C,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI;wBACJ,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBACzC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;qBAC5C,CAAC;oBACF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC;wBACtE,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;4BAAE,SAAS;wBAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;wBACvG,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;4BAC5B,OAAO,MAAM,CAAC,OAAO,EAAE;gCAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACpD,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,iFAAiF;gBACjF,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,eAAC,OAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAA,MAAA,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,0CAAE,MAAM,mCAAI,KAAK,CAAC,CAAA,EAAA,CAAC,CAAC;gBACnG,KAAK,MAAM,GAAG,IAAI,cAAc;oBAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBACjJ,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtB,iBAAiB,GAAG,EAAE,CAAC;gBACvB,cAAc,GAAG,EAAE,CAAC;gBACpB,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1B,CAAC;YACD,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjF,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/I,CAAC;YACD,IAAI,CAAC,IAAI,CACP,aAAa,EACb,KAAK,EACL,cAAc,YAAY,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,CAAC,MAAM,8BAA8B,KAAK,CAAC,MAAM,aAAa,aAAa,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,EAAE,CACrL,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAClC,YAAY,CAAC,GAAG,EAChB,gBAAgB;YACd,CAAC,CAAC,mFAAmF;gBACnF,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC/F,CAAC,CAAC;gBACE,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,oBAAoB,CAAC,MAAM;gBAClC,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,IAAI;aACjB,EACL,EAAE,CACH,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,2EAA2E;AAE3E,SAAS,MAAM,CAAI,IAAS,EAAE,IAAO;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC;QAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,SAAS,CAAC,OAAkC,EAAE,GAAW,EAAE,QAAgB;IAClF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CACrB,YAAsC,EACtC,OAA8B,EAC9B,MAAgD,EAChD,WAA2D,EAC3D,KAAa;;IAEb,IAAI,YAAY,CAAC,KAAK,KAAK,oBAAoB,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACtI,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,OAAO,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,CACL,UAAU,KAAK,SAAS;QACxB,UAAU,CAAC,wBAAwB,GAAG,CAAC;QACvC,CAAC,MAAA,MAAA,YAAY,CAAC,kBAAkB,mCAAI,YAAY,CAAC,gBAAgB,mCAAI,YAAY,CAAC,YAAY,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC,wBAAwB,GAAG,KAAK,CACtJ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAsB,EACtB,SAA8C,EAC9C,MAAgD,EAChD,UAA0C;;IAE1C,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACvC,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,IAAI,YAAY,CAAC,GAAG,GAAG,QAAQ,GAAG,CAAC,MAAA,MAAA,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAI,YAAY,CAAC,cAAc,mCAAI,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,MAAA,MAAA,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAI,YAAY,CAAC,QAAQ,mCAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1M,CAAC;IACD,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,MAAM;QAAE,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACjH,OAAO,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,qBAAqB,CAAC,OAAO;YAChC,OAAO,gBAAgB,CAAC,mBAAmB,CAAC;QAC9C,KAAK,qBAAqB,CAAC,SAAS;YAClC,OAAO,gBAAgB,CAAC,qBAAqB,CAAC;QAChD;YACE,OAAO,gBAAgB,CAAC,iBAAiB,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAI,KAAmB,EAAE,IAAY;IACnD,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAkB;IACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAChH,CAAC","sourcesContent":["// Twin of G9SyncData.Client/G9CSyncEngine.cs, .Execution.cs and .Reconcile.cs: one engine per local database, with a\r\n// prioritised run queue (status queries never wait for a running sync) and background runs that yield to user runs.\r\nimport { G9EMoveOutPolicy, G9ESyncDirection } from '../abstractions/enums.js';\r\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\r\nimport { guidToN, newGuid } from '../abstractions/guid.js';\r\nimport { G9SyncParameters, compareOrdinal } from '../abstractions/parameters.js';\r\nimport type { G9Long } from '../abstractions/long.js';\r\nimport { delay, linkSignals, onAbort } from '../internal/abort.js';\r\nimport { sha256, toHex } from '../internal/sha256.js';\r\nimport { utf8Encode } from '../internal/utf8.js';\r\nimport {\r\n G9EPullPartKind,\r\n G9ESubscriptionAction,\r\n type G9DtChangesAvailable,\r\n type G9DtHelloResult,\r\n type G9DtNegotiatedTable,\r\n type G9DtPullPlan,\r\n type G9DtPushRequest,\r\n type G9DtPushResult,\r\n type G9DtReconcileRequest,\r\n type G9DtReconcileSummary,\r\n type G9DtSubscriptionDefinition,\r\n type G9DtSubscriptionState,\r\n type G9DtSyncChunk,\r\n syncErrorToException,\r\n} from '../protocol/dtos.js';\r\nimport { openRowBatch } from '../protocol/rowBatch/reader.js';\r\nimport type { G9SyncClientModel } from './model.js';\r\nimport { G9ESyncPhase, G9SyncProgressTracker, phaseName } from './progress.js';\r\nimport {\r\n G9ESyncOutcome,\r\n G9ESyncPriority,\r\n G9SyncRun,\r\n canCoalesce,\r\n describeModelProblem,\r\n isTransientError,\r\n makeRunResult,\r\n normalizeError,\r\n outcomeName,\r\n priorityName,\r\n requestSignature,\r\n resolveEngineOptions,\r\n resolveRequest,\r\n type G9ResolvedEngineOptions,\r\n type G9ResolvedSyncRequest,\r\n type G9RowsAppliedEvent,\r\n type G9SubscriptionOptions,\r\n type G9SyncEngineOptions,\r\n type G9SyncHealth,\r\n type G9SyncLogLevel,\r\n type G9SyncModelProblem,\r\n type G9SyncRequest,\r\n type G9SyncRunResult,\r\n} from './runs.js';\r\nimport {\r\n G9ApplyReport,\r\n G9ESubscriptionState,\r\n toSubscriptionRef,\r\n type G9ApplySlice,\r\n type G9ChangeFeedEntry,\r\n type G9ChangeFeedKeyFilter,\r\n validateChangeFeedKeyFilter,\r\n type G9LocalCommand,\r\n type G9LocalCommandWriter,\r\n type G9ELocalCommandState,\r\n type G9LocalRowEntry,\r\n type G9PendingSummary,\r\n type G9PushBatch,\r\n type G9QuarantinedRow,\r\n type G9RetainedRow,\r\n type G9SyncClientStore,\r\n type G9SyncRejection,\r\n type G9SyncRunReport,\r\n type G9SyncSubscriptionRecord,\r\n} from './storeTypes.js';\r\nimport type { G9SyncTransport } from './transport.js';\r\n\r\nconst STAT_CONNECTING = 'Connecting';\r\nconst STAT_PLANNING = 'Planning';\r\nconst STAT_PUSH_PER_K_ROW = 'PushPerKRow';\r\nconst STAT_DOWNLOAD_PER_K_ROW = 'DownloadPerKRow';\r\nconst STAT_APPLY_PER_K_ROW = 'ApplyPerKRow';\r\nconst STAT_RECONCILE_PER_SUBSCRIPTION = 'ReconcilePerSubscription';\r\n\r\ninterface QueuedRun {\r\n run: G9SyncRun;\r\n priority: number;\r\n order: number;\r\n}\r\n\r\n/**\r\n * The client sync engine (`G9CSyncEngine`): one per local database. Owns a prioritised run queue, so status queries\r\n * never wait for a running sync and background runs yield to user runs.\r\n */\r\nexport class G9SyncEngine {\r\n readonly model: G9SyncClientModel;\r\n private readonly _store: G9SyncClientStore;\r\n private readonly _transport: G9SyncTransport;\r\n private readonly _options: G9ResolvedEngineOptions;\r\n private readonly _lifetime = linkSignals();\r\n private readonly _queue: QueuedRun[] = [];\r\n private readonly _pokedTables: { [lower: string]: string } = {};\r\n private readonly _rowsAppliedListeners: ((event: G9RowsAppliedEvent) => void)[] = [];\r\n private readonly _runCompletedListeners: ((result: G9SyncRunResult) => void)[] = [];\r\n private readonly _unsubscribePokes: () => void;\r\n\r\n private _initialized = false;\r\n private _initializing: Promise<void> | null = null;\r\n private _clientId = '';\r\n private _order = 0;\r\n private _current: G9SyncRun | null = null;\r\n private _suppressions = 0;\r\n private _autoTimer: ReturnType<typeof setInterval> | null = null;\r\n private _pokeTimer: ReturnType<typeof setTimeout> | null = null;\r\n private _wake: (() => void) | null = null;\r\n private _worker: Promise<void> | null = null;\r\n private _disposed = false;\r\n /** The model problems last logged, so the warning is said once per distinct set (ADR-0061). */\r\n private _reportedModelProblems: string | null = null;\r\n\r\n constructor(store: G9SyncClientStore, transport: G9SyncTransport, model: G9SyncClientModel, options?: G9SyncEngineOptions) {\r\n if (!store) throw new TypeError('A store is required.');\r\n if (!transport) throw new TypeError('A transport is required.');\r\n if (!model) throw new TypeError('A model is required.');\r\n this._store = store;\r\n this._transport = transport;\r\n this.model = model;\r\n this._options = resolveEngineOptions(options);\r\n this._unsubscribePokes = transport.onChangesAvailable((changes) => this._onChangesAvailable(changes));\r\n }\r\n\r\n get clientId(): string {\r\n if (!this._initialized) throw new Error('Call initialize first.');\r\n return this._clientId;\r\n }\r\n\r\n get isRunning(): boolean {\r\n return this._current !== null;\r\n }\r\n\r\n get queuedRuns(): number {\r\n return this._queue.length;\r\n }\r\n\r\n get isBackgroundSuppressed(): boolean {\r\n return this._suppressions > 0;\r\n }\r\n\r\n /** Raised after rows were written locally (download, reconciliation or canonical push results). Returns the unsubscribe function. */\r\n onRowsApplied(listener: (event: G9RowsAppliedEvent) => void): () => void {\r\n this._rowsAppliedListeners.push(listener);\r\n return () => remove(this._rowsAppliedListeners, listener);\r\n }\r\n\r\n onRunCompleted(listener: (result: G9SyncRunResult) => void): () => void {\r\n this._runCompletedListeners.push(listener);\r\n return () => remove(this._runCompletedListeners, listener);\r\n }\r\n\r\n /** Provisions local tables and capture, and starts the run worker. Idempotent. */\r\n initialize(signal?: AbortSignal): Promise<void> {\r\n if (this._initialized) return Promise.resolve();\r\n if (!this._initializing) {\r\n this._initializing = (async () => {\r\n try {\r\n await this._store.initialize(this.model, signal);\r\n this._clientId = await this._store.getClientId(signal);\r\n this._initialized = true;\r\n this._worker = this._workerLoop();\r\n } finally {\r\n if (!this._initialized) this._initializing = null;\r\n }\r\n })();\r\n }\r\n return this._initializing;\r\n }\r\n\r\n // ================================================================ subscriptions\r\n\r\n /** Adds (or returns) a subscription. Its rows arrive on the next run that includes it. */\r\n async subscribe(name: string, parameters?: G9SyncParameters | null, options?: G9SubscriptionOptions | null, signal?: AbortSignal): Promise<G9SyncSubscriptionRecord> {\r\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A subscription name is required.');\r\n await this.initialize(signal);\r\n const state = await this._store.getServerState(signal);\r\n const definition = state.definitions.find((d) => d.name === name) ?? null;\r\n const ephemeral = options?.ephemeral ?? definition?.ephemeral ?? false;\r\n const ttlMs = options?.ttlMs ?? (definition && definition.ephemeral && definition.ttlSeconds > 0 ? definition.ttlSeconds * 1000 : null);\r\n const record = await this._store.ensureSubscription(name, parameters ?? new G9SyncParameters(), ephemeral, ttlMs, options?.adoptExistingRows ?? false, signal);\r\n await this._store.updateSubscription(record.key, { accessed: true }, signal);\r\n return record;\r\n }\r\n\r\n /** Removes a subscription; rows no other subscription holds follow the server's move-out policy. */\r\n async unsubscribe(name: string, parameters?: G9SyncParameters | null, signal?: AbortSignal): Promise<void> {\r\n await this.initialize(signal);\r\n const state = await this._store.getServerState(signal);\r\n const policy = state.definitions.find((d) => d.name === name)?.moveOutPolicy ?? G9EMoveOutPolicy.Delete;\r\n await this._store.removeSubscription(G9SyncParameters.buildSubscriptionKey(name, parameters ?? null), policy, signal);\r\n }\r\n\r\n async getSubscriptions(signal?: AbortSignal): Promise<G9SyncSubscriptionRecord[]> {\r\n await this.initialize(signal);\r\n return this._store.getSubscriptions(signal);\r\n }\r\n\r\n // ================================================================ runs\r\n\r\n /** Queues a run. Identical plain requests already waiting are coalesced into one run. */\r\n run(request?: G9SyncRequest | null): G9SyncRun {\r\n if (!this._initialized) throw new Error('Call initialize first.');\r\n const resolved = resolveRequest(request);\r\n if (canCoalesce(resolved)) {\r\n const signature = requestSignature(resolved);\r\n for (const queued of this._queue) {\r\n const r = queued.run;\r\n if (!r.isStarted && canCoalesce(r.request) && r.request.priority === resolved.priority && requestSignature(r.request) === signature) return r;\r\n }\r\n }\r\n const run = new G9SyncRun(resolved);\r\n this._queue.push({ run, priority: resolved.priority, order: this._order++ });\r\n const current = this._current;\r\n let preempted: G9SyncRun | null = null;\r\n if (current !== null && current.request.priority === G9ESyncPriority.Background && resolved.priority > G9ESyncPriority.Background) {\r\n current.preempted = true;\r\n preempted = current;\r\n }\r\n this._signal();\r\n if (preempted) {\r\n preempted.cancel();\r\n this._log('information', 20001, `Background run ${preempted.runId} pre-empted by run ${run.runId}`);\r\n }\r\n return run;\r\n }\r\n\r\n /** Queues a run and awaits its result. */\r\n sync(request?: G9SyncRequest | null): Promise<G9SyncRunResult> {\r\n return this.run(request).completion;\r\n }\r\n\r\n /** While the returned scope is alive, background runs are skipped. Call the returned function to end it. */\r\n suppressBackground(): () => void {\r\n this._suppressions++;\r\n let done = false;\r\n return () => {\r\n if (done) return;\r\n done = true;\r\n this._suppressions--;\r\n };\r\n }\r\n\r\n /** Queues a background push+pull of every non-heavy subscription on a fixed interval. */\r\n startAutomaticSync(intervalMs: number): void {\r\n if (!(intervalMs > 0)) throw new RangeError('The interval must be positive.');\r\n this.stopAutomaticSync();\r\n this._autoTimer = setInterval(() => this._tryQueueBackground(null), intervalMs);\r\n }\r\n\r\n stopAutomaticSync(): void {\r\n if (this._autoTimer !== null) {\r\n clearInterval(this._autoTimer);\r\n this._autoTimer = null;\r\n }\r\n }\r\n\r\n // ================================================================ queries\r\n\r\n /**\r\n * Records a command (ADR-0025): the server executes the handler registered for `name` on the next push, once, in\r\n * device order. `applyLocally` writes its local effects immediately, in the same transaction.\r\n */\r\n async executeCommand(\r\n name: string,\r\n payloadJson: string,\r\n applyLocally?: ((writer: G9LocalCommandWriter, signal?: AbortSignal) => Promise<void>) | null,\r\n version = 1,\r\n signal?: AbortSignal,\r\n ): Promise<G9LocalCommand> {\r\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A command name is required.');\r\n if (typeof payloadJson !== 'string') throw new TypeError('The payload JSON is required.');\r\n await this.initialize(signal);\r\n return this._store.enqueueCommand({ name, version, payload: payloadJson }, applyLocally ?? null, signal);\r\n }\r\n\r\n /** Frees space taken by an UPLOAD-ONLY table: removes uploaded rows without uploading a delete. */\r\n async forgetUploadedRows(localTable: string, keys?: readonly string[] | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.forgetUploadedRows(localTable, keys ?? null, signal);\r\n }\r\n\r\n async getCommands(state?: G9ELocalCommandState | null, limit = 200, signal?: AbortSignal): Promise<G9LocalCommand[]> {\r\n await this.initialize(signal);\r\n return this._store.getCommands(state ?? null, limit, signal);\r\n }\r\n\r\n async getPendingSummary(signal?: AbortSignal): Promise<G9PendingSummary> {\r\n await this.initialize(signal);\r\n return this._store.getPendingSummary(signal);\r\n }\r\n\r\n async getRejections(signal?: AbortSignal): Promise<G9SyncRejection[]> {\r\n await this.initialize(signal);\r\n return this._store.getRejections(signal);\r\n }\r\n\r\n async getQuarantined(signal?: AbortSignal): Promise<G9QuarantinedRow[]> {\r\n await this.initialize(signal);\r\n return this._store.getQuarantined(signal);\r\n }\r\n\r\n async restoreQuarantined(localTable: string, key: string, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.restoreQuarantined(localTable, key, signal);\r\n }\r\n\r\n /** Throws away every staged pull, so the next run plans afresh. Returns whether there was one. */\r\n async discardStagedPull(signal?: AbortSignal): Promise<boolean> {\r\n await this.initialize(signal);\r\n return (await this._store.discardAllStagedPulls(signal)) > 0;\r\n }\r\n\r\n async discardQuarantined(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.discardQuarantined(localTable ?? null, key ?? null, signal);\r\n }\r\n\r\n async getRetained(signal?: AbortSignal): Promise<G9RetainedRow[]> {\r\n await this.initialize(signal);\r\n return this._store.getRetained(signal);\r\n }\r\n\r\n async retryRejected(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.retryRejected(localTable ?? null, key ?? null, signal);\r\n }\r\n\r\n /**\r\n * Gives up the local change of rejected rows and takes the server's copy (LES-0070, .NET `RevertRejectedAsync`): a row the server\r\n * never had is removed locally, any other is fetched again by the next run with `forceReconcile` - run one after this. Nothing is\r\n * uploaded. Omitted arguments widen the scope.\r\n */\r\n async revertRejected(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.revertRejected(localTable ?? null, key ?? null, signal);\r\n }\r\n\r\n async readChangeFeed(localTable: string, afterSequence: number, limit = 1000, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]> {\r\n await this.initialize(signal);\r\n return this._store.readChangeFeed(localTable, afterSequence, limit, signal);\r\n }\r\n\r\n /**\r\n * The change feed for one table narrowed to the keys `keyFilter` selects (plus every deletion), so a projection of one site does\r\n * not walk the entries of every other one (`ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`).\r\n */\r\n async readChangeFeedFiltered(localTable: string, afterSequence: number, limit: number, keyFilter: G9ChangeFeedKeyFilter, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]> {\r\n validateChangeFeedKeyFilter(keyFilter);\r\n await this.initialize(signal);\r\n return this._store.readChangeFeedFiltered(localTable, afterSequence, limit, keyFilter, signal);\r\n }\r\n\r\n /** The highest sequence readChangeFeed can return today (a watermark above it belongs to a store that no longer exists). */\r\n async getChangeSequence(signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.getChangeSequence(signal);\r\n }\r\n\r\n /** The highest sequence ever purged from the change feed; 0 when nothing was (ADR-0059). */\r\n async getChangeFeedFloor(signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.getChangeFeedFloor(signal);\r\n }\r\n\r\n async adoptExistingRows(signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.adoptExistingRows(signal);\r\n }\r\n\r\n async markDirty(localTable: string, keys: readonly string[], signal?: AbortSignal): Promise<number> {\r\n await this.initialize(signal);\r\n return this._store.markDirty(localTable, keys, signal);\r\n }\r\n\r\n async getHealth(signal?: AbortSignal): Promise<G9SyncHealth> {\r\n await this.initialize(signal);\r\n const state = await this._store.getServerState(signal);\r\n return {\r\n clientId: this._clientId,\r\n isConnected: this._transport.isConnected,\r\n isRunning: this.isRunning,\r\n queuedRuns: this.queuedRuns,\r\n serverEpoch: state.epoch,\r\n lastHelloUtcMs: state.lastHelloUtcMs,\r\n pending: await this._store.getPendingSummary(signal),\r\n subscriptions: await this._store.getSubscriptions(signal),\r\n recentRuns: await this._store.getRecentRunReports(10, signal),\r\n };\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n this.stopAutomaticSync();\r\n this._unsubscribePokes();\r\n this._lifetime.abort();\r\n const abandoned = this._queue.splice(0, this._queue.length);\r\n for (const { run } of abandoned) {\r\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'The sync engine was disposed.') }));\r\n }\r\n this._current?.cancel();\r\n this._signal();\r\n if (this._worker) {\r\n try {\r\n await this._worker;\r\n } catch {\r\n // shutting down\r\n }\r\n }\r\n if (this._pokeTimer !== null) {\r\n clearTimeout(this._pokeTimer);\r\n this._pokeTimer = null;\r\n }\r\n }\r\n\r\n // ================================================================ worker\r\n\r\n private _signal(): void {\r\n const wake = this._wake;\r\n this._wake = null;\r\n if (wake) wake();\r\n }\r\n\r\n private _dequeue(): G9SyncRun | null {\r\n if (this._queue.length === 0) return null;\r\n let best = 0;\r\n for (let i = 1; i < this._queue.length; i++) {\r\n const a = this._queue[i] as QueuedRun;\r\n const b = this._queue[best] as QueuedRun;\r\n if (a.priority > b.priority || (a.priority === b.priority && a.order < b.order)) best = i;\r\n }\r\n return (this._queue.splice(best, 1)[0] as QueuedRun).run;\r\n }\r\n\r\n private async _workerLoop(): Promise<void> {\r\n while (!this._lifetime.signal.aborted) {\r\n const run = this._dequeue();\r\n if (!run) {\r\n await new Promise<void>((resolve) => {\r\n this._wake = resolve;\r\n });\r\n continue;\r\n }\r\n run.isStarted = true;\r\n this._current = run;\r\n try {\r\n await this._executeRun(run);\r\n } catch (exception) {\r\n this._log('error', 20002, `Unexpected failure executing run ${run.runId}`, exception);\r\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Failed, error: normalizeError(exception) }));\r\n } finally {\r\n this._current = null;\r\n }\r\n // A pre-empted background run still owes its work: queue it again behind the run that pre-empted it.\r\n if (run.preempted && run.request.priority === G9ESyncPriority.Background) this._tryQueueBackground(run.request.subscriptions);\r\n }\r\n }\r\n\r\n private _tryQueueBackground(subscriptions: readonly string[] | null): void {\r\n if (!this._initialized || this.isBackgroundSuppressed || (this._options.hooks && !this._options.hooks.isNetworkAvailable) || this._lifetime.signal.aborted) {\r\n return;\r\n }\r\n this.run({ priority: G9ESyncPriority.Background, subscriptions });\r\n }\r\n\r\n private _onChangesAvailable(payload: G9DtChangesAvailable): void {\r\n if (!this._options.pullOnChangesAvailable || payload.tables.length === 0) return;\r\n for (const table of payload.tables) this._pokedTables[table.toLowerCase()] = table;\r\n if (this._pokeTimer === null) this._pokeTimer = setTimeout(() => this._flushPokes(), this._options.changesDebounceMs);\r\n }\r\n\r\n private _flushPokes(): void {\r\n const tables = Object.keys(this._pokedTables);\r\n for (const key of tables) delete this._pokedTables[key];\r\n this._pokeTimer = null;\r\n if (tables.length === 0 || !this._initialized) return;\r\n const signal = this._lifetime.signal;\r\n void (async () => {\r\n try {\r\n const state = await this._store.getServerState(signal);\r\n const names: { [name: string]: true } = {};\r\n let any = false;\r\n for (const d of state.definitions) {\r\n if (!d.heavy && d.tables.some((t) => tables.indexOf(t.toLowerCase()) >= 0)) {\r\n names[d.name] = true;\r\n any = true;\r\n }\r\n }\r\n if (!any) return;\r\n const keys = (await this._store.getSubscriptions(signal)).filter((s) => names[s.name] === true).map((s) => s.key);\r\n if (keys.length > 0) this._tryQueueBackground(keys);\r\n } catch (exception) {\r\n if (!signal.aborted) this._log('warning', 20003, 'Handling a server change notification failed', exception);\r\n }\r\n })();\r\n }\r\n\r\n private _raiseRowsApplied(report: G9ApplyReport, source: G9ESyncPhase, slice: G9ApplySlice | null = null): void {\r\n for (const listener of this._rowsAppliedListeners.slice()) {\r\n try {\r\n listener({ report, source, slice });\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A RowsApplied handler threw', exception);\r\n }\r\n }\r\n }\r\n\r\n private _log(level: G9SyncLogLevel, eventId: number, message: string, error?: unknown): void {\r\n const logger = this._options.logger;\r\n if (!logger) return;\r\n try {\r\n logger.log(level, eventId, message, error);\r\n } catch {\r\n // A logger must never break the sync.\r\n }\r\n }\r\n\r\n // ================================================================ execution\r\n\r\n private async _executeRun(run: G9SyncRun): Promise<void> {\r\n const request = run.request;\r\n const startedUtcMs = Date.now();\r\n const changes = new G9ApplyReport();\r\n const problems: G9DtSubscriptionState[] = [];\r\n let modelProblems: G9SyncModelProblem[] = [];\r\n const synced: string[] = [];\r\n let pushed = 0;\r\n let accepted = 0;\r\n let rejected = 0;\r\n let conflicts = 0;\r\n let downloaded = 0;\r\n let downloadedBytes = 0;\r\n let reconciled = 0;\r\n let error: G9SyncException | null = null;\r\n let outcome: G9ESyncOutcome = G9ESyncOutcome.Succeeded;\r\n\r\n const tracker = new G9SyncProgressTracker(run.runId, (p) => run.publish(p), () => this.queuedRuns, this._options.progressMaxHz);\r\n try {\r\n if (request.priority === G9ESyncPriority.Background && this.isBackgroundSuppressed) {\r\n tracker.complete(G9ESyncPhase.Canceled);\r\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'Background sync is suppressed.') }));\r\n return;\r\n }\r\n\r\n const linked = linkSignals(run.cancellation.signal, this._lifetime.signal);\r\n const ct = linked.signal;\r\n const cancelRegistration = onAbort(ct, () => tracker.setCancelPending());\r\n let hostScope: { dispose(): void | Promise<void> } | null = null;\r\n\r\n try {\r\n const history = await this._store.getPhaseStatistics(ct);\r\n const pending = request.push ? await this._store.getPendingSummary(ct) : null;\r\n this._planPhases(tracker, history, request, pending ? pending.totalRows : 0);\r\n if (this._options.hooks) hostScope = await this._options.hooks.beginRun(run, ct);\r\n\r\n // ---------------------------------------------------------------- 1. connect + hello\r\n tracker.enter(G9ESyncPhase.Connecting);\r\n await this._ensureConnected(ct);\r\n await this._store.collectExpiredEphemeral(Date.now(), ct);\r\n const subscriptions = await this._store.getSubscriptions(ct);\r\n const hello = await this._withRetry(\r\n (token) =>\r\n this._transport.hello(\r\n {\r\n clientId: this._clientId,\r\n appVersion: this._options.appVersion,\r\n protocolVersion: 1,\r\n tables: this.model.tables.map((t) => t.toWire()),\r\n subscriptions: subscriptions.map(toSubscriptionRef),\r\n },\r\n token,\r\n ),\r\n ct,\r\n );\r\n if (hello.error) throw syncErrorToException(hello.error);\r\n await this._store.saveHello(hello, ct);\r\n if (hello.unknownTables.length > 0) {\r\n this._log('warning', 20016, 'The server does not know these client tables (they will not sync): ' + hello.unknownTables.join(', '));\r\n }\r\n\r\n // A column declared with the wrong type syncs in NEITHER direction (ADR-0061): say it on every run's result, and once\r\n // per distinct set in the log.\r\n modelProblems = [];\r\n for (const table of hello.tables) {\r\n for (const column of table.typeMismatchColumns) {\r\n modelProblems.push({ code: G9SyncErrorCodes.ModelTypeMismatch, table: table.name, column: column.name, clientType: column.clientType, serverType: column.serverType });\r\n }\r\n }\r\n if (modelProblems.length > 0) {\r\n const described = modelProblems.map(describeModelProblem).join('; ');\r\n if (this._reportedModelProblems !== described) {\r\n this._reportedModelProblems = described;\r\n this._log(\r\n 'warning',\r\n 20022,\r\n `The client model declares ${modelProblems.length} column(s) with a type the server does not have; they sync in NEITHER direction until the model is fixed: ${described}`,\r\n );\r\n }\r\n if (this._options.failOnTypeMismatch) {\r\n throw new G9SyncException(G9SyncErrorCodes.ModelTypeMismatch, 'The client model declares column types the server does not have; those columns would not sync: ' + described);\r\n }\r\n }\r\n\r\n const negotiated = hello.tables;\r\n const definitions: { [name: string]: G9DtSubscriptionDefinition } = {};\r\n for (const d of hello.definitions) definitions[d.name] = d;\r\n const states: { [key: string]: G9DtSubscriptionState } = {};\r\n for (const state of hello.subscriptions) states[state.key] = state;\r\n\r\n // ---------------------------------------------------------------- 2. push\r\n // A FAILED PUSH MUST NOT COST THE PULL: the failure is rethrown after the pull, never swallowed.\r\n let pushFailure: { error: unknown } | null = null;\r\n if (request.push && pending && (pending.totalRows > 0 || pending.pendingCommands > 0)) {\r\n tracker.enter(G9ESyncPhase.Pushing, pending.totalRows + pending.pendingCommands);\r\n try {\r\n const totals = await this._pushAll(negotiated, subscriptions, hello.maxPushRows, hello.maxPushBytes, tracker, changes, ct);\r\n pushed = totals.pushed;\r\n accepted = totals.accepted;\r\n rejected = totals.rejected;\r\n conflicts = totals.conflicts;\r\n } catch (exception) {\r\n if (ct.aborted) throw exception;\r\n this._log('warning', 20019, `Run ${run.runId}: the push failed; continuing to the pull so the device keeps receiving, then reporting the failure`, exception);\r\n pushFailure = { error: exception };\r\n }\r\n }\r\n\r\n if (request.pull) {\r\n // ------------------------------------------------------------ 3. select subscriptions (+ dependencies)\r\n const selected = await this._selectSubscriptions(request, subscriptions, definitions, problems, ct);\r\n const usable: G9SyncSubscriptionRecord[] = [];\r\n for (const subscription of selected) {\r\n const state = states[subscription.key];\r\n if (\r\n state &&\r\n (state.action === G9ESubscriptionAction.Unknown || state.action === G9ESubscriptionAction.InvalidParameters || state.action === G9ESubscriptionAction.Forbidden)\r\n ) {\r\n problems.push(state);\r\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: actionCode(state.action) }, ct);\r\n // Forbidden: these rows are no longer this caller's to hold (ADR-0048).\r\n if (state.action === G9ESubscriptionAction.Forbidden) {\r\n const released = await this._store.releaseSubscriptionRows(subscription.key, ct);\r\n changes.merge(released);\r\n if (released.total > 0) {\r\n this._log(\r\n 'warning',\r\n 20018,\r\n `Subscription ${subscription.key} is forbidden; released its rows (${released.revokedDeleted} deleted, ${released.revokedQuarantined} quarantined, ${released.revokedRetained} retained)`,\r\n );\r\n this._raiseRowsApplied(released, G9ESyncPhase.Reconciling);\r\n }\r\n }\r\n continue;\r\n }\r\n usable.push(subscription);\r\n }\r\n\r\n // ------------------------------------------------------------ 4. reconcile\r\n const now = Date.now();\r\n const toReconcile = usable.filter((s) => needsReconcile(s, request, states, definitions, now));\r\n tracker.expect(G9ESyncPhase.Reconciling, toReconcile.length * historyOf(history, STAT_RECONCILE_PER_SUBSCRIPTION, 2500));\r\n if (toReconcile.length > 0) {\r\n tracker.enter(G9ESyncPhase.Reconciling, toReconcile.length);\r\n let done = 0;\r\n for (const subscription of toReconcile) {\r\n try {\r\n const report = await this._reconcileSubscription(subscription, definitions[subscription.name] as G9DtSubscriptionDefinition, negotiated, ct);\r\n changes.merge(report);\r\n reconciled += report.total;\r\n if (report.total > 0) this._raiseRowsApplied(report, G9ESyncPhase.Reconciling);\r\n } catch (exception) {\r\n if (isSyncException(exception) && !exception.retryable && exception.code !== G9SyncErrorCodes.Canceled) {\r\n problems.push({ key: subscription.key, action: G9ESubscriptionAction.Reconcile, message: exception.message });\r\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: exception.code }, ct);\r\n } else {\r\n throw exception;\r\n }\r\n }\r\n tracker.report(++done, -1, null, subscription.key);\r\n }\r\n }\r\n\r\n // ------------------------------------------------------------ 5. plan (or resume a staged pull)\r\n tracker.enter(G9ESyncPhase.Planning);\r\n const failedKeys: { [key: string]: true } = {};\r\n for (const p of problems) failedKeys[p.key] = true;\r\n const current: { [key: string]: G9SyncSubscriptionRecord } = {};\r\n for (const s of await this._store.getSubscriptions(ct)) current[s.key] = s;\r\n const plannable = usable.filter((s) => !failedKeys[s.key] && current[s.key] !== undefined).map((s) => current[s.key] as G9SyncSubscriptionRecord);\r\n\r\n // A stage is kept PER GENERATION (ADR-0060); what makes one resumable is that the epoch, permissions, columns and\r\n // the cursors it was planned from are all still exactly what they were.\r\n const generation = stageGeneration(hello, plannable, states, negotiated);\r\n const pruned = await this._store.pruneStagedPulls(Date.now() - this._options.stagedPullMaxAgeMs, this._options.stagedPullsMaxBytes, generation, ct);\r\n if (pruned > 0) this._log('information', 20021, `Removed ${pruned} staged pull(s) past their age or the byte cap`);\r\n\r\n // Snapshot files are offered unless one already failed in this run (ADR-0072): a file is a faster way to the same rows,\r\n // never the only one, so a file the server cannot build or the device rejects costs one replan as rows - not the run.\r\n let allowFiles = this._options.acceptSnapshotFiles;\r\n for (let attempt = 0; ; attempt++) {\r\n const problemsBefore = problems.length;\r\n const syncedBefore = synced.length;\r\n let runId: string | null = null;\r\n try {\r\n const staged = await this._store.getStagedPullForGeneration(generation, ct);\r\n let plan: G9DtPullPlan;\r\n if (staged && staged.createdUtcMs > Date.now() - this._options.stagedPullMaxAgeMs) {\r\n plan = staged.plan;\r\n runId = staged.runId;\r\n this._log('information', 20012, `Resuming staged pull ${runId} (${plan.totalRows} rows planned)`);\r\n } else {\r\n const backfills = await this._store.getPendingBackfills(ct);\r\n const files = allowFiles && this._store.describeSnapshotFiles ? this._store.describeSnapshotFiles(negotiated) : null;\r\n plan = await this._withRetry(\r\n (token) =>\r\n this._transport.planPull(\r\n {\r\n clientId: this._clientId,\r\n subscriptions: plannable.map(toSubscriptionRef),\r\n tables: negotiated.map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\r\n backfills: backfills.slice(),\r\n frameVersion: this._options.maxFrameVersion,\r\n ...(files ? { snapshotFiles: files } : {}),\r\n },\r\n token,\r\n ),\r\n ct,\r\n );\r\n if (plan.error) throw syncErrorToException(plan.error);\r\n runId = guidToN(newGuid());\r\n const plannedFromCursors: { [key: string]: string | null } = {};\r\n for (const s of plannable) plannedFromCursors[s.key] = s.cursor;\r\n await this._store.beginStagedPull(\r\n { runId, plan, createdUtcMs: Date.now(), backfills, generation, plannedFromCursors, stageSequence: 0 },\r\n ct,\r\n );\r\n }\r\n\r\n for (const skipped of plan.skipped) {\r\n problems.push(skipped);\r\n if (skipped.action === G9ESubscriptionAction.Reconcile || skipped.action === G9ESubscriptionAction.ResyncRequired) {\r\n await this._store.updateSubscription(skipped.key, { state: G9ESubscriptionState.NeedsReconcile }, ct);\r\n }\r\n }\r\n\r\n for (const c of plan.cursors) synced.push(c.key);\r\n const fileParts = plan.parts.filter((p) => p.kind === G9EPullPartKind.SnapshotFile);\r\n if (fileParts.length > 0) {\r\n this._log('information', 20025, `The pull carries ${fileParts.length} snapshot file(s) for ${fileParts.reduce((sum, p) => sum + p.rows, 0)} row(s)`);\r\n }\r\n tracker.expect(G9ESyncPhase.Downloading, Math.max(200, (plan.totalRows / 1000) * historyOf(history, STAT_DOWNLOAD_PER_K_ROW, 350)));\r\n tracker.expect(G9ESyncPhase.Applying, Math.max(100, (plan.totalRows / 1000) * historyOf(history, STAT_APPLY_PER_K_ROW, 250)));\r\n\r\n // ------------------------------------------------------------ 6. download (resumable)\r\n tracker.enter(G9ESyncPhase.Downloading, plan.totalRows, plan.estimatedBytes);\r\n const totals = await this._download(runId, plan, tracker, ct);\r\n downloaded = totals.rows;\r\n downloadedBytes = totals.bytes;\r\n\r\n // ------------------------------------------------------------ 7. apply (atomic, or in committed slices)\r\n tracker.enter(G9ESyncPhase.Applying, downloaded);\r\n const applied = await this._store.applyStagedPull(\r\n runId,\r\n (rows) => tracker.report(rows),\r\n (slice) => {\r\n if (slice.report.total > 0) this._raiseRowsApplied(slice.report, G9ESyncPhase.Applying, slice);\r\n },\r\n ct,\r\n );\r\n changes.merge(applied);\r\n break;\r\n } catch (exception) {\r\n if (\r\n attempt === 0 &&\r\n !ct.aborted &&\r\n isSyncException(exception) &&\r\n (exception.code === G9SyncErrorCodes.SnapshotFileUnavailable || exception.code === G9SyncErrorCodes.SnapshotFileCorrupt)\r\n ) {\r\n this._log('warning', 20026, `A snapshot file failed (${exception.code}); the staged download was discarded and the pull is planned again as rows`, exception);\r\n if (runId !== null) await this._store.discardStagedPull(runId);\r\n problems.length = problemsBefore;\r\n synced.length = syncedBefore;\r\n allowFiles = false;\r\n tracker.enter(G9ESyncPhase.Planning);\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------- 8. post steps\r\n for (const step of request.postSteps) {\r\n tracker.enter(G9ESyncPhase.PostStep, 0, 0, step.name);\r\n await step.action({ run, changes, progress: (fraction) => tracker.reportFraction(fraction) }, ct);\r\n }\r\n\r\n // Rows retained after revocation by a RetainWhile rule are re-checked once per run (ADR-0026).\r\n changes.revokedDeleted += await this._store.reevaluateRetained(ct);\r\n\r\n // The pull has been applied and its cursors committed; now the push failure decides the run's fate.\r\n if (pushFailure) throw pushFailure.error;\r\n\r\n outcome = rejected > 0 || problems.length > 0 ? G9ESyncOutcome.CompletedWithRejections : G9ESyncOutcome.Succeeded;\r\n tracker.complete(G9ESyncPhase.Completed);\r\n } catch (exception) {\r\n if (ct.aborted) {\r\n outcome = G9ESyncOutcome.Canceled;\r\n error = new G9SyncException(G9SyncErrorCodes.Canceled, run.preempted ? 'Pre-empted by a higher-priority sync.' : 'The sync was canceled.', { cause: exception });\r\n tracker.complete(G9ESyncPhase.Canceled);\r\n } else {\r\n error = normalizeError(exception);\r\n outcome = G9ESyncOutcome.Failed;\r\n tracker.complete(G9ESyncPhase.Failed);\r\n this._log('warning', 20011, `Run ${run.runId} failed with ${error.code}`, error);\r\n }\r\n } finally {\r\n cancelRegistration();\r\n linked.dispose();\r\n if (hostScope) {\r\n try {\r\n await hostScope.dispose();\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A host scope handler threw', exception);\r\n }\r\n }\r\n }\r\n\r\n const durations = tracker.durations;\r\n const phaseMs: { [phase: string]: number } = {};\r\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\r\n const result = makeRunResult({\r\n runId: run.runId,\r\n outcome,\r\n error,\r\n pushed,\r\n accepted,\r\n rejected,\r\n conflicts,\r\n downloaded,\r\n applied: changes.total,\r\n durationMs: Date.now() - startedUtcMs,\r\n subscriptions: synced,\r\n problems,\r\n modelProblems,\r\n changes,\r\n phaseMs,\r\n });\r\n\r\n try {\r\n await this._persistRun(run, result, durations, startedUtcMs, downloadedBytes, reconciled);\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A run report handler threw', exception);\r\n }\r\n\r\n this._log(\r\n 'information',\r\n 20010,\r\n `Run ${run.runId} finished ${outcomeName(outcome)}: pushed ${pushed}, downloaded ${downloaded}, applied ${changes.total} in ${result.durationMs} ms`,\r\n );\r\n run.complete(result);\r\n for (const listener of this._runCompletedListeners.slice()) {\r\n try {\r\n listener(result);\r\n } catch (exception) {\r\n this._log('warning', 20004, 'A RunCompleted handler threw', exception);\r\n }\r\n }\r\n } finally {\r\n tracker.dispose();\r\n }\r\n }\r\n\r\n private _planPhases(tracker: G9SyncProgressTracker, history: { [key: string]: number }, request: G9ResolvedSyncRequest, pendingRows: number): void {\r\n const connecting = historyOf(history, STAT_CONNECTING, 800);\r\n const pushing = request.push && pendingRows > 0 ? Math.max(300, (pendingRows / 1000) * historyOf(history, STAT_PUSH_PER_K_ROW, 1200)) : 0;\r\n const planning = request.pull ? historyOf(history, STAT_PLANNING, 700) : 0;\r\n const downloading = request.pull ? 2000 : 0;\r\n const applying = request.pull ? 1500 : 0;\r\n tracker.plan(G9ESyncPhase.Connecting, connecting);\r\n if (pushing > 0) tracker.plan(G9ESyncPhase.Pushing, pushing);\r\n if (request.pull) {\r\n tracker.plan(G9ESyncPhase.Reconciling, 0);\r\n tracker.plan(G9ESyncPhase.Planning, planning);\r\n tracker.plan(G9ESyncPhase.Downloading, downloading);\r\n tracker.plan(G9ESyncPhase.Applying, applying);\r\n }\r\n const core = connecting + pushing + planning + downloading + applying;\r\n for (const step of request.postSteps) {\r\n const hint = step.weightHint;\r\n tracker.plan(G9ESyncPhase.PostStep, historyOf(history, 'PostStep:' + step.name, hint >= 0.9 ? core * 9 : (core * hint) / (1 - hint)), step.name);\r\n }\r\n }\r\n\r\n private async _selectSubscriptions(\r\n request: G9ResolvedSyncRequest,\r\n all: G9SyncSubscriptionRecord[],\r\n definitions: { [name: string]: G9DtSubscriptionDefinition },\r\n problems: G9DtSubscriptionState[],\r\n ct: AbortSignal,\r\n ): Promise<G9SyncSubscriptionRecord[]> {\r\n const byKey: { [key: string]: G9SyncSubscriptionRecord } = {};\r\n for (const s of all) byKey[s.key] = s;\r\n const wanted = request.subscriptions;\r\n let roots = wanted === null ? all.slice() : all.filter((s) => wanted.indexOf(s.key) >= 0 || wanted.indexOf(s.name) >= 0);\r\n if (request.priority === G9ESyncPriority.Background && wanted === null) {\r\n roots = roots.filter((s) => !(definitions[s.name] && (definitions[s.name] as G9DtSubscriptionDefinition).heavy));\r\n }\r\n const ordered: G9SyncSubscriptionRecord[] = [];\r\n const visiting: { [key: string]: true } = {};\r\n const done: { [key: string]: true } = {};\r\n\r\n const visit = async (record: G9SyncSubscriptionRecord): Promise<void> => {\r\n if (done[record.key] || visiting[record.key]) return;\r\n visiting[record.key] = true;\r\n const definition = definitions[record.name];\r\n if (definition) {\r\n for (const dependency of definition.dependsOn) {\r\n const parentDefinition = definitions[dependency.name];\r\n if (!parentDefinition) {\r\n if (dependency.required) {\r\n problems.push({ key: record.key, action: G9ESubscriptionAction.Unknown, message: `Required dependency '${dependency.name}' is not available.` });\r\n }\r\n continue;\r\n }\r\n let parent = byKey[dependency.name];\r\n if (!parent) {\r\n parent = await this._store.ensureSubscription(\r\n dependency.name,\r\n new G9SyncParameters(),\r\n parentDefinition.ephemeral,\r\n parentDefinition.ephemeral ? parentDefinition.ttlSeconds * 1000 : null,\r\n false,\r\n ct,\r\n );\r\n byKey[parent.key] = parent;\r\n }\r\n await visit(parent);\r\n }\r\n }\r\n done[record.key] = true;\r\n ordered.push(record);\r\n };\r\n\r\n // Creation order. Two subscriptions created in the same millisecond keep it through their slots (handed out lowest\r\n // free first), then the key, ordinal (JS `<` compares UTF-16 units, like StringComparer.Ordinal) — never the order\r\n // the store happened to list them in (by key: a random GUID decided which site's rows came first, LES-0052).\r\n const sorted = roots\r\n .map((r, i) => ({ r, i }))\r\n .sort((a, b) => a.r.createdUtcMs - b.r.createdUtcMs || a.r.slot - b.r.slot || (a.r.key < b.r.key ? -1 : a.r.key > b.r.key ? 1 : 0) || a.i - b.i);\r\n for (const { r } of sorted) await visit(r);\r\n return ordered;\r\n }\r\n\r\n private async _pushAll(\r\n negotiated: G9DtNegotiatedTable[],\r\n subscriptions: G9SyncSubscriptionRecord[],\r\n serverMaxRows: number,\r\n serverMaxBytes: number,\r\n tracker: G9SyncProgressTracker,\r\n changes: G9ApplyReport,\r\n ct: AbortSignal,\r\n ): Promise<{ pushed: number; accepted: number; rejected: number; conflicts: number }> {\r\n let pushed = 0;\r\n let accepted = 0;\r\n let rejected = 0;\r\n let conflicts = 0;\r\n const references = subscriptions.map(toSubscriptionRef);\r\n // The server's limits win over the device's preference; bytes keep a margin for the header and compression variance.\r\n const targetRows = Math.max(1, serverMaxRows > 0 ? Math.min(this._options.pushBatchRows, serverMaxRows) : this._options.pushBatchRows);\r\n let batchRows = targetRows;\r\n const batchBytes = serverMaxBytes > 0 ? Math.floor(serverMaxBytes * 0.9) : Number.MAX_SAFE_INTEGER;\r\n for (;;) {\r\n const batch = await this._store.buildPushBatch(negotiated, batchRows, batchBytes, ct);\r\n if (!batch) break;\r\n rejected += batch.rejectedLocally;\r\n if (batch.rowCount === 0 && batch.commands.length === 0) break; // only rows that can never be uploaded were left\r\n\r\n const request: G9DtPushRequest = {\r\n clientId: this._clientId,\r\n batchId: batch.batchId,\r\n subscriptions: references,\r\n tables: batch.tables.slice(),\r\n commands: batch.commands.slice(),\r\n // Canonical rows come back in the columns the DEVICE holds (LES-0035).\r\n heldTables: negotiated\r\n .filter((t) => batch.commands.length > 0 || batch.tables.some((p) => p.tableId === t.tableId))\r\n .map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\r\n frameVersion: this._options.maxFrameVersion,\r\n };\r\n let result: G9DtPushResult;\r\n try {\r\n result = await this._withRetry((token) => this._transport.push(request, toChunks(batch), token), ct);\r\n if (result.error) throw syncErrorToException(result.error);\r\n } catch (exception) {\r\n if (isSyncException(exception) && exception.code === G9SyncErrorCodes.RejectTooMany && batchRows > 1 && batch.rowCount > 1) {\r\n // The server rolled the WHOLE push back for too many rejections (ADR-0063): halve and resend the smaller prefix\r\n // under the same batch id, so the valid rows get through and the bad ones are parked one by one.\r\n batchRows = Math.max(1, Math.floor(Math.min(batchRows, batch.rowCount) / 2));\r\n this._log(\r\n 'warning',\r\n 20023,\r\n `Push batch ${batch.batchId} of ${batch.rowCount} rows was rolled back for too many rejections; sending it again as ${batchRows} rows so the valid rows get through`,\r\n );\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n\r\n const report = await this._store.applyPushResult(batch, result, ct);\r\n changes.merge(report);\r\n if (report.upserts + report.deletes > 0) this._raiseRowsApplied(report, G9ESyncPhase.Pushing);\r\n pushed += batch.rowCount + batch.commands.length;\r\n // What the server TOOK (its acknowledgement), not \"sent minus refused\": a row refused on the device (too large) is in\r\n // `rejected` but was never sent (LES-0071).\r\n accepted += report.accepted + report.commandsCompleted;\r\n rejected += result.rejections.length;\r\n conflicts += result.conflicts.length;\r\n tracker.report(pushed);\r\n this._log(\r\n 'debug',\r\n 20014,\r\n `Pushed batch ${batch.batchId}: ${batch.rowCount} rows, ${result.rejections.length} rejected, ${result.conflicts.length} conflicts, replayed ${result.alreadyApplied}`,\r\n );\r\n\r\n if (report.accepted + report.rejected + report.conflicts + report.commandsCompleted === 0 && !result.alreadyApplied) {\r\n this._log('warning', 20015, `Push batch ${batch.batchId} changed no row state; stopping the push loop for this run`);\r\n break;\r\n }\r\n if (batch.rowCount < batchRows && batch.commands.length < batchRows && !batch.truncated && !result.alreadyApplied) break;\r\n // After a split: grow back towards the normal size.\r\n if (batchRows < targetRows) batchRows = Math.min(targetRows, batchRows * 2);\r\n }\r\n return { pushed, accepted, rejected, conflicts };\r\n }\r\n\r\n private async _download(runId: string, plan: G9DtPullPlan, tracker: G9SyncProgressTracker, ct: AbortSignal): Promise<{ rows: number; bytes: number }> {\r\n // maxRetries counts failures in a row WITHOUT progress (the .NET twin, DownloadAsync): progress is the DURABLE resume point\r\n // moving, not a chunk arriving - segments after the last checkpoint are written again on resume.\r\n let failures = 0;\r\n let lastFailedAt: { stagedRows: number; stagedBytes: number } | null = null;\r\n for (;;) {\r\n const resume = await this._store.getResumePoint(runId, ct);\r\n let rows = resume.stagedRows;\r\n let bytes = resume.stagedBytes;\r\n if (resume.complete) return { rows, bytes };\r\n if (lastFailedAt !== null && (resume.stagedRows > lastFailedAt.stagedRows || resume.stagedBytes > lastFailedAt.stagedBytes)) failures = 0;\r\n tracker.report(rows, bytes);\r\n try {\r\n // Inside the try (the .NET twin, DownloadAsync): a reconnect that fails while the network is still down is one more\r\n // transient failure, not the end of the run.\r\n await this._ensureConnected(ct);\r\n for await (const chunk of this._transport.pull(plan.token, resume.continuation, ct)) {\r\n await this._store.stageChunk(runId, chunk, ct);\r\n if (chunk.isFinal) return { rows, bytes };\r\n rows += chunk.rowCount;\r\n bytes += chunk.payload ? chunk.payload.length : 0;\r\n tracker.report(rows, bytes, null, chunk.subscriptionKey ?? null);\r\n }\r\n throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The pull stream ended before its final chunk.');\r\n } catch (exception) {\r\n if (\r\n isSyncException(exception) &&\r\n (exception.code === G9SyncErrorCodes.TokenExpired ||\r\n exception.code === G9SyncErrorCodes.TokenInvalid ||\r\n exception.code === G9SyncErrorCodes.ResyncEpoch ||\r\n exception.code === G9SyncErrorCodes.ResyncAuthChanged)\r\n ) {\r\n await this._store.discardStagedPull(runId);\r\n throw exception;\r\n }\r\n if (!ct.aborted && isTransientError(exception) && failures < this._options.maxRetries) {\r\n this._log('warning', 20013, `Transient pull failure, retry ${failures + 1}: ${messageOf(exception)}`);\r\n await delay(this._backoff(failures), ct);\r\n failures++;\r\n lastFailedAt = resume;\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n }\r\n }\r\n\r\n private async _withRetry<T>(operation: (signal: AbortSignal) => Promise<T>, ct: AbortSignal): Promise<T> {\r\n for (let attempt = 0; ; attempt++) {\r\n try {\r\n await this._ensureConnected(ct);\r\n return await operation(ct);\r\n } catch (exception) {\r\n if (!ct.aborted && isTransientError(exception) && attempt < this._options.maxRetries) {\r\n this._log('warning', 20013, `Transient call failure, retry ${attempt + 1}: ${messageOf(exception)}`);\r\n await delay(this._backoff(attempt), ct);\r\n continue;\r\n }\r\n throw exception;\r\n }\r\n }\r\n }\r\n\r\n private _backoff(attempt: number): number {\r\n return Math.min(30000, this._options.retryBaseDelayMs * Math.pow(2, attempt)) * (0.85 + Math.random() * 0.3);\r\n }\r\n\r\n private async _ensureConnected(ct: AbortSignal): Promise<void> {\r\n if (!this._transport.isConnected) await this._transport.connect(ct);\r\n }\r\n\r\n private async _persistRun(\r\n run: G9SyncRun,\r\n result: G9SyncRunResult,\r\n durations: { [key: string]: number },\r\n startedUtcMs: number,\r\n downloadedBytes: number,\r\n reconciledRows: number,\r\n ): Promise<void> {\r\n const diagnostics = result.changes.diagnostics;\r\n const phaseMs: { [phase: string]: number } = {};\r\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\r\n const report: G9SyncRunReport = {\r\n runId: run.runId,\r\n startedUtcMs,\r\n durationMs: result.durationMs,\r\n outcome: outcomeName(result.outcome),\r\n priority: priorityName(run.request.priority),\r\n errorCode: result.error ? result.error.code : null,\r\n errorMessage: result.error ? result.error.message : null,\r\n pushed: result.pushed,\r\n rejected: result.rejected,\r\n conflicts: result.conflicts,\r\n downloaded: result.downloaded,\r\n applied: result.applied,\r\n downloadedBytes,\r\n subscriptions: result.subscriptions.slice(),\r\n phaseMs,\r\n triggersSkipped: diagnostics.triggersSkipped,\r\n foreignTriggers: diagnostics.foreignTriggers.slice(),\r\n applyTransactions: diagnostics.transactions,\r\n indexesDeferred: diagnostics.deferredIndexCount,\r\n indexRebuildMs: diagnostics.indexRebuildMs,\r\n liveIndexReasons: { ...diagnostics.liveIndexReasons },\r\n unchangedRows: result.changes.unchangedRows,\r\n };\r\n await this._store.saveRunReport(report, this._options.keepRunReports);\r\n\r\n if (!result.isSuccess) return;\r\n const samples: { [key: string]: number } = {};\r\n const connecting = durations[phaseName(G9ESyncPhase.Connecting)];\r\n if (connecting !== undefined) samples[STAT_CONNECTING] = connecting;\r\n const planning = durations[phaseName(G9ESyncPhase.Planning)];\r\n if (planning !== undefined) samples[STAT_PLANNING] = planning;\r\n const pushingMs = durations[phaseName(G9ESyncPhase.Pushing)];\r\n if (result.pushed >= 100 && pushingMs !== undefined) samples[STAT_PUSH_PER_K_ROW] = pushingMs / (result.pushed / 1000);\r\n const downloadingMs = durations[phaseName(G9ESyncPhase.Downloading)];\r\n if (result.downloaded >= 500 && downloadingMs !== undefined) samples[STAT_DOWNLOAD_PER_K_ROW] = downloadingMs / (result.downloaded / 1000);\r\n const applyingMs = durations[phaseName(G9ESyncPhase.Applying)];\r\n if (result.downloaded >= 500 && applyingMs !== undefined) samples[STAT_APPLY_PER_K_ROW] = applyingMs / (result.downloaded / 1000);\r\n const reconcilingMs = durations[phaseName(G9ESyncPhase.Reconciling)];\r\n if (reconcilingMs !== undefined && reconciledRows >= 0 && run.request.pull) {\r\n samples[STAT_RECONCILE_PER_SUBSCRIPTION] = reconcilingMs / Math.max(1, result.subscriptions.length);\r\n }\r\n for (const step of run.request.postSteps) {\r\n const stepMs = durations['PostStep:' + step.name];\r\n if (stepMs !== undefined) samples['PostStep:' + step.name] = stepMs;\r\n }\r\n if (Object.keys(samples).length > 0) await this._store.recordPhaseStatistics(samples);\r\n if (result.applied > 0) await this._store.purgeDeletedFeed(this._options.keepDeletedFeedEntries);\r\n }\r\n\r\n // ================================================================ reconciliation (D-07)\r\n\r\n private async _reconcileSubscription(\r\n subscription: G9SyncSubscriptionRecord,\r\n definition: G9DtSubscriptionDefinition,\r\n negotiated: G9DtNegotiatedTable[],\r\n ct: AbortSignal,\r\n ): Promise<G9ApplyReport> {\r\n const tables: G9DtNegotiatedTable[] = [];\r\n for (const name of definition.tables) {\r\n const table = negotiated.find((t) => t.name.toLowerCase() === name.toLowerCase());\r\n // UploadOnly: the device's own rows, nothing on the server to compare them with.\r\n if (table && table.direction !== G9ESyncDirection.UploadOnly) tables.push(table);\r\n }\r\n\r\n const request: G9DtReconcileRequest = { clientId: this._clientId, subscription: toSubscriptionRef(subscription), tables: [], frameVersion: this._options.maxFrameVersion };\r\n for (const table of tables) request.tables.push(await this._store.computeDigest(subscription.key, table, ct));\r\n\r\n const serverRows: { [tableId: number]: Map<string, { version: number; hash: G9Long }> } = {};\r\n let summary: G9DtReconcileSummary | null = null;\r\n for await (const chunk of this._transport.reconcile(request, ct)) {\r\n if (chunk.isFinal) {\r\n summary = chunk.reconcileSummary ?? null;\r\n break;\r\n }\r\n if (!chunk.payload) continue;\r\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\r\n while (reader.nextSection()) {\r\n let rows = serverRows[reader.tableId];\r\n if (!rows) serverRows[reader.tableId] = rows = new Map();\r\n while (reader.readRow()) rows.set(reader.key, { version: reader.version, hash: reader.rowHash });\r\n }\r\n }\r\n if (!summary) throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The reconcile stream ended before its summary.');\r\n\r\n const report = new G9ApplyReport();\r\n let handedToSnapshot = false;\r\n for (const mismatch of summary.mismatched) {\r\n const table = tables.find((t) => t.tableId === mismatch.tableId);\r\n if (!table) continue;\r\n const server = serverRows[table.tableId] ?? new Map<string, { version: number; hash: G9Long }>();\r\n const buckets = new Set<number>(mismatch.buckets);\r\n const serverKeys = new Set<string>();\r\n server.forEach((_value, key) => serverKeys.add(key));\r\n const local = await this._store.readLocalEntries(subscription.key, table, buckets, serverKeys, ct);\r\n const localByKey = new Map<string, G9LocalRowEntry>();\r\n for (const entry of local) localByKey.set(entry.key, entry);\r\n\r\n const fetch: string[] = [];\r\n const addMembership: string[] = [];\r\n const moveOut: string[] = [];\r\n server.forEach(({ hash }, key) => {\r\n const entry = localByKey.get(key);\r\n if (!entry) fetch.push(key);\r\n else if (entry.dirty) {\r\n // A pending local change is never overwritten here; a row visible again still gets its membership back.\r\n if (!entry.member) addMembership.push(key);\r\n } else if (!entry.hash.equals(hash)) fetch.push(key);\r\n else if (!entry.member) addMembership.push(key);\r\n });\r\n for (const entry of local) {\r\n // Rows with pending changes are released too; the store's revocation policy decides (ADR-0026).\r\n if (entry.member && buckets.has(entry.bucket) && !server.has(entry.key)) moveOut.push(entry.key);\r\n }\r\n\r\n // A difference this large is a download, not a repair (ADR-0066).\r\n if (this._options.reconcileSnapshotThreshold > 0 && fetch.length >= this._options.reconcileSnapshotThreshold) {\r\n const released = await this._store.applyReconcile(subscription.key, table, [], addMembership, moveOut, definition.moveOutPolicy, ct);\r\n report.merge(released);\r\n handedToSnapshot = true;\r\n this._log(\r\n 'information',\r\n 20024,\r\n `Reconciling ${subscription.key} / ${table.name} would fetch ${fetch.length} rows (threshold ${this._options.reconcileSnapshotThreshold}): released what left, and leaving the rows to a staged snapshot pull`,\r\n );\r\n continue;\r\n }\r\n\r\n // Fetched and applied in groups (ADR-0066).\r\n const groupKeys = Math.max(Math.max(1, this._options.fetchKeysPerRequest), this._options.reconcileApplyRows);\r\n let pendingMembership = addMembership;\r\n let pendingMoveOut = moveOut;\r\n let fetched = 0;\r\n for (const group of chunked(fetch, groupKeys)) {\r\n const frames: Uint8Array[] = [];\r\n const returned = new Set<string>();\r\n for (const keys of chunked(group, Math.max(1, this._options.fetchKeysPerRequest))) {\r\n const fetchRequest = {\r\n clientId: this._clientId,\r\n subscription: toSubscriptionRef(subscription),\r\n tableId: table.tableId,\r\n keys,\r\n columns: table.columns.map((c) => c.name),\r\n frameVersion: this._options.maxFrameVersion,\r\n };\r\n for await (const chunk of this._transport.fetchRows(fetchRequest, ct)) {\r\n if (chunk.isFinal || !chunk.payload) continue;\r\n frames.push(chunk.payload);\r\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\r\n while (reader.nextSection()) {\r\n while (reader.readRow()) returned.add(reader.key);\r\n }\r\n }\r\n }\r\n // A key listed but not returned left the subscription between listing and fetch.\r\n const groupMoveOut = group.filter((k) => !returned.has(k) && (localByKey.get(k)?.member ?? false));\r\n for (const key of pendingMoveOut) groupMoveOut.push(key);\r\n const applied = await this._store.applyReconcile(subscription.key, table, frames, pendingMembership, groupMoveOut, definition.moveOutPolicy, ct);\r\n report.merge(applied);\r\n pendingMembership = [];\r\n pendingMoveOut = [];\r\n fetched += group.length;\r\n }\r\n if (fetched === 0 && (pendingMembership.length > 0 || pendingMoveOut.length > 0)) {\r\n report.merge(await this._store.applyReconcile(subscription.key, table, [], pendingMembership, pendingMoveOut, definition.moveOutPolicy, ct));\r\n }\r\n this._log(\r\n 'information',\r\n 20020,\r\n `Reconciled ${subscription.key} / ${table.name}: ${mismatch.buckets.length} buckets differed, fetched ${fetch.length}, adopted ${addMembership.length}, moved out ${moveOut.length}`,\r\n );\r\n }\r\n\r\n await this._store.updateSubscription(\r\n subscription.key,\r\n handedToSnapshot\r\n ? // No cursor: the plan step of this run sees an initial pull and stages a snapshot.\r\n { clearCursor: true, state: G9ESubscriptionState.Active, clearError: true, reconciled: true }\r\n : {\r\n cursor: summary.cursor,\r\n definitionHash: summary.definitionHash,\r\n authHash: summary.authHash,\r\n state: G9ESubscriptionState.Active,\r\n clearError: true,\r\n reconciled: true,\r\n },\r\n ct,\r\n );\r\n return report;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------- helpers\r\n\r\nfunction remove<T>(list: T[], item: T): void {\r\n const index = list.indexOf(item);\r\n if (index >= 0) list.splice(index, 1);\r\n}\r\n\r\nfunction messageOf(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error);\r\n}\r\n\r\nfunction historyOf(history: { [key: string]: number }, key: string, fallback: number): number {\r\n const value = history[key];\r\n return value !== undefined && value > 0 ? value : fallback;\r\n}\r\n\r\nfunction needsReconcile(\r\n subscription: G9SyncSubscriptionRecord,\r\n request: G9ResolvedSyncRequest,\r\n states: { [key: string]: G9DtSubscriptionState },\r\n definitions: { [name: string]: G9DtSubscriptionDefinition },\r\n nowMs: number,\r\n): boolean {\r\n if (subscription.state === G9ESubscriptionState.NeedsReconcile) return true;\r\n const state = states[subscription.key];\r\n if (state && (state.action === G9ESubscriptionAction.Reconcile || state.action === G9ESubscriptionAction.ResyncRequired)) return true;\r\n if (subscription.cursor === null) return false;\r\n if (request.forceReconcile) return true;\r\n const definition = definitions[subscription.name];\r\n return (\r\n definition !== undefined &&\r\n definition.reconcileIntervalMinutes > 0 &&\r\n (subscription.lastReconcileUtcMs ?? subscription.lastSuccessUtcMs ?? subscription.createdUtcMs) < nowMs - definition.reconcileIntervalMinutes * 60000\r\n );\r\n}\r\n\r\n/**\r\n * Everything a staged pull's rows depend on (ADR-0046): the server's epoch, the exact set of subscriptions with their\r\n * definition and authorisation hashes, and the negotiated columns. The cursor is deliberately NOT part of it (ADR-0060).\r\n */\r\nexport function stageGeneration(\r\n hello: G9DtHelloResult,\r\n plannable: readonly G9SyncSubscriptionRecord[],\r\n states: { [key: string]: G9DtSubscriptionState },\r\n negotiated: readonly G9DtNegotiatedTable[],\r\n): string {\r\n let text = guidToN(hello.epoch) + '\\n';\r\n for (const subscription of plannable.slice().sort((a, b) => compareOrdinal(a.key, b.key))) {\r\n const state = states[subscription.key];\r\n text += subscription.key + '\\u001F' + ((state ? state.definitionHash : null) ?? subscription.definitionHash ?? '') + '\\u001F' + ((state ? state.authHash : null) ?? subscription.authHash ?? '') + '\\n';\r\n }\r\n text += '\\n';\r\n const tables = negotiated.map((t, i) => ({ t, i })).sort((a, b) => a.t.tableId - b.t.tableId || a.i - b.i);\r\n for (const { t } of tables) text += String(t.tableId) + '\\u001F' + t.columns.map((c) => c.name).join(',') + '\\n';\r\n return toHex(sha256(utf8Encode(text)));\r\n}\r\n\r\nfunction actionCode(action: number): string {\r\n switch (action) {\r\n case G9ESubscriptionAction.Unknown:\r\n return G9SyncErrorCodes.UnknownSubscription;\r\n case G9ESubscriptionAction.Forbidden:\r\n return G9SyncErrorCodes.SubscriptionForbidden;\r\n default:\r\n return G9SyncErrorCodes.InvalidParameters;\r\n }\r\n}\r\n\r\nfunction chunked<T>(items: readonly T[], size: number): T[][] {\r\n const out: T[][] = [];\r\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\r\n return out;\r\n}\r\n\r\nasync function* toChunks(batch: G9PushBatch): AsyncGenerator<G9DtSyncChunk> {\r\n let sequence = 0;\r\n for (const frame of batch.frames) yield { sequence: sequence++, payload: frame, rowCount: 0, isFinal: false };\r\n}\r\n"]}
|
package/dist/client/runs.d.ts
CHANGED
|
@@ -80,7 +80,11 @@ export interface G9SyncRunResult {
|
|
|
80
80
|
runId: string;
|
|
81
81
|
outcome: G9ESyncOutcome;
|
|
82
82
|
error: G9SyncException | null;
|
|
83
|
+
/** Rows and commands SENT, refused ones included (a row refused on the device before sending is not). */
|
|
83
84
|
pushed: number;
|
|
85
|
+
/** Rows and commands the server TOOK - what an app may call "sent"; never `pushed - rejected` (LES-0071). */
|
|
86
|
+
accepted: number;
|
|
87
|
+
/** Rows refused by the server, or on the device before sending (too large). */
|
|
84
88
|
rejected: number;
|
|
85
89
|
conflicts: number;
|
|
86
90
|
downloaded: number;
|
package/dist/client/runs.js
CHANGED
package/dist/client/runs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/client/runs.ts"],"names":[],"mappings":"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","sourcesContent":["// Twins of G9SyncData.Client/Runs/G9SyncRunTypes.cs and the option/health/error types of G9CSyncEngineOptions.cs.\r\nimport type { G9ESyncColumnType } from '../abstractions/enums.js';\r\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\r\nimport { newGuid } from '../abstractions/guid.js';\r\nimport { G9SyncProtocol } from '../protocol/protocol.js';\r\nimport type { G9DtSubscriptionState } from '../protocol/dtos.js';\r\nimport { G9RowBatchFormatError } from '../protocol/rowBatch/format.js';\r\nimport { columnTypeName } from '../abstractions/enums.js';\r\nimport { createAbortController, type G9AbortController } from '../internal/abort.js';\r\nimport type { G9DtSyncProgress, G9ESyncPhase } from './progress.js';\r\nimport {\r\n G9ApplyReport,\r\n G9ELocalStoreFailure,\r\n isLocalStoreFailure,\r\n type G9ApplySlice,\r\n type G9PendingSummary,\r\n type G9SyncRunReport,\r\n type G9SyncSubscriptionRecord,\r\n} from './storeTypes.js';\r\n\r\n/** Scheduling priority (`G9ESyncPriority`). A higher priority pre-empts a running background run. */\r\nexport const G9ESyncPriority = {\r\n Background: 0,\r\n Foreground: 1,\r\n UserInteractive: 2,\r\n} as const;\r\nexport type G9ESyncPriority = (typeof G9ESyncPriority)[keyof typeof G9ESyncPriority];\r\n\r\nconst PRIORITY_NAMES = ['Background', 'Foreground', 'UserInteractive'];\r\nexport function priorityName(priority: number): string {\r\n return PRIORITY_NAMES[priority] ?? String(priority);\r\n}\r\n\r\n/** `G9ESyncOutcome`. */\r\nexport const G9ESyncOutcome = {\r\n Succeeded: 0,\r\n /** Data moved, but some rows were rejected or some subscriptions reported problems. */\r\n CompletedWithRejections: 1,\r\n Failed: 2,\r\n Canceled: 3,\r\n} as const;\r\nexport type G9ESyncOutcome = (typeof G9ESyncOutcome)[keyof typeof G9ESyncOutcome];\r\n\r\nconst OUTCOME_NAMES = ['Succeeded', 'CompletedWithRejections', 'Failed', 'Canceled'];\r\nexport function outcomeName(outcome: number): string {\r\n return OUTCOME_NAMES[outcome] ?? String(outcome);\r\n}\r\n\r\n/** Context handed to an app-owned post step (`G9CSyncPostStepContext`). */\r\nexport interface G9SyncPostStepContext {\r\n run: G9SyncRun;\r\n /** Everything this run changed so far. */\r\n changes: G9ApplyReport;\r\n /** Report 0..1 of the step; mapped into the step's slice of the bar. */\r\n progress: (fraction: number) => void;\r\n}\r\n\r\n/** An app-owned step that runs after the data applied and owns a slice of the progress bar (`G9CSyncPostStep`). */\r\nexport class G9SyncPostStep {\r\n readonly name: string;\r\n readonly weightHint: number;\r\n readonly action: (context: G9SyncPostStepContext, signal: AbortSignal) => Promise<void>;\r\n\r\n constructor(name: string, weightHint: number, action: (context: G9SyncPostStepContext, signal: AbortSignal) => Promise<void>) {\r\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A post step needs a name.');\r\n if (typeof action !== 'function') throw new TypeError('A post step needs an action.');\r\n this.name = name;\r\n this.weightHint = Math.min(Math.max(weightHint, 0), 0.9);\r\n this.action = action;\r\n }\r\n}\r\n\r\n/** A sync request (`G9CSyncRequest`). */\r\nexport interface G9SyncRequest {\r\n /** Subscription keys or names to pull; omitted = every local subscription (background runs skip heavy ones). */\r\n subscriptions?: readonly string[] | null;\r\n push?: boolean;\r\n pull?: boolean;\r\n /** Reconcile the selected subscriptions even when nothing asks for it. */\r\n forceReconcile?: boolean;\r\n priority?: G9ESyncPriority;\r\n postSteps?: readonly G9SyncPostStep[];\r\n progress?: ((progress: G9DtSyncProgress) => void) | null;\r\n signal?: AbortSignal | null;\r\n}\r\n\r\n/** The request with its defaults filled in. */\r\nexport interface G9ResolvedSyncRequest {\r\n subscriptions: readonly string[] | null;\r\n push: boolean;\r\n pull: boolean;\r\n forceReconcile: boolean;\r\n priority: G9ESyncPriority;\r\n postSteps: readonly G9SyncPostStep[];\r\n progress: ((progress: G9DtSyncProgress) => void) | null;\r\n signal: AbortSignal | null;\r\n}\r\n\r\nexport function resolveRequest(request: G9SyncRequest | null | undefined): G9ResolvedSyncRequest {\r\n return {\r\n subscriptions: request?.subscriptions ?? null,\r\n push: request?.push ?? true,\r\n pull: request?.pull ?? true,\r\n forceReconcile: request?.forceReconcile ?? false,\r\n priority: request?.priority ?? 1,\r\n postSteps: request?.postSteps ?? [],\r\n progress: request?.progress ?? null,\r\n signal: request?.signal ?? null,\r\n };\r\n}\r\n\r\n/** `G9CSyncRequest.CanCoalesce`. */\r\nexport function canCoalesce(request: G9ResolvedSyncRequest): boolean {\r\n return request.postSteps.length === 0 && request.progress === null && request.signal === null;\r\n}\r\n\r\n/** `G9CSyncRequest.Signature`. */\r\nexport function requestSignature(request: G9ResolvedSyncRequest): string {\r\n const subscriptions = request.subscriptions === null ? '*' : request.subscriptions.slice().sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)).join(',');\r\n return `${request.push ? 'True' : 'False'}|${request.pull ? 'True' : 'False'}|${request.forceReconcile ? 'True' : 'False'}|${subscriptions}`;\r\n}\r\n\r\n/** One defect of the client model, as the server sees it (`G9CSyncModelProblem`). */\r\nexport interface G9SyncModelProblem {\r\n code: string;\r\n table: string;\r\n column: string;\r\n clientType: G9ESyncColumnType;\r\n serverType: G9ESyncColumnType;\r\n}\r\n\r\nexport function describeModelProblem(problem: G9SyncModelProblem): string {\r\n return `${problem.table}.${problem.column} is ${columnTypeName(problem.clientType)} on the client and ${columnTypeName(problem.serverType)} on the server`;\r\n}\r\n\r\n/** The result of a run (`G9CSyncRunResult`). */\r\nexport interface G9SyncRunResult {\r\n runId: string;\r\n outcome: G9ESyncOutcome;\r\n error: G9SyncException | null;\r\n pushed: number;\r\n rejected: number;\r\n conflicts: number;\r\n downloaded: number;\r\n applied: number;\r\n durationMs: number;\r\n /** Milliseconds spent in each phase of this run, keyed by phase name. */\r\n phaseMs: { [phase: string]: number };\r\n subscriptions: string[];\r\n /** Subscriptions that could not sync, with the server's reason. */\r\n problems: G9DtSubscriptionState[];\r\n /** Defects of the client model the server reported in this run's hello (ADR-0061). */\r\n modelProblems: G9SyncModelProblem[];\r\n changes: G9ApplyReport;\r\n isSuccess: boolean;\r\n}\r\n\r\nexport function makeRunResult(fields: Partial<G9SyncRunResult> & { runId: string; outcome: G9ESyncOutcome }): G9SyncRunResult {\r\n return {\r\n error: null,\r\n pushed: 0,\r\n rejected: 0,\r\n conflicts: 0,\r\n downloaded: 0,\r\n applied: 0,\r\n durationMs: 0,\r\n phaseMs: {},\r\n subscriptions: [],\r\n problems: [],\r\n modelProblems: [],\r\n changes: new G9ApplyReport(),\r\n ...fields,\r\n isSuccess: fields.outcome === G9ESyncOutcome.Succeeded || fields.outcome === G9ESyncOutcome.CompletedWithRejections,\r\n };\r\n}\r\n\r\n/** A queued or running sync (`G9CSyncRun`). Await {@link completion}; read progress with {@link onProgress} or {@link progress}. */\r\nexport class G9SyncRun {\r\n readonly runId: string = newGuid();\r\n readonly request: G9ResolvedSyncRequest;\r\n readonly completion: Promise<G9SyncRunResult>;\r\n latestProgress: G9DtSyncProgress | null = null;\r\n isStarted = false;\r\n\r\n /** @internal */\r\n readonly cancellation: G9AbortController;\r\n /** @internal */\r\n preempted = false;\r\n\r\n private _resolve!: (result: G9SyncRunResult) => void;\r\n private readonly _listeners: ((progress: G9DtSyncProgress) => void)[] = [];\r\n private readonly _buffer: G9DtSyncProgress[] = [];\r\n private readonly _waiters: ((value: IteratorResult<G9DtSyncProgress>) => void)[] = [];\r\n private _done = false;\r\n private _unlink: () => void = () => undefined;\r\n\r\n constructor(request: G9ResolvedSyncRequest) {\r\n this.request = request;\r\n this.completion = new Promise<G9SyncRunResult>((resolve) => {\r\n this._resolve = resolve;\r\n });\r\n this.cancellation = createAbortController();\r\n const external = request.signal;\r\n if (external) {\r\n if (external.aborted) this.cancellation.abort();\r\n else {\r\n const listener = (): void => this.cancellation.abort();\r\n external.addEventListener('abort', listener);\r\n this._unlink = () => external.removeEventListener('abort', listener);\r\n }\r\n }\r\n }\r\n\r\n /** Requests cancellation. Network phases stop at once; an apply in progress finishes atomically first. */\r\n cancel(): void {\r\n this.cancellation.abort();\r\n }\r\n\r\n /** Subscribes to progress samples; returns the unsubscribe function. */\r\n onProgress(listener: (progress: G9DtSyncProgress) => void): () => void {\r\n this._listeners.push(listener);\r\n return () => {\r\n const index = this._listeners.indexOf(listener);\r\n if (index >= 0) this._listeners.splice(index, 1);\r\n };\r\n }\r\n\r\n /** The progress stream (bounded: the oldest samples are dropped when a reader falls 64 behind), ending with the run. */\r\n progress(): AsyncIterable<G9DtSyncProgress> {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const run = this;\r\n return {\r\n [Symbol.asyncIterator](): AsyncIterator<G9DtSyncProgress> {\r\n return {\r\n next(): Promise<IteratorResult<G9DtSyncProgress>> {\r\n const value = run._buffer.shift();\r\n if (value) return Promise.resolve({ value, done: false });\r\n if (run._done) return Promise.resolve({ value: undefined as unknown as G9DtSyncProgress, done: true });\r\n return new Promise((resolve) => run._waiters.push(resolve));\r\n },\r\n };\r\n },\r\n };\r\n }\r\n\r\n /** @internal */\r\n publish(progress: G9DtSyncProgress): void {\r\n this.latestProgress = progress;\r\n const waiter = this._waiters.shift();\r\n if (waiter) waiter({ value: progress, done: false });\r\n else {\r\n this._buffer.push(progress);\r\n if (this._buffer.length > 64) this._buffer.shift();\r\n }\r\n for (const listener of this._listeners.slice()) {\r\n try {\r\n listener(progress);\r\n } catch {\r\n // A progress consumer must never break the sync.\r\n }\r\n }\r\n try {\r\n this.request.progress?.(progress);\r\n } catch {\r\n // A progress consumer must never break the sync.\r\n }\r\n }\r\n\r\n /** @internal */\r\n complete(result: G9SyncRunResult): void {\r\n if (this._done) return;\r\n this._done = true;\r\n for (const waiter of this._waiters.splice(0, this._waiters.length)) waiter({ value: undefined as unknown as G9DtSyncProgress, done: true });\r\n this._unlink();\r\n this._resolve(result);\r\n }\r\n}\r\n\r\n/** `G9CSubscriptionOptions`. */\r\nexport interface G9SubscriptionOptions {\r\n /** Overrides the server definition's ephemeral flag. */\r\n ephemeral?: boolean;\r\n ttlMs?: number;\r\n /** The rows already exist locally: reconcile instead of downloading a snapshot. Call adoptExistingRows first. */\r\n adoptExistingRows?: boolean;\r\n}\r\n\r\n/** Engine options (`G9CSyncEngineOptions`). Durations are milliseconds. */\r\nexport interface G9SyncEngineOptions {\r\n /** Sent at Hello; the server's connect gates may refuse old versions. */\r\n appVersion?: string | null;\r\n pushBatchRows?: number;\r\n /** Transient failures retried inside one run. */\r\n maxRetries?: number;\r\n retryBaseDelayMs?: number;\r\n /** Queue a background pull when the server pokes about changed tables. */\r\n pullOnChangesAvailable?: boolean;\r\n changesDebounceMs?: number;\r\n progressMaxHz?: number;\r\n fetchKeysPerRequest?: number;\r\n /** Rows a reconciliation fetches before it applies them (ADR-0066). */\r\n reconcileApplyRows?: number;\r\n /** A reconciliation that would fetch at least this many rows of one table hands them to a staged snapshot (ADR-0066). 0 = never. */\r\n reconcileSnapshotThreshold?: number;\r\n /** The largest decoded body accepted from one server frame (ADR-0051). */\r\n maxDecodedFrameBytes?: number;\r\n /** The newest G9RowBatch body layout to ask the server for (ADR-0040). */\r\n maxFrameVersion?: number;\r\n /** Fail a run when the server reports a client column whose type differs (ADR-0061). */\r\n failOnTypeMismatch?: boolean;\r\n /**\r\n * Offer the server to send large first downloads as SQLite snapshot files (ADR-0072), when the store can take them (a store\r\n * with a `snapshotFiles` sink). Default true. A file that fails is replaced by the same pull as rows, in the same run.\r\n */\r\n acceptSnapshotFiles?: boolean;\r\n /** A staged pull older than this is discarded instead of resumed. */\r\n stagedPullMaxAgeMs?: number;\r\n /** Most payload bytes kept in stages other than the one a run resumes (ADR-0060). */\r\n stagedPullsMaxBytes?: number;\r\n keepDeletedFeedEntries?: number;\r\n keepRunReports?: number;\r\n /** Where the engine logs (the ILogger twin); silent when omitted. */\r\n logger?: G9SyncLogger | null;\r\n /** Platform integration (foreground service, keep-awake, connectivity). */\r\n hooks?: G9SyncHostHooks | null;\r\n}\r\n\r\nexport type G9ResolvedEngineOptions = Required<Omit<G9SyncEngineOptions, 'appVersion' | 'logger' | 'hooks'>> & {\r\n appVersion: string | null;\r\n logger: G9SyncLogger | null;\r\n hooks: G9SyncHostHooks | null;\r\n};\r\n\r\nexport function resolveEngineOptions(options: G9SyncEngineOptions | null | undefined): G9ResolvedEngineOptions {\r\n return {\r\n appVersion: options?.appVersion ?? null,\r\n pushBatchRows: options?.pushBatchRows ?? 2000,\r\n maxRetries: options?.maxRetries ?? 5,\r\n retryBaseDelayMs: options?.retryBaseDelayMs ?? 1000,\r\n pullOnChangesAvailable: options?.pullOnChangesAvailable ?? true,\r\n changesDebounceMs: options?.changesDebounceMs ?? 2000,\r\n progressMaxHz: options?.progressMaxHz ?? 10,\r\n fetchKeysPerRequest: options?.fetchKeysPerRequest ?? 2000,\r\n reconcileApplyRows: options?.reconcileApplyRows ?? 20000,\r\n reconcileSnapshotThreshold: options?.reconcileSnapshotThreshold ?? 100000,\r\n maxDecodedFrameBytes: options?.maxDecodedFrameBytes ?? 64 * 1024 * 1024,\r\n maxFrameVersion: options?.maxFrameVersion ?? G9SyncProtocol.MaxFrameVersion,\r\n failOnTypeMismatch: options?.failOnTypeMismatch ?? false,\r\n acceptSnapshotFiles: options?.acceptSnapshotFiles ?? true,\r\n stagedPullMaxAgeMs: options?.stagedPullMaxAgeMs ?? 90 * 60 * 1000,\r\n stagedPullsMaxBytes: options?.stagedPullsMaxBytes ?? 64 * 1024 * 1024,\r\n keepDeletedFeedEntries: options?.keepDeletedFeedEntries ?? 50000,\r\n keepRunReports: options?.keepRunReports ?? 50,\r\n logger: options?.logger ?? null,\r\n hooks: options?.hooks ?? null,\r\n };\r\n}\r\n\r\n/** Log levels of {@link G9SyncLogger} (Microsoft.Extensions.Logging's). */\r\nexport type G9SyncLogLevel = 'debug' | 'information' | 'warning' | 'error';\r\n\r\n/** Where the library logs. `eventId` is the .NET LoggerMessage event id of the same message. */\r\nexport interface G9SyncLogger {\r\n log(level: G9SyncLogLevel, eventId: number, message: string, error?: unknown): void;\r\n}\r\n\r\n/** Platform integration points (`IG9SyncHostHooks`). */\r\nexport interface G9SyncHostHooks {\r\n /** Called when a run starts executing; the returned scope's `dispose` runs when it ends. */\r\n beginRun(run: G9SyncRun, signal: AbortSignal): Promise<{ dispose(): void | Promise<void> } | null>;\r\n /** False skips automatic background runs. */\r\n readonly isNetworkAvailable: boolean;\r\n}\r\n\r\n/** `G9CSyncHealth`. */\r\nexport interface G9SyncHealth {\r\n clientId: string;\r\n isConnected: boolean;\r\n isRunning: boolean;\r\n queuedRuns: number;\r\n serverEpoch: string | null;\r\n lastHelloUtcMs: number | null;\r\n pending: G9PendingSummary;\r\n subscriptions: G9SyncSubscriptionRecord[];\r\n recentRuns: G9SyncRunReport[];\r\n}\r\n\r\n/** `G9CRowsAppliedEventArgs`. */\r\nexport interface G9RowsAppliedEvent {\r\n report: G9ApplyReport;\r\n source: G9ESyncPhase;\r\n /** Set for a staged pull applied in slices (ADR-0053). */\r\n slice: G9ApplySlice | null;\r\n}\r\n\r\n/** `G9CSyncErrors.Normalize`: every failure becomes a G9SyncException with a stable code. */\r\nexport function normalizeError(error: unknown): G9SyncException {\r\n if (isSyncException(error)) return error as G9SyncException;\r\n const message = error instanceof Error ? error.message : String(error);\r\n if (error instanceof Error && error.name === 'AbortError') return new G9SyncException(G9SyncErrorCodes.Canceled, 'The sync was canceled.', { cause: error });\r\n if (isLocalStoreFailure(error)) {\r\n const code =\r\n error.localStoreFailure === G9ELocalStoreFailure.Corrupt\r\n ? G9SyncErrorCodes.LocalStoreCorrupt\r\n : error.localStoreFailure === G9ELocalStoreFailure.DiskFull\r\n ? G9SyncErrorCodes.LocalStoreDiskFull\r\n : error.localStoreFailure === G9ELocalStoreFailure.Busy\r\n ? G9SyncErrorCodes.LocalStoreBusy\r\n : G9SyncErrorCodes.LocalStoreError;\r\n return new G9SyncException(code, message, { cause: error });\r\n }\r\n if (error instanceof G9RowBatchFormatError) return new G9SyncException(G9SyncErrorCodes.Unknown, message, { cause: error });\r\n if (error instanceof Error && (error.name === 'TimeoutError' || /network|socket|websocket|connection/i.test(error.name))) {\r\n return new G9SyncException(G9SyncErrorCodes.NetworkFailure, message, { cause: error });\r\n }\r\n return new G9SyncException(G9SyncErrorCodes.Unknown, message, { cause: error });\r\n}\r\n\r\n/** `G9CSyncErrors.IsTransient`. */\r\nexport function isTransientError(error: unknown): boolean {\r\n const code = normalizeError(error).code;\r\n return code === G9SyncErrorCodes.NetworkFailure || code === G9SyncErrorCodes.ServerError || code === G9SyncErrorCodes.ServerBusy;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/client/runs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAA0B,MAAM,sBAAsB,CAAC;AAErF,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,mBAAmB,GAKpB,MAAM,iBAAiB,CAAC;AAEzB,qGAAqG;AACrG,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,eAAe,EAAE,CAAC;CACV,CAAC;AAGX,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;AACvE,MAAM,UAAU,YAAY,CAAC,QAAgB;;IAC3C,OAAO,MAAA,cAAc,CAAC,QAAQ,CAAC,mCAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,SAAS,EAAE,CAAC;IACZ,uFAAuF;IACvF,uBAAuB,EAAE,CAAC;IAC1B,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;CACH,CAAC;AAGX,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,yBAAyB,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACrF,MAAM,UAAU,WAAW,CAAC,OAAe;;IACzC,OAAO,MAAA,aAAa,CAAC,OAAO,CAAC,mCAAI,MAAM,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC;AAWD,mHAAmH;AACnH,MAAM,OAAO,cAAc;IAKzB,YAAY,IAAY,EAAE,UAAkB,EAAE,MAA8E;QAC1H,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACrG,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AA4BD,MAAM,UAAU,cAAc,CAAC,OAAyC;;IACtE,OAAO;QACL,aAAa,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,mCAAI,IAAI;QAC7C,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,IAAI;QAC3B,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,IAAI;QAC3B,cAAc,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,mCAAI,KAAK;QAChD,QAAQ,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,CAAC;QAChC,SAAS,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,EAAE;QACnC,QAAQ,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,IAAI;QACnC,MAAM,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,IAAI;KAChC,CAAC;AACJ,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAC,OAA8B;IACxD,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;AAChG,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,gBAAgB,CAAC,OAA8B;IAC7D,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClJ,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;AAC/I,CAAC;AAWD,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC9D,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,OAAO,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAC7J,CAAC;AA4BD,MAAM,UAAU,aAAa,CAAC,MAA6E;IACzG,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,EAAE;QACZ,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,IAAI,aAAa,EAAE;QAC5B,GAAG,MAAM;QACT,SAAS,EAAE,MAAM,CAAC,OAAO,KAAK,cAAc,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,CAAC,uBAAuB;KACpH,CAAC;AACJ,CAAC;AAED,oIAAoI;AACpI,MAAM,OAAO,SAAS;IAmBpB,YAAY,OAA8B;QAlBjC,UAAK,GAAW,OAAO,EAAE,CAAC;QAGnC,mBAAc,GAA4B,IAAI,CAAC;QAC/C,cAAS,GAAG,KAAK,CAAC;QAIlB,gBAAgB;QAChB,cAAS,GAAG,KAAK,CAAC;QAGD,eAAU,GAA6C,EAAE,CAAC;QAC1D,YAAO,GAAuB,EAAE,CAAC;QACjC,aAAQ,GAA0D,EAAE,CAAC;QAC9E,UAAK,GAAG,KAAK,CAAC;QACd,YAAO,GAAe,GAAG,EAAE,CAAC,SAAS,CAAC;QAG5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,EAAE;YACzD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,qBAAqB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,OAAO;gBAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;iBAC3C,CAAC;gBACJ,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBACvD,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC7C,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,0GAA0G;IAC1G,MAAM;QACJ,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,wEAAwE;IACxE,UAAU,CAAC,QAA8C;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,KAAK,IAAI,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC;IAED,wHAAwH;IACxH,QAAQ;QACN,4DAA4D;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC;QACjB,OAAO;YACL,CAAC,MAAM,CAAC,aAAa,CAAC;gBACpB,OAAO;oBACL,IAAI;wBACF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBAClC,IAAI,KAAK;4BAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC1D,IAAI,GAAG,CAAC,KAAK;4BAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAwC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;wBACvG,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC9D,CAAC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,QAA0B;;QAChC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,MAAM;YAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;aAChD,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE;gBAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrD,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAA,MAAA,IAAI,CAAC,OAAO,EAAC,QAAQ,mDAAG,QAAQ,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,QAAQ,CAAC,MAAuB;QAC9B,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,EAAE,KAAK,EAAE,SAAwC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5I,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;CACF;AAyDD,MAAM,UAAU,oBAAoB,CAAC,OAA+C;;IAClF,OAAO;QACL,UAAU,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,IAAI;QACvC,aAAa,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,mCAAI,IAAI;QAC7C,UAAU,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,CAAC;QACpC,gBAAgB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,mCAAI,IAAI;QACnD,sBAAsB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,sBAAsB,mCAAI,IAAI;QAC/D,iBAAiB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,mCAAI,IAAI;QACrD,aAAa,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,mCAAI,EAAE;QAC3C,mBAAmB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,mCAAI,IAAI;QACzD,kBAAkB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,kBAAkB,mCAAI,KAAK;QACxD,0BAA0B,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,0BAA0B,mCAAI,MAAM;QACzE,oBAAoB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,oBAAoB,mCAAI,EAAE,GAAG,IAAI,GAAG,IAAI;QACvE,eAAe,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,mCAAI,cAAc,CAAC,eAAe;QAC3E,kBAAkB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,kBAAkB,mCAAI,KAAK;QACxD,mBAAmB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,mCAAI,IAAI;QACzD,kBAAkB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,kBAAkB,mCAAI,EAAE,GAAG,EAAE,GAAG,IAAI;QACjE,mBAAmB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,mCAAI,EAAE,GAAG,IAAI,GAAG,IAAI;QACrE,sBAAsB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,sBAAsB,mCAAI,KAAK;QAChE,cAAc,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,mCAAI,EAAE;QAC7C,MAAM,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,IAAI;QAC/B,KAAK,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,IAAI;KAC9B,CAAC;AACJ,CAAC;AAuCD,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,KAAwB,CAAC;IAC5D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7J,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GACR,KAAK,CAAC,iBAAiB,KAAK,oBAAoB,CAAC,OAAO;YACtD,CAAC,CAAC,gBAAgB,CAAC,iBAAiB;YACpC,CAAC,CAAC,KAAK,CAAC,iBAAiB,KAAK,oBAAoB,CAAC,QAAQ;gBACzD,CAAC,CAAC,gBAAgB,CAAC,kBAAkB;gBACrC,CAAC,CAAC,KAAK,CAAC,iBAAiB,KAAK,oBAAoB,CAAC,IAAI;oBACrD,CAAC,CAAC,gBAAgB,CAAC,cAAc;oBACjC,CAAC,CAAC,gBAAgB,CAAC,eAAe,CAAC;QAC3C,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,KAAK,YAAY,qBAAqB;QAAE,OAAO,IAAI,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5H,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACzH,OAAO,IAAI,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;IACxC,OAAO,IAAI,KAAK,gBAAgB,CAAC,cAAc,IAAI,IAAI,KAAK,gBAAgB,CAAC,WAAW,IAAI,IAAI,KAAK,gBAAgB,CAAC,UAAU,CAAC;AACnI,CAAC","sourcesContent":["// Twins of G9SyncData.Client/Runs/G9SyncRunTypes.cs and the option/health/error types of G9CSyncEngineOptions.cs.\r\nimport type { G9ESyncColumnType } from '../abstractions/enums.js';\r\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\r\nimport { newGuid } from '../abstractions/guid.js';\r\nimport { G9SyncProtocol } from '../protocol/protocol.js';\r\nimport type { G9DtSubscriptionState } from '../protocol/dtos.js';\r\nimport { G9RowBatchFormatError } from '../protocol/rowBatch/format.js';\r\nimport { columnTypeName } from '../abstractions/enums.js';\r\nimport { createAbortController, type G9AbortController } from '../internal/abort.js';\r\nimport type { G9DtSyncProgress, G9ESyncPhase } from './progress.js';\r\nimport {\r\n G9ApplyReport,\r\n G9ELocalStoreFailure,\r\n isLocalStoreFailure,\r\n type G9ApplySlice,\r\n type G9PendingSummary,\r\n type G9SyncRunReport,\r\n type G9SyncSubscriptionRecord,\r\n} from './storeTypes.js';\r\n\r\n/** Scheduling priority (`G9ESyncPriority`). A higher priority pre-empts a running background run. */\r\nexport const G9ESyncPriority = {\r\n Background: 0,\r\n Foreground: 1,\r\n UserInteractive: 2,\r\n} as const;\r\nexport type G9ESyncPriority = (typeof G9ESyncPriority)[keyof typeof G9ESyncPriority];\r\n\r\nconst PRIORITY_NAMES = ['Background', 'Foreground', 'UserInteractive'];\r\nexport function priorityName(priority: number): string {\r\n return PRIORITY_NAMES[priority] ?? String(priority);\r\n}\r\n\r\n/** `G9ESyncOutcome`. */\r\nexport const G9ESyncOutcome = {\r\n Succeeded: 0,\r\n /** Data moved, but some rows were rejected or some subscriptions reported problems. */\r\n CompletedWithRejections: 1,\r\n Failed: 2,\r\n Canceled: 3,\r\n} as const;\r\nexport type G9ESyncOutcome = (typeof G9ESyncOutcome)[keyof typeof G9ESyncOutcome];\r\n\r\nconst OUTCOME_NAMES = ['Succeeded', 'CompletedWithRejections', 'Failed', 'Canceled'];\r\nexport function outcomeName(outcome: number): string {\r\n return OUTCOME_NAMES[outcome] ?? String(outcome);\r\n}\r\n\r\n/** Context handed to an app-owned post step (`G9CSyncPostStepContext`). */\r\nexport interface G9SyncPostStepContext {\r\n run: G9SyncRun;\r\n /** Everything this run changed so far. */\r\n changes: G9ApplyReport;\r\n /** Report 0..1 of the step; mapped into the step's slice of the bar. */\r\n progress: (fraction: number) => void;\r\n}\r\n\r\n/** An app-owned step that runs after the data applied and owns a slice of the progress bar (`G9CSyncPostStep`). */\r\nexport class G9SyncPostStep {\r\n readonly name: string;\r\n readonly weightHint: number;\r\n readonly action: (context: G9SyncPostStepContext, signal: AbortSignal) => Promise<void>;\r\n\r\n constructor(name: string, weightHint: number, action: (context: G9SyncPostStepContext, signal: AbortSignal) => Promise<void>) {\r\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A post step needs a name.');\r\n if (typeof action !== 'function') throw new TypeError('A post step needs an action.');\r\n this.name = name;\r\n this.weightHint = Math.min(Math.max(weightHint, 0), 0.9);\r\n this.action = action;\r\n }\r\n}\r\n\r\n/** A sync request (`G9CSyncRequest`). */\r\nexport interface G9SyncRequest {\r\n /** Subscription keys or names to pull; omitted = every local subscription (background runs skip heavy ones). */\r\n subscriptions?: readonly string[] | null;\r\n push?: boolean;\r\n pull?: boolean;\r\n /** Reconcile the selected subscriptions even when nothing asks for it. */\r\n forceReconcile?: boolean;\r\n priority?: G9ESyncPriority;\r\n postSteps?: readonly G9SyncPostStep[];\r\n progress?: ((progress: G9DtSyncProgress) => void) | null;\r\n signal?: AbortSignal | null;\r\n}\r\n\r\n/** The request with its defaults filled in. */\r\nexport interface G9ResolvedSyncRequest {\r\n subscriptions: readonly string[] | null;\r\n push: boolean;\r\n pull: boolean;\r\n forceReconcile: boolean;\r\n priority: G9ESyncPriority;\r\n postSteps: readonly G9SyncPostStep[];\r\n progress: ((progress: G9DtSyncProgress) => void) | null;\r\n signal: AbortSignal | null;\r\n}\r\n\r\nexport function resolveRequest(request: G9SyncRequest | null | undefined): G9ResolvedSyncRequest {\r\n return {\r\n subscriptions: request?.subscriptions ?? null,\r\n push: request?.push ?? true,\r\n pull: request?.pull ?? true,\r\n forceReconcile: request?.forceReconcile ?? false,\r\n priority: request?.priority ?? 1,\r\n postSteps: request?.postSteps ?? [],\r\n progress: request?.progress ?? null,\r\n signal: request?.signal ?? null,\r\n };\r\n}\r\n\r\n/** `G9CSyncRequest.CanCoalesce`. */\r\nexport function canCoalesce(request: G9ResolvedSyncRequest): boolean {\r\n return request.postSteps.length === 0 && request.progress === null && request.signal === null;\r\n}\r\n\r\n/** `G9CSyncRequest.Signature`. */\r\nexport function requestSignature(request: G9ResolvedSyncRequest): string {\r\n const subscriptions = request.subscriptions === null ? '*' : request.subscriptions.slice().sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)).join(',');\r\n return `${request.push ? 'True' : 'False'}|${request.pull ? 'True' : 'False'}|${request.forceReconcile ? 'True' : 'False'}|${subscriptions}`;\r\n}\r\n\r\n/** One defect of the client model, as the server sees it (`G9CSyncModelProblem`). */\r\nexport interface G9SyncModelProblem {\r\n code: string;\r\n table: string;\r\n column: string;\r\n clientType: G9ESyncColumnType;\r\n serverType: G9ESyncColumnType;\r\n}\r\n\r\nexport function describeModelProblem(problem: G9SyncModelProblem): string {\r\n return `${problem.table}.${problem.column} is ${columnTypeName(problem.clientType)} on the client and ${columnTypeName(problem.serverType)} on the server`;\r\n}\r\n\r\n/** The result of a run (`G9CSyncRunResult`). */\r\nexport interface G9SyncRunResult {\r\n runId: string;\r\n outcome: G9ESyncOutcome;\r\n error: G9SyncException | null;\r\n /** Rows and commands SENT, refused ones included (a row refused on the device before sending is not). */\r\n pushed: number;\r\n /** Rows and commands the server TOOK - what an app may call \"sent\"; never `pushed - rejected` (LES-0071). */\r\n accepted: number;\r\n /** Rows refused by the server, or on the device before sending (too large). */\r\n rejected: number;\r\n conflicts: number;\r\n downloaded: number;\r\n applied: number;\r\n durationMs: number;\r\n /** Milliseconds spent in each phase of this run, keyed by phase name. */\r\n phaseMs: { [phase: string]: number };\r\n subscriptions: string[];\r\n /** Subscriptions that could not sync, with the server's reason. */\r\n problems: G9DtSubscriptionState[];\r\n /** Defects of the client model the server reported in this run's hello (ADR-0061). */\r\n modelProblems: G9SyncModelProblem[];\r\n changes: G9ApplyReport;\r\n isSuccess: boolean;\r\n}\r\n\r\nexport function makeRunResult(fields: Partial<G9SyncRunResult> & { runId: string; outcome: G9ESyncOutcome }): G9SyncRunResult {\r\n return {\r\n error: null,\r\n pushed: 0,\r\n accepted: 0,\r\n rejected: 0,\r\n conflicts: 0,\r\n downloaded: 0,\r\n applied: 0,\r\n durationMs: 0,\r\n phaseMs: {},\r\n subscriptions: [],\r\n problems: [],\r\n modelProblems: [],\r\n changes: new G9ApplyReport(),\r\n ...fields,\r\n isSuccess: fields.outcome === G9ESyncOutcome.Succeeded || fields.outcome === G9ESyncOutcome.CompletedWithRejections,\r\n };\r\n}\r\n\r\n/** A queued or running sync (`G9CSyncRun`). Await {@link completion}; read progress with {@link onProgress} or {@link progress}. */\r\nexport class G9SyncRun {\r\n readonly runId: string = newGuid();\r\n readonly request: G9ResolvedSyncRequest;\r\n readonly completion: Promise<G9SyncRunResult>;\r\n latestProgress: G9DtSyncProgress | null = null;\r\n isStarted = false;\r\n\r\n /** @internal */\r\n readonly cancellation: G9AbortController;\r\n /** @internal */\r\n preempted = false;\r\n\r\n private _resolve!: (result: G9SyncRunResult) => void;\r\n private readonly _listeners: ((progress: G9DtSyncProgress) => void)[] = [];\r\n private readonly _buffer: G9DtSyncProgress[] = [];\r\n private readonly _waiters: ((value: IteratorResult<G9DtSyncProgress>) => void)[] = [];\r\n private _done = false;\r\n private _unlink: () => void = () => undefined;\r\n\r\n constructor(request: G9ResolvedSyncRequest) {\r\n this.request = request;\r\n this.completion = new Promise<G9SyncRunResult>((resolve) => {\r\n this._resolve = resolve;\r\n });\r\n this.cancellation = createAbortController();\r\n const external = request.signal;\r\n if (external) {\r\n if (external.aborted) this.cancellation.abort();\r\n else {\r\n const listener = (): void => this.cancellation.abort();\r\n external.addEventListener('abort', listener);\r\n this._unlink = () => external.removeEventListener('abort', listener);\r\n }\r\n }\r\n }\r\n\r\n /** Requests cancellation. Network phases stop at once; an apply in progress finishes atomically first. */\r\n cancel(): void {\r\n this.cancellation.abort();\r\n }\r\n\r\n /** Subscribes to progress samples; returns the unsubscribe function. */\r\n onProgress(listener: (progress: G9DtSyncProgress) => void): () => void {\r\n this._listeners.push(listener);\r\n return () => {\r\n const index = this._listeners.indexOf(listener);\r\n if (index >= 0) this._listeners.splice(index, 1);\r\n };\r\n }\r\n\r\n /** The progress stream (bounded: the oldest samples are dropped when a reader falls 64 behind), ending with the run. */\r\n progress(): AsyncIterable<G9DtSyncProgress> {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const run = this;\r\n return {\r\n [Symbol.asyncIterator](): AsyncIterator<G9DtSyncProgress> {\r\n return {\r\n next(): Promise<IteratorResult<G9DtSyncProgress>> {\r\n const value = run._buffer.shift();\r\n if (value) return Promise.resolve({ value, done: false });\r\n if (run._done) return Promise.resolve({ value: undefined as unknown as G9DtSyncProgress, done: true });\r\n return new Promise((resolve) => run._waiters.push(resolve));\r\n },\r\n };\r\n },\r\n };\r\n }\r\n\r\n /** @internal */\r\n publish(progress: G9DtSyncProgress): void {\r\n this.latestProgress = progress;\r\n const waiter = this._waiters.shift();\r\n if (waiter) waiter({ value: progress, done: false });\r\n else {\r\n this._buffer.push(progress);\r\n if (this._buffer.length > 64) this._buffer.shift();\r\n }\r\n for (const listener of this._listeners.slice()) {\r\n try {\r\n listener(progress);\r\n } catch {\r\n // A progress consumer must never break the sync.\r\n }\r\n }\r\n try {\r\n this.request.progress?.(progress);\r\n } catch {\r\n // A progress consumer must never break the sync.\r\n }\r\n }\r\n\r\n /** @internal */\r\n complete(result: G9SyncRunResult): void {\r\n if (this._done) return;\r\n this._done = true;\r\n for (const waiter of this._waiters.splice(0, this._waiters.length)) waiter({ value: undefined as unknown as G9DtSyncProgress, done: true });\r\n this._unlink();\r\n this._resolve(result);\r\n }\r\n}\r\n\r\n/** `G9CSubscriptionOptions`. */\r\nexport interface G9SubscriptionOptions {\r\n /** Overrides the server definition's ephemeral flag. */\r\n ephemeral?: boolean;\r\n ttlMs?: number;\r\n /** The rows already exist locally: reconcile instead of downloading a snapshot. Call adoptExistingRows first. */\r\n adoptExistingRows?: boolean;\r\n}\r\n\r\n/** Engine options (`G9CSyncEngineOptions`). Durations are milliseconds. */\r\nexport interface G9SyncEngineOptions {\r\n /** Sent at Hello; the server's connect gates may refuse old versions. */\r\n appVersion?: string | null;\r\n pushBatchRows?: number;\r\n /** Transient failures retried inside one run. */\r\n maxRetries?: number;\r\n retryBaseDelayMs?: number;\r\n /** Queue a background pull when the server pokes about changed tables. */\r\n pullOnChangesAvailable?: boolean;\r\n changesDebounceMs?: number;\r\n progressMaxHz?: number;\r\n fetchKeysPerRequest?: number;\r\n /** Rows a reconciliation fetches before it applies them (ADR-0066). */\r\n reconcileApplyRows?: number;\r\n /** A reconciliation that would fetch at least this many rows of one table hands them to a staged snapshot (ADR-0066). 0 = never. */\r\n reconcileSnapshotThreshold?: number;\r\n /** The largest decoded body accepted from one server frame (ADR-0051). */\r\n maxDecodedFrameBytes?: number;\r\n /** The newest G9RowBatch body layout to ask the server for (ADR-0040). */\r\n maxFrameVersion?: number;\r\n /** Fail a run when the server reports a client column whose type differs (ADR-0061). */\r\n failOnTypeMismatch?: boolean;\r\n /**\r\n * Offer the server to send large first downloads as SQLite snapshot files (ADR-0072), when the store can take them (a store\r\n * with a `snapshotFiles` sink). Default true. A file that fails is replaced by the same pull as rows, in the same run.\r\n */\r\n acceptSnapshotFiles?: boolean;\r\n /** A staged pull older than this is discarded instead of resumed. */\r\n stagedPullMaxAgeMs?: number;\r\n /** Most payload bytes kept in stages other than the one a run resumes (ADR-0060). */\r\n stagedPullsMaxBytes?: number;\r\n keepDeletedFeedEntries?: number;\r\n keepRunReports?: number;\r\n /** Where the engine logs (the ILogger twin); silent when omitted. */\r\n logger?: G9SyncLogger | null;\r\n /** Platform integration (foreground service, keep-awake, connectivity). */\r\n hooks?: G9SyncHostHooks | null;\r\n}\r\n\r\nexport type G9ResolvedEngineOptions = Required<Omit<G9SyncEngineOptions, 'appVersion' | 'logger' | 'hooks'>> & {\r\n appVersion: string | null;\r\n logger: G9SyncLogger | null;\r\n hooks: G9SyncHostHooks | null;\r\n};\r\n\r\nexport function resolveEngineOptions(options: G9SyncEngineOptions | null | undefined): G9ResolvedEngineOptions {\r\n return {\r\n appVersion: options?.appVersion ?? null,\r\n pushBatchRows: options?.pushBatchRows ?? 2000,\r\n maxRetries: options?.maxRetries ?? 5,\r\n retryBaseDelayMs: options?.retryBaseDelayMs ?? 1000,\r\n pullOnChangesAvailable: options?.pullOnChangesAvailable ?? true,\r\n changesDebounceMs: options?.changesDebounceMs ?? 2000,\r\n progressMaxHz: options?.progressMaxHz ?? 10,\r\n fetchKeysPerRequest: options?.fetchKeysPerRequest ?? 2000,\r\n reconcileApplyRows: options?.reconcileApplyRows ?? 20000,\r\n reconcileSnapshotThreshold: options?.reconcileSnapshotThreshold ?? 100000,\r\n maxDecodedFrameBytes: options?.maxDecodedFrameBytes ?? 64 * 1024 * 1024,\r\n maxFrameVersion: options?.maxFrameVersion ?? G9SyncProtocol.MaxFrameVersion,\r\n failOnTypeMismatch: options?.failOnTypeMismatch ?? false,\r\n acceptSnapshotFiles: options?.acceptSnapshotFiles ?? true,\r\n stagedPullMaxAgeMs: options?.stagedPullMaxAgeMs ?? 90 * 60 * 1000,\r\n stagedPullsMaxBytes: options?.stagedPullsMaxBytes ?? 64 * 1024 * 1024,\r\n keepDeletedFeedEntries: options?.keepDeletedFeedEntries ?? 50000,\r\n keepRunReports: options?.keepRunReports ?? 50,\r\n logger: options?.logger ?? null,\r\n hooks: options?.hooks ?? null,\r\n };\r\n}\r\n\r\n/** Log levels of {@link G9SyncLogger} (Microsoft.Extensions.Logging's). */\r\nexport type G9SyncLogLevel = 'debug' | 'information' | 'warning' | 'error';\r\n\r\n/** Where the library logs. `eventId` is the .NET LoggerMessage event id of the same message. */\r\nexport interface G9SyncLogger {\r\n log(level: G9SyncLogLevel, eventId: number, message: string, error?: unknown): void;\r\n}\r\n\r\n/** Platform integration points (`IG9SyncHostHooks`). */\r\nexport interface G9SyncHostHooks {\r\n /** Called when a run starts executing; the returned scope's `dispose` runs when it ends. */\r\n beginRun(run: G9SyncRun, signal: AbortSignal): Promise<{ dispose(): void | Promise<void> } | null>;\r\n /** False skips automatic background runs. */\r\n readonly isNetworkAvailable: boolean;\r\n}\r\n\r\n/** `G9CSyncHealth`. */\r\nexport interface G9SyncHealth {\r\n clientId: string;\r\n isConnected: boolean;\r\n isRunning: boolean;\r\n queuedRuns: number;\r\n serverEpoch: string | null;\r\n lastHelloUtcMs: number | null;\r\n pending: G9PendingSummary;\r\n subscriptions: G9SyncSubscriptionRecord[];\r\n recentRuns: G9SyncRunReport[];\r\n}\r\n\r\n/** `G9CRowsAppliedEventArgs`. */\r\nexport interface G9RowsAppliedEvent {\r\n report: G9ApplyReport;\r\n source: G9ESyncPhase;\r\n /** Set for a staged pull applied in slices (ADR-0053). */\r\n slice: G9ApplySlice | null;\r\n}\r\n\r\n/** `G9CSyncErrors.Normalize`: every failure becomes a G9SyncException with a stable code. */\r\nexport function normalizeError(error: unknown): G9SyncException {\r\n if (isSyncException(error)) return error as G9SyncException;\r\n const message = error instanceof Error ? error.message : String(error);\r\n if (error instanceof Error && error.name === 'AbortError') return new G9SyncException(G9SyncErrorCodes.Canceled, 'The sync was canceled.', { cause: error });\r\n if (isLocalStoreFailure(error)) {\r\n const code =\r\n error.localStoreFailure === G9ELocalStoreFailure.Corrupt\r\n ? G9SyncErrorCodes.LocalStoreCorrupt\r\n : error.localStoreFailure === G9ELocalStoreFailure.DiskFull\r\n ? G9SyncErrorCodes.LocalStoreDiskFull\r\n : error.localStoreFailure === G9ELocalStoreFailure.Busy\r\n ? G9SyncErrorCodes.LocalStoreBusy\r\n : G9SyncErrorCodes.LocalStoreError;\r\n return new G9SyncException(code, message, { cause: error });\r\n }\r\n if (error instanceof G9RowBatchFormatError) return new G9SyncException(G9SyncErrorCodes.Unknown, message, { cause: error });\r\n if (error instanceof Error && (error.name === 'TimeoutError' || /network|socket|websocket|connection/i.test(error.name))) {\r\n return new G9SyncException(G9SyncErrorCodes.NetworkFailure, message, { cause: error });\r\n }\r\n return new G9SyncException(G9SyncErrorCodes.Unknown, message, { cause: error });\r\n}\r\n\r\n/** `G9CSyncErrors.IsTransient`. */\r\nexport function isTransientError(error: unknown): boolean {\r\n const code = normalizeError(error).code;\r\n return code === G9SyncErrorCodes.NetworkFailure || code === G9SyncErrorCodes.ServerError || code === G9SyncErrorCodes.ServerBusy;\r\n}\r\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** The package version; equal to the .NET packages' (G9SyncDataVersion) — one release, both sides. */
|
|
2
|
-
export declare const VERSION = "1.5.
|
|
2
|
+
export declare const VERSION = "1.5.5";
|
|
3
3
|
export { G9EConflictPolicy, G9EMoveOutPolicy, G9ESyncColumnType, G9ESyncDirection, columnTypeName, isColumnType } from './abstractions/enums.js';
|
|
4
4
|
export { G9SyncErrorCodes, G9SyncException, isRetryableCode, isSyncException, type G9SyncExceptionOptions } from './abstractions/errors.js';
|
|
5
5
|
export { G9Long, parseJson, stringifyJson } from './abstractions/long.js';
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// doubles `@g9tm/syncdata/testing`, the pure-JavaScript Brotli decoder `@g9tm/syncdata/brotli-js`; Lynx wiring is the
|
|
4
4
|
// separate package `@g9tm/syncdata-lynx`. Every public type keeps its .NET name without the G9C prefix (PARITY.md).
|
|
5
5
|
/** The package version; equal to the .NET packages' (G9SyncDataVersion) — one release, both sides. */
|
|
6
|
-
export const VERSION = '1.5.
|
|
6
|
+
export const VERSION = '1.5.5';
|
|
7
7
|
// abstractions
|
|
8
8
|
export { G9EConflictPolicy, G9EMoveOutPolicy, G9ESyncColumnType, G9ESyncDirection, columnTypeName, isColumnType } from './abstractions/enums.js';
|
|
9
9
|
export { G9SyncErrorCodes, G9SyncException, isRetryableCode, isSyncException } from './abstractions/errors.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wHAAwH;AACxH,uHAAuH;AACvH,sHAAsH;AACtH,oHAAoH;AAEpH,sGAAsG;AACtG,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjJ,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5I,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAElF,WAAW;AACX,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC5G,OAAO,EACL,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAA4E,MAAM,+BAA+B,CAAC;AAC3I,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,2BAA2B,GAI5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAqB,MAAM,4BAA4B,CAAC;AAE3H,SAAS;AACT,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,wBAAwB,EAAmD,MAAM,mBAAmB,CAAC;AAC9K,cAAc,wBAAwB,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,oBAAoB,GAYrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnE,2CAA2C;AAC3C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["// @g9tm/syncdata — the TypeScript twin of the G9SyncData .NET client (abstractions, protocol, engine). The SQLite store\n// is `@g9tm/syncdata/sqlite`, the SignalR transport `@g9tm/syncdata/signalr`, Node helpers `@g9tm/syncdata/node`, test\n// doubles `@g9tm/syncdata/testing`, the pure-JavaScript Brotli decoder `@g9tm/syncdata/brotli-js`; Lynx wiring is the\n// separate package `@g9tm/syncdata-lynx`. Every public type keeps its .NET name without the G9C prefix (PARITY.md).\n\n/** The package version; equal to the .NET packages' (G9SyncDataVersion) — one release, both sides. */\nexport const VERSION = '1.5.
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wHAAwH;AACxH,uHAAuH;AACvH,sHAAsH;AACtH,oHAAoH;AAEpH,sGAAsG;AACtG,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjJ,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5I,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAElF,WAAW;AACX,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC5G,OAAO,EACL,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAA4E,MAAM,+BAA+B,CAAC;AAC3I,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,2BAA2B,GAI5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAqB,MAAM,4BAA4B,CAAC;AAE3H,SAAS;AACT,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,wBAAwB,EAAmD,MAAM,mBAAmB,CAAC;AAC9K,cAAc,wBAAwB,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,oBAAoB,GAYrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnE,2CAA2C;AAC3C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["// @g9tm/syncdata — the TypeScript twin of the G9SyncData .NET client (abstractions, protocol, engine). The SQLite store\n// is `@g9tm/syncdata/sqlite`, the SignalR transport `@g9tm/syncdata/signalr`, Node helpers `@g9tm/syncdata/node`, test\n// doubles `@g9tm/syncdata/testing`, the pure-JavaScript Brotli decoder `@g9tm/syncdata/brotli-js`; Lynx wiring is the\n// separate package `@g9tm/syncdata-lynx`. Every public type keeps its .NET name without the G9C prefix (PARITY.md).\n\n/** The package version; equal to the .NET packages' (G9SyncDataVersion) — one release, both sides. */\nexport const VERSION = '1.5.5';\n\n// abstractions\nexport { G9EConflictPolicy, G9EMoveOutPolicy, G9ESyncColumnType, G9ESyncDirection, columnTypeName, isColumnType } from './abstractions/enums.js';\nexport { G9SyncErrorCodes, G9SyncException, isRetryableCode, isSyncException, type G9SyncExceptionOptions } from './abstractions/errors.js';\nexport { G9Long, parseJson, stringifyJson } from './abstractions/long.js';\nexport { EMPTY_GUID, guidToN, newGuid, normalizeGuid, tryNormalizeGuid } from './abstractions/guid.js';\nexport { G9SyncKey } from './abstractions/key.js';\nexport { G9SyncDigest } from './abstractions/digest.js';\nexport { G9SyncParameters, escapeDataString } from './abstractions/parameters.js';\n\n// protocol\nexport * from './protocol/dtos.js';\nexport { G9SyncHubErrors, G9SyncProtocol, negotiateFrameVersion, tableGroup } from './protocol/protocol.js';\nexport {\n bytesField,\n dateTimeMs,\n fromMessagePackNames,\n G9WireGuid,\n GUID_EXTENSION_TYPE,\n readChangesAvailable,\n readContinuation,\n readHelloResult,\n readPullPlan,\n readPushResult,\n readReconcileSummary,\n readSyncChunk,\n toMessagePackNames,\n type G9WireFormat,\n} from './protocol/wire.js';\nexport { G9ECompression, G9EPushRowOp, G9ERowBatchOp, G9RowBatchFormat, G9RowBatchFormatError } from './protocol/rowBatch/format.js';\nexport { G9RowBatchWriter, type G9DateTimeOffsetValue, type G9DateTimeValue, type G9FrameCompressor } from './protocol/rowBatch/writer.js';\nexport {\n G9RowBatchReader,\n getDefaultFrameDecompressor,\n openRowBatch,\n openRowBatchSync,\n readFrameHeader,\n setDefaultFrameDecompressor,\n type G9FrameDecompressor,\n type G9FrameHeader,\n type G9OpenRowBatchOptions,\n} from './protocol/rowBatch/reader.js';\nexport { decimalToDouble, formatDecimal, formatDouble, parseDecimal, type DecimalParts } from './internal/dotnetFormat.js';\n\n// client\nexport { G9SyncClientModel, G9SyncClientModelBuilder, G9SyncClientTable, G9SyncClientTableBuilder, type G9SyncClientColumn, type G9SyncClientIndex } from './client/model.js';\nexport * from './client/storeTypes.js';\nexport type { G9SyncTransport } from './client/transport.js';\nexport { G9ESyncPhase, G9SyncProgressTracker, phaseName, type G9DtSyncProgress } from './client/progress.js';\nexport {\n G9ESyncOutcome,\n G9ESyncPriority,\n G9SyncPostStep,\n G9SyncRun,\n describeModelProblem,\n isTransientError,\n normalizeError,\n outcomeName,\n priorityName,\n resolveEngineOptions,\n type G9RowsAppliedEvent,\n type G9SubscriptionOptions,\n type G9SyncEngineOptions,\n type G9SyncHealth,\n type G9SyncHostHooks,\n type G9SyncLogger,\n type G9SyncLogLevel,\n type G9SyncModelProblem,\n type G9SyncPostStepContext,\n type G9SyncRequest,\n type G9SyncRunResult,\n} from './client/runs.js';\nexport { G9SyncEngine, stageGeneration } from './client/engine.js';\n\n// helpers the Lynx package and tests share\nexport { base64ToBytes, bytesToBase64 } from './internal/base64.js';\nexport { utf8Decode, utf8Encode } from './internal/utf8.js';\nexport { md5 } from './internal/md5.js';\nexport { sha256, toHex } from './internal/sha256.js';\nexport { cancellationError, createAbortController, delay, linkSignals, onAbort, yieldToEventLoop } from './internal/abort.js';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@g9tm/syncdata",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.5",
|
|
4
4
|
"description": "TypeScript twin of the G9SyncData .NET client for Lynx, Node and browsers: the sync engine, the G9RowBatch protocol, the SQLite client store (same schema as the .NET store) and the SignalR transport.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Iman Kari (G9TM)",
|