@dudousxd/nestjs-durable-testing 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/admission-backend-conformance.ts","../src/assertions.ts","../src/durable-columns.ts","../src/harness.ts","../src/replay.ts","../src/state-store-conformance.ts","../src/checkpoint-aggregation-contract.ts","../src/steps.ts","../src/transport-conformance.ts"],"sourcesContent":["import type { AdmissionBackend, QueueConfig } from '@dudousxd/nestjs-durable-core';\nimport { describe, expect, it } from 'vitest';\n\n/**\n * Builds an {@link AdmissionBackend} bound to the given test clock. Implementations that hold their\n * own resources (e.g. a Redis connection) should register the instance for teardown out-of-band.\n */\nexport type AdmissionBackendFactory = (clock: () => number) => AdmissionBackend;\n\n/**\n * The SHARED cross-backend behavioural contract for the flow-control admission gate. Both the\n * in-process `InMemoryAdmissionBackend` and the Redis `RedisAdmissionBackend` run it, so their\n * concurrency / rate-limit / ordering semantics can never silently drift apart — backend-specific\n * concerns (leases, pub/sub, cross-pod globality) live in each adapter's own spec.\n *\n * The engine always passes a stable `waiterId`, so every gated call is order-tracked: ties with no\n * priority/fairness fall back to arrival FIFO (or LIFO when configured). These cases assert exactly\n * that, on ONE backend instance.\n */\nexport function runAdmissionBackendContract(\n name: string,\n makeBackend: AdmissionBackendFactory,\n): void {\n describe(`AdmissionBackend contract: ${name}`, () => {\n let now = 1_000_000;\n const make = (config: QueueConfig) => {\n now = 1_000_000;\n const backend = makeBackend(() => now);\n backend.register(config);\n return backend;\n };\n\n it('caps concurrency: a second call blocks until the first releases', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('q', { waiterId: 'a' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'b' })).ok).toBe(false);\n await b.release('q', 'a');\n expect((await b.tryAdmit('q', { waiterId: 'b' })).ok).toBe(true);\n });\n\n it('enforces a fixed-window rate limit', async () => {\n const b = make({ name: 'q', rateLimit: { limit: 2, periodMs: 1000 } });\n expect((await b.tryAdmit('q', { waiterId: '1' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: '2' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: '3' })).ok).toBe(false);\n now += 1001;\n expect((await b.tryAdmit('q', { waiterId: '4' })).ok).toBe(true);\n });\n\n it('admits the highest-priority waiter first when a slot frees', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('q', { waiterId: 'holder' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'low', priority: 1 })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'high', priority: 9 })).ok).toBe(false);\n await b.release('q', 'holder');\n expect((await b.tryAdmit('q', { waiterId: 'low', priority: 1 })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'high', priority: 9 })).ok).toBe(true);\n });\n\n it('orders plain-concurrency waiters by arrival (FIFO) — no priority/fairness configured', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('q', { waiterId: 'holder' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(false);\n await b.release('q', 'holder');\n // The earlier arrival wins the freed slot, on every backend.\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(true);\n });\n\n it('admits the most-recent arrival first when order is LIFO', async () => {\n const b = make({ name: 'q', concurrency: 1, order: 'lifo' });\n expect((await b.tryAdmit('q', { waiterId: 'holder' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(false);\n await b.release('q', 'holder');\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(true);\n });\n\n it('round-robins a contended slot across fairness keys', async () => {\n const b = make({ name: 'q', concurrency: 1, fairness: 'key' });\n expect((await b.tryAdmit('q', { waiterId: 'a0', key: 'A' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'a1', key: 'A' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'b0', key: 'B' })).ok).toBe(false);\n await b.release('q', 'a0');\n // B (never served) wins over A (just served), not arrival order.\n expect((await b.tryAdmit('q', { waiterId: 'a1', key: 'A' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'b0', key: 'B' })).ok).toBe(true);\n });\n\n it('leaves an unregistered queue ungated', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('other', { waiterId: 'x' })).ok).toBe(true);\n expect((await b.tryAdmit('other', { waiterId: 'y' })).ok).toBe(true);\n });\n });\n}\n","import type { RunStatus, StateStore } from '@dudousxd/nestjs-durable-core';\n\nasync function requireRun(store: StateStore, runId: string) {\n const run = await store.getRun(runId);\n if (!run) throw new Error(`assertion failed: run ${runId} not found`);\n return run;\n}\n\nexport async function assertRunStatus(\n store: StateStore,\n runId: string,\n status: RunStatus,\n): Promise<void> {\n const run = await requireRun(store, runId);\n if (run.status !== status) {\n throw new Error(`expected run ${runId} to be \"${status}\", but it was \"${run.status}\"`);\n }\n}\n\nexport async function assertOutput(\n store: StateStore,\n runId: string,\n expected: unknown,\n): Promise<void> {\n const run = await requireRun(store, runId);\n if (JSON.stringify(run.output) !== JSON.stringify(expected)) {\n throw new Error(\n `expected run ${runId} output ${JSON.stringify(expected)}, got ${JSON.stringify(run.output)}`,\n );\n }\n}\n\n/** The names of the steps that have run, in order. */\nexport async function recordedSteps(store: StateStore, runId: string): Promise<string[]> {\n return (await store.listCheckpoints(runId)).map((cp) => cp.name);\n}\n\n/** Assert every named step ran (in any order). */\nexport async function assertStepsRan(\n store: StateStore,\n runId: string,\n names: string[],\n): Promise<void> {\n const ran = await recordedSteps(store, runId);\n for (const name of names) {\n if (!ran.includes(name)) {\n throw new Error(`expected step \"${name}\" to have run; ran: [${ran.join(', ')}]`);\n }\n }\n}\n\n/** Assert a step ran exactly the given number of attempts (e.g. to verify retries). */\nexport async function assertStepAttempts(\n store: StateStore,\n runId: string,\n name: string,\n attempts: number,\n): Promise<void> {\n const cp = (await store.listCheckpoints(runId)).find((c) => c.name === name);\n if (!cp) throw new Error(`expected step \"${name}\" to have run, but it did not`);\n if (cp.attempts !== attempts) {\n throw new Error(`expected step \"${name}\" to take ${attempts} attempt(s), took ${cp.attempts}`);\n }\n}\n","/**\n * The canonical physical column names for the durable tables, keyed by table → entity property →\n * column. This is the cross-adapter contract: a run written by one store adapter must be readable by\n * another, so EVERY adapter (TypeORM, MikroORM, Prisma, Drizzle) must map these properties to these\n * exact columns. The canonical convention is `snake_case`.\n *\n * Each adapter has a spec that asserts its physical columns against this map (see `assertDurableColumns`).\n * Without it, adapters silently diverge — one defaulting to its ORM's `snake_case` naming strategy,\n * another keeping the verbatim camelCase property name — and a store swap fails against an existing\n * table with \"Unknown column\" only at runtime. The map exists so that divergence is a failing unit\n * test, not a production incident.\n *\n * The camelCase (\"preserve\") naming is simply the property names themselves (the object keys), so no\n * separate map is needed for it.\n *\n * A property belongs here only when EVERY adapter declares it — the assertion walks this map and\n * reports a missing property as a mismatch, so listing a column one adapter doesn't have would fail\n * that adapter for a divergence it isn't guilty of. An absence here therefore records one of two\n * different things, and telling them apart matters: a naming question nobody has settled, or a\n * capability one adapter has and the others do not.\n *\n * `WorkflowRun.namespace` was the standing example of the second kind, and it is worth keeping the\n * story because of how it ended. Only the MikroORM adapter had the column; the other three did not\n * declare the `namespace` parameter on `listPendingRuns`/`listIncompleteRuns`/`listDueTimers` at\n * all, which TypeScript permits, so they satisfied `StateStore` while ignoring the tenant boundary\n * entirely. The gap was real and this map was right to stay quiet about it — but \"this map is quiet\"\n * was also the only thing standing between that and a cross-tenant incident. All four adapters carry\n * the column now, so it is pinned below, and the conformance suite asserts the boundary itself\n * rather than only the column's name.\n */\nexport const DURABLE_CANONICAL_COLUMNS = {\n durable_workflow_runs: {\n id: 'id',\n workflow: 'workflow',\n workflowVersion: 'workflow_version',\n status: 'status',\n input: 'input',\n output: 'output',\n error: 'error',\n wakeAt: 'wake_at',\n lockedBy: 'locked_by',\n lockedUntil: 'locked_until',\n // The REMOTE turn the engine suspended on; `completeRemoteDecision` matches against it so only\n // the currently-awaited turn's decision is applied. A store swap that lost this column would not\n // fail loudly — it would apply a stale decision to the wrong turn — which is why it is pinned\n // rather than left to each adapter's own spec.\n awaitingDecisionTaskId: 'awaiting_decision_task_id',\n recoveryAttempts: 'recovery_attempts',\n tags: 'tags',\n searchAttributes: 'search_attributes',\n priority: 'priority',\n // Which library registered the workflow. Single-word, so `snake_case` and `preserve` agree and\n // an adapter can look canonical by accident — which is exactly why it is pinned here rather than\n // left to four per-adapter assertions to keep saying the same thing.\n origin: 'origin',\n // The tenant a run belongs to, and the predicate on every poll tick. Pinned here\n // now that all four adapters carry the column — see the note above, which used to\n // name this as the standing example of a capability gap the map cannot express.\n namespace: 'namespace',\n createdAt: 'created_at',\n updatedAt: 'updated_at',\n },\n durable_step_checkpoints: {\n runId: 'run_id',\n seq: 'seq',\n name: 'name',\n kind: 'kind',\n stepId: 'step_id',\n status: 'status',\n input: 'input',\n output: 'output',\n error: 'error',\n events: 'events',\n attempts: 'attempts',\n workerGroup: 'worker_group',\n // A `ctx.gather`/`ctx.all` fan tags every sibling step with the same group so the dashboard can\n // render them as one parallel group. Same physical name in the waiter table below — two tables,\n // one column name, which is precisely the kind of near-duplicate that drifts if unpinned.\n parallelGroup: 'parallel_group',\n wakeAt: 'wake_at',\n enqueuedAt: 'enqueued_at',\n startedAt: 'started_at',\n finishedAt: 'finished_at',\n },\n durable_run_attributes: {\n runId: 'run_id',\n key: 'key',\n strValue: 'str_value',\n numValue: 'num_value',\n },\n durable_signal_waiters: {\n token: 'token',\n runId: 'run_id',\n seq: 'seq',\n // The fan-out group threaded onto a child waiter, so the resolving `signal:child:` checkpoint\n // carries it. Only fan-out child waiters populate it, but every adapter declares the column.\n parallelGroup: 'parallel_group',\n },\n durable_buffered_signals: {\n id: 'id',\n token: 'token',\n payload: 'payload',\n },\n durable_buffered_events: {\n id: 'id',\n name: 'name',\n payload: 'payload',\n publishedAt: 'published_at',\n },\n // Persisted schedules (`engine.schedules`). `spec`/`state` are engine-owned JSON documents.\n durable_schedules: {\n id: 'id',\n namespace: 'namespace',\n workflow: 'workflow',\n paused: 'paused',\n nextFireAt: 'next_fire_at',\n tags: 'tags',\n spec: 'spec',\n state: 'state',\n createdAt: 'created_at',\n updatedAt: 'updated_at',\n },\n} as const;\n\nexport type DurableColumnMap = typeof DURABLE_CANONICAL_COLUMNS;\n\n/** A single column-name disagreement found by {@link assertDurableColumns}. */\nexport interface DurableColumnMismatch {\n table: string;\n property: string;\n expected: string;\n actual: string | undefined;\n}\n\n/**\n * Walk every (table, property) in the canonical contract and compare it to what an adapter actually\n * maps, via the supplied `resolve(table, property) => columnName`. Returns the list of mismatches\n * (empty when the adapter is canonical) so a spec can `expect(assertDurableColumns(resolve)).toEqual([])`.\n *\n * Pass `expected = DURABLE_CANONICAL_COLUMNS` (default) for the snake_case contract, or a map of the\n * property names to themselves to assert the camelCase (\"preserve\") naming.\n */\nexport function assertDurableColumns(\n resolve: (table: string, property: string) => string | undefined,\n expected: Record<string, Record<string, string>> = DURABLE_CANONICAL_COLUMNS,\n): DurableColumnMismatch[] {\n const mismatches: DurableColumnMismatch[] = [];\n for (const [table, props] of Object.entries(expected)) {\n for (const [property, column] of Object.entries(props)) {\n const actual = resolve(table, property);\n if (actual !== column) mismatches.push({ table, property, expected: column, actual });\n }\n }\n return mismatches;\n}\n\n/** The \"preserve\" (camelCase) expectation: every property maps to a column of the same name. */\nexport function preserveColumnExpectation(): Record<string, Record<string, string>> {\n const out: Record<string, Record<string, string>> = {};\n for (const [table, props] of Object.entries(DURABLE_CANONICAL_COLUMNS)) {\n out[table] = Object.fromEntries(Object.keys(props).map((p) => [p, p]));\n }\n return out;\n}\n","import {\n InMemoryStateStore,\n InMemoryTransport,\n type RunResult,\n type StartOptions,\n WorkflowEngine,\n type WorkflowRef,\n} from '@dudousxd/nestjs-durable-core';\n\n/** A clock you control, for testing durable sleeps without real time. */\nexport class MutableClock {\n constructor(private current = 1_000) {}\n readonly now = (): number => this.current;\n set(ms: number): void {\n this.current = ms;\n }\n advance(ms: number): void {\n this.current += ms;\n }\n}\n\nexport interface TestEngine {\n engine: WorkflowEngine;\n store: InMemoryStateStore;\n transport: InMemoryTransport;\n clock: MutableClock;\n /** Advance the clock by `ms` and resume any durable sleeps now due. */\n tick(ms: number): Promise<RunResult[]>;\n /**\n * Enqueue a run and wait for it to settle (terminal or suspended). `engine.start` only enqueues\n * now (dispatch model), so use this when a test needs the outcome synchronously.\n */\n run(\n workflow: WorkflowRef,\n input: unknown,\n runId: string,\n opts?: StartOptions,\n ): Promise<RunResult>;\n}\n\n/**\n * A self-contained engine wired to in-memory store + transport and a controllable clock — run a\n * whole workflow in a unit test, with no Postgres, no Redis, and no real time.\n */\nexport function createTestEngine(): TestEngine {\n const store = new InMemoryStateStore();\n const transport = new InMemoryTransport();\n const clock = new MutableClock();\n const engine = new WorkflowEngine({ store, transport, clock: clock.now });\n return {\n engine,\n store,\n transport,\n clock,\n async tick(ms: number): Promise<RunResult[]> {\n clock.advance(ms);\n return engine.resumeDueTimers(clock.now());\n },\n async run(workflow, input, runId, opts): Promise<RunResult> {\n // `start` is overloaded per ref kind; a `WorkflowRef` union fits neither overload directly, so\n // resolve to the string overload (the engine accepts a class or name at runtime).\n await engine.start(workflow as string, input, runId, opts);\n return engine.waitForRun(runId);\n },\n };\n}\n","import {\n InMemoryStateStore,\n type StepCheckpoint,\n WorkflowEngine,\n type WorkflowRun,\n} from '@dudousxd/nestjs-durable-core';\n\nexport interface RunHistory {\n run: WorkflowRun;\n checkpoints: StepCheckpoint[];\n}\n\n/**\n * Replay a recorded run's history against the CURRENT workflow code and throw if they diverged.\n *\n * Capture a real (ideally in-flight or representative) run from production —\n * `{ run: await store.getRun(id), checkpoints: await store.listCheckpoints(id) }` — commit it as a\n * fixture, and assert here in CI. If a code change renamed/reordered/removed a step at a position the\n * history already recorded, the engine raises a `NonDeterminismError` on replay and this rethrows it,\n * catching the break *before* it reaches an in-flight run on deploy (the moment you'd otherwise\n * silently replay the wrong checkpoint into the wrong step). Register the workflow exactly as the app\n * does:\n *\n * ```ts\n * await assertReplayable((engine) => engine.register('pipeline', '1', pipeline.run), fixture);\n * ```\n */\nexport async function assertReplayable(\n register: (engine: WorkflowEngine) => void,\n history: RunHistory,\n): Promise<void> {\n const store = new InMemoryStateStore();\n // Seed as a suspended run with no lock so resume() replays the body against the recorded\n // checkpoints — no transport is wired, so nothing new is dispatched.\n await store.createRun({\n ...history.run,\n status: 'suspended',\n lockedBy: undefined,\n lockedUntil: undefined,\n });\n for (const cp of history.checkpoints) await store.saveCheckpoint(cp);\n\n const engine = new WorkflowEngine({ store });\n register(engine);\n const result = await engine.resume(history.run.id);\n if (result.status === 'failed' && result.error?.message?.startsWith('non-determinism')) {\n const err = new Error(result.error.message);\n err.name = 'NonDeterminismError';\n throw err;\n }\n}\n","import {\n SINGLETON_ADMITTED_TAG,\n SINGLETON_TRACKED_TAG,\n type ScheduleQuery,\n type ScheduleRecord,\n type StateStore,\n type StepCheckpoint,\n WorkflowEngine,\n type WorkflowRun,\n} from '@dudousxd/nestjs-durable-core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { registerCheckpointAggregationCases } from './checkpoint-aggregation-contract';\n\n/**\n * A freshly provisioned, empty {@link StateStore} plus a `cleanup` to release its resources (close\n * the connection, drop the schema, etc.). The conformance suite asks for one before each test so\n * every case starts from a clean slate — exactly like the per-store specs that build a `:memory:` DB.\n */\nexport interface StateStoreContext {\n store: StateStore;\n /** A second wrapper sharing the database/pool, used to exercise cross-instance claims. */\n peerStore?: StateStore;\n cleanup: () => Promise<void>;\n /**\n * Whether the store's optional `transaction` can run an ASYNC work callback. Defaults to `true`.\n * Set `false` only for a driver that genuinely can't — e.g. Drizzle on the SYNCHRONOUS\n * `better-sqlite3` driver, whose `transaction()` rejects a promise-returning callback (\"Transaction\n * function cannot return a promise\"). The same Drizzle adapter on an async driver (libSQL) works,\n * and the contract still asserts `transaction` for every other store, so this never hides drift.\n */\n supportsAsyncTransaction?: boolean;\n /**\n * Whether the store can filter `listRuns({ tag })`. Defaults to `true`. Set `false` ONLY for\n * Prisma-on-SQLite: the Prisma adapter filters tags with the `array_contains` JSON predicate, which\n * Prisma supports on its real targets (Postgres + MySQL) but NOT on SQLite. SQLite is only the\n * adapter's local TEST database, so the tag case is skipped there; every other store (and Prisma on\n * a real engine) still asserts it, so this doesn't hide drift in the supported configurations.\n */\n supportsTagFilter?: boolean;\n}\n\n/** Builds a fresh, empty store for one test. Called once per `it` (in `beforeEach`). */\nexport type StateStoreFactory = () => Promise<StateStoreContext>;\n\n/**\n * Thrown by a {@link StateStoreFactory} to SKIP the contract for an unavailable backend instead of\n * failing it — e.g. a testcontainers DB spec when Docker isn't running. Every contract case catches\n * it, logs once, and returns (a no-op pass), so `pnpm test:db` is green-with-skips off a dev box\n * without Docker rather than red.\n */\nexport class StateStoreUnavailableError extends Error {\n readonly isStateStoreUnavailable = true;\n constructor(message: string) {\n super(message);\n this.name = 'StateStoreUnavailableError';\n }\n}\n\nfunction isUnavailable(err: unknown): err is StateStoreUnavailableError {\n return !!err && typeof err === 'object' && 'isStateStoreUnavailable' in err;\n}\n\nconst at = new Date('2026-06-11T00:00:00.000Z');\nconst NOW = Date.parse('2026-06-20T00:00:00.000Z');\nconst DAY = 86_400_000;\n\nconst run = (over: Partial<WorkflowRun> = {}): WorkflowRun => ({\n id: 'r1',\n workflow: 'checkout',\n workflowVersion: '1',\n status: 'running',\n input: { orderId: 'o1' },\n createdAt: at,\n updatedAt: at,\n ...over,\n});\n\nconst checkpoint = (over: Partial<StepCheckpoint> = {}): StepCheckpoint => ({\n runId: 'r1',\n seq: 0,\n name: 'reserve',\n kind: 'local',\n stepId: 'r1:0',\n status: 'completed',\n output: { ok: true },\n attempts: 1,\n enqueuedAt: at,\n startedAt: at,\n finishedAt: at,\n ...over,\n});\n\n/**\n * The SHARED behavioral contract every `StateStore` must satisfy — in-memory and each ORM adapter\n * alike. Registered as a vitest `describe`; pass a `name` and a {@link StateStoreFactory} that builds\n * a fresh, empty store. The same assertions run against SQLite/in-memory under `pnpm test` and\n * against real Postgres/MySQL (via testcontainers) under `pnpm test:db`, so any drift between an\n * adapter and the canonical (in-memory) semantics — especially the search-attribute side-table\n * pushdown, which is implemented per-store — fails here instead of silently in production.\n *\n * Each adapter's own spec keeps its dialect-specific tests (DDL/longtext/EXISTS-SQL/JSON-tolerance);\n * this suite owns the cross-store behavior so those never drift apart.\n */\nexport function runStateStoreContract(name: string, makeStore: StateStoreFactory): void {\n describe(`StateStore contract: ${name}`, () => {\n let store: StateStore;\n let peerStore: StateStore;\n let cleanup: (() => Promise<void>) | undefined;\n let supportsAsyncTransaction = true;\n let supportsTagFilter = true;\n let skipReason: string | undefined;\n let loggedSkip = false;\n\n beforeEach(async () => {\n try {\n const ctx = await makeStore();\n store = ctx.store;\n peerStore = ctx.peerStore ?? ctx.store;\n cleanup = ctx.cleanup;\n supportsAsyncTransaction = ctx.supportsAsyncTransaction ?? true;\n supportsTagFilter = ctx.supportsTagFilter ?? true;\n skipReason = undefined;\n } catch (err) {\n if (isUnavailable(err)) {\n // Backend unavailable (e.g. no Docker for a testcontainers spec): skip — don't fail.\n skipReason = err.message;\n if (!loggedSkip) {\n console.warn(`[state-store-contract] SKIPPING \"${name}\": ${skipReason}`);\n loggedSkip = true;\n }\n return;\n }\n throw err;\n }\n return async () => {\n await cleanup?.();\n };\n });\n\n /** Register a contract case that no-ops (passes) when the backend was reported unavailable. */\n const t = (label: string, fn: () => Promise<void>): void => {\n it(label, async () => {\n if (skipReason) return;\n await fn();\n });\n };\n\n t('atomically admits holders without displacement by later same-millisecond IDs', async () => {\n expect(store.tryAdmitSingleton).toBeTypeOf('function');\n const claim = (id: string, limit = 1) =>\n store.tryAdmitSingleton?.(id, 'singleton:k', 'checkout', limit);\n await store.createRun(run({ id: 'z-holder', tags: ['singleton:k', 'user-tag'] }));\n expect(await claim('z-holder')).toBe(true);\n await store.updateRun('z-holder', { status: 'suspended', wakeAt: 10_000 });\n expect(await claim('z-holder')).toBe(true);\n await store.updateRun('z-holder', { status: 'blocked', lockedBy: 'expired', lockedUntil: 0 });\n await store.createRun(run({ id: 'a-waiter', tags: ['singleton:k'] }));\n expect(await claim('a-waiter')).toBe(false);\n expect(await claim('z-holder')).toBe(true);\n await store.updateRun('z-holder', { status: 'cancelling' });\n expect(await claim('a-waiter')).toBe(false);\n await store.updateRun('z-holder', { status: 'completed' });\n expect((await store.getRun('z-holder'))?.tags).toEqual(['singleton:k', 'user-tag']);\n expect(await claim('a-waiter')).toBe(true);\n await store.updateRun('z-holder', { status: 'running' });\n expect(await claim('z-holder')).toBe(false);\n expect(await claim('missing')).toBe(false);\n });\n\n t(\n 'singleton denial atomically parks waiters and preserves cancelling/terminal state',\n async () => {\n await store.createRun(run({ id: 'holder', tags: ['singleton:k'] }));\n expect(await store.tryAdmitSingleton?.('holder', 'singleton:k', 'checkout', 1)).toBe(true);\n await store.createRun(run({ id: 'waiter', tags: ['singleton:k'] }));\n expect(\n await peerStore.tryAdmitSingleton?.('waiter', 'singleton:k', 'checkout', 1, 12000),\n ).toBe(false);\n expect(await store.getRun('waiter')).toMatchObject({ status: 'suspended', wakeAt: 12000 });\n await store.updateRun('waiter', { status: 'cancelling', wakeAt: undefined });\n expect(\n await peerStore.tryAdmitSingleton?.('waiter', 'singleton:k', 'checkout', 1, 14000),\n ).toBe(false);\n expect(await store.getRun('waiter')).toMatchObject({ status: 'cancelling' });\n expect((await store.getRun('waiter'))?.wakeAt).toBeUndefined();\n await store.updateRun('waiter', { status: 'cancelled' });\n expect(\n await peerStore.tryAdmitSingleton?.('waiter', 'singleton:k', 'checkout', 1, 16000),\n ).toBe(false);\n expect((await store.getRun('waiter'))?.status).toBe('cancelled');\n await store.updateRun('holder', { status: 'completed' });\n await store.createRun(\n run({ id: 'cancelling', status: 'cancelling', tags: ['singleton:k'] }),\n );\n expect(\n await store.tryAdmitSingleton?.('cancelling', 'singleton:k', 'checkout', 1, 18000),\n ).toBe(false);\n expect((await store.getRun('cancelling'))?.tags).not.toContain(SINGLETON_ADMITTED_TAG);\n },\n );\n\n t('competing store instances atomically claim an empty singleton slot', async () => {\n // `running` and tracked: the engine stamps SINGLETON_TRACKED_TAG on a run's first execution,\n // before it claims (an untracked untagged running run reads as a pre-0.73 holder, below).\n for (const id of ['a-first', 'b-second', 'c-third']) {\n await store.createRun(run({ id, tags: ['singleton:k', SINGLETON_TRACKED_TAG] }));\n }\n const results = await Promise.all([\n peerStore.tryAdmitSingleton?.('b-second', 'singleton:k', 'checkout', 1),\n store.tryAdmitSingleton?.('a-first', 'singleton:k', 'checkout', 1),\n peerStore.tryAdmitSingleton?.('c-third', 'singleton:k', 'checkout', 1),\n ]);\n expect(results).toEqual([false, true, false]);\n expect(await peerStore.tryAdmitSingleton?.('a-first', 'singleton:k', 'checkout', 1)).toBe(\n true,\n );\n expect((await store.getRun('a-first'))?.tags).toContain(SINGLETON_ADMITTED_TAG);\n });\n\n t('concurrent singleton claims honor limits and independent keys/workflows', async () => {\n const claim = (id: string, tag = 'singleton:k', workflow = 'checkout') =>\n store.tryAdmitSingleton?.(id, tag, workflow, 2);\n for (const id of ['z-holder', 'y-holder']) {\n await store.createRun(run({ id, tags: ['singleton:k'] }));\n expect(await claim(id)).toBe(true);\n }\n for (const id of ['a-waiter', 'b-waiter', 'c-waiter']) {\n await store.createRun(run({ id, status: 'pending', tags: ['singleton:k'] }));\n }\n expect(\n await Promise.all(['a-waiter', 'b-waiter', 'c-waiter'].map((id) => claim(id))),\n ).toEqual([false, false, false]);\n await store.updateRun('z-holder', { status: 'failed' });\n expect(\n await Promise.all(['c-waiter', 'b-waiter', 'a-waiter'].map((id) => claim(id))),\n ).toEqual([false, false, true]);\n const active = await store.listRuns({\n workflow: 'checkout',\n statuses: ['running', 'pending'],\n });\n expect(active.filter((r) => r.tags?.includes(SINGLETON_ADMITTED_TAG))).toHaveLength(2);\n await store.createRun(run({ id: 'other-key', tags: ['singleton:other'] }));\n expect(await claim('other-key', 'singleton:other')).toBe(true);\n await store.createRun(\n run({ id: 'other-workflow', workflow: 'other', tags: ['singleton:k'] }),\n );\n expect(await claim('other-workflow', 'singleton:k', 'other')).toBe(true);\n });\n\n // A replica older than 0.73 admits by a scan (the `limit` oldest running/suspended/cancelling\n // runs of the key) and writes no admission tag. During a rolling upgrade such a holder must\n // still occupy its slot for the new replicas.\n const created = (offset: number) => new Date(at.getTime() + offset * 1_000);\n\n t('singleton admission counts an untagged pre-0.73 holder (rolling upgrade)', async () => {\n const claim = (id: string, wakeAt?: number) =>\n store.tryAdmitSingleton?.(id, 'singleton:k', 'checkout', 1, wakeAt);\n // Written by an old replica: admitted by its scan, running, no admission tag. It is NEWER\n // than the run below, which was still `pending` (invisible to the old scan) back then.\n await store.createRun(run({ id: 'legacy', tags: ['singleton:k'], createdAt: created(1) }));\n // The older run, now picked up by a new replica: tracked from its first execution.\n await store.createRun(\n run({ id: 'new', tags: ['singleton:k', SINGLETON_TRACKED_TAG], createdAt: created(0) }),\n );\n expect(await claim('new', 12_000)).toBe(false);\n expect(await store.getRun('new')).toMatchObject({ status: 'suspended', wakeAt: 12_000 });\n expect((await store.getRun('new'))?.tags).toContain(SINGLETON_TRACKED_TAG);\n // A legacy holder parked on its own sleep still holds the slot.\n await store.updateRun('legacy', { status: 'suspended', wakeAt: 20_000 });\n expect(await claim('new')).toBe(false);\n // Once it settles, the new admission takes over.\n await store.updateRun('legacy', { status: 'completed' });\n expect(await claim('new')).toBe(true);\n expect((await store.getRun('new'))?.tags).toEqual(['singleton:k', SINGLETON_ADMITTED_TAG]);\n await store.updateRun('new', { status: 'completed' });\n expect((await store.getRun('new'))?.tags).toEqual(['singleton:k']);\n });\n\n t('legacy singleton waiters keep their FIFO place across the upgrade', async () => {\n const claim = (id: string) => store.tryAdmitSingleton?.(id, 'singleton:k', 'checkout', 1);\n await store.createRun(run({ id: 'holder', tags: ['singleton:k'], createdAt: created(0) }));\n // Denied by an old replica: suspended on its retry timer, no tag.\n await store.createRun(\n run({\n id: 'old-waiter',\n status: 'suspended',\n wakeAt: 5_000,\n tags: ['singleton:k'],\n createdAt: created(1),\n }),\n );\n await store.createRun(\n run({ id: 'new-run', tags: ['singleton:k', SINGLETON_TRACKED_TAG], createdAt: created(2) }),\n );\n expect(await claim('new-run')).toBe(false);\n expect(await claim('old-waiter')).toBe(false);\n // A legacy waiter re-checked by a new replica is tracked from then on; it keeps its place.\n expect(\n await store.tryAdmitSingleton?.('old-waiter', 'singleton:k', 'checkout', 1, 6_000),\n ).toBe(false);\n expect((await store.getRun('old-waiter'))?.tags).toContain(SINGLETON_TRACKED_TAG);\n await store.updateRun('holder', { status: 'completed' });\n expect(await claim('new-run')).toBe(false);\n expect(await claim('old-waiter')).toBe(true);\n expect(await claim('new-run')).toBe(false);\n await store.updateRun('old-waiter', { status: 'completed' });\n expect(await claim('new-run')).toBe(true);\n });\n\n t('concurrent claims never over-admit beside an untagged legacy holder', async () => {\n await store.createRun(run({ id: 'legacy', tags: ['singleton:k'], createdAt: created(0) }));\n const ids = ['c1', 'c2', 'c3', 'c4'];\n for (const [i, id] of ids.entries()) {\n await store.createRun(\n run({ id, tags: ['singleton:k', SINGLETON_TRACKED_TAG], createdAt: created(i + 1) }),\n );\n }\n const results = await Promise.all(\n [...ids]\n .reverse()\n .map((id, i) =>\n (i % 2 ? peerStore : store).tryAdmitSingleton?.(id, 'singleton:k', 'checkout', 2),\n ),\n );\n // One slot is the legacy holder's; only the oldest new run takes the other.\n expect(results).toEqual([false, false, false, true]);\n const active = await store.listRuns({ workflow: 'checkout', statuses: ['running'] });\n expect(\n active.filter((r) => r.tags?.includes(SINGLETON_ADMITTED_TAG)).map((r) => r.id),\n ).toEqual(['c1']);\n });\n\n // ---- create / get / update --------------------------------------------------------------\n\n t('creates a run and reads it back with its JSON input', async () => {\n await store.createRun(run());\n const loaded = await store.getRun('r1');\n expect(loaded?.workflow).toBe('checkout');\n expect(loaded?.input).toEqual({ orderId: 'o1' });\n });\n\n t('returns null for a missing run', async () => {\n expect(await store.getRun('nope')).toBeNull();\n });\n\n t('updates a run (status/output) and round-trips recoveryAttempts + dead status', async () => {\n await store.createRun(run({ recoveryAttempts: 3 }));\n await store.updateRun('r1', {\n status: 'completed',\n output: { total: 42 },\n updatedAt: at,\n });\n const done = await store.getRun('r1');\n expect(done?.status).toBe('completed');\n expect(done?.output).toEqual({ total: 42 });\n expect(done?.recoveryAttempts).toBe(3);\n\n await store.updateRun('r1', { status: 'dead', recoveryAttempts: 4 });\n const dead = await store.getRun('r1');\n expect(dead?.status).toBe('dead');\n expect(dead?.recoveryAttempts).toBe(4);\n });\n\n t('round-trips a run dispatch priority', async () => {\n await store.createRun(run({ id: 'withprio', priority: 7 }));\n await store.createRun(run({ id: 'noprio' }));\n expect((await store.getRun('withprio'))?.priority).toBe(7);\n expect((await store.getRun('noprio'))?.priority).toBeUndefined();\n });\n\n t('deleteRun removes the run and all its rows (checkpoints, waiters, attributes)', async () => {\n await store.createRun(run({ searchAttributes: { tier: 'pro' } }));\n await store.saveCheckpoint(checkpoint());\n await store.putSignalWaiter({ token: 'approve-r1', runId: 'r1', seq: 0 });\n\n await store.deleteRun('r1');\n\n // The run and every child row are gone — not merely marked terminal.\n expect(await store.getRun('r1')).toBeNull();\n expect(await store.listCheckpoints('r1')).toEqual([]);\n expect(await store.listSignalWaiters('approve-')).toEqual([]);\n // The normalized attribute side-table no longer matches it.\n expect(\n await store.listRuns({\n attributes: [{ key: 'tier', op: 'eq', value: 'pro' }],\n }),\n ).toEqual([]);\n });\n\n t('deleteRun is a no-op for a missing run', async () => {\n await expect(store.deleteRun('nope')).resolves.toBeUndefined();\n });\n\n // ---- bulk delete / retention ------------------------------------------------------------\n\n t('deleteRuns removes every listed run with its rows and ignores missing ids', async () => {\n await store.createRun(run({ id: 'd1', searchAttributes: { tier: 'pro' } }));\n await store.createRun(run({ id: 'd2' }));\n await store.createRun(run({ id: 'keep' }));\n await store.saveCheckpoint(checkpoint({ runId: 'd1', stepId: 'd1:0' }));\n await store.putSignalWaiter({ token: 'approve-d2', runId: 'd2', seq: 0 });\n\n expect(typeof store.deleteRuns).toBe('function');\n await store.deleteRuns?.(['d1', 'd2', 'ghost']);\n\n expect(await store.getRun('d1')).toBeNull();\n expect(await store.getRun('d2')).toBeNull();\n expect(await store.getRun('keep')).not.toBeNull();\n expect(await store.listCheckpoints('d1')).toEqual([]);\n expect(await store.listSignalWaiters('approve-')).toEqual([]);\n expect(\n await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'pro' }] }),\n ).toEqual([]);\n await expect(store.deleteRuns?.([])).resolves.toBeUndefined();\n });\n\n const aged = (id: string, ageDays: number, over: Partial<WorkflowRun> = {}): WorkflowRun =>\n run({\n id,\n status: 'completed',\n createdAt: new Date(NOW - ageDays * DAY),\n updatedAt: new Date(NOW - ageDays * DAY),\n ...over,\n });\n const ids = async (): Promise<string[]> => (await store.listRuns({})).map((r) => r.id).sort();\n\n t('pruneTerminalRuns drops terminal runs past maxAge and never touches live ones', async () => {\n await store.createRun(aged('old-done', 10));\n await store.createRun(aged('old-failed', 10, { status: 'failed' }));\n await store.createRun(aged('old-live', 10, { status: 'suspended' }));\n await store.createRun(aged('fresh-done', 1));\n await store.saveCheckpoint(checkpoint({ runId: 'old-done', stepId: 'old-done:0' }));\n\n expect(typeof store.pruneTerminalRuns).toBe('function');\n const deleted = await store.pruneTerminalRuns?.(\n { statuses: ['completed', 'failed', 'suspended'], maxAge: '7d' },\n NOW,\n 100,\n );\n\n expect(deleted).toBe(2);\n expect(await ids()).toEqual(['fresh-done', 'old-live']);\n expect(await store.listCheckpoints('old-done')).toEqual([]);\n });\n\n t(\n 'pruneTerminalRuns keeps only the newest maxCount and drains in batches of limit',\n async () => {\n for (let i = 1; i <= 5; i++) await store.createRun(aged(`c${i}`, i));\n\n // Keep the 2 newest (c1, c2); 3 are over the cap, but one call deletes at most `limit` = 2.\n const policy = { statuses: ['completed' as const], maxCount: 2 };\n expect(await store.pruneTerminalRuns?.(policy, NOW, 2)).toBe(2);\n expect(await store.pruneTerminalRuns?.(policy, NOW, 2)).toBe(1);\n expect(await store.pruneTerminalRuns?.(policy, NOW, 2)).toBe(0);\n expect(await ids()).toEqual(['c1', 'c2']);\n },\n );\n\n t('a scoped retention policy only prunes (and counts) the runs its scope matches', async () => {\n await store.createRun(aged('acme-old', 10, { namespace: 'acme' }));\n await store.createRun(aged('acme-new', 1, { namespace: 'acme' }));\n await store.createRun(aged('beta-old', 10, { namespace: 'beta' }));\n await store.createRun(aged('report-old', 10, { workflow: 'report' }));\n\n // By namespace: beta's equally old run survives.\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxAge: '7d', scope: { namespace: 'acme' } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['acme-new', 'beta-old', 'report-old']);\n\n // By workflow set.\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxAge: '7d', scope: { workflows: ['report'] } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['acme-new', 'beta-old']);\n\n // maxCount is counted WITHIN the scope: acme keeps its 1 newest even though other runs exist.\n await store.createRun(aged('acme-mid', 3, { namespace: 'acme' }));\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxCount: 1, scope: { namespace: 'acme' } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['acme-new', 'beta-old']);\n });\n\n t('a retention scope can select by tag and by search attribute', async () => {\n if (!supportsTagFilter) return;\n await store.createRun(aged('chat-old', 10, { tags: ['chat', 'tenant:t1'] }));\n await store.createRun(aged('chatty-old', 10, { tags: ['chatty'] }));\n await store.createRun(aged('attr-old', 10, { searchAttributes: { tenantId: 't2' } }));\n await store.createRun(aged('attr-other', 10, { searchAttributes: { tenantId: 't3' } }));\n\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxAge: '7d', scope: { tags: ['chat'] } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['attr-old', 'attr-other', 'chatty-old']);\n\n await store.pruneTerminalRuns?.(\n {\n statuses: ['completed'],\n maxAge: '7d',\n scope: { attributes: [{ key: 'tenantId', op: 'eq', value: 't2' }] },\n },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['attr-other', 'chatty-old']);\n });\n\n t(\n 'engine.purgeRuns deletes a scope with its child subtrees and cancels live runs',\n async () => {\n const engine = new WorkflowEngine({ store });\n engine.register('p-child', '1', async (ctx) => ctx.waitForSignal('never'));\n engine.register('p-root', '1', async (ctx) => {\n await ctx.startChild('p-child', {}, 'pc');\n return ctx.waitForSignal('never');\n });\n engine.register('p-other', '1', async () => 'done');\n\n await engine.start('p-root', {}, 'pr');\n await engine.start('p-other', {}, 'po');\n // Wait for the ROOT to park too, not only the child: the root's `spawn:pc` checkpoint (the\n // edge purge follows to find `pc`) is written after the child is started, so the child can\n // reach `suspended` first on a slow store, and a purge then would not see the edge yet.\n expect((await engine.waitForRun('pr', { timeoutMs: 20_000 })).status).toBe('suspended');\n expect((await engine.waitForRun('pc', { timeoutMs: 20_000 })).status).toBe('suspended');\n expect((await engine.waitForRun('po', { timeoutMs: 20_000 })).status).toBe('completed');\n\n await expect(engine.purgeRuns({})).rejects.toThrow(/empty scope/);\n // `p-child` is not in the scope: it goes because its root does.\n expect(await engine.purgeRuns({ workflows: ['p-root'] })).toBe(2);\n\n expect(await store.getRun('pr')).toBeNull();\n expect(await store.getRun('pc')).toBeNull();\n expect(await store.getRun('po')).not.toBeNull();\n },\n );\n\n t(\n 'updateRun maps every patchable field — clears error and patches tags/lockedBy/input/timers',\n async () => {\n // Guards against per-adapter patch-whitelist drift: a store that maps only a subset of fields\n // (or ignores `undefined` instead of clearing) would silently no-op these and fail here.\n await store.createRun(\n run({ status: 'failed', error: { message: 'boom' }, tags: ['old'], lockedBy: 'owner-1' }),\n );\n await store.updateRun('r1', {\n status: 'completed',\n output: { ok: true },\n error: undefined, // completion CLEARS the prior error\n input: { orderId: 'o2' },\n tags: ['x', 'y'],\n lockedBy: 'owner-2',\n wakeAt: 123_456,\n lockedUntil: 222_222,\n updatedAt: at,\n });\n const r = await store.getRun('r1');\n expect(r?.status).toBe('completed');\n expect(r?.output).toEqual({ ok: true });\n expect(r?.error).toBeUndefined();\n expect(r?.input).toEqual({ orderId: 'o2' });\n expect(r?.tags).toEqual(['x', 'y']);\n expect(r?.lockedBy).toBe('owner-2');\n expect(r?.wakeAt).toBe(123_456);\n expect(r?.lockedUntil).toBe(222_222);\n\n // The multi-instance REMOTE-decision marker must round-trip AND clear: the engine sets it\n // when it suspends on an awaited turn and clears it (`undefined`) when the decision lands. An\n // adapter that drops it on read, or ignores `undefined` instead of writing NULL, would silently\n // break completeRemoteDecision (it reads back the stale/absent marker and discards the decision).\n await store.updateRun('r1', { awaitingDecisionTaskId: 'turn-7' });\n expect((await store.getRun('r1'))?.awaitingDecisionTaskId).toBe('turn-7');\n await store.updateRun('r1', { awaitingDecisionTaskId: undefined });\n expect((await store.getRun('r1'))?.awaitingDecisionTaskId).toBeUndefined();\n },\n );\n\n // ---- checkpoints ------------------------------------------------------------------------\n\n t('listDueTimers returns the most overdue first, capped at limit', async () => {\n for (const [id, wakeAt] of [\n ['late', 3_000],\n ['earliest', 1_000],\n ['middle', 2_000],\n ['future', 9_000],\n ] as const) {\n await store.createRun(run({ id, status: 'suspended', wakeAt }));\n }\n\n expect((await store.listDueTimers(5_000)).map((r) => r.id)).toEqual([\n 'earliest',\n 'middle',\n 'late',\n ]);\n expect((await store.listDueTimers(5_000, undefined, 2)).map((r) => r.id)).toEqual([\n 'earliest',\n 'middle',\n ]);\n });\n\n t('countCheckpoints counts a seq range by status', async () => {\n // Optional on the interface (the engine has a fallback), but a conformant store MUST provide\n // it — assert presence, then exercise the fast path.\n expect(store.countCheckpoints).toBeDefined();\n if (!store.countCheckpoints) return;\n await store.createRun(run());\n for (const [seq, status] of [\n [0, 'completed'],\n [1, 'pending'],\n [2, 'pending'],\n [3, 'failed'],\n [4, 'pending'],\n ] as const) {\n await store.saveCheckpoint(checkpoint({ seq, status, stepId: `r1:${seq}` }));\n }\n await store.createRun(run({ id: 'other' }));\n await store.saveCheckpoint(\n checkpoint({ runId: 'other', seq: 2, status: 'pending', stepId: 'other:2' }),\n );\n\n expect(await store.countCheckpoints('r1', 1, 3, ['pending'])).toBe(2);\n expect(await store.countCheckpoints('r1', 0, 4, ['pending', 'failed'])).toBe(4);\n // Both bounds are inclusive.\n expect(await store.countCheckpoints('r1', 2, 2, ['pending'])).toBe(1);\n expect(await store.countCheckpoints('r1', 1, 4, ['pending'])).toBe(3);\n expect(await store.countCheckpoints('r1', 0, 0, ['completed'])).toBe(1);\n // `other` has a pending row at seq 2: a count is scoped to its run.\n expect(await store.countCheckpoints('other', 0, 4, ['pending'])).toBe(1);\n expect(await store.countCheckpoints('r1', 5, 9, ['pending'])).toBe(0);\n expect(await store.countCheckpoints('r1', 0, 4, [])).toBe(0);\n });\n\n registerCheckpointAggregationCases(t, () => store, run);\n\n t(\n 'listOrphanedRuns returns incomplete runs with a free or expired lease, oldest first',\n async () => {\n // Optional on the interface (the engine falls back to listing every incomplete run and\n // filtering in process), but a conformant store MUST provide it.\n expect(store.listOrphanedRuns).toBeDefined();\n if (!store.listOrphanedRuns) return;\n // Whole seconds apart: MySQL's DATETIME drops milliseconds, which would tie the ordering.\n const created = (offset: number) => new Date(at.getTime() + offset * 1_000);\n await store.createRun(run({ id: 'held', createdAt: created(1) }));\n expect(await store.tryLockRun('held', 'live', NOW + 30_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'expired', createdAt: created(3) }));\n expect(await store.tryLockRun('expired', 'dead', NOW, NOW - 1)).toBe(true);\n await store.createRun(run({ id: 'free', createdAt: created(2) }));\n await store.createRun(\n run({ id: 'compensating', status: 'cancelling', createdAt: created(4) }),\n );\n await store.createRun(run({ id: 'parked', status: 'suspended', createdAt: created(0) }));\n await store.createRun(run({ id: 'done', status: 'completed', createdAt: created(0) }));\n await store.createRun(run({ id: 'tenant', namespace: 'beta', createdAt: created(5) }));\n\n expect((await store.listOrphanedRuns(NOW, 10)).map((r) => r.id)).toEqual([\n 'free',\n 'expired',\n 'compensating',\n 'tenant',\n ]);\n // Capped, oldest first.\n expect((await store.listOrphanedRuns(NOW, 2)).map((r) => r.id)).toEqual([\n 'free',\n 'expired',\n ]);\n // Namespace-scoped.\n expect((await store.listOrphanedRuns(NOW, 10, 'beta')).map((r) => r.id)).toEqual([\n 'tenant',\n ]);\n // Once the live lease lapses, that run is an orphan too.\n expect((await store.listOrphanedRuns(NOW + 30_000, 10)).map((r) => r.id)).toContain('held');\n expect(await store.listOrphanedRuns(NOW, 0)).toEqual([]);\n },\n );\n\n t(\"listOrphanedRuns also returns the owner's live leases taken before its cutoff\", async () => {\n if (!store.listOrphanedRuns) return;\n const created = (offset: number) => new Date(at.getTime() + offset * 1_000);\n // Live leases (expiring after NOW) left by a previous process of instance `pod-a`.\n await store.createRun(run({ id: 'own-old', createdAt: created(1) }));\n expect(await store.tryLockRun('own-old', 'pod-a', NOW + 10_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'own-new', createdAt: created(2) }));\n expect(await store.tryLockRun('own-new', 'pod-a', NOW + 30_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'foreign', createdAt: created(3) }));\n expect(await store.tryLockRun('foreign', 'pod-b', NOW + 10_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'own-parked', status: 'suspended', createdAt: created(4) }));\n expect(await store.tryLockRun('own-parked', 'pod-a', NOW + 10_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'free', createdAt: created(5) }));\n\n const ownedBy = { owner: 'pod-a', lockedBefore: NOW + 30_000 };\n expect((await store.listOrphanedRuns(NOW, 10)).map((r) => r.id)).toEqual(['free']);\n expect((await store.listOrphanedRuns(NOW, 10, undefined, ownedBy)).map((r) => r.id)).toEqual([\n 'own-old',\n 'free',\n ]);\n expect((await store.listOrphanedRuns(NOW, 1, undefined, ownedBy)).map((r) => r.id)).toEqual([\n 'own-old',\n ]);\n expect((await store.listOrphanedRuns(NOW, 10, 'beta', ownedBy)).map((r) => r.id)).toEqual([]);\n });\n\n t('updateRunIf writes only over an expected status', async () => {\n // Optional on the interface (the engine falls back to read-then-write, which keeps a race\n // window), but a conformant store MUST provide it: assert presence, then exercise it.\n expect(store.updateRunIf).toBeDefined();\n if (!store.updateRunIf) return;\n await store.createRun(run({ error: { message: 'earlier attempt' } }));\n\n // A status outside the expected set: refused, nothing written.\n expect(\n await store.updateRunIf('r1', ['suspended', 'blocked'], {\n status: 'completed',\n output: { total: 1 },\n }),\n ).toBe(false);\n let current = await store.getRun('r1');\n expect(current?.status).toBe('running');\n expect(current?.output).toBeUndefined();\n\n // In the set: the whole patch lands, clears included.\n expect(\n await store.updateRunIf('r1', ['pending', 'running'], {\n status: 'suspended',\n wakeAt: 7_000,\n error: undefined,\n updatedAt: new Date(at.getTime() + 1_000),\n }),\n ).toBe(true);\n current = await store.getRun('r1');\n expect(current?.status).toBe('suspended');\n expect(current?.wakeAt).toBe(7_000);\n expect(current?.error).toBeUndefined();\n expect(current?.updatedAt.getTime()).toBe(at.getTime() + 1_000);\n\n // A run that went terminal meanwhile keeps its state.\n await store.updateRun('r1', { status: 'cancelled', error: { message: 'cancelled' } });\n expect(\n await store.updateRunIf('r1', ['running', 'suspended'], {\n status: 'completed',\n output: { total: 2 },\n }),\n ).toBe(false);\n current = await store.getRun('r1');\n expect(current?.status).toBe('cancelled');\n expect(current?.error).toEqual({ message: 'cancelled' });\n expect(current?.output).toBeUndefined();\n\n // No row: nothing to compare against, never throws, never creates one.\n expect(await store.updateRunIf('missing', ['running'], { status: 'completed' })).toBe(false);\n expect(await store.getRun('missing')).toBeNull();\n });\n\n t(\n 'updateRunIf with an empty patch is a pure compare: never throws, writes nothing',\n async () => {\n expect(store.updateRunIf).toBeDefined();\n if (!store.updateRunIf) return;\n await store.createRun(run({ output: { kept: true } }));\n expect(await store.updateRunIf('r1', ['running'], {})).toBe(true);\n expect(await store.updateRunIf('r1', ['suspended'], {})).toBe(false);\n expect(await store.updateRunIf('missing', ['running'], {})).toBe(false);\n const current = await store.getRun('r1');\n expect(current?.status).toBe('running');\n expect(current?.output).toEqual({ kept: true });\n },\n );\n\n t(\n 'updateRunIf settling a run terminal drops its singleton admission like updateRun',\n async () => {\n expect(store.updateRunIf).toBeDefined();\n if (!store.updateRunIf) return;\n await store.createRun(run({ tags: ['singleton:k', SINGLETON_ADMITTED_TAG] }));\n expect(\n await store.updateRunIf('r1', ['running'], { status: 'completed', output: { ok: true } }),\n ).toBe(true);\n const settled = await store.getRun('r1');\n expect(settled?.status).toBe('completed');\n expect(settled?.output).toEqual({ ok: true });\n expect(settled?.tags).toEqual(['singleton:k']);\n },\n );\n\n t('saveCheckpointIfPending writes over a pending row only', async () => {\n // Optional on the interface (the engine falls back to a blind save, which can clobber a settled\n // row), but a conformant store MUST provide it — assert presence, then exercise it.\n expect(store.saveCheckpointIfPending).toBeDefined();\n if (!store.saveCheckpointIfPending) return;\n await store.createRun(run());\n const pending = checkpoint({ status: 'pending', output: undefined });\n await store.saveCheckpoint(pending);\n\n expect(await store.saveCheckpointIfPending({ ...pending, wakeAt: 5_000 })).toBe(true);\n expect((await store.getCheckpoint('r1', 0))?.wakeAt).toBe(5_000);\n\n const done = { ...pending, status: 'completed' as const, output: { ok: true } };\n expect(await store.saveCheckpointIfPending(done)).toBe(true);\n // A stale pending copy no longer lands on the settled row.\n expect(await store.saveCheckpointIfPending({ ...pending, wakeAt: 9_000 })).toBe(false);\n const after = await store.getCheckpoint('r1', 0);\n expect(after?.status).toBe('completed');\n expect(after?.output).toEqual({ ok: true });\n // The settling write carried no deadline, so the one the pending row held is cleared.\n expect(after?.wakeAt).toBeUndefined();\n // A refused write is refused for every status that is not `pending`.\n await store.saveCheckpoint(checkpoint({ seq: 1, status: 'failed', stepId: 'r1:1' }));\n expect(await store.saveCheckpointIfPending({ ...pending, seq: 1, stepId: 'r1:1' })).toBe(\n false,\n );\n expect((await store.getCheckpoint('r1', 1))?.status).toBe('failed');\n // No row to compare against: nothing is written.\n expect(await store.saveCheckpointIfPending({ ...pending, seq: 9 })).toBe(false);\n expect(await store.getCheckpoint('r1', 9)).toBeNull();\n });\n\n t('saveCheckpointsIfPending settles a batch row by row, in order', async () => {\n // Optional on the interface (the engine falls back to one saveCheckpointIfPending per entry),\n // but a conformant store MUST provide it — assert presence, then exercise it.\n expect(store.saveCheckpointsIfPending).toBeDefined();\n if (!store.saveCheckpointsIfPending) return;\n expect(await store.saveCheckpointsIfPending([])).toEqual([]);\n await store.createRun(run());\n await store.createRun(run({ id: 'r2' }));\n const pending = (runId: string, seq: number) =>\n checkpoint({\n runId,\n seq,\n stepId: `${runId}:${seq}`,\n status: 'pending',\n output: undefined,\n wakeAt: 5_000,\n });\n for (const seq of [0, 1, 2, 3]) await store.saveCheckpoint(pending('r1', seq));\n await store.saveCheckpoint(pending('r2', 0));\n // seq 1 already settled: a stale write must not land on it.\n await store.saveCheckpoint({\n ...pending('r1', 1),\n status: 'completed',\n output: { first: 1 },\n });\n const done = (runId: string, seq: number, output: unknown) => ({\n ...pending(runId, seq),\n status: 'completed' as const,\n output,\n wakeAt: undefined,\n });\n\n const wrote = await store.saveCheckpointsIfPending([\n done('r1', 0, { n: 0 }),\n done('r1', 1, { n: 1 }),\n // A second copy of the same row: compared against the first copy's write, so refused.\n done('r1', 0, { n: 'dup' }),\n { ...pending('r1', 2), status: 'failed', error: { message: 'boom' }, wakeAt: undefined },\n // No such row: nothing is written.\n done('r1', 9, { n: 9 }),\n // Another run's row, same seq as one above.\n done('r2', 0, { n: 'r2' }),\n ]);\n expect(wrote).toEqual([true, false, false, true, false, true]);\n\n const r1 = await store.listCheckpoints('r1');\n expect(r1.map((c) => [c.seq, c.status, c.output])).toEqual([\n [0, 'completed', { n: 0 }],\n [1, 'completed', { first: 1 }],\n [2, 'failed', undefined],\n [3, 'pending', undefined],\n ]);\n expect(r1[2]?.error).toEqual({ message: 'boom' });\n // The settling write carried no deadline, so the one the pending row held is cleared.\n expect(r1[0]?.wakeAt).toBeUndefined();\n expect(r1[3]?.wakeAt).toBe(5_000);\n expect(await store.getCheckpoint('r1', 9)).toBeNull();\n expect((await store.getCheckpoint('r2', 0))?.output).toEqual({ n: 'r2' });\n\n // A pending-to-pending write keeps the row pending, so a later entry still lands on it.\n expect(\n await store.saveCheckpointsIfPending([\n { ...pending('r1', 3), wakeAt: 9_000 },\n done('r1', 3, { n: 3 }),\n ]),\n ).toEqual([true, true]);\n expect((await store.getCheckpoint('r1', 3))?.output).toEqual({ n: 3 });\n });\n\n t('saveCheckpointsIfPending writes a wide batch', async () => {\n if (!store.saveCheckpointsIfPending) return;\n await store.createRun(run());\n const n = 600;\n const rows = Array.from({ length: n }, (_, seq) =>\n checkpoint({ seq, stepId: `r1:${seq}`, status: 'pending', output: undefined }),\n );\n for (const row of rows) await store.saveCheckpoint(row);\n const wrote = await store.saveCheckpointsIfPending(\n rows.map((row) => ({ ...row, status: 'completed' as const, output: { seq: row.seq } })),\n );\n expect(wrote.every((w) => w === true)).toBe(true);\n expect(wrote).toHaveLength(n);\n expect(await store.countCheckpoints?.('r1', 0, n - 1, ['completed'])).toBe(n);\n expect((await store.getCheckpoint('r1', n - 1))?.output).toEqual({ seq: n - 1 });\n });\n\n t(\n 'upserts checkpoints, reads them by (runId, seq), and lists them ordered by seq',\n async () => {\n await store.createRun(run());\n await store.saveCheckpoint(checkpoint());\n await store.saveCheckpoint(\n checkpoint({ seq: 1, name: 'charge', output: { chargeId: 'ch_1' } }),\n );\n // Re-save seq 0 with a new output — upsert, not a duplicate row.\n await store.saveCheckpoint(checkpoint({ output: { ok: true, again: true } }));\n\n expect((await store.getCheckpoint('r1', 0))?.output).toEqual({ ok: true, again: true });\n expect((await store.getCheckpoint('r1', 1))?.name).toBe('charge');\n const list = await store.listCheckpoints('r1');\n expect(list.map((c) => c.seq)).toEqual([0, 1]);\n },\n );\n\n t(\n 'getLatestCheckpointByName returns the highest-seq match (and undefined for none)',\n async () => {\n await store.createRun(run());\n await store.saveCheckpoint(\n checkpoint({ seq: 0, name: 'event:progress', output: { pct: 10 } }),\n );\n await store.saveCheckpoint(checkpoint({ seq: 1, name: 'charge', output: { id: 'c1' } }));\n await store.saveCheckpoint(\n checkpoint({ seq: 2, name: 'event:progress', output: { pct: 50 } }),\n );\n await store.saveCheckpoint(\n checkpoint({ seq: 3, name: 'event:progress', output: { pct: 90 } }),\n );\n\n // Optional on the interface (the engine has a fallback), but a conformant store MUST provide\n // it — assert presence, then exercise the fast path.\n const getLatestCheckpointByName = store.getLatestCheckpointByName;\n expect(getLatestCheckpointByName).toBeDefined();\n if (!getLatestCheckpointByName) return;\n\n const latest = await getLatestCheckpointByName.call(store, 'r1', 'event:progress');\n expect(latest?.seq).toBe(3);\n expect(latest?.output).toEqual({ pct: 90 });\n expect(await getLatestCheckpointByName.call(store, 'r1', 'event:missing')).toBeUndefined();\n },\n );\n\n t(\n 'listCheckpointsByNamePrefix returns prefix matches ordered by seq (empty => none)',\n async () => {\n await store.createRun(run());\n await store.saveCheckpoint(checkpoint({ seq: 0, name: 'reserve' }));\n await store.saveCheckpoint(checkpoint({ seq: 1, name: 'spawn:0', output: 'child-a' }));\n await store.saveCheckpoint(checkpoint({ seq: 2, name: 'signal:child:c2' }));\n await store.saveCheckpoint(checkpoint({ seq: 3, name: 'event:progress' }));\n await store.saveCheckpoint(checkpoint({ seq: 4, name: 'spawn:1', output: 'child-b' }));\n\n // Optional on the interface (the engine has a fallback), but a conformant store MUST provide\n // it — assert presence, then exercise the fast path.\n const listCheckpointsByNamePrefix = store.listCheckpointsByNamePrefix;\n expect(listCheckpointsByNamePrefix).toBeDefined();\n if (!listCheckpointsByNamePrefix) return;\n\n const matches = await listCheckpointsByNamePrefix.call(store, 'r1', [\n 'signal:child:',\n 'spawn:',\n ]);\n expect(matches.map((c) => c.name)).toEqual(['spawn:0', 'signal:child:c2', 'spawn:1']);\n expect(await listCheckpointsByNamePrefix.call(store, 'r1', [])).toEqual([]);\n },\n );\n\n t('a name or token prefix matches literally — `_` and `%` are not wildcards', async () => {\n await store.createRun(run());\n await store.saveCheckpoint(checkpoint({ seq: 0, name: 'signal:child:job_1.onError.0' }));\n await store.saveCheckpoint(checkpoint({ seq: 1, name: 'signal:child:jobX1.onError.0' }));\n await store.putSignalWaiter({ token: 'child:job_1.child.0', runId: 'r1', seq: 2 });\n await store.putSignalWaiter({ token: 'child:jobX1.child.0', runId: 'r1', seq: 3 });\n\n const matches = await store.listCheckpointsByNamePrefix?.('r1', ['signal:child:job_1.']);\n expect(matches?.map((c) => c.name)).toEqual(['signal:child:job_1.onError.0']);\n expect((await store.listSignalWaiters('child:job_1.')).map((w) => w.token)).toEqual([\n 'child:job_1.child.0',\n ]);\n });\n\n t('round-trips checkpoint events and reads back a missing checkpoint as null', async () => {\n await store.createRun(run());\n await store.saveCheckpoint(\n checkpoint({\n events: [{ at: 1, level: 'error', message: 'p-3 failed', name: 'p-3', status: 'failed' }],\n }),\n );\n expect((await store.getCheckpoint('r1', 0))?.events).toEqual([\n { at: 1, level: 'error', message: 'p-3 failed', name: 'p-3', status: 'failed' },\n ]);\n expect(await store.getCheckpoint('r1', 99)).toBeNull();\n });\n\n // ---- recovery / dispatch / timer scans --------------------------------------------------\n\n t('lists incomplete runs, pending runs (FIFO), and due timers', async () => {\n await store.createRun(run({ id: 'running1', status: 'running' }));\n await store.createRun(run({ id: 'suspended1', status: 'suspended', wakeAt: 5_000 }));\n await store.createRun(run({ id: 'done1', status: 'completed' }));\n await store.createRun(\n run({ id: 'pending2', status: 'pending', createdAt: new Date('2026-06-11T00:00:02.000Z') }),\n );\n await store.createRun(\n run({ id: 'pending1', status: 'pending', createdAt: new Date('2026-06-11T00:00:01.000Z') }),\n );\n\n expect((await store.listIncompleteRuns()).map((r) => r.id)).toEqual(['running1']);\n // FIFO by createdAt.\n expect((await store.listPendingRuns(10)).map((r) => r.id)).toEqual(['pending1', 'pending2']);\n expect((await store.listPendingRuns(1)).map((r) => r.id)).toEqual(['pending1']);\n expect((await store.listDueTimers(10_000)).map((r) => r.id)).toEqual(['suspended1']);\n expect(await store.listDueTimers(1_000)).toHaveLength(0);\n });\n\n t('keeps a worker inside its own namespace on every path that picks work up', async () => {\n // The boundary `WorkflowRun.namespace` documents: \"A worker only picks up /\n // recovers / resumes-timers-for / times-out runs in its own namespace.\"\n //\n // This case exists because that sentence was true of exactly one adapter. The\n // other three did not declare the `namespace` parameter at all — and TypeScript\n // lets an implementation take fewer parameters than the interface promises, so\n // three stores silently ignored the argument and still satisfied `StateStore`.\n // A worker serving one tenant listed, recovered and — through `sweepTimeouts`,\n // which selects its cancellation candidates with `listRuns` — CANCELLED another\n // tenant's runs. The last of those is a write, which is why this is asserted on\n // all four paths rather than on the two that name `namespace` in their signature.\n await store.createRun(run({ id: 'a-pending', status: 'pending', namespace: 'alpha' }));\n await store.createRun(run({ id: 'b-pending', status: 'pending', namespace: 'beta' }));\n await store.createRun(run({ id: 'a-running', status: 'running', namespace: 'alpha' }));\n await store.createRun(run({ id: 'b-running', status: 'running', namespace: 'beta' }));\n await store.createRun(\n run({ id: 'a-timer', status: 'suspended', wakeAt: 5_000, namespace: 'alpha' }),\n );\n await store.createRun(\n run({ id: 'b-timer', status: 'suspended', wakeAt: 5_000, namespace: 'beta' }),\n );\n\n expect((await store.listPendingRuns(10, 'alpha')).map((r) => r.id)).toEqual(['a-pending']);\n expect((await store.listIncompleteRuns('alpha')).map((r) => r.id)).toEqual(['a-running']);\n expect((await store.listDueTimers(10_000, 'alpha')).map((r) => r.id)).toEqual(['a-timer']);\n expect(\n (await store.listRuns({ namespace: 'alpha', status: 'running' })).map((r) => r.id),\n ).toEqual(['a-running']);\n\n // Foreign runs must not eat the FIFO budget either. Asking for one row while\n // `beta` holds the oldest pending run has to return `alpha`'s, not nothing:\n // a store that filtered AFTER applying the limit would answer with an empty\n // page and look exactly like an idle tenant.\n expect((await store.listPendingRuns(1, 'alpha')).map((r) => r.id)).toEqual(['a-pending']);\n\n // `undefined` is NOT \"namespace is null\" — it is the operator view, every\n // tenant at once. A store that read it as a null predicate would pass every\n // single-tenant test written above and hide every run in a deployment that\n // actually sets `DURABLE_TENANT`.\n expect((await store.listPendingRuns(10)).map((r) => r.id).sort()).toEqual([\n 'a-pending',\n 'b-pending',\n ]);\n expect((await store.listIncompleteRuns()).map((r) => r.id).sort()).toEqual([\n 'a-running',\n 'b-running',\n ]);\n expect((await store.listDueTimers(10_000)).map((r) => r.id).sort()).toEqual([\n 'a-timer',\n 'b-timer',\n ]);\n });\n\n // ---- lease / lock -----------------------------------------------------------------------\n\n t('tryLockRun is atomic and respects lease expiry', async () => {\n await store.createRun(run({ id: 'r1' }));\n expect(await store.tryLockRun('r1', 'A', 2_000, 1_000)).toBe(true);\n // B can't take it while A's lease is live.\n expect(await store.tryLockRun('r1', 'B', 3_000, 1_500)).toBe(false);\n // Once A's lease (2_000) has passed, B reclaims it.\n expect(await store.tryLockRun('r1', 'B', 4_000, 2_500)).toBe(true);\n // Release lets anyone re-acquire immediately.\n await store.releaseRunLock('r1');\n expect(await store.tryLockRun('r1', 'C', 9_000, 2_600)).toBe(true);\n });\n\n t('renewRunLock only succeeds for the current owner', async () => {\n await store.createRun(run({ id: 'r1' }));\n expect(await store.tryLockRun('r1', 'A', 2_000, 1_000)).toBe(true);\n // The holder heartbeats and keeps the lease.\n expect(await store.renewRunLock('r1', 'A', 5_000)).toBe(true);\n // A different instance can't renew a lease it doesn't hold.\n expect(await store.renewRunLock('r1', 'B', 9_000)).toBe(false);\n // And the renewed lease is honored: B still can't steal it before it expires.\n expect(await store.tryLockRun('r1', 'B', 6_000, 4_000)).toBe(false);\n });\n\n // ---- list filters: status / statuses / tag / origin --------------------------------------\n\n t('filters listRuns by workflow and by status', async () => {\n await store.createRun(run({ id: 'a', workflow: 'checkout', status: 'running' }));\n await store.createRun(run({ id: 'b', workflow: 'refund', status: 'running' }));\n await store.createRun(run({ id: 'c', workflow: 'checkout', status: 'completed' }));\n\n expect((await store.listRuns({ workflow: 'checkout' })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'c',\n ]);\n expect((await store.listRuns({ status: 'running' })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'b',\n ]);\n expect(\n (await store.listRuns({ workflow: 'checkout', status: 'running' })).map((r) => r.id),\n ).toEqual(['a']);\n });\n\n t('filters listRuns by a status set (status IN ...) for singleton admission', async () => {\n await store.createRun(run({ id: 'a', status: 'running' }));\n await store.createRun(run({ id: 'b', status: 'suspended' }));\n await store.createRun(run({ id: 'c', status: 'completed' }));\n await store.createRun(run({ id: 'd', status: 'pending' }));\n\n expect(\n (await store.listRuns({ statuses: ['running', 'suspended'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n // Single + set are ANDed (the narrower set wins).\n expect(\n (await store.listRuns({ status: 'running', statuses: ['running', 'suspended'] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n // Empty set matches nothing.\n expect(await store.listRuns({ statuses: [] })).toHaveLength(0);\n });\n\n t('filters listRuns by an exact tag (no substring match)', async () => {\n if (!supportsTagFilter) return; // Prisma + SQLite: array_contains is unsupported there (see flag doc)\n await store.createRun(run({ id: 'a', tags: ['etl', 'critical'] }));\n await store.createRun(run({ id: 'b', tags: ['etl-foo'] }));\n await store.createRun(run({ id: 'c' })); // no tags\n\n expect((await store.getRun('a'))?.tags).toEqual(['etl', 'critical']);\n expect((await store.listRuns({ tag: 'etl' })).map((r) => r.id)).toEqual(['a']);\n expect((await store.listRuns({ tag: 'etl-foo' })).map((r) => r.id)).toEqual(['b']);\n expect(await store.listRuns({ tag: 'nope' })).toHaveLength(0);\n });\n\n t(\n 'round-trips a run origin and filters listRuns by it, never matching an absent one',\n async () => {\n // `origin` (which library registered the workflow) is derived at registration, never declared,\n // so ABSENCE is a first-class value: `undefined` means UNKNOWN — a row written before the\n // column existed, a `registerRemote`, convention routing, an unresolvable package. It must\n // survive the round trip as `undefined` rather than as any plausible-looking stand-in, which a\n // real registration would then be indistinguishable from.\n await store.createRun(run({ id: 'a', origin: '@dudousxd/nestjs-catalog-pipeline' }));\n await store.createRun(run({ id: 'b', origin: '@dudousxd/nestjs-agent' }));\n await store.createRun(run({ id: 'c' })); // unattributed — unknown origin\n\n expect((await store.getRun('a'))?.origin).toBe('@dudousxd/nestjs-catalog-pipeline');\n expect((await store.getRun('c'))?.origin).toBeUndefined();\n\n // `RunQuery.origin` is plain equality, so the unattributed run matches NO origin value — it is\n // excluded here exactly as `b` is, and is never folded into a bucket to make a facet look\n // complete. A store that widened this to `= x OR IS NULL` would return `c` and fail.\n expect(\n (await store.listRuns({ origin: '@dudousxd/nestjs-catalog-pipeline' })).map((r) => r.id),\n ).toEqual(['a']);\n // Nor does it answer to a name invented for it.\n expect(await store.listRuns({ origin: 'unknown' })).toEqual([]);\n // Which is why \"all origins\" has to stay the default view: with the filter off — and only\n // then — the unattributed run is reachable.\n expect((await store.listRuns({})).map((r) => r.id).sort()).toEqual(['a', 'b', 'c']);\n },\n );\n\n t(\n 'selects the UNATTRIBUTED runs when `origin` is null — the one thing a value cannot',\n async () => {\n // The console needs an \"unknown origin\" facet, and the same absence that makes `origin` match\n // no value makes it unfilterable by one. `null` asks for `origin IS NULL` instead, which is what\n // lets that facet page server-side rather than by holding every run in the browser.\n await store.createRun(run({ id: 'a', origin: '@dudousxd/nestjs-agent' }));\n await store.createRun(run({ id: 'b' }));\n await store.createRun(run({ id: 'c' }));\n\n expect((await store.listRuns({ origin: null })).map((r) => r.id).sort()).toEqual([\n 'b',\n 'c',\n ]);\n // And it stays ANDed with the other predicates rather than replacing them.\n await store.createRun(run({ id: 'd', status: 'dead' }));\n expect((await store.listRuns({ origin: null, status: 'dead' })).map((r) => r.id)).toEqual([\n 'd',\n ]);\n },\n );\n\n t('counts runs by (status, origin) without returning them', async () => {\n // The aggregate behind a console's chips. It exists so the run LIST can be paged: the page\n // bounds what is rendered, this bounds nothing — so a store that quietly applied the same limit\n // would report the page size as the deployment's totals.\n if (!store.runFacets) return; // optional on the port; every SQL adapter implements it\n await store.createRun(run({ id: 'a', status: 'completed', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'b', status: 'completed', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'c', status: 'failed', origin: 'pkg-b' }));\n await store.createRun(run({ id: 'd', status: 'failed' })); // unattributed\n await store.createRun(run({ id: 'e', status: 'failed' })); // unattributed\n\n const facets = await store.runFacets({});\n\n expect(facets).toContainEqual({ status: 'completed', origin: 'pkg-a', count: 2 });\n expect(facets).toContainEqual({ status: 'failed', origin: 'pkg-b', count: 1 });\n // Runs with no origin are a real, countable cell here — `null`, not a stand-in name.\n expect(facets).toContainEqual({ status: 'failed', origin: null, count: 2 });\n expect(facets.reduce((n, f) => n + f.count, 0)).toBe(5);\n });\n\n t('narrows runFacets on the same predicates listRuns pages', async () => {\n // A facet count that did not obey the tenant/tag the operator has typed would label the page\n // with a number taken over a different set.\n if (!store.runFacets) return;\n await store.createRun(run({ id: 'a', status: 'failed', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', status: 'failed', namespace: 'globex' }));\n\n expect(await store.runFacets({ namespace: 'acme' })).toEqual([\n { status: 'failed', origin: null, count: 1 },\n ]);\n });\n\n // ---- multi-value predicates (the console's multi-selects) -------------------------------\n\n t('matches ANY of a set of statuses, workflows, tenants or origins', async () => {\n // One control, several values. Each plural field ORs within itself and ANDs with the rest, so\n // an operator comparing two tenants sees both without issuing two queries.\n await store.createRun(run({ id: 'a', status: 'failed', namespace: 'acme', workflow: 'wa' }));\n await store.createRun(run({ id: 'b', status: 'dead', namespace: 'globex', workflow: 'wb' }));\n await store.createRun(\n run({ id: 'c', status: 'completed', namespace: 'initech', workflow: 'wc' }),\n );\n\n expect(\n (await store.listRuns({ statuses: ['failed', 'dead'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n expect(\n (await store.listRuns({ namespaces: ['acme', 'globex'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n expect((await store.listRuns({ workflows: ['wa', 'wc'] })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'c',\n ]);\n });\n\n t('carries the absent-origin bucket INSIDE a set of origins', async () => {\n // \"This package plus the runs nothing claims\" — a view the single `origin` cannot express at\n // all, and the reason `null` is a member of the set rather than a separate flag.\n await store.createRun(run({ id: 'a', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'b', origin: 'pkg-b' }));\n await store.createRun(run({ id: 'c' }));\n\n expect((await store.listRuns({ origins: ['pkg-a', null] })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'c',\n ]);\n expect(\n (await store.listRuns({ origins: ['pkg-a', 'pkg-b'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n });\n\n t('ANDs a plural predicate with everything else, and matches nothing when empty', async () => {\n // An empty set is a real answer — \"none of these\" — and must not widen to every run, which is\n // what dropping the clause would do.\n await store.createRun(run({ id: 'a', status: 'failed', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', status: 'dead', namespace: 'acme' }));\n\n expect(\n (await store.listRuns({ namespaces: ['acme'], statuses: ['dead'] })).map((r) => r.id),\n ).toEqual(['b']);\n expect(await store.listRuns({ namespaces: [] })).toEqual([]);\n expect(await store.listRuns({ statuses: [] })).toEqual([]);\n expect(await store.listRuns({ origins: [] })).toEqual([]);\n });\n\n t('matches runs carrying ANY of a set of tags', async () => {\n if (!supportsTagFilter) return;\n // A run holds a SET of tags, so the useful multi-value question is membership in the union —\n // asking for the intersection would return nothing for tags that never co-occur.\n await store.createRun(run({ id: 'a', tags: ['etl'] }));\n await store.createRun(run({ id: 'b', tags: ['nightly', 'batch'] }));\n await store.createRun(run({ id: 'c', tags: ['adhoc'] }));\n\n expect((await store.listRuns({ tags: ['etl', 'nightly'] })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'b',\n ]);\n expect(await store.listRuns({ tags: [] })).toEqual([]);\n });\n\n t('matches a search attribute against a SET of values (the `in` predicate)', async () => {\n // Two `eq` predicates on one key are ANDed like every other pair, and no run has one attribute\n // with two values — so a multi-select over attribute values needs its own operator.\n await store.createRun(run({ id: 'a', searchAttributes: { tier: 'pro' } }));\n await store.createRun(run({ id: 'b', searchAttributes: { tier: 'enterprise' } }));\n await store.createRun(run({ id: 'c', searchAttributes: { tier: 'free' } }));\n await store.createRun(run({ id: 'd', searchAttributes: { amount: 200 } }));\n\n const inSet = await store.listRuns({\n attributes: [{ key: 'tier', op: 'in', values: ['pro', 'enterprise'] }],\n });\n expect(inSet.map((r) => r.id).sort()).toEqual(['a', 'b']);\n\n // Mixed operand types land in different typed columns and still OR together.\n const mixed = await store.listRuns({\n attributes: [{ key: 'amount', op: 'in', values: [200, 'none'] }],\n });\n expect(mixed.map((r) => r.id)).toEqual(['d']);\n\n // Empty set matches nothing, and a run missing the key never matches.\n expect(await store.listRuns({ attributes: [{ key: 'tier', op: 'in', values: [] }] })).toEqual(\n [],\n );\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'in', values: ['pro'] }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n });\n\n // ---- value facets (what fills a console's pickers) ---------------------------------------\n\n t(\n 'enumerates the distinct values of a run column, counted and ordered by frequency',\n async () => {\n if (!store.runValueFacets) return; // optional on the port, like runFacets\n await store.createRun(run({ id: 'a', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', namespace: 'acme' }));\n await store.createRun(run({ id: 'c', namespace: 'globex' }));\n\n expect(await store.runValueFacets({ field: 'namespace' }, {})).toEqual([\n { value: 'acme', count: 2 },\n { value: 'globex', count: 1 },\n ]);\n },\n );\n\n t('reports the unattributed bucket as a `null` value, not as a name', async () => {\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'b' }));\n\n const values = await store.runValueFacets({ field: 'origin' }, {});\n expect(values).toContainEqual({ value: 'pkg-a', count: 1 });\n expect(values).toContainEqual({ value: null, count: 1 });\n });\n\n t('scopes the values to the SAME predicates the list is under', async () => {\n // The point of a picker: choose a tenant, and the tag picker offers that tenant's tags. A\n // picker that ignored the active filters would offer values whose result set is empty.\n if (!store.runValueFacets) return;\n if (!supportsTagFilter) return;\n await store.createRun(run({ id: 'a', namespace: 'acme', tags: ['etl'] }));\n await store.createRun(run({ id: 'b', namespace: 'globex', tags: ['nightly'] }));\n\n expect(await store.runValueFacets({ field: 'tag' }, { namespace: 'acme' })).toEqual([\n { value: 'etl', count: 1 },\n ]);\n });\n\n t('enumerates tags, attribute keys and the values under one key', async () => {\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', tags: ['etl'], searchAttributes: { tier: 'pro' } }));\n await store.createRun(\n run({ id: 'b', tags: ['etl', 'nightly'], searchAttributes: { tier: 'free' } }),\n );\n\n expect(await store.runValueFacets({ field: 'tag' }, {})).toEqual([\n { value: 'etl', count: 2 },\n { value: 'nightly', count: 1 },\n ]);\n expect(await store.runValueFacets({ field: 'attributeKey' }, {})).toEqual([\n { value: 'tier', count: 2 },\n ]);\n expect(\n (await store.runValueFacets({ field: 'attributeValue', key: 'tier' }, {}))\n .map((r) => r.value)\n .sort(),\n ).toEqual(['free', 'pro']);\n });\n\n t('searches values server-side, BEFORE the bound', async () => {\n // The search box exists because the list was cut to fit. Filtering the already-cut page would\n // make the values it was cut from unfindable — searchable only among what already survived,\n // which is exactly backwards on the axes with enough values to need searching.\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', namespace: 'acme-prod' }));\n await store.createRun(run({ id: 'b', namespace: 'acme-staging' }));\n await store.createRun(run({ id: 'c', namespace: 'globex' }));\n await store.createRun(run({ id: 'd', namespace: 'globex' }));\n\n const matches = await store.runValueFacets({ field: 'namespace' }, {}, { search: 'acme' });\n expect(matches.map((row) => row.value).sort()).toEqual(['acme-prod', 'acme-staging']);\n\n // `globex` has the higher count, so it owns the only slot when nothing is searched — and the\n // searched value would be unreachable if the search ran after that cut.\n expect(\n (await store.runValueFacets({ field: 'namespace' }, {}, { limit: 1 })).map((r) => r.value),\n ).toEqual(['globex']);\n expect(\n (\n await store.runValueFacets({ field: 'namespace' }, {}, { limit: 1, search: 'staging' })\n ).map((r) => r.value),\n ).toEqual(['acme-staging']);\n });\n\n t('pages values in a stable order, so page two continues page one', async () => {\n // A picker that loads as it scrolls asks for the next slice of the SAME answer. Without a\n // fixed order, page two is taken over a different arrangement and both repeats and skips.\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', namespace: 'one' }));\n await store.createRun(run({ id: 'b', namespace: 'one' }));\n await store.createRun(run({ id: 'c', namespace: 'one' }));\n await store.createRun(run({ id: 'd', namespace: 'two' }));\n await store.createRun(run({ id: 'e', namespace: 'two' }));\n await store.createRun(run({ id: 'f', namespace: 'three' }));\n\n const first = await store.runValueFacets({ field: 'namespace' }, {}, { limit: 2 });\n const second = await store.runValueFacets(\n { field: 'namespace' },\n {},\n { limit: 2, offset: 2 },\n );\n\n expect(first).toEqual([\n { value: 'one', count: 3 },\n { value: 'two', count: 2 },\n ]);\n expect(second).toEqual([{ value: 'three', count: 1 }]);\n // The two pages together are the whole answer, with nothing repeated between them.\n expect(new Set([...first, ...second].map((r) => r.value)).size).toBe(3);\n });\n\n t('searches and pages the tag axis too, where the values actually pile up', async () => {\n if (!store.runValueFacets) return;\n if (!supportsTagFilter) return;\n await store.createRun(run({ id: 'a', tags: ['type:mvr', 'etl'] }));\n await store.createRun(run({ id: 'b', tags: ['type:mel', 'etl'] }));\n await store.createRun(run({ id: 'c', tags: ['etl'] }));\n\n expect(\n (await store.runValueFacets({ field: 'tag' }, {}, { search: 'type:' }))\n .map((r) => r.value)\n .sort(),\n ).toEqual(['type:mel', 'type:mvr']);\n expect(await store.runValueFacets({ field: 'tag' }, {}, { limit: 1 })).toEqual([\n { value: 'etl', count: 3 },\n ]);\n });\n\n t('bounds the values it returns, keeping the most common ones', async () => {\n // Tag and attribute cardinality grows with the data (a `singleton:<key>` tag is minted per\n // key), so the unbounded answer is a listing wearing an aggregate's shape.\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', namespace: 'acme' }));\n await store.createRun(run({ id: 'c', namespace: 'globex' }));\n\n expect(await store.runValueFacets({ field: 'namespace' }, {}, { limit: 1 })).toEqual([\n { value: 'acme', count: 2 },\n ]);\n });\n\n t('countRuns counts the same set listRuns returns, without the paging', async () => {\n expect(typeof store.countRuns).toBe('function');\n await store.createRun(run({ id: 'n1', status: 'running', namespace: 'a', tags: ['q'] }));\n await store.createRun(run({ id: 'n2', status: 'pending', namespace: 'a' }));\n await store.createRun(run({ id: 'n3', status: 'completed', namespace: 'a', tags: ['q'] }));\n await store.createRun(run({ id: 'n4', status: 'running', namespace: 'b', tags: ['q'] }));\n\n expect(await store.countRuns?.({})).toBe(4);\n expect(await store.countRuns?.({ namespace: 'a' })).toBe(3);\n expect(await store.countRuns?.({ namespace: 'a', statuses: ['pending', 'running'] })).toBe(2);\n expect(await store.countRuns?.({ statuses: [] })).toBe(0);\n if (supportsTagFilter) {\n expect(await store.countRuns?.({ tag: 'q', statuses: ['running', 'pending'] })).toBe(2);\n }\n });\n\n t(\n 'engine rejects a start over its concurrency quota and frees the slot once a run settles',\n async () => {\n if (!supportsTagFilter) return;\n const engine = new WorkflowEngine({ store });\n engine.register('q-wait', '1', async (ctx) => ctx.waitForSignal('never'));\n const quota = {\n key: 'tenant:a',\n limit: 1,\n countStatuses: ['pending' as const, 'running' as const, 'suspended' as const],\n };\n\n await engine.start('q-wait', {}, 'q1', { concurrency: quota });\n expect((await engine.waitForRun('q1', { timeoutMs: 20_000 })).status).toBe('suspended');\n await expect(engine.start('q-wait', {}, 'q2', { concurrency: quota })).rejects.toThrow(\n /concurrency limit/,\n );\n expect(await store.getRun('q2')).toBeNull(); // nothing was created\n // A different key is its own bucket.\n await engine.start('q-wait', {}, 'q3', { concurrency: { ...quota, key: 'tenant:b' } });\n\n expect((await engine.waitForRun('q1', { timeoutMs: 20_000 })).status).toBe('suspended');\n // Settling the run (here: cancelling it) frees its slot for the next start.\n await engine.cancel('q1');\n expect((await store.getRun('q1'))?.status).toBe('cancelled');\n await engine.start('q-wait', {}, 'q4', { concurrency: quota });\n expect(await store.getRun('q4')).not.toBeNull();\n // Let every started run park (and its execution settle) before the store is torn down.\n for (const id of ['q3', 'q4']) await engine.waitForRun(id, { timeoutMs: 20_000 });\n await engine.drain();\n },\n );\n\n // ---- persisted schedules ----------------------------------------------------------------\n\n const schedule = (over: Partial<ScheduleRecord> = {}): ScheduleRecord => ({\n id: 's1',\n namespace: 'default',\n workflow: 'digest',\n paused: false,\n nextFireAt: NOW + 60_000,\n tags: ['tenant:a'],\n spec: { v: 1, cron: '0 9 * * *', input: { userId: 'u1', deep: [1, { x: true }] } },\n state: { window: NOW + 60_000 },\n createdAt: at,\n updatedAt: at,\n ...over,\n });\n\n t('saves, reads back, replaces and deletes a schedule', async () => {\n expect(typeof store.saveSchedule).toBe('function');\n await store.saveSchedule?.(schedule());\n const loaded = await store.getSchedule?.('s1');\n expect(loaded).toMatchObject({\n id: 's1',\n namespace: 'default',\n workflow: 'digest',\n paused: false,\n nextFireAt: NOW + 60_000,\n tags: ['tenant:a'],\n spec: { v: 1, cron: '0 9 * * *', input: { userId: 'u1', deep: [1, { x: true }] } },\n state: { window: NOW + 60_000 },\n });\n expect(loaded?.createdAt.getTime()).toBe(at.getTime());\n\n // saveSchedule is an upsert: a second save replaces the row.\n await store.saveSchedule?.(\n schedule({ workflow: 'digest2', nextFireAt: null, tags: undefined }),\n );\n const replaced = await store.getSchedule?.('s1');\n expect(replaced?.workflow).toBe('digest2');\n expect(replaced?.nextFireAt).toBeNull();\n expect(replaced?.tags ?? []).toEqual([]);\n\n expect(await store.getSchedule?.('nope')).toBeNull();\n expect(await store.deleteSchedule?.('s1')).toBe(true);\n expect(await store.deleteSchedule?.('s1')).toBe(false);\n expect(await store.getSchedule?.('s1')).toBeNull();\n });\n\n t('updateSchedule patches, and compare-and-sets on nextFireAt', async () => {\n await store.saveSchedule?.(schedule());\n expect(await store.updateSchedule?.('s1', { paused: true })).toBe(true);\n expect((await store.getSchedule?.('s1'))?.paused).toBe(true);\n\n // CAS: only the caller that saw the current nextFireAt wins.\n const next = { nextFireAt: NOW + 120_000, state: { window: NOW + 120_000, fires: 1 } };\n expect(await store.updateSchedule?.('s1', next, NOW + 60_000)).toBe(true);\n expect(await store.updateSchedule?.('s1', next, NOW + 60_000)).toBe(false);\n const after = await store.getSchedule?.('s1');\n expect(after?.nextFireAt).toBe(NOW + 120_000);\n expect(after?.state).toEqual({ window: NOW + 120_000, fires: 1 });\n\n // CAS against NULL.\n await store.updateSchedule?.('s1', { nextFireAt: null });\n expect(await store.updateSchedule?.('s1', { nextFireAt: NOW }, NOW + 1)).toBe(false);\n expect(await store.updateSchedule?.('s1', { nextFireAt: NOW }, null)).toBe(true);\n expect(await store.updateSchedule?.('ghost', { paused: true })).toBe(false);\n });\n\n t('lists schedules by namespace/workflow/tag/paused and answers \"due by\"', async () => {\n await store.saveSchedule?.(schedule({ id: 'a', nextFireAt: NOW - 10 }));\n await store.saveSchedule?.(schedule({ id: 'b', nextFireAt: NOW - 20, namespace: 'x' }));\n await store.saveSchedule?.(schedule({ id: 'c', nextFireAt: NOW - 30, paused: true }));\n await store.saveSchedule?.(schedule({ id: 'd', nextFireAt: NOW + 10, workflow: 'other' }));\n await store.saveSchedule?.(schedule({ id: 'e', nextFireAt: null, tags: ['tenant:b'] }));\n const ids = async (q: ScheduleQuery) =>\n ((await store.listSchedules?.(q)) ?? []).map((r) => r.id);\n\n // Soonest-due first; never-firing last.\n expect(await ids({})).toEqual(['c', 'b', 'a', 'd', 'e']);\n expect(await ids({ dueBy: NOW })).toEqual(['b', 'a']);\n expect(await ids({ dueBy: NOW, namespace: 'default' })).toEqual(['a']);\n expect(await ids({ dueBy: NOW, limit: 1 })).toEqual(['b']);\n expect(await ids({ workflow: 'other' })).toEqual(['d']);\n expect(await ids({ paused: true })).toEqual(['c']);\n if (supportsTagFilter) expect(await ids({ tag: 'tenant:b' })).toEqual(['e']);\n expect(await ids({ limit: 2, offset: 1 })).toEqual(['b', 'a']);\n });\n\n t('orders listRuns newest-first and paginates with limit/offset', async () => {\n await store.createRun(run({ id: 'old', createdAt: new Date('2026-06-11T00:00:00.000Z') }));\n await store.createRun(run({ id: 'mid', createdAt: new Date('2026-06-11T00:00:01.000Z') }));\n await store.createRun(run({ id: 'new', createdAt: new Date('2026-06-11T00:00:02.000Z') }));\n\n expect((await store.listRuns({})).map((r) => r.id)).toEqual(['new', 'mid', 'old']);\n expect((await store.listRuns({ limit: 2 })).map((r) => r.id)).toEqual(['new', 'mid']);\n expect((await store.listRuns({ limit: 2, offset: 1 })).map((r) => r.id)).toEqual([\n 'mid',\n 'old',\n ]);\n });\n\n // ---- search-attribute pushdown (range + equality + the missing-key contract) ------------\n\n t('round-trips searchAttributes and answers equality + range attribute queries', async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { amount: 30, tier: 'free' } }));\n await store.createRun(run({ id: 'b', searchAttributes: { amount: 200, tier: 'pro' } }));\n await store.createRun(run({ id: 'c', searchAttributes: { amount: 500, tier: 'pro' } }));\n\n expect((await store.getRun('b'))?.searchAttributes).toEqual({ amount: 200, tier: 'pro' });\n\n // Range (numeric).\n expect(\n (await store.listRuns({ attributes: [{ key: 'amount', op: 'gte', value: 200 }] }))\n .map((r) => r.id)\n .sort(),\n ).toEqual(['b', 'c']);\n // Two ANDed predicates (string eq + numeric range).\n expect(\n (\n await store.listRuns({\n attributes: [\n { key: 'tier', op: 'eq', value: 'pro' },\n { key: 'amount', op: 'lt', value: 300 },\n ],\n })\n ).map((r) => r.id),\n ).toEqual(['b']);\n // `ne` excludes the matching value AND absent keys (missing-key-never-matches contract).\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'ne', value: 'free' }] }))\n .map((r) => r.id)\n .sort(),\n ).toEqual(['b', 'c']);\n });\n\n t('matches a boolean search attribute by eq/ne', async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { vip: true } }));\n await store.createRun(run({ id: 'b', searchAttributes: { vip: false } }));\n await store.createRun(run({ id: 'c', searchAttributes: { other: 1 } })); // no `vip`\n\n expect(\n (await store.listRuns({ attributes: [{ key: 'vip', op: 'eq', value: true }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n // ne=true matches the explicit false but NOT the run missing `vip` (missing-key contract).\n expect(\n (await store.listRuns({ attributes: [{ key: 'vip', op: 'ne', value: true }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['b']);\n });\n\n t('a predicate on an absent key matches nothing (every op)', async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { amount: 100 } }));\n for (const op of ['eq', 'ne', 'gt', 'gte', 'lt', 'lte'] as const) {\n expect(\n await store.listRuns({ attributes: [{ key: 'missing', op, value: 1 }] }),\n ).toHaveLength(0);\n }\n });\n\n t(\n 're-indexes the search-attribute side-table on update (old values stop matching)',\n async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { tier: 'free', amount: 10 } }));\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'free' }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n\n await store.updateRun('a', { searchAttributes: { tier: 'pro' } });\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'pro' }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n // Old key/value pairs are gone.\n expect(\n await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'free' }] }),\n ).toHaveLength(0);\n expect(\n await store.listRuns({ attributes: [{ key: 'amount', op: 'eq', value: 10 }] }),\n ).toHaveLength(0);\n },\n );\n\n t('combines an attribute predicate with a coarse status filter and paginates', async () => {\n await store.createRun(run({ id: 'a', status: 'running', searchAttributes: { amount: 300 } }));\n await store.createRun(\n run({ id: 'b', status: 'completed', searchAttributes: { amount: 400 } }),\n );\n await store.createRun(run({ id: 'c', status: 'running', searchAttributes: { amount: 50 } }));\n\n const res = await store.listRuns({\n status: 'running',\n attributes: [{ key: 'amount', op: 'gte', value: 100 }],\n limit: 10,\n });\n expect(res.map((r) => r.id)).toEqual(['a']);\n });\n\n // ---- signal waiters & buffered signals --------------------------------------------------\n\n t('stores, lists by prefix, and atomically takes a signal waiter', async () => {\n await store.putSignalWaiter({ token: 'approve-1', runId: 'r1', seq: 3 });\n await store.putSignalWaiter({ token: 'approve-2', runId: 'r2', seq: 4 });\n await store.putSignalWaiter({ token: 'other-1', runId: 'r3', seq: 5 });\n\n expect((await store.listSignalWaiters('approve-')).map((w) => w.token).sort()).toEqual([\n 'approve-1',\n 'approve-2',\n ]);\n expect((await store.takeSignalWaiter('approve-1'))?.seq).toBe(3);\n // Taken exactly once.\n expect(await store.takeSignalWaiter('approve-1')).toBeNull();\n });\n\n t(\n 'round-trips a signal waiter parallelGroup (child-fan tag) through put → take → list',\n async () => {\n // A remote `gather_children` fan threads its group onto each child waiter so the resolving\n // `signal:child:` checkpoint carries it; the store must persist it on the waiter row.\n await store.putSignalWaiter({\n token: 'child:r.child.0',\n runId: 'r',\n seq: 0,\n parallelGroup: 'gather:0',\n });\n // A lone (non-fan) child await carries no group.\n await store.putSignalWaiter({ token: 'child:r.child.9', runId: 'r', seq: 9 });\n\n const listed = await store.listSignalWaiters('child:');\n expect(listed.find((w) => w.token === 'child:r.child.0')?.parallelGroup).toBe('gather:0');\n expect(listed.find((w) => w.token === 'child:r.child.9')?.parallelGroup).toBeUndefined();\n\n expect((await store.takeSignalWaiter('child:r.child.0'))?.parallelGroup).toBe('gather:0');\n expect((await store.takeSignalWaiter('child:r.child.9'))?.parallelGroup).toBeUndefined();\n },\n );\n\n t('registerChildWaits writes every waiter and placeholder, and upserts on repeat', async () => {\n expect(store.registerChildWaits).toBeTypeOf('function');\n await store.createRun(run({ id: 'p' }));\n const entry = (i: number, status: StepCheckpoint['status']) => ({\n waiter: { token: `child:p.all.0.${i}`, runId: 'p', seq: i, parallelGroup: 'all:0' },\n checkpoint: checkpoint({\n runId: 'p',\n seq: i,\n stepId: `p:${i}`,\n name: `signal:child:p.all.0.${i}`,\n kind: 'signal',\n status,\n parallelGroup: 'all:0',\n }),\n });\n // Wider than one statement on stores that split the batch.\n const entries = Array.from({ length: 250 }, (_, i) => entry(i, 'running'));\n await store.registerChildWaits?.(entries);\n\n const waiters = await store.listSignalWaiters('child:p.all.0.');\n expect(waiters).toHaveLength(250);\n expect(waiters.find((w) => w.token === 'child:p.all.0.7')).toEqual(entries[7]?.waiter);\n const cps = await store.listCheckpoints('p');\n expect(cps).toHaveLength(250);\n expect(cps[7]).toMatchObject({ name: 'signal:child:p.all.0.7', status: 'running' });\n expect(cps[7]?.parallelGroup).toBe('all:0');\n\n await store.registerChildWaits?.([entry(7, 'completed')]);\n expect((await store.getCheckpoint('p', 7))?.status).toBe('completed');\n expect(await store.listCheckpoints('p')).toHaveLength(250);\n await expect(store.registerChildWaits?.([])).resolves.toBeUndefined();\n });\n\n t('compactCheckpoints replaces a seq range with one checkpoint, atomically', async () => {\n expect(store.compactCheckpoints).toBeTypeOf('function');\n await store.createRun(run({ id: 'r' }));\n await store.createRun(run({ id: 'other' }));\n for (let seq = 0; seq < 10; seq += 1) {\n await store.saveCheckpoint(checkpoint({ runId: 'r', seq, stepId: `r:${seq}` }));\n }\n await store.saveCheckpoint(checkpoint({ runId: 'other', seq: 3, stepId: 'other:3' }));\n const into = checkpoint({\n runId: 'r',\n seq: 2,\n stepId: 'r:2',\n name: 'fan:r.all.2.',\n kind: 'signal',\n output: { from: 0, values: [{ n: 1 }, 'two', null] },\n parallelGroup: 'all:2',\n });\n\n await store.compactCheckpoints?.('r', 2, 7, into);\n\n const left = await store.listCheckpoints('r');\n expect(left.map((cp) => cp.seq)).toEqual([0, 1, 2, 8, 9]);\n expect(left[2]).toMatchObject({ name: 'fan:r.all.2.', parallelGroup: 'all:2' });\n expect(left[2]?.output).toEqual({ from: 0, values: [{ n: 1 }, 'two', null] });\n expect(await store.listCheckpoints('other')).toHaveLength(1);\n });\n\n t(\"listSignalWaitersByRun returns only the given runs' waiters\", async () => {\n expect(store.listSignalWaitersByRun).toBeTypeOf('function');\n await store.putSignalWaiter({\n token: 'child:a.all.0.0',\n runId: 'a',\n seq: 0,\n parallelGroup: 'all:0',\n });\n await store.putSignalWaiter({ token: 'approve-a', runId: 'a', seq: 1 });\n await store.putSignalWaiter({ token: 'approve-b', runId: 'b', seq: 0 });\n await store.putSignalWaiter({ token: 'approve-c', runId: 'c', seq: 0 });\n\n const tokens = async (ids: string[]) =>\n ((await store.listSignalWaitersByRun?.(ids)) ?? []).map((w) => w.token).sort();\n expect(await tokens(['a', 'b'])).toEqual(['approve-a', 'approve-b', 'child:a.all.0.0']);\n expect(await tokens(['missing'])).toEqual([]);\n expect(await tokens([])).toEqual([]);\n expect((await store.listSignalWaitersByRun?.(['a']))?.find((w) => w.seq === 0)).toEqual({\n token: 'child:a.all.0.0',\n runId: 'a',\n seq: 0,\n parallelGroup: 'all:0',\n });\n });\n\n t('hasSignalWaiter answers by run and exact token prefix', async () => {\n expect(store.hasSignalWaiter).toBeTypeOf('function');\n const has = (runId: string, prefix: string) => store.hasSignalWaiter?.(runId, prefix);\n await store.putSignalWaiter({\n token: 'child:p_1.all.3.0',\n runId: 'p_1',\n seq: 3,\n parallelGroup: 'all:3',\n });\n // A grandchild's waiter shares the token prefix but belongs to another run.\n await store.putSignalWaiter({\n token: 'child:p_1.all.4.0.all.0.0',\n runId: 'p_1.all.4.0',\n seq: 0,\n });\n // Matches `child:p_1.all.3.%` as a LIKE pattern (`_` is a wildcard there) but not as a prefix.\n await store.putSignalWaiter({ token: 'child:pX1.all.3.0', runId: 'p_1', seq: 9 });\n\n expect(await has('p_1', 'child:p_1.all.3.')).toBe(true);\n expect(await has('p_1', 'child:p_1.all.4.')).toBe(false);\n expect(await has('other', 'child:p_1.all.3.')).toBe(false);\n // `_` and `%` are literal, not wildcards, and the match is case-sensitive.\n expect(await has('p_1', 'child:p%.all.3.')).toBe(false);\n expect(await has('p_1', 'CHILD:p_1.all.3.')).toBe(false);\n\n await store.takeSignalWaiter('child:p_1.all.3.0');\n expect(await has('p_1', 'child:p_1.all.3.')).toBe(false);\n });\n\n t(\n \"removeSignalWaiter deletes only the exact (token, runId, seq) row, never a different run's\",\n async () => {\n // A stale identity for a token that's since been superseded (`token` is the store's primary\n // key — a later `putSignalWaiter` for the same token replaces the row) must be a no-op: it\n // must NOT steal the new owner's row out from under it.\n await store.putSignalWaiter({ token: 'approve-1', runId: 'r1', seq: 3 });\n await store.putSignalWaiter({ token: 'approve-1', runId: 'r2', seq: 7 });\n await store.removeSignalWaiter({ token: 'approve-1', runId: 'r1', seq: 3 });\n expect((await store.listSignalWaiters('approve-')).map((w) => w.runId)).toEqual(['r2']);\n\n // A mismatched runId/seq against the CURRENT row is also a no-op.\n await store.removeSignalWaiter({ token: 'approve-1', runId: 'r2', seq: 999 });\n expect((await store.listSignalWaiters('approve-')).map((w) => w.runId)).toEqual(['r2']);\n\n // The exact match deletes it.\n await store.removeSignalWaiter({ token: 'approve-1', runId: 'r2', seq: 7 });\n expect(await store.listSignalWaiters('approve-')).toEqual([]);\n\n // Removing an absent row entirely is a no-op, not an error.\n await store.removeSignalWaiter({ token: 'never-registered', runId: 'r1', seq: 0 });\n },\n );\n\n t('buffers signals and takes them FIFO per token', async () => {\n await store.bufferSignal('sig', { n: 1 });\n await store.bufferSignal('sig', { n: 2 });\n await store.bufferSignal('other', { n: 9 });\n\n expect(await store.takeBufferedSignal('sig')).toEqual({ payload: { n: 1 } });\n expect(await store.takeBufferedSignal('sig')).toEqual({ payload: { n: 2 } });\n expect(await store.takeBufferedSignal('sig')).toBeNull();\n expect(await store.takeBufferedSignal('other')).toEqual({ payload: { n: 9 } });\n });\n\n t('buffers events per name, oldest-first, and lists them without consuming', async () => {\n await store.bufferEvent({\n name: 'order.paid',\n payload: { n: 1 },\n id: 'e1',\n publishedAt: 100,\n });\n await store.bufferEvent({\n name: 'order.paid',\n payload: { n: 2 },\n id: 'e2',\n publishedAt: 200,\n });\n await store.bufferEvent({\n name: 'other.event',\n payload: { n: 9 },\n id: 'e3',\n publishedAt: 50,\n });\n\n const listed = await store.listBufferedEvents('order.paid', 10);\n expect(listed.map((e) => e.payload)).toEqual([{ n: 1 }, { n: 2 }]); // oldest (publishedAt) first\n expect(listed.map((e) => e.id)).toEqual(['e1', 'e2']);\n expect(listed[0]?.publishedAt).toBe(100);\n // listing does not consume — the same rows are still there.\n expect(await store.listBufferedEvents('order.paid', 10)).toHaveLength(2);\n expect(await store.listBufferedEvents('other.event', 10)).toEqual([\n { id: 'e3', payload: { n: 9 }, publishedAt: 50 },\n ]);\n });\n\n t('listBufferedEvents caps at `limit`', async () => {\n await store.bufferEvent({ name: 'evt', payload: 1, id: 'a', publishedAt: 1 });\n await store.bufferEvent({ name: 'evt', payload: 2, id: 'b', publishedAt: 2 });\n await store.bufferEvent({ name: 'evt', payload: 3, id: 'c', publishedAt: 3 });\n\n expect(await store.listBufferedEvents('evt', 2)).toHaveLength(2);\n });\n\n t(\n 'removeBufferedEvent atomically deletes by id — true iff a row existed, false on a repeat/absent id',\n async () => {\n await store.bufferEvent({ name: 'evt', payload: { ok: true }, id: 'x1', publishedAt: 1 });\n\n expect(await store.removeBufferedEvent('x1')).toBe(true);\n expect(await store.listBufferedEvents('evt', 10)).toEqual([]);\n // Already gone — a second attempt (the concurrent-claim arbiter) reports false, not an error.\n expect(await store.removeBufferedEvent('x1')).toBe(false);\n expect(await store.removeBufferedEvent('never-buffered')).toBe(false);\n },\n );\n\n // ---- transaction (optional) -------------------------------------------------------------\n\n t('transaction commits the checkpoint atomically and returns the work result', async () => {\n if (!store.transaction) return; // store without transactions (rare); skip\n if (!supportsAsyncTransaction) return; // sync driver (Drizzle + better-sqlite3); skip — see flag doc\n await store.createRun(run());\n const result = await store.transaction(async (tx) => {\n await tx.saveCheckpoint(checkpoint({ seq: 7, name: 'tx-step', output: { paid: true } }));\n return 'ok';\n });\n expect(result).toBe('ok');\n const cp = await store.getCheckpoint('r1', 7);\n expect(cp?.name).toBe('tx-step');\n expect(cp?.output).toEqual({ paid: true });\n });\n\n // ---- engine end-to-end durability -------------------------------------------------------\n\n t(\n 'runs the engine end-to-end durably, resuming without re-running completed steps',\n async () => {\n const engine = new WorkflowEngine({ store });\n let aRuns = 0;\n let failOnce = true;\n engine.register('wf', '1', async (ctx) => {\n const a = await ctx.localStep('a', async () => {\n aRuns += 1;\n return 10;\n });\n const b = await ctx.localStep('b', async () => {\n if (failOnce) {\n failOnce = false;\n throw new Error('boom');\n }\n return a + 5;\n });\n return b;\n });\n await engine.start('wf', { x: 1 }, 'run1');\n expect((await engine.waitForRun('run1')).status).toBe('failed');\n const resumed = await engine.resume('run1');\n expect(resumed.status).toBe('completed');\n expect(resumed.output).toBe(15);\n // Step `a` checkpointed `completed` the first turn, so replay returns it instead of re-running.\n expect(aRuns).toBe(1);\n },\n );\n\n t('starts the version the caller pinned, and refuses one that is not registered', async () => {\n const engine = new WorkflowEngine({ store });\n const ran: string[] = [];\n engine.register('vwf', '1', async () => {\n ran.push('v1');\n return 'v1-output';\n });\n engine.register('vwf', '2', async () => {\n ran.push('v2');\n return 'v2-output';\n });\n\n await engine.start('vwf', {}, 'pinned-run', { version: '1' });\n const pinned = await engine.waitForRun('pinned-run', { timeoutMs: 20_000 });\n\n // The OLDER body ran and the store recorded the older version — so this run's every future\n // resume replays v1 too. Asserted against a real store because the version is what the row\n // must carry, not just what the in-process registry believed at start.\n expect(pinned.output).toBe('v1-output');\n expect(ran).toEqual(['v1']);\n expect((await store.getRun('pinned-run'))?.workflowVersion).toBe('1');\n\n // Unpinned is unchanged: newest wins.\n await engine.start('vwf', {}, 'newest-run');\n expect((await engine.waitForRun('newest-run', { timeoutMs: 20_000 })).output).toBe(\n 'v2-output',\n );\n\n // An unregistered version fails BEFORE a row exists — never a silent fall back to v2.\n await expect(engine.start('vwf', {}, 'ghost-run', { version: '9' })).rejects.toThrow(\n /vwf@9 is not registered/,\n );\n expect(await store.getRun('ghost-run')).toBeNull();\n });\n\n t(\n 'times out every unfinished run of its workflow and namespace, except one compensating',\n async () => {\n // `sweepTimeouts` selects its candidates with ONE `listRuns({ workflow, statuses, namespace })`,\n // so this is the store answering that combined filter, not just the engine deciding.\n const engine = new WorkflowEngine({ store, namespace: 'alpha' });\n engine.register('t-capped', '1', async () => undefined, { executionTimeout: '1h' });\n const old = { workflow: 't-capped', namespace: 'alpha', createdAt: new Date(1000) };\n await store.createRun(run({ ...old, id: 'tc-pending', status: 'pending' }));\n await store.createRun(run({ ...old, id: 'tc-running', status: 'running' }));\n await store.createRun(run({ ...old, id: 'tc-suspended', status: 'suspended' }));\n await store.createRun(run({ ...old, id: 'tc-blocked', status: 'blocked' }));\n await store.createRun(run({ ...old, id: 'tc-cancelling', status: 'cancelling' }));\n await store.createRun(run({ ...old, id: 'tc-done', status: 'completed' }));\n await store.createRun(\n run({ ...old, id: 'tc-other-tenant', status: 'pending', namespace: 'beta' }),\n );\n await store.createRun(\n run({ ...old, id: 'tc-other-workflow', status: 'pending', workflow: 't-uncapped' }),\n );\n\n await engine.sweepTimeouts(1000 + 3_700_000);\n\n for (const id of ['tc-pending', 'tc-running', 'tc-suspended', 'tc-blocked']) {\n const swept = await store.getRun(id);\n expect(swept?.status, id).toBe('cancelled');\n expect(swept?.error?.code, id).toBe('execution_timeout');\n }\n expect((await store.getRun('tc-cancelling'))?.status).toBe('cancelling');\n expect((await store.getRun('tc-done'))?.status).toBe('completed');\n expect((await store.getRun('tc-other-tenant'))?.status).toBe('pending');\n expect((await store.getRun('tc-other-workflow'))?.status).toBe('pending');\n },\n );\n\n t('cancels a timed-out run’s live child subtree, not just the run itself', async () => {\n const engine = new WorkflowEngine({ store });\n // Only the parent is timed: a child reaching a terminal state can only be the cascade.\n engine.register('t-grandchild', '1', async (ctx) => ctx.waitForSignal('never'));\n engine.register('t-child', '1', async (ctx) => {\n await ctx.startChild('t-grandchild', {}, 'tgc');\n return ctx.waitForSignal('never');\n });\n engine.register(\n 't-parent',\n '1',\n async (ctx) => {\n await ctx.startChild('t-child', {}, 'tc');\n return ctx.waitForSignal('never');\n },\n { executionTimeout: '1h' },\n );\n\n await engine.start('t-parent', {}, 'tp');\n for (const id of ['tp', 'tc', 'tgc']) {\n expect((await engine.waitForRun(id, { timeoutMs: 20_000 })).status).toBe('suspended');\n }\n\n await engine.sweepTimeouts(Date.now() + 3_700_000);\n\n const parent = await store.getRun('tp');\n expect(parent?.status).toBe('cancelled');\n expect(parent?.error?.code).toBe('execution_timeout');\n // Both levels — the cascade is the same recursive walk an explicit `cancel` uses.\n expect((await store.getRun('tc'))?.status).toBe('cancelled');\n expect((await store.getRun('tgc'))?.status).toBe('cancelled');\n });\n });\n}\n","import {\n type CheckpointStat,\n type FanPageQuery,\n SUMMARY_CHILD_LIMIT,\n type StateStore,\n type StepCheckpoint,\n type WorkflowRun,\n aggregatesCheckpoints,\n checkpointStatsOf,\n childIdsOf,\n pageFan,\n pageFanFromStore,\n queryCheckpointsOf,\n summarizeRunFromStore,\n summarizeTimeline,\n} from '@dudousxd/nestjs-durable-core';\nimport { expect } from 'vitest';\n\nconst base = Date.parse('2026-06-11T00:00:00.000Z');\nconst ms = (n: number) => new Date(base + n);\n\nfunction cp(seq: number, over: Partial<StepCheckpoint> = {}): StepCheckpoint {\n return {\n runId: 'r1',\n seq,\n name: 'Lines.process',\n kind: 'remote',\n stepId: `r1:${seq}`,\n status: 'completed',\n output: { n: seq },\n attempts: 1,\n enqueuedAt: ms(seq * 10),\n startedAt: ms(seq * 10 + 3),\n finishedAt: ms(seq * 10 + 7),\n ...over,\n };\n}\n\nconst child = (seq: number, group: string, over: Partial<StepCheckpoint> = {}) =>\n cp(seq, {\n name: `signal:child:r1.all.${group.split(':')[1]}.${seq}`,\n kind: 'signal',\n parallelGroup: group,\n output: { ok: true, value: seq },\n ...over,\n });\n\nconst folded = (seq: number, group: string, wave: number, from: number, n: number) =>\n cp(seq, {\n name: `fan:r1.all.${group.split(':')[1]}.w${wave}.`,\n kind: 'signal',\n parallelGroup: group,\n output: { from, values: Array.from({ length: n }, (_, i) => i) },\n });\n\n/**\n * One run carrying every shape a run detail has to summarize: ungrouped steps and a spawn edge, a\n * step fan wide by rows, a narrow step fan, a step fan sent in partial waves (wide by its declared\n * size), a failFast fan with mixed step names, a child fan in flight with failed children of both\n * kinds plus a folded wave, a child fan that is mostly folded (one fold standing for no child), a\n * narrow child fan with a failure, and a child fan whose group predates the declared size.\n */\nexport function aggregationFixture(): StepCheckpoint[] {\n const rows: StepCheckpoint[] = [cp(0, { name: 'Lines.load', kind: 'local' })];\n rows.push(cp(1, { name: 'spawn:audit-1', kind: 'local', output: 'audit-1' }));\n // Step fan, wide by rows: 25 failed (retried), 20 pending, 2 running.\n for (let i = 0; i < 120; i++) {\n const seq = 2 + i;\n rows.push(\n cp(seq, {\n parallelGroup: 'steps:2:120',\n ...(i % 4 === 0 && i < 100\n ? { status: 'failed', attempts: 3, error: { message: `bad ${i}` } }\n : i >= 100 && i < 120 && i !== 105 && i !== 106\n ? { status: 'pending', output: undefined }\n : i === 105 || i === 106\n ? { status: 'running', output: undefined }\n : {}),\n }),\n );\n }\n for (let i = 0; i < 5; i++) rows.push(cp(122 + i, { parallelGroup: 'steps:122:5' }));\n for (let i = 0; i < 30; i++) {\n rows.push(\n cp(127 + i, {\n parallelGroup: 'steps:127:40000',\n name: 'Rows.score',\n ...(i >= 12 ? { status: 'pending', output: undefined } : {}),\n }),\n );\n }\n for (let i = 0; i < 30; i++) {\n rows.push(\n cp(157 + i, {\n parallelGroup: 'steps:157:60:failFast',\n name: i % 2 === 0 ? 'Check.a' : 'Check.b',\n ...(i === 7 ? { status: 'failed', error: { message: 'stop' } } : {}),\n }),\n );\n }\n // Child fan in flight: placeholders, successes, `ok: false` completions and failed rows, and a\n // folded wave standing for 20 children.\n for (let i = 0; i < 60; i++) {\n const seq = 187 + i;\n rows.push(\n child(seq, 'all:187:n80', {\n ...(i >= 50\n ? { status: 'running', output: undefined }\n : i % 3 === 0\n ? { output: { ok: false, error: `child ${i}` } }\n : i % 7 === 1\n ? { status: 'failed', error: { message: 'lost' } }\n : {}),\n }),\n );\n }\n rows.push(folded(247, 'all:187:n80', 9, 60, 20));\n // A child fan mostly folded: few rows, declared wide; one fold stands for no child at all.\n rows.push(folded(300, 'all:300:n3000:failFast', 0, 0, 1000));\n rows.push(folded(301, 'all:300:n3000:failFast', 1, 1000, 1000));\n rows.push(folded(302, 'all:300:n3000:failFast', 2, 2000, 0));\n for (let i = 0; i < 4; i++) {\n rows.push(child(303 + i, 'all:300:n3000:failFast', { status: 'running', output: undefined }));\n }\n rows.push(child(400, 'all:400:n3'));\n rows.push(child(401, 'all:400:n3', { output: { ok: false, error: 'narrow' } }));\n rows.push(child(402, 'all:400:n3', { status: 'running', output: undefined }));\n for (let i = 0; i < 55; i++) {\n rows.push(child(450 + i, 'all:450', i === 54 ? { output: { ok: false } } : {}));\n }\n rows.push(cp(600, { name: 'Lines.report', kind: 'local', status: 'failed' }));\n return rows;\n}\n\nconst GROUPS = [\n 'steps:2:120',\n 'steps:122:5',\n 'steps:127:40000',\n 'steps:157:60:failFast',\n 'all:187:n80',\n 'all:300:n3000:failFast',\n 'all:400:n3',\n 'all:450',\n 'absent',\n];\n\nconst QUERIES: FanPageQuery[] = [\n {},\n { offset: 10, limit: 7 },\n { offset: 0, limit: 500 },\n { offset: 118, limit: 50 },\n { offset: 5000 },\n { failedOnly: true },\n { failedOnly: true, offset: 3, limit: 4 },\n { failedOnly: true, offset: 15, limit: 10 },\n { failedOnly: true, offset: 1000 },\n];\n\n/** The buckets, with names reduced to whether a bucket is uniform: a database's collation decides\n * which of two names is \"smaller\", so only that equality is portable across stores. */\nfunction comparable(stats: CheckpointStat[]) {\n return stats\n .map(({ minName, maxName, ...rest }) => ({ ...rest, uniform: minName === maxName }))\n .sort((a, b) =>\n `${a.group}|${a.status}|${a.nameKind}`.localeCompare(`${b.group}|${b.status}|${b.nameKind}`),\n );\n}\n\nasync function seed(store: StateStore, run: (over?: Partial<WorkflowRun>) => WorkflowRun) {\n await store.createRun(run());\n for (const row of aggregationFixture()) await store.saveCheckpoint(row);\n // Another run sharing a group name: every read must stay scoped to its run.\n await store.createRun(run({ id: 'r2' }));\n for (let i = 0; i < 3; i++) {\n await store.saveCheckpoint(\n cp(2 + i, { runId: 'r2', stepId: `r2:${i}`, parallelGroup: 'steps:2:120', status: 'failed' }),\n );\n }\n}\n\n/**\n * The contract of the optional checkpoint aggregation pair (`checkpointStats` + `queryCheckpoints`):\n * each agrees with its in-memory reference, and the run detail built on them is identical to the\n * one `summarizeTimeline` / `pageFan` build from the whole checkpoint list.\n */\nexport function registerCheckpointAggregationCases(\n t: (label: string, fn: () => Promise<void>) => void,\n getStore: () => StateStore,\n run: (over?: Partial<WorkflowRun>) => WorkflowRun,\n): void {\n t('checkpointStats and queryCheckpoints agree with the in-memory reference', async () => {\n const store = getStore();\n expect(store.checkpointStats).toBeDefined();\n expect(store.queryCheckpoints).toBeDefined();\n if (!aggregatesCheckpoints(store)) return;\n await seed(store, run);\n const full = await store.listCheckpoints('r1');\n\n expect(comparable(await store.checkpointStats('r1'))).toEqual(\n comparable(checkpointStatsOf(full)),\n );\n for (const group of GROUPS) {\n expect(comparable(await store.checkpointStats('r1', { group }))).toEqual(\n comparable(checkpointStatsOf(full, { group })),\n );\n }\n expect(await store.checkpointStats('nope')).toEqual([]);\n\n const queries = [\n {},\n { group: 'steps:2:120' },\n { group: 'steps:2:120', statuses: ['failed' as const], limit: 20 },\n { group: 'steps:2:120', offset: 30, limit: 5 },\n { group: 'all:187:n80', statuses: ['completed' as const], namePrefixes: ['signal:child:'] },\n { excludeGroups: ['steps:2:120', 'all:187:n80', 'all:450'] },\n { excludeGroups: [] },\n { namePrefixes: ['signal:child:', 'fan:', 'spawn:'], offset: 200, limit: 200 },\n { namePrefixes: ['fan:'] },\n { statuses: [] },\n { namePrefixes: [] },\n { statuses: ['pending' as const, 'running' as const], offset: 3 },\n ];\n for (const query of queries) {\n expect(await store.queryCheckpoints('r1', query)).toEqual(queryCheckpointsOf(full, query));\n }\n });\n\n t('a run detail read through the aggregates is the one summarizeTimeline builds', async () => {\n const store = getStore();\n if (!aggregatesCheckpoints(store)) return;\n await seed(store, run);\n const full = await store.listCheckpoints('r1');\n for (const over of [50, 0, 1000]) {\n const ids = childIdsOf(full);\n const expected = {\n ...summarizeTimeline(full, over),\n children: ids.slice(0, SUMMARY_CHILD_LIMIT),\n childCount: ids.length,\n };\n expect(await summarizeRunFromStore(store, 'r1', over)).toEqual(expected);\n }\n });\n\n t('a fan page read through the aggregates is the one pageFan builds', async () => {\n const store = getStore();\n if (!aggregatesCheckpoints(store)) return;\n await seed(store, run);\n const full = await store.listCheckpoints('r1');\n for (const group of GROUPS) {\n for (const query of QUERIES) {\n expect(await pageFanFromStore(store, 'r1', group, query)).toEqual(\n pageFan(full, group, query),\n );\n }\n }\n });\n}\n","/** A step body that throws once, then returns `value` — drives a retry, or a crash-then-resume. */\nexport function failOnce<T>(\n value: T,\n error: Error = new Error('injected failure'),\n): () => Promise<T> {\n return failTimes(1, value, error);\n}\n\n/** A step body that throws the first `n` times, then returns `value`. */\nexport function failTimes<T>(\n n: number,\n value: T,\n error: Error = new Error('injected failure'),\n): () => Promise<T> {\n let calls = 0;\n return async () => {\n calls += 1;\n if (calls <= n) throw error;\n return value;\n };\n}\n","import { InMemoryStateStore, type Transport, WorkflowEngine } from '@dudousxd/nestjs-durable-core';\n\n/** A transport that can register worker handlers (every shipped transport does). */\nexport type HandleableTransport = Transport & {\n handle(name: string, fn: (input: unknown) => Promise<unknown>): void;\n close?(): Promise<void>;\n};\n\nconst ECHO_STEP_NAME = 'conformance.echo';\n\n/**\n * A durable `ctx.call` suspends the run; the worker result resumes it asynchronously (on whatever\n * tick/poll the transport delivers on). Poll the store until the run reaches a terminal state —\n * with a generous budget so a poll-based transport (DB/SQS) has time to round-trip.\n */\nasync function settle(store: InMemoryStateStore, runId: string, timeoutMs = 15_000) {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const run = await store.getRun(runId);\n if (run && run.status !== 'pending' && run.status !== 'running' && run.status !== 'suspended')\n return run;\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new Error(`run ${runId} did not settle within ${timeoutMs}ms`);\n}\n\n/**\n * The contract every `Transport` must satisfy: a remote step dispatched through it round-trips to a\n * worker and back (success), and a throwing handler surfaces as a failed run (failure). Point it at\n * a freshly constructed transport (engine-side + worker `group` in one instance) to prove parity —\n * useful when adding a new transport. Throws on any mismatch; closes the transport when done.\n *\n * `idPrefix` keeps run ids unique across invocations against real, shared infra (queues/tables).\n */\nexport async function assertTransportConformance(\n transport: HandleableTransport,\n idPrefix = 'conf',\n): Promise<void> {\n try {\n // One engine/store/transport — a durable remote step routes its result back to this engine,\n // which resumes the run. (Two engines on one transport would fight over the result stream.)\n const store = new InMemoryStateStore();\n const engine = new WorkflowEngine({ store, transport });\n engine.register(\n 'conf-ok',\n '1',\n async (ctx) => (await ctx.step<{ doubled: number }>(ECHO_STEP_NAME, { n: 21 })).doubled,\n );\n engine.register('conf-fail', '1', async (ctx) => ctx.step(ECHO_STEP_NAME, { n: 1 }));\n\n // success: the worker doubles the input\n transport.handle(ECHO_STEP_NAME, async (input) => ({\n doubled: (input as { n: number }).n * 2,\n }));\n await engine.start('conf-ok', {}, `${idPrefix}-ok`);\n const ok = await settle(store, `${idPrefix}-ok`);\n if (ok.status !== 'completed' || ok.output !== 42) {\n throw new Error(`expected completed/42, got ${JSON.stringify(ok)}`);\n }\n\n // failure: a throwing handler surfaces as a failed run (re-register the same step to throw)\n transport.handle(ECHO_STEP_NAME, async () => {\n throw new Error('handler boom');\n });\n await engine.start('conf-fail', {}, `${idPrefix}-fail`);\n const failed = await settle(store, `${idPrefix}-fail`);\n if (failed.status !== 'failed') {\n throw new Error(`expected failed, got ${JSON.stringify(failed)}`);\n }\n } finally {\n await transport.close?.();\n }\n}\n"],"mappings":"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","names":["describe","expect","it","runAdmissionBackendContract","name","makeBackend","describe","now","make","config","backend","register","it","b","concurrency","expect","tryAdmit","waiterId","ok","toBe","release","rateLimit","limit","periodMs","priority","order","fairness","key","requireRun","store","runId","run","getRun","Error","assertRunStatus","status","assertOutput","expected","JSON","stringify","output","recordedSteps","listCheckpoints","map","cp","name","assertStepsRan","names","ran","includes","join","assertStepAttempts","attempts","find","c","DURABLE_CANONICAL_COLUMNS","durable_workflow_runs","id","workflow","workflowVersion","status","input","output","error","wakeAt","lockedBy","lockedUntil","awaitingDecisionTaskId","recoveryAttempts","tags","searchAttributes","priority","origin","namespace","createdAt","updatedAt","durable_step_checkpoints","runId","seq","name","kind","stepId","events","attempts","workerGroup","parallelGroup","enqueuedAt","startedAt","finishedAt","durable_run_attributes","key","strValue","numValue","durable_signal_waiters","token","durable_buffered_signals","payload","durable_buffered_events","publishedAt","durable_schedules","paused","nextFireAt","spec","state","assertDurableColumns","resolve","expected","mismatches","table","props","Object","entries","property","column","actual","push","preserveColumnExpectation","out","fromEntries","keys","map","p","InMemoryStateStore","InMemoryTransport","WorkflowEngine","MutableClock","current","now","set","ms","advance","createTestEngine","store","InMemoryStateStore","transport","InMemoryTransport","clock","engine","WorkflowEngine","tick","resumeDueTimers","run","workflow","input","runId","opts","start","waitForRun","InMemoryStateStore","WorkflowEngine","assertReplayable","register","history","store","InMemoryStateStore","createRun","run","status","lockedBy","undefined","lockedUntil","cp","checkpoints","saveCheckpoint","engine","WorkflowEngine","result","resume","id","error","message","startsWith","err","Error","name","SINGLETON_ADMITTED_TAG","SINGLETON_TRACKED_TAG","WorkflowEngine","beforeEach","describe","expect","it","SUMMARY_CHILD_LIMIT","aggregatesCheckpoints","checkpointStatsOf","childIdsOf","pageFan","pageFanFromStore","queryCheckpointsOf","summarizeRunFromStore","summarizeTimeline","expect","base","Date","parse","ms","n","cp","seq","over","runId","name","kind","stepId","status","output","attempts","enqueuedAt","startedAt","finishedAt","child","group","split","parallelGroup","ok","value","folded","wave","from","values","Array","length","_","i","aggregationFixture","rows","push","error","message","undefined","GROUPS","QUERIES","offset","limit","failedOnly","comparable","stats","map","minName","maxName","rest","uniform","sort","a","b","nameKind","localeCompare","seed","store","run","createRun","row","saveCheckpoint","id","registerCheckpointAggregationCases","t","getStore","expect","checkpointStats","toBeDefined","queryCheckpoints","aggregatesCheckpoints","full","listCheckpoints","toEqual","checkpointStatsOf","queries","statuses","namePrefixes","excludeGroups","query","queryCheckpointsOf","ids","childIdsOf","expected","summarizeTimeline","children","slice","SUMMARY_CHILD_LIMIT","childCount","summarizeRunFromStore","pageFanFromStore","pageFan","StateStoreUnavailableError","Error","isStateStoreUnavailable","message","name","isUnavailable","err","at","Date","NOW","parse","DAY","run","over","id","workflow","workflowVersion","status","input","orderId","createdAt","updatedAt","checkpoint","runId","seq","kind","stepId","output","ok","attempts","enqueuedAt","startedAt","finishedAt","runStateStoreContract","makeStore","describe","store","peerStore","cleanup","supportsAsyncTransaction","supportsTagFilter","skipReason","loggedSkip","beforeEach","ctx","undefined","console","warn","t","label","fn","it","expect","tryAdmitSingleton","toBeTypeOf","claim","limit","createRun","tags","toBe","updateRun","wakeAt","lockedBy","lockedUntil","getRun","toEqual","toMatchObject","toBeUndefined","not","toContain","SINGLETON_ADMITTED_TAG","SINGLETON_TRACKED_TAG","results","Promise","all","tag","map","active","listRuns","statuses","filter","r","includes","toHaveLength","created","offset","getTime","ids","i","entries","reverse","loaded","toBeNull","recoveryAttempts","total","done","dead","priority","searchAttributes","tier","saveCheckpoint","putSignalWaiter","token","deleteRun","listCheckpoints","listSignalWaiters","attributes","key","op","value","resolves","deleteRuns","aged","ageDays","sort","pruneTerminalRuns","deleted","maxAge","policy","maxCount","namespace","scope","workflows","tenantId","engine","WorkflowEngine","register","waitForSignal","startChild","start","waitForRun","timeoutMs","purgeRuns","rejects","toThrow","error","awaitingDecisionTaskId","listDueTimers","countCheckpoints","toBeDefined","registerCheckpointAggregationCases","listOrphanedRuns","tryLockRun","ownedBy","owner","lockedBefore","updateRunIf","current","kept","settled","saveCheckpointIfPending","pending","getCheckpoint","after","saveCheckpointsIfPending","first","wrote","n","r1","c","rows","Array","from","length","_","row","every","w","chargeId","again","list","pct","getLatestCheckpointByName","latest","call","listCheckpointsByNamePrefix","matches","events","level","listIncompleteRuns","listPendingRuns","releaseRunLock","renewRunLock","origin","runFacets","facets","toContainEqual","count","reduce","f","namespaces","origins","amount","inSet","values","mixed","runValueFacets","field","search","second","Set","size","countRuns","quota","countStatuses","concurrency","cancel","drain","schedule","paused","nextFireAt","spec","v","cron","userId","deep","x","state","window","saveSchedule","getSchedule","replaced","deleteSchedule","updateSchedule","next","fires","q","listSchedules","dueBy","vip","other","res","takeSignalWaiter","parallelGroup","listed","find","registerChildWaits","entry","waiter","waiters","cps","compactCheckpoints","into","left","cp","listSignalWaitersByRun","tokens","hasSignalWaiter","has","prefix","removeSignalWaiter","bufferSignal","takeBufferedSignal","payload","bufferEvent","publishedAt","listBufferedEvents","e","removeBufferedEvent","transaction","result","tx","paid","aRuns","failOnce","a","localStep","b","resumed","resume","ran","push","version","pinned","executionTimeout","old","sweepTimeouts","swept","code","now","parent","failOnce","value","error","Error","failTimes","n","calls","InMemoryStateStore","WorkflowEngine","ECHO_STEP_NAME","settle","store","runId","timeoutMs","deadline","Date","now","run","getRun","status","Promise","r","setTimeout","Error","assertTransportConformance","transport","idPrefix","InMemoryStateStore","engine","WorkflowEngine","register","ctx","step","n","doubled","handle","input","start","ok","output","JSON","stringify","failed","close"]}
1
+ {"version":3,"sources":["../src/admission-backend-conformance.ts","../src/assertions.ts","../src/durable-columns.ts","../src/harness.ts","../src/replay.ts","../src/state-store-conformance.ts","../src/checkpoint-aggregation-contract.ts","../src/steps.ts","../src/transport-conformance.ts"],"sourcesContent":["import type { AdmissionBackend, QueueConfig } from '@dudousxd/nestjs-durable-core';\nimport { describe, expect, it } from 'vitest';\n\n/**\n * Builds an {@link AdmissionBackend} bound to the given test clock. Implementations that hold their\n * own resources (e.g. a Redis connection) should register the instance for teardown out-of-band.\n */\nexport type AdmissionBackendFactory = (clock: () => number) => AdmissionBackend;\n\n/**\n * The SHARED cross-backend behavioural contract for the flow-control admission gate. Both the\n * in-process `InMemoryAdmissionBackend` and the Redis `RedisAdmissionBackend` run it, so their\n * concurrency / rate-limit / ordering semantics can never silently drift apart — backend-specific\n * concerns (leases, pub/sub, cross-pod globality) live in each adapter's own spec.\n *\n * The engine always passes a stable `waiterId`, so every gated call is order-tracked: ties with no\n * priority/fairness fall back to arrival FIFO (or LIFO when configured). These cases assert exactly\n * that, on ONE backend instance.\n */\nexport function runAdmissionBackendContract(\n name: string,\n makeBackend: AdmissionBackendFactory,\n): void {\n describe(`AdmissionBackend contract: ${name}`, () => {\n let now = 1_000_000;\n const make = (config: QueueConfig) => {\n now = 1_000_000;\n const backend = makeBackend(() => now);\n backend.register(config);\n return backend;\n };\n\n it('caps concurrency: a second call blocks until the first releases', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('q', { waiterId: 'a' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'b' })).ok).toBe(false);\n await b.release('q', 'a');\n expect((await b.tryAdmit('q', { waiterId: 'b' })).ok).toBe(true);\n });\n\n it('enforces a fixed-window rate limit', async () => {\n const b = make({ name: 'q', rateLimit: { limit: 2, periodMs: 1000 } });\n expect((await b.tryAdmit('q', { waiterId: '1' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: '2' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: '3' })).ok).toBe(false);\n now += 1001;\n expect((await b.tryAdmit('q', { waiterId: '4' })).ok).toBe(true);\n });\n\n it('admits the highest-priority waiter first when a slot frees', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('q', { waiterId: 'holder' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'low', priority: 1 })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'high', priority: 9 })).ok).toBe(false);\n await b.release('q', 'holder');\n expect((await b.tryAdmit('q', { waiterId: 'low', priority: 1 })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'high', priority: 9 })).ok).toBe(true);\n });\n\n it('orders plain-concurrency waiters by arrival (FIFO) — no priority/fairness configured', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('q', { waiterId: 'holder' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(false);\n await b.release('q', 'holder');\n // The earlier arrival wins the freed slot, on every backend.\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(true);\n });\n\n it('admits the most-recent arrival first when order is LIFO', async () => {\n const b = make({ name: 'q', concurrency: 1, order: 'lifo' });\n expect((await b.tryAdmit('q', { waiterId: 'holder' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(false);\n await b.release('q', 'holder');\n expect((await b.tryAdmit('q', { waiterId: 'first' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'second' })).ok).toBe(true);\n });\n\n it('round-robins a contended slot across fairness keys', async () => {\n const b = make({ name: 'q', concurrency: 1, fairness: 'key' });\n expect((await b.tryAdmit('q', { waiterId: 'a0', key: 'A' })).ok).toBe(true);\n expect((await b.tryAdmit('q', { waiterId: 'a1', key: 'A' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'b0', key: 'B' })).ok).toBe(false);\n await b.release('q', 'a0');\n // B (never served) wins over A (just served), not arrival order.\n expect((await b.tryAdmit('q', { waiterId: 'a1', key: 'A' })).ok).toBe(false);\n expect((await b.tryAdmit('q', { waiterId: 'b0', key: 'B' })).ok).toBe(true);\n });\n\n it('leaves an unregistered queue ungated', async () => {\n const b = make({ name: 'q', concurrency: 1 });\n expect((await b.tryAdmit('other', { waiterId: 'x' })).ok).toBe(true);\n expect((await b.tryAdmit('other', { waiterId: 'y' })).ok).toBe(true);\n });\n });\n}\n","import type { RunStatus, StateStore } from '@dudousxd/nestjs-durable-core';\n\nasync function requireRun(store: StateStore, runId: string) {\n const run = await store.getRun(runId);\n if (!run) throw new Error(`assertion failed: run ${runId} not found`);\n return run;\n}\n\nexport async function assertRunStatus(\n store: StateStore,\n runId: string,\n status: RunStatus,\n): Promise<void> {\n const run = await requireRun(store, runId);\n if (run.status !== status) {\n throw new Error(`expected run ${runId} to be \"${status}\", but it was \"${run.status}\"`);\n }\n}\n\nexport async function assertOutput(\n store: StateStore,\n runId: string,\n expected: unknown,\n): Promise<void> {\n const run = await requireRun(store, runId);\n if (JSON.stringify(run.output) !== JSON.stringify(expected)) {\n throw new Error(\n `expected run ${runId} output ${JSON.stringify(expected)}, got ${JSON.stringify(run.output)}`,\n );\n }\n}\n\n/** The names of the steps that have run, in order. */\nexport async function recordedSteps(store: StateStore, runId: string): Promise<string[]> {\n return (await store.listCheckpoints(runId)).map((cp) => cp.name);\n}\n\n/** Assert every named step ran (in any order). */\nexport async function assertStepsRan(\n store: StateStore,\n runId: string,\n names: string[],\n): Promise<void> {\n const ran = await recordedSteps(store, runId);\n for (const name of names) {\n if (!ran.includes(name)) {\n throw new Error(`expected step \"${name}\" to have run; ran: [${ran.join(', ')}]`);\n }\n }\n}\n\n/** Assert a step ran exactly the given number of attempts (e.g. to verify retries). */\nexport async function assertStepAttempts(\n store: StateStore,\n runId: string,\n name: string,\n attempts: number,\n): Promise<void> {\n const cp = (await store.listCheckpoints(runId)).find((c) => c.name === name);\n if (!cp) throw new Error(`expected step \"${name}\" to have run, but it did not`);\n if (cp.attempts !== attempts) {\n throw new Error(`expected step \"${name}\" to take ${attempts} attempt(s), took ${cp.attempts}`);\n }\n}\n","/**\n * The canonical physical column names for the durable tables, keyed by table → entity property →\n * column. This is the cross-adapter contract: a run written by one store adapter must be readable by\n * another, so EVERY adapter (TypeORM, MikroORM, Prisma, Drizzle) must map these properties to these\n * exact columns. The canonical convention is `snake_case`.\n *\n * Each adapter has a spec that asserts its physical columns against this map (see `assertDurableColumns`).\n * Without it, adapters silently diverge — one defaulting to its ORM's `snake_case` naming strategy,\n * another keeping the verbatim camelCase property name — and a store swap fails against an existing\n * table with \"Unknown column\" only at runtime. The map exists so that divergence is a failing unit\n * test, not a production incident.\n *\n * The camelCase (\"preserve\") naming is simply the property names themselves (the object keys), so no\n * separate map is needed for it.\n *\n * A property belongs here only when EVERY adapter declares it — the assertion walks this map and\n * reports a missing property as a mismatch, so listing a column one adapter doesn't have would fail\n * that adapter for a divergence it isn't guilty of. An absence here therefore records one of two\n * different things, and telling them apart matters: a naming question nobody has settled, or a\n * capability one adapter has and the others do not.\n *\n * `WorkflowRun.namespace` was the standing example of the second kind, and it is worth keeping the\n * story because of how it ended. Only the MikroORM adapter had the column; the other three did not\n * declare the `namespace` parameter on `listPendingRuns`/`listIncompleteRuns`/`listDueTimers` at\n * all, which TypeScript permits, so they satisfied `StateStore` while ignoring the tenant boundary\n * entirely. The gap was real and this map was right to stay quiet about it — but \"this map is quiet\"\n * was also the only thing standing between that and a cross-tenant incident. All four adapters carry\n * the column now, so it is pinned below, and the conformance suite asserts the boundary itself\n * rather than only the column's name.\n */\nexport const DURABLE_CANONICAL_COLUMNS = {\n durable_workflow_runs: {\n id: 'id',\n workflow: 'workflow',\n workflowVersion: 'workflow_version',\n status: 'status',\n input: 'input',\n output: 'output',\n error: 'error',\n wakeAt: 'wake_at',\n lockedBy: 'locked_by',\n lockedUntil: 'locked_until',\n // The REMOTE turn the engine suspended on; `completeRemoteDecision` matches against it so only\n // the currently-awaited turn's decision is applied. A store swap that lost this column would not\n // fail loudly — it would apply a stale decision to the wrong turn — which is why it is pinned\n // rather than left to each adapter's own spec.\n awaitingDecisionTaskId: 'awaiting_decision_task_id',\n recoveryAttempts: 'recovery_attempts',\n tags: 'tags',\n searchAttributes: 'search_attributes',\n priority: 'priority',\n // Which library registered the workflow. Single-word, so `snake_case` and `preserve` agree and\n // an adapter can look canonical by accident — which is exactly why it is pinned here rather than\n // left to four per-adapter assertions to keep saying the same thing.\n origin: 'origin',\n // The tenant a run belongs to, and the predicate on every poll tick. Pinned here\n // now that all four adapters carry the column — see the note above, which used to\n // name this as the standing example of a capability gap the map cannot express.\n namespace: 'namespace',\n createdAt: 'created_at',\n updatedAt: 'updated_at',\n },\n durable_step_checkpoints: {\n runId: 'run_id',\n seq: 'seq',\n name: 'name',\n kind: 'kind',\n stepId: 'step_id',\n status: 'status',\n input: 'input',\n output: 'output',\n error: 'error',\n events: 'events',\n attempts: 'attempts',\n workerGroup: 'worker_group',\n // A `ctx.gather`/`ctx.all` fan tags every sibling step with the same group so the dashboard can\n // render them as one parallel group. Same physical name in the waiter table below — two tables,\n // one column name, which is precisely the kind of near-duplicate that drifts if unpinned.\n parallelGroup: 'parallel_group',\n wakeAt: 'wake_at',\n enqueuedAt: 'enqueued_at',\n startedAt: 'started_at',\n finishedAt: 'finished_at',\n },\n durable_run_attributes: {\n runId: 'run_id',\n key: 'key',\n strValue: 'str_value',\n numValue: 'num_value',\n },\n durable_signal_waiters: {\n token: 'token',\n runId: 'run_id',\n seq: 'seq',\n // The fan-out group threaded onto a child waiter, so the resolving `signal:child:` checkpoint\n // carries it. Only fan-out child waiters populate it, but every adapter declares the column.\n parallelGroup: 'parallel_group',\n },\n durable_buffered_signals: {\n id: 'id',\n token: 'token',\n payload: 'payload',\n },\n durable_buffered_events: {\n id: 'id',\n name: 'name',\n payload: 'payload',\n publishedAt: 'published_at',\n },\n // Persisted schedules (`engine.schedules`). `spec`/`state` are engine-owned JSON documents.\n durable_schedules: {\n id: 'id',\n namespace: 'namespace',\n workflow: 'workflow',\n paused: 'paused',\n nextFireAt: 'next_fire_at',\n tags: 'tags',\n spec: 'spec',\n state: 'state',\n createdAt: 'created_at',\n updatedAt: 'updated_at',\n },\n} as const;\n\nexport type DurableColumnMap = typeof DURABLE_CANONICAL_COLUMNS;\n\n/** A single column-name disagreement found by {@link assertDurableColumns}. */\nexport interface DurableColumnMismatch {\n table: string;\n property: string;\n expected: string;\n actual: string | undefined;\n}\n\n/**\n * Walk every (table, property) in the canonical contract and compare it to what an adapter actually\n * maps, via the supplied `resolve(table, property) => columnName`. Returns the list of mismatches\n * (empty when the adapter is canonical) so a spec can `expect(assertDurableColumns(resolve)).toEqual([])`.\n *\n * Pass `expected = DURABLE_CANONICAL_COLUMNS` (default) for the snake_case contract, or a map of the\n * property names to themselves to assert the camelCase (\"preserve\") naming.\n */\nexport function assertDurableColumns(\n resolve: (table: string, property: string) => string | undefined,\n expected: Record<string, Record<string, string>> = DURABLE_CANONICAL_COLUMNS,\n): DurableColumnMismatch[] {\n const mismatches: DurableColumnMismatch[] = [];\n for (const [table, props] of Object.entries(expected)) {\n for (const [property, column] of Object.entries(props)) {\n const actual = resolve(table, property);\n if (actual !== column) mismatches.push({ table, property, expected: column, actual });\n }\n }\n return mismatches;\n}\n\n/** The \"preserve\" (camelCase) expectation: every property maps to a column of the same name. */\nexport function preserveColumnExpectation(): Record<string, Record<string, string>> {\n const out: Record<string, Record<string, string>> = {};\n for (const [table, props] of Object.entries(DURABLE_CANONICAL_COLUMNS)) {\n out[table] = Object.fromEntries(Object.keys(props).map((p) => [p, p]));\n }\n return out;\n}\n","import {\n InMemoryStateStore,\n InMemoryTransport,\n type RunResult,\n type StartOptions,\n WorkflowEngine,\n type WorkflowRef,\n} from '@dudousxd/nestjs-durable-core';\n\n/** A clock you control, for testing durable sleeps without real time. */\nexport class MutableClock {\n constructor(private current = 1_000) {}\n readonly now = (): number => this.current;\n set(ms: number): void {\n this.current = ms;\n }\n advance(ms: number): void {\n this.current += ms;\n }\n}\n\nexport interface TestEngine {\n engine: WorkflowEngine;\n store: InMemoryStateStore;\n transport: InMemoryTransport;\n clock: MutableClock;\n /** Advance the clock by `ms` and resume any durable sleeps now due. */\n tick(ms: number): Promise<RunResult[]>;\n /**\n * Enqueue a run and wait for it to settle (terminal or suspended). `engine.start` only enqueues\n * now (dispatch model), so use this when a test needs the outcome synchronously.\n */\n run(\n workflow: WorkflowRef,\n input: unknown,\n runId: string,\n opts?: StartOptions,\n ): Promise<RunResult>;\n}\n\n/**\n * A self-contained engine wired to in-memory store + transport and a controllable clock — run a\n * whole workflow in a unit test, with no Postgres, no Redis, and no real time.\n */\nexport function createTestEngine(): TestEngine {\n const store = new InMemoryStateStore();\n const transport = new InMemoryTransport();\n const clock = new MutableClock();\n const engine = new WorkflowEngine({ store, transport, clock: clock.now });\n return {\n engine,\n store,\n transport,\n clock,\n async tick(ms: number): Promise<RunResult[]> {\n clock.advance(ms);\n return engine.resumeDueTimers(clock.now());\n },\n async run(workflow, input, runId, opts): Promise<RunResult> {\n // `start` is overloaded per ref kind; a `WorkflowRef` union fits neither overload directly, so\n // resolve to the string overload (the engine accepts a class or name at runtime).\n await engine.start(workflow as string, input, runId, opts);\n return engine.waitForRun(runId);\n },\n };\n}\n","import {\n InMemoryStateStore,\n RUN_HISTORY_FIXTURE_VERSION,\n type StepCheckpoint,\n WorkflowEngine,\n type WorkflowRun,\n} from '@dudousxd/nestjs-durable-core';\n\nexport interface RunHistory {\n run: WorkflowRun;\n checkpoints: StepCheckpoint[];\n}\n\n/** Format marker of a fixture written by {@link serializeRunHistory} (and `durable export`). Defined\n * in core so the CLI writes the same value; re-exported here for fixture authors. */\nexport { RUN_HISTORY_FIXTURE_VERSION };\n\n/**\n * Capture a run's replayable history (the run row + its full checkpoint timeline) from anything with\n * the read API: a `WorkflowEngine`, or a bare `StateStore` (the CLI's `durable export` uses the\n * store). The fixture half of the {@link assertReplayable} loop: capture a representative run,\n * commit it with {@link serializeRunHistory}, and assert it in CI via {@link parseRunHistory}.\n * Returns `null` for an unknown run.\n */\nexport async function captureHistory(\n source: {\n getRun(runId: string): Promise<WorkflowRun | null | undefined>;\n listCheckpoints(runId: string): Promise<StepCheckpoint[]>;\n },\n runId: string,\n): Promise<RunHistory | null> {\n const run = await source.getRun(runId);\n if (!run) return null;\n return { run, checkpoints: await source.listCheckpoints(runId) };\n}\n\n/**\n * Serialize a captured history as a pretty-printed JSON fixture (with a trailing newline, so it\n * commits cleanly). Read it back with {@link parseRunHistory}.\n */\nexport function serializeRunHistory(history: RunHistory): string {\n return `${JSON.stringify({ version: RUN_HISTORY_FIXTURE_VERSION, ...history }, null, 2)}\\n`;\n}\n\n/**\n * Parse a committed fixture (what {@link serializeRunHistory} / `durable export` writes) back into a\n * {@link RunHistory}, reviving the `Date` fields JSON flattened to ISO strings, so\n * `assertReplayable(register, parseRunHistory(readFileSync('fixture.json', 'utf8')))` just works.\n *\n * Throws on a fixture whose `version` is not {@link RUN_HISTORY_FIXTURE_VERSION}: a fixture written\n * in another format would otherwise replay against the wrong shape. A fixture with NO `version` (a\n * hand-built `{ run, checkpoints }`, the shape these docs showed before the marker existed) is read\n * as version 1.\n */\nexport function parseRunHistory(json: string): RunHistory {\n const raw = JSON.parse(json) as {\n version?: unknown;\n run?: WorkflowRun;\n checkpoints?: StepCheckpoint[];\n };\n if (!raw || typeof raw !== 'object' || !raw.run || !Array.isArray(raw.checkpoints)) {\n throw new Error('not a run history fixture: expected { run, checkpoints }');\n }\n if (raw.version !== undefined && raw.version !== RUN_HISTORY_FIXTURE_VERSION) {\n throw new Error(\n `unsupported run history fixture version ${JSON.stringify(raw.version)} (this kit reads version ${RUN_HISTORY_FIXTURE_VERSION}); re-export the fixture or upgrade @dudousxd/nestjs-durable-testing`,\n );\n }\n const date = (v: unknown): Date => new Date(v as string | number | Date);\n const run: WorkflowRun = {\n ...raw.run,\n createdAt: date(raw.run.createdAt),\n updatedAt: date(raw.run.updatedAt),\n };\n const checkpoints = raw.checkpoints.map((cp) => ({\n ...cp,\n enqueuedAt: date(cp.enqueuedAt),\n startedAt: date(cp.startedAt),\n finishedAt: date(cp.finishedAt),\n }));\n return { run, checkpoints };\n}\n\n/**\n * Replay a recorded run's history against the CURRENT workflow code and throw if they diverged.\n *\n * Capture a real (ideally in-flight or representative) run from production —\n * `{ run: await store.getRun(id), checkpoints: await store.listCheckpoints(id) }` — commit it as a\n * fixture, and assert here in CI. If a code change renamed/reordered/removed a step at a position the\n * history already recorded, the engine raises a `NonDeterminismError` on replay and this rethrows it,\n * catching the break *before* it reaches an in-flight run on deploy (the moment you'd otherwise\n * silently replay the wrong checkpoint into the wrong step). Register the workflow exactly as the app\n * does:\n *\n * ```ts\n * await assertReplayable((engine) => engine.register('pipeline', '1', pipeline.run), fixture);\n * ```\n */\nexport async function assertReplayable(\n register: (engine: WorkflowEngine) => void,\n history: RunHistory,\n): Promise<void> {\n const store = new InMemoryStateStore();\n // Seed as a suspended run with no lock so resume() replays the body against the recorded\n // checkpoints — no transport is wired, so nothing new is dispatched.\n await store.createRun({\n ...history.run,\n status: 'suspended',\n lockedBy: undefined,\n lockedUntil: undefined,\n });\n for (const cp of history.checkpoints) await store.saveCheckpoint(cp);\n\n const engine = new WorkflowEngine({ store });\n register(engine);\n const result = await engine.resume(history.run.id);\n if (result.status === 'failed' && result.error?.message?.startsWith('non-determinism')) {\n const err = new Error(result.error.message);\n err.name = 'NonDeterminismError';\n throw err;\n }\n}\n","import {\n SINGLETON_ADMITTED_TAG,\n SINGLETON_TRACKED_TAG,\n type ScheduleQuery,\n type ScheduleRecord,\n type StateStore,\n type StepCheckpoint,\n WorkflowEngine,\n type WorkflowRun,\n} from '@dudousxd/nestjs-durable-core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { registerCheckpointAggregationCases } from './checkpoint-aggregation-contract';\n\n/**\n * A freshly provisioned, empty {@link StateStore} plus a `cleanup` to release its resources (close\n * the connection, drop the schema, etc.). The conformance suite asks for one before each test so\n * every case starts from a clean slate — exactly like the per-store specs that build a `:memory:` DB.\n */\nexport interface StateStoreContext {\n store: StateStore;\n /** A second wrapper sharing the database/pool, used to exercise cross-instance claims. */\n peerStore?: StateStore;\n cleanup: () => Promise<void>;\n /**\n * Whether the store's optional `transaction` can run an ASYNC work callback. Defaults to `true`.\n * Set `false` only for a driver that genuinely can't — e.g. Drizzle on the SYNCHRONOUS\n * `better-sqlite3` driver, whose `transaction()` rejects a promise-returning callback (\"Transaction\n * function cannot return a promise\"). The same Drizzle adapter on an async driver (libSQL) works,\n * and the contract still asserts `transaction` for every other store, so this never hides drift.\n */\n supportsAsyncTransaction?: boolean;\n /**\n * Whether the store can filter `listRuns({ tag })`. Defaults to `true`. Set `false` ONLY for\n * Prisma-on-SQLite: the Prisma adapter filters tags with the `array_contains` JSON predicate, which\n * Prisma supports on its real targets (Postgres + MySQL) but NOT on SQLite. SQLite is only the\n * adapter's local TEST database, so the tag case is skipped there; every other store (and Prisma on\n * a real engine) still asserts it, so this doesn't hide drift in the supported configurations.\n */\n supportsTagFilter?: boolean;\n}\n\n/** Builds a fresh, empty store for one test. Called once per `it` (in `beforeEach`). */\nexport type StateStoreFactory = () => Promise<StateStoreContext>;\n\n/**\n * Thrown by a {@link StateStoreFactory} to SKIP the contract for an unavailable backend instead of\n * failing it — e.g. a testcontainers DB spec when Docker isn't running. Every contract case catches\n * it, logs once, and returns (a no-op pass), so `pnpm test:db` is green-with-skips off a dev box\n * without Docker rather than red.\n */\nexport class StateStoreUnavailableError extends Error {\n readonly isStateStoreUnavailable = true;\n constructor(message: string) {\n super(message);\n this.name = 'StateStoreUnavailableError';\n }\n}\n\nfunction isUnavailable(err: unknown): err is StateStoreUnavailableError {\n return !!err && typeof err === 'object' && 'isStateStoreUnavailable' in err;\n}\n\nconst at = new Date('2026-06-11T00:00:00.000Z');\nconst NOW = Date.parse('2026-06-20T00:00:00.000Z');\nconst DAY = 86_400_000;\n\nconst run = (over: Partial<WorkflowRun> = {}): WorkflowRun => ({\n id: 'r1',\n workflow: 'checkout',\n workflowVersion: '1',\n status: 'running',\n input: { orderId: 'o1' },\n createdAt: at,\n updatedAt: at,\n ...over,\n});\n\nconst checkpoint = (over: Partial<StepCheckpoint> = {}): StepCheckpoint => ({\n runId: 'r1',\n seq: 0,\n name: 'reserve',\n kind: 'local',\n stepId: 'r1:0',\n status: 'completed',\n output: { ok: true },\n attempts: 1,\n enqueuedAt: at,\n startedAt: at,\n finishedAt: at,\n ...over,\n});\n\n/**\n * The SHARED behavioral contract every `StateStore` must satisfy — in-memory and each ORM adapter\n * alike. Registered as a vitest `describe`; pass a `name` and a {@link StateStoreFactory} that builds\n * a fresh, empty store. The same assertions run against SQLite/in-memory under `pnpm test` and\n * against real Postgres/MySQL (via testcontainers) under `pnpm test:db`, so any drift between an\n * adapter and the canonical (in-memory) semantics — especially the search-attribute side-table\n * pushdown, which is implemented per-store — fails here instead of silently in production.\n *\n * Each adapter's own spec keeps its dialect-specific tests (DDL/longtext/EXISTS-SQL/JSON-tolerance);\n * this suite owns the cross-store behavior so those never drift apart.\n */\nexport function runStateStoreContract(name: string, makeStore: StateStoreFactory): void {\n describe(`StateStore contract: ${name}`, () => {\n let store: StateStore;\n let peerStore: StateStore;\n let cleanup: (() => Promise<void>) | undefined;\n let supportsAsyncTransaction = true;\n let supportsTagFilter = true;\n let skipReason: string | undefined;\n let loggedSkip = false;\n\n beforeEach(async () => {\n try {\n const ctx = await makeStore();\n store = ctx.store;\n peerStore = ctx.peerStore ?? ctx.store;\n cleanup = ctx.cleanup;\n supportsAsyncTransaction = ctx.supportsAsyncTransaction ?? true;\n supportsTagFilter = ctx.supportsTagFilter ?? true;\n skipReason = undefined;\n } catch (err) {\n if (isUnavailable(err)) {\n // Backend unavailable (e.g. no Docker for a testcontainers spec): skip — don't fail.\n skipReason = err.message;\n if (!loggedSkip) {\n console.warn(`[state-store-contract] SKIPPING \"${name}\": ${skipReason}`);\n loggedSkip = true;\n }\n return;\n }\n throw err;\n }\n return async () => {\n await cleanup?.();\n };\n });\n\n /** Register a contract case that no-ops (passes) when the backend was reported unavailable. */\n const t = (label: string, fn: () => Promise<void>): void => {\n it(label, async () => {\n if (skipReason) return;\n await fn();\n });\n };\n\n t('atomically admits holders without displacement by later same-millisecond IDs', async () => {\n expect(store.tryAdmitSingleton).toBeTypeOf('function');\n const claim = (id: string, limit = 1) =>\n store.tryAdmitSingleton?.(id, 'singleton:k', 'checkout', limit);\n await store.createRun(run({ id: 'z-holder', tags: ['singleton:k', 'user-tag'] }));\n expect(await claim('z-holder')).toBe(true);\n await store.updateRun('z-holder', { status: 'suspended', wakeAt: 10_000 });\n expect(await claim('z-holder')).toBe(true);\n await store.updateRun('z-holder', { status: 'blocked', lockedBy: 'expired', lockedUntil: 0 });\n await store.createRun(run({ id: 'a-waiter', tags: ['singleton:k'] }));\n expect(await claim('a-waiter')).toBe(false);\n expect(await claim('z-holder')).toBe(true);\n await store.updateRun('z-holder', { status: 'cancelling' });\n expect(await claim('a-waiter')).toBe(false);\n await store.updateRun('z-holder', { status: 'completed' });\n expect((await store.getRun('z-holder'))?.tags).toEqual(['singleton:k', 'user-tag']);\n expect(await claim('a-waiter')).toBe(true);\n await store.updateRun('z-holder', { status: 'running' });\n expect(await claim('z-holder')).toBe(false);\n expect(await claim('missing')).toBe(false);\n });\n\n t(\n 'singleton denial atomically parks waiters and preserves cancelling/terminal state',\n async () => {\n await store.createRun(run({ id: 'holder', tags: ['singleton:k'] }));\n expect(await store.tryAdmitSingleton?.('holder', 'singleton:k', 'checkout', 1)).toBe(true);\n await store.createRun(run({ id: 'waiter', tags: ['singleton:k'] }));\n expect(\n await peerStore.tryAdmitSingleton?.('waiter', 'singleton:k', 'checkout', 1, 12000),\n ).toBe(false);\n expect(await store.getRun('waiter')).toMatchObject({ status: 'suspended', wakeAt: 12000 });\n await store.updateRun('waiter', { status: 'cancelling', wakeAt: undefined });\n expect(\n await peerStore.tryAdmitSingleton?.('waiter', 'singleton:k', 'checkout', 1, 14000),\n ).toBe(false);\n expect(await store.getRun('waiter')).toMatchObject({ status: 'cancelling' });\n expect((await store.getRun('waiter'))?.wakeAt).toBeUndefined();\n await store.updateRun('waiter', { status: 'cancelled' });\n expect(\n await peerStore.tryAdmitSingleton?.('waiter', 'singleton:k', 'checkout', 1, 16000),\n ).toBe(false);\n expect((await store.getRun('waiter'))?.status).toBe('cancelled');\n await store.updateRun('holder', { status: 'completed' });\n await store.createRun(\n run({ id: 'cancelling', status: 'cancelling', tags: ['singleton:k'] }),\n );\n expect(\n await store.tryAdmitSingleton?.('cancelling', 'singleton:k', 'checkout', 1, 18000),\n ).toBe(false);\n expect((await store.getRun('cancelling'))?.tags).not.toContain(SINGLETON_ADMITTED_TAG);\n },\n );\n\n t('competing store instances atomically claim an empty singleton slot', async () => {\n // `running` and tracked: the engine stamps SINGLETON_TRACKED_TAG on a run's first execution,\n // before it claims (an untracked untagged running run reads as a pre-0.73 holder, below).\n for (const id of ['a-first', 'b-second', 'c-third']) {\n await store.createRun(run({ id, tags: ['singleton:k', SINGLETON_TRACKED_TAG] }));\n }\n const results = await Promise.all([\n peerStore.tryAdmitSingleton?.('b-second', 'singleton:k', 'checkout', 1),\n store.tryAdmitSingleton?.('a-first', 'singleton:k', 'checkout', 1),\n peerStore.tryAdmitSingleton?.('c-third', 'singleton:k', 'checkout', 1),\n ]);\n expect(results).toEqual([false, true, false]);\n expect(await peerStore.tryAdmitSingleton?.('a-first', 'singleton:k', 'checkout', 1)).toBe(\n true,\n );\n expect((await store.getRun('a-first'))?.tags).toContain(SINGLETON_ADMITTED_TAG);\n });\n\n t('concurrent singleton claims honor limits and independent keys/workflows', async () => {\n const claim = (id: string, tag = 'singleton:k', workflow = 'checkout') =>\n store.tryAdmitSingleton?.(id, tag, workflow, 2);\n for (const id of ['z-holder', 'y-holder']) {\n await store.createRun(run({ id, tags: ['singleton:k'] }));\n expect(await claim(id)).toBe(true);\n }\n for (const id of ['a-waiter', 'b-waiter', 'c-waiter']) {\n await store.createRun(run({ id, status: 'pending', tags: ['singleton:k'] }));\n }\n expect(\n await Promise.all(['a-waiter', 'b-waiter', 'c-waiter'].map((id) => claim(id))),\n ).toEqual([false, false, false]);\n await store.updateRun('z-holder', { status: 'failed' });\n expect(\n await Promise.all(['c-waiter', 'b-waiter', 'a-waiter'].map((id) => claim(id))),\n ).toEqual([false, false, true]);\n const active = await store.listRuns({\n workflow: 'checkout',\n statuses: ['running', 'pending'],\n });\n expect(active.filter((r) => r.tags?.includes(SINGLETON_ADMITTED_TAG))).toHaveLength(2);\n await store.createRun(run({ id: 'other-key', tags: ['singleton:other'] }));\n expect(await claim('other-key', 'singleton:other')).toBe(true);\n await store.createRun(\n run({ id: 'other-workflow', workflow: 'other', tags: ['singleton:k'] }),\n );\n expect(await claim('other-workflow', 'singleton:k', 'other')).toBe(true);\n });\n\n // A replica older than 0.73 admits by a scan (the `limit` oldest running/suspended/cancelling\n // runs of the key) and writes no admission tag. During a rolling upgrade such a holder must\n // still occupy its slot for the new replicas.\n const created = (offset: number) => new Date(at.getTime() + offset * 1_000);\n\n t('singleton admission counts an untagged pre-0.73 holder (rolling upgrade)', async () => {\n const claim = (id: string, wakeAt?: number) =>\n store.tryAdmitSingleton?.(id, 'singleton:k', 'checkout', 1, wakeAt);\n // Written by an old replica: admitted by its scan, running, no admission tag. It is NEWER\n // than the run below, which was still `pending` (invisible to the old scan) back then.\n await store.createRun(run({ id: 'legacy', tags: ['singleton:k'], createdAt: created(1) }));\n // The older run, now picked up by a new replica: tracked from its first execution.\n await store.createRun(\n run({ id: 'new', tags: ['singleton:k', SINGLETON_TRACKED_TAG], createdAt: created(0) }),\n );\n expect(await claim('new', 12_000)).toBe(false);\n expect(await store.getRun('new')).toMatchObject({ status: 'suspended', wakeAt: 12_000 });\n expect((await store.getRun('new'))?.tags).toContain(SINGLETON_TRACKED_TAG);\n // A legacy holder parked on its own sleep still holds the slot.\n await store.updateRun('legacy', { status: 'suspended', wakeAt: 20_000 });\n expect(await claim('new')).toBe(false);\n // Once it settles, the new admission takes over.\n await store.updateRun('legacy', { status: 'completed' });\n expect(await claim('new')).toBe(true);\n expect((await store.getRun('new'))?.tags).toEqual(['singleton:k', SINGLETON_ADMITTED_TAG]);\n await store.updateRun('new', { status: 'completed' });\n expect((await store.getRun('new'))?.tags).toEqual(['singleton:k']);\n });\n\n t('legacy singleton waiters keep their FIFO place across the upgrade', async () => {\n const claim = (id: string) => store.tryAdmitSingleton?.(id, 'singleton:k', 'checkout', 1);\n await store.createRun(run({ id: 'holder', tags: ['singleton:k'], createdAt: created(0) }));\n // Denied by an old replica: suspended on its retry timer, no tag.\n await store.createRun(\n run({\n id: 'old-waiter',\n status: 'suspended',\n wakeAt: 5_000,\n tags: ['singleton:k'],\n createdAt: created(1),\n }),\n );\n await store.createRun(\n run({ id: 'new-run', tags: ['singleton:k', SINGLETON_TRACKED_TAG], createdAt: created(2) }),\n );\n expect(await claim('new-run')).toBe(false);\n expect(await claim('old-waiter')).toBe(false);\n // A legacy waiter re-checked by a new replica is tracked from then on; it keeps its place.\n expect(\n await store.tryAdmitSingleton?.('old-waiter', 'singleton:k', 'checkout', 1, 6_000),\n ).toBe(false);\n expect((await store.getRun('old-waiter'))?.tags).toContain(SINGLETON_TRACKED_TAG);\n await store.updateRun('holder', { status: 'completed' });\n expect(await claim('new-run')).toBe(false);\n expect(await claim('old-waiter')).toBe(true);\n expect(await claim('new-run')).toBe(false);\n await store.updateRun('old-waiter', { status: 'completed' });\n expect(await claim('new-run')).toBe(true);\n });\n\n t('concurrent claims never over-admit beside an untagged legacy holder', async () => {\n await store.createRun(run({ id: 'legacy', tags: ['singleton:k'], createdAt: created(0) }));\n const ids = ['c1', 'c2', 'c3', 'c4'];\n for (const [i, id] of ids.entries()) {\n await store.createRun(\n run({ id, tags: ['singleton:k', SINGLETON_TRACKED_TAG], createdAt: created(i + 1) }),\n );\n }\n const results = await Promise.all(\n [...ids]\n .reverse()\n .map((id, i) =>\n (i % 2 ? peerStore : store).tryAdmitSingleton?.(id, 'singleton:k', 'checkout', 2),\n ),\n );\n // One slot is the legacy holder's; only the oldest new run takes the other.\n expect(results).toEqual([false, false, false, true]);\n const active = await store.listRuns({ workflow: 'checkout', statuses: ['running'] });\n expect(\n active.filter((r) => r.tags?.includes(SINGLETON_ADMITTED_TAG)).map((r) => r.id),\n ).toEqual(['c1']);\n });\n\n // ---- create / get / update --------------------------------------------------------------\n\n t('creates a run and reads it back with its JSON input', async () => {\n await store.createRun(run());\n const loaded = await store.getRun('r1');\n expect(loaded?.workflow).toBe('checkout');\n expect(loaded?.input).toEqual({ orderId: 'o1' });\n });\n\n t('returns null for a missing run', async () => {\n expect(await store.getRun('nope')).toBeNull();\n });\n\n t('updates a run (status/output) and round-trips recoveryAttempts + dead status', async () => {\n await store.createRun(run({ recoveryAttempts: 3 }));\n await store.updateRun('r1', {\n status: 'completed',\n output: { total: 42 },\n updatedAt: at,\n });\n const done = await store.getRun('r1');\n expect(done?.status).toBe('completed');\n expect(done?.output).toEqual({ total: 42 });\n expect(done?.recoveryAttempts).toBe(3);\n\n await store.updateRun('r1', { status: 'dead', recoveryAttempts: 4 });\n const dead = await store.getRun('r1');\n expect(dead?.status).toBe('dead');\n expect(dead?.recoveryAttempts).toBe(4);\n });\n\n t('round-trips a run dispatch priority', async () => {\n await store.createRun(run({ id: 'withprio', priority: 7 }));\n await store.createRun(run({ id: 'noprio' }));\n expect((await store.getRun('withprio'))?.priority).toBe(7);\n expect((await store.getRun('noprio'))?.priority).toBeUndefined();\n });\n\n t('deleteRun removes the run and all its rows (checkpoints, waiters, attributes)', async () => {\n await store.createRun(run({ searchAttributes: { tier: 'pro' } }));\n await store.saveCheckpoint(checkpoint());\n await store.putSignalWaiter({ token: 'approve-r1', runId: 'r1', seq: 0 });\n\n await store.deleteRun('r1');\n\n // The run and every child row are gone — not merely marked terminal.\n expect(await store.getRun('r1')).toBeNull();\n expect(await store.listCheckpoints('r1')).toEqual([]);\n expect(await store.listSignalWaiters('approve-')).toEqual([]);\n // The normalized attribute side-table no longer matches it.\n expect(\n await store.listRuns({\n attributes: [{ key: 'tier', op: 'eq', value: 'pro' }],\n }),\n ).toEqual([]);\n });\n\n t('deleteRun is a no-op for a missing run', async () => {\n await expect(store.deleteRun('nope')).resolves.toBeUndefined();\n });\n\n // ---- bulk delete / retention ------------------------------------------------------------\n\n t('deleteRuns removes every listed run with its rows and ignores missing ids', async () => {\n await store.createRun(run({ id: 'd1', searchAttributes: { tier: 'pro' } }));\n await store.createRun(run({ id: 'd2' }));\n await store.createRun(run({ id: 'keep' }));\n await store.saveCheckpoint(checkpoint({ runId: 'd1', stepId: 'd1:0' }));\n await store.putSignalWaiter({ token: 'approve-d2', runId: 'd2', seq: 0 });\n\n expect(typeof store.deleteRuns).toBe('function');\n await store.deleteRuns?.(['d1', 'd2', 'ghost']);\n\n expect(await store.getRun('d1')).toBeNull();\n expect(await store.getRun('d2')).toBeNull();\n expect(await store.getRun('keep')).not.toBeNull();\n expect(await store.listCheckpoints('d1')).toEqual([]);\n expect(await store.listSignalWaiters('approve-')).toEqual([]);\n expect(\n await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'pro' }] }),\n ).toEqual([]);\n await expect(store.deleteRuns?.([])).resolves.toBeUndefined();\n });\n\n const aged = (id: string, ageDays: number, over: Partial<WorkflowRun> = {}): WorkflowRun =>\n run({\n id,\n status: 'completed',\n createdAt: new Date(NOW - ageDays * DAY),\n updatedAt: new Date(NOW - ageDays * DAY),\n ...over,\n });\n const ids = async (): Promise<string[]> => (await store.listRuns({})).map((r) => r.id).sort();\n\n t('pruneTerminalRuns drops terminal runs past maxAge and never touches live ones', async () => {\n await store.createRun(aged('old-done', 10));\n await store.createRun(aged('old-failed', 10, { status: 'failed' }));\n await store.createRun(aged('old-live', 10, { status: 'suspended' }));\n await store.createRun(aged('fresh-done', 1));\n await store.saveCheckpoint(checkpoint({ runId: 'old-done', stepId: 'old-done:0' }));\n\n expect(typeof store.pruneTerminalRuns).toBe('function');\n const deleted = await store.pruneTerminalRuns?.(\n { statuses: ['completed', 'failed', 'suspended'], maxAge: '7d' },\n NOW,\n 100,\n );\n\n expect(deleted).toBe(2);\n expect(await ids()).toEqual(['fresh-done', 'old-live']);\n expect(await store.listCheckpoints('old-done')).toEqual([]);\n });\n\n t(\n 'pruneTerminalRuns keeps only the newest maxCount and drains in batches of limit',\n async () => {\n for (let i = 1; i <= 5; i++) await store.createRun(aged(`c${i}`, i));\n\n // Keep the 2 newest (c1, c2); 3 are over the cap, but one call deletes at most `limit` = 2.\n const policy = { statuses: ['completed' as const], maxCount: 2 };\n expect(await store.pruneTerminalRuns?.(policy, NOW, 2)).toBe(2);\n expect(await store.pruneTerminalRuns?.(policy, NOW, 2)).toBe(1);\n expect(await store.pruneTerminalRuns?.(policy, NOW, 2)).toBe(0);\n expect(await ids()).toEqual(['c1', 'c2']);\n },\n );\n\n t('a scoped retention policy only prunes (and counts) the runs its scope matches', async () => {\n await store.createRun(aged('acme-old', 10, { namespace: 'acme' }));\n await store.createRun(aged('acme-new', 1, { namespace: 'acme' }));\n await store.createRun(aged('beta-old', 10, { namespace: 'beta' }));\n await store.createRun(aged('report-old', 10, { workflow: 'report' }));\n\n // By namespace: beta's equally old run survives.\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxAge: '7d', scope: { namespace: 'acme' } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['acme-new', 'beta-old', 'report-old']);\n\n // By workflow set.\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxAge: '7d', scope: { workflows: ['report'] } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['acme-new', 'beta-old']);\n\n // maxCount is counted WITHIN the scope: acme keeps its 1 newest even though other runs exist.\n await store.createRun(aged('acme-mid', 3, { namespace: 'acme' }));\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxCount: 1, scope: { namespace: 'acme' } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['acme-new', 'beta-old']);\n });\n\n t('a retention scope can select by tag and by search attribute', async () => {\n if (!supportsTagFilter) return;\n await store.createRun(aged('chat-old', 10, { tags: ['chat', 'tenant:t1'] }));\n await store.createRun(aged('chatty-old', 10, { tags: ['chatty'] }));\n await store.createRun(aged('attr-old', 10, { searchAttributes: { tenantId: 't2' } }));\n await store.createRun(aged('attr-other', 10, { searchAttributes: { tenantId: 't3' } }));\n\n await store.pruneTerminalRuns?.(\n { statuses: ['completed'], maxAge: '7d', scope: { tags: ['chat'] } },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['attr-old', 'attr-other', 'chatty-old']);\n\n await store.pruneTerminalRuns?.(\n {\n statuses: ['completed'],\n maxAge: '7d',\n scope: { attributes: [{ key: 'tenantId', op: 'eq', value: 't2' }] },\n },\n NOW,\n 100,\n );\n expect(await ids()).toEqual(['attr-other', 'chatty-old']);\n });\n\n t(\n 'engine.purgeRuns deletes a scope with its child subtrees and cancels live runs',\n async () => {\n const engine = new WorkflowEngine({ store });\n engine.register('p-child', '1', async (ctx) => ctx.waitForSignal('never'));\n engine.register('p-root', '1', async (ctx) => {\n await ctx.startChild('p-child', {}, 'pc');\n return ctx.waitForSignal('never');\n });\n engine.register('p-other', '1', async () => 'done');\n\n await engine.start('p-root', {}, 'pr');\n await engine.start('p-other', {}, 'po');\n // Wait for the ROOT to park too, not only the child: the root's `spawn:pc` checkpoint (the\n // edge purge follows to find `pc`) is written after the child is started, so the child can\n // reach `suspended` first on a slow store, and a purge then would not see the edge yet.\n expect((await engine.waitForRun('pr', { timeoutMs: 20_000 })).status).toBe('suspended');\n expect((await engine.waitForRun('pc', { timeoutMs: 20_000 })).status).toBe('suspended');\n expect((await engine.waitForRun('po', { timeoutMs: 20_000 })).status).toBe('completed');\n\n await expect(engine.purgeRuns({})).rejects.toThrow(/empty scope/);\n // `p-child` is not in the scope: it goes because its root does.\n expect(await engine.purgeRuns({ workflows: ['p-root'] })).toBe(2);\n\n expect(await store.getRun('pr')).toBeNull();\n expect(await store.getRun('pc')).toBeNull();\n expect(await store.getRun('po')).not.toBeNull();\n },\n );\n\n t(\n 'updateRun maps every patchable field — clears error and patches tags/lockedBy/input/timers',\n async () => {\n // Guards against per-adapter patch-whitelist drift: a store that maps only a subset of fields\n // (or ignores `undefined` instead of clearing) would silently no-op these and fail here.\n await store.createRun(\n run({ status: 'failed', error: { message: 'boom' }, tags: ['old'], lockedBy: 'owner-1' }),\n );\n await store.updateRun('r1', {\n status: 'completed',\n output: { ok: true },\n error: undefined, // completion CLEARS the prior error\n input: { orderId: 'o2' },\n tags: ['x', 'y'],\n lockedBy: 'owner-2',\n wakeAt: 123_456,\n lockedUntil: 222_222,\n updatedAt: at,\n });\n const r = await store.getRun('r1');\n expect(r?.status).toBe('completed');\n expect(r?.output).toEqual({ ok: true });\n expect(r?.error).toBeUndefined();\n expect(r?.input).toEqual({ orderId: 'o2' });\n expect(r?.tags).toEqual(['x', 'y']);\n expect(r?.lockedBy).toBe('owner-2');\n expect(r?.wakeAt).toBe(123_456);\n expect(r?.lockedUntil).toBe(222_222);\n\n // The multi-instance REMOTE-decision marker must round-trip AND clear: the engine sets it\n // when it suspends on an awaited turn and clears it (`undefined`) when the decision lands. An\n // adapter that drops it on read, or ignores `undefined` instead of writing NULL, would silently\n // break completeRemoteDecision (it reads back the stale/absent marker and discards the decision).\n await store.updateRun('r1', { awaitingDecisionTaskId: 'turn-7' });\n expect((await store.getRun('r1'))?.awaitingDecisionTaskId).toBe('turn-7');\n await store.updateRun('r1', { awaitingDecisionTaskId: undefined });\n expect((await store.getRun('r1'))?.awaitingDecisionTaskId).toBeUndefined();\n },\n );\n\n // ---- checkpoints ------------------------------------------------------------------------\n\n t('listDueTimers returns the most overdue first, capped at limit', async () => {\n for (const [id, wakeAt] of [\n ['late', 3_000],\n ['earliest', 1_000],\n ['middle', 2_000],\n ['future', 9_000],\n ] as const) {\n await store.createRun(run({ id, status: 'suspended', wakeAt }));\n }\n\n expect((await store.listDueTimers(5_000)).map((r) => r.id)).toEqual([\n 'earliest',\n 'middle',\n 'late',\n ]);\n expect((await store.listDueTimers(5_000, undefined, 2)).map((r) => r.id)).toEqual([\n 'earliest',\n 'middle',\n ]);\n });\n\n t('countCheckpoints counts a seq range by status', async () => {\n // Optional on the interface (the engine has a fallback), but a conformant store MUST provide\n // it — assert presence, then exercise the fast path.\n expect(store.countCheckpoints).toBeDefined();\n if (!store.countCheckpoints) return;\n await store.createRun(run());\n for (const [seq, status] of [\n [0, 'completed'],\n [1, 'pending'],\n [2, 'pending'],\n [3, 'failed'],\n [4, 'pending'],\n ] as const) {\n await store.saveCheckpoint(checkpoint({ seq, status, stepId: `r1:${seq}` }));\n }\n await store.createRun(run({ id: 'other' }));\n await store.saveCheckpoint(\n checkpoint({ runId: 'other', seq: 2, status: 'pending', stepId: 'other:2' }),\n );\n\n expect(await store.countCheckpoints('r1', 1, 3, ['pending'])).toBe(2);\n expect(await store.countCheckpoints('r1', 0, 4, ['pending', 'failed'])).toBe(4);\n // Both bounds are inclusive.\n expect(await store.countCheckpoints('r1', 2, 2, ['pending'])).toBe(1);\n expect(await store.countCheckpoints('r1', 1, 4, ['pending'])).toBe(3);\n expect(await store.countCheckpoints('r1', 0, 0, ['completed'])).toBe(1);\n // `other` has a pending row at seq 2: a count is scoped to its run.\n expect(await store.countCheckpoints('other', 0, 4, ['pending'])).toBe(1);\n expect(await store.countCheckpoints('r1', 5, 9, ['pending'])).toBe(0);\n expect(await store.countCheckpoints('r1', 0, 4, [])).toBe(0);\n });\n\n registerCheckpointAggregationCases(t, () => store, run);\n\n t(\n 'listOrphanedRuns returns incomplete runs with a free or expired lease, oldest first',\n async () => {\n // Optional on the interface (the engine falls back to listing every incomplete run and\n // filtering in process), but a conformant store MUST provide it.\n expect(store.listOrphanedRuns).toBeDefined();\n if (!store.listOrphanedRuns) return;\n // Whole seconds apart: MySQL's DATETIME drops milliseconds, which would tie the ordering.\n const created = (offset: number) => new Date(at.getTime() + offset * 1_000);\n await store.createRun(run({ id: 'held', createdAt: created(1) }));\n expect(await store.tryLockRun('held', 'live', NOW + 30_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'expired', createdAt: created(3) }));\n expect(await store.tryLockRun('expired', 'dead', NOW, NOW - 1)).toBe(true);\n await store.createRun(run({ id: 'free', createdAt: created(2) }));\n await store.createRun(\n run({ id: 'compensating', status: 'cancelling', createdAt: created(4) }),\n );\n await store.createRun(run({ id: 'parked', status: 'suspended', createdAt: created(0) }));\n await store.createRun(run({ id: 'done', status: 'completed', createdAt: created(0) }));\n await store.createRun(run({ id: 'tenant', namespace: 'beta', createdAt: created(5) }));\n\n expect((await store.listOrphanedRuns(NOW, 10)).map((r) => r.id)).toEqual([\n 'free',\n 'expired',\n 'compensating',\n 'tenant',\n ]);\n // Capped, oldest first.\n expect((await store.listOrphanedRuns(NOW, 2)).map((r) => r.id)).toEqual([\n 'free',\n 'expired',\n ]);\n // Namespace-scoped.\n expect((await store.listOrphanedRuns(NOW, 10, 'beta')).map((r) => r.id)).toEqual([\n 'tenant',\n ]);\n // Once the live lease lapses, that run is an orphan too.\n expect((await store.listOrphanedRuns(NOW + 30_000, 10)).map((r) => r.id)).toContain('held');\n expect(await store.listOrphanedRuns(NOW, 0)).toEqual([]);\n },\n );\n\n t(\"listOrphanedRuns also returns the owner's live leases taken before its cutoff\", async () => {\n if (!store.listOrphanedRuns) return;\n const created = (offset: number) => new Date(at.getTime() + offset * 1_000);\n // Live leases (expiring after NOW) left by a previous process of instance `pod-a`.\n await store.createRun(run({ id: 'own-old', createdAt: created(1) }));\n expect(await store.tryLockRun('own-old', 'pod-a', NOW + 10_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'own-new', createdAt: created(2) }));\n expect(await store.tryLockRun('own-new', 'pod-a', NOW + 30_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'foreign', createdAt: created(3) }));\n expect(await store.tryLockRun('foreign', 'pod-b', NOW + 10_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'own-parked', status: 'suspended', createdAt: created(4) }));\n expect(await store.tryLockRun('own-parked', 'pod-a', NOW + 10_000, NOW)).toBe(true);\n await store.createRun(run({ id: 'free', createdAt: created(5) }));\n\n const ownedBy = { owner: 'pod-a', lockedBefore: NOW + 30_000 };\n expect((await store.listOrphanedRuns(NOW, 10)).map((r) => r.id)).toEqual(['free']);\n expect((await store.listOrphanedRuns(NOW, 10, undefined, ownedBy)).map((r) => r.id)).toEqual([\n 'own-old',\n 'free',\n ]);\n expect((await store.listOrphanedRuns(NOW, 1, undefined, ownedBy)).map((r) => r.id)).toEqual([\n 'own-old',\n ]);\n expect((await store.listOrphanedRuns(NOW, 10, 'beta', ownedBy)).map((r) => r.id)).toEqual([]);\n });\n\n t('updateRunIf writes only over an expected status', async () => {\n // Optional on the interface (the engine falls back to read-then-write, which keeps a race\n // window), but a conformant store MUST provide it: assert presence, then exercise it.\n expect(store.updateRunIf).toBeDefined();\n if (!store.updateRunIf) return;\n await store.createRun(run({ error: { message: 'earlier attempt' } }));\n\n // A status outside the expected set: refused, nothing written.\n expect(\n await store.updateRunIf('r1', ['suspended', 'blocked'], {\n status: 'completed',\n output: { total: 1 },\n }),\n ).toBe(false);\n let current = await store.getRun('r1');\n expect(current?.status).toBe('running');\n expect(current?.output).toBeUndefined();\n\n // In the set: the whole patch lands, clears included.\n expect(\n await store.updateRunIf('r1', ['pending', 'running'], {\n status: 'suspended',\n wakeAt: 7_000,\n error: undefined,\n updatedAt: new Date(at.getTime() + 1_000),\n }),\n ).toBe(true);\n current = await store.getRun('r1');\n expect(current?.status).toBe('suspended');\n expect(current?.wakeAt).toBe(7_000);\n expect(current?.error).toBeUndefined();\n expect(current?.updatedAt.getTime()).toBe(at.getTime() + 1_000);\n\n // A run that went terminal meanwhile keeps its state.\n await store.updateRun('r1', { status: 'cancelled', error: { message: 'cancelled' } });\n expect(\n await store.updateRunIf('r1', ['running', 'suspended'], {\n status: 'completed',\n output: { total: 2 },\n }),\n ).toBe(false);\n current = await store.getRun('r1');\n expect(current?.status).toBe('cancelled');\n expect(current?.error).toEqual({ message: 'cancelled' });\n expect(current?.output).toBeUndefined();\n\n // No row: nothing to compare against, never throws, never creates one.\n expect(await store.updateRunIf('missing', ['running'], { status: 'completed' })).toBe(false);\n expect(await store.getRun('missing')).toBeNull();\n });\n\n t(\n 'updateRunIf with an empty patch is a pure compare: never throws, writes nothing',\n async () => {\n expect(store.updateRunIf).toBeDefined();\n if (!store.updateRunIf) return;\n await store.createRun(run({ output: { kept: true } }));\n expect(await store.updateRunIf('r1', ['running'], {})).toBe(true);\n expect(await store.updateRunIf('r1', ['suspended'], {})).toBe(false);\n expect(await store.updateRunIf('missing', ['running'], {})).toBe(false);\n const current = await store.getRun('r1');\n expect(current?.status).toBe('running');\n expect(current?.output).toEqual({ kept: true });\n },\n );\n\n t(\n 'updateRunIf settling a run terminal drops its singleton admission like updateRun',\n async () => {\n expect(store.updateRunIf).toBeDefined();\n if (!store.updateRunIf) return;\n await store.createRun(run({ tags: ['singleton:k', SINGLETON_ADMITTED_TAG] }));\n expect(\n await store.updateRunIf('r1', ['running'], { status: 'completed', output: { ok: true } }),\n ).toBe(true);\n const settled = await store.getRun('r1');\n expect(settled?.status).toBe('completed');\n expect(settled?.output).toEqual({ ok: true });\n expect(settled?.tags).toEqual(['singleton:k']);\n },\n );\n\n t('saveCheckpointIfPending writes over a pending row only', async () => {\n // Optional on the interface (the engine falls back to a blind save, which can clobber a settled\n // row), but a conformant store MUST provide it — assert presence, then exercise it.\n expect(store.saveCheckpointIfPending).toBeDefined();\n if (!store.saveCheckpointIfPending) return;\n await store.createRun(run());\n const pending = checkpoint({ status: 'pending', output: undefined });\n await store.saveCheckpoint(pending);\n\n expect(await store.saveCheckpointIfPending({ ...pending, wakeAt: 5_000 })).toBe(true);\n expect((await store.getCheckpoint('r1', 0))?.wakeAt).toBe(5_000);\n\n const done = { ...pending, status: 'completed' as const, output: { ok: true } };\n expect(await store.saveCheckpointIfPending(done)).toBe(true);\n // A stale pending copy no longer lands on the settled row.\n expect(await store.saveCheckpointIfPending({ ...pending, wakeAt: 9_000 })).toBe(false);\n const after = await store.getCheckpoint('r1', 0);\n expect(after?.status).toBe('completed');\n expect(after?.output).toEqual({ ok: true });\n // The settling write carried no deadline, so the one the pending row held is cleared.\n expect(after?.wakeAt).toBeUndefined();\n // A refused write is refused for every status that is not `pending`.\n await store.saveCheckpoint(checkpoint({ seq: 1, status: 'failed', stepId: 'r1:1' }));\n expect(await store.saveCheckpointIfPending({ ...pending, seq: 1, stepId: 'r1:1' })).toBe(\n false,\n );\n expect((await store.getCheckpoint('r1', 1))?.status).toBe('failed');\n // No row to compare against: nothing is written.\n expect(await store.saveCheckpointIfPending({ ...pending, seq: 9 })).toBe(false);\n expect(await store.getCheckpoint('r1', 9)).toBeNull();\n });\n\n t('saveCheckpointsIfPending settles a batch row by row, in order', async () => {\n // Optional on the interface (the engine falls back to one saveCheckpointIfPending per entry),\n // but a conformant store MUST provide it — assert presence, then exercise it.\n expect(store.saveCheckpointsIfPending).toBeDefined();\n if (!store.saveCheckpointsIfPending) return;\n expect(await store.saveCheckpointsIfPending([])).toEqual([]);\n await store.createRun(run());\n await store.createRun(run({ id: 'r2' }));\n const pending = (runId: string, seq: number) =>\n checkpoint({\n runId,\n seq,\n stepId: `${runId}:${seq}`,\n status: 'pending',\n output: undefined,\n wakeAt: 5_000,\n });\n for (const seq of [0, 1, 2, 3]) await store.saveCheckpoint(pending('r1', seq));\n await store.saveCheckpoint(pending('r2', 0));\n // seq 1 already settled: a stale write must not land on it.\n await store.saveCheckpoint({\n ...pending('r1', 1),\n status: 'completed',\n output: { first: 1 },\n });\n const done = (runId: string, seq: number, output: unknown) => ({\n ...pending(runId, seq),\n status: 'completed' as const,\n output,\n wakeAt: undefined,\n });\n\n const wrote = await store.saveCheckpointsIfPending([\n done('r1', 0, { n: 0 }),\n done('r1', 1, { n: 1 }),\n // A second copy of the same row: compared against the first copy's write, so refused.\n done('r1', 0, { n: 'dup' }),\n { ...pending('r1', 2), status: 'failed', error: { message: 'boom' }, wakeAt: undefined },\n // No such row: nothing is written.\n done('r1', 9, { n: 9 }),\n // Another run's row, same seq as one above.\n done('r2', 0, { n: 'r2' }),\n ]);\n expect(wrote).toEqual([true, false, false, true, false, true]);\n\n const r1 = await store.listCheckpoints('r1');\n expect(r1.map((c) => [c.seq, c.status, c.output])).toEqual([\n [0, 'completed', { n: 0 }],\n [1, 'completed', { first: 1 }],\n [2, 'failed', undefined],\n [3, 'pending', undefined],\n ]);\n expect(r1[2]?.error).toEqual({ message: 'boom' });\n // The settling write carried no deadline, so the one the pending row held is cleared.\n expect(r1[0]?.wakeAt).toBeUndefined();\n expect(r1[3]?.wakeAt).toBe(5_000);\n expect(await store.getCheckpoint('r1', 9)).toBeNull();\n expect((await store.getCheckpoint('r2', 0))?.output).toEqual({ n: 'r2' });\n\n // A pending-to-pending write keeps the row pending, so a later entry still lands on it.\n expect(\n await store.saveCheckpointsIfPending([\n { ...pending('r1', 3), wakeAt: 9_000 },\n done('r1', 3, { n: 3 }),\n ]),\n ).toEqual([true, true]);\n expect((await store.getCheckpoint('r1', 3))?.output).toEqual({ n: 3 });\n });\n\n t('saveCheckpointsIfPending writes a wide batch', async () => {\n if (!store.saveCheckpointsIfPending) return;\n await store.createRun(run());\n const n = 600;\n const rows = Array.from({ length: n }, (_, seq) =>\n checkpoint({ seq, stepId: `r1:${seq}`, status: 'pending', output: undefined }),\n );\n for (const row of rows) await store.saveCheckpoint(row);\n const wrote = await store.saveCheckpointsIfPending(\n rows.map((row) => ({ ...row, status: 'completed' as const, output: { seq: row.seq } })),\n );\n expect(wrote.every((w) => w === true)).toBe(true);\n expect(wrote).toHaveLength(n);\n expect(await store.countCheckpoints?.('r1', 0, n - 1, ['completed'])).toBe(n);\n expect((await store.getCheckpoint('r1', n - 1))?.output).toEqual({ seq: n - 1 });\n });\n\n t(\n 'upserts checkpoints, reads them by (runId, seq), and lists them ordered by seq',\n async () => {\n await store.createRun(run());\n await store.saveCheckpoint(checkpoint());\n await store.saveCheckpoint(\n checkpoint({ seq: 1, name: 'charge', output: { chargeId: 'ch_1' } }),\n );\n // Re-save seq 0 with a new output — upsert, not a duplicate row.\n await store.saveCheckpoint(checkpoint({ output: { ok: true, again: true } }));\n\n expect((await store.getCheckpoint('r1', 0))?.output).toEqual({ ok: true, again: true });\n expect((await store.getCheckpoint('r1', 1))?.name).toBe('charge');\n const list = await store.listCheckpoints('r1');\n expect(list.map((c) => c.seq)).toEqual([0, 1]);\n },\n );\n\n t(\n 'getLatestCheckpointByName returns the highest-seq match (and undefined for none)',\n async () => {\n await store.createRun(run());\n await store.saveCheckpoint(\n checkpoint({ seq: 0, name: 'event:progress', output: { pct: 10 } }),\n );\n await store.saveCheckpoint(checkpoint({ seq: 1, name: 'charge', output: { id: 'c1' } }));\n await store.saveCheckpoint(\n checkpoint({ seq: 2, name: 'event:progress', output: { pct: 50 } }),\n );\n await store.saveCheckpoint(\n checkpoint({ seq: 3, name: 'event:progress', output: { pct: 90 } }),\n );\n\n // Optional on the interface (the engine has a fallback), but a conformant store MUST provide\n // it — assert presence, then exercise the fast path.\n const getLatestCheckpointByName = store.getLatestCheckpointByName;\n expect(getLatestCheckpointByName).toBeDefined();\n if (!getLatestCheckpointByName) return;\n\n const latest = await getLatestCheckpointByName.call(store, 'r1', 'event:progress');\n expect(latest?.seq).toBe(3);\n expect(latest?.output).toEqual({ pct: 90 });\n expect(await getLatestCheckpointByName.call(store, 'r1', 'event:missing')).toBeUndefined();\n },\n );\n\n t(\n 'listCheckpointsByNamePrefix returns prefix matches ordered by seq (empty => none)',\n async () => {\n await store.createRun(run());\n await store.saveCheckpoint(checkpoint({ seq: 0, name: 'reserve' }));\n await store.saveCheckpoint(checkpoint({ seq: 1, name: 'spawn:0', output: 'child-a' }));\n await store.saveCheckpoint(checkpoint({ seq: 2, name: 'signal:child:c2' }));\n await store.saveCheckpoint(checkpoint({ seq: 3, name: 'event:progress' }));\n await store.saveCheckpoint(checkpoint({ seq: 4, name: 'spawn:1', output: 'child-b' }));\n\n // Optional on the interface (the engine has a fallback), but a conformant store MUST provide\n // it — assert presence, then exercise the fast path.\n const listCheckpointsByNamePrefix = store.listCheckpointsByNamePrefix;\n expect(listCheckpointsByNamePrefix).toBeDefined();\n if (!listCheckpointsByNamePrefix) return;\n\n const matches = await listCheckpointsByNamePrefix.call(store, 'r1', [\n 'signal:child:',\n 'spawn:',\n ]);\n expect(matches.map((c) => c.name)).toEqual(['spawn:0', 'signal:child:c2', 'spawn:1']);\n expect(await listCheckpointsByNamePrefix.call(store, 'r1', [])).toEqual([]);\n },\n );\n\n t('a name or token prefix matches literally — `_` and `%` are not wildcards', async () => {\n await store.createRun(run());\n await store.saveCheckpoint(checkpoint({ seq: 0, name: 'signal:child:job_1.onError.0' }));\n await store.saveCheckpoint(checkpoint({ seq: 1, name: 'signal:child:jobX1.onError.0' }));\n await store.putSignalWaiter({ token: 'child:job_1.child.0', runId: 'r1', seq: 2 });\n await store.putSignalWaiter({ token: 'child:jobX1.child.0', runId: 'r1', seq: 3 });\n\n const matches = await store.listCheckpointsByNamePrefix?.('r1', ['signal:child:job_1.']);\n expect(matches?.map((c) => c.name)).toEqual(['signal:child:job_1.onError.0']);\n expect((await store.listSignalWaiters('child:job_1.')).map((w) => w.token)).toEqual([\n 'child:job_1.child.0',\n ]);\n });\n\n t('round-trips checkpoint events and reads back a missing checkpoint as null', async () => {\n await store.createRun(run());\n await store.saveCheckpoint(\n checkpoint({\n events: [{ at: 1, level: 'error', message: 'p-3 failed', name: 'p-3', status: 'failed' }],\n }),\n );\n expect((await store.getCheckpoint('r1', 0))?.events).toEqual([\n { at: 1, level: 'error', message: 'p-3 failed', name: 'p-3', status: 'failed' },\n ]);\n expect(await store.getCheckpoint('r1', 99)).toBeNull();\n });\n\n // ---- recovery / dispatch / timer scans --------------------------------------------------\n\n t('lists incomplete runs, pending runs (FIFO), and due timers', async () => {\n await store.createRun(run({ id: 'running1', status: 'running' }));\n await store.createRun(run({ id: 'suspended1', status: 'suspended', wakeAt: 5_000 }));\n await store.createRun(run({ id: 'done1', status: 'completed' }));\n await store.createRun(\n run({ id: 'pending2', status: 'pending', createdAt: new Date('2026-06-11T00:00:02.000Z') }),\n );\n await store.createRun(\n run({ id: 'pending1', status: 'pending', createdAt: new Date('2026-06-11T00:00:01.000Z') }),\n );\n\n expect((await store.listIncompleteRuns()).map((r) => r.id)).toEqual(['running1']);\n // FIFO by createdAt.\n expect((await store.listPendingRuns(10)).map((r) => r.id)).toEqual(['pending1', 'pending2']);\n expect((await store.listPendingRuns(1)).map((r) => r.id)).toEqual(['pending1']);\n expect((await store.listDueTimers(10_000)).map((r) => r.id)).toEqual(['suspended1']);\n expect(await store.listDueTimers(1_000)).toHaveLength(0);\n });\n\n t('keeps a worker inside its own namespace on every path that picks work up', async () => {\n // The boundary `WorkflowRun.namespace` documents: \"A worker only picks up /\n // recovers / resumes-timers-for / times-out runs in its own namespace.\"\n //\n // This case exists because that sentence was true of exactly one adapter. The\n // other three did not declare the `namespace` parameter at all — and TypeScript\n // lets an implementation take fewer parameters than the interface promises, so\n // three stores silently ignored the argument and still satisfied `StateStore`.\n // A worker serving one tenant listed, recovered and — through `sweepTimeouts`,\n // which selects its cancellation candidates with `listRuns` — CANCELLED another\n // tenant's runs. The last of those is a write, which is why this is asserted on\n // all four paths rather than on the two that name `namespace` in their signature.\n await store.createRun(run({ id: 'a-pending', status: 'pending', namespace: 'alpha' }));\n await store.createRun(run({ id: 'b-pending', status: 'pending', namespace: 'beta' }));\n await store.createRun(run({ id: 'a-running', status: 'running', namespace: 'alpha' }));\n await store.createRun(run({ id: 'b-running', status: 'running', namespace: 'beta' }));\n await store.createRun(\n run({ id: 'a-timer', status: 'suspended', wakeAt: 5_000, namespace: 'alpha' }),\n );\n await store.createRun(\n run({ id: 'b-timer', status: 'suspended', wakeAt: 5_000, namespace: 'beta' }),\n );\n\n expect((await store.listPendingRuns(10, 'alpha')).map((r) => r.id)).toEqual(['a-pending']);\n expect((await store.listIncompleteRuns('alpha')).map((r) => r.id)).toEqual(['a-running']);\n expect((await store.listDueTimers(10_000, 'alpha')).map((r) => r.id)).toEqual(['a-timer']);\n expect(\n (await store.listRuns({ namespace: 'alpha', status: 'running' })).map((r) => r.id),\n ).toEqual(['a-running']);\n\n // Foreign runs must not eat the FIFO budget either. Asking for one row while\n // `beta` holds the oldest pending run has to return `alpha`'s, not nothing:\n // a store that filtered AFTER applying the limit would answer with an empty\n // page and look exactly like an idle tenant.\n expect((await store.listPendingRuns(1, 'alpha')).map((r) => r.id)).toEqual(['a-pending']);\n\n // `undefined` is NOT \"namespace is null\" — it is the operator view, every\n // tenant at once. A store that read it as a null predicate would pass every\n // single-tenant test written above and hide every run in a deployment that\n // actually sets `DURABLE_TENANT`.\n expect((await store.listPendingRuns(10)).map((r) => r.id).sort()).toEqual([\n 'a-pending',\n 'b-pending',\n ]);\n expect((await store.listIncompleteRuns()).map((r) => r.id).sort()).toEqual([\n 'a-running',\n 'b-running',\n ]);\n expect((await store.listDueTimers(10_000)).map((r) => r.id).sort()).toEqual([\n 'a-timer',\n 'b-timer',\n ]);\n });\n\n // ---- lease / lock -----------------------------------------------------------------------\n\n t('tryLockRun is atomic and respects lease expiry', async () => {\n await store.createRun(run({ id: 'r1' }));\n expect(await store.tryLockRun('r1', 'A', 2_000, 1_000)).toBe(true);\n // B can't take it while A's lease is live.\n expect(await store.tryLockRun('r1', 'B', 3_000, 1_500)).toBe(false);\n // Once A's lease (2_000) has passed, B reclaims it.\n expect(await store.tryLockRun('r1', 'B', 4_000, 2_500)).toBe(true);\n // Release lets anyone re-acquire immediately.\n await store.releaseRunLock('r1');\n expect(await store.tryLockRun('r1', 'C', 9_000, 2_600)).toBe(true);\n });\n\n t('releaseRunLock with an owner clears only a lease that owner still holds', async () => {\n await store.createRun(run({ id: 'r1' }));\n expect(await store.tryLockRun('r1', 'A', 2_000, 1_000)).toBe(true);\n // A's lease lapsed and B took the run over: A's owner-scoped release must not free B's lease.\n expect(await store.tryLockRun('r1', 'B', 4_000, 2_500)).toBe(true);\n await store.releaseRunLock('r1', 'A');\n expect(await store.tryLockRun('r1', 'C', 9_000, 3_000)).toBe(false);\n expect((await store.getRun('r1'))?.lockedBy).toBe('B');\n // The holder's own owner-scoped release does clear it.\n await store.releaseRunLock('r1', 'B');\n expect(await store.tryLockRun('r1', 'C', 9_000, 3_000)).toBe(true);\n });\n\n t('renewRunLock only succeeds for the current owner', async () => {\n await store.createRun(run({ id: 'r1' }));\n expect(await store.tryLockRun('r1', 'A', 2_000, 1_000)).toBe(true);\n // The holder heartbeats and keeps the lease.\n expect(await store.renewRunLock('r1', 'A', 5_000)).toBe(true);\n // A different instance can't renew a lease it doesn't hold.\n expect(await store.renewRunLock('r1', 'B', 9_000)).toBe(false);\n // And the renewed lease is honored: B still can't steal it before it expires.\n expect(await store.tryLockRun('r1', 'B', 6_000, 4_000)).toBe(false);\n });\n\n // ---- list filters: status / statuses / tag / origin --------------------------------------\n\n t('filters listRuns by workflow and by status', async () => {\n await store.createRun(run({ id: 'a', workflow: 'checkout', status: 'running' }));\n await store.createRun(run({ id: 'b', workflow: 'refund', status: 'running' }));\n await store.createRun(run({ id: 'c', workflow: 'checkout', status: 'completed' }));\n\n expect((await store.listRuns({ workflow: 'checkout' })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'c',\n ]);\n expect((await store.listRuns({ status: 'running' })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'b',\n ]);\n expect(\n (await store.listRuns({ workflow: 'checkout', status: 'running' })).map((r) => r.id),\n ).toEqual(['a']);\n });\n\n t('filters listRuns by a status set (status IN ...) for singleton admission', async () => {\n await store.createRun(run({ id: 'a', status: 'running' }));\n await store.createRun(run({ id: 'b', status: 'suspended' }));\n await store.createRun(run({ id: 'c', status: 'completed' }));\n await store.createRun(run({ id: 'd', status: 'pending' }));\n\n expect(\n (await store.listRuns({ statuses: ['running', 'suspended'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n // Single + set are ANDed (the narrower set wins).\n expect(\n (await store.listRuns({ status: 'running', statuses: ['running', 'suspended'] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n // Empty set matches nothing.\n expect(await store.listRuns({ statuses: [] })).toHaveLength(0);\n });\n\n t('filters listRuns by an exact tag (no substring match)', async () => {\n if (!supportsTagFilter) return; // Prisma + SQLite: array_contains is unsupported there (see flag doc)\n await store.createRun(run({ id: 'a', tags: ['etl', 'critical'] }));\n await store.createRun(run({ id: 'b', tags: ['etl-foo'] }));\n await store.createRun(run({ id: 'c' })); // no tags\n\n expect((await store.getRun('a'))?.tags).toEqual(['etl', 'critical']);\n expect((await store.listRuns({ tag: 'etl' })).map((r) => r.id)).toEqual(['a']);\n expect((await store.listRuns({ tag: 'etl-foo' })).map((r) => r.id)).toEqual(['b']);\n expect(await store.listRuns({ tag: 'nope' })).toHaveLength(0);\n });\n\n t(\n 'round-trips a run origin and filters listRuns by it, never matching an absent one',\n async () => {\n // `origin` (which library registered the workflow) is derived at registration, never declared,\n // so ABSENCE is a first-class value: `undefined` means UNKNOWN — a row written before the\n // column existed, a `registerRemote`, convention routing, an unresolvable package. It must\n // survive the round trip as `undefined` rather than as any plausible-looking stand-in, which a\n // real registration would then be indistinguishable from.\n await store.createRun(run({ id: 'a', origin: '@dudousxd/nestjs-catalog-pipeline' }));\n await store.createRun(run({ id: 'b', origin: '@dudousxd/nestjs-agent' }));\n await store.createRun(run({ id: 'c' })); // unattributed — unknown origin\n\n expect((await store.getRun('a'))?.origin).toBe('@dudousxd/nestjs-catalog-pipeline');\n expect((await store.getRun('c'))?.origin).toBeUndefined();\n\n // `RunQuery.origin` is plain equality, so the unattributed run matches NO origin value — it is\n // excluded here exactly as `b` is, and is never folded into a bucket to make a facet look\n // complete. A store that widened this to `= x OR IS NULL` would return `c` and fail.\n expect(\n (await store.listRuns({ origin: '@dudousxd/nestjs-catalog-pipeline' })).map((r) => r.id),\n ).toEqual(['a']);\n // Nor does it answer to a name invented for it.\n expect(await store.listRuns({ origin: 'unknown' })).toEqual([]);\n // Which is why \"all origins\" has to stay the default view: with the filter off — and only\n // then — the unattributed run is reachable.\n expect((await store.listRuns({})).map((r) => r.id).sort()).toEqual(['a', 'b', 'c']);\n },\n );\n\n t(\n 'selects the UNATTRIBUTED runs when `origin` is null — the one thing a value cannot',\n async () => {\n // The console needs an \"unknown origin\" facet, and the same absence that makes `origin` match\n // no value makes it unfilterable by one. `null` asks for `origin IS NULL` instead, which is what\n // lets that facet page server-side rather than by holding every run in the browser.\n await store.createRun(run({ id: 'a', origin: '@dudousxd/nestjs-agent' }));\n await store.createRun(run({ id: 'b' }));\n await store.createRun(run({ id: 'c' }));\n\n expect((await store.listRuns({ origin: null })).map((r) => r.id).sort()).toEqual([\n 'b',\n 'c',\n ]);\n // And it stays ANDed with the other predicates rather than replacing them.\n await store.createRun(run({ id: 'd', status: 'dead' }));\n expect((await store.listRuns({ origin: null, status: 'dead' })).map((r) => r.id)).toEqual([\n 'd',\n ]);\n },\n );\n\n t('counts runs by (status, origin) without returning them', async () => {\n // The aggregate behind a console's chips. It exists so the run LIST can be paged: the page\n // bounds what is rendered, this bounds nothing — so a store that quietly applied the same limit\n // would report the page size as the deployment's totals.\n if (!store.runFacets) return; // optional on the port; every SQL adapter implements it\n await store.createRun(run({ id: 'a', status: 'completed', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'b', status: 'completed', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'c', status: 'failed', origin: 'pkg-b' }));\n await store.createRun(run({ id: 'd', status: 'failed' })); // unattributed\n await store.createRun(run({ id: 'e', status: 'failed' })); // unattributed\n\n const facets = await store.runFacets({});\n\n expect(facets).toContainEqual({ status: 'completed', origin: 'pkg-a', count: 2 });\n expect(facets).toContainEqual({ status: 'failed', origin: 'pkg-b', count: 1 });\n // Runs with no origin are a real, countable cell here — `null`, not a stand-in name.\n expect(facets).toContainEqual({ status: 'failed', origin: null, count: 2 });\n expect(facets.reduce((n, f) => n + f.count, 0)).toBe(5);\n });\n\n t('narrows runFacets on the same predicates listRuns pages', async () => {\n // A facet count that did not obey the tenant/tag the operator has typed would label the page\n // with a number taken over a different set.\n if (!store.runFacets) return;\n await store.createRun(run({ id: 'a', status: 'failed', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', status: 'failed', namespace: 'globex' }));\n\n expect(await store.runFacets({ namespace: 'acme' })).toEqual([\n { status: 'failed', origin: null, count: 1 },\n ]);\n });\n\n // ---- multi-value predicates (the console's multi-selects) -------------------------------\n\n t('matches ANY of a set of statuses, workflows, tenants or origins', async () => {\n // One control, several values. Each plural field ORs within itself and ANDs with the rest, so\n // an operator comparing two tenants sees both without issuing two queries.\n await store.createRun(run({ id: 'a', status: 'failed', namespace: 'acme', workflow: 'wa' }));\n await store.createRun(run({ id: 'b', status: 'dead', namespace: 'globex', workflow: 'wb' }));\n await store.createRun(\n run({ id: 'c', status: 'completed', namespace: 'initech', workflow: 'wc' }),\n );\n\n expect(\n (await store.listRuns({ statuses: ['failed', 'dead'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n expect(\n (await store.listRuns({ namespaces: ['acme', 'globex'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n expect((await store.listRuns({ workflows: ['wa', 'wc'] })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'c',\n ]);\n });\n\n t('carries the absent-origin bucket INSIDE a set of origins', async () => {\n // \"This package plus the runs nothing claims\" — a view the single `origin` cannot express at\n // all, and the reason `null` is a member of the set rather than a separate flag.\n await store.createRun(run({ id: 'a', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'b', origin: 'pkg-b' }));\n await store.createRun(run({ id: 'c' }));\n\n expect((await store.listRuns({ origins: ['pkg-a', null] })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'c',\n ]);\n expect(\n (await store.listRuns({ origins: ['pkg-a', 'pkg-b'] })).map((r) => r.id).sort(),\n ).toEqual(['a', 'b']);\n });\n\n t('ANDs a plural predicate with everything else, and matches nothing when empty', async () => {\n // An empty set is a real answer — \"none of these\" — and must not widen to every run, which is\n // what dropping the clause would do.\n await store.createRun(run({ id: 'a', status: 'failed', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', status: 'dead', namespace: 'acme' }));\n\n expect(\n (await store.listRuns({ namespaces: ['acme'], statuses: ['dead'] })).map((r) => r.id),\n ).toEqual(['b']);\n expect(await store.listRuns({ namespaces: [] })).toEqual([]);\n expect(await store.listRuns({ statuses: [] })).toEqual([]);\n expect(await store.listRuns({ origins: [] })).toEqual([]);\n });\n\n t('matches runs carrying ANY of a set of tags', async () => {\n if (!supportsTagFilter) return;\n // A run holds a SET of tags, so the useful multi-value question is membership in the union —\n // asking for the intersection would return nothing for tags that never co-occur.\n await store.createRun(run({ id: 'a', tags: ['etl'] }));\n await store.createRun(run({ id: 'b', tags: ['nightly', 'batch'] }));\n await store.createRun(run({ id: 'c', tags: ['adhoc'] }));\n\n expect((await store.listRuns({ tags: ['etl', 'nightly'] })).map((r) => r.id).sort()).toEqual([\n 'a',\n 'b',\n ]);\n expect(await store.listRuns({ tags: [] })).toEqual([]);\n });\n\n t('matches a search attribute against a SET of values (the `in` predicate)', async () => {\n // Two `eq` predicates on one key are ANDed like every other pair, and no run has one attribute\n // with two values — so a multi-select over attribute values needs its own operator.\n await store.createRun(run({ id: 'a', searchAttributes: { tier: 'pro' } }));\n await store.createRun(run({ id: 'b', searchAttributes: { tier: 'enterprise' } }));\n await store.createRun(run({ id: 'c', searchAttributes: { tier: 'free' } }));\n await store.createRun(run({ id: 'd', searchAttributes: { amount: 200 } }));\n\n const inSet = await store.listRuns({\n attributes: [{ key: 'tier', op: 'in', values: ['pro', 'enterprise'] }],\n });\n expect(inSet.map((r) => r.id).sort()).toEqual(['a', 'b']);\n\n // Mixed operand types land in different typed columns and still OR together.\n const mixed = await store.listRuns({\n attributes: [{ key: 'amount', op: 'in', values: [200, 'none'] }],\n });\n expect(mixed.map((r) => r.id)).toEqual(['d']);\n\n // Empty set matches nothing, and a run missing the key never matches.\n expect(await store.listRuns({ attributes: [{ key: 'tier', op: 'in', values: [] }] })).toEqual(\n [],\n );\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'in', values: ['pro'] }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n });\n\n // ---- value facets (what fills a console's pickers) ---------------------------------------\n\n t(\n 'enumerates the distinct values of a run column, counted and ordered by frequency',\n async () => {\n if (!store.runValueFacets) return; // optional on the port, like runFacets\n await store.createRun(run({ id: 'a', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', namespace: 'acme' }));\n await store.createRun(run({ id: 'c', namespace: 'globex' }));\n\n expect(await store.runValueFacets({ field: 'namespace' }, {})).toEqual([\n { value: 'acme', count: 2 },\n { value: 'globex', count: 1 },\n ]);\n },\n );\n\n t('reports the unattributed bucket as a `null` value, not as a name', async () => {\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', origin: 'pkg-a' }));\n await store.createRun(run({ id: 'b' }));\n\n const values = await store.runValueFacets({ field: 'origin' }, {});\n expect(values).toContainEqual({ value: 'pkg-a', count: 1 });\n expect(values).toContainEqual({ value: null, count: 1 });\n });\n\n t('scopes the values to the SAME predicates the list is under', async () => {\n // The point of a picker: choose a tenant, and the tag picker offers that tenant's tags. A\n // picker that ignored the active filters would offer values whose result set is empty.\n if (!store.runValueFacets) return;\n if (!supportsTagFilter) return;\n await store.createRun(run({ id: 'a', namespace: 'acme', tags: ['etl'] }));\n await store.createRun(run({ id: 'b', namespace: 'globex', tags: ['nightly'] }));\n\n expect(await store.runValueFacets({ field: 'tag' }, { namespace: 'acme' })).toEqual([\n { value: 'etl', count: 1 },\n ]);\n });\n\n t('enumerates tags, attribute keys and the values under one key', async () => {\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', tags: ['etl'], searchAttributes: { tier: 'pro' } }));\n await store.createRun(\n run({ id: 'b', tags: ['etl', 'nightly'], searchAttributes: { tier: 'free' } }),\n );\n\n expect(await store.runValueFacets({ field: 'tag' }, {})).toEqual([\n { value: 'etl', count: 2 },\n { value: 'nightly', count: 1 },\n ]);\n expect(await store.runValueFacets({ field: 'attributeKey' }, {})).toEqual([\n { value: 'tier', count: 2 },\n ]);\n expect(\n (await store.runValueFacets({ field: 'attributeValue', key: 'tier' }, {}))\n .map((r) => r.value)\n .sort(),\n ).toEqual(['free', 'pro']);\n });\n\n t('searches values server-side, BEFORE the bound', async () => {\n // The search box exists because the list was cut to fit. Filtering the already-cut page would\n // make the values it was cut from unfindable — searchable only among what already survived,\n // which is exactly backwards on the axes with enough values to need searching.\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', namespace: 'acme-prod' }));\n await store.createRun(run({ id: 'b', namespace: 'acme-staging' }));\n await store.createRun(run({ id: 'c', namespace: 'globex' }));\n await store.createRun(run({ id: 'd', namespace: 'globex' }));\n\n const matches = await store.runValueFacets({ field: 'namespace' }, {}, { search: 'acme' });\n expect(matches.map((row) => row.value).sort()).toEqual(['acme-prod', 'acme-staging']);\n\n // `globex` has the higher count, so it owns the only slot when nothing is searched — and the\n // searched value would be unreachable if the search ran after that cut.\n expect(\n (await store.runValueFacets({ field: 'namespace' }, {}, { limit: 1 })).map((r) => r.value),\n ).toEqual(['globex']);\n expect(\n (\n await store.runValueFacets({ field: 'namespace' }, {}, { limit: 1, search: 'staging' })\n ).map((r) => r.value),\n ).toEqual(['acme-staging']);\n });\n\n t('pages values in a stable order, so page two continues page one', async () => {\n // A picker that loads as it scrolls asks for the next slice of the SAME answer. Without a\n // fixed order, page two is taken over a different arrangement and both repeats and skips.\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', namespace: 'one' }));\n await store.createRun(run({ id: 'b', namespace: 'one' }));\n await store.createRun(run({ id: 'c', namespace: 'one' }));\n await store.createRun(run({ id: 'd', namespace: 'two' }));\n await store.createRun(run({ id: 'e', namespace: 'two' }));\n await store.createRun(run({ id: 'f', namespace: 'three' }));\n\n const first = await store.runValueFacets({ field: 'namespace' }, {}, { limit: 2 });\n const second = await store.runValueFacets(\n { field: 'namespace' },\n {},\n { limit: 2, offset: 2 },\n );\n\n expect(first).toEqual([\n { value: 'one', count: 3 },\n { value: 'two', count: 2 },\n ]);\n expect(second).toEqual([{ value: 'three', count: 1 }]);\n // The two pages together are the whole answer, with nothing repeated between them.\n expect(new Set([...first, ...second].map((r) => r.value)).size).toBe(3);\n });\n\n t('searches and pages the tag axis too, where the values actually pile up', async () => {\n if (!store.runValueFacets) return;\n if (!supportsTagFilter) return;\n await store.createRun(run({ id: 'a', tags: ['type:mvr', 'etl'] }));\n await store.createRun(run({ id: 'b', tags: ['type:mel', 'etl'] }));\n await store.createRun(run({ id: 'c', tags: ['etl'] }));\n\n expect(\n (await store.runValueFacets({ field: 'tag' }, {}, { search: 'type:' }))\n .map((r) => r.value)\n .sort(),\n ).toEqual(['type:mel', 'type:mvr']);\n expect(await store.runValueFacets({ field: 'tag' }, {}, { limit: 1 })).toEqual([\n { value: 'etl', count: 3 },\n ]);\n });\n\n t('bounds the values it returns, keeping the most common ones', async () => {\n // Tag and attribute cardinality grows with the data (a `singleton:<key>` tag is minted per\n // key), so the unbounded answer is a listing wearing an aggregate's shape.\n if (!store.runValueFacets) return;\n await store.createRun(run({ id: 'a', namespace: 'acme' }));\n await store.createRun(run({ id: 'b', namespace: 'acme' }));\n await store.createRun(run({ id: 'c', namespace: 'globex' }));\n\n expect(await store.runValueFacets({ field: 'namespace' }, {}, { limit: 1 })).toEqual([\n { value: 'acme', count: 2 },\n ]);\n });\n\n t('countRuns counts the same set listRuns returns, without the paging', async () => {\n expect(typeof store.countRuns).toBe('function');\n await store.createRun(run({ id: 'n1', status: 'running', namespace: 'a', tags: ['q'] }));\n await store.createRun(run({ id: 'n2', status: 'pending', namespace: 'a' }));\n await store.createRun(run({ id: 'n3', status: 'completed', namespace: 'a', tags: ['q'] }));\n await store.createRun(run({ id: 'n4', status: 'running', namespace: 'b', tags: ['q'] }));\n\n expect(await store.countRuns?.({})).toBe(4);\n expect(await store.countRuns?.({ namespace: 'a' })).toBe(3);\n expect(await store.countRuns?.({ namespace: 'a', statuses: ['pending', 'running'] })).toBe(2);\n expect(await store.countRuns?.({ statuses: [] })).toBe(0);\n if (supportsTagFilter) {\n expect(await store.countRuns?.({ tag: 'q', statuses: ['running', 'pending'] })).toBe(2);\n }\n });\n\n t(\n 'engine rejects a start over its concurrency quota and frees the slot once a run settles',\n async () => {\n if (!supportsTagFilter) return;\n const engine = new WorkflowEngine({ store });\n engine.register('q-wait', '1', async (ctx) => ctx.waitForSignal('never'));\n const quota = {\n key: 'tenant:a',\n limit: 1,\n countStatuses: ['pending' as const, 'running' as const, 'suspended' as const],\n };\n\n await engine.start('q-wait', {}, 'q1', { concurrency: quota });\n expect((await engine.waitForRun('q1', { timeoutMs: 20_000 })).status).toBe('suspended');\n await expect(engine.start('q-wait', {}, 'q2', { concurrency: quota })).rejects.toThrow(\n /concurrency limit/,\n );\n expect(await store.getRun('q2')).toBeNull(); // nothing was created\n // A different key is its own bucket.\n await engine.start('q-wait', {}, 'q3', { concurrency: { ...quota, key: 'tenant:b' } });\n\n expect((await engine.waitForRun('q1', { timeoutMs: 20_000 })).status).toBe('suspended');\n // Settling the run (here: cancelling it) frees its slot for the next start.\n await engine.cancel('q1');\n expect((await store.getRun('q1'))?.status).toBe('cancelled');\n await engine.start('q-wait', {}, 'q4', { concurrency: quota });\n expect(await store.getRun('q4')).not.toBeNull();\n // Let every started run park (and its execution settle) before the store is torn down.\n for (const id of ['q3', 'q4']) await engine.waitForRun(id, { timeoutMs: 20_000 });\n await engine.drain();\n },\n );\n\n // ---- persisted schedules ----------------------------------------------------------------\n\n const schedule = (over: Partial<ScheduleRecord> = {}): ScheduleRecord => ({\n id: 's1',\n namespace: 'default',\n workflow: 'digest',\n paused: false,\n nextFireAt: NOW + 60_000,\n tags: ['tenant:a'],\n spec: { v: 1, cron: '0 9 * * *', input: { userId: 'u1', deep: [1, { x: true }] } },\n state: { window: NOW + 60_000 },\n createdAt: at,\n updatedAt: at,\n ...over,\n });\n\n t('saves, reads back, replaces and deletes a schedule', async () => {\n expect(typeof store.saveSchedule).toBe('function');\n await store.saveSchedule?.(schedule());\n const loaded = await store.getSchedule?.('s1');\n expect(loaded).toMatchObject({\n id: 's1',\n namespace: 'default',\n workflow: 'digest',\n paused: false,\n nextFireAt: NOW + 60_000,\n tags: ['tenant:a'],\n spec: { v: 1, cron: '0 9 * * *', input: { userId: 'u1', deep: [1, { x: true }] } },\n state: { window: NOW + 60_000 },\n });\n expect(loaded?.createdAt.getTime()).toBe(at.getTime());\n\n // saveSchedule is an upsert: a second save replaces the row.\n await store.saveSchedule?.(\n schedule({ workflow: 'digest2', nextFireAt: null, tags: undefined }),\n );\n const replaced = await store.getSchedule?.('s1');\n expect(replaced?.workflow).toBe('digest2');\n expect(replaced?.nextFireAt).toBeNull();\n expect(replaced?.tags ?? []).toEqual([]);\n\n expect(await store.getSchedule?.('nope')).toBeNull();\n expect(await store.deleteSchedule?.('s1')).toBe(true);\n expect(await store.deleteSchedule?.('s1')).toBe(false);\n expect(await store.getSchedule?.('s1')).toBeNull();\n });\n\n t('updateSchedule patches, and compare-and-sets on nextFireAt', async () => {\n await store.saveSchedule?.(schedule());\n expect(await store.updateSchedule?.('s1', { paused: true })).toBe(true);\n expect((await store.getSchedule?.('s1'))?.paused).toBe(true);\n\n // CAS: only the caller that saw the current nextFireAt wins.\n const next = { nextFireAt: NOW + 120_000, state: { window: NOW + 120_000, fires: 1 } };\n expect(await store.updateSchedule?.('s1', next, NOW + 60_000)).toBe(true);\n expect(await store.updateSchedule?.('s1', next, NOW + 60_000)).toBe(false);\n const after = await store.getSchedule?.('s1');\n expect(after?.nextFireAt).toBe(NOW + 120_000);\n expect(after?.state).toEqual({ window: NOW + 120_000, fires: 1 });\n\n // CAS against NULL.\n await store.updateSchedule?.('s1', { nextFireAt: null });\n expect(await store.updateSchedule?.('s1', { nextFireAt: NOW }, NOW + 1)).toBe(false);\n expect(await store.updateSchedule?.('s1', { nextFireAt: NOW }, null)).toBe(true);\n expect(await store.updateSchedule?.('ghost', { paused: true })).toBe(false);\n });\n\n t('lists schedules by namespace/workflow/tag/paused and answers \"due by\"', async () => {\n await store.saveSchedule?.(schedule({ id: 'a', nextFireAt: NOW - 10 }));\n await store.saveSchedule?.(schedule({ id: 'b', nextFireAt: NOW - 20, namespace: 'x' }));\n await store.saveSchedule?.(schedule({ id: 'c', nextFireAt: NOW - 30, paused: true }));\n await store.saveSchedule?.(schedule({ id: 'd', nextFireAt: NOW + 10, workflow: 'other' }));\n await store.saveSchedule?.(schedule({ id: 'e', nextFireAt: null, tags: ['tenant:b'] }));\n const ids = async (q: ScheduleQuery) =>\n ((await store.listSchedules?.(q)) ?? []).map((r) => r.id);\n\n // Soonest-due first; never-firing last.\n expect(await ids({})).toEqual(['c', 'b', 'a', 'd', 'e']);\n expect(await ids({ dueBy: NOW })).toEqual(['b', 'a']);\n expect(await ids({ dueBy: NOW, namespace: 'default' })).toEqual(['a']);\n expect(await ids({ dueBy: NOW, limit: 1 })).toEqual(['b']);\n expect(await ids({ workflow: 'other' })).toEqual(['d']);\n expect(await ids({ paused: true })).toEqual(['c']);\n if (supportsTagFilter) expect(await ids({ tag: 'tenant:b' })).toEqual(['e']);\n expect(await ids({ limit: 2, offset: 1 })).toEqual(['b', 'a']);\n });\n\n t('orders listRuns newest-first and paginates with limit/offset', async () => {\n await store.createRun(run({ id: 'old', createdAt: new Date('2026-06-11T00:00:00.000Z') }));\n await store.createRun(run({ id: 'mid', createdAt: new Date('2026-06-11T00:00:01.000Z') }));\n await store.createRun(run({ id: 'new', createdAt: new Date('2026-06-11T00:00:02.000Z') }));\n\n expect((await store.listRuns({})).map((r) => r.id)).toEqual(['new', 'mid', 'old']);\n expect((await store.listRuns({ limit: 2 })).map((r) => r.id)).toEqual(['new', 'mid']);\n expect((await store.listRuns({ limit: 2, offset: 1 })).map((r) => r.id)).toEqual([\n 'mid',\n 'old',\n ]);\n });\n\n // ---- search-attribute pushdown (range + equality + the missing-key contract) ------------\n\n t('round-trips searchAttributes and answers equality + range attribute queries', async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { amount: 30, tier: 'free' } }));\n await store.createRun(run({ id: 'b', searchAttributes: { amount: 200, tier: 'pro' } }));\n await store.createRun(run({ id: 'c', searchAttributes: { amount: 500, tier: 'pro' } }));\n\n expect((await store.getRun('b'))?.searchAttributes).toEqual({ amount: 200, tier: 'pro' });\n\n // Range (numeric).\n expect(\n (await store.listRuns({ attributes: [{ key: 'amount', op: 'gte', value: 200 }] }))\n .map((r) => r.id)\n .sort(),\n ).toEqual(['b', 'c']);\n // Two ANDed predicates (string eq + numeric range).\n expect(\n (\n await store.listRuns({\n attributes: [\n { key: 'tier', op: 'eq', value: 'pro' },\n { key: 'amount', op: 'lt', value: 300 },\n ],\n })\n ).map((r) => r.id),\n ).toEqual(['b']);\n // `ne` excludes the matching value AND absent keys (missing-key-never-matches contract).\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'ne', value: 'free' }] }))\n .map((r) => r.id)\n .sort(),\n ).toEqual(['b', 'c']);\n });\n\n t('matches a boolean search attribute by eq/ne', async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { vip: true } }));\n await store.createRun(run({ id: 'b', searchAttributes: { vip: false } }));\n await store.createRun(run({ id: 'c', searchAttributes: { other: 1 } })); // no `vip`\n\n expect(\n (await store.listRuns({ attributes: [{ key: 'vip', op: 'eq', value: true }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n // ne=true matches the explicit false but NOT the run missing `vip` (missing-key contract).\n expect(\n (await store.listRuns({ attributes: [{ key: 'vip', op: 'ne', value: true }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['b']);\n });\n\n t('a predicate on an absent key matches nothing (every op)', async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { amount: 100 } }));\n for (const op of ['eq', 'ne', 'gt', 'gte', 'lt', 'lte'] as const) {\n expect(\n await store.listRuns({ attributes: [{ key: 'missing', op, value: 1 }] }),\n ).toHaveLength(0);\n }\n });\n\n t(\n 're-indexes the search-attribute side-table on update (old values stop matching)',\n async () => {\n await store.createRun(run({ id: 'a', searchAttributes: { tier: 'free', amount: 10 } }));\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'free' }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n\n await store.updateRun('a', { searchAttributes: { tier: 'pro' } });\n expect(\n (await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'pro' }] })).map(\n (r) => r.id,\n ),\n ).toEqual(['a']);\n // Old key/value pairs are gone.\n expect(\n await store.listRuns({ attributes: [{ key: 'tier', op: 'eq', value: 'free' }] }),\n ).toHaveLength(0);\n expect(\n await store.listRuns({ attributes: [{ key: 'amount', op: 'eq', value: 10 }] }),\n ).toHaveLength(0);\n },\n );\n\n t('combines an attribute predicate with a coarse status filter and paginates', async () => {\n await store.createRun(run({ id: 'a', status: 'running', searchAttributes: { amount: 300 } }));\n await store.createRun(\n run({ id: 'b', status: 'completed', searchAttributes: { amount: 400 } }),\n );\n await store.createRun(run({ id: 'c', status: 'running', searchAttributes: { amount: 50 } }));\n\n const res = await store.listRuns({\n status: 'running',\n attributes: [{ key: 'amount', op: 'gte', value: 100 }],\n limit: 10,\n });\n expect(res.map((r) => r.id)).toEqual(['a']);\n });\n\n // ---- signal waiters & buffered signals --------------------------------------------------\n\n t('stores, lists by prefix, and atomically takes a signal waiter', async () => {\n await store.putSignalWaiter({ token: 'approve-1', runId: 'r1', seq: 3 });\n await store.putSignalWaiter({ token: 'approve-2', runId: 'r2', seq: 4 });\n await store.putSignalWaiter({ token: 'other-1', runId: 'r3', seq: 5 });\n\n expect((await store.listSignalWaiters('approve-')).map((w) => w.token).sort()).toEqual([\n 'approve-1',\n 'approve-2',\n ]);\n expect((await store.takeSignalWaiter('approve-1'))?.seq).toBe(3);\n // Taken exactly once.\n expect(await store.takeSignalWaiter('approve-1')).toBeNull();\n });\n\n t(\n 'round-trips a signal waiter parallelGroup (child-fan tag) through put → take → list',\n async () => {\n // A remote `gather_children` fan threads its group onto each child waiter so the resolving\n // `signal:child:` checkpoint carries it; the store must persist it on the waiter row.\n await store.putSignalWaiter({\n token: 'child:r.child.0',\n runId: 'r',\n seq: 0,\n parallelGroup: 'gather:0',\n });\n // A lone (non-fan) child await carries no group.\n await store.putSignalWaiter({ token: 'child:r.child.9', runId: 'r', seq: 9 });\n\n const listed = await store.listSignalWaiters('child:');\n expect(listed.find((w) => w.token === 'child:r.child.0')?.parallelGroup).toBe('gather:0');\n expect(listed.find((w) => w.token === 'child:r.child.9')?.parallelGroup).toBeUndefined();\n\n expect((await store.takeSignalWaiter('child:r.child.0'))?.parallelGroup).toBe('gather:0');\n expect((await store.takeSignalWaiter('child:r.child.9'))?.parallelGroup).toBeUndefined();\n },\n );\n\n t('registerChildWaits writes every waiter and placeholder, and upserts on repeat', async () => {\n expect(store.registerChildWaits).toBeTypeOf('function');\n await store.createRun(run({ id: 'p' }));\n const entry = (i: number, status: StepCheckpoint['status']) => ({\n waiter: { token: `child:p.all.0.${i}`, runId: 'p', seq: i, parallelGroup: 'all:0' },\n checkpoint: checkpoint({\n runId: 'p',\n seq: i,\n stepId: `p:${i}`,\n name: `signal:child:p.all.0.${i}`,\n kind: 'signal',\n status,\n parallelGroup: 'all:0',\n }),\n });\n // Wider than one statement on stores that split the batch.\n const entries = Array.from({ length: 250 }, (_, i) => entry(i, 'running'));\n await store.registerChildWaits?.(entries);\n\n const waiters = await store.listSignalWaiters('child:p.all.0.');\n expect(waiters).toHaveLength(250);\n expect(waiters.find((w) => w.token === 'child:p.all.0.7')).toEqual(entries[7]?.waiter);\n const cps = await store.listCheckpoints('p');\n expect(cps).toHaveLength(250);\n expect(cps[7]).toMatchObject({ name: 'signal:child:p.all.0.7', status: 'running' });\n expect(cps[7]?.parallelGroup).toBe('all:0');\n\n await store.registerChildWaits?.([entry(7, 'completed')]);\n expect((await store.getCheckpoint('p', 7))?.status).toBe('completed');\n expect(await store.listCheckpoints('p')).toHaveLength(250);\n await expect(store.registerChildWaits?.([])).resolves.toBeUndefined();\n });\n\n t('compactCheckpoints replaces a seq range with one checkpoint, atomically', async () => {\n expect(store.compactCheckpoints).toBeTypeOf('function');\n await store.createRun(run({ id: 'r' }));\n await store.createRun(run({ id: 'other' }));\n for (let seq = 0; seq < 10; seq += 1) {\n await store.saveCheckpoint(checkpoint({ runId: 'r', seq, stepId: `r:${seq}` }));\n }\n await store.saveCheckpoint(checkpoint({ runId: 'other', seq: 3, stepId: 'other:3' }));\n const into = checkpoint({\n runId: 'r',\n seq: 2,\n stepId: 'r:2',\n name: 'fan:r.all.2.',\n kind: 'signal',\n output: { from: 0, values: [{ n: 1 }, 'two', null] },\n parallelGroup: 'all:2',\n });\n\n await store.compactCheckpoints?.('r', 2, 7, into);\n\n const left = await store.listCheckpoints('r');\n expect(left.map((cp) => cp.seq)).toEqual([0, 1, 2, 8, 9]);\n expect(left[2]).toMatchObject({ name: 'fan:r.all.2.', parallelGroup: 'all:2' });\n expect(left[2]?.output).toEqual({ from: 0, values: [{ n: 1 }, 'two', null] });\n expect(await store.listCheckpoints('other')).toHaveLength(1);\n });\n\n t(\"listSignalWaitersByRun returns only the given runs' waiters\", async () => {\n expect(store.listSignalWaitersByRun).toBeTypeOf('function');\n await store.putSignalWaiter({\n token: 'child:a.all.0.0',\n runId: 'a',\n seq: 0,\n parallelGroup: 'all:0',\n });\n await store.putSignalWaiter({ token: 'approve-a', runId: 'a', seq: 1 });\n await store.putSignalWaiter({ token: 'approve-b', runId: 'b', seq: 0 });\n await store.putSignalWaiter({ token: 'approve-c', runId: 'c', seq: 0 });\n\n const tokens = async (ids: string[]) =>\n ((await store.listSignalWaitersByRun?.(ids)) ?? []).map((w) => w.token).sort();\n expect(await tokens(['a', 'b'])).toEqual(['approve-a', 'approve-b', 'child:a.all.0.0']);\n expect(await tokens(['missing'])).toEqual([]);\n expect(await tokens([])).toEqual([]);\n expect((await store.listSignalWaitersByRun?.(['a']))?.find((w) => w.seq === 0)).toEqual({\n token: 'child:a.all.0.0',\n runId: 'a',\n seq: 0,\n parallelGroup: 'all:0',\n });\n });\n\n t('hasSignalWaiter answers by run and exact token prefix', async () => {\n expect(store.hasSignalWaiter).toBeTypeOf('function');\n const has = (runId: string, prefix: string) => store.hasSignalWaiter?.(runId, prefix);\n await store.putSignalWaiter({\n token: 'child:p_1.all.3.0',\n runId: 'p_1',\n seq: 3,\n parallelGroup: 'all:3',\n });\n // A grandchild's waiter shares the token prefix but belongs to another run.\n await store.putSignalWaiter({\n token: 'child:p_1.all.4.0.all.0.0',\n runId: 'p_1.all.4.0',\n seq: 0,\n });\n // Matches `child:p_1.all.3.%` as a LIKE pattern (`_` is a wildcard there) but not as a prefix.\n await store.putSignalWaiter({ token: 'child:pX1.all.3.0', runId: 'p_1', seq: 9 });\n\n expect(await has('p_1', 'child:p_1.all.3.')).toBe(true);\n expect(await has('p_1', 'child:p_1.all.4.')).toBe(false);\n expect(await has('other', 'child:p_1.all.3.')).toBe(false);\n // `_` and `%` are literal, not wildcards, and the match is case-sensitive.\n expect(await has('p_1', 'child:p%.all.3.')).toBe(false);\n expect(await has('p_1', 'CHILD:p_1.all.3.')).toBe(false);\n\n await store.takeSignalWaiter('child:p_1.all.3.0');\n expect(await has('p_1', 'child:p_1.all.3.')).toBe(false);\n });\n\n t(\n \"removeSignalWaiter deletes only the exact (token, runId, seq) row, never a different run's\",\n async () => {\n // A stale identity for a token that's since been superseded (`token` is the store's primary\n // key — a later `putSignalWaiter` for the same token replaces the row) must be a no-op: it\n // must NOT steal the new owner's row out from under it.\n await store.putSignalWaiter({ token: 'approve-1', runId: 'r1', seq: 3 });\n await store.putSignalWaiter({ token: 'approve-1', runId: 'r2', seq: 7 });\n await store.removeSignalWaiter({ token: 'approve-1', runId: 'r1', seq: 3 });\n expect((await store.listSignalWaiters('approve-')).map((w) => w.runId)).toEqual(['r2']);\n\n // A mismatched runId/seq against the CURRENT row is also a no-op.\n await store.removeSignalWaiter({ token: 'approve-1', runId: 'r2', seq: 999 });\n expect((await store.listSignalWaiters('approve-')).map((w) => w.runId)).toEqual(['r2']);\n\n // The exact match deletes it.\n await store.removeSignalWaiter({ token: 'approve-1', runId: 'r2', seq: 7 });\n expect(await store.listSignalWaiters('approve-')).toEqual([]);\n\n // Removing an absent row entirely is a no-op, not an error.\n await store.removeSignalWaiter({ token: 'never-registered', runId: 'r1', seq: 0 });\n },\n );\n\n t('buffers signals and takes them FIFO per token', async () => {\n await store.bufferSignal('sig', { n: 1 });\n await store.bufferSignal('sig', { n: 2 });\n await store.bufferSignal('other', { n: 9 });\n\n expect(await store.takeBufferedSignal('sig')).toEqual({ payload: { n: 1 } });\n expect(await store.takeBufferedSignal('sig')).toEqual({ payload: { n: 2 } });\n expect(await store.takeBufferedSignal('sig')).toBeNull();\n expect(await store.takeBufferedSignal('other')).toEqual({ payload: { n: 9 } });\n });\n\n t('buffers events per name, oldest-first, and lists them without consuming', async () => {\n await store.bufferEvent({\n name: 'order.paid',\n payload: { n: 1 },\n id: 'e1',\n publishedAt: 100,\n });\n await store.bufferEvent({\n name: 'order.paid',\n payload: { n: 2 },\n id: 'e2',\n publishedAt: 200,\n });\n await store.bufferEvent({\n name: 'other.event',\n payload: { n: 9 },\n id: 'e3',\n publishedAt: 50,\n });\n\n const listed = await store.listBufferedEvents('order.paid', 10);\n expect(listed.map((e) => e.payload)).toEqual([{ n: 1 }, { n: 2 }]); // oldest (publishedAt) first\n expect(listed.map((e) => e.id)).toEqual(['e1', 'e2']);\n expect(listed[0]?.publishedAt).toBe(100);\n // listing does not consume — the same rows are still there.\n expect(await store.listBufferedEvents('order.paid', 10)).toHaveLength(2);\n expect(await store.listBufferedEvents('other.event', 10)).toEqual([\n { id: 'e3', payload: { n: 9 }, publishedAt: 50 },\n ]);\n });\n\n t('listBufferedEvents caps at `limit`', async () => {\n await store.bufferEvent({ name: 'evt', payload: 1, id: 'a', publishedAt: 1 });\n await store.bufferEvent({ name: 'evt', payload: 2, id: 'b', publishedAt: 2 });\n await store.bufferEvent({ name: 'evt', payload: 3, id: 'c', publishedAt: 3 });\n\n expect(await store.listBufferedEvents('evt', 2)).toHaveLength(2);\n });\n\n t(\n 'removeBufferedEvent atomically deletes by id — true iff a row existed, false on a repeat/absent id',\n async () => {\n await store.bufferEvent({ name: 'evt', payload: { ok: true }, id: 'x1', publishedAt: 1 });\n\n expect(await store.removeBufferedEvent('x1')).toBe(true);\n expect(await store.listBufferedEvents('evt', 10)).toEqual([]);\n // Already gone — a second attempt (the concurrent-claim arbiter) reports false, not an error.\n expect(await store.removeBufferedEvent('x1')).toBe(false);\n expect(await store.removeBufferedEvent('never-buffered')).toBe(false);\n },\n );\n\n // ---- transaction (optional) -------------------------------------------------------------\n\n t('transaction commits the checkpoint atomically and returns the work result', async () => {\n if (!store.transaction) return; // store without transactions (rare); skip\n if (!supportsAsyncTransaction) return; // sync driver (Drizzle + better-sqlite3); skip — see flag doc\n await store.createRun(run());\n const result = await store.transaction(async (tx) => {\n await tx.saveCheckpoint(checkpoint({ seq: 7, name: 'tx-step', output: { paid: true } }));\n return 'ok';\n });\n expect(result).toBe('ok');\n const cp = await store.getCheckpoint('r1', 7);\n expect(cp?.name).toBe('tx-step');\n expect(cp?.output).toEqual({ paid: true });\n });\n\n // ---- engine end-to-end durability -------------------------------------------------------\n\n t(\n 'runs the engine end-to-end durably, resuming without re-running completed steps',\n async () => {\n const engine = new WorkflowEngine({ store });\n let aRuns = 0;\n let failOnce = true;\n engine.register('wf', '1', async (ctx) => {\n const a = await ctx.localStep('a', async () => {\n aRuns += 1;\n return 10;\n });\n const b = await ctx.localStep('b', async () => {\n if (failOnce) {\n failOnce = false;\n throw new Error('boom');\n }\n return a + 5;\n });\n return b;\n });\n await engine.start('wf', { x: 1 }, 'run1');\n expect((await engine.waitForRun('run1')).status).toBe('failed');\n const resumed = await engine.resume('run1');\n expect(resumed.status).toBe('completed');\n expect(resumed.output).toBe(15);\n // Step `a` checkpointed `completed` the first turn, so replay returns it instead of re-running.\n expect(aRuns).toBe(1);\n },\n );\n\n t('starts the version the caller pinned, and refuses one that is not registered', async () => {\n const engine = new WorkflowEngine({ store });\n const ran: string[] = [];\n engine.register('vwf', '1', async () => {\n ran.push('v1');\n return 'v1-output';\n });\n engine.register('vwf', '2', async () => {\n ran.push('v2');\n return 'v2-output';\n });\n\n await engine.start('vwf', {}, 'pinned-run', { version: '1' });\n const pinned = await engine.waitForRun('pinned-run', { timeoutMs: 20_000 });\n\n // The OLDER body ran and the store recorded the older version — so this run's every future\n // resume replays v1 too. Asserted against a real store because the version is what the row\n // must carry, not just what the in-process registry believed at start.\n expect(pinned.output).toBe('v1-output');\n expect(ran).toEqual(['v1']);\n expect((await store.getRun('pinned-run'))?.workflowVersion).toBe('1');\n\n // Unpinned is unchanged: newest wins.\n await engine.start('vwf', {}, 'newest-run');\n expect((await engine.waitForRun('newest-run', { timeoutMs: 20_000 })).output).toBe(\n 'v2-output',\n );\n\n // An unregistered version fails BEFORE a row exists — never a silent fall back to v2.\n await expect(engine.start('vwf', {}, 'ghost-run', { version: '9' })).rejects.toThrow(\n /vwf@9 is not registered/,\n );\n expect(await store.getRun('ghost-run')).toBeNull();\n });\n\n t(\n 'times out every unfinished run of its workflow and namespace, except one compensating',\n async () => {\n // `sweepTimeouts` selects its candidates with ONE `listRuns({ workflow, statuses, namespace })`,\n // so this is the store answering that combined filter, not just the engine deciding.\n const engine = new WorkflowEngine({ store, namespace: 'alpha' });\n engine.register('t-capped', '1', async () => undefined, { executionTimeout: '1h' });\n const old = { workflow: 't-capped', namespace: 'alpha', createdAt: new Date(1000) };\n await store.createRun(run({ ...old, id: 'tc-pending', status: 'pending' }));\n await store.createRun(run({ ...old, id: 'tc-running', status: 'running' }));\n await store.createRun(run({ ...old, id: 'tc-suspended', status: 'suspended' }));\n await store.createRun(run({ ...old, id: 'tc-blocked', status: 'blocked' }));\n await store.createRun(run({ ...old, id: 'tc-cancelling', status: 'cancelling' }));\n await store.createRun(run({ ...old, id: 'tc-done', status: 'completed' }));\n await store.createRun(\n run({ ...old, id: 'tc-other-tenant', status: 'pending', namespace: 'beta' }),\n );\n await store.createRun(\n run({ ...old, id: 'tc-other-workflow', status: 'pending', workflow: 't-uncapped' }),\n );\n\n await engine.sweepTimeouts(1000 + 3_700_000);\n\n for (const id of ['tc-pending', 'tc-running', 'tc-suspended', 'tc-blocked']) {\n const swept = await store.getRun(id);\n expect(swept?.status, id).toBe('cancelled');\n expect(swept?.error?.code, id).toBe('execution_timeout');\n }\n expect((await store.getRun('tc-cancelling'))?.status).toBe('cancelling');\n expect((await store.getRun('tc-done'))?.status).toBe('completed');\n expect((await store.getRun('tc-other-tenant'))?.status).toBe('pending');\n expect((await store.getRun('tc-other-workflow'))?.status).toBe('pending');\n },\n );\n\n t('cancels a timed-out run’s live child subtree, not just the run itself', async () => {\n const engine = new WorkflowEngine({ store });\n // Only the parent is timed: a child reaching a terminal state can only be the cascade.\n engine.register('t-grandchild', '1', async (ctx) => ctx.waitForSignal('never'));\n engine.register('t-child', '1', async (ctx) => {\n await ctx.startChild('t-grandchild', {}, 'tgc');\n return ctx.waitForSignal('never');\n });\n engine.register(\n 't-parent',\n '1',\n async (ctx) => {\n await ctx.startChild('t-child', {}, 'tc');\n return ctx.waitForSignal('never');\n },\n { executionTimeout: '1h' },\n );\n\n await engine.start('t-parent', {}, 'tp');\n for (const id of ['tp', 'tc', 'tgc']) {\n expect((await engine.waitForRun(id, { timeoutMs: 20_000 })).status).toBe('suspended');\n }\n\n await engine.sweepTimeouts(Date.now() + 3_700_000);\n\n const parent = await store.getRun('tp');\n expect(parent?.status).toBe('cancelled');\n expect(parent?.error?.code).toBe('execution_timeout');\n // Both levels — the cascade is the same recursive walk an explicit `cancel` uses.\n expect((await store.getRun('tc'))?.status).toBe('cancelled');\n expect((await store.getRun('tgc'))?.status).toBe('cancelled');\n });\n });\n}\n","import {\n type CheckpointStat,\n type FanPageQuery,\n SUMMARY_CHILD_LIMIT,\n type StateStore,\n type StepCheckpoint,\n type WorkflowRun,\n aggregatesCheckpoints,\n checkpointStatsOf,\n childIdsOf,\n pageFan,\n pageFanFromStore,\n queryCheckpointsOf,\n summarizeRunFromStore,\n summarizeTimeline,\n} from '@dudousxd/nestjs-durable-core';\nimport { expect } from 'vitest';\n\nconst base = Date.parse('2026-06-11T00:00:00.000Z');\nconst ms = (n: number) => new Date(base + n);\n\nfunction cp(seq: number, over: Partial<StepCheckpoint> = {}): StepCheckpoint {\n return {\n runId: 'r1',\n seq,\n name: 'Lines.process',\n kind: 'remote',\n stepId: `r1:${seq}`,\n status: 'completed',\n output: { n: seq },\n attempts: 1,\n enqueuedAt: ms(seq * 10),\n startedAt: ms(seq * 10 + 3),\n finishedAt: ms(seq * 10 + 7),\n ...over,\n };\n}\n\nconst child = (seq: number, group: string, over: Partial<StepCheckpoint> = {}) =>\n cp(seq, {\n name: `signal:child:r1.all.${group.split(':')[1]}.${seq}`,\n kind: 'signal',\n parallelGroup: group,\n output: { ok: true, value: seq },\n ...over,\n });\n\nconst folded = (seq: number, group: string, wave: number, from: number, n: number) =>\n cp(seq, {\n name: `fan:r1.all.${group.split(':')[1]}.w${wave}.`,\n kind: 'signal',\n parallelGroup: group,\n output: { from, values: Array.from({ length: n }, (_, i) => i) },\n });\n\n/**\n * One run carrying every shape a run detail has to summarize: ungrouped steps and a spawn edge, a\n * step fan wide by rows, a narrow step fan, a step fan sent in partial waves (wide by its declared\n * size), a failFast fan with mixed step names, a child fan in flight with failed children of both\n * kinds plus a folded wave, a child fan that is mostly folded (one fold standing for no child), a\n * narrow child fan with a failure, and a child fan whose group predates the declared size.\n */\nexport function aggregationFixture(): StepCheckpoint[] {\n const rows: StepCheckpoint[] = [cp(0, { name: 'Lines.load', kind: 'local' })];\n rows.push(cp(1, { name: 'spawn:audit-1', kind: 'local', output: 'audit-1' }));\n // Step fan, wide by rows: 25 failed (retried), 20 pending, 2 running.\n for (let i = 0; i < 120; i++) {\n const seq = 2 + i;\n rows.push(\n cp(seq, {\n parallelGroup: 'steps:2:120',\n ...(i % 4 === 0 && i < 100\n ? { status: 'failed', attempts: 3, error: { message: `bad ${i}` } }\n : i >= 100 && i < 120 && i !== 105 && i !== 106\n ? { status: 'pending', output: undefined }\n : i === 105 || i === 106\n ? { status: 'running', output: undefined }\n : {}),\n }),\n );\n }\n for (let i = 0; i < 5; i++) rows.push(cp(122 + i, { parallelGroup: 'steps:122:5' }));\n for (let i = 0; i < 30; i++) {\n rows.push(\n cp(127 + i, {\n parallelGroup: 'steps:127:40000',\n name: 'Rows.score',\n ...(i >= 12 ? { status: 'pending', output: undefined } : {}),\n }),\n );\n }\n for (let i = 0; i < 30; i++) {\n rows.push(\n cp(157 + i, {\n parallelGroup: 'steps:157:60:failFast',\n name: i % 2 === 0 ? 'Check.a' : 'Check.b',\n ...(i === 7 ? { status: 'failed', error: { message: 'stop' } } : {}),\n }),\n );\n }\n // Child fan in flight: placeholders, successes, `ok: false` completions and failed rows, and a\n // folded wave standing for 20 children.\n for (let i = 0; i < 60; i++) {\n const seq = 187 + i;\n rows.push(\n child(seq, 'all:187:n80', {\n ...(i >= 50\n ? { status: 'running', output: undefined }\n : i % 3 === 0\n ? { output: { ok: false, error: `child ${i}` } }\n : i % 7 === 1\n ? { status: 'failed', error: { message: 'lost' } }\n : {}),\n }),\n );\n }\n rows.push(folded(247, 'all:187:n80', 9, 60, 20));\n // A child fan mostly folded: few rows, declared wide; one fold stands for no child at all.\n rows.push(folded(300, 'all:300:n3000:failFast', 0, 0, 1000));\n rows.push(folded(301, 'all:300:n3000:failFast', 1, 1000, 1000));\n rows.push(folded(302, 'all:300:n3000:failFast', 2, 2000, 0));\n for (let i = 0; i < 4; i++) {\n rows.push(child(303 + i, 'all:300:n3000:failFast', { status: 'running', output: undefined }));\n }\n rows.push(child(400, 'all:400:n3'));\n rows.push(child(401, 'all:400:n3', { output: { ok: false, error: 'narrow' } }));\n rows.push(child(402, 'all:400:n3', { status: 'running', output: undefined }));\n for (let i = 0; i < 55; i++) {\n rows.push(child(450 + i, 'all:450', i === 54 ? { output: { ok: false } } : {}));\n }\n rows.push(cp(600, { name: 'Lines.report', kind: 'local', status: 'failed' }));\n return rows;\n}\n\nconst GROUPS = [\n 'steps:2:120',\n 'steps:122:5',\n 'steps:127:40000',\n 'steps:157:60:failFast',\n 'all:187:n80',\n 'all:300:n3000:failFast',\n 'all:400:n3',\n 'all:450',\n 'absent',\n];\n\nconst QUERIES: FanPageQuery[] = [\n {},\n { offset: 10, limit: 7 },\n { offset: 0, limit: 500 },\n { offset: 118, limit: 50 },\n { offset: 5000 },\n { failedOnly: true },\n { failedOnly: true, offset: 3, limit: 4 },\n { failedOnly: true, offset: 15, limit: 10 },\n { failedOnly: true, offset: 1000 },\n];\n\n/** The buckets, with names reduced to whether a bucket is uniform: a database's collation decides\n * which of two names is \"smaller\", so only that equality is portable across stores. */\nfunction comparable(stats: CheckpointStat[]) {\n return stats\n .map(({ minName, maxName, ...rest }) => ({ ...rest, uniform: minName === maxName }))\n .sort((a, b) =>\n `${a.group}|${a.status}|${a.nameKind}`.localeCompare(`${b.group}|${b.status}|${b.nameKind}`),\n );\n}\n\nasync function seed(store: StateStore, run: (over?: Partial<WorkflowRun>) => WorkflowRun) {\n await store.createRun(run());\n for (const row of aggregationFixture()) await store.saveCheckpoint(row);\n // Another run sharing a group name: every read must stay scoped to its run.\n await store.createRun(run({ id: 'r2' }));\n for (let i = 0; i < 3; i++) {\n await store.saveCheckpoint(\n cp(2 + i, { runId: 'r2', stepId: `r2:${i}`, parallelGroup: 'steps:2:120', status: 'failed' }),\n );\n }\n}\n\n/**\n * The contract of the optional checkpoint aggregation pair (`checkpointStats` + `queryCheckpoints`):\n * each agrees with its in-memory reference, and the run detail built on them is identical to the\n * one `summarizeTimeline` / `pageFan` build from the whole checkpoint list.\n */\nexport function registerCheckpointAggregationCases(\n t: (label: string, fn: () => Promise<void>) => void,\n getStore: () => StateStore,\n run: (over?: Partial<WorkflowRun>) => WorkflowRun,\n): void {\n t('checkpointStats and queryCheckpoints agree with the in-memory reference', async () => {\n const store = getStore();\n expect(store.checkpointStats).toBeDefined();\n expect(store.queryCheckpoints).toBeDefined();\n if (!aggregatesCheckpoints(store)) return;\n await seed(store, run);\n const full = await store.listCheckpoints('r1');\n\n expect(comparable(await store.checkpointStats('r1'))).toEqual(\n comparable(checkpointStatsOf(full)),\n );\n for (const group of GROUPS) {\n expect(comparable(await store.checkpointStats('r1', { group }))).toEqual(\n comparable(checkpointStatsOf(full, { group })),\n );\n }\n expect(await store.checkpointStats('nope')).toEqual([]);\n\n const queries = [\n {},\n { group: 'steps:2:120' },\n { group: 'steps:2:120', statuses: ['failed' as const], limit: 20 },\n { group: 'steps:2:120', offset: 30, limit: 5 },\n { group: 'all:187:n80', statuses: ['completed' as const], namePrefixes: ['signal:child:'] },\n { excludeGroups: ['steps:2:120', 'all:187:n80', 'all:450'] },\n { excludeGroups: [] },\n { namePrefixes: ['signal:child:', 'fan:', 'spawn:'], offset: 200, limit: 200 },\n { namePrefixes: ['fan:'] },\n { statuses: [] },\n { namePrefixes: [] },\n { statuses: ['pending' as const, 'running' as const], offset: 3 },\n ];\n for (const query of queries) {\n expect(await store.queryCheckpoints('r1', query)).toEqual(queryCheckpointsOf(full, query));\n }\n });\n\n t('a run detail read through the aggregates is the one summarizeTimeline builds', async () => {\n const store = getStore();\n if (!aggregatesCheckpoints(store)) return;\n await seed(store, run);\n const full = await store.listCheckpoints('r1');\n for (const over of [50, 0, 1000]) {\n const ids = childIdsOf(full);\n const expected = {\n ...summarizeTimeline(full, over),\n children: ids.slice(0, SUMMARY_CHILD_LIMIT),\n childCount: ids.length,\n };\n expect(await summarizeRunFromStore(store, 'r1', over)).toEqual(expected);\n }\n });\n\n t('a fan page read through the aggregates is the one pageFan builds', async () => {\n const store = getStore();\n if (!aggregatesCheckpoints(store)) return;\n await seed(store, run);\n const full = await store.listCheckpoints('r1');\n for (const group of GROUPS) {\n for (const query of QUERIES) {\n expect(await pageFanFromStore(store, 'r1', group, query)).toEqual(\n pageFan(full, group, query),\n );\n }\n }\n });\n}\n","/** A step body that throws once, then returns `value` — drives a retry, or a crash-then-resume. */\nexport function failOnce<T>(\n value: T,\n error: Error = new Error('injected failure'),\n): () => Promise<T> {\n return failTimes(1, value, error);\n}\n\n/** A step body that throws the first `n` times, then returns `value`. */\nexport function failTimes<T>(\n n: number,\n value: T,\n error: Error = new Error('injected failure'),\n): () => Promise<T> {\n let calls = 0;\n return async () => {\n calls += 1;\n if (calls <= n) throw error;\n return value;\n };\n}\n","import { InMemoryStateStore, type Transport, WorkflowEngine } from '@dudousxd/nestjs-durable-core';\n\n/** A transport that can register worker handlers (every shipped transport does). */\nexport type HandleableTransport = Transport & {\n handle(name: string, fn: (input: unknown) => Promise<unknown>): void;\n close?(): Promise<void>;\n};\n\nconst ECHO_STEP_NAME = 'conformance.echo';\n\n/**\n * A durable `ctx.call` suspends the run; the worker result resumes it asynchronously (on whatever\n * tick/poll the transport delivers on). Poll the store until the run reaches a terminal state —\n * with a generous budget so a poll-based transport (DB/SQS) has time to round-trip.\n */\nasync function settle(store: InMemoryStateStore, runId: string, timeoutMs = 15_000) {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const run = await store.getRun(runId);\n if (run && run.status !== 'pending' && run.status !== 'running' && run.status !== 'suspended')\n return run;\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new Error(`run ${runId} did not settle within ${timeoutMs}ms`);\n}\n\n/**\n * The contract every `Transport` must satisfy: a remote step dispatched through it round-trips to a\n * worker and back (success), and a throwing handler surfaces as a failed run (failure). Point it at\n * a freshly constructed transport (engine-side + worker `group` in one instance) to prove parity —\n * useful when adding a new transport. Throws on any mismatch; closes the transport when done.\n *\n * `idPrefix` keeps run ids unique across invocations against real, shared infra (queues/tables).\n */\nexport async function assertTransportConformance(\n transport: HandleableTransport,\n idPrefix = 'conf',\n): Promise<void> {\n try {\n // One engine/store/transport — a durable remote step routes its result back to this engine,\n // which resumes the run. (Two engines on one transport would fight over the result stream.)\n const store = new InMemoryStateStore();\n const engine = new WorkflowEngine({ store, transport });\n engine.register(\n 'conf-ok',\n '1',\n async (ctx) => (await ctx.step<{ doubled: number }>(ECHO_STEP_NAME, { n: 21 })).doubled,\n );\n engine.register('conf-fail', '1', async (ctx) => ctx.step(ECHO_STEP_NAME, { n: 1 }));\n\n // success: the worker doubles the input\n transport.handle(ECHO_STEP_NAME, async (input) => ({\n doubled: (input as { n: number }).n * 2,\n }));\n await engine.start('conf-ok', {}, `${idPrefix}-ok`);\n const ok = await settle(store, `${idPrefix}-ok`);\n if (ok.status !== 'completed' || ok.output !== 42) {\n throw new Error(`expected completed/42, got ${JSON.stringify(ok)}`);\n }\n\n // failure: a throwing handler surfaces as a failed run (re-register the same step to throw)\n transport.handle(ECHO_STEP_NAME, async () => {\n throw new Error('handler boom');\n });\n await engine.start('conf-fail', {}, `${idPrefix}-fail`);\n const failed = await settle(store, `${idPrefix}-fail`);\n if (failed.status !== 'failed') {\n throw new Error(`expected failed, got ${JSON.stringify(failed)}`);\n }\n } finally {\n await transport.close?.();\n }\n}\n"],"mappings":";;;;AACA,SAASA,UAAUC,QAAQC,UAAU;AAkB9B,SAASC,4BACdC,MACAC,aAAoC;AAEpCC,WAAS,8BAA8BF,IAAAA,IAAQ,MAAA;AAC7C,QAAIG,MAAM;AACV,UAAMC,OAAO,wBAACC,WAAAA;AACZF,YAAM;AACN,YAAMG,UAAUL,YAAY,MAAME,GAAAA;AAClCG,cAAQC,SAASF,MAAAA;AACjB,aAAOC;IACT,GALa;AAObE,OAAG,mEAAmE,YAAA;AACpE,YAAMC,IAAIL,KAAK;QAAEJ,MAAM;QAAKU,aAAa;MAAE,CAAA;AAC3CC,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;AAC3DJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAC3D,YAAMN,EAAEO,QAAQ,KAAK,GAAA;AACrBL,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;IAC7D,CAAA;AAEAP,OAAG,sCAAsC,YAAA;AACvC,YAAMC,IAAIL,KAAK;QAAEJ,MAAM;QAAKiB,WAAW;UAAEC,OAAO;UAAGC,UAAU;QAAK;MAAE,CAAA;AACpER,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;AAC3DJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;AAC3DJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAC3DZ,aAAO;AACPQ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;IAC7D,CAAA;AAEAP,OAAG,8DAA8D,YAAA;AAC/D,YAAMC,IAAIL,KAAK;QAAEJ,MAAM;QAAKU,aAAa;MAAE,CAAA;AAC3CC,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAS,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;AAChEJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAOO,UAAU;MAAE,CAAA,GAAIN,EAAE,EAAEC,KAAK,KAAA;AAC1EJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAQO,UAAU;MAAE,CAAA,GAAIN,EAAE,EAAEC,KAAK,KAAA;AAC3E,YAAMN,EAAEO,QAAQ,KAAK,QAAA;AACrBL,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAOO,UAAU;MAAE,CAAA,GAAIN,EAAE,EAAEC,KAAK,KAAA;AAC1EJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAQO,UAAU;MAAE,CAAA,GAAIN,EAAE,EAAEC,KAAK,IAAA;IAC7E,CAAA;AAEAP,OAAG,6FAAwF,YAAA;AACzF,YAAMC,IAAIL,KAAK;QAAEJ,MAAM;QAAKU,aAAa;MAAE,CAAA;AAC3CC,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAS,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;AAChEJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAQ,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAC/DJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAS,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAChE,YAAMN,EAAEO,QAAQ,KAAK,QAAA;AAErBL,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAS,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAChEJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAQ,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;IACjE,CAAA;AAEAP,OAAG,2DAA2D,YAAA;AAC5D,YAAMC,IAAIL,KAAK;QAAEJ,MAAM;QAAKU,aAAa;QAAGW,OAAO;MAAO,CAAA;AAC1DV,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAS,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;AAChEJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAQ,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAC/DJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAS,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAChE,YAAMN,EAAEO,QAAQ,KAAK,QAAA;AACrBL,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAQ,CAAA,GAAIC,EAAE,EAAEC,KAAK,KAAA;AAC/DJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;MAAS,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;IAClE,CAAA;AAEAP,OAAG,sDAAsD,YAAA;AACvD,YAAMC,IAAIL,KAAK;QAAEJ,MAAM;QAAKU,aAAa;QAAGY,UAAU;MAAM,CAAA;AAC5DX,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAMU,KAAK;MAAI,CAAA,GAAIT,EAAE,EAAEC,KAAK,IAAA;AACtEJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAMU,KAAK;MAAI,CAAA,GAAIT,EAAE,EAAEC,KAAK,KAAA;AACtEJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAMU,KAAK;MAAI,CAAA,GAAIT,EAAE,EAAEC,KAAK,KAAA;AACtE,YAAMN,EAAEO,QAAQ,KAAK,IAAA;AAErBL,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAMU,KAAK;MAAI,CAAA,GAAIT,EAAE,EAAEC,KAAK,KAAA;AACtEJ,cAAQ,MAAMF,EAAEG,SAAS,KAAK;QAAEC,UAAU;QAAMU,KAAK;MAAI,CAAA,GAAIT,EAAE,EAAEC,KAAK,IAAA;IACxE,CAAA;AAEAP,OAAG,wCAAwC,YAAA;AACzC,YAAMC,IAAIL,KAAK;QAAEJ,MAAM;QAAKU,aAAa;MAAE,CAAA;AAC3CC,cAAQ,MAAMF,EAAEG,SAAS,SAAS;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;AAC/DJ,cAAQ,MAAMF,EAAEG,SAAS,SAAS;QAAEC,UAAU;MAAI,CAAA,GAAIC,EAAE,EAAEC,KAAK,IAAA;IACjE,CAAA;EACF,CAAA;AACF;AA9EgBhB;;;ACjBhB,eAAeyB,WAAWC,OAAmBC,OAAa;AACxD,QAAMC,OAAM,MAAMF,MAAMG,OAAOF,KAAAA;AAC/B,MAAI,CAACC,KAAK,OAAM,IAAIE,MAAM,yBAAyBH,KAAAA,YAAiB;AACpE,SAAOC;AACT;AAJeH;AAMf,eAAsBM,gBACpBL,OACAC,OACAK,QAAiB;AAEjB,QAAMJ,OAAM,MAAMH,WAAWC,OAAOC,KAAAA;AACpC,MAAIC,KAAII,WAAWA,QAAQ;AACzB,UAAM,IAAIF,MAAM,gBAAgBH,KAAAA,WAAgBK,MAAAA,kBAAwBJ,KAAII,MAAM,GAAG;EACvF;AACF;AATsBD;AAWtB,eAAsBE,aACpBP,OACAC,OACAO,UAAiB;AAEjB,QAAMN,OAAM,MAAMH,WAAWC,OAAOC,KAAAA;AACpC,MAAIQ,KAAKC,UAAUR,KAAIS,MAAM,MAAMF,KAAKC,UAAUF,QAAAA,GAAW;AAC3D,UAAM,IAAIJ,MACR,gBAAgBH,KAAAA,WAAgBQ,KAAKC,UAAUF,QAAAA,CAAAA,SAAkBC,KAAKC,UAAUR,KAAIS,MAAM,CAAA,EAAG;EAEjG;AACF;AAXsBJ;AActB,eAAsBK,cAAcZ,OAAmBC,OAAa;AAClE,UAAQ,MAAMD,MAAMa,gBAAgBZ,KAAAA,GAAQa,IAAI,CAACC,QAAOA,IAAGC,IAAI;AACjE;AAFsBJ;AAKtB,eAAsBK,eACpBjB,OACAC,OACAiB,OAAe;AAEf,QAAMC,MAAM,MAAMP,cAAcZ,OAAOC,KAAAA;AACvC,aAAWe,QAAQE,OAAO;AACxB,QAAI,CAACC,IAAIC,SAASJ,IAAAA,GAAO;AACvB,YAAM,IAAIZ,MAAM,kBAAkBY,IAAAA,wBAA4BG,IAAIE,KAAK,IAAA,CAAA,GAAQ;IACjF;EACF;AACF;AAXsBJ;AActB,eAAsBK,mBACpBtB,OACAC,OACAe,MACAO,UAAgB;AAEhB,QAAMR,OAAM,MAAMf,MAAMa,gBAAgBZ,KAAAA,GAAQuB,KAAK,CAACC,MAAMA,EAAET,SAASA,IAAAA;AACvE,MAAI,CAACD,IAAI,OAAM,IAAIX,MAAM,kBAAkBY,IAAAA,+BAAmC;AAC9E,MAAID,IAAGQ,aAAaA,UAAU;AAC5B,UAAM,IAAInB,MAAM,kBAAkBY,IAAAA,aAAiBO,QAAAA,qBAA6BR,IAAGQ,QAAQ,EAAE;EAC/F;AACF;AAXsBD;;;ACtBf,IAAMI,4BAA4B;EACvCC,uBAAuB;IACrBC,IAAI;IACJC,UAAU;IACVC,iBAAiB;IACjBC,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,UAAU;IACVC,aAAa;;;;;IAKbC,wBAAwB;IACxBC,kBAAkB;IAClBC,MAAM;IACNC,kBAAkB;IAClBC,UAAU;;;;IAIVC,QAAQ;;;;IAIRC,WAAW;IACXC,WAAW;IACXC,WAAW;EACb;EACAC,0BAA0B;IACxBC,OAAO;IACPC,KAAK;IACLC,MAAM;IACNC,MAAM;IACNC,QAAQ;IACRrB,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,OAAO;IACPmB,QAAQ;IACRC,UAAU;IACVC,aAAa;;;;IAIbC,eAAe;IACfrB,QAAQ;IACRsB,YAAY;IACZC,WAAW;IACXC,YAAY;EACd;EACAC,wBAAwB;IACtBZ,OAAO;IACPa,KAAK;IACLC,UAAU;IACVC,UAAU;EACZ;EACAC,wBAAwB;IACtBC,OAAO;IACPjB,OAAO;IACPC,KAAK;;;IAGLO,eAAe;EACjB;EACAU,0BAA0B;IACxBtC,IAAI;IACJqC,OAAO;IACPE,SAAS;EACX;EACAC,yBAAyB;IACvBxC,IAAI;IACJsB,MAAM;IACNiB,SAAS;IACTE,aAAa;EACf;;EAEAC,mBAAmB;IACjB1C,IAAI;IACJgB,WAAW;IACXf,UAAU;IACV0C,QAAQ;IACRC,YAAY;IACZhC,MAAM;IACNiC,MAAM;IACNC,OAAO;IACP7B,WAAW;IACXC,WAAW;EACb;AACF;AAoBO,SAAS6B,qBACdC,SACAC,WAAmDnD,2BAAyB;AAE5E,QAAMoD,aAAsC,CAAA;AAC5C,aAAW,CAACC,OAAOC,KAAAA,KAAUC,OAAOC,QAAQL,QAAAA,GAAW;AACrD,eAAW,CAACM,UAAUC,MAAAA,KAAWH,OAAOC,QAAQF,KAAAA,GAAQ;AACtD,YAAMK,SAAST,QAAQG,OAAOI,QAAAA;AAC9B,UAAIE,WAAWD,OAAQN,YAAWQ,KAAK;QAAEP;QAAOI;QAAUN,UAAUO;QAAQC;MAAO,CAAA;IACrF;EACF;AACA,SAAOP;AACT;AAZgBH;AAeT,SAASY,4BAAAA;AACd,QAAMC,MAA8C,CAAC;AACrD,aAAW,CAACT,OAAOC,KAAAA,KAAUC,OAAOC,QAAQxD,yBAAAA,GAA4B;AACtE8D,QAAIT,KAAAA,IAASE,OAAOQ,YAAYR,OAAOS,KAAKV,KAAAA,EAAOW,IAAI,CAACC,MAAM;MAACA;MAAGA;KAAE,CAAA;EACtE;AACA,SAAOJ;AACT;AANgBD;;;AC7JhB,SACEM,oBACAC,mBAGAC,sBAEK;AAGA,IAAMC,eAAN,MAAMA;EAVb,OAUaA;;;;EACX,YAAoBC,UAAU,KAAO;SAAjBA,UAAAA;EAAkB;EAC7BC,MAAM,6BAAc,KAAKD,SAAnB;EACfE,IAAIC,KAAkB;AACpB,SAAKH,UAAUG;EACjB;EACAC,QAAQD,KAAkB;AACxB,SAAKH,WAAWG;EAClB;AACF;AAyBO,SAASE,mBAAAA;AACd,QAAMC,QAAQ,IAAIC,mBAAAA;AAClB,QAAMC,YAAY,IAAIC,kBAAAA;AACtB,QAAMC,QAAQ,IAAIX,aAAAA;AAClB,QAAMY,SAAS,IAAIC,eAAe;IAAEN;IAAOE;IAAWE,OAAOA,MAAMT;EAAI,CAAA;AACvE,SAAO;IACLU;IACAL;IACAE;IACAE;IACA,MAAMG,KAAKV,KAAU;AACnBO,YAAMN,QAAQD,GAAAA;AACd,aAAOQ,OAAOG,gBAAgBJ,MAAMT,IAAG,CAAA;IACzC;IACA,MAAMc,IAAIC,UAAUC,OAAOC,OAAOC,MAAI;AAGpC,YAAMR,OAAOS,MAAMJ,UAAoBC,OAAOC,OAAOC,IAAAA;AACrD,aAAOR,OAAOU,WAAWH,KAAAA;IAC3B;EACF;AACF;AArBgBb;;;AC5ChB,SACEiB,sBAAAA,qBACAC,6BAEAC,kBAAAA,uBAEK;AAkBP,eAAsBC,eACpBC,QAIAC,OAAa;AAEb,QAAMC,OAAM,MAAMF,OAAOG,OAAOF,KAAAA;AAChC,MAAI,CAACC,KAAK,QAAO;AACjB,SAAO;IAAEA,KAAAA;IAAKE,aAAa,MAAMJ,OAAOK,gBAAgBJ,KAAAA;EAAO;AACjE;AAVsBF;AAgBf,SAASO,oBAAoBC,SAAmB;AACrD,SAAO,GAAGC,KAAKC,UAAU;IAAEC,SAASC;IAA6B,GAAGJ;EAAQ,GAAG,MAAM,CAAA,CAAA;;AACvF;AAFgBD;AAcT,SAASM,gBAAgBC,MAAY;AAC1C,QAAMC,MAAMN,KAAKO,MAAMF,IAAAA;AAKvB,MAAI,CAACC,OAAO,OAAOA,QAAQ,YAAY,CAACA,IAAIZ,OAAO,CAACc,MAAMC,QAAQH,IAAIV,WAAW,GAAG;AAClF,UAAM,IAAIc,MAAM,0DAAA;EAClB;AACA,MAAIJ,IAAIJ,YAAYS,UAAaL,IAAIJ,YAAYC,6BAA6B;AAC5E,UAAM,IAAIO,MACR,2CAA2CV,KAAKC,UAAUK,IAAIJ,OAAO,CAAA,4BAA6BC,2BAAAA,sEAAiG;EAEvM;AACA,QAAMS,OAAO,wBAACC,MAAqB,IAAIC,KAAKD,CAAAA,GAA/B;AACb,QAAMnB,OAAmB;IACvB,GAAGY,IAAIZ;IACPqB,WAAWH,KAAKN,IAAIZ,IAAIqB,SAAS;IACjCC,WAAWJ,KAAKN,IAAIZ,IAAIsB,SAAS;EACnC;AACA,QAAMpB,cAAcU,IAAIV,YAAYqB,IAAI,CAACC,SAAQ;IAC/C,GAAGA;IACHC,YAAYP,KAAKM,IAAGC,UAAU;IAC9BC,WAAWR,KAAKM,IAAGE,SAAS;IAC5BC,YAAYT,KAAKM,IAAGG,UAAU;EAChC,EAAA;AACA,SAAO;IAAE3B,KAAAA;IAAKE;EAAY;AAC5B;AA3BgBQ;AA4ChB,eAAsBkB,iBACpBC,UACAxB,SAAmB;AAEnB,QAAMyB,QAAQ,IAAIC,oBAAAA;AAGlB,QAAMD,MAAME,UAAU;IACpB,GAAG3B,QAAQL;IACXiC,QAAQ;IACRC,UAAUjB;IACVkB,aAAalB;EACf,CAAA;AACA,aAAWO,OAAMnB,QAAQH,YAAa,OAAM4B,MAAMM,eAAeZ,GAAAA;AAEjE,QAAMa,SAAS,IAAIC,gBAAe;IAAER;EAAM,CAAA;AAC1CD,WAASQ,MAAAA;AACT,QAAME,SAAS,MAAMF,OAAOG,OAAOnC,QAAQL,IAAIyC,EAAE;AACjD,MAAIF,OAAON,WAAW,YAAYM,OAAOG,OAAOC,SAASC,WAAW,iBAAA,GAAoB;AACtF,UAAMC,MAAM,IAAI7B,MAAMuB,OAAOG,MAAMC,OAAO;AAC1CE,QAAIC,OAAO;AACX,UAAMD;EACR;AACF;AAvBsBjB;;;AClGtB,SACEmB,wBACAC,uBAKAC,kBAAAA,uBAEK;AACP,SAASC,YAAYC,YAAAA,WAAUC,UAAAA,SAAQC,MAAAA,WAAU;;;ACVjD,SAGEC,qBAIAC,uBACAC,mBACAC,YACAC,SACAC,kBACAC,oBACAC,uBACAC,yBACK;AACP,SAASC,UAAAA,eAAc;AAEvB,IAAMC,OAAOC,KAAKC,MAAM,0BAAA;AACxB,IAAMC,KAAK,wBAACC,MAAc,IAAIH,KAAKD,OAAOI,CAAAA,GAA/B;AAEX,SAASC,GAAGC,KAAaC,OAAgC,CAAC,GAAC;AACzD,SAAO;IACLC,OAAO;IACPF;IACAG,MAAM;IACNC,MAAM;IACNC,QAAQ,MAAML,GAAAA;IACdM,QAAQ;IACRC,QAAQ;MAAET,GAAGE;IAAI;IACjBQ,UAAU;IACVC,YAAYZ,GAAGG,MAAM,EAAA;IACrBU,WAAWb,GAAGG,MAAM,KAAK,CAAA;IACzBW,YAAYd,GAAGG,MAAM,KAAK,CAAA;IAC1B,GAAGC;EACL;AACF;AAfSF;AAiBT,IAAMa,QAAQ,wBAACZ,KAAaa,OAAeZ,OAAgC,CAAC,MAC1EF,GAAGC,KAAK;EACNG,MAAM,uBAAuBU,MAAMC,MAAM,GAAA,EAAK,CAAA,CAAE,IAAId,GAAAA;EACpDI,MAAM;EACNW,eAAeF;EACfN,QAAQ;IAAES,IAAI;IAAMC,OAAOjB;EAAI;EAC/B,GAAGC;AACL,CAAA,GAPY;AASd,IAAMiB,SAAS,wBAAClB,KAAaa,OAAeM,MAAcC,MAActB,MACtEC,GAAGC,KAAK;EACNG,MAAM,cAAcU,MAAMC,MAAM,GAAA,EAAK,CAAA,CAAE,KAAKK,IAAAA;EAC5Cf,MAAM;EACNW,eAAeF;EACfN,QAAQ;IAAEa;IAAMC,QAAQC,MAAMF,KAAK;MAAEG,QAAQzB;IAAE,GAAG,CAAC0B,GAAGC,MAAMA,CAAAA;EAAG;AACjE,CAAA,GANa;AAeR,SAASC,qBAAAA;AACd,QAAMC,OAAyB;IAAC5B,GAAG,GAAG;MAAEI,MAAM;MAAcC,MAAM;IAAQ,CAAA;;AAC1EuB,OAAKC,KAAK7B,GAAG,GAAG;IAAEI,MAAM;IAAiBC,MAAM;IAASG,QAAQ;EAAU,CAAA,CAAA;AAE1E,WAASkB,IAAI,GAAGA,IAAI,KAAKA,KAAK;AAC5B,UAAMzB,MAAM,IAAIyB;AAChBE,SAAKC,KACH7B,GAAGC,KAAK;MACNe,eAAe;MACf,GAAIU,IAAI,MAAM,KAAKA,IAAI,MACnB;QAAEnB,QAAQ;QAAUE,UAAU;QAAGqB,OAAO;UAAEC,SAAS,OAAOL,CAAAA;QAAI;MAAE,IAChEA,KAAK,OAAOA,IAAI,OAAOA,MAAM,OAAOA,MAAM,MACxC;QAAEnB,QAAQ;QAAWC,QAAQwB;MAAU,IACvCN,MAAM,OAAOA,MAAM,MACjB;QAAEnB,QAAQ;QAAWC,QAAQwB;MAAU,IACvC,CAAC;IACX,CAAA,CAAA;EAEJ;AACA,WAASN,IAAI,GAAGA,IAAI,GAAGA,IAAKE,MAAKC,KAAK7B,GAAG,MAAM0B,GAAG;IAAEV,eAAe;EAAc,CAAA,CAAA;AACjF,WAASU,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3BE,SAAKC,KACH7B,GAAG,MAAM0B,GAAG;MACVV,eAAe;MACfZ,MAAM;MACN,GAAIsB,KAAK,KAAK;QAAEnB,QAAQ;QAAWC,QAAQwB;MAAU,IAAI,CAAC;IAC5D,CAAA,CAAA;EAEJ;AACA,WAASN,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3BE,SAAKC,KACH7B,GAAG,MAAM0B,GAAG;MACVV,eAAe;MACfZ,MAAMsB,IAAI,MAAM,IAAI,YAAY;MAChC,GAAIA,MAAM,IAAI;QAAEnB,QAAQ;QAAUuB,OAAO;UAAEC,SAAS;QAAO;MAAE,IAAI,CAAC;IACpE,CAAA,CAAA;EAEJ;AAGA,WAASL,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3B,UAAMzB,MAAM,MAAMyB;AAClBE,SAAKC,KACHhB,MAAMZ,KAAK,eAAe;MACxB,GAAIyB,KAAK,KACL;QAAEnB,QAAQ;QAAWC,QAAQwB;MAAU,IACvCN,IAAI,MAAM,IACR;QAAElB,QAAQ;UAAES,IAAI;UAAOa,OAAO,SAASJ,CAAAA;QAAI;MAAE,IAC7CA,IAAI,MAAM,IACR;QAAEnB,QAAQ;QAAUuB,OAAO;UAAEC,SAAS;QAAO;MAAE,IAC/C,CAAC;IACX,CAAA,CAAA;EAEJ;AACAH,OAAKC,KAAKV,OAAO,KAAK,eAAe,GAAG,IAAI,EAAA,CAAA;AAE5CS,OAAKC,KAAKV,OAAO,KAAK,0BAA0B,GAAG,GAAG,GAAA,CAAA;AACtDS,OAAKC,KAAKV,OAAO,KAAK,0BAA0B,GAAG,KAAM,GAAA,CAAA;AACzDS,OAAKC,KAAKV,OAAO,KAAK,0BAA0B,GAAG,KAAM,CAAA,CAAA;AACzD,WAASO,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1BE,SAAKC,KAAKhB,MAAM,MAAMa,GAAG,0BAA0B;MAAEnB,QAAQ;MAAWC,QAAQwB;IAAU,CAAA,CAAA;EAC5F;AACAJ,OAAKC,KAAKhB,MAAM,KAAK,YAAA,CAAA;AACrBe,OAAKC,KAAKhB,MAAM,KAAK,cAAc;IAAEL,QAAQ;MAAES,IAAI;MAAOa,OAAO;IAAS;EAAE,CAAA,CAAA;AAC5EF,OAAKC,KAAKhB,MAAM,KAAK,cAAc;IAAEN,QAAQ;IAAWC,QAAQwB;EAAU,CAAA,CAAA;AAC1E,WAASN,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3BE,SAAKC,KAAKhB,MAAM,MAAMa,GAAG,WAAWA,MAAM,KAAK;MAAElB,QAAQ;QAAES,IAAI;MAAM;IAAE,IAAI,CAAC,CAAA,CAAA;EAC9E;AACAW,OAAKC,KAAK7B,GAAG,KAAK;IAAEI,MAAM;IAAgBC,MAAM;IAASE,QAAQ;EAAS,CAAA,CAAA;AAC1E,SAAOqB;AACT;AAtEgBD;AAwEhB,IAAMM,SAAS;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF,IAAMC,UAA0B;EAC9B,CAAC;EACD;IAAEC,QAAQ;IAAIC,OAAO;EAAE;EACvB;IAAED,QAAQ;IAAGC,OAAO;EAAI;EACxB;IAAED,QAAQ;IAAKC,OAAO;EAAG;EACzB;IAAED,QAAQ;EAAK;EACf;IAAEE,YAAY;EAAK;EACnB;IAAEA,YAAY;IAAMF,QAAQ;IAAGC,OAAO;EAAE;EACxC;IAAEC,YAAY;IAAMF,QAAQ;IAAIC,OAAO;EAAG;EAC1C;IAAEC,YAAY;IAAMF,QAAQ;EAAK;;AAKnC,SAASG,WAAWC,OAAuB;AACzC,SAAOA,MACJC,IAAI,CAAC,EAAEC,SAASC,SAAS,GAAGC,KAAAA,OAAY;IAAE,GAAGA;IAAMC,SAASH,YAAYC;EAAQ,EAAA,EAChFG,KAAK,CAACC,GAAGC,MACR,GAAGD,EAAEhC,KAAK,IAAIgC,EAAEvC,MAAM,IAAIuC,EAAEE,QAAQ,GAAGC,cAAc,GAAGF,EAAEjC,KAAK,IAAIiC,EAAExC,MAAM,IAAIwC,EAAEC,QAAQ,EAAE,CAAA;AAEjG;AANSV;AAQT,eAAeY,KAAKC,OAAmBC,MAAiD;AACtF,QAAMD,MAAME,UAAUD,KAAAA,CAAAA;AACtB,aAAWE,OAAO3B,mBAAAA,EAAsB,OAAMwB,MAAMI,eAAeD,GAAAA;AAEnE,QAAMH,MAAME,UAAUD,KAAI;IAAEI,IAAI;EAAK,CAAA,CAAA;AACrC,WAAS9B,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,UAAMyB,MAAMI,eACVvD,GAAG,IAAI0B,GAAG;MAAEvB,OAAO;MAAMG,QAAQ,MAAMoB,CAAAA;MAAKV,eAAe;MAAeT,QAAQ;IAAS,CAAA,CAAA;EAE/F;AACF;AAVe2C;AAiBR,SAASO,mCACdC,GACAC,UACAP,MAAiD;AAEjDM,IAAE,2EAA2E,YAAA;AAC3E,UAAMP,QAAQQ,SAAAA;AACdC,IAAAA,QAAOT,MAAMU,eAAe,EAAEC,YAAW;AACzCF,IAAAA,QAAOT,MAAMY,gBAAgB,EAAED,YAAW;AAC1C,QAAI,CAACE,sBAAsBb,KAAAA,EAAQ;AACnC,UAAMD,KAAKC,OAAOC,IAAAA;AAClB,UAAMa,OAAO,MAAMd,MAAMe,gBAAgB,IAAA;AAEzCN,IAAAA,QAAOtB,WAAW,MAAMa,MAAMU,gBAAgB,IAAA,CAAA,CAAA,EAAQM,QACpD7B,WAAW8B,kBAAkBH,IAAAA,CAAAA,CAAAA;AAE/B,eAAWnD,SAASmB,QAAQ;AAC1B2B,MAAAA,QAAOtB,WAAW,MAAMa,MAAMU,gBAAgB,MAAM;QAAE/C;MAAM,CAAA,CAAA,CAAA,EAAKqD,QAC/D7B,WAAW8B,kBAAkBH,MAAM;QAAEnD;MAAM,CAAA,CAAA,CAAA;IAE/C;AACA8C,IAAAA,QAAO,MAAMT,MAAMU,gBAAgB,MAAA,CAAA,EAASM,QAAQ,CAAA,CAAE;AAEtD,UAAME,UAAU;MACd,CAAC;MACD;QAAEvD,OAAO;MAAc;MACvB;QAAEA,OAAO;QAAewD,UAAU;UAAC;;QAAoBlC,OAAO;MAAG;MACjE;QAAEtB,OAAO;QAAeqB,QAAQ;QAAIC,OAAO;MAAE;MAC7C;QAAEtB,OAAO;QAAewD,UAAU;UAAC;;QAAuBC,cAAc;UAAC;;MAAiB;MAC1F;QAAEC,eAAe;UAAC;UAAe;UAAe;;MAAW;MAC3D;QAAEA,eAAe,CAAA;MAAG;MACpB;QAAED,cAAc;UAAC;UAAiB;UAAQ;;QAAWpC,QAAQ;QAAKC,OAAO;MAAI;MAC7E;QAAEmC,cAAc;UAAC;;MAAQ;MACzB;QAAED,UAAU,CAAA;MAAG;MACf;QAAEC,cAAc,CAAA;MAAG;MACnB;QAAED,UAAU;UAAC;UAAoB;;QAAqBnC,QAAQ;MAAE;;AAElE,eAAWsC,SAASJ,SAAS;AAC3BT,MAAAA,QAAO,MAAMT,MAAMY,iBAAiB,MAAMU,KAAAA,CAAAA,EAAQN,QAAQO,mBAAmBT,MAAMQ,KAAAA,CAAAA;IACrF;EACF,CAAA;AAEAf,IAAE,gFAAgF,YAAA;AAChF,UAAMP,QAAQQ,SAAAA;AACd,QAAI,CAACK,sBAAsBb,KAAAA,EAAQ;AACnC,UAAMD,KAAKC,OAAOC,IAAAA;AAClB,UAAMa,OAAO,MAAMd,MAAMe,gBAAgB,IAAA;AACzC,eAAWhE,QAAQ;MAAC;MAAI;MAAG;OAAO;AAChC,YAAMyE,MAAMC,WAAWX,IAAAA;AACvB,YAAMY,WAAW;QACf,GAAGC,kBAAkBb,MAAM/D,IAAAA;QAC3B6E,UAAUJ,IAAIK,MAAM,GAAGC,mBAAAA;QACvBC,YAAYP,IAAInD;MAClB;AACAoC,MAAAA,QAAO,MAAMuB,sBAAsBhC,OAAO,MAAMjD,IAAAA,CAAAA,EAAOiE,QAAQU,QAAAA;IACjE;EACF,CAAA;AAEAnB,IAAE,oEAAoE,YAAA;AACpE,UAAMP,QAAQQ,SAAAA;AACd,QAAI,CAACK,sBAAsBb,KAAAA,EAAQ;AACnC,UAAMD,KAAKC,OAAOC,IAAAA;AAClB,UAAMa,OAAO,MAAMd,MAAMe,gBAAgB,IAAA;AACzC,eAAWpD,SAASmB,QAAQ;AAC1B,iBAAWwC,SAASvC,SAAS;AAC3B0B,QAAAA,QAAO,MAAMwB,iBAAiBjC,OAAO,MAAMrC,OAAO2D,KAAAA,CAAAA,EAAQN,QACxDkB,QAAQpB,MAAMnD,OAAO2D,KAAAA,CAAAA;MAEzB;IACF;EACF,CAAA;AACF;AAvEgBhB;;;ADvIT,IAAM6B,6BAAN,cAAyCC,MAAAA;EAlDhD,OAkDgDA;;;EACrCC,0BAA0B;EACnC,YAAYC,SAAiB;AAC3B,UAAMA,OAAAA;AACN,SAAKC,OAAO;EACd;AACF;AAEA,SAASC,cAAcC,KAAY;AACjC,SAAO,CAAC,CAACA,OAAO,OAAOA,QAAQ,YAAY,6BAA6BA;AAC1E;AAFSD;AAIT,IAAME,KAAK,oBAAIC,KAAK,0BAAA;AACpB,IAAMC,MAAMD,KAAKE,MAAM,0BAAA;AACvB,IAAMC,MAAM;AAEZ,IAAMC,MAAM,wBAACC,OAA6B,CAAC,OAAoB;EAC7DC,IAAI;EACJC,UAAU;EACVC,iBAAiB;EACjBC,QAAQ;EACRC,OAAO;IAAEC,SAAS;EAAK;EACvBC,WAAWb;EACXc,WAAWd;EACX,GAAGM;AACL,IATY;AAWZ,IAAMS,aAAa,wBAACT,OAAgC,CAAC,OAAuB;EAC1EU,OAAO;EACPC,KAAK;EACLpB,MAAM;EACNqB,MAAM;EACNC,QAAQ;EACRT,QAAQ;EACRU,QAAQ;IAAEC,IAAI;EAAK;EACnBC,UAAU;EACVC,YAAYvB;EACZwB,WAAWxB;EACXyB,YAAYzB;EACZ,GAAGM;AACL,IAbmB;AA0BZ,SAASoB,sBAAsB7B,MAAc8B,WAA4B;AAC9EC,EAAAA,UAAS,wBAAwB/B,IAAAA,IAAQ,MAAA;AACvC,QAAIgC;AACJ,QAAIC;AACJ,QAAIC;AACJ,QAAIC,2BAA2B;AAC/B,QAAIC,oBAAoB;AACxB,QAAIC;AACJ,QAAIC,aAAa;AAEjBC,eAAW,YAAA;AACT,UAAI;AACF,cAAMC,MAAM,MAAMV,UAAAA;AAClBE,gBAAQQ,IAAIR;AACZC,oBAAYO,IAAIP,aAAaO,IAAIR;AACjCE,kBAAUM,IAAIN;AACdC,mCAA2BK,IAAIL,4BAA4B;AAC3DC,4BAAoBI,IAAIJ,qBAAqB;AAC7CC,qBAAaI;MACf,SAASvC,KAAK;AACZ,YAAID,cAAcC,GAAAA,GAAM;AAEtBmC,uBAAanC,IAAIH;AACjB,cAAI,CAACuC,YAAY;AACfI,oBAAQC,KAAK,oCAAoC3C,IAAAA,MAAUqC,UAAAA,EAAY;AACvEC,yBAAa;UACf;AACA;QACF;AACA,cAAMpC;MACR;AACA,aAAO,YAAA;AACL,cAAMgC,UAAAA;MACR;IACF,CAAA;AAGA,UAAMU,IAAI,wBAACC,OAAeC,OAAAA;AACxBC,MAAAA,IAAGF,OAAO,YAAA;AACR,YAAIR,WAAY;AAChB,cAAMS,GAAAA;MACR,CAAA;IACF,GALU;AAOVF,MAAE,gFAAgF,YAAA;AAChFI,MAAAA,QAAOhB,MAAMiB,iBAAiB,EAAEC,WAAW,UAAA;AAC3C,YAAMC,QAAQ,wBAACzC,IAAY0C,QAAQ,MACjCpB,MAAMiB,oBAAoBvC,IAAI,eAAe,YAAY0C,KAAAA,GAD7C;AAEd,YAAMpB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAY4C,MAAM;UAAC;UAAe;;MAAY,CAAA,CAAA;AAC9EN,MAAAA,QAAO,MAAMG,MAAM,UAAA,CAAA,EAAaI,KAAK,IAAA;AACrC,YAAMvB,MAAMwB,UAAU,YAAY;QAAE3C,QAAQ;QAAa4C,QAAQ;MAAO,CAAA;AACxET,MAAAA,QAAO,MAAMG,MAAM,UAAA,CAAA,EAAaI,KAAK,IAAA;AACrC,YAAMvB,MAAMwB,UAAU,YAAY;QAAE3C,QAAQ;QAAW6C,UAAU;QAAWC,aAAa;MAAE,CAAA;AAC3F,YAAM3B,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAY4C,MAAM;UAAC;;MAAe,CAAA,CAAA;AAClEN,MAAAA,QAAO,MAAMG,MAAM,UAAA,CAAA,EAAaI,KAAK,KAAA;AACrCP,MAAAA,QAAO,MAAMG,MAAM,UAAA,CAAA,EAAaI,KAAK,IAAA;AACrC,YAAMvB,MAAMwB,UAAU,YAAY;QAAE3C,QAAQ;MAAa,CAAA;AACzDmC,MAAAA,QAAO,MAAMG,MAAM,UAAA,CAAA,EAAaI,KAAK,KAAA;AACrC,YAAMvB,MAAMwB,UAAU,YAAY;QAAE3C,QAAQ;MAAY,CAAA;AACxDmC,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,UAAA,IAAcN,IAAAA,EAAMO,QAAQ;QAAC;QAAe;OAAW;AAClFb,MAAAA,QAAO,MAAMG,MAAM,UAAA,CAAA,EAAaI,KAAK,IAAA;AACrC,YAAMvB,MAAMwB,UAAU,YAAY;QAAE3C,QAAQ;MAAU,CAAA;AACtDmC,MAAAA,QAAO,MAAMG,MAAM,UAAA,CAAA,EAAaI,KAAK,KAAA;AACrCP,MAAAA,QAAO,MAAMG,MAAM,SAAA,CAAA,EAAYI,KAAK,KAAA;IACtC,CAAA;AAEAX,MACE,qFACA,YAAA;AACE,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAU4C,MAAM;UAAC;;MAAe,CAAA,CAAA;AAChEN,MAAAA,QAAO,MAAMhB,MAAMiB,oBAAoB,UAAU,eAAe,YAAY,CAAA,CAAA,EAAIM,KAAK,IAAA;AACrF,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAU4C,MAAM;UAAC;;MAAe,CAAA,CAAA;AAChEN,MAAAA,QACE,MAAMf,UAAUgB,oBAAoB,UAAU,eAAe,YAAY,GAAG,IAAA,CAAA,EAC5EM,KAAK,KAAA;AACPP,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,QAAA,CAAA,EAAWE,cAAc;QAAEjD,QAAQ;QAAa4C,QAAQ;MAAM,CAAA;AACxF,YAAMzB,MAAMwB,UAAU,UAAU;QAAE3C,QAAQ;QAAc4C,QAAQhB;MAAU,CAAA;AAC1EO,MAAAA,QACE,MAAMf,UAAUgB,oBAAoB,UAAU,eAAe,YAAY,GAAG,IAAA,CAAA,EAC5EM,KAAK,KAAA;AACPP,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,QAAA,CAAA,EAAWE,cAAc;QAAEjD,QAAQ;MAAa,CAAA;AAC1EmC,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,QAAA,IAAYH,MAAAA,EAAQM,cAAa;AAC5D,YAAM/B,MAAMwB,UAAU,UAAU;QAAE3C,QAAQ;MAAY,CAAA;AACtDmC,MAAAA,QACE,MAAMf,UAAUgB,oBAAoB,UAAU,eAAe,YAAY,GAAG,IAAA,CAAA,EAC5EM,KAAK,KAAA;AACPP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,QAAA,IAAY/C,MAAAA,EAAQ0C,KAAK,WAAA;AACpD,YAAMvB,MAAMwB,UAAU,UAAU;QAAE3C,QAAQ;MAAY,CAAA;AACtD,YAAMmB,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAcG,QAAQ;QAAcyC,MAAM;UAAC;;MAAe,CAAA,CAAA;AAEtEN,MAAAA,QACE,MAAMhB,MAAMiB,oBAAoB,cAAc,eAAe,YAAY,GAAG,IAAA,CAAA,EAC5EM,KAAK,KAAA;AACPP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,YAAA,IAAgBN,IAAAA,EAAMU,IAAIC,UAAUC,sBAAAA;IACjE,CAAA;AAGFtB,MAAE,sEAAsE,YAAA;AAGtE,iBAAWlC,MAAM;QAAC;QAAW;QAAY;SAAY;AACnD,cAAMsB,MAAMqB,UAAU7C,IAAI;UAAEE;UAAI4C,MAAM;YAAC;YAAea;;QAAuB,CAAA,CAAA;MAC/E;AACA,YAAMC,UAAU,MAAMC,QAAQC,IAAI;QAChCrC,UAAUgB,oBAAoB,YAAY,eAAe,YAAY,CAAA;QACrEjB,MAAMiB,oBAAoB,WAAW,eAAe,YAAY,CAAA;QAChEhB,UAAUgB,oBAAoB,WAAW,eAAe,YAAY,CAAA;OACrE;AACDD,MAAAA,QAAOoB,OAAAA,EAASP,QAAQ;QAAC;QAAO;QAAM;OAAM;AAC5Cb,MAAAA,QAAO,MAAMf,UAAUgB,oBAAoB,WAAW,eAAe,YAAY,CAAA,CAAA,EAAIM,KACnF,IAAA;AAEFP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,SAAA,IAAaN,IAAAA,EAAMW,UAAUC,sBAAAA;IAC1D,CAAA;AAEAtB,MAAE,2EAA2E,YAAA;AAC3E,YAAMO,QAAQ,wBAACzC,IAAY6D,MAAM,eAAe5D,WAAW,eACzDqB,MAAMiB,oBAAoBvC,IAAI6D,KAAK5D,UAAU,CAAA,GADjC;AAEd,iBAAWD,MAAM;QAAC;QAAY;SAAa;AACzC,cAAMsB,MAAMqB,UAAU7C,IAAI;UAAEE;UAAI4C,MAAM;YAAC;;QAAe,CAAA,CAAA;AACtDN,QAAAA,QAAO,MAAMG,MAAMzC,EAAAA,CAAAA,EAAK6C,KAAK,IAAA;MAC/B;AACA,iBAAW7C,MAAM;QAAC;QAAY;QAAY;SAAa;AACrD,cAAMsB,MAAMqB,UAAU7C,IAAI;UAAEE;UAAIG,QAAQ;UAAWyC,MAAM;YAAC;;QAAe,CAAA,CAAA;MAC3E;AACAN,MAAAA,QACE,MAAMqB,QAAQC,IAAI;QAAC;QAAY;QAAY;QAAYE,IAAI,CAAC9D,OAAOyC,MAAMzC,EAAAA,CAAAA,CAAAA,CAAAA,EACzEmD,QAAQ;QAAC;QAAO;QAAO;OAAM;AAC/B,YAAM7B,MAAMwB,UAAU,YAAY;QAAE3C,QAAQ;MAAS,CAAA;AACrDmC,MAAAA,QACE,MAAMqB,QAAQC,IAAI;QAAC;QAAY;QAAY;QAAYE,IAAI,CAAC9D,OAAOyC,MAAMzC,EAAAA,CAAAA,CAAAA,CAAAA,EACzEmD,QAAQ;QAAC;QAAO;QAAO;OAAK;AAC9B,YAAMY,SAAS,MAAMzC,MAAM0C,SAAS;QAClC/D,UAAU;QACVgE,UAAU;UAAC;UAAW;;MACxB,CAAA;AACA3B,MAAAA,QAAOyB,OAAOG,OAAO,CAACC,MAAMA,EAAEvB,MAAMwB,SAASZ,sBAAAA,CAAAA,CAAAA,EAA0Ba,aAAa,CAAA;AACpF,YAAM/C,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAa4C,MAAM;UAAC;;MAAmB,CAAA,CAAA;AACvEN,MAAAA,QAAO,MAAMG,MAAM,aAAa,iBAAA,CAAA,EAAoBI,KAAK,IAAA;AACzD,YAAMvB,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAkBC,UAAU;QAAS2C,MAAM;UAAC;;MAAe,CAAA,CAAA;AAEvEN,MAAAA,QAAO,MAAMG,MAAM,kBAAkB,eAAe,OAAA,CAAA,EAAUI,KAAK,IAAA;IACrE,CAAA;AAKA,UAAMyB,UAAU,wBAACC,WAAmB,IAAI7E,KAAKD,GAAG+E,QAAO,IAAKD,SAAS,GAAA,GAArD;AAEhBrC,MAAE,4EAA4E,YAAA;AAC5E,YAAMO,QAAQ,wBAACzC,IAAY+C,WACzBzB,MAAMiB,oBAAoBvC,IAAI,eAAe,YAAY,GAAG+C,MAAAA,GADhD;AAId,YAAMzB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAU4C,MAAM;UAAC;;QAAgBtC,WAAWgE,QAAQ,CAAA;MAAG,CAAA,CAAA;AAEvF,YAAMhD,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAO4C,MAAM;UAAC;UAAea;;QAAwBnD,WAAWgE,QAAQ,CAAA;MAAG,CAAA,CAAA;AAEvFhC,MAAAA,QAAO,MAAMG,MAAM,OAAO,IAAA,CAAA,EAASI,KAAK,KAAA;AACxCP,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,KAAA,CAAA,EAAQE,cAAc;QAAEjD,QAAQ;QAAa4C,QAAQ;MAAO,CAAA;AACtFT,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,KAAA,IAASN,IAAAA,EAAMW,UAAUE,qBAAAA;AAEpD,YAAMnC,MAAMwB,UAAU,UAAU;QAAE3C,QAAQ;QAAa4C,QAAQ;MAAO,CAAA;AACtET,MAAAA,QAAO,MAAMG,MAAM,KAAA,CAAA,EAAQI,KAAK,KAAA;AAEhC,YAAMvB,MAAMwB,UAAU,UAAU;QAAE3C,QAAQ;MAAY,CAAA;AACtDmC,MAAAA,QAAO,MAAMG,MAAM,KAAA,CAAA,EAAQI,KAAK,IAAA;AAChCP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,KAAA,IAASN,IAAAA,EAAMO,QAAQ;QAAC;QAAeK;OAAuB;AACzF,YAAMlC,MAAMwB,UAAU,OAAO;QAAE3C,QAAQ;MAAY,CAAA;AACnDmC,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,KAAA,IAASN,IAAAA,EAAMO,QAAQ;QAAC;OAAc;IACnE,CAAA;AAEAjB,MAAE,qEAAqE,YAAA;AACrE,YAAMO,QAAQ,wBAACzC,OAAesB,MAAMiB,oBAAoBvC,IAAI,eAAe,YAAY,CAAA,GAAzE;AACd,YAAMsB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAU4C,MAAM;UAAC;;QAAgBtC,WAAWgE,QAAQ,CAAA;MAAG,CAAA,CAAA;AAEvF,YAAMhD,MAAMqB,UACV7C,IAAI;QACFE,IAAI;QACJG,QAAQ;QACR4C,QAAQ;QACRH,MAAM;UAAC;;QACPtC,WAAWgE,QAAQ,CAAA;MACrB,CAAA,CAAA;AAEF,YAAMhD,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAW4C,MAAM;UAAC;UAAea;;QAAwBnD,WAAWgE,QAAQ,CAAA;MAAG,CAAA,CAAA;AAE3FhC,MAAAA,QAAO,MAAMG,MAAM,SAAA,CAAA,EAAYI,KAAK,KAAA;AACpCP,MAAAA,QAAO,MAAMG,MAAM,YAAA,CAAA,EAAeI,KAAK,KAAA;AAEvCP,MAAAA,QACE,MAAMhB,MAAMiB,oBAAoB,cAAc,eAAe,YAAY,GAAG,GAAA,CAAA,EAC5EM,KAAK,KAAA;AACPP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,YAAA,IAAgBN,IAAAA,EAAMW,UAAUE,qBAAAA;AAC3D,YAAMnC,MAAMwB,UAAU,UAAU;QAAE3C,QAAQ;MAAY,CAAA;AACtDmC,MAAAA,QAAO,MAAMG,MAAM,SAAA,CAAA,EAAYI,KAAK,KAAA;AACpCP,MAAAA,QAAO,MAAMG,MAAM,YAAA,CAAA,EAAeI,KAAK,IAAA;AACvCP,MAAAA,QAAO,MAAMG,MAAM,SAAA,CAAA,EAAYI,KAAK,KAAA;AACpC,YAAMvB,MAAMwB,UAAU,cAAc;QAAE3C,QAAQ;MAAY,CAAA;AAC1DmC,MAAAA,QAAO,MAAMG,MAAM,SAAA,CAAA,EAAYI,KAAK,IAAA;IACtC,CAAA;AAEAX,MAAE,uEAAuE,YAAA;AACvE,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAU4C,MAAM;UAAC;;QAAgBtC,WAAWgE,QAAQ,CAAA;MAAG,CAAA,CAAA;AACvF,YAAMG,OAAM;QAAC;QAAM;QAAM;QAAM;;AAC/B,iBAAW,CAACC,GAAG1E,EAAAA,KAAOyE,KAAIE,QAAO,GAAI;AACnC,cAAMrD,MAAMqB,UACV7C,IAAI;UAAEE;UAAI4C,MAAM;YAAC;YAAea;;UAAwBnD,WAAWgE,QAAQI,IAAI,CAAA;QAAG,CAAA,CAAA;MAEtF;AACA,YAAMhB,UAAU,MAAMC,QAAQC,IAC5B;WAAIa;QACDG,QAAO,EACPd,IAAI,CAAC9D,IAAI0E,OACPA,IAAI,IAAInD,YAAYD,OAAOiB,oBAAoBvC,IAAI,eAAe,YAAY,CAAA,CAAA,CAAA;AAIrFsC,MAAAA,QAAOoB,OAAAA,EAASP,QAAQ;QAAC;QAAO;QAAO;QAAO;OAAK;AACnD,YAAMY,SAAS,MAAMzC,MAAM0C,SAAS;QAAE/D,UAAU;QAAYgE,UAAU;UAAC;;MAAW,CAAA;AAClF3B,MAAAA,QACEyB,OAAOG,OAAO,CAACC,MAAMA,EAAEvB,MAAMwB,SAASZ,sBAAAA,CAAAA,EAAyBM,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAC9EmD,QAAQ;QAAC;OAAK;IAClB,CAAA;AAIAjB,MAAE,uDAAuD,YAAA;AACvD,YAAMZ,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAM+E,SAAS,MAAMvD,MAAM4B,OAAO,IAAA;AAClCZ,MAAAA,QAAOuC,QAAQ5E,QAAAA,EAAU4C,KAAK,UAAA;AAC9BP,MAAAA,QAAOuC,QAAQzE,KAAAA,EAAO+C,QAAQ;QAAE9C,SAAS;MAAK,CAAA;IAChD,CAAA;AAEA6B,MAAE,kCAAkC,YAAA;AAClCI,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,MAAA,CAAA,EAAS4B,SAAQ;IAC7C,CAAA;AAEA5C,MAAE,gFAAgF,YAAA;AAChF,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEiF,kBAAkB;MAAE,CAAA,CAAA;AAChD,YAAMzD,MAAMwB,UAAU,MAAM;QAC1B3C,QAAQ;QACRU,QAAQ;UAAEmE,OAAO;QAAG;QACpBzE,WAAWd;MACb,CAAA;AACA,YAAMwF,OAAO,MAAM3D,MAAM4B,OAAO,IAAA;AAChCZ,MAAAA,QAAO2C,MAAM9E,MAAAA,EAAQ0C,KAAK,WAAA;AAC1BP,MAAAA,QAAO2C,MAAMpE,MAAAA,EAAQsC,QAAQ;QAAE6B,OAAO;MAAG,CAAA;AACzC1C,MAAAA,QAAO2C,MAAMF,gBAAAA,EAAkBlC,KAAK,CAAA;AAEpC,YAAMvB,MAAMwB,UAAU,MAAM;QAAE3C,QAAQ;QAAQ4E,kBAAkB;MAAE,CAAA;AAClE,YAAMG,OAAO,MAAM5D,MAAM4B,OAAO,IAAA;AAChCZ,MAAAA,QAAO4C,MAAM/E,MAAAA,EAAQ0C,KAAK,MAAA;AAC1BP,MAAAA,QAAO4C,MAAMH,gBAAAA,EAAkBlC,KAAK,CAAA;IACtC,CAAA;AAEAX,MAAE,uCAAuC,YAAA;AACvC,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAYmF,UAAU;MAAE,CAAA,CAAA;AACxD,YAAM7D,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAS,CAAA,CAAA;AACzCsC,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,UAAA,IAAciC,QAAAA,EAAUtC,KAAK,CAAA;AACxDP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,QAAA,IAAYiC,QAAAA,EAAU9B,cAAa;IAChE,CAAA;AAEAnB,MAAE,iFAAiF,YAAA;AACjF,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEsF,kBAAkB;UAAEC,MAAM;QAAM;MAAE,CAAA,CAAA;AAC9D,YAAM/D,MAAMgE,eAAe9E,WAAAA,CAAAA;AAC3B,YAAMc,MAAMiE,gBAAgB;QAAEC,OAAO;QAAc/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AAEvE,YAAMY,MAAMmE,UAAU,IAAA;AAGtBnD,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAO4B,SAAQ;AACzCxC,MAAAA,QAAO,MAAMhB,MAAMoE,gBAAgB,IAAA,CAAA,EAAOvC,QAAQ,CAAA,CAAE;AACpDb,MAAAA,QAAO,MAAMhB,MAAMqE,kBAAkB,UAAA,CAAA,EAAaxC,QAAQ,CAAA,CAAE;AAE5Db,MAAAA,QACE,MAAMhB,MAAM0C,SAAS;QACnB4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMC,OAAO;UAAM;;MACrD,CAAA,CAAA,EACA5C,QAAQ,CAAA,CAAE;IACd,CAAA;AAEAjB,MAAE,0CAA0C,YAAA;AAC1C,YAAMI,QAAOhB,MAAMmE,UAAU,MAAA,CAAA,EAASO,SAAS3C,cAAa;IAC9D,CAAA;AAIAnB,MAAE,6EAA6E,YAAA;AAC7E,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAMoF,kBAAkB;UAAEC,MAAM;QAAM;MAAE,CAAA,CAAA;AACxE,YAAM/D,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAK,CAAA,CAAA;AACrC,YAAMsB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAO,CAAA,CAAA;AACvC,YAAMsB,MAAMgE,eAAe9E,WAAW;QAAEC,OAAO;QAAMG,QAAQ;MAAO,CAAA,CAAA;AACpE,YAAMU,MAAMiE,gBAAgB;QAAEC,OAAO;QAAc/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AAEvE4B,MAAAA,QAAO,OAAOhB,MAAM2E,UAAU,EAAEpD,KAAK,UAAA;AACrC,YAAMvB,MAAM2E,aAAa;QAAC;QAAM;QAAM;OAAQ;AAE9C3D,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAO4B,SAAQ;AACzCxC,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAO4B,SAAQ;AACzCxC,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,MAAA,CAAA,EAASI,IAAIwB,SAAQ;AAC/CxC,MAAAA,QAAO,MAAMhB,MAAMoE,gBAAgB,IAAA,CAAA,EAAOvC,QAAQ,CAAA,CAAE;AACpDb,MAAAA,QAAO,MAAMhB,MAAMqE,kBAAkB,UAAA,CAAA,EAAaxC,QAAQ,CAAA,CAAE;AAC5Db,MAAAA,QACE,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMC,OAAO;UAAM;;MAAG,CAAA,CAAA,EAC7E5C,QAAQ,CAAA,CAAE;AACZ,YAAMb,QAAOhB,MAAM2E,aAAa,CAAA,CAAE,CAAA,EAAGD,SAAS3C,cAAa;IAC7D,CAAA;AAEA,UAAM6C,OAAO,wBAAClG,IAAYmG,SAAiBpG,OAA6B,CAAC,MACvED,IAAI;MACFE;MACAG,QAAQ;MACRG,WAAW,IAAIZ,KAAKC,MAAMwG,UAAUtG,GAAAA;MACpCU,WAAW,IAAIb,KAAKC,MAAMwG,UAAUtG,GAAAA;MACpC,GAAGE;IACL,CAAA,GAPW;AAQb,UAAM0E,MAAM,oCAAgC,MAAMnD,MAAM0C,SAAS,CAAC,CAAA,GAAIF,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,GAA/E;AAEZlE,MAAE,iFAAiF,YAAA;AACjF,YAAMZ,MAAMqB,UAAUuD,KAAK,YAAY,EAAA,CAAA;AACvC,YAAM5E,MAAMqB,UAAUuD,KAAK,cAAc,IAAI;QAAE/F,QAAQ;MAAS,CAAA,CAAA;AAChE,YAAMmB,MAAMqB,UAAUuD,KAAK,YAAY,IAAI;QAAE/F,QAAQ;MAAY,CAAA,CAAA;AACjE,YAAMmB,MAAMqB,UAAUuD,KAAK,cAAc,CAAA,CAAA;AACzC,YAAM5E,MAAMgE,eAAe9E,WAAW;QAAEC,OAAO;QAAYG,QAAQ;MAAa,CAAA,CAAA;AAEhF0B,MAAAA,QAAO,OAAOhB,MAAM+E,iBAAiB,EAAExD,KAAK,UAAA;AAC5C,YAAMyD,UAAU,MAAMhF,MAAM+E,oBAC1B;QAAEpC,UAAU;UAAC;UAAa;UAAU;;QAAcsC,QAAQ;MAAK,GAC/D5G,KACA,GAAA;AAGF2C,MAAAA,QAAOgE,OAAAA,EAASzD,KAAK,CAAA;AACrBP,MAAAA,QAAO,MAAMmC,IAAAA,CAAAA,EAAOtB,QAAQ;QAAC;QAAc;OAAW;AACtDb,MAAAA,QAAO,MAAMhB,MAAMoE,gBAAgB,UAAA,CAAA,EAAavC,QAAQ,CAAA,CAAE;IAC5D,CAAA;AAEAjB,MACE,mFACA,YAAA;AACE,eAASwC,IAAI,GAAGA,KAAK,GAAGA,IAAK,OAAMpD,MAAMqB,UAAUuD,KAAK,IAAIxB,CAAAA,IAAKA,CAAAA,CAAAA;AAGjE,YAAM8B,SAAS;QAAEvC,UAAU;UAAC;;QAAuBwC,UAAU;MAAE;AAC/DnE,MAAAA,QAAO,MAAMhB,MAAM+E,oBAAoBG,QAAQ7G,KAAK,CAAA,CAAA,EAAIkD,KAAK,CAAA;AAC7DP,MAAAA,QAAO,MAAMhB,MAAM+E,oBAAoBG,QAAQ7G,KAAK,CAAA,CAAA,EAAIkD,KAAK,CAAA;AAC7DP,MAAAA,QAAO,MAAMhB,MAAM+E,oBAAoBG,QAAQ7G,KAAK,CAAA,CAAA,EAAIkD,KAAK,CAAA;AAC7DP,MAAAA,QAAO,MAAMmC,IAAAA,CAAAA,EAAOtB,QAAQ;QAAC;QAAM;OAAK;IAC1C,CAAA;AAGFjB,MAAE,iFAAiF,YAAA;AACjF,YAAMZ,MAAMqB,UAAUuD,KAAK,YAAY,IAAI;QAAEQ,WAAW;MAAO,CAAA,CAAA;AAC/D,YAAMpF,MAAMqB,UAAUuD,KAAK,YAAY,GAAG;QAAEQ,WAAW;MAAO,CAAA,CAAA;AAC9D,YAAMpF,MAAMqB,UAAUuD,KAAK,YAAY,IAAI;QAAEQ,WAAW;MAAO,CAAA,CAAA;AAC/D,YAAMpF,MAAMqB,UAAUuD,KAAK,cAAc,IAAI;QAAEjG,UAAU;MAAS,CAAA,CAAA;AAGlE,YAAMqB,MAAM+E,oBACV;QAAEpC,UAAU;UAAC;;QAAcsC,QAAQ;QAAMI,OAAO;UAAED,WAAW;QAAO;MAAE,GACtE/G,KACA,GAAA;AAEF2C,MAAAA,QAAO,MAAMmC,IAAAA,CAAAA,EAAOtB,QAAQ;QAAC;QAAY;QAAY;OAAa;AAGlE,YAAM7B,MAAM+E,oBACV;QAAEpC,UAAU;UAAC;;QAAcsC,QAAQ;QAAMI,OAAO;UAAEC,WAAW;YAAC;;QAAU;MAAE,GAC1EjH,KACA,GAAA;AAEF2C,MAAAA,QAAO,MAAMmC,IAAAA,CAAAA,EAAOtB,QAAQ;QAAC;QAAY;OAAW;AAGpD,YAAM7B,MAAMqB,UAAUuD,KAAK,YAAY,GAAG;QAAEQ,WAAW;MAAO,CAAA,CAAA;AAC9D,YAAMpF,MAAM+E,oBACV;QAAEpC,UAAU;UAAC;;QAAcwC,UAAU;QAAGE,OAAO;UAAED,WAAW;QAAO;MAAE,GACrE/G,KACA,GAAA;AAEF2C,MAAAA,QAAO,MAAMmC,IAAAA,CAAAA,EAAOtB,QAAQ;QAAC;QAAY;OAAW;IACtD,CAAA;AAEAjB,MAAE,+DAA+D,YAAA;AAC/D,UAAI,CAACR,kBAAmB;AACxB,YAAMJ,MAAMqB,UAAUuD,KAAK,YAAY,IAAI;QAAEtD,MAAM;UAAC;UAAQ;;MAAa,CAAA,CAAA;AACzE,YAAMtB,MAAMqB,UAAUuD,KAAK,cAAc,IAAI;QAAEtD,MAAM;UAAC;;MAAU,CAAA,CAAA;AAChE,YAAMtB,MAAMqB,UAAUuD,KAAK,YAAY,IAAI;QAAEd,kBAAkB;UAAEyB,UAAU;QAAK;MAAE,CAAA,CAAA;AAClF,YAAMvF,MAAMqB,UAAUuD,KAAK,cAAc,IAAI;QAAEd,kBAAkB;UAAEyB,UAAU;QAAK;MAAE,CAAA,CAAA;AAEpF,YAAMvF,MAAM+E,oBACV;QAAEpC,UAAU;UAAC;;QAAcsC,QAAQ;QAAMI,OAAO;UAAE/D,MAAM;YAAC;;QAAQ;MAAE,GACnEjD,KACA,GAAA;AAEF2C,MAAAA,QAAO,MAAMmC,IAAAA,CAAAA,EAAOtB,QAAQ;QAAC;QAAY;QAAc;OAAa;AAEpE,YAAM7B,MAAM+E,oBACV;QACEpC,UAAU;UAAC;;QACXsC,QAAQ;QACRI,OAAO;UAAEf,YAAY;YAAC;cAAEC,KAAK;cAAYC,IAAI;cAAMC,OAAO;YAAK;;QAAG;MACpE,GACApG,KACA,GAAA;AAEF2C,MAAAA,QAAO,MAAMmC,IAAAA,CAAAA,EAAOtB,QAAQ;QAAC;QAAc;OAAa;IAC1D,CAAA;AAEAjB,MACE,kFACA,YAAA;AACE,YAAM4E,SAAS,IAAIC,gBAAe;QAAEzF;MAAM,CAAA;AAC1CwF,aAAOE,SAAS,WAAW,KAAK,OAAOlF,QAAQA,IAAImF,cAAc,OAAA,CAAA;AACjEH,aAAOE,SAAS,UAAU,KAAK,OAAOlF,QAAAA;AACpC,cAAMA,IAAIoF,WAAW,WAAW,CAAC,GAAG,IAAA;AACpC,eAAOpF,IAAImF,cAAc,OAAA;MAC3B,CAAA;AACAH,aAAOE,SAAS,WAAW,KAAK,YAAY,MAAA;AAE5C,YAAMF,OAAOK,MAAM,UAAU,CAAC,GAAG,IAAA;AACjC,YAAML,OAAOK,MAAM,WAAW,CAAC,GAAG,IAAA;AAIlC7E,MAAAA,SAAQ,MAAMwE,OAAOM,WAAW,MAAM;QAAEC,WAAW;MAAO,CAAA,GAAIlH,MAAM,EAAE0C,KAAK,WAAA;AAC3EP,MAAAA,SAAQ,MAAMwE,OAAOM,WAAW,MAAM;QAAEC,WAAW;MAAO,CAAA,GAAIlH,MAAM,EAAE0C,KAAK,WAAA;AAC3EP,MAAAA,SAAQ,MAAMwE,OAAOM,WAAW,MAAM;QAAEC,WAAW;MAAO,CAAA,GAAIlH,MAAM,EAAE0C,KAAK,WAAA;AAE3E,YAAMP,QAAOwE,OAAOQ,UAAU,CAAC,CAAA,CAAA,EAAIC,QAAQC,QAAQ,aAAA;AAEnDlF,MAAAA,QAAO,MAAMwE,OAAOQ,UAAU;QAAEV,WAAW;UAAC;;MAAU,CAAA,CAAA,EAAI/D,KAAK,CAAA;AAE/DP,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAO4B,SAAQ;AACzCxC,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAO4B,SAAQ;AACzCxC,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAOI,IAAIwB,SAAQ;IAC/C,CAAA;AAGF5C,MACE,mGACA,YAAA;AAGE,YAAMZ,MAAMqB,UACV7C,IAAI;QAAEK,QAAQ;QAAUsH,OAAO;UAAEpI,SAAS;QAAO;QAAGuD,MAAM;UAAC;;QAAQI,UAAU;MAAU,CAAA,CAAA;AAEzF,YAAM1B,MAAMwB,UAAU,MAAM;QAC1B3C,QAAQ;QACRU,QAAQ;UAAEC,IAAI;QAAK;QACnB2G,OAAO1F;QACP3B,OAAO;UAAEC,SAAS;QAAK;QACvBuC,MAAM;UAAC;UAAK;;QACZI,UAAU;QACVD,QAAQ;QACRE,aAAa;QACb1C,WAAWd;MACb,CAAA;AACA,YAAM0E,IAAI,MAAM7C,MAAM4B,OAAO,IAAA;AAC7BZ,MAAAA,QAAO6B,GAAGhE,MAAAA,EAAQ0C,KAAK,WAAA;AACvBP,MAAAA,QAAO6B,GAAGtD,MAAAA,EAAQsC,QAAQ;QAAErC,IAAI;MAAK,CAAA;AACrCwB,MAAAA,QAAO6B,GAAGsD,KAAAA,EAAOpE,cAAa;AAC9Bf,MAAAA,QAAO6B,GAAG/D,KAAAA,EAAO+C,QAAQ;QAAE9C,SAAS;MAAK,CAAA;AACzCiC,MAAAA,QAAO6B,GAAGvB,IAAAA,EAAMO,QAAQ;QAAC;QAAK;OAAI;AAClCb,MAAAA,QAAO6B,GAAGnB,QAAAA,EAAUH,KAAK,SAAA;AACzBP,MAAAA,QAAO6B,GAAGpB,MAAAA,EAAQF,KAAK,MAAA;AACvBP,MAAAA,QAAO6B,GAAGlB,WAAAA,EAAaJ,KAAK,MAAA;AAM5B,YAAMvB,MAAMwB,UAAU,MAAM;QAAE4E,wBAAwB;MAAS,CAAA;AAC/DpF,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,IAAA,IAAQwE,sBAAAA,EAAwB7E,KAAK,QAAA;AAChE,YAAMvB,MAAMwB,UAAU,MAAM;QAAE4E,wBAAwB3F;MAAU,CAAA;AAChEO,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,IAAA,IAAQwE,sBAAAA,EAAwBrE,cAAa;IAC1E,CAAA;AAKFnB,MAAE,iEAAiE,YAAA;AACjE,iBAAW,CAAClC,IAAI+C,MAAAA,KAAW;QACzB;UAAC;UAAQ;;QACT;UAAC;UAAY;;QACb;UAAC;UAAU;;QACX;UAAC;UAAU;;SACD;AACV,cAAMzB,MAAMqB,UAAU7C,IAAI;UAAEE;UAAIG,QAAQ;UAAa4C;QAAO,CAAA,CAAA;MAC9D;AAEAT,MAAAA,SAAQ,MAAMhB,MAAMqG,cAAc,GAAA,GAAQ7D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAClE;QACA;QACA;OACD;AACDb,MAAAA,SAAQ,MAAMhB,MAAMqG,cAAc,KAAO5F,QAAW,CAAA,GAAI+B,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAChF;QACA;OACD;IACH,CAAA;AAEAjB,MAAE,iDAAiD,YAAA;AAGjDI,MAAAA,QAAOhB,MAAMsG,gBAAgB,EAAEC,YAAW;AAC1C,UAAI,CAACvG,MAAMsG,iBAAkB;AAC7B,YAAMtG,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,iBAAW,CAACY,KAAKP,MAAAA,KAAW;QAC1B;UAAC;UAAG;;QACJ;UAAC;UAAG;;QACJ;UAAC;UAAG;;QACJ;UAAC;UAAG;;QACJ;UAAC;UAAG;;SACM;AACV,cAAMmB,MAAMgE,eAAe9E,WAAW;UAAEE;UAAKP;UAAQS,QAAQ,MAAMF,GAAAA;QAAM,CAAA,CAAA;MAC3E;AACA,YAAMY,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAQ,CAAA,CAAA;AACxC,YAAMsB,MAAMgE,eACV9E,WAAW;QAAEC,OAAO;QAASC,KAAK;QAAGP,QAAQ;QAAWS,QAAQ;MAAU,CAAA,CAAA;AAG5E0B,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,MAAM,GAAG,GAAG;QAAC;OAAU,CAAA,EAAG/E,KAAK,CAAA;AACnEP,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,MAAM,GAAG,GAAG;QAAC;QAAW;OAAS,CAAA,EAAG/E,KAAK,CAAA;AAE7EP,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,MAAM,GAAG,GAAG;QAAC;OAAU,CAAA,EAAG/E,KAAK,CAAA;AACnEP,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,MAAM,GAAG,GAAG;QAAC;OAAU,CAAA,EAAG/E,KAAK,CAAA;AACnEP,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,MAAM,GAAG,GAAG;QAAC;OAAY,CAAA,EAAG/E,KAAK,CAAA;AAErEP,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,SAAS,GAAG,GAAG;QAAC;OAAU,CAAA,EAAG/E,KAAK,CAAA;AACtEP,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,MAAM,GAAG,GAAG;QAAC;OAAU,CAAA,EAAG/E,KAAK,CAAA;AACnEP,MAAAA,QAAO,MAAMhB,MAAMsG,iBAAiB,MAAM,GAAG,GAAG,CAAA,CAAE,CAAA,EAAG/E,KAAK,CAAA;IAC5D,CAAA;AAEAiF,uCAAmC5F,GAAG,MAAMZ,OAAOxB,GAAAA;AAEnDoC,MACE,uFACA,YAAA;AAGEI,MAAAA,QAAOhB,MAAMyG,gBAAgB,EAAEF,YAAW;AAC1C,UAAI,CAACvG,MAAMyG,iBAAkB;AAE7B,YAAMzD,WAAU,wBAACC,WAAmB,IAAI7E,KAAKD,GAAG+E,QAAO,IAAKD,SAAS,GAAA,GAArD;AAChB,YAAMjD,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAQM,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AAC9DhC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,QAAQ,QAAQrI,MAAM,KAAQA,GAAAA,CAAAA,EAAMkD,KAAK,IAAA;AACvE,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAWM,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AACjEhC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,WAAW,QAAQrI,KAAKA,MAAM,CAAA,CAAA,EAAIkD,KAAK,IAAA;AACrE,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAQM,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AAC9D,YAAMhD,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAgBG,QAAQ;QAAcG,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AAExE,YAAMhD,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAUG,QAAQ;QAAaG,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AACrF,YAAMhD,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAQG,QAAQ;QAAaG,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AACnF,YAAMhD,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAU0G,WAAW;QAAQpG,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AAEnFhC,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,KAAK,EAAA,GAAKmE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QACvE;QACA;QACA;QACA;OACD;AAEDb,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,KAAK,CAAA,GAAImE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QACtE;QACA;OACD;AAEDb,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,KAAK,IAAI,MAAA,GAASmE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAC/E;OACD;AAEDb,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,MAAM,KAAQ,EAAA,GAAKmE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGuD,UAAU,MAAA;AACpFjB,MAAAA,QAAO,MAAMhB,MAAMyG,iBAAiBpI,KAAK,CAAA,CAAA,EAAIwD,QAAQ,CAAA,CAAE;IACzD,CAAA;AAGFjB,MAAE,iFAAiF,YAAA;AACjF,UAAI,CAACZ,MAAMyG,iBAAkB;AAC7B,YAAMzD,WAAU,wBAACC,WAAmB,IAAI7E,KAAKD,GAAG+E,QAAO,IAAKD,SAAS,GAAA,GAArD;AAEhB,YAAMjD,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAWM,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AACjEhC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,WAAW,SAASrI,MAAM,KAAQA,GAAAA,CAAAA,EAAMkD,KAAK,IAAA;AAC3E,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAWM,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AACjEhC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,WAAW,SAASrI,MAAM,KAAQA,GAAAA,CAAAA,EAAMkD,KAAK,IAAA;AAC3E,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAWM,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AACjEhC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,WAAW,SAASrI,MAAM,KAAQA,GAAAA,CAAAA,EAAMkD,KAAK,IAAA;AAC3E,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAcG,QAAQ;QAAaG,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AACzFhC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,cAAc,SAASrI,MAAM,KAAQA,GAAAA,CAAAA,EAAMkD,KAAK,IAAA;AAC9E,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAQM,WAAWgE,SAAQ,CAAA;MAAG,CAAA,CAAA;AAE9D,YAAM2D,UAAU;QAAEC,OAAO;QAASC,cAAcxI,MAAM;MAAO;AAC7D2C,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,KAAK,EAAA,GAAKmE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAO;AACjFb,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,KAAK,IAAIoC,QAAWkG,OAAAA,GAAUnE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAC3F;QACA;OACD;AACDb,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,KAAK,GAAGoC,QAAWkG,OAAAA,GAAUnE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAC1F;OACD;AACDb,MAAAA,SAAQ,MAAMhB,MAAMyG,iBAAiBpI,KAAK,IAAI,QAAQsI,OAAAA,GAAUnE,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ,CAAA,CAAE;IAC9F,CAAA;AAEAjB,MAAE,mDAAmD,YAAA;AAGnDI,MAAAA,QAAOhB,MAAM8G,WAAW,EAAEP,YAAW;AACrC,UAAI,CAACvG,MAAM8G,YAAa;AACxB,YAAM9G,MAAMqB,UAAU7C,IAAI;QAAE2H,OAAO;UAAEpI,SAAS;QAAkB;MAAE,CAAA,CAAA;AAGlEiD,MAAAA,QACE,MAAMhB,MAAM8G,YAAY,MAAM;QAAC;QAAa;SAAY;QACtDjI,QAAQ;QACRU,QAAQ;UAAEmE,OAAO;QAAE;MACrB,CAAA,CAAA,EACAnC,KAAK,KAAA;AACP,UAAIwF,UAAU,MAAM/G,MAAM4B,OAAO,IAAA;AACjCZ,MAAAA,QAAO+F,SAASlI,MAAAA,EAAQ0C,KAAK,SAAA;AAC7BP,MAAAA,QAAO+F,SAASxH,MAAAA,EAAQwC,cAAa;AAGrCf,MAAAA,QACE,MAAMhB,MAAM8G,YAAY,MAAM;QAAC;QAAW;SAAY;QACpDjI,QAAQ;QACR4C,QAAQ;QACR0E,OAAO1F;QACPxB,WAAW,IAAIb,KAAKD,GAAG+E,QAAO,IAAK,GAAA;MACrC,CAAA,CAAA,EACA3B,KAAK,IAAA;AACPwF,gBAAU,MAAM/G,MAAM4B,OAAO,IAAA;AAC7BZ,MAAAA,QAAO+F,SAASlI,MAAAA,EAAQ0C,KAAK,WAAA;AAC7BP,MAAAA,QAAO+F,SAAStF,MAAAA,EAAQF,KAAK,GAAA;AAC7BP,MAAAA,QAAO+F,SAASZ,KAAAA,EAAOpE,cAAa;AACpCf,MAAAA,QAAO+F,SAAS9H,UAAUiE,QAAAA,CAAAA,EAAW3B,KAAKpD,GAAG+E,QAAO,IAAK,GAAA;AAGzD,YAAMlD,MAAMwB,UAAU,MAAM;QAAE3C,QAAQ;QAAasH,OAAO;UAAEpI,SAAS;QAAY;MAAE,CAAA;AACnFiD,MAAAA,QACE,MAAMhB,MAAM8G,YAAY,MAAM;QAAC;QAAW;SAAc;QACtDjI,QAAQ;QACRU,QAAQ;UAAEmE,OAAO;QAAE;MACrB,CAAA,CAAA,EACAnC,KAAK,KAAA;AACPwF,gBAAU,MAAM/G,MAAM4B,OAAO,IAAA;AAC7BZ,MAAAA,QAAO+F,SAASlI,MAAAA,EAAQ0C,KAAK,WAAA;AAC7BP,MAAAA,QAAO+F,SAASZ,KAAAA,EAAOtE,QAAQ;QAAE9D,SAAS;MAAY,CAAA;AACtDiD,MAAAA,QAAO+F,SAASxH,MAAAA,EAAQwC,cAAa;AAGrCf,MAAAA,QAAO,MAAMhB,MAAM8G,YAAY,WAAW;QAAC;SAAY;QAAEjI,QAAQ;MAAY,CAAA,CAAA,EAAI0C,KAAK,KAAA;AACtFP,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,SAAA,CAAA,EAAY4B,SAAQ;IAChD,CAAA;AAEA5C,MACE,mFACA,YAAA;AACEI,MAAAA,QAAOhB,MAAM8G,WAAW,EAAEP,YAAW;AACrC,UAAI,CAACvG,MAAM8G,YAAa;AACxB,YAAM9G,MAAMqB,UAAU7C,IAAI;QAAEe,QAAQ;UAAEyH,MAAM;QAAK;MAAE,CAAA,CAAA;AACnDhG,MAAAA,QAAO,MAAMhB,MAAM8G,YAAY,MAAM;QAAC;SAAY,CAAC,CAAA,CAAA,EAAIvF,KAAK,IAAA;AAC5DP,MAAAA,QAAO,MAAMhB,MAAM8G,YAAY,MAAM;QAAC;SAAc,CAAC,CAAA,CAAA,EAAIvF,KAAK,KAAA;AAC9DP,MAAAA,QAAO,MAAMhB,MAAM8G,YAAY,WAAW;QAAC;SAAY,CAAC,CAAA,CAAA,EAAIvF,KAAK,KAAA;AACjE,YAAMwF,UAAU,MAAM/G,MAAM4B,OAAO,IAAA;AACnCZ,MAAAA,QAAO+F,SAASlI,MAAAA,EAAQ0C,KAAK,SAAA;AAC7BP,MAAAA,QAAO+F,SAASxH,MAAAA,EAAQsC,QAAQ;QAAEmF,MAAM;MAAK,CAAA;IAC/C,CAAA;AAGFpG,MACE,oFACA,YAAA;AACEI,MAAAA,QAAOhB,MAAM8G,WAAW,EAAEP,YAAW;AACrC,UAAI,CAACvG,MAAM8G,YAAa;AACxB,YAAM9G,MAAMqB,UAAU7C,IAAI;QAAE8C,MAAM;UAAC;UAAeY;;MAAwB,CAAA,CAAA;AAC1ElB,MAAAA,QACE,MAAMhB,MAAM8G,YAAY,MAAM;QAAC;SAAY;QAAEjI,QAAQ;QAAaU,QAAQ;UAAEC,IAAI;QAAK;MAAE,CAAA,CAAA,EACvF+B,KAAK,IAAA;AACP,YAAM0F,UAAU,MAAMjH,MAAM4B,OAAO,IAAA;AACnCZ,MAAAA,QAAOiG,SAASpI,MAAAA,EAAQ0C,KAAK,WAAA;AAC7BP,MAAAA,QAAOiG,SAAS1H,MAAAA,EAAQsC,QAAQ;QAAErC,IAAI;MAAK,CAAA;AAC3CwB,MAAAA,QAAOiG,SAAS3F,IAAAA,EAAMO,QAAQ;QAAC;OAAc;IAC/C,CAAA;AAGFjB,MAAE,0DAA0D,YAAA;AAG1DI,MAAAA,QAAOhB,MAAMkH,uBAAuB,EAAEX,YAAW;AACjD,UAAI,CAACvG,MAAMkH,wBAAyB;AACpC,YAAMlH,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAM2I,UAAUjI,WAAW;QAAEL,QAAQ;QAAWU,QAAQkB;MAAU,CAAA;AAClE,YAAMT,MAAMgE,eAAemD,OAAAA;AAE3BnG,MAAAA,QAAO,MAAMhB,MAAMkH,wBAAwB;QAAE,GAAGC;QAAS1F,QAAQ;MAAM,CAAA,CAAA,EAAIF,KAAK,IAAA;AAChFP,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,IAAK3F,MAAAA,EAAQF,KAAK,GAAA;AAE1D,YAAMoC,OAAO;QAAE,GAAGwD;QAAStI,QAAQ;QAAsBU,QAAQ;UAAEC,IAAI;QAAK;MAAE;AAC9EwB,MAAAA,QAAO,MAAMhB,MAAMkH,wBAAwBvD,IAAAA,CAAAA,EAAOpC,KAAK,IAAA;AAEvDP,MAAAA,QAAO,MAAMhB,MAAMkH,wBAAwB;QAAE,GAAGC;QAAS1F,QAAQ;MAAM,CAAA,CAAA,EAAIF,KAAK,KAAA;AAChF,YAAM8F,QAAQ,MAAMrH,MAAMoH,cAAc,MAAM,CAAA;AAC9CpG,MAAAA,QAAOqG,OAAOxI,MAAAA,EAAQ0C,KAAK,WAAA;AAC3BP,MAAAA,QAAOqG,OAAO9H,MAAAA,EAAQsC,QAAQ;QAAErC,IAAI;MAAK,CAAA;AAEzCwB,MAAAA,QAAOqG,OAAO5F,MAAAA,EAAQM,cAAa;AAEnC,YAAM/B,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGP,QAAQ;QAAUS,QAAQ;MAAO,CAAA,CAAA;AACjF0B,MAAAA,QAAO,MAAMhB,MAAMkH,wBAAwB;QAAE,GAAGC;QAAS/H,KAAK;QAAGE,QAAQ;MAAO,CAAA,CAAA,EAAIiC,KAClF,KAAA;AAEFP,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,IAAKvI,MAAAA,EAAQ0C,KAAK,QAAA;AAE1DP,MAAAA,QAAO,MAAMhB,MAAMkH,wBAAwB;QAAE,GAAGC;QAAS/H,KAAK;MAAE,CAAA,CAAA,EAAImC,KAAK,KAAA;AACzEP,MAAAA,QAAO,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,CAAA,EAAI5D,SAAQ;IACrD,CAAA;AAEA5C,MAAE,iEAAiE,YAAA;AAGjEI,MAAAA,QAAOhB,MAAMsH,wBAAwB,EAAEf,YAAW;AAClD,UAAI,CAACvG,MAAMsH,yBAA0B;AACrCtG,MAAAA,QAAO,MAAMhB,MAAMsH,yBAAyB,CAAA,CAAE,CAAA,EAAGzF,QAAQ,CAAA,CAAE;AAC3D,YAAM7B,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMwB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAK,CAAA,CAAA;AACrC,YAAMyI,UAAU,wBAAChI,OAAeC,QAC9BF,WAAW;QACTC;QACAC;QACAE,QAAQ,GAAGH,KAAAA,IAASC,GAAAA;QACpBP,QAAQ;QACRU,QAAQkB;QACRgB,QAAQ;MACV,CAAA,GARc;AAShB,iBAAWrC,OAAO;QAAC;QAAG;QAAG;QAAG;QAAI,OAAMY,MAAMgE,eAAemD,QAAQ,MAAM/H,GAAAA,CAAAA;AACzE,YAAMY,MAAMgE,eAAemD,QAAQ,MAAM,CAAA,CAAA;AAEzC,YAAMnH,MAAMgE,eAAe;QACzB,GAAGmD,QAAQ,MAAM,CAAA;QACjBtI,QAAQ;QACRU,QAAQ;UAAEgI,OAAO;QAAE;MACrB,CAAA;AACA,YAAM5D,OAAO,wBAACxE,OAAeC,KAAaG,YAAqB;QAC7D,GAAG4H,QAAQhI,OAAOC,GAAAA;QAClBP,QAAQ;QACRU;QACAkC,QAAQhB;MACV,IALa;AAOb,YAAM+G,QAAQ,MAAMxH,MAAMsH,yBAAyB;QACjD3D,KAAK,MAAM,GAAG;UAAE8D,GAAG;QAAE,CAAA;QACrB9D,KAAK,MAAM,GAAG;UAAE8D,GAAG;QAAE,CAAA;;QAErB9D,KAAK,MAAM,GAAG;UAAE8D,GAAG;QAAM,CAAA;QACzB;UAAE,GAAGN,QAAQ,MAAM,CAAA;UAAItI,QAAQ;UAAUsH,OAAO;YAAEpI,SAAS;UAAO;UAAG0D,QAAQhB;QAAU;;QAEvFkD,KAAK,MAAM,GAAG;UAAE8D,GAAG;QAAE,CAAA;;QAErB9D,KAAK,MAAM,GAAG;UAAE8D,GAAG;QAAK,CAAA;OACzB;AACDzG,MAAAA,QAAOwG,KAAAA,EAAO3F,QAAQ;QAAC;QAAM;QAAO;QAAO;QAAM;QAAO;OAAK;AAE7D,YAAM6F,KAAK,MAAM1H,MAAMoE,gBAAgB,IAAA;AACvCpD,MAAAA,QAAO0G,GAAGlF,IAAI,CAACmF,MAAM;QAACA,EAAEvI;QAAKuI,EAAE9I;QAAQ8I,EAAEpI;OAAO,CAAA,EAAGsC,QAAQ;QACzD;UAAC;UAAG;UAAa;YAAE4F,GAAG;UAAE;;QACxB;UAAC;UAAG;UAAa;YAAEF,OAAO;UAAE;;QAC5B;UAAC;UAAG;UAAU9G;;QACd;UAAC;UAAG;UAAWA;;OAChB;AACDO,MAAAA,QAAO0G,GAAG,CAAA,GAAIvB,KAAAA,EAAOtE,QAAQ;QAAE9D,SAAS;MAAO,CAAA;AAE/CiD,MAAAA,QAAO0G,GAAG,CAAA,GAAIjG,MAAAA,EAAQM,cAAa;AACnCf,MAAAA,QAAO0G,GAAG,CAAA,GAAIjG,MAAAA,EAAQF,KAAK,GAAA;AAC3BP,MAAAA,QAAO,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,CAAA,EAAI5D,SAAQ;AACnDxC,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,IAAK7H,MAAAA,EAAQsC,QAAQ;QAAE4F,GAAG;MAAK,CAAA;AAGvEzG,MAAAA,QACE,MAAMhB,MAAMsH,yBAAyB;QACnC;UAAE,GAAGH,QAAQ,MAAM,CAAA;UAAI1F,QAAQ;QAAM;QACrCkC,KAAK,MAAM,GAAG;UAAE8D,GAAG;QAAE,CAAA;OACtB,CAAA,EACD5F,QAAQ;QAAC;QAAM;OAAK;AACtBb,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,IAAK7H,MAAAA,EAAQsC,QAAQ;QAAE4F,GAAG;MAAE,CAAA;IACtE,CAAA;AAEA7G,MAAE,gDAAgD,YAAA;AAChD,UAAI,CAACZ,MAAMsH,yBAA0B;AACrC,YAAMtH,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMiJ,IAAI;AACV,YAAMG,OAAOC,MAAMC,KAAK;QAAEC,QAAQN;MAAE,GAAG,CAACO,GAAG5I,QACzCF,WAAW;QAAEE;QAAKE,QAAQ,MAAMF,GAAAA;QAAOP,QAAQ;QAAWU,QAAQkB;MAAU,CAAA,CAAA;AAE9E,iBAAWwH,OAAOL,KAAM,OAAM5H,MAAMgE,eAAeiE,GAAAA;AACnD,YAAMT,QAAQ,MAAMxH,MAAMsH,yBACxBM,KAAKpF,IAAI,CAACyF,SAAS;QAAE,GAAGA;QAAKpJ,QAAQ;QAAsBU,QAAQ;UAAEH,KAAK6I,IAAI7I;QAAI;MAAE,EAAA,CAAA;AAEtF4B,MAAAA,QAAOwG,MAAMU,MAAM,CAACC,MAAMA,MAAM,IAAA,CAAA,EAAO5G,KAAK,IAAA;AAC5CP,MAAAA,QAAOwG,KAAAA,EAAOzE,aAAa0E,CAAAA;AAC3BzG,MAAAA,QAAO,MAAMhB,MAAMsG,mBAAmB,MAAM,GAAGmB,IAAI,GAAG;QAAC;OAAY,CAAA,EAAGlG,KAAKkG,CAAAA;AAC3EzG,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAMK,IAAI,CAAA,IAAKlI,MAAAA,EAAQsC,QAAQ;QAAEzC,KAAKqI,IAAI;MAAE,CAAA;IAChF,CAAA;AAEA7G,MACE,kFACA,YAAA;AACE,YAAMZ,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMwB,MAAMgE,eAAe9E,WAAAA,CAAAA;AAC3B,YAAMc,MAAMgE,eACV9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;QAAUuB,QAAQ;UAAE6I,UAAU;QAAO;MAAE,CAAA,CAAA;AAGpE,YAAMpI,MAAMgE,eAAe9E,WAAW;QAAEK,QAAQ;UAAEC,IAAI;UAAM6I,OAAO;QAAK;MAAE,CAAA,CAAA;AAE1ErH,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,IAAK7H,MAAAA,EAAQsC,QAAQ;QAAErC,IAAI;QAAM6I,OAAO;MAAK,CAAA;AACrFrH,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,IAAKpJ,IAAAA,EAAMuD,KAAK,QAAA;AACxD,YAAM+G,OAAO,MAAMtI,MAAMoE,gBAAgB,IAAA;AACzCpD,MAAAA,QAAOsH,KAAK9F,IAAI,CAACmF,MAAMA,EAAEvI,GAAG,CAAA,EAAGyC,QAAQ;QAAC;QAAG;OAAE;IAC/C,CAAA;AAGFjB,MACE,oFACA,YAAA;AACE,YAAMZ,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMwB,MAAMgE,eACV9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;QAAkBuB,QAAQ;UAAEgJ,KAAK;QAAG;MAAE,CAAA,CAAA;AAEnE,YAAMvI,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;QAAUuB,QAAQ;UAAEb,IAAI;QAAK;MAAE,CAAA,CAAA;AACrF,YAAMsB,MAAMgE,eACV9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;QAAkBuB,QAAQ;UAAEgJ,KAAK;QAAG;MAAE,CAAA,CAAA;AAEnE,YAAMvI,MAAMgE,eACV9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;QAAkBuB,QAAQ;UAAEgJ,KAAK;QAAG;MAAE,CAAA,CAAA;AAKnE,YAAMC,4BAA4BxI,MAAMwI;AACxCxH,MAAAA,QAAOwH,yBAAAA,EAA2BjC,YAAW;AAC7C,UAAI,CAACiC,0BAA2B;AAEhC,YAAMC,SAAS,MAAMD,0BAA0BE,KAAK1I,OAAO,MAAM,gBAAA;AACjEgB,MAAAA,QAAOyH,QAAQrJ,GAAAA,EAAKmC,KAAK,CAAA;AACzBP,MAAAA,QAAOyH,QAAQlJ,MAAAA,EAAQsC,QAAQ;QAAE0G,KAAK;MAAG,CAAA;AACzCvH,MAAAA,QAAO,MAAMwH,0BAA0BE,KAAK1I,OAAO,MAAM,eAAA,CAAA,EAAkB+B,cAAa;IAC1F,CAAA;AAGFnB,MACE,qFACA,YAAA;AACE,YAAMZ,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMwB,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;MAAU,CAAA,CAAA;AAChE,YAAMgC,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;QAAWuB,QAAQ;MAAU,CAAA,CAAA;AACnF,YAAMS,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;MAAkB,CAAA,CAAA;AACxE,YAAMgC,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;MAAiB,CAAA,CAAA;AACvE,YAAMgC,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;QAAWuB,QAAQ;MAAU,CAAA,CAAA;AAInF,YAAMoJ,8BAA8B3I,MAAM2I;AAC1C3H,MAAAA,QAAO2H,2BAAAA,EAA6BpC,YAAW;AAC/C,UAAI,CAACoC,4BAA6B;AAElC,YAAMC,UAAU,MAAMD,4BAA4BD,KAAK1I,OAAO,MAAM;QAClE;QACA;OACD;AACDgB,MAAAA,QAAO4H,QAAQpG,IAAI,CAACmF,MAAMA,EAAE3J,IAAI,CAAA,EAAG6D,QAAQ;QAAC;QAAW;QAAmB;OAAU;AACpFb,MAAAA,QAAO,MAAM2H,4BAA4BD,KAAK1I,OAAO,MAAM,CAAA,CAAE,CAAA,EAAG6B,QAAQ,CAAA,CAAE;IAC5E,CAAA;AAGFjB,MAAE,iFAA4E,YAAA;AAC5E,YAAMZ,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMwB,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;MAA+B,CAAA,CAAA;AACrF,YAAMgC,MAAMgE,eAAe9E,WAAW;QAAEE,KAAK;QAAGpB,MAAM;MAA+B,CAAA,CAAA;AACrF,YAAMgC,MAAMiE,gBAAgB;QAAEC,OAAO;QAAuB/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AAChF,YAAMY,MAAMiE,gBAAgB;QAAEC,OAAO;QAAuB/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AAEhF,YAAMwJ,UAAU,MAAM5I,MAAM2I,8BAA8B,MAAM;QAAC;OAAsB;AACvF3H,MAAAA,QAAO4H,SAASpG,IAAI,CAACmF,MAAMA,EAAE3J,IAAI,CAAA,EAAG6D,QAAQ;QAAC;OAA+B;AAC5Eb,MAAAA,SAAQ,MAAMhB,MAAMqE,kBAAkB,cAAA,GAAiB7B,IAAI,CAAC2F,MAAMA,EAAEjE,KAAK,CAAA,EAAGrC,QAAQ;QAClF;OACD;IACH,CAAA;AAEAjB,MAAE,6EAA6E,YAAA;AAC7E,YAAMZ,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMwB,MAAMgE,eACV9E,WAAW;QACT2J,QAAQ;UAAC;YAAE1K,IAAI;YAAG2K,OAAO;YAAS/K,SAAS;YAAcC,MAAM;YAAOa,QAAQ;UAAS;;MACzF,CAAA,CAAA;AAEFmC,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,MAAM,CAAA,IAAKyB,MAAAA,EAAQhH,QAAQ;QAC3D;UAAE1D,IAAI;UAAG2K,OAAO;UAAS/K,SAAS;UAAcC,MAAM;UAAOa,QAAQ;QAAS;OAC/E;AACDmC,MAAAA,QAAO,MAAMhB,MAAMoH,cAAc,MAAM,EAAA,CAAA,EAAK5D,SAAQ;IACtD,CAAA;AAIA5C,MAAE,8DAA8D,YAAA;AAC9D,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAYG,QAAQ;MAAU,CAAA,CAAA;AAC9D,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAcG,QAAQ;QAAa4C,QAAQ;MAAM,CAAA,CAAA;AACjF,YAAMzB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAASG,QAAQ;MAAY,CAAA,CAAA;AAC7D,YAAMmB,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAYG,QAAQ;QAAWG,WAAW,oBAAIZ,KAAK,0BAAA;MAA4B,CAAA,CAAA;AAE3F,YAAM4B,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAYG,QAAQ;QAAWG,WAAW,oBAAIZ,KAAK,0BAAA;MAA4B,CAAA,CAAA;AAG3F4C,MAAAA,SAAQ,MAAMhB,MAAM+I,mBAAkB,GAAIvG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAW;AAEhFb,MAAAA,SAAQ,MAAMhB,MAAMgJ,gBAAgB,EAAA,GAAKxG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;QAAY;OAAW;AAC3Fb,MAAAA,SAAQ,MAAMhB,MAAMgJ,gBAAgB,CAAA,GAAIxG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAW;AAC9Eb,MAAAA,SAAQ,MAAMhB,MAAMqG,cAAc,GAAA,GAAS7D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAa;AACnFb,MAAAA,QAAO,MAAMhB,MAAMqG,cAAc,GAAA,CAAA,EAAQtD,aAAa,CAAA;IACxD,CAAA;AAEAnC,MAAE,4EAA4E,YAAA;AAY5E,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAaG,QAAQ;QAAWuG,WAAW;MAAQ,CAAA,CAAA;AACnF,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAaG,QAAQ;QAAWuG,WAAW;MAAO,CAAA,CAAA;AAClF,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAaG,QAAQ;QAAWuG,WAAW;MAAQ,CAAA,CAAA;AACnF,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAaG,QAAQ;QAAWuG,WAAW;MAAO,CAAA,CAAA;AAClF,YAAMpF,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAWG,QAAQ;QAAa4C,QAAQ;QAAO2D,WAAW;MAAQ,CAAA,CAAA;AAE9E,YAAMpF,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAWG,QAAQ;QAAa4C,QAAQ;QAAO2D,WAAW;MAAO,CAAA,CAAA;AAG7EpE,MAAAA,SAAQ,MAAMhB,MAAMgJ,gBAAgB,IAAI,OAAA,GAAUxG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAY;AACzFb,MAAAA,SAAQ,MAAMhB,MAAM+I,mBAAmB,OAAA,GAAUvG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAY;AACxFb,MAAAA,SAAQ,MAAMhB,MAAMqG,cAAc,KAAQ,OAAA,GAAU7D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAU;AACzFb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE0C,WAAW;QAASvG,QAAQ;MAAU,CAAA,GAAI2D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EACjFmD,QAAQ;QAAC;OAAY;AAMvBb,MAAAA,SAAQ,MAAMhB,MAAMgJ,gBAAgB,GAAG,OAAA,GAAUxG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAY;AAMxFb,MAAAA,SAAQ,MAAMhB,MAAMgJ,gBAAgB,EAAA,GAAKxG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QACxE;QACA;OACD;AACDb,MAAAA,SAAQ,MAAMhB,MAAM+I,mBAAkB,GAAIvG,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QACzE;QACA;OACD;AACDb,MAAAA,SAAQ,MAAMhB,MAAMqG,cAAc,GAAA,GAAS7D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QAC1E;QACA;OACD;IACH,CAAA;AAIAjB,MAAE,kDAAkD,YAAA;AAClD,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAK,CAAA,CAAA;AACrCsC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,GAAA,CAAA,EAAQnF,KAAK,IAAA;AAE7DP,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,IAAA,CAAA,EAAQnF,KAAK,KAAA;AAE7DP,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,IAAA,CAAA,EAAQnF,KAAK,IAAA;AAE7D,YAAMvB,MAAMiJ,eAAe,IAAA;AAC3BjI,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,IAAA,CAAA,EAAQnF,KAAK,IAAA;IAC/D,CAAA;AAEAX,MAAE,2EAA2E,YAAA;AAC3E,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAK,CAAA,CAAA;AACrCsC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,GAAA,CAAA,EAAQnF,KAAK,IAAA;AAE7DP,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,IAAA,CAAA,EAAQnF,KAAK,IAAA;AAC7D,YAAMvB,MAAMiJ,eAAe,MAAM,GAAA;AACjCjI,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,GAAA,CAAA,EAAQnF,KAAK,KAAA;AAC7DP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,IAAA,IAAQF,QAAAA,EAAUH,KAAK,GAAA;AAElD,YAAMvB,MAAMiJ,eAAe,MAAM,GAAA;AACjCjI,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,GAAA,CAAA,EAAQnF,KAAK,IAAA;IAC/D,CAAA;AAEAX,MAAE,oDAAoD,YAAA;AACpD,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAK,CAAA,CAAA;AACrCsC,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,GAAA,CAAA,EAAQnF,KAAK,IAAA;AAE7DP,MAAAA,QAAO,MAAMhB,MAAMkJ,aAAa,MAAM,KAAK,GAAA,CAAA,EAAQ3H,KAAK,IAAA;AAExDP,MAAAA,QAAO,MAAMhB,MAAMkJ,aAAa,MAAM,KAAK,GAAA,CAAA,EAAQ3H,KAAK,KAAA;AAExDP,MAAAA,QAAO,MAAMhB,MAAM0G,WAAW,MAAM,KAAK,KAAO,GAAA,CAAA,EAAQnF,KAAK,KAAA;IAC/D,CAAA;AAIAX,MAAE,8CAA8C,YAAA;AAC9C,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKC,UAAU;QAAYE,QAAQ;MAAU,CAAA,CAAA;AAC7E,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKC,UAAU;QAAUE,QAAQ;MAAU,CAAA,CAAA;AAC3E,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKC,UAAU;QAAYE,QAAQ;MAAY,CAAA,CAAA;AAE/EmC,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAE/D,UAAU;MAAW,CAAA,GAAI6D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QACvF;QACA;OACD;AACDb,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAE7D,QAAQ;MAAU,CAAA,GAAI2D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QACpF;QACA;OACD;AACDb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE/D,UAAU;QAAYE,QAAQ;MAAU,CAAA,GAAI2D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EACnFmD,QAAQ;QAAC;OAAI;IACjB,CAAA;AAEAjB,MAAE,4EAA4E,YAAA;AAC5E,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;MAAU,CAAA,CAAA;AACvD,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;MAAY,CAAA,CAAA;AACzD,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;MAAY,CAAA,CAAA;AACzD,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;MAAU,CAAA,CAAA;AAEvDmC,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAEC,UAAU;UAAC;UAAW;;MAAa,CAAA,GAAIH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EACpFjD,QAAQ;QAAC;QAAK;OAAI;AAEpBb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE7D,QAAQ;QAAW8D,UAAU;UAAC;UAAW;;MAAa,CAAA,GAAIH,IAChF,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAEbmD,QAAQ;QAAC;OAAI;AAEfb,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAEC,UAAU,CAAA;MAAG,CAAA,CAAA,EAAII,aAAa,CAAA;IAC9D,CAAA;AAEAnC,MAAE,yDAAyD,YAAA;AACzD,UAAI,CAACR,kBAAmB;AACxB,YAAMJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;UAAO;;MAAY,CAAA,CAAA;AAC/D,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;;MAAW,CAAA,CAAA;AACvD,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AAEpCsC,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,GAAA,IAAON,IAAAA,EAAMO,QAAQ;QAAC;QAAO;OAAW;AACnEb,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEH,KAAK;MAAM,CAAA,GAAIC,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAI;AAC7Eb,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEH,KAAK;MAAU,CAAA,GAAIC,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAI;AACjFb,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAEH,KAAK;MAAO,CAAA,CAAA,EAAIQ,aAAa,CAAA;IAC7D,CAAA;AAEAnC,MACE,qFACA,YAAA;AAME,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKyK,QAAQ;MAAoC,CAAA,CAAA;AACjF,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKyK,QAAQ;MAAyB,CAAA,CAAA;AACtE,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AAEpCsC,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,GAAA,IAAOuH,MAAAA,EAAQ5H,KAAK,mCAAA;AAC/CP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,GAAA,IAAOuH,MAAAA,EAAQpH,cAAa;AAKvDf,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAEyG,QAAQ;MAAoC,CAAA,GAAI3G,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EACvFmD,QAAQ;QAAC;OAAI;AAEfb,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAEyG,QAAQ;MAAU,CAAA,CAAA,EAAItH,QAAQ,CAAA,CAAE;AAG9Db,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS,CAAC,CAAA,GAAIF,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QAAC;QAAK;QAAK;OAAI;IACpF,CAAA;AAGFjB,MACE,2FACA,YAAA;AAIE,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKyK,QAAQ;MAAyB,CAAA,CAAA;AACtE,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AACpC,YAAMsB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AAEpCsC,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEyG,QAAQ;MAAK,CAAA,GAAI3G,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QAC/E;QACA;OACD;AAED,YAAM7B,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;MAAO,CAAA,CAAA;AACpDmC,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEyG,QAAQ;QAAMtK,QAAQ;MAAO,CAAA,GAAI2D,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QACxF;OACD;IACH,CAAA;AAGFjB,MAAE,0DAA0D,YAAA;AAI1D,UAAI,CAACZ,MAAMoJ,UAAW;AACtB,YAAMpJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAasK,QAAQ;MAAQ,CAAA,CAAA;AAC1E,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAasK,QAAQ;MAAQ,CAAA,CAAA;AAC1E,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAUsK,QAAQ;MAAQ,CAAA,CAAA;AACvE,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;MAAS,CAAA,CAAA;AACtD,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;MAAS,CAAA,CAAA;AAEtD,YAAMwK,SAAS,MAAMrJ,MAAMoJ,UAAU,CAAC,CAAA;AAEtCpI,MAAAA,QAAOqI,MAAAA,EAAQC,eAAe;QAAEzK,QAAQ;QAAasK,QAAQ;QAASI,OAAO;MAAE,CAAA;AAC/EvI,MAAAA,QAAOqI,MAAAA,EAAQC,eAAe;QAAEzK,QAAQ;QAAUsK,QAAQ;QAASI,OAAO;MAAE,CAAA;AAE5EvI,MAAAA,QAAOqI,MAAAA,EAAQC,eAAe;QAAEzK,QAAQ;QAAUsK,QAAQ;QAAMI,OAAO;MAAE,CAAA;AACzEvI,MAAAA,QAAOqI,OAAOG,OAAO,CAAC/B,GAAGgC,MAAMhC,IAAIgC,EAAEF,OAAO,CAAA,CAAA,EAAIhI,KAAK,CAAA;IACvD,CAAA;AAEAX,MAAE,2DAA2D,YAAA;AAG3D,UAAI,CAACZ,MAAMoJ,UAAW;AACtB,YAAMpJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAUuG,WAAW;MAAO,CAAA,CAAA;AACzE,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAUuG,WAAW;MAAS,CAAA,CAAA;AAE3EpE,MAAAA,QAAO,MAAMhB,MAAMoJ,UAAU;QAAEhE,WAAW;MAAO,CAAA,CAAA,EAAIvD,QAAQ;QAC3D;UAAEhD,QAAQ;UAAUsK,QAAQ;UAAMI,OAAO;QAAE;OAC5C;IACH,CAAA;AAIA3I,MAAE,mEAAmE,YAAA;AAGnE,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAUuG,WAAW;QAAQzG,UAAU;MAAK,CAAA,CAAA;AACzF,YAAMqB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAQuG,WAAW;QAAUzG,UAAU;MAAK,CAAA,CAAA;AACzF,YAAMqB,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAauG,WAAW;QAAWzG,UAAU;MAAK,CAAA,CAAA;AAG3EqC,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAEC,UAAU;UAAC;UAAU;;MAAQ,CAAA,GAAIH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAC9EjD,QAAQ;QAAC;QAAK;OAAI;AACpBb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAEgH,YAAY;UAAC;UAAQ;;MAAU,CAAA,GAAIlH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAChFjD,QAAQ;QAAC;QAAK;OAAI;AACpBb,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAE4C,WAAW;UAAC;UAAM;;MAAM,CAAA,GAAI9C,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QAC1F;QACA;OACD;IACH,CAAA;AAEAjB,MAAE,4DAA4D,YAAA;AAG5D,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKyK,QAAQ;MAAQ,CAAA,CAAA;AACrD,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKyK,QAAQ;MAAQ,CAAA,CAAA;AACrD,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AAEpCsC,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEiH,SAAS;UAAC;UAAS;;MAAM,CAAA,GAAInH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QAC3F;QACA;OACD;AACDb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAEiH,SAAS;UAAC;UAAS;;MAAS,CAAA,GAAInH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAC7EjD,QAAQ;QAAC;QAAK;OAAI;IACtB,CAAA;AAEAjB,MAAE,gFAAgF,YAAA;AAGhF,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAUuG,WAAW;MAAO,CAAA,CAAA;AACzE,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAQuG,WAAW;MAAO,CAAA,CAAA;AAEvEpE,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAEgH,YAAY;UAAC;;QAAS/G,UAAU;UAAC;;MAAQ,CAAA,GAAIH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EACpFmD,QAAQ;QAAC;OAAI;AACfb,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAEgH,YAAY,CAAA;MAAG,CAAA,CAAA,EAAI7H,QAAQ,CAAA,CAAE;AAC3Db,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAEC,UAAU,CAAA;MAAG,CAAA,CAAA,EAAId,QAAQ,CAAA,CAAE;AACzDb,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAEiH,SAAS,CAAA;MAAG,CAAA,CAAA,EAAI9H,QAAQ,CAAA,CAAE;IAC1D,CAAA;AAEAjB,MAAE,8CAA8C,YAAA;AAC9C,UAAI,CAACR,kBAAmB;AAGxB,YAAMJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;;MAAO,CAAA,CAAA;AACnD,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;UAAW;;MAAS,CAAA,CAAA;AAChE,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;;MAAS,CAAA,CAAA;AAErDN,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEpB,MAAM;UAAC;UAAO;;MAAW,CAAA,GAAIkB,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QAC3F;QACA;OACD;AACDb,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAEpB,MAAM,CAAA;MAAG,CAAA,CAAA,EAAIO,QAAQ,CAAA,CAAE;IACvD,CAAA;AAEAjB,MAAE,2EAA2E,YAAA;AAG3E,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAEC,MAAM;QAAM;MAAE,CAAA,CAAA;AACvE,YAAM/D,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAEC,MAAM;QAAa;MAAE,CAAA,CAAA;AAC9E,YAAM/D,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAEC,MAAM;QAAO;MAAE,CAAA,CAAA;AACxE,YAAM/D,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAE8F,QAAQ;QAAI;MAAE,CAAA,CAAA;AAEvE,YAAMC,QAAQ,MAAM7J,MAAM0C,SAAS;QACjC4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMsF,QAAQ;cAAC;cAAO;;UAAc;;MACtE,CAAA;AACA9I,MAAAA,QAAO6I,MAAMrH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EAAEoG,KAAI,CAAA,EAAIjD,QAAQ;QAAC;QAAK;OAAI;AAGxD,YAAMkI,QAAQ,MAAM/J,MAAM0C,SAAS;QACjC4B,YAAY;UAAC;YAAEC,KAAK;YAAUC,IAAI;YAAMsF,QAAQ;cAAC;cAAK;;UAAQ;;MAChE,CAAA;AACA9I,MAAAA,QAAO+I,MAAMvH,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAI;AAG5Cb,MAAAA,QAAO,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMsF,QAAQ,CAAA;UAAG;;MAAG,CAAA,CAAA,EAAIjI,QACpF,CAAA,CAAE;AAEJb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMsF,QAAQ;cAAC;;UAAO;;MAAG,CAAA,GAAItH,IACnF,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAEbmD,QAAQ;QAAC;OAAI;IACjB,CAAA;AAIAjB,MACE,oFACA,YAAA;AACE,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,YAAMhK,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAO,CAAA,CAAA;AACvD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAO,CAAA,CAAA;AACvD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAS,CAAA,CAAA;AAEzDpE,MAAAA,QAAO,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAY,GAAG,CAAC,CAAA,CAAA,EAAIpI,QAAQ;QACrE;UAAE4C,OAAO;UAAQ8E,OAAO;QAAE;QAC1B;UAAE9E,OAAO;UAAU8E,OAAO;QAAE;OAC7B;IACH,CAAA;AAGF3I,MAAE,oEAAoE,YAAA;AACpE,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,YAAMhK,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKyK,QAAQ;MAAQ,CAAA,CAAA;AACrD,YAAMnJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AAEpC,YAAMoL,SAAS,MAAM9J,MAAMgK,eAAe;QAAEC,OAAO;MAAS,GAAG,CAAC,CAAA;AAChEjJ,MAAAA,QAAO8I,MAAAA,EAAQR,eAAe;QAAE7E,OAAO;QAAS8E,OAAO;MAAE,CAAA;AACzDvI,MAAAA,QAAO8I,MAAAA,EAAQR,eAAe;QAAE7E,OAAO;QAAM8E,OAAO;MAAE,CAAA;IACxD,CAAA;AAEA3I,MAAE,8DAA8D,YAAA;AAG9D,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,UAAI,CAAC5J,kBAAmB;AACxB,YAAMJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;QAAQ9D,MAAM;UAAC;;MAAO,CAAA,CAAA;AACtE,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;QAAU9D,MAAM;UAAC;;MAAW,CAAA,CAAA;AAE5EN,MAAAA,QAAO,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAM,GAAG;QAAE7E,WAAW;MAAO,CAAA,CAAA,EAAIvD,QAAQ;QAClF;UAAE4C,OAAO;UAAO8E,OAAO;QAAE;OAC1B;IACH,CAAA;AAEA3I,MAAE,gEAAgE,YAAA;AAChE,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,YAAMhK,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;;QAAQwC,kBAAkB;UAAEC,MAAM;QAAM;MAAE,CAAA,CAAA;AACtF,YAAM/D,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;UAAO;;QAAYwC,kBAAkB;UAAEC,MAAM;QAAO;MAAE,CAAA,CAAA;AAG9E/C,MAAAA,QAAO,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAM,GAAG,CAAC,CAAA,CAAA,EAAIpI,QAAQ;QAC/D;UAAE4C,OAAO;UAAO8E,OAAO;QAAE;QACzB;UAAE9E,OAAO;UAAW8E,OAAO;QAAE;OAC9B;AACDvI,MAAAA,QAAO,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAe,GAAG,CAAC,CAAA,CAAA,EAAIpI,QAAQ;QACxE;UAAE4C,OAAO;UAAQ8E,OAAO;QAAE;OAC3B;AACDvI,MAAAA,SACG,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;QAAkB1F,KAAK;MAAO,GAAG,CAAC,CAAA,GACpE/B,IAAI,CAACK,MAAMA,EAAE4B,KAAK,EAClBK,KAAI,CAAA,EACPjD,QAAQ;QAAC;QAAQ;OAAM;IAC3B,CAAA;AAEAjB,MAAE,iDAAiD,YAAA;AAIjD,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,YAAMhK,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAY,CAAA,CAAA;AAC5D,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAe,CAAA,CAAA;AAC/D,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAS,CAAA,CAAA;AACzD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAS,CAAA,CAAA;AAEzD,YAAMwD,UAAU,MAAM5I,MAAMgK,eAAe;QAAEC,OAAO;MAAY,GAAG,CAAC,GAAG;QAAEC,QAAQ;MAAO,CAAA;AACxFlJ,MAAAA,QAAO4H,QAAQpG,IAAI,CAACyF,QAAQA,IAAIxD,KAAK,EAAEK,KAAI,CAAA,EAAIjD,QAAQ;QAAC;QAAa;OAAe;AAIpFb,MAAAA,SACG,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAY,GAAG,CAAC,GAAG;QAAE7I,OAAO;MAAE,CAAA,GAAIoB,IAAI,CAACK,MAAMA,EAAE4B,KAAK,CAAA,EACzF5C,QAAQ;QAAC;OAAS;AACpBb,MAAAA,SAEI,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAY,GAAG,CAAC,GAAG;QAAE7I,OAAO;QAAG8I,QAAQ;MAAU,CAAA,GACrF1H,IAAI,CAACK,MAAMA,EAAE4B,KAAK,CAAA,EACpB5C,QAAQ;QAAC;OAAe;IAC5B,CAAA;AAEAjB,MAAE,kEAAkE,YAAA;AAGlE,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,YAAMhK,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAM,CAAA,CAAA;AACtD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAM,CAAA,CAAA;AACtD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAM,CAAA,CAAA;AACtD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAM,CAAA,CAAA;AACtD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAM,CAAA,CAAA;AACtD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAQ,CAAA,CAAA;AAExD,YAAMmC,QAAQ,MAAMvH,MAAMgK,eAAe;QAAEC,OAAO;MAAY,GAAG,CAAC,GAAG;QAAE7I,OAAO;MAAE,CAAA;AAChF,YAAM+I,SAAS,MAAMnK,MAAMgK,eACzB;QAAEC,OAAO;MAAY,GACrB,CAAC,GACD;QAAE7I,OAAO;QAAG6B,QAAQ;MAAE,CAAA;AAGxBjC,MAAAA,QAAOuG,KAAAA,EAAO1F,QAAQ;QACpB;UAAE4C,OAAO;UAAO8E,OAAO;QAAE;QACzB;UAAE9E,OAAO;UAAO8E,OAAO;QAAE;OAC1B;AACDvI,MAAAA,QAAOmJ,MAAAA,EAAQtI,QAAQ;QAAC;UAAE4C,OAAO;UAAS8E,OAAO;QAAE;OAAE;AAErDvI,MAAAA,QAAO,IAAIoJ,IAAI;WAAI7C;WAAU4C;QAAQ3H,IAAI,CAACK,MAAMA,EAAE4B,KAAK,CAAA,EAAG4F,IAAI,EAAE9I,KAAK,CAAA;IACvE,CAAA;AAEAX,MAAE,0EAA0E,YAAA;AAC1E,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,UAAI,CAAC5J,kBAAmB;AACxB,YAAMJ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;UAAY;;MAAO,CAAA,CAAA;AAC/D,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;UAAY;;MAAO,CAAA,CAAA;AAC/D,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK4C,MAAM;UAAC;;MAAO,CAAA,CAAA;AAEnDN,MAAAA,SACG,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAM,GAAG,CAAC,GAAG;QAAEC,QAAQ;MAAQ,CAAA,GACjE1H,IAAI,CAACK,MAAMA,EAAE4B,KAAK,EAClBK,KAAI,CAAA,EACPjD,QAAQ;QAAC;QAAY;OAAW;AAClCb,MAAAA,QAAO,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAM,GAAG,CAAC,GAAG;QAAE7I,OAAO;MAAE,CAAA,CAAA,EAAIS,QAAQ;QAC7E;UAAE4C,OAAO;UAAO8E,OAAO;QAAE;OAC1B;IACH,CAAA;AAEA3I,MAAE,8DAA8D,YAAA;AAG9D,UAAI,CAACZ,MAAMgK,eAAgB;AAC3B,YAAMhK,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAO,CAAA,CAAA;AACvD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAO,CAAA,CAAA;AACvD,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAK0G,WAAW;MAAS,CAAA,CAAA;AAEzDpE,MAAAA,QAAO,MAAMhB,MAAMgK,eAAe;QAAEC,OAAO;MAAY,GAAG,CAAC,GAAG;QAAE7I,OAAO;MAAE,CAAA,CAAA,EAAIS,QAAQ;QACnF;UAAE4C,OAAO;UAAQ8E,OAAO;QAAE;OAC3B;IACH,CAAA;AAEA3I,MAAE,sEAAsE,YAAA;AACtEI,MAAAA,QAAO,OAAOhB,MAAMsK,SAAS,EAAE/I,KAAK,UAAA;AACpC,YAAMvB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAMG,QAAQ;QAAWuG,WAAW;QAAK9D,MAAM;UAAC;;MAAK,CAAA,CAAA;AACrF,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAMG,QAAQ;QAAWuG,WAAW;MAAI,CAAA,CAAA;AACxE,YAAMpF,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAMG,QAAQ;QAAauG,WAAW;QAAK9D,MAAM;UAAC;;MAAK,CAAA,CAAA;AACvF,YAAMtB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAMG,QAAQ;QAAWuG,WAAW;QAAK9D,MAAM;UAAC;;MAAK,CAAA,CAAA;AAErFN,MAAAA,QAAO,MAAMhB,MAAMsK,YAAY,CAAC,CAAA,CAAA,EAAI/I,KAAK,CAAA;AACzCP,MAAAA,QAAO,MAAMhB,MAAMsK,YAAY;QAAElF,WAAW;MAAI,CAAA,CAAA,EAAI7D,KAAK,CAAA;AACzDP,MAAAA,QAAO,MAAMhB,MAAMsK,YAAY;QAAElF,WAAW;QAAKzC,UAAU;UAAC;UAAW;;MAAW,CAAA,CAAA,EAAIpB,KAAK,CAAA;AAC3FP,MAAAA,QAAO,MAAMhB,MAAMsK,YAAY;QAAE3H,UAAU,CAAA;MAAG,CAAA,CAAA,EAAIpB,KAAK,CAAA;AACvD,UAAInB,mBAAmB;AACrBY,QAAAA,QAAO,MAAMhB,MAAMsK,YAAY;UAAE/H,KAAK;UAAKI,UAAU;YAAC;YAAW;;QAAW,CAAA,CAAA,EAAIpB,KAAK,CAAA;MACvF;IACF,CAAA;AAEAX,MACE,2FACA,YAAA;AACE,UAAI,CAACR,kBAAmB;AACxB,YAAMoF,SAAS,IAAIC,gBAAe;QAAEzF;MAAM,CAAA;AAC1CwF,aAAOE,SAAS,UAAU,KAAK,OAAOlF,QAAQA,IAAImF,cAAc,OAAA,CAAA;AAChE,YAAM4E,QAAQ;QACZhG,KAAK;QACLnD,OAAO;QACPoJ,eAAe;UAAC;UAAoB;UAAoB;;MAC1D;AAEA,YAAMhF,OAAOK,MAAM,UAAU,CAAC,GAAG,MAAM;QAAE4E,aAAaF;MAAM,CAAA;AAC5DvJ,MAAAA,SAAQ,MAAMwE,OAAOM,WAAW,MAAM;QAAEC,WAAW;MAAO,CAAA,GAAIlH,MAAM,EAAE0C,KAAK,WAAA;AAC3E,YAAMP,QAAOwE,OAAOK,MAAM,UAAU,CAAC,GAAG,MAAM;QAAE4E,aAAaF;MAAM,CAAA,CAAA,EAAItE,QAAQC,QAC7E,mBAAA;AAEFlF,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAO4B,SAAQ;AAEzC,YAAMgC,OAAOK,MAAM,UAAU,CAAC,GAAG,MAAM;QAAE4E,aAAa;UAAE,GAAGF;UAAOhG,KAAK;QAAW;MAAE,CAAA;AAEpFvD,MAAAA,SAAQ,MAAMwE,OAAOM,WAAW,MAAM;QAAEC,WAAW;MAAO,CAAA,GAAIlH,MAAM,EAAE0C,KAAK,WAAA;AAE3E,YAAMiE,OAAOkF,OAAO,IAAA;AACpB1J,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,IAAA,IAAQ/C,MAAAA,EAAQ0C,KAAK,WAAA;AAChD,YAAMiE,OAAOK,MAAM,UAAU,CAAC,GAAG,MAAM;QAAE4E,aAAaF;MAAM,CAAA;AAC5DvJ,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,IAAA,CAAA,EAAOI,IAAIwB,SAAQ;AAE7C,iBAAW9E,MAAM;QAAC;QAAM;QAAO,OAAM8G,OAAOM,WAAWpH,IAAI;QAAEqH,WAAW;MAAO,CAAA;AAC/E,YAAMP,OAAOmF,MAAK;IACpB,CAAA;AAKF,UAAMC,WAAW,wBAACnM,OAAgC,CAAC,OAAuB;MACxEC,IAAI;MACJ0G,WAAW;MACXzG,UAAU;MACVkM,QAAQ;MACRC,YAAYzM,MAAM;MAClBiD,MAAM;QAAC;;MACPyJ,MAAM;QAAEC,GAAG;QAAGC,MAAM;QAAanM,OAAO;UAAEoM,QAAQ;UAAMC,MAAM;YAAC;YAAG;cAAEC,GAAG;YAAK;;QAAG;MAAE;MACjFC,OAAO;QAAEC,QAAQjN,MAAM;MAAO;MAC9BW,WAAWb;MACXc,WAAWd;MACX,GAAGM;IACL,IAZiB;AAcjBmC,MAAE,sDAAsD,YAAA;AACtDI,MAAAA,QAAO,OAAOhB,MAAMuL,YAAY,EAAEhK,KAAK,UAAA;AACvC,YAAMvB,MAAMuL,eAAeX,SAAAA,CAAAA;AAC3B,YAAMrH,SAAS,MAAMvD,MAAMwL,cAAc,IAAA;AACzCxK,MAAAA,QAAOuC,MAAAA,EAAQzB,cAAc;QAC3BpD,IAAI;QACJ0G,WAAW;QACXzG,UAAU;QACVkM,QAAQ;QACRC,YAAYzM,MAAM;QAClBiD,MAAM;UAAC;;QACPyJ,MAAM;UAAEC,GAAG;UAAGC,MAAM;UAAanM,OAAO;YAAEoM,QAAQ;YAAMC,MAAM;cAAC;cAAG;gBAAEC,GAAG;cAAK;;UAAG;QAAE;QACjFC,OAAO;UAAEC,QAAQjN,MAAM;QAAO;MAChC,CAAA;AACA2C,MAAAA,QAAOuC,QAAQvE,UAAUkE,QAAAA,CAAAA,EAAW3B,KAAKpD,GAAG+E,QAAO,CAAA;AAGnD,YAAMlD,MAAMuL,eACVX,SAAS;QAAEjM,UAAU;QAAWmM,YAAY;QAAMxJ,MAAMb;MAAU,CAAA,CAAA;AAEpE,YAAMgL,WAAW,MAAMzL,MAAMwL,cAAc,IAAA;AAC3CxK,MAAAA,QAAOyK,UAAU9M,QAAAA,EAAU4C,KAAK,SAAA;AAChCP,MAAAA,QAAOyK,UAAUX,UAAAA,EAAYtH,SAAQ;AACrCxC,MAAAA,QAAOyK,UAAUnK,QAAQ,CAAA,CAAE,EAAEO,QAAQ,CAAA,CAAE;AAEvCb,MAAAA,QAAO,MAAMhB,MAAMwL,cAAc,MAAA,CAAA,EAAShI,SAAQ;AAClDxC,MAAAA,QAAO,MAAMhB,MAAM0L,iBAAiB,IAAA,CAAA,EAAOnK,KAAK,IAAA;AAChDP,MAAAA,QAAO,MAAMhB,MAAM0L,iBAAiB,IAAA,CAAA,EAAOnK,KAAK,KAAA;AAChDP,MAAAA,QAAO,MAAMhB,MAAMwL,cAAc,IAAA,CAAA,EAAOhI,SAAQ;IAClD,CAAA;AAEA5C,MAAE,8DAA8D,YAAA;AAC9D,YAAMZ,MAAMuL,eAAeX,SAAAA,CAAAA;AAC3B5J,MAAAA,QAAO,MAAMhB,MAAM2L,iBAAiB,MAAM;QAAEd,QAAQ;MAAK,CAAA,CAAA,EAAItJ,KAAK,IAAA;AAClEP,MAAAA,SAAQ,MAAMhB,MAAMwL,cAAc,IAAA,IAAQX,MAAAA,EAAQtJ,KAAK,IAAA;AAGvD,YAAMqK,OAAO;QAAEd,YAAYzM,MAAM;QAASgN,OAAO;UAAEC,QAAQjN,MAAM;UAASwN,OAAO;QAAE;MAAE;AACrF7K,MAAAA,QAAO,MAAMhB,MAAM2L,iBAAiB,MAAMC,MAAMvN,MAAM,GAAA,CAAA,EAASkD,KAAK,IAAA;AACpEP,MAAAA,QAAO,MAAMhB,MAAM2L,iBAAiB,MAAMC,MAAMvN,MAAM,GAAA,CAAA,EAASkD,KAAK,KAAA;AACpE,YAAM8F,QAAQ,MAAMrH,MAAMwL,cAAc,IAAA;AACxCxK,MAAAA,QAAOqG,OAAOyD,UAAAA,EAAYvJ,KAAKlD,MAAM,IAAA;AACrC2C,MAAAA,QAAOqG,OAAOgE,KAAAA,EAAOxJ,QAAQ;QAAEyJ,QAAQjN,MAAM;QAASwN,OAAO;MAAE,CAAA;AAG/D,YAAM7L,MAAM2L,iBAAiB,MAAM;QAAEb,YAAY;MAAK,CAAA;AACtD9J,MAAAA,QAAO,MAAMhB,MAAM2L,iBAAiB,MAAM;QAAEb,YAAYzM;MAAI,GAAGA,MAAM,CAAA,CAAA,EAAIkD,KAAK,KAAA;AAC9EP,MAAAA,QAAO,MAAMhB,MAAM2L,iBAAiB,MAAM;QAAEb,YAAYzM;MAAI,GAAG,IAAA,CAAA,EAAOkD,KAAK,IAAA;AAC3EP,MAAAA,QAAO,MAAMhB,MAAM2L,iBAAiB,SAAS;QAAEd,QAAQ;MAAK,CAAA,CAAA,EAAItJ,KAAK,KAAA;IACvE,CAAA;AAEAX,MAAE,yEAAyE,YAAA;AACzE,YAAMZ,MAAMuL,eAAeX,SAAS;QAAElM,IAAI;QAAKoM,YAAYzM,MAAM;MAAG,CAAA,CAAA;AACpE,YAAM2B,MAAMuL,eAAeX,SAAS;QAAElM,IAAI;QAAKoM,YAAYzM,MAAM;QAAI+G,WAAW;MAAI,CAAA,CAAA;AACpF,YAAMpF,MAAMuL,eAAeX,SAAS;QAAElM,IAAI;QAAKoM,YAAYzM,MAAM;QAAIwM,QAAQ;MAAK,CAAA,CAAA;AAClF,YAAM7K,MAAMuL,eAAeX,SAAS;QAAElM,IAAI;QAAKoM,YAAYzM,MAAM;QAAIM,UAAU;MAAQ,CAAA,CAAA;AACvF,YAAMqB,MAAMuL,eAAeX,SAAS;QAAElM,IAAI;QAAKoM,YAAY;QAAMxJ,MAAM;UAAC;;MAAY,CAAA,CAAA;AACpF,YAAM6B,OAAM,8BAAO2I,OACf,MAAM9L,MAAM+L,gBAAgBD,CAAAA,KAAO,CAAA,GAAItJ,IAAI,CAACK,MAAMA,EAAEnE,EAAE,GAD9C;AAIZsC,MAAAA,QAAO,MAAMmC,KAAI,CAAC,CAAA,CAAA,EAAItB,QAAQ;QAAC;QAAK;QAAK;QAAK;QAAK;OAAI;AACvDb,MAAAA,QAAO,MAAMmC,KAAI;QAAE6I,OAAO3N;MAAI,CAAA,CAAA,EAAIwD,QAAQ;QAAC;QAAK;OAAI;AACpDb,MAAAA,QAAO,MAAMmC,KAAI;QAAE6I,OAAO3N;QAAK+G,WAAW;MAAU,CAAA,CAAA,EAAIvD,QAAQ;QAAC;OAAI;AACrEb,MAAAA,QAAO,MAAMmC,KAAI;QAAE6I,OAAO3N;QAAK+C,OAAO;MAAE,CAAA,CAAA,EAAIS,QAAQ;QAAC;OAAI;AACzDb,MAAAA,QAAO,MAAMmC,KAAI;QAAExE,UAAU;MAAQ,CAAA,CAAA,EAAIkD,QAAQ;QAAC;OAAI;AACtDb,MAAAA,QAAO,MAAMmC,KAAI;QAAE0H,QAAQ;MAAK,CAAA,CAAA,EAAIhJ,QAAQ;QAAC;OAAI;AACjD,UAAIzB,kBAAmBY,CAAAA,QAAO,MAAMmC,KAAI;QAAEZ,KAAK;MAAW,CAAA,CAAA,EAAIV,QAAQ;QAAC;OAAI;AAC3Eb,MAAAA,QAAO,MAAMmC,KAAI;QAAE/B,OAAO;QAAG6B,QAAQ;MAAE,CAAA,CAAA,EAAIpB,QAAQ;QAAC;QAAK;OAAI;IAC/D,CAAA;AAEAjB,MAAE,gEAAgE,YAAA;AAChE,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAOM,WAAW,oBAAIZ,KAAK,0BAAA;MAA4B,CAAA,CAAA;AACvF,YAAM4B,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAOM,WAAW,oBAAIZ,KAAK,0BAAA;MAA4B,CAAA,CAAA;AACvF,YAAM4B,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAOM,WAAW,oBAAIZ,KAAK,0BAAA;MAA4B,CAAA,CAAA;AAEvF4C,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS,CAAC,CAAA,GAAIF,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;QAAO;QAAO;OAAM;AACjFb,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEtB,OAAO;MAAE,CAAA,GAAIoB,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;QAAO;OAAM;AACpFb,MAAAA,SAAQ,MAAMhB,MAAM0C,SAAS;QAAEtB,OAAO;QAAG6B,QAAQ;MAAE,CAAA,GAAIT,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAC/E;QACA;OACD;IACH,CAAA;AAIAjB,MAAE,+EAA+E,YAAA;AAC/E,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAE8F,QAAQ;UAAI7F,MAAM;QAAO;MAAE,CAAA,CAAA;AACpF,YAAM/D,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAE8F,QAAQ;UAAK7F,MAAM;QAAM;MAAE,CAAA,CAAA;AACpF,YAAM/D,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAE8F,QAAQ;UAAK7F,MAAM;QAAM;MAAE,CAAA,CAAA;AAEpF/C,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,GAAA,IAAOkC,gBAAAA,EAAkBjC,QAAQ;QAAE+H,QAAQ;QAAK7F,MAAM;MAAM,CAAA;AAGvF/C,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAUC,IAAI;YAAOC,OAAO;UAAI;;MAAG,CAAA,GAC5EjC,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EACfoG,KAAI,CAAA,EACPjD,QAAQ;QAAC;QAAK;OAAI;AAEpBb,MAAAA,SAEI,MAAMhB,MAAM0C,SAAS;QACnB4B,YAAY;UACV;YAAEC,KAAK;YAAQC,IAAI;YAAMC,OAAO;UAAM;UACtC;YAAEF,KAAK;YAAUC,IAAI;YAAMC,OAAO;UAAI;;MAE1C,CAAA,GACAjC,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EACjBmD,QAAQ;QAAC;OAAI;AAEfb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMC,OAAO;UAAO;;MAAG,CAAA,GAC5EjC,IAAI,CAACK,MAAMA,EAAEnE,EAAE,EACfoG,KAAI,CAAA,EACPjD,QAAQ;QAAC;QAAK;OAAI;IACtB,CAAA;AAEAjB,MAAE,+CAA+C,YAAA;AAC/C,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAEmI,KAAK;QAAK;MAAE,CAAA,CAAA;AACrE,YAAMjM,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAEmI,KAAK;QAAM;MAAE,CAAA,CAAA;AACtE,YAAMjM,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAEoI,OAAO;QAAE;MAAE,CAAA,CAAA;AAEpElL,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAOC,IAAI;YAAMC,OAAO;UAAK;;MAAG,CAAA,GAAIjC,IAC9E,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAEbmD,QAAQ;QAAC;OAAI;AAEfb,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAOC,IAAI;YAAMC,OAAO;UAAK;;MAAG,CAAA,GAAIjC,IAC9E,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAEbmD,QAAQ;QAAC;OAAI;IACjB,CAAA;AAEAjB,MAAE,2DAA2D,YAAA;AAC3D,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAE8F,QAAQ;QAAI;MAAE,CAAA,CAAA;AACvE,iBAAWpF,MAAM;QAAC;QAAM;QAAM;QAAM;QAAO;QAAM;SAAiB;AAChExD,QAAAA,QACE,MAAMhB,MAAM0C,SAAS;UAAE4B,YAAY;YAAC;cAAEC,KAAK;cAAWC;cAAIC,OAAO;YAAE;;QAAG,CAAA,CAAA,EACtE1B,aAAa,CAAA;MACjB;IACF,CAAA;AAEAnC,MACE,mFACA,YAAA;AACE,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKoF,kBAAkB;UAAEC,MAAM;UAAQ6F,QAAQ;QAAG;MAAE,CAAA,CAAA;AACpF5I,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMC,OAAO;UAAO;;MAAG,CAAA,GAAIjC,IACjF,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAEbmD,QAAQ;QAAC;OAAI;AAEf,YAAM7B,MAAMwB,UAAU,KAAK;QAAEsC,kBAAkB;UAAEC,MAAM;QAAM;MAAE,CAAA;AAC/D/C,MAAAA,SACG,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMC,OAAO;UAAM;;MAAG,CAAA,GAAIjC,IAChF,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAEbmD,QAAQ;QAAC;OAAI;AAEfb,MAAAA,QACE,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAQC,IAAI;YAAMC,OAAO;UAAO;;MAAG,CAAA,CAAA,EAC9E1B,aAAa,CAAA;AACf/B,MAAAA,QACE,MAAMhB,MAAM0C,SAAS;QAAE4B,YAAY;UAAC;YAAEC,KAAK;YAAUC,IAAI;YAAMC,OAAO;UAAG;;MAAG,CAAA,CAAA,EAC5E1B,aAAa,CAAA;IACjB,CAAA;AAGFnC,MAAE,6EAA6E,YAAA;AAC7E,YAAMZ,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAWiF,kBAAkB;UAAE8F,QAAQ;QAAI;MAAE,CAAA,CAAA;AAC1F,YAAM5J,MAAMqB,UACV7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAaiF,kBAAkB;UAAE8F,QAAQ;QAAI;MAAE,CAAA,CAAA;AAExE,YAAM5J,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;QAAKG,QAAQ;QAAWiF,kBAAkB;UAAE8F,QAAQ;QAAG;MAAE,CAAA,CAAA;AAEzF,YAAMuC,MAAM,MAAMnM,MAAM0C,SAAS;QAC/B7D,QAAQ;QACRyF,YAAY;UAAC;YAAEC,KAAK;YAAUC,IAAI;YAAOC,OAAO;UAAI;;QACpDrD,OAAO;MACT,CAAA;AACAJ,MAAAA,QAAOmL,IAAI3J,IAAI,CAACK,MAAMA,EAAEnE,EAAE,CAAA,EAAGmD,QAAQ;QAAC;OAAI;IAC5C,CAAA;AAIAjB,MAAE,iEAAiE,YAAA;AACjE,YAAMZ,MAAMiE,gBAAgB;QAAEC,OAAO;QAAa/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AACtE,YAAMY,MAAMiE,gBAAgB;QAAEC,OAAO;QAAa/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AACtE,YAAMY,MAAMiE,gBAAgB;QAAEC,OAAO;QAAW/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AAEpE4B,MAAAA,SAAQ,MAAMhB,MAAMqE,kBAAkB,UAAA,GAAa7B,IAAI,CAAC2F,MAAMA,EAAEjE,KAAK,EAAEY,KAAI,CAAA,EAAIjD,QAAQ;QACrF;QACA;OACD;AACDb,MAAAA,SAAQ,MAAMhB,MAAMoM,iBAAiB,WAAA,IAAehN,GAAAA,EAAKmC,KAAK,CAAA;AAE9DP,MAAAA,QAAO,MAAMhB,MAAMoM,iBAAiB,WAAA,CAAA,EAAc5I,SAAQ;IAC5D,CAAA;AAEA5C,MACE,iGACA,YAAA;AAGE,YAAMZ,MAAMiE,gBAAgB;QAC1BC,OAAO;QACP/E,OAAO;QACPC,KAAK;QACLiN,eAAe;MACjB,CAAA;AAEA,YAAMrM,MAAMiE,gBAAgB;QAAEC,OAAO;QAAmB/E,OAAO;QAAKC,KAAK;MAAE,CAAA;AAE3E,YAAMkN,SAAS,MAAMtM,MAAMqE,kBAAkB,QAAA;AAC7CrD,MAAAA,QAAOsL,OAAOC,KAAK,CAACpE,MAAMA,EAAEjE,UAAU,iBAAA,GAAoBmI,aAAAA,EAAe9K,KAAK,UAAA;AAC9EP,MAAAA,QAAOsL,OAAOC,KAAK,CAACpE,MAAMA,EAAEjE,UAAU,iBAAA,GAAoBmI,aAAAA,EAAetK,cAAa;AAEtFf,MAAAA,SAAQ,MAAMhB,MAAMoM,iBAAiB,iBAAA,IAAqBC,aAAAA,EAAe9K,KAAK,UAAA;AAC9EP,MAAAA,SAAQ,MAAMhB,MAAMoM,iBAAiB,iBAAA,IAAqBC,aAAAA,EAAetK,cAAa;IACxF,CAAA;AAGFnB,MAAE,iFAAiF,YAAA;AACjFI,MAAAA,QAAOhB,MAAMwM,kBAAkB,EAAEtL,WAAW,UAAA;AAC5C,YAAMlB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AACpC,YAAM+N,QAAQ,wBAACrJ,GAAWvE,YAAsC;QAC9D6N,QAAQ;UAAExI,OAAO,iBAAiBd,CAAAA;UAAKjE,OAAO;UAAKC,KAAKgE;UAAGiJ,eAAe;QAAQ;QAClFnN,YAAYA,WAAW;UACrBC,OAAO;UACPC,KAAKgE;UACL9D,QAAQ,KAAK8D,CAAAA;UACbpF,MAAM,wBAAwBoF,CAAAA;UAC9B/D,MAAM;UACNR;UACAwN,eAAe;QACjB,CAAA;MACF,IAXc;AAad,YAAMhJ,UAAUwE,MAAMC,KAAK;QAAEC,QAAQ;MAAI,GAAG,CAACC,GAAG5E,MAAMqJ,MAAMrJ,GAAG,SAAA,CAAA;AAC/D,YAAMpD,MAAMwM,qBAAqBnJ,OAAAA;AAEjC,YAAMsJ,UAAU,MAAM3M,MAAMqE,kBAAkB,gBAAA;AAC9CrD,MAAAA,QAAO2L,OAAAA,EAAS5J,aAAa,GAAA;AAC7B/B,MAAAA,QAAO2L,QAAQJ,KAAK,CAACpE,MAAMA,EAAEjE,UAAU,iBAAA,CAAA,EAAoBrC,QAAQwB,QAAQ,CAAA,GAAIqJ,MAAAA;AAC/E,YAAME,MAAM,MAAM5M,MAAMoE,gBAAgB,GAAA;AACxCpD,MAAAA,QAAO4L,GAAAA,EAAK7J,aAAa,GAAA;AACzB/B,MAAAA,QAAO4L,IAAI,CAAA,CAAE,EAAE9K,cAAc;QAAE9D,MAAM;QAA0Ba,QAAQ;MAAU,CAAA;AACjFmC,MAAAA,QAAO4L,IAAI,CAAA,GAAIP,aAAAA,EAAe9K,KAAK,OAAA;AAEnC,YAAMvB,MAAMwM,qBAAqB;QAACC,MAAM,GAAG,WAAA;OAAa;AACxDzL,MAAAA,SAAQ,MAAMhB,MAAMoH,cAAc,KAAK,CAAA,IAAKvI,MAAAA,EAAQ0C,KAAK,WAAA;AACzDP,MAAAA,QAAO,MAAMhB,MAAMoE,gBAAgB,GAAA,CAAA,EAAMrB,aAAa,GAAA;AACtD,YAAM/B,QAAOhB,MAAMwM,qBAAqB,CAAA,CAAE,CAAA,EAAG9H,SAAS3C,cAAa;IACrE,CAAA;AAEAnB,MAAE,2EAA2E,YAAA;AAC3EI,MAAAA,QAAOhB,MAAM6M,kBAAkB,EAAE3L,WAAW,UAAA;AAC5C,YAAMlB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAI,CAAA,CAAA;AACpC,YAAMsB,MAAMqB,UAAU7C,IAAI;QAAEE,IAAI;MAAQ,CAAA,CAAA;AACxC,eAASU,MAAM,GAAGA,MAAM,IAAIA,OAAO,GAAG;AACpC,cAAMY,MAAMgE,eAAe9E,WAAW;UAAEC,OAAO;UAAKC;UAAKE,QAAQ,KAAKF,GAAAA;QAAM,CAAA,CAAA;MAC9E;AACA,YAAMY,MAAMgE,eAAe9E,WAAW;QAAEC,OAAO;QAASC,KAAK;QAAGE,QAAQ;MAAU,CAAA,CAAA;AAClF,YAAMwN,OAAO5N,WAAW;QACtBC,OAAO;QACPC,KAAK;QACLE,QAAQ;QACRtB,MAAM;QACNqB,MAAM;QACNE,QAAQ;UAAEuI,MAAM;UAAGgC,QAAQ;YAAC;cAAErC,GAAG;YAAE;YAAG;YAAO;;QAAM;QACnD4E,eAAe;MACjB,CAAA;AAEA,YAAMrM,MAAM6M,qBAAqB,KAAK,GAAG,GAAGC,IAAAA;AAE5C,YAAMC,OAAO,MAAM/M,MAAMoE,gBAAgB,GAAA;AACzCpD,MAAAA,QAAO+L,KAAKvK,IAAI,CAACwK,QAAOA,IAAG5N,GAAG,CAAA,EAAGyC,QAAQ;QAAC;QAAG;QAAG;QAAG;QAAG;OAAE;AACxDb,MAAAA,QAAO+L,KAAK,CAAA,CAAE,EAAEjL,cAAc;QAAE9D,MAAM;QAAgBqO,eAAe;MAAQ,CAAA;AAC7ErL,MAAAA,QAAO+L,KAAK,CAAA,GAAIxN,MAAAA,EAAQsC,QAAQ;QAAEiG,MAAM;QAAGgC,QAAQ;UAAC;YAAErC,GAAG;UAAE;UAAG;UAAO;;MAAM,CAAA;AAC3EzG,MAAAA,QAAO,MAAMhB,MAAMoE,gBAAgB,OAAA,CAAA,EAAUrB,aAAa,CAAA;IAC5D,CAAA;AAEAnC,MAAE,+DAA+D,YAAA;AAC/DI,MAAAA,QAAOhB,MAAMiN,sBAAsB,EAAE/L,WAAW,UAAA;AAChD,YAAMlB,MAAMiE,gBAAgB;QAC1BC,OAAO;QACP/E,OAAO;QACPC,KAAK;QACLiN,eAAe;MACjB,CAAA;AACA,YAAMrM,MAAMiE,gBAAgB;QAAEC,OAAO;QAAa/E,OAAO;QAAKC,KAAK;MAAE,CAAA;AACrE,YAAMY,MAAMiE,gBAAgB;QAAEC,OAAO;QAAa/E,OAAO;QAAKC,KAAK;MAAE,CAAA;AACrE,YAAMY,MAAMiE,gBAAgB;QAAEC,OAAO;QAAa/E,OAAO;QAAKC,KAAK;MAAE,CAAA;AAErE,YAAM8N,SAAS,8BAAO/J,UAClB,MAAMnD,MAAMiN,yBAAyB9J,IAAAA,KAAS,CAAA,GAAIX,IAAI,CAAC2F,MAAMA,EAAEjE,KAAK,EAAEY,KAAI,GAD/D;AAEf9D,MAAAA,QAAO,MAAMkM,OAAO;QAAC;QAAK;OAAI,CAAA,EAAGrL,QAAQ;QAAC;QAAa;QAAa;OAAkB;AACtFb,MAAAA,QAAO,MAAMkM,OAAO;QAAC;OAAU,CAAA,EAAGrL,QAAQ,CAAA,CAAE;AAC5Cb,MAAAA,QAAO,MAAMkM,OAAO,CAAA,CAAE,CAAA,EAAGrL,QAAQ,CAAA,CAAE;AACnCb,MAAAA,SAAQ,MAAMhB,MAAMiN,yBAAyB;QAAC;OAAI,IAAIV,KAAK,CAACpE,MAAMA,EAAE/I,QAAQ,CAAA,CAAA,EAAIyC,QAAQ;QACtFqC,OAAO;QACP/E,OAAO;QACPC,KAAK;QACLiN,eAAe;MACjB,CAAA;IACF,CAAA;AAEAzL,MAAE,yDAAyD,YAAA;AACzDI,MAAAA,QAAOhB,MAAMmN,eAAe,EAAEjM,WAAW,UAAA;AACzC,YAAMkM,MAAM,wBAACjO,OAAekO,WAAmBrN,MAAMmN,kBAAkBhO,OAAOkO,MAAAA,GAAlE;AACZ,YAAMrN,MAAMiE,gBAAgB;QAC1BC,OAAO;QACP/E,OAAO;QACPC,KAAK;QACLiN,eAAe;MACjB,CAAA;AAEA,YAAMrM,MAAMiE,gBAAgB;QAC1BC,OAAO;QACP/E,OAAO;QACPC,KAAK;MACP,CAAA;AAEA,YAAMY,MAAMiE,gBAAgB;QAAEC,OAAO;QAAqB/E,OAAO;QAAOC,KAAK;MAAE,CAAA;AAE/E4B,MAAAA,QAAO,MAAMoM,IAAI,OAAO,kBAAA,CAAA,EAAqB7L,KAAK,IAAA;AAClDP,MAAAA,QAAO,MAAMoM,IAAI,OAAO,kBAAA,CAAA,EAAqB7L,KAAK,KAAA;AAClDP,MAAAA,QAAO,MAAMoM,IAAI,SAAS,kBAAA,CAAA,EAAqB7L,KAAK,KAAA;AAEpDP,MAAAA,QAAO,MAAMoM,IAAI,OAAO,iBAAA,CAAA,EAAoB7L,KAAK,KAAA;AACjDP,MAAAA,QAAO,MAAMoM,IAAI,OAAO,kBAAA,CAAA,EAAqB7L,KAAK,KAAA;AAElD,YAAMvB,MAAMoM,iBAAiB,mBAAA;AAC7BpL,MAAAA,QAAO,MAAMoM,IAAI,OAAO,kBAAA,CAAA,EAAqB7L,KAAK,KAAA;IACpD,CAAA;AAEAX,MACE,8FACA,YAAA;AAIE,YAAMZ,MAAMiE,gBAAgB;QAAEC,OAAO;QAAa/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AACtE,YAAMY,MAAMiE,gBAAgB;QAAEC,OAAO;QAAa/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AACtE,YAAMY,MAAMsN,mBAAmB;QAAEpJ,OAAO;QAAa/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AACzE4B,MAAAA,SAAQ,MAAMhB,MAAMqE,kBAAkB,UAAA,GAAa7B,IAAI,CAAC2F,MAAMA,EAAEhJ,KAAK,CAAA,EAAG0C,QAAQ;QAAC;OAAK;AAGtF,YAAM7B,MAAMsN,mBAAmB;QAAEpJ,OAAO;QAAa/E,OAAO;QAAMC,KAAK;MAAI,CAAA;AAC3E4B,MAAAA,SAAQ,MAAMhB,MAAMqE,kBAAkB,UAAA,GAAa7B,IAAI,CAAC2F,MAAMA,EAAEhJ,KAAK,CAAA,EAAG0C,QAAQ;QAAC;OAAK;AAGtF,YAAM7B,MAAMsN,mBAAmB;QAAEpJ,OAAO;QAAa/E,OAAO;QAAMC,KAAK;MAAE,CAAA;AACzE4B,MAAAA,QAAO,MAAMhB,MAAMqE,kBAAkB,UAAA,CAAA,EAAaxC,QAAQ,CAAA,CAAE;AAG5D,YAAM7B,MAAMsN,mBAAmB;QAAEpJ,OAAO;QAAoB/E,OAAO;QAAMC,KAAK;MAAE,CAAA;IAClF,CAAA;AAGFwB,MAAE,iDAAiD,YAAA;AACjD,YAAMZ,MAAMuN,aAAa,OAAO;QAAE9F,GAAG;MAAE,CAAA;AACvC,YAAMzH,MAAMuN,aAAa,OAAO;QAAE9F,GAAG;MAAE,CAAA;AACvC,YAAMzH,MAAMuN,aAAa,SAAS;QAAE9F,GAAG;MAAE,CAAA;AAEzCzG,MAAAA,QAAO,MAAMhB,MAAMwN,mBAAmB,KAAA,CAAA,EAAQ3L,QAAQ;QAAE4L,SAAS;UAAEhG,GAAG;QAAE;MAAE,CAAA;AAC1EzG,MAAAA,QAAO,MAAMhB,MAAMwN,mBAAmB,KAAA,CAAA,EAAQ3L,QAAQ;QAAE4L,SAAS;UAAEhG,GAAG;QAAE;MAAE,CAAA;AAC1EzG,MAAAA,QAAO,MAAMhB,MAAMwN,mBAAmB,KAAA,CAAA,EAAQhK,SAAQ;AACtDxC,MAAAA,QAAO,MAAMhB,MAAMwN,mBAAmB,OAAA,CAAA,EAAU3L,QAAQ;QAAE4L,SAAS;UAAEhG,GAAG;QAAE;MAAE,CAAA;IAC9E,CAAA;AAEA7G,MAAE,2EAA2E,YAAA;AAC3E,YAAMZ,MAAM0N,YAAY;QACtB1P,MAAM;QACNyP,SAAS;UAAEhG,GAAG;QAAE;QAChB/I,IAAI;QACJiP,aAAa;MACf,CAAA;AACA,YAAM3N,MAAM0N,YAAY;QACtB1P,MAAM;QACNyP,SAAS;UAAEhG,GAAG;QAAE;QAChB/I,IAAI;QACJiP,aAAa;MACf,CAAA;AACA,YAAM3N,MAAM0N,YAAY;QACtB1P,MAAM;QACNyP,SAAS;UAAEhG,GAAG;QAAE;QAChB/I,IAAI;QACJiP,aAAa;MACf,CAAA;AAEA,YAAMrB,SAAS,MAAMtM,MAAM4N,mBAAmB,cAAc,EAAA;AAC5D5M,MAAAA,QAAOsL,OAAO9J,IAAI,CAACqL,MAAMA,EAAEJ,OAAO,CAAA,EAAG5L,QAAQ;QAAC;UAAE4F,GAAG;QAAE;QAAG;UAAEA,GAAG;QAAE;OAAE;AACjEzG,MAAAA,QAAOsL,OAAO9J,IAAI,CAACqL,MAAMA,EAAEnP,EAAE,CAAA,EAAGmD,QAAQ;QAAC;QAAM;OAAK;AACpDb,MAAAA,QAAOsL,OAAO,CAAA,GAAIqB,WAAAA,EAAapM,KAAK,GAAA;AAEpCP,MAAAA,QAAO,MAAMhB,MAAM4N,mBAAmB,cAAc,EAAA,CAAA,EAAK7K,aAAa,CAAA;AACtE/B,MAAAA,QAAO,MAAMhB,MAAM4N,mBAAmB,eAAe,EAAA,CAAA,EAAK/L,QAAQ;QAChE;UAAEnD,IAAI;UAAM+O,SAAS;YAAEhG,GAAG;UAAE;UAAGkG,aAAa;QAAG;OAChD;IACH,CAAA;AAEA/M,MAAE,sCAAsC,YAAA;AACtC,YAAMZ,MAAM0N,YAAY;QAAE1P,MAAM;QAAOyP,SAAS;QAAG/O,IAAI;QAAKiP,aAAa;MAAE,CAAA;AAC3E,YAAM3N,MAAM0N,YAAY;QAAE1P,MAAM;QAAOyP,SAAS;QAAG/O,IAAI;QAAKiP,aAAa;MAAE,CAAA;AAC3E,YAAM3N,MAAM0N,YAAY;QAAE1P,MAAM;QAAOyP,SAAS;QAAG/O,IAAI;QAAKiP,aAAa;MAAE,CAAA;AAE3E3M,MAAAA,QAAO,MAAMhB,MAAM4N,mBAAmB,OAAO,CAAA,CAAA,EAAI7K,aAAa,CAAA;IAChE,CAAA;AAEAnC,MACE,2GACA,YAAA;AACE,YAAMZ,MAAM0N,YAAY;QAAE1P,MAAM;QAAOyP,SAAS;UAAEjO,IAAI;QAAK;QAAGd,IAAI;QAAMiP,aAAa;MAAE,CAAA;AAEvF3M,MAAAA,QAAO,MAAMhB,MAAM8N,oBAAoB,IAAA,CAAA,EAAOvM,KAAK,IAAA;AACnDP,MAAAA,QAAO,MAAMhB,MAAM4N,mBAAmB,OAAO,EAAA,CAAA,EAAK/L,QAAQ,CAAA,CAAE;AAE5Db,MAAAA,QAAO,MAAMhB,MAAM8N,oBAAoB,IAAA,CAAA,EAAOvM,KAAK,KAAA;AACnDP,MAAAA,QAAO,MAAMhB,MAAM8N,oBAAoB,gBAAA,CAAA,EAAmBvM,KAAK,KAAA;IACjE,CAAA;AAKFX,MAAE,6EAA6E,YAAA;AAC7E,UAAI,CAACZ,MAAM+N,YAAa;AACxB,UAAI,CAAC5N,yBAA0B;AAC/B,YAAMH,MAAMqB,UAAU7C,IAAAA,CAAAA;AACtB,YAAMwP,SAAS,MAAMhO,MAAM+N,YAAY,OAAOE,OAAAA;AAC5C,cAAMA,GAAGjK,eAAe9E,WAAW;UAAEE,KAAK;UAAGpB,MAAM;UAAWuB,QAAQ;YAAE2O,MAAM;UAAK;QAAE,CAAA,CAAA;AACrF,eAAO;MACT,CAAA;AACAlN,MAAAA,QAAOgN,MAAAA,EAAQzM,KAAK,IAAA;AACpB,YAAMyL,MAAK,MAAMhN,MAAMoH,cAAc,MAAM,CAAA;AAC3CpG,MAAAA,QAAOgM,KAAIhP,IAAAA,EAAMuD,KAAK,SAAA;AACtBP,MAAAA,QAAOgM,KAAIzN,MAAAA,EAAQsC,QAAQ;QAAEqM,MAAM;MAAK,CAAA;IAC1C,CAAA;AAIAtN,MACE,mFACA,YAAA;AACE,YAAM4E,SAAS,IAAIC,gBAAe;QAAEzF;MAAM,CAAA;AAC1C,UAAImO,QAAQ;AACZ,UAAIC,YAAW;AACf5I,aAAOE,SAAS,MAAM,KAAK,OAAOlF,QAAAA;AAChC,cAAM6N,IAAI,MAAM7N,IAAI8N,UAAU,KAAK,YAAA;AACjCH,mBAAS;AACT,iBAAO;QACT,CAAA;AACA,cAAMI,IAAI,MAAM/N,IAAI8N,UAAU,KAAK,YAAA;AACjC,cAAIF,WAAU;AACZA,YAAAA,YAAW;AACX,kBAAM,IAAIvQ,MAAM,MAAA;UAClB;AACA,iBAAOwQ,IAAI;QACb,CAAA;AACA,eAAOE;MACT,CAAA;AACA,YAAM/I,OAAOK,MAAM,MAAM;QAAEuF,GAAG;MAAE,GAAG,MAAA;AACnCpK,MAAAA,SAAQ,MAAMwE,OAAOM,WAAW,MAAA,GAASjH,MAAM,EAAE0C,KAAK,QAAA;AACtD,YAAMiN,UAAU,MAAMhJ,OAAOiJ,OAAO,MAAA;AACpCzN,MAAAA,QAAOwN,QAAQ3P,MAAM,EAAE0C,KAAK,WAAA;AAC5BP,MAAAA,QAAOwN,QAAQjP,MAAM,EAAEgC,KAAK,EAAA;AAE5BP,MAAAA,QAAOmN,KAAAA,EAAO5M,KAAK,CAAA;IACrB,CAAA;AAGFX,MAAE,gFAAgF,YAAA;AAChF,YAAM4E,SAAS,IAAIC,gBAAe;QAAEzF;MAAM,CAAA;AAC1C,YAAM0O,MAAgB,CAAA;AACtBlJ,aAAOE,SAAS,OAAO,KAAK,YAAA;AAC1BgJ,YAAIC,KAAK,IAAA;AACT,eAAO;MACT,CAAA;AACAnJ,aAAOE,SAAS,OAAO,KAAK,YAAA;AAC1BgJ,YAAIC,KAAK,IAAA;AACT,eAAO;MACT,CAAA;AAEA,YAAMnJ,OAAOK,MAAM,OAAO,CAAC,GAAG,cAAc;QAAE+I,SAAS;MAAI,CAAA;AAC3D,YAAMC,SAAS,MAAMrJ,OAAOM,WAAW,cAAc;QAAEC,WAAW;MAAO,CAAA;AAKzE/E,MAAAA,QAAO6N,OAAOtP,MAAM,EAAEgC,KAAK,WAAA;AAC3BP,MAAAA,QAAO0N,GAAAA,EAAK7M,QAAQ;QAAC;OAAK;AAC1Bb,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,YAAA,IAAgBhD,eAAAA,EAAiB2C,KAAK,GAAA;AAGjE,YAAMiE,OAAOK,MAAM,OAAO,CAAC,GAAG,YAAA;AAC9B7E,MAAAA,SAAQ,MAAMwE,OAAOM,WAAW,cAAc;QAAEC,WAAW;MAAO,CAAA,GAAIxG,MAAM,EAAEgC,KAC5E,WAAA;AAIF,YAAMP,QAAOwE,OAAOK,MAAM,OAAO,CAAC,GAAG,aAAa;QAAE+I,SAAS;MAAI,CAAA,CAAA,EAAI3I,QAAQC,QAC3E,yBAAA;AAEFlF,MAAAA,QAAO,MAAMhB,MAAM4B,OAAO,WAAA,CAAA,EAAc4B,SAAQ;IAClD,CAAA;AAEA5C,MACE,yFACA,YAAA;AAGE,YAAM4E,SAAS,IAAIC,gBAAe;QAAEzF;QAAOoF,WAAW;MAAQ,CAAA;AAC9DI,aAAOE,SAAS,YAAY,KAAK,YAAYjF,QAAW;QAAEqO,kBAAkB;MAAK,CAAA;AACjF,YAAMC,MAAM;QAAEpQ,UAAU;QAAYyG,WAAW;QAASpG,WAAW,oBAAIZ,KAAK,GAAA;MAAM;AAClF,YAAM4B,MAAMqB,UAAU7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAcG,QAAQ;MAAU,CAAA,CAAA;AACxE,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAcG,QAAQ;MAAU,CAAA,CAAA;AACxE,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAgBG,QAAQ;MAAY,CAAA,CAAA;AAC5E,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAcG,QAAQ;MAAU,CAAA,CAAA;AACxE,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAiBG,QAAQ;MAAa,CAAA,CAAA;AAC9E,YAAMmB,MAAMqB,UAAU7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAWG,QAAQ;MAAY,CAAA,CAAA;AACvE,YAAMmB,MAAMqB,UACV7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAmBG,QAAQ;QAAWuG,WAAW;MAAO,CAAA,CAAA;AAE5E,YAAMpF,MAAMqB,UACV7C,IAAI;QAAE,GAAGuQ;QAAKrQ,IAAI;QAAqBG,QAAQ;QAAWF,UAAU;MAAa,CAAA,CAAA;AAGnF,YAAM6G,OAAOwJ,cAAc,MAAO,IAAA;AAElC,iBAAWtQ,MAAM;QAAC;QAAc;QAAc;QAAgB;SAAe;AAC3E,cAAMuQ,QAAQ,MAAMjP,MAAM4B,OAAOlD,EAAAA;AACjCsC,QAAAA,QAAOiO,OAAOpQ,QAAQH,EAAAA,EAAI6C,KAAK,WAAA;AAC/BP,QAAAA,QAAOiO,OAAO9I,OAAO+I,MAAMxQ,EAAAA,EAAI6C,KAAK,mBAAA;MACtC;AACAP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,eAAA,IAAmB/C,MAAAA,EAAQ0C,KAAK,YAAA;AAC3DP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,SAAA,IAAa/C,MAAAA,EAAQ0C,KAAK,WAAA;AACrDP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,iBAAA,IAAqB/C,MAAAA,EAAQ0C,KAAK,SAAA;AAC7DP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,mBAAA,IAAuB/C,MAAAA,EAAQ0C,KAAK,SAAA;IACjE,CAAA;AAGFX,MAAE,8EAAyE,YAAA;AACzE,YAAM4E,SAAS,IAAIC,gBAAe;QAAEzF;MAAM,CAAA;AAE1CwF,aAAOE,SAAS,gBAAgB,KAAK,OAAOlF,QAAQA,IAAImF,cAAc,OAAA,CAAA;AACtEH,aAAOE,SAAS,WAAW,KAAK,OAAOlF,QAAAA;AACrC,cAAMA,IAAIoF,WAAW,gBAAgB,CAAC,GAAG,KAAA;AACzC,eAAOpF,IAAImF,cAAc,OAAA;MAC3B,CAAA;AACAH,aAAOE,SACL,YACA,KACA,OAAOlF,QAAAA;AACL,cAAMA,IAAIoF,WAAW,WAAW,CAAC,GAAG,IAAA;AACpC,eAAOpF,IAAImF,cAAc,OAAA;MAC3B,GACA;QAAEmJ,kBAAkB;MAAK,CAAA;AAG3B,YAAMtJ,OAAOK,MAAM,YAAY,CAAC,GAAG,IAAA;AACnC,iBAAWnH,MAAM;QAAC;QAAM;QAAM;SAAQ;AACpCsC,QAAAA,SAAQ,MAAMwE,OAAOM,WAAWpH,IAAI;UAAEqH,WAAW;QAAO,CAAA,GAAIlH,MAAM,EAAE0C,KAAK,WAAA;MAC3E;AAEA,YAAMiE,OAAOwJ,cAAc5Q,KAAK+Q,IAAG,IAAK,IAAA;AAExC,YAAMC,SAAS,MAAMpP,MAAM4B,OAAO,IAAA;AAClCZ,MAAAA,QAAOoO,QAAQvQ,MAAAA,EAAQ0C,KAAK,WAAA;AAC5BP,MAAAA,QAAOoO,QAAQjJ,OAAO+I,IAAAA,EAAM3N,KAAK,mBAAA;AAEjCP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,IAAA,IAAQ/C,MAAAA,EAAQ0C,KAAK,WAAA;AAChDP,MAAAA,SAAQ,MAAMhB,MAAM4B,OAAO,KAAA,IAAS/C,MAAAA,EAAQ0C,KAAK,WAAA;IACnD,CAAA;EACF,CAAA;AACF;AAr/DgB1B;;;AEtGT,SAASwP,SACdC,OACAC,QAAe,IAAIC,MAAM,kBAAA,GAAmB;AAE5C,SAAOC,UAAU,GAAGH,OAAOC,KAAAA;AAC7B;AALgBF;AAQT,SAASI,UACdC,GACAJ,OACAC,QAAe,IAAIC,MAAM,kBAAA,GAAmB;AAE5C,MAAIG,QAAQ;AACZ,SAAO,YAAA;AACLA,aAAS;AACT,QAAIA,SAASD,EAAG,OAAMH;AACtB,WAAOD;EACT;AACF;AAXgBG;;;ACThB,SAASG,sBAAAA,qBAAoCC,kBAAAA,uBAAsB;AAQnE,IAAMC,iBAAiB;AAOvB,eAAeC,OAAOC,OAA2BC,OAAeC,YAAY,MAAM;AAChF,QAAMC,WAAWC,KAAKC,IAAG,IAAKH;AAC9B,SAAOE,KAAKC,IAAG,IAAKF,UAAU;AAC5B,UAAMG,OAAM,MAAMN,MAAMO,OAAON,KAAAA;AAC/B,QAAIK,QAAOA,KAAIE,WAAW,aAAaF,KAAIE,WAAW,aAAaF,KAAIE,WAAW,YAChF,QAAOF;AACT,UAAM,IAAIG,QAAQ,CAACC,MAAMC,WAAWD,GAAG,EAAA,CAAA;EACzC;AACA,QAAM,IAAIE,MAAM,OAAOX,KAAAA,0BAA+BC,SAAAA,IAAa;AACrE;AATeH;AAmBf,eAAsBc,2BACpBC,WACAC,WAAW,QAAM;AAEjB,MAAI;AAGF,UAAMf,QAAQ,IAAIgB,oBAAAA;AAClB,UAAMC,SAAS,IAAIC,gBAAe;MAAElB;MAAOc;IAAU,CAAA;AACrDG,WAAOE,SACL,WACA,KACA,OAAOC,SAAS,MAAMA,IAAIC,KAA0BvB,gBAAgB;MAAEwB,GAAG;IAAG,CAAA,GAAIC,OAAO;AAEzFN,WAAOE,SAAS,aAAa,KAAK,OAAOC,QAAQA,IAAIC,KAAKvB,gBAAgB;MAAEwB,GAAG;IAAE,CAAA,CAAA;AAGjFR,cAAUU,OAAO1B,gBAAgB,OAAO2B,WAAW;MACjDF,SAAUE,MAAwBH,IAAI;IACxC,EAAA;AACA,UAAML,OAAOS,MAAM,WAAW,CAAC,GAAG,GAAGX,QAAAA,KAAa;AAClD,UAAMY,KAAK,MAAM5B,OAAOC,OAAO,GAAGe,QAAAA,KAAa;AAC/C,QAAIY,GAAGnB,WAAW,eAAemB,GAAGC,WAAW,IAAI;AACjD,YAAM,IAAIhB,MAAM,8BAA8BiB,KAAKC,UAAUH,EAAAA,CAAAA,EAAK;IACpE;AAGAb,cAAUU,OAAO1B,gBAAgB,YAAA;AAC/B,YAAM,IAAIc,MAAM,cAAA;IAClB,CAAA;AACA,UAAMK,OAAOS,MAAM,aAAa,CAAC,GAAG,GAAGX,QAAAA,OAAe;AACtD,UAAMgB,SAAS,MAAMhC,OAAOC,OAAO,GAAGe,QAAAA,OAAe;AACrD,QAAIgB,OAAOvB,WAAW,UAAU;AAC9B,YAAM,IAAII,MAAM,wBAAwBiB,KAAKC,UAAUC,MAAAA,CAAAA,EAAS;IAClE;EACF,UAAA;AACE,UAAMjB,UAAUkB,QAAK;EACvB;AACF;AAtCsBnB;","names":["describe","expect","it","runAdmissionBackendContract","name","makeBackend","describe","now","make","config","backend","register","it","b","concurrency","expect","tryAdmit","waiterId","ok","toBe","release","rateLimit","limit","periodMs","priority","order","fairness","key","requireRun","store","runId","run","getRun","Error","assertRunStatus","status","assertOutput","expected","JSON","stringify","output","recordedSteps","listCheckpoints","map","cp","name","assertStepsRan","names","ran","includes","join","assertStepAttempts","attempts","find","c","DURABLE_CANONICAL_COLUMNS","durable_workflow_runs","id","workflow","workflowVersion","status","input","output","error","wakeAt","lockedBy","lockedUntil","awaitingDecisionTaskId","recoveryAttempts","tags","searchAttributes","priority","origin","namespace","createdAt","updatedAt","durable_step_checkpoints","runId","seq","name","kind","stepId","events","attempts","workerGroup","parallelGroup","enqueuedAt","startedAt","finishedAt","durable_run_attributes","key","strValue","numValue","durable_signal_waiters","token","durable_buffered_signals","payload","durable_buffered_events","publishedAt","durable_schedules","paused","nextFireAt","spec","state","assertDurableColumns","resolve","expected","mismatches","table","props","Object","entries","property","column","actual","push","preserveColumnExpectation","out","fromEntries","keys","map","p","InMemoryStateStore","InMemoryTransport","WorkflowEngine","MutableClock","current","now","set","ms","advance","createTestEngine","store","InMemoryStateStore","transport","InMemoryTransport","clock","engine","WorkflowEngine","tick","resumeDueTimers","run","workflow","input","runId","opts","start","waitForRun","InMemoryStateStore","RUN_HISTORY_FIXTURE_VERSION","WorkflowEngine","captureHistory","source","runId","run","getRun","checkpoints","listCheckpoints","serializeRunHistory","history","JSON","stringify","version","RUN_HISTORY_FIXTURE_VERSION","parseRunHistory","json","raw","parse","Array","isArray","Error","undefined","date","v","Date","createdAt","updatedAt","map","cp","enqueuedAt","startedAt","finishedAt","assertReplayable","register","store","InMemoryStateStore","createRun","status","lockedBy","lockedUntil","saveCheckpoint","engine","WorkflowEngine","result","resume","id","error","message","startsWith","err","name","SINGLETON_ADMITTED_TAG","SINGLETON_TRACKED_TAG","WorkflowEngine","beforeEach","describe","expect","it","SUMMARY_CHILD_LIMIT","aggregatesCheckpoints","checkpointStatsOf","childIdsOf","pageFan","pageFanFromStore","queryCheckpointsOf","summarizeRunFromStore","summarizeTimeline","expect","base","Date","parse","ms","n","cp","seq","over","runId","name","kind","stepId","status","output","attempts","enqueuedAt","startedAt","finishedAt","child","group","split","parallelGroup","ok","value","folded","wave","from","values","Array","length","_","i","aggregationFixture","rows","push","error","message","undefined","GROUPS","QUERIES","offset","limit","failedOnly","comparable","stats","map","minName","maxName","rest","uniform","sort","a","b","nameKind","localeCompare","seed","store","run","createRun","row","saveCheckpoint","id","registerCheckpointAggregationCases","t","getStore","expect","checkpointStats","toBeDefined","queryCheckpoints","aggregatesCheckpoints","full","listCheckpoints","toEqual","checkpointStatsOf","queries","statuses","namePrefixes","excludeGroups","query","queryCheckpointsOf","ids","childIdsOf","expected","summarizeTimeline","children","slice","SUMMARY_CHILD_LIMIT","childCount","summarizeRunFromStore","pageFanFromStore","pageFan","StateStoreUnavailableError","Error","isStateStoreUnavailable","message","name","isUnavailable","err","at","Date","NOW","parse","DAY","run","over","id","workflow","workflowVersion","status","input","orderId","createdAt","updatedAt","checkpoint","runId","seq","kind","stepId","output","ok","attempts","enqueuedAt","startedAt","finishedAt","runStateStoreContract","makeStore","describe","store","peerStore","cleanup","supportsAsyncTransaction","supportsTagFilter","skipReason","loggedSkip","beforeEach","ctx","undefined","console","warn","t","label","fn","it","expect","tryAdmitSingleton","toBeTypeOf","claim","limit","createRun","tags","toBe","updateRun","wakeAt","lockedBy","lockedUntil","getRun","toEqual","toMatchObject","toBeUndefined","not","toContain","SINGLETON_ADMITTED_TAG","SINGLETON_TRACKED_TAG","results","Promise","all","tag","map","active","listRuns","statuses","filter","r","includes","toHaveLength","created","offset","getTime","ids","i","entries","reverse","loaded","toBeNull","recoveryAttempts","total","done","dead","priority","searchAttributes","tier","saveCheckpoint","putSignalWaiter","token","deleteRun","listCheckpoints","listSignalWaiters","attributes","key","op","value","resolves","deleteRuns","aged","ageDays","sort","pruneTerminalRuns","deleted","maxAge","policy","maxCount","namespace","scope","workflows","tenantId","engine","WorkflowEngine","register","waitForSignal","startChild","start","waitForRun","timeoutMs","purgeRuns","rejects","toThrow","error","awaitingDecisionTaskId","listDueTimers","countCheckpoints","toBeDefined","registerCheckpointAggregationCases","listOrphanedRuns","tryLockRun","ownedBy","owner","lockedBefore","updateRunIf","current","kept","settled","saveCheckpointIfPending","pending","getCheckpoint","after","saveCheckpointsIfPending","first","wrote","n","r1","c","rows","Array","from","length","_","row","every","w","chargeId","again","list","pct","getLatestCheckpointByName","latest","call","listCheckpointsByNamePrefix","matches","events","level","listIncompleteRuns","listPendingRuns","releaseRunLock","renewRunLock","origin","runFacets","facets","toContainEqual","count","reduce","f","namespaces","origins","amount","inSet","values","mixed","runValueFacets","field","search","second","Set","size","countRuns","quota","countStatuses","concurrency","cancel","drain","schedule","paused","nextFireAt","spec","v","cron","userId","deep","x","state","window","saveSchedule","getSchedule","replaced","deleteSchedule","updateSchedule","next","fires","q","listSchedules","dueBy","vip","other","res","takeSignalWaiter","parallelGroup","listed","find","registerChildWaits","entry","waiter","waiters","cps","compactCheckpoints","into","left","cp","listSignalWaitersByRun","tokens","hasSignalWaiter","has","prefix","removeSignalWaiter","bufferSignal","takeBufferedSignal","payload","bufferEvent","publishedAt","listBufferedEvents","e","removeBufferedEvent","transaction","result","tx","paid","aRuns","failOnce","a","localStep","b","resumed","resume","ran","push","version","pinned","executionTimeout","old","sweepTimeouts","swept","code","now","parent","failOnce","value","error","Error","failTimes","n","calls","InMemoryStateStore","WorkflowEngine","ECHO_STEP_NAME","settle","store","runId","timeoutMs","deadline","Date","now","run","getRun","status","Promise","r","setTimeout","Error","assertTransportConformance","transport","idPrefix","InMemoryStateStore","engine","WorkflowEngine","register","ctx","step","n","doubled","handle","input","start","ok","output","JSON","stringify","failed","close"]}