@fairfox/polly 0.74.0 → 0.74.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,13 +23,13 @@
23
23
  "/**\n * schema-version — plumbing for the shared schema-version migration protocol\n * used by $peerState and $meshState documents.\n *\n * Every peer-first document carries a reserved schema-version field. When a\n * client loads a document whose stored version is lower than the application's\n * declared target version, Polly walks the registered migrations in sequence,\n * mutating the document from one version to the next, and stamps the new\n * version on the way through. When the stored version is higher, Polly refuses\n * to load and surfaces a structured error: the application is older than the\n * document and should be upgraded.\n *\n * For concurrent writes across mixed client versions, every op also carries\n * the schema version under which it was produced. Ops whose version is lower\n * than the document's current version are rejected at sync time; the peer\n * producing them needs to upgrade its local replica through the migration\n * runner before retrying. Ops whose version is higher mean the current peer\n * is behind the application that produced them; rejecting them prevents\n * corruption while still surfacing the mismatch to the user.\n *\n * This module provides only the plumbing — the reserved field name, the\n * reader and writer for the version field, the migration runner, and the\n * op-version compatibility check. Phase 1 and Phase 2 primitives will consume\n * these helpers; nothing in this file depends on Automerge or any transport.\n */\n\n/**\n * The reserved field name used to store the schema version on every peer-first\n * document. Applications must not use this field for their own data; the\n * primitive constructors reserve it at the document boundary.\n */\nexport const SCHEMA_VERSION_FIELD = \"__schemaVersion\" as const;\n\n/**\n * The minimal shape every peer-first document satisfies. Applications layer\n * their own fields on top of this; the reserved {@link SCHEMA_VERSION_FIELD}\n * is the only required key.\n */\nexport type VersionedDoc = {\n [SCHEMA_VERSION_FIELD]?: number;\n [otherField: string]: unknown;\n};\n\n/**\n * A single migration step. Mutates the document in place, transforming it\n * from version (target - 1) to version target. The implementation must be\n * total (accept any valid v(target-1) document) and deterministic (running\n * it twice produces the same result). Applications that want return-a-new-doc\n * semantics should copy inside the migration body rather than returning.\n */\nexport type Migration = (doc: Record<string, unknown>) => void;\n\n/**\n * A map from target schema version to the migration that produces it. The\n * keys must be contiguous from 1 upward through the application's target\n * version, with no gaps. Gaps throw at migration time.\n *\n * @example\n * ```ts\n * const migrations: Migrations = {\n * 1: (doc) => { doc[\"title\"] = \"\"; }, // v0 → v1\n * 2: (doc) => { doc[\"tags\"] = []; }, // v1 → v2\n * 3: (doc) => { doc[\"archived\"] = false; delete doc[\"deleted\"]; }, // v2 → v3\n * };\n * ```\n */\nexport type Migrations = Record<number, Migration>;\n\n/**\n * Error thrown by the schema-version subsystem. The `code` field distinguishes\n * the failure modes so that callers (primitive constructors, application error\n * handlers) can decide whether to surface the error to the user, prompt an\n * upgrade, or drop the offending op.\n */\nexport class SchemaVersionError extends Error {\n readonly code:\n | \"doc-ahead-of-app\"\n | \"missing-migration\"\n | \"op-older-than-doc\"\n | \"op-newer-than-doc\";\n readonly docVersion?: number;\n readonly targetVersion?: number;\n readonly opVersion?: number;\n readonly missingVersion?: number;\n\n constructor(\n message: string,\n code: SchemaVersionError[\"code\"],\n details: {\n docVersion?: number;\n targetVersion?: number;\n opVersion?: number;\n missingVersion?: number;\n } = {}\n ) {\n super(message);\n this.name = \"SchemaVersionError\";\n this.code = code;\n if (details.docVersion !== undefined) this.docVersion = details.docVersion;\n if (details.targetVersion !== undefined) this.targetVersion = details.targetVersion;\n if (details.opVersion !== undefined) this.opVersion = details.opVersion;\n if (details.missingVersion !== undefined) this.missingVersion = details.missingVersion;\n }\n}\n\n/**\n * Read the schema version stored on a document. Returns 0 for documents that\n * have never been stamped (undefined field), which is the canonical \"pre-v1\"\n * sentinel — the first migration in a registry is always keyed at 1 and\n * handles the undefined-to-1 transition.\n */\nexport function getDocVersion(doc: unknown): number {\n if (typeof doc !== \"object\" || doc === null) return 0;\n const record = doc as unknown as Record<string, unknown>;\n const value = record[SCHEMA_VERSION_FIELD];\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 ? value : 0;\n}\n\n/**\n * Stamp a schema version onto a document in place. Primitive constructors call\n * this after each migration step and once on document creation.\n */\nexport function setDocVersion(doc: Record<string, unknown>, version: number): void {\n doc[SCHEMA_VERSION_FIELD] = version;\n}\n\n/**\n * Run any pending migrations on a document. Mutates the document in place.\n *\n * @throws {SchemaVersionError} with code `doc-ahead-of-app` if the document is\n * already at a version higher than the application's target.\n * @throws {SchemaVersionError} with code `missing-migration` if an intermediate\n * migration is missing from the registry.\n */\nexport function runMigrations(\n doc: Record<string, unknown>,\n targetVersion: number,\n migrations: Migrations\n): void {\n const current = getDocVersion(doc);\n if (current > targetVersion) {\n throw new SchemaVersionError(\n `Document is at schema version ${current} but the application targets ${targetVersion}. Upgrade the application to continue.`,\n \"doc-ahead-of-app\",\n { docVersion: current, targetVersion }\n );\n }\n for (let v = current + 1; v <= targetVersion; v++) {\n const migration = migrations[v];\n if (!migration) {\n throw new SchemaVersionError(\n `Missing migration for schema version ${v}. Migrations must be contiguous from ${current + 1} through ${targetVersion}.`,\n \"missing-migration\",\n { docVersion: current, targetVersion, missingVersion: v }\n );\n }\n migration(doc);\n setDocVersion(doc, v);\n }\n}\n\n/**\n * Result of an op-version compatibility check. Discriminated by the {@link compatible}\n * field so callers can switch cleanly.\n */\nexport type OpVersionCheck =\n | { compatible: true }\n | {\n compatible: false;\n reason: \"op-older-than-doc\" | \"op-newer-than-doc\";\n opVersion: number;\n docVersion: number;\n };\n\n/**\n * Check whether an incoming op's declared schema version is compatible with\n * the document's current version. Ops that match are applied; ops that are\n * older are rejected (the producing peer is behind and should migrate); ops\n * that are newer are also rejected (the current peer is behind and should\n * upgrade).\n */\nexport function checkOpVersion(opVersion: number, docVersion: number): OpVersionCheck {\n if (opVersion < docVersion) {\n return { compatible: false, reason: \"op-older-than-doc\", opVersion, docVersion };\n }\n if (opVersion > docVersion) {\n return { compatible: false, reason: \"op-newer-than-doc\", opVersion, docVersion };\n }\n return { compatible: true };\n}\n\n/**\n * Convenience wrapper around {@link checkOpVersion} that throws a structured\n * {@link SchemaVersionError} on incompatibility. Useful inside sync handlers\n * that want to surface the mismatch through their normal error pipeline.\n */\nexport function assertOpVersion(opVersion: number, docVersion: number): void {\n const result = checkOpVersion(opVersion, docVersion);\n if (result.compatible) return;\n const message =\n result.reason === \"op-older-than-doc\"\n ? `Incoming op was produced at schema version ${opVersion} but the document is at version ${docVersion}. The producing peer is behind.`\n : `Incoming op was produced at schema version ${opVersion} but the document is at version ${docVersion}. The current peer is behind and should upgrade.`;\n throw new SchemaVersionError(message, result.reason, { opVersion, docVersion });\n}\n",
24
24
  "/**\n * crdt-state — base machinery for Polly's peer-first state primitives.\n *\n * This module is transport-agnostic: it takes a caller-supplied async factory\n * that produces a ready {@link DocHandle}, binds it bidirectionally to a\n * Preact signal, runs any pending schema migrations on load, and integrates\n * with the primitive-registry and migration-registry guards. Phase 1's\n * $peerState and Phase 2's $meshState both construct these base primitives\n * with their own handle factories — one over Automerge-Repo's WebSocket\n * client adapter, the other over WebRTC — and the base never knows which.\n *\n * The signal-to-handle binding uses an `updating` guard flag to prevent write\n * loops: when a local signal assignment runs the effect that pushes the value\n * into `handle.change`, the flag is raised so that the 'change' event the\n * handle fires back is ignored. The same flag protects in the other direction\n * when a remote change seeds the signal.\n *\n * For the Phase 0 cut, writes are applied with a naive top-level structural\n * replacement inside the `Automerge.change` block. This is correct for\n * JSON-shaped documents with scalar and flat-object fields and is good enough\n * to exercise the rest of the pipeline. The specialised variants for text,\n * counters, and lists (which require type-specific operation capture to\n * preserve concurrent-edit semantics) land in Phase 1's crdt-specialised.ts.\n */\n\nimport { Automerge, type DocHandle } from \"@automerge/automerge-repo/slim\";\nimport { effect, signal } from \"@preact/signals\";\nimport type { Access } from \"./access\";\nimport { type MigratableState, MigrationError, migrationRegistry } from \"./migrate-primitive\";\nimport { type PrimitiveKind, primitiveRegistry } from \"./primitive-registry\";\nimport {\n type Migrations,\n runMigrations,\n SCHEMA_VERSION_FIELD,\n setDocVersion,\n type VersionedDoc,\n} from \"./schema-version\";\n\n/**\n * The interface a Polly peer-first primitive exposes at the call site. It\n * satisfies {@link MigratableState} so that the cross-primitive migration\n * helper can consume it directly.\n */\nexport interface CrdtPrimitive<T extends VersionedDoc> extends MigratableState<T> {\n /** Stable logical key the primitive was registered under. */\n readonly key: string;\n /** Primitive kind — one of the {@link PrimitiveKind} labels. */\n readonly primitive: PrimitiveKind;\n /** Current value. Writes push into the backing Automerge document. */\n value: T;\n /** Resolves when the handle is ready and migrations have run. */\n readonly loaded: Promise<void>;\n /** The underlying {@link DocHandle}, populated after {@link loaded} resolves.\n * Intended for advanced escape hatches; most callers should stay at the\n * signal surface. */\n readonly handle: DocHandle<T> | undefined;\n /** Number of Automerge changes recorded on the current doc, or\n * `undefined` while {@link loaded} is still pending. Stable proxy\n * for the incremental-chunk count the storage adapter writes —\n * consumers building heartbeat-doc auto-compaction read this to\n * decide when to seed a fresh successor via\n * {@link registerRedirectDetector}. See RFC-041 §History growth. */\n readonly changeCount: number | undefined;\n}\n\n/**\n * Options for constructing a base CRDT-backed primitive. Phase 1 and Phase 2\n * primitive constructors pass a transport-specific {@link getHandle} factory\n * and their own {@link primitive} label; everything else is shared.\n */\nexport interface CrdtStateOptions<T extends VersionedDoc> {\n /** Stable logical key identifying this piece of state. */\n key: string;\n /** Primitive kind label for registry and error-message purposes. */\n primitive: PrimitiveKind;\n /** Initial value if no stored document exists yet. Applied by the caller's\n * handle factory; the base module does not create documents itself. */\n initialValue: T;\n /** Async factory that resolves to a ready {@link DocHandle}. The factory is\n * responsible for repo lookup, document creation, and any transport-specific\n * setup. The base module calls this once, during hydration. */\n getHandle: () => Promise<DocHandle<T>>;\n /** Optional reactive redirect. When provided, the primitive runs\n * this against every doc state (initial load and every `change`\n * event afterwards). Returning a {@link DocHandle} different from\n * the currently-bound one tells the primitive to detach from the\n * current handle and rebind to the returned one — the signal\n * re-fires with the new doc's state and subsequent writes target\n * the new handle. Returning `undefined` keeps the current binding.\n *\n * Designed for ADR-0008-style document compaction redirects: the\n * caller (e.g. fairfox) provides a callback that inspects the doc\n * for a sealed-sentinel field and, if present, resolves the named\n * `migratedTo` docId via its repo. Continuous, so a peer-synced\n * sentinel rebinds the wrapper without a reload. */\n resolveRedirect?: (handle: DocHandle<T>, doc: T) => Promise<DocHandle<T> | undefined>;\n /** Target schema version for the application. If set, migrations run on\n * load to bring the document up to this version before the signal hydrates. */\n schemaVersion?: number;\n /** Migration table. Ignored if {@link schemaVersion} is not set. */\n migrations?: Migrations;\n /** Declarative access predicates. Not consumed by the base module; the\n * transport-specific constructors compile it to their enforcement layer. */\n access?: Access;\n /** Optional free-text call-site label for primitive-registry error messages. */\n callSite?: string;\n}\n\n/**\n * Construct a base CRDT-backed Polly primitive. Integrates with\n * primitive-registry (for collision detection), migration-registry (for\n * cross-family migration guards), and schema-version (for on-load migrations).\n *\n * @throws {MigrationError} if the source key has been marked as migrated.\n * @throws {PrimitiveCollisionError} if the key is already registered under a\n * different primitive kind.\n */\nexport function $crdtState<T extends VersionedDoc>(options: CrdtStateOptions<T>): CrdtPrimitive<T> {\n if (migrationRegistry.isMarked(options.key, options.primitive)) {\n throw new MigrationError(\n `Cannot construct $${options.primitive}(\"${options.key}\"): this key has been marked as migrated. Migrations are one-way; use the destination primitive instead.`,\n \"already-migrated\",\n options.key,\n options.primitive\n );\n }\n primitiveRegistry.register(options.key, options.primitive, options.callSite);\n\n const inner = signal<T>(options.initialValue);\n let updating = false;\n let currentHandle: DocHandle<T> | undefined;\n // Detach handle is bound to the live `currentHandle`; rebind swaps\n // both the handle reference (used by the signal→remote effect) and\n // this detacher (called before attaching a fresh listener to the\n // post-redirect handle).\n let detachChangeListener: (() => void) | undefined;\n // Re-entry guard for the change → resolveRedirect → swap →\n // re-listen chain. The change listener fires synchronously off\n // Automerge's state machine; without the guard a swap-while-handling\n // would race the listener attach.\n let swapping = false;\n\n function attachChangeListener(handle: DocHandle<T>): void {\n const listener = (payload: { doc: T }): void => {\n if (updating) return;\n updating = true;\n try {\n inner.value = cloneDoc(payload.doc);\n } finally {\n updating = false;\n }\n // After every change, see if the doc now points elsewhere\n // (e.g. a peer-synced compaction sentinel). The async path\n // runs in the background; the change listener itself stays\n // synchronous so Automerge's event dispatch isn't blocked.\n if (options.resolveRedirect && !swapping) {\n void maybeRebind(handle, payload.doc);\n }\n };\n handle.on(\"change\", listener);\n detachChangeListener = () => {\n handle.off(\"change\", listener);\n };\n }\n\n async function maybeRebind(fromHandle: DocHandle<T>, doc: T): Promise<void> {\n if (!options.resolveRedirect) return;\n if (swapping) return;\n swapping = true;\n try {\n const next = await options.resolveRedirect(fromHandle, doc);\n if (!next) return;\n if (next === currentHandle) return;\n if (next.documentId === fromHandle.documentId) return;\n // Detach from the old handle, swap, re-attach, re-fire the signal.\n detachChangeListener?.();\n detachChangeListener = undefined;\n currentHandle = next;\n attachChangeListener(next);\n updating = true;\n try {\n inner.value = cloneDoc(next.doc());\n } finally {\n updating = false;\n }\n } finally {\n swapping = false;\n }\n }\n\n async function followInitialRedirects(start: DocHandle<T>): Promise<DocHandle<T>> {\n if (!options.resolveRedirect) return start;\n let handle = start;\n const seen = new Set<string>([handle.documentId as unknown as string]);\n for (;;) {\n const doc = handle.doc();\n if (!doc) break;\n const next = await options.resolveRedirect(handle, doc);\n if (!next || next === handle) break;\n const nextIdString = next.documentId as unknown as string;\n if (seen.has(nextIdString)) break;\n seen.add(nextIdString);\n handle = next;\n await handle.whenReady();\n }\n return handle;\n }\n\n function applyPendingMigrations(handle: DocHandle<T>): void {\n if (options.schemaVersion === undefined) return;\n const targetVersion = options.schemaVersion;\n const migrations = options.migrations ?? {};\n handle.change((doc) => {\n runMigrations(doc as unknown as Record<string, unknown>, targetVersion, migrations);\n // runMigrations stamps the version on every intermediate step; make\n // sure the final value is recorded even when no migrations ran.\n setDocVersion(doc as unknown as Record<string, unknown>, targetVersion);\n });\n }\n\n function bindSignalToHandle(): void {\n effect(() => {\n const value = inner.value;\n if (updating) return;\n if (!currentHandle) return;\n updating = true;\n try {\n currentHandle.change((doc) => {\n applyTopLevel(doc as unknown as Record<string, unknown>, value);\n });\n } finally {\n updating = false;\n }\n });\n }\n\n const loaded = (async () => {\n const initialHandle = await options.getHandle();\n await initialHandle.whenReady();\n // Initial redirect check before we attach the listener — a doc\n // that's already sealed at load time shouldn't fire a write loop\n // through the change listener; just resolve to the post-redirect\n // handle up front. The same recursive follow lives in\n // {@link maybeRebind} for changes that arrive after load.\n const handle = await followInitialRedirects(initialHandle);\n currentHandle = handle;\n\n // Run any pending schema migrations inside a change block so they land\n // as a single Automerge operation set.\n applyPendingMigrations(handle);\n\n // Seed the signal with the hydrated doc state. Raise the guard first so\n // the 'change' listener we install below does not echo this write back.\n updating = true;\n try {\n inner.value = cloneDoc(handle.doc());\n } finally {\n updating = false;\n }\n\n // Remote-changes-to-signal binding. Routed through a helper so\n // {@link maybeRebind} can detach + re-attach against the\n // post-redirect handle when a sentinel appears.\n attachChangeListener(handle);\n\n // Signal-to-remote binding. The effect runs once on registration with\n // the already-hydrated value; the guard makes that first run a no-op at\n // the handle level because updating is false but the doc already equals\n // the signal, so Automerge records no new operations.\n bindSignalToHandle();\n })();\n\n return {\n key: options.key,\n primitive: options.primitive,\n get value() {\n return inner.value;\n },\n set value(next: T) {\n inner.value = next;\n },\n loaded,\n get handle() {\n return currentHandle;\n },\n get changeCount() {\n if (!currentHandle) return undefined;\n const doc = currentHandle.doc();\n if (!doc) return undefined;\n return Automerge.getAllChanges(doc).length;\n },\n };\n}\n\n/**\n * Shallow clone of an Automerge doc into a plain JS object. Automerge docs\n * are Proxies; the signal holds a detached plain-object snapshot so that\n * application code does not accidentally mutate the CRDT through the signal.\n */\nfunction cloneDoc<T>(doc: T): T {\n return JSON.parse(JSON.stringify(doc)) as unknown as T;\n}\n\n/**\n * Copy every top-level field from the incoming value onto the Automerge doc\n * — but only for fields whose serialised form actually differs from what's\n * already there. The equality skip is load-bearing, not an optimisation:\n *\n * - Automerge records a new operation for every assignment (`doc[k] = v`),\n * even when v is structurally identical to the current value.\n * - Every op triggers a state-machine transition, which via\n * `#checkForChanges` fires a `change` event, which the signal binding\n * above handles by setting `inner.value = cloneDoc(...)`.\n * - Under certain event-loop timings — most consistently on bun — preact\n * signals' synchronous effect propagation re-runs this write path with\n * the just-cloned value, which compares ref-different to the previous\n * signal value, so the effect doesn't short-circuit, so applyTopLevel\n * runs again, so more ops are recorded, and the whole chain loops until\n * preact's own cycle counter trips with \"Cycle detected\".\n *\n * Skipping value-equal assignments makes the write a true no-op at the\n * Automerge level, which makes `docChanged` in `#checkForChanges` false,\n * which skips the change emission, which breaks the loop at its origin.\n * Browsers mask this under typical interactive timing; a tight CLI boot\n * reproduces it every time.\n *\n * The reserved schema-version field is not copied — it is managed by the\n * migration subsystem and must not be overwritten by application writes.\n */\nfunction applyTopLevel<T extends VersionedDoc>(doc: Record<string, unknown>, value: T): void {\n const source = value as unknown as Record<string, unknown>;\n for (const key of Object.keys(value)) {\n if (key === SCHEMA_VERSION_FIELD) continue;\n const incoming = source[key];\n if (fieldEquals(doc[key], incoming)) continue;\n doc[key] = incoming;\n }\n}\n\n/** Structural equality check for the top-level-field comparison. JSON.stringify\n * round-trip because Automerge docs are Proxies and `===` would miss a match\n * when the proxy wraps an equal value. Arrays, objects, and primitives all\n * round-trip cleanly for the CRDT-state use case. Cycles in the input aren't\n * supported (neither is Automerge — it refuses cyclic structures). */\nfunction fieldEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch {\n return false;\n }\n}\n",
25
25
  "/**\n * Leaf module for {@link deriveDocumentId}. Kept free of the wider\n * `mesh-state` module graph (CRDT primitives, the Repo, schema\n * migrations) so that tooling — notably `polly visualize` (polly#127) —\n * can resolve a logical key to its {@link DocumentId} without pulling\n * the whole mesh runtime into its bundle. `mesh-state` re-exports it,\n * so consumer-facing imports are unchanged.\n */\n\nimport {\n type BinaryDocumentId,\n type DocumentId,\n interpretAsDocumentId,\n} from \"@automerge/automerge-repo/slim\";\nimport nacl from \"tweetnacl\";\n\n/** Domain prefix pinning the derivation to $meshState so that the same\n * logical key used in a different Polly subsystem would produce a\n * different id. */\nconst DOC_ID_DOMAIN = \"polly/meshState/v1\";\nconst keyEncoder = new TextEncoder();\n\n/**\n * Domain-separated hash of an application key into a 16-byte\n * {@link DocumentId}. SHA-512 via tweetnacl (already a dep for\n * signing); the first 16 bytes give a DocumentId with uniform\n * distribution across the Automerge id space.\n *\n * Exported so consumers can compute the derived id for any logical key\n * — useful for ADR 0008-style document compaction where the consumer\n * wants to seed a new doc at `deriveDocumentId(key + ':v' + timestamp)`\n * and stash that id in a runtime index.\n */\nexport function deriveDocumentId(key: string): DocumentId {\n const digest = nacl.hash(keyEncoder.encode(`${DOC_ID_DOMAIN}:${key}`));\n const bytes = digest.slice(0, 16);\n return interpretAsDocumentId(bytes as unknown as BinaryDocumentId);\n}\n",
26
- "/**\n * mesh-webrtc-adapter — Phase 2 browser-side WebRTC transport for Polly's\n * $meshState primitive. Extends Automerge's NetworkAdapter base class and\n * uses real native RTCPeerConnection / RTCDataChannel instances to carry\n * sync messages between peers.\n *\n * This is the \"base\" transport that MeshNetworkAdapter wraps with its\n * sign-then-encrypt envelope. The stack is:\n *\n * $meshState\n * └─ Repo\n * └─ MeshNetworkAdapter (sign + encrypt)\n * └─ MeshWebRTCAdapter (real data channels)\n * └─ MeshSignalingClient (SDP/ICE relay)\n * └─ signalingServer (Elysia plugin on the host app)\n *\n * Because WebRTC lives in browsers, this module is browser-only. It\n * assumes global RTCPeerConnection, RTCDataChannel, and WebSocket types\n * are available. Under bun:test the classes cannot be exercised\n * end-to-end — the first validation path is either Playwright running a\n * real browser, a Puppeteer harness, or a human testing a browser-side\n * example app that consumes the adapter.\n *\n * What this module does at runtime:\n *\n * - Constructs a MeshWebRTCAdapter with a signalling client and a local\n * peer id. No data channels exist at construction time.\n *\n * - When Automerge's NetworkSubsystem calls connect(peerId) on the\n * adapter, it starts listening for signals from remote peers and is\n * ready to build peer connections as they are discovered.\n *\n * - When a remote peer sends an SDP offer via the signalling channel,\n * the adapter builds a fresh RTCPeerConnection, accepts the offer,\n * produces an answer, sends it back through signalling, and wires the\n * received data channel to emit Automerge Message events upward.\n *\n * - When the local repo calls send(message), the adapter looks up the\n * peer connection for message.targetId and writes the serialised\n * bytes to its data channel. If no connection exists yet, the adapter\n * creates one by sending an SDP offer through signalling. Outgoing\n * messages are queued until the channel is open.\n *\n * - Disconnect tears down every peer connection and closes the\n * signalling client.\n */\n\nimport {\n type Message,\n NetworkAdapter,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\";\nimport { isBlobMessageType } from \"./blob-transfer\";\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport type { MeshSignalingClient } from \"./mesh-signaling-client\";\nimport {\n chunkSyncMessage,\n isSyncFragmentType,\n parseSyncFragment,\n reassembleSyncFragments,\n SYNC_FRAGMENT_CHUNK_SIZE,\n SYNC_FRAGMENT_THRESHOLD,\n} from \"./sync-fragment\";\n\n/** Distil an {@link RTCStatsReport} into a {@link TransportSnapshot}.\n * Resolves the selected candidate pair via the transport stat's\n * `selectedCandidatePairId` (the W3C-spec field that names the pair\n * ICE has nominated for the data path), then pulls the candidate-type\n * labels from the linked candidate stats. Retransmission counters\n * come off the transport stat where present; some implementations\n * surface them on the data-channel stat instead — we accept either.\n *\n * Out-of-band so the test bed can call it against a bare\n * {@link RTCPeerConnection} as well, which the polly#105 harness's\n * `probe-stats.ts` does to validate the stats shape before threading\n * the result through the polly layer. */\nasync function collectTransportSnapshot(\n connection: RTCPeerConnection,\n lastDataChannelError: string | undefined\n): Promise<TransportSnapshot> {\n const at = performance.now();\n let report: RTCStatsReport | undefined;\n try {\n report = await connection.getStats();\n } catch {\n return emptyTransportSnapshot(lastDataChannelError, at);\n }\n const parsed = partitionStats(report);\n const selectedPair = selectActivePair(parsed);\n const selectedCandidatePair = selectedPair\n ? buildCandidatePairView(selectedPair, parsed.localCands, parsed.remoteCands)\n : undefined;\n return {\n selectedCandidatePair,\n retransmittedPacketsSent: parsed.retransmittedPacketsSent,\n retransmittedBytesSent: parsed.retransmittedBytesSent,\n lastDataChannelError,\n at,\n };\n}\n\ninterface ParsedStats {\n localCands: Map<string, Record<string, unknown>>;\n remoteCands: Map<string, Record<string, unknown>>;\n pairs: Map<string, Record<string, unknown>>;\n selectedPairId: string | undefined;\n retransmittedPacketsSent: number | undefined;\n retransmittedBytesSent: number | undefined;\n}\n\nfunction emptyTransportSnapshot(\n lastDataChannelError: string | undefined,\n at: number\n): TransportSnapshot {\n return {\n selectedCandidatePair: undefined,\n retransmittedPacketsSent: undefined,\n retransmittedBytesSent: undefined,\n lastDataChannelError,\n at,\n };\n}\n\nfunction partitionStats(report: RTCStatsReport): ParsedStats {\n const out: ParsedStats = {\n localCands: new Map(),\n remoteCands: new Map(),\n pairs: new Map(),\n selectedPairId: undefined,\n retransmittedPacketsSent: undefined,\n retransmittedBytesSent: undefined,\n };\n const iter = (report as { values?: () => Iterable<unknown> }).values?.() ?? [];\n for (const raw of iter) {\n if (!raw || typeof raw !== \"object\") continue;\n const stat = raw as Record<string, unknown>;\n ingestStat(stat, out);\n }\n return out;\n}\n\nfunction ingestStat(stat: Record<string, unknown>, out: ParsedStats): void {\n const id = String(stat[\"id\"]);\n switch (stat[\"type\"]) {\n case \"local-candidate\":\n out.localCands.set(id, stat);\n return;\n case \"remote-candidate\":\n out.remoteCands.set(id, stat);\n return;\n case \"candidate-pair\":\n out.pairs.set(id, stat);\n return;\n case \"transport\":\n ingestTransport(stat, out);\n return;\n case \"data-channel\":\n ingestDataChannel(stat, out);\n return;\n }\n}\n\nfunction ingestTransport(stat: Record<string, unknown>, out: ParsedStats): void {\n const selectedId = stat[\"selectedCandidatePairId\"];\n if (typeof selectedId === \"string\") out.selectedPairId = selectedId;\n const rp = stat[\"retransmittedPacketsSent\"];\n const rb = stat[\"retransmittedBytesSent\"];\n if (typeof rp === \"number\") out.retransmittedPacketsSent = rp;\n if (typeof rb === \"number\") out.retransmittedBytesSent = rb;\n}\n\nfunction ingestDataChannel(stat: Record<string, unknown>, out: ParsedStats): void {\n // Chrome puts SCTP retransmit counters on the data-channel stat for\n // SCTP-backed channels. werift puts them on the transport. Accept\n // whichever the underlying impl produces first.\n const rp = stat[\"retransmittedPacketsSent\"];\n const rb = stat[\"retransmittedBytesSent\"];\n if (out.retransmittedPacketsSent === undefined && typeof rp === \"number\") {\n out.retransmittedPacketsSent = rp;\n }\n if (out.retransmittedBytesSent === undefined && typeof rb === \"number\") {\n out.retransmittedBytesSent = rb;\n }\n}\n\nfunction selectActivePair(parsed: ParsedStats): Record<string, unknown> | undefined {\n if (parsed.selectedPairId) {\n const named = parsed.pairs.get(parsed.selectedPairId);\n if (named) return named;\n }\n for (const pair of parsed.pairs.values()) {\n if (pair[\"nominated\"]) return pair;\n }\n return undefined;\n}\n\n/** Render a {@link PeerSlot} as the plain-data view\n * {@link MeshWebRTCAdapter.getPeerStateSnapshot} returns. Pulled out\n * so the snapshot method itself stays under biome's cognitive-\n * complexity ceiling — every additional optional field would push it\n * one closer; doing the shape here keeps the per-call diff small. */\nfunction serialiseSlotView(slot: PeerSlot): {\n signalingState: string;\n iceConnectionState: string;\n connectionState: string;\n dataChannelState: string;\n pendingSendCount: number;\n pendingRemoteIceCount: number;\n inFlightSync: InFlightSyncSnapshot | undefined;\n transport: TransportSnapshot | undefined;\n lastSyncHandshakeAttempt: SyncHandshakeAttemptSnapshot;\n handles: Record<string, HandleSyncSnapshot>;\n createdAt: number;\n lastInboundAt: number | undefined;\n} {\n const handles: Record<string, HandleSyncSnapshot> = {};\n for (const [docId, snapshot] of slot.handles) {\n handles[docId] = { ...snapshot };\n }\n return {\n signalingState: slot.connection.signalingState,\n iceConnectionState: slot.connection.iceConnectionState,\n connectionState: slot.connection.connectionState,\n dataChannelState: slot.channel?.readyState ?? \"no-channel\",\n pendingSendCount: slot.pendingSends.length,\n pendingRemoteIceCount: slot.pendingRemoteIce.length,\n inFlightSync: slot.inFlightSync ? { ...slot.inFlightSync } : undefined,\n transport: slot.transport\n ? {\n ...slot.transport,\n selectedCandidatePair: slot.transport.selectedCandidatePair\n ? { ...slot.transport.selectedCandidatePair }\n : undefined,\n }\n : undefined,\n lastSyncHandshakeAttempt: { ...slot.lastSyncHandshakeAttempt },\n handles,\n createdAt: slot.createdAt,\n lastInboundAt: slot.lastInboundAt,\n };\n}\n\n/** Initial state for {@link PeerSlot.lastSyncHandshakeAttempt}. All\n * timestamps start `undefined` and become populated as the slot\n * progresses through the lifecycle. Pulled out so every `PeerSlot`\n * construction site uses the same shape. */\nfunction emptySyncHandshakeAttempt(): SyncHandshakeAttemptSnapshot {\n return {\n dataChannelOpenedAt: undefined,\n peerCandidateEmittedAt: undefined,\n firstOutboundSendAt: undefined,\n firstInboundMessageAt: undefined,\n };\n}\n\nfunction buildCandidatePairView(\n pair: Record<string, unknown>,\n localCands: Map<string, Record<string, unknown>>,\n remoteCands: Map<string, Record<string, unknown>>\n): NonNullable<TransportSnapshot[\"selectedCandidatePair\"]> {\n const local = localCands.get(String(pair[\"localCandidateId\"]));\n const remote = remoteCands.get(String(pair[\"remoteCandidateId\"]));\n return {\n localCandidateType: String(local?.[\"candidateType\"] ?? \"?\"),\n remoteCandidateType: String(remote?.[\"candidateType\"] ?? \"?\"),\n state: String(pair[\"state\"] ?? \"\"),\n nominated: Boolean(pair[\"nominated\"]),\n bytesSent: Number(pair[\"bytesSent\"] ?? 0),\n bytesReceived: Number(pair[\"bytesReceived\"] ?? 0),\n };\n}\n\n/** Standard STUN servers for NAT traversal. In production, callers who\n * need TURN fallback for peers behind symmetric NATs should replace this\n * with their own ICE server list. */\nexport const DEFAULT_ICE_SERVERS: RTCIceServer[] = [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"stun:stun1.l.google.com:19302\" },\n];\n\n/** Polly issue #109: how long a slot can sit at `connectionState` in\n * `new` or `connecting` before the watchdog tears it down so the\n * recovery sweep can re-attempt. Healthy ICE completes in single-digit\n * seconds; 30s is well past anything legitimate and short enough that\n * a silent `createOffer`/`setLocalDescription` rejection no longer\n * leaves an unrecoverable wedged slot. */\nexport const SLOT_NEVER_CONNECTED_TIMEOUT_MS = 30_000;\n\n/** Polly issue #110: how long a slot whose data channel is open and\n * whose `connectionState` is `connected` can have no inbound bytes\n * before the watchdog assumes the remote process is dead and tears\n * the slot down. The ICE keepalive timer can take minutes to notice a\n * remote SIGKILL or network partition; an application-layer\n * liveness check that runs an order of magnitude faster keeps\n * paired devices from sending sync traffic into the void after the\n * remote daemon restarts. 120s is conservative — Automerge's idle\n * cadence is well below this, so a healthy slot never crosses the\n * threshold. */\nexport const SLOT_IDLE_TIMEOUT_MS = 120_000;\n\n/** Polly issue #109/#110: how often the watchdog evaluates teardown\n * decisions across every slot. 5s is well below either threshold so\n * teardown happens promptly after a deadline lapses without\n * dominating runtime cost (one `connectionState` read per slot per\n * tick). */\nexport const SLOT_WATCHDOG_INTERVAL_MS = 5_000;\n\n/** Options for constructing a {@link MeshWebRTCAdapter}. */\nexport interface MeshWebRTCAdapterOptions {\n /** The signalling client the adapter uses to exchange SDP and ICE\n * candidates with other peers. Typically constructed once per\n * application and shared across any adapters that need it. */\n signaling: MeshSignalingClient;\n /** The local peer id. Must match the peer id the signalling client\n * registered with. */\n peerId: string;\n /** Peer ids to connect to on startup. When `connect()` is called, the\n * adapter iterates this list and initiates a WebRTC connection to each\n * one by sending an SDP offer through the signalling channel. Peers\n * not in this list can still connect by sending an offer *to* this\n * adapter. The natural source for this list is the keyring's\n * knownPeers map keys.\n *\n * Used only when {@link keyringSource} is not supplied. With\n * `keyringSource` set the adapter reads `knownPeers` live from the\n * keyring on every initiation decision, which is the shape\n * {@link createMeshClient} wires up so post-construction\n * {@link applyPairingToken} calls take effect without the consumer\n * having to call {@link MeshWebRTCAdapter.addKnownPeer} by hand. */\n knownPeerIds?: string[];\n /** Live keyring source. When supplied, the adapter reads\n * `knownPeers` from `keyringSource()` on every initiation decision\n * instead of a Set captured at construction. Combined with the\n * periodic re-sweep started in {@link MeshWebRTCAdapter.connect},\n * this makes mutations to `keyring.knownPeers` — including the ones\n * produced by {@link applyPairingToken} after the mesh client is up\n * — visible to the dial path within at most one sweep interval. The\n * crypto layer already re-reads the keyring on every send and\n * receive; this option closes the same loop for the WebRTC adapter.\n *\n * Polly issue #103: without this, a long-lived daemon that pairs a\n * new device after its mesh client is constructed never dials the\n * new peer — the adapter's captured Set stays stale even though the\n * keyring contains the new entry, and the lex-tie-break rule in\n * {@link MeshWebRTCAdapter.shouldInitiateTo} can leave both peers\n * waiting for the other to offer indefinitely. */\n keyringSource?: () => MeshKeyring;\n /** How often the adapter re-evaluates whether to dial peers in the\n * signalling roster. The sweep is what catches peers that became\n * authorised in the keyring after their `peer-joined` notification\n * already fired — the adapter has no other event to hang the retry\n * on, so it polls. Cheap: one Map lookup per present peer, fired at\n * most once per interval. Defaults to 2000ms; tests override to\n * shorten the failure budget. Set to 0 to disable the sweep\n * (the captured-set behaviour, kept only for migration). */\n knownPeersRefreshIntervalMs?: number;\n /** Optional ICE server list override. Defaults to {@link DEFAULT_ICE_SERVERS}. */\n iceServers?: RTCIceServer[];\n /** Optional ICE transport policy. Defaults to the\n * {@link RTCPeerConnection} implementation's own default (`\"all\"` in\n * Chrome, Firefox, and werift). Set to `\"relay\"` to force every\n * candidate pair through a TURN relay — the shape the polly#105\n * falsification harness needs to exercise the real-transport contract\n * the polly#104 in-process throttle could not reach. */\n iceTransportPolicy?: RTCIceTransportPolicy;\n /** When `true` (the default), polly enforces\n * {@link iceTransportPolicy} `\"relay\"` on its side of the signalling\n * channel by filtering non-relay ICE candidates out of both the SDP\n * description it forwards and the trickle ICE stream it emits. This\n * closes the gap exposed by polly#105: Chrome's implementation\n * already filters at the source, but werift only filters its own\n * outgoing connectivity checks and still advertises host and srflx\n * candidates upstream — so a relay-only peer on werift will, against\n * a peer with the default policy, still pair through a non-relay\n * candidate (or against a host-derived peer-reflexive remote).\n * Setting this option to `false` reverts the enforcement and is the\n * shape used by the `POLLY_105_DISABLE_TURN_FIX=1` falsification\n * path. Production callers should leave this at the default. */\n iceRelayEnforcement?: boolean;\n /** Optional data channel label. Defaults to \"polly-mesh\". Applications\n * that share a signalling server between multiple meshes may want\n * distinct labels per mesh. */\n dataChannelLabel?: string;\n /** RTCPeerConnection constructor. Defaults to\n * `globalThis.RTCPeerConnection`. Inject a different implementation\n * (e.g. `werift` or `@roamhq/wrtc`) when running outside a browser, or\n * to use a custom subclass for tests or instrumentation. */\n RTCPeerConnection?: typeof RTCPeerConnection;\n /** When `true` (the default), the adapter yields to the event loop\n * between the points where a large initial sync would otherwise hold\n * the main thread for tens of seconds: between each batch of\n * fragmented `RTCDataChannel.send` calls on the sender side, and at\n * the boundary between reassembling a sync message and dispatching\n * it (deserialise → MeshNetworkAdapter unwrap → Automerge\n * `applyChanges`) on the receiver side. Set to `false` to recover\n * the pre-#104 tight-loop behaviour; this is the configuration the\n * `POLLY_104_DISABLE_FIX=1` falsification path in\n * `examples/mesh-large-initial-sync` uses to demonstrate the bug\n * against post-fix polly. Production callers should leave this at\n * the default. */\n syncYieldEnabled?: boolean;\n /** Override the sync fragment chunk size. Defaults to\n * {@link SYNC_FRAGMENT_CHUNK_SIZE} (60 KiB), which leaves header\n * overhead inside werift's hard 64 KiB max-message-size cap.\n * Setting this to 64 KiB recreates the pre-#104 fragmentation bug,\n * where peer A's outbound fragments overshoot the cap and werift\n * rejects them silently — sync stalls forever. Used by the\n * `POLLY_104_DISABLE_FIX=1` falsification path. Production callers\n * should leave this at the default. */\n syncFragmentChunkSizeOverride?: number;\n /** How long a slot can sit at `connectionState` in `new` or\n * `connecting` before the watchdog tears it down. Defaults to\n * {@link SLOT_NEVER_CONNECTED_TIMEOUT_MS}. Set to 0 to disable the\n * gate. Polly issue #109. */\n slotNeverConnectedTimeoutMs?: number;\n /** How long a connected slot can have no inbound bytes before the\n * watchdog tears it down as idle. Defaults to\n * {@link SLOT_IDLE_TIMEOUT_MS}. Set to 0 to disable the gate.\n * Polly issue #110. */\n slotIdleTimeoutMs?: number;\n /** How often the slot watchdog evaluates teardown decisions.\n * Defaults to {@link SLOT_WATCHDOG_INTERVAL_MS}; tests override to\n * tens of milliseconds. Set to 0 to disable the watchdog entirely\n * (the pre-#109/#110 behaviour, kept only for migration and the\n * falsification path). */\n slotWatchdogIntervalMs?: number;\n}\n\n/** Types of signalling payload this adapter exchanges through the\n * signalling channel. The signalling server treats these as opaque. */\ntype SignalingPayload =\n | { kind: \"offer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"answer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"ice\"; candidate: RTCIceCandidateInit };\n\n/** Payload of the polly-specific `\"sync-progress\"` event emitted by\n * {@link MeshWebRTCAdapter}. Consumers can subscribe via the adapter's\n * standard `.on()` surface (the same one that carries `peer-candidate`\n * and `peer-disconnected`) to observe fragment receive and dispatch\n * activity in real time, without polling\n * {@link MeshWebRTCAdapter.getPeerStateSnapshot}. Polly issue #104\n * item 7. */\nexport interface SyncProgressEvent {\n /** Remote peer the fragment or dispatch is for. */\n peerId: string;\n /** Lifecycle stage. `fragment-received` fires for each chunk that\n * arrives during reassembly; `dispatch-applied` fires once the\n * reassembled message has been emitted upward to Automerge. */\n kind: \"fragment-received\" | \"dispatch-applied\";\n /** Bytes carried by the chunk that triggered the event. Zero for\n * `dispatch-applied`. */\n bytesDelta: number;\n /** Running total of fragments received for the current reassembly. */\n chunksReceived: number;\n /** Running total of bytes received for the current reassembly. */\n bytesReceived: number;\n /** Number of reassembled messages whose dispatch has been scheduled\n * but not yet emitted upward to Automerge. */\n applyBacklog: number;\n /** `performance.now()` at event emission. */\n at: number;\n}\n\n/** Last-seen transport-level summary for a peer slot. Populated\n * lazily by {@link MeshWebRTCAdapter.refreshTransportStats}, which\n * the consumer calls (typically from a polling loop in a debugging\n * harness) so the cost of {@link RTCPeerConnection.getStats} is\n * incurred only on demand. Polly issue #105 item 7 — exposes the\n * dimension of the transport that {@link InFlightSyncSnapshot}\n * doesn't reach: the negotiated ICE candidate pair, the SCTP\n * retransmission counters, and the last data-channel-level error if\n * one has been observed.\n *\n * Field names mirror the W3C stats spec (`selectedCandidatePairId`,\n * `localCandidateType`, etc.) so consumers can correlate with the\n * raw `RTCStatsReport`. werift exposes a stats shape close to the\n * spec; Chrome exposes the spec itself; this view is implementation-\n * agnostic. */\nexport interface TransportSnapshot {\n /** ICE-level summary of the pair currently carrying data. */\n selectedCandidatePair:\n | {\n localCandidateType: string;\n remoteCandidateType: string;\n state: string;\n nominated: boolean;\n bytesSent: number;\n bytesReceived: number;\n }\n | undefined;\n /** SCTP / data-channel retransmission counters. Some implementations\n * surface these on the transport stat, others on the data-channel\n * stat — we expose the values we found, leaving the field undefined\n * when the underlying impl doesn't surface them. */\n retransmittedPacketsSent: number | undefined;\n retransmittedBytesSent: number | undefined;\n /** Most-recent data-channel error message, if `error` ever fired on\n * the channel for this peer. Cleared only when the slot is replaced. */\n lastDataChannelError: string | undefined;\n /** `performance.now()` at the time the stats were last refreshed. */\n at: number;\n}\n\n/** Reasons the adapter declined to construct an RTC slot for a peer\n * that appeared in the signalling roster or the keyring. Recorded\n * per-peer in {@link MeshWebRTCAdapter.getPeerStateSnapshot} so a\n * consumer harness observing \"(no slot)\" can tell which gate inside\n * the adapter stopped construction without having to log-correlate\n * through three layers of timing. Polly issue #106 item 7.\n *\n * - `self`: the peerId equals the local peerId.\n * - `not-in-keyring`: the live keyring (or captured Set) does not\n * currently authorise this peer.\n * - `not-present`: the peer is not in the signalling roster. The\n * adapter only dials peers it has heard about through\n * `peers-present` or `peer-joined`; keyring entries that have not\n * appeared on signalling are quietly held without a slot.\n * - `tie-break-other-side`: the lex-tie-break designates the remote\n * peer as the initiator; we wait for their offer.\n * - `slot-already-exists`: a slot exists already, possibly in any\n * negotiation state.\n * - `fatal-error`: an exception was thrown while attempting to build\n * the slot. The accompanying {@link SlotInitiationDecision.error}\n * string carries the message. This is also stamped when the slot\n * watchdog tears a wedged slot down (polly#109's silent throw, or\n * polly#110's idle-but-still-`connected` post-mortem), so the next\n * sweep tick finds no slot and retries.\n */\nexport type SlotInitiationRejectionReason =\n | \"self\"\n | \"not-in-keyring\"\n | \"not-present\"\n | \"tie-break-other-side\"\n | \"slot-already-exists\"\n | \"fatal-error\";\n\n/** Most-recent slot-initiation decision for a peer. Computed at\n * snapshot time so the view always reflects the current state of the\n * relevant gates; a `decision === \"accepted\"` value paired with a\n * `slot === undefined` view on the same snapshot is the load-bearing\n * signal for \"the adapter wants to dial but isn't\" — the failure\n * shape polly#106 documents. */\nexport interface SlotInitiationDecision {\n /** \"accepted\" means every gate in `shouldInitiateTo` would pass right\n * now and a sweep tick would construct a slot. \"rejected\" means at\n * least one gate failed; the `reason` names it. */\n decision: \"accepted\" | \"rejected\";\n /** Populated only on `rejected` decisions. */\n reason: SlotInitiationRejectionReason | undefined;\n /** If the previous sweep tick caught a synchronous throw while\n * building this peer's slot, the message is preserved here for the\n * next snapshot. The reason will be `fatal-error`. */\n error: string | undefined;\n /** `performance.now()` at the time the decision was computed. */\n at: number;\n}\n\n/** Most-recent sync-handshake timeline for a peer slot. Each timestamp\n * is `performance.now()` of the corresponding event the first time it\n * fired on the current slot — slots that get evicted and rebuilt start\n * over. The four fields together describe whether the adapter and the\n * receiver downstream of it have done their part in initiating sync:\n *\n * - `dataChannelOpenedAt`: when the wire is ready to carry bytes.\n * - `peerCandidateEmittedAt`: when polly emitted `peer-candidate`\n * upward; Automerge's network subsystem hooks this event to add the\n * peer to its known set and kick off the per-document sync exchange.\n * If this is `undefined` long after the data channel has opened,\n * polly never signalled \"ready\" to Automerge — that's a failure in\n * the adapter.\n * - `firstOutboundSendAt`: when polly first dispatched bytes through\n * {@link MeshWebRTCAdapter.send} for this peer. If\n * `peerCandidateEmittedAt` is set but this is still `undefined`,\n * Automerge's NetworkSubsystem has not asked the adapter to send\n * anything. The polly#106 ladder named \"no handle locally\" as the\n * typical cause for this rung; the polly#107 failing-shape evidence\n * (fourteen `$meshState` handles pre-warmed in `ready` state,\n * `firstOutboundSendAt` still undefined long after peer-candidate\n * fires) shows that's a misleading ladder entry. Revised:\n *\n * - If `repo.handles[docId]` is undefined or in a non-`ready`\n * state for every doc this peer should sync, the consumer\n * fix is real — pre-warm the handles via the documented\n * `$meshState(key, initial)` factory before the slot opens.\n *\n * - If `repo.handles[docId]` is `ready` for every doc AND\n * `getPeerStateSnapshot().peers[…].slot.handles[docId]\n * .announcedToPeer` is `false`, the gate is BETWEEN Automerge's\n * NetworkSubsystem and the adapter — not on the consumer's\n * handle-construction path. This is the polly#107 surface;\n * post-#107 the mesh client hooks `peer-candidate` to invoke\n * the synchronizer's `reevaluateDocumentShare` so the\n * `addPeer`/`addDocument` ordering race that leaves a handle\n * un-announced gets closed by an idempotent re-evaluation.\n *\n * - If `announcedToPeer` becomes `true` for every relevant doc\n * and `firstOutboundSendAt` is still undefined, the gap is in\n * polly's own send path — that's a polly bug, not an\n * Automerge or consumer one.\n *\n * - `firstInboundMessageAt`: when polly first emitted a `message` event\n * for this peer. If `peerCandidateEmittedAt` is set on the remote and\n * `firstOutboundSendAt` is set on the remote but this is `undefined`\n * locally, bytes were sent across the wire but never decoded — that\n * points at the crypto envelope or the wire fragmenter.\n *\n * Polly issue #106 item 7; polly#107 revised the\n * `firstOutboundSendAt` rung to point at the polly⇄Automerge gate\n * rather than the consumer. */\nexport interface SyncHandshakeAttemptSnapshot {\n dataChannelOpenedAt: number | undefined;\n peerCandidateEmittedAt: number | undefined;\n firstOutboundSendAt: number | undefined;\n firstInboundMessageAt: number | undefined;\n}\n\n/** Sweep-loop observability for the periodic dial re-evaluation. The\n * sweep is what catches peers that were not in the keyring at the time\n * of their `peer-joined` notification (polly#103) AND peers whose\n * previous slot failed and got evicted (polly#106). Exposing its tick\n * counter lets a consumer distinguish \"sweep is running but\n * `shouldInitiateTo` rejected the peer\" from \"sweep is broken and\n * never fires\" without instrumenting polly internals. */\nexport interface SweepSnapshot {\n /** True iff the sweep timer is currently scheduled — false on the\n * captured-set fallback path (no keyringSource) or when the interval\n * is configured to 0. */\n enabled: boolean;\n /** Configured interval in milliseconds. 0 means disabled. */\n intervalMs: number;\n /** How many times the sweep callback has fired since `connect()`. */\n runCount: number;\n /** `performance.now()` at the last tick. `undefined` until the\n * first tick fires. */\n lastRunAt: number | undefined;\n}\n\n/** Per-peer view of an in-flight initial sync. Populated by\n * {@link MeshWebRTCAdapter.handleSyncFragment} as fragments of a\n * single reassembly arrive, and reset to `undefined` once the\n * reassembled message has been dispatched. Exposed verbatim through\n * {@link MeshWebRTCAdapter.getPeerStateSnapshot} so a consumer\n * harness can observe progress mid-stream. Polly issue #104 item 7. */\nexport interface InFlightSyncSnapshot {\n /** Fragments received for the current reassembly. Cleared once\n * reassembly completes. */\n chunksReceived: number;\n /** Bytes received across the fragments of the current reassembly.\n * The reassembled message will be slightly smaller than this sum\n * because each fragment carries a small header. */\n bytesReceived: number;\n /** `performance.now()` value at the last fragment arrival. */\n lastChunkAt: number;\n /** Count of reassembled messages whose dispatch has been\n * scheduled but not yet run. With the receiver-side `setTimeout(0)`\n * yield enabled, this is normally 0 or 1; with the yield\n * disabled (the falsification path) dispatch runs synchronously\n * and this stays 0. */\n applyBacklog: number;\n}\n\n/** Per-handle per-peer sync bookkeeping. Closes the diagnostic gap\n * between \"handle exists in repo\" (observable today via `repo.handles`)\n * and \"Automerge's NetworkSubsystem has actually told this peer about\n * this handle\" — the latter being the load-bearing question for the\n * polly#107 failing shape, where fourteen pre-warmed handles sit in\n * `ready` state and the peer slot is fully connected, yet Automerge\n * has not asked the adapter to send a single sync message.\n *\n * Each field is stamped from the adapter's own wire path: `out` from\n * {@link MeshWebRTCAdapter.send}, `in` from {@link dispatchMessage}'s\n * deserialised view. Combined with the consumer's view of\n * `repo.handles[documentId].state`, the mesh client's\n * {@link createMeshClient}-returned `getPeerStateSnapshot` produces the\n * full per-handle observability the polly#107 ticket asks for in\n * item 7. */\nexport interface HandleSyncSnapshot {\n /** `performance.now()` of the most recent send through\n * {@link MeshWebRTCAdapter.send} carrying this `documentId` for this\n * peer. `undefined` means Automerge has never asked the adapter to\n * send a sync message for this document — i.e. the handle is NOT\n * \"announced to peer\" in the polly#107 sense, regardless of whether\n * the handle is `ready` in `repo.handles`. */\n lastSyncMessageOutAt: number | undefined;\n /** `performance.now()` of the most recent inbound message dispatched\n * upward for this `documentId` from this peer. `undefined` means we\n * have never received a sync message for this document from this\n * peer — they have not announced their copy of this handle to us. */\n lastSyncMessageInAt: number | undefined;\n /** Byte length of the most recent outbound sync message (the raw\n * `RTCDataChannel.send` payload, which is the crypto-wrapped envelope\n * — not the inner Automerge sync size). `undefined` until the first\n * outbound send. Used by the polly#107 example's wire-level\n * transcript to distinguish \"Automerge generated an empty sync\n * message\" from \"Automerge generated nothing at all\". */\n lastSyncMessageOutSize: number | undefined;\n /** Type field of the most recent outbound message for this document\n * to this peer. Typically `\"sync\"` once handshake has begun, or\n * `\"request\"` while the local side is still asking. `undefined`\n * until the first outbound send. */\n lastSyncMessageOutType: string | undefined;\n}\n\n/** Initial state for a {@link HandleSyncSnapshot}. */\nfunction emptyHandleSyncSnapshot(): HandleSyncSnapshot {\n return {\n lastSyncMessageOutAt: undefined,\n lastSyncMessageInAt: undefined,\n lastSyncMessageOutSize: undefined,\n lastSyncMessageOutType: undefined,\n };\n}\n\n/** State tracked for each remote peer. */\ninterface PeerSlot {\n connection: RTCPeerConnection;\n channel: RTCDataChannel | undefined;\n /** Outgoing messages queued while the channel is still connecting.\n * Typed as ArrayBuffer-backed so they are directly usable by\n * RTCDataChannel.send under TypeScript's strict buffer-source typing. */\n pendingSends: Uint8Array<ArrayBuffer>[];\n /** Partially-assembled inbound sync messages, keyed by the fragment id\n * stamped on each chunk. Entries are deleted as soon as the last\n * fragment for an id arrives and the reassembled bytes are dispatched. */\n pendingFragments: Map<string, { chunks: Map<number, Uint8Array>; total: number }>;\n /** Remote ICE candidates that arrived before `setRemoteDescription`\n * completed. addIceCandidate throws when `remoteDescription` is null,\n * and real Chrome 148+ does not internally queue these the way Chrome\n * for Testing does — so any candidate that wins the race against the\n * answer SDP would be silently dropped, leaving ICE checking with no\n * remote candidates to pair against. Drained from {@link handleAnswer}\n * and the post-`setRemoteDescription` step of {@link handleOffer}. */\n pendingRemoteIce: RTCIceCandidateInit[];\n /** Observable snapshot of any reassembly currently in progress for\n * this peer. `undefined` whenever the receive side is idle. */\n inFlightSync: InFlightSyncSnapshot | undefined;\n /** Last refreshed transport-level summary. `undefined` until the\n * caller invokes {@link MeshWebRTCAdapter.refreshTransportStats}\n * (or its idle equivalent on the mesh client). */\n transport: TransportSnapshot | undefined;\n /** Sticky cache of the most recent error reported by the data\n * channel's `onerror` event. Captured on the channel itself so the\n * value survives transient slot replacements within a single\n * connection's lifetime. */\n lastDataChannelError: string | undefined;\n /** Per-slot sync-handshake observability. Each field is populated\n * the first time its event fires on the current slot. Polly issue\n * #106 item 7. */\n lastSyncHandshakeAttempt: SyncHandshakeAttemptSnapshot;\n /** Per-handle sync bookkeeping for this peer. Keyed by\n * `documentId`. Entries are created on demand — the first time\n * {@link MeshWebRTCAdapter.send} dispatches a message carrying a\n * given documentId to this peer, or the first time a message for\n * that documentId is dispatched inbound. Polly issue #107 item 7 —\n * closes the \"handle exists in repo but Automerge never announced\n * it\" diagnostic gap. */\n handles: Map<string, HandleSyncSnapshot>;\n /** `performance.now()` at slot construction. The watchdog uses this\n * to detect slots whose `connectionState` never advances past\n * `new`/`connecting` — the polly#109 silent-throw shape — by\n * comparing against {@link SLOT_NEVER_CONNECTED_TIMEOUT_MS}. */\n createdAt: number;\n /** `performance.now()` at the most recent inbound `message` event\n * on this slot's data channel. `undefined` until the first inbound\n * frame arrives. The watchdog uses this to detect connected slots\n * whose remote process died without an OS-layer FIN — the polly#110\n * shape — by comparing against {@link SLOT_IDLE_TIMEOUT_MS} once\n * the channel has opened. */\n lastInboundAt: number | undefined;\n}\n\n/**\n * Automerge-Repo NetworkAdapter backed by real WebRTC data channels.\n * Manages one RTCPeerConnection per remote peer and uses a supplied\n * {@link MeshSignalingClient} for SDP/ICE exchange.\n */\nexport class MeshWebRTCAdapter extends NetworkAdapter {\n readonly signaling: MeshSignalingClient;\n readonly iceServers: RTCIceServer[];\n readonly iceTransportPolicy: RTCIceTransportPolicy | undefined;\n private readonly iceRelayEnforcement: boolean;\n readonly dataChannelLabel: string;\n /** Peers this adapter is willing to dial. Mutable so callers that pair\n * a new device after construction (e.g. a CLI `add-device` process whose\n * mesh client is long-lived across the pair ceremony) can register the\n * new peer with {@link addKnownPeer} without restarting the client.\n *\n * Used only in the captured-set fallback path — when no\n * {@link keyringSource} is supplied. With `keyringSource` set, the\n * authoritative source is the live keyring and this Set is unused. */\n private readonly knownPeers: Set<string>;\n /** Live keyring source, or undefined when the adapter is operating in\n * the captured-set fallback shape. See the JSDoc on\n * {@link MeshWebRTCAdapterOptions.keyringSource}. */\n private readonly keyringSource: (() => MeshKeyring) | undefined;\n /** Interval handle for the periodic re-sweep that catches peers\n * already in the signalling roster when the keyring grew. Cleared in\n * {@link MeshWebRTCAdapter.disconnect}. */\n private knownPeersRefreshTimer: ReturnType<typeof setInterval> | undefined;\n /** Sweep interval. Resolved from\n * {@link MeshWebRTCAdapterOptions.knownPeersRefreshIntervalMs} at\n * construction. Defaults to 2000ms; tests override to 100–250ms. */\n private readonly knownPeersRefreshIntervalMs: number;\n /** When `true`, the sender side awaits between batches of fragment\n * sends and the receiver side schedules dispatch via `setTimeout(0)`\n * so the JS event loop can drain timers (including the consumer's\n * own setInterval-based liveness probes) between large-message\n * apply calls. Defaults to `true`; set to `false` only by the\n * `POLLY_104_DISABLE_FIX` falsification path. */\n private readonly syncYieldEnabled: boolean;\n /** Resolved chunk size for fragmenting oversized messages.\n * Defaults to {@link SYNC_FRAGMENT_CHUNK_SIZE}; can be overridden\n * via {@link MeshWebRTCAdapterOptions.syncFragmentChunkSizeOverride}. */\n private readonly syncFragmentChunkSize: number;\n /** Peers currently visible in the signalling roster — populated by\n * {@link handlePeersPresent} / {@link handlePeerJoined} and pruned by\n * {@link handlePeerLeft}. Read by {@link addKnownPeer} to decide\n * whether the new peer is already online and an offer can fire now. */\n private readonly presentPeers = new Set<string>();\n /** Local peer id captured at construction time. The base\n * `NetworkAdapter.peerId` is only populated when `connect()` fires,\n * which means glare-resolution and peer-discovery dispatch would\n * otherwise have no id to compare against before the first incoming\n * message. Keeping a private mirror keeps those code paths honest\n * without depending on Automerge's lifecycle. */\n private readonly localPeerId: string;\n private readonly RTCPeerConnectionCtor: typeof RTCPeerConnection;\n private readonly slots = new Map<string, PeerSlot>();\n private ready = false;\n private readyResolver: (() => void) | undefined;\n /** Sticky cache of the most recent {@link SlotInitiationDecision}\n * per peer. Updated on every `shouldInitiateTo` call and on every\n * caught throw inside the sweep loop, so a snapshot taken at any\n * moment can answer \"why is there no slot for this peer right\n * now?\". Polly issue #106 item 7. */\n private readonly lastSlotInitiationDecisions = new Map<string, SlotInitiationDecision>();\n /** Tick count of the periodic sweep — incremented inside the\n * `setInterval` callback, exposed via {@link getPeerStateSnapshot}.\n * Lets a consumer rule out \"sweep is dead\" before chasing the\n * shouldInitiateTo gates. */\n private sweepRunCount = 0;\n /** `performance.now()` at the last sweep tick. Paired with\n * {@link sweepRunCount} so a stalled sweep is visible at a glance\n * via the snapshot's `sweep` block. */\n private lastSweepAt: number | undefined;\n /** Watchdog interval (polly#109 + polly#110). Tears down slots that\n * never reach `connected`, or that look connected but have not\n * received bytes for {@link slotIdleTimeoutMs}, so the recovery\n * sweep can re-attempt. Cleared in {@link disconnect}. */\n private slotWatchdogTimer: ReturnType<typeof setInterval> | undefined;\n private readonly slotNeverConnectedTimeoutMs: number;\n private readonly slotIdleTimeoutMs: number;\n private readonly slotWatchdogIntervalMs: number;\n\n /** The peers this adapter will dial. Backward-compatible read accessor\n * for callers that previously iterated the `knownPeerIds` array. With\n * a {@link MeshWebRTCAdapterOptions.keyringSource} configured, the\n * value is read live from the keyring; otherwise it falls back to the\n * captured Set populated through the constructor and\n * {@link addKnownPeer}. */\n get knownPeerIds(): string[] {\n if (this.keyringSource !== undefined) {\n return [...this.keyringSource().knownPeers.keys()].filter((id) => id !== this.localPeerId);\n }\n return [...this.knownPeers];\n }\n\n /** True iff `remotePeerId` is currently in the authoritative\n * knownPeers source — the live keyring when one was supplied, or\n * the captured Set otherwise. Centralises the membership check so\n * {@link shouldInitiateTo} and the JSDoc on\n * {@link MeshWebRTCAdapterOptions.keyringSource} agree on the rule. */\n private hasKnownPeer(remotePeerId: string): boolean {\n if (this.keyringSource !== undefined) {\n return this.keyringSource().knownPeers.has(remotePeerId);\n }\n return this.knownPeers.has(remotePeerId);\n }\n\n /** Callback for incoming blob messages. Set by the blob store.\n * Called with the sender's peer ID, the raw header object, and the\n * binary payload (chunk data). */\n onBlobMessage?: (peerId: string, header: Record<string, unknown>, data: Uint8Array) => void;\n\n constructor(options: MeshWebRTCAdapterOptions) {\n super();\n this.signaling = options.signaling;\n this.iceServers = options.iceServers ?? DEFAULT_ICE_SERVERS;\n this.iceTransportPolicy = options.iceTransportPolicy;\n this.iceRelayEnforcement = options.iceRelayEnforcement ?? true;\n this.dataChannelLabel = options.dataChannelLabel ?? \"polly-mesh\";\n this.knownPeers = new Set(options.knownPeerIds ?? []);\n this.keyringSource = options.keyringSource;\n this.knownPeersRefreshIntervalMs = options.knownPeersRefreshIntervalMs ?? 2000;\n this.syncYieldEnabled = options.syncYieldEnabled ?? true;\n this.syncFragmentChunkSize = options.syncFragmentChunkSizeOverride ?? SYNC_FRAGMENT_CHUNK_SIZE;\n this.slotNeverConnectedTimeoutMs =\n options.slotNeverConnectedTimeoutMs ?? SLOT_NEVER_CONNECTED_TIMEOUT_MS;\n this.slotIdleTimeoutMs = options.slotIdleTimeoutMs ?? SLOT_IDLE_TIMEOUT_MS;\n this.slotWatchdogIntervalMs = options.slotWatchdogIntervalMs ?? SLOT_WATCHDOG_INTERVAL_MS;\n this.localPeerId = options.peerId;\n const PC = options.RTCPeerConnection ?? globalThis.RTCPeerConnection;\n if (typeof PC !== \"function\") {\n throw new Error(\n \"MeshWebRTCAdapter: no RTCPeerConnection implementation found. Pass one via options.RTCPeerConnection (e.g. from `werift` or `@roamhq/wrtc`), or run in a browser where `globalThis.RTCPeerConnection` exists.\"\n );\n }\n this.RTCPeerConnectionCtor = PC;\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n /** The current number of peer slots the adapter is tracking. Each\n * slot is one ordered pair (local peer ↔ remote peer) with its own\n * RTCPeerConnection and data channel. Exposed for tests that assert\n * \"exactly one channel per pair\" after discovery settles. */\n peerSlotCount(): number {\n return this.slots.size;\n }\n\n /** Snapshot of the adapter's per-peer state at the moment of the\n * call. Returned values are plain data — strings and booleans only —\n * so consumers can log, assert on, or render them without retaining\n * references into the adapter's internals.\n *\n * Polly issue #103 asked for an inspection surface so a consumer\n * harness can answer \"is the mesh layer in a known good state\" from\n * outside polly. This method is that surface. The fields mirror the\n * three layers of the WebRTC connection lifecycle so a \"stuck\"\n * connection can be diagnosed without reaching for the browser\n * devtools: the SDP signalling state, the ICE checking state, and\n * the unified RTCPeerConnection connection state. A `dataChannel`\n * field reports whether the data channel — the thing the mesh\n * actually carries bytes over — is open.\n *\n * Peers visible in the signalling roster but not yet dialled appear\n * with `slot: undefined`, so a consumer can tell \"we know about this\n * peer in signalling but the WebRTC adapter has not started an\n * offer yet\" from \"we have a slot in some negotiation state\". */\n getPeerStateSnapshot(): {\n localPeerId: string;\n knownPeerIds: string[];\n presentPeerIds: string[];\n sweep: SweepSnapshot;\n peers: Array<{\n peerId: string;\n knownInKeyring: boolean;\n presentInSignalling: boolean;\n slotInitiationRejectionReason: SlotInitiationRejectionReason | undefined;\n slotInitiationDecision: SlotInitiationDecision;\n slot:\n | undefined\n | {\n signalingState: string;\n iceConnectionState: string;\n connectionState: string;\n dataChannelState: string;\n pendingSendCount: number;\n pendingRemoteIceCount: number;\n inFlightSync: InFlightSyncSnapshot | undefined;\n transport: TransportSnapshot | undefined;\n lastSyncHandshakeAttempt: SyncHandshakeAttemptSnapshot;\n handles: Record<string, HandleSyncSnapshot>;\n createdAt: number;\n lastInboundAt: number | undefined;\n };\n }>;\n } {\n const knownPeerIds = this.knownPeerIds;\n const presentPeerIds = [...this.presentPeers];\n const knownPeerSet = new Set(knownPeerIds);\n const allPeers = new Set<string>();\n for (const id of knownPeerIds) allPeers.add(id);\n for (const id of presentPeerIds) allPeers.add(id);\n for (const id of this.slots.keys()) allPeers.add(id);\n const peers: ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"] = [];\n for (const peerId of allPeers) {\n const slot = this.slots.get(peerId);\n const decision = this.snapshotInitiationDecision(peerId);\n peers.push({\n peerId,\n knownInKeyring: knownPeerSet.has(peerId),\n presentInSignalling: this.presentPeers.has(peerId),\n // Top-level convenience: same value as\n // `slotInitiationDecision.reason`, hoisted so log lines that\n // only need the named reason can read it without a nested\n // access. Polly issue #106 item 7.\n slotInitiationRejectionReason: decision.reason,\n slotInitiationDecision: decision,\n slot: slot ? serialiseSlotView(slot) : undefined,\n });\n }\n return {\n localPeerId: this.localPeerId,\n knownPeerIds,\n presentPeerIds,\n sweep: {\n enabled: this.knownPeersRefreshTimer !== undefined,\n intervalMs: this.knownPeersRefreshIntervalMs,\n runCount: this.sweepRunCount,\n lastRunAt: this.lastSweepAt,\n },\n peers,\n };\n }\n\n /** Handle the signalling server's `peer-joined` notification: a new\n * peer has appeared on the relay. If the peer is in `knownPeerIds`\n * and we do not already have a slot for it, and the tie-break rule\n * designates us as the initiator (our peerId compares greater than\n * theirs), open an initiating slot and fire the SDP offer. Otherwise\n * do nothing — either we are not interested in this peer, we are\n * already connected, or the other side is the one expected to\n * initiate. */\n handlePeerJoined(remotePeerId: string): void {\n this.presentPeers.add(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n\n /** Handle the signalling server's `peers-present` notification sent\n * once to a newcomer. Applies the same filter as handlePeerJoined to\n * every listed peer, so a device joining into an established lobby\n * dials every knownPeer it is meant to initiate to in one pass. */\n handlePeersPresent(peerIds: string[]): void {\n for (const remotePeerId of peerIds) {\n this.presentPeers.add(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) continue;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n }\n\n /** Construct an initiating slot inside a per-peer try/catch and\n * record any throw as a `fatal-error` rejection on the per-peer\n * decision map so the snapshot surface names it. Every dial entry\n * point ({@link handlePeerJoined}, {@link handlePeersPresent},\n * {@link addKnownPeer}, {@link refreshKnownPeers}) routes through\n * here so a single peer's broken construction can never take down a\n * batch of peers — pre-#106 a thrown `new RTCPeerConnection()`\n * inside `handlePeersPresent` would skip every later peer in the\n * same batch with no observable trace because the signalling\n * client's frame dispatch swallowed the rejection. */\n private tryCreateInitiatingSlot(remotePeerId: string): void {\n try {\n this.createInitiatingSlot(remotePeerId);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.lastSlotInitiationDecisions.set(remotePeerId, {\n decision: \"rejected\",\n reason: \"fatal-error\",\n error: message,\n at: performance.now(),\n });\n }\n }\n\n /** Handle the signalling server's `peer-left` notification: a\n * previously joined peer has closed its socket. Evict any slot we\n * hold for that peer so a subsequent `peer-joined` from the same\n * peerId (a reconnect) creates a fresh slot rather than colliding\n * with a stale RTCPeerConnection that WebRTC's own ICE timer has\n * not yet noticed is dead. */\n handlePeerLeft(remotePeerId: string): void {\n this.presentPeers.delete(remotePeerId);\n const slot = this.slots.get(remotePeerId);\n if (!slot) return;\n slot.channel?.close();\n slot.connection.close();\n this.slots.delete(remotePeerId);\n }\n\n /** Register a peer the adapter should dial. Used by post-construction\n * pair-acceptance flows — when a long-lived mesh client (e.g. a CLI\n * `add-device` process or a daemon holding the mesh open) accepts a\n * pair token after start-up, its keyring's `knownPeers` map gains a\n * new entry. Calling this method propagates that into the adapter's\n * own allowlist; if the peer is already in the signalling roster and\n * the tie-break rule names us as the initiator, an SDP offer fires\n * immediately. No-op if the peer is already known.\n *\n * When a {@link MeshWebRTCAdapterOptions.keyringSource} is configured\n * the adapter already reads `knownPeers` live and the periodic sweep\n * picks up the new entry within\n * {@link MeshWebRTCAdapterOptions.knownPeersRefreshIntervalMs} on its\n * own, so explicit calls to this method are not required for\n * correctness — but remain supported for callers that want the\n * \"dial now if present\" prompt without waiting for the next sweep. */\n addKnownPeer(remotePeerId: string): void {\n if (remotePeerId === this.localPeerId) return;\n if (this.keyringSource === undefined) {\n // Captured-set fallback path: keep the legacy mutation behaviour\n // so existing consumers that wire the adapter directly without a\n // keyringSource still work.\n if (this.knownPeers.has(remotePeerId)) return;\n this.knownPeers.add(remotePeerId);\n }\n if (!this.presentPeers.has(remotePeerId)) return;\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n\n /** Re-evaluate every peer currently in the signalling roster and\n * dial the ones the keyring authorises that we do not already have\n * a slot for. The periodic sweep started in {@link connect} calls\n * this; consumers can call it manually to skip the wait after they\n * apply a fresh pairing token. Idempotent.\n *\n * A throw from {@link createInitiatingSlot} for one peer must not\n * prevent the sweep from continuing to the next one — pre-#106 a\n * synchronous throw inside `new RTCPeerConnection()` (a real risk\n * once the page has built dozens of connections and Chrome's\n * per-page cap is in play) skipped every later peer in the same\n * sweep, with no observable trace because `setInterval` swallows\n * the rejection silently. {@link tryCreateInitiatingSlot} caches\n * the error onto the snapshot's slotInitiationRejectionReason as\n * `fatal-error` so the failing peer is named instead of disguised\n * as \"(no slot)\". */\n refreshKnownPeers(): void {\n for (const remotePeerId of this.presentPeers) {\n if (!this.shouldInitiateTo(remotePeerId)) continue;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n }\n\n private shouldInitiateTo(remotePeerId: string): boolean {\n const reason = this.evaluateInitiation(remotePeerId);\n this.lastSlotInitiationDecisions.set(remotePeerId, {\n decision: reason === undefined ? \"accepted\" : \"rejected\",\n reason,\n error: undefined,\n at: performance.now(),\n });\n return reason === undefined;\n }\n\n /** Pure-function form of the gate cascade behind {@link shouldInitiateTo}.\n * Returns `undefined` when every gate passes (the slot would be\n * built); otherwise returns the named reason the dial was declined.\n * Pulling the gates out of the boolean wrapper lets the snapshot\n * surface name *which* gate stopped construction without the caller\n * having to re-implement the check. Polly issue #106 item 7.\n *\n * The \"not-present\" gate is checked here even though the inbound\n * call sites (`handlePeerJoined`, `handlePeersPresent`,\n * `refreshKnownPeers`, `addKnownPeer`) only invoke `shouldInitiateTo`\n * for peers in the signalling roster — so on those paths the gate\n * never fires. It's load-bearing on the snapshot path, where the\n * reason is computed for every peer the caller might ask about\n * (including keyring entries that aren't currently signalling). */\n private evaluateInitiation(remotePeerId: string): SlotInitiationRejectionReason | undefined {\n if (remotePeerId === this.localPeerId) return \"self\";\n if (!this.hasKnownPeer(remotePeerId)) return \"not-in-keyring\";\n if (!this.presentPeers.has(remotePeerId)) return \"not-present\";\n if (this.slots.has(remotePeerId)) return \"slot-already-exists\";\n // Tie-break: the lexicographically higher peer id initiates. This\n // matches the glare-resolution rule in handleOffer, so pre-offer\n // filtering eliminates the glare pathway for the common case where\n // both sides learn of each other at roughly the same moment.\n if (this.localPeerId <= remotePeerId) return \"tie-break-other-side\";\n return undefined;\n }\n\n /** Compute the latest initiation decision for a peer at snapshot\n * time. Prefers the cached decision when a sweep tick fixed the\n * outcome to `fatal-error` (a thrown construction is sticky until\n * the next successful sweep clears it); otherwise re-evaluates the\n * gates against current state. Pure read; never mutates the map. */\n private snapshotInitiationDecision(remotePeerId: string): SlotInitiationDecision {\n const cached = this.lastSlotInitiationDecisions.get(remotePeerId);\n if (cached?.reason === \"fatal-error\") return cached;\n const reason = this.evaluateInitiation(remotePeerId);\n return {\n decision: reason === undefined ? \"accepted\" : \"rejected\",\n reason,\n error: undefined,\n at: performance.now(),\n };\n }\n\n whenReady(): Promise<void> {\n if (this.ready) return Promise.resolve();\n return new Promise((resolve) => {\n this.readyResolver = resolve;\n });\n }\n\n /**\n * Start the adapter. Marks the adapter ready so Automerge's\n * NetworkSubsystem begins routing messages through it. Discovery of\n * peers is driven entirely by the signalling server's\n * `peers-present` and `peer-joined` frames, handed to\n * {@link handlePeersPresent} and {@link handlePeerJoined}. A peer\n * that calls `signaling.connect()` at any point — before or after\n * this method — will either find its targets already in the server's\n * lobby (peers-present) or learn about them as they arrive\n * (peer-joined); either way the adapter only opens one\n * initiating slot per ordered pair.\n */\n connect(peerId: PeerId, peerMetadata?: PeerMetadata): void {\n this.peerId = peerId;\n if (peerMetadata !== undefined) {\n this.peerMetadata = peerMetadata;\n }\n this.ready = true;\n this.readyResolver?.();\n this.startKnownPeersSweep();\n this.startSlotWatchdog();\n }\n\n disconnect(): void {\n this.stopKnownPeersSweep();\n this.stopSlotWatchdog();\n for (const slot of this.slots.values()) {\n slot.channel?.close();\n slot.connection.close();\n }\n this.slots.clear();\n this.signaling.close();\n this.ready = false;\n this.emit(\"close\");\n }\n\n /** Start the periodic re-sweep that catches peers added to the\n * keyring after their `peer-joined` notification has already fired.\n * No-op when no keyringSource was supplied — the captured-set\n * fallback has no live source to re-read, so the sweep would be\n * useless. No-op when the interval is configured to 0.\n *\n * Each tick increments {@link sweepRunCount} and stamps\n * {@link lastSweepAt} *before* dispatching to\n * {@link refreshKnownPeers} so a snapshot can distinguish \"sweep is\n * running but every peer is rejected\" from \"sweep is dead\". An\n * outer try/catch keeps the timer alive even if the per-peer\n * try/catch inside `refreshKnownPeers` somehow leaks. Polly issue\n * #106 item 7. */\n private startKnownPeersSweep(): void {\n if (this.keyringSource === undefined) return;\n if (this.knownPeersRefreshIntervalMs <= 0) return;\n if (this.knownPeersRefreshTimer !== undefined) return;\n this.knownPeersRefreshTimer = setInterval(() => {\n this.sweepRunCount += 1;\n this.lastSweepAt = performance.now();\n try {\n this.refreshKnownPeers();\n } catch {\n // The per-peer try/catch inside refreshKnownPeers should\n // already have caught construction errors. This outer catch\n // is a last-resort belt that keeps the interval alive even\n // if a future change adds a non-per-peer throw site.\n }\n }, this.knownPeersRefreshIntervalMs);\n }\n\n private stopKnownPeersSweep(): void {\n if (this.knownPeersRefreshTimer === undefined) return;\n clearInterval(this.knownPeersRefreshTimer);\n this.knownPeersRefreshTimer = undefined;\n }\n\n /** Close a slot's data channel and connection, remove it from the\n * map, and emit `peer-disconnected` upward so Automerge stops\n * routing through the dead pair. Used by both the polly#109\n * `.catch` in {@link createInitiatingSlot} and the polly#109/#110\n * watchdog in {@link sweepWedgedSlots}. */\n private tearDownWedgedSlot(peerId: string): void {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n // Delete from the map BEFORE closing the connection. The\n // `connection.close()` call below transitions the connection to\n // `closed` synchronously on some implementations, which re-enters\n // `onconnectionstatechange` — and that handler emits its own\n // `peer-disconnected` if it sees the slot still mapped. Removing\n // it first makes the handler's `has(peerId)` check false so we\n // own the single emit.\n this.slots.delete(peerId);\n try {\n slot.channel?.close();\n } catch {\n // werift's data channel `close()` can throw if the underlying\n // connection has already gone away; swallow so a teardown\n // never leaks an exception out of the watchdog loop.\n }\n try {\n slot.connection.close();\n } catch {\n // Same rationale as above.\n }\n this.emit(\"peer-disconnected\", { peerId: peerId as unknown as PeerId });\n }\n\n /** Start the slot watchdog (polly#109 + polly#110). Walks every\n * active slot every {@link slotWatchdogIntervalMs} and tears down\n * the two named wedge shapes:\n *\n * - `connectionState` in `new`/`connecting` for longer than\n * {@link slotNeverConnectedTimeoutMs} (polly#109: silent\n * `createOffer`/`setLocalDescription` rejection, or a network\n * condition under which ICE never gathers).\n *\n * - `connectionState === \"connected\"` AND data channel `open` AND\n * no inbound bytes for {@link slotIdleTimeoutMs} (polly#110:\n * remote process killed without OS-layer FIN — ICE keepalives\n * take many minutes to fail, the slot sends sync traffic into\n * the void until then).\n *\n * Each teardown stamps `fatal-error` on the per-peer decision so\n * the named gate is visible on the next snapshot, then emits\n * `peer-disconnected` so Automerge stops routing through the dead\n * slot. The next sweep tick re-evaluates and the recovery path\n * creates a fresh slot. No-op when configured to 0. */\n private startSlotWatchdog(): void {\n if (this.slotWatchdogIntervalMs <= 0) return;\n if (this.slotWatchdogTimer !== undefined) return;\n this.slotWatchdogTimer = setInterval(() => {\n try {\n this.sweepWedgedSlots();\n } catch {\n // Belt-and-braces: the per-slot loop already swallows\n // teardown errors. A non-per-slot throw should still leave\n // the timer alive.\n }\n }, this.slotWatchdogIntervalMs);\n }\n\n private stopSlotWatchdog(): void {\n if (this.slotWatchdogTimer === undefined) return;\n clearInterval(this.slotWatchdogTimer);\n this.slotWatchdogTimer = undefined;\n }\n\n private sweepWedgedSlots(): void {\n const now = performance.now();\n const peerIds = [...this.slots.keys()];\n for (const peerId of peerIds) {\n const slot = this.slots.get(peerId);\n if (!slot) continue;\n const reason = this.classifyWedgedSlot(slot, now);\n if (!reason) continue;\n this.lastSlotInitiationDecisions.set(peerId, {\n decision: \"rejected\",\n reason: \"fatal-error\",\n error: reason,\n at: now,\n });\n this.tearDownWedgedSlot(peerId);\n }\n }\n\n /** Decide whether a slot is wedged at the moment of inspection,\n * returning the human-readable diagnosis when it is. Pulled out of\n * {@link sweepWedgedSlots} so the per-slot decision stays under\n * biome's cognitive-complexity ceiling and so a future test can\n * exercise the gates directly. */\n private classifyWedgedSlot(slot: PeerSlot, now: number): string | undefined {\n const state = slot.connection.connectionState;\n const ageMs = now - slot.createdAt;\n if (\n this.slotNeverConnectedTimeoutMs > 0 &&\n (state === \"new\" || state === \"connecting\") &&\n ageMs > this.slotNeverConnectedTimeoutMs\n ) {\n return `slot never reached connected (state=${state}) after ${Math.round(ageMs)}ms`;\n }\n if (\n this.slotIdleTimeoutMs > 0 &&\n state === \"connected\" &&\n slot.channel?.readyState === \"open\"\n ) {\n const lastInbound = slot.lastInboundAt ?? slot.createdAt;\n const idleMs = now - lastInbound;\n if (idleMs > this.slotIdleTimeoutMs) {\n return `slot idle: no inbound bytes for ${Math.round(idleMs)}ms (state=connected, dc=open)`;\n }\n }\n return undefined;\n }\n\n /**\n * Send a sync message to a specific remote peer. If no RTCPeerConnection\n * exists yet, the adapter initiates one by producing an SDP offer and\n * sending it through the signalling channel; the outgoing bytes are\n * queued until the data channel is open.\n */\n send(message: Message): void {\n const targetId = message.targetId as unknown as string;\n const bytes = this.serialiseMessage(message);\n let slot = this.slots.get(targetId);\n if (!slot) {\n slot = this.createInitiatingSlot(targetId);\n }\n if (slot.lastSyncHandshakeAttempt.firstOutboundSendAt === undefined) {\n slot.lastSyncHandshakeAttempt.firstOutboundSendAt = performance.now();\n }\n // Per-handle wire-level transcript (polly#107 item 5). Automerge\n // stamps `documentId` on every sync/request/remote-heads/etc.\n // message; messages without a documentId (the synchronizer never\n // emits one without it, but the type union allows for legacy\n // ephemeral envelopes) are skipped here rather than blanketing\n // every peer's handle map with a noise key. `wrap` in\n // {@link MeshNetworkAdapter} now preserves `documentId` in the\n // outer envelope so this stamp survives the crypto layer.\n const documentId = (message as unknown as { documentId?: string }).documentId;\n if (typeof documentId === \"string\") {\n let handleEntry = slot.handles.get(documentId);\n if (!handleEntry) {\n handleEntry = emptyHandleSyncSnapshot();\n slot.handles.set(documentId, handleEntry);\n }\n handleEntry.lastSyncMessageOutAt = performance.now();\n handleEntry.lastSyncMessageOutSize = bytes.length;\n handleEntry.lastSyncMessageOutType =\n typeof message.type === \"string\" ? message.type : undefined;\n }\n if (slot.channel && slot.channel.readyState === \"open\") {\n void this.sendBytesMaybeFragmented(slot.channel, bytes);\n } else {\n slot.pendingSends.push(bytes);\n }\n }\n\n /** Number of consecutive fragment sends after which the sender\n * yields to the macrotask queue when {@link syncYieldEnabled} is on.\n * 8 × 64 KiB = 512 KiB of bytes between yields — small enough that\n * a 5 MB sync produces many yield points (and the JS event loop\n * drains the consumer's `setInterval` liveness probes between\n * them), large enough that the per-yield overhead does not dominate\n * the wire cost. */\n private static readonly SEND_YIELD_EVERY_N_FRAGMENTS = 8;\n\n /** Send raw wire bytes, fragmenting if they exceed the SCTP maxMessageSize\n * cap. The default RTCDataChannel limit is 256 KiB in current Chrome and\n * werift; oversized sends either throw, drop silently, or stall the\n * channel, none of which surface as an error to the caller. Fragments\n * use the same length-prefixed JSON header wire format as ordinary\n * messages but carry a `sync-fragment` type that the receive path\n * detects and reassembles before deserialising.\n *\n * When {@link MeshWebRTCAdapterOptions.syncYieldEnabled} is true (the\n * default), the loop awaits the macrotask queue every\n * {@link SEND_YIELD_EVERY_N_FRAGMENTS} fragments so the JS event\n * loop drains between batches — without this, a 5–8 MB initial\n * sync produces 78–125 back-to-back `RTCDataChannel.send` calls in\n * a tight loop, starving anything else on the main thread (polly\n * issue #104, sender side). When the option is false the legacy\n * tight-loop shape is preserved for the falsification path. */\n private async sendBytesMaybeFragmented(\n channel: RTCDataChannel,\n bytes: Uint8Array<ArrayBuffer>\n ): Promise<void> {\n if (bytes.length <= SYNC_FRAGMENT_THRESHOLD) {\n channel.send(bytes);\n return;\n }\n const id = crypto.randomUUID();\n const fragments = chunkSyncMessage(bytes, id, this.syncFragmentChunkSize);\n if (!this.syncYieldEnabled) {\n for (const fragment of fragments) {\n channel.send(fragment);\n }\n return;\n }\n let i = 0;\n for (const fragment of fragments) {\n channel.send(fragment);\n i += 1;\n if (i % MeshWebRTCAdapter.SEND_YIELD_EVERY_N_FRAGMENTS === 0 && i < fragments.length) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n }\n }\n\n /**\n * Entry point the signalling client calls when it receives a signal\n * from a remote peer. Dispatches on the payload `kind` to either\n * accept an offer (building an answer), apply an answer, or add an\n * ICE candidate. Exposed publicly so the caller that constructs the\n * signalling client can wire the onSignal callback directly to this\n * method.\n */\n handleSignal(fromPeerId: string, rawPayload: unknown): void {\n const payload = rawPayload as unknown as SignalingPayload;\n if (!payload || typeof payload !== \"object\" || !(\"kind\" in payload)) {\n return;\n }\n switch (payload.kind) {\n case \"offer\":\n void this.handleOffer(fromPeerId, payload.sdp);\n return;\n case \"answer\":\n void this.handleAnswer(fromPeerId, payload.sdp);\n return;\n case \"ice\":\n void this.handleIceCandidate(fromPeerId, payload.candidate);\n return;\n }\n }\n\n /** Assemble the {@link RTCConfiguration} every new\n * {@link RTCPeerConnection} is built with. Centralised so every slot\n * (initiator and answerer) honours the same iceTransportPolicy. */\n private buildRtcConfiguration(): RTCConfiguration {\n const config: RTCConfiguration = { iceServers: this.iceServers };\n if (this.iceTransportPolicy !== undefined) {\n config.iceTransportPolicy = this.iceTransportPolicy;\n }\n return config;\n }\n\n /** Decide whether a local ICE candidate should be relayed through\n * the signalling channel to the remote peer. Chrome's iceTransport\n * Policy = \"relay\" implementation filters non-relay candidates at\n * the source so the remote peer never sees them; werift's only\n * filters its own outgoing connectivity checks and still emits host\n * and srflx candidates upstream, so a remote peer with policy \"all\"\n * can pair against them — making relay-only enforcement leaky in\n * the mixed-implementation case the polly#105 falsification harness\n * exposes. Mirroring Chrome's filter at this layer gives a uniform\n * contract on every RTCPeerConnection implementation polly supports.\n *\n * The candidate `type` field is the SDP-spec form; we additionally\n * parse it out of the legacy `candidate` string for implementations\n * that don't surface the typed field directly (werift exposes the\n * SDP string only). */\n private isRelayCandidateInit(init: RTCIceCandidateInit): boolean {\n const candidateStr = init.candidate ?? \"\";\n const m = candidateStr.match(/\\btyp\\s+(\\S+)/i);\n return m?.[1]?.toLowerCase() === \"relay\";\n }\n\n private shouldSendCandidate(candidate: RTCIceCandidate): boolean {\n if (!this.iceRelayEnforcement) return true;\n if (this.iceTransportPolicy !== \"relay\") return true;\n const typed = (candidate as unknown as { type?: string }).type;\n const match = candidate.candidate.match(/\\btyp\\s+(\\S+)/i);\n const candidateType = (typed ?? match?.[1] ?? \"\").toLowerCase();\n return candidateType === \"relay\";\n }\n\n /** Strip non-relay `a=candidate:` lines from an SDP when\n * iceTransportPolicy is `\"relay\"`. Some RTCPeerConnection\n * implementations (werift, notably) embed every gathered candidate\n * in the SDP regardless of policy, and a remote peer parsing those\n * via `setRemoteDescription` will pair against them — bypassing the\n * relay-only contract. Chrome already filters in-SDP candidates by\n * policy, so this is only load-bearing for werift consumers, but\n * the SDP rewrite is implementation-agnostic and idempotent. */\n private filterSdpCandidatesByPolicy(sdp: string | undefined): string | undefined {\n if (!this.iceRelayEnforcement) return sdp;\n if (this.iceTransportPolicy !== \"relay\") return sdp;\n if (!sdp) return sdp;\n const lines = sdp.split(/\\r?\\n/);\n const filtered: string[] = [];\n for (const line of lines) {\n if (!line.startsWith(\"a=candidate:\")) {\n filtered.push(line);\n continue;\n }\n const m = line.match(/\\btyp\\s+(\\S+)/i);\n if (m?.[1]?.toLowerCase() === \"relay\") filtered.push(line);\n }\n return filtered.join(\"\\r\\n\");\n }\n\n /** Apply {@link filterSdpCandidatesByPolicy} to an SDP\n * description ahead of `setLocalDescription` (filter outgoing) or\n * `setRemoteDescription` (filter incoming). The defensive\n * receive-side filter exists because we cannot trust the remote\n * peer's adapter to have stripped its non-relay candidates first —\n * polly might be talking to a pre-#105 polly, or to a non-polly\n * peer whose policy enforcement is different. */\n private applySdpPolicyFilter(description: RTCSessionDescriptionInit): RTCSessionDescriptionInit {\n if (!this.iceRelayEnforcement) return description;\n if (this.iceTransportPolicy !== \"relay\") return description;\n const filtered = this.filterSdpCandidatesByPolicy(description.sdp);\n if (filtered === description.sdp) return description;\n return { ...description, sdp: filtered };\n }\n\n private createInitiatingSlot(targetId: string): PeerSlot {\n const connection = new this.RTCPeerConnectionCtor(this.buildRtcConfiguration());\n const channel = connection.createDataChannel(this.dataChannelLabel, { ordered: true });\n const slot: PeerSlot = {\n connection,\n channel,\n pendingSends: [],\n pendingFragments: new Map(),\n pendingRemoteIce: [],\n inFlightSync: undefined,\n transport: undefined,\n lastDataChannelError: undefined,\n lastSyncHandshakeAttempt: emptySyncHandshakeAttempt(),\n handles: new Map(),\n createdAt: performance.now(),\n lastInboundAt: undefined,\n };\n this.slots.set(targetId, slot);\n this.wireConnection(targetId, connection);\n this.wireDataChannel(targetId, channel);\n // Pre-#109: `initiateOffer` was fire-and-forget — a rejection in\n // `createOffer` or `setLocalDescription` was dropped on the floor,\n // leaving the slot at `signalingState=stable`, ICE never started\n // gathering, and the recovery sweep hit `slot-already-exists`\n // forever. The `.catch` here surfaces the failure on the snapshot\n // surface and removes the wedged slot so the next sweep retries.\n this.initiateOffer(targetId, connection).catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n this.lastSlotInitiationDecisions.set(targetId, {\n decision: \"rejected\",\n reason: \"fatal-error\",\n error: message,\n at: performance.now(),\n });\n this.tearDownWedgedSlot(targetId);\n });\n return slot;\n }\n\n private async initiateOffer(targetId: string, connection: RTCPeerConnection): Promise<void> {\n const offer = await connection.createOffer();\n await connection.setLocalDescription(offer);\n const localOffer = connection.localDescription ?? offer;\n const sdpToSend = this.applySdpPolicyFilter({\n type: localOffer.type,\n sdp: localOffer.sdp ?? offer.sdp,\n });\n this.signaling.sendSignal(targetId, {\n kind: \"offer\",\n sdp: sdpToSend,\n } satisfies SignalingPayload);\n }\n\n private async handleOffer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const existing = this.slots.get(fromPeerId);\n if (existing) {\n // Glare: we already initiated a connection to this peer. Resolve by\n // peer-id ordering: the lexicographically lower id yields its own\n // offer and accepts the incoming one. The higher id ignores the\n // incoming offer and waits for the answer to its own.\n const localId = this.peerId as unknown as string;\n if (localId > fromPeerId) {\n return;\n }\n existing.channel?.close();\n existing.connection.close();\n this.slots.delete(fromPeerId);\n }\n\n const connection = new this.RTCPeerConnectionCtor(this.buildRtcConfiguration());\n const slot: PeerSlot = {\n connection,\n channel: undefined,\n pendingSends: [],\n pendingFragments: new Map(),\n pendingRemoteIce: [],\n inFlightSync: undefined,\n transport: undefined,\n lastDataChannelError: undefined,\n lastSyncHandshakeAttempt: emptySyncHandshakeAttempt(),\n handles: new Map(),\n createdAt: performance.now(),\n lastInboundAt: undefined,\n };\n this.slots.set(fromPeerId, slot);\n this.wireConnection(fromPeerId, connection);\n connection.ondatachannel = (event) => {\n slot.channel = event.channel;\n this.wireDataChannel(fromPeerId, event.channel);\n };\n await connection.setRemoteDescription(this.applySdpPolicyFilter(sdp));\n await this.flushPendingRemoteIce(slot);\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n const localAnswer = connection.localDescription ?? answer;\n const sdpToSend = this.applySdpPolicyFilter({\n type: localAnswer.type,\n sdp: localAnswer.sdp ?? answer.sdp,\n });\n this.signaling.sendSignal(fromPeerId, {\n kind: \"answer\",\n sdp: sdpToSend,\n } satisfies SignalingPayload);\n }\n\n private async handleAnswer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n // Drop answers that arrive after the connection has already settled\n // — the signalling relay can echo a peer's frames more than once\n // under reconnect or reload, and a duplicate answer in the `stable`\n // state otherwise throws `InvalidStateError` and kills the slot. We\n // only ever expect an answer while we still have a local offer\n // pending; anything else is benign noise.\n if (slot.connection.signalingState !== \"have-local-offer\") return;\n await slot.connection.setRemoteDescription(this.applySdpPolicyFilter(sdp));\n await this.flushPendingRemoteIce(slot);\n }\n\n private async handleIceCandidate(\n fromPeerId: string,\n candidate: RTCIceCandidateInit\n ): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n // Receive-side mirror of {@link shouldSendCandidate}: even with a\n // perfectly behaved peer we cannot assume the SDP and trickle\n // streams agree on policy enforcement, and a non-polly remote may\n // not filter at all. Drop anything that isn't relay-typed when\n // the local policy is `\"relay\"`.\n if (\n this.iceRelayEnforcement &&\n this.iceTransportPolicy === \"relay\" &&\n !this.isRelayCandidateInit(candidate)\n )\n return;\n // If the answerer gathers ICE faster than its answer SDP travels\n // back through the signalling relay, candidates can land here before\n // `setRemoteDescription` has run. addIceCandidate throws when\n // `remoteDescription` is null on Chrome 148+, and the spec does not\n // require browsers to queue these internally — so buffer until the\n // remote description is set and drain in handleAnswer/handleOffer.\n if (slot.connection.remoteDescription === null) {\n slot.pendingRemoteIce.push(candidate);\n return;\n }\n try {\n await slot.connection.addIceCandidate(candidate);\n } catch {\n // Ignore candidate errors — a stale candidate after the connection\n // has already opened is benign.\n }\n }\n\n /** Drain the per-slot queue of remote ICE candidates that arrived\n * before `setRemoteDescription` completed. Errors per candidate are\n * swallowed for the same reason {@link handleIceCandidate} swallows\n * them — a single bad candidate must not stall the connection. */\n private async flushPendingRemoteIce(slot: PeerSlot): Promise<void> {\n if (slot.pendingRemoteIce.length === 0) return;\n const queued = slot.pendingRemoteIce;\n slot.pendingRemoteIce = [];\n for (const candidate of queued) {\n try {\n await slot.connection.addIceCandidate(candidate);\n } catch {\n // Same rationale as the live-path catch in handleIceCandidate.\n }\n }\n }\n\n private wireConnection(peerId: string, connection: RTCPeerConnection): void {\n connection.onicecandidate = (event) => {\n if (!event.candidate) return;\n if (!this.shouldSendCandidate(event.candidate)) return;\n this.signaling.sendSignal(peerId, {\n kind: \"ice\",\n candidate: event.candidate.toJSON(),\n } satisfies SignalingPayload);\n };\n connection.onconnectionstatechange = () => {\n const state = connection.connectionState;\n if (state === \"connected\") {\n this.emitPeerCandidateOnce(peerId);\n } else if (state === \"disconnected\" || state === \"failed\" || state === \"closed\") {\n // Polly#109/#110: `tearDownWedgedSlot` also closes the\n // connection, which re-enters this handler with\n // state=closed. Only emit if WE are the path that removed\n // the slot from the map — otherwise the wedged-slot teardown\n // would emit `peer-disconnected` twice.\n if (!this.slots.has(peerId)) return;\n this.slots.delete(peerId);\n this.emit(\"peer-disconnected\", { peerId: peerId as unknown as PeerId });\n }\n };\n }\n\n /** Emit `peer-candidate` upward exactly once per slot lifetime,\n * stamping the slot's `lastSyncHandshakeAttempt.peerCandidateEmittedAt`\n * with the moment of emission. The \"once\" semantics protect Automerge's\n * NetworkSubsystem from a double-add when both the\n * `connectionstatechange = connected` event AND the\n * `dataChannel.onopen` event fire on the same slot — under werift\n * the former is sometimes flaky, under Chrome the latter sometimes\n * fires first; pre-#106 only the connection-state path emitted, so a\n * werift slot whose data channel opened cleanly but whose connection\n * state never advanced past `connecting` would never signal \"ready\"\n * upward. Polly issue #106 Failure B item — closing one named\n * mechanism for \"data channel open, sync never started\". */\n private emitPeerCandidateOnce(peerId: string): void {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n if (slot.lastSyncHandshakeAttempt.peerCandidateEmittedAt !== undefined) return;\n slot.lastSyncHandshakeAttempt.peerCandidateEmittedAt = performance.now();\n this.emit(\"peer-candidate\", {\n peerId: peerId as unknown as PeerId,\n peerMetadata: {},\n });\n }\n\n private wireDataChannel(peerId: string, channel: RTCDataChannel): void {\n channel.onopen = () => {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n slot.lastSyncHandshakeAttempt.dataChannelOpenedAt = performance.now();\n // Mirror the connection-state `connected` path: if Automerge has\n // not yet been told the peer exists (because the connection\n // state event hasn't fired or fired with a state we don't\n // forward), the `onopen` callback is a strictly better signal\n // anyway — bytes can flow now. The dedupe inside\n // {@link emitPeerCandidateOnce} keeps Automerge's bookkeeping\n // single-add. Polly issue #106 Failure B.\n this.emitPeerCandidateOnce(peerId);\n // Drain any pending sends that were queued while the channel\n // was still connecting. The fragmenting helper handles oversized\n // payloads the same way it would on a live send.\n for (const bytes of slot.pendingSends) {\n void this.sendBytesMaybeFragmented(channel, bytes);\n }\n slot.pendingSends = [];\n };\n channel.onmessage = (event) => {\n // Polly issue #110: stamp inbound liveness at the wire boundary\n // — before deserialisation/dispatch — so the watchdog's idle\n // check is driven by \"we are still hearing from the peer\", not\n // \"we successfully decoded an Automerge message from the peer\".\n // A peer whose wire is healthy but whose envelopes fail\n // verification is still alive from the transport's point of\n // view, and the wedge this is meant to catch is bytewise\n // silence — not protocol-level corruption.\n const liveSlot = this.slots.get(peerId);\n if (liveSlot) liveSlot.lastInboundAt = performance.now();\n const data = event.data;\n if (data instanceof ArrayBuffer) {\n this.dispatchMessage(peerId, new Uint8Array(data));\n } else if (data instanceof Uint8Array) {\n this.dispatchMessage(peerId, data);\n }\n // Other types (strings, Blobs) are ignored — Polly's mesh transport\n // only sends binary payloads via this adapter.\n };\n channel.onclose = () => {\n const slot = this.slots.get(peerId);\n if (slot?.channel === channel) {\n slot.channel = undefined;\n }\n };\n // Capture the last data-channel error so a consumer harness can\n // surface \"the wire-level error that took this peer offline\" even\n // if the channel has since closed. Polly issue #105 item 7. The\n // event shape differs between Chrome (RTCErrorEvent) and werift\n // (a plain object with `.error`); we narrow to a string for both.\n channel.onerror = (event) => {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n const ev = event as unknown as { error?: { message?: unknown }; message?: unknown };\n const message =\n typeof ev.error?.message === \"string\"\n ? ev.error.message\n : typeof ev.message === \"string\"\n ? ev.message\n : \"unknown data channel error\";\n slot.lastDataChannelError = message;\n };\n }\n\n /** Refresh the per-peer {@link TransportSnapshot} for one peer by\n * pulling {@link RTCPeerConnection.getStats} and distilling the\n * result. Cheap-ish but not free — getStats walks the underlying\n * stats graph — so this is opt-in: callers (typically a debugging\n * harness or a periodic observability loop) invoke it explicitly\n * and the result lives on the slot for the next\n * {@link getPeerStateSnapshot}. Returns the refreshed snapshot, or\n * `undefined` if there is no slot for the peer or stats are\n * unavailable. Polly issue #105 item 7. */\n async refreshTransportStats(peerId: string): Promise<TransportSnapshot | undefined> {\n const slot = this.slots.get(peerId);\n if (!slot) return undefined;\n const snapshot = await collectTransportSnapshot(slot.connection, slot.lastDataChannelError);\n slot.transport = snapshot;\n return snapshot;\n }\n\n /** Refresh transport stats for every active peer slot in one shot.\n * Returns a map keyed by peerId so a caller can render the result\n * without re-walking {@link getPeerStateSnapshot}. The underlying\n * `getStats` calls run concurrently. */\n async refreshAllTransportStats(): Promise<Map<string, TransportSnapshot>> {\n const out = new Map<string, TransportSnapshot>();\n const peerIds = [...this.slots.keys()];\n const results = await Promise.all(peerIds.map((id) => this.refreshTransportStats(id)));\n for (let i = 0; i < peerIds.length; i += 1) {\n const r = results[i];\n const id = peerIds[i];\n if (r && id !== undefined) out.set(id, r);\n }\n return out;\n }\n\n private dispatchMessage(fromPeerId: string, bytes: Uint8Array): void {\n try {\n // Intercept sync-fragments first: an oversized Automerge sync\n // message is split into fragments on the sender side because a\n // single RTCDataChannel.send above the SCTP maxMessageSize cap\n // silently drops or stalls the channel. Reassemble and re-dispatch\n // once every fragment of an id has arrived.\n if (isSyncFragmentType(bytes)) {\n this.handleSyncFragment(fromPeerId, bytes);\n return;\n }\n // Intercept blob messages before they reach the Automerge deserialiser.\n // Blob headers have type fields starting with \"blob-\" and would fail\n // MeshNetworkAdapter's signed-envelope unwrap if passed through.\n if (this.onBlobMessage && isBlobMessageType(bytes)) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as Record<string, unknown>;\n const data = bytes.subarray(4 + headerLen);\n this.onBlobMessage(fromPeerId, header, data);\n return;\n }\n const message = this.deserialiseMessage(bytes);\n this.scheduleEmitMessage(fromPeerId, message, false);\n } catch {\n // Drop malformed messages silently — the MeshNetworkAdapter wrapper\n // also drops on verification failure, so a corrupt frame at this\n // layer is observationally the same as a forgery at the layer above.\n }\n }\n\n /** Hand a deserialised Automerge message off to whoever is listening\n * on this adapter's `\"message\"` event. When\n * {@link MeshWebRTCAdapterOptions.syncYieldEnabled} is true (the\n * default), the emit runs on a fresh macrotask so the crypto-unwrap\n * and Automerge `applyChanges` chain downstream of this method does\n * not sit on the same JS stack frame as the wire `onmessage` callback\n * — that's the receiver-side starvation site polly issue #104\n * documents. When the option is false the emit is synchronous,\n * recovering the pre-fix shape used by the falsification path.\n *\n * The `viaFragmentPath` argument tags whether this dispatch came out\n * of a reassembled fragment chain; only those carry an\n * `inFlightSync` reassembly state worth bookkeeping. Small\n * single-message dispatches yield but don't touch inFlightSync. */\n private scheduleEmitMessage(\n fromPeerId: string,\n message: Message,\n viaFragmentPath: boolean\n ): void {\n this.stampFirstInboundMessage(fromPeerId);\n this.stampHandleInbound(fromPeerId, message);\n if (!this.syncYieldEnabled) {\n this.emit(\"message\", message);\n if (viaFragmentPath) {\n this.finishInFlightSyncApply(fromPeerId);\n }\n return;\n }\n if (viaFragmentPath) {\n const slot = this.slots.get(fromPeerId);\n if (slot?.inFlightSync) {\n slot.inFlightSync.applyBacklog += 1;\n }\n }\n setTimeout(() => {\n try {\n this.emit(\"message\", message);\n } finally {\n if (viaFragmentPath) {\n this.finishInFlightSyncApply(fromPeerId);\n }\n }\n }, 0);\n }\n\n /** Stamp the slot's `firstInboundMessageAt` the first time a\n * dispatched (non-fragment, non-blob) message lands for a peer. Pure\n * observability for {@link SyncHandshakeAttemptSnapshot}; does not\n * affect dispatch. */\n private stampFirstInboundMessage(fromPeerId: string): void {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n if (slot.lastSyncHandshakeAttempt.firstInboundMessageAt !== undefined) return;\n slot.lastSyncHandshakeAttempt.firstInboundMessageAt = performance.now();\n }\n\n /** Stamp `handles[documentId].lastSyncMessageInAt` for the\n * per-handle observability layer polly#107 adds. Pure observability;\n * does not affect dispatch. */\n private stampHandleInbound(fromPeerId: string, message: Message): void {\n const documentId = (message as unknown as { documentId?: string }).documentId;\n if (typeof documentId !== \"string\") return;\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n let entry = slot.handles.get(documentId);\n if (!entry) {\n entry = emptyHandleSyncSnapshot();\n slot.handles.set(documentId, entry);\n }\n entry.lastSyncMessageInAt = performance.now();\n }\n\n private finishInFlightSyncApply(fromPeerId: string): void {\n const slot = this.slots.get(fromPeerId);\n if (!slot?.inFlightSync) return;\n slot.inFlightSync.applyBacklog = Math.max(0, slot.inFlightSync.applyBacklog - 1);\n this.emitSyncProgress(fromPeerId, \"dispatch-applied\", 0);\n if (slot.inFlightSync.applyBacklog === 0 && slot.pendingFragments.size === 0) {\n slot.inFlightSync = undefined;\n }\n }\n\n private emitSyncProgress(\n fromPeerId: string,\n kind: \"fragment-received\" | \"dispatch-applied\",\n bytesDelta: number\n ): void {\n const slot = this.slots.get(fromPeerId);\n const inFlightSync = slot?.inFlightSync;\n // The `sync-progress` event is polly-specific; Automerge's\n // NetworkAdapter event-type union doesn't include it. Cast around\n // the typed emit so consumers can subscribe via the same `.on(...)`\n // surface that carries `peer-candidate` and `peer-disconnected`.\n (\n this as unknown as {\n emit: (event: string, payload: SyncProgressEvent) => void;\n }\n ).emit(\"sync-progress\", {\n peerId: fromPeerId,\n kind,\n bytesDelta,\n chunksReceived: inFlightSync?.chunksReceived ?? 0,\n bytesReceived: inFlightSync?.bytesReceived ?? 0,\n applyBacklog: inFlightSync?.applyBacklog ?? 0,\n at: performance.now(),\n });\n }\n\n private handleSyncFragment(fromPeerId: string, bytes: Uint8Array): void {\n const parsed = parseSyncFragment(bytes);\n if (!parsed) return;\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n const { header, data } = parsed;\n let entry = slot.pendingFragments.get(header.id);\n if (!entry) {\n entry = { chunks: new Map(), total: header.total };\n slot.pendingFragments.set(header.id, entry);\n }\n // The data view is a window onto the wire frame buffer. Copy out so\n // the reassembled message owns its bytes and the wire frame can be\n // garbage-collected.\n entry.chunks.set(header.index, data.slice());\n if (!slot.inFlightSync) {\n slot.inFlightSync = {\n chunksReceived: 0,\n bytesReceived: 0,\n lastChunkAt: performance.now(),\n applyBacklog: 0,\n };\n }\n slot.inFlightSync.chunksReceived += 1;\n slot.inFlightSync.bytesReceived += data.byteLength;\n slot.inFlightSync.lastChunkAt = performance.now();\n this.emitSyncProgress(fromPeerId, \"fragment-received\", data.byteLength);\n if (entry.chunks.size < entry.total) return;\n slot.pendingFragments.delete(header.id);\n const reassembled = reassembleSyncFragments(entry.chunks, entry.total);\n if (!this.syncYieldEnabled) {\n this.dispatchReassembled(fromPeerId, reassembled);\n return;\n }\n setTimeout(() => {\n this.dispatchReassembled(fromPeerId, reassembled);\n }, 0);\n }\n\n /** Dispatch a reassembled fragment payload back through\n * {@link dispatchMessage}, but tagged so the\n * {@link scheduleEmitMessage} path knows it owes a\n * `finishInFlightSyncApply` afterwards. Synchronous re-entry into\n * `dispatchMessage` would lose that signal, so the post-fragment\n * deserialise+emit is inlined here. */\n private dispatchReassembled(fromPeerId: string, bytes: Uint8Array): void {\n try {\n if (this.onBlobMessage && isBlobMessageType(bytes)) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as Record<string, unknown>;\n const data = bytes.subarray(4 + headerLen);\n this.onBlobMessage(fromPeerId, header, data);\n this.finishInFlightSyncApply(fromPeerId);\n return;\n }\n const message = this.deserialiseMessage(bytes);\n this.scheduleEmitMessage(fromPeerId, message, true);\n } catch {\n // Same swallowing rationale as dispatchMessage; record the apply\n // completion so the inFlightSync state doesn't get stuck.\n this.finishInFlightSyncApply(fromPeerId);\n }\n }\n\n /** Peer IDs with an open data channel, suitable for blob requests. */\n get connectedPeerIds(): string[] {\n const ids: string[] = [];\n for (const [peerId, slot] of this.slots) {\n if (slot.channel && slot.channel.readyState === \"open\") {\n ids.push(peerId);\n }\n }\n return ids;\n }\n\n /** Send a pre-serialised blob message to a specific peer. Returns false\n * if the peer is not connected or the send buffer is above the high-water\n * mark (caller should retry after a delay). */\n sendBlobMessage(peerId: string, bytes: Uint8Array<ArrayBuffer>): boolean {\n const slot = this.slots.get(peerId);\n if (!slot?.channel || slot.channel.readyState !== \"open\") return false;\n return this.trySendOnChannel(slot.channel, bytes);\n }\n\n /** Send bytes on a data channel if the buffer is below the high-water\n * mark. Returns true if sent, false if backpressure applies. */\n private trySendOnChannel(channel: RTCDataChannel, bytes: Uint8Array<ArrayBuffer>): boolean {\n // 256 KiB high-water mark — matches the blob transfer default.\n if (channel.bufferedAmount > 256 * 1024) return false;\n channel.send(bytes);\n return true;\n }\n\n /** Pack an Automerge Message into binary for transmission over the\n * data channel. The format mirrors MeshNetworkAdapter's internal\n * serialisation: a length-prefixed JSON header followed by the raw\n * data bytes. Returns a Uint8Array<ArrayBuffer> so the result is\n * directly usable by RTCDataChannel.send under TypeScript's strict\n * buffer-source typing. */\n private serialiseMessage(message: Message): Uint8Array<ArrayBuffer> {\n const headerObj: Record<string, unknown> = {\n type: message.type,\n senderId: message.senderId,\n targetId: message.targetId,\n };\n if (\"documentId\" in message && message.documentId !== undefined) {\n headerObj[\"documentId\"] = message.documentId;\n }\n const headerBytes = new TextEncoder().encode(JSON.stringify(headerObj));\n const dataBytes: Uint8Array =\n \"data\" in message && message.data instanceof Uint8Array ? message.data : new Uint8Array(0);\n const size = 4 + headerBytes.length + dataBytes.length;\n const buffer = new ArrayBuffer(size);\n const out = new Uint8Array(buffer);\n const view = new DataView(buffer);\n view.setUint32(0, headerBytes.length, false);\n out.set(headerBytes, 4);\n out.set(dataBytes, 4 + headerBytes.length);\n return out;\n }\n\n /** Inverse of {@link serialiseMessage}. */\n private deserialiseMessage(bytes: Uint8Array): Message {\n if (bytes.length < 4) {\n throw new Error(\"MeshWebRTCAdapter: message too short to deserialise.\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) {\n throw new Error(\"MeshWebRTCAdapter: message header truncated.\");\n }\n const header = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + headerLen)));\n const data = bytes.slice(4 + headerLen);\n return { ...header, data } as unknown as Message;\n }\n}\n",
26
+ "/**\n * mesh-webrtc-adapter — Phase 2 browser-side WebRTC transport for Polly's\n * $meshState primitive. Extends Automerge's NetworkAdapter base class and\n * uses real native RTCPeerConnection / RTCDataChannel instances to carry\n * sync messages between peers.\n *\n * This is the \"base\" transport that MeshNetworkAdapter wraps with its\n * sign-then-encrypt envelope. The stack is:\n *\n * $meshState\n * └─ Repo\n * └─ MeshNetworkAdapter (sign + encrypt)\n * └─ MeshWebRTCAdapter (real data channels)\n * └─ MeshSignalingClient (SDP/ICE relay)\n * └─ signalingServer (Elysia plugin on the host app)\n *\n * Because WebRTC lives in browsers, this module is browser-only. It\n * assumes global RTCPeerConnection, RTCDataChannel, and WebSocket types\n * are available. Under bun:test the classes cannot be exercised\n * end-to-end — the first validation path is either Playwright running a\n * real browser, a Puppeteer harness, or a human testing a browser-side\n * example app that consumes the adapter.\n *\n * What this module does at runtime:\n *\n * - Constructs a MeshWebRTCAdapter with a signalling client and a local\n * peer id. No data channels exist at construction time.\n *\n * - When Automerge's NetworkSubsystem calls connect(peerId) on the\n * adapter, it starts listening for signals from remote peers and is\n * ready to build peer connections as they are discovered.\n *\n * - When a remote peer sends an SDP offer via the signalling channel,\n * the adapter builds a fresh RTCPeerConnection, accepts the offer,\n * produces an answer, sends it back through signalling, and wires the\n * received data channel to emit Automerge Message events upward.\n *\n * - When the local repo calls send(message), the adapter looks up the\n * peer connection for message.targetId and writes the serialised\n * bytes to its data channel. If no connection exists yet, the adapter\n * creates one by sending an SDP offer through signalling. Outgoing\n * messages are queued until the channel is open.\n *\n * - Disconnect tears down every peer connection and closes the\n * signalling client.\n */\n\nimport {\n type Message,\n NetworkAdapter,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\";\nimport { isBlobMessageType } from \"./blob-transfer\";\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport type { MeshSignalingClient } from \"./mesh-signaling-client\";\nimport {\n chunkSyncMessage,\n isSyncFragmentType,\n parseSyncFragment,\n reassembleSyncFragments,\n SYNC_FRAGMENT_CHUNK_SIZE,\n SYNC_FRAGMENT_THRESHOLD,\n} from \"./sync-fragment\";\n\n/** Distil an {@link RTCStatsReport} into a {@link TransportSnapshot}.\n * Resolves the selected candidate pair via the transport stat's\n * `selectedCandidatePairId` (the W3C-spec field that names the pair\n * ICE has nominated for the data path), then pulls the candidate-type\n * labels from the linked candidate stats. Retransmission counters\n * come off the transport stat where present; some implementations\n * surface them on the data-channel stat instead — we accept either.\n *\n * Out-of-band so the test bed can call it against a bare\n * {@link RTCPeerConnection} as well, which the polly#105 harness's\n * `probe-stats.ts` does to validate the stats shape before threading\n * the result through the polly layer. */\nasync function collectTransportSnapshot(\n connection: RTCPeerConnection,\n lastDataChannelError: string | undefined\n): Promise<TransportSnapshot> {\n const at = performance.now();\n let report: RTCStatsReport | undefined;\n try {\n report = await connection.getStats();\n } catch {\n return emptyTransportSnapshot(lastDataChannelError, at);\n }\n const parsed = partitionStats(report);\n const selectedPair = selectActivePair(parsed);\n const selectedCandidatePair = selectedPair\n ? buildCandidatePairView(selectedPair, parsed.localCands, parsed.remoteCands)\n : undefined;\n return {\n selectedCandidatePair,\n retransmittedPacketsSent: parsed.retransmittedPacketsSent,\n retransmittedBytesSent: parsed.retransmittedBytesSent,\n lastDataChannelError,\n at,\n };\n}\n\ninterface ParsedStats {\n localCands: Map<string, Record<string, unknown>>;\n remoteCands: Map<string, Record<string, unknown>>;\n pairs: Map<string, Record<string, unknown>>;\n selectedPairId: string | undefined;\n retransmittedPacketsSent: number | undefined;\n retransmittedBytesSent: number | undefined;\n}\n\nfunction emptyTransportSnapshot(\n lastDataChannelError: string | undefined,\n at: number\n): TransportSnapshot {\n return {\n selectedCandidatePair: undefined,\n retransmittedPacketsSent: undefined,\n retransmittedBytesSent: undefined,\n lastDataChannelError,\n at,\n };\n}\n\nfunction partitionStats(report: RTCStatsReport): ParsedStats {\n const out: ParsedStats = {\n localCands: new Map(),\n remoteCands: new Map(),\n pairs: new Map(),\n selectedPairId: undefined,\n retransmittedPacketsSent: undefined,\n retransmittedBytesSent: undefined,\n };\n const iter = (report as { values?: () => Iterable<unknown> }).values?.() ?? [];\n for (const raw of iter) {\n if (!raw || typeof raw !== \"object\") continue;\n const stat = raw as Record<string, unknown>;\n ingestStat(stat, out);\n }\n return out;\n}\n\nfunction ingestStat(stat: Record<string, unknown>, out: ParsedStats): void {\n const id = String(stat[\"id\"]);\n switch (stat[\"type\"]) {\n case \"local-candidate\":\n out.localCands.set(id, stat);\n return;\n case \"remote-candidate\":\n out.remoteCands.set(id, stat);\n return;\n case \"candidate-pair\":\n out.pairs.set(id, stat);\n return;\n case \"transport\":\n ingestTransport(stat, out);\n return;\n case \"data-channel\":\n ingestDataChannel(stat, out);\n return;\n }\n}\n\nfunction ingestTransport(stat: Record<string, unknown>, out: ParsedStats): void {\n const selectedId = stat[\"selectedCandidatePairId\"];\n if (typeof selectedId === \"string\") out.selectedPairId = selectedId;\n const rp = stat[\"retransmittedPacketsSent\"];\n const rb = stat[\"retransmittedBytesSent\"];\n if (typeof rp === \"number\") out.retransmittedPacketsSent = rp;\n if (typeof rb === \"number\") out.retransmittedBytesSent = rb;\n}\n\nfunction ingestDataChannel(stat: Record<string, unknown>, out: ParsedStats): void {\n // Chrome puts SCTP retransmit counters on the data-channel stat for\n // SCTP-backed channels. werift puts them on the transport. Accept\n // whichever the underlying impl produces first.\n const rp = stat[\"retransmittedPacketsSent\"];\n const rb = stat[\"retransmittedBytesSent\"];\n if (out.retransmittedPacketsSent === undefined && typeof rp === \"number\") {\n out.retransmittedPacketsSent = rp;\n }\n if (out.retransmittedBytesSent === undefined && typeof rb === \"number\") {\n out.retransmittedBytesSent = rb;\n }\n}\n\nfunction selectActivePair(parsed: ParsedStats): Record<string, unknown> | undefined {\n if (parsed.selectedPairId) {\n const named = parsed.pairs.get(parsed.selectedPairId);\n if (named) return named;\n }\n for (const pair of parsed.pairs.values()) {\n if (pair[\"nominated\"]) return pair;\n }\n return undefined;\n}\n\n/** Render a {@link PeerSlot} as the plain-data view\n * {@link MeshWebRTCAdapter.getPeerStateSnapshot} returns. Pulled out\n * so the snapshot method itself stays under biome's cognitive-\n * complexity ceiling — every additional optional field would push it\n * one closer; doing the shape here keeps the per-call diff small. */\nfunction serialiseSlotView(slot: PeerSlot): {\n signalingState: string;\n iceConnectionState: string;\n connectionState: string;\n dataChannelState: string;\n pendingSendCount: number;\n pendingRemoteIceCount: number;\n inFlightSync: InFlightSyncSnapshot | undefined;\n transport: TransportSnapshot | undefined;\n lastSyncHandshakeAttempt: SyncHandshakeAttemptSnapshot;\n handles: Record<string, HandleSyncSnapshot>;\n createdAt: number;\n lastInboundAt: number | undefined;\n} {\n const handles: Record<string, HandleSyncSnapshot> = {};\n for (const [docId, snapshot] of slot.handles) {\n handles[docId] = { ...snapshot };\n }\n return {\n signalingState: slot.connection.signalingState,\n iceConnectionState: slot.connection.iceConnectionState,\n connectionState: slot.connection.connectionState,\n dataChannelState: slot.channel?.readyState ?? \"no-channel\",\n pendingSendCount: slot.pendingSends.length,\n pendingRemoteIceCount: slot.pendingRemoteIce.length,\n inFlightSync: slot.inFlightSync ? { ...slot.inFlightSync } : undefined,\n transport: slot.transport\n ? {\n ...slot.transport,\n selectedCandidatePair: slot.transport.selectedCandidatePair\n ? { ...slot.transport.selectedCandidatePair }\n : undefined,\n }\n : undefined,\n lastSyncHandshakeAttempt: { ...slot.lastSyncHandshakeAttempt },\n handles,\n createdAt: slot.createdAt,\n lastInboundAt: slot.lastInboundAt,\n };\n}\n\n/** Initial state for {@link PeerSlot.lastSyncHandshakeAttempt}. All\n * timestamps start `undefined` and become populated as the slot\n * progresses through the lifecycle. Pulled out so every `PeerSlot`\n * construction site uses the same shape. */\nfunction emptySyncHandshakeAttempt(): SyncHandshakeAttemptSnapshot {\n return {\n dataChannelOpenedAt: undefined,\n peerCandidateEmittedAt: undefined,\n firstOutboundSendAt: undefined,\n firstInboundMessageAt: undefined,\n };\n}\n\nfunction buildCandidatePairView(\n pair: Record<string, unknown>,\n localCands: Map<string, Record<string, unknown>>,\n remoteCands: Map<string, Record<string, unknown>>\n): NonNullable<TransportSnapshot[\"selectedCandidatePair\"]> {\n const local = localCands.get(String(pair[\"localCandidateId\"]));\n const remote = remoteCands.get(String(pair[\"remoteCandidateId\"]));\n return {\n localCandidateType: String(local?.[\"candidateType\"] ?? \"?\"),\n remoteCandidateType: String(remote?.[\"candidateType\"] ?? \"?\"),\n state: String(pair[\"state\"] ?? \"\"),\n nominated: Boolean(pair[\"nominated\"]),\n bytesSent: Number(pair[\"bytesSent\"] ?? 0),\n bytesReceived: Number(pair[\"bytesReceived\"] ?? 0),\n };\n}\n\n/** Standard STUN servers for NAT traversal. In production, callers who\n * need TURN fallback for peers behind symmetric NATs should replace this\n * with their own ICE server list. */\nexport const DEFAULT_ICE_SERVERS: RTCIceServer[] = [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"stun:stun1.l.google.com:19302\" },\n];\n\n/** Polly issue #109: how long a slot can sit at `connectionState` in\n * `new` or `connecting` before the watchdog tears it down so the\n * recovery sweep can re-attempt. Healthy ICE completes in single-digit\n * seconds; 30s is well past anything legitimate and short enough that\n * a silent `createOffer`/`setLocalDescription` rejection no longer\n * leaves an unrecoverable wedged slot. */\nexport const SLOT_NEVER_CONNECTED_TIMEOUT_MS = 30_000;\n\n/** Polly issue #110: how long a slot whose data channel is open and\n * whose `connectionState` is `connected` can have no inbound bytes\n * before the watchdog assumes the remote process is dead and tears\n * the slot down. The ICE keepalive timer can take minutes to notice a\n * remote SIGKILL or network partition; an application-layer\n * liveness check that runs an order of magnitude faster keeps\n * paired devices from sending sync traffic into the void after the\n * remote daemon restarts. 120s is conservative — Automerge's idle\n * cadence is well below this, so a healthy slot never crosses the\n * threshold. */\nexport const SLOT_IDLE_TIMEOUT_MS = 120_000;\n\n/** Polly issue #109/#110: how often the watchdog evaluates teardown\n * decisions across every slot. 5s is well below either threshold so\n * teardown happens promptly after a deadline lapses without\n * dominating runtime cost (one `connectionState` read per slot per\n * tick). */\nexport const SLOT_WATCHDOG_INTERVAL_MS = 5_000;\n\n/** Options for constructing a {@link MeshWebRTCAdapter}. */\nexport interface MeshWebRTCAdapterOptions {\n /** The signalling client the adapter uses to exchange SDP and ICE\n * candidates with other peers. Typically constructed once per\n * application and shared across any adapters that need it. */\n signaling: MeshSignalingClient;\n /** The local peer id. Must match the peer id the signalling client\n * registered with. */\n peerId: string;\n /** Peer ids to connect to on startup. When `connect()` is called, the\n * adapter iterates this list and initiates a WebRTC connection to each\n * one by sending an SDP offer through the signalling channel. Peers\n * not in this list can still connect by sending an offer *to* this\n * adapter. The natural source for this list is the keyring's\n * knownPeers map keys.\n *\n * Used only when {@link keyringSource} is not supplied. With\n * `keyringSource` set the adapter reads `knownPeers` live from the\n * keyring on every initiation decision, which is the shape\n * {@link createMeshClient} wires up so post-construction\n * {@link applyPairingToken} calls take effect without the consumer\n * having to call {@link MeshWebRTCAdapter.addKnownPeer} by hand. */\n knownPeerIds?: string[];\n /** Live keyring source. When supplied, the adapter reads\n * `knownPeers` from `keyringSource()` on every initiation decision\n * instead of a Set captured at construction. Combined with the\n * periodic re-sweep started in {@link MeshWebRTCAdapter.connect},\n * this makes mutations to `keyring.knownPeers` — including the ones\n * produced by {@link applyPairingToken} after the mesh client is up\n * — visible to the dial path within at most one sweep interval. The\n * crypto layer already re-reads the keyring on every send and\n * receive; this option closes the same loop for the WebRTC adapter.\n *\n * Polly issue #103: without this, a long-lived daemon that pairs a\n * new device after its mesh client is constructed never dials the\n * new peer — the adapter's captured Set stays stale even though the\n * keyring contains the new entry, and the lex-tie-break rule in\n * {@link MeshWebRTCAdapter.shouldInitiateTo} can leave both peers\n * waiting for the other to offer indefinitely. */\n keyringSource?: () => MeshKeyring;\n /** How often the adapter re-evaluates whether to dial peers in the\n * signalling roster. The sweep is what catches peers that became\n * authorised in the keyring after their `peer-joined` notification\n * already fired — the adapter has no other event to hang the retry\n * on, so it polls. Cheap: one Map lookup per present peer, fired at\n * most once per interval. Defaults to 2000ms; tests override to\n * shorten the failure budget. Set to 0 to disable the sweep\n * (the captured-set behaviour, kept only for migration). */\n knownPeersRefreshIntervalMs?: number;\n /** Optional ICE server list override. Defaults to {@link DEFAULT_ICE_SERVERS}. */\n iceServers?: RTCIceServer[];\n /** Optional ICE transport policy. Defaults to the\n * {@link RTCPeerConnection} implementation's own default (`\"all\"` in\n * Chrome, Firefox, and werift). Set to `\"relay\"` to force every\n * candidate pair through a TURN relay — the shape the polly#105\n * falsification harness needs to exercise the real-transport contract\n * the polly#104 in-process throttle could not reach. */\n iceTransportPolicy?: RTCIceTransportPolicy;\n /** When `true` (the default), polly enforces\n * {@link iceTransportPolicy} `\"relay\"` on its side of the signalling\n * channel by filtering non-relay ICE candidates out of both the SDP\n * description it forwards and the trickle ICE stream it emits. This\n * closes the gap exposed by polly#105: Chrome's implementation\n * already filters at the source, but werift only filters its own\n * outgoing connectivity checks and still advertises host and srflx\n * candidates upstream — so a relay-only peer on werift will, against\n * a peer with the default policy, still pair through a non-relay\n * candidate (or against a host-derived peer-reflexive remote).\n * Setting this option to `false` reverts the enforcement and is the\n * shape used by the `POLLY_105_DISABLE_TURN_FIX=1` falsification\n * path. Production callers should leave this at the default. */\n iceRelayEnforcement?: boolean;\n /** Optional data channel label. Defaults to \"polly-mesh\". Applications\n * that share a signalling server between multiple meshes may want\n * distinct labels per mesh. */\n dataChannelLabel?: string;\n /** RTCPeerConnection constructor. Defaults to\n * `globalThis.RTCPeerConnection`. Inject a different implementation\n * (e.g. `werift` or `@roamhq/wrtc`) when running outside a browser, or\n * to use a custom subclass for tests or instrumentation. */\n RTCPeerConnection?: typeof RTCPeerConnection;\n /** When `true` (the default), the adapter yields to the event loop\n * between the points where a large initial sync would otherwise hold\n * the main thread for tens of seconds: between each batch of\n * fragmented `RTCDataChannel.send` calls on the sender side, and at\n * the boundary between reassembling a sync message and dispatching\n * it (deserialise → MeshNetworkAdapter unwrap → Automerge\n * `applyChanges`) on the receiver side. Set to `false` to recover\n * the pre-#104 tight-loop behaviour; this is the configuration the\n * `POLLY_104_DISABLE_FIX=1` falsification path in\n * `examples/mesh-large-initial-sync` uses to demonstrate the bug\n * against post-fix polly. Production callers should leave this at\n * the default. */\n syncYieldEnabled?: boolean;\n /** Override the sync fragment chunk size. Defaults to\n * {@link SYNC_FRAGMENT_CHUNK_SIZE} (60 KiB), which leaves header\n * overhead inside werift's hard 64 KiB max-message-size cap.\n * Setting this to 64 KiB recreates the pre-#104 fragmentation bug,\n * where peer A's outbound fragments overshoot the cap and werift\n * rejects them silently — sync stalls forever. Used by the\n * `POLLY_104_DISABLE_FIX=1` falsification path. Production callers\n * should leave this at the default. */\n syncFragmentChunkSizeOverride?: number;\n /** How long a slot can sit at `connectionState` in `new` or\n * `connecting` before the watchdog tears it down. Defaults to\n * {@link SLOT_NEVER_CONNECTED_TIMEOUT_MS}. Set to 0 to disable the\n * gate. Polly issue #109. */\n slotNeverConnectedTimeoutMs?: number;\n /** How long a connected slot can have no inbound bytes before the\n * watchdog tears it down as idle. Defaults to\n * {@link SLOT_IDLE_TIMEOUT_MS}. Set to 0 to disable the gate.\n * Polly issue #110. */\n slotIdleTimeoutMs?: number;\n /** How often the slot watchdog evaluates teardown decisions.\n * Defaults to {@link SLOT_WATCHDOG_INTERVAL_MS}; tests override to\n * tens of milliseconds. Set to 0 to disable the watchdog entirely\n * (the pre-#109/#110 behaviour, kept only for migration and the\n * falsification path). */\n slotWatchdogIntervalMs?: number;\n}\n\n/** Types of signalling payload this adapter exchanges through the\n * signalling channel. The signalling server treats these as opaque. */\ntype SignalingPayload =\n | { kind: \"offer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"answer\"; sdp: RTCSessionDescriptionInit }\n | { kind: \"ice\"; candidate: RTCIceCandidateInit };\n\n/** Payload of the polly-specific `\"sync-progress\"` event emitted by\n * {@link MeshWebRTCAdapter}. Consumers can subscribe via the adapter's\n * standard `.on()` surface (the same one that carries `peer-candidate`\n * and `peer-disconnected`) to observe fragment receive and dispatch\n * activity in real time, without polling\n * {@link MeshWebRTCAdapter.getPeerStateSnapshot}. Polly issue #104\n * item 7. */\nexport interface SyncProgressEvent {\n /** Remote peer the fragment or dispatch is for. */\n peerId: string;\n /** Lifecycle stage. `fragment-received` fires for each chunk that\n * arrives during reassembly; `dispatch-applied` fires once the\n * reassembled message has been emitted upward to Automerge. */\n kind: \"fragment-received\" | \"dispatch-applied\";\n /** Bytes carried by the chunk that triggered the event. Zero for\n * `dispatch-applied`. */\n bytesDelta: number;\n /** Running total of fragments received for the current reassembly. */\n chunksReceived: number;\n /** Running total of bytes received for the current reassembly. */\n bytesReceived: number;\n /** Number of reassembled messages whose dispatch has been scheduled\n * but not yet emitted upward to Automerge. */\n applyBacklog: number;\n /** `performance.now()` at event emission. */\n at: number;\n}\n\n/** Last-seen transport-level summary for a peer slot. Populated\n * lazily by {@link MeshWebRTCAdapter.refreshTransportStats}, which\n * the consumer calls (typically from a polling loop in a debugging\n * harness) so the cost of {@link RTCPeerConnection.getStats} is\n * incurred only on demand. Polly issue #105 item 7 — exposes the\n * dimension of the transport that {@link InFlightSyncSnapshot}\n * doesn't reach: the negotiated ICE candidate pair, the SCTP\n * retransmission counters, and the last data-channel-level error if\n * one has been observed.\n *\n * Field names mirror the W3C stats spec (`selectedCandidatePairId`,\n * `localCandidateType`, etc.) so consumers can correlate with the\n * raw `RTCStatsReport`. werift exposes a stats shape close to the\n * spec; Chrome exposes the spec itself; this view is implementation-\n * agnostic. */\nexport interface TransportSnapshot {\n /** ICE-level summary of the pair currently carrying data. */\n selectedCandidatePair:\n | {\n localCandidateType: string;\n remoteCandidateType: string;\n state: string;\n nominated: boolean;\n bytesSent: number;\n bytesReceived: number;\n }\n | undefined;\n /** SCTP / data-channel retransmission counters. Some implementations\n * surface these on the transport stat, others on the data-channel\n * stat — we expose the values we found, leaving the field undefined\n * when the underlying impl doesn't surface them. */\n retransmittedPacketsSent: number | undefined;\n retransmittedBytesSent: number | undefined;\n /** Most-recent data-channel error message, if `error` ever fired on\n * the channel for this peer. Cleared only when the slot is replaced. */\n lastDataChannelError: string | undefined;\n /** `performance.now()` at the time the stats were last refreshed. */\n at: number;\n}\n\n/** Reasons the adapter declined to construct an RTC slot for a peer\n * that appeared in the signalling roster or the keyring. Recorded\n * per-peer in {@link MeshWebRTCAdapter.getPeerStateSnapshot} so a\n * consumer harness observing \"(no slot)\" can tell which gate inside\n * the adapter stopped construction without having to log-correlate\n * through three layers of timing. Polly issue #106 item 7.\n *\n * - `self`: the peerId equals the local peerId.\n * - `not-in-keyring`: the live keyring (or captured Set) does not\n * currently authorise this peer.\n * - `not-present`: the peer is not in the signalling roster. The\n * adapter only dials peers it has heard about through\n * `peers-present` or `peer-joined`; keyring entries that have not\n * appeared on signalling are quietly held without a slot.\n * - `tie-break-other-side`: the lex-tie-break designates the remote\n * peer as the initiator; we wait for their offer.\n * - `slot-already-exists`: a slot exists already, possibly in any\n * negotiation state.\n * - `fatal-error`: an exception was thrown while attempting to build\n * the slot. The accompanying {@link SlotInitiationDecision.error}\n * string carries the message. This is also stamped when the slot\n * watchdog tears a wedged slot down (polly#109's silent throw, or\n * polly#110's idle-but-still-`connected` post-mortem), so the next\n * sweep tick finds no slot and retries.\n */\nexport type SlotInitiationRejectionReason =\n | \"self\"\n | \"not-in-keyring\"\n | \"not-present\"\n | \"tie-break-other-side\"\n | \"slot-already-exists\"\n | \"fatal-error\";\n\n/** Most-recent slot-initiation decision for a peer. Computed at\n * snapshot time so the view always reflects the current state of the\n * relevant gates; a `decision === \"accepted\"` value paired with a\n * `slot === undefined` view on the same snapshot is the load-bearing\n * signal for \"the adapter wants to dial but isn't\" — the failure\n * shape polly#106 documents. */\nexport interface SlotInitiationDecision {\n /** \"accepted\" means every gate in `shouldInitiateTo` would pass right\n * now and a sweep tick would construct a slot. \"rejected\" means at\n * least one gate failed; the `reason` names it. */\n decision: \"accepted\" | \"rejected\";\n /** Populated only on `rejected` decisions. */\n reason: SlotInitiationRejectionReason | undefined;\n /** If the previous sweep tick caught a synchronous throw while\n * building this peer's slot, the message is preserved here for the\n * next snapshot. The reason will be `fatal-error`. */\n error: string | undefined;\n /** `performance.now()` at the time the decision was computed. */\n at: number;\n}\n\n/** Most-recent sync-handshake timeline for a peer slot. Each timestamp\n * is `performance.now()` of the corresponding event the first time it\n * fired on the current slot — slots that get evicted and rebuilt start\n * over. The four fields together describe whether the adapter and the\n * receiver downstream of it have done their part in initiating sync:\n *\n * - `dataChannelOpenedAt`: when the wire is ready to carry bytes.\n * - `peerCandidateEmittedAt`: when polly emitted `peer-candidate`\n * upward; Automerge's network subsystem hooks this event to add the\n * peer to its known set and kick off the per-document sync exchange.\n * If this is `undefined` long after the data channel has opened,\n * polly never signalled \"ready\" to Automerge — that's a failure in\n * the adapter.\n * - `firstOutboundSendAt`: when polly first dispatched bytes through\n * {@link MeshWebRTCAdapter.send} for this peer. If\n * `peerCandidateEmittedAt` is set but this is still `undefined`,\n * Automerge's NetworkSubsystem has not asked the adapter to send\n * anything. The polly#106 ladder named \"no handle locally\" as the\n * typical cause for this rung; the polly#107 failing-shape evidence\n * (fourteen `$meshState` handles pre-warmed in `ready` state,\n * `firstOutboundSendAt` still undefined long after peer-candidate\n * fires) shows that's a misleading ladder entry. Revised:\n *\n * - If `repo.handles[docId]` is undefined or in a non-`ready`\n * state for every doc this peer should sync, the consumer\n * fix is real — pre-warm the handles via the documented\n * `$meshState(key, initial)` factory before the slot opens.\n *\n * - If `repo.handles[docId]` is `ready` for every doc AND\n * `getPeerStateSnapshot().peers[…].slot.handles[docId]\n * .announcedToPeer` is `false`, the gate is BETWEEN Automerge's\n * NetworkSubsystem and the adapter — not on the consumer's\n * handle-construction path. This is the polly#107 surface;\n * post-#107 the mesh client hooks `peer-candidate` to invoke\n * the synchronizer's `reevaluateDocumentShare` so the\n * `addPeer`/`addDocument` ordering race that leaves a handle\n * un-announced gets closed by an idempotent re-evaluation.\n *\n * - If `announcedToPeer` becomes `true` for every relevant doc\n * and `firstOutboundSendAt` is still undefined, the gap is in\n * polly's own send path — that's a polly bug, not an\n * Automerge or consumer one.\n *\n * - `firstInboundMessageAt`: when polly first emitted a `message` event\n * for this peer. If `peerCandidateEmittedAt` is set on the remote and\n * `firstOutboundSendAt` is set on the remote but this is `undefined`\n * locally, bytes were sent across the wire but never decoded — that\n * points at the crypto envelope or the wire fragmenter.\n *\n * Polly issue #106 item 7; polly#107 revised the\n * `firstOutboundSendAt` rung to point at the polly⇄Automerge gate\n * rather than the consumer. */\nexport interface SyncHandshakeAttemptSnapshot {\n dataChannelOpenedAt: number | undefined;\n peerCandidateEmittedAt: number | undefined;\n firstOutboundSendAt: number | undefined;\n firstInboundMessageAt: number | undefined;\n}\n\n/** Sweep-loop observability for the periodic dial re-evaluation. The\n * sweep is what catches peers that were not in the keyring at the time\n * of their `peer-joined` notification (polly#103) AND peers whose\n * previous slot failed and got evicted (polly#106). Exposing its tick\n * counter lets a consumer distinguish \"sweep is running but\n * `shouldInitiateTo` rejected the peer\" from \"sweep is broken and\n * never fires\" without instrumenting polly internals. */\nexport interface SweepSnapshot {\n /** True iff the sweep timer is currently scheduled — false on the\n * captured-set fallback path (no keyringSource) or when the interval\n * is configured to 0. */\n enabled: boolean;\n /** Configured interval in milliseconds. 0 means disabled. */\n intervalMs: number;\n /** How many times the sweep callback has fired since `connect()`. */\n runCount: number;\n /** `performance.now()` at the last tick. `undefined` until the\n * first tick fires. */\n lastRunAt: number | undefined;\n}\n\n/** Per-peer view of an in-flight initial sync. Populated by\n * {@link MeshWebRTCAdapter.handleSyncFragment} as fragments of a\n * single reassembly arrive, and reset to `undefined` once the\n * reassembled message has been dispatched. Exposed verbatim through\n * {@link MeshWebRTCAdapter.getPeerStateSnapshot} so a consumer\n * harness can observe progress mid-stream. Polly issue #104 item 7. */\nexport interface InFlightSyncSnapshot {\n /** Fragments received for the current reassembly. Cleared once\n * reassembly completes. */\n chunksReceived: number;\n /** Bytes received across the fragments of the current reassembly.\n * The reassembled message will be slightly smaller than this sum\n * because each fragment carries a small header. */\n bytesReceived: number;\n /** `performance.now()` value at the last fragment arrival. */\n lastChunkAt: number;\n /** Count of reassembled messages whose dispatch has been\n * scheduled but not yet run. With the receiver-side `setTimeout(0)`\n * yield enabled, this is normally 0 or 1; with the yield\n * disabled (the falsification path) dispatch runs synchronously\n * and this stays 0. */\n applyBacklog: number;\n}\n\n/** Per-handle per-peer sync bookkeeping. Closes the diagnostic gap\n * between \"handle exists in repo\" (observable today via `repo.handles`)\n * and \"Automerge's NetworkSubsystem has actually told this peer about\n * this handle\" — the latter being the load-bearing question for the\n * polly#107 failing shape, where fourteen pre-warmed handles sit in\n * `ready` state and the peer slot is fully connected, yet Automerge\n * has not asked the adapter to send a single sync message.\n *\n * Each field is stamped from the adapter's own wire path: `out` from\n * {@link MeshWebRTCAdapter.send}, `in` from {@link dispatchMessage}'s\n * deserialised view. Combined with the consumer's view of\n * `repo.handles[documentId].state`, the mesh client's\n * {@link createMeshClient}-returned `getPeerStateSnapshot` produces the\n * full per-handle observability the polly#107 ticket asks for in\n * item 7. */\nexport interface HandleSyncSnapshot {\n /** `performance.now()` of the most recent send through\n * {@link MeshWebRTCAdapter.send} carrying this `documentId` for this\n * peer. `undefined` means Automerge has never asked the adapter to\n * send a sync message for this document — i.e. the handle is NOT\n * \"announced to peer\" in the polly#107 sense, regardless of whether\n * the handle is `ready` in `repo.handles`. */\n lastSyncMessageOutAt: number | undefined;\n /** `performance.now()` of the most recent inbound message dispatched\n * upward for this `documentId` from this peer. `undefined` means we\n * have never received a sync message for this document from this\n * peer — they have not announced their copy of this handle to us. */\n lastSyncMessageInAt: number | undefined;\n /** Byte length of the most recent outbound sync message (the raw\n * `RTCDataChannel.send` payload, which is the crypto-wrapped envelope\n * — not the inner Automerge sync size). `undefined` until the first\n * outbound send. Used by the polly#107 example's wire-level\n * transcript to distinguish \"Automerge generated an empty sync\n * message\" from \"Automerge generated nothing at all\". */\n lastSyncMessageOutSize: number | undefined;\n /** Type field of the most recent outbound message for this document\n * to this peer. Typically `\"sync\"` once handshake has begun, or\n * `\"request\"` while the local side is still asking. `undefined`\n * until the first outbound send. */\n lastSyncMessageOutType: string | undefined;\n}\n\n/** Initial state for a {@link HandleSyncSnapshot}. */\nfunction emptyHandleSyncSnapshot(): HandleSyncSnapshot {\n return {\n lastSyncMessageOutAt: undefined,\n lastSyncMessageInAt: undefined,\n lastSyncMessageOutSize: undefined,\n lastSyncMessageOutType: undefined,\n };\n}\n\n/** State tracked for each remote peer. */\ninterface PeerSlot {\n connection: RTCPeerConnection;\n channel: RTCDataChannel | undefined;\n /** Outgoing messages queued while the channel is still connecting.\n * Typed as ArrayBuffer-backed so they are directly usable by\n * RTCDataChannel.send under TypeScript's strict buffer-source typing. */\n pendingSends: Uint8Array<ArrayBuffer>[];\n /** Partially-assembled inbound sync messages, keyed by the fragment id\n * stamped on each chunk. Entries are deleted as soon as the last\n * fragment for an id arrives and the reassembled bytes are dispatched. */\n pendingFragments: Map<string, { chunks: Map<number, Uint8Array>; total: number }>;\n /** Remote ICE candidates that arrived before `setRemoteDescription`\n * completed. addIceCandidate throws when `remoteDescription` is null,\n * and real Chrome 148+ does not internally queue these the way Chrome\n * for Testing does — so any candidate that wins the race against the\n * answer SDP would be silently dropped, leaving ICE checking with no\n * remote candidates to pair against. Drained from {@link handleAnswer}\n * and the post-`setRemoteDescription` step of {@link handleOffer}. */\n pendingRemoteIce: RTCIceCandidateInit[];\n /** Observable snapshot of any reassembly currently in progress for\n * this peer. `undefined` whenever the receive side is idle. */\n inFlightSync: InFlightSyncSnapshot | undefined;\n /** Last refreshed transport-level summary. `undefined` until the\n * caller invokes {@link MeshWebRTCAdapter.refreshTransportStats}\n * (or its idle equivalent on the mesh client). */\n transport: TransportSnapshot | undefined;\n /** Sticky cache of the most recent error reported by the data\n * channel's `onerror` event. Captured on the channel itself so the\n * value survives transient slot replacements within a single\n * connection's lifetime. */\n lastDataChannelError: string | undefined;\n /** Per-slot sync-handshake observability. Each field is populated\n * the first time its event fires on the current slot. Polly issue\n * #106 item 7. */\n lastSyncHandshakeAttempt: SyncHandshakeAttemptSnapshot;\n /** Per-handle sync bookkeeping for this peer. Keyed by\n * `documentId`. Entries are created on demand — the first time\n * {@link MeshWebRTCAdapter.send} dispatches a message carrying a\n * given documentId to this peer, or the first time a message for\n * that documentId is dispatched inbound. Polly issue #107 item 7 —\n * closes the \"handle exists in repo but Automerge never announced\n * it\" diagnostic gap. */\n handles: Map<string, HandleSyncSnapshot>;\n /** `performance.now()` at slot construction. The watchdog uses this\n * to detect slots whose `connectionState` never advances past\n * `new`/`connecting` — the polly#109 silent-throw shape — by\n * comparing against {@link SLOT_NEVER_CONNECTED_TIMEOUT_MS}. */\n createdAt: number;\n /** `performance.now()` at the most recent inbound `message` event\n * on this slot's data channel. `undefined` until the first inbound\n * frame arrives. The watchdog uses this to detect connected slots\n * whose remote process died without an OS-layer FIN — the polly#110\n * shape — by comparing against {@link SLOT_IDLE_TIMEOUT_MS} once\n * the channel has opened. */\n lastInboundAt: number | undefined;\n}\n\n/**\n * Automerge-Repo NetworkAdapter backed by real WebRTC data channels.\n * Manages one RTCPeerConnection per remote peer and uses a supplied\n * {@link MeshSignalingClient} for SDP/ICE exchange.\n */\nexport class MeshWebRTCAdapter extends NetworkAdapter {\n readonly signaling: MeshSignalingClient;\n readonly iceServers: RTCIceServer[];\n readonly iceTransportPolicy: RTCIceTransportPolicy | undefined;\n private readonly iceRelayEnforcement: boolean;\n readonly dataChannelLabel: string;\n /** Peers this adapter is willing to dial. Mutable so callers that pair\n * a new device after construction (e.g. a CLI `add-device` process whose\n * mesh client is long-lived across the pair ceremony) can register the\n * new peer with {@link addKnownPeer} without restarting the client.\n *\n * Used only in the captured-set fallback path — when no\n * {@link keyringSource} is supplied. With `keyringSource` set, the\n * authoritative source is the live keyring and this Set is unused. */\n private readonly knownPeers: Set<string>;\n /** Live keyring source, or undefined when the adapter is operating in\n * the captured-set fallback shape. See the JSDoc on\n * {@link MeshWebRTCAdapterOptions.keyringSource}. */\n private readonly keyringSource: (() => MeshKeyring) | undefined;\n /** Interval handle for the periodic re-sweep that catches peers\n * already in the signalling roster when the keyring grew. Cleared in\n * {@link MeshWebRTCAdapter.disconnect}. */\n private knownPeersRefreshTimer: ReturnType<typeof setInterval> | undefined;\n /** Sweep interval. Resolved from\n * {@link MeshWebRTCAdapterOptions.knownPeersRefreshIntervalMs} at\n * construction. Defaults to 2000ms; tests override to 100–250ms. */\n private readonly knownPeersRefreshIntervalMs: number;\n /** When `true`, the sender side awaits between batches of fragment\n * sends and the receiver side schedules dispatch via `setTimeout(0)`\n * so the JS event loop can drain timers (including the consumer's\n * own setInterval-based liveness probes) between large-message\n * apply calls. Defaults to `true`; set to `false` only by the\n * `POLLY_104_DISABLE_FIX` falsification path. */\n private readonly syncYieldEnabled: boolean;\n /** Resolved chunk size for fragmenting oversized messages.\n * Defaults to {@link SYNC_FRAGMENT_CHUNK_SIZE}; can be overridden\n * via {@link MeshWebRTCAdapterOptions.syncFragmentChunkSizeOverride}. */\n private readonly syncFragmentChunkSize: number;\n /** Peers currently visible in the signalling roster — populated by\n * {@link handlePeersPresent} / {@link handlePeerJoined} and pruned by\n * {@link handlePeerLeft}. Read by {@link addKnownPeer} to decide\n * whether the new peer is already online and an offer can fire now. */\n private readonly presentPeers = new Set<string>();\n /** Local peer id captured at construction time. The base\n * `NetworkAdapter.peerId` is only populated when `connect()` fires,\n * which means glare-resolution and peer-discovery dispatch would\n * otherwise have no id to compare against before the first incoming\n * message. Keeping a private mirror keeps those code paths honest\n * without depending on Automerge's lifecycle. */\n private readonly localPeerId: string;\n private readonly RTCPeerConnectionCtor: typeof RTCPeerConnection;\n private readonly slots = new Map<string, PeerSlot>();\n private ready = false;\n private readyResolver: (() => void) | undefined;\n /** Sticky cache of the most recent {@link SlotInitiationDecision}\n * per peer. Updated on every `shouldInitiateTo` call and on every\n * caught throw inside the sweep loop, so a snapshot taken at any\n * moment can answer \"why is there no slot for this peer right\n * now?\". Polly issue #106 item 7. */\n private readonly lastSlotInitiationDecisions = new Map<string, SlotInitiationDecision>();\n /** Tick count of the periodic sweep — incremented inside the\n * `setInterval` callback, exposed via {@link getPeerStateSnapshot}.\n * Lets a consumer rule out \"sweep is dead\" before chasing the\n * shouldInitiateTo gates. */\n private sweepRunCount = 0;\n /** `performance.now()` at the last sweep tick. Paired with\n * {@link sweepRunCount} so a stalled sweep is visible at a glance\n * via the snapshot's `sweep` block. */\n private lastSweepAt: number | undefined;\n /** Watchdog interval (polly#109 + polly#110). Tears down slots that\n * never reach `connected`, or that look connected but have not\n * received bytes for {@link slotIdleTimeoutMs}, so the recovery\n * sweep can re-attempt. Cleared in {@link disconnect}. */\n private slotWatchdogTimer: ReturnType<typeof setInterval> | undefined;\n private readonly slotNeverConnectedTimeoutMs: number;\n private readonly slotIdleTimeoutMs: number;\n private readonly slotWatchdogIntervalMs: number;\n\n /** The peers this adapter will dial. Backward-compatible read accessor\n * for callers that previously iterated the `knownPeerIds` array. With\n * a {@link MeshWebRTCAdapterOptions.keyringSource} configured, the\n * value is read live from the keyring; otherwise it falls back to the\n * captured Set populated through the constructor and\n * {@link addKnownPeer}. */\n get knownPeerIds(): string[] {\n if (this.keyringSource !== undefined) {\n return [...this.keyringSource().knownPeers.keys()].filter((id) => id !== this.localPeerId);\n }\n return [...this.knownPeers];\n }\n\n /** True iff `remotePeerId` is currently in the authoritative\n * knownPeers source — the live keyring when one was supplied, or\n * the captured Set otherwise. Centralises the membership check so\n * {@link shouldInitiateTo} and the JSDoc on\n * {@link MeshWebRTCAdapterOptions.keyringSource} agree on the rule. */\n private hasKnownPeer(remotePeerId: string): boolean {\n if (this.keyringSource !== undefined) {\n return this.keyringSource().knownPeers.has(remotePeerId);\n }\n return this.knownPeers.has(remotePeerId);\n }\n\n /** Callback for incoming blob messages. Set by the blob store.\n * Called with the sender's peer ID, the raw header object, and the\n * binary payload (chunk data). */\n onBlobMessage?: (peerId: string, header: Record<string, unknown>, data: Uint8Array) => void;\n\n constructor(options: MeshWebRTCAdapterOptions) {\n super();\n this.signaling = options.signaling;\n this.iceServers = options.iceServers ?? DEFAULT_ICE_SERVERS;\n this.iceTransportPolicy = options.iceTransportPolicy;\n this.iceRelayEnforcement = options.iceRelayEnforcement ?? true;\n this.dataChannelLabel = options.dataChannelLabel ?? \"polly-mesh\";\n this.knownPeers = new Set(options.knownPeerIds ?? []);\n this.keyringSource = options.keyringSource;\n this.knownPeersRefreshIntervalMs = options.knownPeersRefreshIntervalMs ?? 2000;\n this.syncYieldEnabled = options.syncYieldEnabled ?? true;\n this.syncFragmentChunkSize = options.syncFragmentChunkSizeOverride ?? SYNC_FRAGMENT_CHUNK_SIZE;\n this.slotNeverConnectedTimeoutMs =\n options.slotNeverConnectedTimeoutMs ?? SLOT_NEVER_CONNECTED_TIMEOUT_MS;\n this.slotIdleTimeoutMs = options.slotIdleTimeoutMs ?? SLOT_IDLE_TIMEOUT_MS;\n this.slotWatchdogIntervalMs = options.slotWatchdogIntervalMs ?? SLOT_WATCHDOG_INTERVAL_MS;\n this.localPeerId = options.peerId;\n const PC = options.RTCPeerConnection ?? globalThis.RTCPeerConnection;\n if (typeof PC !== \"function\") {\n throw new Error(\n \"MeshWebRTCAdapter: no RTCPeerConnection implementation found. Pass one via options.RTCPeerConnection (e.g. from `werift` or `@roamhq/wrtc`), or run in a browser where `globalThis.RTCPeerConnection` exists.\"\n );\n }\n this.RTCPeerConnectionCtor = PC;\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n /** The current number of peer slots the adapter is tracking. Each\n * slot is one ordered pair (local peer ↔ remote peer) with its own\n * RTCPeerConnection and data channel. Exposed for tests that assert\n * \"exactly one channel per pair\" after discovery settles. */\n peerSlotCount(): number {\n return this.slots.size;\n }\n\n /** Snapshot of the adapter's per-peer state at the moment of the\n * call. Returned values are plain data — strings and booleans only —\n * so consumers can log, assert on, or render them without retaining\n * references into the adapter's internals.\n *\n * Polly issue #103 asked for an inspection surface so a consumer\n * harness can answer \"is the mesh layer in a known good state\" from\n * outside polly. This method is that surface. The fields mirror the\n * three layers of the WebRTC connection lifecycle so a \"stuck\"\n * connection can be diagnosed without reaching for the browser\n * devtools: the SDP signalling state, the ICE checking state, and\n * the unified RTCPeerConnection connection state. A `dataChannel`\n * field reports whether the data channel — the thing the mesh\n * actually carries bytes over — is open.\n *\n * Peers visible in the signalling roster but not yet dialled appear\n * with `slot: undefined`, so a consumer can tell \"we know about this\n * peer in signalling but the WebRTC adapter has not started an\n * offer yet\" from \"we have a slot in some negotiation state\". */\n getPeerStateSnapshot(): {\n localPeerId: string;\n knownPeerIds: string[];\n presentPeerIds: string[];\n sweep: SweepSnapshot;\n peers: Array<{\n peerId: string;\n knownInKeyring: boolean;\n presentInSignalling: boolean;\n slotInitiationRejectionReason: SlotInitiationRejectionReason | undefined;\n slotInitiationDecision: SlotInitiationDecision;\n slot:\n | undefined\n | {\n signalingState: string;\n iceConnectionState: string;\n connectionState: string;\n dataChannelState: string;\n pendingSendCount: number;\n pendingRemoteIceCount: number;\n inFlightSync: InFlightSyncSnapshot | undefined;\n transport: TransportSnapshot | undefined;\n lastSyncHandshakeAttempt: SyncHandshakeAttemptSnapshot;\n handles: Record<string, HandleSyncSnapshot>;\n createdAt: number;\n lastInboundAt: number | undefined;\n };\n }>;\n } {\n const knownPeerIds = this.knownPeerIds;\n const presentPeerIds = [...this.presentPeers];\n const knownPeerSet = new Set(knownPeerIds);\n const allPeers = new Set<string>();\n for (const id of knownPeerIds) allPeers.add(id);\n for (const id of presentPeerIds) allPeers.add(id);\n for (const id of this.slots.keys()) allPeers.add(id);\n const peers: ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"] = [];\n for (const peerId of allPeers) {\n const slot = this.slots.get(peerId);\n const decision = this.snapshotInitiationDecision(peerId);\n peers.push({\n peerId,\n knownInKeyring: knownPeerSet.has(peerId),\n presentInSignalling: this.presentPeers.has(peerId),\n // Top-level convenience: same value as\n // `slotInitiationDecision.reason`, hoisted so log lines that\n // only need the named reason can read it without a nested\n // access. Polly issue #106 item 7.\n slotInitiationRejectionReason: decision.reason,\n slotInitiationDecision: decision,\n slot: slot ? serialiseSlotView(slot) : undefined,\n });\n }\n return {\n localPeerId: this.localPeerId,\n knownPeerIds,\n presentPeerIds,\n sweep: {\n enabled: this.knownPeersRefreshTimer !== undefined,\n intervalMs: this.knownPeersRefreshIntervalMs,\n runCount: this.sweepRunCount,\n lastRunAt: this.lastSweepAt,\n },\n peers,\n };\n }\n\n /** Handle the signalling server's `peer-joined` notification: a new\n * peer has appeared on the relay. If the peer is in `knownPeerIds`\n * and we do not already have a slot for it, and the tie-break rule\n * designates us as the initiator (our peerId compares greater than\n * theirs), open an initiating slot and fire the SDP offer. Otherwise\n * do nothing — either we are not interested in this peer, we are\n * already connected, or the other side is the one expected to\n * initiate.\n *\n * A `peer-joined` for a peerId we already hold a slot for is first\n * routed through {@link evictStaleSlotForRejoin}: the notification is\n * authoritative proof the remote peer's signalling presence is fresh,\n * so a slot left over from an earlier incarnation of the same peerId\n * is torn down rather than left to wedge rediscovery. Polly issue\n * #133. */\n handlePeerJoined(remotePeerId: string): void {\n this.presentPeers.add(remotePeerId);\n this.evictStaleSlotForRejoin(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n\n /** Handle the signalling server's `peers-present` notification sent\n * once to a newcomer. Applies the same filter as handlePeerJoined to\n * every listed peer, so a device joining into an established lobby\n * dials every knownPeer it is meant to initiate to in one pass.\n *\n * Like {@link handlePeerJoined}, each listed peer is first run\n * through {@link evictStaleSlotForRejoin} so a `peers-present` frame\n * received on a signalling *reconnect* clears any stale slot before\n * the dial path re-evaluates it. Polly issue #133. */\n handlePeersPresent(peerIds: string[]): void {\n for (const remotePeerId of peerIds) {\n this.presentPeers.add(remotePeerId);\n this.evictStaleSlotForRejoin(remotePeerId);\n if (!this.shouldInitiateTo(remotePeerId)) continue;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n }\n\n /** Tear down a slot left over from an earlier incarnation of a peer\n * that has just (re)appeared in the signalling roster, so the dial\n * path can rebuild it.\n *\n * A `peer-joined` / `peers-present` frame is authoritative proof that\n * the remote peer's signalling presence is fresh: its\n * {@link MeshSignalingClient} has just sent a `join`. If we are still\n * holding a slot for that peerId, the slot belongs to a previous\n * incarnation — *unless* the peer kept a live WebRTC session across\n * its own signalling reconnect, in which case the data channel is\n * still `open` on a `connected` connection and the slot is genuinely\n * sound (peers talk directly once the channel is up; signalling is\n * intermittent). That one shape is kept; every other shape is stale.\n *\n * Polly issue #133: before this, a stale slot wedged rediscovery of a\n * peer that reuses its peerId across short-lived sessions (a CLI\n * `chat send` re-run from the same keyring is the canonical case).\n * The `slot-already-exists` gate in {@link evaluateInitiation}\n * blocked the survivor from re-dialling, and {@link handleOffer}'s\n * glare rule made the lexicographically-higher survivor ignore the\n * newcomer's offer too — so the pair never reconnected until the\n * {@link slotIdleTimeoutMs} watchdog reaped the corpse, far too late\n * for the request that triggered the rejoin.\n *\n * A handshake that is still young and negotiating (`new`/`connecting`\n * within {@link slotNeverConnectedTimeoutMs}) is left alone — a\n * duplicate frame arriving mid-handshake must not nuke a connection\n * that simply is not done yet. */\n private evictStaleSlotForRejoin(remotePeerId: string): void {\n const slot = this.slots.get(remotePeerId);\n if (!slot) return;\n const state = slot.connection.connectionState;\n // The peer kept a live, data-carrying channel across its signalling\n // reconnect — the slot is sound, keep it.\n if (state === \"connected\" && slot.channel?.readyState === \"open\") return;\n // A handshake still in flight and young enough to plausibly\n // complete — don't restart it on a duplicate discovery frame.\n if (\n this.slotNeverConnectedTimeoutMs > 0 &&\n (state === \"new\" || state === \"connecting\") &&\n performance.now() - slot.createdAt < this.slotNeverConnectedTimeoutMs\n ) {\n return;\n }\n // Anything else — a stuck or dead connection, or one whose channel\n // never opened — is a stale slot from an earlier incarnation.\n // tearDownWedgedSlot removes it from the map and emits\n // `peer-disconnected` so Automerge stops routing through it; the\n // caller's dial path then rebuilds against the fresh peer.\n this.tearDownWedgedSlot(remotePeerId);\n }\n\n /** Construct an initiating slot inside a per-peer try/catch and\n * record any throw as a `fatal-error` rejection on the per-peer\n * decision map so the snapshot surface names it. Every dial entry\n * point ({@link handlePeerJoined}, {@link handlePeersPresent},\n * {@link addKnownPeer}, {@link refreshKnownPeers}) routes through\n * here so a single peer's broken construction can never take down a\n * batch of peers — pre-#106 a thrown `new RTCPeerConnection()`\n * inside `handlePeersPresent` would skip every later peer in the\n * same batch with no observable trace because the signalling\n * client's frame dispatch swallowed the rejection. */\n private tryCreateInitiatingSlot(remotePeerId: string): void {\n try {\n this.createInitiatingSlot(remotePeerId);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.lastSlotInitiationDecisions.set(remotePeerId, {\n decision: \"rejected\",\n reason: \"fatal-error\",\n error: message,\n at: performance.now(),\n });\n }\n }\n\n /** Handle the signalling server's `peer-left` notification: a\n * previously joined peer has closed its socket. Evict any slot we\n * hold for that peer so a subsequent `peer-joined` from the same\n * peerId (a reconnect) creates a fresh slot rather than colliding\n * with a stale RTCPeerConnection that WebRTC's own ICE timer has\n * not yet noticed is dead. */\n handlePeerLeft(remotePeerId: string): void {\n this.presentPeers.delete(remotePeerId);\n const slot = this.slots.get(remotePeerId);\n if (!slot) return;\n slot.channel?.close();\n slot.connection.close();\n this.slots.delete(remotePeerId);\n }\n\n /** Register a peer the adapter should dial. Used by post-construction\n * pair-acceptance flows — when a long-lived mesh client (e.g. a CLI\n * `add-device` process or a daemon holding the mesh open) accepts a\n * pair token after start-up, its keyring's `knownPeers` map gains a\n * new entry. Calling this method propagates that into the adapter's\n * own allowlist; if the peer is already in the signalling roster and\n * the tie-break rule names us as the initiator, an SDP offer fires\n * immediately. No-op if the peer is already known.\n *\n * When a {@link MeshWebRTCAdapterOptions.keyringSource} is configured\n * the adapter already reads `knownPeers` live and the periodic sweep\n * picks up the new entry within\n * {@link MeshWebRTCAdapterOptions.knownPeersRefreshIntervalMs} on its\n * own, so explicit calls to this method are not required for\n * correctness — but remain supported for callers that want the\n * \"dial now if present\" prompt without waiting for the next sweep. */\n addKnownPeer(remotePeerId: string): void {\n if (remotePeerId === this.localPeerId) return;\n if (this.keyringSource === undefined) {\n // Captured-set fallback path: keep the legacy mutation behaviour\n // so existing consumers that wire the adapter directly without a\n // keyringSource still work.\n if (this.knownPeers.has(remotePeerId)) return;\n this.knownPeers.add(remotePeerId);\n }\n if (!this.presentPeers.has(remotePeerId)) return;\n if (!this.shouldInitiateTo(remotePeerId)) return;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n\n /** Re-evaluate every peer currently in the signalling roster and\n * dial the ones the keyring authorises that we do not already have\n * a slot for. The periodic sweep started in {@link connect} calls\n * this; consumers can call it manually to skip the wait after they\n * apply a fresh pairing token. Idempotent.\n *\n * A throw from {@link createInitiatingSlot} for one peer must not\n * prevent the sweep from continuing to the next one — pre-#106 a\n * synchronous throw inside `new RTCPeerConnection()` (a real risk\n * once the page has built dozens of connections and Chrome's\n * per-page cap is in play) skipped every later peer in the same\n * sweep, with no observable trace because `setInterval` swallows\n * the rejection silently. {@link tryCreateInitiatingSlot} caches\n * the error onto the snapshot's slotInitiationRejectionReason as\n * `fatal-error` so the failing peer is named instead of disguised\n * as \"(no slot)\". */\n refreshKnownPeers(): void {\n for (const remotePeerId of this.presentPeers) {\n if (!this.shouldInitiateTo(remotePeerId)) continue;\n this.tryCreateInitiatingSlot(remotePeerId);\n }\n }\n\n private shouldInitiateTo(remotePeerId: string): boolean {\n const reason = this.evaluateInitiation(remotePeerId);\n this.lastSlotInitiationDecisions.set(remotePeerId, {\n decision: reason === undefined ? \"accepted\" : \"rejected\",\n reason,\n error: undefined,\n at: performance.now(),\n });\n return reason === undefined;\n }\n\n /** Pure-function form of the gate cascade behind {@link shouldInitiateTo}.\n * Returns `undefined` when every gate passes (the slot would be\n * built); otherwise returns the named reason the dial was declined.\n * Pulling the gates out of the boolean wrapper lets the snapshot\n * surface name *which* gate stopped construction without the caller\n * having to re-implement the check. Polly issue #106 item 7.\n *\n * The \"not-present\" gate is checked here even though the inbound\n * call sites (`handlePeerJoined`, `handlePeersPresent`,\n * `refreshKnownPeers`, `addKnownPeer`) only invoke `shouldInitiateTo`\n * for peers in the signalling roster — so on those paths the gate\n * never fires. It's load-bearing on the snapshot path, where the\n * reason is computed for every peer the caller might ask about\n * (including keyring entries that aren't currently signalling). */\n private evaluateInitiation(remotePeerId: string): SlotInitiationRejectionReason | undefined {\n if (remotePeerId === this.localPeerId) return \"self\";\n if (!this.hasKnownPeer(remotePeerId)) return \"not-in-keyring\";\n if (!this.presentPeers.has(remotePeerId)) return \"not-present\";\n if (this.slots.has(remotePeerId)) return \"slot-already-exists\";\n // Tie-break: the lexicographically higher peer id initiates. This\n // matches the glare-resolution rule in handleOffer, so pre-offer\n // filtering eliminates the glare pathway for the common case where\n // both sides learn of each other at roughly the same moment.\n if (this.localPeerId <= remotePeerId) return \"tie-break-other-side\";\n return undefined;\n }\n\n /** Compute the latest initiation decision for a peer at snapshot\n * time. Prefers the cached decision when a sweep tick fixed the\n * outcome to `fatal-error` (a thrown construction is sticky until\n * the next successful sweep clears it); otherwise re-evaluates the\n * gates against current state. Pure read; never mutates the map. */\n private snapshotInitiationDecision(remotePeerId: string): SlotInitiationDecision {\n const cached = this.lastSlotInitiationDecisions.get(remotePeerId);\n if (cached?.reason === \"fatal-error\") return cached;\n const reason = this.evaluateInitiation(remotePeerId);\n return {\n decision: reason === undefined ? \"accepted\" : \"rejected\",\n reason,\n error: undefined,\n at: performance.now(),\n };\n }\n\n whenReady(): Promise<void> {\n if (this.ready) return Promise.resolve();\n return new Promise((resolve) => {\n this.readyResolver = resolve;\n });\n }\n\n /**\n * Start the adapter. Marks the adapter ready so Automerge's\n * NetworkSubsystem begins routing messages through it. Discovery of\n * peers is driven entirely by the signalling server's\n * `peers-present` and `peer-joined` frames, handed to\n * {@link handlePeersPresent} and {@link handlePeerJoined}. A peer\n * that calls `signaling.connect()` at any point — before or after\n * this method — will either find its targets already in the server's\n * lobby (peers-present) or learn about them as they arrive\n * (peer-joined); either way the adapter only opens one\n * initiating slot per ordered pair.\n */\n connect(peerId: PeerId, peerMetadata?: PeerMetadata): void {\n this.peerId = peerId;\n if (peerMetadata !== undefined) {\n this.peerMetadata = peerMetadata;\n }\n this.ready = true;\n this.readyResolver?.();\n this.startKnownPeersSweep();\n this.startSlotWatchdog();\n }\n\n disconnect(): void {\n this.stopKnownPeersSweep();\n this.stopSlotWatchdog();\n for (const slot of this.slots.values()) {\n slot.channel?.close();\n slot.connection.close();\n }\n this.slots.clear();\n this.signaling.close();\n this.ready = false;\n this.emit(\"close\");\n }\n\n /** Start the periodic re-sweep that catches peers added to the\n * keyring after their `peer-joined` notification has already fired.\n * No-op when no keyringSource was supplied — the captured-set\n * fallback has no live source to re-read, so the sweep would be\n * useless. No-op when the interval is configured to 0.\n *\n * Each tick increments {@link sweepRunCount} and stamps\n * {@link lastSweepAt} *before* dispatching to\n * {@link refreshKnownPeers} so a snapshot can distinguish \"sweep is\n * running but every peer is rejected\" from \"sweep is dead\". An\n * outer try/catch keeps the timer alive even if the per-peer\n * try/catch inside `refreshKnownPeers` somehow leaks. Polly issue\n * #106 item 7. */\n private startKnownPeersSweep(): void {\n if (this.keyringSource === undefined) return;\n if (this.knownPeersRefreshIntervalMs <= 0) return;\n if (this.knownPeersRefreshTimer !== undefined) return;\n this.knownPeersRefreshTimer = setInterval(() => {\n this.sweepRunCount += 1;\n this.lastSweepAt = performance.now();\n try {\n this.refreshKnownPeers();\n } catch {\n // The per-peer try/catch inside refreshKnownPeers should\n // already have caught construction errors. This outer catch\n // is a last-resort belt that keeps the interval alive even\n // if a future change adds a non-per-peer throw site.\n }\n }, this.knownPeersRefreshIntervalMs);\n }\n\n private stopKnownPeersSweep(): void {\n if (this.knownPeersRefreshTimer === undefined) return;\n clearInterval(this.knownPeersRefreshTimer);\n this.knownPeersRefreshTimer = undefined;\n }\n\n /** Close a slot's data channel and connection, remove it from the\n * map, and emit `peer-disconnected` upward so Automerge stops\n * routing through the dead pair. Used by both the polly#109\n * `.catch` in {@link createInitiatingSlot} and the polly#109/#110\n * watchdog in {@link sweepWedgedSlots}. */\n private tearDownWedgedSlot(peerId: string): void {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n // Delete from the map BEFORE closing the connection. The\n // `connection.close()` call below transitions the connection to\n // `closed` synchronously on some implementations, which re-enters\n // `onconnectionstatechange` — and that handler emits its own\n // `peer-disconnected` if it sees the slot still mapped. Removing\n // it first makes the handler's `has(peerId)` check false so we\n // own the single emit.\n this.slots.delete(peerId);\n try {\n slot.channel?.close();\n } catch {\n // werift's data channel `close()` can throw if the underlying\n // connection has already gone away; swallow so a teardown\n // never leaks an exception out of the watchdog loop.\n }\n try {\n slot.connection.close();\n } catch {\n // Same rationale as above.\n }\n this.emit(\"peer-disconnected\", { peerId: peerId as unknown as PeerId });\n }\n\n /** Start the slot watchdog (polly#109 + polly#110). Walks every\n * active slot every {@link slotWatchdogIntervalMs} and tears down\n * the two named wedge shapes:\n *\n * - `connectionState` in `new`/`connecting` for longer than\n * {@link slotNeverConnectedTimeoutMs} (polly#109: silent\n * `createOffer`/`setLocalDescription` rejection, or a network\n * condition under which ICE never gathers).\n *\n * - `connectionState === \"connected\"` AND data channel `open` AND\n * no inbound bytes for {@link slotIdleTimeoutMs} (polly#110:\n * remote process killed without OS-layer FIN — ICE keepalives\n * take many minutes to fail, the slot sends sync traffic into\n * the void until then).\n *\n * Each teardown stamps `fatal-error` on the per-peer decision so\n * the named gate is visible on the next snapshot, then emits\n * `peer-disconnected` so Automerge stops routing through the dead\n * slot. The next sweep tick re-evaluates and the recovery path\n * creates a fresh slot. No-op when configured to 0. */\n private startSlotWatchdog(): void {\n if (this.slotWatchdogIntervalMs <= 0) return;\n if (this.slotWatchdogTimer !== undefined) return;\n this.slotWatchdogTimer = setInterval(() => {\n try {\n this.sweepWedgedSlots();\n } catch {\n // Belt-and-braces: the per-slot loop already swallows\n // teardown errors. A non-per-slot throw should still leave\n // the timer alive.\n }\n }, this.slotWatchdogIntervalMs);\n }\n\n private stopSlotWatchdog(): void {\n if (this.slotWatchdogTimer === undefined) return;\n clearInterval(this.slotWatchdogTimer);\n this.slotWatchdogTimer = undefined;\n }\n\n private sweepWedgedSlots(): void {\n const now = performance.now();\n const peerIds = [...this.slots.keys()];\n for (const peerId of peerIds) {\n const slot = this.slots.get(peerId);\n if (!slot) continue;\n const reason = this.classifyWedgedSlot(slot, now);\n if (!reason) continue;\n this.lastSlotInitiationDecisions.set(peerId, {\n decision: \"rejected\",\n reason: \"fatal-error\",\n error: reason,\n at: now,\n });\n this.tearDownWedgedSlot(peerId);\n }\n }\n\n /** Decide whether a slot is wedged at the moment of inspection,\n * returning the human-readable diagnosis when it is. Pulled out of\n * {@link sweepWedgedSlots} so the per-slot decision stays under\n * biome's cognitive-complexity ceiling and so a future test can\n * exercise the gates directly. */\n private classifyWedgedSlot(slot: PeerSlot, now: number): string | undefined {\n const state = slot.connection.connectionState;\n const ageMs = now - slot.createdAt;\n if (\n this.slotNeverConnectedTimeoutMs > 0 &&\n (state === \"new\" || state === \"connecting\") &&\n ageMs > this.slotNeverConnectedTimeoutMs\n ) {\n return `slot never reached connected (state=${state}) after ${Math.round(ageMs)}ms`;\n }\n if (\n this.slotIdleTimeoutMs > 0 &&\n state === \"connected\" &&\n slot.channel?.readyState === \"open\"\n ) {\n const lastInbound = slot.lastInboundAt ?? slot.createdAt;\n const idleMs = now - lastInbound;\n if (idleMs > this.slotIdleTimeoutMs) {\n return `slot idle: no inbound bytes for ${Math.round(idleMs)}ms (state=connected, dc=open)`;\n }\n }\n return undefined;\n }\n\n /**\n * Send a sync message to a specific remote peer. If no RTCPeerConnection\n * exists yet, the adapter initiates one by producing an SDP offer and\n * sending it through the signalling channel; the outgoing bytes are\n * queued until the data channel is open.\n */\n send(message: Message): void {\n const targetId = message.targetId as unknown as string;\n const bytes = this.serialiseMessage(message);\n let slot = this.slots.get(targetId);\n if (!slot) {\n slot = this.createInitiatingSlot(targetId);\n }\n if (slot.lastSyncHandshakeAttempt.firstOutboundSendAt === undefined) {\n slot.lastSyncHandshakeAttempt.firstOutboundSendAt = performance.now();\n }\n // Per-handle wire-level transcript (polly#107 item 5). Automerge\n // stamps `documentId` on every sync/request/remote-heads/etc.\n // message; messages without a documentId (the synchronizer never\n // emits one without it, but the type union allows for legacy\n // ephemeral envelopes) are skipped here rather than blanketing\n // every peer's handle map with a noise key. `wrap` in\n // {@link MeshNetworkAdapter} now preserves `documentId` in the\n // outer envelope so this stamp survives the crypto layer.\n const documentId = (message as unknown as { documentId?: string }).documentId;\n if (typeof documentId === \"string\") {\n let handleEntry = slot.handles.get(documentId);\n if (!handleEntry) {\n handleEntry = emptyHandleSyncSnapshot();\n slot.handles.set(documentId, handleEntry);\n }\n handleEntry.lastSyncMessageOutAt = performance.now();\n handleEntry.lastSyncMessageOutSize = bytes.length;\n handleEntry.lastSyncMessageOutType =\n typeof message.type === \"string\" ? message.type : undefined;\n }\n if (slot.channel && slot.channel.readyState === \"open\") {\n void this.sendBytesMaybeFragmented(slot.channel, bytes);\n } else {\n slot.pendingSends.push(bytes);\n }\n }\n\n /** Number of consecutive fragment sends after which the sender\n * yields to the macrotask queue when {@link syncYieldEnabled} is on.\n * 8 × 64 KiB = 512 KiB of bytes between yields — small enough that\n * a 5 MB sync produces many yield points (and the JS event loop\n * drains the consumer's `setInterval` liveness probes between\n * them), large enough that the per-yield overhead does not dominate\n * the wire cost. */\n private static readonly SEND_YIELD_EVERY_N_FRAGMENTS = 8;\n\n /** Send raw wire bytes, fragmenting if they exceed the SCTP maxMessageSize\n * cap. The default RTCDataChannel limit is 256 KiB in current Chrome and\n * werift; oversized sends either throw, drop silently, or stall the\n * channel, none of which surface as an error to the caller. Fragments\n * use the same length-prefixed JSON header wire format as ordinary\n * messages but carry a `sync-fragment` type that the receive path\n * detects and reassembles before deserialising.\n *\n * When {@link MeshWebRTCAdapterOptions.syncYieldEnabled} is true (the\n * default), the loop awaits the macrotask queue every\n * {@link SEND_YIELD_EVERY_N_FRAGMENTS} fragments so the JS event\n * loop drains between batches — without this, a 5–8 MB initial\n * sync produces 78–125 back-to-back `RTCDataChannel.send` calls in\n * a tight loop, starving anything else on the main thread (polly\n * issue #104, sender side). When the option is false the legacy\n * tight-loop shape is preserved for the falsification path. */\n private async sendBytesMaybeFragmented(\n channel: RTCDataChannel,\n bytes: Uint8Array<ArrayBuffer>\n ): Promise<void> {\n if (bytes.length <= SYNC_FRAGMENT_THRESHOLD) {\n channel.send(bytes);\n return;\n }\n const id = crypto.randomUUID();\n const fragments = chunkSyncMessage(bytes, id, this.syncFragmentChunkSize);\n if (!this.syncYieldEnabled) {\n for (const fragment of fragments) {\n channel.send(fragment);\n }\n return;\n }\n let i = 0;\n for (const fragment of fragments) {\n channel.send(fragment);\n i += 1;\n if (i % MeshWebRTCAdapter.SEND_YIELD_EVERY_N_FRAGMENTS === 0 && i < fragments.length) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n }\n }\n\n /**\n * Entry point the signalling client calls when it receives a signal\n * from a remote peer. Dispatches on the payload `kind` to either\n * accept an offer (building an answer), apply an answer, or add an\n * ICE candidate. Exposed publicly so the caller that constructs the\n * signalling client can wire the onSignal callback directly to this\n * method.\n */\n handleSignal(fromPeerId: string, rawPayload: unknown): void {\n const payload = rawPayload as unknown as SignalingPayload;\n if (!payload || typeof payload !== \"object\" || !(\"kind\" in payload)) {\n return;\n }\n switch (payload.kind) {\n case \"offer\":\n void this.handleOffer(fromPeerId, payload.sdp);\n return;\n case \"answer\":\n void this.handleAnswer(fromPeerId, payload.sdp);\n return;\n case \"ice\":\n void this.handleIceCandidate(fromPeerId, payload.candidate);\n return;\n }\n }\n\n /** Assemble the {@link RTCConfiguration} every new\n * {@link RTCPeerConnection} is built with. Centralised so every slot\n * (initiator and answerer) honours the same iceTransportPolicy. */\n private buildRtcConfiguration(): RTCConfiguration {\n const config: RTCConfiguration = { iceServers: this.iceServers };\n if (this.iceTransportPolicy !== undefined) {\n config.iceTransportPolicy = this.iceTransportPolicy;\n }\n return config;\n }\n\n /** Decide whether a local ICE candidate should be relayed through\n * the signalling channel to the remote peer. Chrome's iceTransport\n * Policy = \"relay\" implementation filters non-relay candidates at\n * the source so the remote peer never sees them; werift's only\n * filters its own outgoing connectivity checks and still emits host\n * and srflx candidates upstream, so a remote peer with policy \"all\"\n * can pair against them — making relay-only enforcement leaky in\n * the mixed-implementation case the polly#105 falsification harness\n * exposes. Mirroring Chrome's filter at this layer gives a uniform\n * contract on every RTCPeerConnection implementation polly supports.\n *\n * The candidate `type` field is the SDP-spec form; we additionally\n * parse it out of the legacy `candidate` string for implementations\n * that don't surface the typed field directly (werift exposes the\n * SDP string only). */\n private isRelayCandidateInit(init: RTCIceCandidateInit): boolean {\n const candidateStr = init.candidate ?? \"\";\n const m = candidateStr.match(/\\btyp\\s+(\\S+)/i);\n return m?.[1]?.toLowerCase() === \"relay\";\n }\n\n private shouldSendCandidate(candidate: RTCIceCandidate): boolean {\n if (!this.iceRelayEnforcement) return true;\n if (this.iceTransportPolicy !== \"relay\") return true;\n const typed = (candidate as unknown as { type?: string }).type;\n const match = candidate.candidate.match(/\\btyp\\s+(\\S+)/i);\n const candidateType = (typed ?? match?.[1] ?? \"\").toLowerCase();\n return candidateType === \"relay\";\n }\n\n /** Strip non-relay `a=candidate:` lines from an SDP when\n * iceTransportPolicy is `\"relay\"`. Some RTCPeerConnection\n * implementations (werift, notably) embed every gathered candidate\n * in the SDP regardless of policy, and a remote peer parsing those\n * via `setRemoteDescription` will pair against them — bypassing the\n * relay-only contract. Chrome already filters in-SDP candidates by\n * policy, so this is only load-bearing for werift consumers, but\n * the SDP rewrite is implementation-agnostic and idempotent. */\n private filterSdpCandidatesByPolicy(sdp: string | undefined): string | undefined {\n if (!this.iceRelayEnforcement) return sdp;\n if (this.iceTransportPolicy !== \"relay\") return sdp;\n if (!sdp) return sdp;\n const lines = sdp.split(/\\r?\\n/);\n const filtered: string[] = [];\n for (const line of lines) {\n if (!line.startsWith(\"a=candidate:\")) {\n filtered.push(line);\n continue;\n }\n const m = line.match(/\\btyp\\s+(\\S+)/i);\n if (m?.[1]?.toLowerCase() === \"relay\") filtered.push(line);\n }\n return filtered.join(\"\\r\\n\");\n }\n\n /** Apply {@link filterSdpCandidatesByPolicy} to an SDP\n * description ahead of `setLocalDescription` (filter outgoing) or\n * `setRemoteDescription` (filter incoming). The defensive\n * receive-side filter exists because we cannot trust the remote\n * peer's adapter to have stripped its non-relay candidates first —\n * polly might be talking to a pre-#105 polly, or to a non-polly\n * peer whose policy enforcement is different. */\n private applySdpPolicyFilter(description: RTCSessionDescriptionInit): RTCSessionDescriptionInit {\n if (!this.iceRelayEnforcement) return description;\n if (this.iceTransportPolicy !== \"relay\") return description;\n const filtered = this.filterSdpCandidatesByPolicy(description.sdp);\n if (filtered === description.sdp) return description;\n return { ...description, sdp: filtered };\n }\n\n private createInitiatingSlot(targetId: string): PeerSlot {\n const connection = new this.RTCPeerConnectionCtor(this.buildRtcConfiguration());\n const channel = connection.createDataChannel(this.dataChannelLabel, { ordered: true });\n const slot: PeerSlot = {\n connection,\n channel,\n pendingSends: [],\n pendingFragments: new Map(),\n pendingRemoteIce: [],\n inFlightSync: undefined,\n transport: undefined,\n lastDataChannelError: undefined,\n lastSyncHandshakeAttempt: emptySyncHandshakeAttempt(),\n handles: new Map(),\n createdAt: performance.now(),\n lastInboundAt: undefined,\n };\n this.slots.set(targetId, slot);\n this.wireConnection(targetId, connection);\n this.wireDataChannel(targetId, channel);\n // Pre-#109: `initiateOffer` was fire-and-forget — a rejection in\n // `createOffer` or `setLocalDescription` was dropped on the floor,\n // leaving the slot at `signalingState=stable`, ICE never started\n // gathering, and the recovery sweep hit `slot-already-exists`\n // forever. The `.catch` here surfaces the failure on the snapshot\n // surface and removes the wedged slot so the next sweep retries.\n this.initiateOffer(targetId, connection).catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n this.lastSlotInitiationDecisions.set(targetId, {\n decision: \"rejected\",\n reason: \"fatal-error\",\n error: message,\n at: performance.now(),\n });\n this.tearDownWedgedSlot(targetId);\n });\n return slot;\n }\n\n private async initiateOffer(targetId: string, connection: RTCPeerConnection): Promise<void> {\n const offer = await connection.createOffer();\n await connection.setLocalDescription(offer);\n const localOffer = connection.localDescription ?? offer;\n const sdpToSend = this.applySdpPolicyFilter({\n type: localOffer.type,\n sdp: localOffer.sdp ?? offer.sdp,\n });\n this.signaling.sendSignal(targetId, {\n kind: \"offer\",\n sdp: sdpToSend,\n } satisfies SignalingPayload);\n }\n\n private async handleOffer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const existing = this.slots.get(fromPeerId);\n if (existing) {\n // Glare: we already initiated a connection to this peer. Resolve by\n // peer-id ordering: the lexicographically lower id yields its own\n // offer and accepts the incoming one. The higher id ignores the\n // incoming offer and waits for the answer to its own.\n const localId = this.peerId as unknown as string;\n if (localId > fromPeerId) {\n return;\n }\n existing.channel?.close();\n existing.connection.close();\n this.slots.delete(fromPeerId);\n }\n\n const connection = new this.RTCPeerConnectionCtor(this.buildRtcConfiguration());\n const slot: PeerSlot = {\n connection,\n channel: undefined,\n pendingSends: [],\n pendingFragments: new Map(),\n pendingRemoteIce: [],\n inFlightSync: undefined,\n transport: undefined,\n lastDataChannelError: undefined,\n lastSyncHandshakeAttempt: emptySyncHandshakeAttempt(),\n handles: new Map(),\n createdAt: performance.now(),\n lastInboundAt: undefined,\n };\n this.slots.set(fromPeerId, slot);\n this.wireConnection(fromPeerId, connection);\n connection.ondatachannel = (event) => {\n slot.channel = event.channel;\n this.wireDataChannel(fromPeerId, event.channel);\n };\n await connection.setRemoteDescription(this.applySdpPolicyFilter(sdp));\n await this.flushPendingRemoteIce(slot);\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n const localAnswer = connection.localDescription ?? answer;\n const sdpToSend = this.applySdpPolicyFilter({\n type: localAnswer.type,\n sdp: localAnswer.sdp ?? answer.sdp,\n });\n this.signaling.sendSignal(fromPeerId, {\n kind: \"answer\",\n sdp: sdpToSend,\n } satisfies SignalingPayload);\n }\n\n private async handleAnswer(fromPeerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n // Drop answers that arrive after the connection has already settled\n // — the signalling relay can echo a peer's frames more than once\n // under reconnect or reload, and a duplicate answer in the `stable`\n // state otherwise throws `InvalidStateError` and kills the slot. We\n // only ever expect an answer while we still have a local offer\n // pending; anything else is benign noise.\n if (slot.connection.signalingState !== \"have-local-offer\") return;\n await slot.connection.setRemoteDescription(this.applySdpPolicyFilter(sdp));\n await this.flushPendingRemoteIce(slot);\n }\n\n private async handleIceCandidate(\n fromPeerId: string,\n candidate: RTCIceCandidateInit\n ): Promise<void> {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n // Receive-side mirror of {@link shouldSendCandidate}: even with a\n // perfectly behaved peer we cannot assume the SDP and trickle\n // streams agree on policy enforcement, and a non-polly remote may\n // not filter at all. Drop anything that isn't relay-typed when\n // the local policy is `\"relay\"`.\n if (\n this.iceRelayEnforcement &&\n this.iceTransportPolicy === \"relay\" &&\n !this.isRelayCandidateInit(candidate)\n )\n return;\n // If the answerer gathers ICE faster than its answer SDP travels\n // back through the signalling relay, candidates can land here before\n // `setRemoteDescription` has run. addIceCandidate throws when\n // `remoteDescription` is null on Chrome 148+, and the spec does not\n // require browsers to queue these internally — so buffer until the\n // remote description is set and drain in handleAnswer/handleOffer.\n if (slot.connection.remoteDescription === null) {\n slot.pendingRemoteIce.push(candidate);\n return;\n }\n try {\n await slot.connection.addIceCandidate(candidate);\n } catch {\n // Ignore candidate errors — a stale candidate after the connection\n // has already opened is benign.\n }\n }\n\n /** Drain the per-slot queue of remote ICE candidates that arrived\n * before `setRemoteDescription` completed. Errors per candidate are\n * swallowed for the same reason {@link handleIceCandidate} swallows\n * them — a single bad candidate must not stall the connection. */\n private async flushPendingRemoteIce(slot: PeerSlot): Promise<void> {\n if (slot.pendingRemoteIce.length === 0) return;\n const queued = slot.pendingRemoteIce;\n slot.pendingRemoteIce = [];\n for (const candidate of queued) {\n try {\n await slot.connection.addIceCandidate(candidate);\n } catch {\n // Same rationale as the live-path catch in handleIceCandidate.\n }\n }\n }\n\n private wireConnection(peerId: string, connection: RTCPeerConnection): void {\n connection.onicecandidate = (event) => {\n if (!event.candidate) return;\n if (!this.shouldSendCandidate(event.candidate)) return;\n this.signaling.sendSignal(peerId, {\n kind: \"ice\",\n candidate: event.candidate.toJSON(),\n } satisfies SignalingPayload);\n };\n connection.onconnectionstatechange = () => {\n const state = connection.connectionState;\n if (state === \"connected\") {\n this.emitPeerCandidateOnce(peerId);\n } else if (state === \"disconnected\" || state === \"failed\" || state === \"closed\") {\n // Polly#109/#110: `tearDownWedgedSlot` also closes the\n // connection, which re-enters this handler with\n // state=closed. Only emit if WE are the path that removed\n // the slot from the map — otherwise the wedged-slot teardown\n // would emit `peer-disconnected` twice.\n if (!this.slots.has(peerId)) return;\n this.slots.delete(peerId);\n this.emit(\"peer-disconnected\", { peerId: peerId as unknown as PeerId });\n }\n };\n }\n\n /** Emit `peer-candidate` upward exactly once per slot lifetime,\n * stamping the slot's `lastSyncHandshakeAttempt.peerCandidateEmittedAt`\n * with the moment of emission. The \"once\" semantics protect Automerge's\n * NetworkSubsystem from a double-add when both the\n * `connectionstatechange = connected` event AND the\n * `dataChannel.onopen` event fire on the same slot — under werift\n * the former is sometimes flaky, under Chrome the latter sometimes\n * fires first; pre-#106 only the connection-state path emitted, so a\n * werift slot whose data channel opened cleanly but whose connection\n * state never advanced past `connecting` would never signal \"ready\"\n * upward. Polly issue #106 Failure B item — closing one named\n * mechanism for \"data channel open, sync never started\". */\n private emitPeerCandidateOnce(peerId: string): void {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n if (slot.lastSyncHandshakeAttempt.peerCandidateEmittedAt !== undefined) return;\n slot.lastSyncHandshakeAttempt.peerCandidateEmittedAt = performance.now();\n this.emit(\"peer-candidate\", {\n peerId: peerId as unknown as PeerId,\n peerMetadata: {},\n });\n }\n\n private wireDataChannel(peerId: string, channel: RTCDataChannel): void {\n channel.onopen = () => {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n slot.lastSyncHandshakeAttempt.dataChannelOpenedAt = performance.now();\n // Mirror the connection-state `connected` path: if Automerge has\n // not yet been told the peer exists (because the connection\n // state event hasn't fired or fired with a state we don't\n // forward), the `onopen` callback is a strictly better signal\n // anyway — bytes can flow now. The dedupe inside\n // {@link emitPeerCandidateOnce} keeps Automerge's bookkeeping\n // single-add. Polly issue #106 Failure B.\n this.emitPeerCandidateOnce(peerId);\n // Drain any pending sends that were queued while the channel\n // was still connecting. The fragmenting helper handles oversized\n // payloads the same way it would on a live send.\n for (const bytes of slot.pendingSends) {\n void this.sendBytesMaybeFragmented(channel, bytes);\n }\n slot.pendingSends = [];\n };\n channel.onmessage = (event) => {\n // Polly issue #110: stamp inbound liveness at the wire boundary\n // — before deserialisation/dispatch — so the watchdog's idle\n // check is driven by \"we are still hearing from the peer\", not\n // \"we successfully decoded an Automerge message from the peer\".\n // A peer whose wire is healthy but whose envelopes fail\n // verification is still alive from the transport's point of\n // view, and the wedge this is meant to catch is bytewise\n // silence — not protocol-level corruption.\n const liveSlot = this.slots.get(peerId);\n if (liveSlot) liveSlot.lastInboundAt = performance.now();\n const data = event.data;\n if (data instanceof ArrayBuffer) {\n this.dispatchMessage(peerId, new Uint8Array(data));\n } else if (data instanceof Uint8Array) {\n this.dispatchMessage(peerId, data);\n }\n // Other types (strings, Blobs) are ignored — Polly's mesh transport\n // only sends binary payloads via this adapter.\n };\n channel.onclose = () => {\n const slot = this.slots.get(peerId);\n if (slot?.channel === channel) {\n slot.channel = undefined;\n }\n };\n // Capture the last data-channel error so a consumer harness can\n // surface \"the wire-level error that took this peer offline\" even\n // if the channel has since closed. Polly issue #105 item 7. The\n // event shape differs between Chrome (RTCErrorEvent) and werift\n // (a plain object with `.error`); we narrow to a string for both.\n channel.onerror = (event) => {\n const slot = this.slots.get(peerId);\n if (!slot) return;\n const ev = event as unknown as { error?: { message?: unknown }; message?: unknown };\n const message =\n typeof ev.error?.message === \"string\"\n ? ev.error.message\n : typeof ev.message === \"string\"\n ? ev.message\n : \"unknown data channel error\";\n slot.lastDataChannelError = message;\n };\n }\n\n /** Refresh the per-peer {@link TransportSnapshot} for one peer by\n * pulling {@link RTCPeerConnection.getStats} and distilling the\n * result. Cheap-ish but not free — getStats walks the underlying\n * stats graph — so this is opt-in: callers (typically a debugging\n * harness or a periodic observability loop) invoke it explicitly\n * and the result lives on the slot for the next\n * {@link getPeerStateSnapshot}. Returns the refreshed snapshot, or\n * `undefined` if there is no slot for the peer or stats are\n * unavailable. Polly issue #105 item 7. */\n async refreshTransportStats(peerId: string): Promise<TransportSnapshot | undefined> {\n const slot = this.slots.get(peerId);\n if (!slot) return undefined;\n const snapshot = await collectTransportSnapshot(slot.connection, slot.lastDataChannelError);\n slot.transport = snapshot;\n return snapshot;\n }\n\n /** Refresh transport stats for every active peer slot in one shot.\n * Returns a map keyed by peerId so a caller can render the result\n * without re-walking {@link getPeerStateSnapshot}. The underlying\n * `getStats` calls run concurrently. */\n async refreshAllTransportStats(): Promise<Map<string, TransportSnapshot>> {\n const out = new Map<string, TransportSnapshot>();\n const peerIds = [...this.slots.keys()];\n const results = await Promise.all(peerIds.map((id) => this.refreshTransportStats(id)));\n for (let i = 0; i < peerIds.length; i += 1) {\n const r = results[i];\n const id = peerIds[i];\n if (r && id !== undefined) out.set(id, r);\n }\n return out;\n }\n\n private dispatchMessage(fromPeerId: string, bytes: Uint8Array): void {\n try {\n // Intercept sync-fragments first: an oversized Automerge sync\n // message is split into fragments on the sender side because a\n // single RTCDataChannel.send above the SCTP maxMessageSize cap\n // silently drops or stalls the channel. Reassemble and re-dispatch\n // once every fragment of an id has arrived.\n if (isSyncFragmentType(bytes)) {\n this.handleSyncFragment(fromPeerId, bytes);\n return;\n }\n // Intercept blob messages before they reach the Automerge deserialiser.\n // Blob headers have type fields starting with \"blob-\" and would fail\n // MeshNetworkAdapter's signed-envelope unwrap if passed through.\n if (this.onBlobMessage && isBlobMessageType(bytes)) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as Record<string, unknown>;\n const data = bytes.subarray(4 + headerLen);\n this.onBlobMessage(fromPeerId, header, data);\n return;\n }\n const message = this.deserialiseMessage(bytes);\n this.scheduleEmitMessage(fromPeerId, message, false);\n } catch {\n // Drop malformed messages silently — the MeshNetworkAdapter wrapper\n // also drops on verification failure, so a corrupt frame at this\n // layer is observationally the same as a forgery at the layer above.\n }\n }\n\n /** Hand a deserialised Automerge message off to whoever is listening\n * on this adapter's `\"message\"` event. When\n * {@link MeshWebRTCAdapterOptions.syncYieldEnabled} is true (the\n * default), the emit runs on a fresh macrotask so the crypto-unwrap\n * and Automerge `applyChanges` chain downstream of this method does\n * not sit on the same JS stack frame as the wire `onmessage` callback\n * — that's the receiver-side starvation site polly issue #104\n * documents. When the option is false the emit is synchronous,\n * recovering the pre-fix shape used by the falsification path.\n *\n * The `viaFragmentPath` argument tags whether this dispatch came out\n * of a reassembled fragment chain; only those carry an\n * `inFlightSync` reassembly state worth bookkeeping. Small\n * single-message dispatches yield but don't touch inFlightSync. */\n private scheduleEmitMessage(\n fromPeerId: string,\n message: Message,\n viaFragmentPath: boolean\n ): void {\n this.stampFirstInboundMessage(fromPeerId);\n this.stampHandleInbound(fromPeerId, message);\n if (!this.syncYieldEnabled) {\n this.emit(\"message\", message);\n if (viaFragmentPath) {\n this.finishInFlightSyncApply(fromPeerId);\n }\n return;\n }\n if (viaFragmentPath) {\n const slot = this.slots.get(fromPeerId);\n if (slot?.inFlightSync) {\n slot.inFlightSync.applyBacklog += 1;\n }\n }\n setTimeout(() => {\n try {\n this.emit(\"message\", message);\n } finally {\n if (viaFragmentPath) {\n this.finishInFlightSyncApply(fromPeerId);\n }\n }\n }, 0);\n }\n\n /** Stamp the slot's `firstInboundMessageAt` the first time a\n * dispatched (non-fragment, non-blob) message lands for a peer. Pure\n * observability for {@link SyncHandshakeAttemptSnapshot}; does not\n * affect dispatch. */\n private stampFirstInboundMessage(fromPeerId: string): void {\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n if (slot.lastSyncHandshakeAttempt.firstInboundMessageAt !== undefined) return;\n slot.lastSyncHandshakeAttempt.firstInboundMessageAt = performance.now();\n }\n\n /** Stamp `handles[documentId].lastSyncMessageInAt` for the\n * per-handle observability layer polly#107 adds. Pure observability;\n * does not affect dispatch. */\n private stampHandleInbound(fromPeerId: string, message: Message): void {\n const documentId = (message as unknown as { documentId?: string }).documentId;\n if (typeof documentId !== \"string\") return;\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n let entry = slot.handles.get(documentId);\n if (!entry) {\n entry = emptyHandleSyncSnapshot();\n slot.handles.set(documentId, entry);\n }\n entry.lastSyncMessageInAt = performance.now();\n }\n\n private finishInFlightSyncApply(fromPeerId: string): void {\n const slot = this.slots.get(fromPeerId);\n if (!slot?.inFlightSync) return;\n slot.inFlightSync.applyBacklog = Math.max(0, slot.inFlightSync.applyBacklog - 1);\n this.emitSyncProgress(fromPeerId, \"dispatch-applied\", 0);\n if (slot.inFlightSync.applyBacklog === 0 && slot.pendingFragments.size === 0) {\n slot.inFlightSync = undefined;\n }\n }\n\n private emitSyncProgress(\n fromPeerId: string,\n kind: \"fragment-received\" | \"dispatch-applied\",\n bytesDelta: number\n ): void {\n const slot = this.slots.get(fromPeerId);\n const inFlightSync = slot?.inFlightSync;\n // The `sync-progress` event is polly-specific; Automerge's\n // NetworkAdapter event-type union doesn't include it. Cast around\n // the typed emit so consumers can subscribe via the same `.on(...)`\n // surface that carries `peer-candidate` and `peer-disconnected`.\n (\n this as unknown as {\n emit: (event: string, payload: SyncProgressEvent) => void;\n }\n ).emit(\"sync-progress\", {\n peerId: fromPeerId,\n kind,\n bytesDelta,\n chunksReceived: inFlightSync?.chunksReceived ?? 0,\n bytesReceived: inFlightSync?.bytesReceived ?? 0,\n applyBacklog: inFlightSync?.applyBacklog ?? 0,\n at: performance.now(),\n });\n }\n\n private handleSyncFragment(fromPeerId: string, bytes: Uint8Array): void {\n const parsed = parseSyncFragment(bytes);\n if (!parsed) return;\n const slot = this.slots.get(fromPeerId);\n if (!slot) return;\n const { header, data } = parsed;\n let entry = slot.pendingFragments.get(header.id);\n if (!entry) {\n entry = { chunks: new Map(), total: header.total };\n slot.pendingFragments.set(header.id, entry);\n }\n // The data view is a window onto the wire frame buffer. Copy out so\n // the reassembled message owns its bytes and the wire frame can be\n // garbage-collected.\n entry.chunks.set(header.index, data.slice());\n if (!slot.inFlightSync) {\n slot.inFlightSync = {\n chunksReceived: 0,\n bytesReceived: 0,\n lastChunkAt: performance.now(),\n applyBacklog: 0,\n };\n }\n slot.inFlightSync.chunksReceived += 1;\n slot.inFlightSync.bytesReceived += data.byteLength;\n slot.inFlightSync.lastChunkAt = performance.now();\n this.emitSyncProgress(fromPeerId, \"fragment-received\", data.byteLength);\n if (entry.chunks.size < entry.total) return;\n slot.pendingFragments.delete(header.id);\n const reassembled = reassembleSyncFragments(entry.chunks, entry.total);\n if (!this.syncYieldEnabled) {\n this.dispatchReassembled(fromPeerId, reassembled);\n return;\n }\n setTimeout(() => {\n this.dispatchReassembled(fromPeerId, reassembled);\n }, 0);\n }\n\n /** Dispatch a reassembled fragment payload back through\n * {@link dispatchMessage}, but tagged so the\n * {@link scheduleEmitMessage} path knows it owes a\n * `finishInFlightSyncApply` afterwards. Synchronous re-entry into\n * `dispatchMessage` would lose that signal, so the post-fragment\n * deserialise+emit is inlined here. */\n private dispatchReassembled(fromPeerId: string, bytes: Uint8Array): void {\n try {\n if (this.onBlobMessage && isBlobMessageType(bytes)) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as Record<string, unknown>;\n const data = bytes.subarray(4 + headerLen);\n this.onBlobMessage(fromPeerId, header, data);\n this.finishInFlightSyncApply(fromPeerId);\n return;\n }\n const message = this.deserialiseMessage(bytes);\n this.scheduleEmitMessage(fromPeerId, message, true);\n } catch {\n // Same swallowing rationale as dispatchMessage; record the apply\n // completion so the inFlightSync state doesn't get stuck.\n this.finishInFlightSyncApply(fromPeerId);\n }\n }\n\n /** Peer IDs with an open data channel, suitable for blob requests. */\n get connectedPeerIds(): string[] {\n const ids: string[] = [];\n for (const [peerId, slot] of this.slots) {\n if (slot.channel && slot.channel.readyState === \"open\") {\n ids.push(peerId);\n }\n }\n return ids;\n }\n\n /** Send a pre-serialised blob message to a specific peer. Returns false\n * if the peer is not connected or the send buffer is above the high-water\n * mark (caller should retry after a delay). */\n sendBlobMessage(peerId: string, bytes: Uint8Array<ArrayBuffer>): boolean {\n const slot = this.slots.get(peerId);\n if (!slot?.channel || slot.channel.readyState !== \"open\") return false;\n return this.trySendOnChannel(slot.channel, bytes);\n }\n\n /** Send bytes on a data channel if the buffer is below the high-water\n * mark. Returns true if sent, false if backpressure applies. */\n private trySendOnChannel(channel: RTCDataChannel, bytes: Uint8Array<ArrayBuffer>): boolean {\n // 256 KiB high-water mark — matches the blob transfer default.\n if (channel.bufferedAmount > 256 * 1024) return false;\n channel.send(bytes);\n return true;\n }\n\n /** Pack an Automerge Message into binary for transmission over the\n * data channel. The format mirrors MeshNetworkAdapter's internal\n * serialisation: a length-prefixed JSON header followed by the raw\n * data bytes. Returns a Uint8Array<ArrayBuffer> so the result is\n * directly usable by RTCDataChannel.send under TypeScript's strict\n * buffer-source typing. */\n private serialiseMessage(message: Message): Uint8Array<ArrayBuffer> {\n const headerObj: Record<string, unknown> = {\n type: message.type,\n senderId: message.senderId,\n targetId: message.targetId,\n };\n if (\"documentId\" in message && message.documentId !== undefined) {\n headerObj[\"documentId\"] = message.documentId;\n }\n const headerBytes = new TextEncoder().encode(JSON.stringify(headerObj));\n const dataBytes: Uint8Array =\n \"data\" in message && message.data instanceof Uint8Array ? message.data : new Uint8Array(0);\n const size = 4 + headerBytes.length + dataBytes.length;\n const buffer = new ArrayBuffer(size);\n const out = new Uint8Array(buffer);\n const view = new DataView(buffer);\n view.setUint32(0, headerBytes.length, false);\n out.set(headerBytes, 4);\n out.set(dataBytes, 4 + headerBytes.length);\n return out;\n }\n\n /** Inverse of {@link serialiseMessage}. */\n private deserialiseMessage(bytes: Uint8Array): Message {\n if (bytes.length < 4) {\n throw new Error(\"MeshWebRTCAdapter: message too short to deserialise.\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) {\n throw new Error(\"MeshWebRTCAdapter: message header truncated.\");\n }\n const header = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + headerLen)));\n const data = bytes.slice(4 + headerLen);\n return { ...header, data } as unknown as Message;\n }\n}\n",
27
27
  "/**\n * sync-fragment — chunking, reassembly, and wire format for oversized\n * Automerge sync messages sent through MeshWebRTCAdapter.\n *\n * An `RTCDataChannel.send(bytes)` call with a payload above the SCTP\n * `maxMessageSize` limit (256 KiB by default in Chrome and werift) either\n * throws synchronously, drops silently, or stalls the channel — none of\n * which are observable to the caller. A first-connection Automerge sync\n * for a doc whose state exceeds ~200 KiB produces exactly such a message,\n * so without fragmentation the receiver's `dc.onmessage` never fires for\n * the large payload and sync stalls forever.\n *\n * The wire format here mirrors the blob-transfer layout — a 4-byte\n * big-endian header length followed by a JSON header and the chunk\n * payload — but uses a distinct `type` value (`sync-fragment`, no\n * `blob-` prefix) so the existing blob fast-path in MeshWebRTCAdapter\n * does not mistake a sync fragment for a blob chunk.\n */\n\n/** Maximum bytes a single channel.send may carry without fragmentation.\n * Werift (the node-side WebRTC implementation polly recommends for\n * CLI/daemon use) enforces a hard 64 KiB (65536 bytes) maxMessageSize\n * on its RTCDataChannel — anything larger is rejected with a\n * `max-message-size exceeded` error and silently drops the channel\n * for that send. Chrome's SCTP cap is 256 KiB and would tolerate\n * larger frames, but the threshold is chosen to fit inside werift's\n * cap WITH per-fragment header overhead included so a single mesh\n * deployment works on both transports. Matches the blob-transfer\n * chunk size so the two transports have a consistent per-message\n * footprint on the data channel. */\nexport const SYNC_FRAGMENT_THRESHOLD = 60 * 1024;\n\n/** Chunk size used when a message exceeds the threshold. Left at the\n * same value as {@link SYNC_FRAGMENT_THRESHOLD} so the framing\n * header (a JSON-encoded `SyncFragmentHeader` of ~90 bytes plus a\n * 4-byte length prefix) does not push any fragment over werift's\n * 64 KiB wire limit — see polly issue #104 for the failure mode\n * this guards against. */\nexport const SYNC_FRAGMENT_CHUNK_SIZE = 60 * 1024;\n\nexport interface SyncFragmentHeader {\n type: \"sync-fragment\";\n /** Identifier shared by every fragment of one original message. */\n id: string;\n /** Zero-based fragment index within the message. */\n index: number;\n /** Total number of fragments composing the message. */\n total: number;\n}\n\n/** Wire frame for a sync fragment: 4-byte BE header length, JSON header,\n * raw chunk bytes. Returned as an ArrayBuffer-backed Uint8Array so it is\n * directly usable by RTCDataChannel.send under strict buffer-source typing. */\nexport function serialiseSyncFragment(\n header: SyncFragmentHeader,\n data: Uint8Array\n): Uint8Array<ArrayBuffer> {\n const headerBytes = new TextEncoder().encode(JSON.stringify(header));\n const size = 4 + headerBytes.length + data.length;\n const buffer = new ArrayBuffer(size);\n const out = new Uint8Array(buffer);\n const view = new DataView(buffer);\n view.setUint32(0, headerBytes.length, false);\n out.set(headerBytes, 4);\n out.set(data, 4 + headerBytes.length);\n return out;\n}\n\n/** Parse a wire frame produced by {@link serialiseSyncFragment}. Returns\n * undefined if the bytes are too short, the header is unparseable, or the\n * header `type` is not `sync-fragment`. */\nexport function parseSyncFragment(\n bytes: Uint8Array\n): { header: SyncFragmentHeader; data: Uint8Array } | undefined {\n if (bytes.length < 4) return undefined;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) return undefined;\n try {\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(4, 4 + headerLen))\n ) as SyncFragmentHeader;\n if (header.type !== \"sync-fragment\") return undefined;\n const data = bytes.subarray(4 + headerLen);\n return { header, data };\n } catch {\n return undefined;\n }\n}\n\n/** Cheap probe used on the receive path before parsing — looks for the\n * literal `\"type\":\"sync-fragment\"` byte sequence inside the JSON header\n * without a full parse. Mirrors `isBlobMessageType`. */\nexport function isSyncFragmentType(bytes: Uint8Array): boolean {\n if (bytes.length < 4) return false;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) return false;\n const headerSlice = bytes.subarray(4, 4 + headerLen);\n const needle = new TextEncoder().encode('\"type\":\"sync-fragment\"');\n return findSubarray(headerSlice, needle) !== -1;\n}\n\n/** Split a serialised sync message into ordered fragments suitable for\n * transmission through one data channel. The caller is responsible for\n * generating the shared `id`. Always returns at least one fragment, so\n * callers can use it unconditionally without a separate small-message\n * branch — though MeshWebRTCAdapter shortcuts the small-message case to\n * avoid the per-chunk header overhead. */\nexport function chunkSyncMessage(\n bytes: Uint8Array,\n id: string,\n chunkSize: number = SYNC_FRAGMENT_CHUNK_SIZE\n): Uint8Array<ArrayBuffer>[] {\n const total = Math.max(1, Math.ceil(bytes.length / chunkSize));\n const fragments: Uint8Array<ArrayBuffer>[] = [];\n for (let index = 0; index < total; index++) {\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, bytes.length);\n fragments.push(\n serialiseSyncFragment({ type: \"sync-fragment\", id, index, total }, bytes.subarray(start, end))\n );\n }\n return fragments;\n}\n\n/** Reassemble a complete fragment map into the original byte sequence.\n * Throws if any index in [0, total) is missing. */\nexport function reassembleSyncFragments(\n chunks: Map<number, Uint8Array>,\n total: number\n): Uint8Array {\n let totalBytes = 0;\n for (let i = 0; i < total; i++) {\n const chunk = chunks.get(i);\n if (!chunk) {\n throw new Error(`reassembleSyncFragments: missing fragment ${i} of ${total}`);\n }\n totalBytes += chunk.length;\n }\n const out = new Uint8Array(totalBytes);\n let offset = 0;\n for (let i = 0; i < total; i++) {\n const chunk = chunks.get(i) as unknown as Uint8Array;\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nfunction findSubarray(haystack: Uint8Array, needle: Uint8Array): number {\n if (needle.length === 0) return 0;\n outer: for (let i = 0; i <= haystack.length - needle.length; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) continue outer;\n }\n return i;\n }\n return -1;\n}\n",
28
28
  "/**\n * revocation — Phase 2 key-revocation flow for $meshState.\n *\n * A $meshState deployment is only as secure as the keys it trusts. When a\n * device is lost, stolen, or compromised, its public key needs to be\n * removed from every other peer's trust set so that any operations signed\n * by that key are refused. This module provides the primitive pieces for\n * that flow: a signed revocation record that names the revoked peer id,\n * carries the issuer's identity, and travels between peers through the\n * same channels as any other signed message.\n *\n * A RevocationRecord is produced by a peer that has decided to revoke\n * another peer (typically because the user told their device to do so).\n * It is then serialised to a binary envelope, broadcast to other peers\n * through whatever transport is available, and applied to each receiving\n * keyring via {@link applyRevocation}. Applying a revocation adds the\n * target peer id to the keyring's {@link MeshKeyring.revokedPeers} set;\n * the MeshNetworkAdapter then drops all further messages from that peer,\n * even though the public key is still present in the knownPeers map.\n *\n * Signature layer: every revocation is signed by the *issuer's* key. The\n * receiver verifies the signature against the issuer's public key before\n * applying. This prevents a peer with no authority from forging a\n * revocation, at least in the signature-level threat model — a compromised\n * peer could still forge revocations naming any other peer, which is why\n * production deployments layer an access-set check on top (\"who is\n * authorised to revoke whom\"). That layer is a follow-up; the first cut\n * is signature-only, and any signed revocation from a known peer is\n * accepted.\n *\n * Why revocations are signed but not encrypted: revocations are public\n * in the sense that they name \"peer X is no longer trusted.\" There is no\n * confidentiality requirement — anyone seeing a revocation learns only\n * that someone has been kicked out, which is already observable from\n * the absence of their operations. Encrypting them would add cost without\n * adding security, so the wire format is signed-only.\n */\n\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport {\n decodeSignedEnvelope,\n encodeSignedEnvelope,\n openEnvelope as openSignedEnvelope,\n type SigningKeyPair,\n signEnvelope,\n} from \"./signing\";\n\n/** Current revocation-record format version. */\nexport const REVOCATION_RECORD_VERSION = 1;\n\n/** Magic header bytes for sanity-checking parsed revocations. ASCII \"PRV1\". */\nexport const REVOCATION_MAGIC = new Uint8Array([0x50, 0x52, 0x56, 0x31]);\n\n/**\n * The payload carried inside a signed revocation envelope.\n */\nexport interface RevocationRecord {\n /** Format version. */\n version: number;\n /** The peer id doing the revoking. Becomes the `senderId` of the signed\n * envelope when the record is serialised. */\n issuerPeerId: string;\n /** The peer id being revoked. After a receiver applies this record, its\n * MeshNetworkAdapter will drop all further messages from this peer. */\n revokedPeerId: string;\n /** Unix timestamp (milliseconds) when the revocation was issued. Carried\n * for audit and for tie-breaking in case an issuer issues multiple\n * revocations targeting the same peer. */\n issuedAt: number;\n /** Optional human-readable reason. Not used by the enforcement layer;\n * applications can surface it in audit logs. */\n reason?: string;\n}\n\n/** Errors thrown by the revocation subsystem. */\nexport class RevocationError extends Error {\n readonly code:\n | \"unknown-issuer\"\n | \"unauthorised-issuer\"\n | \"signature-invalid\"\n | \"truncated\"\n | \"wrong-magic\"\n | \"unknown-version\"\n | \"not-signed-by-issuer\";\n\n constructor(message: string, code: RevocationError[\"code\"]) {\n super(message);\n this.name = \"RevocationError\";\n this.code = code;\n }\n}\n\n/** Options for {@link createRevocation}. */\nexport interface CreateRevocationOptions {\n /** Signing keypair of the issuer. The private key signs the record; the\n * public key is looked up by the receiver via `issuerPeerId`. */\n issuer: SigningKeyPair;\n /** Stable peer id of the issuer. */\n issuerPeerId: string;\n /** Peer id to revoke. */\n revokedPeerId: string;\n /** Optional human-readable reason. */\n reason?: string;\n /** Override the current time. Intended for tests. */\n now?: () => number;\n}\n\n/**\n * Build a fresh {@link RevocationRecord}. The returned record is plain\n * data; use {@link encodeRevocation} to wrap it in a signed envelope\n * suitable for transport.\n */\nexport function createRevocation(options: CreateRevocationOptions): RevocationRecord {\n const now = options.now ? options.now() : Date.now();\n return {\n version: REVOCATION_RECORD_VERSION,\n issuerPeerId: options.issuerPeerId,\n revokedPeerId: options.revokedPeerId,\n issuedAt: now,\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n };\n}\n\n/**\n * Apply a verified revocation to a keyring. Mutates the keyring in place:\n * adds the target peer id to {@link MeshKeyring.revokedPeers}. The caller\n * must verify the revocation (via {@link decodeRevocation}) before\n * applying; this function does not revalidate the signature.\n */\nexport function applyRevocation(record: RevocationRecord, keyring: MeshKeyring): void {\n keyring.revokedPeers.add(record.revokedPeerId);\n}\n\n/**\n * Revoke a peer locally without producing a transportable record. Useful\n * for the common case where an application decides to drop a peer on this\n * device without propagating the decision elsewhere (tests, single-device\n * setups). Peers that want the revocation to spread to other devices\n * should use {@link createRevocation} + {@link encodeRevocation}.\n */\nexport function revokePeerLocally(peerId: string, keyring: MeshKeyring): void {\n keyring.revokedPeers.add(peerId);\n}\n\n// binary serialisation\n\n/**\n * Serialise a {@link RevocationRecord} to a binary payload ready for\n * signing. The layout is:\n *\n * [4 bytes: magic \"PRV1\"]\n * [1 byte: version]\n * [4 bytes BE: issuer id byte length]\n * [N bytes: issuer id UTF-8]\n * [4 bytes BE: revoked peer id byte length]\n * [M bytes: revoked peer id UTF-8]\n * [8 bytes BE: issuedAt (uint64 milliseconds)]\n * [4 bytes BE: reason byte length]\n * [R bytes: reason UTF-8]\n */\nexport function serialiseRevocationPayload(record: RevocationRecord): Uint8Array {\n const issuerBytes = new TextEncoder().encode(record.issuerPeerId);\n const revokedBytes = new TextEncoder().encode(record.revokedPeerId);\n const reasonBytes = new TextEncoder().encode(record.reason ?? \"\");\n\n const total =\n REVOCATION_MAGIC.length +\n 1 + // version\n 4 +\n issuerBytes.length +\n 4 +\n revokedBytes.length +\n 8 + // issuedAt\n 4 +\n reasonBytes.length;\n\n const out = new Uint8Array(total);\n let offset = 0;\n\n out.set(REVOCATION_MAGIC, offset);\n offset += REVOCATION_MAGIC.length;\n\n out[offset] = record.version;\n offset += 1;\n\n const view = new DataView(out.buffer);\n view.setUint32(offset, issuerBytes.length, false);\n offset += 4;\n out.set(issuerBytes, offset);\n offset += issuerBytes.length;\n\n view.setUint32(offset, revokedBytes.length, false);\n offset += 4;\n out.set(revokedBytes, offset);\n offset += revokedBytes.length;\n\n view.setBigUint64(offset, BigInt(record.issuedAt), false);\n offset += 8;\n\n view.setUint32(offset, reasonBytes.length, false);\n offset += 4;\n out.set(reasonBytes, offset);\n\n return out;\n}\n\n/** Inverse of {@link serialiseRevocationPayload}. */\nfunction parseRevocationPayload(bytes: Uint8Array): RevocationRecord {\n let offset = 0;\n\n if (bytes.length < REVOCATION_MAGIC.length) {\n throw new RevocationError(\"Revocation record too short for magic.\", \"truncated\");\n }\n for (let i = 0; i < REVOCATION_MAGIC.length; i++) {\n if (bytes[offset + i] !== REVOCATION_MAGIC[i]) {\n throw new RevocationError(\"Revocation record magic mismatch.\", \"wrong-magic\");\n }\n }\n offset += REVOCATION_MAGIC.length;\n\n if (bytes.length < offset + 1) {\n throw new RevocationError(\"Revocation record truncated at version.\", \"truncated\");\n }\n const version = bytes[offset] as unknown as number;\n offset += 1;\n if (version !== REVOCATION_RECORD_VERSION) {\n throw new RevocationError(`Unknown revocation record version: ${version}.`, \"unknown-version\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at issuer length.\", \"truncated\");\n }\n const issuerLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + issuerLen) {\n throw new RevocationError(\"Revocation record truncated at issuer id.\", \"truncated\");\n }\n const issuerPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + issuerLen));\n offset += issuerLen;\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at revoked id length.\", \"truncated\");\n }\n const revokedLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + revokedLen) {\n throw new RevocationError(\"Revocation record truncated at revoked id.\", \"truncated\");\n }\n const revokedPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + revokedLen));\n offset += revokedLen;\n\n if (bytes.length < offset + 8) {\n throw new RevocationError(\"Revocation record truncated at issuedAt.\", \"truncated\");\n }\n const issuedAt = Number(view.getBigUint64(offset, false));\n offset += 8;\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at reason length.\", \"truncated\");\n }\n const reasonLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + reasonLen) {\n throw new RevocationError(\"Revocation record truncated at reason.\", \"truncated\");\n }\n const reason = new TextDecoder().decode(bytes.subarray(offset, offset + reasonLen));\n offset += reasonLen;\n\n return {\n version,\n issuerPeerId,\n revokedPeerId,\n issuedAt,\n ...(reason ? { reason } : {}),\n };\n}\n\n/**\n * Produce a signed, transportable binary blob from a revocation record.\n * Wraps the serialised payload in a {@link SignedEnvelope} signed by the\n * issuer's keypair, then encodes the envelope to bytes.\n */\nexport function encodeRevocation(record: RevocationRecord, issuer: SigningKeyPair): Uint8Array {\n const payload = serialiseRevocationPayload(record);\n const envelope = signEnvelope(payload, record.issuerPeerId, issuer.secretKey);\n return encodeSignedEnvelope(envelope);\n}\n\n/**\n * Parse and verify a signed revocation blob. Returns the decoded record\n * on success; throws {@link RevocationError} on any failure.\n *\n * Verification requires the keyring to already know the issuer's public\n * key (because Polly does not have a global PKI). If the issuer is\n * unknown, the caller receives `unknown-issuer` and can decide whether\n * to cache the revocation for later verification or drop it outright.\n *\n * Authorisation: when the keyring has a non-empty\n * {@link MeshKeyring.revocationAuthority} set, only issuers inside that\n * set can have their revocations accepted. An issuer outside the set\n * produces `unauthorised-issuer`. When the authority set is undefined\n * or empty, any signed revocation from a known peer is accepted — that\n * is the Phase 2 first-cut default, preserved for backward compatibility.\n */\nexport function decodeRevocation(bytes: Uint8Array, keyring: MeshKeyring): RevocationRecord {\n const envelope = decodeSignedEnvelope(bytes);\n const issuerKey = keyring.knownPeers.get(envelope.senderId);\n if (!issuerKey) {\n throw new RevocationError(\n `Revocation issuer ${envelope.senderId} is not in the local keyring.`,\n \"unknown-issuer\"\n );\n }\n if (\n keyring.revocationAuthority !== undefined &&\n keyring.revocationAuthority.size > 0 &&\n !keyring.revocationAuthority.has(envelope.senderId)\n ) {\n throw new RevocationError(\n `Revocation issuer ${envelope.senderId} is not in the keyring's revocation authority set.`,\n \"unauthorised-issuer\"\n );\n }\n let payloadBytes: Uint8Array;\n try {\n payloadBytes = openSignedEnvelope(envelope, issuerKey);\n } catch {\n throw new RevocationError(\n `Revocation signature failed verification for issuer ${envelope.senderId}.`,\n \"signature-invalid\"\n );\n }\n\n const record = parseRevocationPayload(payloadBytes);\n // Paranoid cross-check: the payload's claimed issuer must match the\n // envelope's authenticated sender. Mismatch means a forged payload.\n if (record.issuerPeerId !== envelope.senderId) {\n throw new RevocationError(\n `Revocation payload claims issuer ${record.issuerPeerId} but the envelope was signed by ${envelope.senderId}.`,\n \"not-signed-by-issuer\"\n );\n }\n return record;\n}\n",
29
29
  "/**\n * revocation-summary — RFC-043 wire format for the revocation-set\n * summary exchanged on every new peer connection.\n *\n * On a fresh data channel both peers send the other a summary of\n * every revocation they currently hold. After exchange each side\n * computes which entries in its own set are missing from the\n * remote's summary, and pushes those entries as full encoded\n * revocation blobs (tag 0x01). The summary itself is informative,\n * not authoritative — only the signed blob can mutate a keyring.\n *\n * Wire format: UTF-8 JSON. A summary is a sorted JSON array of\n * entries, each carrying the fields needed to detect set-difference\n * without leaking the blob's signature. Sorting is canonical so two\n * peers comparing summaries agree on order even when their stores\n * were populated in different sequences.\n *\n * [\n * { \"r\": \"<revokedPeerId>\", \"i\": \"<issuerPeerId>\", \"t\": <issuedAt> },\n * ...\n * ]\n *\n * Short field names keep the wire compact for keyrings with many\n * revocations. Long-form parsing isn't a goal — the format is\n * internal to the mesh protocol.\n */\n\n/** A single entry in a revocation-set summary. */\nexport interface RevocationSummaryEntry {\n /** Peer id the revocation targets. */\n revokedPeerId: string;\n /** Peer id that issued the revocation. */\n issuerPeerId: string;\n /** Unix milliseconds at issue time, from the underlying RevocationRecord. */\n issuedAt: number;\n}\n\n/**\n * Encode a list of revocation entries to the canonical wire\n * representation. Entries are sorted by `revokedPeerId` then\n * `issuerPeerId` then `issuedAt` to make the comparison\n * order-independent.\n */\nexport function encodeRevocationSummary(\n entries: ReadonlyArray<RevocationSummaryEntry>\n): Uint8Array {\n const sorted = [...entries].sort(compareSummaryEntries);\n const json = JSON.stringify(\n sorted.map((entry) => ({\n r: entry.revokedPeerId,\n i: entry.issuerPeerId,\n t: entry.issuedAt,\n }))\n );\n return new TextEncoder().encode(json);\n}\n\n/**\n * Inverse of {@link encodeRevocationSummary}. Throws on malformed\n * input — the caller is expected to drop the summary and emit a\n * diagnostic when this happens, not retry.\n */\nexport function decodeRevocationSummary(bytes: Uint8Array): RevocationSummaryEntry[] {\n const text = new TextDecoder().decode(bytes);\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch (err) {\n throw new Error(\n `decodeRevocationSummary: invalid JSON: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n if (!Array.isArray(raw)) {\n throw new Error(\"decodeRevocationSummary: expected an array\");\n }\n return raw.map((item, index): RevocationSummaryEntry => {\n if (!item || typeof item !== \"object\") {\n throw new Error(`decodeRevocationSummary: entry ${index} is not an object`);\n }\n const e = item as { r?: unknown; i?: unknown; t?: unknown };\n if (typeof e.r !== \"string\" || typeof e.i !== \"string\" || typeof e.t !== \"number\") {\n throw new Error(`decodeRevocationSummary: entry ${index} has missing or wrong-typed fields`);\n }\n return { revokedPeerId: e.r, issuerPeerId: e.i, issuedAt: e.t };\n });\n}\n\nfunction compareSummaryEntries(a: RevocationSummaryEntry, b: RevocationSummaryEntry): number {\n if (a.revokedPeerId !== b.revokedPeerId) {\n return a.revokedPeerId < b.revokedPeerId ? -1 : 1;\n }\n if (a.issuerPeerId !== b.issuerPeerId) {\n return a.issuerPeerId < b.issuerPeerId ? -1 : 1;\n }\n return a.issuedAt - b.issuedAt;\n}\n\n/**\n * Stable key for a summary entry. Two entries with the same key\n * represent the same logical revocation. Used by the\n * peer-candidate gossip path to compute set differences.\n */\nexport function summaryEntryKey(entry: RevocationSummaryEntry): string {\n return `${entry.revokedPeerId}::${entry.issuerPeerId}::${entry.issuedAt}`;\n}\n",
30
30
  "/**\n * pairing — Phase 2 first-cut pairing flow for $meshState.\n *\n * Two devices that want to share a $meshState document must exchange three\n * things before sync can begin: the issuer's Ed25519 signing public key\n * (so the receiver can verify ops authored by the issuer), the symmetric\n * document encryption key (so both sides can encrypt and decrypt the\n * shared document), and the issuer's stable peer id (so the receiver\n * knows which entry in its keyring the public key belongs to). This\n * module packs all three into a {@link PairingToken}, serialises it to a\n * compact binary format suitable for QR codes or copy-paste, and provides\n * the matching parse-and-apply flow on the receiving side.\n *\n * Threat model: pairing tokens are transmitted over an out-of-band channel\n * that the user can authenticate visually — typically a QR code on the\n * issuer's device, scanned by the receiver. Because anyone with the token\n * can decrypt and impersonate, the OOB channel is the only authentication.\n * The token includes a TTL (default 10 minutes) so that a token displayed\n * briefly and then dismissed cannot be replayed by an attacker who later\n * gains access to a screenshot. A production deployment would layer a\n * Short Authentication String (SAS) on top — both devices display a code\n * derived from the shared state, and the user verifies they match — but\n * that is a follow-up.\n *\n * The pairing flow is one-way in the Phase 2 first cut. The issuer\n * generates a token and displays it; the receiver applies it and picks\n * up the issuer's keys. The receiver's own keys reach the issuer through\n * the access set: when the receiver sends its first signed op, the issuer\n * records the receiver's public key alongside its peer id and adds it to\n * the keyring. A bidirectional pairing flow that exchanges both sides'\n * keys in a single QR exchange is straightforward to add later but adds\n * UX surface area that is not needed for the mesh transport to work.\n */\n\nimport { KEY_BYTES as ENCRYPTION_KEY_BYTES, generateDocumentKey } from \"./encryption\";\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport {\n generateSigningKeyPair,\n PUBLIC_KEY_BYTES as SIGNING_PUBLIC_KEY_BYTES,\n type SigningKeyPair,\n} from \"./signing\";\n\n/** Current pairing-token format version. Bumped if the wire format changes. */\nexport const PAIRING_TOKEN_VERSION = 1;\n\n/** Magic header bytes for sanity-checking parsed tokens. ASCII \"PPT1\". */\nexport const PAIRING_TOKEN_MAGIC = new Uint8Array([0x50, 0x50, 0x54, 0x31]);\n\n/** Length of the random nonce embedded in every token. */\nexport const PAIRING_NONCE_BYTES = 16;\n\n/** Default TTL applied when {@link createPairingToken} is called without an\n * explicit `ttlMs` option. */\nexport const DEFAULT_PAIRING_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\n/**\n * The contents of a pairing token. Both sides operate on this shape; the\n * binary serialisation is purely for transport.\n */\nexport interface PairingToken {\n /** Format version. {@link PAIRING_TOKEN_VERSION} at the time of writing. */\n version: number;\n /** Stable peer id of the issuing device. The receiver records this as\n * the lookup key for the issuer's public key in its keyring. */\n issuerPeerId: string;\n /** Issuer's Ed25519 signing public key (32 bytes). */\n issuerPublicKey: Uint8Array;\n /** Shared document encryption key (32 bytes). The receiver stores this\n * under {@link documentKeyId} in its keyring. */\n documentKey: Uint8Array;\n /** Identifier under which the receiver stores the document key. For the\n * Phase 2 first cut this is typically the well-known DEFAULT_MESH_KEY_ID\n * from mesh-network-adapter; per-document keys (one entry per Automerge\n * document) are a follow-up. */\n documentKeyId: string;\n /** Unix timestamp (milliseconds) after which the token is considered\n * expired and {@link applyPairingToken} refuses to use it. */\n expiresAt: number;\n /** 16-byte random nonce. Carried through serialisation so two tokens\n * with otherwise-identical contents are still distinguishable. */\n nonce: Uint8Array;\n}\n\n/** Errors thrown by the pairing subsystem. */\nexport class PairingError extends Error {\n readonly code:\n | \"expired\"\n | \"wrong-magic\"\n | \"unknown-version\"\n | \"truncated\"\n | \"invalid-public-key\"\n | \"invalid-document-key\"\n | \"invalid-nonce\";\n\n constructor(message: string, code: PairingError[\"code\"]) {\n super(message);\n this.name = \"PairingError\";\n this.code = code;\n }\n}\n\n/**\n * Options for {@link createPairingToken}. The signing identity and the\n * document key are required; everything else is optional with sensible\n * defaults.\n */\nexport interface CreatePairingTokenOptions {\n /** The issuing device's signing keypair. Only the public key ends up in\n * the token; the secret never leaves the issuer. */\n identity: SigningKeyPair;\n /** Stable peer id for the issuing device. */\n issuerPeerId: string;\n /** The symmetric document key the receiver should adopt. If omitted, a\n * fresh key is generated and the caller is responsible for using the\n * same key on the issuing side too. */\n documentKey?: Uint8Array;\n /** Identifier under which the receiver stores the document key. */\n documentKeyId: string;\n /** Time-to-live in milliseconds. Defaults to {@link DEFAULT_PAIRING_TTL_MS}. */\n ttlMs?: number;\n /** Override the current time. Intended for tests; production code should\n * not pass this. */\n now?: () => number;\n}\n\n/**\n * Generate a fresh {@link PairingToken}. The token is ready to be\n * serialised and displayed to the receiver via an OOB channel.\n */\nexport function createPairingToken(options: CreatePairingTokenOptions): PairingToken {\n const now = options.now ? options.now() : Date.now();\n const ttlMs = options.ttlMs ?? DEFAULT_PAIRING_TTL_MS;\n const documentKey = options.documentKey ?? generateDocumentKey();\n const nonce = randomBytes(PAIRING_NONCE_BYTES);\n\n return {\n version: PAIRING_TOKEN_VERSION,\n issuerPeerId: options.issuerPeerId,\n issuerPublicKey: options.identity.publicKey,\n documentKey,\n documentKeyId: options.documentKeyId,\n expiresAt: now + ttlMs,\n nonce,\n };\n}\n\n/**\n * Generate a fresh pairing token *and* a fresh signing keypair in one call.\n * Convenience for first-time setup where the device has no existing\n * identity yet. Returns both so the caller can persist the keypair and\n * then display the token.\n */\nexport function createPairingTokenWithFreshIdentity(args: {\n issuerPeerId: string;\n documentKeyId: string;\n ttlMs?: number;\n now?: () => number;\n}): { identity: SigningKeyPair; token: PairingToken } {\n const identity = generateSigningKeyPair();\n const token = createPairingToken({\n identity,\n issuerPeerId: args.issuerPeerId,\n documentKeyId: args.documentKeyId,\n ttlMs: args.ttlMs,\n now: args.now,\n });\n return { identity, token };\n}\n\n/**\n * Check whether a token has expired against the current wall-clock time\n * (or an injected `now`).\n */\nexport function isPairingTokenExpired(token: PairingToken, now?: () => number): boolean {\n const t = now ? now() : Date.now();\n return t >= token.expiresAt;\n}\n\n/**\n * Apply a parsed and validated token to a {@link MeshKeyring}. Mutates the\n * keyring in place: adds the issuer's public key to {@link MeshKeyring.knownPeers}\n * and the document key to {@link MeshKeyring.documentKeys}.\n *\n * Throws {@link PairingError} with code \"expired\" if the token's TTL has\n * elapsed. The receiver is expected to apply the token promptly after\n * scanning; rejecting expired tokens prevents replay of long-lived\n * captures.\n */\nexport function applyPairingToken(\n token: PairingToken,\n keyring: MeshKeyring,\n options: { now?: () => number } = {}\n): void {\n if (isPairingTokenExpired(token, options.now)) {\n throw new PairingError(\n `Pairing token from ${token.issuerPeerId} expired at ${new Date(token.expiresAt).toISOString()}.`,\n \"expired\"\n );\n }\n keyring.knownPeers.set(token.issuerPeerId, token.issuerPublicKey);\n keyring.documentKeys.set(token.documentKeyId, token.documentKey);\n}\n\n// binary serialisation\n\n/**\n * Serialise a token to a binary blob. The wire format is:\n *\n * [4 bytes: magic \"PPT1\"]\n * [1 byte: version]\n * [4 bytes BE: issuer id byte length]\n * [N bytes: issuer id UTF-8]\n * [32 bytes: issuer public key]\n * [32 bytes: document key]\n * [4 bytes BE: document key id byte length]\n * [M bytes: document key id UTF-8]\n * [8 bytes BE: expiresAt (uint64 milliseconds)]\n * [16 bytes: nonce]\n *\n * Use {@link encodePairingToken} to round-trip through a base64 string.\n */\nexport function serialisePairingToken(token: PairingToken): Uint8Array {\n validateForSerialisation(token);\n const issuerBytes = new TextEncoder().encode(token.issuerPeerId);\n const keyIdBytes = new TextEncoder().encode(token.documentKeyId);\n\n const total =\n PAIRING_TOKEN_MAGIC.length +\n 1 + // version\n 4 + // issuer id length\n issuerBytes.length +\n SIGNING_PUBLIC_KEY_BYTES +\n ENCRYPTION_KEY_BYTES +\n 4 + // doc key id length\n keyIdBytes.length +\n 8 + // expiresAt\n PAIRING_NONCE_BYTES;\n\n const out = new Uint8Array(total);\n let offset = 0;\n\n out.set(PAIRING_TOKEN_MAGIC, offset);\n offset += PAIRING_TOKEN_MAGIC.length;\n\n out[offset] = token.version;\n offset += 1;\n\n const view = new DataView(out.buffer);\n view.setUint32(offset, issuerBytes.length, false);\n offset += 4;\n out.set(issuerBytes, offset);\n offset += issuerBytes.length;\n\n out.set(token.issuerPublicKey, offset);\n offset += SIGNING_PUBLIC_KEY_BYTES;\n\n out.set(token.documentKey, offset);\n offset += ENCRYPTION_KEY_BYTES;\n\n view.setUint32(offset, keyIdBytes.length, false);\n offset += 4;\n out.set(keyIdBytes, offset);\n offset += keyIdBytes.length;\n\n // Write expiresAt as uint64 BE. JavaScript numbers are float64 but the\n // value is an integer count of milliseconds, well within 53-bit safe\n // range for any practical timestamp.\n view.setBigUint64(offset, BigInt(token.expiresAt), false);\n offset += 8;\n\n out.set(token.nonce, offset);\n offset += PAIRING_NONCE_BYTES;\n\n return out;\n}\n\n/**\n * Inverse of {@link serialisePairingToken}. Throws {@link PairingError} on\n * malformed input.\n */\nexport function parsePairingToken(bytes: Uint8Array): PairingToken {\n let offset = 0;\n\n // Magic\n if (bytes.length < PAIRING_TOKEN_MAGIC.length) {\n throw new PairingError(`Pairing token too short: ${bytes.length} bytes.`, \"truncated\");\n }\n for (let i = 0; i < PAIRING_TOKEN_MAGIC.length; i++) {\n if (bytes[offset + i] !== PAIRING_TOKEN_MAGIC[i]) {\n throw new PairingError(\n `Pairing token magic mismatch: not a Polly pairing token.`,\n \"wrong-magic\"\n );\n }\n }\n offset += PAIRING_TOKEN_MAGIC.length;\n\n // Version\n if (bytes.length < offset + 1) {\n throw new PairingError(\"Pairing token truncated at version.\", \"truncated\");\n }\n const version = bytes[offset] as unknown as number;\n offset += 1;\n if (version !== PAIRING_TOKEN_VERSION) {\n throw new PairingError(\n `Unknown pairing token version: ${version}. This Polly build supports version ${PAIRING_TOKEN_VERSION}.`,\n \"unknown-version\"\n );\n }\n\n // Issuer id\n if (bytes.length < offset + 4) {\n throw new PairingError(\"Pairing token truncated at issuer id length.\", \"truncated\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const issuerLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + issuerLen) {\n throw new PairingError(\"Pairing token truncated at issuer id.\", \"truncated\");\n }\n const issuerPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + issuerLen));\n offset += issuerLen;\n\n // Issuer public key\n if (bytes.length < offset + SIGNING_PUBLIC_KEY_BYTES) {\n throw new PairingError(\"Pairing token truncated at public key.\", \"truncated\");\n }\n const issuerPublicKey = bytes.slice(offset, offset + SIGNING_PUBLIC_KEY_BYTES);\n offset += SIGNING_PUBLIC_KEY_BYTES;\n\n // Document key\n if (bytes.length < offset + ENCRYPTION_KEY_BYTES) {\n throw new PairingError(\"Pairing token truncated at document key.\", \"truncated\");\n }\n const documentKey = bytes.slice(offset, offset + ENCRYPTION_KEY_BYTES);\n offset += ENCRYPTION_KEY_BYTES;\n\n // Document key id\n if (bytes.length < offset + 4) {\n throw new PairingError(\"Pairing token truncated at document key id length.\", \"truncated\");\n }\n const keyIdLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + keyIdLen) {\n throw new PairingError(\"Pairing token truncated at document key id.\", \"truncated\");\n }\n const documentKeyId = new TextDecoder().decode(bytes.subarray(offset, offset + keyIdLen));\n offset += keyIdLen;\n\n // Expires at\n if (bytes.length < offset + 8) {\n throw new PairingError(\"Pairing token truncated at expiry.\", \"truncated\");\n }\n const expiresAtBig = view.getBigUint64(offset, false);\n offset += 8;\n const expiresAt = Number(expiresAtBig);\n\n // Nonce\n if (bytes.length < offset + PAIRING_NONCE_BYTES) {\n throw new PairingError(\"Pairing token truncated at nonce.\", \"truncated\");\n }\n const nonce = bytes.slice(offset, offset + PAIRING_NONCE_BYTES);\n offset += PAIRING_NONCE_BYTES;\n\n return {\n version,\n issuerPeerId,\n issuerPublicKey,\n documentKey,\n documentKeyId,\n expiresAt,\n nonce,\n };\n}\n\n/**\n * Serialise a token and base64-encode it for QR-code or copy-paste display.\n * The encoding uses the standard base64 alphabet (not URL-safe) because\n * QR codes encode bytes directly and do not care about URL safety.\n */\nexport function encodePairingToken(token: PairingToken): string {\n const bytes = serialisePairingToken(token);\n // btoa expects a binary string. Convert via String.fromCharCode per byte;\n // safe for the ~150-byte token size and avoids the spread-into-fromCharCode\n // pattern that runs into argument-count limits on large arrays.\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\n/**\n * Decode a base64-encoded pairing token produced by {@link encodePairingToken}.\n * Throws {@link PairingError} on malformed input.\n */\nexport function decodePairingToken(encoded: string): PairingToken {\n let binary: string;\n try {\n binary = atob(encoded);\n } catch {\n throw new PairingError(\"Pairing token is not valid base64.\", \"wrong-magic\");\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return parsePairingToken(bytes);\n}\n\n// helpers\n\nfunction validateForSerialisation(token: PairingToken): void {\n if (token.issuerPublicKey.length !== SIGNING_PUBLIC_KEY_BYTES) {\n throw new PairingError(\n `Issuer public key must be ${SIGNING_PUBLIC_KEY_BYTES} bytes, got ${token.issuerPublicKey.length}.`,\n \"invalid-public-key\"\n );\n }\n if (token.documentKey.length !== ENCRYPTION_KEY_BYTES) {\n throw new PairingError(\n `Document key must be ${ENCRYPTION_KEY_BYTES} bytes, got ${token.documentKey.length}.`,\n \"invalid-document-key\"\n );\n }\n if (token.nonce.length !== PAIRING_NONCE_BYTES) {\n throw new PairingError(\n `Nonce must be ${PAIRING_NONCE_BYTES} bytes, got ${token.nonce.length}.`,\n \"invalid-nonce\"\n );\n }\n}\n\nfunction randomBytes(n: number): Uint8Array {\n const out = new Uint8Array(n);\n crypto.getRandomValues(out);\n return out;\n}\n"
31
31
  ],
32
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DO,SAAS,OAAO,CACrB,SACA,SAAoB,eACE;AAAA,EACtB,OAAO,IAAI,QAAqB,CAAC,SAAS,WAAW;AAAA,IACnD,MAAM,QAAQ,KAAK,IAAI;AAAA,IACvB,MAAM,UAAU,OAAO,QAAQ,MAAM,QAAQ,OAAO;AAAA,IACpD,IAAI,UAAU;AAAA,IACd,MAAM,UAAU,MAAM,KAAK,IAAI,IAAI;AAAA,IACnC,MAAM,aAAa,CAAC,QAA8B,UAAoB;AAAA,MACpE,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,OAAO,IAAI,aAAa,QAAQ,QAAQ,MAAM,QAAQ,GAAG,KAAK,CAAC;AAAA;AAAA,IAEjE,MAAM,QAAQ,WAAW,MAAM,WAAW,SAAS,GAAG,mBAAmB;AAAA,IAEzE,QAAQ,UAAU,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,IACzD,QAAQ,YAAY,MAAM,WAAW,SAAS;AAAA,IAC9C,QAAQ,YAAY,MAAM;AAAA,MACxB,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,QAAQ,QAAQ,MAAM;AAAA;AAAA,IAExB,QAAQ,kBAAkB,CAAC,UAAU;AAAA,MACnC,MAAM,KAAM,MAAM,OAAuC;AAAA,MACzD,QAAQ,QAAQ,IAAI,KAAK;AAAA;AAAA,GAE5B;AAAA;AAOI,SAAS,UAAU,CACxB,KACA,SACA,QACsB;AAAA,EACtB,IAAI,IAAI;AAAA,IAAS,OAAO,IAAI;AAAA,EAC5B,MAAM,UAAU,QAAQ,SAAS,MAAM;AAAA,EACvC,QAAQ,MAAM,MAAM;AAAA,IAClB,IAAI,IAAI,YAAY;AAAA,MAAS,IAAI,UAAU;AAAA,GAC5C;AAAA,EACD,IAAI,UAAU;AAAA,EACd,OAAO;AAAA;AAIF,SAAS,UAAa,CAAC,SAAoC;AAAA,EAChE,OAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AAAA,IACzC,QAAQ,YAAY,MAAM,QAAQ,QAAQ,MAAM;AAAA,IAChD,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,GAC7C;AAAA;AAMI,SAAS,KAAK,CACnB,IACA,WACA,MACA,IACe;AAAA,EACf,OAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,IAC5C,MAAM,KAAK,GAAG,YAAY,WAAW,IAAI;AAAA,IACzC,MAAM,QAAQ,GAAG,YAAY,SAAS;AAAA,IACtC,GAAG,aAAa,MAAM,QAAQ;AAAA,IAC9B,GAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,IAClC,GAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,IAClC,IAAI;AAAA,MACF,GAAG,KAAK;AAAA,MACR,OAAO,KAAK;AAAA,MACZ,IAAI;AAAA,QACF,GAAG,MAAM;AAAA,QACT,MAAM;AAAA,MAGR,OAAO,GAAG;AAAA;AAAA,GAEb;AAAA;AAII,SAAS,aAAgB,CAC9B,IACA,WACA,OACe;AAAA,EACf,OAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,IAC5C,MAAM,KAAK,GAAG,YAAY,WAAW,UAAU;AAAA,IAC/C,MAAM,QAAQ,GAAG,YAAY,SAAS;AAAA,IACtC,MAAM,UAAU,MAAM,WAAW;AAAA,IACjC,QAAQ,YAAY,MAAM;AAAA,MACxB,MAAM,SAAS,QAAQ;AAAA,MACvB,IAAI,CAAC;AAAA,QAAQ,OAAO,QAAQ;AAAA,MAC5B,MAAM,OAAO,KAAK,OAAO,KAAU;AAAA,MACnC,OAAO,SAAS;AAAA;AAAA,IAElB,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,GAC7C;AAAA;AAAA,IApJU,sBAAsB,MAWtB,cA+BP,gBAA2B,CAAC,MAAM,YAAY,UAAU,KAAK,MAAM,OAAO;AAAA;AAAA,EA/BnE,eAAN,MAAM,qBAAqB,MAAM;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IAET,WAAW,CAAC,QAA8B,QAAgB,WAAmB,OAAiB;AAAA,MAC5F,MACE,4BAA4B,WAAW,gBAAgB,eACvD,UAAU,YAAY,YAAY,EAAE,MAAM,CAC5C;AAAA,MACA,KAAK,OAAO;AAAA,MACZ,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,MACd,KAAK,YAAY;AAAA;AAAA,EAErB;AAAA;;;;;;;;;;;;;;;;;;ACNA;AA+BO,SAAS,mBAAmB,GAAe;AAAA,EAChD,OAAO,KAAK,YAAY,SAAS;AAAA;AAQ5B,SAAS,OAAO,CAAC,SAAqB,KAA8B;AAAA,EACzE,IAAI,IAAI,WAAW,WAAW;AAAA,IAC5B,MAAM,IAAI,gBACR,yBAAyB,wBAAwB,IAAI,WACrD,oBACF;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,KAAK,YAAY,WAAW;AAAA,EAC1C,MAAM,aAAa,KAAK,UAAU,SAAS,OAAO,GAAG;AAAA,EACrD,MAAM,MAAM,IAAI,WAAW,cAAc,WAAW,MAAM;AAAA,EAC1D,IAAI,IAAI,OAAO,CAAC;AAAA,EAChB,IAAI,IAAI,YAAY,WAAW;AAAA,EAC/B,OAAO;AAAA;AAcF,SAAS,OAAO,CAAC,QAAqB,KAAyC;AAAA,EACpF,IAAI,IAAI,WAAW,WAAW;AAAA,IAC5B,MAAM,IAAI,gBACR,yBAAyB,wBAAwB,IAAI,WACrD,oBACF;AAAA,EACF;AAAA,EACA,IAAI,OAAO,SAAS,cAAc,WAAW;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,OAAO,SAAS,GAAG,WAAW;AAAA,EAC5C,MAAM,aAAa,OAAO,SAAS,WAAW;AAAA,EAC9C,MAAM,SAAS,KAAK,UAAU,KAAK,YAAY,OAAO,GAAG;AAAA,EACzD,OAAO,UAAU;AAAA;AAOZ,SAAS,cAAc,CAAC,QAAqB,KAA6B;AAAA,EAC/E,MAAM,SAAS,QAAQ,QAAQ,GAAG;AAAA,EAClC,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,gBACR,sFACA,gBACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAoBF,SAAS,YAAY,CAC1B,SACA,YACA,KACmB;AAAA,EACnB,OAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC9B;AAAA;AAOK,SAAS,YAAY,CAAC,UAA6B,KAA6B;AAAA,EACrF,OAAO,eAAe,SAAS,QAAQ,GAAG;AAAA;AAYrC,SAAS,uBAAuB,CAAC,UAAyC;AAAA,EAC/E,MAAM,UAAU,IAAI,YAAY,EAAE,OAAO,SAAS,UAAU;AAAA,EAC5D,MAAM,MAAM,IAAI,WAAW,IAAI,QAAQ,SAAS,SAAS,OAAO,MAAM;AAAA,EACtE,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,QAAQ,QAAQ,KAAK;AAAA,EACvC,IAAI,IAAI,SAAS,CAAC;AAAA,EAClB,IAAI,IAAI,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAAA,EAC3C,OAAO;AAAA;AAOF,SAAS,uBAAuB,CAAC,OAAsC;AAAA,EAC5E,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,MAAM,IAAI,gBACR,iCAAiC,MAAM,iBACvC,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,QAAQ,KAAK,UAAU,GAAG,KAAK;AAAA,EACrC,IAAI,MAAM,SAAS,IAAI,OAAO;AAAA,IAC5B,MAAM,IAAI,gBACR,oDAAoD,gBAAgB,MAAM,WAC1E,oBACF;AAAA,EACF;AAAA,EACA,MAAM,aAAa,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC;AAAA,EACxE,MAAM,SAAS,MAAM,MAAM,IAAI,KAAK;AAAA,EACpC,OAAO,EAAE,YAAY,OAAO;AAAA;AAAA,IA1KjB,YAAY,IAEZ,cAAc,IAEd,YAAY,IAWZ;AAAA;AAAA,oBAAN,MAAM,wBAAwB,MAAM;AAAA,IAChC;AAAA,IACT,WAAW,CAAC,SAAiB,MAA+B;AAAA,MAC1D,MAAM,OAAO;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA;AAAA,EAEhB;AAAA;;;AC3CA;AACA;AAKA,IAAM,UAAU,IAAI,IAAI,UAAU,YAAY,GAAG,EAAE;AAEnD,MAAM,eAAe,OAAO;;;ACP5B;AAAA;AAWO,MAAM,gBAAqC;AAAA,EAC/B,QAAQ,IAAI;AAAA,EACZ,SAAS,IAAI;AAAA,EACb,OAAO,IAAI;AAAA,OAEtB,IAAG,CAAC,MAA+C;AAAA,IACvD,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,aAAa,KAAK,IAAI;AAAA,IAC5B,OAAO,MAAM;AAAA;AAAA,OAGT,IAAG,CAAC,MAAc,OAAkC;AAAA,IACxD,KAAK,MAAM,IAAI,MAAM,EAAE,OAAO,YAAY,KAAK,IAAI,EAAE,CAAC;AAAA;AAAA,OAGlD,IAAG,CAAC,MAAgC;AAAA,IACxC,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA;AAAA,OAGtB,OAAM,CAAC,MAA6B;AAAA,IACxC,KAAK,MAAM,OAAO,IAAI;AAAA,IACtB,KAAK,OAAO,OAAO,IAAI;AAAA,IACvB,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,IAC9B,IAAI,KAAK;AAAA,MACP,IAAI,gBAAgB,GAAG;AAAA,MACvB,KAAK,KAAK,OAAO,IAAI;AAAA,IACvB;AAAA;AAAA,OAGI,IAAG,CAAC,MAA6B;AAAA,IACrC,KAAK,OAAO,IAAI,IAAI;AAAA;AAAA,OAGhB,MAAK,CAAC,MAA6B;AAAA,IACvC,KAAK,OAAO,OAAO,IAAI;AAAA;AAAA,OAGnB,KAAI,GAAoB;AAAA,IAC5B,IAAI,QAAQ;AAAA,IACZ,WAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AAAA,MACvC,SAAS,MAAM,MAAM;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,MAAK,CAAC,UAAmC;AAAA,IAC7C,IAAI,cAAc,MAAM,KAAK,KAAK;AAAA,IAClC,IAAI,eAAe;AAAA,MAAU,OAAO;AAAA,IACpC,MAAM,QAAQ;AAAA,IAEd,MAAM,aAAwE,CAAC;AAAA,IAC/E,YAAY,MAAM,UAAU,KAAK,OAAO;AAAA,MACtC,IAAI,CAAC,KAAK,OAAO,IAAI,IAAI,GAAG;AAAA,QAC1B,WAAW,KAAK,EAAE,MAAM,YAAY,MAAM,YAAY,MAAM,MAAM,MAAM,WAAW,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,IACA,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,IAErD,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,eAAe;AAAA,QAAU;AAAA,MAC7B,MAAM,KAAK,OAAO,EAAE,IAAI;AAAA,MACxB,eAAe,EAAE;AAAA,IACnB;AAAA,IACA,OAAO,QAAQ;AAAA;AAAA,OAKX,IAAG,CAAC,MAA2C;AAAA,IACnD,MAAM,SAAS,KAAK,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,SAAS,IAAI,YAAY,MAAM,MAAM,UAAU;AAAA,IACrD,IAAI,WAAW,MAAM,EAAE,IAAI,MAAM,KAAK;AAAA,IACtC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,IACxD,KAAK,KAAK,IAAI,MAAM,SAAS;AAAA,IAC7B,OAAO;AAAA;AAAA,EAGT,OAAO,GAAS;AAAA,IACd,WAAW,aAAa,KAAK,KAAK,OAAO,GAAG;AAAA,MAC1C,IAAI,gBAAgB,SAAS;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK,MAAM;AAAA,IAChB,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,OAAO,MAAM;AAAA;AAEtB;AAAA;AAaO,MAAM,mBAAwC;AAAA,SAC3B,UAAU;AAAA,SACV,aAAa;AAAA,SACb,aAAa;AAAA,EAEpB,QAAkD,EAAE,SAAS,KAAK;AAAA,EAClE,OAAO,IAAI;AAAA,EAEpB,MAAM,GAAyB;AAAA,IACrC,OAAO,WAAW,KAAK,OAAO;AAAA,MAC5B,MAAM,mBAAmB;AAAA,MACzB,SAAS,mBAAmB;AAAA,MAC5B,SAAS,CAAC,OAAO;AAAA,QACf,IAAI,CAAC,GAAG,iBAAiB,SAAS,mBAAmB,UAAU,GAAG;AAAA,UAChE,GAAG,kBAAkB,mBAAmB,UAAU;AAAA,QACpD;AAAA;AAAA,IAEJ,CAAC;AAAA;AAAA,OAGW,UAAS,CAAC,MAA8C;AAAA,IACpE,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,IACnE,OAAO,WAAW,GAAG,YAAY,mBAAmB,UAAU,EAAE,IAAI,IAAI,CAAC;AAAA;AAAA,OAK7D,UAAS,CAAC,MAAc,QAAkC;AAAA,IACtE,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,MAAM,IAAI,mBAAmB,YAAY,aAAa,CAAC,UAAU;AAAA,MACrE,MAAM,IAAI,QAAQ,IAAI;AAAA,KACvB;AAAA;AAAA,OAGG,IAAG,CAAC,MAA+C;AAAA,IACvD,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IAGR,KAAK,UAAU,MAAM,KAAK,QAAQ,YAAY,KAAK,IAAI,EAAE,CAAC;AAAA,IAC/D,OAAO,OAAO;AAAA;AAAA,OAGV,IAAG,CAAC,MAAc,OAAkC;AAAA,IACxD,MAAM,WAAW,MAAM,KAAK,UAAU,IAAI;AAAA,IAC1C,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,YAAY,KAAK,IAAI;AAAA,MACrB,QAAQ,UAAU,UAAU;AAAA,IAC9B,CAAC;AAAA;AAAA,OAGG,IAAG,CAAC,MAAgC;AAAA,IACxC,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,IACnE,MAAM,QAAQ,MAAM,WAAW,GAAG,YAAY,mBAAmB,UAAU,EAAE,MAAM,IAAI,CAAC;AAAA,IACxF,OAAO,QAAQ;AAAA;AAAA,OAGX,OAAM,CAAC,MAA6B;AAAA,IACxC,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,IAC9B,IAAI,KAAK;AAAA,MACP,IAAI,gBAAgB,GAAG;AAAA,MACvB,KAAK,KAAK,OAAO,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,MAAM,IAAI,mBAAmB,YAAY,aAAa,CAAC,UAAU;AAAA,MACrE,MAAM,OAAO,IAAI;AAAA,KAClB;AAAA;AAAA,OAGG,IAAG,CAAC,MAA6B;AAAA,IACrC,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,QAAQ,KAAK,CAAC;AAAA;AAAA,OAGlD,MAAK,CAAC,MAA6B;AAAA,IACvC,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,QAAQ,MAAM,CAAC;AAAA;AAAA,OAGnD,KAAI,GAAoB;AAAA,IAC5B,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,IAAI,QAAQ;AAAA,IACZ,MAAM,cAAyB,IAAI,mBAAmB,YAAY,CAAC,MAAM,UAAU;AAAA,MACjF,SAAS,MAAM;AAAA,KAChB;AAAA,IACD,OAAO;AAAA;AAAA,OAGH,MAAK,CAAC,UAAmC;AAAA,IAC7C,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,aAAwE,CAAC;AAAA,IAC/E,IAAI,YAAY;AAAA,IAEhB,MAAM,cAAyB,IAAI,mBAAmB,YAAY,CAAC,KAAK,UAAU;AAAA,MAChF,aAAa,MAAM;AAAA,MACnB,IAAI,CAAC,MAAM,QAAQ;AAAA,QACjB,WAAW,KAAK;AAAA,UACd,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAAA,KACD;AAAA,IAED,IAAI,aAAa;AAAA,MAAU,OAAO;AAAA,IAClC,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,IAErD,IAAI,QAAQ;AAAA,IACZ,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,aAAa;AAAA,QAAU;AAAA,MAC3B,MAAM,KAAK,OAAO,EAAE,IAAI;AAAA,MACxB,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,IAAG,CAAC,MAA2C;AAAA,IACnD,MAAM,SAAS,KAAK,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,MAAM,QAAQ,MAAM,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,IAC/C,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AAAA,IAChC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,IACxD,KAAK,KAAK,IAAI,MAAM,SAAS;AAAA,IAC7B,OAAO;AAAA;AAAA,EAGT,OAAO,GAAS;AAAA,IACd,WAAW,aAAa,KAAK,KAAK,OAAO,GAAG;AAAA,MAC1C,IAAI,gBAAgB,SAAS;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK,MAAM;AAAA;AAEpB;;ACzNO,SAAS,SAAS,CAAC,OAAkC;AAAA,EAC1D,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,IAAM,OAAO;AAAA,EACxD,MAAM,IAAI;AAAA,EACV,OACE,OAAO,EAAE,YAAY,YACrB,iBAAiB,KAAK,EAAE,OAAO,KAC/B,OAAO,EAAE,YAAY,YACrB,OAAO,UAAU,EAAE,OAAO,KAC1B,EAAE,WAAW,KACb,OAAO,EAAE,gBAAgB,YACzB,OAAO,EAAE,gBAAgB;AAAA;AAO7B,eAAsB,eAAe,CAAC,OAAoC;AAAA,EAIxE,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,EAC/C,MAAM,OAAO,IAAI,WAAW,MAAM;AAAA,EAClC,KAAK,IAAI,KAAK;AAAA,EACd,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,MAAM;AAAA,EAC3D,MAAM,OAAO,IAAI,WAAW,MAAM;AAAA,EAClC,IAAI,MAAM;AAAA,EACV,WAAW,QAAQ,MAAM;AAAA,IACvB,OAAO,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC1C;AAAA,EACA,OAAO;AAAA;AAiBT,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,GACsC;AAAA,EACtC,MAAM,OAAO,MAAM,gBAAgB,KAAK;AAAA,EACxC,OAAO;AAAA,IACL;AAAA,IACA,MAAM,MAAM;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAAA;;AC7FK,IAAM,kBAAkB;AAIxB,IAAM,yBAAyB,MAAM;AA4BrC,SAAS,SAAS,CAAC,OAAmB,YAAoB,iBAA+B;AAAA,EAC9F,MAAM,SAAuB,CAAC;AAAA,EAC9B,SAAS,SAAS,EAAG,SAAS,MAAM,QAAQ,UAAU,WAAW;AAAA,IAC/D,OAAO,KAAK,MAAM,SAAS,QAAQ,KAAK,IAAI,SAAS,WAAW,MAAM,MAAM,CAAC,CAAC;AAAA,EAChF;AAAA,EAGA,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA;AAKF,SAAS,gBAAgB,CAAC,QAAiC,OAA2B;AAAA,EAC3F,IAAI,aAAa;AAAA,EACjB,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,mCAAmC,QAAQ,OAAO;AAAA,IACpE;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AAAA,EACA,MAAM,MAAM,IAAI,WAAW,UAAU;AAAA,EACrC,IAAI,SAAS;AAAA,EACb,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,IAAI,OAAO,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,EAClB;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,mBAAmB,CAAC,QAAiC,OAAyB;AAAA,EAC5F,MAAM,UAAoB,CAAC;AAAA,EAC3B,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG;AAAA,MAClB,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,oBAAoB,CAClC,QACA,OAAmB,IAAI,WAAW,CAAC,GACV;AAAA,EACzB,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,MAAM,CAAC;AAAA,EACnE,MAAM,OAAO,IAAI,YAAY,SAAS,KAAK;AAAA,EAC3C,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,EACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,EACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,EAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,MAAM,IAAI,YAAY,MAAM;AAAA,EACpC,OAAO;AAAA;AAyBF,SAAS,iBAAiB,CAAC,OAA4B;AAAA,EAC5D,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAC7B,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI;AAAA,IAAW,OAAO;AAAA,EAGzC,MAAM,cAAc,MAAM,SAAS,GAAG,IAAI,SAAS;AAAA,EAEnD,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,eAAe;AAAA,EACvD,OAAO,aAAa,aAAa,MAAM,MAAM;AAAA;AAI/C,SAAS,YAAY,CAAC,UAAsB,QAA4B;AAAA,EACtE,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAChC;AAAA,IAAO,SAAS,IAAI,EAAG,KAAK,SAAS,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChE,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACtC,IAAI,SAAS,IAAI,OAAO,OAAO;AAAA,UAAI;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACA,OAAO;AAAA;;;ACrHT,IAAM,wBAAwB,MAAM,OAAO;AAC3C,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAsBrB,SAAS,eAAe,CAAC,SAA4B,SAAuC;AAAA,EACjG,MAAM,cAAc,SAAS,eAAe;AAAA,EAC5C,MAAM,aAAa,SAAS,SAAS;AAAA,EACrC,MAAM,QAAmB,SAAS,SAAS,IAAI;AAAA,EAI/C,MAAM,aAAa,IAAI;AAAA,EAEvB,MAAM,YAAY,IAAI;AAAA,EAEtB,MAAM,YAAY,IAAI;AAAA,EAEtB,MAAM,cAAc,IAAI;AAAA,EAExB,MAAM,WAAW,IAAI;AAAA,EACrB,IAAI,WAAW;AAAA,EAGf,QAAQ,gBAAgB,CAAC,QAAQ,QAAQ,SAAS;AAAA,IAChD,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,OAAO,OAAO;AAAA,IACpB,QAAQ;AAAA,WACD;AAAA,QACE,YAAY,QAAQ,QAAsC,IAAI;AAAA,QACnE;AAAA,WACG;AAAA,QACE,cAAc,QAAQ,MAAsC;AAAA,QACjE;AAAA,WACG;AAAA,QACH,WAAW,QAAQ,MAAmC;AAAA,QACtD;AAAA;AAAA;AAAA,EAKN,MAAM,uBAAuB,CAAC,UAA+B;AAAA,IAC3D,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,YAAY,MAAM;AAAA,IACxB,WAAW,QAAQ,aAAa;AAAA,MAC9B,MAAM,MAAM,qBAAqB,EAAE,MAAM,aAAa,KAAK,CAAiC;AAAA,MAC5F,QAAQ,gBAAgB,WAAW,GAAG;AAAA,IACxC;AAAA;AAAA,EAEF,QAAQ,GAAG,kBAAkB,oBAAoB;AAAA,EAIjD,eAAe,YAAY,CAAC,WAAuB,KAAsC;AAAA,IACvF,QAAQ,sBAAY;AAAA,IACpB,OAAO,SAAQ,WAAW,GAAG;AAAA;AAAA,EAG/B,eAAe,YAAY,CACzB,QACA,KACiC;AAAA,IACjC,QAAQ,sBAAY;AAAA,IACpB,OAAO,SAAQ,QAAQ,GAAG;AAAA;AAAA,EAK5B,eAAe,WAAW,CACxB,QACA,QACA,MACe;AAAA,IACf,MAAM,WAAW,UAAU,IAAI,OAAO,IAAI;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,SAAS,QAAQ,OAAO;AAAA,IAGxB,IAAI,CAAC,SAAS,eAAe,SAAS,MAAM,GAAG;AAAA,MAC7C,SAAS,eAAe,KAAK,MAAM;AAAA,IACrC;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,SAAS,KAAK;AAAA,MAChB,MAAM,YAAY,MAAM,aAAa,MAAM,SAAS,GAAG;AAAA,MACvD,IAAI,CAAC,WAAW;AAAA,QAEd;AAAA,MACF;AAAA,MACA,aAAa;AAAA,IACf,EAAO;AAAA,MACL,aAAa,KAAK,MAAM;AAAA;AAAA,IAG1B,SAAS,OAAO,IAAI,OAAO,OAAO,UAAU;AAAA,IAE5C,oBAAoB,QAAQ;AAAA,IAC5B,oBAAoB,QAAQ;AAAA,IAE5B,IAAI,SAAS,OAAO,QAAQ,OAAO,OAAO;AAAA,MACxC,eAAe,OAAO,MAAM,QAAQ;AAAA,IACtC,EAAO;AAAA,MACL,kBAAkB,OAAO,MAAM,QAAQ;AAAA;AAAA;AAAA,EAI3C,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,CAAC,SAAS,cAAc,SAAS,SAAS;AAAA,MAAG;AAAA,IACjD,IAAI,SAAS;AAAA,IACb,WAAW,SAAS,SAAS,OAAO,OAAO,GAAG;AAAA,MAC5C,UAAU,MAAM;AAAA,IAClB;AAAA,IACA,SAAS,WAAW,EAAE,QAAQ,OAAO,WAAW,OAAO,cAAc,CAAC;AAAA;AAAA,EAGxE,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,SAAS,aAAa;AAAA,MACxB,aAAa,SAAS,WAAW;AAAA,MACjC,SAAS,cAAc;AAAA,IACzB;AAAA;AAAA,EAGF,SAAS,cAAc,CAAC,MAAc,UAA+B;AAAA,IACnE,oBAAoB,QAAQ;AAAA,IAC5B,IAAI;AAAA,MACF,MAAM,YAAY,iBAAiB,SAAS,QAAQ,SAAS,KAAK;AAAA,MAClE,UAAU,OAAO,IAAI;AAAA,MACrB,SAAS,QAAQ,SAAS;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ,UAAU,OAAO,IAAI;AAAA,MACrB,SAAS,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA;AAAA;AAAA,EAIvE,eAAe,aAAa,CAAC,QAAgB,QAA0C;AAAA,IACrF,MAAM,YAAY,MAAM,MAAM,IAAI,OAAO,IAAI;AAAA,IAC7C,IAAI,CAAC;AAAA,MAAW;AAAA,IAEhB,MAAM,kBAAkB,UAAU,SAAS;AAAA,IAC3C,MAAM,YAAY,OAAO,WAAW,gBAAgB,IAAI,CAAC,GAAG,MAAM,CAAC;AAAA,IACnE,MAAM,WAAW,WAAW,IAAI,OAAO,IAAI;AAAA,IAE3C,WAAW,SAAS,WAAW;AAAA,MAC7B,MAAM,iBAAiB,QAAQ,OAAO,MAAM,iBAAiB,OAAO,QAAQ;AAAA,IAC9E;AAAA;AAAA,EAGF,eAAe,gBAAgB,CAC7B,QACA,MACA,iBACA,OACA,UACe;AAAA,IACf,IAAI,QAAQ,KAAK,SAAS,gBAAgB;AAAA,MAAQ;AAAA,IAClD,MAAM,aAAa,gBAAgB;AAAA,IACnC,IAAI,CAAC;AAAA,MAAY;AAAA,IAEjB,MAAM,UAAU,WAAW,MAAM,aAAa,YAAY,QAAQ,IAAI;AAAA,IACtE,MAAM,cAA+B;AAAA,MACnC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO,gBAAgB;AAAA,IACzB;AAAA,IACA,MAAM,MAAM,qBAAqB,aAA6C,OAAO;AAAA,IAErF,IAAI,CAAC,QAAQ,gBAAgB,QAAQ,GAAG,GAAG;AAAA,MACzC,MAAM,mBAAmB;AAAA,MACzB,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IACrC;AAAA;AAAA,EAGF,SAAS,UAAU,CAAC,QAAgB,QAA8B;AAAA,IAChE,IAAI,QAAQ,UAAU,IAAI,OAAO,IAAI;AAAA,IACrC,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI,OAAO,MAAM,KAAK;AAAA,IAClC;AAAA,IACA,MAAM,IAAI,MAAM;AAAA;AAAA,EAKlB,SAAS,YAAY,CAAC,MAAoB;AAAA,IACxC,MAAM,MAAM,qBAAqB,EAAE,MAAM,aAAa,KAAK,CAAiC;AAAA,IAC5F,WAAW,UAAU,QAAQ,kBAAkB;AAAA,MAC7C,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IACrC;AAAA;AAAA,EAGF,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,SAAS;AAAA,MAAW,aAAa,SAAS,SAAS;AAAA,IACvD,IAAI,SAAS;AAAA,MAAa,aAAa,SAAS,WAAW;AAAA;AAAA,EAG7D,SAAS,iBAAiB,CAAC,MAAc,UAA+B;AAAA,IACtE,SAAS,cAAc,WAAW,MAAM,cAAc,MAAM,QAAQ,GAAG,mBAAmB;AAAA;AAAA,EAG5F,SAAS,aAAa,CAAC,MAAc,UAA+B;AAAA,IAClE,IAAI,CAAC,UAAU,IAAI,IAAI;AAAA,MAAG;AAAA,IAC1B,MAAM,UAAU,oBAAoB,SAAS,QAAQ,SAAS,KAAK;AAAA,IACnE,IAAI,QAAQ,WAAW;AAAA,MAAG;AAAA,IAI1B,MAAM,QAAQ,UAAU,IAAI,IAAI;AAAA,IAChC,MAAM,OAAO,SAAS,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,gBAAgB;AAAA,IAC9F,IAAI,KAAK,WAAW;AAAA,MAAG;AAAA,IACvB,MAAM,SAAS,KAAK,SAAS,oBAAoB,KAAK;AAAA,IACtD,SAAS;AAAA,IACT,IAAI,CAAC;AAAA,MAAQ;AAAA,IAEb,MAAM,YAA+B,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IAC3E,MAAM,MAAM,qBAAqB,SAAyC;AAAA,IAC1E,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IAGnC,kBAAkB,MAAM,QAAQ;AAAA;AAAA,EAGlC,SAAS,kBAAkB,GAAkB;AAAA,IAC3C,OAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA;AAAA,EAKzD,MAAM,QAAmB;AAAA,SACjB,IAAG,CAAC,KAAK,OAAO,UAAyB;AAAA,MAC7C,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,uBAAuB;AAAA,MACrD,UAAS,QAAQ,eAAe;AAAA,MAEhC,IAAI,MAAM,SAAS,aAAa;AAAA,QAC9B,MAAM,IAAI,MAAM,8BAA8B,MAAM,YAAY,cAAc;AAAA,MAChF;AAAA,MAGA,MAAM,OAAO,MAAM,gBAAgB,KAAK;AAAA,MACxC,IAAI,SAAS,IAAI,MAAM;AAAA,QACrB,MAAM,IAAI,MAAM,2BAA2B,IAAI,aAAa,MAAM;AAAA,MACpE;AAAA,MAEA,UAAS,QAAQ,eAAe;AAAA,MAKhC,MAAM,MAAM,UAAS,OAAO;AAAA,MAC5B,IAAI,KAAK;AAAA,QACP,WAAW,IAAI,IAAI,MAAM,GAAG;AAAA,MAC9B;AAAA,MAEA,UAAS,aAAa,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,QAAQ,OAAO,YAAY,CAAC;AAAA,MAIvF,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK;AAAA,MAC/B,YAAY,IAAI,IAAI,IAAI;AAAA,MAExB,aAAa,IAAI,IAAI;AAAA;AAAA,SAGjB,IAAG,CAAC,MAAM,UAA2C;AAAA,MACzD,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,uBAAuB;AAAA,MACrD,UAAS,QAAQ,eAAe;AAAA,MAGhC,MAAM,SAAS,MAAM,MAAM,IAAI,IAAI;AAAA,MACnC,IAAI;AAAA,QAAQ,OAAO;AAAA,MAInB,MAAM,MAAM,UAAS,OAAO;AAAA,MAG5B,MAAM,QAAQ,UAAU,IAAI,IAAI;AAAA,MAChC,MAAM,aACJ,SAAS,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,gBAAgB;AAAA,MACnF,MAAM,aAAa,WAAW;AAAA,MAC9B,IAAI,CAAC;AAAA,QAAY;AAAA,MAEjB,MAAM,gBAAmC,EAAE,MAAM,gBAAgB,KAAK;AAAA,MACtE,MAAM,MAAM,qBAAqB,aAA6C;AAAA,MAC9E,QAAQ,gBAAgB,YAAY,GAAG;AAAA,MAGvC,MAAM,YAAY,MAAM,IAAI,QAAoB,CAAC,SAAS,WAAW;AAAA,QACnE,MAAM,WAA0B;AAAA,UAC9B,OAAO;AAAA,UACP,QAAQ,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,UACA,YAAY,UAAS;AAAA,UACrB;AAAA,UACA,gBAAgB,CAAC,UAAU;AAAA,UAC3B,mBAAmB;AAAA,QACrB;AAAA,QACA,UAAU,IAAI,MAAM,QAAQ;AAAA,QAE5B,UAAS,QAAQ,iBACf,SACA,MAAM;AAAA,UACJ,IAAI,UAAU,IAAI,IAAI,GAAG;AAAA,YACvB,oBAAoB,QAAQ;AAAA,YAC5B,UAAU,OAAO,IAAI;AAAA,YACrB,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,UAC3C;AAAA,WAEF,EAAE,MAAM,KAAK,CACf;AAAA,QAEA,SAAS,YAAY,WAAW,MAAM;AAAA,UACpC,IAAI,UAAU,IAAI,IAAI,GAAG;AAAA,YACvB,oBAAoB,QAAQ;AAAA,YAC5B,UAAU,OAAO,IAAI;AAAA,YACrB,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAAA,UAC7C;AAAA,WACC,mBAAmB;AAAA,OACvB;AAAA,MAGD,MAAM,aAAa,MAAM,gBAAgB,SAAS;AAAA,MAClD,IAAI,eAAe,MAAM;AAAA,QACvB,MAAM,IAAI,MAAM,+CAA+C,aAAa,YAAY;AAAA,MAC1F;AAAA,MAIA,MAAM,MAAM,IAAI,MAAM,SAAS;AAAA,MAC/B,IAAI;AAAA,QAAK,WAAW,IAAI,MAAM,GAAG;AAAA,MACjC,YAAY,IAAI,IAAI;AAAA,MAEpB,OAAO;AAAA;AAAA,SAGH,IAAG,CAAC,MAAmC;AAAA,MAC3C,IAAI;AAAA,QAAU;AAAA,MACd,MAAM,SAAS,SAAS,IAAI,IAAI;AAAA,MAChC,IAAI;AAAA,QAAQ,OAAO;AAAA,MACnB,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAI;AAAA,MAClC,IAAI,CAAC;AAAA,QAAO;AAAA,MACZ,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,MAC/C,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AAAA,MAChC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,MACxD,SAAS,IAAI,MAAM,SAAS;AAAA,MAC5B,OAAO;AAAA;AAAA,SAGH,IAAG,CAAC,MAAqB;AAAA,MAC7B,MAAM,MAAM,IAAI,IAAI;AAAA;AAAA,SAGhB,MAAK,CAAC,MAAqB;AAAA,MAC/B,MAAM,MAAM,MAAM,IAAI;AAAA;AAAA,SAGlB,KAAI,GAAoB;AAAA,MAC5B,OAAO,MAAM,KAAK;AAAA;AAAA,SAGd,MAAK,CAAC,UAA2B;AAAA,MACrC,OAAO,MAAM,MAAM,QAAQ;AAAA;AAAA,IAG7B,OAAO,GAAS;AAAA,MACd,WAAW;AAAA,MACX,QAAQ,gBAAgB;AAAA,MACxB,QAAQ,IAAI,kBAAkB,oBAAoB;AAAA,MAClD,YAAY,MAAM,aAAa,WAAW;AAAA,QACxC,oBAAoB,QAAQ;AAAA,QAC5B,SAAS,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,QAC/C,UAAU,OAAO,IAAI;AAAA,MACvB;AAAA,MACA,WAAW,aAAa,SAAS,OAAO,GAAG;AAAA,QACzC,IAAI,gBAAgB,SAAS;AAAA,MAC/B;AAAA,MACA,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,EAElB;AAAA,EAEA,OAAO;AAAA;;;AC5ZT;;;ACUO,SAAS,oBAAoB,GAAmB;AAAA,EACrD,IAAI,SAA6B;AAAA,EACjC,OAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,MAAM,OAAO,YAAY;AAAA,MACvB,SAAS;AAAA;AAAA,EAEb;AAAA;AAqBK,SAAS,gBAAgB,CAAC,SAA8B;AAAA,EAC7D,MAAM,UAA6B;AAAA,IACjC,SAAS;AAAA,IACT,UAAU;AAAA,MACR,WAAW,cAAc,QAAQ,SAAS,SAAS;AAAA,MACnD,WAAW,cAAc,QAAQ,SAAS,SAAS;AAAA,IACrD;AAAA,IACA,YAAY,kBAAkB,QAAQ,UAAU;AAAA,IAChD,cAAc,kBAAkB,QAAQ,YAAY;AAAA,IACpD,cAAc,CAAC,GAAG,QAAQ,YAAY;AAAA,EACxC;AAAA,EACA,IAAI,QAAQ,uBAAuB,QAAQ,oBAAoB,OAAO,GAAG;AAAA,IACvE,QAAQ,sBAAsB,CAAC,GAAG,QAAQ,mBAAmB;AAAA,EAC/D;AAAA,EACA,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA;AASjC,SAAS,kBAAkB,CAAC,MAA2B;AAAA,EAC5D,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,KAAK,MAAM,IAAI;AAAA,IACrB,OAAO,KAAK;AAAA,IACZ,MAAM,IAAI,MAAM,sDAAuD,IAAc,SAAS;AAAA;AAAA,EAEhG,IAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AAAA,IACnC,MAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EACA,MAAM,IAAI;AAAA,EACV,IAAI,EAAE,YAAY,GAAG;AAAA,IACnB,MAAM,IAAI,MAAM,gDAAgD,OAAO,EAAE,OAAO,GAAG;AAAA,EACrF;AAAA,EACA,IAAI,CAAC,EAAE,YAAY,OAAO,EAAE,aAAa,UAAU;AAAA,IACjD,MAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAAA,EACA,MAAM,WAA2B;AAAA,IAC/B,WAAW,cAAc,EAAE,SAAS,SAAS;AAAA,IAC7C,WAAW,cAAc,EAAE,SAAS,SAAS;AAAA,EAC/C;AAAA,EACA,MAAM,UAAuB;AAAA,IAC3B;AAAA,IACA,YAAY,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAAA,IAChD,cAAc,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;AAAA,IACpD,cAAc,IAAI,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAAA,EAC5C;AAAA,EACA,IAAI,EAAE,uBAAuB,EAAE,oBAAoB,SAAS,GAAG;AAAA,IAC7D,QAAQ,sBAAsB,IAAI,IAAI,EAAE,mBAAmB;AAAA,EAC7D;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,KAAsD;AAAA,EAC/E,MAAM,MAA8B,CAAC;AAAA,EACrC,YAAY,KAAK,UAAU,KAAK;AAAA,IAC9B,IAAI,OAAO,cAAc,KAAK;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,QAAyD;AAAA,EAClF,MAAM,MAAM,IAAI;AAAA,EAChB,YAAY,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,IACjD,IAAI,IAAI,KAAK,cAAc,KAAK,CAAC;AAAA,EACnC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,OAA2B;AAAA,EAEhD,IAAI,SAAS;AAAA,EACb,WAAW,QAAQ,OAAO;AAAA,IACxB,UAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AAAA,EACA,OAAO,KAAK,MAAM;AAAA;AAGpB,SAAS,aAAa,CAAC,KAAyB;AAAA,EAC9C,MAAM,SAAS,KAAK,GAAG;AAAA,EACvB,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,IACtC,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;;AC1IT;;;ACsEA,IAAM,YAAY,IAAI;AAMf,SAAS,kBAAkB,CAAC,YAAkC;AAAA,EACnE,MAAM,QAA6B,KAAK,YAAY,WAAW,KAAK,IAAI,EAAE;AAAA,EAC1E,WAAW,YAAY,WAAW;AAAA,IAChC,IAAI;AAAA,MACF,SAAS,KAAK;AAAA,MACd,MAAM;AAAA,EAKV;AAAA;AAQK,SAAS,0BAA0B,CAAC,UAA8C;AAAA,EACvF,UAAU,IAAI,QAAQ;AAAA,EACtB,OAAO,MAAM;AAAA,IACX,UAAU,OAAO,QAAQ;AAAA;AAAA;AAUtB,SAAS,qBAAqB,GAGnC;AAAA,EACA,MAAM,WAAkC,CAAC;AAAA,EACzC,MAAM,OAAO,2BAA2B,CAAC,UAAU;AAAA,IACjD,SAAS,KAAK,KAAK;AAAA,GACpB;AAAA,EACD,OAAO,EAAE,QAAQ,UAAU,KAAK;AAAA;;;ACzFlC;AANA;AAAA;AAAA;;;ACTA;AAGO,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB;AAEzB,IAAM,kBAAkB;AAAA;AA4BxB,MAAM,qBAAqB,MAAM;AAAA,EAC7B;AAAA,EAMT,WAAW,CAAC,SAAiB,MAA4B;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAKO,SAAS,sBAAsB,GAAmB;AAAA,EACvD,MAAM,OAAO,MAAK,KAAK,QAAQ;AAAA,EAC/B,OAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AAAA;AAOK,SAAS,wBAAwB,CAAC,WAAuC;AAAA,EAC9E,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,MAAK,KAAK,QAAQ,cAAc,SAAS;AAAA,EACtD,OAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AAAA;AAOK,SAAS,IAAI,CAAC,SAAqB,WAAmC;AAAA,EAC3E,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,OAAO,MAAK,KAAK,SAAS,SAAS,SAAS;AAAA;AASvC,SAAS,MAAM,CAAC,SAAqB,WAAuB,WAAgC;AAAA,EACjG,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,IAAI,UAAU,WAAW,iBAAiB;AAAA,IACxC,MAAM,IAAI,aACR,6BAA6B,8BAA8B,UAAU,WACrE,0BACF;AAAA,EACF;AAAA,EACA,OAAO,MAAK,KAAK,SAAS,OAAO,SAAS,WAAW,SAAS;AAAA;AAQzD,SAAS,YAAY,CAC1B,SACA,UACA,WACgB;AAAA,EAChB,MAAM,YAAY,KAAK,SAAS,SAAS;AAAA,EACzC,OAAO,EAAE,UAAU,SAAS,UAAU;AAAA;AASjC,SAAS,aAAY,CAAC,UAA0B,WAAmC;AAAA,EACxF,MAAM,KAAK,OAAO,SAAS,SAAS,SAAS,WAAW,SAAS;AAAA,EACjE,IAAI,CAAC,IAAI;AAAA,IACP,MAAM,IAAI,aACR,mDAAmD,SAAS,aAC5D,oBACF;AAAA,EACF;AAAA,EACA,OAAO,SAAS;AAAA;AAeX,SAAS,oBAAoB,CAAC,UAAsC;AAAA,EACzE,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,SAAS,QAAQ;AAAA,EAC9D,MAAM,QAAQ,IAAI,YAAY,SAAS,kBAAkB,SAAS,QAAQ;AAAA,EAC1E,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,SAAS,WAAW,IAAI,YAAY,MAAM;AAAA,EAClD,IAAI,IAAI,SAAS,SAAS,IAAI,YAAY,SAAS,eAAe;AAAA,EAClE,OAAO;AAAA;AAOF,SAAS,oBAAoB,CAAC,OAAmC;AAAA,EACtE,IAAI,MAAM,SAAS,IAAI,iBAAiB;AAAA,IACtC,MAAM,IAAI,aACR,uBAAuB,MAAM,+BAA+B,IAAI,oBAChE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI,YAAY,iBAAiB;AAAA,IAClD,MAAM,IAAI,aACR,8CAA8C,oBAAoB,MAAM,WACxE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;AAAA,EAC1E,MAAM,YAAY,MAAM,MAAM,IAAI,WAAW,IAAI,YAAY,eAAe;AAAA,EAC5E,MAAM,UAAU,MAAM,MAAM,IAAI,YAAY,eAAe;AAAA,EAC3D,OAAO,EAAE,UAAU,SAAS,UAAU;AAAA;;;AD9JjC,IAAM,sBAAsB;AAwB5B,IAAM,oBAAoB;AAAA,EAE/B,MAAM;AAAA,EAIN,YAAY;AAAA,EAIZ,mBAAmB;AACrB;AAAA;AA6FO,MAAM,2BAA2B,eAAe;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MASL,OAAO,GAAgB;AAAA,IACzB,OAAO,KAAK,cAAc;AAAA;AAAA,EAG5B,WAAW,CAAC,SAAoC;AAAA,IAC9C,MAAM;AAAA,IACN,KAAK,OAAO,QAAQ;AAAA,IACpB,KAAK,gBAAgB,QAAQ;AAAA,IAC7B,KAAK,oBAAoB,QAAQ,qBAAqB;AAAA,IACtD,KAAK,mBAAmB,QAAQ;AAAA,IAGhC,KAAK,KAAK,GAAG,SAAS,MAAM,KAAK,KAAK,OAAO,CAAC;AAAA,IAC9C,KAAK,KAAK,GAAG,kBAAkB,CAAC,YAAY,KAAK,KAAK,kBAAkB,OAAO,CAAC;AAAA,IAChF,KAAK,KAAK,GAAG,qBAAqB,CAAC,YAAY,KAAK,KAAK,qBAAqB,OAAO,CAAC;AAAA,IAItF,KAAK,KAAK,GAAG,WAAW,CAAC,eAAe;AAAA,MACtC,MAAM,YAAY,KAAK,UAAU,UAAU;AAAA,MAC3C,IAAI,WAAW;AAAA,QACb,KAAK,KAAK,WAAW,SAAS;AAAA,MAChC;AAAA,KAMD;AAAA;AAAA,EAGH,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK,KAAK,QAAQ;AAAA;AAAA,EAG3B,SAAS,GAAkB;AAAA,IACzB,OAAO,KAAK,KAAK,UAAU;AAAA;AAAA,EAG7B,OAAO,CAAC,QAAgB,cAAmC;AAAA,IACzD,KAAK,SAAS;AAAA,IACd,IAAI,iBAAiB,WAAW;AAAA,MAC9B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,KAAK,KAAK,QAAQ,QAAQ,YAAY;AAAA;AAAA,EAGxC,UAAU,GAAS;AAAA,IACjB,KAAK,KAAK,WAAW;AAAA;AAAA,EAGvB,IAAI,CAAC,SAAwB;AAAA,IAC3B,MAAM,UAAU,KAAK,KAAK,OAAO;AAAA,IACjC,KAAK,KAAK,KAAK,OAAO;AAAA;AAAA,EAehB,IAAI,CAAC,SAA2B;AAAA,IACtC,MAAM,UAAU,KAAK,cAAc;AAAA,IACnC,MAAM,aAAa,iBAAiB,OAAO;AAAA,IAC3C,MAAM,SAAS,kBAAkB,kBAAkB,MAAM,UAAU;AAAA,IAEnE,IAAI;AAAA,IACJ,IAAI,KAAK,mBAAmB;AAAA,MAC1B,MAAM,SAAS,QAAQ,aAAa,IAAI,mBAAmB;AAAA,MAC3D,IAAI,CAAC,QAAQ;AAAA,QACX,MAAM,IAAI,MACR,iEAAiE,wEACnE;AAAA,MACF;AAAA,MACA,MAAM,YAAY,aAAsB,QAAQ,qBAAqB,MAAM;AAAA,MAC3E,gBAAgB,wBAAwB,SAAS;AAAA,IACnD,EAAO;AAAA,MACL,gBAAgB;AAAA;AAAA,IAGlB,MAAM,SAAS,aAAa,eAAe,QAAQ,UAAU,QAAQ,SAAS,SAAS;AAAA,IACvF,MAAM,cAAc,qBAAqB,MAAM;AAAA,IAW/C,MAAM,QAAiC;AAAA,MACrC,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,MAAM;AAAA,IACR;AAAA,IACA,IAAI,gBAAgB,WAAY,QAAqC,eAAe,WAAW;AAAA,MAC7F,MAAM,gBAAiB,QAAoC;AAAA,IAC7D;AAAA,IACA,OAAO;AAAA;AAAA,EAUD,SAAS,CAAC,SAAuC;AAAA,IACvD,IAAI,CAAC,QAAQ;AAAA,MAAM;AAAA,IAEnB,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,qBAAqB,QAAQ,IAAI;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AAAA,MACD;AAAA;AAAA,IAQF,MAAM,UAAU,KAAK,cAAc;AAAA,IAKnC,IAAI,QAAQ,aAAa,IAAI,OAAO,QAAQ,GAAG;AAAA,MAC7C,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,QAAQ,WAAW,IAAI,OAAO,QAAQ;AAAA,IACxD,IAAI,CAAC,WAAW;AAAA,MACd,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,kBAAkB,cAAmB,QAAQ,SAAS;AAAA,MACtD,OAAO,KAAK;AAAA,MACZ,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AAAA,MACD;AAAA;AAAA,IAGF,IAAI,CAAC,KAAK,mBAAmB;AAAA,MAE3B,OAAO,KAAK,sBAAsB,iBAAiB,OAAO,QAAQ;AAAA,IACpE;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,YAAY,wBAAwB,eAAe;AAAA,MACnD,OAAO,KAAK;AAAA,MACZ,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AAAA,MACD;AAAA;AAAA,IAGF,MAAM,SAAS,QAAQ,aAAa,IAAI,UAAU,UAAU;AAAA,IAC5D,IAAI,CAAC,QAAQ;AAAA,MACX,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,YAAY,aAAsB,WAAW,MAAM;AAAA,MACnD,OAAO,KAAK;AAAA,MACZ,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,YAAY,UAAU;AAAA,QACtB,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AAAA,MACD;AAAA;AAAA,IAGF,OAAO,KAAK,sBAAsB,WAAW,OAAO,QAAQ;AAAA;AAAA,EAYtD,qBAAqB,CAAC,SAAqB,UAAuC;AAAA,IACxF,IAAI,QAAQ,aAAa,GAAG;AAAA,MAC1B,mBAAmB,EAAE,MAAM,8BAA8B,SAAS,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,IACA,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,OAAO,QAAQ,SAAS,CAAC;AAAA,IAC/B,QAAQ;AAAA,WACD,kBAAkB;AAAA,QACrB,OAAO,mBAAmB,IAAI;AAAA,WAC3B,kBAAkB;AAAA,QACrB,mBAAmB,EAAE,MAAM,4BAA4B,SAAS,CAAC;AAAA,QACjE,KAAK,qBAAqB,KAAK,MAAM,QAAQ;AAAA,QAC7C;AAAA,WACG,kBAAkB;AAAA,QACrB,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,QACD,KAAK,qBAAqB,KAAK,MAAM,QAAQ;AAAA,QAC7C;AAAA;AAAA,QAEA,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD;AAAA;AAAA;AAAA,EAIE,oBAAoB,CAAC,KAAa,MAAkB,UAAwB;AAAA,IAClF,IAAI,CAAC,KAAK;AAAA,MAAkB;AAAA,IAC5B,IAAI;AAAA,MACF,KAAK,iBAAiB,KAAK,MAAM,QAAQ;AAAA,MACzC,OAAO,KAAK;AAAA,MACZ,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AAAA;AAAA;AAAA,EAeL,kBAAkB,CAChB,KACA,MACA,eACM;AAAA,IACN,IAAI,cAAc,WAAW;AAAA,MAAG;AAAA,IAChC,MAAM,UAAU,KAAK,cAAc;AAAA,IACnC,MAAM,SAAS,kBAAkB,KAAK,IAAI;AAAA,IAE1C,IAAI;AAAA,IACJ,IAAI,KAAK,mBAAmB;AAAA,MAC1B,MAAM,SAAS,QAAQ,aAAa,IAAI,mBAAmB;AAAA,MAC3D,IAAI,CAAC,QAAQ;AAAA,QACX,MAAM,IAAI,MACR,oFAAoF,uBACtF;AAAA,MACF;AAAA,MACA,MAAM,YAAY,aAAsB,QAAQ,qBAAqB,MAAM;AAAA,MAC3E,gBAAgB,wBAAwB,SAAS;AAAA,IACnD,EAAO;AAAA,MACL,gBAAgB;AAAA;AAAA,IAGlB,MAAM,WAAY,KAAK,UAAU;AAAA,IACjC,MAAM,SAAS,aAAa,eAAe,UAAU,QAAQ,SAAS,SAAS;AAAA,IAC/E,MAAM,cAAc,qBAAqB,MAAM;AAAA,IAE/C,WAAW,YAAY,eAAe;AAAA,MACpC,MAAM,QAAiC;AAAA,QACrC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,KAAK,KAAK,KAAK,KAA2B;AAAA,IAC5C;AAAA;AAEJ;AAUO,SAAS,iBAAiB,CAAC,KAAsB,MAA8B;AAAA,EACpF,MAAM,MAAM,IAAI,WAAW,KAAK,aAAa,CAAC;AAAA,EAC9C,IAAI,KAAK;AAAA,EACT,IAAI,IAAI,MAAM,CAAC;AAAA,EACf,OAAO;AAAA;AAYT,SAAS,gBAAgB,CAAC,SAA8B;AAAA,EACtD,MAAM,YAAqC;AAAA,IACzC,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA,IAAI,gBAAgB,WAAW,QAAQ,eAAe,WAAW;AAAA,IAC/D,UAAU,gBAAgB,QAAQ;AAAA,EACpC;AAAA,EACA,IAAI,WAAW,WAAW,QAAQ,UAAU,WAAW;AAAA,IACrD,UAAU,WAAW,QAAQ;AAAA,EAC/B;AAAA,EACA,IAAI,eAAe,WAAW,QAAQ,cAAc,WAAW;AAAA,IAC7D,UAAU,eAAe,QAAQ;AAAA,EACnC;AAAA,EACA,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,SAAS,CAAC;AAAA,EACtE,MAAM,YACJ,UAAU,WAAW,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,IAAI,WAAW,CAAC;AAAA,EAE3F,MAAM,MAAM,IAAI,WAAW,IAAI,YAAY,SAAS,UAAU,MAAM;AAAA,EACpE,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,WAAW,IAAI,YAAY,MAAM;AAAA,EACzC,OAAO;AAAA;AAMT,SAAS,kBAAkB,CAAC,OAA4B;AAAA,EACtD,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,MAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI,WAAW;AAAA,IAChC,MAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA,EACA,MAAM,SAAS,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAAA,EACpF,MAAM,OAAO,MAAM,MAAM,IAAI,SAAS;AAAA,EACtC,OAAO,KAAK,QAAQ,KAAK;AAAA;;;AE7e3B,IAAM,0BAA0B;AAGhC,IAAM,yBAAyB;AAM/B,SAAS,UAAU,CAAC,KAAmD;AAAA,EACrE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,OAAO,QAAQ,WAAW,KAAK,MAAM,GAAG,IAAI;AAAA,IACrD,MAAM;AAAA,IACN;AAAA;AAAA,EAEF,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAAA,IACjD;AAAA,EACF;AAAA,EACA,MAAM,SAAS;AAAA,EACf,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,IACtC;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAAA;AAGF,MAAM,oBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACS;AAAA,EAEjB,WAAW,CAAC,SAAqC;AAAA,IAC/C,KAAK,MAAM,QAAQ;AAAA,IACnB,KAAK,SAAS,QAAQ;AAAA,IACtB,KAAK,WAAW,QAAQ;AAAA,IACxB,IAAI,QAAQ,YAAY;AAAA,MAAW,KAAK,UAAU,QAAQ;AAAA,IAC1D,IAAI,QAAQ,WAAW;AAAA,MAAW,KAAK,SAAS,QAAQ;AAAA,IACxD,IAAI,QAAQ,YAAY;AAAA,MAAW,KAAK,UAAU,QAAQ;AAAA,IAC1D,IAAI,QAAQ,mBAAmB;AAAA,MAAW,KAAK,iBAAiB,QAAQ;AAAA,IACxE,IAAI,QAAQ,iBAAiB;AAAA,MAAW,KAAK,eAAe,QAAQ;AAAA,IACpE,IAAI,QAAQ,eAAe;AAAA,MAAW,KAAK,aAAa,QAAQ;AAAA,IAChE,IAAI,QAAQ,kBAAkB;AAAA,MAAW,KAAK,gBAAgB,QAAQ;AAAA,IACtE,MAAM,KAAK,QAAQ,aAAa,WAAW;AAAA,IAC3C,IAAI,OAAO,OAAO,YAAY;AAAA,MAC5B,MAAM,IAAI,MACR,iLACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AAAA;AAAA,OAQjB,QAAO,GAAkB;AAAA,IAC7B,KAAK,WAAW;AAAA,IAChB,IAAI,KAAK,gBAAgB;AAAA,MACvB,aAAa,KAAK,cAAc;AAAA,MAChC,KAAK,iBAAiB;AAAA,IACxB;AAAA,IACA,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,IAAI,KAAK,cAAc,KAAK,GAAG;AAAA,MAC1C,KAAK,SAAS;AAAA,MACd,IAAI,UAAU;AAAA,MAEd,GAAG,iBAAiB,QAAQ,MAAM;AAAA,QAIhC,GAAG,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,QAAQ,KAAK,OAAO,CAA4B,CAAC;AAAA,QACxF,KAAK,SAAS;AAAA,QACd,KAAK,SAAS;AAAA,QACd,IAAI,CAAC,SAAS;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AAAA,OACD;AAAA,MAED,GAAG,iBAAiB,WAAW,CAAC,UAAU;AAAA,QACxC,KAAK,cAAc,MAAM,IAAI;AAAA,OAC9B;AAAA,MAED,GAAG,iBAAiB,SAAS,CAAC,QAAQ;AAAA,QAGpC,IAAI,CAAC,SAAS;AAAA,UACZ,UAAU;AAAA,UACV,OAAO,GAAG;AAAA,QACZ;AAAA,OACD;AAAA,MAED,GAAG,iBAAiB,SAAS,MAAM;AAAA,QACjC,MAAM,UAAU,KAAK;AAAA,QACrB,KAAK,SAAS;AAAA,QACd,KAAK,UAAU;AAAA,QAIf,IAAI,CAAC,KAAK,YAAY,SAAS;AAAA,UAC7B,KAAK,kBAAkB,CAAC;AAAA,QAC1B;AAAA,OACD;AAAA,KACF;AAAA;AAAA,EAIK,iBAAiB,CAAC,SAAuB;AAAA,IAC/C,IAAI,KAAK;AAAA,MAAU;AAAA,IACnB,MAAM,QAAQ,KAAK,IAAI,wBAAwB,0BAA0B,KAAK,OAAO;AAAA,IACrF,KAAK,iBAAiB,WAAW,MAAM;AAAA,MACrC,KAAK,iBAAiB;AAAA,MACtB,IAAI,KAAK;AAAA,QAAU;AAAA,MACd,KAAK,QAAQ,EAAE,MAAM,MAAM;AAAA,QAC9B,KAAK,kBAAkB,UAAU,CAAC;AAAA,OACnC;AAAA,OACA,KAAK;AAAA;AAAA,EAQF,aAAa,CAAC,KAAoB;AAAA,IACxC,MAAM,SAAS,WAAW,GAAG;AAAA,IAC7B,IAAI,WAAW,WAAW;AAAA,MACxB;AAAA,IACF;AAAA,IACA,MAAM,UAAU,KAAK,eAAe,OAAO,OAAO;AAAA,IAClD,IAAI,YAAY,WAAW;AAAA,MACzB,QAAQ,MAAM;AAAA,MACd;AAAA,IACF;AAAA,IAKA,KAAK,gBAAgB,MAAyC;AAAA;AAAA,EAGxD,cAAc,CAAC,MAAwE;AAAA,IAC7F,IAAI,SAAS,UAAU;AAAA,MACrB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,SAAS,OAAO,WAAW,OAAO,UAAU;AAAA,QACnD;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,iBAAiB;AAAA,MAC5B,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,MAAM,QAAQ,OAAO,UAAU,GAAG;AAAA,UACpC,KAAK,iBAAiB,OAAO,UAAiC;AAAA,QAChE;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,eAAe;AAAA,MAC1B,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,eAAe,OAAO,SAAS;AAAA,QACtC;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,aAAa;AAAA,MACxB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,aAAa,OAAO,SAAS;AAAA,QACpC;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,SAAS;AAAA,MACpB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC;AAAA,QACF;AAAA,QACA,MAAM,eACJ,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,QACxE,KAAK,UAAU,OAAO,WAAW,YAAY;AAAA;AAAA,IAEjD;AAAA,IACA;AAAA;AAAA,EASF,UAAU,CAAC,cAAsB,SAA2B;AAAA,IAC1D,IAAI,CAAC,KAAK,UAAU,KAAK,OAAO,eAAe,KAAK,cAAc,QAAQ,CAAC,KAAK,QAAQ;AAAA,MACtF,OAAO;AAAA,IACT;AAAA,IACA,MAAM,MAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IACpC,OAAO;AAAA;AAAA,EAaT,UAAU,CAAC,MAAc,UAAmC,CAAC,GAAY;AAAA,IACvE,IAAI,CAAC,KAAK,UAAU,KAAK,OAAO,eAAe,KAAK,cAAc,QAAQ,CAAC,KAAK,QAAQ;AAAA,MACtF,OAAO;AAAA,IACT;AAAA,IACA,KAAK,OAAO,KAAK,KAAK,UAAU,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,IACrD,OAAO;AAAA;AAAA,EAST,KAAK,GAAS;AAAA,IACZ,KAAK,WAAW;AAAA,IAChB,IAAI,KAAK,gBAAgB;AAAA,MACvB,aAAa,KAAK,cAAc;AAAA,MAChC,KAAK,iBAAiB;AAAA,IACxB;AAAA,IACA,KAAK,QAAQ,MAAM;AAAA,IACnB,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA;AAAA,MAIZ,WAAW,GAAY;AAAA,IACzB,OAAO,KAAK,UAAU,KAAK,QAAQ,eAAe,KAAK,cAAc;AAAA;AAEzE;;;ACzTA;AAAA,eACE;AAAA;AAKF;;;ACVA;AACA;;;ACqBO,MAAM,uBAAuB,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,SACA,MACA,KACA,WACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,KAAK,YAAY;AAAA;AAErB;AAAA;AAOO,MAAM,kBAAkB;AAAA,EACZ,QAAQ,IAAI;AAAA,EAErB,QAAQ,CAAC,KAAa,WAAkC;AAAA,IAC9D,OAAO,GAAG,aAAa;AAAA;AAAA,EAIzB,IAAI,CAAC,KAAa,WAAgC;AAAA,IAChD,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA,EAI9C,QAAQ,CAAC,KAAa,WAAmC;AAAA,IACvD,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA,EAIrD,KAAK,GAAS;AAAA,IACZ,KAAK,MAAM,MAAM;AAAA;AAAA,MAIf,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,MAAM;AAAA;AAEtB;AAMO,IAAM,oBAAoB,IAAI;AAkBrC,eAAsB,gBAAqC,CACzD,QACA,aACA,WACe;AAAA,EACf,IAAK,WAAmC,aAAoC;AAAA,IAC1E,MAAM,IAAI,eACR,0CAA0C,OAAO,cAAc,OAAO,cACtE,2BACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,IAAI,kBAAkB,SAAS,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,IAC5D,MAAM,IAAI,eACR,2BAA2B,OAAO,eAAe,OAAO,6EACxD,oBACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AAAA,EACb,MAAM,YAAY;AAAA,EAClB,MAAM,cAAc,UAAU,OAAO,KAAK;AAAA,EAC1C,YAAY,QAAQ;AAAA,EACpB,kBAAkB,KAAK,OAAO,KAAK,OAAO,SAAS;AAAA;;;AC9G9C,MAAM,gCAAgC,MAAM;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,KACA,gBACA,eACA,iBACA,gBACA;AAAA,IACA,MAAM,gBAAgB,gBAAgB,QAAQ,mBAAmB;AAAA,IACjE,MAAM,iBAAiB,iBAAiB,QAAQ,oBAAoB;AAAA,IACpE,MACE,mCAAmC,mCACjC,IAAI,iBAAiB,iDACrB,OAAO,kBAAkB,6CACzB,wCACJ;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,KAAK,iBAAiB;AAAA,IACtB,KAAK,gBAAgB;AAAA,IACrB,KAAK,kBAAkB;AAAA,IACvB,KAAK,iBAAiB;AAAA;AAE1B;AAAA;AAaO,MAAM,kBAAkB;AAAA,EACZ,UAAU,IAAI;AAAA,EAU/B,QAAQ,CAAC,KAAa,WAA0B,UAAyB;AAAA,IACvE,MAAM,WAAW,KAAK,QAAQ,IAAI,GAAG;AAAA,IACrC,IAAI,YAAY,SAAS,cAAc,WAAW;AAAA,MAChD,MAAM,IAAI,wBACR,KACA,SAAS,WACT,SAAS,UACT,WACA,QACF;AAAA,IACF;AAAA,IACA,IAAI,CAAC,UAAU;AAAA,MACb,KAAK,QAAQ,IAAI,KAAK,EAAE,WAAW,SAAS,CAAC;AAAA,IAC/C;AAAA;AAAA,EAMF,GAAG,CAAC,KAAsB;AAAA,IACxB,OAAO,KAAK,QAAQ,IAAI,GAAG;AAAA;AAAA,EAO7B,MAAM,CAAC,KAAwC;AAAA,IAC7C,OAAO,KAAK,QAAQ,IAAI,GAAG,GAAG;AAAA;AAAA,EAOhC,KAAK,GAAS;AAAA,IACZ,KAAK,QAAQ,MAAM;AAAA;AAAA,MAMjB,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,QAAQ;AAAA;AAExB;AAMO,IAAM,oBAAoB,IAAI;;;ACxH9B,IAAM,uBAAuB;AAAA;AA2C7B,MAAM,2BAA2B,MAAM;AAAA,EACnC;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,SACA,MACA,UAKI,CAAC,GACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,IAAI,QAAQ,eAAe;AAAA,MAAW,KAAK,aAAa,QAAQ;AAAA,IAChE,IAAI,QAAQ,kBAAkB;AAAA,MAAW,KAAK,gBAAgB,QAAQ;AAAA,IACtE,IAAI,QAAQ,cAAc;AAAA,MAAW,KAAK,YAAY,QAAQ;AAAA,IAC9D,IAAI,QAAQ,mBAAmB;AAAA,MAAW,KAAK,iBAAiB,QAAQ;AAAA;AAE5E;AAQO,SAAS,aAAa,CAAC,KAAsB;AAAA,EAClD,IAAI,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAAM,OAAO;AAAA,EACpD,MAAM,SAAS;AAAA,EACf,MAAM,QAAQ,OAAO;AAAA,EACrB,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI,QAAQ;AAAA;AAO/E,SAAS,aAAa,CAAC,KAA8B,SAAuB;AAAA,EACjF,IAAI,wBAAwB;AAAA;AAWvB,SAAS,aAAa,CAC3B,KACA,eACA,YACM;AAAA,EACN,MAAM,UAAU,cAAc,GAAG;AAAA,EACjC,IAAI,UAAU,eAAe;AAAA,IAC3B,MAAM,IAAI,mBACR,iCAAiC,uCAAuC,uDACxE,oBACA,EAAE,YAAY,SAAS,cAAc,CACvC;AAAA,EACF;AAAA,EACA,SAAS,IAAI,UAAU,EAAG,KAAK,eAAe,KAAK;AAAA,IACjD,MAAM,YAAY,WAAW;AAAA,IAC7B,IAAI,CAAC,WAAW;AAAA,MACd,MAAM,IAAI,mBACR,wCAAwC,yCAAyC,UAAU,aAAa,kBACxG,qBACA,EAAE,YAAY,SAAS,eAAe,gBAAgB,EAAE,CAC1D;AAAA,IACF;AAAA,IACA,UAAU,GAAG;AAAA,IACb,cAAc,KAAK,CAAC;AAAA,EACtB;AAAA;AAuBK,SAAS,cAAc,CAAC,WAAmB,YAAoC;AAAA,EACpF,IAAI,YAAY,YAAY;AAAA,IAC1B,OAAO,EAAE,YAAY,OAAO,QAAQ,qBAAqB,WAAW,WAAW;AAAA,EACjF;AAAA,EACA,IAAI,YAAY,YAAY;AAAA,IAC1B,OAAO,EAAE,YAAY,OAAO,QAAQ,qBAAqB,WAAW,WAAW;AAAA,EACjF;AAAA,EACA,OAAO,EAAE,YAAY,KAAK;AAAA;AAQrB,SAAS,eAAe,CAAC,WAAmB,YAA0B;AAAA,EAC3E,MAAM,SAAS,eAAe,WAAW,UAAU;AAAA,EACnD,IAAI,OAAO;AAAA,IAAY;AAAA,EACvB,MAAM,UACJ,OAAO,WAAW,sBACd,8CAA8C,4CAA4C,8CAC1F,8CAA8C,4CAA4C;AAAA,EAChG,MAAM,IAAI,mBAAmB,SAAS,OAAO,QAAQ,EAAE,WAAW,WAAW,CAAC;AAAA;;;AHpHhF,SAAS,0BAAqD,CAC5D,QACyB;AAAA,EACzB,IAAI,kBAAkB,SAAS,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,IAC5D,MAAM,IAAI,eACR,qBAAqB,OAAO,cAAc,OAAO,+GACjD,oBACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,kBAAkB,SAAS,OAAO,KAAK,OAAO,WAAW,OAAO,QAAQ;AAAA,EAExE,MAAM,QAAQ,OAAU,OAAO,YAAY;AAAA,EAC3C,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EAEJ,MAAM,UAAU,YAAY;AAAA,IAC1B,MAAM,SAAS,MAAM,OAAO,UAAU;AAAA,IACtC,MAAM,OAAO,UAAU;AAAA,IACvB,gBAAgB;AAAA,IAEhB,IAAI,OAAO,kBAAkB,WAAW;AAAA,MACtC,MAAM,gBAAgB,OAAO;AAAA,MAC7B,MAAM,aAAa,OAAO,cAAc,CAAC;AAAA,MACzC,OAAO,OAAO,CAAC,QAAQ;AAAA,QACrB,cAAc,KAA2C,eAAe,UAAU;AAAA,QAClF,cAAc,KAA2C,aAAa;AAAA,OACvE;AAAA,IACH;AAAA,IAEA,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,QAAQ,OAAO,aAAa,OAAO,IAAI,CAAC;AAAA,cAC9C;AAAA,MACA,WAAW;AAAA;AAAA,IAGb,OAAO,GAAG,UAAU,CAAC,YAAY;AAAA,MAC/B,IAAI;AAAA,QAAU;AAAA,MACd,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,OAAO,aAAa,QAAQ,GAAG;AAAA,gBAC7C;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,IAED,OAAO,MAAM;AAAA,MACX,MAAM,QAAQ,MAAM;AAAA,MACpB,IAAI;AAAA,QAAU;AAAA,MACd,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,cAAc,OAAO,CAAC,QAAQ;AAAA,UAC5B,OAAO,WAAW,KAAK,KAAK;AAAA,SAC7B;AAAA,gBACD;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,KACA;AAAA,EAEH,OAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,WAAW,OAAO;AAAA,QACd,KAAK,GAAG;AAAA,MACV,OAAO,MAAM;AAAA;AAAA,QAEX,KAAK,CAAC,MAAS;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,IAEhB;AAAA,QACI,MAAM,GAAG;AAAA,MACX,OAAO;AAAA;AAAA,QAEL,WAAW,GAAG;AAAA,MAChB,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,MAAM,MAAM,cAAc,IAAI;AAAA,MAC9B,IAAI,CAAC;AAAA,QAAK;AAAA,MACV,OAAO,UAAU,cAAc,GAAG,EAAE;AAAA;AAAA,EAExC;AAAA;AA2BK,SAAS,SAAS,CACvB,KACA,cACA,SAC8B;AAAA,EAC9B,OAAO,2BAA4C;AAAA,IACjD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAQ,IAAI,QAAQ;AAAA,IACnC,YAAY,CAAC,KAAK,UAAU;AAAA,MAC1B,IAAI,IAAI,SAAS,WAAW;AAAA,QAEzB,IAA2B,OAAO;AAAA,MACrC,EAAO;AAAA,QACL,WAAW,KAAK,CAAC,MAAM,GAAG,KAAK;AAAA;AAAA;AAAA,IAGnC,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;AA8BI,SAAS,YAAY,CAC1B,KACA,cACA,SAC8B;AAAA,EAC9B,OAAO,2BAA+C;AAAA,IACpD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAQ;AAAA,MACrB,MAAM,IAAI,IAAI;AAAA,MACd,IAAI,MAAM;AAAA,QAAW,OAAO;AAAA,MAC5B,OAAO,EAAE;AAAA;AAAA,IAEX,YAAY,CAAC,KAAK,UAAU;AAAA,MAC1B,MAAM,WAAW,IAAI;AAAA,MACrB,IAAI,aAAa,WAAW;AAAA,QACzB,IAA8B,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC1D,EAAO;AAAA,QACL,MAAM,QAAQ,QAAQ,SAAS;AAAA,QAC/B,IAAI,UAAU,GAAG;AAAA,UACf,SAAS,UAAU,KAAK;AAAA,QAC1B;AAAA;AAAA;AAAA,IAGJ,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;AA8BI,SAAS,SAAY,CAC1B,KACA,cACA,SAC2B;AAAA,EAC3B,OAAO,2BAA4C;AAAA,IACjD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAS,IAAI,QAAQ,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;AAAA,IACtD,YAAY,CAAC,KAAK,UAAU;AAAA,MAGzB,IAA8B,QAAQ,CAAC,GAAG,KAAK;AAAA;AAAA,IAElD,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;;;AIhTH,sBAAS;AACT,mBAAS,mBAAQ;AA2FV,SAAS,UAAkC,CAAC,SAAgD;AAAA,EACjG,IAAI,kBAAkB,SAAS,QAAQ,KAAK,QAAQ,SAAS,GAAG;AAAA,IAC9D,MAAM,IAAI,eACR,qBAAqB,QAAQ,cAAc,QAAQ,+GACnD,oBACA,QAAQ,KACR,QAAQ,SACV;AAAA,EACF;AAAA,EACA,kBAAkB,SAAS,QAAQ,KAAK,QAAQ,WAAW,QAAQ,QAAQ;AAAA,EAE3E,MAAM,QAAQ,QAAU,QAAQ,YAAY;AAAA,EAC5C,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EAKJ,IAAI;AAAA,EAKJ,IAAI,WAAW;AAAA,EAEf,SAAS,oBAAoB,CAAC,QAA4B;AAAA,IACxD,MAAM,WAAW,CAAC,YAA8B;AAAA,MAC9C,IAAI;AAAA,QAAU;AAAA,MACd,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,SAAS,QAAQ,GAAG;AAAA,gBAClC;AAAA,QACA,WAAW;AAAA;AAAA,MAMb,IAAI,QAAQ,mBAAmB,CAAC,UAAU;AAAA,QACnC,YAAY,QAAQ,QAAQ,GAAG;AAAA,MACtC;AAAA;AAAA,IAEF,OAAO,GAAG,UAAU,QAAQ;AAAA,IAC5B,uBAAuB,MAAM;AAAA,MAC3B,OAAO,IAAI,UAAU,QAAQ;AAAA;AAAA;AAAA,EAIjC,eAAe,WAAW,CAAC,YAA0B,KAAuB;AAAA,IAC1E,IAAI,CAAC,QAAQ;AAAA,MAAiB;AAAA,IAC9B,IAAI;AAAA,MAAU;AAAA,IACd,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,OAAO,MAAM,QAAQ,gBAAgB,YAAY,GAAG;AAAA,MAC1D,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,IAAI,SAAS;AAAA,QAAe;AAAA,MAC5B,IAAI,KAAK,eAAe,WAAW;AAAA,QAAY;AAAA,MAE/C,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,gBAAgB;AAAA,MAChB,qBAAqB,IAAI;AAAA,MACzB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC;AAAA,gBACjC;AAAA,QACA,WAAW;AAAA;AAAA,cAEb;AAAA,MACA,WAAW;AAAA;AAAA;AAAA,EAIf,eAAe,sBAAsB,CAAC,OAA4C;AAAA,IAChF,IAAI,CAAC,QAAQ;AAAA,MAAiB,OAAO;AAAA,IACrC,IAAI,SAAS;AAAA,IACb,MAAM,OAAO,IAAI,IAAY,CAAC,OAAO,UAA+B,CAAC;AAAA,IACrE,UAAS;AAAA,MACP,MAAM,MAAM,OAAO,IAAI;AAAA,MACvB,IAAI,CAAC;AAAA,QAAK;AAAA,MACV,MAAM,OAAO,MAAM,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,MACtD,IAAI,CAAC,QAAQ,SAAS;AAAA,QAAQ;AAAA,MAC9B,MAAM,eAAe,KAAK;AAAA,MAC1B,IAAI,KAAK,IAAI,YAAY;AAAA,QAAG;AAAA,MAC5B,KAAK,IAAI,YAAY;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,OAAO,UAAU;AAAA,IACzB;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,SAAS,sBAAsB,CAAC,QAA4B;AAAA,IAC1D,IAAI,QAAQ,kBAAkB;AAAA,MAAW;AAAA,IACzC,MAAM,gBAAgB,QAAQ;AAAA,IAC9B,MAAM,aAAa,QAAQ,cAAc,CAAC;AAAA,IAC1C,OAAO,OAAO,CAAC,QAAQ;AAAA,MACrB,cAAc,KAA2C,eAAe,UAAU;AAAA,MAGlF,cAAc,KAA2C,aAAa;AAAA,KACvE;AAAA;AAAA,EAGH,SAAS,kBAAkB,GAAS;AAAA,IAClC,QAAO,MAAM;AAAA,MACX,MAAM,QAAQ,MAAM;AAAA,MACpB,IAAI;AAAA,QAAU;AAAA,MACd,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,cAAc,OAAO,CAAC,QAAQ;AAAA,UAC5B,cAAc,KAA2C,KAAK;AAAA,SAC/D;AAAA,gBACD;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA;AAAA,EAGH,MAAM,UAAU,YAAY;AAAA,IAC1B,MAAM,gBAAgB,MAAM,QAAQ,UAAU;AAAA,IAC9C,MAAM,cAAc,UAAU;AAAA,IAM9B,MAAM,SAAS,MAAM,uBAAuB,aAAa;AAAA,IACzD,gBAAgB;AAAA,IAIhB,uBAAuB,MAAM;AAAA,IAI7B,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,cACnC;AAAA,MACA,WAAW;AAAA;AAAA,IAMb,qBAAqB,MAAM;AAAA,IAM3B,mBAAmB;AAAA,KAClB;AAAA,EAEH,OAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,QACf,KAAK,GAAG;AAAA,MACV,OAAO,MAAM;AAAA;AAAA,QAEX,KAAK,CAAC,MAAS;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,IAEhB;AAAA,QACI,MAAM,GAAG;AAAA,MACX,OAAO;AAAA;AAAA,QAEL,WAAW,GAAG;AAAA,MAChB,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,MAAM,MAAM,cAAc,IAAI;AAAA,MAC9B,IAAI,CAAC;AAAA,QAAK;AAAA,MACV,OAAO,WAAU,cAAc,GAAG,EAAE;AAAA;AAAA,EAExC;AAAA;AAQF,SAAS,QAAW,CAAC,KAAW;AAAA,EAC9B,OAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA;AA6BvC,SAAS,aAAqC,CAAC,KAA8B,OAAgB;AAAA,EAC3F,MAAM,SAAS;AAAA,EACf,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAAA,IACpC,IAAI,QAAQ;AAAA,MAAsB;AAAA,IAClC,MAAM,WAAW,OAAO;AAAA,IACxB,IAAI,YAAY,IAAI,MAAM,QAAQ;AAAA,MAAG;AAAA,IACrC,IAAI,OAAO;AAAA,EACb;AAAA;AAQF,SAAS,WAAW,CAAC,GAAY,GAAqB;AAAA,EACpD,IAAI,MAAM;AAAA,IAAG,OAAO;AAAA,EACpB,IAAI;AAAA,IACF,OAAO,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ACpVX;AAAA;AAAA;AAKA;AAKA,IAAM,gBAAgB;AACtB,IAAM,aAAa,IAAI;AAahB,SAAS,gBAAgB,CAAC,KAAyB;AAAA,EACxD,MAAM,SAAS,MAAK,KAAK,WAAW,OAAO,GAAG,iBAAiB,KAAK,CAAC;AAAA,EACrE,MAAM,QAAQ,OAAO,MAAM,GAAG,EAAE;AAAA,EAChC,OAAO,sBAAsB,KAAoC;AAAA;;;ANwCnE,IAAI;AA2BG,IAAM,uBAA+B,cAC1C,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,aAC1D,OAAO,WAAW,IAClB,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE;AAK3D,SAAS,oBAAoB,GAAW;AAAA,EAC7C,OAAO;AAAA;AAST,IAAI;AAOG,SAAS,2BAA2B,GAAuB;AAAA,EAChE,OAAO;AAAA;AASF,SAAS,kBAAkB,CAAC,MAAkB;AAAA,EACnD,cAAc;AAAA,EACd,2BAA2B,KAAK;AAAA;AAO3B,SAAS,cAAc,GAAS;AAAA,EACrC,cAAc;AAAA,EACd,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,eAAe,CAAC;AAAA,EAChB,gBAAgB;AAAA;AAQX,SAAS,qBAAqB,GAAY;AAAA,EAC/C,OAAO,gBAAgB;AAAA;AAUzB,IAAI,wBAAwB;AAKrB,SAAS,oBAAoB,GAAY;AAAA,EAC9C,OAAO;AAAA;AAgBT,IAAI,kBAAkB;AAIf,SAAS,kBAAkB,GAAW;AAAA,EAC3C,OAAO;AAAA;AAWT,IAAI,kBAAkB;AAKf,SAAS,kBAAkB,GAAW;AAAA,EAC3C,OAAO;AAAA;AAoBT,IAAI;AAIG,SAAS,sBAAsB,GAAmD;AAAA,EACvF,OAAO;AAAA;AAGT,SAAS,qBAAqB,CAAC,QAAuB;AAAA,EACpD,MAAM,MACJ,kBAAkB,QACd,SACA,IAAI,MAAM,OAAO,WAAW,WAAW,SAAS,OAAO,MAAM,CAAC;AAAA,EACpE,sBAAsB;AAAA,IACpB,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,IACX,IAAI,KAAK,IAAI;AAAA,EACf;AAAA;AAiBF,IAAM,wBAAwB;AAoC9B,IAAI;AAKG,SAAS,mBAAmB,GAA0C;AAAA,EAC3E,OAAO;AAAA;AAGT,SAAS,sBAAsB,CAAC,OAAwC;AAAA,EACtE,uBAAuB;AAAA;AASzB,eAAe,kBAAqB,CAClC,WACA,YACA,SACA,YAAoB,uBACR;AAAA,EACZ,MAAM,QAAQ,KAAK,IAAI;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,IACF,OAAO,MAAM,IAAI,QAAW,CAAC,SAAS,WAAW;AAAA,MAC/C,QAAQ,WAAW,MAAM;AAAA,QACvB,WAAW;AAAA,QACX,MAAM,YAAY,KAAK,IAAI,IAAI;AAAA,QAC/B,MAAM,UAAU,wCAAwC,2BAA2B,+BAA+B;AAAA,QAClH,uBAAuB;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,IAAI,KAAK,IAAI;AAAA,QACf,CAAC;AAAA,QACD,OAAO,IAAI,MAAM,OAAO,CAAC;AAAA,SACxB,SAAS;AAAA,MACZ,QAAQ,KACN,CAAC,UAAU;AAAA,QACT,IAAI,CAAC;AAAA,UAAU,QAAQ,KAAK;AAAA,SAE9B,CAAC,QAAQ;AAAA,QACP,IAAI,CAAC;AAAA,UAAU,OAAO,GAAG;AAAA,OAE7B;AAAA,KACD;AAAA,YACD;AAAA,IACA,IAAI,UAAU;AAAA,MAAW,aAAa,KAAK;AAAA;AAAA;AA8F/C,IAAM,uBAAuB;AAC7B,IAAI,eAA6C,CAAC;AAI3C,SAAS,eAAe,GAAiC;AAAA,EAC9D,OAAO,aAAa,MAAM;AAAA;AAG5B,SAAS,iBAAiB,CAAC,QAA0C;AAAA,EACnE,aAAa,KAAK,MAAM;AAAA,EACxB,IAAI,aAAa,SAAS,sBAAsB;AAAA,IAC9C,eAAe,aAAa,MAAM,CAAC,oBAAoB;AAAA,EACzD;AAAA;AAGF,SAAS,eAAe,CAAC,MAAY,YAA4C;AAAA,EAC/E,MAAM,SAAU,KAAK,QACnB;AAAA,EAEF,IAAI,CAAC;AAAA,IAAQ;AAAA,EACb,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,OAAO,OAAO,SAAS,SAAS;AAAA;AAG3F,SAAS,WAAW,CAAC,QAAgC;AAAA,EACnD,wBAAwB;AAAA,EACxB,MAAM,OAAO,UAAU;AAAA,EACvB,IAAI,CAAC,MAAM;AAAA,IAMT,IAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,SAAS,YAAY;AAAA,MACxE,QAAQ,KACN,2EAA2E,sKAC7E;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MACR,yDAAyD,2QAC3D;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAKT,IAAM,cAAa,IAAI;AAqCvB,IAAI;AAEG,SAAS,qBAAqB,CAAC,UAA2C;AAAA,EAC/E,gBAAgB;AAAA;AAGX,SAAS,gBAAgB,GAA8B;AAAA,EAC5D,OAAO;AAAA;AAQF,SAAS,iBAAiB,CAAC,KAAyB;AAAA,EACzD,OAAO,gBAAgB,GAAG,KAAK,iBAAiB,GAAG;AAAA;AA8BrD,IAAI;AAEG,SAAS,wBAAwB,CAAC,UAA8C;AAAA,EACrF,mBAAmB;AAAA;AAGd,SAAS,mBAAmB,GAAiC;AAAA,EAClE,OAAO;AAAA;AAoBT,SAAS,kBAAqB,CAC5B,MACA,KACA,YAC6B;AAAA,EAK7B,MAAM,aAAa,kBAAkB,GAAG;AAAA,EACxC,OAAO,YAAY;AAAA,IAGjB;AAAA,IACA,IAAI,aAAoC;AAAA,IACxC,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,MAAM,SAAS,KAAK,QAAQ;AAAA,MAI5B;AAAA,MACA,MAAM,cAAc;AAAA,MACpB,IAAI;AAAA,MACJ,IAAI,QAAQ;AAAA,QAMV,MAAM,mBACJ,aACA,aACA,OAAO,UAAU,CAAC,SAAS,aAAa,CAAC,CAC3C;AAAA,QACA,IAAI,OAAO,UAAU,SAAS;AAAA,UAC5B,aAAa;AAAA,UACb,SAAS;AAAA,QACX,EAAO;AAAA,UAEL,SAAS,MAAM,WAAc,MAAM,YAAY,YAAY,aAAa,CAAC,MAAM;AAAA,YAC7E,aAAa;AAAA,WACd;AAAA;AAAA,MAEL,EAAO;AAAA,QACL,SAAS,MAAM,WAAc,MAAM,YAAY,YAAY,aAAa,CAAC,MAAM;AAAA,UAC7E,aAAa;AAAA,SACd;AAAA;AAAA,MAQH,OAAO;AAAA,MACP,OAAO,KAAK;AAAA,MAIZ,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC9D,sBAAsB,GAAG;AAAA,MACzB,MAAM;AAAA,cACN;AAAA,MAQA,MAAM,cAAc,gBAAgB,MAAM,UAAU;AAAA,MACpD,kBAAkB;AAAA,QAChB;AAAA,QACA,OAAO;AAAA,QACP,IAAI,KAAK,IAAI;AAAA,QACb;AAAA,QACA,kBAAkB,gBAAgB;AAAA,QAClC;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA;AAAA;AAsBP,IAAM,oBAAoB;AAM1B,SAAS,eAAe,CAAC,YAAgC;AAAA,EACvD,MAAM,cAAc;AAAA,EACpB,MAAM,SAAS,MAAK,KAAK,YAAW,OAAO,GAAG,qBAAqB,aAAa,CAAC;AAAA,EACjF,IAAI,MAAM;AAAA,EACV,SAAS,IAAI,EAAG,IAAI,IAAI,KAAK;AAAA,IAC3B,QAAQ,OAAO,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EACtD;AAAA,EACA,OAAO;AAAA;AAiBT,SAAS,iBAAoB,CAAC,YAAwB,YAA2B;AAAA,EAC/E,MAAM,UAAU,OAAO,YAAY,eAAe,QAAQ,MAAM,6BAA6B;AAAA,EAC7F,IAAI,SAAS;AAAA,IACX,OAAO,WAAU,KAAK,WAAU,KAAK,UAAgD,CAAC;AAAA,EACxF;AAAA,EACA,MAAM,QAAQ,gBAAgB,UAAU;AAAA,EACxC,MAAM,QAAQ,WAAU,KAA8B,EAAE,MAAM,CAAC;AAAA,EAC/D,MAAM,SAAS,WAAU,OAAO,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAA+B;AAAA,IAClF,MAAM,SAAS;AAAA,IACf,WAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AAAA,MACrC,EAAE,OAAO,OAAO;AAAA,IAClB;AAAA,GACD;AAAA,EACD,OAAO,WAAU,KAAK,MAAM;AAAA;AAK9B,eAAe,UAAa,CAC1B,MACA,YACA,YACA,aACA,eACuB;AAAA,EACvB,MAAM,cAAc,KAAK,kBAAkB,QAAW,UAAU;AAAA,EAChE,MAAM,SAAS,cACX,MAAM,mBAAmB,WAAW,aAAa,WAAW,IAC5D;AAAA,EACJ,IAAI,QAAQ;AAAA,IACV,cAAc,qBAAqB;AAAA,IACnC,OAAO,KAAK,KAAQ,YAAY,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;AAAA,EAChE;AAAA,EACA,MAAM,SAAS,kBAAkB,YAAY,UAAU;AAAA,EACvD,MAAM,SAAS,KAAK,OAAU,QAAQ,EAAE,OAAO,WAAW,CAAC;AAAA,EAC3D,OAAO,YAAY;AAAA,EACnB,cAAc,qBAAqB;AAAA,EACnC,OAAO;AAAA;AAmET,SAAS,yBAAiE,CAAC,WAAiB;AAAA,EAC1F,UAAU,OAAO,MAAM,CAAC,QAAQ;AAAA,IAC9B,sBAAsB,GAAG;AAAA,GAC1B;AAAA,EACD,OAAO;AAAA;AAgBF,SAAS,UAAkC,CAChD,KACA,cACA,UAA4B,CAAC,GACX;AAAA,EAClB,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,WAAc;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,WAAW,mBAAsB,MAAM,KAAK,YAAY;AAAA,IACxD,iBAAiB,sBAAyB,IAAI;AAAA,IAC9C,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;AAaF,SAAS,qBAAwB,CAC/B,MACmF;AAAA,EACnF,IAAI,CAAC,kBAAkB,CAGvB;AAAA,EACA,OAAO,OAAO,SAAS,QAAQ;AAAA,IAC7B,MAAM,WAAW;AAAA,IACjB,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,SAAS,GAAG;AAAA,MACrB,MAAM;AAAA,MACN;AAAA;AAAA,IAEF,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,IAAI;AAAA,MACF,OAAO,MAAM,KAAK,KAAQ,QAAQ;AAAA,QAChC,iBAAiB,CAAC,SAAS,aAAa;AAAA,MAC1C,CAAC;AAAA,MACD,MAAM;AAAA,MACN;AAAA;AAAA;AAAA;AAaC,SAAS,SAAS,CACvB,KACA,cACA,UAA4B,CAAC,GACC;AAAA,EAC9B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,UAAU,KAAK,cAAc;AAAA,IAC3B,WAAW;AAAA,IACX,WAAW,mBAA4B,MAAM,KAAK,EAAE,MAAM,aAAa,CAAC;AAAA,IACxE,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;AAUK,SAAS,YAAY,CAC1B,KACA,cACA,UAA4B,CAAC,GACC;AAAA,EAC9B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,aAAa,KAAK,cAAc;AAAA,IAC9B,WAAW;AAAA,IACX,WAAW,mBAA+B,MAAM,KAAK,CAAC,CAAC;AAAA,IACvD,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;AAWK,SAAS,SAAY,CAC1B,KACA,cACA,UAA4B,CAAC,GACF;AAAA,EAC3B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,UAAa,KAAK,cAAc;AAAA,IAC9B,WAAW;AAAA,IACX,WAAW,mBAA+B,MAAM,KAAK,EAAE,OAAO,aAAa,CAAC;AAAA,IAC5E,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;;;AOx7BF;AAAA,oBAEE;AAAA;;;ACnBK,IAAM,0BAA0B,KAAK;AAQrC,IAAM,2BAA2B,KAAK;AAetC,SAAS,qBAAqB,CACnC,QACA,MACyB;AAAA,EACzB,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,MAAM,CAAC;AAAA,EACnE,MAAM,OAAO,IAAI,YAAY,SAAS,KAAK;AAAA,EAC3C,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,EACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,EACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,EAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,MAAM,IAAI,YAAY,MAAM;AAAA,EACpC,OAAO;AAAA;AAMF,SAAS,iBAAiB,CAC/B,OAC8D;AAAA,EAC9D,IAAI,MAAM,SAAS;AAAA,IAAG;AAAA,EACtB,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI;AAAA,IAAW;AAAA,EAClC,IAAI;AAAA,IACF,MAAM,SAAS,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAC3D;AAAA,IACA,IAAI,OAAO,SAAS;AAAA,MAAiB;AAAA,IACrC,MAAM,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA,IACzC,OAAO,EAAE,QAAQ,KAAK;AAAA,IACtB,MAAM;AAAA,IACN;AAAA;AAAA;AAOG,SAAS,kBAAkB,CAAC,OAA4B;AAAA,EAC7D,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAC7B,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI;AAAA,IAAW,OAAO;AAAA,EACzC,MAAM,cAAc,MAAM,SAAS,GAAG,IAAI,SAAS;AAAA,EACnD,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,wBAAwB;AAAA,EAChE,OAAO,cAAa,aAAa,MAAM,MAAM;AAAA;AASxC,SAAS,gBAAgB,CAC9B,OACA,IACA,YAAoB,0BACO;AAAA,EAC3B,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,SAAS,SAAS,CAAC;AAAA,EAC7D,MAAM,YAAuC,CAAC;AAAA,EAC9C,SAAS,QAAQ,EAAG,QAAQ,OAAO,SAAS;AAAA,IAC1C,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,MAAM,KAAK,IAAI,QAAQ,WAAW,MAAM,MAAM;AAAA,IACpD,UAAU,KACR,sBAAsB,EAAE,MAAM,iBAAiB,IAAI,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO,GAAG,CAAC,CAC/F;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAKF,SAAS,uBAAuB,CACrC,QACA,OACY;AAAA,EACZ,IAAI,aAAa;AAAA,EACjB,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,6CAA6C,QAAQ,OAAO;AAAA,IAC9E;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AAAA,EACA,MAAM,MAAM,IAAI,WAAW,UAAU;AAAA,EACrC,IAAI,SAAS;AAAA,EACb,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,IAAI,OAAO,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,EAClB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAY,CAAC,UAAsB,QAA4B;AAAA,EACtE,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAChC;AAAA,IAAO,SAAS,IAAI,EAAG,KAAK,SAAS,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChE,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACtC,IAAI,SAAS,IAAI,OAAO,OAAO;AAAA,UAAI;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACA,OAAO;AAAA;;;ADjFT,eAAe,wBAAwB,CACrC,YACA,sBAC4B;AAAA,EAC5B,MAAM,KAAK,YAAY,IAAI;AAAA,EAC3B,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,MAAM,WAAW,SAAS;AAAA,IACnC,MAAM;AAAA,IACN,OAAO,uBAAuB,sBAAsB,EAAE;AAAA;AAAA,EAExD,MAAM,SAAS,eAAe,MAAM;AAAA,EACpC,MAAM,eAAe,iBAAiB,MAAM;AAAA,EAC5C,MAAM,wBAAwB,eAC1B,uBAAuB,cAAc,OAAO,YAAY,OAAO,WAAW,IAC1E;AAAA,EACJ,OAAO;AAAA,IACL;AAAA,IACA,0BAA0B,OAAO;AAAA,IACjC,wBAAwB,OAAO;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AAAA;AAYF,SAAS,sBAAsB,CAC7B,sBACA,IACmB;AAAA,EACnB,OAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AAAA;AAGF,SAAS,cAAc,CAAC,QAAqC;AAAA,EAC3D,MAAM,MAAmB;AAAA,IACvB,YAAY,IAAI;AAAA,IAChB,aAAa,IAAI;AAAA,IACjB,OAAO,IAAI;AAAA,IACX,gBAAgB;AAAA,IAChB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,EAC1B;AAAA,EACA,MAAM,OAAQ,OAAgD,SAAS,KAAK,CAAC;AAAA,EAC7E,WAAW,OAAO,MAAM;AAAA,IACtB,IAAI,CAAC,OAAO,OAAO,QAAQ;AAAA,MAAU;AAAA,IACrC,MAAM,OAAO;AAAA,IACb,WAAW,MAAM,GAAG;AAAA,EACtB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,UAAU,CAAC,MAA+B,KAAwB;AAAA,EACzE,MAAM,KAAK,OAAO,KAAK,KAAK;AAAA,EAC5B,QAAQ,KAAK;AAAA,SACN;AAAA,MACH,IAAI,WAAW,IAAI,IAAI,IAAI;AAAA,MAC3B;AAAA,SACG;AAAA,MACH,IAAI,YAAY,IAAI,IAAI,IAAI;AAAA,MAC5B;AAAA,SACG;AAAA,MACH,IAAI,MAAM,IAAI,IAAI,IAAI;AAAA,MACtB;AAAA,SACG;AAAA,MACH,gBAAgB,MAAM,GAAG;AAAA,MACzB;AAAA,SACG;AAAA,MACH,kBAAkB,MAAM,GAAG;AAAA,MAC3B;AAAA;AAAA;AAIN,SAAS,eAAe,CAAC,MAA+B,KAAwB;AAAA,EAC9E,MAAM,aAAa,KAAK;AAAA,EACxB,IAAI,OAAO,eAAe;AAAA,IAAU,IAAI,iBAAiB;AAAA,EACzD,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK;AAAA,EAChB,IAAI,OAAO,OAAO;AAAA,IAAU,IAAI,2BAA2B;AAAA,EAC3D,IAAI,OAAO,OAAO;AAAA,IAAU,IAAI,yBAAyB;AAAA;AAG3D,SAAS,iBAAiB,CAAC,MAA+B,KAAwB;AAAA,EAIhF,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK;AAAA,EAChB,IAAI,IAAI,6BAA6B,aAAa,OAAO,OAAO,UAAU;AAAA,IACxE,IAAI,2BAA2B;AAAA,EACjC;AAAA,EACA,IAAI,IAAI,2BAA2B,aAAa,OAAO,OAAO,UAAU;AAAA,IACtE,IAAI,yBAAyB;AAAA,EAC/B;AAAA;AAGF,SAAS,gBAAgB,CAAC,QAA0D;AAAA,EAClF,IAAI,OAAO,gBAAgB;AAAA,IACzB,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,cAAc;AAAA,IACpD,IAAI;AAAA,MAAO,OAAO;AAAA,EACpB;AAAA,EACA,WAAW,QAAQ,OAAO,MAAM,OAAO,GAAG;AAAA,IACxC,IAAI,KAAK;AAAA,MAAc,OAAO;AAAA,EAChC;AAAA,EACA;AAAA;AAQF,SAAS,iBAAiB,CAAC,MAazB;AAAA,EACA,MAAM,UAA8C,CAAC;AAAA,EACrD,YAAY,OAAO,aAAa,KAAK,SAAS;AAAA,IAC5C,QAAQ,SAAS,KAAK,SAAS;AAAA,EACjC;AAAA,EACA,OAAO;AAAA,IACL,gBAAgB,KAAK,WAAW;AAAA,IAChC,oBAAoB,KAAK,WAAW;AAAA,IACpC,iBAAiB,KAAK,WAAW;AAAA,IACjC,kBAAkB,KAAK,SAAS,cAAc;AAAA,IAC9C,kBAAkB,KAAK,aAAa;AAAA,IACpC,uBAAuB,KAAK,iBAAiB;AAAA,IAC7C,cAAc,KAAK,eAAe,KAAK,KAAK,aAAa,IAAI;AAAA,IAC7D,WAAW,KAAK,YACZ;AAAA,SACK,KAAK;AAAA,MACR,uBAAuB,KAAK,UAAU,wBAClC,KAAK,KAAK,UAAU,sBAAsB,IAC1C;AAAA,IACN,IACA;AAAA,IACJ,0BAA0B,KAAK,KAAK,yBAAyB;AAAA,IAC7D;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK;AAAA,EACtB;AAAA;AAOF,SAAS,yBAAyB,GAAiC;AAAA,EACjE,OAAO;AAAA,IACL,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,EACzB;AAAA;AAGF,SAAS,sBAAsB,CAC7B,MACA,YACA,aACyD;AAAA,EACzD,MAAM,QAAQ,WAAW,IAAI,OAAO,KAAK,mBAAmB,CAAC;AAAA,EAC7D,MAAM,SAAS,YAAY,IAAI,OAAO,KAAK,oBAAoB,CAAC;AAAA,EAChE,OAAO;AAAA,IACL,oBAAoB,OAAO,QAAQ,oBAAoB,GAAG;AAAA,IAC1D,qBAAqB,OAAO,SAAS,oBAAoB,GAAG;AAAA,IAC5D,OAAO,OAAO,KAAK,YAAY,EAAE;AAAA,IACjC,WAAW,QAAQ,KAAK,YAAY;AAAA,IACpC,WAAW,OAAO,KAAK,gBAAgB,CAAC;AAAA,IACxC,eAAe,OAAO,KAAK,oBAAoB,CAAC;AAAA,EAClD;AAAA;AAMK,IAAM,sBAAsC;AAAA,EACjD,EAAE,MAAM,+BAA+B;AAAA,EACvC,EAAE,MAAM,gCAAgC;AAC1C;AAQO,IAAM,kCAAkC;AAYxC,IAAM,uBAAuB;AAO7B,IAAM,4BAA4B;AA+YzC,SAAS,uBAAuB,GAAuB;AAAA,EACrD,OAAO;AAAA,IACL,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,EAC1B;AAAA;AAAA;AAkEK,MAAM,0BAA0B,gBAAe;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACR;AAAA,EASQ;AAAA,EAIA;AAAA,EAIT;AAAA,EAIS;AAAA,EAOA;AAAA,EAIA;AAAA,EAKA,eAAe,IAAI;AAAA,EAOnB;AAAA,EACA;AAAA,EACA,QAAQ,IAAI;AAAA,EACrB,QAAQ;AAAA,EACR;AAAA,EAMS,8BAA8B,IAAI;AAAA,EAK3C,gBAAgB;AAAA,EAIhB;AAAA,EAKA;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,MAQb,YAAY,GAAa;AAAA,IAC3B,IAAI,KAAK,kBAAkB,WAAW;AAAA,MACpC,OAAO,CAAC,GAAG,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,OAAO,KAAK,WAAW;AAAA,IAC3F;AAAA,IACA,OAAO,CAAC,GAAG,KAAK,UAAU;AAAA;AAAA,EAQpB,YAAY,CAAC,cAA+B;AAAA,IAClD,IAAI,KAAK,kBAAkB,WAAW;AAAA,MACpC,OAAO,KAAK,cAAc,EAAE,WAAW,IAAI,YAAY;AAAA,IACzD;AAAA,IACA,OAAO,KAAK,WAAW,IAAI,YAAY;AAAA;AAAA,EAMzC;AAAA,EAEA,WAAW,CAAC,SAAmC;AAAA,IAC7C,MAAM;AAAA,IACN,KAAK,YAAY,QAAQ;AAAA,IACzB,KAAK,aAAa,QAAQ,cAAc;AAAA,IACxC,KAAK,qBAAqB,QAAQ;AAAA,IAClC,KAAK,sBAAsB,QAAQ,uBAAuB;AAAA,IAC1D,KAAK,mBAAmB,QAAQ,oBAAoB;AAAA,IACpD,KAAK,aAAa,IAAI,IAAI,QAAQ,gBAAgB,CAAC,CAAC;AAAA,IACpD,KAAK,gBAAgB,QAAQ;AAAA,IAC7B,KAAK,8BAA8B,QAAQ,+BAA+B;AAAA,IAC1E,KAAK,mBAAmB,QAAQ,oBAAoB;AAAA,IACpD,KAAK,wBAAwB,QAAQ,iCAAiC;AAAA,IACtE,KAAK,8BACH,QAAQ,+BAA+B;AAAA,IACzC,KAAK,oBAAoB,QAAQ,qBAAqB;AAAA,IACtD,KAAK,yBAAyB,QAAQ,0BAA0B;AAAA,IAChE,KAAK,cAAc,QAAQ;AAAA,IAC3B,MAAM,KAAK,QAAQ,qBAAqB,WAAW;AAAA,IACnD,IAAI,OAAO,OAAO,YAAY;AAAA,MAC5B,MAAM,IAAI,MACR,+MACF;AAAA,IACF;AAAA,IACA,KAAK,wBAAwB;AAAA;AAAA,EAG/B,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK;AAAA;AAAA,EAOd,aAAa,GAAW;AAAA,IACtB,OAAO,KAAK,MAAM;AAAA;AAAA,EAsBpB,oBAAoB,GA4BlB;AAAA,IACA,MAAM,eAAe,KAAK;AAAA,IAC1B,MAAM,iBAAiB,CAAC,GAAG,KAAK,YAAY;AAAA,IAC5C,MAAM,eAAe,IAAI,IAAI,YAAY;AAAA,IACzC,MAAM,WAAW,IAAI;AAAA,IACrB,WAAW,MAAM;AAAA,MAAc,SAAS,IAAI,EAAE;AAAA,IAC9C,WAAW,MAAM;AAAA,MAAgB,SAAS,IAAI,EAAE;AAAA,IAChD,WAAW,MAAM,KAAK,MAAM,KAAK;AAAA,MAAG,SAAS,IAAI,EAAE;AAAA,IACnD,MAAM,QAAwE,CAAC;AAAA,IAC/E,WAAW,UAAU,UAAU;AAAA,MAC7B,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,MAAM,WAAW,KAAK,2BAA2B,MAAM;AAAA,MACvD,MAAM,KAAK;AAAA,QACT;AAAA,QACA,gBAAgB,aAAa,IAAI,MAAM;AAAA,QACvC,qBAAqB,KAAK,aAAa,IAAI,MAAM;AAAA,QAKjD,+BAA+B,SAAS;AAAA,QACxC,wBAAwB;AAAA,QACxB,MAAM,OAAO,kBAAkB,IAAI,IAAI;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,SAAS,KAAK,2BAA2B;AAAA,QACzC,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAWF,gBAAgB,CAAC,cAA4B;AAAA,IAC3C,KAAK,aAAa,IAAI,YAAY;AAAA,IAClC,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,MAAG;AAAA,IAC1C,KAAK,wBAAwB,YAAY;AAAA;AAAA,EAO3C,kBAAkB,CAAC,SAAyB;AAAA,IAC1C,WAAW,gBAAgB,SAAS;AAAA,MAClC,KAAK,aAAa,IAAI,YAAY;AAAA,MAClC,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,QAAG;AAAA,MAC1C,KAAK,wBAAwB,YAAY;AAAA,IAC3C;AAAA;AAAA,EAaM,uBAAuB,CAAC,cAA4B;AAAA,IAC1D,IAAI;AAAA,MACF,KAAK,qBAAqB,YAAY;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,KAAK,4BAA4B,IAAI,cAAc;AAAA,QACjD,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI,YAAY,IAAI;AAAA,MACtB,CAAC;AAAA;AAAA;AAAA,EAUL,cAAc,CAAC,cAA4B;AAAA,IACzC,KAAK,aAAa,OAAO,YAAY;AAAA,IACrC,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY;AAAA,IACxC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,KAAK,SAAS,MAAM;AAAA,IACpB,KAAK,WAAW,MAAM;AAAA,IACtB,KAAK,MAAM,OAAO,YAAY;AAAA;AAAA,EAmBhC,YAAY,CAAC,cAA4B;AAAA,IACvC,IAAI,iBAAiB,KAAK;AAAA,MAAa;AAAA,IACvC,IAAI,KAAK,kBAAkB,WAAW;AAAA,MAIpC,IAAI,KAAK,WAAW,IAAI,YAAY;AAAA,QAAG;AAAA,MACvC,KAAK,WAAW,IAAI,YAAY;AAAA,IAClC;AAAA,IACA,IAAI,CAAC,KAAK,aAAa,IAAI,YAAY;AAAA,MAAG;AAAA,IAC1C,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,MAAG;AAAA,IAC1C,KAAK,wBAAwB,YAAY;AAAA;AAAA,EAmB3C,iBAAiB,GAAS;AAAA,IACxB,WAAW,gBAAgB,KAAK,cAAc;AAAA,MAC5C,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,QAAG;AAAA,MAC1C,KAAK,wBAAwB,YAAY;AAAA,IAC3C;AAAA;AAAA,EAGM,gBAAgB,CAAC,cAA+B;AAAA,IACtD,MAAM,SAAS,KAAK,mBAAmB,YAAY;AAAA,IACnD,KAAK,4BAA4B,IAAI,cAAc;AAAA,MACjD,UAAU,WAAW,YAAY,aAAa;AAAA,MAC9C;AAAA,MACA,OAAO;AAAA,MACP,IAAI,YAAY,IAAI;AAAA,IACtB,CAAC;AAAA,IACD,OAAO,WAAW;AAAA;AAAA,EAiBZ,kBAAkB,CAAC,cAAiE;AAAA,IAC1F,IAAI,iBAAiB,KAAK;AAAA,MAAa,OAAO;AAAA,IAC9C,IAAI,CAAC,KAAK,aAAa,YAAY;AAAA,MAAG,OAAO;AAAA,IAC7C,IAAI,CAAC,KAAK,aAAa,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IACjD,IAAI,KAAK,MAAM,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IAKzC,IAAI,KAAK,eAAe;AAAA,MAAc,OAAO;AAAA,IAC7C;AAAA;AAAA,EAQM,0BAA0B,CAAC,cAA8C;AAAA,IAC/E,MAAM,SAAS,KAAK,4BAA4B,IAAI,YAAY;AAAA,IAChE,IAAI,QAAQ,WAAW;AAAA,MAAe,OAAO;AAAA,IAC7C,MAAM,SAAS,KAAK,mBAAmB,YAAY;AAAA,IACnD,OAAO;AAAA,MACL,UAAU,WAAW,YAAY,aAAa;AAAA,MAC9C;AAAA,MACA,OAAO;AAAA,MACP,IAAI,YAAY,IAAI;AAAA,IACtB;AAAA;AAAA,EAGF,SAAS,GAAkB;AAAA,IACzB,IAAI,KAAK;AAAA,MAAO,OAAO,QAAQ,QAAQ;AAAA,IACvC,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,gBAAgB;AAAA,KACtB;AAAA;AAAA,EAeH,OAAO,CAAC,QAAgB,cAAmC;AAAA,IACzD,KAAK,SAAS;AAAA,IACd,IAAI,iBAAiB,WAAW;AAAA,MAC9B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,KAAK,QAAQ;AAAA,IACb,KAAK,gBAAgB;AAAA,IACrB,KAAK,qBAAqB;AAAA,IAC1B,KAAK,kBAAkB;AAAA;AAAA,EAGzB,UAAU,GAAS;AAAA,IACjB,KAAK,oBAAoB;AAAA,IACzB,KAAK,iBAAiB;AAAA,IACtB,WAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AAAA,MACtC,KAAK,SAAS,MAAM;AAAA,MACpB,KAAK,WAAW,MAAM;AAAA,IACxB;AAAA,IACA,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,QAAQ;AAAA,IACb,KAAK,KAAK,OAAO;AAAA;AAAA,EAgBX,oBAAoB,GAAS;AAAA,IACnC,IAAI,KAAK,kBAAkB;AAAA,MAAW;AAAA,IACtC,IAAI,KAAK,+BAA+B;AAAA,MAAG;AAAA,IAC3C,IAAI,KAAK,2BAA2B;AAAA,MAAW;AAAA,IAC/C,KAAK,yBAAyB,YAAY,MAAM;AAAA,MAC9C,KAAK,iBAAiB;AAAA,MACtB,KAAK,cAAc,YAAY,IAAI;AAAA,MACnC,IAAI;AAAA,QACF,KAAK,kBAAkB;AAAA,QACvB,MAAM;AAAA,OAMP,KAAK,2BAA2B;AAAA;AAAA,EAG7B,mBAAmB,GAAS;AAAA,IAClC,IAAI,KAAK,2BAA2B;AAAA,MAAW;AAAA,IAC/C,cAAc,KAAK,sBAAsB;AAAA,IACzC,KAAK,yBAAyB;AAAA;AAAA,EAQxB,kBAAkB,CAAC,QAAsB;AAAA,IAC/C,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC;AAAA,MAAM;AAAA,IAQX,KAAK,MAAM,OAAO,MAAM;AAAA,IACxB,IAAI;AAAA,MACF,KAAK,SAAS,MAAM;AAAA,MACpB,MAAM;AAAA,IAKR,IAAI;AAAA,MACF,KAAK,WAAW,MAAM;AAAA,MACtB,MAAM;AAAA,IAGR,KAAK,KAAK,qBAAqB,EAAE,OAAoC,CAAC;AAAA;AAAA,EAuBhE,iBAAiB,GAAS;AAAA,IAChC,IAAI,KAAK,0BAA0B;AAAA,MAAG;AAAA,IACtC,IAAI,KAAK,sBAAsB;AAAA,MAAW;AAAA,IAC1C,KAAK,oBAAoB,YAAY,MAAM;AAAA,MACzC,IAAI;AAAA,QACF,KAAK,iBAAiB;AAAA,QACtB,MAAM;AAAA,OAKP,KAAK,sBAAsB;AAAA;AAAA,EAGxB,gBAAgB,GAAS;AAAA,IAC/B,IAAI,KAAK,sBAAsB;AAAA,MAAW;AAAA,IAC1C,cAAc,KAAK,iBAAiB;AAAA,IACpC,KAAK,oBAAoB;AAAA;AAAA,EAGnB,gBAAgB,GAAS;AAAA,IAC/B,MAAM,MAAM,YAAY,IAAI;AAAA,IAC5B,MAAM,UAAU,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,IACrC,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,MAAM,SAAS,KAAK,mBAAmB,MAAM,GAAG;AAAA,MAChD,IAAI,CAAC;AAAA,QAAQ;AAAA,MACb,KAAK,4BAA4B,IAAI,QAAQ;AAAA,QAC3C,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI;AAAA,MACN,CAAC;AAAA,MACD,KAAK,mBAAmB,MAAM;AAAA,IAChC;AAAA;AAAA,EAQM,kBAAkB,CAAC,MAAgB,KAAiC;AAAA,IAC1E,MAAM,QAAQ,KAAK,WAAW;AAAA,IAC9B,MAAM,QAAQ,MAAM,KAAK;AAAA,IACzB,IACE,KAAK,8BAA8B,MAClC,UAAU,SAAS,UAAU,iBAC9B,QAAQ,KAAK,6BACb;AAAA,MACA,OAAO,uCAAuC,gBAAgB,KAAK,MAAM,KAAK;AAAA,IAChF;AAAA,IACA,IACE,KAAK,oBAAoB,KACzB,UAAU,eACV,KAAK,SAAS,eAAe,QAC7B;AAAA,MACA,MAAM,cAAc,KAAK,iBAAiB,KAAK;AAAA,MAC/C,MAAM,SAAS,MAAM;AAAA,MACrB,IAAI,SAAS,KAAK,mBAAmB;AAAA,QACnC,OAAO,mCAAmC,KAAK,MAAM,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,IACA;AAAA;AAAA,EASF,IAAI,CAAC,SAAwB;AAAA,IAC3B,MAAM,WAAW,QAAQ;AAAA,IACzB,MAAM,QAAQ,KAAK,iBAAiB,OAAO;AAAA,IAC3C,IAAI,OAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,IAClC,IAAI,CAAC,MAAM;AAAA,MACT,OAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC3C;AAAA,IACA,IAAI,KAAK,yBAAyB,wBAAwB,WAAW;AAAA,MACnE,KAAK,yBAAyB,sBAAsB,YAAY,IAAI;AAAA,IACtE;AAAA,IASA,MAAM,aAAc,QAA+C;AAAA,IACnE,IAAI,OAAO,eAAe,UAAU;AAAA,MAClC,IAAI,cAAc,KAAK,QAAQ,IAAI,UAAU;AAAA,MAC7C,IAAI,CAAC,aAAa;AAAA,QAChB,cAAc,wBAAwB;AAAA,QACtC,KAAK,QAAQ,IAAI,YAAY,WAAW;AAAA,MAC1C;AAAA,MACA,YAAY,uBAAuB,YAAY,IAAI;AAAA,MACnD,YAAY,yBAAyB,MAAM;AAAA,MAC3C,YAAY,yBACV,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAAA,IACtD;AAAA,IACA,IAAI,KAAK,WAAW,KAAK,QAAQ,eAAe,QAAQ;AAAA,MACjD,KAAK,yBAAyB,KAAK,SAAS,KAAK;AAAA,IACxD,EAAO;AAAA,MACL,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA;AAAA,SAWR,+BAA+B;AAAA,OAkBzC,yBAAwB,CACpC,SACA,OACe;AAAA,IACf,IAAI,MAAM,UAAU,yBAAyB;AAAA,MAC3C,QAAQ,KAAK,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,MAAM,KAAK,OAAO,WAAW;AAAA,IAC7B,MAAM,YAAY,iBAAiB,OAAO,IAAI,KAAK,qBAAqB;AAAA,IACxE,IAAI,CAAC,KAAK,kBAAkB;AAAA,MAC1B,WAAW,YAAY,WAAW;AAAA,QAChC,QAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,IAAI;AAAA,IACR,WAAW,YAAY,WAAW;AAAA,MAChC,QAAQ,KAAK,QAAQ;AAAA,MACrB,KAAK;AAAA,MACL,IAAI,IAAI,kBAAkB,iCAAiC,KAAK,IAAI,UAAU,QAAQ;AAAA,QACpF,MAAM,IAAI,QAAc,CAAC,YAAY;AAAA,UACnC,WAAW,SAAS,CAAC;AAAA,SACtB;AAAA,MACH;AAAA,IACF;AAAA;AAAA,EAWF,YAAY,CAAC,YAAoB,YAA2B;AAAA,IAC1D,MAAM,UAAU;AAAA,IAChB,IAAI,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,UAAU,UAAU;AAAA,MACnE;AAAA,IACF;AAAA,IACA,QAAQ,QAAQ;AAAA,WACT;AAAA,QACE,KAAK,YAAY,YAAY,QAAQ,GAAG;AAAA,QAC7C;AAAA,WACG;AAAA,QACE,KAAK,aAAa,YAAY,QAAQ,GAAG;AAAA,QAC9C;AAAA,WACG;AAAA,QACE,KAAK,mBAAmB,YAAY,QAAQ,SAAS;AAAA,QAC1D;AAAA;AAAA;AAAA,EAOE,qBAAqB,GAAqB;AAAA,IAChD,MAAM,SAA2B,EAAE,YAAY,KAAK,WAAW;AAAA,IAC/D,IAAI,KAAK,uBAAuB,WAAW;AAAA,MACzC,OAAO,qBAAqB,KAAK;AAAA,IACnC;AAAA,IACA,OAAO;AAAA;AAAA,EAkBD,oBAAoB,CAAC,MAAoC;AAAA,IAC/D,MAAM,eAAe,KAAK,aAAa;AAAA,IACvC,MAAM,IAAI,aAAa,MAAM,gBAAgB;AAAA,IAC7C,OAAO,IAAI,IAAI,YAAY,MAAM;AAAA;AAAA,EAG3B,mBAAmB,CAAC,WAAqC;AAAA,IAC/D,IAAI,CAAC,KAAK;AAAA,MAAqB,OAAO;AAAA,IACtC,IAAI,KAAK,uBAAuB;AAAA,MAAS,OAAO;AAAA,IAChD,MAAM,QAAS,UAA2C;AAAA,IAC1D,MAAM,QAAQ,UAAU,UAAU,MAAM,gBAAgB;AAAA,IACxD,MAAM,iBAAiB,SAAS,QAAQ,MAAM,IAAI,YAAY;AAAA,IAC9D,OAAO,kBAAkB;AAAA;AAAA,EAWnB,2BAA2B,CAAC,KAA6C;AAAA,IAC/E,IAAI,CAAC,KAAK;AAAA,MAAqB,OAAO;AAAA,IACtC,IAAI,KAAK,uBAAuB;AAAA,MAAS,OAAO;AAAA,IAChD,IAAI,CAAC;AAAA,MAAK,OAAO;AAAA,IACjB,MAAM,QAAQ,IAAI,MAAM,OAAO;AAAA,IAC/B,MAAM,WAAqB,CAAC;AAAA,IAC5B,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,CAAC,KAAK,WAAW,cAAc,GAAG;AAAA,QACpC,SAAS,KAAK,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,MACA,MAAM,IAAI,KAAK,MAAM,gBAAgB;AAAA,MACrC,IAAI,IAAI,IAAI,YAAY,MAAM;AAAA,QAAS,SAAS,KAAK,IAAI;AAAA,IAC3D;AAAA,IACA,OAAO,SAAS,KAAK;AAAA,CAAM;AAAA;AAAA,EAUrB,oBAAoB,CAAC,aAAmE;AAAA,IAC9F,IAAI,CAAC,KAAK;AAAA,MAAqB,OAAO;AAAA,IACtC,IAAI,KAAK,uBAAuB;AAAA,MAAS,OAAO;AAAA,IAChD,MAAM,WAAW,KAAK,4BAA4B,YAAY,GAAG;AAAA,IACjE,IAAI,aAAa,YAAY;AAAA,MAAK,OAAO;AAAA,IACzC,OAAO,KAAK,aAAa,KAAK,SAAS;AAAA;AAAA,EAGjC,oBAAoB,CAAC,UAA4B;AAAA,IACvD,MAAM,aAAa,IAAI,KAAK,sBAAsB,KAAK,sBAAsB,CAAC;AAAA,IAC9E,MAAM,UAAU,WAAW,kBAAkB,KAAK,kBAAkB,EAAE,SAAS,KAAK,CAAC;AAAA,IACrF,MAAM,OAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf,kBAAkB,IAAI;AAAA,MACtB,kBAAkB,CAAC;AAAA,MACnB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,0BAA0B,0BAA0B;AAAA,MACpD,SAAS,IAAI;AAAA,MACb,WAAW,YAAY,IAAI;AAAA,MAC3B,eAAe;AAAA,IACjB;AAAA,IACA,KAAK,MAAM,IAAI,UAAU,IAAI;AAAA,IAC7B,KAAK,eAAe,UAAU,UAAU;AAAA,IACxC,KAAK,gBAAgB,UAAU,OAAO;AAAA,IAOtC,KAAK,cAAc,UAAU,UAAU,EAAE,MAAM,CAAC,QAAQ;AAAA,MACtD,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,KAAK,4BAA4B,IAAI,UAAU;AAAA,QAC7C,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI,YAAY,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,KAAK,mBAAmB,QAAQ;AAAA,KACjC;AAAA,IACD,OAAO;AAAA;AAAA,OAGK,cAAa,CAAC,UAAkB,YAA8C;AAAA,IAC1F,MAAM,QAAQ,MAAM,WAAW,YAAY;AAAA,IAC3C,MAAM,WAAW,oBAAoB,KAAK;AAAA,IAC1C,MAAM,aAAa,WAAW,oBAAoB;AAAA,IAClD,MAAM,YAAY,KAAK,qBAAqB;AAAA,MAC1C,MAAM,WAAW;AAAA,MACjB,KAAK,WAAW,OAAO,MAAM;AAAA,IAC/B,CAAC;AAAA,IACD,KAAK,UAAU,WAAW,UAAU;AAAA,MAClC,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAA4B;AAAA;AAAA,OAGhB,YAAW,CAAC,YAAoB,KAA+C;AAAA,IAC3F,MAAM,WAAW,KAAK,MAAM,IAAI,UAAU;AAAA,IAC1C,IAAI,UAAU;AAAA,MAKZ,MAAM,UAAU,KAAK;AAAA,MACrB,IAAI,UAAU,YAAY;AAAA,QACxB;AAAA,MACF;AAAA,MACA,SAAS,SAAS,MAAM;AAAA,MACxB,SAAS,WAAW,MAAM;AAAA,MAC1B,KAAK,MAAM,OAAO,UAAU;AAAA,IAC9B;AAAA,IAEA,MAAM,aAAa,IAAI,KAAK,sBAAsB,KAAK,sBAAsB,CAAC;AAAA,IAC9E,MAAM,OAAiB;AAAA,MACrB;AAAA,MACA,SAAS;AAAA,MACT,cAAc,CAAC;AAAA,MACf,kBAAkB,IAAI;AAAA,MACtB,kBAAkB,CAAC;AAAA,MACnB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,0BAA0B,0BAA0B;AAAA,MACpD,SAAS,IAAI;AAAA,MACb,WAAW,YAAY,IAAI;AAAA,MAC3B,eAAe;AAAA,IACjB;AAAA,IACA,KAAK,MAAM,IAAI,YAAY,IAAI;AAAA,IAC/B,KAAK,eAAe,YAAY,UAAU;AAAA,IAC1C,WAAW,gBAAgB,CAAC,UAAU;AAAA,MACpC,KAAK,UAAU,MAAM;AAAA,MACrB,KAAK,gBAAgB,YAAY,MAAM,OAAO;AAAA;AAAA,IAEhD,MAAM,WAAW,qBAAqB,KAAK,qBAAqB,GAAG,CAAC;AAAA,IACpE,MAAM,KAAK,sBAAsB,IAAI;AAAA,IACrC,MAAM,SAAS,MAAM,WAAW,aAAa;AAAA,IAC7C,MAAM,WAAW,oBAAoB,MAAM;AAAA,IAC3C,MAAM,cAAc,WAAW,oBAAoB;AAAA,IACnD,MAAM,YAAY,KAAK,qBAAqB;AAAA,MAC1C,MAAM,YAAY;AAAA,MAClB,KAAK,YAAY,OAAO,OAAO;AAAA,IACjC,CAAC;AAAA,IACD,KAAK,UAAU,WAAW,YAAY;AAAA,MACpC,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAA4B;AAAA;AAAA,OAGhB,aAAY,CAAC,YAAoB,KAA+C;AAAA,IAC5F,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IAOX,IAAI,KAAK,WAAW,mBAAmB;AAAA,MAAoB;AAAA,IAC3D,MAAM,KAAK,WAAW,qBAAqB,KAAK,qBAAqB,GAAG,CAAC;AAAA,IACzE,MAAM,KAAK,sBAAsB,IAAI;AAAA;AAAA,OAGzB,mBAAkB,CAC9B,YACA,WACe;AAAA,IACf,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IAMX,IACE,KAAK,uBACL,KAAK,uBAAuB,WAC5B,CAAC,KAAK,qBAAqB,SAAS;AAAA,MAEpC;AAAA,IAOF,IAAI,KAAK,WAAW,sBAAsB,MAAM;AAAA,MAC9C,KAAK,iBAAiB,KAAK,SAAS;AAAA,MACpC;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MACF,MAAM,KAAK,WAAW,gBAAgB,SAAS;AAAA,MAC/C,MAAM;AAAA;AAAA,OAUI,sBAAqB,CAAC,MAA+B;AAAA,IACjE,IAAI,KAAK,iBAAiB,WAAW;AAAA,MAAG;AAAA,IACxC,MAAM,SAAS,KAAK;AAAA,IACpB,KAAK,mBAAmB,CAAC;AAAA,IACzB,WAAW,aAAa,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,KAAK,WAAW,gBAAgB,SAAS;AAAA,QAC/C,MAAM;AAAA,IAGV;AAAA;AAAA,EAGM,cAAc,CAAC,QAAgB,YAAqC;AAAA,IAC1E,WAAW,iBAAiB,CAAC,UAAU;AAAA,MACrC,IAAI,CAAC,MAAM;AAAA,QAAW;AAAA,MACtB,IAAI,CAAC,KAAK,oBAAoB,MAAM,SAAS;AAAA,QAAG;AAAA,MAChD,KAAK,UAAU,WAAW,QAAQ;AAAA,QAChC,MAAM;AAAA,QACN,WAAW,MAAM,UAAU,OAAO;AAAA,MACpC,CAA4B;AAAA;AAAA,IAE9B,WAAW,0BAA0B,MAAM;AAAA,MACzC,MAAM,QAAQ,WAAW;AAAA,MACzB,IAAI,UAAU,aAAa;AAAA,QACzB,KAAK,sBAAsB,MAAM;AAAA,MACnC,EAAO,SAAI,UAAU,kBAAkB,UAAU,YAAY,UAAU,UAAU;AAAA,QAM/E,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM;AAAA,UAAG;AAAA,QAC7B,KAAK,MAAM,OAAO,MAAM;AAAA,QACxB,KAAK,KAAK,qBAAqB,EAAE,OAAoC,CAAC;AAAA,MACxE;AAAA;AAAA;AAAA,EAgBI,qBAAqB,CAAC,QAAsB;AAAA,IAClD,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI,KAAK,yBAAyB,2BAA2B;AAAA,MAAW;AAAA,IACxE,KAAK,yBAAyB,yBAAyB,YAAY,IAAI;AAAA,IACvE,KAAK,KAAK,kBAAkB;AAAA,MAC1B;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EAGK,eAAe,CAAC,QAAgB,SAA+B;AAAA,IACrE,QAAQ,SAAS,MAAM;AAAA,MACrB,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,KAAK,yBAAyB,sBAAsB,YAAY,IAAI;AAAA,MAQpE,KAAK,sBAAsB,MAAM;AAAA,MAIjC,WAAW,SAAS,KAAK,cAAc;AAAA,QAChC,KAAK,yBAAyB,SAAS,KAAK;AAAA,MACnD;AAAA,MACA,KAAK,eAAe,CAAC;AAAA;AAAA,IAEvB,QAAQ,YAAY,CAAC,UAAU;AAAA,MAS7B,MAAM,WAAW,KAAK,MAAM,IAAI,MAAM;AAAA,MACtC,IAAI;AAAA,QAAU,SAAS,gBAAgB,YAAY,IAAI;AAAA,MACvD,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI,gBAAgB,aAAa;AAAA,QAC/B,KAAK,gBAAgB,QAAQ,IAAI,WAAW,IAAI,CAAC;AAAA,MACnD,EAAO,SAAI,gBAAgB,YAAY;AAAA,QACrC,KAAK,gBAAgB,QAAQ,IAAI;AAAA,MACnC;AAAA;AAAA,IAIF,QAAQ,UAAU,MAAM;AAAA,MACtB,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,MAAM,YAAY,SAAS;AAAA,QAC7B,KAAK,UAAU;AAAA,MACjB;AAAA;AAAA,IAOF,QAAQ,UAAU,CAAC,UAAU;AAAA,MAC3B,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,UACJ,OAAO,GAAG,OAAO,YAAY,WACzB,GAAG,MAAM,UACT,OAAO,GAAG,YAAY,WACpB,GAAG,UACH;AAAA,MACR,KAAK,uBAAuB;AAAA;AAAA;AAAA,OAa1B,sBAAqB,CAAC,QAAwD;AAAA,IAClF,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,MAAM,WAAW,MAAM,yBAAyB,KAAK,YAAY,KAAK,oBAAoB;AAAA,IAC1F,KAAK,YAAY;AAAA,IACjB,OAAO;AAAA;AAAA,OAOH,yBAAwB,GAA4C;AAAA,IACxE,MAAM,MAAM,IAAI;AAAA,IAChB,MAAM,UAAU,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,IACrC,MAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,OAAO,KAAK,sBAAsB,EAAE,CAAC,CAAC;AAAA,IACrF,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAAA,MAC1C,MAAM,IAAI,QAAQ;AAAA,MAClB,MAAM,KAAK,QAAQ;AAAA,MACnB,IAAI,KAAK,OAAO;AAAA,QAAW,IAAI,IAAI,IAAI,CAAC;AAAA,IAC1C;AAAA,IACA,OAAO;AAAA;AAAA,EAGD,eAAe,CAAC,YAAoB,OAAyB;AAAA,IACnE,IAAI;AAAA,MAMF,IAAI,mBAAmB,KAAK,GAAG;AAAA,QAC7B,KAAK,mBAAmB,YAAY,KAAK;AAAA,QACzC;AAAA,MACF;AAAA,MAIA,IAAI,KAAK,iBAAiB,kBAAkB,KAAK,GAAG;AAAA,QAClD,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,QAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,QACzC,MAAM,SAAS,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAC3D;AAAA,QACA,MAAM,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA,QACzC,KAAK,cAAc,YAAY,QAAQ,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,MACA,MAAM,UAAU,KAAK,mBAAmB,KAAK;AAAA,MAC7C,KAAK,oBAAoB,YAAY,SAAS,KAAK;AAAA,MACnD,MAAM;AAAA;AAAA,EAqBF,mBAAmB,CACzB,YACA,SACA,iBACM;AAAA,IACN,KAAK,yBAAyB,UAAU;AAAA,IACxC,KAAK,mBAAmB,YAAY,OAAO;AAAA,IAC3C,IAAI,CAAC,KAAK,kBAAkB;AAAA,MAC1B,KAAK,KAAK,WAAW,OAAO;AAAA,MAC5B,IAAI,iBAAiB;AAAA,QACnB,KAAK,wBAAwB,UAAU;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,iBAAiB;AAAA,MACnB,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,MACtC,IAAI,MAAM,cAAc;AAAA,QACtB,KAAK,aAAa,gBAAgB;AAAA,MACpC;AAAA,IACF;AAAA,IACA,WAAW,MAAM;AAAA,MACf,IAAI;AAAA,QACF,KAAK,KAAK,WAAW,OAAO;AAAA,gBAC5B;AAAA,QACA,IAAI,iBAAiB;AAAA,UACnB,KAAK,wBAAwB,UAAU;AAAA,QACzC;AAAA;AAAA,OAED,CAAC;AAAA;AAAA,EAOE,wBAAwB,CAAC,YAA0B;AAAA,IACzD,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI,KAAK,yBAAyB,0BAA0B;AAAA,MAAW;AAAA,IACvE,KAAK,yBAAyB,wBAAwB,YAAY,IAAI;AAAA;AAAA,EAMhE,kBAAkB,CAAC,YAAoB,SAAwB;AAAA,IACrE,MAAM,aAAc,QAA+C;AAAA,IACnE,IAAI,OAAO,eAAe;AAAA,MAAU;AAAA,IACpC,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI,QAAQ,KAAK,QAAQ,IAAI,UAAU;AAAA,IACvC,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,wBAAwB;AAAA,MAChC,KAAK,QAAQ,IAAI,YAAY,KAAK;AAAA,IACpC;AAAA,IACA,MAAM,sBAAsB,YAAY,IAAI;AAAA;AAAA,EAGtC,uBAAuB,CAAC,YAA0B;AAAA,IACxD,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC,MAAM;AAAA,MAAc;AAAA,IACzB,KAAK,aAAa,eAAe,KAAK,IAAI,GAAG,KAAK,aAAa,eAAe,CAAC;AAAA,IAC/E,KAAK,iBAAiB,YAAY,oBAAoB,CAAC;AAAA,IACvD,IAAI,KAAK,aAAa,iBAAiB,KAAK,KAAK,iBAAiB,SAAS,GAAG;AAAA,MAC5E,KAAK,eAAe;AAAA,IACtB;AAAA;AAAA,EAGM,gBAAgB,CACtB,YACA,MACA,YACM;AAAA,IACN,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,MAAM,eAAe,MAAM;AAAA,IAMzB,KAGA,KAAK,iBAAiB;AAAA,MACtB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,gBAAgB,cAAc,kBAAkB;AAAA,MAChD,eAAe,cAAc,iBAAiB;AAAA,MAC9C,cAAc,cAAc,gBAAgB;AAAA,MAC5C,IAAI,YAAY,IAAI;AAAA,IACtB,CAAC;AAAA;AAAA,EAGK,kBAAkB,CAAC,YAAoB,OAAyB;AAAA,IACtE,MAAM,SAAS,kBAAkB,KAAK;AAAA,IACtC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,QAAQ,QAAQ,SAAS;AAAA,IACzB,IAAI,QAAQ,KAAK,iBAAiB,IAAI,OAAO,EAAE;AAAA,IAC/C,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,EAAE,QAAQ,IAAI,KAAO,OAAO,OAAO,MAAM;AAAA,MACjD,KAAK,iBAAiB,IAAI,OAAO,IAAI,KAAK;AAAA,IAC5C;AAAA,IAIA,MAAM,OAAO,IAAI,OAAO,OAAO,KAAK,MAAM,CAAC;AAAA,IAC3C,IAAI,CAAC,KAAK,cAAc;AAAA,MACtB,KAAK,eAAe;AAAA,QAClB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,aAAa,YAAY,IAAI;AAAA,QAC7B,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA,KAAK,aAAa,kBAAkB;AAAA,IACpC,KAAK,aAAa,iBAAiB,KAAK;AAAA,IACxC,KAAK,aAAa,cAAc,YAAY,IAAI;AAAA,IAChD,KAAK,iBAAiB,YAAY,qBAAqB,KAAK,UAAU;AAAA,IACtE,IAAI,MAAM,OAAO,OAAO,MAAM;AAAA,MAAO;AAAA,IACrC,KAAK,iBAAiB,OAAO,OAAO,EAAE;AAAA,IACtC,MAAM,cAAc,wBAAwB,MAAM,QAAQ,MAAM,KAAK;AAAA,IACrE,IAAI,CAAC,KAAK,kBAAkB;AAAA,MAC1B,KAAK,oBAAoB,YAAY,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,IACA,WAAW,MAAM;AAAA,MACf,KAAK,oBAAoB,YAAY,WAAW;AAAA,OAC/C,CAAC;AAAA;AAAA,EASE,mBAAmB,CAAC,YAAoB,OAAyB;AAAA,IACvE,IAAI;AAAA,MACF,IAAI,KAAK,iBAAiB,kBAAkB,KAAK,GAAG;AAAA,QAClD,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,QAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,QACzC,MAAM,SAAS,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAC3D;AAAA,QACA,MAAM,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA,QACzC,KAAK,cAAc,YAAY,QAAQ,IAAI;AAAA,QAC3C,KAAK,wBAAwB,UAAU;AAAA,QACvC;AAAA,MACF;AAAA,MACA,MAAM,UAAU,KAAK,mBAAmB,KAAK;AAAA,MAC7C,KAAK,oBAAoB,YAAY,SAAS,IAAI;AAAA,MAClD,MAAM;AAAA,MAGN,KAAK,wBAAwB,UAAU;AAAA;AAAA;AAAA,MAKvC,gBAAgB,GAAa;AAAA,IAC/B,MAAM,MAAgB,CAAC;AAAA,IACvB,YAAY,QAAQ,SAAS,KAAK,OAAO;AAAA,MACvC,IAAI,KAAK,WAAW,KAAK,QAAQ,eAAe,QAAQ;AAAA,QACtD,IAAI,KAAK,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAMT,eAAe,CAAC,QAAgB,OAAyC;AAAA,IACvE,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC,MAAM,WAAW,KAAK,QAAQ,eAAe;AAAA,MAAQ,OAAO;AAAA,IACjE,OAAO,KAAK,iBAAiB,KAAK,SAAS,KAAK;AAAA;AAAA,EAK1C,gBAAgB,CAAC,SAAyB,OAAyC;AAAA,IAEzF,IAAI,QAAQ,iBAAiB,MAAM;AAAA,MAAM,OAAO;AAAA,IAChD,QAAQ,KAAK,KAAK;AAAA,IAClB,OAAO;AAAA;AAAA,EASD,gBAAgB,CAAC,SAA2C;AAAA,IAClE,MAAM,YAAqC;AAAA,MACzC,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA,IAAI,gBAAgB,WAAW,QAAQ,eAAe,WAAW;AAAA,MAC/D,UAAU,gBAAgB,QAAQ;AAAA,IACpC;AAAA,IACA,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,SAAS,CAAC;AAAA,IACtE,MAAM,YACJ,UAAU,WAAW,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,IAAI,WAAW,CAAC;AAAA,IAC3F,MAAM,OAAO,IAAI,YAAY,SAAS,UAAU;AAAA,IAChD,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,IACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,IACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,IAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,IAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,IACtB,IAAI,IAAI,WAAW,IAAI,YAAY,MAAM;AAAA,IACzC,OAAO;AAAA;AAAA,EAID,kBAAkB,CAAC,OAA4B;AAAA,IACrD,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,MAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAAA,IACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,IAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,IACzC,IAAI,MAAM,SAAS,IAAI,WAAW;AAAA,MAChC,MAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,IACA,MAAM,SAAS,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAAA,IACpF,MAAM,OAAO,MAAM,MAAM,IAAI,SAAS;AAAA,IACtC,OAAO,KAAK,QAAQ,KAAK;AAAA;AAE7B;;;AErlEO,IAAM,4BAA4B;AAGlC,IAAM,mBAAmB,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC;AAAA;AAwBhE,MAAM,wBAAwB,MAAM;AAAA,EAChC;AAAA,EAST,WAAW,CAAC,SAAiB,MAA+B;AAAA,IAC1D,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAsBO,SAAS,gBAAgB,CAAC,SAAoD;AAAA,EACnF,MAAM,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI;AAAA,EACnD,OAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,QAAQ;AAAA,IACtB,eAAe,QAAQ;AAAA,IACvB,UAAU;AAAA,OACN,QAAQ,WAAW,YAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,EACnE;AAAA;AASK,SAAS,eAAe,CAAC,QAA0B,SAA4B;AAAA,EACpF,QAAQ,aAAa,IAAI,OAAO,aAAa;AAAA;AAUxC,SAAS,iBAAiB,CAAC,QAAgB,SAA4B;AAAA,EAC5E,QAAQ,aAAa,IAAI,MAAM;AAAA;AAmB1B,SAAS,0BAA0B,CAAC,QAAsC;AAAA,EAC/E,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,OAAO,YAAY;AAAA,EAChE,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,OAAO,aAAa;AAAA,EAClE,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,OAAO,UAAU,EAAE;AAAA,EAEhE,MAAM,QACJ,iBAAiB,SACjB,IACA,IACA,YAAY,SACZ,IACA,aAAa,SACb,IACA,IACA,YAAY;AAAA,EAEd,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,IAAI,SAAS;AAAA,EAEb,IAAI,IAAI,kBAAkB,MAAM;AAAA,EAChC,UAAU,iBAAiB;AAAA,EAE3B,IAAI,UAAU,OAAO;AAAA,EACrB,UAAU;AAAA,EAEV,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAC3B,UAAU,YAAY;AAAA,EAEtB,KAAK,UAAU,QAAQ,aAAa,QAAQ,KAAK;AAAA,EACjD,UAAU;AAAA,EACV,IAAI,IAAI,cAAc,MAAM;AAAA,EAC5B,UAAU,aAAa;AAAA,EAEvB,KAAK,aAAa,QAAQ,OAAO,OAAO,QAAQ,GAAG,KAAK;AAAA,EACxD,UAAU;AAAA,EAEV,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAE3B,OAAO;AAAA;AAIT,SAAS,sBAAsB,CAAC,OAAqC;AAAA,EACnE,IAAI,SAAS;AAAA,EAEb,IAAI,MAAM,SAAS,iBAAiB,QAAQ;AAAA,IAC1C,MAAM,IAAI,gBAAgB,0CAA0C,WAAW;AAAA,EACjF;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,iBAAiB,QAAQ,KAAK;AAAA,IAChD,IAAI,MAAM,SAAS,OAAO,iBAAiB,IAAI;AAAA,MAC7C,MAAM,IAAI,gBAAgB,qCAAqC,aAAa;AAAA,IAC9E;AAAA,EACF;AAAA,EACA,UAAU,iBAAiB;AAAA,EAE3B,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,2CAA2C,WAAW;AAAA,EAClF;AAAA,EACA,MAAM,UAAU,MAAM;AAAA,EACtB,UAAU;AAAA,EACV,IAAI,YAAY,2BAA2B;AAAA,IACzC,MAAM,IAAI,gBAAgB,sCAAsC,YAAY,iBAAiB;AAAA,EAC/F;AAAA,EAEA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAE1E,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,iDAAiD,WAAW;AAAA,EACxF;AAAA,EACA,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,gBAAgB,6CAA6C,WAAW;AAAA,EACpF;AAAA,EACA,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EACxF,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,qDAAqD,WAAW;AAAA,EAC5F;AAAA,EACA,MAAM,aAAa,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC/C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,YAAY;AAAA,IACtC,MAAM,IAAI,gBAAgB,8CAA8C,WAAW;AAAA,EACrF;AAAA,EACA,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,UAAU,CAAC;AAAA,EAC1F,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,4CAA4C,WAAW;AAAA,EACnF;AAAA,EACA,MAAM,WAAW,OAAO,KAAK,aAAa,QAAQ,KAAK,CAAC;AAAA,EACxD,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,iDAAiD,WAAW;AAAA,EACxF;AAAA,EACA,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,gBAAgB,0CAA0C,WAAW;AAAA,EACjF;AAAA,EACA,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EAClF,UAAU;AAAA,EAEV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,OACI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AAAA;AAQK,SAAS,gBAAgB,CAAC,QAA0B,QAAoC;AAAA,EAC7F,MAAM,UAAU,2BAA2B,MAAM;AAAA,EACjD,MAAM,WAAW,aAAa,SAAS,OAAO,cAAc,OAAO,SAAS;AAAA,EAC5E,OAAO,qBAAqB,QAAQ;AAAA;AAmB/B,SAAS,gBAAgB,CAAC,OAAmB,SAAwC;AAAA,EAC1F,MAAM,WAAW,qBAAqB,KAAK;AAAA,EAC3C,MAAM,YAAY,QAAQ,WAAW,IAAI,SAAS,QAAQ;AAAA,EAC1D,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,gBACR,qBAAqB,SAAS,yCAC9B,gBACF;AAAA,EACF;AAAA,EACA,IACE,QAAQ,wBAAwB,aAChC,QAAQ,oBAAoB,OAAO,KACnC,CAAC,QAAQ,oBAAoB,IAAI,SAAS,QAAQ,GAClD;AAAA,IACA,MAAM,IAAI,gBACR,qBAAqB,SAAS,8DAC9B,qBACF;AAAA,EACF;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,eAAe,cAAmB,UAAU,SAAS;AAAA,IACrD,MAAM;AAAA,IACN,MAAM,IAAI,gBACR,uDAAuD,SAAS,aAChE,mBACF;AAAA;AAAA,EAGF,MAAM,SAAS,uBAAuB,YAAY;AAAA,EAGlD,IAAI,OAAO,iBAAiB,SAAS,UAAU;AAAA,IAC7C,MAAM,IAAI,gBACR,oCAAoC,OAAO,+CAA+C,SAAS,aACnG,sBACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;AC7SF,SAAS,uBAAuB,CACrC,SACY;AAAA,EACZ,MAAM,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK,qBAAqB;AAAA,EACtD,MAAM,OAAO,KAAK,UAChB,OAAO,IAAI,CAAC,WAAW;AAAA,IACrB,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,EACX,EAAE,CACJ;AAAA,EACA,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA;AAQ/B,SAAS,uBAAuB,CAAC,OAA6C;AAAA,EACnF,MAAM,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,EAC3C,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,KAAK,MAAM,IAAI;AAAA,IACrB,OAAO,KAAK;AAAA,IACZ,MAAM,IAAI,MACR,0CAA0C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAC3F;AAAA;AAAA,EAEF,IAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AAAA,IACvB,MAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAAA,EACA,OAAO,IAAI,IAAI,CAAC,MAAM,UAAkC;AAAA,IACtD,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,MACrC,MAAM,IAAI,MAAM,kCAAkC,wBAAwB;AAAA,IAC5E;AAAA,IACA,MAAM,IAAI;AAAA,IACV,IAAI,OAAO,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,UAAU;AAAA,MACjF,MAAM,IAAI,MAAM,kCAAkC,yCAAyC;AAAA,IAC7F;AAAA,IACA,OAAO,EAAE,eAAe,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,EAAE;AAAA,GAC/D;AAAA;AAGH,SAAS,qBAAqB,CAAC,GAA2B,GAAmC;AAAA,EAC3F,IAAI,EAAE,kBAAkB,EAAE,eAAe;AAAA,IACvC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,KAAK;AAAA,EAClD;AAAA,EACA,IAAI,EAAE,iBAAiB,EAAE,cAAc;AAAA,IACrC,OAAO,EAAE,eAAe,EAAE,eAAe,KAAK;AAAA,EAChD;AAAA,EACA,OAAO,EAAE,WAAW,EAAE;AAAA;;;AfuGxB,eAAsB,iBAAiB,CACrC,KACqC;AAAA,EACrC,IAAI,KAAK,uBAAuB;AAAA,IAC9B,OAAO,IAAI,sBAAsB;AAAA,EACnC;AAAA,EACA,OAAO,KAAK;AAAA;AAOd,SAAS,gBAAgB,CACvB,OACA,MAQA,eAC0B;AAAA,EAC1B,OAAO;AAAA,IACL;AAAA,IACA,iBAAiB,MAAM,yBAAyB;AAAA,IAChD,sBAAsB,MAAM;AAAA,IAC5B,qBAAqB,MAAM;AAAA,IAC3B,wBAAwB,MAAM;AAAA,IAC9B,wBAAwB,MAAM;AAAA,IAC9B,uBAAuB,cAAc;AAAA,IACrC,0BAA0B,cAAc;AAAA,IACxC,oBAAoB,cAAc;AAAA,EACpC;AAAA;AAgDF,IAAM,kBAAsC;AAAA,EAC1C,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,oBAAoB;AACtB;AAsBA,SAAS,yBAAyB,CAAC,MAAgD;AAAA,EACjF,MAAM,OAAQ,KAA8D;AAAA,EAC5E,OAAO,QAAQ,OAAO,SAAS,WAAW,OAAO;AAAA;AAInD,SAAS,aAAa,CACpB,cACA,OACA,QACoB;AAAA,EACpB,MAAM,UAAU,cAAc,mBAAmB;AAAA,EACjD,IAAI,CAAC;AAAA,IAAS,OAAO;AAAA,EACrB,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,YAAY,OAAO,QAAQ,YAAY,aAAa,QAAQ,QAAQ,MAAM,IAAI;AAAA,IAC9E,MAAM;AAAA,IACN,YAAY;AAAA;AAAA,EAEd,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,SAAS,QAAQ;AAAA,IACvB,SAAS,UAAU,OAAO,WAAW,WAAW,OAAO,UAAU;AAAA,IACjE,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,EAEX,OAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,EACtB;AAAA;AAQF,SAAS,oBAAoB,CAAC,QAAgD;AAAA,EAC5E,IAAI,WAAW;AAAA,IAAW,OAAO;AAAA,EACjC,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,OAAO,OAAO,SAAS,SAAS;AAAA;AAO3F,SAAS,cAAc,CACrB,MACA,gBACA,aACA,cAC8C;AAAA,EAC9C,IAAI,CAAC,KAAK,MAAM;AAAA,IACd,OAAO,KAAK,MAAM,MAAM,UAAU;AAAA,EACpC;AAAA,EACA,MAAM,eAAe,KAAK;AAAA,EAC1B,MAAM,WAAqD,CAAC;AAAA,EAC5D,WAAW,SAAS,gBAAgB;AAAA,IAClC,SAAS,SAAS,iBAChB,qBAAqB,YAAY,MAAM,GACvC,KAAK,KAAK,QAAQ,QAClB,cAAc,cAAc,OAAO,YAAY,CACjD;AAAA,EACF;AAAA,EACA,WAAW,SAAS,OAAO,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,IAClD,IAAI,SAAS;AAAA,MAAQ;AAAA,IACrB,SAAS,SAAS,iBAChB,WACA,KAAK,KAAK,QAAQ,QAClB,cAAc,cAAc,OAAO,YAAY,CACjD;AAAA,EACF;AAAA,EACA,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,SAAS,SAAS,EAAE;AAAA;AAS9D,SAAS,0BAA0B,CAAC,MAA+C;AAAA,EACjF,MAAM,OACJ,KAGA;AAAA,EACF,MAAM,KAAK,MAAM;AAAA,EACjB,IAAI,OAAO,OAAO,cAAc,SAAS;AAAA,IAAW;AAAA,EACpD,OAAO,MAAM,GAAG,KAAK,IAAI;AAAA;AAO3B,SAAS,+BAA+B,GAA+B;AAAA,EACrE,MAAM,gBAAe,gBAAgB;AAAA,EACrC,OAAO;AAAA,IACL,UAAU,qBAAqB;AAAA,IAC/B,YAAY,sBAAsB;AAAA,IAClC,0BAA0B,4BAA4B;AAAA,IACtD,aAAa,qBAAqB;AAAA,IAClC,iBAAiB,mBAAmB;AAAA,IACpC,iBAAiB,mBAAmB;AAAA,IACpC,qBAAqB,uBAAuB;AAAA,IAC5C,kBAAkB,oBAAoB;AAAA,IACtC;AAAA,IACA,4BAA4B,+BAA+B,aAAY;AAAA,EACzE;AAAA;AA4BF,SAAS,8BAA8B,CACrC,SACsC;AAAA,EACtC,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,QAAQ,QAAQ,IAAI,OAAO,KAAK;AAAA,IACpC,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,EAAE,MAAM,IAAI,KAAO,OAAO,EAAE;AAAA,MACpC,QAAQ,IAAI,OAAO,OAAO,KAAK;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,IAAI,OAAO,GAAG;AAAA,IACzB,MAAM;AAAA,EACR;AAAA,EACA,MAAM,aAAmD,CAAC;AAAA,EAC1D,YAAY,OAAO,UAAU,SAAS;AAAA,IACpC,IAAI,MAAM,QAAQ,GAAG;AAAA,MACnB,WAAW,KAAK,EAAE,OAAO,MAAM,CAAC,GAAG,MAAM,IAAI,GAAG,aAAa,MAAM,MAAM,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAMT,SAAS,+BAA+B,CAAC,gBAAoC,MAAkB;AAAA,EAC7F,MAAM,UAAU,OAAO,YAAY,eAAe,QAAQ,MAAM,6BAA6B;AAAA,EAC7F,IAAI;AAAA,IAAS;AAAA,EACb,MAAM,aAAa,2BAA2B,IAAI;AAAA,EAClD,IAAI,CAAC;AAAA,IAAY;AAAA,EACjB,eAAe,GAAG,kBAAkB,MAAM;AAAA,IACnC,WAAW,EAAE,MAAM,MAAM,EAI7B;AAAA,GACF;AAAA;AAsSH,eAAsB,gBAAgB,CAAC,SAAuD;AAAA,EAC5F,MAAM,gBAAgB,MAAM,qBAAqB,QAAQ,OAAO;AAAA,EAChE,MAAM,UAAU,cAAc;AAAA,EAC9B,MAAM,oBAAoB,QAAQ,qBAAqB;AAAA,EAKvD,IAAI,qBAAqB,CAAC,QAAQ,aAAa,IAAI,mBAAmB,GAAG;AAAA,IACvE,MAAM,IAAI,MACR,oFAAoF,2GACtF;AAAA,EACF;AAAA,EAaA,MAAM,eAAe,CAAC,GAAG,QAAQ,WAAW,KAAK,CAAC,EAAE,OAClD,CAAC,OAAO,OAAO,QAAQ,UAAU,MACnC;AAAA,EAMA,MAAM,qBAAqB,MAAM,kBAAkB,QAAQ,GAAG;AAAA,EAE9D,MAAM,uBAAiD;AAAA,IACrD,WAAW;AAAA,IACX,QAAQ,QAAQ,UAAU;AAAA,IAC1B;AAAA,IACA;AAAA,OACI,uBAAuB,aAAa,EAAE,YAAY,mBAAmB;AAAA,OACrE,QAAQ,KAAK,uBAAuB,aAAa;AAAA,MACnD,oBAAoB,QAAQ,IAAI;AAAA,IAClC;AAAA,OACI,QAAQ,KAAK,wBAAwB,aAAa;AAAA,MACpD,qBAAqB,QAAQ,IAAI;AAAA,IACnC;AAAA,OACI,QAAQ,KAAK,qBAAqB,aAAa;AAAA,MACjD,kBAAkB,QAAQ,IAAI;AAAA,IAChC;AAAA,OACI,QAAQ,KAAK,sBAAsB,aAAa;AAAA,MAClD,mBAAmB,QAAQ,IAAI;AAAA,IACjC;AAAA,OACI,QAAQ,KAAK,gCAAgC,aAAa;AAAA,MAC5D,6BAA6B,QAAQ,IAAI;AAAA,IAC3C;AAAA,OACI,QAAQ,KAAK,qBAAqB,aAAa;AAAA,MACjD,kBAAkB,QAAQ,IAAI;AAAA,IAChC;AAAA,OACI,QAAQ,KAAK,kCAAkC,aAAa;AAAA,MAC9D,+BAA+B,QAAQ,IAAI;AAAA,IAC7C;AAAA,EACF;AAAA,EAUA,IAAI;AAAA,EACJ,MAAM,YAAY,IAAI,oBAAoB;AAAA,IACxC,KAAK,QAAQ,UAAU;AAAA,IACvB,QAAQ,QAAQ,UAAU;AAAA,OACtB,QAAQ,UAAU,cAAc,aAAa,EAAE,WAAW,QAAQ,UAAU,UAAU;AAAA,OACtF,QAAQ,UAAU,YAAY,aAAa,EAAE,SAAS,QAAQ,UAAU,QAAQ;AAAA,OAChF,QAAQ,UAAU,kBAAkB,aAAa;AAAA,MACnD,eAAe,QAAQ,UAAU;AAAA,IACnC;AAAA,IACA,UAAU,CAAC,YAAY,YAAY;AAAA,MACjC,eAAe,aAAa,YAAY,OAAO;AAAA;AAAA,IAEjD,gBAAgB,CAAC,YAAY;AAAA,MAC3B,eAAe,mBAAmB,OAAO;AAAA;AAAA,IAE3C,cAAc,CAAC,WAAW;AAAA,MACxB,eAAe,iBAAiB,MAAM;AAAA;AAAA,IAExC,YAAY,CAAC,WAAW;AAAA,MACtB,eAAe,eAAe,MAAM;AAAA;AAAA,EAExC,CAAC;AAAA,EAED,qBAAqB,YAAY;AAAA,EACjC,gBAAgB,IAAI,kBAAkB,oBAAoB;AAAA,EAO1D,MAAM,mBAAmB,IAAI;AAAA,EAC7B,IAAI;AAAA,EACJ,MAAM,cAAc,QAAQ,UAAU;AAAA,EACtC,MAAM,kBAAkB,IAAI;AAAA,EAE5B,SAAS,eAAe,CAAC,QAA0B,OAAyB;AAAA,IAC1E,MAAM,WAAW,gBAAgB,IAAI,OAAO,aAAa;AAAA,IACzD,IAAI,YAAY,SAAS,MAAM,YAAY,OAAO;AAAA,MAAU;AAAA,IAC5D,gBAAgB,IAAI,OAAO,eAAe;AAAA,MACxC;AAAA,MACA,OAAO;AAAA,QACL,eAAe,OAAO;AAAA,QACtB,cAAc,OAAO;AAAA,QACrB,UAAU,OAAO;AAAA,MACnB;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,MAAM,0BAA0B,CAAC,MAAkB,aAA2B;AAAA,IAC5E,MAAM,WAAU,cAAc;AAAA,IAC9B,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,iBAAiB,MAAM,QAAO;AAAA,MACvC,OAAO,KAAK;AAAA,MACZ,MAAM,SACJ,eAAe,kBACX,IAAI,OACJ,eAAe,QACb,IAAI,UACJ,OAAO,GAAG;AAAA,MAClB,mBAAmB,EAAE,MAAM,mBAAmB,UAAU,OAAO,CAAC;AAAA,MAChE;AAAA;AAAA,IAEF,IAAI,OAAO,kBAAkB,aAAa;AAAA,MAKxC,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,WACb,OAAO,WAAW,aAAa,EAAE,QAAQ,OAAO,OAAO;AAAA,QAC3D,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IACA,IAAI,SAAQ,aAAa,IAAI,OAAO,aAAa,GAAG;AAAA,MAGlD,gBAAgB,QAAQ,IAAI;AAAA,MAC5B,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,eAAe,OAAO;AAAA,QACtB,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IACA,gBAAgB,QAAQ,QAAO;AAAA,IAC/B,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,mBAAmB,EAAE,MAAM,kBAAkB,eAAe,OAAO,cAAc,CAAC;AAAA;AAAA,EAGpF,MAAM,0BAA0B,CAAC,MAAkB,aAA2B;AAAA,IAC5E,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,UAAU,wBAAwB,IAAI;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AAAA,MACD;AAAA;AAAA,IAMF,MAAM,aAAa,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,aAAa,CAAC;AAAA,IACtE,MAAM,eAAe;AAAA,IACrB,WAAW,UAAU,gBAAgB,OAAO,GAAG;AAAA,MAC7C,IAAI,WAAW,IAAI,OAAO,MAAM,aAAa;AAAA,QAAG;AAAA,MAChD,eAAe,mBAAmB,kBAAkB,YAAY,OAAO,OAAO,CAAC,YAAY,CAAC;AAAA,IAC9F;AAAA;AAAA,EAGF,MAAM,iBAAiB,IAAI,mBAAmB;AAAA,IAC5C,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,kBAAkB,CAAC,KAAK,MAAM,aAAa;AAAA,MACzC,IAAI,QAAQ,kBAAkB,YAAY;AAAA,QACxC,wBAAwB,MAAM,QAAQ;AAAA,MACxC,EAAO,SAAI,QAAQ,kBAAkB,mBAAmB;AAAA,QACtD,wBAAwB,MAAM,QAAQ;AAAA,MACxC;AAAA;AAAA,EAEJ,CAAC;AAAA,EAED,SAAS,aAAa,CAAC,QAAsB;AAAA,IAC3C,MAAM,UAAU,CAAC,GAAG,gBAAgB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,OAAO,KAAK;AAAA,IAC1E,MAAM,OAAO,wBAAwB,OAAO;AAAA,IAC5C,eAAe,mBAAmB,kBAAkB,mBAAmB,MAAM,CAAC,MAAM,CAAC;AAAA;AAAA,EAOvF,eAAe,GAAG,kBAAkB,CAAC,UAA8B;AAAA,IACjE,iBAAiB,IAAI,MAAM,MAAM;AAAA,IACjC,IAAI;AAAA,MACF,cAAc,MAAM,MAAM;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,MAAM;AAAA,QAChB,QAAQ,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACjF,CAAC;AAAA;AAAA,GAEJ;AAAA,EACD,eAAe,GAAG,qBAAqB,CAAC,UAA8B;AAAA,IACpE,iBAAiB,OAAO,MAAM,MAAM;AAAA,GACrC;AAAA,EASD,MAAM,OAAO,IAAI,KAAK;AAAA,IACpB,SAAS,CAAC,cAAc;AAAA,IACxB,QAAQ,QAAQ,UAAU;AAAA,OACtB,QAAQ,gBAAgB,aAAa,EAAE,SAAS,QAAQ,YAAY;AAAA,EAC1E,CAAC;AAAA,EAED,mBAAmB,IAAI;AAAA,EAsBvB,gCAAgC,gBAAgB,IAAI;AAAA,EAEpD,MAAM,UAAU,QAAQ;AAAA,EAExB,OAAO;AAAA,IACL;AAAA,QACI,OAAO,GAAgB;AAAA,MACzB,OAAO,cAAc;AAAA;AAAA,IAEvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,MAAM;AAAA,MACvB,eAAe,kBAAkB;AAAA;AAAA,IAEnC,sBAAsB,MAAM;AAAA,MAI1B,IAAI,CAAC,eAAe;AAAA,QAClB,OAAO;AAAA,UACL,aAAa,QAAQ,UAAU;AAAA,UAC/B,cAAc,CAAC;AAAA,UACf,gBAAgB,CAAC;AAAA,UACjB,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,WAAW;AAAA,UACb;AAAA,UACA,OAAO,CAAC;AAAA,UACR,iBAAiB,gCAAgC;AAAA,UACjD,iBAAiB,OAAO,KAAK,KAAK,OAAO,EAAE;AAAA,UAC3C,eAAe,OAAO,KAAK,KAAK,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,MACA,MAAM,OAAO,cAAc,qBAAqB;AAAA,MAchD,MAAM,cAAc,KAAK;AAAA,MACzB,MAAM,iBAAiB,OAAO,KAAK,WAAW;AAAA,MAC9C,MAAM,eAAe,0BAA0B,IAAI;AAAA,MACnD,MAAM,gBAAsD,KAAK,MAAM,IAAI,CAAC,SAC1E,eAAe,MAAM,gBAAgB,aAAa,YAAY,CAChE;AAAA,MACA,MAAM,MAAmC;AAAA,QACvC,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,gBAAgB,KAAK;AAAA,QACrB,OAAO,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,iBAAiB,gCAAgC;AAAA,QACjD,iBAAiB,eAAe;AAAA,QAChC,eAAe;AAAA,MACjB;AAAA,MACA,OAAO;AAAA;AAAA,IAET,mBAAmB,YAAY;AAAA,MAC7B,MAAM,aAAa,2BAA2B,IAAI;AAAA,MAClD,IAAI,CAAC;AAAA,QAAY;AAAA,MACjB,MAAM,WAAW;AAAA;AAAA,IAEnB,uBAAuB,YAAY;AAAA,MACjC,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,MAAM,cAAc,yBAAyB;AAAA;AAAA,IAE/C,YAAY,OAAO,cAAc,WAAW;AAAA,MAC1C,MAAM,WAAU,cAAc;AAAA,MAC9B,MAAM,SAAS,iBAAiB;AAAA,QAC9B,QAAQ,SAAQ;AAAA,QAChB,cAAc;AAAA,QACd,eAAe;AAAA,WACX,WAAW,aAAa,EAAE,OAAO;AAAA,MACvC,CAAC;AAAA,MACD,MAAM,QAAQ,iBAAiB,QAAQ,SAAQ,QAAQ;AAAA,MAMvD,gBAAgB,QAAQ,QAAO;AAAA,MAC/B,gBAAgB,QAAQ,KAAK;AAAA,MAC7B,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,eAAe;AAAA,QACf,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,MAAM,UAAU,CAAC,GAAG,gBAAgB;AAAA,MACpC,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,eAAe,mBAAmB,kBAAkB,YAAY,OAAO,OAAO;AAAA,MAChF;AAAA;AAAA,QAEE,cAAc,GAAiC;AAAA,MACjD,OAAO;AAAA;AAAA,IAET,OAAO,YAAY;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,eAAe,WAAW;AAAA,MAC1B,MAAM,KAAK,SAAS;AAAA;AAAA,EAExB;AAAA;AAGF,eAAe,oBAAoB,CACjC,QAC4B;AAAA,EAC5B,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,YAAY,QAAQ;AAAA,IACvE,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,IAAI,aAAa,QAAQ;AAAA,IACvB,MAAM,SAAS,MAAM,OAAO,QAAQ,KAAK;AAAA,IACzC,IAAI,WAAW,MAAM;AAAA,MACnB,MAAM,IAAI,MACR,qRACF;AAAA,IACF;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AAAA,EACA,OAAO,MAAM;AAAA;;AgB7mCf;AASO,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC;AAGnE,IAAM,sBAAsB;AAI5B,IAAM,yBAAyB,KAAK,KAAK;AAAA;AA+BzC,MAAM,qBAAqB,MAAM;AAAA,EAC7B;AAAA,EAST,WAAW,CAAC,SAAiB,MAA4B;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AA8BO,SAAS,kBAAkB,CAAC,SAAkD;AAAA,EACnF,MAAM,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI;AAAA,EACnD,MAAM,QAAQ,QAAQ,SAAS;AAAA,EAC/B,MAAM,cAAc,QAAQ,eAAe,oBAAoB;AAAA,EAC/D,MAAM,QAAQ,YAAY,mBAAmB;AAAA,EAE7C,OAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ,SAAS;AAAA,IAClC;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB;AAAA,EACF;AAAA;AASK,SAAS,mCAAmC,CAAC,MAKE;AAAA,EACpD,MAAM,WAAW,uBAAuB;AAAA,EACxC,MAAM,QAAQ,mBAAmB;AAAA,IAC/B;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,IACpB,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,CAAC;AAAA,EACD,OAAO,EAAE,UAAU,MAAM;AAAA;AAOpB,SAAS,qBAAqB,CAAC,OAAqB,KAA6B;AAAA,EACtF,MAAM,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC,OAAO,KAAK,MAAM;AAAA;AAab,SAAS,iBAAiB,CAC/B,OACA,SACA,UAAkC,CAAC,GAC7B;AAAA,EACN,IAAI,sBAAsB,OAAO,QAAQ,GAAG,GAAG;AAAA,IAC7C,MAAM,IAAI,aACR,sBAAsB,MAAM,2BAA2B,IAAI,KAAK,MAAM,SAAS,EAAE,YAAY,MAC7F,SACF;AAAA,EACF;AAAA,EACA,QAAQ,WAAW,IAAI,MAAM,cAAc,MAAM,eAAe;AAAA,EAChE,QAAQ,aAAa,IAAI,MAAM,eAAe,MAAM,WAAW;AAAA;AAqB1D,SAAS,qBAAqB,CAAC,OAAiC;AAAA,EACrE,yBAAyB,KAAK;AAAA,EAC9B,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,MAAM,YAAY;AAAA,EAC/D,MAAM,aAAa,IAAI,YAAY,EAAE,OAAO,MAAM,aAAa;AAAA,EAE/D,MAAM,QACJ,oBAAoB,SACpB,IACA,IACA,YAAY,SACZ,mBACA,YACA,IACA,WAAW,SACX,IACA;AAAA,EAEF,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,IAAI,SAAS;AAAA,EAEb,IAAI,IAAI,qBAAqB,MAAM;AAAA,EACnC,UAAU,oBAAoB;AAAA,EAE9B,IAAI,UAAU,MAAM;AAAA,EACpB,UAAU;AAAA,EAEV,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAC3B,UAAU,YAAY;AAAA,EAEtB,IAAI,IAAI,MAAM,iBAAiB,MAAM;AAAA,EACrC,UAAU;AAAA,EAEV,IAAI,IAAI,MAAM,aAAa,MAAM;AAAA,EACjC,UAAU;AAAA,EAEV,KAAK,UAAU,QAAQ,WAAW,QAAQ,KAAK;AAAA,EAC/C,UAAU;AAAA,EACV,IAAI,IAAI,YAAY,MAAM;AAAA,EAC1B,UAAU,WAAW;AAAA,EAKrB,KAAK,aAAa,QAAQ,OAAO,MAAM,SAAS,GAAG,KAAK;AAAA,EACxD,UAAU;AAAA,EAEV,IAAI,IAAI,MAAM,OAAO,MAAM;AAAA,EAC3B,UAAU;AAAA,EAEV,OAAO;AAAA;AAOF,SAAS,iBAAiB,CAAC,OAAiC;AAAA,EACjE,IAAI,SAAS;AAAA,EAGb,IAAI,MAAM,SAAS,oBAAoB,QAAQ;AAAA,IAC7C,MAAM,IAAI,aAAa,4BAA4B,MAAM,iBAAiB,WAAW;AAAA,EACvF;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,oBAAoB,QAAQ,KAAK;AAAA,IACnD,IAAI,MAAM,SAAS,OAAO,oBAAoB,IAAI;AAAA,MAChD,MAAM,IAAI,aACR,4DACA,aACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU,oBAAoB;AAAA,EAG9B,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,uCAAuC,WAAW;AAAA,EAC3E;AAAA,EACA,MAAM,UAAU,MAAM;AAAA,EACtB,UAAU;AAAA,EACV,IAAI,YAAY,uBAAuB;AAAA,IACrC,MAAM,IAAI,aACR,kCAAkC,8CAA8C,0BAChF,iBACF;AAAA,EACF;AAAA,EAGA,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,gDAAgD,WAAW;AAAA,EACpF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,aAAa,yCAAyC,WAAW;AAAA,EAC7E;AAAA,EACA,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EACxF,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,kBAA0B;AAAA,IACpD,MAAM,IAAI,aAAa,0CAA0C,WAAW;AAAA,EAC9E;AAAA,EACA,MAAM,kBAAkB,MAAM,MAAM,QAAQ,SAAS,gBAAwB;AAAA,EAC7E,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,WAAsB;AAAA,IAChD,MAAM,IAAI,aAAa,4CAA4C,WAAW;AAAA,EAChF;AAAA,EACA,MAAM,cAAc,MAAM,MAAM,QAAQ,SAAS,SAAoB;AAAA,EACrE,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,sDAAsD,WAAW;AAAA,EAC1F;AAAA,EACA,MAAM,WAAW,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC7C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,UAAU;AAAA,IACpC,MAAM,IAAI,aAAa,+CAA+C,WAAW;AAAA,EACnF;AAAA,EACA,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,QAAQ,CAAC;AAAA,EACxF,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,sCAAsC,WAAW;AAAA,EAC1E;AAAA,EACA,MAAM,eAAe,KAAK,aAAa,QAAQ,KAAK;AAAA,EACpD,UAAU;AAAA,EACV,MAAM,YAAY,OAAO,YAAY;AAAA,EAGrC,IAAI,MAAM,SAAS,SAAS,qBAAqB;AAAA,IAC/C,MAAM,IAAI,aAAa,qCAAqC,WAAW;AAAA,EACzE;AAAA,EACA,MAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,mBAAmB;AAAA,EAC9D,UAAU;AAAA,EAEV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAQK,SAAS,kBAAkB,CAAC,OAA6B;AAAA,EAC9D,MAAM,QAAQ,sBAAsB,KAAK;AAAA,EAIzC,IAAI,SAAS;AAAA,EACb,WAAW,QAAQ,OAAO;AAAA,IACxB,UAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AAAA,EACA,OAAO,KAAK,MAAM;AAAA;AAOb,SAAS,kBAAkB,CAAC,SAA+B;AAAA,EAChE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,KAAK,OAAO;AAAA,IACrB,MAAM;AAAA,IACN,MAAM,IAAI,aAAa,sCAAsC,aAAa;AAAA;AAAA,EAE5E,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,IACtC,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,OAAO,kBAAkB,KAAK;AAAA;AAKhC,SAAS,wBAAwB,CAAC,OAA2B;AAAA,EAC3D,IAAI,MAAM,gBAAgB,WAAW,kBAA0B;AAAA,IAC7D,MAAM,IAAI,aACR,6BAA6B,+BAAuC,MAAM,gBAAgB,WAC1F,oBACF;AAAA,EACF;AAAA,EACA,IAAI,MAAM,YAAY,WAAW,WAAsB;AAAA,IACrD,MAAM,IAAI,aACR,wBAAwB,wBAAmC,MAAM,YAAY,WAC7E,sBACF;AAAA,EACF;AAAA,EACA,IAAI,MAAM,MAAM,WAAW,qBAAqB;AAAA,IAC9C,MAAM,IAAI,aACR,iBAAiB,kCAAkC,MAAM,MAAM,WAC/D,eACF;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAAC,GAAuB;AAAA,EAC1C,MAAM,MAAM,IAAI,WAAW,CAAC;AAAA,EAC5B,OAAO,gBAAgB,GAAG;AAAA,EAC1B,OAAO;AAAA;",
33
- "debugId": "3C4A71059C481C0664756E2164756E21",
32
+ "mappings": "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",
33
+ "debugId": "0D84EA4EDCC2765464756E2164756E21",
34
34
  "names": []
35
35
  }