statewire 0.24.1 → 0.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/connection.d.ts +4 -0
- package/dist/client/connection.d.ts.map +1 -1
- package/dist/client/connection.js +9 -2
- package/dist/client/connection.js.map +1 -1
- package/dist/client/session.d.ts +2 -0
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +52 -11
- package/dist/client/session.js.map +1 -1
- package/dist/host/host.d.ts +1 -0
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js +8 -0
- package/dist/host/host.js.map +1 -1
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +3 -2
- package/dist/host/socket.js.map +1 -1
- package/dist/host.d.ts +13 -7
- package/dist/host.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/transports/sse.d.ts.map +1 -1
- package/dist/transports/sse.js +2 -1
- package/dist/transports/sse.js.map +1 -1
- package/dist/wire/protocol.d.ts +6 -1
- package/dist/wire/protocol.d.ts.map +1 -1
- package/dist/wire/protocol.js +12 -4
- package/dist/wire/protocol.js.map +1 -1
- package/package.json +1 -1
- package/src/client/connection.ts +11 -0
- package/src/client/session.ts +85 -11
- package/src/host/host.ts +13 -0
- package/src/host/socket.ts +5 -2
- package/src/host.ts +14 -6
- package/src/transports/sse.ts +2 -0
- package/src/wire/protocol.ts +11 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["encodeContext","wrapStorageError","DEFAULT_PROTOCOL","GAP_FILL_VERSION","WIRE_VERSION","protocolOffers","inRange","StatewireProtocol","applyDocumentOps","mainDocument","findDocument","resolveDocumentKey","StatewireDocuments","useContext","useEffect","useState","StatewirePath","MAX_COMMANDS_PER_FRAME","TERMINAL","StatewireCmd","StatewireSyn","encodeParams","reviveResponse","reviveValue","bindCommandsHost","CommandsInvocation","CommandsListener","Statewire","StatewireClient","DocumentStorageContext","SessionStorageContext","createMemorySessionStore","backoff","retryHint","createMethodProxy","randomId","newClientId","StatewireSendError","RemoteLink","StatewireFrame","StatewireRemoteProps","WireCommand","protocol","produced","NonNullable","SessionCommand","method","params","meta","Invocation","K","Pending","id","seq","command","inv","adopted","by","away","stale","attempted","posted","applied","resolve","payload","reject","error","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","context","Readonly","Record","Context","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDeprecatedPath","OnDeprecatedPath","onSettled","OnSettled","onFlush","OnFlush","canOvertake","CanOvertake","onDone","Shared","txq","syncQueued","parked","verdict","SessionVerdict","settled","Set","notices","Notice","inTx","unsubscribe","watched","abort","AbortController","Patch","held","localMeta","value","Flushing","ids","ReadonlySet","patches","Map","removed","Waiter","Session","options","configuredContext","contexts","ReturnType","dirtyContexts","attachContexts","selection","Selection","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","ephemeralSeqs","resumeAt","idle","releases","delivering","skipped","views","WeakMap","OutboxEntry","mountIds","flushing","outboxList","outboxParts","lanesOnAttach","attachEntries","frameFailures","recheck","setTimeout","rechecks","watermarks","count","pending","canonical","documentListeners","documents","State","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","EMPTY_LANE","SessionLane","nextSeq","laneOf","Object","hasOwn","lanes","withLane","lane","isEphemeral","s","protocols","some","p","name","durableSeqOf","Stamped","isStamped","undefined","isOutboxed","laneEntries","filter","sortPending","sort","a","b","Infinity","RemovalMark","marks","added","c","owner","map","next","length","withOutbox","outbox","OutboxCommand","_outbox","rest","outboxOf","onChange","stamp","unstamp","follow","stored","dirty","paramsOf","structuredClone","dropPending","q","onCovered","publish","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","w","storageFailed","cause","entry","setRecord","save","isQuota","toOutbox","_protocol","ts","const","toStored","backlog","mergeBacklog","own","foreign","durableLanes","keys","MAX_PARKED_VERDICTS","syncBacklogInner","noticeInner","splice","clear","parkedHere","v","flatMap","find","has","parkedSeqs","kept","verdicts","slice","unchanged","every","i","syncBacklog","transact","fn","run","then","lock","readStored","refresh","watchOwners","persistence","flush","read","load","clientId","adoptReset","boundInbox","reconcileLocal","followReleases","me","queued","stamped","mark","m","settleEntry","ok","fate","_removed","left","locate","entries","settleReleases","outcome","get","delete","values","notice","inbox","n","signal","offered","add","whenGone","transactBackground","adoptOwner","pump","gone","orphans","_owner","mine","adoptedPending","connection","reconnect","onStart","done","setIdle","level","cover","onApplied","MAX_INBOX","Outcome","updateOf","StoredSettled","CommandUpdate","status","dropped","sorted","x","y","cut","onEvict","reason","toNotice","Omit","lostNotice","LOST","withNotices","known","deliver","SettleMode","mode","durable","onSettle","type","settleAll","detach","batch","detachFailure","predecessorLost","settleLost","settleRemoved","requeue","survivors","old","enqueueInner","hold","rebaseRecord","adopt","includes","previous","current","resetRecord","ephemeralDetach","detachEphemeralLanes","rejectedFailure","cmd","code","outcomeOf","String","settleVerdict","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","dur","watermark","Math","max","consumeVerdicts","consumed","forwarded","_id","size","handleCmds","cmds","ingestOps","ops","applicationProtocols","fromEntries","d","key","JSON","stringify","changedPaths","cacheDocuments","document","keyPrefixes","version","namespace","publishIngested","listener","sessionLostInner","seqWm","kind","console","warn","stamps","demote","demoted","waiting","local","above","set","moved","_seq","recheckLater","gapFill","selectionOf","syn","handleHello","attached","reconcile","flushInner","handleOps","handleRefusal","retry","Date","now","gaps","first","handleDetach","handleFinish","isFinished","Lanes","frame","buildLanes","cmdGate","last","stopped","gated","_produced","resultsCursor","cursors","min","takeAttachLanes","wanted","res","persistBeforeSend","flushable","flushCandidates","queuedInRecord","resumeDelay","epoch","send","built","onPosted","start","subscribe","stop","setTransport","EnqueueOptions","QUOTA","reorder","negotiated","Candidate","viewOf","state","cached","view","laneQueue","bubble","queue","order","free","may","blocked","at","findIndex","o","flushLanes","reasonOf","FlushReason","released","NO_IDS","patched","patch","_held","_released","_meta","_old","plain","candidates","groups","stampedIds","outboxEntries","parts","same","part","OutboxOp","entryOf","applyOutboxOp","op","toPatch","OutboxPatch","k","Array","isArray","outboxOp","background","promise","holdOutbox","releaseOutbox","settleWaiters","removeOutbox","updateOutbox","producedOf","wire","wireVersion","placed","after","before","anchor","index","insertOutbox","OutboxInsert","from","base","l","withoutNotice","nextNotice","found","_inbox","ack","handler","locked","notifyLock","enqueue","offers","offer","sendCommand","InvokeOptions","encoded","documentSource","Source","prefix","mounted","absolute","list","invokeProtocol","storedCommandCompatible","validateLanes","loadSessionRecord","compatible","migrate","storedIds","setContext","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener","reviveValue","newClientId"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { encodeContext } from \"../wire/context\";\nimport { wrapStorageError } from \"./storageError\";\nimport {\n DEFAULT_PROTOCOL,\n GAP_FILL_VERSION,\n WIRE_VERSION,\n protocolOffers,\n inRange,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport {\n applyDocumentOps,\n mainDocument,\n findDocument,\n resolveDocumentKey,\n} from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useContext, useEffect, useState } from \"react\";\n\nimport type { StatewirePath } from \"../wire/ops\";\nimport { MAX_COMMANDS_PER_FRAME } from \"../wire/limits\";\nimport { TERMINAL } from \"./connection\";\nimport type { StatewireCmd, StatewireSyn } from \"./connection\";\nimport { encodeParams, reviveResponse, reviveValue } from \"../wire/meta\";\nimport { bindCommandsHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport {\n DocumentStorageContext,\n SessionStorageContext,\n createMemorySessionStore,\n} from \"./sessionStore\";\nimport { backoff, retryHint } from \"./timing\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport { randomId as newClientId } from \"../util/randomId\";\nimport { StatewireSendError } from \"../types\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n} from \"../transports/sse\";\n\ntype WireCommand = {\n protocol: string;\n produced?: NonNullable<StatewireClient.SessionCommand[\"produced\"]>;\n method: string;\n params: unknown[];\n meta?: unknown;\n};\n\ntype Invocation = {\n -readonly [K in keyof CommandsInvocation]: CommandsInvocation[K];\n};\n\ntype Pending = {\n readonly id: string;\n /** Unset while in the outbox, or while another sharer owns its stamp. */\n seq: number | undefined;\n command: WireCommand;\n readonly inv: Invocation;\n /** Enqueued by another sharer: this client holds no promise for it. */\n readonly adopted: boolean;\n /** The enqueuing sharer's owner id (shared storage only). */\n readonly by: string | undefined;\n /** Stamped by another sharer; settles from a verdict parked under its id. */\n away: boolean;\n /** Stamped against a watermark this attach has not confirmed: waits for the next hello. */\n stale: boolean;\n /** A send carrying this statement may have reached the server. */\n attempted: boolean;\n /** In the resend queue when false. */\n posted: boolean;\n /** The server acknowledged admission; the terminal verdict is still due. */\n applied: boolean;\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst rejectedSend = (\n failure: StatewireClient.SendFailure,\n): Promise<unknown> => {\n const result = Promise.reject<unknown>(new StatewireSendError(failure));\n result.catch(() => {});\n return result;\n};\n\ntype AttachState = \"detached\" | \"attached\" | \"finished\";\n\nexport type StatewireSessionOptions = StatewireProtocol.Options & {\n context?: Readonly<Record<string, Statewire.Context>>;\n sessionStore?: StatewireClient.SessionStorage | undefined;\n onSessionLost?: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath?: StatewireClient.OnDeprecatedPath | undefined;\n onSettled?: StatewireClient.OnSettled | undefined;\n onFlush?: StatewireClient.OnFlush | undefined;\n canOvertake?:\n | Readonly<Record<string, StatewireClient.CanOvertake>>\n | undefined;\n onDone?: (() => void) | undefined;\n};\n\ntype Shared = {\n txq: Promise<void>;\n syncQueued: boolean;\n parked: { protocol: string; verdict: StatewireClient.SessionVerdict }[];\n /** Own commands settled since the last backlog sync: verdicts parked for them are moot. */\n settled: Set<string>;\n /** Settled updates waiting for the next backlog sync. */\n notices: Notice[];\n /** A locked transaction is running its mutation. */\n inTx: boolean;\n unsubscribe: (() => void) | null;\n /** Owners whose departure this sharer awaits. */\n watched: Set<string>;\n abort: AbortController | null;\n};\n\ntype Patch = {\n held?: boolean;\n localMeta?: { value: unknown };\n params?: readonly unknown[];\n};\n\ntype Flushing = {\n ids: ReadonlySet<string>;\n patches: Map<string, Patch>;\n removed: Set<string>;\n};\n\ntype Waiter = {\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n configuredContext: StatewireSessionOptions[\"context\"];\n contexts: Map<string, ReturnType<typeof encodeContext>>;\n dirtyContexts: Set<string>;\n attachContexts: Map<string, ReturnType<typeof encodeContext>>;\n selection: StatewireProtocol.Selection | undefined;\n record: StatewireClient.SessionRecord;\n ctx: StatewireRemoteProps;\n recordPersisted: boolean;\n hydrated: boolean;\n ready: Promise<void> | undefined;\n storageError: unknown;\n persistedRecord: StatewireClient.SessionRecord | null;\n store: StatewireClient.SessionStorage;\n documentStore: StatewireDocuments.Storage | undefined;\n shared: Shared | false;\n /** Every selected lane is ephemeral: the record dies with the attach. */\n ephemeral: boolean;\n /** An ephemeral record died with its attach: the storage is off for good. */\n deactivated: boolean;\n sessionKnown: boolean;\n durableSeq: Record<string, number>;\n /** Ephemeral lane clocks: restart at 1 on every attach. */\n ephemeralSeqs: Record<string, number>;\n resumeAt: number;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath: StatewireClient.OnDeprecatedPath | undefined;\n onSettled: StatewireClient.OnSettled | undefined;\n onFlush: StatewireClient.OnFlush | undefined;\n onDone: (() => void) | undefined;\n /** `outbox.release` promises by entry id. */\n releases: Map<string, Waiter[]>;\n delivering: boolean;\n /** Notices whose handler threw on this mount. */\n skipped: Set<string>;\n views: WeakMap<object, StatewireClient.OutboxEntry>;\n /** Outbox and stamped ids stored before this client mounted. */\n mountIds: Set<string>;\n flushing: Flushing | null;\n outboxList: readonly StatewireClient.OutboxEntry[];\n outboxParts: readonly unknown[];\n lanesOnAttach: boolean;\n attachEntries: ReadonlySet<Pending>;\n frameFailures: number;\n /** A later hello decides stamps this one could not: another live sharer's stamp sat below them. */\n recheck: ReturnType<typeof setTimeout> | undefined;\n /** Hellos in a row that left stamps waiting at the same watermarks: the recheck backs off. */\n rechecks: { watermarks: string; count: number };\n pending: Pending[];\n canonical: unknown;\n documentListeners: Set<() => void>;\n documents: StatewireDocuments.State;\n lastPublished: unknown;\n changed: StatewirePath[];\n source: Statewire.StateSource;\n attach: AttachState;\n attachEpoch: number;\n running: boolean;\n pumping: boolean;\n transport: RemoteLink | null;\n waiters: (() => void)[];\n lifecycle: CommandsListener | null;\n notify: () => void;\n commands: Record<string, (...params: unknown[]) => Promise<unknown>>;\n};\n\nconst EMPTY_LANE: StatewireClient.SessionLane = { nextSeq: 1, commands: [] };\n\nconst laneOf = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n): StatewireClient.SessionLane =>\n Object.hasOwn(record.lanes, protocol) ? record.lanes[protocol]! : EMPTY_LANE;\n\nconst withLane = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n lane: StatewireClient.SessionLane,\n): StatewireClient.SessionRecord => ({\n ...record,\n lanes: { ...record.lanes, [protocol]: lane },\n});\n\nconst isEphemeral = (s: Session, protocol: string) =>\n s.selection?.protocols.some(\n (p) => p.name === protocol && p.record === \"ephemeral\",\n ) ?? false;\n\nconst durableSeqOf = (s: Session, protocol: string) =>\n Object.hasOwn(s.durableSeq, protocol) ? s.durableSeq[protocol]! : 0;\n\ntype Stamped = Pending & { seq: number };\n\nconst isStamped = (p: Pending): p is Stamped => p.seq !== undefined;\n\nconst isOutboxed = (p: Pending) => p.seq === undefined && !p.away;\n\n/** This client's stamped entries on the lane. */\nconst laneEntries = (s: Session, protocol: string): Stamped[] =>\n s.pending.filter(\n (p): p is Stamped => isStamped(p) && p.command.protocol === protocol,\n );\n\nconst sortPending = (s: Session) => {\n s.pending.sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity) || 0);\n};\n\ntype RemovalMark = NonNullable<StatewireClient.SessionLane[\"removed\"]>[number];\n\n// A removal another sharer must hear about: the marker lives until its\n// enqueuer consumes it or is gone.\nconst marks = (\n s: Session,\n lane: StatewireClient.SessionLane,\n removed: readonly { id: string; by?: string | undefined }[],\n failure?: StatewireClient.SendFailure,\n): { removed?: readonly RemovalMark[] } => {\n const added = removed\n .filter((c) => c.by !== undefined && c.by !== s.store.owner?.id)\n .map((c) => ({ id: c.id, by: c.by!, ...(failure && { failure }) }));\n const next = [...(lane.removed ?? []), ...added];\n return next.length > 0 ? { removed: next } : {};\n};\n\nconst withOutbox = (\n lane: StatewireClient.SessionLane,\n outbox: readonly StatewireClient.OutboxCommand[],\n): StatewireClient.SessionLane => {\n const { outbox: _outbox, ...rest } = lane;\n return outbox.length > 0 ? { ...rest, outbox } : rest;\n};\n\nconst outboxOf = (lane: StatewireClient.SessionLane) => lane.outbox ?? [];\n\nconst changed = (s: Session, p: Pending) => s.lifecycle?.onChange?.(p.inv);\n\nconst stamp = (s: Session, p: Pending, seq: number) => {\n p.seq = seq;\n p.inv.seq = seq;\n delete p.inv.held;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\nconst unstamp = (s: Session, p: Pending) => {\n p.seq = undefined;\n delete p.inv.seq;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\n// The pending invocation follows its stored entry: hold, local meta, params.\nconst follow = (\n s: Session,\n p: Pending,\n stored: StatewireClient.OutboxCommand,\n) => {\n let dirty = false;\n if ((p.inv.held === true) !== (stored.held === true)) {\n if (stored.held) p.inv.held = true;\n else delete p.inv.held;\n dirty = true;\n }\n if (p.inv.localMeta !== stored.localMeta) {\n if (stored.localMeta === undefined) delete p.inv.localMeta;\n else p.inv.localMeta = stored.localMeta;\n dirty = true;\n }\n if (p.command.params !== stored.params) {\n p.command = {\n ...p.command,\n params: stored.params,\n ...(stored.meta === undefined ? {} : { meta: stored.meta }),\n };\n if (stored.meta === undefined) delete p.command.meta;\n p.inv.params = paramsOf(stored);\n dirty = true;\n }\n if (dirty) changed(s, p);\n};\n\nconst paramsOf = (stored: { params: unknown[]; meta?: unknown }) =>\n stored.meta === undefined\n ? stored.params\n : (reviveValue(structuredClone(stored.params), stored.meta) as unknown[]);\n\nconst dropPending = (s: Session, p: Pending) => {\n s.pending = s.pending.filter((q) => q !== p);\n s.lifecycle?.onCovered?.(p.inv);\n};\n\nconst publish = (s: Session) => {\n if (s.canonical === s.lastPublished) return;\n s.lastPublished = s.canonical;\n s.notify();\n};\n\nconst wake = (s: Session) => {\n const waiters = s.waiters;\n s.waiters = [];\n for (const waiter of waiters) waiter();\n};\n\nconst waitForWake = (s: Session) => new Promise<void>((r) => s.waiters.push(r));\n\nconst sleepUntilWake = (s: Session, delayMs: number) =>\n new Promise<void>((resolve) => {\n const waiter = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n s.waiters = s.waiters.filter((w) => w !== waiter);\n resolve();\n }, delayMs);\n s.waiters.push(waiter);\n });\n\nconst storageFailed = (s: Session, cause: unknown) => {\n const error = wrapStorageError(cause);\n s.storageError = error;\n for (const entry of s.pending) entry.reject(error);\n s.transport?.storageFailed(error);\n};\n\nconst setRecord = (s: Session, record: StatewireClient.SessionRecord) => {\n if (!s.deactivated) {\n try {\n s.store.save(record);\n } catch (cause) {\n if (isQuota(cause)) throw cause;\n storageFailed(s, cause);\n throw s.storageError;\n }\n }\n s.record = record;\n s.notify();\n};\n\nconst toOutbox = (p: Pending): StatewireClient.OutboxCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n ...command,\n ts: p.inv.ts,\n ...(p.by !== undefined && { by: p.by }),\n ...(p.inv.held && { held: true as const }),\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst toStored = (s: Session, p: Stamped): StatewireClient.SessionCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n seq: p.seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n ...(p.by !== undefined && { by: p.by }),\n ...command,\n ts: p.inv.ts,\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst backlog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] =>\n laneEntries(s, protocol).map((p) => toStored(s, p));\n\nconst mergeBacklog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] => {\n const own = backlog(s, protocol);\n if (!s.shared) return own;\n // Another sharer's stamp stays until its owner settles it: the record is\n // where an enqueuer maps the seq back to its command.\n const foreign = laneOf(s.record, protocol).commands.filter(\n (c) => c.owner !== s.store.owner?.id,\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst durableLanes = (s: Session): string[] => [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending\n .map((p) => p.command.protocol)\n .filter((protocol) => !isEphemeral(s, protocol)),\n ]),\n];\n\nconst MAX_PARKED_VERDICTS = 64;\n\n// Storage holds what a reload must resend: a command leaves at its dur, at a\n// server verdict, or at a record reset — never at a local channel death.\nconst syncBacklogInner = (s: Session) => {\n if (s.shared && s.shared.notices.length > 0)\n noticeInner(s, s.shared.notices.splice(0));\n const parked = s.shared ? s.shared.parked.splice(0) : [];\n const settled = s.shared ? new Set(s.shared.settled) : new Set<string>();\n if (s.shared) s.shared.settled.clear();\n let lanes = s.record.lanes;\n for (const protocol of durableLanes(s)) {\n const lane = laneOf(s.record, protocol);\n // The record maps a parked seq to its command while it still holds the\n // stamp; the enqueuer finds the verdict by that id.\n const parkedHere = parked\n .filter((v) => v.protocol === protocol)\n .flatMap(({ verdict }) => {\n const id =\n verdict.id ?? lane.commands.find((c) => c.seq === verdict.seq)?.id;\n // No stamp left to map it: its owner already settled the command.\n if (id === undefined || settled.has(id)) return [];\n return [{ ...verdict, id }];\n });\n const parkedSeqs = new Set(parkedHere.map((v) => v.seq));\n const commands = mergeBacklog(s, protocol).filter(\n (c) => !parkedSeqs.has(c.seq),\n );\n const kept = (lane.verdicts ?? []).filter(\n (v) => v.id === undefined || !settled.has(v.id),\n );\n const verdicts =\n parkedHere.length > 0 || kept.length !== (lane.verdicts ?? []).length\n ? [...kept, ...parkedHere].slice(-MAX_PARKED_VERDICTS)\n : lane.verdicts;\n const unchanged =\n verdicts === lane.verdicts &&\n commands.length === lane.commands.length &&\n commands.every((c, i) => c.seq === lane.commands[i]!.seq);\n if (unchanged) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n};\n\nconst syncBacklog = (s: Session) => {\n const shared = s.shared;\n if (!shared) return syncBacklogInner(s);\n if (shared.syncQueued) return;\n shared.syncQueued = true;\n void transact(s, () => {\n shared.syncQueued = false;\n syncBacklogInner(s);\n }).catch(() => {\n shared.syncQueued = false;\n });\n};\n\n// Every record mutation over shared storage is a locked read-modify-write.\nconst transact = (s: Session, fn: () => void): Promise<void> => {\n if (!s.shared || s.deactivated) {\n fn();\n return Promise.resolve();\n }\n const shared = s.shared;\n const run = shared.txq.then(() =>\n s.store.lock!(async () => {\n const stored = await readStored(s);\n shared.inTx = true;\n try {\n refresh(s, stored);\n fn();\n } finally {\n shared.inTx = false;\n }\n watchOwners(s);\n s.notify();\n const persistence = s.store.flush?.();\n if (persistence) await persistence;\n }),\n );\n const result = run.catch((cause: unknown) => {\n storageFailed(s, cause);\n throw s.storageError;\n });\n shared.txq = result.then(\n () => {},\n () => {},\n );\n return result;\n};\n\nconst readStored = async (s: Session) =>\n s.store.read ? await s.store.read() : s.store.load();\n\n// Under the lock: the stored record is the truth about which sharer stamped\n// what; this client's entries follow it by id.\nconst refresh = (s: Session, stored: StatewireClient.SessionRecord | null) => {\n if (stored !== null && stored.clientId !== s.record.clientId) {\n adoptReset(s, stored);\n return;\n }\n if (stored !== null) s.record = boundInbox(s.store, stored);\n reconcileLocal(s);\n followReleases(s);\n};\n\nconst reconcileLocal = (s: Session) => {\n const me = s.store.owner?.id;\n for (const p of [...s.pending]) {\n const protocol = p.command.protocol;\n if (isEphemeral(s, protocol)) continue;\n const lane = laneOf(s.record, protocol);\n const queued = outboxOf(lane).find((c) => c.id === p.id);\n const stamped = lane.commands.find((c) => c.id === p.id);\n if (queued) {\n if (p.seq !== undefined || p.away) {\n if (p.adopted) {\n dropPending(s, p);\n continue;\n }\n unstamp(s, p);\n }\n follow(s, p, queued);\n } else if (stamped && stamped.owner !== me) {\n if (p.adopted) dropPending(s, p);\n else if (!p.away) {\n unstamp(s, p);\n p.away = true;\n }\n } else if (stamped) {\n if (p.seq !== stamped.seq) stamp(s, p, stamped.seq);\n } else if (!p.adopted && (isOutboxed(p) || p.away)) {\n const mark = lane.removed?.find((m) => m.id === p.id);\n if (mark === undefined) {\n p.away = true;\n continue;\n }\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(\n s,\n p,\n {\n ok: false,\n failure: mark.failure ?? { fate: \"aborted\", cause: \"removed\" },\n },\n mark.failure ? \"noticed\" : \"memory\",\n );\n const { removed: _removed, ...rest } = lane;\n const left = lane.removed!.filter((m) => m.id !== p.id);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...rest,\n ...(left.length > 0 && { removed: left }),\n }),\n );\n }\n }\n};\n\nconst locate = (\n s: Session,\n id: string,\n):\n | { protocol: string; stored: StatewireClient.OutboxCommand }\n | { protocol: string; stored?: undefined }\n | undefined => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const stored = outboxOf(lane).find((c) => c.id === id);\n if (stored) return { protocol, stored };\n if (lane.commands.some((c) => c.id === id)) return { protocol };\n }\n const p = s.pending.find((q) => q.id === id);\n if (p === undefined) return undefined;\n return isOutboxed(p) && isEphemeral(s, p.command.protocol)\n ? { protocol: p.command.protocol, stored: toOutbox(p) }\n : { protocol: p.command.protocol };\n};\n\nconst settleReleases = (\n s: Session,\n id: string,\n outcome:\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure },\n) => {\n const waiters = s.releases.get(id);\n if (waiters === undefined) return;\n s.releases.delete(id);\n for (const waiter of waiters) {\n if (outcome.ok) waiter.resolve(outcome.payload);\n else waiter.reject(new StatewireSendError(outcome.failure));\n }\n};\n\n// A release whose command another sharer settled: the record shows only that\n// it left, failed (a notice) or was taken unsent (a mark).\nconst followReleases = (s: Session) => {\n for (const id of [...s.releases.keys()]) {\n if (locate(s, id) !== undefined) continue;\n const lanes = Object.values(s.record.lanes);\n const notice = lanes\n .flatMap((lane) => lane.inbox ?? [])\n .find((n) => n.id === id);\n const mark = lanes\n .flatMap((lane) => lane.removed ?? [])\n .find((m) => m.id === id);\n const failure = notice?.failure ?? mark?.failure;\n settleReleases(\n s,\n id,\n failure\n ? { ok: false, failure }\n : {\n ok: true,\n payload:\n notice?.result === undefined\n ? undefined\n : paramsOf({\n params: notice.result.value,\n meta: notice.result.meta,\n })[0],\n },\n );\n }\n};\n\n// A sharer that stamped commands and left: once its owner lock frees,\n// another sharer takes its stamps over and reattaches, so the hello's\n// watermark settles them.\nconst watchOwners = (s: Session) => {\n const owner = s.store.owner;\n const shared = s.shared;\n if (!owner || !shared || !shared.abort || s.deactivated) return;\n const signal = shared.abort.signal;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (!offered(s, protocol)) continue;\n for (const { owner: id } of lane.commands) {\n if (id === undefined || id === owner.id || shared.watched.has(id))\n continue;\n shared.watched.add(id);\n owner.whenGone(id, signal).then(\n () => {\n if (!s.running) return;\n transactBackground(\n s,\n () => adoptOwner(s, id),\n () => {\n wake(s);\n void pump(s);\n },\n );\n },\n () => {},\n );\n }\n }\n};\n\nconst adoptOwner = (s: Session, gone: string | undefined) => {\n const me = s.store.owner?.id;\n let lanes = s.record.lanes;\n let adopted = false;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (gone !== undefined && lane.removed?.some((m) => m.by === gone)) {\n const { removed: _removed, ...rest } = laneOf(\n { ...s.record, lanes },\n protocol,\n );\n const left = lane.removed.filter((m) => m.by !== gone);\n lanes = {\n ...lanes,\n [protocol]: { ...rest, ...(left.length > 0 && { removed: left }) },\n };\n }\n if (!offered(s, protocol)) continue;\n const orphans = lane.commands.filter(\n (c) =>\n c.owner === gone &&\n (me === undefined || c.owner !== me) &&\n !s.pending.some((p) => p.id === c.id && p.seq === c.seq),\n );\n if (orphans.length === 0) continue;\n adopted = true;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.map((c) => {\n if (c.owner !== gone) return c;\n const { owner: _owner, ...rest } = c;\n return me === undefined ? rest : { ...rest, owner: me };\n }),\n },\n };\n for (const command of orphans) {\n const mine = s.pending.find((p) => p.id === command.id);\n if (mine) {\n stamp(s, mine, command.seq);\n mine.attempted = true;\n mine.stale = true;\n } else s.pending.push(adoptedPending(s, protocol, command));\n }\n }\n if (!adopted) return;\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n sortPending(s);\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\nconst adoptedPending = (\n s: Session,\n protocol: string,\n stored: StatewireClient.SessionCommand,\n): Pending => {\n const { seq, id, ts, owner: _owner, by, ...command } = stored;\n const params =\n command.meta === undefined\n ? command.params\n : (reviveValue(\n structuredClone(command.params),\n command.meta,\n ) as unknown[]);\n const entry: Pending = {\n id,\n seq,\n command: { protocol, ...command },\n inv: {\n protocol,\n method: command.method,\n params,\n ts,\n seq,\n id,\n clientId: s.record.clientId,\n },\n adopted: true,\n by,\n away: false,\n stale: true,\n attempted: true,\n posted: false,\n applied: false,\n resolve: () => {},\n reject: () => {},\n };\n s.lifecycle?.onStart(entry.inv);\n return entry;\n};\n\nconst transactBackground = (s: Session, fn: () => void, done?: () => void) => {\n void transact(s, fn).then(done, () => {});\n};\n\nconst setIdle = (s: Session, level: boolean) => {\n if (level === s.idle) return;\n s.idle = level;\n s.notify();\n if (level) s.onDone?.();\n};\n\nconst cover = (s: Session, entry: Pending) => {\n if (entry.applied) return;\n entry.applied = true;\n s.lifecycle?.onApplied(entry.inv);\n s.lifecycle?.onCovered?.(entry.inv);\n};\n\nexport const MAX_INBOX = 256;\n\ntype Outcome =\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure };\n\nconst updateOf = (\n protocol: string,\n stored: StatewireClient.StoredSettled,\n): Statewire.CommandUpdate => ({\n protocol,\n id: stored.id,\n method: stored.method,\n params: paramsOf(stored) as never[],\n ...(stored.seq !== undefined && { seq: stored.seq }),\n status: \"settled\",\n ...(stored.result !== undefined && {\n result: paramsOf({\n params: stored.result.value,\n meta: stored.result.meta,\n })[0],\n }),\n ...(stored.failure !== undefined && { failure: stored.failure }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n});\n\n// The inbox keeps the newest notices; the rest are reported as evicted.\nconst boundInbox = (\n store: StatewireClient.SessionStorage,\n record: StatewireClient.SessionRecord,\n): StatewireClient.SessionRecord => {\n let lanes = record.lanes;\n const dropped: Statewire.CommandUpdate[] = [];\n for (const [protocol, lane] of Object.entries(lanes)) {\n const inbox = lane.inbox;\n if (inbox === undefined || inbox.length <= MAX_INBOX) continue;\n const sorted = [...inbox].sort((x, y) => x.ts - y.ts);\n const cut = sorted.length - MAX_INBOX;\n dropped.push(...sorted.slice(0, cut).map((n) => updateOf(protocol, n)));\n lanes = { ...lanes, [protocol]: { ...lane, inbox: sorted.slice(cut) } };\n }\n if (dropped.length > 0) store.onEvict?.({ reason: \"inbox\", dropped });\n return lanes === record.lanes ? record : { ...record, lanes };\n};\n\nconst toNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n outcome: Outcome,\n): StatewireClient.StoredSettled => {\n const result = outcome.ok\n ? encodeParams(outcome.payload === undefined ? [] : [outcome.payload])\n : undefined;\n return {\n id: stored.id,\n method: stored.method,\n params: stored.params,\n ...(stored.meta !== undefined && { meta: stored.meta }),\n ts: stored.ts,\n ...(stored.seq !== undefined && { seq: stored.seq }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n ...(result !== undefined && {\n result: {\n value: result.params,\n ...(result.meta !== undefined && { meta: result.meta }),\n },\n }),\n ...(!outcome.ok && { failure: outcome.failure }),\n };\n};\n\nconst lostNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n) => toNotice(stored, { ok: false, failure: LOST });\n\nconst LOST = { fate: \"lost\", cause: \"session-lost\" } as const;\n\nconst withNotices = (\n lane: StatewireClient.SessionLane,\n notices: readonly StatewireClient.StoredSettled[],\n): StatewireClient.SessionLane => {\n const known = new Set((lane.inbox ?? []).map((n) => n.id));\n const added = notices.filter((n) => !known.has(n.id));\n return added.length === 0\n ? lane\n : { ...lane, inbox: [...(lane.inbox ?? []), ...added] };\n};\n\n// The settled update lands in the same write that drops the stamp: a reload\n// either resends the command or delivers the update.\ntype Notice = { entry: Stamped; outcome: Outcome };\n\nconst noticeInner = (s: Session, notices: readonly Notice[]) => {\n let record = s.record;\n for (const { entry, outcome } of notices) {\n const protocol = entry.command.protocol;\n const lane = laneOf(record, protocol);\n record = withLane(record, protocol, {\n ...withNotices(lane, [toNotice(toStored(s, entry), outcome)]),\n commands: lane.commands.filter((c) => c.id !== entry.id),\n });\n }\n setRecord(s, boundInbox(s.store, record));\n deliver(s);\n};\n\n// Shared storage: the update rides the next backlog sync's locked write.\nconst notice = (s: Session, entry: Stamped, outcome: Outcome) => {\n if (!s.shared || s.shared.inTx) {\n noticeInner(s, [{ entry, outcome }]);\n return;\n }\n s.shared.notices.push({ entry, outcome });\n syncBacklog(s);\n};\n\n/**\n * \"notice\": a stamped durable command persists its settled update; \"noticed\":\n * the caller already did; \"memory\": the update is best-effort only.\n */\ntype SettleMode = \"notice\" | \"noticed\" | \"memory\";\n\nconst settleEntry = (\n s: Session,\n entry: Pending,\n outcome: Outcome,\n mode: SettleMode = \"notice\",\n) => {\n s.pending = s.pending.filter((p) => p !== entry);\n if (s.shared && !entry.adopted) s.shared.settled.add(entry.id);\n settleReleases(s, entry.id, outcome);\n // The record keeps every unsettled command for the next attach; only a\n // command it no longer owns becomes a durable settled update.\n const durable =\n mode === \"noticed\" ||\n (mode === \"notice\" &&\n (outcome.ok || outcome.failure.cause !== \"unmount\") &&\n isStamped(entry) &&\n !isEphemeral(s, entry.command.protocol));\n if (durable && mode === \"notice\") notice(s, entry as Stamped, outcome);\n if (outcome.ok) {\n entry.resolve(outcome.payload);\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"accepted\", payload: outcome.payload },\n durable,\n );\n } else {\n entry.reject(new StatewireSendError(outcome.failure));\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"rejected\", error: new StatewireSendError(outcome.failure) },\n durable,\n );\n }\n};\n\nconst settleAll = (s: Session, detach: \"unmount\" | \"gone\") => {\n const cause =\n detach === \"unmount\" ? (\"unmount\" as const) : (\"stream-gone\" as const);\n const batch = s.pending;\n const detachFailure = (entry: Pending): StatewireClient.SendFailure => {\n if (entry.seq === undefined) return { fate: \"aborted\", cause };\n if (!entry.attempted) {\n const seq = entry.seq;\n const predecessorLost = batch.some(\n (p) =>\n p.command.protocol === entry.command.protocol &&\n p.seq !== undefined &&\n p.seq < seq &&\n p.attempted,\n );\n return predecessorLost\n ? { fate: \"aborted\", cause, predecessorLost }\n : { fate: \"aborted\", cause };\n }\n return { fate: \"lost\", cause };\n };\n for (const entry of [...batch]) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, { ok: false, failure: detachFailure(entry) });\n }\n};\n\nconst settleLost = (s: Session, entries: Pending[]) => {\n for (const entry of entries) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"lost\", cause: \"session-lost\" },\n });\n }\n};\n\nconst settleRemoved = (s: Session, entry: Pending) => {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"aborted\", cause: \"removed\" },\n });\n};\n\nconst requeue = (s: Session, survivors: Pending[]) => {\n for (const old of survivors) {\n s.lifecycle?.onCovered?.(old.inv);\n enqueueInner(s, old.command, old.inv.params, old.resolve, old.reject, {\n ...(old.inv.held && { hold: true }),\n ...(old.inv.localMeta !== undefined && { localMeta: old.inv.localMeta }),\n });\n }\n};\n\n// The server-side record's dedup memory is gone: history that may have\n// reached a server settles lost — the new hello's snapshot is the only\n// truth about what survived — and never-attempted statements re-stamp\n// on the adopted lane clocks.\nconst rebaseRecord = (s: Session, adopt: () => void) => {\n const held = s.pending.filter((p) => !p.adopted);\n const survivors = held.filter((p) => !p.attempted && !p.applied && !p.away);\n settleLost(\n s,\n held.filter((p) => !survivors.includes(p)),\n );\n for (const p of s.pending) if (p.adopted) s.lifecycle?.onCovered?.(p.inv);\n s.pending = [];\n s.durableSeq = {};\n // Failure notices ride through every record replacement.\n const previous = s.record.lanes;\n adopt();\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(previous)) {\n const current = laneOf({ ...s.record, lanes }, protocol);\n if (!lane.inbox?.length || current.inbox === lane.inbox) continue;\n lanes = { ...lanes, [protocol]: withNotices(current, lane.inbox) };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n requeue(s, survivors);\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () => setRecord(s, { clientId, lanes: {} }));\n\n// Another sharer replaced the record's identity: their reset settles our\n// attempted history and our survivors re-stamp on the stored clocks.\nconst adoptReset = (s: Session, stored: StatewireClient.SessionRecord) => {\n rebaseRecord(s, () => {\n s.record = boundInbox(s.store, stored);\n });\n // The host attributes frames by lease, and the lease is bound to the id\n // this attach was opened with.\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\n// The record died with the attach: mint a fresh id for the next one.\nconst ephemeralDetach = (s: Session) => {\n s.ephemeral = false;\n s.sessionKnown = false;\n resetRecord(s, newClientId());\n};\n\n// An ephemeral lane dies with its attach: attempted statements can never be\n// answered, the rest re-stamp from 1 for the next attach.\nconst detachEphemeralLanes = (s: Session) => {\n const held = s.pending.filter(\n (p) => isStamped(p) && isEphemeral(s, p.command.protocol),\n );\n if (held.length === 0) return;\n settleLost(\n s,\n held.filter((p) => p.attempted),\n );\n for (const p of held) if (!p.attempted) unstamp(s, p);\n sortPending(s);\n publish(s);\n};\n\nconst rejectedFailure = (cmd: StatewireCmd): StatewireClient.SendFailure => {\n return {\n fate: \"rejected\",\n cause: \"server\",\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n };\n};\n\nconst outcomeOf = (\n cmd: StatewireCmd,\n):\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure } => {\n switch (cmd.type) {\n case \"result\":\n return { ok: true, payload: reviveResponse(cmd).payload };\n case \"rejected\":\n return { ok: false, failure: rejectedFailure(reviveResponse(cmd)) };\n case \"failed\":\n return {\n ok: false,\n failure: {\n fate: \"failed\",\n cause: \"server\",\n ...(cmd.message !== undefined && { message: cmd.message }),\n },\n };\n case \"crashed\":\n return { ok: false, failure: { fate: \"crashed\", cause: \"server\" } };\n case \"expired\":\n return { ok: false, failure: { fate: \"expired\", cause: \"server\" } };\n default:\n return protocolError(`unknown cmd type: ${String(cmd.type)}`);\n }\n};\n\n// Only a result verdict carries applied effects; the rest drop the overlay unapplied.\nconst settleVerdict = (s: Session, entry: Pending, cmd: StatewireCmd) => {\n const outcome = outcomeOf(cmd);\n if (outcome.ok) cover(s, entry);\n else s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, outcome);\n};\n\nconst TERMINAL_CMD_TYPES: ReadonlySet<string> = new Set(TERMINAL);\n\n// A verdict for a seq another sharer stamped parks under the seq for that\n// owner; an adopted command's verdict parks under its id for the enqueuer.\nconst parkVerdict = (s: Session, cmd: StatewireCmd, id?: string) => {\n if (!s.shared || !TERMINAL_CMD_TYPES.has(cmd.type!)) return;\n if (isEphemeral(s, cmd.protocol)) return;\n s.shared.parked.push({\n protocol: cmd.protocol,\n verdict: {\n seq: cmd.seq,\n ...(id !== undefined && { id }),\n type: cmd.type as StatewireClient.SessionVerdict[\"type\"],\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n ...(cmd.meta !== undefined && { meta: cmd.meta }),\n },\n });\n};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (cmd.dur === true && !isEphemeral(s, cmd.protocol)) {\n const watermark = Math.max(durableSeqOf(s, cmd.protocol), cmd.seq);\n s.durableSeq[cmd.protocol] = watermark;\n for (const entry of laneEntries(s, cmd.protocol)) {\n if (entry.seq <= watermark) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = laneEntries(s, cmd.protocol).find((p) => p.seq === cmd.seq);\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) {\n parkVerdict(s, cmd);\n return;\n }\n if (entry.adopted) parkVerdict(s, cmd, entry.id);\n settleVerdict(s, entry, cmd);\n};\n\nconst consumeVerdicts = (s: Session) => {\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const verdicts = lane.verdicts ?? [];\n const consumed = new Set<number>();\n const forwarded: StatewireClient.SessionVerdict[] = [];\n let next = verdicts;\n for (const verdict of verdicts) {\n // By id: the stamp's owner settles it and forwards it to the enqueuer.\n const entry = s.pending.find(\n (p) =>\n p.command.protocol === protocol &&\n (verdict.id === undefined\n ? isStamped(p) && p.seq === verdict.seq\n : p.id === verdict.id),\n );\n if (!entry) continue;\n next = next.filter((v) => v !== verdict);\n consumed.add(verdict.seq);\n if (entry.adopted) forwarded.push({ ...verdict, id: entry.id });\n const { id: _id, ...cmd } = verdict;\n settleVerdict(s, entry, { ...cmd, protocol });\n }\n if (consumed.size === 0) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: [...next, ...forwarded].slice(-MAX_PARKED_VERDICTS),\n },\n };\n }\n if (lanes === s.record.lanes) return;\n setRecord(s, { ...s.record, lanes });\n publish(s);\n wake(s);\n};\n\nconst handleCmds = (s: Session, cmds: StatewireCmd[]) => {\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n wake(s);\n};\n\nconst ingestOps = (s: Session, ops: unknown[]) => {\n const applied = applyDocumentOps(s.documents, ops, s.selection?.protocols);\n s.documents = applied;\n const next =\n s.selection === undefined\n ? applied.documents.get(0)?.value\n : s.options.applicationProtocols === \"*\"\n ? Object.fromEntries(\n [...applied.documents].map(([id, d]) => [\n `${d.protocol}:${d.key === null ? id : JSON.stringify(d.key)}`,\n d.value,\n ]),\n )\n : mainDocument(applied, s.options.protocol ?? DEFAULT_PROTOCOL)?.value;\n if (next !== s.canonical)\n s.changed.push(\n ...(applied.changedPaths.length ? applied.changedPaths : [[]]),\n );\n s.canonical = next;\n};\n\nconst cacheDocuments = (s: Session) => {\n if (s.documentStore && s.selection) {\n for (const document of s.documents.documents.values()) {\n if (!document.protocol || !document.key) continue;\n const key = resolveDocumentKey(\n document.key,\n s.options.keyPrefixes?.[document.protocol],\n );\n const version = s.selection.protocols.find(\n (p) => p.name === document.protocol,\n )?.version;\n if (key !== undefined && version !== undefined)\n s.documentStore.save(\n [s.documentStore.namespace ?? \"\", document.protocol, ...key],\n { version, value: document.value },\n );\n }\n }\n};\n\nconst publishIngested = (s: Session) => {\n publish(s);\n cacheDocuments(s);\n for (const listener of s.documentListeners) listener();\n wake(s);\n};\n\n// The refusal's watermark is exact: every held statement above it was never\n// admitted by the live record, and the first unposted seq being beyond\n// watermark+1 proves the record that admitted the missing prefix is gone —\n// its history settles lost and the lane clock restarts at the watermark.\nconst sessionLostInner = (s: Session, protocol: string, seqWm: number) => {\n const lane = laneOf(s.record, protocol);\n const failure = { fate: \"lost\", cause: \"session-lost\" } as const;\n const held = laneEntries(s, protocol);\n s.durableSeq[protocol] = seqWm;\n const requeue =\n held.length > 0 &&\n s.onSessionLost?.(\n held.map((p) => ({\n id: p.id,\n method: p.inv.method,\n params: p.inv.params,\n ts: p.inv.ts,\n seq: p.seq,\n ...(p.inv.clientId !== undefined && { clientId: p.inv.clientId }),\n })),\n ) === \"requeue\";\n if (requeue) {\n if (s.onDeprecatedPath)\n s.onDeprecatedPath({ kind: \"session-lost-requeue\", count: held.length });\n else\n console.warn(\n `statewire: onSessionLost \"requeue\" re-enqueued ${held.length} commands; it is deprecated and will be removed`,\n );\n for (const p of held) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"memory\");\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...lane,\n nextSeq: seqWm + 1,\n commands: [],\n }),\n );\n for (const old of held)\n enqueueInner(\n s,\n old.command,\n old.inv.params,\n () => {},\n () => {},\n {\n ...(old.inv.localMeta !== undefined && {\n localMeta: old.inv.localMeta,\n }),\n },\n );\n } else {\n // Default: the whole queue goes, each command a failure notice.\n const stamps = mergeBacklog(s, protocol);\n const queued = outboxOf(lane);\n const { outbox: _outbox, ...rest } = lane;\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withNotices(rest, [\n ...stamps.map((c) => lostNotice(c)),\n ...queued.map((c) => lostNotice(c)),\n ]),\n nextSeq: seqWm + 1,\n commands: [],\n ...marks(\n s,\n lane,\n [\n ...stamps.map((c) => ({ id: c.id, by: c.by ?? c.owner })),\n ...queued,\n ],\n failure,\n ),\n }),\n );\n for (const p of s.pending.filter((q) => q.command.protocol === protocol)) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"noticed\");\n }\n deliver(s);\n }\n publish(s);\n wake(s);\n};\n\n// Every stamp above the watermark returns to the front of the outbox. A stamp\n// past watermark+1, or one this client saw admitted, proves the server record\n// that admitted it is gone. Another live sharer's stamp may still be on its\n// way on that sharer's attach: it and every stamp after it wait for a later\n// hello; the stamps before it never arrived and resend under their seqs.\nconst demote = (\n s: Session,\n protocol: string,\n watermark: number,\n demoted: Set<string>,\n waiting: Set<Pending>,\n) => {\n const lane = laneOf(s.record, protocol);\n const local = laneEntries(s, protocol).filter((p) => p.seq > watermark);\n const above = new Map(\n lane.commands.filter((c) => c.seq > watermark).map((c) => [c.id, c]),\n );\n for (const p of local) if (!above.has(p.id)) above.set(p.id, toStored(s, p));\n if (above.size === 0) return;\n const moved = [...above.values()].sort((a, b) => a.seq - b.seq);\n if (\n moved[0]!.seq > watermark + 1 ||\n moved[0]!.seq <= durableSeqOf(s, protocol) ||\n local.some((p) => p.applied)\n ) {\n sessionLostInner(s, protocol, watermark);\n return;\n }\n const me = s.store.owner?.id;\n const foreign = moved.find(\n (c) =>\n c.owner !== undefined &&\n c.owner !== me &&\n !local.some((p) => p.id === c.id),\n );\n if (foreign !== undefined) {\n for (const p of local) if (p.seq > foreign.seq) waiting.add(p);\n return;\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(lane, [\n ...moved.map(({ seq: _seq, owner: _owner, ...command }) => command),\n ...outboxOf(lane),\n ]),\n nextSeq: watermark + 1,\n commands: lane.commands.filter((c) => c.seq <= watermark),\n }),\n );\n for (const command of moved) demoted.add(command.id);\n for (const p of local) {\n if (p.adopted) dropPending(s, p);\n else unstamp(s, p);\n }\n sortPending(s);\n};\n\nconst recheckLater = (s: Session, watermarks: string) => {\n if (s.rechecks.watermarks !== watermarks)\n s.rechecks = { watermarks, count: 0 };\n s.rechecks.count += 1;\n if (s.recheck !== undefined) return;\n s.recheck = setTimeout(\n () => {\n s.recheck = undefined;\n if (s.running && s.attach === \"attached\")\n s.transport?.connection.reconnect();\n },\n backoff(s.rechecks.count + 1),\n );\n};\n\nconst gapFill = (s: Session) =>\n s.selection !== undefined && s.selection.version >= GAP_FILL_VERSION;\n\nconst selectionOf = (\n syn: StatewireSyn,\n): StatewireProtocol.Selection | undefined => {\n if (syn.version === undefined || syn.protocols === undefined)\n return undefined;\n return {\n version: syn.version,\n protocols: syn.protocols.map(({ name, version, record }) => {\n if (version === undefined)\n return protocolError(`hello lane ${name} has no version`);\n return { name, version, ...(record !== undefined && { record }) };\n }),\n };\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n if (s.attach === \"attached\") {\n s.ephemeralSeqs = {};\n detachEphemeralLanes(s);\n }\n for (const [protocol, value] of s.contexts) {\n if (s.attachContexts.get(protocol) === value)\n s.dirtyContexts.delete(protocol);\n else s.dirtyContexts.add(protocol);\n }\n s.attachContexts.clear();\n s.selection = selectionOf(syn);\n s.documents = { mode: null, documents: new Map() };\n ingestOps(s, ops);\n s.attach = \"attached\";\n s.attachEpoch += 1;\n s.frameFailures = 0;\n s.resumeAt = 0;\n const lanes = syn.protocols ?? [];\n s.ephemeral =\n lanes.length > 0 && lanes.every((lane) => lane.record === \"ephemeral\");\n if (s.ephemeral) s.deactivated = true;\n const attached = s.attachEntries;\n s.attachEntries = new Set();\n const reconcile = () => {\n // Statements at or below the watermark resend only to fetch their\n // verdicts (the server never re-runs them); seqs above it never arrived\n // and go back to the outbox for fresh ones.\n const demoted = new Set<string>();\n const waiting = new Set<Pending>();\n for (const lane of lanes) {\n if (lane.record === \"ephemeral\") {\n s.ephemeralSeqs[lane.name] = Math.max(\n Object.hasOwn(s.ephemeralSeqs, lane.name)\n ? s.ephemeralSeqs[lane.name]!\n : 0,\n ...laneEntries(s, lane.name).map((p) => p.seq),\n );\n continue;\n }\n demote(s, lane.name, lane.seq ?? 0, demoted, waiting);\n s.durableSeq[lane.name] = lane.seq ?? 0;\n }\n for (const entry of s.pending) {\n entry.posted =\n attached.has(entry) ||\n waiting.has(entry) ||\n (isStamped(entry) &&\n entry.seq <= durableSeqOf(s, entry.command.protocol) &&\n !isEphemeral(s, entry.command.protocol));\n entry.stale = false;\n }\n if (waiting.size > 0)\n recheckLater(\n s,\n JSON.stringify(lanes.map((lane) => [lane.name, lane.seq])),\n );\n else s.rechecks = { watermarks: \"\", count: 0 };\n syncBacklogInner(s);\n s.sessionKnown = true;\n flushInner(s, demoted);\n };\n if (!s.shared || s.deactivated) {\n reconcile();\n publishIngested(s);\n void pump(s);\n deliver(s);\n return;\n }\n transactBackground(s, reconcile, () => {\n publishIngested(s);\n void pump(s);\n deliver(s);\n });\n};\n\nconst handleOps = (\n s: Session,\n { ops, cmds }: { ops: unknown[]; cmds: StatewireCmd[] },\n) => {\n ingestOps(s, ops);\n for (const cmd of cmds) handleCmd(s, cmd);\n if (cmds.length > 0) syncBacklog(s);\n publishIngested(s);\n};\n\n// A retry-less {syn} refusal is the one session-loss verdict: a gap against\n// a durable lane's exact watermark settles that lane's history lost; a\n// pushback (retry present) or a gapless refusal only reconciles the resend queues.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const lanes = (syn.protocols ?? []).filter(\n (lane): lane is { name: string; seq: number } => lane.seq !== undefined,\n );\n for (const { name, seq } of lanes) {\n const watermark = isEphemeral(s, name)\n ? seq\n : Math.max(seq, durableSeqOf(s, name));\n for (const entry of laneEntries(s, name))\n entry.posted = entry.seq <= watermark;\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + retryHint(syn.retry);\n wake(s);\n void pump(s);\n return;\n }\n const gaps = lanes.filter(({ name, seq }) => {\n const first = laneEntries(s, name).find((p) => !p.posted);\n return (\n first !== undefined &&\n first.seq > Math.max(seq, durableSeqOf(s, name)) + 1\n );\n });\n for (const { name, seq } of gaps) {\n if (isEphemeral(s, name))\n protocolError(`gap on ephemeral lane ${name} after watermark ${seq}`);\n }\n // Another sharer holds the missing stamp: reattach, and the hello frees it.\n if (\n gaps.some(({ name, seq }) =>\n laneOf(s.record, name).commands.some(\n (c) => c.seq === seq + 1 && c.owner !== s.store.owner?.id,\n ),\n )\n ) {\n s.transport?.connection.reconnect();\n return;\n }\n if (gaps.length > 0) {\n transactBackground(\n s,\n () => {\n for (const { name, seq } of gaps) sessionLostInner(s, name, seq);\n },\n () => {\n wake(s);\n void pump(s);\n },\n );\n return;\n }\n wake(s);\n void pump(s);\n};\n\nconst handleDetach = (s: Session) => {\n if (s.attach === \"attached\") s.attach = \"detached\";\n s.ephemeralSeqs = {};\n if (s.ephemeral) ephemeralDetach(s);\n else detachEphemeralLanes(s);\n wake(s);\n};\n\nconst handleFinish = (s: Session, { reason }: { reason: string }) => {\n if (reason === \"reconnect\" || reason === \"error\") return;\n s.attach = \"finished\";\n settleAll(s, \"gone\");\n publish(s);\n wake(s);\n};\n\nconst isFinished = (s: Session) => s.attach === \"finished\";\n\ntype Lanes = {\n frame: StatewireFrame;\n entries: Stamped[];\n};\n\n// A lane must be strictly consecutive within a frame: the first unposted run\n// per lane rides now, later runs ride follow-up frames. Ephemeral lanes ignore\n// the gate: they live on the attach and never wait for persistence.\nconst buildLanes = (\n s: Session,\n cmdGate: \"persisted\" | \"all\" | \"none\" = \"all\",\n): Lanes | null => {\n const entries: Stamped[] = [];\n const last: Record<string, number> = {};\n const stopped = new Set<string>();\n for (const entry of s.pending) {\n if (entries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (!isStamped(entry)) continue;\n const protocol = entry.command.protocol;\n if (entry.posted || stopped.has(protocol)) continue;\n if (entry.stale) {\n stopped.add(protocol);\n continue;\n }\n const gated =\n !isEphemeral(s, protocol) &&\n (cmdGate === \"none\" ||\n (cmdGate === \"persisted\" &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= laneOf(s.persistedRecord, protocol).nextSeq)));\n if (\n gated ||\n (Object.hasOwn(last, protocol) && entry.seq !== last[protocol]! + 1)\n ) {\n stopped.add(protocol);\n continue;\n }\n last[protocol] = entry.seq;\n entries.push(entry);\n }\n const ctx = [...s.dirtyContexts].map((protocol) => s.contexts.get(protocol)!);\n if (entries.length === 0 && ctx.length === 0) return null;\n return {\n frame: {\n ...(ctx.length > 0 && { ctx }),\n ...(entries.length > 0 && {\n cmd: entries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n }),\n },\n entries,\n };\n};\n\n// Per durable lane with stamps awaiting a verdict: the seq below the oldest.\n// The hello answers everything above it, so nothing at or below the\n// watermark is ever re-sent.\nconst resultsCursor = (s: Session) => {\n const cursors = new Map<string, number>();\n for (const p of s.pending) {\n if (!isStamped(p) || isEphemeral(s, p.command.protocol)) continue;\n const protocol = p.command.protocol;\n cursors.set(protocol, Math.min(cursors.get(protocol) ?? p.seq, p.seq));\n }\n return [...cursors].map(([protocol, seq]) => ({ protocol, seq: seq - 1 }));\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachEntries = new Set();\n const wanted = s.lanesOnAttach;\n s.lanesOnAttach = false;\n for (const protocol of s.contexts.keys()) s.dirtyContexts.add(protocol);\n s.attachContexts = new Map(s.contexts);\n const lanes = buildLanes(s, wanted && s.sessionKnown ? \"persisted\" : \"none\");\n const res = resultsCursor(s);\n if (!lanes && res.length === 0) return null;\n s.attachEntries = new Set(lanes?.entries ?? []);\n for (const entry of lanes?.entries ?? []) entry.attempted = true;\n return { ...lanes?.frame, ...(res.length > 0 && { res }) };\n};\n\nconst persistBeforeSend = (s: Session): void | Promise<void> => {\n if (s.storageError !== undefined) throw s.storageError;\n if (!s.hydrated) return s.ready!.then(() => persistBeforeSend(s));\n const record = s.record;\n try {\n const pending = s.store.flush?.();\n if (pending)\n return pending.then(\n () => {\n s.persistedRecord = record;\n },\n (cause: unknown) => {\n throw wrapStorageError(cause);\n },\n );\n s.persistedRecord = record;\n } catch (cause) {\n throw wrapStorageError(cause);\n }\n};\n\nconst pump = async (s: Session) => {\n if (s.pumping) return;\n s.pumping = true;\n try {\n while (s.running && !isFinished(s)) {\n if (!s.hydrated) await s.ready;\n const transport = s.transport;\n const flushable = flushCandidates(s).length > 0;\n const queued =\n s.pending.some((p) => isOutboxed(p) && !p.inv.held) ||\n queuedInRecord(s);\n if (\n buildLanes(s) === null &&\n !flushable &&\n (!queued || s.attach === \"attached\")\n )\n return;\n const waiting = s.pending.length > 0 || queued;\n if (transport?.parked && !waiting) return;\n if (s.attach !== \"attached\" || !transport) {\n if (!waiting) return;\n if (\n (transport?.connection.status === \"standby\" &&\n transport.connection.reason === \"idle\") ||\n transport?.parked\n ) {\n transport.connection.reconnect();\n }\n await waitForWake(s);\n continue;\n }\n const resumeDelay = s.resumeAt - Date.now();\n if (resumeDelay > 0) {\n await sleepUntilWake(s, resumeDelay);\n continue;\n }\n if (flushable) {\n if (!s.sessionKnown) {\n await waitForWake(s);\n continue;\n }\n await flush(s);\n continue;\n }\n let lanes = buildLanes(s);\n if (!lanes) continue;\n const epoch = s.attachEpoch;\n const persistence = persistBeforeSend(s);\n if (persistence) await persistence;\n if (!s.running || isFinished(s)) return;\n if (epoch !== s.attachEpoch || s.attach !== \"attached\") continue;\n let result;\n try {\n // Shared storage: the lock across the send keeps per-lane arrival\n // ordered across sharers, and the frame is rebuilt from the record\n // as it stands, so a stamp another sharer freed never goes out.\n const send = (built: Lanes) => {\n for (const entry of built.entries) entry.attempted = true;\n return transport.send(built.frame);\n };\n result = await (s.shared && !s.deactivated && lanes.entries.length > 0\n ? s.store.lock!(async () => {\n refresh(s, await readStored(s));\n lanes = buildLanes(s);\n if (!lanes || epoch !== s.attachEpoch) return null;\n return send(lanes);\n })\n : send(lanes));\n } catch {\n if (!s.running || isFinished(s)) return;\n // The frame may have arrived. Under the gap-fill wire its seqs never\n // go out again: the next hello answers what arrived and frees the rest.\n if (lanes !== null && lanes.entries.length > 0 && gapFill(s)) {\n if (epoch !== s.attachEpoch) continue;\n for (const entry of lanes.entries)\n if (s.pending.includes(entry)) entry.posted = true;\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n if (s.running && epoch === s.attachEpoch && s.attach === \"attached\")\n transport.connection.reconnect();\n continue;\n }\n if (lanes?.frame.ctx?.length) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n await waitForWake(s);\n continue;\n }\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n continue;\n }\n if (!s.running) return;\n if (result === null || lanes === null) continue;\n s.frameFailures = 0;\n if (\n epoch === s.attachEpoch &&\n (result.type === \"ok\" || result.type === \"refusal\")\n ) {\n for (const entry of lanes.frame.ctx ?? []) {\n if (s.contexts.get(entry.protocol) === entry)\n s.dirtyContexts.delete(entry.protocol);\n }\n }\n if (result.type === \"ok\") {\n if (epoch === s.attachEpoch) {\n for (const entry of lanes.entries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\n }\n } else if (result.type === \"refusal\") {\n if (epoch === s.attachEpoch) handleRefusal(s, result.syn);\n } else if (result.type === \"stale-lease\") {\n // A POST outlived its attach: reattach first, the hello arbitrates.\n if (epoch === s.attachEpoch) {\n transport.connection.reconnect();\n await waitForWake(s);\n }\n } else if (result.type === \"no-lease\") {\n // No out-of-band write channel: the frame rides a fresh attach.\n if (epoch === s.attachEpoch) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n while (s.running && !isFinished(s) && epoch === s.attachEpoch) {\n await waitForWake(s);\n }\n }\n }\n }\n } catch (error) {\n storageFailed(s, error);\n } finally {\n s.pumping = false;\n }\n};\n\nconst start = (s: Session) => {\n s.running = true;\n if (!s.hydrated) {\n void s.ready!.then(\n () => {\n if (s.running) start(s);\n },\n () => {},\n );\n return;\n }\n if (s.shared) {\n s.shared.abort = new AbortController();\n s.shared.unsubscribe = s.store.subscribe!(() => {\n transactBackground(\n s,\n () => consumeVerdicts(s),\n () => {\n wake(s);\n void pump(s);\n deliver(s);\n },\n );\n });\n s.running = true;\n transactBackground(\n s,\n () => {\n if (s.store.load() === null) s.store.save(s.record);\n s.recordPersisted = true;\n adoptOwner(s, undefined);\n consumeVerdicts(s);\n },\n () => {\n void pump(s);\n deliver(s);\n },\n );\n return;\n }\n if (!s.recordPersisted) {\n s.recordPersisted = true;\n s.store.save(s.record);\n }\n adoptOwner(s, undefined);\n s.running = true;\n void pump(s);\n deliver(s);\n};\n\nconst stop = (s: Session) => {\n s.running = false;\n clearTimeout(s.recheck);\n s.recheck = undefined;\n if (s.shared) {\n s.shared.unsubscribe?.();\n s.shared.unsubscribe = null;\n s.shared.abort?.abort();\n s.shared.abort = null;\n s.shared.watched.clear();\n }\n wake(s);\n settleAll(s, \"unmount\");\n};\n\nconst setTransport = (s: Session, transport: RemoteLink) => {\n if (s.transport === transport) return;\n s.transport = transport;\n wake(s);\n};\n\ntype EnqueueOptions = {\n hold?: boolean;\n localMeta?: unknown;\n};\n\nconst QUOTA: StatewireClient.SendFailure = { fate: \"aborted\", cause: \"quota\" };\n\nconst isQuota = (error: unknown) =>\n error instanceof Error && error.name === \"StatewireQuotaError\";\n\nconst enqueueInner = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options: EnqueueOptions = {},\n) => {\n const protocol = command.protocol;\n const id = newClientId();\n const entry: Pending = {\n id,\n seq: undefined,\n command,\n inv: {\n protocol,\n method: command.method,\n params,\n ts: Date.now(),\n id,\n clientId: s.record.clientId,\n ...(options.hold && { held: true as const }),\n ...(options.localMeta !== undefined && { localMeta: options.localMeta }),\n },\n adopted: false,\n by: s.store.owner?.id,\n away: false,\n stale: false,\n attempted: false,\n posted: false,\n applied: false,\n resolve,\n reject,\n };\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n try {\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(lane, [...outboxOf(lane), toOutbox(entry)]),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n reject(new StatewireSendError(QUOTA));\n return;\n }\n s.pending.push(entry);\n reorder(s, protocol);\n } else s.pending.push(entry);\n s.lifecycle?.onStart(entry.inv);\n s.notify();\n};\n\nconst negotiated = (s: Session, protocol: string) =>\n s.selection?.protocols.some((p) => p.name === protocol) ?? false;\n\ntype Candidate = {\n protocol: string;\n stored: StatewireClient.OutboxCommand;\n};\n\nconst viewOf = (\n s: Session,\n protocol: string,\n stored: StatewireClient.OutboxCommand | StatewireClient.SessionCommand,\n state?: \"sending\",\n): StatewireClient.OutboxEntry => {\n const cached = s.views.get(stored);\n if (cached?.protocol === protocol) return cached;\n const view: StatewireClient.OutboxEntry = {\n id: stored.id,\n protocol,\n command: { method: stored.method, params: paramsOf(stored) },\n ts: stored.ts,\n state:\n state ??\n ((stored as StatewireClient.OutboxCommand).held ? \"held\" : \"queued\"),\n localMeta: stored.localMeta,\n durable: s.store.durable !== false && !isEphemeral(s, protocol),\n };\n s.views.set(stored, view);\n return view;\n};\n\n/** The lane's outbox as this client may flush it: the record's on a durable lane, its own on an ephemeral one. */\nconst laneQueue = (\n s: Session,\n protocol: string,\n): StatewireClient.OutboxCommand[] =>\n isEphemeral(s, protocol)\n ? s.pending\n .filter((p) => isOutboxed(p) && p.command.protocol === protocol)\n .map((p) => toOutbox(p))\n : [...outboxOf(laneOf(s.record, protocol))];\n\n// Bubble forward: each entry moves toward the front past held or waiting\n// entries it may overtake and stops behind the first it can't; the entries\n// with nothing held or waiting ahead are the ones a flush stamps.\nconst bubble = (\n s: Session,\n protocol: string,\n queue: readonly StatewireClient.OutboxCommand[],\n): { order: StatewireClient.OutboxCommand[]; free: number } => {\n const may = s.options.canOvertake?.[protocol];\n const order: { stored: StatewireClient.OutboxCommand; blocked: boolean }[] =\n [];\n for (const stored of queue) {\n if (stored.held) {\n order.push({ stored, blocked: true });\n continue;\n }\n let at = order.length;\n while (\n at > 0 &&\n order[at - 1]!.blocked &&\n may !== undefined &&\n may(\n viewOf(s, protocol, stored),\n viewOf(s, protocol, order[at - 1]!.stored),\n )\n )\n at--;\n order.splice(at, 0, { stored, blocked: at > 0 && order[at - 1]!.blocked });\n }\n const free = order.findIndex((o) => o.blocked);\n return {\n order: order.map((o) => o.stored),\n free: free === -1 ? order.length : free,\n };\n};\n\n/** Persists the lane's bubbled order. */\nconst reorder = (s: Session, protocol: string) => {\n if (isEphemeral(s, protocol)) return;\n const lane = laneOf(s.record, protocol);\n const { order } = bubble(s, protocol, outboxOf(lane));\n if (order.every((c, i) => c === outboxOf(lane)[i])) return;\n setRecord(s, withLane(s.record, protocol, withOutbox(lane, order)));\n};\n\nconst flushLanes = (s: Session) =>\n [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending.map((p) => p.command.protocol),\n ]),\n ].filter((protocol) => negotiated(s, protocol));\n\n/** Entries the next flush would stamp. */\nconst flushCandidates = (s: Session): Candidate[] =>\n flushLanes(s).flatMap((protocol) => {\n const { order, free } = bubble(s, protocol, laneQueue(s, protocol));\n return order.slice(0, free).map((stored) => ({ protocol, stored }));\n });\n\n// An entry the record holds that a flush would stamp once attached, whether\n// or not this page made the send: inserted, or kept from an earlier mount or\n// another sharer. It dials a parked or idle transport as a send does.\nconst queuedInRecord = (s: Session) =>\n Object.keys(s.record.lanes).some(\n (protocol) =>\n (s.selection ? negotiated(s, protocol) : offered(s, protocol)) &&\n bubble(s, protocol, laneQueue(s, protocol)).free > 0,\n );\n\nconst reasonOf = (\n s: Session,\n stored: StatewireClient.OutboxCommand,\n demoted: ReadonlySet<string>,\n): StatewireClient.FlushReason =>\n stored.released\n ? \"release\"\n : demoted.has(stored.id)\n ? \"reconnect\"\n : s.mountIds.has(stored.id)\n ? \"reload\"\n : \"enqueue\";\n\nconst NO_IDS: ReadonlySet<string> = new Set();\n\nconst patched = (\n stored: StatewireClient.OutboxCommand,\n patch: Patch,\n): StatewireClient.OutboxCommand => {\n const {\n held: _held,\n released: _released,\n localMeta: _meta,\n ...rest\n } = stored;\n const held = patch.held ?? stored.held === true;\n const localMeta =\n patch.localMeta === undefined ? stored.localMeta : patch.localMeta.value;\n let next: StatewireClient.OutboxCommand = {\n ...rest,\n ...(held && { held: true as const }),\n ...(!held &&\n (stored.held || stored.released) && { released: true as const }),\n ...(localMeta !== undefined && { localMeta }),\n };\n if (patch.params !== undefined) {\n const { params, meta } = encodeParams(patch.params);\n const { meta: _old, ...plain } = next;\n next = { ...plain, params, ...(meta !== undefined && { meta }) };\n }\n return next;\n};\n\n// Seqs are allocated here, under the lock, against the attach's watermark:\n// each outbox entry is stamped by exactly one sharer, in the bubbled order.\nconst flushInner = (s: Session, demoted: ReadonlySet<string> = NO_IDS) => {\n if (s.attach !== \"attached\" || !s.sessionKnown || !s.running || isFinished(s))\n return;\n const candidates = flushCandidates(s);\n if (candidates.length === 0) return;\n const groups = new Map<\n StatewireClient.FlushReason,\n StatewireClient.OutboxEntry[]\n >();\n for (const { protocol, stored } of candidates) {\n const reason = reasonOf(s, stored, demoted);\n groups.set(reason, [\n ...(groups.get(reason) ?? []),\n viewOf(s, protocol, stored),\n ]);\n }\n const flushing: Flushing = {\n ids: new Set(candidates.map((c) => c.stored.id)),\n patches: new Map(),\n removed: new Set(),\n };\n s.flushing = flushing;\n try {\n for (const [reason, commands] of groups) {\n try {\n s.onFlush?.({ commands, reason });\n } catch (error) {\n console.error(\"statewire: onFlush threw; stamping anyway\", error);\n }\n }\n } finally {\n s.flushing = null;\n }\n let record = s.record;\n for (const protocol of new Set(candidates.map((c) => c.protocol))) {\n const ephemeral = isEphemeral(s, protocol);\n const lane = laneOf(record, protocol);\n const removed: StatewireClient.OutboxCommand[] = [];\n const queue: StatewireClient.OutboxCommand[] = [];\n for (const stored of laneQueue(s, protocol)) {\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (flushing.removed.has(stored.id)) {\n removed.push(stored);\n if (own) settleRemoved(s, own);\n continue;\n }\n const patch = flushing.patches.get(stored.id);\n if (patch === undefined) {\n queue.push(stored);\n continue;\n }\n const next = patched(stored, patch);\n queue.push(next);\n if (own) follow(s, own, next);\n }\n const { order, free } = bubble(s, protocol, queue);\n let nextSeq = lane.nextSeq;\n const commands = [...lane.commands];\n for (const stored of order.slice(0, free)) {\n s.mountIds.delete(stored.id);\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (ephemeral) {\n const seq =\n (Object.hasOwn(s.ephemeralSeqs, protocol)\n ? s.ephemeralSeqs[protocol]!\n : 0) + 1;\n s.ephemeralSeqs[protocol] = seq;\n stamp(s, own!, seq);\n continue;\n }\n const seq = Math.max(nextSeq, durableSeqOf(s, protocol) + 1);\n nextSeq = seq + 1;\n const { held: _held, released: _released, ...command } = stored;\n const stamped: StatewireClient.SessionCommand = {\n ...command,\n seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n };\n commands.push(stamped);\n if (own) stamp(s, own, seq);\n else {\n const adopted = adoptedPending(s, protocol, stamped);\n adopted.stale = false;\n adopted.attempted = false;\n s.pending.push(adopted);\n }\n }\n if (ephemeral && removed.length === 0 && outboxOf(lane).length === 0)\n continue;\n const stampedIds = new Set(order.slice(0, free).map((c) => c.id));\n const rest = ephemeral\n ? outboxOf(lane).filter(\n (c) => !removed.some((r) => r.id === c.id) && !stampedIds.has(c.id),\n )\n : order.slice(free);\n record = withLane(record, protocol, {\n ...withOutbox(lane, rest),\n nextSeq,\n commands,\n ...marks(s, lane, removed),\n });\n }\n if (record !== s.record) setRecord(s, record);\n sortPending(s);\n s.notify();\n};\n\nconst flush = (s: Session): Promise<void> => {\n if (!s.shared) {\n flushInner(s);\n return Promise.resolve();\n }\n return transact(s, () => flushInner(s));\n};\n\nexport const outboxEntries = (\n s: Session,\n): readonly StatewireClient.OutboxEntry[] => {\n const local = s.pending.filter(\n (p) => isEphemeral(s, p.command.protocol) && !p.away,\n );\n const parts: unknown[] = [\n ...Object.values(s.record.lanes).flatMap((lane) => [\n lane.commands,\n lane.outbox,\n ]),\n ...local.flatMap((p) => [p, p.seq, p.inv.held, p.inv.localMeta]),\n ];\n const same =\n parts.length === s.outboxParts.length &&\n parts.every((part, i) => part === s.outboxParts[i]);\n if (!same) {\n s.outboxParts = parts;\n s.outboxList = [\n ...Object.entries(s.record.lanes).flatMap(([protocol, lane]) => [\n ...[...lane.commands]\n .sort((a, b) => a.seq - b.seq)\n .map((c) => viewOf(s, protocol, c, \"sending\")),\n ...outboxOf(lane).map((c) => viewOf(s, protocol, c)),\n ]),\n ...[...local]\n .sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity))\n .map((p) =>\n isStamped(p)\n ? viewOf(s, p.command.protocol, toStored(s, p), \"sending\")\n : viewOf(s, p.command.protocol, toOutbox(p)),\n ),\n ];\n }\n return s.outboxList;\n};\n\ntype OutboxOp =\n | { type: \"patch\"; patch: (entry: StatewireClient.OutboxEntry) => Patch }\n | { type: \"remove\" };\n\nconst entryOf = (s: Session, id: string) => {\n const at = locate(s, id);\n if (at === undefined) throw new Error(`outbox: no entry ${id}`);\n if (at.stored === undefined) throw new Error(`outbox: ${id} is in flight`);\n return { protocol: at.protocol, stored: at.stored };\n};\n\nconst applyOutboxOp = (s: Session, id: string, op: OutboxOp) => {\n const at = locate(s, id);\n if (at?.stored === undefined) return;\n const { protocol, stored } = at;\n const own = s.pending.find((p) => p.id === id && isOutboxed(p));\n if (op.type === \"remove\") {\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(\n lane,\n outboxOf(lane).filter((c) => c.id !== id),\n ),\n ...marks(s, lane, [stored]),\n }),\n );\n }\n if (own) settleRemoved(s, own);\n } else {\n const next = patched(stored, op.patch(viewOf(s, protocol, stored)));\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(\n lane,\n outboxOf(lane).map((c) => (c.id === id ? next : c)),\n ),\n ),\n );\n }\n if (own) follow(s, own, next);\n }\n reorder(s, protocol);\n s.notify();\n};\n\nconst toPatch = (patch: StatewireClient.OutboxPatch): Patch => {\n if (typeof patch !== \"object\" || patch === null)\n throw new Error(\"outbox: update must return a patch object\");\n if (patch.held !== undefined && typeof patch.held !== \"boolean\")\n throw new Error(\"outbox: held must be a boolean\");\n if (\n patch.command !== undefined &&\n (Object.keys(patch.command).some((k) => k !== \"params\") ||\n !Array.isArray(patch.command.params))\n )\n throw new Error(\"outbox: a patch may only replace command.params\");\n return {\n ...(patch.held !== undefined && { held: patch.held }),\n ...(\"localMeta\" in patch && { localMeta: { value: patch.localMeta } }),\n ...(patch.command !== undefined && { params: patch.command.params }),\n };\n};\n\nconst outboxOp = (s: Session, id: string, op: OutboxOp): Promise<void> => {\n entryOf(s, id);\n const flushing = s.flushing;\n if (flushing?.ids.has(id)) {\n if (op.type === \"remove\") flushing.removed.add(id);\n else {\n const at = entryOf(s, id);\n const patch = op.patch(viewOf(s, at.protocol, at.stored));\n flushing.patches.set(id, { ...flushing.patches.get(id), ...patch });\n }\n return Promise.resolve();\n }\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n applyOutboxOp(s, id, op);\n done();\n return Promise.resolve();\n }\n return transact(s, () => applyOutboxOp(s, id, op)).then(done);\n};\n\nconst background = (promise: Promise<void>) => {\n promise.catch(() => {});\n};\n\nexport const holdOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"patch\", patch: () => ({ held: true }) }));\n\nexport const releaseOutbox = (s: Session, id: string): Promise<unknown> => {\n entryOf(s, id);\n const result = new Promise<unknown>((resolve, reject) => {\n const waiters = s.releases.get(id) ?? [];\n waiters.push({ resolve, reject });\n s.releases.set(id, waiters);\n });\n result.catch(() => {});\n outboxOp(s, id, { type: \"patch\", patch: () => ({ held: false }) }).catch(\n (error: unknown) => settleWaiters(s, id, error),\n );\n return result;\n};\n\nconst settleWaiters = (s: Session, id: string, error: unknown) => {\n const waiters = s.releases.get(id) ?? [];\n s.releases.delete(id);\n for (const waiter of waiters) waiter.reject(error);\n};\n\nexport const removeOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"remove\" }));\n\nexport const updateOutbox = (\n s: Session,\n id: string,\n fn: (entry: StatewireClient.OutboxEntry) => StatewireClient.OutboxPatch,\n) =>\n background(\n outboxOp(s, id, { type: \"patch\", patch: (entry) => toPatch(fn(entry)) }),\n );\n\nconst producedOf = (\n s: Session,\n): NonNullable<StatewireClient.SessionCommand[\"produced\"]> => ({\n wire: s.options.wireVersion ?? { version: WIRE_VERSION },\n protocols:\n protocolOffers(s.options) === \"*\" && s.selection\n ? s.selection.protocols\n : protocolOffers(s.options),\n});\n\nconst placed = (\n queue: readonly StatewireClient.OutboxCommand[],\n entry: StatewireClient.OutboxCommand,\n { after, before }: { after?: string; before?: string },\n) => {\n const anchor = after ?? before;\n if (anchor === undefined) return [...queue, entry];\n const index = queue.findIndex((c) => c.id === anchor);\n if (index === -1) return [...queue, entry];\n const at = after !== undefined ? index + 1 : index;\n return [...queue.slice(0, at), entry, ...queue.slice(at)];\n};\n\nexport const insertOutbox = (\n s: Session,\n entry: StatewireClient.OutboxInsert,\n): string => {\n if (!s.hydrated) throw new Error(\"outbox: storage is not hydrated yet\");\n if (s.storageError !== undefined) throw s.storageError;\n if (entry.after !== undefined && entry.before !== undefined)\n throw new Error(\"outbox: after and before are exclusive\");\n for (const anchor of [entry.after, entry.before])\n if (anchor !== undefined) entryOf(s, anchor);\n const { protocol } = entry;\n if (!(s.selection ? negotiated(s, protocol) : offered(s, protocol)))\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n const { params, meta } = encodeParams(entry.command.params);\n const id = entry.from === undefined ? newClientId() : `${entry.from}~`;\n const stored: StatewireClient.OutboxCommand = {\n id,\n produced: producedOf(s),\n method: entry.command.method,\n params,\n ...(meta !== undefined && { meta }),\n ts: Date.now(),\n ...(entry.held && { held: true as const }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n ...(s.store.owner !== undefined && { by: s.store.owner.id }),\n };\n const run = () => {\n if (isEphemeral(s, protocol)) {\n enqueueInner(\n s,\n {\n protocol,\n produced: stored.produced!,\n method: stored.method,\n params,\n ...(meta !== undefined && { meta }),\n },\n entry.command.params,\n () => {},\n () => {},\n {\n ...(entry.held && { hold: true }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n },\n );\n return;\n }\n let base = s.record;\n if (entry.from !== undefined) {\n // Re-inserting a settled update consumes it in the same write: a\n // redelivery finds it gone.\n const source = Object.entries(base.lanes).find(([, l]) =>\n l.inbox?.some((n) => n.id === entry.from),\n );\n if (source === undefined || locate(s, id) !== undefined) return;\n base = withLane(base, source[0], withoutNotice(source[1], entry.from));\n }\n const lane = laneOf(base, protocol);\n try {\n setRecord(\n s,\n withLane(\n base,\n protocol,\n withOutbox(lane, placed(outboxOf(lane), stored, entry)),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n // The update stays unacked for the next mount.\n if (entry.from !== undefined) s.skipped.add(entry.from);\n settleReleases(s, id, { ok: false, failure: QUOTA });\n return;\n }\n s.mountIds.delete(id);\n reorder(s, protocol);\n s.notify();\n };\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n run();\n done();\n } else background(transact(s, run).then(done));\n return id;\n};\n\n// One sharer at a time runs the handler; the update leaves the record only\n// once it resolved, so a crash mid-handler redelivers it.\nconst nextNotice = (s: Session) => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const found = (lane.inbox ?? []).find((n) => !s.skipped.has(n.id));\n if (found) return { protocol, found };\n }\n return undefined;\n};\n\nconst withoutNotice = (\n lane: StatewireClient.SessionLane,\n id: string,\n): StatewireClient.SessionLane => {\n const inbox = (lane.inbox ?? []).filter((n) => n.id !== id);\n const { inbox: _inbox, ...rest } = lane;\n return inbox.length > 0 ? { ...rest, inbox } : rest;\n};\n\nconst ack = (s: Session, protocol: string, id: string) => {\n const lane = laneOf(s.record, protocol);\n if (s.skipped.has(id) || !lane.inbox?.some((n) => n.id === id)) return;\n setRecord(s, withLane(s.record, protocol, withoutNotice(lane, id)));\n};\n\nconst deliver = (s: Session) => {\n const handler = s.onSettled;\n // Handlers get ctx.state: delivery waits for the first hello.\n if (\n handler === undefined ||\n s.delivering ||\n !s.running ||\n !s.hydrated ||\n !s.sessionKnown\n )\n return;\n if (nextNotice(s) === undefined) return;\n s.delivering = true;\n const run = async () => {\n for (;;) {\n if (s.shared) await transact(s, () => {});\n else await null;\n const next = nextNotice(s);\n if (next === undefined || !s.running) return;\n const { protocol, found } = next;\n try {\n await handler(updateOf(protocol, found));\n } catch (error) {\n console.error(\n \"statewire: onCommandChange threw on a settled update; it stays for the next mount\",\n error,\n );\n s.skipped.add(found.id);\n continue;\n }\n if (s.shared) await transact(s, () => ack(s, protocol, found.id));\n else ack(s, protocol, found.id);\n s.notify();\n }\n };\n const locked = s.store.notifyLock ? s.store.notifyLock(run) : run();\n locked.then(\n () => {\n s.delivering = false;\n deliver(s);\n },\n (error: unknown) => {\n s.delivering = false;\n console.error(\"statewire: settled update delivery stopped\", error);\n },\n );\n};\n\nconst enqueue = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options?: EnqueueOptions,\n) => {\n if (!s.shared) {\n enqueueInner(s, command, params, resolve, reject, options);\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, () => {\n // A send queued behind the lock before this tab unmounted still lands in\n // the shared journal: another sharer adopts and replays it.\n if (isFinished(s)) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }));\n return;\n }\n enqueueInner(s, command, params, resolve, reject, options);\n }).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n};\n\nconst offered = (s: Session, protocol: string) => {\n const offers = protocolOffers(s.options);\n return offers === \"*\" || offers.some((offer) => offer.name === protocol);\n};\n\nconst sendCommand = (\n s: Session,\n method: string,\n params: readonly unknown[],\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n options?: StatewireClient.InvokeOptions,\n): Promise<unknown> => {\n const negotiated = s.selection\n ? s.selection.protocols.some((p) => p.name === protocol)\n : offered(s, protocol);\n if (!negotiated)\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n if (options?.hold !== undefined && typeof options.hold !== \"boolean\")\n throw new Error(\"statewire: invoke hold must be a boolean\");\n if (!s.hydrated) {\n const result = s.ready!.then(() =>\n sendCommand(s, method, params, protocol, options),\n );\n result.catch(() => {});\n return result;\n }\n if (s.storageError !== undefined) {\n const result = Promise.reject(s.storageError);\n result.catch(() => {});\n return result;\n }\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const result = new Promise<unknown>((resolve, reject) => {\n const { params: encoded, meta } = encodeParams(params);\n enqueue(\n s,\n {\n protocol,\n produced: producedOf(s),\n method,\n params: encoded,\n ...(meta !== undefined && { meta }),\n },\n params,\n resolve,\n reject,\n {\n ...(options?.hold && { hold: true }),\n ...(options?.localMeta !== undefined && {\n localMeta: options.localMeta,\n }),\n },\n );\n });\n result.catch(() => {});\n return result;\n};\n\nexport const documentSource = (s: Session): StatewireDocuments.Source => ({\n get: (protocol, key, prefix = s.options.keyPrefixes?.[protocol]) => {\n const mounted = findDocument(s.documents, protocol, key, prefix);\n if (mounted !== undefined) return mounted.value;\n if (!s.documentStore || key === undefined) return undefined;\n const absolute = resolveDocumentKey(key, prefix);\n if (absolute === undefined) return undefined;\n const cached = s.documentStore.load([\n s.documentStore.namespace ?? \"\",\n protocol,\n ...absolute,\n ]);\n if (cached === undefined) return undefined;\n const offers = protocolOffers(s.options);\n const offer =\n offers === \"*\"\n ? s.selection?.protocols.find((p) => p.name === protocol)\n : offers.find((p) => p.name === protocol);\n return offer !== undefined && inRange(cached.version, offer)\n ? cached.value\n : undefined;\n },\n list: () => s.documents.documents,\n subscribe: (listener) => {\n s.documentListeners.add(listener);\n return () => {\n s.documentListeners.delete(listener);\n };\n },\n});\n\nexport const invokeProtocol = (\n s: Session,\n protocol: string,\n method: string,\n params: readonly unknown[],\n options?: StatewireClient.InvokeOptions,\n) => sendCommand(s, method, params, protocol, options);\n\nconst storedCommandCompatible = (\n protocol: string,\n command: StatewireClient.OutboxCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\n !inRange(command.produced.wire.version, current.wire)\n )\n return false;\n const previous = command.produced.protocols;\n if (current.protocols === \"*\") return true;\n if (previous === \"*\") return false;\n const produced = previous.find((p) => p.name === protocol);\n const offer = current.protocols.find((p) => p.name === protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst validateLanes = (record: StatewireClient.SessionRecord) => {\n if (\n typeof record.lanes !== \"object\" ||\n record.lanes === null ||\n Object.values(record.lanes).some(\n (lane) =>\n !Array.isArray(lane.commands) ||\n (lane.outbox !== undefined && !Array.isArray(lane.outbox)),\n )\n )\n throw new Error(\n \"statewire: session storage loaded a record without command lanes\",\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null) validateLanes(stored);\n const current = {\n wire: options.wireVersion ?? { version: WIRE_VERSION },\n protocols: protocolOffers(options),\n };\n const compatible = (record: StatewireClient.SessionRecord) =>\n Object.entries(record.lanes).every(([protocol, lane]) =>\n [...lane.commands, ...outboxOf(lane)].every((command) =>\n storedCommandCompatible(protocol, command, current),\n ),\n );\n if (stored !== null && !compatible(stored)) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (stored !== null) {\n validateLanes(stored);\n if (!compatible(stored))\n throw new Error(\"statewire: migrated commands are incompatible\");\n store.save(stored);\n }\n }\n const record =\n stored === null\n ? { clientId: newClientId(), lanes: {} }\n : boundInbox(store, stored);\n if (record !== stored) store.save(record);\n return record;\n};\n\nconst storedIds = (record: StatewireClient.SessionRecord) =>\n new Set(\n Object.values(record.lanes).flatMap((lane) => [\n ...lane.commands.map((c) => c.id),\n ...outboxOf(lane).map((c) => c.id),\n ]),\n );\n\nexport const setContext = (\n s: Session,\n protocol: string,\n value: Statewire.Context,\n): void => {\n if (\n s.selection\n ? !s.selection.protocols.some((p) => p.name === protocol)\n : !offered(s, protocol)\n )\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n s.contexts.set(protocol, encodeContext(protocol, value));\n s.dirtyContexts.add(protocol);\n wake(s);\n void pump(s);\n};\n\nexport const useStatewireSession = (\n options: StatewireSessionOptions,\n): Session => {\n const [defaultStore] = useState(createMemorySessionStore);\n const mounted = useContext(SessionStorageContext);\n const documentStore = useContext(DocumentStorageContext);\n if (options.sessionStore !== undefined && mounted !== undefined) {\n throw new Error(\n \"statewire: session storage is set twice — drop the transport's sessionStore or the client's storage.session\",\n );\n }\n const store = options.sessionStore ?? mounted ?? defaultStore;\n if (\n (store.lock === undefined) !== (store.subscribe === undefined) ||\n (store.lock === undefined) !== (store.owner === undefined) ||\n (store.lock === undefined) !== (store.notifyLock === undefined)\n ) {\n throw new Error(\n \"statewire: session storage must provide lock, subscribe, owner and notifyLock together\",\n );\n }\n const [s] = useState((): Session => {\n const record =\n store.ready === undefined\n ? loadSessionRecord(store, options)\n : { clientId: newClientId(), lanes: {} };\n const session: Session = {\n options,\n configuredContext: options.context,\n contexts: new Map(\n Object.entries(options.context ?? {}).map(([protocol, value]) => [\n protocol,\n encodeContext(protocol, value),\n ]),\n ),\n dirtyContexts: new Set(Object.keys(options.context ?? {})),\n attachContexts: new Map(),\n selection: undefined,\n record,\n ctx: {\n beforeAttach: () => persistBeforeSend(session),\n get clientId() {\n return session.record.clientId;\n },\n takeAttachLanes: () => takeAttachLanes(session),\n onHello: (args) => handleHello(session, args),\n onOps: (args) => handleOps(session, args),\n onCmds: (cmds) => handleCmds(session, cmds),\n onRefusal: (syn) => handleRefusal(session, syn),\n onIdle: (level) => setIdle(session, level),\n onDetach: () => handleDetach(session),\n onFinish: (args) => handleFinish(session, args),\n },\n recordPersisted: store.ready === undefined,\n hydrated: store.ready === undefined,\n ready: undefined,\n storageError: undefined,\n persistedRecord: store.ready === undefined ? record : null,\n store,\n documentStore,\n shared:\n store.lock !== undefined\n ? {\n txq: Promise.resolve(),\n syncQueued: false,\n parked: [],\n settled: new Set(),\n notices: [],\n inTx: false,\n unsubscribe: null,\n watched: new Set(),\n abort: null,\n }\n : false,\n ephemeral: false,\n deactivated: false,\n sessionKnown: false,\n durableSeq: {},\n ephemeralSeqs: {},\n resumeAt: 0,\n idle: false,\n onSessionLost: undefined,\n onDeprecatedPath: undefined,\n onSettled: undefined,\n releases: new Map(),\n delivering: false,\n skipped: new Set(),\n views: new WeakMap(),\n onFlush: undefined,\n onDone: undefined,\n mountIds: storedIds(record),\n flushing: null,\n outboxList: [],\n outboxParts: [],\n lanesOnAttach: false,\n attachEntries: new Set(),\n frameFailures: 0,\n recheck: undefined,\n rechecks: { watermarks: \"\", count: 0 },\n pending: [],\n canonical: undefined,\n documentListeners: new Set(),\n documents: { mode: null, documents: new Map() },\n lastPublished: undefined,\n changed: [],\n source: {\n snapshot: () => session.canonical,\n takeChanged: () => {\n const changed = session.changed;\n session.changed = [];\n return changed;\n },\n setOnChange: (listener) => {\n session.notify = listener ?? (() => {});\n },\n },\n attach: \"detached\",\n attachEpoch: 0,\n running: false,\n pumping: false,\n transport: null,\n waiters: [],\n lifecycle: null,\n notify: () => {},\n commands: createMethodProxy((method, params) =>\n sendCommand(session, method, params),\n ),\n };\n if (store.ready !== undefined) {\n session.ready = store.ready.then(() => {\n session.record = loadSessionRecord(store, session.options);\n session.mountIds = storedIds(session.record);\n session.recordPersisted = true;\n session.hydrated = true;\n if (session.running) session.notify();\n });\n session.ready = session.ready.catch((cause: unknown) => {\n const error = wrapStorageError(cause);\n session.storageError = error;\n session.transport?.storageFailed(error);\n throw error;\n });\n session.ready.catch(() => {});\n }\n bindCommandsHost(session.commands, {\n setListener: (listener) => {\n session.lifecycle = listener;\n },\n });\n return session;\n });\n if ((store.lock !== undefined) !== (s.shared !== false)) {\n throw new Error(\n \"statewire: session storage changed sharedness across renders — lock/subscribe must be present from the first render or never\",\n );\n }\n useEffect(() => {\n if (s.configuredContext === options.context) return;\n s.configuredContext = options.context;\n for (const [protocol, value] of Object.entries(options.context ?? {}))\n setContext(s, protocol, value);\n }, [s, options.context]);\n s.options = options;\n s.store = store;\n s.documentStore = documentStore;\n s.onSessionLost = options.onSessionLost;\n s.onDeprecatedPath = options.onDeprecatedPath;\n s.onSettled = options.onSettled;\n s.onFlush = options.onFlush;\n s.onDone = options.onDone;\n const keyPrefixes = JSON.stringify(options.keyPrefixes);\n useEffect(() => {\n cacheDocuments(s);\n }, [s, documentStore, keyPrefixes]);\n useEffect(\n () =>\n documentStore?.subscribe?.(() => {\n for (const listener of s.documentListeners) listener();\n }),\n [s, documentStore],\n );\n useEffect(() => {\n start(s);\n return () => stop(s);\n }, [s]);\n return s;\n};\n\nexport { setTransport };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["encodeContext","wrapStorageError","DEFAULT_PROTOCOL","CLIENT_WIRE","GAP_FILL_VERSION","protocolOffers","inRange","StatewireProtocol","applyDocumentOps","mainDocument","findDocument","resolveDocumentKey","StatewireDocuments","useContext","useEffect","useState","StatewirePath","MAX_COMMANDS_PER_FRAME","TERMINAL","StatewireCmd","StatewireSyn","encodeParams","reviveResponse","reviveValue","bindCommandsHost","CommandsInvocation","CommandsListener","Statewire","StatewireClient","DocumentStorageContext","SessionStorageContext","createMemorySessionStore","backoff","retryHint","createMethodProxy","randomId","newClientId","StatewireSendError","RemoteLink","StatewireFrame","StatewireRemoteProps","WireCommand","protocol","produced","NonNullable","SessionCommand","method","params","meta","Invocation","K","Pending","id","seq","command","inv","adopted","by","away","stale","attempted","posted","applied","resolve","payload","reject","error","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","context","Readonly","Record","Context","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDeprecatedPath","OnDeprecatedPath","onSettled","OnSettled","onFlush","OnFlush","canOvertake","CanOvertake","onDone","Shared","txq","syncQueued","parked","verdict","SessionVerdict","settled","Set","notices","Notice","inTx","unsubscribe","watched","abort","AbortController","Patch","held","localMeta","value","Flushing","ids","ReadonlySet","patches","Map","removed","Waiter","Session","options","configuredContext","contexts","ReturnType","dirtyContexts","attachContexts","selection","Selection","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","ephemeralSeqs","resumeAt","reattach","idle","releases","delivering","skipped","views","WeakMap","OutboxEntry","mountIds","flushing","outboxList","outboxParts","lanesOnAttach","attachEntries","frameFailures","recheck","setTimeout","rechecks","watermarks","count","pending","canonical","documentListeners","documents","State","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","EMPTY_LANE","SessionLane","nextSeq","laneOf","Object","hasOwn","lanes","withLane","lane","isEphemeral","s","protocols","some","p","name","durableSeqOf","Stamped","isStamped","undefined","isOutboxed","laneEntries","filter","sortPending","sort","a","b","Infinity","RemovalMark","marks","added","c","owner","map","next","length","withOutbox","outbox","OutboxCommand","_outbox","rest","outboxOf","onChange","stamp","unstamp","follow","stored","dirty","paramsOf","structuredClone","dropPending","q","onCovered","publish","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","w","storageFailed","cause","entry","setRecord","save","isQuota","toOutbox","_protocol","ts","const","toStored","backlog","mergeBacklog","own","foreign","durableLanes","keys","MAX_PARKED_VERDICTS","syncBacklogInner","noticeInner","splice","clear","parkedHere","v","flatMap","find","has","parkedSeqs","kept","verdicts","slice","unchanged","every","i","syncBacklog","transact","fn","run","then","lock","readStored","refresh","watchOwners","persistence","flush","read","load","clientId","adoptReset","boundInbox","reconcileLocal","followReleases","me","queued","stamped","mark","m","settleEntry","ok","fate","_removed","left","locate","entries","settleReleases","outcome","get","delete","values","notice","inbox","n","signal","offered","add","whenGone","transactBackground","adoptOwner","pump","gone","orphans","_owner","mine","adoptedPending","connection","reconnect","onStart","done","setIdle","level","cover","onApplied","MAX_INBOX","Outcome","updateOf","StoredSettled","CommandUpdate","status","dropped","sorted","x","y","cut","onEvict","reason","toNotice","Omit","lostNotice","LOST","withNotices","known","deliver","SettleMode","mode","durable","onSettle","type","settleAll","detach","batch","detachFailure","predecessorLost","settleLost","settleRemoved","requeue","survivors","old","enqueueInner","hold","rebaseRecord","adopt","includes","previous","current","resetRecord","ephemeralDetach","detachEphemeralLanes","rejectedFailure","cmd","code","outcomeOf","String","settleVerdict","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","dur","watermark","Math","max","consumeVerdicts","consumed","forwarded","_id","size","handleCmds","cmds","ingestOps","ops","applicationProtocols","fromEntries","d","key","JSON","stringify","changedPaths","cacheDocuments","document","keyPrefixes","version","namespace","publishIngested","listener","sessionLostInner","seqWm","kind","console","warn","stamps","keep","demote","demoted","waiting","local","above","set","moved","_seq","recheckLater","gapFill","selectionOf","syn","carriedThrough","attached","carried","handleHello","reconcile","flushInner","handleOps","handleRefusal","stated","retry","Date","now","gaps","first","handleDetach","handleFinish","isFinished","Lanes","frame","buildLanes","cmdGate","last","stopped","gated","_produced","resultsCursor","cursors","min","takeAttachLanes","wanted","res","persistBeforeSend","delay","epoch","flushable","flushCandidates","queuedInRecord","resumeDelay","send","built","onPosted","start","subscribe","stop","setTransport","EnqueueOptions","QUOTA","reorder","negotiated","Candidate","viewOf","state","cached","view","laneQueue","bubble","queue","order","free","may","blocked","at","findIndex","o","flushLanes","reasonOf","FlushReason","released","NO_IDS","patched","patch","_held","_released","_meta","_old","plain","candidates","groups","stampedIds","outboxEntries","parts","same","part","OutboxOp","entryOf","applyOutboxOp","op","toPatch","OutboxPatch","k","Array","isArray","outboxOp","background","promise","holdOutbox","releaseOutbox","settleWaiters","removeOutbox","updateOutbox","producedOf","wire","wireVersion","placed","after","before","anchor","index","insertOutbox","OutboxInsert","from","base","entered","l","withoutNotice","later","position","nextNotice","found","_inbox","ack","handler","locked","notifyLock","enqueue","offers","offer","sendCommand","InvokeOptions","encoded","documentSource","Source","prefix","mounted","absolute","list","invokeProtocol","storedCommandCompatible","validateLanes","loadSessionRecord","compatible","migrate","storedIds","setContext","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener","reviveValue","newClientId"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { encodeContext } from \"../wire/context\";\nimport { wrapStorageError } from \"./storageError\";\nimport {\n DEFAULT_PROTOCOL,\n CLIENT_WIRE,\n GAP_FILL_VERSION,\n protocolOffers,\n inRange,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport {\n applyDocumentOps,\n mainDocument,\n findDocument,\n resolveDocumentKey,\n} from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useContext, useEffect, useState } from \"react\";\n\nimport type { StatewirePath } from \"../wire/ops\";\nimport { MAX_COMMANDS_PER_FRAME } from \"../wire/limits\";\nimport { TERMINAL } from \"./connection\";\nimport type { StatewireCmd, StatewireSyn } from \"./connection\";\nimport { encodeParams, reviveResponse, reviveValue } from \"../wire/meta\";\nimport { bindCommandsHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport {\n DocumentStorageContext,\n SessionStorageContext,\n createMemorySessionStore,\n} from \"./sessionStore\";\nimport { backoff, retryHint } from \"./timing\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport { randomId as newClientId } from \"../util/randomId\";\nimport { StatewireSendError } from \"../types\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n} from \"../transports/sse\";\n\ntype WireCommand = {\n protocol: string;\n produced?: NonNullable<StatewireClient.SessionCommand[\"produced\"]>;\n method: string;\n params: unknown[];\n meta?: unknown;\n};\n\ntype Invocation = {\n -readonly [K in keyof CommandsInvocation]: CommandsInvocation[K];\n};\n\ntype Pending = {\n readonly id: string;\n /** Unset while in the outbox, or while another sharer owns its stamp. */\n seq: number | undefined;\n command: WireCommand;\n readonly inv: Invocation;\n /** Enqueued by another sharer: this client holds no promise for it. */\n readonly adopted: boolean;\n /** The enqueuing sharer's owner id (shared storage only). */\n readonly by: string | undefined;\n /** Stamped by another sharer; settles from a verdict parked under its id. */\n away: boolean;\n /** Stamped against a watermark this attach has not confirmed: waits for the next hello. */\n stale: boolean;\n /** A send carrying this statement may have reached the server. */\n attempted: boolean;\n /** In the resend queue when false. */\n posted: boolean;\n /** The server acknowledged admission; the terminal verdict is still due. */\n applied: boolean;\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst rejectedSend = (\n failure: StatewireClient.SendFailure,\n): Promise<unknown> => {\n const result = Promise.reject<unknown>(new StatewireSendError(failure));\n result.catch(() => {});\n return result;\n};\n\ntype AttachState = \"detached\" | \"attached\" | \"finished\";\n\nexport type StatewireSessionOptions = StatewireProtocol.Options & {\n context?: Readonly<Record<string, Statewire.Context>>;\n sessionStore?: StatewireClient.SessionStorage | undefined;\n onSessionLost?: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath?: StatewireClient.OnDeprecatedPath | undefined;\n onSettled?: StatewireClient.OnSettled | undefined;\n onFlush?: StatewireClient.OnFlush | undefined;\n canOvertake?:\n | Readonly<Record<string, StatewireClient.CanOvertake>>\n | undefined;\n onDone?: (() => void) | undefined;\n};\n\ntype Shared = {\n txq: Promise<void>;\n syncQueued: boolean;\n parked: { protocol: string; verdict: StatewireClient.SessionVerdict }[];\n /** Own commands settled since the last backlog sync: verdicts parked for them are moot. */\n settled: Set<string>;\n /** Settled updates waiting for the next backlog sync. */\n notices: Notice[];\n /** A locked transaction is running its mutation. */\n inTx: boolean;\n unsubscribe: (() => void) | null;\n /** Owners whose departure this sharer awaits. */\n watched: Set<string>;\n abort: AbortController | null;\n};\n\ntype Patch = {\n held?: boolean;\n localMeta?: { value: unknown };\n params?: readonly unknown[];\n};\n\ntype Flushing = {\n ids: ReadonlySet<string>;\n patches: Map<string, Patch>;\n removed: Set<string>;\n};\n\ntype Waiter = {\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n configuredContext: StatewireSessionOptions[\"context\"];\n contexts: Map<string, ReturnType<typeof encodeContext>>;\n dirtyContexts: Set<string>;\n attachContexts: Map<string, ReturnType<typeof encodeContext>>;\n selection: StatewireProtocol.Selection | undefined;\n record: StatewireClient.SessionRecord;\n ctx: StatewireRemoteProps;\n recordPersisted: boolean;\n hydrated: boolean;\n ready: Promise<void> | undefined;\n storageError: unknown;\n persistedRecord: StatewireClient.SessionRecord | null;\n store: StatewireClient.SessionStorage;\n documentStore: StatewireDocuments.Storage | undefined;\n shared: Shared | false;\n /** Every selected lane is ephemeral: the record dies with the attach. */\n ephemeral: boolean;\n /** An ephemeral record died with its attach: the storage is off for good. */\n deactivated: boolean;\n sessionKnown: boolean;\n durableSeq: Record<string, number>;\n /** Ephemeral lane clocks: restart at 1 on every attach. */\n ephemeralSeqs: Record<string, number>;\n resumeAt: number;\n /** A refusal named sent durable stamps: a reattach's hello decides them, after `resumeAt`. */\n reattach: boolean;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath: StatewireClient.OnDeprecatedPath | undefined;\n onSettled: StatewireClient.OnSettled | undefined;\n onFlush: StatewireClient.OnFlush | undefined;\n onDone: (() => void) | undefined;\n /** `outbox.release` promises by entry id. */\n releases: Map<string, Waiter[]>;\n delivering: boolean;\n /** Notices whose handler threw on this mount. */\n skipped: Set<string>;\n views: WeakMap<object, StatewireClient.OutboxEntry>;\n /** Outbox and stamped ids stored before this client mounted. */\n mountIds: Set<string>;\n flushing: Flushing | null;\n outboxList: readonly StatewireClient.OutboxEntry[];\n outboxParts: readonly unknown[];\n lanesOnAttach: boolean;\n attachEntries: ReadonlySet<Pending>;\n frameFailures: number;\n /** A later hello decides stamps this one could not: another live sharer's stamp sat below them. */\n recheck: ReturnType<typeof setTimeout> | undefined;\n /** Hellos in a row that left stamps waiting at the same watermarks: the recheck backs off. */\n rechecks: { watermarks: string; count: number };\n pending: Pending[];\n canonical: unknown;\n documentListeners: Set<() => void>;\n documents: StatewireDocuments.State;\n lastPublished: unknown;\n changed: StatewirePath[];\n source: Statewire.StateSource;\n attach: AttachState;\n attachEpoch: number;\n running: boolean;\n pumping: boolean;\n transport: RemoteLink | null;\n waiters: (() => void)[];\n lifecycle: CommandsListener | null;\n notify: () => void;\n commands: Record<string, (...params: unknown[]) => Promise<unknown>>;\n};\n\nconst EMPTY_LANE: StatewireClient.SessionLane = { nextSeq: 1, commands: [] };\n\nconst laneOf = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n): StatewireClient.SessionLane =>\n Object.hasOwn(record.lanes, protocol) ? record.lanes[protocol]! : EMPTY_LANE;\n\nconst withLane = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n lane: StatewireClient.SessionLane,\n): StatewireClient.SessionRecord => ({\n ...record,\n lanes: { ...record.lanes, [protocol]: lane },\n});\n\nconst isEphemeral = (s: Session, protocol: string) =>\n s.selection?.protocols.some(\n (p) => p.name === protocol && p.record === \"ephemeral\",\n ) ?? false;\n\nconst durableSeqOf = (s: Session, protocol: string) =>\n Object.hasOwn(s.durableSeq, protocol) ? s.durableSeq[protocol]! : 0;\n\ntype Stamped = Pending & { seq: number };\n\nconst isStamped = (p: Pending): p is Stamped => p.seq !== undefined;\n\nconst isOutboxed = (p: Pending) => p.seq === undefined && !p.away;\n\n/** This client's stamped entries on the lane. */\nconst laneEntries = (s: Session, protocol: string): Stamped[] =>\n s.pending.filter(\n (p): p is Stamped => isStamped(p) && p.command.protocol === protocol,\n );\n\nconst sortPending = (s: Session) => {\n s.pending.sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity) || 0);\n};\n\ntype RemovalMark = NonNullable<StatewireClient.SessionLane[\"removed\"]>[number];\n\n// A removal another sharer must hear about: the marker lives until its\n// enqueuer consumes it or is gone.\nconst marks = (\n s: Session,\n lane: StatewireClient.SessionLane,\n removed: readonly { id: string; by?: string | undefined }[],\n failure?: StatewireClient.SendFailure,\n): { removed?: readonly RemovalMark[] } => {\n const added = removed\n .filter((c) => c.by !== undefined && c.by !== s.store.owner?.id)\n .map((c) => ({ id: c.id, by: c.by!, ...(failure && { failure }) }));\n const next = [...(lane.removed ?? []), ...added];\n return next.length > 0 ? { removed: next } : {};\n};\n\nconst withOutbox = (\n lane: StatewireClient.SessionLane,\n outbox: readonly StatewireClient.OutboxCommand[],\n): StatewireClient.SessionLane => {\n const { outbox: _outbox, ...rest } = lane;\n return outbox.length > 0 ? { ...rest, outbox } : rest;\n};\n\nconst outboxOf = (lane: StatewireClient.SessionLane) => lane.outbox ?? [];\n\nconst changed = (s: Session, p: Pending) => s.lifecycle?.onChange?.(p.inv);\n\nconst stamp = (s: Session, p: Pending, seq: number) => {\n p.seq = seq;\n p.inv.seq = seq;\n delete p.inv.held;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\nconst unstamp = (s: Session, p: Pending) => {\n p.seq = undefined;\n delete p.inv.seq;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\n// The pending invocation follows its stored entry: hold, local meta, params.\nconst follow = (\n s: Session,\n p: Pending,\n stored: StatewireClient.OutboxCommand,\n) => {\n let dirty = false;\n if ((p.inv.held === true) !== (stored.held === true)) {\n if (stored.held) p.inv.held = true;\n else delete p.inv.held;\n dirty = true;\n }\n if (p.inv.localMeta !== stored.localMeta) {\n if (stored.localMeta === undefined) delete p.inv.localMeta;\n else p.inv.localMeta = stored.localMeta;\n dirty = true;\n }\n if (p.command.params !== stored.params) {\n p.command = {\n ...p.command,\n params: stored.params,\n ...(stored.meta === undefined ? {} : { meta: stored.meta }),\n };\n if (stored.meta === undefined) delete p.command.meta;\n p.inv.params = paramsOf(stored);\n dirty = true;\n }\n if (dirty) changed(s, p);\n};\n\nconst paramsOf = (stored: { params: unknown[]; meta?: unknown }) =>\n stored.meta === undefined\n ? stored.params\n : (reviveValue(structuredClone(stored.params), stored.meta) as unknown[]);\n\nconst dropPending = (s: Session, p: Pending) => {\n s.pending = s.pending.filter((q) => q !== p);\n s.lifecycle?.onCovered?.(p.inv);\n};\n\nconst publish = (s: Session) => {\n if (s.canonical === s.lastPublished) return;\n s.lastPublished = s.canonical;\n s.notify();\n};\n\nconst wake = (s: Session) => {\n const waiters = s.waiters;\n s.waiters = [];\n for (const waiter of waiters) waiter();\n};\n\nconst waitForWake = (s: Session) => new Promise<void>((r) => s.waiters.push(r));\n\nconst sleepUntilWake = (s: Session, delayMs: number) =>\n new Promise<void>((resolve) => {\n const waiter = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n s.waiters = s.waiters.filter((w) => w !== waiter);\n resolve();\n }, delayMs);\n s.waiters.push(waiter);\n });\n\nconst storageFailed = (s: Session, cause: unknown) => {\n const error = wrapStorageError(cause);\n s.storageError = error;\n for (const entry of s.pending) entry.reject(error);\n s.transport?.storageFailed(error);\n};\n\nconst setRecord = (s: Session, record: StatewireClient.SessionRecord) => {\n if (!s.deactivated) {\n try {\n s.store.save(record);\n } catch (cause) {\n if (isQuota(cause)) throw cause;\n storageFailed(s, cause);\n throw s.storageError;\n }\n }\n s.record = record;\n s.notify();\n};\n\nconst toOutbox = (p: Pending): StatewireClient.OutboxCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n ...command,\n ts: p.inv.ts,\n ...(p.by !== undefined && { by: p.by }),\n ...(p.inv.held && { held: true as const }),\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst toStored = (s: Session, p: Stamped): StatewireClient.SessionCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n seq: p.seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n ...(p.by !== undefined && { by: p.by }),\n ...command,\n ts: p.inv.ts,\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst backlog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] =>\n laneEntries(s, protocol).map((p) => toStored(s, p));\n\nconst mergeBacklog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] => {\n const own = backlog(s, protocol);\n if (!s.shared) return own;\n // Another sharer's stamp stays until its owner settles it: the record is\n // where an enqueuer maps the seq back to its command.\n const foreign = laneOf(s.record, protocol).commands.filter(\n (c) => c.owner !== s.store.owner?.id,\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst durableLanes = (s: Session): string[] => [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending\n .map((p) => p.command.protocol)\n .filter((protocol) => !isEphemeral(s, protocol)),\n ]),\n];\n\nconst MAX_PARKED_VERDICTS = 64;\n\n// Storage holds what a reload must resend: a command leaves at its dur, at a\n// server verdict, or at a record reset — never at a local channel death.\nconst syncBacklogInner = (s: Session) => {\n if (s.shared && s.shared.notices.length > 0)\n noticeInner(s, s.shared.notices.splice(0));\n const parked = s.shared ? s.shared.parked.splice(0) : [];\n const settled = s.shared ? new Set(s.shared.settled) : new Set<string>();\n if (s.shared) s.shared.settled.clear();\n let lanes = s.record.lanes;\n for (const protocol of durableLanes(s)) {\n const lane = laneOf(s.record, protocol);\n // The record maps a parked seq to its command while it still holds the\n // stamp; the enqueuer finds the verdict by that id.\n const parkedHere = parked\n .filter((v) => v.protocol === protocol)\n .flatMap(({ verdict }) => {\n const id =\n verdict.id ?? lane.commands.find((c) => c.seq === verdict.seq)?.id;\n // No stamp left to map it: its owner already settled the command.\n if (id === undefined || settled.has(id)) return [];\n return [{ ...verdict, id }];\n });\n const parkedSeqs = new Set(parkedHere.map((v) => v.seq));\n const commands = mergeBacklog(s, protocol).filter(\n (c) => !parkedSeqs.has(c.seq),\n );\n const kept = (lane.verdicts ?? []).filter(\n (v) => v.id === undefined || !settled.has(v.id),\n );\n const verdicts =\n parkedHere.length > 0 || kept.length !== (lane.verdicts ?? []).length\n ? [...kept, ...parkedHere].slice(-MAX_PARKED_VERDICTS)\n : lane.verdicts;\n const unchanged =\n verdicts === lane.verdicts &&\n commands.length === lane.commands.length &&\n commands.every((c, i) => c.seq === lane.commands[i]!.seq);\n if (unchanged) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n};\n\nconst syncBacklog = (s: Session) => {\n const shared = s.shared;\n if (!shared) return syncBacklogInner(s);\n if (shared.syncQueued) return;\n shared.syncQueued = true;\n void transact(s, () => {\n shared.syncQueued = false;\n syncBacklogInner(s);\n }).catch(() => {\n shared.syncQueued = false;\n });\n};\n\n// Every record mutation over shared storage is a locked read-modify-write.\nconst transact = (s: Session, fn: () => void): Promise<void> => {\n if (!s.shared || s.deactivated) {\n fn();\n return Promise.resolve();\n }\n const shared = s.shared;\n const run = shared.txq.then(() =>\n s.store.lock!(async () => {\n const stored = await readStored(s);\n shared.inTx = true;\n try {\n refresh(s, stored);\n fn();\n } finally {\n shared.inTx = false;\n }\n watchOwners(s);\n s.notify();\n const persistence = s.store.flush?.();\n if (persistence) await persistence;\n }),\n );\n const result = run.catch((cause: unknown) => {\n storageFailed(s, cause);\n throw s.storageError;\n });\n shared.txq = result.then(\n () => {},\n () => {},\n );\n return result;\n};\n\nconst readStored = async (s: Session) =>\n s.store.read ? await s.store.read() : s.store.load();\n\n// Under the lock: the stored record is the truth about which sharer stamped\n// what; this client's entries follow it by id.\nconst refresh = (s: Session, stored: StatewireClient.SessionRecord | null) => {\n if (stored !== null && stored.clientId !== s.record.clientId) {\n adoptReset(s, stored);\n return;\n }\n if (stored !== null) s.record = boundInbox(s.store, stored);\n reconcileLocal(s);\n followReleases(s);\n};\n\nconst reconcileLocal = (s: Session) => {\n const me = s.store.owner?.id;\n for (const p of [...s.pending]) {\n const protocol = p.command.protocol;\n if (isEphemeral(s, protocol)) continue;\n const lane = laneOf(s.record, protocol);\n const queued = outboxOf(lane).find((c) => c.id === p.id);\n const stamped = lane.commands.find((c) => c.id === p.id);\n if (queued) {\n if (p.seq !== undefined || p.away) {\n if (p.adopted) {\n dropPending(s, p);\n continue;\n }\n unstamp(s, p);\n }\n follow(s, p, queued);\n } else if (stamped && stamped.owner !== me) {\n if (p.adopted) dropPending(s, p);\n else if (!p.away) {\n unstamp(s, p);\n p.away = true;\n }\n } else if (stamped) {\n if (p.seq !== stamped.seq) stamp(s, p, stamped.seq);\n } else if (!p.adopted && (isOutboxed(p) || p.away)) {\n const mark = lane.removed?.find((m) => m.id === p.id);\n if (mark === undefined) {\n p.away = true;\n continue;\n }\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(\n s,\n p,\n {\n ok: false,\n failure: mark.failure ?? { fate: \"aborted\", cause: \"removed\" },\n },\n mark.failure ? \"noticed\" : \"memory\",\n );\n const { removed: _removed, ...rest } = lane;\n const left = lane.removed!.filter((m) => m.id !== p.id);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...rest,\n ...(left.length > 0 && { removed: left }),\n }),\n );\n }\n }\n};\n\nconst locate = (\n s: Session,\n id: string,\n):\n | { protocol: string; stored: StatewireClient.OutboxCommand }\n | { protocol: string; stored?: undefined }\n | undefined => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const stored = outboxOf(lane).find((c) => c.id === id);\n if (stored) return { protocol, stored };\n if (lane.commands.some((c) => c.id === id)) return { protocol };\n }\n const p = s.pending.find((q) => q.id === id);\n if (p === undefined) return undefined;\n return isOutboxed(p) && isEphemeral(s, p.command.protocol)\n ? { protocol: p.command.protocol, stored: toOutbox(p) }\n : { protocol: p.command.protocol };\n};\n\nconst settleReleases = (\n s: Session,\n id: string,\n outcome:\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure },\n) => {\n const waiters = s.releases.get(id);\n if (waiters === undefined) return;\n s.releases.delete(id);\n for (const waiter of waiters) {\n if (outcome.ok) waiter.resolve(outcome.payload);\n else waiter.reject(new StatewireSendError(outcome.failure));\n }\n};\n\n// A release whose command another sharer settled: the record shows only that\n// it left, failed (a notice) or was taken unsent (a mark).\nconst followReleases = (s: Session) => {\n for (const id of [...s.releases.keys()]) {\n if (locate(s, id) !== undefined) continue;\n const lanes = Object.values(s.record.lanes);\n const notice = lanes\n .flatMap((lane) => lane.inbox ?? [])\n .find((n) => n.id === id);\n const mark = lanes\n .flatMap((lane) => lane.removed ?? [])\n .find((m) => m.id === id);\n const failure = notice?.failure ?? mark?.failure;\n settleReleases(\n s,\n id,\n failure\n ? { ok: false, failure }\n : {\n ok: true,\n payload:\n notice?.result === undefined\n ? undefined\n : paramsOf({\n params: notice.result.value,\n meta: notice.result.meta,\n })[0],\n },\n );\n }\n};\n\n// A sharer that stamped commands and left: once its owner lock frees,\n// another sharer takes its stamps over and reattaches, so the hello's\n// watermark settles them.\nconst watchOwners = (s: Session) => {\n const owner = s.store.owner;\n const shared = s.shared;\n if (!owner || !shared || !shared.abort || s.deactivated) return;\n const signal = shared.abort.signal;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (!offered(s, protocol)) continue;\n for (const { owner: id } of lane.commands) {\n if (id === undefined || id === owner.id || shared.watched.has(id))\n continue;\n shared.watched.add(id);\n owner.whenGone(id, signal).then(\n () => {\n if (!s.running) return;\n transactBackground(\n s,\n () => adoptOwner(s, id),\n () => {\n wake(s);\n void pump(s);\n },\n );\n },\n () => {},\n );\n }\n }\n};\n\nconst adoptOwner = (s: Session, gone: string | undefined) => {\n const me = s.store.owner?.id;\n let lanes = s.record.lanes;\n let adopted = false;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (gone !== undefined && lane.removed?.some((m) => m.by === gone)) {\n const { removed: _removed, ...rest } = laneOf(\n { ...s.record, lanes },\n protocol,\n );\n const left = lane.removed.filter((m) => m.by !== gone);\n lanes = {\n ...lanes,\n [protocol]: { ...rest, ...(left.length > 0 && { removed: left }) },\n };\n }\n if (!offered(s, protocol)) continue;\n const orphans = lane.commands.filter(\n (c) =>\n c.owner === gone &&\n (me === undefined || c.owner !== me) &&\n !s.pending.some((p) => p.id === c.id && p.seq === c.seq),\n );\n if (orphans.length === 0) continue;\n adopted = true;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.map((c) => {\n if (c.owner !== gone) return c;\n const { owner: _owner, ...rest } = c;\n return me === undefined ? rest : { ...rest, owner: me };\n }),\n },\n };\n for (const command of orphans) {\n const mine = s.pending.find((p) => p.id === command.id);\n if (mine) {\n stamp(s, mine, command.seq);\n mine.attempted = true;\n mine.stale = true;\n } else s.pending.push(adoptedPending(s, protocol, command));\n }\n }\n if (!adopted) return;\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n sortPending(s);\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\nconst adoptedPending = (\n s: Session,\n protocol: string,\n stored: StatewireClient.SessionCommand,\n): Pending => {\n const { seq, id, ts, owner: _owner, by, ...command } = stored;\n const params =\n command.meta === undefined\n ? command.params\n : (reviveValue(\n structuredClone(command.params),\n command.meta,\n ) as unknown[]);\n const entry: Pending = {\n id,\n seq,\n command: { protocol, ...command },\n inv: {\n protocol,\n method: command.method,\n params,\n ts,\n seq,\n id,\n clientId: s.record.clientId,\n },\n adopted: true,\n by,\n away: false,\n stale: true,\n attempted: true,\n posted: false,\n applied: false,\n resolve: () => {},\n reject: () => {},\n };\n s.lifecycle?.onStart(entry.inv);\n return entry;\n};\n\nconst transactBackground = (s: Session, fn: () => void, done?: () => void) => {\n void transact(s, fn).then(done, () => {});\n};\n\nconst setIdle = (s: Session, level: boolean) => {\n if (level === s.idle) return;\n s.idle = level;\n s.notify();\n if (level) s.onDone?.();\n};\n\nconst cover = (s: Session, entry: Pending) => {\n if (entry.applied) return;\n entry.applied = true;\n s.lifecycle?.onApplied(entry.inv);\n s.lifecycle?.onCovered?.(entry.inv);\n};\n\nexport const MAX_INBOX = 256;\n\ntype Outcome =\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure };\n\nconst updateOf = (\n protocol: string,\n stored: StatewireClient.StoredSettled,\n): Statewire.CommandUpdate => ({\n protocol,\n id: stored.id,\n method: stored.method,\n params: paramsOf(stored) as never[],\n ...(stored.seq !== undefined && { seq: stored.seq }),\n status: \"settled\",\n ...(stored.result !== undefined && {\n result: paramsOf({\n params: stored.result.value,\n meta: stored.result.meta,\n })[0],\n }),\n ...(stored.failure !== undefined && { failure: stored.failure }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n});\n\n// The inbox keeps the newest notices; the rest are reported as evicted.\nconst boundInbox = (\n store: StatewireClient.SessionStorage,\n record: StatewireClient.SessionRecord,\n): StatewireClient.SessionRecord => {\n let lanes = record.lanes;\n const dropped: Statewire.CommandUpdate[] = [];\n for (const [protocol, lane] of Object.entries(lanes)) {\n const inbox = lane.inbox;\n if (inbox === undefined || inbox.length <= MAX_INBOX) continue;\n const sorted = [...inbox].sort((x, y) => x.ts - y.ts);\n const cut = sorted.length - MAX_INBOX;\n dropped.push(...sorted.slice(0, cut).map((n) => updateOf(protocol, n)));\n lanes = { ...lanes, [protocol]: { ...lane, inbox: sorted.slice(cut) } };\n }\n if (dropped.length > 0) store.onEvict?.({ reason: \"inbox\", dropped });\n return lanes === record.lanes ? record : { ...record, lanes };\n};\n\nconst toNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n outcome: Outcome,\n): StatewireClient.StoredSettled => {\n const result = outcome.ok\n ? encodeParams(outcome.payload === undefined ? [] : [outcome.payload])\n : undefined;\n return {\n id: stored.id,\n method: stored.method,\n params: stored.params,\n ...(stored.meta !== undefined && { meta: stored.meta }),\n ts: stored.ts,\n ...(stored.seq !== undefined && { seq: stored.seq }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n ...(result !== undefined && {\n result: {\n value: result.params,\n ...(result.meta !== undefined && { meta: result.meta }),\n },\n }),\n ...(!outcome.ok && { failure: outcome.failure }),\n };\n};\n\nconst lostNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n) => toNotice(stored, { ok: false, failure: LOST });\n\nconst LOST = { fate: \"lost\", cause: \"session-lost\" } as const;\n\nconst withNotices = (\n lane: StatewireClient.SessionLane,\n notices: readonly StatewireClient.StoredSettled[],\n): StatewireClient.SessionLane => {\n const known = new Set((lane.inbox ?? []).map((n) => n.id));\n const added = notices.filter((n) => !known.has(n.id));\n return added.length === 0\n ? lane\n : { ...lane, inbox: [...(lane.inbox ?? []), ...added] };\n};\n\n// The settled update lands in the same write that drops the stamp: a reload\n// either resends the command or delivers the update.\ntype Notice = { entry: Stamped; outcome: Outcome };\n\nconst noticeInner = (s: Session, notices: readonly Notice[]) => {\n let record = s.record;\n for (const { entry, outcome } of notices) {\n const protocol = entry.command.protocol;\n const lane = laneOf(record, protocol);\n record = withLane(record, protocol, {\n ...withNotices(lane, [toNotice(toStored(s, entry), outcome)]),\n commands: lane.commands.filter((c) => c.id !== entry.id),\n });\n }\n setRecord(s, boundInbox(s.store, record));\n deliver(s);\n};\n\n// Shared storage: the update rides the next backlog sync's locked write.\nconst notice = (s: Session, entry: Stamped, outcome: Outcome) => {\n if (!s.shared || s.shared.inTx) {\n noticeInner(s, [{ entry, outcome }]);\n return;\n }\n s.shared.notices.push({ entry, outcome });\n syncBacklog(s);\n};\n\n/**\n * \"notice\": a stamped durable command persists its settled update; \"noticed\":\n * the caller already did; \"memory\": the update is best-effort only.\n */\ntype SettleMode = \"notice\" | \"noticed\" | \"memory\";\n\nconst settleEntry = (\n s: Session,\n entry: Pending,\n outcome: Outcome,\n mode: SettleMode = \"notice\",\n) => {\n s.pending = s.pending.filter((p) => p !== entry);\n if (s.shared && !entry.adopted) s.shared.settled.add(entry.id);\n settleReleases(s, entry.id, outcome);\n // The record keeps every unsettled command for the next attach; only a\n // command it no longer owns becomes a durable settled update.\n const durable =\n mode === \"noticed\" ||\n (mode === \"notice\" &&\n (outcome.ok || outcome.failure.cause !== \"unmount\") &&\n isStamped(entry) &&\n !isEphemeral(s, entry.command.protocol));\n if (durable && mode === \"notice\") notice(s, entry as Stamped, outcome);\n if (outcome.ok) {\n entry.resolve(outcome.payload);\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"accepted\", payload: outcome.payload },\n durable,\n );\n } else {\n entry.reject(new StatewireSendError(outcome.failure));\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"rejected\", error: new StatewireSendError(outcome.failure) },\n durable,\n );\n }\n};\n\nconst settleAll = (s: Session, detach: \"unmount\" | \"gone\") => {\n const cause =\n detach === \"unmount\" ? (\"unmount\" as const) : (\"stream-gone\" as const);\n const batch = s.pending;\n const detachFailure = (entry: Pending): StatewireClient.SendFailure => {\n if (entry.seq === undefined) return { fate: \"aborted\", cause };\n if (!entry.attempted) {\n const seq = entry.seq;\n const predecessorLost = batch.some(\n (p) =>\n p.command.protocol === entry.command.protocol &&\n p.seq !== undefined &&\n p.seq < seq &&\n p.attempted,\n );\n return predecessorLost\n ? { fate: \"aborted\", cause, predecessorLost }\n : { fate: \"aborted\", cause };\n }\n return { fate: \"lost\", cause };\n };\n for (const entry of [...batch]) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, { ok: false, failure: detachFailure(entry) });\n }\n};\n\nconst settleLost = (s: Session, entries: Pending[]) => {\n for (const entry of entries) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"lost\", cause: \"session-lost\" },\n });\n }\n};\n\nconst settleRemoved = (s: Session, entry: Pending) => {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"aborted\", cause: \"removed\" },\n });\n};\n\nconst requeue = (s: Session, survivors: Pending[]) => {\n for (const old of survivors) {\n s.lifecycle?.onCovered?.(old.inv);\n enqueueInner(s, old.command, old.inv.params, old.resolve, old.reject, {\n ...(old.inv.held && { hold: true }),\n ...(old.inv.localMeta !== undefined && { localMeta: old.inv.localMeta }),\n });\n }\n};\n\n// The server-side record's dedup memory is gone: history that may have\n// reached a server settles lost — the new hello's snapshot is the only\n// truth about what survived — and never-attempted statements re-stamp\n// on the adopted lane clocks.\nconst rebaseRecord = (s: Session, adopt: () => void) => {\n const held = s.pending.filter((p) => !p.adopted);\n const survivors = held.filter((p) => !p.attempted && !p.applied && !p.away);\n settleLost(\n s,\n held.filter((p) => !survivors.includes(p)),\n );\n for (const p of s.pending) if (p.adopted) s.lifecycle?.onCovered?.(p.inv);\n s.pending = [];\n s.durableSeq = {};\n // Failure notices ride through every record replacement.\n const previous = s.record.lanes;\n adopt();\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(previous)) {\n const current = laneOf({ ...s.record, lanes }, protocol);\n if (!lane.inbox?.length || current.inbox === lane.inbox) continue;\n lanes = { ...lanes, [protocol]: withNotices(current, lane.inbox) };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n requeue(s, survivors);\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () => setRecord(s, { clientId, lanes: {} }));\n\n// Another sharer replaced the record's identity: their reset settles our\n// attempted history and our survivors re-stamp on the stored clocks.\nconst adoptReset = (s: Session, stored: StatewireClient.SessionRecord) => {\n rebaseRecord(s, () => {\n s.record = boundInbox(s.store, stored);\n });\n // The host attributes frames by lease, and the lease is bound to the id\n // this attach was opened with.\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\n// The record died with the attach: mint a fresh id for the next one.\nconst ephemeralDetach = (s: Session) => {\n s.ephemeral = false;\n s.sessionKnown = false;\n resetRecord(s, newClientId());\n};\n\n// An ephemeral lane dies with its attach: attempted statements can never be\n// answered, the rest re-stamp from 1 for the next attach.\nconst detachEphemeralLanes = (s: Session) => {\n const held = s.pending.filter(\n (p) => isStamped(p) && isEphemeral(s, p.command.protocol),\n );\n if (held.length === 0) return;\n settleLost(\n s,\n held.filter((p) => p.attempted),\n );\n for (const p of held) if (!p.attempted) unstamp(s, p);\n sortPending(s);\n publish(s);\n};\n\nconst rejectedFailure = (cmd: StatewireCmd): StatewireClient.SendFailure => {\n return {\n fate: \"rejected\",\n cause: \"server\",\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n };\n};\n\nconst outcomeOf = (\n cmd: StatewireCmd,\n):\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure } => {\n switch (cmd.type) {\n case \"result\":\n return { ok: true, payload: reviveResponse(cmd).payload };\n case \"rejected\":\n return { ok: false, failure: rejectedFailure(reviveResponse(cmd)) };\n case \"failed\":\n return {\n ok: false,\n failure: {\n fate: \"failed\",\n cause: \"server\",\n ...(cmd.message !== undefined && { message: cmd.message }),\n },\n };\n case \"crashed\":\n return { ok: false, failure: { fate: \"crashed\", cause: \"server\" } };\n case \"expired\":\n return { ok: false, failure: { fate: \"expired\", cause: \"server\" } };\n default:\n return protocolError(`unknown cmd type: ${String(cmd.type)}`);\n }\n};\n\n// Only a result verdict carries applied effects; the rest drop the overlay unapplied.\nconst settleVerdict = (s: Session, entry: Pending, cmd: StatewireCmd) => {\n const outcome = outcomeOf(cmd);\n if (outcome.ok) cover(s, entry);\n else s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, outcome);\n};\n\nconst TERMINAL_CMD_TYPES: ReadonlySet<string> = new Set(TERMINAL);\n\n// A verdict for a seq another sharer stamped parks under the seq for that\n// owner; an adopted command's verdict parks under its id for the enqueuer.\nconst parkVerdict = (s: Session, cmd: StatewireCmd, id?: string) => {\n if (!s.shared || !TERMINAL_CMD_TYPES.has(cmd.type!)) return;\n if (isEphemeral(s, cmd.protocol)) return;\n s.shared.parked.push({\n protocol: cmd.protocol,\n verdict: {\n seq: cmd.seq,\n ...(id !== undefined && { id }),\n type: cmd.type as StatewireClient.SessionVerdict[\"type\"],\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n ...(cmd.meta !== undefined && { meta: cmd.meta }),\n },\n });\n};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (cmd.dur === true && !isEphemeral(s, cmd.protocol)) {\n const watermark = Math.max(durableSeqOf(s, cmd.protocol), cmd.seq);\n s.durableSeq[cmd.protocol] = watermark;\n for (const entry of laneEntries(s, cmd.protocol)) {\n if (entry.seq <= watermark) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = laneEntries(s, cmd.protocol).find((p) => p.seq === cmd.seq);\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) {\n parkVerdict(s, cmd);\n return;\n }\n if (entry.adopted) parkVerdict(s, cmd, entry.id);\n settleVerdict(s, entry, cmd);\n};\n\nconst consumeVerdicts = (s: Session) => {\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const verdicts = lane.verdicts ?? [];\n const consumed = new Set<number>();\n const forwarded: StatewireClient.SessionVerdict[] = [];\n let next = verdicts;\n for (const verdict of verdicts) {\n // By id: the stamp's owner settles it and forwards it to the enqueuer.\n const entry = s.pending.find(\n (p) =>\n p.command.protocol === protocol &&\n (verdict.id === undefined\n ? isStamped(p) && p.seq === verdict.seq\n : p.id === verdict.id),\n );\n if (!entry) continue;\n next = next.filter((v) => v !== verdict);\n consumed.add(verdict.seq);\n if (entry.adopted) forwarded.push({ ...verdict, id: entry.id });\n const { id: _id, ...cmd } = verdict;\n settleVerdict(s, entry, { ...cmd, protocol });\n }\n if (consumed.size === 0) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: [...next, ...forwarded].slice(-MAX_PARKED_VERDICTS),\n },\n };\n }\n if (lanes === s.record.lanes) return;\n setRecord(s, { ...s.record, lanes });\n publish(s);\n wake(s);\n};\n\nconst handleCmds = (s: Session, cmds: StatewireCmd[]) => {\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n wake(s);\n};\n\nconst ingestOps = (s: Session, ops: unknown[]) => {\n const applied = applyDocumentOps(s.documents, ops, s.selection?.protocols);\n s.documents = applied;\n const next =\n s.selection === undefined\n ? applied.documents.get(0)?.value\n : s.options.applicationProtocols === \"*\"\n ? Object.fromEntries(\n [...applied.documents].map(([id, d]) => [\n `${d.protocol}:${d.key === null ? id : JSON.stringify(d.key)}`,\n d.value,\n ]),\n )\n : mainDocument(applied, s.options.protocol ?? DEFAULT_PROTOCOL)?.value;\n if (next !== s.canonical)\n s.changed.push(\n ...(applied.changedPaths.length ? applied.changedPaths : [[]]),\n );\n s.canonical = next;\n};\n\nconst cacheDocuments = (s: Session) => {\n if (s.documentStore && s.selection) {\n for (const document of s.documents.documents.values()) {\n if (!document.protocol || !document.key) continue;\n const key = resolveDocumentKey(\n document.key,\n s.options.keyPrefixes?.[document.protocol],\n );\n const version = s.selection.protocols.find(\n (p) => p.name === document.protocol,\n )?.version;\n if (key !== undefined && version !== undefined)\n s.documentStore.save(\n [s.documentStore.namespace ?? \"\", document.protocol, ...key],\n { version, value: document.value },\n );\n }\n }\n};\n\nconst publishIngested = (s: Session) => {\n publish(s);\n cacheDocuments(s);\n for (const listener of s.documentListeners) listener();\n wake(s);\n};\n\n// The refusal's watermark is exact: every held statement above it was never\n// admitted by the live record, and the first unposted seq being beyond\n// watermark+1 proves the record that admitted the missing prefix is gone —\n// its history settles lost and the lane clock restarts at the watermark.\nconst sessionLostInner = (s: Session, protocol: string, seqWm: number) => {\n const lane = laneOf(s.record, protocol);\n const failure = { fate: \"lost\", cause: \"session-lost\" } as const;\n const held = laneEntries(s, protocol);\n s.durableSeq[protocol] = seqWm;\n const requeue =\n held.length > 0 &&\n s.onSessionLost?.(\n held.map((p) => ({\n id: p.id,\n method: p.inv.method,\n params: p.inv.params,\n ts: p.inv.ts,\n seq: p.seq,\n ...(p.inv.clientId !== undefined && { clientId: p.inv.clientId }),\n })),\n ) === \"requeue\";\n if (requeue) {\n if (s.onDeprecatedPath)\n s.onDeprecatedPath({ kind: \"session-lost-requeue\", count: held.length });\n else\n console.warn(\n `statewire: onSessionLost \"requeue\" re-enqueued ${held.length} commands; it is deprecated and will be removed`,\n );\n for (const p of held) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"memory\");\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...lane,\n nextSeq: seqWm + 1,\n commands: [],\n }),\n );\n for (const old of held)\n enqueueInner(\n s,\n old.command,\n old.inv.params,\n () => {},\n () => {},\n {\n ...(old.inv.localMeta !== undefined && {\n localMeta: old.inv.localMeta,\n }),\n },\n );\n } else {\n // Default: the queue goes, each command a failure notice. Held entries\n // never went out: they stay held where they are.\n const stamps = mergeBacklog(s, protocol);\n const held = outboxOf(lane).filter((c) => c.held);\n const queued = outboxOf(lane).filter((c) => !c.held);\n const keep = new Set(held.map((c) => c.id));\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withNotices(withOutbox(lane, held), [\n ...stamps.map((c) => lostNotice(c)),\n ...queued.map((c) => lostNotice(c)),\n ]),\n nextSeq: seqWm + 1,\n commands: [],\n ...marks(\n s,\n lane,\n [\n ...stamps.map((c) => ({ id: c.id, by: c.by ?? c.owner })),\n ...queued,\n ],\n failure,\n ),\n }),\n );\n for (const p of s.pending.filter(\n (q) => q.command.protocol === protocol && !keep.has(q.id),\n )) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"noticed\");\n }\n deliver(s);\n }\n publish(s);\n wake(s);\n};\n\n// Every stamp above the watermark returns to the front of the outbox. A stamp\n// past watermark+1, or one this client saw admitted, proves the server record\n// that admitted it is gone. Another live sharer's stamp may still be on its\n// way on that sharer's attach: it and every stamp after it wait for a later\n// hello; the stamps before it never arrived and resend under their seqs.\nconst demote = (\n s: Session,\n protocol: string,\n watermark: number,\n demoted: Set<string>,\n waiting: Set<Pending>,\n) => {\n const lane = laneOf(s.record, protocol);\n const local = laneEntries(s, protocol).filter((p) => p.seq > watermark);\n const above = new Map(\n lane.commands.filter((c) => c.seq > watermark).map((c) => [c.id, c]),\n );\n for (const p of local) if (!above.has(p.id)) above.set(p.id, toStored(s, p));\n if (above.size === 0) return;\n const moved = [...above.values()].sort((a, b) => a.seq - b.seq);\n if (\n moved[0]!.seq > watermark + 1 ||\n moved[0]!.seq <= durableSeqOf(s, protocol) ||\n local.some((p) => p.applied)\n ) {\n sessionLostInner(s, protocol, watermark);\n return;\n }\n const me = s.store.owner?.id;\n const foreign = moved.find(\n (c) =>\n c.owner !== undefined &&\n c.owner !== me &&\n !local.some((p) => p.id === c.id),\n );\n if (foreign !== undefined) {\n for (const p of local) if (p.seq > foreign.seq) waiting.add(p);\n return;\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(lane, [\n ...moved.map(({ seq: _seq, owner: _owner, ...command }) => command),\n ...outboxOf(lane),\n ]),\n nextSeq: watermark + 1,\n commands: lane.commands.filter((c) => c.seq <= watermark),\n }),\n );\n for (const command of moved) demoted.add(command.id);\n for (const p of local) {\n if (p.adopted) dropPending(s, p);\n else unstamp(s, p);\n }\n sortPending(s);\n};\n\nconst recheckLater = (s: Session, watermarks: string) => {\n if (s.rechecks.watermarks !== watermarks)\n s.rechecks = { watermarks, count: 0 };\n s.rechecks.count += 1;\n if (s.recheck !== undefined) return;\n s.recheck = setTimeout(\n () => {\n s.recheck = undefined;\n if (s.running && s.attach === \"attached\")\n s.transport?.connection.reconnect();\n },\n backoff(s.rechecks.count + 1),\n );\n};\n\nconst gapFill = (s: Session) =>\n s.selection !== undefined && s.selection.version >= GAP_FILL_VERSION;\n\nconst selectionOf = (\n syn: StatewireSyn,\n): StatewireProtocol.Selection | undefined => {\n if (syn.version === undefined || syn.protocols === undefined)\n return undefined;\n return {\n version: syn.version,\n protocols: syn.protocols.map(({ name, version, record }) => {\n if (version === undefined)\n return protocolError(`hello lane ${name} has no version`);\n return { name, version, ...(record !== undefined && { record }) };\n }),\n };\n};\n\n// The host admits an attach's durable statements right after its hello.\nconst carriedThrough = (\n lane: { name: string; seq?: number },\n attached: ReadonlySet<Pending>,\n) => {\n const carried = new Set(\n [...attached]\n .filter((p) => p.command.protocol === lane.name)\n .map((p) => p.seq),\n );\n let seq = lane.seq ?? 0;\n while (carried.has(seq + 1)) seq += 1;\n return seq;\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n if (s.attach === \"attached\") {\n s.ephemeralSeqs = {};\n detachEphemeralLanes(s);\n }\n for (const [protocol, value] of s.contexts) {\n if (s.attachContexts.get(protocol) === value)\n s.dirtyContexts.delete(protocol);\n else s.dirtyContexts.add(protocol);\n }\n s.attachContexts.clear();\n s.selection = selectionOf(syn);\n s.documents = { mode: null, documents: new Map() };\n ingestOps(s, ops);\n s.attach = \"attached\";\n s.attachEpoch += 1;\n s.frameFailures = 0;\n s.resumeAt = 0;\n s.reattach = false;\n const lanes = syn.protocols ?? [];\n s.ephemeral =\n lanes.length > 0 && lanes.every((lane) => lane.record === \"ephemeral\");\n if (s.ephemeral) s.deactivated = true;\n const attached = s.attachEntries;\n s.attachEntries = new Set();\n const reconcile = () => {\n // Statements at or below the watermark resend only to fetch their\n // verdicts (the server never re-runs them); seqs above it never arrived\n // and go back to the outbox for fresh ones.\n const demoted = new Set<string>();\n const waiting = new Set<Pending>();\n for (const lane of lanes) {\n if (lane.record === \"ephemeral\") {\n s.ephemeralSeqs[lane.name] = Math.max(\n Object.hasOwn(s.ephemeralSeqs, lane.name)\n ? s.ephemeralSeqs[lane.name]!\n : 0,\n ...laneEntries(s, lane.name).map((p) => p.seq),\n );\n continue;\n }\n demote(s, lane.name, carriedThrough(lane, attached), demoted, waiting);\n s.durableSeq[lane.name] = lane.seq ?? 0;\n }\n for (const entry of s.pending) {\n entry.posted =\n attached.has(entry) ||\n waiting.has(entry) ||\n (isStamped(entry) &&\n entry.seq <= durableSeqOf(s, entry.command.protocol) &&\n !isEphemeral(s, entry.command.protocol));\n entry.stale = false;\n }\n if (waiting.size > 0)\n recheckLater(\n s,\n JSON.stringify(lanes.map((lane) => [lane.name, lane.seq])),\n );\n else s.rechecks = { watermarks: \"\", count: 0 };\n syncBacklogInner(s);\n s.sessionKnown = true;\n flushInner(s, demoted);\n };\n if (!s.shared || s.deactivated) {\n reconcile();\n publishIngested(s);\n void pump(s);\n deliver(s);\n return;\n }\n transactBackground(s, reconcile, () => {\n publishIngested(s);\n void pump(s);\n deliver(s);\n });\n};\n\nconst handleOps = (\n s: Session,\n { ops, cmds }: { ops: unknown[]; cmds: StatewireCmd[] },\n) => {\n ingestOps(s, ops);\n for (const cmd of cmds) handleCmd(s, cmd);\n if (cmds.length > 0) syncBacklog(s);\n publishIngested(s);\n};\n\n// A retry-less {syn} refusal is the one session-loss verdict: a gap against\n// a durable lane's exact watermark settles that lane's history lost; a\n// pushback (retry present) or a gapless refusal only reconciles the resend queues.\n// Under the gap-fill wire a refusal can predate frames sent since: durable\n// lanes never resend from it, a reattach's hello decides them.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const stated = (syn.protocols ?? []).filter(\n (lane): lane is { name: string; seq: number } => lane.seq !== undefined,\n );\n const lanes = gapFill(s)\n ? stated.filter(({ name }) => isEphemeral(s, name))\n : stated;\n if (\n gapFill(s) &&\n s.pending.some((p) => {\n if (!isStamped(p) || !p.attempted) return false;\n const protocol = p.command.protocol;\n if (isEphemeral(s, protocol)) return false;\n const seq = stated.find((lane) => lane.name === protocol)?.seq ?? 0;\n return p.seq > Math.max(seq, durableSeqOf(s, protocol));\n })\n )\n s.reattach = true;\n for (const { name, seq } of lanes) {\n const watermark = isEphemeral(s, name)\n ? seq\n : Math.max(seq, durableSeqOf(s, name));\n for (const entry of laneEntries(s, name))\n entry.posted = entry.seq <= watermark;\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + retryHint(syn.retry);\n wake(s);\n void pump(s);\n return;\n }\n const gaps = lanes.filter(({ name, seq }) => {\n const first = laneEntries(s, name).find((p) => !p.posted);\n return (\n first !== undefined &&\n first.seq > Math.max(seq, durableSeqOf(s, name)) + 1\n );\n });\n for (const { name, seq } of gaps) {\n if (isEphemeral(s, name))\n protocolError(`gap on ephemeral lane ${name} after watermark ${seq}`);\n }\n // Another sharer holds the missing stamp: reattach, and the hello frees it.\n if (\n gaps.some(({ name, seq }) =>\n laneOf(s.record, name).commands.some(\n (c) => c.seq === seq + 1 && c.owner !== s.store.owner?.id,\n ),\n )\n ) {\n s.transport?.connection.reconnect();\n return;\n }\n if (gaps.length > 0) {\n transactBackground(\n s,\n () => {\n for (const { name, seq } of gaps) sessionLostInner(s, name, seq);\n },\n () => {\n wake(s);\n void pump(s);\n },\n );\n return;\n }\n wake(s);\n void pump(s);\n};\n\nconst handleDetach = (s: Session) => {\n if (s.attach === \"attached\") s.attach = \"detached\";\n s.ephemeralSeqs = {};\n if (s.ephemeral) ephemeralDetach(s);\n else detachEphemeralLanes(s);\n wake(s);\n};\n\nconst handleFinish = (s: Session, { reason }: { reason: string }) => {\n if (reason === \"reconnect\" || reason === \"error\") return;\n s.attach = \"finished\";\n settleAll(s, \"gone\");\n publish(s);\n wake(s);\n};\n\nconst isFinished = (s: Session) => s.attach === \"finished\";\n\ntype Lanes = {\n frame: StatewireFrame;\n entries: Stamped[];\n};\n\n// A lane must be strictly consecutive within a frame: the first unposted run\n// per lane rides now, later runs ride follow-up frames. Ephemeral lanes ignore\n// the gate: they live on the attach and never wait for persistence.\nconst buildLanes = (\n s: Session,\n cmdGate: \"persisted\" | \"all\" | \"none\" = \"all\",\n): Lanes | null => {\n const entries: Stamped[] = [];\n const last: Record<string, number> = {};\n const stopped = new Set<string>();\n for (const entry of s.pending) {\n if (entries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (!isStamped(entry)) continue;\n const protocol = entry.command.protocol;\n if (entry.posted || stopped.has(protocol)) continue;\n if (entry.stale) {\n stopped.add(protocol);\n continue;\n }\n const gated =\n !isEphemeral(s, protocol) &&\n (cmdGate === \"none\" ||\n (cmdGate === \"persisted\" &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= laneOf(s.persistedRecord, protocol).nextSeq)));\n if (\n gated ||\n (Object.hasOwn(last, protocol) && entry.seq !== last[protocol]! + 1)\n ) {\n stopped.add(protocol);\n continue;\n }\n last[protocol] = entry.seq;\n entries.push(entry);\n }\n const ctx = [...s.dirtyContexts].map((protocol) => s.contexts.get(protocol)!);\n if (entries.length === 0 && ctx.length === 0) return null;\n return {\n frame: {\n ...(ctx.length > 0 && { ctx }),\n ...(entries.length > 0 && {\n cmd: entries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n }),\n },\n entries,\n };\n};\n\n// Per durable lane with stamps awaiting a verdict: the seq below the oldest.\n// The hello answers everything above it, so nothing at or below the\n// watermark is ever re-sent.\nconst resultsCursor = (s: Session) => {\n const cursors = new Map<string, number>();\n for (const p of s.pending) {\n if (!isStamped(p) || isEphemeral(s, p.command.protocol)) continue;\n const protocol = p.command.protocol;\n cursors.set(protocol, Math.min(cursors.get(protocol) ?? p.seq, p.seq));\n }\n return [...cursors].map(([protocol, seq]) => ({ protocol, seq: seq - 1 }));\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachEntries = new Set();\n const wanted = s.lanesOnAttach;\n s.lanesOnAttach = false;\n for (const protocol of s.contexts.keys()) s.dirtyContexts.add(protocol);\n s.attachContexts = new Map(s.contexts);\n const lanes = buildLanes(s, wanted && s.sessionKnown ? \"persisted\" : \"none\");\n const res = resultsCursor(s);\n if (!lanes && res.length === 0) return null;\n s.attachEntries = new Set(lanes?.entries ?? []);\n for (const entry of lanes?.entries ?? []) entry.attempted = true;\n return { ...lanes?.frame, ...(res.length > 0 && { res }) };\n};\n\nconst persistBeforeSend = (s: Session): void | Promise<void> => {\n if (s.storageError !== undefined) throw s.storageError;\n if (!s.hydrated) return s.ready!.then(() => persistBeforeSend(s));\n const record = s.record;\n try {\n const pending = s.store.flush?.();\n if (pending)\n return pending.then(\n () => {\n s.persistedRecord = record;\n },\n (cause: unknown) => {\n throw wrapStorageError(cause);\n },\n );\n s.persistedRecord = record;\n } catch (cause) {\n throw wrapStorageError(cause);\n }\n};\n\nconst pump = async (s: Session) => {\n if (s.pumping) return;\n s.pumping = true;\n try {\n while (s.running && !isFinished(s)) {\n if (!s.hydrated) await s.ready;\n const transport = s.transport;\n if (s.reattach && s.attach === \"attached\" && transport) {\n const delay = s.resumeAt - Date.now();\n if (delay > 0) {\n await sleepUntilWake(s, delay);\n continue;\n }\n // Ephemeral answers ride only this attach: drain them first.\n if (\n s.pending.some(\n (p) =>\n isStamped(p) && p.attempted && isEphemeral(s, p.command.protocol),\n )\n ) {\n await waitForWake(s);\n continue;\n }\n s.reattach = false;\n const epoch = s.attachEpoch;\n transport.connection.reconnect();\n while (s.running && !isFinished(s) && epoch === s.attachEpoch)\n await waitForWake(s);\n continue;\n }\n const flushable = flushCandidates(s).length > 0;\n const queued =\n s.pending.some((p) => isOutboxed(p) && !p.inv.held) ||\n queuedInRecord(s);\n if (\n buildLanes(s) === null &&\n !flushable &&\n (!queued || s.attach === \"attached\")\n )\n return;\n const waiting = s.pending.length > 0 || queued;\n if (transport?.parked && !waiting) return;\n if (s.attach !== \"attached\" || !transport) {\n if (!waiting) return;\n if (\n (transport?.connection.status === \"standby\" &&\n transport.connection.reason === \"idle\") ||\n transport?.parked\n ) {\n transport.connection.reconnect();\n }\n await waitForWake(s);\n continue;\n }\n const resumeDelay = s.resumeAt - Date.now();\n if (resumeDelay > 0) {\n await sleepUntilWake(s, resumeDelay);\n continue;\n }\n if (flushable) {\n if (!s.sessionKnown) {\n await waitForWake(s);\n continue;\n }\n await flush(s);\n continue;\n }\n let lanes = buildLanes(s);\n if (!lanes) continue;\n const epoch = s.attachEpoch;\n const persistence = persistBeforeSend(s);\n if (persistence) await persistence;\n if (!s.running || isFinished(s)) return;\n if (epoch !== s.attachEpoch || s.attach !== \"attached\") continue;\n let result;\n try {\n // Shared storage: the lock across the send keeps per-lane arrival\n // ordered across sharers, and the frame is rebuilt from the record\n // as it stands, so a stamp another sharer freed never goes out.\n const send = (built: Lanes) => {\n for (const entry of built.entries) entry.attempted = true;\n return transport.send(built.frame);\n };\n result = await (s.shared && !s.deactivated && lanes.entries.length > 0\n ? s.store.lock!(async () => {\n refresh(s, await readStored(s));\n lanes = buildLanes(s);\n if (!lanes || epoch !== s.attachEpoch) return null;\n return send(lanes);\n })\n : send(lanes));\n } catch {\n if (!s.running || isFinished(s)) return;\n // The frame may have arrived. Under the gap-fill wire its seqs never\n // go out again: the next hello answers what arrived and frees the rest.\n if (lanes !== null && lanes.entries.length > 0 && gapFill(s)) {\n if (epoch !== s.attachEpoch) continue;\n for (const entry of lanes.entries)\n if (s.pending.includes(entry)) entry.posted = true;\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n if (s.running && epoch === s.attachEpoch && s.attach === \"attached\")\n transport.connection.reconnect();\n continue;\n }\n if (lanes?.frame.ctx?.length) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n await waitForWake(s);\n continue;\n }\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n continue;\n }\n if (!s.running) return;\n if (result === null || lanes === null) continue;\n s.frameFailures = 0;\n if (\n epoch === s.attachEpoch &&\n (result.type === \"ok\" || result.type === \"refusal\")\n ) {\n for (const entry of lanes.frame.ctx ?? []) {\n if (s.contexts.get(entry.protocol) === entry)\n s.dirtyContexts.delete(entry.protocol);\n }\n }\n if (result.type === \"ok\") {\n if (epoch === s.attachEpoch) {\n for (const entry of lanes.entries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\n }\n } else if (result.type === \"refusal\") {\n if (epoch === s.attachEpoch) handleRefusal(s, result.syn);\n } else if (result.type === \"stale-lease\") {\n // A POST outlived its attach: reattach first, the hello arbitrates.\n if (epoch === s.attachEpoch) {\n transport.connection.reconnect();\n await waitForWake(s);\n }\n } else if (result.type === \"no-lease\") {\n // No out-of-band write channel: the frame rides a fresh attach.\n if (epoch === s.attachEpoch) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n while (s.running && !isFinished(s) && epoch === s.attachEpoch) {\n await waitForWake(s);\n }\n }\n }\n }\n } catch (error) {\n storageFailed(s, error);\n } finally {\n s.pumping = false;\n }\n};\n\nconst start = (s: Session) => {\n s.running = true;\n if (!s.hydrated) {\n void s.ready!.then(\n () => {\n if (s.running) start(s);\n },\n () => {},\n );\n return;\n }\n if (s.shared) {\n s.shared.abort = new AbortController();\n s.shared.unsubscribe = s.store.subscribe!(() => {\n transactBackground(\n s,\n () => consumeVerdicts(s),\n () => {\n wake(s);\n void pump(s);\n deliver(s);\n },\n );\n });\n s.running = true;\n transactBackground(\n s,\n () => {\n if (s.store.load() === null) s.store.save(s.record);\n s.recordPersisted = true;\n adoptOwner(s, undefined);\n consumeVerdicts(s);\n },\n () => {\n void pump(s);\n deliver(s);\n },\n );\n return;\n }\n if (!s.recordPersisted) {\n s.recordPersisted = true;\n s.store.save(s.record);\n }\n adoptOwner(s, undefined);\n s.running = true;\n void pump(s);\n deliver(s);\n};\n\nconst stop = (s: Session) => {\n s.running = false;\n clearTimeout(s.recheck);\n s.recheck = undefined;\n if (s.shared) {\n s.shared.unsubscribe?.();\n s.shared.unsubscribe = null;\n s.shared.abort?.abort();\n s.shared.abort = null;\n s.shared.watched.clear();\n }\n wake(s);\n settleAll(s, \"unmount\");\n};\n\nconst setTransport = (s: Session, transport: RemoteLink) => {\n if (s.transport === transport) return;\n s.transport = transport;\n wake(s);\n};\n\ntype EnqueueOptions = {\n hold?: boolean;\n localMeta?: unknown;\n};\n\nconst QUOTA: StatewireClient.SendFailure = { fate: \"aborted\", cause: \"quota\" };\n\nconst isQuota = (error: unknown) =>\n error instanceof Error && error.name === \"StatewireQuotaError\";\n\nconst enqueueInner = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options: EnqueueOptions = {},\n) => {\n const protocol = command.protocol;\n const id = newClientId();\n const entry: Pending = {\n id,\n seq: undefined,\n command,\n inv: {\n protocol,\n method: command.method,\n params,\n ts: Date.now(),\n id,\n clientId: s.record.clientId,\n ...(options.hold && { held: true as const }),\n ...(options.localMeta !== undefined && { localMeta: options.localMeta }),\n },\n adopted: false,\n by: s.store.owner?.id,\n away: false,\n stale: false,\n attempted: false,\n posted: false,\n applied: false,\n resolve,\n reject,\n };\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n try {\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(lane, [...outboxOf(lane), toOutbox(entry)]),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n reject(new StatewireSendError(QUOTA));\n return;\n }\n s.pending.push(entry);\n reorder(s, protocol);\n } else s.pending.push(entry);\n s.lifecycle?.onStart(entry.inv);\n s.notify();\n};\n\nconst negotiated = (s: Session, protocol: string) =>\n s.selection?.protocols.some((p) => p.name === protocol) ?? false;\n\ntype Candidate = {\n protocol: string;\n stored: StatewireClient.OutboxCommand;\n};\n\nconst viewOf = (\n s: Session,\n protocol: string,\n stored: StatewireClient.OutboxCommand | StatewireClient.SessionCommand,\n state?: \"sending\",\n): StatewireClient.OutboxEntry => {\n const cached = s.views.get(stored);\n if (cached?.protocol === protocol) return cached;\n const view: StatewireClient.OutboxEntry = {\n id: stored.id,\n protocol,\n command: { method: stored.method, params: paramsOf(stored) },\n ts: stored.ts,\n state:\n state ??\n ((stored as StatewireClient.OutboxCommand).held ? \"held\" : \"queued\"),\n localMeta: stored.localMeta,\n durable: s.store.durable !== false && !isEphemeral(s, protocol),\n };\n s.views.set(stored, view);\n return view;\n};\n\n/** The lane's outbox as this client may flush it: the record's on a durable lane, its own on an ephemeral one. */\nconst laneQueue = (\n s: Session,\n protocol: string,\n): StatewireClient.OutboxCommand[] =>\n isEphemeral(s, protocol)\n ? s.pending\n .filter((p) => isOutboxed(p) && p.command.protocol === protocol)\n .map((p) => toOutbox(p))\n : [...outboxOf(laneOf(s.record, protocol))];\n\n// Bubble forward: each entry moves toward the front past held or waiting\n// entries it may overtake and stops behind the first it can't; the entries\n// with nothing held or waiting ahead are the ones a flush stamps.\nconst bubble = (\n s: Session,\n protocol: string,\n queue: readonly StatewireClient.OutboxCommand[],\n): { order: StatewireClient.OutboxCommand[]; free: number } => {\n const may = s.options.canOvertake?.[protocol];\n const order: { stored: StatewireClient.OutboxCommand; blocked: boolean }[] =\n [];\n for (const stored of queue) {\n if (stored.held) {\n order.push({ stored, blocked: true });\n continue;\n }\n let at = order.length;\n while (\n at > 0 &&\n order[at - 1]!.blocked &&\n may !== undefined &&\n may(\n viewOf(s, protocol, stored),\n viewOf(s, protocol, order[at - 1]!.stored),\n )\n )\n at--;\n order.splice(at, 0, { stored, blocked: at > 0 && order[at - 1]!.blocked });\n }\n const free = order.findIndex((o) => o.blocked);\n return {\n order: order.map((o) => o.stored),\n free: free === -1 ? order.length : free,\n };\n};\n\n/** Persists the lane's bubbled order. */\nconst reorder = (s: Session, protocol: string) => {\n if (isEphemeral(s, protocol)) return;\n const lane = laneOf(s.record, protocol);\n const { order } = bubble(s, protocol, outboxOf(lane));\n if (order.every((c, i) => c === outboxOf(lane)[i])) return;\n setRecord(s, withLane(s.record, protocol, withOutbox(lane, order)));\n};\n\nconst flushLanes = (s: Session) =>\n [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending.map((p) => p.command.protocol),\n ]),\n ].filter((protocol) => negotiated(s, protocol));\n\n/** Entries the next flush would stamp. */\nconst flushCandidates = (s: Session): Candidate[] =>\n flushLanes(s).flatMap((protocol) => {\n const { order, free } = bubble(s, protocol, laneQueue(s, protocol));\n return order.slice(0, free).map((stored) => ({ protocol, stored }));\n });\n\n// An entry the record holds that a flush would stamp once attached, whether\n// or not this page made the send: inserted, or kept from an earlier mount or\n// another sharer. It dials a parked or idle transport as a send does.\nconst queuedInRecord = (s: Session) =>\n Object.keys(s.record.lanes).some(\n (protocol) =>\n (s.selection ? negotiated(s, protocol) : offered(s, protocol)) &&\n bubble(s, protocol, laneQueue(s, protocol)).free > 0,\n );\n\nconst reasonOf = (\n s: Session,\n stored: StatewireClient.OutboxCommand,\n demoted: ReadonlySet<string>,\n): StatewireClient.FlushReason =>\n stored.released\n ? \"release\"\n : demoted.has(stored.id)\n ? \"reconnect\"\n : s.mountIds.has(stored.id)\n ? \"reload\"\n : \"enqueue\";\n\nconst NO_IDS: ReadonlySet<string> = new Set();\n\nconst patched = (\n stored: StatewireClient.OutboxCommand,\n patch: Patch,\n): StatewireClient.OutboxCommand => {\n const {\n held: _held,\n released: _released,\n localMeta: _meta,\n ...rest\n } = stored;\n const held = patch.held ?? stored.held === true;\n const localMeta =\n patch.localMeta === undefined ? stored.localMeta : patch.localMeta.value;\n let next: StatewireClient.OutboxCommand = {\n ...rest,\n ...(held && { held: true as const }),\n ...(!held &&\n (stored.held || stored.released) && { released: true as const }),\n ...(localMeta !== undefined && { localMeta }),\n };\n if (patch.params !== undefined) {\n const { params, meta } = encodeParams(patch.params);\n const { meta: _old, ...plain } = next;\n next = { ...plain, params, ...(meta !== undefined && { meta }) };\n }\n return next;\n};\n\n// Seqs are allocated here, under the lock, against the attach's watermark:\n// each outbox entry is stamped by exactly one sharer, in the bubbled order.\nconst flushInner = (s: Session, demoted: ReadonlySet<string> = NO_IDS) => {\n if (s.attach !== \"attached\" || !s.sessionKnown || !s.running || isFinished(s))\n return;\n const candidates = flushCandidates(s);\n if (candidates.length === 0) return;\n const groups = new Map<\n StatewireClient.FlushReason,\n StatewireClient.OutboxEntry[]\n >();\n for (const { protocol, stored } of candidates) {\n const reason = reasonOf(s, stored, demoted);\n groups.set(reason, [\n ...(groups.get(reason) ?? []),\n viewOf(s, protocol, stored),\n ]);\n }\n const flushing: Flushing = {\n ids: new Set(candidates.map((c) => c.stored.id)),\n patches: new Map(),\n removed: new Set(),\n };\n s.flushing = flushing;\n try {\n for (const [reason, commands] of groups) {\n try {\n s.onFlush?.({ commands, reason });\n } catch (error) {\n console.error(\"statewire: onFlush threw; stamping anyway\", error);\n }\n }\n } finally {\n s.flushing = null;\n }\n let record = s.record;\n for (const protocol of new Set(candidates.map((c) => c.protocol))) {\n const ephemeral = isEphemeral(s, protocol);\n const lane = laneOf(record, protocol);\n const removed: StatewireClient.OutboxCommand[] = [];\n const queue: StatewireClient.OutboxCommand[] = [];\n for (const stored of laneQueue(s, protocol)) {\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (flushing.removed.has(stored.id)) {\n removed.push(stored);\n if (own) settleRemoved(s, own);\n continue;\n }\n const patch = flushing.patches.get(stored.id);\n if (patch === undefined) {\n queue.push(stored);\n continue;\n }\n const next = patched(stored, patch);\n queue.push(next);\n if (own) follow(s, own, next);\n }\n const { order, free } = bubble(s, protocol, queue);\n let nextSeq = lane.nextSeq;\n const commands = [...lane.commands];\n for (const stored of order.slice(0, free)) {\n s.mountIds.delete(stored.id);\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (ephemeral) {\n const seq =\n (Object.hasOwn(s.ephemeralSeqs, protocol)\n ? s.ephemeralSeqs[protocol]!\n : 0) + 1;\n s.ephemeralSeqs[protocol] = seq;\n stamp(s, own!, seq);\n continue;\n }\n const seq = Math.max(nextSeq, durableSeqOf(s, protocol) + 1);\n nextSeq = seq + 1;\n const { held: _held, released: _released, ...command } = stored;\n const stamped: StatewireClient.SessionCommand = {\n ...command,\n seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n };\n commands.push(stamped);\n if (own) stamp(s, own, seq);\n else {\n const adopted = adoptedPending(s, protocol, stamped);\n adopted.stale = false;\n adopted.attempted = false;\n s.pending.push(adopted);\n }\n }\n if (ephemeral && removed.length === 0 && outboxOf(lane).length === 0)\n continue;\n const stampedIds = new Set(order.slice(0, free).map((c) => c.id));\n const rest = ephemeral\n ? outboxOf(lane).filter(\n (c) => !removed.some((r) => r.id === c.id) && !stampedIds.has(c.id),\n )\n : order.slice(free);\n record = withLane(record, protocol, {\n ...withOutbox(lane, rest),\n nextSeq,\n commands,\n ...marks(s, lane, removed),\n });\n }\n if (record !== s.record) setRecord(s, record);\n sortPending(s);\n s.notify();\n};\n\nconst flush = (s: Session): Promise<void> => {\n if (!s.shared) {\n flushInner(s);\n return Promise.resolve();\n }\n return transact(s, () => flushInner(s));\n};\n\nexport const outboxEntries = (\n s: Session,\n): readonly StatewireClient.OutboxEntry[] => {\n const local = s.pending.filter(\n (p) => isEphemeral(s, p.command.protocol) && !p.away,\n );\n const parts: unknown[] = [\n ...Object.values(s.record.lanes).flatMap((lane) => [\n lane.commands,\n lane.outbox,\n ]),\n ...local.flatMap((p) => [p, p.seq, p.inv.held, p.inv.localMeta]),\n ];\n const same =\n parts.length === s.outboxParts.length &&\n parts.every((part, i) => part === s.outboxParts[i]);\n if (!same) {\n s.outboxParts = parts;\n s.outboxList = [\n ...Object.entries(s.record.lanes).flatMap(([protocol, lane]) => [\n ...[...lane.commands]\n .sort((a, b) => a.seq - b.seq)\n .map((c) => viewOf(s, protocol, c, \"sending\")),\n ...outboxOf(lane).map((c) => viewOf(s, protocol, c)),\n ]),\n ...[...local]\n .sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity))\n .map((p) =>\n isStamped(p)\n ? viewOf(s, p.command.protocol, toStored(s, p), \"sending\")\n : viewOf(s, p.command.protocol, toOutbox(p)),\n ),\n ];\n }\n return s.outboxList;\n};\n\ntype OutboxOp =\n | { type: \"patch\"; patch: (entry: StatewireClient.OutboxEntry) => Patch }\n | { type: \"remove\" };\n\nconst entryOf = (s: Session, id: string) => {\n const at = locate(s, id);\n if (at === undefined) throw new Error(`outbox: no entry ${id}`);\n if (at.stored === undefined) throw new Error(`outbox: ${id} is in flight`);\n return { protocol: at.protocol, stored: at.stored };\n};\n\nconst applyOutboxOp = (s: Session, id: string, op: OutboxOp) => {\n const at = locate(s, id);\n if (at?.stored === undefined) return;\n const { protocol, stored } = at;\n const own = s.pending.find((p) => p.id === id && isOutboxed(p));\n if (op.type === \"remove\") {\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(\n lane,\n outboxOf(lane).filter((c) => c.id !== id),\n ),\n ...marks(s, lane, [stored]),\n }),\n );\n }\n if (own) settleRemoved(s, own);\n } else {\n const next = patched(stored, op.patch(viewOf(s, protocol, stored)));\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(\n lane,\n outboxOf(lane).map((c) => (c.id === id ? next : c)),\n ),\n ),\n );\n }\n if (own) follow(s, own, next);\n }\n reorder(s, protocol);\n s.notify();\n};\n\nconst toPatch = (patch: StatewireClient.OutboxPatch): Patch => {\n if (typeof patch !== \"object\" || patch === null)\n throw new Error(\"outbox: update must return a patch object\");\n if (patch.held !== undefined && typeof patch.held !== \"boolean\")\n throw new Error(\"outbox: held must be a boolean\");\n if (\n patch.command !== undefined &&\n (Object.keys(patch.command).some((k) => k !== \"params\") ||\n !Array.isArray(patch.command.params))\n )\n throw new Error(\"outbox: a patch may only replace command.params\");\n return {\n ...(patch.held !== undefined && { held: patch.held }),\n ...(\"localMeta\" in patch && { localMeta: { value: patch.localMeta } }),\n ...(patch.command !== undefined && { params: patch.command.params }),\n };\n};\n\nconst outboxOp = (s: Session, id: string, op: OutboxOp): Promise<void> => {\n entryOf(s, id);\n const flushing = s.flushing;\n if (flushing?.ids.has(id)) {\n if (op.type === \"remove\") flushing.removed.add(id);\n else {\n const at = entryOf(s, id);\n const patch = op.patch(viewOf(s, at.protocol, at.stored));\n flushing.patches.set(id, { ...flushing.patches.get(id), ...patch });\n }\n return Promise.resolve();\n }\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n applyOutboxOp(s, id, op);\n done();\n return Promise.resolve();\n }\n return transact(s, () => applyOutboxOp(s, id, op)).then(done);\n};\n\nconst background = (promise: Promise<void>) => {\n promise.catch(() => {});\n};\n\nexport const holdOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"patch\", patch: () => ({ held: true }) }));\n\nexport const releaseOutbox = (s: Session, id: string): Promise<unknown> => {\n entryOf(s, id);\n const result = new Promise<unknown>((resolve, reject) => {\n const waiters = s.releases.get(id) ?? [];\n waiters.push({ resolve, reject });\n s.releases.set(id, waiters);\n });\n result.catch(() => {});\n outboxOp(s, id, { type: \"patch\", patch: () => ({ held: false }) }).catch(\n (error: unknown) => settleWaiters(s, id, error),\n );\n return result;\n};\n\nconst settleWaiters = (s: Session, id: string, error: unknown) => {\n const waiters = s.releases.get(id) ?? [];\n s.releases.delete(id);\n for (const waiter of waiters) waiter.reject(error);\n};\n\nexport const removeOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"remove\" }));\n\nexport const updateOutbox = (\n s: Session,\n id: string,\n fn: (entry: StatewireClient.OutboxEntry) => StatewireClient.OutboxPatch,\n) =>\n background(\n outboxOp(s, id, { type: \"patch\", patch: (entry) => toPatch(fn(entry)) }),\n );\n\nconst producedOf = (\n s: Session,\n): NonNullable<StatewireClient.SessionCommand[\"produced\"]> => ({\n wire: s.options.wireVersion ?? CLIENT_WIRE,\n protocols:\n protocolOffers(s.options) === \"*\" && s.selection\n ? s.selection.protocols\n : protocolOffers(s.options),\n});\n\nconst placed = (\n queue: readonly StatewireClient.OutboxCommand[],\n entry: StatewireClient.OutboxCommand,\n { after, before }: { after?: string; before?: string },\n) => {\n const anchor = after ?? before;\n if (anchor === undefined) return [...queue, entry];\n const index = queue.findIndex((c) => c.id === anchor);\n if (index === -1) return [...queue, entry];\n const at = after !== undefined ? index + 1 : index;\n return [...queue.slice(0, at), entry, ...queue.slice(at)];\n};\n\nexport const insertOutbox = (\n s: Session,\n entry: StatewireClient.OutboxInsert,\n): string => {\n if (!s.hydrated) throw new Error(\"outbox: storage is not hydrated yet\");\n if (s.storageError !== undefined) throw s.storageError;\n if (entry.after !== undefined && entry.before !== undefined)\n throw new Error(\"outbox: after and before are exclusive\");\n for (const anchor of [entry.after, entry.before])\n if (anchor !== undefined) entryOf(s, anchor);\n const { protocol } = entry;\n if (!(s.selection ? negotiated(s, protocol) : offered(s, protocol)))\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n const { params, meta } = encodeParams(entry.command.params);\n const id = entry.from === undefined ? newClientId() : `${entry.from}~`;\n const stored: StatewireClient.OutboxCommand = {\n id,\n produced: producedOf(s),\n method: entry.command.method,\n params,\n ...(meta !== undefined && { meta }),\n ts: Date.now(),\n ...(entry.held && { held: true as const }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n ...(s.store.owner !== undefined && { by: s.store.owner.id }),\n };\n const run = () => {\n if (isEphemeral(s, protocol)) {\n enqueueInner(\n s,\n {\n protocol,\n produced: stored.produced!,\n method: stored.method,\n params,\n ...(meta !== undefined && { meta }),\n },\n entry.command.params,\n () => {},\n () => {},\n {\n ...(entry.held && { hold: true }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n },\n );\n return;\n }\n let base = s.record;\n let entered = stored;\n if (entry.from !== undefined) {\n // Re-inserting a settled update consumes it in the same write: a\n // redelivery finds it gone.\n const source = Object.entries(base.lanes).find(([, l]) =>\n l.inbox?.some((n) => n.id === entry.from),\n );\n if (source === undefined || locate(s, id) !== undefined) return;\n const notice = source[1].inbox!.find((n) => n.id === entry.from)!;\n entered = { ...stored, ts: notice.ts };\n base = withLane(base, source[0], withoutNotice(source[1], entry.from));\n }\n const lane = laneOf(base, protocol);\n // A re-queued command keeps its place: ahead of what was queued after it.\n const later = outboxOf(lane).find((c) => c.ts >= entered.ts);\n const position =\n entry.from !== undefined &&\n entry.after === undefined &&\n entry.before === undefined &&\n later !== undefined\n ? { before: later.id }\n : entry;\n try {\n setRecord(\n s,\n withLane(\n base,\n protocol,\n withOutbox(lane, placed(outboxOf(lane), entered, position)),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n // The update stays unacked for the next mount.\n if (entry.from !== undefined) s.skipped.add(entry.from);\n settleReleases(s, id, { ok: false, failure: QUOTA });\n return;\n }\n s.mountIds.delete(id);\n reorder(s, protocol);\n s.notify();\n };\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n run();\n done();\n } else background(transact(s, run).then(done));\n return id;\n};\n\n// One sharer at a time runs the handler; the update leaves the record only\n// once it resolved, so a crash mid-handler redelivers it.\nconst nextNotice = (s: Session) => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const found = (lane.inbox ?? []).find((n) => !s.skipped.has(n.id));\n if (found) return { protocol, found };\n }\n return undefined;\n};\n\nconst withoutNotice = (\n lane: StatewireClient.SessionLane,\n id: string,\n): StatewireClient.SessionLane => {\n const inbox = (lane.inbox ?? []).filter((n) => n.id !== id);\n const { inbox: _inbox, ...rest } = lane;\n return inbox.length > 0 ? { ...rest, inbox } : rest;\n};\n\nconst ack = (s: Session, protocol: string, id: string) => {\n const lane = laneOf(s.record, protocol);\n if (s.skipped.has(id) || !lane.inbox?.some((n) => n.id === id)) return;\n setRecord(s, withLane(s.record, protocol, withoutNotice(lane, id)));\n};\n\nconst deliver = (s: Session) => {\n const handler = s.onSettled;\n // Handlers get ctx.state: delivery waits for the first hello.\n if (\n handler === undefined ||\n s.delivering ||\n !s.running ||\n !s.hydrated ||\n !s.sessionKnown\n )\n return;\n if (nextNotice(s) === undefined) return;\n s.delivering = true;\n const run = async () => {\n for (;;) {\n if (s.shared) await transact(s, () => {});\n else await null;\n const next = nextNotice(s);\n if (next === undefined || !s.running) return;\n const { protocol, found } = next;\n try {\n await handler(updateOf(protocol, found));\n } catch (error) {\n console.error(\n \"statewire: onCommandChange threw on a settled update; it stays for the next mount\",\n error,\n );\n s.skipped.add(found.id);\n continue;\n }\n if (s.shared) await transact(s, () => ack(s, protocol, found.id));\n else ack(s, protocol, found.id);\n s.notify();\n }\n };\n const locked = s.store.notifyLock ? s.store.notifyLock(run) : run();\n locked.then(\n () => {\n s.delivering = false;\n deliver(s);\n },\n (error: unknown) => {\n s.delivering = false;\n console.error(\"statewire: settled update delivery stopped\", error);\n },\n );\n};\n\nconst enqueue = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options?: EnqueueOptions,\n) => {\n if (!s.shared) {\n enqueueInner(s, command, params, resolve, reject, options);\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, () => {\n // A send queued behind the lock before this tab unmounted still lands in\n // the shared journal: another sharer adopts and replays it.\n if (isFinished(s)) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }));\n return;\n }\n enqueueInner(s, command, params, resolve, reject, options);\n }).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n};\n\nconst offered = (s: Session, protocol: string) => {\n const offers = protocolOffers(s.options);\n return offers === \"*\" || offers.some((offer) => offer.name === protocol);\n};\n\nconst sendCommand = (\n s: Session,\n method: string,\n params: readonly unknown[],\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n options?: StatewireClient.InvokeOptions,\n): Promise<unknown> => {\n const negotiated = s.selection\n ? s.selection.protocols.some((p) => p.name === protocol)\n : offered(s, protocol);\n if (!negotiated)\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n if (options?.hold !== undefined && typeof options.hold !== \"boolean\")\n throw new Error(\"statewire: invoke hold must be a boolean\");\n if (!s.hydrated) {\n const result = s.ready!.then(() =>\n sendCommand(s, method, params, protocol, options),\n );\n result.catch(() => {});\n return result;\n }\n if (s.storageError !== undefined) {\n const result = Promise.reject(s.storageError);\n result.catch(() => {});\n return result;\n }\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const result = new Promise<unknown>((resolve, reject) => {\n const { params: encoded, meta } = encodeParams(params);\n enqueue(\n s,\n {\n protocol,\n produced: producedOf(s),\n method,\n params: encoded,\n ...(meta !== undefined && { meta }),\n },\n params,\n resolve,\n reject,\n {\n ...(options?.hold && { hold: true }),\n ...(options?.localMeta !== undefined && {\n localMeta: options.localMeta,\n }),\n },\n );\n });\n result.catch(() => {});\n return result;\n};\n\nexport const documentSource = (s: Session): StatewireDocuments.Source => ({\n get: (protocol, key, prefix = s.options.keyPrefixes?.[protocol]) => {\n const mounted = findDocument(s.documents, protocol, key, prefix);\n if (mounted !== undefined) return mounted.value;\n if (!s.documentStore || key === undefined) return undefined;\n const absolute = resolveDocumentKey(key, prefix);\n if (absolute === undefined) return undefined;\n const cached = s.documentStore.load([\n s.documentStore.namespace ?? \"\",\n protocol,\n ...absolute,\n ]);\n if (cached === undefined) return undefined;\n const offers = protocolOffers(s.options);\n const offer =\n offers === \"*\"\n ? s.selection?.protocols.find((p) => p.name === protocol)\n : offers.find((p) => p.name === protocol);\n return offer !== undefined && inRange(cached.version, offer)\n ? cached.value\n : undefined;\n },\n list: () => s.documents.documents,\n subscribe: (listener) => {\n s.documentListeners.add(listener);\n return () => {\n s.documentListeners.delete(listener);\n };\n },\n});\n\nexport const invokeProtocol = (\n s: Session,\n protocol: string,\n method: string,\n params: readonly unknown[],\n options?: StatewireClient.InvokeOptions,\n) => sendCommand(s, method, params, protocol, options);\n\nconst storedCommandCompatible = (\n protocol: string,\n command: StatewireClient.OutboxCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\n !inRange(command.produced.wire.version, current.wire)\n )\n return false;\n const previous = command.produced.protocols;\n if (current.protocols === \"*\") return true;\n if (previous === \"*\") return false;\n const produced = previous.find((p) => p.name === protocol);\n const offer = current.protocols.find((p) => p.name === protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst validateLanes = (record: StatewireClient.SessionRecord) => {\n if (\n typeof record.lanes !== \"object\" ||\n record.lanes === null ||\n Object.values(record.lanes).some(\n (lane) =>\n !Array.isArray(lane.commands) ||\n (lane.outbox !== undefined && !Array.isArray(lane.outbox)),\n )\n )\n throw new Error(\n \"statewire: session storage loaded a record without command lanes\",\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null) validateLanes(stored);\n const current = {\n wire: options.wireVersion ?? CLIENT_WIRE,\n protocols: protocolOffers(options),\n };\n const compatible = (record: StatewireClient.SessionRecord) =>\n Object.entries(record.lanes).every(([protocol, lane]) =>\n [...lane.commands, ...outboxOf(lane)].every((command) =>\n storedCommandCompatible(protocol, command, current),\n ),\n );\n if (stored !== null && !compatible(stored)) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (stored !== null) {\n validateLanes(stored);\n if (!compatible(stored))\n throw new Error(\"statewire: migrated commands are incompatible\");\n store.save(stored);\n }\n }\n const record =\n stored === null\n ? { clientId: newClientId(), lanes: {} }\n : boundInbox(store, stored);\n if (record !== stored) store.save(record);\n return record;\n};\n\nconst storedIds = (record: StatewireClient.SessionRecord) =>\n new Set(\n Object.values(record.lanes).flatMap((lane) => [\n ...lane.commands.map((c) => c.id),\n ...outboxOf(lane).map((c) => c.id),\n ]),\n );\n\nexport const setContext = (\n s: Session,\n protocol: string,\n value: Statewire.Context,\n): void => {\n if (\n s.selection\n ? !s.selection.protocols.some((p) => p.name === protocol)\n : !offered(s, protocol)\n )\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n s.contexts.set(protocol, encodeContext(protocol, value));\n s.dirtyContexts.add(protocol);\n wake(s);\n void pump(s);\n};\n\nexport const useStatewireSession = (\n options: StatewireSessionOptions,\n): Session => {\n const [defaultStore] = useState(createMemorySessionStore);\n const mounted = useContext(SessionStorageContext);\n const documentStore = useContext(DocumentStorageContext);\n if (options.sessionStore !== undefined && mounted !== undefined) {\n throw new Error(\n \"statewire: session storage is set twice — drop the transport's sessionStore or the client's storage.session\",\n );\n }\n const store = options.sessionStore ?? mounted ?? defaultStore;\n if (\n (store.lock === undefined) !== (store.subscribe === undefined) ||\n (store.lock === undefined) !== (store.owner === undefined) ||\n (store.lock === undefined) !== (store.notifyLock === undefined)\n ) {\n throw new Error(\n \"statewire: session storage must provide lock, subscribe, owner and notifyLock together\",\n );\n }\n const [s] = useState((): Session => {\n const record =\n store.ready === undefined\n ? loadSessionRecord(store, options)\n : { clientId: newClientId(), lanes: {} };\n const session: Session = {\n options,\n configuredContext: options.context,\n contexts: new Map(\n Object.entries(options.context ?? {}).map(([protocol, value]) => [\n protocol,\n encodeContext(protocol, value),\n ]),\n ),\n dirtyContexts: new Set(Object.keys(options.context ?? {})),\n attachContexts: new Map(),\n selection: undefined,\n record,\n ctx: {\n beforeAttach: () => persistBeforeSend(session),\n get clientId() {\n return session.record.clientId;\n },\n takeAttachLanes: () => takeAttachLanes(session),\n onHello: (args) => handleHello(session, args),\n onOps: (args) => handleOps(session, args),\n onCmds: (cmds) => handleCmds(session, cmds),\n onRefusal: (syn) => handleRefusal(session, syn),\n onIdle: (level) => setIdle(session, level),\n onDetach: () => handleDetach(session),\n onFinish: (args) => handleFinish(session, args),\n },\n recordPersisted: store.ready === undefined,\n hydrated: store.ready === undefined,\n ready: undefined,\n storageError: undefined,\n persistedRecord: store.ready === undefined ? record : null,\n store,\n documentStore,\n shared:\n store.lock !== undefined\n ? {\n txq: Promise.resolve(),\n syncQueued: false,\n parked: [],\n settled: new Set(),\n notices: [],\n inTx: false,\n unsubscribe: null,\n watched: new Set(),\n abort: null,\n }\n : false,\n ephemeral: false,\n deactivated: false,\n sessionKnown: false,\n durableSeq: {},\n ephemeralSeqs: {},\n resumeAt: 0,\n reattach: false,\n idle: false,\n onSessionLost: undefined,\n onDeprecatedPath: undefined,\n onSettled: undefined,\n releases: new Map(),\n delivering: false,\n skipped: new Set(),\n views: new WeakMap(),\n onFlush: undefined,\n onDone: undefined,\n mountIds: storedIds(record),\n flushing: null,\n outboxList: [],\n outboxParts: [],\n lanesOnAttach: false,\n attachEntries: new Set(),\n frameFailures: 0,\n recheck: undefined,\n rechecks: { watermarks: \"\", count: 0 },\n pending: [],\n canonical: undefined,\n documentListeners: new Set(),\n documents: { mode: null, documents: new Map() },\n lastPublished: undefined,\n changed: [],\n source: {\n snapshot: () => session.canonical,\n takeChanged: () => {\n const changed = session.changed;\n session.changed = [];\n return changed;\n },\n setOnChange: (listener) => {\n session.notify = listener ?? (() => {});\n },\n },\n attach: \"detached\",\n attachEpoch: 0,\n running: false,\n pumping: false,\n transport: null,\n waiters: [],\n lifecycle: null,\n notify: () => {},\n commands: createMethodProxy((method, params) =>\n sendCommand(session, method, params),\n ),\n };\n if (store.ready !== undefined) {\n session.ready = store.ready.then(() => {\n session.record = loadSessionRecord(store, session.options);\n session.mountIds = storedIds(session.record);\n session.recordPersisted = true;\n session.hydrated = true;\n if (session.running) session.notify();\n });\n session.ready = session.ready.catch((cause: unknown) => {\n const error = wrapStorageError(cause);\n session.storageError = error;\n session.transport?.storageFailed(error);\n throw error;\n });\n session.ready.catch(() => {});\n }\n bindCommandsHost(session.commands, {\n setListener: (listener) => {\n session.lifecycle = listener;\n },\n });\n return session;\n });\n if ((store.lock !== undefined) !== (s.shared !== false)) {\n throw new Error(\n \"statewire: session storage changed sharedness across renders — lock/subscribe must be present from the first render or never\",\n );\n }\n useEffect(() => {\n if (s.configuredContext === options.context) return;\n s.configuredContext = options.context;\n for (const [protocol, value] of Object.entries(options.context ?? {}))\n setContext(s, protocol, value);\n }, [s, options.context]);\n s.options = options;\n s.store = store;\n s.documentStore = documentStore;\n s.onSessionLost = options.onSessionLost;\n s.onDeprecatedPath = options.onDeprecatedPath;\n s.onSettled = options.onSettled;\n s.onFlush = options.onFlush;\n s.onDone = options.onDone;\n const keyPrefixes = JSON.stringify(options.keyPrefixes);\n useEffect(() => {\n cacheDocuments(s);\n }, [s, documentStore, keyPrefixes]);\n useEffect(\n () =>\n documentStore?.subscribe?.(() => {\n for (const listener of s.documentListeners) listener();\n }),\n [s, documentStore],\n );\n useEffect(() => {\n start(s);\n return () => stop(s);\n }, [s]);\n return s;\n};\n\nexport { setTransport };\n"],"mappings":";;;;;;;;;;;;;;;;AA+EA,MAAMmE,iBAAiBC,YAA2B;CAChD,MAAM,IAAIC,MAAM,8BAA8BD,SAAS;AACzD;AAEA,MAAME,gBACJC,YACqB;CACrB,MAAMG,SAASD,QAAQR,OAAgB,IAAI5B,mBAAmBkC,OAAO,CAAC;CACtEG,OAAOC,YAAY,CAAC,CAAC;CACrB,OAAOD;AACT;AAwHA,MAAMiH,aAA0C;CAAEE,SAAS;CAAGH,UAAU,CAAA;AAAG;AAE3E,MAAMI,UACJ3D,QACAzF,aAEAqJ,OAAOC,OAAO7D,OAAO8D,OAAOvJ,QAAQ,IAAIyF,OAAO8D,MAAMvJ,YAAaiJ;AAEpE,MAAMO,YACJ/D,QACAzF,UACAyJ,UACmC;CACnC,GAAGhE;CACH8D,OAAO;EAAE,GAAG9D,OAAO8D;GAAQvJ,WAAWyJ;CAAK;AAC7C;AAEA,MAAMC,eAAeC,GAAY3J,aAC/B2J,EAAEpE,WAAWqE,UAAUC,MACpBC,MAAMA,EAAEC,SAAS/J,YAAY8J,EAAErE,WAAW,WAC7C,KAAK;AAEP,MAAMuE,gBAAgBL,GAAY3J,aAChCqJ,OAAOC,OAAOK,EAAEnD,YAAYxG,QAAQ,IAAI2J,EAAEnD,WAAWxG,YAAa;AAIpE,MAAMkK,aAAaJ,MAA6BA,EAAEnJ,QAAQwJ,KAAAA;AAE1D,MAAMC,cAAcN,MAAeA,EAAEnJ,QAAQwJ,KAAAA,KAAa,CAACL,EAAE9I;;AAG7D,MAAMqJ,eAAeV,GAAY3J,aAC/B2J,EAAE5B,QAAQuC,QACPR,MAAoBI,UAAUJ,CAAC,KAAKA,EAAElJ,QAAQZ,aAAaA,QAC9D;AAEF,MAAMuK,eAAeZ,MAAe;CAClCA,EAAE5B,QAAQyC,MAAMC,GAAGC,OAAOD,EAAE9J,OAAOgK,aAAaD,EAAE/J,OAAOgK,aAAa,CAAC;AACzE;AAMA,MAAME,SACJlB,GACAF,MACA3E,SACAjD,YACyC;CACzC,MAAMiJ,QAAQhG,QACXwF,QAAQS,MAAMA,EAAEhK,OAAOoJ,KAAAA,KAAaY,EAAEhK,OAAO4I,EAAE1D,MAAM+E,OAAOtK,EAAE,CAAC,CAC/DuK,KAAKF,OAAO;EAAErK,IAAIqK,EAAErK;EAAIK,IAAIgK,EAAEhK;EAAK,GAAIc,WAAW,EAAEA,QAAQ;CAAG,EAAE;CACpE,MAAMqJ,OAAO,CAAC,GAAIzB,KAAK3E,WAAW,CAAA,GAAK,GAAGgG,KAAK;CAC/C,OAAOI,KAAKC,SAAS,IAAI,EAAErG,SAASoG,KAAK,IAAI,CAAC;AAChD;AAEA,MAAME,cACJ3B,MACA4B,WACgC;CAChC,MAAM,EAAEA,QAAQE,SAAS,GAAGC,SAAS/B;CACrC,OAAO4B,OAAOF,SAAS,IAAI;EAAE,GAAGK;EAAMH;CAAO,IAAIG;AACnD;AAEA,MAAMC,YAAYhC,SAAsCA,KAAK4B,UAAU,CAAA;AAEvE,MAAMhD,WAAWsB,GAAYG,MAAeH,EAAEb,WAAW4C,WAAW5B,EAAEjJ,GAAG;AAEzE,MAAM8K,SAAShC,GAAYG,GAAYnJ,QAAgB;CACrDmJ,EAAEnJ,MAAMA;CACRmJ,EAAEjJ,IAAIF,MAAMA;CACZ,OAAOmJ,EAAEjJ,IAAIyD;CACbwF,EAAE9I,OAAO;CACT8I,EAAE5I,YAAY;CACd4I,EAAE3I,SAAS;CACXkH,QAAQsB,GAAGG,CAAC;AACd;AAEA,MAAM8B,WAAWjC,GAAYG,MAAe;CAC1CA,EAAEnJ,MAAMwJ,KAAAA;CACR,OAAOL,EAAEjJ,IAAIF;CACbmJ,EAAE9I,OAAO;CACT8I,EAAE5I,YAAY;CACd4I,EAAE3I,SAAS;CACXkH,QAAQsB,GAAGG,CAAC;AACd;AAGA,MAAM+B,UACJlC,GACAG,GACAgC,WACG;CACH,IAAIC,QAAQ;CACZ,IAAKjC,EAAEjJ,IAAIyD,SAAS,UAAWwH,OAAOxH,SAAS,OAAO;EACpD,IAAIwH,OAAOxH,MAAMwF,EAAEjJ,IAAIyD,OAAO;OACzB,OAAOwF,EAAEjJ,IAAIyD;EAClByH,QAAQ;CACV;CACA,IAAIjC,EAAEjJ,IAAI0D,cAAcuH,OAAOvH,WAAW;EACxC,IAAIuH,OAAOvH,cAAc4F,KAAAA,GAAW,OAAOL,EAAEjJ,IAAI0D;OAC5CuF,EAAEjJ,IAAI0D,YAAYuH,OAAOvH;EAC9BwH,QAAQ;CACV;CACA,IAAIjC,EAAElJ,QAAQP,WAAWyL,OAAOzL,QAAQ;EACtCyJ,EAAElJ,UAAU;GACV,GAAGkJ,EAAElJ;GACLP,QAAQyL,OAAOzL;GACf,GAAIyL,OAAOxL,SAAS6J,KAAAA,IAAY,CAAC,IAAI,EAAE7J,MAAMwL,OAAOxL,KAAK;EAC3D;EACA,IAAIwL,OAAOxL,SAAS6J,KAAAA,GAAW,OAAOL,EAAElJ,QAAQN;EAChDwJ,EAAEjJ,IAAIR,SAAS2L,SAASF,MAAM;EAC9BC,QAAQ;CACV;CACA,IAAIA,OAAO1D,QAAQsB,GAAGG,CAAC;AACzB;AAEA,MAAMkC,YAAYF,WAChBA,OAAOxL,SAAS6J,KAAAA,IACZ2B,OAAOzL,SACNxB,oBAAYoN,gBAAgBH,OAAOzL,MAAM,GAAGyL,OAAOxL,IAAI;AAE9D,MAAM4L,eAAevC,GAAYG,MAAe;CAC9CH,EAAE5B,UAAU4B,EAAE5B,QAAQuC,QAAQ6B,MAAMA,MAAMrC,CAAC;CAC3CH,EAAEb,WAAWsD,YAAYtC,EAAEjJ,GAAG;AAChC;AAEA,MAAMwL,WAAW1C,MAAe;CAC9B,IAAIA,EAAE3B,cAAc2B,EAAEvB,eAAe;CACrCuB,EAAEvB,gBAAgBuB,EAAE3B;CACpB2B,EAAEZ,OAAO;AACX;AAEA,MAAMuD,QAAQ3C,MAAe;CAC3B,MAAMd,UAAUc,EAAEd;CAClBc,EAAEd,UAAU,CAAA;CACZ,KAAK,MAAM0D,UAAU1D,SAAS0D,OAAO;AACvC;AAEA,MAAMC,eAAe7C,MAAe,IAAI5H,SAAe0K,MAAM9C,EAAEd,QAAQ6D,KAAKD,CAAC,CAAC;AAE9E,MAAME,kBAAkBhD,GAAYiD,YAClC,IAAI7K,SAAeV,YAAY;CAC7B,MAAMkL,eAAe;EACnBM,aAAaC,KAAK;EAClBzL,QAAQ;CACV;CACA,MAAMyL,QAAQnF,iBAAiB;EAC7BgC,EAAEd,UAAUc,EAAEd,QAAQyB,QAAQyC,MAAMA,MAAMR,MAAM;EAChDlL,QAAQ;CACV,GAAGuL,OAAO;CACVjD,EAAEd,QAAQ6D,KAAKH,MAAM;AACvB,CAAC;AAEH,MAAMS,iBAAiBrD,GAAYsD,UAAmB;CACpD,MAAMzL,QAAQjE,iBAAiB0P,KAAK;CACpCtD,EAAE5D,eAAevE;CACjB,KAAK,MAAM0L,SAASvD,EAAE5B,SAASmF,MAAM3L,OAAOC,KAAK;CACjDmI,EAAEf,WAAWoE,cAAcxL,KAAK;AAClC;AAEA,MAAM2L,aAAaxD,GAAYlE,WAA0C;CACvE,IAAI,CAACkE,EAAErD,aACL,IAAI;EACFqD,EAAE1D,MAAMmH,KAAK3H,MAAM;CACrB,SAASwH,OAAO;EACd,IAAII,QAAQJ,KAAK,GAAG,MAAMA;EAC1BD,cAAcrD,GAAGsD,KAAK;EACtB,MAAMtD,EAAE5D;CACV;CAEF4D,EAAElE,SAASA;CACXkE,EAAEZ,OAAO;AACX;AAEA,MAAMuE,YAAYxD,MAA8C;CAC9D,MAAM,EAAE9J,UAAUuN,WAAW,GAAG3M,YAAYkJ,EAAElJ;CAC9C,OAAO;EACLF,IAAIoJ,EAAEpJ;EACN,GAAGE;EACH4M,IAAI1D,EAAEjJ,IAAI2M;EACV,GAAI1D,EAAE/I,OAAOoJ,KAAAA,KAAa,EAAEpJ,IAAI+I,EAAE/I,GAAG;EACrC,GAAI+I,EAAEjJ,IAAIyD,QAAQ,EAAEA,MAAM,KAAc;EACxC,GAAIwF,EAAEjJ,IAAI0D,cAAc4F,KAAAA,KAAa,EAAE5F,WAAWuF,EAAEjJ,IAAI0D,UAAU;CACpE;AACF;AAEA,MAAMmJ,YAAY/D,GAAYG,MAA+C;CAC3E,MAAM,EAAE9J,UAAUuN,WAAW,GAAG3M,YAAYkJ,EAAElJ;CAC9C,OAAO;EACLF,IAAIoJ,EAAEpJ;EACNC,KAAKmJ,EAAEnJ;EACP,GAAIgJ,EAAE1D,MAAM+E,UAAUb,KAAAA,KAAa,EAAEa,OAAOrB,EAAE1D,MAAM+E,MAAMtK,GAAG;EAC7D,GAAIoJ,EAAE/I,OAAOoJ,KAAAA,KAAa,EAAEpJ,IAAI+I,EAAE/I,GAAG;EACrC,GAAGH;EACH4M,IAAI1D,EAAEjJ,IAAI2M;EACV,GAAI1D,EAAEjJ,IAAI0D,cAAc4F,KAAAA,KAAa,EAAE5F,WAAWuF,EAAEjJ,IAAI0D,UAAU;CACpE;AACF;AAEA,MAAMoJ,WACJhE,GACA3J,aAEAqK,YAAYV,GAAG3J,QAAQ,CAAC,CAACiL,KAAKnB,MAAM4D,SAAS/D,GAAGG,CAAC,CAAC;AAEpD,MAAM8D,gBACJjE,GACA3J,aACqC;CACrC,MAAM6N,MAAMF,QAAQhE,GAAG3J,QAAQ;CAC/B,IAAI,CAAC2J,EAAEvD,QAAQ,OAAOyH;CAMtB,OAAO,CAAC,GAHQzE,OAAOO,EAAElE,QAAQzF,QAAQ,CAAC,CAACgJ,SAASsB,QACjDS,MAAMA,EAAEC,UAAUrB,EAAE1D,MAAM+E,OAAOtK,EAEzBoN,GAAS,GAAGD,GAAG,CAAC,CAACrD,MAAMC,GAAGC,MAAMD,EAAE9J,MAAM+J,EAAE/J,GAAG;AAC1D;AAEA,MAAMoN,gBAAgBpE,MAAyB,CAC7C,mBAAG,IAAI9F,IAAI,CACT,GAAGwF,OAAO2E,KAAKrE,EAAElE,OAAO8D,KAAK,GAC7B,GAAGI,EAAE5B,QACFkD,KAAKnB,MAAMA,EAAElJ,QAAQZ,QAAQ,CAAC,CAC9BsK,QAAQtK,aAAa,CAAC0J,YAAYC,GAAG3J,QAAQ,CAAC,CAAC,CACnD,CAAC;AAOJ,MAAMkO,oBAAoBvE,MAAe;CACvC,IAAIA,EAAEvD,UAAUuD,EAAEvD,OAAOtC,QAAQqH,SAAS,GACxCgD,YAAYxE,GAAGA,EAAEvD,OAAOtC,QAAQsK,OAAO,CAAC,CAAC;CAC3C,MAAM3K,SAASkG,EAAEvD,SAASuD,EAAEvD,OAAO3C,OAAO2K,OAAO,CAAC,IAAI,CAAA;CACtD,MAAMxK,UAAU+F,EAAEvD,SAAS,IAAIvC,IAAI8F,EAAEvD,OAAOxC,OAAO,oBAAI,IAAIC,IAAY;CACvE,IAAI8F,EAAEvD,QAAQuD,EAAEvD,OAAOxC,QAAQyK,MAAM;CACrC,IAAI9E,QAAQI,EAAElE,OAAO8D;CACrB,KAAK,MAAMvJ,YAAY+N,aAAapE,CAAC,GAAG;EACtC,MAAMF,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;EAGtC,MAAMsO,aAAa7K,OAChB6G,QAAQiE,MAAMA,EAAEvO,aAAaA,QAAQ,CAAC,CACtCwO,SAAS,EAAE9K,cAAc;GACxB,MAAMhD,KACJgD,QAAQhD,MAAM+I,KAAKT,SAASyF,MAAM1D,MAAMA,EAAEpK,QAAQ+C,QAAQ/C,GAAG,CAAC,EAAED;GAElE,IAAIA,OAAOyJ,KAAAA,KAAavG,QAAQ8K,IAAIhO,EAAE,GAAG,OAAO,CAAA;GAChD,OAAO,CAAC;IAAE,GAAGgD;IAAShD;GAAG,CAAC;EAC5B,CAAC;EACH,MAAMiO,aAAa,IAAI9K,IAAIyK,WAAWrD,KAAKsD,MAAMA,EAAE5N,GAAG,CAAC;EACvD,MAAMqI,WAAW4E,aAAajE,GAAG3J,QAAQ,CAAC,CAACsK,QACxCS,MAAM,CAAC4D,WAAWD,IAAI3D,EAAEpK,GAAG,CAC9B;EACA,MAAMiO,QAAQnF,KAAKoF,YAAY,CAAA,EAAA,CAAIvE,QAChCiE,MAAMA,EAAE7N,OAAOyJ,KAAAA,KAAa,CAACvG,QAAQ8K,IAAIH,EAAE7N,EAAE,CAChD;EACA,MAAMmO,WACJP,WAAWnD,SAAS,KAAKyD,KAAKzD,YAAY1B,KAAKoF,YAAY,CAAA,EAAA,CAAI1D,SAC3D,CAAC,GAAGyD,MAAM,GAAGN,UAAU,CAAC,CAACQ,MAAM,GAAoB,IACnDrF,KAAKoF;EAKX,IAHEA,aAAapF,KAAKoF,YAClB7F,SAASmC,WAAW1B,KAAKT,SAASmC,UAClCnC,SAASgG,OAAOjE,GAAGkE,MAAMlE,EAAEpK,QAAQ8I,KAAKT,SAASiG,EAAE,CAAEtO,GAAG,GAC3C;EACf4I,QAAQ;GACN,GAAGA;IACFvJ,WAAW;IACV,GAAGyJ;IACHT;IACA,GAAI6F,aAAa1E,KAAAA,KAAa,EAAE0E,SAAS;GAC3C;EACF;CACF;CACA,IAAItF,UAAUI,EAAElE,OAAO8D,OAAO4D,UAAUxD,GAAG;EAAE,GAAGA,EAAElE;EAAQ8D;CAAM,CAAC;AACnE;AAEA,MAAM2F,eAAevF,MAAe;CAClC,MAAMvD,SAASuD,EAAEvD;CACjB,IAAI,CAACA,QAAQ,OAAO8H,iBAAiBvE,CAAC;CACtC,IAAIvD,OAAO5C,YAAY;CACvB4C,OAAO5C,aAAa;CACpB,SAAcmG,SAAS;EACrBvD,OAAO5C,aAAa;EACpB0K,iBAAiBvE,CAAC;CACpB,CAAC,CAAC,CAAC1H,YAAY;EACbmE,OAAO5C,aAAa;CACtB,CAAC;AACH;AAGA,MAAM2L,YAAYxF,GAAYyF,OAAkC;CAC9D,IAAI,CAACzF,EAAEvD,UAAUuD,EAAErD,aAAa;EAC9B8I,GAAG;EACH,OAAOrN,QAAQV,QAAQ;CACzB;CACA,MAAM+E,SAASuD,EAAEvD;CAiBjB,MAAMpE,SAhBMoE,OAAO7C,IAAI+L,WACrB3F,EAAE1D,MAAMsJ,KAAM,YAAY;EACxB,MAAMzD,SAAS,MAAM0D,WAAW7F,CAAC;EACjCvD,OAAOpC,OAAO;EACd,IAAI;GACFyL,QAAQ9F,GAAGmC,MAAM;GACjBsD,GAAG;EACL,UAAU;GACRhJ,OAAOpC,OAAO;EAChB;EACA0L,YAAY/F,CAAC;EACbA,EAAEZ,OAAO;EACT,MAAM4G,cAAchG,EAAE1D,MAAM2J,QAAQ;EACpC,IAAID,aAAa,MAAMA;CACzB,CAAC,CAEYN,CAAG,CAACpN,OAAOgL,UAAmB;EAC3CD,cAAcrD,GAAGsD,KAAK;EACtB,MAAMtD,EAAE5D;CACV,CAAC;CACDK,OAAO7C,MAAMvB,OAAOsN,WACZ,CAAC,SACD,CAAC,CACT;CACA,OAAOtN;AACT;AAEA,MAAMwN,aAAa,OAAO7F,MACxBA,EAAE1D,MAAM4J,OAAO,MAAMlG,EAAE1D,MAAM4J,KAAK,IAAIlG,EAAE1D,MAAM6J,KAAK;AAIrD,MAAML,WAAW9F,GAAYmC,WAAiD;CAC5E,IAAIA,WAAW,QAAQA,OAAOiE,aAAapG,EAAElE,OAAOsK,UAAU;EAC5DC,WAAWrG,GAAGmC,MAAM;EACpB;CACF;CACA,IAAIA,WAAW,MAAMnC,EAAElE,SAASwK,WAAWtG,EAAE1D,OAAO6F,MAAM;CAC1DoE,eAAevG,CAAC;CAChBwG,eAAexG,CAAC;AAClB;AAEA,MAAMuG,kBAAkBvG,MAAe;CACrC,MAAMyG,KAAKzG,EAAE1D,MAAM+E,OAAOtK;CAC1B,KAAK,MAAMoJ,KAAK,CAAC,GAAGH,EAAE5B,OAAO,GAAG;EAC9B,MAAM/H,WAAW8J,EAAElJ,QAAQZ;EAC3B,IAAI0J,YAAYC,GAAG3J,QAAQ,GAAG;EAC9B,MAAMyJ,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;EACtC,MAAMqQ,SAAS5E,SAAShC,IAAI,CAAC,CAACgF,MAAM1D,MAAMA,EAAErK,OAAOoJ,EAAEpJ,EAAE;EACvD,MAAM4P,UAAU7G,KAAKT,SAASyF,MAAM1D,MAAMA,EAAErK,OAAOoJ,EAAEpJ,EAAE;EACvD,IAAI2P,QAAQ;GACV,IAAIvG,EAAEnJ,QAAQwJ,KAAAA,KAAaL,EAAE9I,MAAM;IACjC,IAAI8I,EAAEhJ,SAAS;KACboL,YAAYvC,GAAGG,CAAC;KAChB;IACF;IACA8B,QAAQjC,GAAGG,CAAC;GACd;GACA+B,OAAOlC,GAAGG,GAAGuG,MAAM;EACrB,OAAO,IAAIC,WAAWA,QAAQtF,UAAUoF,IAAI;GAC1C,IAAItG,EAAEhJ,SAASoL,YAAYvC,GAAGG,CAAC;QAC1B,IAAI,CAACA,EAAE9I,MAAM;IAChB4K,QAAQjC,GAAGG,CAAC;IACZA,EAAE9I,OAAO;GACX;EACF,OAAO,IAAIsP,SACLxG;OAAAA,EAAEnJ,QAAQ2P,QAAQ3P,KAAKgL,MAAMhC,GAAGG,GAAGwG,QAAQ3P,GAAG;EAAA,OAC7C,IAAI,CAACmJ,EAAEhJ,YAAYsJ,WAAWN,CAAC,KAAKA,EAAE9I,OAAO;GAClD,MAAMuP,OAAO9G,KAAK3E,SAAS2J,MAAM+B,MAAMA,EAAE9P,OAAOoJ,EAAEpJ,EAAE;GACpD,IAAI6P,SAASpG,KAAAA,GAAW;IACtBL,EAAE9I,OAAO;IACT;GACF;GACA2I,EAAEb,WAAWsD,YAAYtC,EAAEjJ,GAAG;GAC9B4P,YACE9G,GACAG,GACA;IACE4G,IAAI;IACJ7O,SAAS0O,KAAK1O,WAAW;KAAE8O,MAAM;KAAW1D,OAAO;IAAU;GAC/D,GACAsD,KAAK1O,UAAU,YAAY,QAC7B;GACA,MAAM,EAAEiD,SAAS8L,UAAU,GAAGpF,SAAS/B;GACvC,MAAMoH,OAAOpH,KAAK3E,QAASwF,QAAQkG,MAAMA,EAAE9P,OAAOoJ,EAAEpJ,EAAE;GACtDyM,UACExD,GACAH,SAASG,EAAElE,QAAQzF,UAAU;IAC3B,GAAGwL;IACH,GAAIqF,KAAK1F,SAAS,KAAK,EAAErG,SAAS+L,KAAK;GACzC,CAAC,CACH;EACF;CACF;AACF;AAEA,MAAMC,UACJnH,GACAjJ,OAIe;CACf,KAAK,MAAM,CAACV,UAAUyJ,SAASJ,OAAO0H,QAAQpH,EAAElE,OAAO8D,KAAK,GAAG;EAC7D,MAAMuC,SAASL,SAAShC,IAAI,CAAC,CAACgF,MAAM1D,MAAMA,EAAErK,OAAOA,EAAE;EACrD,IAAIoL,QAAQ,OAAO;GAAE9L;GAAU8L;EAAO;EACtC,IAAIrC,KAAKT,SAASa,MAAMkB,MAAMA,EAAErK,OAAOA,EAAE,GAAG,OAAO,EAAEV,SAAS;CAChE;CACA,MAAM8J,IAAIH,EAAE5B,QAAQ0G,MAAMtC,MAAMA,EAAEzL,OAAOA,EAAE;CAC3C,IAAIoJ,MAAMK,KAAAA,GAAW,OAAOA,KAAAA;CAC5B,OAAOC,WAAWN,CAAC,KAAKJ,YAAYC,GAAGG,EAAElJ,QAAQZ,QAAQ,IACrD;EAAEA,UAAU8J,EAAElJ,QAAQZ;EAAU8L,QAAQwB,SAASxD,CAAC;CAAE,IACpD,EAAE9J,UAAU8J,EAAElJ,QAAQZ,SAAS;AACrC;AAEA,MAAMgR,kBACJrH,GACAjJ,IACAuQ,YAGG;CACH,MAAMpI,UAAUc,EAAE9C,SAASqK,IAAIxQ,EAAE;CACjC,IAAImI,YAAYsB,KAAAA,GAAW;CAC3BR,EAAE9C,SAASsK,OAAOzQ,EAAE;CACpB,KAAK,MAAM6L,UAAU1D,SACnB,IAAIoI,QAAQP,IAAInE,OAAOlL,QAAQ4P,QAAQ3P,OAAO;MACzCiL,OAAOhL,OAAO,IAAI5B,mBAAmBsR,QAAQpP,OAAO,CAAC;AAE9D;AAIA,MAAMsO,kBAAkBxG,MAAe;CACrC,KAAK,MAAMjJ,MAAM,CAAC,GAAGiJ,EAAE9C,SAASmH,KAAK,CAAC,GAAG;EACvC,IAAI8C,OAAOnH,GAAGjJ,EAAE,MAAMyJ,KAAAA,GAAW;EACjC,MAAMZ,QAAQF,OAAO+H,OAAOzH,EAAElE,OAAO8D,KAAK;EAC1C,MAAM8H,SAAS9H,MACZiF,SAAS/E,SAASA,KAAK6H,SAAS,CAAA,CAAE,CAAC,CACnC7C,MAAM8C,MAAMA,EAAE7Q,OAAOA,EAAE;EAC1B,MAAM6P,OAAOhH,MACViF,SAAS/E,SAASA,KAAK3E,WAAW,CAAA,CAAE,CAAC,CACrC2J,MAAM+B,MAAMA,EAAE9P,OAAOA,EAAE;EAC1B,MAAMmB,UAAUwP,QAAQxP,WAAW0O,MAAM1O;EACzCmP,eACErH,GACAjJ,IACAmB,UACI;GAAE6O,IAAI;GAAO7O;EAAQ,IACrB;GACE6O,IAAI;GACJpP,SACE+P,QAAQrP,WAAWmI,KAAAA,IACfA,KAAAA,IACA6B,SAAS;IACP3L,QAAQgR,OAAOrP,OAAOwC;IACtBlE,MAAM+Q,OAAOrP,OAAO1B;GACtB,CAAC,CAAC,CAAC;EACX,CACN;CACF;AACF;AAKA,MAAMoP,eAAe/F,MAAe;CAClC,MAAMqB,QAAQrB,EAAE1D,MAAM+E;CACtB,MAAM5E,SAASuD,EAAEvD;CACjB,IAAI,CAAC4E,SAAS,CAAC5E,UAAU,CAACA,OAAOjC,SAASwF,EAAErD,aAAa;CACzD,MAAMkL,SAASpL,OAAOjC,MAAMqN;CAC5B,KAAK,MAAM,CAACxR,UAAUyJ,SAASJ,OAAO0H,QAAQpH,EAAElE,OAAO8D,KAAK,GAAG;EAC7D,IAAI,CAACkI,QAAQ9H,GAAG3J,QAAQ,GAAG;EAC3B,KAAK,MAAM,EAAEgL,OAAOtK,QAAQ+I,KAAKT,UAAU;GACzC,IAAItI,OAAOyJ,KAAAA,KAAazJ,OAAOsK,MAAMtK,MAAM0F,OAAOlC,QAAQwK,IAAIhO,EAAE,GAC9D;GACF0F,OAAOlC,QAAQwN,IAAIhR,EAAE;GACrBsK,MAAM2G,SAASjR,IAAI8Q,MAAM,CAAC,CAAClC,WACnB;IACJ,IAAI,CAAC3F,EAAEjB,SAAS;IAChBkJ,mBACEjI,SACMkI,WAAWlI,GAAGjJ,EAAE,SAChB;KACJ4L,KAAK3C,CAAC;KACN,KAAUA,CAAC;IACb,CACF;GACF,SACM,CAAC,CACT;EACF;CACF;AACF;AAEA,MAAMkI,cAAclI,GAAYoI,SAA6B;CAC3D,MAAM3B,KAAKzG,EAAE1D,MAAM+E,OAAOtK;CAC1B,IAAI6I,QAAQI,EAAElE,OAAO8D;CACrB,IAAIzI,UAAU;CACd,KAAK,MAAM,CAACd,UAAUyJ,SAASJ,OAAO0H,QAAQpH,EAAElE,OAAO8D,KAAK,GAAG;EAC7D,IAAIwI,SAAS5H,KAAAA,KAAaV,KAAK3E,SAAS+E,MAAM2G,MAAMA,EAAEzP,OAAOgR,IAAI,GAAG;GAClE,MAAM,EAAEjN,SAAS8L,UAAU,GAAGpF,SAASpC,OACrC;IAAE,GAAGO,EAAElE;IAAQ8D;GAAM,GACrBvJ,QACF;GACA,MAAM6Q,OAAOpH,KAAK3E,QAAQwF,QAAQkG,MAAMA,EAAEzP,OAAOgR,IAAI;GACrDxI,QAAQ;IACN,GAAGA;KACFvJ,WAAW;KAAE,GAAGwL;KAAM,GAAIqF,KAAK1F,SAAS,KAAK,EAAErG,SAAS+L,KAAK;IAAG;GACnE;EACF;EACA,IAAI,CAACY,QAAQ9H,GAAG3J,QAAQ,GAAG;EAC3B,MAAMgS,UAAUvI,KAAKT,SAASsB,QAC3BS,MACCA,EAAEC,UAAU+G,SACX3B,OAAOjG,KAAAA,KAAaY,EAAEC,UAAUoF,OACjC,CAACzG,EAAE5B,QAAQ8B,MAAMC,MAAMA,EAAEpJ,OAAOqK,EAAErK,MAAMoJ,EAAEnJ,QAAQoK,EAAEpK,GAAG,CAC3D;EACA,IAAIqR,QAAQ7G,WAAW,GAAG;EAC1BrK,UAAU;EACVyI,QAAQ;GACN,GAAGA;IACFvJ,WAAW;IACV,GAAGyJ;IACHT,UAAUS,KAAKT,SAASiC,KAAKF,MAAM;KACjC,IAAIA,EAAEC,UAAU+G,MAAM,OAAOhH;KAC7B,MAAM,EAAEC,OAAOiH,QAAQ,GAAGzG,SAAST;KACnC,OAAOqF,OAAOjG,KAAAA,IAAYqB,OAAO;MAAE,GAAGA;MAAMR,OAAOoF;KAAG;IACxD,CAAC;GACH;EACF;EACA,KAAK,MAAMxP,WAAWoR,SAAS;GAC7B,MAAME,OAAOvI,EAAE5B,QAAQ0G,MAAM3E,MAAMA,EAAEpJ,OAAOE,QAAQF,EAAE;GACtD,IAAIwR,MAAM;IACRvG,MAAMhC,GAAGuI,MAAMtR,QAAQD,GAAG;IAC1BuR,KAAKhR,YAAY;IACjBgR,KAAKjR,QAAQ;GACf,OAAO0I,EAAE5B,QAAQ2E,KAAKyF,eAAexI,GAAG3J,UAAUY,OAAO,CAAC;EAC5D;CACF;CACA,IAAI,CAACE,SAAS;CACd,IAAIyI,UAAUI,EAAElE,OAAO8D,OAAO4D,UAAUxD,GAAG;EAAE,GAAGA,EAAElE;EAAQ8D;CAAM,CAAC;CACjEgB,YAAYZ,CAAC;CACb,IAAIA,EAAEnB,WAAW,YAAYmB,EAAEf,WAAWwJ,WAAWC,UAAU;AACjE;AAEA,MAAMF,kBACJxI,GACA3J,UACA8L,WACY;CACZ,MAAM,EAAEnL,KAAKD,IAAI8M,IAAIxC,OAAOiH,QAAQlR,IAAI,GAAGH,YAAYkL;CACvD,MAAMzL,SACJO,QAAQN,SAAS6J,KAAAA,IACbvJ,QAAQP,SACPxB,oBACCoN,gBAAgBrL,QAAQP,MAAM,GAC9BO,QAAQN,IACV;CACN,MAAM4M,QAAiB;EACrBxM;EACAC;EACAC,SAAS;GAAEZ;GAAU,GAAGY;EAAQ;EAChCC,KAAK;GACHb;GACAI,QAAQQ,QAAQR;GAChBC;GACAmN;GACA7M;GACAD;GACAqP,UAAUpG,EAAElE,OAAOsK;EACrB;EACAjP,SAAS;EACTC;EACAC,MAAM;EACNC,OAAO;EACPC,WAAW;EACXC,QAAQ;EACRC,SAAS;EACTC,eAAe,CAAC;EAChBE,cAAc,CAAC;CACjB;CACAoI,EAAEb,WAAWwJ,QAAQpF,MAAMrM,GAAG;CAC9B,OAAOqM;AACT;AAEA,MAAM0E,sBAAsBjI,GAAYyF,IAAgBmD,SAAsB;CAC5E,SAAc5I,GAAGyF,EAAE,CAAC,CAACE,KAAKiD,YAAY,CAAC,CAAC;AAC1C;AAEA,MAAMC,WAAW7I,GAAY8I,UAAmB;CAC9C,IAAIA,UAAU9I,EAAE/C,MAAM;CACtB+C,EAAE/C,OAAO6L;CACT9I,EAAEZ,OAAO;CACT,IAAI0J,OAAO9I,EAAEtG,SAAS;AACxB;AAEA,MAAMqP,SAAS/I,GAAYuD,UAAmB;CAC5C,IAAIA,MAAM9L,SAAS;CACnB8L,MAAM9L,UAAU;CAChBuI,EAAEb,WAAW6J,UAAUzF,MAAMrM,GAAG;CAChC8I,EAAEb,WAAWsD,YAAYc,MAAMrM,GAAG;AACpC;AAEA,MAAa+R,YAAY;AAMzB,MAAME,YACJ9S,UACA8L,YAC6B;CAC7B9L;CACAU,IAAIoL,OAAOpL;CACXN,QAAQ0L,OAAO1L;CACfC,QAAQ2L,SAASF,MAAM;CACvB,GAAIA,OAAOnL,QAAQwJ,KAAAA,KAAa,EAAExJ,KAAKmL,OAAOnL,IAAI;CAClDsS,QAAQ;CACR,GAAInH,OAAO9J,WAAWmI,KAAAA,KAAa,EACjCnI,QAAQgK,SAAS;EACf3L,QAAQyL,OAAO9J,OAAOwC;EACtBlE,MAAMwL,OAAO9J,OAAO1B;CACtB,CAAC,CAAC,CAAC,GACL;CACA,GAAIwL,OAAOjK,YAAYsI,KAAAA,KAAa,EAAEtI,SAASiK,OAAOjK,QAAQ;CAC9D,GAAIiK,OAAOvH,cAAc4F,KAAAA,KAAa,EAAE5F,WAAWuH,OAAOvH,UAAU;AACtE;AAGA,MAAM0L,cACJhK,OACAR,WACkC;CAClC,IAAI8D,QAAQ9D,OAAO8D;CACnB,MAAM2J,UAAqC,CAAA;CAC3C,KAAK,MAAM,CAAClT,UAAUyJ,SAASJ,OAAO0H,QAAQxH,KAAK,GAAG;EACpD,MAAM+H,QAAQ7H,KAAK6H;EACnB,IAAIA,UAAUnH,KAAAA,KAAamH,MAAMnG,UAAAA,KAAqB;EACtD,MAAMgI,SAAS,CAAC,GAAG7B,KAAK,CAAC,CAAC9G,MAAM4I,GAAGC,MAAMD,EAAE5F,KAAK6F,EAAE7F,EAAE;EACpD,MAAM8F,MAAMH,OAAOhI,SAAAA;EACnB+H,QAAQxG,KAAK,GAAGyG,OAAOrE,MAAM,GAAGwE,GAAG,CAAC,CAACrI,KAAKsG,MAAMuB,SAAS9S,UAAUuR,CAAC,CAAC,CAAC;EACtEhI,QAAQ;GAAE,GAAGA;IAAQvJ,WAAW;IAAE,GAAGyJ;IAAM6H,OAAO6B,OAAOrE,MAAMwE,GAAG;GAAE;EAAE;CACxE;CACA,IAAIJ,QAAQ/H,SAAS,GAAGlF,MAAMsN,UAAU;EAAEC,QAAQ;EAASN;CAAQ,CAAC;CACpE,OAAO3J,UAAU9D,OAAO8D,QAAQ9D,SAAS;EAAE,GAAGA;EAAQ8D;CAAM;AAC9D;AAEA,MAAMkK,YACJ3H,QACAmF,YACkC;CAClC,MAAMjP,SAASiP,QAAQP,KACnB/R,aAAasS,QAAQ3P,YAAY6I,KAAAA,IAAY,CAAA,IAAK,CAAC8G,QAAQ3P,OAAO,CAAC,IACnE6I,KAAAA;CACJ,OAAO;EACLzJ,IAAIoL,OAAOpL;EACXN,QAAQ0L,OAAO1L;EACfC,QAAQyL,OAAOzL;EACf,GAAIyL,OAAOxL,SAAS6J,KAAAA,KAAa,EAAE7J,MAAMwL,OAAOxL,KAAK;EACrDkN,IAAI1B,OAAO0B;EACX,GAAI1B,OAAOnL,QAAQwJ,KAAAA,KAAa,EAAExJ,KAAKmL,OAAOnL,IAAI;EAClD,GAAImL,OAAOvH,cAAc4F,KAAAA,KAAa,EAAE5F,WAAWuH,OAAOvH,UAAU;EACpE,GAAIvC,WAAWmI,KAAAA,KAAa,EAC1BnI,QAAQ;GACNwC,OAAOxC,OAAO3B;GACd,GAAI2B,OAAO1B,SAAS6J,KAAAA,KAAa,EAAE7J,MAAM0B,OAAO1B,KAAK;EACvD,EACF;EACA,GAAI,CAAC2Q,QAAQP,MAAM,EAAE7O,SAASoP,QAAQpP,QAAQ;CAChD;AACF;AAEA,MAAM8R,cACJ7H,WACG2H,SAAS3H,QAAQ;CAAE4E,IAAI;CAAO7O,SAAS+R;AAAK,CAAC;AAElD,MAAMA,OAAO;CAAEjD,MAAM;CAAQ1D,OAAO;AAAe;AAEnD,MAAM4G,eACJpK,MACA3F,YACgC;CAChC,MAAMgQ,QAAQ,IAAIjQ,KAAK4F,KAAK6H,SAAS,CAAA,EAAA,CAAIrG,KAAKsG,MAAMA,EAAE7Q,EAAE,CAAC;CACzD,MAAMoK,QAAQhH,QAAQwG,QAAQiH,MAAM,CAACuC,MAAMpF,IAAI6C,EAAE7Q,EAAE,CAAC;CACpD,OAAOoK,MAAMK,WAAW,IACpB1B,OACA;EAAE,GAAGA;EAAM6H,OAAO,CAAC,GAAI7H,KAAK6H,SAAS,CAAA,GAAK,GAAGxG,KAAK;CAAE;AAC1D;AAMA,MAAMqD,eAAexE,GAAY7F,YAA+B;CAC9D,IAAI2B,SAASkE,EAAElE;CACf,KAAK,MAAM,EAAEyH,OAAO+D,aAAanN,SAAS;EACxC,MAAM9D,WAAWkN,MAAMtM,QAAQZ;EAC/B,MAAMyJ,OAAOL,OAAO3D,QAAQzF,QAAQ;EACpCyF,SAAS+D,SAAS/D,QAAQzF,UAAU;GAClC,GAAG6T,YAAYpK,MAAM,CAACgK,SAAS/F,SAAS/D,GAAGuD,KAAK,GAAG+D,OAAO,CAAC,CAAC;GAC5DjI,UAAUS,KAAKT,SAASsB,QAAQS,MAAMA,EAAErK,OAAOwM,MAAMxM,EAAE;EACzD,CAAC;CACH;CACAyM,UAAUxD,GAAGsG,WAAWtG,EAAE1D,OAAOR,MAAM,CAAC;CACxCsO,QAAQpK,CAAC;AACX;AAGA,MAAM0H,UAAU1H,GAAYuD,OAAgB+D,YAAqB;CAC/D,IAAI,CAACtH,EAAEvD,UAAUuD,EAAEvD,OAAOpC,MAAM;EAC9BmK,YAAYxE,GAAG,CAAC;GAAEuD;GAAO+D;EAAQ,CAAC,CAAC;EACnC;CACF;CACAtH,EAAEvD,OAAOtC,QAAQ4I,KAAK;EAAEQ;EAAO+D;CAAQ,CAAC;CACxC/B,YAAYvF,CAAC;AACf;AAQA,MAAM8G,eACJ9G,GACAuD,OACA+D,SACAgD,OAAmB,aAChB;CACHtK,EAAE5B,UAAU4B,EAAE5B,QAAQuC,QAAQR,MAAMA,MAAMoD,KAAK;CAC/C,IAAIvD,EAAEvD,UAAU,CAAC8G,MAAMpM,SAAS6I,EAAEvD,OAAOxC,QAAQ8N,IAAIxE,MAAMxM,EAAE;CAC7DsQ,eAAerH,GAAGuD,MAAMxM,IAAIuQ,OAAO;CAGnC,MAAMiD,UACJD,SAAS,aACRA,SAAS,aACPhD,QAAQP,MAAMO,QAAQpP,QAAQoL,UAAU,cACzC/C,UAAUgD,KAAK,KACf,CAACxD,YAAYC,GAAGuD,MAAMtM,QAAQZ,QAAQ;CAC1C,IAAIkU,WAAWD,SAAS,UAAU5C,OAAO1H,GAAGuD,OAAkB+D,OAAO;CACrE,IAAIA,QAAQP,IAAI;EACdxD,MAAM7L,QAAQ4P,QAAQ3P,OAAO;EAC7BqI,EAAEb,WAAWqL,SACXjH,MAAMrM,KACN;GAAEuT,MAAM;GAAY9S,SAAS2P,QAAQ3P;EAAQ,GAC7C4S,OACF;CACF,OAAO;EACLhH,MAAM3L,OAAO,IAAI5B,mBAAmBsR,QAAQpP,OAAO,CAAC;EACpD8H,EAAEb,WAAWqL,SACXjH,MAAMrM,KACN;GAAEuT,MAAM;GAAY5S,OAAO,IAAI7B,mBAAmBsR,QAAQpP,OAAO;EAAE,GACnEqS,OACF;CACF;AACF;AAEA,MAAMG,aAAa1K,GAAY2K,WAA+B;CAC5D,MAAMrH,QACJqH,WAAW,YAAa,YAAuB;CACjD,MAAMC,QAAQ5K,EAAE5B;CAChB,MAAMyM,iBAAiBtH,UAAgD;EACrE,IAAIA,MAAMvM,QAAQwJ,KAAAA,GAAW,OAAO;GAAEwG,MAAM;GAAW1D;EAAM;EAC7D,IAAI,CAACC,MAAMhM,WAAW;GACpB,MAAMP,MAAMuM,MAAMvM;GAClB,MAAM8T,kBAAkBF,MAAM1K,MAC3BC,MACCA,EAAElJ,QAAQZ,aAAakN,MAAMtM,QAAQZ,YACrC8J,EAAEnJ,QAAQwJ,KAAAA,KACVL,EAAEnJ,MAAMA,OACRmJ,EAAE5I,SACN;GACA,OAAOuT,kBACH;IAAE9D,MAAM;IAAW1D;IAAOwH;GAAgB,IAC1C;IAAE9D,MAAM;IAAW1D;GAAM;EAC/B;EACA,OAAO;GAAE0D,MAAM;GAAQ1D;EAAM;CAC/B;CACA,KAAK,MAAMC,SAAS,CAAC,GAAGqH,KAAK,GAAG;EAC9B5K,EAAEb,WAAWsD,YAAYc,MAAMrM,GAAG;EAClC4P,YAAY9G,GAAGuD,OAAO;GAAEwD,IAAI;GAAO7O,SAAS2S,cAActH,KAAK;EAAE,CAAC;CACpE;AACF;AAEA,MAAMwH,cAAc/K,GAAYoH,YAAuB;CACrD,KAAK,MAAM7D,SAAS6D,SAAS;EAC3BpH,EAAEb,WAAWsD,YAAYc,MAAMrM,GAAG;EAClC4P,YAAY9G,GAAGuD,OAAO;GACpBwD,IAAI;GACJ7O,SAAS;IAAE8O,MAAM;IAAQ1D,OAAO;GAAe;EACjD,CAAC;CACH;AACF;AAEA,MAAM0H,iBAAiBhL,GAAYuD,UAAmB;CACpDvD,EAAEb,WAAWsD,YAAYc,MAAMrM,GAAG;CAClC4P,YAAY9G,GAAGuD,OAAO;EACpBwD,IAAI;EACJ7O,SAAS;GAAE8O,MAAM;GAAW1D,OAAO;EAAU;CAC/C,CAAC;AACH;AAEA,MAAM2H,WAAWjL,GAAYkL,cAAyB;CACpD,KAAK,MAAMC,OAAOD,WAAW;EAC3BlL,EAAEb,WAAWsD,YAAY0I,IAAIjU,GAAG;EAChCkU,aAAapL,GAAGmL,IAAIlU,SAASkU,IAAIjU,IAAIR,QAAQyU,IAAIzT,SAASyT,IAAIvT,QAAQ;GACpE,GAAIuT,IAAIjU,IAAIyD,QAAQ,EAAE0Q,MAAM,KAAK;GACjC,GAAIF,IAAIjU,IAAI0D,cAAc4F,KAAAA,KAAa,EAAE5F,WAAWuQ,IAAIjU,IAAI0D,UAAU;EACxE,CAAC;CACH;AACF;AAMA,MAAM0Q,gBAAgBtL,GAAYuL,UAAsB;CACtD,MAAM5Q,OAAOqF,EAAE5B,QAAQuC,QAAQR,MAAM,CAACA,EAAEhJ,OAAO;CAC/C,MAAM+T,YAAYvQ,KAAKgG,QAAQR,MAAM,CAACA,EAAE5I,aAAa,CAAC4I,EAAE1I,WAAW,CAAC0I,EAAE9I,IAAI;CAC1E0T,WACE/K,GACArF,KAAKgG,QAAQR,MAAM,CAAC+K,UAAUM,SAASrL,CAAC,CAAC,CAC3C;CACA,KAAK,MAAMA,KAAKH,EAAE5B,SAAS,IAAI+B,EAAEhJ,SAAS6I,EAAEb,WAAWsD,YAAYtC,EAAEjJ,GAAG;CACxE8I,EAAE5B,UAAU,CAAA;CACZ4B,EAAEnD,aAAa,CAAC;CAEhB,MAAM4O,WAAWzL,EAAElE,OAAO8D;CAC1B2L,MAAM;CACN,IAAI3L,QAAQI,EAAElE,OAAO8D;CACrB,KAAK,MAAM,CAACvJ,UAAUyJ,SAASJ,OAAO0H,QAAQqE,QAAQ,GAAG;EACvD,MAAMC,UAAUjM,OAAO;GAAE,GAAGO,EAAElE;GAAQ8D;EAAM,GAAGvJ,QAAQ;EACvD,IAAI,CAACyJ,KAAK6H,OAAOnG,UAAUkK,QAAQ/D,UAAU7H,KAAK6H,OAAO;EACzD/H,QAAQ;GAAE,GAAGA;IAAQvJ,WAAW6T,YAAYwB,SAAS5L,KAAK6H,KAAK;EAAE;CACnE;CACA,IAAI/H,UAAUI,EAAElE,OAAO8D,OAAO4D,UAAUxD,GAAG;EAAE,GAAGA,EAAElE;EAAQ8D;CAAM,CAAC;CACjEqL,QAAQjL,GAAGkL,SAAS;CACpBxI,QAAQ1C,CAAC;CACT2C,KAAK3C,CAAC;CACN,KAAUA,CAAC;AACb;AAEA,MAAM2L,eAAe3L,GAAYoG,aAC/BkF,aAAatL,SAASwD,UAAUxD,GAAG;CAAEoG;CAAUxG,OAAO,CAAC;AAAE,CAAC,CAAC;AAI7D,MAAMyG,cAAcrG,GAAYmC,WAA0C;CACxEmJ,aAAatL,SAAS;EACpBA,EAAElE,SAASwK,WAAWtG,EAAE1D,OAAO6F,MAAM;CACvC,CAAC;CAGD,IAAInC,EAAEnB,WAAW,YAAYmB,EAAEf,WAAWwJ,WAAWC,UAAU;AACjE;AAGA,MAAMkD,mBAAmB5L,MAAe;CACtCA,EAAEtD,YAAY;CACdsD,EAAEpD,eAAe;CACjB+O,YAAY3L,GAAGjK,SAAY,CAAC;AAC9B;AAIA,MAAM8V,wBAAwB7L,MAAe;CAC3C,MAAMrF,OAAOqF,EAAE5B,QAAQuC,QACpBR,MAAMI,UAAUJ,CAAC,KAAKJ,YAAYC,GAAGG,EAAElJ,QAAQZ,QAAQ,CAC1D;CACA,IAAIsE,KAAK6G,WAAW,GAAG;CACvBuJ,WACE/K,GACArF,KAAKgG,QAAQR,MAAMA,EAAE5I,SAAS,CAChC;CACA,KAAK,MAAM4I,KAAKxF,MAAM,IAAI,CAACwF,EAAE5I,WAAW0K,QAAQjC,GAAGG,CAAC;CACpDS,YAAYZ,CAAC;CACb0C,QAAQ1C,CAAC;AACX;AAEA,MAAM8L,mBAAmBC,QAAmD;CAC1E,OAAO;EACL/E,MAAM;EACN1D,OAAO;EACP,GAAIyI,IAAIC,SAASxL,KAAAA,KAAa,EAAEwL,MAAMD,IAAIC,KAAK;EAC/C,GAAID,IAAIhU,YAAYyI,KAAAA,KAAa,EAAEzI,SAASgU,IAAIhU,QAAQ;EACxD,GAAIgU,IAAIpU,YAAY6I,KAAAA,KAAa,EAAE7I,SAASoU,IAAIpU,QAAQ;CAC1D;AACF;AAEA,MAAMsU,aACJF,QAGyD;CACzD,QAAQA,IAAItB,MAAZ;EACE,KAAK,UACH,OAAO;GAAE1D,IAAI;GAAMpP,SAAS1C,eAAe8W,GAAG,CAAC,CAACpU;EAAQ;EAC1D,KAAK,YACH,OAAO;GAAEoP,IAAI;GAAO7O,SAAS4T,gBAAgB7W,eAAe8W,GAAG,CAAC;EAAE;EACpE,KAAK,UACH,OAAO;GACLhF,IAAI;GACJ7O,SAAS;IACP8O,MAAM;IACN1D,OAAO;IACP,GAAIyI,IAAIhU,YAAYyI,KAAAA,KAAa,EAAEzI,SAASgU,IAAIhU,QAAQ;GAC1D;EACF;EACF,KAAK,WACH,OAAO;GAAEgP,IAAI;GAAO7O,SAAS;IAAE8O,MAAM;IAAW1D,OAAO;GAAS;EAAE;EACpE,KAAK,WACH,OAAO;GAAEyD,IAAI;GAAO7O,SAAS;IAAE8O,MAAM;IAAW1D,OAAO;GAAS;EAAE;EACpE,SACE,OAAOxL,cAAc,qBAAqBoU,OAAOH,IAAItB,IAAI,GAAG;CAChE;AACF;AAGA,MAAM0B,iBAAiBnM,GAAYuD,OAAgBwI,QAAsB;CACvE,MAAMzE,UAAU2E,UAAUF,GAAG;CAC7B,IAAIzE,QAAQP,IAAIgC,MAAM/I,GAAGuD,KAAK;MACzBvD,EAAEb,WAAWsD,YAAYc,MAAMrM,GAAG;CACvC4P,YAAY9G,GAAGuD,OAAO+D,OAAO;AAC/B;AAEA,MAAM8E,qBAA0C,IAAIlS,IAAIrF,QAAQ;AAIhE,MAAMwX,eAAerM,GAAY+L,KAAmBhV,OAAgB;CAClE,IAAI,CAACiJ,EAAEvD,UAAU,CAAC2P,mBAAmBrH,IAAIgH,IAAItB,IAAK,GAAG;CACrD,IAAI1K,YAAYC,GAAG+L,IAAI1V,QAAQ,GAAG;CAClC2J,EAAEvD,OAAO3C,OAAOiJ,KAAK;EACnB1M,UAAU0V,IAAI1V;EACd0D,SAAS;GACP/C,KAAK+U,IAAI/U;GACT,GAAID,OAAOyJ,KAAAA,KAAa,EAAEzJ,GAAG;GAC7B0T,MAAMsB,IAAItB;GACV,GAAIsB,IAAIC,SAASxL,KAAAA,KAAa,EAAEwL,MAAMD,IAAIC,KAAK;GAC/C,GAAID,IAAIhU,YAAYyI,KAAAA,KAAa,EAAEzI,SAASgU,IAAIhU,QAAQ;GACxD,GAAIgU,IAAIpU,YAAY6I,KAAAA,KAAa,EAAE7I,SAASoU,IAAIpU,QAAQ;GACxD,GAAIoU,IAAIpV,SAAS6J,KAAAA,KAAa,EAAE7J,MAAMoV,IAAIpV,KAAK;EACjD;CACF,CAAC;AACH;AAEA,MAAM2V,aAAatM,GAAY+L,QAAsB;CACnD,IAAIA,IAAIQ,QAAQ,QAAQ,CAACxM,YAAYC,GAAG+L,IAAI1V,QAAQ,GAAG;EACrD,MAAMmW,YAAYC,KAAKC,IAAIrM,aAAaL,GAAG+L,IAAI1V,QAAQ,GAAG0V,IAAI/U,GAAG;EACjEgJ,EAAEnD,WAAWkP,IAAI1V,YAAYmW;EAC7B,KAAK,MAAMjJ,SAAS7C,YAAYV,GAAG+L,IAAI1V,QAAQ,GAC7C,IAAIkN,MAAMvM,OAAOwV,WAAWjJ,MAAM/L,SAAS;CAE/C;CACA,IAAIuU,IAAItB,SAASjK,KAAAA,GAAW;CAC5B,MAAM+C,QAAQ7C,YAAYV,GAAG+L,IAAI1V,QAAQ,CAAC,CAACyO,MAAM3E,MAAMA,EAAEnJ,QAAQ+U,IAAI/U,GAAG;CACxE,IAAI+U,IAAItB,SAAS,WAAW;EAC1B,IAAIlH,OAAOwF,MAAM/I,GAAGuD,KAAK;EACzB;CACF;CACA,IAAI,CAACA,OAAO;EACV8I,YAAYrM,GAAG+L,GAAG;EAClB;CACF;CACA,IAAIxI,MAAMpM,SAASkV,YAAYrM,GAAG+L,KAAKxI,MAAMxM,EAAE;CAC/CoV,cAAcnM,GAAGuD,OAAOwI,GAAG;AAC7B;AAEA,MAAMY,mBAAmB3M,MAAe;CACtC,IAAIJ,QAAQI,EAAElE,OAAO8D;CACrB,KAAK,MAAM,CAACvJ,UAAUyJ,SAASJ,OAAO0H,QAAQpH,EAAElE,OAAO8D,KAAK,GAAG;EAC7D,MAAMsF,WAAWpF,KAAKoF,YAAY,CAAA;EAClC,MAAM0H,2BAAW,IAAI1S,IAAY;EACjC,MAAM2S,YAA8C,CAAA;EACpD,IAAItL,OAAO2D;EACX,KAAK,MAAMnL,WAAWmL,UAAU;GAE9B,MAAM3B,QAAQvD,EAAE5B,QAAQ0G,MACrB3E,MACCA,EAAElJ,QAAQZ,aAAaA,aACtB0D,QAAQhD,OAAOyJ,KAAAA,IACZD,UAAUJ,CAAC,KAAKA,EAAEnJ,QAAQ+C,QAAQ/C,MAClCmJ,EAAEpJ,OAAOgD,QAAQhD,GACzB;GACA,IAAI,CAACwM,OAAO;GACZhC,OAAOA,KAAKZ,QAAQiE,MAAMA,MAAM7K,OAAO;GACvC6S,SAAS7E,IAAIhO,QAAQ/C,GAAG;GACxB,IAAIuM,MAAMpM,SAAS0V,UAAU9J,KAAK;IAAE,GAAGhJ;IAAShD,IAAIwM,MAAMxM;GAAG,CAAC;GAC9D,MAAM,EAAEA,IAAI+V,KAAK,GAAGf,QAAQhS;GAC5BoS,cAAcnM,GAAGuD,OAAO;IAAE,GAAGwI;IAAK1V;GAAS,CAAC;EAC9C;EACA,IAAIuW,SAASG,SAAS,GAAG;EACzBnN,QAAQ;GACN,GAAGA;IACFvJ,WAAW;IACV,GAAGyJ;IACHT,UAAUS,KAAKT,SAASsB,QAAQS,MAAM,CAACwL,SAAS7H,IAAI3D,EAAEpK,GAAG,CAAC;IAC1DkO,UAAU,CAAC,GAAG3D,MAAM,GAAGsL,SAAS,CAAC,CAAC1H,MAAM,GAAoB;GAC9D;EACF;CACF;CACA,IAAIvF,UAAUI,EAAElE,OAAO8D,OAAO;CAC9B4D,UAAUxD,GAAG;EAAE,GAAGA,EAAElE;EAAQ8D;CAAM,CAAC;CACnC8C,QAAQ1C,CAAC;CACT2C,KAAK3C,CAAC;AACR;AAEA,MAAMgN,cAAchN,GAAYiN,SAAyB;CACvD,KAAK,MAAMlB,OAAOkB,MAAMX,UAAUtM,GAAG+L,GAAG;CACxCxG,YAAYvF,CAAC;CACb2C,KAAK3C,CAAC;AACR;AAEA,MAAMkN,aAAalN,GAAYmN,QAAmB;CAChD,MAAM1V,UAAUtD,iBAAiB6L,EAAEzB,WAAW4O,KAAKnN,EAAEpE,WAAWqE,SAAS;CACzED,EAAEzB,YAAY9G;CACd,MAAM8J,OACJvB,EAAEpE,cAAc4E,KAAAA,IACZ/I,QAAQ8G,UAAUgJ,IAAI,CAAC,CAAC,EAAE1M,QAC1BmF,EAAE1E,QAAQ8R,yBAAyB,MACjC1N,OAAO2N,YACL,CAAC,GAAG5V,QAAQ8G,SAAS,CAAC,CAAC+C,KAAK,CAACvK,IAAIuW,OAAO,CACtC,GAAGA,EAAEjX,SAAQ,GAAIiX,EAAEC,QAAQ,OAAOxW,KAAKyW,KAAKC,UAAUH,EAAEC,GAAG,KAC3DD,EAAEzS,KAAK,CACR,CACH,IACAzG,aAAaqD,SAASuI,EAAE1E,QAAQjF,YAAAA,SAA4B,CAAC,EAAEwE;CACvE,IAAI0G,SAASvB,EAAE3B,WACb2B,EAAEtB,QAAQqE,KACR,GAAItL,QAAQiW,aAAalM,SAAS/J,QAAQiW,eAAe,CAAC,CAAA,CAAE,CAC9D;CACF1N,EAAE3B,YAAYkD;AAChB;AAEA,MAAMoM,kBAAkB3N,MAAe;CACrC,IAAIA,EAAEzD,iBAAiByD,EAAEpE,WACvB,KAAK,MAAMgS,YAAY5N,EAAEzB,UAAUA,UAAUkJ,OAAO,GAAG;EACrD,IAAI,CAACmG,SAASvX,YAAY,CAACuX,SAASL,KAAK;EACzC,MAAMA,MAAMjZ,mBACVsZ,SAASL,KACTvN,EAAE1E,QAAQuS,cAAcD,SAASvX,SACnC;EACA,MAAMyX,UAAU9N,EAAEpE,UAAUqE,UAAU6E,MACnC3E,MAAMA,EAAEC,SAASwN,SAASvX,QAC7B,CAAC,EAAEyX;EACH,IAAIP,QAAQ/M,KAAAA,KAAasN,YAAYtN,KAAAA,GACnCR,EAAEzD,cAAckH,KACd;GAACzD,EAAEzD,cAAcwR,aAAa;GAAIH,SAASvX;GAAU,GAAGkX;EAAG,GAC3D;GAAEO;GAASjT,OAAO+S,SAAS/S;EAAM,CACnC;CACJ;AAEJ;AAEA,MAAMmT,mBAAmBhO,MAAe;CACtC0C,QAAQ1C,CAAC;CACT2N,eAAe3N,CAAC;CAChB,KAAK,MAAMiO,YAAYjO,EAAE1B,mBAAmB2P,SAAS;CACrDtL,KAAK3C,CAAC;AACR;AAMA,MAAMkO,oBAAoBlO,GAAY3J,UAAkB8X,UAAkB;CACxE,MAAMrO,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;CACtC,MAAM6B,UAAU;EAAE8O,MAAM;EAAQ1D,OAAO;CAAe;CACtD,MAAM3I,OAAO+F,YAAYV,GAAG3J,QAAQ;CACpC2J,EAAEnD,WAAWxG,YAAY8X;CAazB,IAXExT,KAAK6G,SAAS,KACdxB,EAAEhH,gBACA2B,KAAK2G,KAAKnB,OAAO;EACfpJ,IAAIoJ,EAAEpJ;EACNN,QAAQ0J,EAAEjJ,IAAIT;EACdC,QAAQyJ,EAAEjJ,IAAIR;EACdmN,IAAI1D,EAAEjJ,IAAI2M;EACV7M,KAAKmJ,EAAEnJ;EACP,GAAImJ,EAAEjJ,IAAIkP,aAAa5F,KAAAA,KAAa,EAAE4F,UAAUjG,EAAEjJ,IAAIkP,SAAS;CACjE,EAAE,CACJ,MAAM,WACK;EACX,IAAIpG,EAAE9G,kBACJ8G,EAAE9G,iBAAiB;GAAEkV,MAAM;GAAwBjQ,OAAOxD,KAAK6G;EAAO,CAAC;OAEvE6M,QAAQC,KACN,kDAAkD3T,KAAK6G,OAAM,gDAC/D;EACF,KAAK,MAAMrB,KAAKxF,MAAM;GACpBqF,EAAEb,WAAWsD,YAAYtC,EAAEjJ,GAAG;GAC9B4P,YAAY9G,GAAGG,GAAG;IAAE4G,IAAI;IAAO7O;GAAQ,GAAG,QAAQ;EACpD;EACAsL,UACExD,GACAH,SAASG,EAAElE,QAAQzF,UAAU;GAC3B,GAAGyJ;GACHN,SAAS2O,QAAQ;GACjB9O,UAAU,CAAA;EACZ,CAAC,CACH;EACA,KAAK,MAAM8L,OAAOxQ,MAChByQ,aACEpL,GACAmL,IAAIlU,SACJkU,IAAIjU,IAAIR,cACF,CAAC,SACD,CAAC,GACP,EACE,GAAIyU,IAAIjU,IAAI0D,cAAc4F,KAAAA,KAAa,EACrC5F,WAAWuQ,IAAIjU,IAAI0D,UACrB,EACF,CACF;CACJ,OAAO;EAGL,MAAM2T,SAAStK,aAAajE,GAAG3J,QAAQ;EACvC,MAAMsE,OAAOmH,SAAShC,IAAI,CAAC,CAACa,QAAQS,MAAMA,EAAEzG,IAAI;EAChD,MAAM+L,SAAS5E,SAAShC,IAAI,CAAC,CAACa,QAAQS,MAAM,CAACA,EAAEzG,IAAI;EACnD,MAAM6T,OAAO,IAAItU,IAAIS,KAAK2G,KAAKF,MAAMA,EAAErK,EAAE,CAAC;EAC1CyM,UACExD,GACAH,SAASG,EAAElE,QAAQzF,UAAU;GAC3B,GAAG6T,YAAYzI,WAAW3B,MAAMnF,IAAI,GAAG,CACrC,GAAG4T,OAAOjN,KAAKF,MAAM4I,WAAW5I,CAAC,CAAC,GAClC,GAAGsF,OAAOpF,KAAKF,MAAM4I,WAAW5I,CAAC,CAAC,CAAC,CACpC;GACD5B,SAAS2O,QAAQ;GACjB9O,UAAU,CAAA;GACV,GAAG6B,MACDlB,GACAF,MACA,CACE,GAAGyO,OAAOjN,KAAKF,OAAO;IAAErK,IAAIqK,EAAErK;IAAIK,IAAIgK,EAAEhK,MAAMgK,EAAEC;GAAM,EAAE,GACxD,GAAGqF,MAAM,GAEXxO,OACF;EACF,CAAC,CACH;EACA,KAAK,MAAMiI,KAAKH,EAAE5B,QAAQuC,QACvB6B,MAAMA,EAAEvL,QAAQZ,aAAaA,YAAY,CAACmY,KAAKzJ,IAAIvC,EAAEzL,EAAE,CAC1D,GAAG;GACDiJ,EAAEb,WAAWsD,YAAYtC,EAAEjJ,GAAG;GAC9B4P,YAAY9G,GAAGG,GAAG;IAAE4G,IAAI;IAAO7O;GAAQ,GAAG,SAAS;EACrD;EACAkS,QAAQpK,CAAC;CACX;CACA0C,QAAQ1C,CAAC;CACT2C,KAAK3C,CAAC;AACR;AAOA,MAAMyO,UACJzO,GACA3J,UACAmW,WACAkC,SACAC,YACG;CACH,MAAM7O,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;CACtC,MAAMuY,QAAQlO,YAAYV,GAAG3J,QAAQ,CAAC,CAACsK,QAAQR,MAAMA,EAAEnJ,MAAMwV,SAAS;CACtE,MAAMqC,QAAQ,IAAI3T,IAChB4E,KAAKT,SAASsB,QAAQS,MAAMA,EAAEpK,MAAMwV,SAAS,CAAC,CAAClL,KAAKF,MAAM,CAACA,EAAErK,IAAIqK,CAAC,CAAC,CACrE;CACA,KAAK,MAAMjB,KAAKyO,OAAO,IAAI,CAACC,MAAM9J,IAAI5E,EAAEpJ,EAAE,GAAG8X,MAAMC,IAAI3O,EAAEpJ,IAAIgN,SAAS/D,GAAGG,CAAC,CAAC;CAC3E,IAAI0O,MAAM9B,SAAS,GAAG;CACtB,MAAMgC,QAAQ,CAAC,GAAGF,MAAMpH,OAAO,CAAC,CAAC,CAAC5G,MAAMC,GAAGC,MAAMD,EAAE9J,MAAM+J,EAAE/J,GAAG;CAC9D,IACE+X,MAAM,EAAE,CAAE/X,MAAMwV,YAAY,KAC5BuC,MAAM,EAAE,CAAE/X,OAAOqJ,aAAaL,GAAG3J,QAAQ,KACzCuY,MAAM1O,MAAMC,MAAMA,EAAE1I,OAAO,GAC3B;EACAyW,iBAAiBlO,GAAG3J,UAAUmW,SAAS;EACvC;CACF;CACA,MAAM/F,KAAKzG,EAAE1D,MAAM+E,OAAOtK;CAC1B,MAAMoN,UAAU4K,MAAMjK,MACnB1D,MACCA,EAAEC,UAAUb,KAAAA,KACZY,EAAEC,UAAUoF,MACZ,CAACmI,MAAM1O,MAAMC,MAAMA,EAAEpJ,OAAOqK,EAAErK,EAAE,CACpC;CACA,IAAIoN,YAAY3D,KAAAA,GAAW;EACzB,KAAK,MAAML,KAAKyO,OAAO,IAAIzO,EAAEnJ,MAAMmN,QAAQnN,KAAK2X,QAAQ5G,IAAI5H,CAAC;EAC7D;CACF;CACAqD,UACExD,GACAH,SAASG,EAAElE,QAAQzF,UAAU;EAC3B,GAAGoL,WAAW3B,MAAM,CAClB,GAAGiP,MAAMzN,KAAK,EAAEtK,KAAKgY,MAAM3N,OAAOiH,QAAQ,GAAGrR,cAAcA,OAAO,GAClE,GAAG6K,SAAShC,IAAI,CAAC,CAClB;EACDN,SAASgN,YAAY;EACrBnN,UAAUS,KAAKT,SAASsB,QAAQS,MAAMA,EAAEpK,OAAOwV,SAAS;CAC1D,CAAC,CACH;CACA,KAAK,MAAMvV,WAAW8X,OAAOL,QAAQ3G,IAAI9Q,QAAQF,EAAE;CACnD,KAAK,MAAMoJ,KAAKyO,OACd,IAAIzO,EAAEhJ,SAASoL,YAAYvC,GAAGG,CAAC;MAC1B8B,QAAQjC,GAAGG,CAAC;CAEnBS,YAAYZ,CAAC;AACf;AAEA,MAAMiP,gBAAgBjP,GAAY9B,eAAuB;CACvD,IAAI8B,EAAE/B,SAASC,eAAeA,YAC5B8B,EAAE/B,WAAW;EAAEC;EAAYC,OAAO;CAAE;CACtC6B,EAAE/B,SAASE,SAAS;CACpB,IAAI6B,EAAEjC,YAAYyC,KAAAA,GAAW;CAC7BR,EAAEjC,UAAUC,iBACJ;EACJgC,EAAEjC,UAAUyC,KAAAA;EACZ,IAAIR,EAAEjB,WAAWiB,EAAEnB,WAAW,YAC5BmB,EAAEf,WAAWwJ,WAAWC,UAAU;CACtC,GACA/S,QAAQqK,EAAE/B,SAASE,QAAQ,CAAC,CAC9B;AACF;AAEA,MAAM+Q,WAAWlP,MACfA,EAAEpE,cAAc4E,KAAAA,KAAaR,EAAEpE,UAAUkS,WAAAA;AAE3C,MAAMqB,eACJC,QAC4C;CAC5C,IAAIA,IAAItB,YAAYtN,KAAAA,KAAa4O,IAAInP,cAAcO,KAAAA,GACjD,OAAOA,KAAAA;CACT,OAAO;EACLsN,SAASsB,IAAItB;EACb7N,WAAWmP,IAAInP,UAAUqB,KAAK,EAAElB,MAAM0N,SAAShS,aAAa;GAC1D,IAAIgS,YAAYtN,KAAAA,GACd,OAAO1I,cAAc,cAAcsI,KAAI,gBAAiB;GAC1D,OAAO;IAAEA;IAAM0N;IAAS,GAAIhS,WAAW0E,KAAAA,KAAa,EAAE1E,OAAO;GAAG;EAClE,CAAC;CACH;AACF;AAGA,MAAMuT,kBACJvP,MACAwP,aACG;CACH,MAAMC,UAAU,IAAIrV,IAClB,CAAC,GAAGoV,QAAQ,CAAC,CACV3O,QAAQR,MAAMA,EAAElJ,QAAQZ,aAAayJ,KAAKM,IAAI,CAAC,CAC/CkB,KAAKnB,MAAMA,EAAEnJ,GAAG,CACrB;CACA,IAAIA,MAAM8I,KAAK9I,OAAO;CACtB,OAAOuY,QAAQxK,IAAI/N,MAAM,CAAC,GAAGA,OAAO;CACpC,OAAOA;AACT;AAEA,MAAMwY,eACJxP,GACA,EAAEmN,KAAKiC,UACJ;CACH,IAAIpP,EAAEnB,WAAW,YAAY;EAC3BmB,EAAElD,gBAAgB,CAAC;EACnB+O,qBAAqB7L,CAAC;CACxB;CACA,KAAK,MAAM,CAAC3J,UAAUwE,UAAUmF,EAAExE,UAChC,IAAIwE,EAAErE,eAAe4L,IAAIlR,QAAQ,MAAMwE,OACrCmF,EAAEtE,cAAc8L,OAAOnR,QAAQ;MAC5B2J,EAAEtE,cAAcqM,IAAI1R,QAAQ;CAEnC2J,EAAErE,eAAe+I,MAAM;CACvB1E,EAAEpE,YAAYuT,YAAYC,GAAG;CAC7BpP,EAAEzB,YAAY;EAAE+L,MAAM;EAAM/L,2BAAW,IAAIrD,IAAI;CAAE;CACjDgS,UAAUlN,GAAGmN,GAAG;CAChBnN,EAAEnB,SAAS;CACXmB,EAAElB,eAAe;CACjBkB,EAAElC,gBAAgB;CAClBkC,EAAEjD,WAAW;CACbiD,EAAEhD,WAAW;CACb,MAAM4C,QAAQwP,IAAInP,aAAa,CAAA;CAC/BD,EAAEtD,YACAkD,MAAM4B,SAAS,KAAK5B,MAAMyF,OAAOvF,SAASA,KAAKhE,WAAW,WAAW;CACvE,IAAIkE,EAAEtD,WAAWsD,EAAErD,cAAc;CACjC,MAAM2S,WAAWtP,EAAEnC;CACnBmC,EAAEnC,gCAAgB,IAAI3D,IAAI;CAC1B,MAAMuV,kBAAkB;EAItB,MAAMf,0BAAU,IAAIxU,IAAY;EAChC,MAAMyU,0BAAU,IAAIzU,IAAa;EACjC,KAAK,MAAM4F,QAAQF,OAAO;GACxB,IAAIE,KAAKhE,WAAW,aAAa;IAC/BkE,EAAElD,cAAcgD,KAAKM,QAAQqM,KAAKC,IAChChN,OAAOC,OAAOK,EAAElD,eAAegD,KAAKM,IAAI,IACpCJ,EAAElD,cAAcgD,KAAKM,QACrB,GACJ,GAAGM,YAAYV,GAAGF,KAAKM,IAAI,CAAC,CAACkB,KAAKnB,MAAMA,EAAEnJ,GAAG,CAC/C;IACA;GACF;GACAyX,OAAOzO,GAAGF,KAAKM,MAAMiP,eAAevP,MAAMwP,QAAQ,GAAGZ,SAASC,OAAO;GACrE3O,EAAEnD,WAAWiD,KAAKM,QAAQN,KAAK9I,OAAO;EACxC;EACA,KAAK,MAAMuM,SAASvD,EAAE5B,SAAS;GAC7BmF,MAAM/L,SACJ8X,SAASvK,IAAIxB,KAAK,KAClBoL,QAAQ5J,IAAIxB,KAAK,KAChBhD,UAAUgD,KAAK,KACdA,MAAMvM,OAAOqJ,aAAaL,GAAGuD,MAAMtM,QAAQZ,QAAQ,KACnD,CAAC0J,YAAYC,GAAGuD,MAAMtM,QAAQZ,QAAQ;GAC1CkN,MAAMjM,QAAQ;EAChB;EACA,IAAIqX,QAAQ5B,OAAO,GACjBkC,aACEjP,GACAwN,KAAKC,UAAU7N,MAAM0B,KAAKxB,SAAS,CAACA,KAAKM,MAAMN,KAAK9I,GAAG,CAAC,CAAC,CAC3D;OACGgJ,EAAE/B,WAAW;GAAEC,YAAY;GAAIC,OAAO;EAAE;EAC7CoG,iBAAiBvE,CAAC;EAClBA,EAAEpD,eAAe;EACjB8S,WAAW1P,GAAG0O,OAAO;CACvB;CACA,IAAI,CAAC1O,EAAEvD,UAAUuD,EAAErD,aAAa;EAC9B8S,UAAU;EACVzB,gBAAgBhO,CAAC;EACjB,KAAUA,CAAC;EACXoK,QAAQpK,CAAC;EACT;CACF;CACAiI,mBAAmBjI,GAAGyP,iBAAiB;EACrCzB,gBAAgBhO,CAAC;EACjB,KAAUA,CAAC;EACXoK,QAAQpK,CAAC;CACX,CAAC;AACH;AAEA,MAAM2P,aACJ3P,GACA,EAAEmN,KAAKF,WACJ;CACHC,UAAUlN,GAAGmN,GAAG;CAChB,KAAK,MAAMpB,OAAOkB,MAAMX,UAAUtM,GAAG+L,GAAG;CACxC,IAAIkB,KAAKzL,SAAS,GAAG+D,YAAYvF,CAAC;CAClCgO,gBAAgBhO,CAAC;AACnB;AAOA,MAAM4P,iBAAiB5P,GAAYoP,QAAsB;CACvD,MAAMS,UAAUT,IAAInP,aAAa,CAAA,EAAA,CAAIU,QAClCb,SAAgDA,KAAK9I,QAAQwJ,KAAAA,CAChE;CACA,MAAMZ,QAAQsP,QAAQlP,CAAC,IACnB6P,OAAOlP,QAAQ,EAAEP,WAAWL,YAAYC,GAAGI,IAAI,CAAC,IAChDyP;CACJ,IACEX,QAAQlP,CAAC,KACTA,EAAE5B,QAAQ8B,MAAMC,MAAM;EACpB,IAAI,CAACI,UAAUJ,CAAC,KAAK,CAACA,EAAE5I,WAAW,OAAO;EAC1C,MAAMlB,WAAW8J,EAAElJ,QAAQZ;EAC3B,IAAI0J,YAAYC,GAAG3J,QAAQ,GAAG,OAAO;EACrC,MAAMW,MAAM6Y,OAAO/K,MAAMhF,SAASA,KAAKM,SAAS/J,QAAQ,CAAC,EAAEW,OAAO;EAClE,OAAOmJ,EAAEnJ,MAAMyV,KAAKC,IAAI1V,KAAKqJ,aAAaL,GAAG3J,QAAQ,CAAC;CACxD,CAAC,GAED2J,EAAEhD,WAAW;CACf,KAAK,MAAM,EAAEoD,MAAMpJ,SAAS4I,OAAO;EACjC,MAAM4M,YAAYzM,YAAYC,GAAGI,IAAI,IACjCpJ,MACAyV,KAAKC,IAAI1V,KAAKqJ,aAAaL,GAAGI,IAAI,CAAC;EACvC,KAAK,MAAMmD,SAAS7C,YAAYV,GAAGI,IAAI,GACrCmD,MAAM/L,SAAS+L,MAAMvM,OAAOwV;CAChC;CACA,IAAI,OAAO4C,IAAIU,UAAU,UAAU;EACjC9P,EAAEjD,WAAWgT,KAAKC,IAAI,IAAIpa,UAAUwZ,IAAIU,KAAK;EAC7CnN,KAAK3C,CAAC;EACN,KAAUA,CAAC;EACX;CACF;CACA,MAAMiQ,OAAOrQ,MAAMe,QAAQ,EAAEP,MAAMpJ,UAAU;EAC3C,MAAMkZ,QAAQxP,YAAYV,GAAGI,IAAI,CAAC,CAAC0E,MAAM3E,MAAM,CAACA,EAAE3I,MAAM;EACxD,OACE0Y,UAAU1P,KAAAA,KACV0P,MAAMlZ,MAAMyV,KAAKC,IAAI1V,KAAKqJ,aAAaL,GAAGI,IAAI,CAAC,IAAI;CAEvD,CAAC;CACD,KAAK,MAAM,EAAEA,MAAMpJ,SAASiZ,MAC1B,IAAIlQ,YAAYC,GAAGI,IAAI,GACrBtI,cAAc,yBAAyBsI,KAAI,mBAAoBpJ,KAAK;CAGxE,IACEiZ,KAAK/P,MAAM,EAAEE,MAAMpJ,UACjByI,OAAOO,EAAElE,QAAQsE,IAAI,CAAC,CAACf,SAASa,MAC7BkB,MAAMA,EAAEpK,QAAQA,MAAM,KAAKoK,EAAEC,UAAUrB,EAAE1D,MAAM+E,OAAOtK,EACzD,CACF,GACA;EACAiJ,EAAEf,WAAWwJ,WAAWC,UAAU;EAClC;CACF;CACA,IAAIuH,KAAKzO,SAAS,GAAG;EACnByG,mBACEjI,SACM;GACJ,KAAK,MAAM,EAAEI,MAAMpJ,SAASiZ,MAAM/B,iBAAiBlO,GAAGI,MAAMpJ,GAAG;EACjE,SACM;GACJ2L,KAAK3C,CAAC;GACN,KAAUA,CAAC;EACb,CACF;EACA;CACF;CACA2C,KAAK3C,CAAC;CACN,KAAUA,CAAC;AACb;AAEA,MAAMmQ,gBAAgBnQ,MAAe;CACnC,IAAIA,EAAEnB,WAAW,YAAYmB,EAAEnB,SAAS;CACxCmB,EAAElD,gBAAgB,CAAC;CACnB,IAAIkD,EAAEtD,WAAWkP,gBAAgB5L,CAAC;MAC7B6L,qBAAqB7L,CAAC;CAC3B2C,KAAK3C,CAAC;AACR;AAEA,MAAMoQ,gBAAgBpQ,GAAY,EAAE6J,aAAiC;CACnE,IAAIA,WAAW,eAAeA,WAAW,SAAS;CAClD7J,EAAEnB,SAAS;CACX6L,UAAU1K,GAAG,MAAM;CACnB0C,QAAQ1C,CAAC;CACT2C,KAAK3C,CAAC;AACR;AAEA,MAAMqQ,cAAcrQ,MAAeA,EAAEnB,WAAW;AAUhD,MAAM2R,cACJxQ,GACAyQ,UAAwC,UACvB;CACjB,MAAMrJ,UAAqB,CAAA;CAC3B,MAAMsJ,OAA+B,CAAC;CACtC,MAAMC,0BAAU,IAAIzW,IAAY;CAChC,KAAK,MAAMqJ,SAASvD,EAAE5B,SAAS;EAC7B,IAAIgJ,QAAQ5F,UAAAA,KAAkC;EAC9C,IAAI,CAACjB,UAAUgD,KAAK,GAAG;EACvB,MAAMlN,WAAWkN,MAAMtM,QAAQZ;EAC/B,IAAIkN,MAAM/L,UAAUmZ,QAAQ5L,IAAI1O,QAAQ,GAAG;EAC3C,IAAIkN,MAAMjM,OAAO;GACfqZ,QAAQ5I,IAAI1R,QAAQ;GACpB;EACF;EAOA,IALE,CAAC0J,YAAYC,GAAG3J,QAAQ,MACvBoa,YAAY,UACVA,YAAY,gBACVzQ,EAAE3D,iBAAiB+J,aAAapG,EAAElE,OAAOsK,YACxC7C,MAAMvM,OAAOyI,OAAOO,EAAE3D,iBAAiBhG,QAAQ,CAAC,CAACmJ,aAGtDE,OAAOC,OAAO+Q,MAAMra,QAAQ,KAAKkN,MAAMvM,QAAQ0Z,KAAKra,YAAa,GAClE;GACAsa,QAAQ5I,IAAI1R,QAAQ;GACpB;EACF;EACAqa,KAAKra,YAAYkN,MAAMvM;EACvBoQ,QAAQrE,KAAKQ,KAAK;CACpB;CACA,MAAMvH,MAAM,CAAC,GAAGgE,EAAEtE,aAAa,CAAC,CAAC4F,KAAKjL,aAAa2J,EAAExE,SAAS+L,IAAIlR,QAAQ,CAAE;CAC5E,IAAI+Q,QAAQ5F,WAAW,KAAKxF,IAAIwF,WAAW,GAAG,OAAO;CACrD,OAAO;EACL+O,OAAO;GACL,GAAIvU,IAAIwF,SAAS,KAAK,EAAExF,IAAI;GAC5B,GAAIoL,QAAQ5F,SAAS,KAAK,EACxBuK,KAAK3E,QAAQ9F,KAAKnB,MAAM;IACtB,MAAM,EAAE7J,UAAUua,WAAW,GAAG5Z,YAAYkJ,EAAElJ;IAC9C,OAAO;KAAE,GAAGA;KAASD,KAAKmJ,EAAEnJ;IAAI;GAClC,CAAC,EACH;EACF;EACAoQ;CACF;AACF;AAKA,MAAM0J,iBAAiB9Q,MAAe;CACpC,MAAM+Q,0BAAU,IAAI7V,IAAoB;CACxC,KAAK,MAAMiF,KAAKH,EAAE5B,SAAS;EACzB,IAAI,CAACmC,UAAUJ,CAAC,KAAKJ,YAAYC,GAAGG,EAAElJ,QAAQZ,QAAQ,GAAG;EACzD,MAAMA,WAAW8J,EAAElJ,QAAQZ;EAC3B0a,QAAQjC,IAAIzY,UAAUoW,KAAKuE,IAAID,QAAQxJ,IAAIlR,QAAQ,KAAK8J,EAAEnJ,KAAKmJ,EAAEnJ,GAAG,CAAC;CACvE;CACA,OAAO,CAAC,GAAG+Z,OAAO,CAAC,CAACzP,KAAK,CAACjL,UAAUW,UAAU;EAAEX;EAAUW,KAAKA,MAAM;CAAE,EAAE;AAC3E;AAEA,MAAMia,mBAAmBjR,MAAsC;CAC7DA,EAAEnC,gCAAgB,IAAI3D,IAAI;CAC1B,MAAMgX,SAASlR,EAAEpC;CACjBoC,EAAEpC,gBAAgB;CAClB,KAAK,MAAMvH,YAAY2J,EAAExE,SAAS6I,KAAK,GAAGrE,EAAEtE,cAAcqM,IAAI1R,QAAQ;CACtE2J,EAAErE,iBAAiB,IAAIT,IAAI8E,EAAExE,QAAQ;CACrC,MAAMoE,QAAQ4Q,WAAWxQ,GAAGkR,UAAUlR,EAAEpD,eAAe,cAAc,MAAM;CAC3E,MAAMuU,MAAML,cAAc9Q,CAAC;CAC3B,IAAI,CAACJ,SAASuR,IAAI3P,WAAW,GAAG,OAAO;CACvCxB,EAAEnC,gBAAgB,IAAI3D,IAAI0F,OAAOwH,WAAW,CAAA,CAAE;CAC9C,KAAK,MAAM7D,SAAS3D,OAAOwH,WAAW,CAAA,GAAI7D,MAAMhM,YAAY;CAC5D,OAAO;EAAE,GAAGqI,OAAO2Q;EAAO,GAAIY,IAAI3P,SAAS,KAAK,EAAE2P,IAAI;CAAG;AAC3D;AAEA,MAAMC,qBAAqBpR,MAAqC;CAC9D,IAAIA,EAAE5D,iBAAiBoE,KAAAA,GAAW,MAAMR,EAAE5D;CAC1C,IAAI,CAAC4D,EAAE9D,UAAU,OAAO8D,EAAE7D,MAAOwJ,WAAWyL,kBAAkBpR,CAAC,CAAC;CAChE,MAAMlE,SAASkE,EAAElE;CACjB,IAAI;EACF,MAAMsC,UAAU4B,EAAE1D,MAAM2J,QAAQ;EAChC,IAAI7H,SACF,OAAOA,QAAQuH,WACP;GACJ3F,EAAE3D,kBAAkBP;EACtB,IACCwH,UAAmB;GAClB,MAAM1P,iBAAiB0P,KAAK;EAC9B,CACF;EACFtD,EAAE3D,kBAAkBP;CACtB,SAASwH,OAAO;EACd,MAAM1P,iBAAiB0P,KAAK;CAC9B;AACF;AAEA,MAAM6E,OAAO,OAAOnI,MAAe;CACjC,IAAIA,EAAEhB,SAAS;CACfgB,EAAEhB,UAAU;CACZ,IAAI;EACF,OAAOgB,EAAEjB,WAAW,CAACsR,WAAWrQ,CAAC,GAAG;GAClC,IAAI,CAACA,EAAE9D,UAAU,MAAM8D,EAAE7D;GACzB,MAAM8C,YAAYe,EAAEf;GACpB,IAAIe,EAAEhD,YAAYgD,EAAEnB,WAAW,cAAcI,WAAW;IACtD,MAAMoS,QAAQrR,EAAEjD,WAAWgT,KAAKC,IAAI;IACpC,IAAIqB,QAAQ,GAAG;KACb,MAAMrO,eAAehD,GAAGqR,KAAK;KAC7B;IACF;IAEA,IACErR,EAAE5B,QAAQ8B,MACPC,MACCI,UAAUJ,CAAC,KAAKA,EAAE5I,aAAawI,YAAYC,GAAGG,EAAElJ,QAAQZ,QAAQ,CACpE,GACA;KACA,MAAMwM,YAAY7C,CAAC;KACnB;IACF;IACAA,EAAEhD,WAAW;IACb,MAAMsU,QAAQtR,EAAElB;IAChBG,UAAUwJ,WAAWC,UAAU;IAC/B,OAAO1I,EAAEjB,WAAW,CAACsR,WAAWrQ,CAAC,KAAKsR,UAAUtR,EAAElB,aAChD,MAAM+D,YAAY7C,CAAC;IACrB;GACF;GACA,MAAMuR,YAAYC,gBAAgBxR,CAAC,CAAC,CAACwB,SAAS;GAC9C,MAAMkF,SACJ1G,EAAE5B,QAAQ8B,MAAMC,MAAMM,WAAWN,CAAC,KAAK,CAACA,EAAEjJ,IAAIyD,IAAI,KAClD8W,eAAezR,CAAC;GAClB,IACEwQ,WAAWxQ,CAAC,MAAM,QAClB,CAACuR,cACA,CAAC7K,UAAU1G,EAAEnB,WAAW,aAEzB;GACF,MAAM8P,UAAU3O,EAAE5B,QAAQoD,SAAS,KAAKkF;GACxC,IAAIzH,WAAWnF,UAAU,CAAC6U,SAAS;GACnC,IAAI3O,EAAEnB,WAAW,cAAc,CAACI,WAAW;IACzC,IAAI,CAAC0P,SAAS;IACd,IACG1P,WAAWwJ,WAAWa,WAAW,aAChCrK,UAAUwJ,WAAWoB,WAAW,UAClC5K,WAAWnF,QAEXmF,UAAUwJ,WAAWC,UAAU;IAEjC,MAAM7F,YAAY7C,CAAC;IACnB;GACF;GACA,MAAM0R,cAAc1R,EAAEjD,WAAWgT,KAAKC,IAAI;GAC1C,IAAI0B,cAAc,GAAG;IACnB,MAAM1O,eAAehD,GAAG0R,WAAW;IACnC;GACF;GACA,IAAIH,WAAW;IACb,IAAI,CAACvR,EAAEpD,cAAc;KACnB,MAAMiG,YAAY7C,CAAC;KACnB;IACF;IACA,MAAMiG,MAAMjG,CAAC;IACb;GACF;GACA,IAAIJ,QAAQ4Q,WAAWxQ,CAAC;GACxB,IAAI,CAACJ,OAAO;GACZ,MAAM0R,QAAQtR,EAAElB;GAChB,MAAMkH,cAAcoL,kBAAkBpR,CAAC;GACvC,IAAIgG,aAAa,MAAMA;GACvB,IAAI,CAAChG,EAAEjB,WAAWsR,WAAWrQ,CAAC,GAAG;GACjC,IAAIsR,UAAUtR,EAAElB,eAAekB,EAAEnB,WAAW,YAAY;GACxD,IAAIxG;GACJ,IAAI;IAIF,MAAMsZ,QAAQC,UAAiB;KAC7B,KAAK,MAAMrO,SAASqO,MAAMxK,SAAS7D,MAAMhM,YAAY;KACrD,OAAO0H,UAAU0S,KAAKC,MAAMrB,KAAK;IACnC;IACAlY,SAAS,OAAO2H,EAAEvD,UAAU,CAACuD,EAAErD,eAAeiD,MAAMwH,QAAQ5F,SAAS,IACjExB,EAAE1D,MAAMsJ,KAAM,YAAY;KACxBE,QAAQ9F,GAAG,MAAM6F,WAAW7F,CAAC,CAAC;KAC9BJ,QAAQ4Q,WAAWxQ,CAAC;KACpB,IAAI,CAACJ,SAAS0R,UAAUtR,EAAElB,aAAa,OAAO;KAC9C,OAAO6S,KAAK/R,KAAK;IACnB,CAAC,IACD+R,KAAK/R,KAAK;GAChB,QAAQ;IACN,IAAI,CAACI,EAAEjB,WAAWsR,WAAWrQ,CAAC,GAAG;IAGjC,IAAIJ,UAAU,QAAQA,MAAMwH,QAAQ5F,SAAS,KAAK0N,QAAQlP,CAAC,GAAG;KAC5D,IAAIsR,UAAUtR,EAAElB,aAAa;KAC7B,KAAK,MAAMyE,SAAS3D,MAAMwH,SACxB,IAAIpH,EAAE5B,QAAQoN,SAASjI,KAAK,GAAGA,MAAM/L,SAAS;KAChDwI,EAAElC,iBAAiB;KACnB,MAAMkF,eAAehD,GAAGrK,QAAQqK,EAAElC,aAAa,CAAC;KAChD,IAAIkC,EAAEjB,WAAWuS,UAAUtR,EAAElB,eAAekB,EAAEnB,WAAW,YACvDI,UAAUwJ,WAAWC,UAAU;KACjC;IACF;IACA,IAAI9I,OAAO2Q,MAAMvU,KAAKwF,QAAQ;KAC5BxB,EAAEpC,gBAAgB;KAClBqB,UAAUwJ,WAAWC,UAAU;KAC/B,MAAM7F,YAAY7C,CAAC;KACnB;IACF;IACAA,EAAElC,iBAAiB;IACnB,MAAMkF,eAAehD,GAAGrK,QAAQqK,EAAElC,aAAa,CAAC;IAChD;GACF;GACA,IAAI,CAACkC,EAAEjB,SAAS;GAChB,IAAI1G,WAAW,QAAQuH,UAAU,MAAM;GACvCI,EAAElC,gBAAgB;GAClB,IACEwT,UAAUtR,EAAElB,gBACXzG,OAAOoS,SAAS,QAAQpS,OAAOoS,SAAS,YAEpC;SAAA,MAAMlH,SAAS3D,MAAM2Q,MAAMvU,OAAO,CAAA,GACrC,IAAIgE,EAAExE,SAAS+L,IAAIhE,MAAMlN,QAAQ,MAAMkN,OACrCvD,EAAEtE,cAAc8L,OAAOjE,MAAMlN,QAAQ;GAAA;GAG3C,IAAIgC,OAAOoS,SAAS,MACd6G;QAAAA,UAAUtR,EAAElB,aACT;UAAA,MAAMyE,SAAS3D,MAAMwH,SACxB,IAAIpH,EAAE5B,QAAQoN,SAASjI,KAAK,GAAG;MAC7BA,MAAM/L,SAAS;MACfwI,EAAEb,WAAW0S,WAAWtO,MAAMrM,GAAG;KACnC;;GACF,OAEG,IAAImB,OAAOoS,SAAS,WACrB6G;QAAAA,UAAUtR,EAAElB,aAAa8Q,cAAc5P,GAAG3H,OAAO+W,GAAG;GAAA,OACnD,IAAI/W,OAAOoS,SAAS,eAErB6G;QAAAA,UAAUtR,EAAElB,aAAa;KAC3BG,UAAUwJ,WAAWC,UAAU;KAC/B,MAAM7F,YAAY7C,CAAC;IACrB;UACK,IAAI3H,OAAOoS,SAAS,YAErB6G;QAAAA,UAAUtR,EAAElB,aAAa;KAC3BkB,EAAEpC,gBAAgB;KAClBqB,UAAUwJ,WAAWC,UAAU;KAC/B,OAAO1I,EAAEjB,WAAW,CAACsR,WAAWrQ,CAAC,KAAKsR,UAAUtR,EAAElB,aAChD,MAAM+D,YAAY7C,CAAC;IAEvB;;EAEJ;CACF,SAASnI,OAAO;EACdwL,cAAcrD,GAAGnI,KAAK;CACxB,UAAU;EACRmI,EAAEhB,UAAU;CACd;AACF;AAEA,MAAM8S,SAAS9R,MAAe;CAC5BA,EAAEjB,UAAU;CACZ,IAAI,CAACiB,EAAE9D,UAAU;EACf,EAAOC,MAAOwJ,WACN;GACJ,IAAI3F,EAAEjB,SAAS+S,MAAM9R,CAAC;EACxB,SACM,CAAC,CACT;EACA;CACF;CACA,IAAIA,EAAEvD,QAAQ;EACZuD,EAAEvD,OAAOjC,QAAQ,IAAIC,gBAAgB;EACrCuF,EAAEvD,OAAOnC,cAAc0F,EAAE1D,MAAMyV,gBAAiB;GAC9C9J,mBACEjI,SACM2M,gBAAgB3M,CAAC,SACjB;IACJ2C,KAAK3C,CAAC;IACN,KAAUA,CAAC;IACXoK,QAAQpK,CAAC;GACX,CACF;EACF,CAAC;EACDA,EAAEjB,UAAU;EACZkJ,mBACEjI,SACM;GACJ,IAAIA,EAAE1D,MAAM6J,KAAK,MAAM,MAAMnG,EAAE1D,MAAMmH,KAAKzD,EAAElE,MAAM;GAClDkE,EAAE/D,kBAAkB;GACpBiM,WAAWlI,GAAGQ,KAAAA,CAAS;GACvBmM,gBAAgB3M,CAAC;EACnB,SACM;GACJ,KAAUA,CAAC;GACXoK,QAAQpK,CAAC;EACX,CACF;EACA;CACF;CACA,IAAI,CAACA,EAAE/D,iBAAiB;EACtB+D,EAAE/D,kBAAkB;EACpB+D,EAAE1D,MAAMmH,KAAKzD,EAAElE,MAAM;CACvB;CACAoM,WAAWlI,GAAGQ,KAAAA,CAAS;CACvBR,EAAEjB,UAAU;CACZ,KAAUiB,CAAC;CACXoK,QAAQpK,CAAC;AACX;AAEA,MAAMgS,QAAQhS,MAAe;CAC3BA,EAAEjB,UAAU;CACZmE,aAAalD,EAAEjC,OAAO;CACtBiC,EAAEjC,UAAUyC,KAAAA;CACZ,IAAIR,EAAEvD,QAAQ;EACZuD,EAAEvD,OAAOnC,cAAc;EACvB0F,EAAEvD,OAAOnC,cAAc;EACvB0F,EAAEvD,OAAOjC,OAAOA,MAAM;EACtBwF,EAAEvD,OAAOjC,QAAQ;EACjBwF,EAAEvD,OAAOlC,QAAQmK,MAAM;CACzB;CACA/B,KAAK3C,CAAC;CACN0K,UAAU1K,GAAG,SAAS;AACxB;AAEA,MAAMiS,gBAAgBjS,GAAYf,cAA0B;CAC1D,IAAIe,EAAEf,cAAcA,WAAW;CAC/Be,EAAEf,YAAYA;CACd0D,KAAK3C,CAAC;AACR;AAOA,MAAMmS,QAAqC;CAAEnL,MAAM;CAAW1D,OAAO;AAAQ;AAE7E,MAAMI,WAAW7L,UACfA,iBAAiBG,SAASH,MAAMuI,SAAS;AAE3C,MAAMgL,gBACJpL,GACA/I,SACAP,QACAgB,SACAE,QACA0D,UAA0B,CAAC,MACxB;CACH,MAAMjF,WAAWY,QAAQZ;CACzB,MAAMU,KAAKhB,SAAY;CACvB,MAAMwN,QAAiB;EACrBxM;EACAC,KAAKwJ,KAAAA;EACLvJ;EACAC,KAAK;GACHb;GACAI,QAAQQ,QAAQR;GAChBC;GACAmN,IAAIkM,KAAKC,IAAI;GACbjZ;GACAqP,UAAUpG,EAAElE,OAAOsK;GACnB,GAAI9K,QAAQ+P,QAAQ,EAAE1Q,MAAM,KAAc;GAC1C,GAAIW,QAAQV,cAAc4F,KAAAA,KAAa,EAAE5F,WAAWU,QAAQV,UAAU;EACxE;EACAzD,SAAS;EACTC,IAAI4I,EAAE1D,MAAM+E,OAAOtK;EACnBM,MAAM;EACNC,OAAO;EACPC,WAAW;EACXC,QAAQ;EACRC,SAAS;EACTC;EACAE;CACF;CACA,IAAI,CAACmI,YAAYC,GAAG3J,QAAQ,GAAG;EAC7B,MAAMyJ,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;EACtC,IAAI;GACFmN,UACExD,GACAH,SACEG,EAAElE,QACFzF,UACAoL,WAAW3B,MAAM,CAAC,GAAGgC,SAAShC,IAAI,GAAG6D,SAASJ,KAAK,CAAC,CAAC,CACvD,CACF;EACF,SAAS1L,OAAO;GACd,IAAI,CAAC6L,QAAQ7L,KAAK,GAAG,MAAMA;GAC3BD,OAAO,IAAI5B,mBAAmBmc,KAAK,CAAC;GACpC;EACF;EACAnS,EAAE5B,QAAQ2E,KAAKQ,KAAK;EACpB6O,QAAQpS,GAAG3J,QAAQ;CACrB,OAAO2J,EAAE5B,QAAQ2E,KAAKQ,KAAK;CAC3BvD,EAAEb,WAAWwJ,QAAQpF,MAAMrM,GAAG;CAC9B8I,EAAEZ,OAAO;AACX;AAEA,MAAMiT,cAAcrS,GAAY3J,aAC9B2J,EAAEpE,WAAWqE,UAAUC,MAAMC,MAAMA,EAAEC,SAAS/J,QAAQ,KAAK;AAO7D,MAAMkc,UACJvS,GACA3J,UACA8L,QACAqQ,UACgC;CAChC,MAAMC,SAASzS,EAAE3C,MAAMkK,IAAIpF,MAAM;CACjC,IAAIsQ,QAAQpc,aAAaA,UAAU,OAAOoc;CAC1C,MAAMC,OAAoC;EACxC3b,IAAIoL,OAAOpL;EACXV;EACAY,SAAS;GAAER,QAAQ0L,OAAO1L;GAAQC,QAAQ2L,SAASF,MAAM;EAAE;EAC3D0B,IAAI1B,OAAO0B;EACX2O,OACEA,UACErQ,OAAyCxH,OAAO,SAAS;EAC7DC,WAAWuH,OAAOvH;EAClB2P,SAASvK,EAAE1D,MAAMiO,YAAY,SAAS,CAACxK,YAAYC,GAAG3J,QAAQ;CAChE;CACA2J,EAAE3C,MAAMyR,IAAI3M,QAAQuQ,IAAI;CACxB,OAAOA;AACT;;AAGA,MAAMC,aACJ3S,GACA3J,aAEA0J,YAAYC,GAAG3J,QAAQ,IACnB2J,EAAE5B,QACCuC,QAAQR,MAAMM,WAAWN,CAAC,KAAKA,EAAElJ,QAAQZ,aAAaA,QAAQ,CAAC,CAC/DiL,KAAKnB,MAAMwD,SAASxD,CAAC,CAAC,IACzB,CAAC,GAAG2B,SAASrC,OAAOO,EAAElE,QAAQzF,QAAQ,CAAC,CAAC;AAK9C,MAAMuc,UACJ5S,GACA3J,UACAwc,UAC6D;CAC7D,MAAMG,MAAMhT,EAAE1E,QAAQ9B,cAAcnD;CACpC,MAAMyc,QACJ,CAAA;CACF,KAAK,MAAM3Q,UAAU0Q,OAAO;EAC1B,IAAI1Q,OAAOxH,MAAM;GACfmY,MAAM/P,KAAK;IAAEZ;IAAQ8Q,SAAS;GAAK,CAAC;GACpC;EACF;EACA,IAAIC,KAAKJ,MAAMtR;EACf,OACE0R,KAAK,KACLJ,MAAMI,KAAK,EAAE,CAAED,WACfD,QAAQxS,KAAAA,KACRwS,IACET,OAAOvS,GAAG3J,UAAU8L,MAAM,GAC1BoQ,OAAOvS,GAAG3J,UAAUyc,MAAMI,KAAK,EAAE,CAAE/Q,MAAM,CAC3C,GAEA+Q;EACFJ,MAAMrO,OAAOyO,IAAI,GAAG;GAAE/Q;GAAQ8Q,SAASC,KAAK,KAAKJ,MAAMI,KAAK,EAAE,CAAED;EAAQ,CAAC;CAC3E;CACA,MAAMF,OAAOD,MAAMK,WAAWC,MAAMA,EAAEH,OAAO;CAC7C,OAAO;EACLH,OAAOA,MAAMxR,KAAK8R,MAAMA,EAAEjR,MAAM;EAChC4Q,MAAMA,SAAS,KAAKD,MAAMtR,SAASuR;CACrC;AACF;;AAGA,MAAMX,WAAWpS,GAAY3J,aAAqB;CAChD,IAAI0J,YAAYC,GAAG3J,QAAQ,GAAG;CAC9B,MAAMyJ,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;CACtC,MAAM,EAAEyc,UAAUF,OAAO5S,GAAG3J,UAAUyL,SAAShC,IAAI,CAAC;CACpD,IAAIgT,MAAMzN,OAAOjE,GAAGkE,MAAMlE,MAAMU,SAAShC,IAAI,CAAC,CAACwF,EAAE,GAAG;CACpD9B,UAAUxD,GAAGH,SAASG,EAAElE,QAAQzF,UAAUoL,WAAW3B,MAAMgT,KAAK,CAAC,CAAC;AACpE;AAEA,MAAMO,cAAcrT,MAClB,CACE,mBAAG,IAAI9F,IAAI,CACT,GAAGwF,OAAO2E,KAAKrE,EAAElE,OAAO8D,KAAK,GAC7B,GAAGI,EAAE5B,QAAQkD,KAAKnB,MAAMA,EAAElJ,QAAQZ,QAAQ,CAAC,CAC5C,CAAC,CACH,CAACsK,QAAQtK,aAAagc,WAAWrS,GAAG3J,QAAQ,CAAC;;AAGhD,MAAMmb,mBAAmBxR,MACvBqT,WAAWrT,CAAC,CAAC,CAAC6E,SAASxO,aAAa;CAClC,MAAM,EAAEyc,OAAOC,SAASH,OAAO5S,GAAG3J,UAAUsc,UAAU3S,GAAG3J,QAAQ,CAAC;CAClE,OAAOyc,MAAM3N,MAAM,GAAG4N,IAAI,CAAC,CAACzR,KAAKa,YAAY;EAAE9L;EAAU8L;CAAO,EAAE;AACpE,CAAC;AAKH,MAAMsP,kBAAkBzR,MACtBN,OAAO2E,KAAKrE,EAAElE,OAAO8D,KAAK,CAAC,CAACM,MACzB7J,cACE2J,EAAEpE,YAAYyW,WAAWrS,GAAG3J,QAAQ,IAAIyR,QAAQ9H,GAAG3J,QAAQ,MAC5Duc,OAAO5S,GAAG3J,UAAUsc,UAAU3S,GAAG3J,QAAQ,CAAC,CAAC,CAAC0c,OAAO,CACvD;AAEF,MAAMO,YACJtT,GACAmC,QACAuM,YAEAvM,OAAOqR,WACH,YACA9E,QAAQ3J,IAAI5C,OAAOpL,EAAE,IACnB,cACAiJ,EAAExC,SAASuH,IAAI5C,OAAOpL,EAAE,IACtB,WACA;AAEV,MAAM0c,yBAA8B,IAAIvZ,IAAI;AAE5C,MAAMwZ,WACJvR,QACAwR,UACkC;CAClC,MAAM,EACJhZ,MAAMiZ,OACNJ,UAAUK,WACVjZ,WAAWkZ,OACX,GAAGjS,SACDM;CACJ,MAAMxH,OAAOgZ,MAAMhZ,QAAQwH,OAAOxH,SAAS;CAC3C,MAAMC,YACJ+Y,MAAM/Y,cAAc4F,KAAAA,IAAY2B,OAAOvH,YAAY+Y,MAAM/Y,UAAUC;CACrE,IAAI0G,OAAsC;EACxC,GAAGM;EACH,GAAIlH,QAAQ,EAAEA,MAAM,KAAc;EAClC,GAAI,CAACA,SACFwH,OAAOxH,QAAQwH,OAAOqR,aAAa,EAAEA,UAAU,KAAc;EAChE,GAAI5Y,cAAc4F,KAAAA,KAAa,EAAE5F,UAAU;CAC7C;CACA,IAAI+Y,MAAMjd,WAAW8J,KAAAA,GAAW;EAC9B,MAAM,EAAE9J,QAAQC,SAAS3B,aAAa2e,MAAMjd,MAAM;EAClD,MAAM,EAAEC,MAAMod,MAAM,GAAGC,UAAUzS;EACjCA,OAAO;GAAE,GAAGyS;GAAOtd;GAAQ,GAAIC,SAAS6J,KAAAA,KAAa,EAAE7J,KAAK;EAAG;CACjE;CACA,OAAO4K;AACT;AAIA,MAAMmO,cAAc1P,GAAY0O,UAA+B+E,WAAW;CACxE,IAAIzT,EAAEnB,WAAW,cAAc,CAACmB,EAAEpD,gBAAgB,CAACoD,EAAEjB,WAAWsR,WAAWrQ,CAAC,GAC1E;CACF,MAAMiU,aAAazC,gBAAgBxR,CAAC;CACpC,IAAIiU,WAAWzS,WAAW,GAAG;CAC7B,MAAM0S,yBAAS,IAAIhZ,IAGjB;CACF,KAAK,MAAM,EAAE7E,UAAU8L,YAAY8R,YAAY;EAC7C,MAAMpK,SAASyJ,SAAStT,GAAGmC,QAAQuM,OAAO;EAC1CwF,OAAOpF,IAAIjF,QAAQ,CACjB,GAAIqK,OAAO3M,IAAIsC,MAAM,KAAK,CAAA,GAC1B0I,OAAOvS,GAAG3J,UAAU8L,MAAM,CAAC,CAC5B;CACH;CACA,MAAM1E,WAAqB;EACzB1C,KAAK,IAAIb,IAAI+Z,WAAW3S,KAAKF,MAAMA,EAAEe,OAAOpL,EAAE,CAAC;EAC/CkE,yBAAS,IAAIC,IAAI;EACjBC,yBAAS,IAAIjB,IAAI;CACnB;CACA8F,EAAEvC,WAAWA;CACb,IAAI;EACF,KAAK,MAAM,CAACoM,QAAQxK,aAAa6U,QAC/B,IAAI;GACFlU,EAAE1G,UAAU;IAAE+F;IAAUwK;GAAO,CAAC;EAClC,SAAShS,OAAO;GACdwW,QAAQxW,MAAM,6CAA6CA,KAAK;EAClE;CAEJ,UAAU;EACRmI,EAAEvC,WAAW;CACf;CACA,IAAI3B,SAASkE,EAAElE;CACf,KAAK,MAAMzF,YAAY,IAAI6D,IAAI+Z,WAAW3S,KAAKF,MAAMA,EAAE/K,QAAQ,CAAC,GAAG;EACjE,MAAMqG,YAAYqD,YAAYC,GAAG3J,QAAQ;EACzC,MAAMyJ,OAAOL,OAAO3D,QAAQzF,QAAQ;EACpC,MAAM8E,UAA2C,CAAA;EACjD,MAAM0X,QAAyC,CAAA;EAC/C,KAAK,MAAM1Q,UAAUwQ,UAAU3S,GAAG3J,QAAQ,GAAG;GAC3C,MAAM6N,MAAMlE,EAAE5B,QAAQ0G,MAAM3E,MAAMA,EAAEpJ,OAAOoL,OAAOpL,MAAM0J,WAAWN,CAAC,CAAC;GACrE,IAAI1C,SAAStC,QAAQ4J,IAAI5C,OAAOpL,EAAE,GAAG;IACnCoE,QAAQ4H,KAAKZ,MAAM;IACnB,IAAI+B,KAAK8G,cAAchL,GAAGkE,GAAG;IAC7B;GACF;GACA,MAAMyP,QAAQlW,SAASxC,QAAQsM,IAAIpF,OAAOpL,EAAE;GAC5C,IAAI4c,UAAUnT,KAAAA,GAAW;IACvBqS,MAAM9P,KAAKZ,MAAM;IACjB;GACF;GACA,MAAMZ,OAAOmS,QAAQvR,QAAQwR,KAAK;GAClCd,MAAM9P,KAAKxB,IAAI;GACf,IAAI2C,KAAKhC,OAAOlC,GAAGkE,KAAK3C,IAAI;EAC9B;EACA,MAAM,EAAEuR,OAAOC,SAASH,OAAO5S,GAAG3J,UAAUwc,KAAK;EACjD,IAAIrT,UAAUM,KAAKN;EACnB,MAAMH,WAAW,CAAC,GAAGS,KAAKT,QAAQ;EAClC,KAAK,MAAM8C,UAAU2Q,MAAM3N,MAAM,GAAG4N,IAAI,GAAG;GACzC/S,EAAExC,SAASgK,OAAOrF,OAAOpL,EAAE;GAC3B,MAAMmN,MAAMlE,EAAE5B,QAAQ0G,MAAM3E,MAAMA,EAAEpJ,OAAOoL,OAAOpL,MAAM0J,WAAWN,CAAC,CAAC;GACrE,IAAIzD,WAAW;IACb,MAAM1F,OACH0I,OAAOC,OAAOK,EAAElD,eAAezG,QAAQ,IACpC2J,EAAElD,cAAczG,YAChB,KAAK;IACX2J,EAAElD,cAAczG,YAAYW;IAC5BgL,MAAMhC,GAAGkE,KAAMlN,GAAG;IAClB;GACF;GACA,MAAMA,MAAMyV,KAAKC,IAAIlN,SAASa,aAAaL,GAAG3J,QAAQ,IAAI,CAAC;GAC3DmJ,UAAUxI,MAAM;GAChB,MAAM,EAAE2D,MAAMiZ,OAAOJ,UAAUK,WAAW,GAAG5c,YAAYkL;GACzD,MAAMwE,UAA0C;IAC9C,GAAG1P;IACHD;IACA,GAAIgJ,EAAE1D,MAAM+E,UAAUb,KAAAA,KAAa,EAAEa,OAAOrB,EAAE1D,MAAM+E,MAAMtK,GAAG;GAC/D;GACAsI,SAAS0D,KAAK4D,OAAO;GACrB,IAAIzC,KAAKlC,MAAMhC,GAAGkE,KAAKlN,GAAG;QACrB;IACH,MAAMG,UAAUqR,eAAexI,GAAG3J,UAAUsQ,OAAO;IACnDxP,QAAQG,QAAQ;IAChBH,QAAQI,YAAY;IACpByI,EAAE5B,QAAQ2E,KAAK5L,OAAO;GACxB;EACF;EACA,IAAIuF,aAAavB,QAAQqG,WAAW,KAAKM,SAAShC,IAAI,CAAC,CAAC0B,WAAW,GACjE;EACF,MAAM2S,aAAa,IAAIja,IAAI4Y,MAAM3N,MAAM,GAAG4N,IAAI,CAAC,CAACzR,KAAKF,MAAMA,EAAErK,EAAE,CAAC;EAChE,MAAM8K,OAAOnF,YACToF,SAAShC,IAAI,CAAC,CAACa,QACZS,MAAM,CAACjG,QAAQ+E,MAAM4C,MAAMA,EAAE/L,OAAOqK,EAAErK,EAAE,KAAK,CAACod,WAAWpP,IAAI3D,EAAErK,EAAE,CACpE,IACA+b,MAAM3N,MAAM4N,IAAI;EACpBjX,SAAS+D,SAAS/D,QAAQzF,UAAU;GAClC,GAAGoL,WAAW3B,MAAM+B,IAAI;GACxBrC;GACAH;GACA,GAAG6B,MAAMlB,GAAGF,MAAM3E,OAAO;EAC3B,CAAC;CACH;CACA,IAAIW,WAAWkE,EAAElE,QAAQ0H,UAAUxD,GAAGlE,MAAM;CAC5C8E,YAAYZ,CAAC;CACbA,EAAEZ,OAAO;AACX;AAEA,MAAM6G,SAASjG,MAA8B;CAC3C,IAAI,CAACA,EAAEvD,QAAQ;EACbiT,WAAW1P,CAAC;EACZ,OAAO5H,QAAQV,QAAQ;CACzB;CACA,OAAO8N,SAASxF,SAAS0P,WAAW1P,CAAC,CAAC;AACxC;AAEA,MAAaoU,iBACXpU,MAC2C;CAC3C,MAAM4O,QAAQ5O,EAAE5B,QAAQuC,QACrBR,MAAMJ,YAAYC,GAAGG,EAAElJ,QAAQZ,QAAQ,KAAK,CAAC8J,EAAE9I,IAClD;CACA,MAAMgd,QAAmB,CACvB,GAAG3U,OAAO+H,OAAOzH,EAAElE,OAAO8D,KAAK,CAAC,CAACiF,SAAS/E,SAAS,CACjDA,KAAKT,UACLS,KAAK4B,MAAM,CACZ,GACD,GAAGkN,MAAM/J,SAAS1E,MAAM;EAACA;EAAGA,EAAEnJ;EAAKmJ,EAAEjJ,IAAIyD;EAAMwF,EAAEjJ,IAAI0D;CAAS,CAAC,CAAC;CAKlE,IAAI,EAFFyZ,MAAM7S,WAAWxB,EAAErC,YAAY6D,UAC/B6S,MAAMhP,OAAOkP,MAAMjP,MAAMiP,SAASvU,EAAErC,YAAY2H,EAAE,IACzC;EACTtF,EAAErC,cAAc0W;EAChBrU,EAAEtC,aAAa,CACb,GAAGgC,OAAO0H,QAAQpH,EAAElE,OAAO8D,KAAK,CAAC,CAACiF,SAAS,CAACxO,UAAUyJ,UAAU,CAC9D,GAAG,CAAC,GAAGA,KAAKT,QAAQ,CAAC,CAClBwB,MAAMC,GAAGC,MAAMD,EAAE9J,MAAM+J,EAAE/J,GAAG,CAAC,CAC7BsK,KAAKF,MAAMmR,OAAOvS,GAAG3J,UAAU+K,GAAG,SAAS,CAAC,GAC/C,GAAGU,SAAShC,IAAI,CAAC,CAACwB,KAAKF,MAAMmR,OAAOvS,GAAG3J,UAAU+K,CAAC,CAAC,CAAC,CACrD,GACD,GAAG,CAAC,GAAGwN,KAAK,CAAC,CACV/N,MAAMC,GAAGC,OAAOD,EAAE9J,OAAOgK,aAAaD,EAAE/J,OAAOgK,SAAS,CAAC,CACzDM,KAAKnB,MACJI,UAAUJ,CAAC,IACPoS,OAAOvS,GAAGG,EAAElJ,QAAQZ,UAAU0N,SAAS/D,GAAGG,CAAC,GAAG,SAAS,IACvDoS,OAAOvS,GAAGG,EAAElJ,QAAQZ,UAAUsN,SAASxD,CAAC,CAAC,CAC/C,CAAC;CAEP;CACA,OAAOH,EAAEtC;AACX;AAMA,MAAM+W,WAAWzU,GAAYjJ,OAAe;CAC1C,MAAMmc,KAAK/L,OAAOnH,GAAGjJ,EAAE;CACvB,IAAImc,OAAO1S,KAAAA,GAAW,MAAM,IAAIxI,MAAM,oBAAoBjB,IAAI;CAC9D,IAAImc,GAAG/Q,WAAW3B,KAAAA,GAAW,MAAM,IAAIxI,MAAM,WAAWjB,GAAE,cAAe;CACzE,OAAO;EAAEV,UAAU6c,GAAG7c;EAAU8L,QAAQ+Q,GAAG/Q;CAAO;AACpD;AAEA,MAAMuS,iBAAiB1U,GAAYjJ,IAAY4d,OAAiB;CAC9D,MAAMzB,KAAK/L,OAAOnH,GAAGjJ,EAAE;CACvB,IAAImc,IAAI/Q,WAAW3B,KAAAA,GAAW;CAC9B,MAAM,EAAEnK,UAAU8L,WAAW+Q;CAC7B,MAAMhP,MAAMlE,EAAE5B,QAAQ0G,MAAM3E,MAAMA,EAAEpJ,OAAOA,MAAM0J,WAAWN,CAAC,CAAC;CAC9D,IAAIwU,GAAGlK,SAAS,UAAU;EACxB,IAAI,CAAC1K,YAAYC,GAAG3J,QAAQ,GAAG;GAC7B,MAAMyJ,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;GACtCmN,UACExD,GACAH,SAASG,EAAElE,QAAQzF,UAAU;IAC3B,GAAGoL,WACD3B,MACAgC,SAAShC,IAAI,CAAC,CAACa,QAAQS,MAAMA,EAAErK,OAAOA,EAAE,CAC1C;IACA,GAAGmK,MAAMlB,GAAGF,MAAM,CAACqC,MAAM,CAAC;GAC5B,CAAC,CACH;EACF;EACA,IAAI+B,KAAK8G,cAAchL,GAAGkE,GAAG;CAC/B,OAAO;EACL,MAAM3C,OAAOmS,QAAQvR,QAAQwS,GAAGhB,MAAMpB,OAAOvS,GAAG3J,UAAU8L,MAAM,CAAC,CAAC;EAClE,IAAI,CAACpC,YAAYC,GAAG3J,QAAQ,GAAG;GAC7B,MAAMyJ,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;GACtCmN,UACExD,GACAH,SACEG,EAAElE,QACFzF,UACAoL,WACE3B,MACAgC,SAAShC,IAAI,CAAC,CAACwB,KAAKF,MAAOA,EAAErK,OAAOA,KAAKwK,OAAOH,CAAE,CACpD,CACF,CACF;EACF;EACA,IAAI8C,KAAKhC,OAAOlC,GAAGkE,KAAK3C,IAAI;CAC9B;CACA6Q,QAAQpS,GAAG3J,QAAQ;CACnB2J,EAAEZ,OAAO;AACX;AAEA,MAAMwV,WAAWjB,UAA8C;CAC7D,IAAI,OAAOA,UAAU,YAAYA,UAAU,MACzC,MAAM,IAAI3b,MAAM,2CAA2C;CAC7D,IAAI2b,MAAMhZ,SAAS6F,KAAAA,KAAa,OAAOmT,MAAMhZ,SAAS,WACpD,MAAM,IAAI3C,MAAM,gCAAgC;CAClD,IACE2b,MAAM1c,YAAYuJ,KAAAA,MACjBd,OAAO2E,KAAKsP,MAAM1c,OAAO,CAAC,CAACiJ,MAAM4U,MAAMA,MAAM,QAAQ,KACpD,CAACC,MAAMC,QAAQrB,MAAM1c,QAAQP,MAAM,IAErC,MAAM,IAAIsB,MAAM,iDAAiD;CACnE,OAAO;EACL,GAAI2b,MAAMhZ,SAAS6F,KAAAA,KAAa,EAAE7F,MAAMgZ,MAAMhZ,KAAK;EACnD,GAAI,eAAegZ,SAAS,EAAE/Y,WAAW,EAAEC,OAAO8Y,MAAM/Y,UAAU,EAAE;EACpE,GAAI+Y,MAAM1c,YAAYuJ,KAAAA,KAAa,EAAE9J,QAAQid,MAAM1c,QAAQP,OAAO;CACpE;AACF;AAEA,MAAMue,YAAYjV,GAAYjJ,IAAY4d,OAAgC;CACxEF,QAAQzU,GAAGjJ,EAAE;CACb,MAAM0G,WAAWuC,EAAEvC;CACnB,IAAIA,UAAU1C,IAAIgK,IAAIhO,EAAE,GAAG;EACzB,IAAI4d,GAAGlK,SAAS,UAAUhN,SAAStC,QAAQ4M,IAAIhR,EAAE;OAC5C;GACH,MAAMmc,KAAKuB,QAAQzU,GAAGjJ,EAAE;GACxB,MAAM4c,QAAQgB,GAAGhB,MAAMpB,OAAOvS,GAAGkT,GAAG7c,UAAU6c,GAAG/Q,MAAM,CAAC;GACxD1E,SAASxC,QAAQ6T,IAAI/X,IAAI;IAAE,GAAG0G,SAASxC,QAAQsM,IAAIxQ,EAAE;IAAG,GAAG4c;GAAM,CAAC;EACpE;EACA,OAAOvb,QAAQV,QAAQ;CACzB;CACA,MAAMkR,aAAa;EACjBjG,KAAK3C,CAAC;EACN,KAAUA,CAAC;CACb;CACA,IAAI,CAACA,EAAEvD,QAAQ;EACbiY,cAAc1U,GAAGjJ,IAAI4d,EAAE;EACvB/L,KAAK;EACL,OAAOxQ,QAAQV,QAAQ;CACzB;CACA,OAAO8N,SAASxF,SAAS0U,cAAc1U,GAAGjJ,IAAI4d,EAAE,CAAC,CAAC,CAAChP,KAAKiD,IAAI;AAC9D;AAEA,MAAMsM,cAAcC,YAA2B;CAC7CA,QAAQ7c,YAAY,CAAC,CAAC;AACxB;AAEA,MAAa8c,cAAcpV,GAAYjJ,OACrCme,WAAWD,SAASjV,GAAGjJ,IAAI;CAAE0T,MAAM;CAASkJ,cAAc,EAAEhZ,MAAM,KAAK;AAAG,CAAC,CAAC;AAE9E,MAAa0a,iBAAiBrV,GAAYjJ,OAAiC;CACzE0d,QAAQzU,GAAGjJ,EAAE;CACb,MAAMsB,SAAS,IAAID,SAAkBV,SAASE,WAAW;EACvD,MAAMsH,UAAUc,EAAE9C,SAASqK,IAAIxQ,EAAE,KAAK,CAAA;EACtCmI,QAAQ6D,KAAK;GAAErL;GAASE;EAAO,CAAC;EAChCoI,EAAE9C,SAAS4R,IAAI/X,IAAImI,OAAO;CAC5B,CAAC;CACD7G,OAAOC,YAAY,CAAC,CAAC;CACrB2c,SAASjV,GAAGjJ,IAAI;EAAE0T,MAAM;EAASkJ,cAAc,EAAEhZ,MAAM,MAAM;CAAG,CAAC,CAAC,CAACrC,OAChET,UAAmByd,cAActV,GAAGjJ,IAAIc,KAAK,CAChD;CACA,OAAOQ;AACT;AAEA,MAAMid,iBAAiBtV,GAAYjJ,IAAYc,UAAmB;CAChE,MAAMqH,UAAUc,EAAE9C,SAASqK,IAAIxQ,EAAE,KAAK,CAAA;CACtCiJ,EAAE9C,SAASsK,OAAOzQ,EAAE;CACpB,KAAK,MAAM6L,UAAU1D,SAAS0D,OAAOhL,OAAOC,KAAK;AACnD;AAEA,MAAa0d,gBAAgBvV,GAAYjJ,OACvCme,WAAWD,SAASjV,GAAGjJ,IAAI,EAAE0T,MAAM,SAAS,CAAC,CAAC;AAEhD,MAAa+K,gBACXxV,GACAjJ,IACA0O,OAEAyP,WACED,SAASjV,GAAGjJ,IAAI;CAAE0T,MAAM;CAASkJ,QAAQpQ,UAAUqR,QAAQnP,GAAGlC,KAAK,CAAC;AAAE,CAAC,CACzE;AAEF,MAAMkS,cACJzV,OAC6D;CAC7D0V,MAAM1V,EAAE1E,QAAQqa,eAAe7hB;CAC/BmM,WACEjM,eAAegM,EAAE1E,OAAO,MAAM,OAAO0E,EAAEpE,YACnCoE,EAAEpE,UAAUqE,YACZjM,eAAegM,EAAE1E,OAAO;AAChC;AAEA,MAAMsa,UACJ/C,OACAtP,OACA,EAAEsS,OAAOC,aACN;CACH,MAAMC,SAASF,SAASC;CACxB,IAAIC,WAAWvV,KAAAA,GAAW,OAAO,CAAC,GAAGqS,OAAOtP,KAAK;CACjD,MAAMyS,QAAQnD,MAAMM,WAAW/R,MAAMA,EAAErK,OAAOgf,MAAM;CACpD,IAAIC,UAAU,IAAI,OAAO,CAAC,GAAGnD,OAAOtP,KAAK;CACzC,MAAM2P,KAAK2C,UAAUrV,KAAAA,IAAYwV,QAAQ,IAAIA;CAC7C,OAAO;EAAC,GAAGnD,MAAM1N,MAAM,GAAG+N,EAAE;EAAG3P;EAAO,GAAGsP,MAAM1N,MAAM+N,EAAE;CAAC;AAC1D;AAEA,MAAa+C,gBACXjW,GACAuD,UACW;CACX,IAAI,CAACvD,EAAE9D,UAAU,MAAM,IAAIlE,MAAM,qCAAqC;CACtE,IAAIgI,EAAE5D,iBAAiBoE,KAAAA,GAAW,MAAMR,EAAE5D;CAC1C,IAAImH,MAAMsS,UAAUrV,KAAAA,KAAa+C,MAAMuS,WAAWtV,KAAAA,GAChD,MAAM,IAAIxI,MAAM,wCAAwC;CAC1D,KAAK,MAAM+d,UAAU,CAACxS,MAAMsS,OAAOtS,MAAMuS,MAAM,GAC7C,IAAIC,WAAWvV,KAAAA,GAAWiU,QAAQzU,GAAG+V,MAAM;CAC7C,MAAM,EAAE1f,aAAakN;CACrB,IAAI,EAAEvD,EAAEpE,YAAYyW,WAAWrS,GAAG3J,QAAQ,IAAIyR,QAAQ9H,GAAG3J,QAAQ,IAC/D,MAAM,IAAI2B,MAAM,wBAAwB3B,SAAQ,oBAAqB;CACvE,MAAM,EAAEK,QAAQC,SAAS3B,aAAauO,MAAMtM,QAAQP,MAAM;CAC1D,MAAMK,KAAKwM,MAAM4S,SAAS3V,KAAAA,IAAYzK,SAAY,IAAI,GAAGwN,MAAM4S,KAAI;CACnE,MAAMhU,SAAwC;EAC5CpL;EACAT,UAAUmf,WAAWzV,CAAC;EACtBvJ,QAAQ8M,MAAMtM,QAAQR;EACtBC;EACA,GAAIC,SAAS6J,KAAAA,KAAa,EAAE7J,KAAK;EACjCkN,IAAIkM,KAAKC,IAAI;EACb,GAAIzM,MAAM5I,QAAQ,EAAEA,MAAM,KAAc;EACxC,GAAI4I,MAAM3I,cAAc4F,KAAAA,KAAa,EAAE5F,WAAW2I,MAAM3I,UAAU;EAClE,GAAIoF,EAAE1D,MAAM+E,UAAUb,KAAAA,KAAa,EAAEpJ,IAAI4I,EAAE1D,MAAM+E,MAAMtK,GAAG;CAC5D;CACA,MAAM2O,YAAY;EAChB,IAAI3F,YAAYC,GAAG3J,QAAQ,GAAG;GAC5B+U,aACEpL,GACA;IACE3J;IACAC,UAAU6L,OAAO7L;IACjBG,QAAQ0L,OAAO1L;IACfC;IACA,GAAIC,SAAS6J,KAAAA,KAAa,EAAE7J,KAAK;GACnC,GACA4M,MAAMtM,QAAQP,cACR,CAAC,SACD,CAAC,GACP;IACE,GAAI6M,MAAM5I,QAAQ,EAAE0Q,MAAM,KAAK;IAC/B,GAAI9H,MAAM3I,cAAc4F,KAAAA,KAAa,EAAE5F,WAAW2I,MAAM3I,UAAU;GACpE,CACF;GACA;EACF;EACA,IAAIwb,OAAOpW,EAAElE;EACb,IAAIua,UAAUlU;EACd,IAAIoB,MAAM4S,SAAS3V,KAAAA,GAAW;GAG5B,MAAM7B,SAASe,OAAO0H,QAAQgP,KAAKxW,KAAK,CAAC,CAACkF,MAAM,GAAGwR,OACjDA,EAAE3O,OAAOzH,MAAM0H,MAAMA,EAAE7Q,OAAOwM,MAAM4S,IAAI,CAC1C;GACA,IAAIxX,WAAW6B,KAAAA,KAAa2G,OAAOnH,GAAGjJ,EAAE,MAAMyJ,KAAAA,GAAW;GACzD,MAAMkH,SAAS/I,OAAO,EAAE,CAACgJ,MAAO7C,MAAM8C,MAAMA,EAAE7Q,OAAOwM,MAAM4S,IAAI;GAC/DE,UAAU;IAAE,GAAGlU;IAAQ0B,IAAI6D,OAAO7D;GAAG;GACrCuS,OAAOvW,SAASuW,MAAMzX,OAAO,IAAI4X,cAAc5X,OAAO,IAAI4E,MAAM4S,IAAI,CAAC;EACvE;EACA,MAAMrW,OAAOL,OAAO2W,MAAM/f,QAAQ;EAElC,MAAMmgB,QAAQ1U,SAAShC,IAAI,CAAC,CAACgF,MAAM1D,MAAMA,EAAEyC,MAAMwS,QAAQxS,EAAE;EAC3D,MAAM4S,WACJlT,MAAM4S,SAAS3V,KAAAA,KACf+C,MAAMsS,UAAUrV,KAAAA,KAChB+C,MAAMuS,WAAWtV,KAAAA,KACjBgW,UAAUhW,KAAAA,IACN,EAAEsV,QAAQU,MAAMzf,GAAG,IACnBwM;EACN,IAAI;GACFC,UACExD,GACAH,SACEuW,MACA/f,UACAoL,WAAW3B,MAAM8V,OAAO9T,SAAShC,IAAI,GAAGuW,SAASI,QAAQ,CAAC,CAC5D,CACF;EACF,SAAS5e,OAAO;GACd,IAAI,CAAC6L,QAAQ7L,KAAK,GAAG,MAAMA;GAE3B,IAAI0L,MAAM4S,SAAS3V,KAAAA,GAAWR,EAAE5C,QAAQ2K,IAAIxE,MAAM4S,IAAI;GACtD9O,eAAerH,GAAGjJ,IAAI;IAAEgQ,IAAI;IAAO7O,SAASia;GAAM,CAAC;GACnD;EACF;EACAnS,EAAExC,SAASgK,OAAOzQ,EAAE;EACpBqb,QAAQpS,GAAG3J,QAAQ;EACnB2J,EAAEZ,OAAO;CACX;CACA,MAAMwJ,aAAa;EACjBjG,KAAK3C,CAAC;EACN,KAAUA,CAAC;CACb;CACA,IAAI,CAACA,EAAEvD,QAAQ;EACbiJ,IAAI;EACJkD,KAAK;CACP,OAAOsM,WAAW1P,SAASxF,GAAG0F,GAAG,CAAC,CAACC,KAAKiD,IAAI,CAAC;CAC7C,OAAO7R;AACT;AAIA,MAAM2f,cAAc1W,MAAe;CACjC,KAAK,MAAM,CAAC3J,UAAUyJ,SAASJ,OAAO0H,QAAQpH,EAAElE,OAAO8D,KAAK,GAAG;EAC7D,MAAM+W,SAAS7W,KAAK6H,SAAS,CAAA,EAAA,CAAI7C,MAAM8C,MAAM,CAAC5H,EAAE5C,QAAQ2H,IAAI6C,EAAE7Q,EAAE,CAAC;EACjE,IAAI4f,OAAO,OAAO;GAAEtgB;GAAUsgB;EAAM;CACtC;AAEF;AAEA,MAAMJ,iBACJzW,MACA/I,OACgC;CAChC,MAAM4Q,SAAS7H,KAAK6H,SAAS,CAAA,EAAA,CAAIhH,QAAQiH,MAAMA,EAAE7Q,OAAOA,EAAE;CAC1D,MAAM,EAAE4Q,OAAOiP,QAAQ,GAAG/U,SAAS/B;CACnC,OAAO6H,MAAMnG,SAAS,IAAI;EAAE,GAAGK;EAAM8F;CAAM,IAAI9F;AACjD;AAEA,MAAMgV,OAAO7W,GAAY3J,UAAkBU,OAAe;CACxD,MAAM+I,OAAOL,OAAOO,EAAElE,QAAQzF,QAAQ;CACtC,IAAI2J,EAAE5C,QAAQ2H,IAAIhO,EAAE,KAAK,CAAC+I,KAAK6H,OAAOzH,MAAM0H,MAAMA,EAAE7Q,OAAOA,EAAE,GAAG;CAChEyM,UAAUxD,GAAGH,SAASG,EAAElE,QAAQzF,UAAUkgB,cAAczW,MAAM/I,EAAE,CAAC,CAAC;AACpE;AAEA,MAAMqT,WAAWpK,MAAe;CAC9B,MAAM8W,UAAU9W,EAAE5G;CAElB,IACE0d,YAAYtW,KAAAA,KACZR,EAAE7C,cACF,CAAC6C,EAAEjB,WACH,CAACiB,EAAE9D,YACH,CAAC8D,EAAEpD,cAEH;CACF,IAAI8Z,WAAW1W,CAAC,MAAMQ,KAAAA,GAAW;CACjCR,EAAE7C,aAAa;CACf,MAAMuI,MAAM,YAAY;EACtB,SAAS;GACP,IAAI1F,EAAEvD,QAAQ,MAAM+I,SAASxF,SAAS,CAAC,CAAC;QACnC,MAAM;GACX,MAAMuB,OAAOmV,WAAW1W,CAAC;GACzB,IAAIuB,SAASf,KAAAA,KAAa,CAACR,EAAEjB,SAAS;GACtC,MAAM,EAAE1I,UAAUsgB,UAAUpV;GAC5B,IAAI;IACF,MAAMuV,QAAQ3N,SAAS9S,UAAUsgB,KAAK,CAAC;GACzC,SAAS9e,OAAO;IACdwW,QAAQxW,MACN,qFACAA,KACF;IACAmI,EAAE5C,QAAQ2K,IAAI4O,MAAM5f,EAAE;IACtB;GACF;GACA,IAAIiJ,EAAEvD,QAAQ,MAAM+I,SAASxF,SAAS6W,IAAI7W,GAAG3J,UAAUsgB,MAAM5f,EAAE,CAAC;QAC3D8f,IAAI7W,GAAG3J,UAAUsgB,MAAM5f,EAAE;GAC9BiJ,EAAEZ,OAAO;EACX;CACF;CAEA2X,CADe/W,EAAE1D,MAAM0a,aAAahX,EAAE1D,MAAM0a,WAAWtR,GAAG,IAAIA,IAAI,EAAA,CAC3DC,WACC;EACJ3F,EAAE7C,aAAa;EACfiN,QAAQpK,CAAC;CACX,IACCnI,UAAmB;EAClBmI,EAAE7C,aAAa;EACfkR,QAAQxW,MAAM,8CAA8CA,KAAK;CACnE,CACF;AACF;AAEA,MAAMof,WACJjX,GACA/I,SACAP,QACAgB,SACAE,QACA0D,YACG;CACH,IAAI,CAAC0E,EAAEvD,QAAQ;EACb2O,aAAapL,GAAG/I,SAASP,QAAQgB,SAASE,QAAQ0D,OAAO;EACzDqH,KAAK3C,CAAC;EACN,KAAUA,CAAC;EACX;CACF;CACA,SAAcA,SAAS;EAGrB,IAAIqQ,WAAWrQ,CAAC,GAAG;GACjBpI,OAAO,IAAI5B,mBAAmB;IAAEgR,MAAM;IAAW1D,OAAO;GAAc,CAAC,CAAC;GACxE;EACF;EACA8H,aAAapL,GAAG/I,SAASP,QAAQgB,SAASE,QAAQ0D,OAAO;CAC3D,CAAC,CAAC,CAACqK,WAAW;EACZhD,KAAK3C,CAAC;EACN,KAAUA,CAAC;CACb,GAAGpI,MAAM;AACX;AAEA,MAAMkQ,WAAW9H,GAAY3J,aAAqB;CAChD,MAAM6gB,SAASljB,eAAegM,EAAE1E,OAAO;CACvC,OAAO4b,WAAW,OAAOA,OAAOhX,MAAMiX,UAAUA,MAAM/W,SAAS/J,QAAQ;AACzE;AAEA,MAAM+gB,eACJpX,GACAvJ,QACAC,QACAL,WAAW2J,EAAE1E,QAAQjF,YAAAA,WACrBiF,YACqB;CAIrB,IAAI,EAHe0E,EAAEpE,YACjBoE,EAAEpE,UAAUqE,UAAUC,MAAMC,MAAMA,EAAEC,SAAS/J,QAAQ,IACrDyR,QAAQ9H,GAAG3J,QAAQ,IAErB,MAAM,IAAI2B,MAAM,wBAAwB3B,SAAQ,oBAAqB;CACvE,IAAIiF,SAAS+P,SAAS7K,KAAAA,KAAa,OAAOlF,QAAQ+P,SAAS,WACzD,MAAM,IAAIrT,MAAM,0CAA0C;CAC5D,IAAI,CAACgI,EAAE9D,UAAU;EACf,MAAM7D,SAAS2H,EAAE7D,MAAOwJ,WACtByR,YAAYpX,GAAGvJ,QAAQC,QAAQL,UAAUiF,OAAO,CAClD;EACAjD,OAAOC,YAAY,CAAC,CAAC;EACrB,OAAOD;CACT;CACA,IAAI2H,EAAE5D,iBAAiBoE,KAAAA,GAAW;EAChC,MAAMnI,SAASD,QAAQR,OAAOoI,EAAE5D,YAAY;EAC5C/D,OAAOC,YAAY,CAAC,CAAC;EACrB,OAAOD;CACT;CACA,IAAI,CAAC2H,EAAEjB,SACL,OAAO9G,aAAa;EAAE+O,MAAM;EAAW1D,OAAO;CAAU,CAAC;CAE3D,IAAI+M,WAAWrQ,CAAC,GACd,OAAO/H,aAAa;EAAE+O,MAAM;EAAW1D,OAAO;CAAc,CAAC;CAE/D,MAAMjL,SAAS,IAAID,SAAkBV,SAASE,WAAW;EACvD,MAAM,EAAElB,QAAQ4gB,SAAS3gB,SAAS3B,aAAa0B,MAAM;EACrDugB,QACEjX,GACA;GACE3J;GACAC,UAAUmf,WAAWzV,CAAC;GACtBvJ;GACAC,QAAQ4gB;GACR,GAAI3gB,SAAS6J,KAAAA,KAAa,EAAE7J,KAAK;EACnC,GACAD,QACAgB,SACAE,QACA;GACE,GAAI0D,SAAS+P,QAAQ,EAAEA,MAAM,KAAK;GAClC,GAAI/P,SAASV,cAAc4F,KAAAA,KAAa,EACtC5F,WAAWU,QAAQV,UACrB;EACF,CACF;CACF,CAAC;CACDvC,OAAOC,YAAY,CAAC,CAAC;CACrB,OAAOD;AACT;AAEA,MAAakf,kBAAkBvX,OAA2C;CACxEuH,MAAMlR,UAAUkX,KAAKkK,SAASzX,EAAE1E,QAAQuS,cAAcxX,cAAc;EAClE,MAAMqhB,UAAUrjB,aAAa2L,EAAEzB,WAAWlI,UAAUkX,KAAKkK,MAAM;EAC/D,IAAIC,YAAYlX,KAAAA,GAAW,OAAOkX,QAAQ7c;EAC1C,IAAI,CAACmF,EAAEzD,iBAAiBgR,QAAQ/M,KAAAA,GAAW,OAAOA,KAAAA;EAClD,MAAMmX,WAAWrjB,mBAAmBiZ,KAAKkK,MAAM;EAC/C,IAAIE,aAAanX,KAAAA,GAAW,OAAOA,KAAAA;EACnC,MAAMiS,SAASzS,EAAEzD,cAAc4J,KAAK;GAClCnG,EAAEzD,cAAcwR,aAAa;GAC7B1X;GACA,GAAGshB;EAAQ,CACZ;EACD,IAAIlF,WAAWjS,KAAAA,GAAW,OAAOA,KAAAA;EACjC,MAAM0W,SAASljB,eAAegM,EAAE1E,OAAO;EACvC,MAAM6b,QACJD,WAAW,MACPlX,EAAEpE,WAAWqE,UAAU6E,MAAM3E,MAAMA,EAAEC,SAAS/J,QAAQ,IACtD6gB,OAAOpS,MAAM3E,MAAMA,EAAEC,SAAS/J,QAAQ;EAC5C,OAAO8gB,UAAU3W,KAAAA,KAAavM,QAAQwe,OAAO3E,SAASqJ,KAAK,IACvD1E,OAAO5X,QACP2F,KAAAA;CACN;CACAoX,YAAY5X,EAAEzB,UAAUA;CACxBwT,YAAY9D,aAAa;EACvBjO,EAAE1B,kBAAkByJ,IAAIkG,QAAQ;EAChC,aAAa;GACXjO,EAAE1B,kBAAkBkJ,OAAOyG,QAAQ;EACrC;CACF;AACF;AAEA,MAAa4J,kBACX7X,GACA3J,UACAI,QACAC,QACA4E,YACG8b,YAAYpX,GAAGvJ,QAAQC,QAAQL,UAAUiF,OAAO;AAErD,MAAMwc,2BACJzhB,UACAY,SACAyU,YACG;CACH,IACE,CAACzU,QAAQX,YACT,CAACrC,QAAQgD,QAAQX,SAASof,KAAK5H,SAASpC,QAAQgK,IAAI,GAEpD,OAAO;CACT,MAAMjK,WAAWxU,QAAQX,SAAS2J;CAClC,IAAIyL,QAAQzL,cAAc,KAAK,OAAO;CACtC,IAAIwL,aAAa,KAAK,OAAO;CAC7B,MAAMnV,WAAWmV,SAAS3G,MAAM3E,MAAMA,EAAEC,SAAS/J,QAAQ;CACzD,MAAM8gB,QAAQzL,QAAQzL,UAAU6E,MAAM3E,MAAMA,EAAEC,SAAS/J,QAAQ;CAC/D,OACEC,aAAakK,KAAAA,KACb2W,UAAU3W,KAAAA,KACVvM,QAAQqC,SAASwX,SAASqJ,KAAK;AAEnC;AAEA,MAAMY,iBAAiBjc,WAA0C;CAC/D,IACE,OAAOA,OAAO8D,UAAU,YACxB9D,OAAO8D,UAAU,QACjBF,OAAO+H,OAAO3L,OAAO8D,KAAK,CAAC,CAACM,MACzBJ,SACC,CAACiV,MAAMC,QAAQlV,KAAKT,QAAQ,KAC3BS,KAAK4B,WAAWlB,KAAAA,KAAa,CAACuU,MAAMC,QAAQlV,KAAK4B,MAAM,CAC5D,GAEA,MAAM,IAAI1J,MACR,kEACF;AACJ;AAEA,MAAMggB,qBACJ1b,OACAhB,YACG;CACH,IAAI6G,SAAS7F,MAAM6J,KAAK;CACxB,IAAIhE,WAAW,MAAM4V,cAAc5V,MAAM;CACzC,MAAMuJ,UAAU;EACdgK,MAAMpa,QAAQqa,eAAe7hB;EAC7BmM,WAAWjM,eAAesH,OAAO;CACnC;CACA,MAAM2c,cAAcnc,WAClB4D,OAAO0H,QAAQtL,OAAO8D,KAAK,CAAC,CAACyF,OAAO,CAAChP,UAAUyJ,UAC7C,CAAC,GAAGA,KAAKT,UAAU,GAAGyC,SAAShC,IAAI,CAAC,CAAC,CAACuF,OAAOpO,YAC3C6gB,wBAAwBzhB,UAAUY,SAASyU,OAAO,CACpD,CACF;CACF,IAAIvJ,WAAW,QAAQ,CAAC8V,WAAW9V,MAAM,GAAG;EAC1C,IAAI,CAAC7F,MAAM4b,SACT,MAAM,IAAIlgB,MAAM,wDAAwD;EAC1EmK,SAAS7F,MAAM4b,QAAQ/V,QAAQuJ,OAAO;EACtC,IAAIvJ,WAAW,MAAM;GACnB4V,cAAc5V,MAAM;GACpB,IAAI,CAAC8V,WAAW9V,MAAM,GACpB,MAAM,IAAInK,MAAM,+CAA+C;GACjEsE,MAAMmH,KAAKtB,MAAM;EACnB;CACF;CACA,MAAMrG,SACJqG,WAAW,OACP;EAAEiE,UAAUrQ,SAAY;EAAG6J,OAAO,CAAC;CAAE,IACrC0G,WAAWhK,OAAO6F,MAAM;CAC9B,IAAIrG,WAAWqG,QAAQ7F,MAAMmH,KAAK3H,MAAM;CACxC,OAAOA;AACT;AAEA,MAAMqc,aAAarc,WACjB,IAAI5B,IACFwF,OAAO+H,OAAO3L,OAAO8D,KAAK,CAAC,CAACiF,SAAS/E,SAAS,CAC5C,GAAGA,KAAKT,SAASiC,KAAKF,MAAMA,EAAErK,EAAE,GAChC,GAAG+K,SAAShC,IAAI,CAAC,CAACwB,KAAKF,MAAMA,EAAErK,EAAE,CAAC,CACnC,CACH;AAEF,MAAaqhB,cACXpY,GACA3J,UACAwE,UACS;CACT,IACEmF,EAAEpE,YACE,CAACoE,EAAEpE,UAAUqE,UAAUC,MAAMC,MAAMA,EAAEC,SAAS/J,QAAQ,IACtD,CAACyR,QAAQ9H,GAAG3J,QAAQ,GAExB,MAAM,IAAI2B,MAAM,wBAAwB3B,SAAQ,oBAAqB;CACvE2J,EAAExE,SAASsT,IAAIzY,UAAU1C,cAAc0C,UAAUwE,KAAK,CAAC;CACvDmF,EAAEtE,cAAcqM,IAAI1R,QAAQ;CAC5BsM,KAAK3C,CAAC;CACN,KAAUA,CAAC;AACb;AAEA,MAAaqY,uBACX/c,YACY;CACZ,MAAM,CAACgd,gBAAgB5jB,SAASgB,wBAAwB;CACxD,MAAMgiB,UAAUljB,WAAWiB,qBAAqB;CAChD,MAAM8G,gBAAgB/H,WAAWgB,sBAAsB;CACvD,IAAI8F,QAAQxC,iBAAiB0H,KAAAA,KAAakX,YAAYlX,KAAAA,GACpD,MAAM,IAAIxI,MACR,6GACF;CAEF,MAAMsE,QAAQhB,QAAQxC,gBAAgB4e,WAAWY;CACjD,IACGhc,MAAMsJ,SAASpF,KAAAA,OAAgBlE,MAAMyV,cAAcvR,KAAAA,MACnDlE,MAAMsJ,SAASpF,KAAAA,OAAgBlE,MAAM+E,UAAUb,KAAAA,MAC/ClE,MAAMsJ,SAASpF,KAAAA,OAAgBlE,MAAM0a,eAAexW,KAAAA,IAErD,MAAM,IAAIxI,MACR,wFACF;CAEF,MAAM,CAACgI,KAAKtL,eAAwB;EAClC,MAAMoH,SACJQ,MAAMH,UAAUqE,KAAAA,IACZwX,kBAAkB1b,OAAOhB,OAAO,IAChC;GAAE8K,UAAUrQ,SAAY;GAAG6J,OAAO,CAAC;EAAE;EAC3C,MAAM2Y,UAAmB;GACvBjd;GACAC,mBAAmBD,QAAQ5C;GAC3B8C,UAAU,IAAIN,IACZwE,OAAO0H,QAAQ9L,QAAQ5C,WAAW,CAAC,CAAC,CAAC,CAAC4I,KAAK,CAACjL,UAAUwE,WAAW,CAC/DxE,UACA1C,cAAc0C,UAAUwE,KAAK,CAAC,CAC/B,CACH;GACAa,eAAe,IAAIxB,IAAIwF,OAAO2E,KAAK/I,QAAQ5C,WAAW,CAAC,CAAC,CAAC;GACzDiD,gCAAgB,IAAIT,IAAI;GACxBU,WAAW4E,KAAAA;GACX1E;GACAE,KAAK;IACHwc,oBAAoBpH,kBAAkBmH,OAAO;IAC7C,IAAInS,WAAW;KACb,OAAOmS,QAAQzc,OAAOsK;IACxB;IACA6K,uBAAuBA,gBAAgBsH,OAAO;IAC9CE,UAAUC,SAASlJ,YAAY+I,SAASG,IAAI;IAC5CC,QAAQD,WAAS/I,UAAU4I,SAASG,MAAI;IACxCE,SAAS3L,SAASD,WAAWuL,SAAStL,IAAI;IAC1C4L,YAAYzJ,QAAQQ,cAAc2I,SAASnJ,GAAG;IAC9C0J,SAAShQ,UAAUD,QAAQ0P,SAASzP,KAAK;IACzCiQ,gBAAgB5I,aAAaoI,OAAO;IACpCS,WAAWN,WAAStI,aAAamI,SAASG,MAAI;GAChD;GACAzc,iBAAiBK,MAAMH,UAAUqE,KAAAA;GACjCtE,UAAUI,MAAMH,UAAUqE,KAAAA;GAC1BrE,OAAOqE,KAAAA;GACPpE,cAAcoE,KAAAA;GACdnE,iBAAiBC,MAAMH,UAAUqE,KAAAA,IAAY1E,SAAS;GACtDQ;GACAC;GACAE,QACEH,MAAMsJ,SAASpF,KAAAA,IACX;IACE5G,KAAKxB,QAAQV,QAAQ;IACrBmC,YAAY;IACZC,QAAQ,CAAA;IACRG,yBAAS,IAAIC,IAAI;IACjBC,SAAS,CAAA;IACTE,MAAM;IACNC,aAAa;IACbC,yBAAS,IAAIL,IAAI;IACjBM,OAAO;GACT,IACA;GACNkC,WAAW;GACXC,aAAa;GACbC,cAAc;GACdC,YAAY,CAAC;GACbC,eAAe,CAAC;GAChBC,UAAU;GACVC,UAAU;GACVC,MAAM;GACNjE,eAAewH,KAAAA;GACftH,kBAAkBsH,KAAAA;GAClBpH,WAAWoH,KAAAA;GACXtD,0BAAU,IAAIhC,IAAI;GAClBiC,YAAY;GACZC,yBAAS,IAAIlD,IAAI;GACjBmD,uBAAO,IAAIC,QAAQ;GACnBhE,SAASkH,KAAAA;GACT9G,QAAQ8G,KAAAA;GACRhD,UAAU2a,UAAUrc,MAAM;GAC1B2B,UAAU;GACVC,YAAY,CAAA;GACZC,aAAa,CAAA;GACbC,eAAe;GACfC,+BAAe,IAAI3D,IAAI;GACvB4D,eAAe;GACfC,SAASyC,KAAAA;GACTvC,UAAU;IAAEC,YAAY;IAAIC,OAAO;GAAE;GACrCC,SAAS,CAAA;GACTC,WAAWmC,KAAAA;GACXlC,mCAAmB,IAAIpE,IAAI;GAC3BqE,WAAW;IAAE+L,MAAM;IAAM/L,2BAAW,IAAIrD,IAAI;GAAE;GAC9CuD,eAAe+B,KAAAA;GACf9B,SAAS,CAAA;GACTC,QAAQ;IACNsa,gBAAgBV,QAAQla;IACxB6a,mBAAmB;KACjB,MAAMxa,UAAU6Z,QAAQ7Z;KACxB6Z,QAAQ7Z,UAAU,CAAA;KAClB,OAAOA;IACT;IACAya,cAAclL,aAAa;KACzBsK,QAAQnZ,SAAS6O,mBAAmB,CAAC;IACvC;GACF;GACApP,QAAQ;GACRC,aAAa;GACbC,SAAS;GACTC,SAAS;GACTC,WAAW;GACXC,SAAS,CAAA;GACTC,WAAW;GACXC,cAAc,CAAC;GACfC,UAAUxJ,mBAAmBY,QAAQC,WACnC0gB,YAAYmB,SAAS9hB,QAAQC,MAAM,CACrC;EACF;EACA,IAAI4F,MAAMH,UAAUqE,KAAAA,GAAW;GAC7B+X,QAAQpc,QAAQG,MAAMH,MAAMwJ,WAAW;IACrC4S,QAAQzc,SAASkc,kBAAkB1b,OAAOic,QAAQjd,OAAO;IACzDid,QAAQ/a,WAAW2a,UAAUI,QAAQzc,MAAM;IAC3Cyc,QAAQtc,kBAAkB;IAC1Bsc,QAAQrc,WAAW;IACnB,IAAIqc,QAAQxZ,SAASwZ,QAAQnZ,OAAO;GACtC,CAAC;GACDmZ,QAAQpc,QAAQoc,QAAQpc,MAAM7D,OAAOgL,UAAmB;IACtD,MAAMzL,QAAQjE,iBAAiB0P,KAAK;IACpCiV,QAAQnc,eAAevE;IACvB0gB,QAAQtZ,WAAWoE,cAAcxL,KAAK;IACtC,MAAMA;GACR,CAAC;GACD0gB,QAAQpc,MAAM7D,YAAY,CAAC,CAAC;EAC9B;EACAnD,iBAAiBojB,QAAQlZ,UAAU,EACjC+Z,cAAcnL,eAAa;GACzBsK,QAAQpZ,YAAY8O;EACtB,EACF,CAAC;EACD,OAAOsK;CACT,CAAC;CACD,IAAKjc,MAAMsJ,SAASpF,KAAAA,OAAgBR,EAAEvD,WAAW,QAC/C,MAAM,IAAIzE,MACR,8HACF;CAEFvD,gBAAgB;EACd,IAAIuL,EAAEzE,sBAAsBD,QAAQ5C,SAAS;EAC7CsH,EAAEzE,oBAAoBD,QAAQ5C;EAC9B,KAAK,MAAM,CAACrC,YAAUwE,YAAU6E,OAAO0H,QAAQ9L,QAAQ5C,WAAW,CAAC,CAAC,GAClE0f,WAAWpY,GAAG3J,YAAUwE,OAAK;CACjC,GAAG,CAACmF,GAAG1E,QAAQ5C,OAAO,CAAC;CACvBsH,EAAE1E,UAAUA;CACZ0E,EAAE1D,QAAQA;CACV0D,EAAEzD,gBAAgBA;CAClByD,EAAEhH,gBAAgBsC,QAAQtC;CAC1BgH,EAAE9G,mBAAmBoC,QAAQpC;CAC7B8G,EAAE5G,YAAYkC,QAAQlC;CACtB4G,EAAE1G,UAAUgC,QAAQhC;CACpB0G,EAAEtG,SAAS4B,QAAQ5B;CACnB,MAAMmU,cAAcL,KAAKC,UAAUnS,QAAQuS,WAAW;CACtDpZ,gBAAgB;EACdkZ,eAAe3N,CAAC;CAClB,GAAG;EAACA;EAAGzD;EAAesR;CAAW,CAAC;CAClCpZ,gBAEI8H,eAAewV,kBAAkB;EAC/B,KAAK,MAAM9D,cAAYjO,EAAE1B,mBAAmB2P,WAAS;CACvD,CAAC,GACH,CAACjO,GAAGzD,aAAa,CACnB;CACA9H,gBAAgB;EACdqd,MAAM9R,CAAC;EACP,aAAagS,KAAKhS,CAAC;CACrB,GAAG,CAACA,CAAC,CAAC;CACN,OAAOA;AACT"}
|