@p10node/office-engine 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DocViewer-kfAVEXOO.js → DocViewer-PJieqbIR.js} +647 -611
- package/dist/DocViewer-PJieqbIR.js.map +1 -0
- package/dist/assets/worker-B1gMpGFN.js.map +1 -0
- package/dist/{collab-BzN1ZI-z.js → collab-BvjXvfJ9.js} +529 -232
- package/dist/collab-BvjXvfJ9.js.map +1 -0
- package/dist/collab.js +1 -1
- package/dist/core.js +1 -1
- package/dist/{default-worker-f546VALp.js → default-worker-DfpaJUjf.js} +27 -7
- package/dist/default-worker-DfpaJUjf.js.map +1 -0
- package/dist/embed.js +5 -3
- package/dist/embed.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/office-engine.embed.js +14 -10
- package/dist/office-engine.worker.js +25 -5
- package/dist/types/collab/compact.d.ts +23 -0
- package/dist/types/collab/hub.d.ts +35 -4
- package/dist/types/collab/index.d.ts +9 -2
- package/dist/types/collab/protocol.d.ts +29 -2
- package/dist/types/collab/session.d.ts +5 -1
- package/dist/types/collab/store.d.ts +94 -0
- package/dist/types/embed.d.ts +1 -1
- package/dist/types/react/xlsx/fit.d.ts +4 -0
- package/package.json +1 -1
- package/dist/DocViewer-kfAVEXOO.js.map +0 -1
- package/dist/assets/worker-DbLPJnSo.js.map +0 -1
- package/dist/collab-BzN1ZI-z.js.map +0 -1
- package/dist/default-worker-f546VALp.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collab-BzN1ZI-z.js","names":["CAPTURED","transformX","conflictsX","isStructural","hosts","waiters","registerHost","m","client","kind","host","fn","getHost","watchHost","w","set","cur","channels","channel","c","NO_PEERS","setPeers","peers","getPeers","subscribePeers","publishLocal","data","onLocal","rlen","r","plen","runs","n","collapsed","s","shiftPa","pa","d","runsText","shallowEq","a","b","ka","k","sameText","normalize","out","last","splitRuns","left","right","pos","o","cut","runAt","l","i","x","insertText","text","base","run","fallback","style","deleteRange","formatRange","rest","mid","fmt","prevBoundary","Segmenter","nextBoundary","ordered","caret","p","planDelete","e","sel","list","first","opDelete","plan","opts","planAt","opInsertRuns","fill","lines","ins","props","isLast","body","b0","opInsert","opEnter","opBackspace","from","word","prev","pp","merged","opDeleteForward","to","next","np","runSpan","stop","spanEnd","posFromDom","pel","node","root","offset","sp","span","walker","t","domFromPos","spans","pick","end","parent","idx","rem","getSel","rn","selPoints","RichInput","f","active","focus","target","h","mod","READS","bkey","matches","uniq","xs","pidsOf","blocks","atomKey","_t","diffRuns","units","y","pre","suf","spliceRuns","at","del","mapPos","mapByDiff","before","after","sameProps","DocxCollab","resolve","site","ed","method","bytes","args","pid","bi","cell","pi","ri","ci","want","pids","loc","pas","ck","op","lk","call","prior","pins","mine","pending","remote","ops","result","styles","locs","nextPids","steps","inRegion","nb","step","region","count","u","undo","focused","map","was","now","touched","key","pages","fd","ad","notNull","CollabSession","transport","adapter","reject","res","wait","event","message","max","items","it","applied","rebase","hole","tail","id","B64","toB64","u8","fromB64","bin","encode","value","v","decode","WebSocketTransport","url","protocols","ws","delay","msg","MemoryTransport","hub","latency","ms","conn","wire","CAPTURED$1","XlsxCollab","sheet","which","keep","rec","transformP","conflictsP","CAPTURED","PptxCollab","slide","rid","PEER_COLORS","CollabHub","log","room","broadcast","except","used","color","info","reset","send","startCollab","docx","session","offs","peer"],"sources":["../src/collab/hosts.ts","../src/react/edit/rich.ts","../src/react/edit/input.ts","../src/collab/docx.ts","../src/collab/session.ts","../src/collab/codec.ts","../src/collab/transport.ts","../src/collab/xlsx.ts","../src/collab/pptx-ops.ts","../src/collab/pptx.ts","../src/collab/protocol.ts","../src/collab/hub.ts","../src/collab/index.ts"],"sourcesContent":["/**\n * Views register their live editing objects here so a collaboration session\n * (created independently, e.g. by DocViewer) can reach them. Tiny on purpose:\n * views import only this file.\n */\n\ntype Fn = (host: unknown) => void\n\nconst hosts = new WeakMap<object, Map<string, unknown>>()\nconst waiters = new WeakMap<object, Map<string, Set<Fn>>>()\n\n/** registers `host` for (client, kind); returns the unregister function */\nexport function registerHost<T>(client: object, kind: string, host: T): () => void {\n let m = hosts.get(client)\n if (!m) hosts.set(client, (m = new Map()))\n m.set(kind, host)\n for (const fn of waiters.get(client)?.get(kind) ?? []) fn(host)\n return () => {\n if (m!.get(kind) === host) m!.delete(kind)\n }\n}\n\nexport function getHost<T>(client: object, kind: string): T | undefined {\n return hosts.get(client)?.get(kind) as T | undefined\n}\n\n/** calls `fn` with the current host and every host registered later */\nexport function watchHost<T>(client: object, kind: string, fn: (host: T) => void): () => void {\n let w = waiters.get(client)\n if (!w) waiters.set(client, (w = new Map()))\n let set = w.get(kind)\n if (!set) w.set(kind, (set = new Set()))\n set.add(fn as Fn)\n const cur = getHost<T>(client, kind)\n if (cur) fn(cur)\n return () => set!.delete(fn as Fn)\n}\n\n// ---------------------------------------------------------------- presence channel (views ↔ session)\n\nexport interface PeerView {\n site: number\n name: string\n color: string\n presence?: unknown\n}\n\ninterface Channel {\n peers: PeerView[]\n peerFns: Set<() => void>\n localFns: Set<(data: unknown) => void>\n}\n\nconst channels = new WeakMap<object, Channel>()\n\nfunction channel(client: object): Channel {\n let c = channels.get(client)\n if (!c) channels.set(client, (c = { peers: NO_PEERS, peerFns: new Set(), localFns: new Set() }))\n return c\n}\n\n/** session → views: collaborators and where they are */\nexport function setPeers(client: object, peers: PeerView[]) {\n const c = channel(client)\n c.peers = peers\n for (const fn of c.peerFns) fn()\n}\n\nconst NO_PEERS: PeerView[] = []\n\n/** stable between changes (usable as a useSyncExternalStore snapshot) */\nexport function getPeers(client: object): PeerView[] {\n return channels.get(client)?.peers ?? NO_PEERS\n}\n\nexport function subscribePeers(client: object, fn: () => void): () => void {\n const c = channel(client)\n c.peerFns.add(fn)\n return () => c.peerFns.delete(fn)\n}\n\n/** views → session: the local user's position (selection, active slide…) */\nexport function publishLocal(client: object, data: unknown) {\n for (const fn of channels.get(client)?.localFns ?? []) fn(data)\n}\n\nexport function onLocal(client: object, fn: (data: unknown) => void): () => void {\n const c = channel(client)\n c.localFns.add(fn)\n return () => c.localFns.delete(fn)\n}\n","/**\n * Pure run-level text operations shared by the DOCX and PPTX editors.\n * A run is either text ({ t: 'text', text }) or an atomic object counting as one character.\n */\nexport interface RRun {\n t: string\n text?: string\n s?: object\n d?: object\n src?: unknown\n href?: string\n lk?: string\n}\n\nexport interface Pos {\n /** paragraph address (container path; last segment = index in container) */\n pa: string\n o: number\n}\n\nexport interface Sel {\n a: Pos\n f: Pos\n}\n\nexport const rlen = (r: RRun) => (r.t === 'text' ? r.text!.length : 1)\nexport const plen = (runs: RRun[]) => runs.reduce((n, r) => n + rlen(r), 0)\nexport const collapsed = (s: Sel) => s.a.pa === s.f.pa && s.a.o === s.f.o\nexport const shiftPa = (pa: string, d: number) => pa.replace(/(\\d+)$/, (n) => String(Number(n) + d))\n\nexport function runsText(runs: RRun[]): string {\n return runs.map((r) => (r.t === 'text' ? r.text : '\\uFFFC')).join('')\n}\n\nfunction shallowEq(a: object | undefined, b: object | undefined): boolean {\n if (a === b) return true\n if (!a || !b) return !a && !b\n const ka = Object.keys(a)\n if (ka.length !== Object.keys(b).length) return false\n for (const k of ka) if ((a as Record<string, unknown>)[k] !== (b as Record<string, unknown>)[k]) return false\n return true\n}\n\nconst sameText = (a: RRun, b: RRun) => a.t === 'text' && b.t === 'text' && a.href === b.href && a.lk === b.lk && shallowEq(a.s, b.s) && shallowEq(a.d, b.d)\n\n/** Merges adjacent identical text runs and drops empty ones. */\nexport function normalize<R extends RRun>(runs: R[]): R[] {\n const out: R[] = []\n for (const r of runs) {\n if (r.t === 'text' && !r.text) continue\n const last = out[out.length - 1]\n if (last && sameText(last, r)) out[out.length - 1] = { ...last, text: last.text! + r.text! }\n else out.push(r)\n }\n return out\n}\n\n/** Splits runs at offset o (text runs are cut). */\nexport function splitRuns<R extends RRun>(runs: R[], o: number): [R[], R[]] {\n const left: R[] = []\n const right: R[] = []\n let pos = 0\n for (const r of runs) {\n const n = rlen(r)\n if (pos + n <= o) left.push(r)\n else if (pos >= o) right.push(r)\n else {\n const cut = o - pos\n left.push({ ...r, text: r.text!.slice(0, cut) })\n right.push({ ...r, text: r.text!.slice(cut) })\n }\n pos += n\n }\n return [left, right]\n}\n\nexport function sliceRuns<R extends RRun>(runs: R[], a: number, b: number): R[] {\n return splitRuns(splitRuns(runs, b)[0], a)[1]\n}\n\n/** Text run whose style applies at offset o (left affinity). */\nexport function runAt<R extends RRun>(runs: R[], o: number): R | undefined {\n const [l, r] = splitRuns(runs, o)\n for (let i = l.length - 1; i >= 0; i--) if (l[i].t === 'text') return l[i]\n return r.find((x) => x.t === 'text')\n}\n\nexport function insertText<R extends RRun>(runs: R[], o: number, text: string, style?: Partial<R>, fallback?: Partial<R>): R[] {\n if (!text) return runs\n const [l, r] = splitRuns(runs, o)\n const base = runAt(runs, o)\n const run = { t: 'text', ...(base ?? fallback ?? {}), ...(style ?? {}), text } as R\n if (style?.s && base?.s) run.s = { ...base.s, ...style.s }\n if (style?.d || base?.d) run.d = { ...(base?.d ?? {}), ...(style?.d ?? {}) }\n if (run.d && !Object.keys(run.d).length) delete run.d\n return normalize([...l, run, ...r])\n}\n\nexport function deleteRange<R extends RRun>(runs: R[], a: number, b: number): R[] {\n if (b <= a) return runs\n return normalize([...splitRuns(runs, a)[0], ...splitRuns(runs, b)[1]])\n}\n\nexport function formatRange<R extends RRun>(runs: R[], a: number, b: number, s: object, d: object): R[] {\n const [l, rest] = splitRuns(runs, a)\n const [mid, r] = splitRuns(rest, b - a)\n const fmt = mid.map((x) => (x.t === 'text' ? { ...x, s: { ...(x.s ?? {}), ...s }, d: { ...(x.d ?? {}), ...d } } : x))\n return normalize([...l, ...fmt, ...r])\n}\n\n/** Previous grapheme boundary (surrogate pairs + combining marks). */\nexport function prevBoundary(text: string, o: number): number {\n if (o <= 0) return 0\n type Seg = { segment(s: string): Iterable<{ index: number }> }\n const Segmenter = (Intl as unknown as { Segmenter?: new (l?: string, o?: object) => Seg }).Segmenter\n if (Segmenter) {\n let last = 0\n for (const s of new Segmenter(undefined, { granularity: 'grapheme' }).segment(text.slice(0, o))) last = s.index\n return last\n }\n const c = text.charCodeAt(o - 1)\n return c >= 0xdc00 && c <= 0xdfff && o >= 2 ? o - 2 : o - 1\n}\n\nexport function nextBoundary(text: string, o: number): number {\n if (o >= text.length) return text.length\n type Seg = { segment(s: string): Iterable<{ index: number; segment: string }> }\n const Segmenter = (Intl as unknown as { Segmenter?: new (l?: string, o?: object) => Seg }).Segmenter\n if (Segmenter) {\n for (const s of new Segmenter(undefined, { granularity: 'grapheme' }).segment(text.slice(o))) return o + s.segment.length\n }\n const c = text.charCodeAt(o)\n return c >= 0xd800 && c <= 0xdbff ? o + 2 : o + 1\n}\n","/**\n * Controlled contentEditable: the DOM is only a view. Every mutation is taken from\n * `beforeinput` (cancelled) and applied to the model through a RichHost; IME\n * composition (Vietnamese Telex/VNI, CJK…) is committed on `compositionend`.\n */\nimport {\n collapsed, deleteRange, insertText, nextBoundary, normalize, plen, prevBoundary, runAt, runsText, shiftPa, splitRuns,\n type Pos, type RRun, type Sel,\n} from './rich'\n\nexport interface RichPara {\n runs: RRun[]\n}\n\nexport interface ReplaceOpts {\n label?: string\n /** rebuild paragraph DOM (after IME composition mutated it) */\n remount?: boolean\n}\n\nexport interface RichHost<P extends RichPara = RichPara> {\n para(pa: string): P | undefined\n /** inclusive list of paragraph addresses from a to b in one container, or null */\n span(a: string, b: string): string[] | null\n prev(pa: string): string | undefined\n next(pa: string): string | undefined\n cmp(a: string, b: string): number\n /** replace contiguous paragraphs; `sel` is the selection afterwards */\n replace(pas: string[], next: P[], sel: Sel, opts?: ReplaceOpts): void\n withRuns(p: P, runs: RRun[]): P\n split(p: P, left: RRun[], right: RRun[], atEnd: boolean): [P, P]\n join(a: P, b: P, runs: RRun[]): P\n /** Backspace at offset 0 (e.g. leave a list); true when handled */\n backspaceAtStart?(pa: string, p: P): boolean\n /** Tab inside a paragraph (e.g. indent list); true when handled */\n tab?(sel: Sel, shift: boolean): boolean\n undo(): void\n redo(): void\n toggle?(key: 'b' | 'i' | 'u'): void\n shortcut?(e: KeyboardEvent): boolean\n /** style for text typed into an empty paragraph */\n defaultRun?(p: P): Partial<RRun> | undefined\n /** paste with formatting / files; true when handled */\n pasteRich?(sel: Sel, data: DataTransfer): boolean\n /** caret style for the next typed text (set after formatting a collapsed selection) */\n pendingStyle?(): Partial<RRun> | undefined\n clearPending?(): void\n onSelection?(sel: Sel | null): void\n}\n\nexport function ordered(host: RichHost, s: Sel): [Pos, Pos] {\n const c = host.cmp(s.a.pa, s.f.pa)\n if (c < 0 || (c === 0 && s.a.o <= s.f.o)) return [s.a, s.f]\n return [s.f, s.a]\n}\n\nconst caret = (p: Pos): Sel => ({ a: p, f: p })\n\n// ---------------------------------------------------------------- model operations\n\ninterface Plan<P extends RichPara> {\n pas: string[]\n paras: P[]\n at: Pos\n}\n\n/** Removes the selected content (in memory); null when the selection spans containers. */\nfunction planDelete<P extends RichPara>(host: RichHost<P>, sel: Sel): Plan<P> | null {\n const [s, e] = ordered(host, sel)\n if (s.pa === e.pa) {\n const p = host.para(s.pa)\n if (!p) return null\n return { pas: [s.pa], paras: [host.withRuns(p, deleteRange(p.runs, s.o, e.o))], at: s }\n }\n const list = host.span(s.pa, e.pa)\n if (!list) return null\n const first = host.para(list[0])!\n const last = host.para(list[list.length - 1])!\n const runs = normalize([...splitRuns(first.runs, s.o)[0], ...splitRuns(last.runs, e.o)[1]])\n return { pas: list, paras: [host.join(first, last, runs)], at: s }\n}\n\nexport function opDelete(host: RichHost, sel: Sel, opts?: ReplaceOpts) {\n const plan = planDelete(host, sel)\n if (!plan) return\n host.replace(plan.pas, plan.paras, caret(plan.at), opts)\n}\n\nfunction planAt(host: RichHost, sel: Sel): Plan<RichPara> | null {\n if (!collapsed(sel)) return planDelete(host, sel)\n const p = host.para(sel.a.pa)\n return p ? { pas: [sel.a.pa], paras: [p], at: sel.a } : null\n}\n\n/**\n * Inserts runs at the selection; `lines[i]` (i > 0) start new paragraphs.\n * `props[i]` can adjust the paragraph created for line i (e.g. heading style from pasted HTML).\n */\nexport function opInsertRuns(host: RichHost, sel: Sel, lines: RRun[][], opts: ReplaceOpts = {}, props?: ((p: RichPara) => RichPara)[]) {\n const plan = planAt(host, sel)\n if (!plan) return\n const p = plan.paras[0]\n const o = plan.at.o\n const [left, right] = splitRuns(p.runs, o)\n const fallback = runAt(p.runs, o) ?? (host.defaultRun?.(p) as RRun | undefined)\n const fill = (runs: RRun[]) => runs.map((r) => (r.t === 'text' && !r.s && fallback ? { ...fallback, ...r, s: fallback.s, src: fallback.src } : r))\n if (lines.length === 1) {\n const ins = fill(lines[0])\n const runs = normalize([...left, ...ins, ...right])\n host.replace(plan.pas, [host.withRuns(p, runs)], caret({ pa: plan.at.pa, o: o + plen(ins) }), { label: 'paste', ...opts })\n return\n }\n const out: RichPara[] = []\n let cur = host.withRuns(p, normalize([...left, ...fill(lines[0])]))\n if (props?.[0]) cur = props[0](cur)\n for (let i = 1; i < lines.length; i++) {\n const isLast = i === lines.length - 1\n const body = fill(lines[i])\n const [a, b0] = host.split(cur, cur.runs, normalize([...body, ...(isLast ? right : [])]), !isLast)\n out.push(a)\n cur = props?.[i] ? props[i](b0) : b0\n }\n out.push(cur)\n host.replace(plan.pas, out, caret({ pa: shiftPa(plan.at.pa, out.length - 1), o: plen(fill(lines[lines.length - 1])) }), { label: 'paste', ...opts })\n}\n\nexport function opInsert(host: RichHost, sel: Sel, text: string, opts?: ReplaceOpts) {\n const plan = planAt(host, sel)\n if (!plan) return\n const style = host.pendingStyle?.()\n host.clearPending?.()\n const p = plan.paras[0]\n const o = plan.at.o\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n')\n if (lines.length === 1 || opts?.label === 'linebreak') {\n const runs = insertText(p.runs, o, text, style, host.defaultRun?.(p))\n host.replace(plan.pas, [host.withRuns(p, runs)], caret({ pa: plan.at.pa, o: o + text.length }), { label: 'type', ...opts })\n return\n }\n const base = (style ? { ...(runAt(p.runs, o) ?? host.defaultRun?.(p) ?? {}), ...style } : undefined) as RRun | undefined\n opInsertRuns(host, sel, lines.map((l) => (l ? [{ ...(base ?? {}), t: 'text', text: l } as RRun] : [])), opts)\n}\n\nexport function opEnter(host: RichHost, sel: Sel) {\n const plan = collapsed(sel) ? (() => {\n const p = host.para(sel.a.pa)\n return p ? { pas: [sel.a.pa], paras: [p], at: sel.a } : null\n })() : planDelete(host, sel)\n if (!plan) return\n const p = plan.paras[0]\n const [l, r] = splitRuns(p.runs, plan.at.o)\n const [a, b] = host.split(p, l, r, plan.at.o >= plen(p.runs))\n host.replace(plan.pas, [a, b], caret({ pa: shiftPa(plan.at.pa, 1), o: 0 }), { label: 'enter' })\n}\n\nexport function opBackspace(host: RichHost, sel: Sel, word = false) {\n if (!collapsed(sel)) return opDelete(host, sel)\n const { pa, o } = sel.a\n const p = host.para(pa)\n if (!p) return\n if (o > 0) {\n const text = runsText(p.runs)\n let from = prevBoundary(text, o)\n if (word) {\n const m = /(\\S+\\s*|\\s+)$/.exec(text.slice(0, o))\n if (m) from = o - m[0].length\n }\n host.replace([pa], [host.withRuns(p, deleteRange(p.runs, from, o))], caret({ pa, o: from }), { label: 'delete' })\n return\n }\n if (host.backspaceAtStart?.(pa, p)) return\n const prev = host.prev(pa)\n const pp = prev ? host.para(prev) : undefined\n if (!prev || !pp) return\n const merged = host.join(pp, p, normalize([...pp.runs, ...p.runs]))\n host.replace([prev, pa], [merged], caret({ pa: prev, o: plen(pp.runs) }), { label: 'merge' })\n}\n\nexport function opDeleteForward(host: RichHost, sel: Sel, word = false) {\n if (!collapsed(sel)) return opDelete(host, sel)\n const { pa, o } = sel.a\n const p = host.para(pa)\n if (!p) return\n const len = plen(p.runs)\n if (o < len) {\n const text = runsText(p.runs)\n let to = nextBoundary(text, o)\n if (word) {\n const m = /^(\\s*\\S+|\\s+)/.exec(text.slice(o))\n if (m) to = o + m[0].length\n }\n host.replace([pa], [host.withRuns(p, deleteRange(p.runs, o, to))], caret({ pa, o }), { label: 'delete' })\n return\n }\n const next = host.next(pa)\n const np = next ? host.para(next) : undefined\n if (!next || !np) return\n const merged = host.join(p, np, normalize([...p.runs, ...np.runs]))\n host.replace([pa, next], [merged], caret({ pa, o }), { label: 'merge' })\n}\n\n// ---------------------------------------------------------------- DOM mapping\n\nfunction runSpan(n: Node | null, stop: Element): HTMLElement | null {\n const el = n && (n.nodeType === 1 ? (n as Element) : n.parentElement)\n const s = el?.closest('[data-o]') as HTMLElement | null\n return s && stop.contains(s) ? s : null\n}\n\nfunction spanEnd(s: HTMLElement): number {\n const o = Number(s.dataset.o)\n if (s.hasAttribute('data-obj')) return o + 1\n if (s.hasAttribute('data-empty')) return o\n return o + (s.textContent?.length ?? 0)\n}\n\nexport function posFromDom(root: HTMLElement, node: Node, offset: number): Pos | null {\n const start = node.nodeType === 1 ? (node as Element) : node.parentElement\n const pel = start?.closest('[data-pa]') as HTMLElement | null\n if (!pel || !root.contains(pel)) return null\n const pa = pel.dataset.pa!\n if (!runSpan(node, pel)) {\n // boundary between runs: end of the last run span before the point\n const r = document.createRange()\n r.setStart(node, offset)\n r.collapse(true)\n let o = 0\n for (const sp of Array.from(pel.querySelectorAll<HTMLElement>('[data-o]'))) {\n if (r.comparePoint(sp, sp.childNodes.length) < 0) o = spanEnd(sp)\n else break\n }\n return { pa, o }\n }\n const span = runSpan(node, pel)!\n const base = Number(span.dataset.o)\n if (span.hasAttribute('data-empty')) return { pa, o: base }\n if (span.hasAttribute('data-obj')) return { pa, o: offset > 0 || node !== span ? base + 1 : base }\n if (node.nodeType === 3) {\n let o = 0\n const walker = document.createTreeWalker(span, NodeFilter.SHOW_TEXT)\n for (let t = walker.nextNode(); t; t = walker.nextNode()) {\n if (t === node) return { pa, o: base + o + Math.min(offset, (t.textContent ?? '').length) }\n o += t.textContent?.length ?? 0\n }\n return { pa, o: base + o }\n }\n // offset is a child index inside the span\n let o = 0\n for (let i = 0; i < Math.min(offset, span.childNodes.length); i++) o += span.childNodes[i].textContent?.length ?? 0\n return { pa, o: base + o }\n}\n\nexport function domFromPos(root: HTMLElement, pos: Pos): [Node, number] | null {\n const pel = root.querySelector<HTMLElement>(`[data-pa=\"${pos.pa}\"]`)\n if (!pel) return null\n const spans = Array.from(pel.querySelectorAll<HTMLElement>('[data-o]'))\n if (!spans.length) return [pel, pel.childNodes.length]\n let pick: HTMLElement | undefined\n for (const s of spans) {\n const o = Number(s.dataset.o)\n const end = spanEnd(s)\n if (pos.o >= o && pos.o <= end) {\n pick = s\n // prefer the left run at boundaries unless it is an object\n if (pos.o < end || !s.hasAttribute('data-obj')) break\n }\n }\n pick ??= spans[spans.length - 1]\n const o = Number(pick.dataset.o)\n if (pick.hasAttribute('data-obj') || pick.hasAttribute('data-empty')) {\n const parent = pick.parentNode!\n const idx = Array.prototype.indexOf.call(parent.childNodes, pick)\n if (pick.hasAttribute('data-empty')) {\n const t = pick.firstChild\n return t ? [t, 0] : [parent, idx]\n }\n return [parent, pos.o > o ? idx + 1 : idx]\n }\n let rem = Math.max(0, pos.o - o)\n const walker = document.createTreeWalker(pick, NodeFilter.SHOW_TEXT)\n let last: Node | null = null\n for (let t = walker.nextNode(); t; t = walker.nextNode()) {\n const n = t.textContent?.length ?? 0\n if (rem <= n) return [t, rem]\n rem -= n\n last = t\n }\n return last ? [last, last.textContent?.length ?? 0] : [pick, 0]\n}\n\n/** Selection object that can see into the shadow root containing `node` (web component embeds). */\nexport function getSel(node: Node): Selection | null {\n const rn = node.getRootNode() as (ShadowRoot & { getSelection?: () => Selection | null }) | Document\n if (typeof ShadowRoot !== 'undefined' && rn instanceof ShadowRoot && typeof rn.getSelection === 'function') return rn.getSelection()\n return (node.ownerDocument ?? document).getSelection()\n}\n\ninterface SelPoints {\n anchorNode: Node | null\n anchorOffset: number\n focusNode: Node | null\n focusOffset: number\n}\n\nfunction selPoints(root: HTMLElement): SelPoints | null {\n const rn = root.getRootNode()\n const s = getSel(root)\n if (!s) return null\n if (typeof ShadowRoot !== 'undefined' && rn instanceof ShadowRoot && s.anchorNode && !root.contains(s.anchorNode)) {\n // standard path for shadow trees (Safari / Firefox / new Chrome)\n const gc = (s as Selection & { getComposedRanges?: (o: { shadowRoots: ShadowRoot[] }) => StaticRange[] }).getComposedRanges\n const r = gc?.call(s, { shadowRoots: [rn] })[0]\n if (r) return { anchorNode: r.startContainer, anchorOffset: r.startOffset, focusNode: r.endContainer, focusOffset: r.endOffset }\n }\n return s\n}\n\n// ---------------------------------------------------------------- controller\n\nexport class RichInput {\n private root: HTMLElement | null = null\n private composing: Sel | null = null\n private justComposed = ''\n private raf = 0\n lastSel: Sel | null = null\n\n constructor(private host: RichHost) {}\n\n attach(root: HTMLElement) {\n if (this.root === root) return\n this.detach()\n this.root = root\n root.addEventListener('beforeinput', this.onBeforeInput)\n root.addEventListener('compositionstart', this.onCompStart)\n root.addEventListener('compositionend', this.onCompEnd)\n root.addEventListener('keydown', this.onKeyDown)\n document.addEventListener('selectionchange', this.onSelChange)\n }\n\n detach() {\n const r = this.root\n if (!r) return\n r.removeEventListener('beforeinput', this.onBeforeInput)\n r.removeEventListener('compositionstart', this.onCompStart)\n r.removeEventListener('compositionend', this.onCompEnd)\n r.removeEventListener('keydown', this.onKeyDown)\n document.removeEventListener('selectionchange', this.onSelChange)\n cancelAnimationFrame(this.raf)\n this.root = null\n }\n\n get isComposing() {\n return !!this.composing\n }\n\n readSel(): Sel | null {\n const root = this.root\n const s = root ? selPoints(root) : null\n if (!root || !s || !s.anchorNode || !s.focusNode) return null\n if (!root.contains(s.anchorNode) || !root.contains(s.focusNode)) return null\n const a = posFromDom(root, s.anchorNode, s.anchorOffset)\n const f = posFromDom(root, s.focusNode, s.focusOffset)\n return a && f ? { a, f } : null\n }\n\n /** current selection, falling back to the last known one (e.g. after focusing a toolbar control) */\n sel(): Sel | null {\n return this.readSel() ?? this.lastSel\n }\n\n /** Applies a model selection to the DOM; false when its paragraph isn't rendered. */\n restore(sel: Sel | null, focus = true): boolean {\n const root = this.root\n if (!root || !sel) return false\n const a = domFromPos(root, sel.a)\n const f = domFromPos(root, sel.f)\n if (!a || !f) {\n this.lastSel = sel\n return false\n }\n const active = (root.getRootNode() as Document | ShadowRoot).activeElement\n if (focus && active !== root && !root.contains(active)) root.focus({ preventScroll: true })\n const s = getSel(root)\n try {\n s?.setBaseAndExtent(a[0], a[1], f[0], f[1])\n } catch {\n /* node vanished */\n }\n this.lastSel = sel\n return true\n }\n\n private rangeSel(r: StaticRange | Range | undefined): Sel | null {\n if (!r || !this.root) return null\n const a = posFromDom(this.root, r.startContainer, r.startOffset)\n const f = posFromDom(this.root, r.endContainer, r.endOffset)\n return a && f ? { a, f } : null\n }\n\n private onBeforeInput = (e: InputEvent) => {\n const t = e.inputType\n if (this.composing || t === 'insertCompositionText') return\n if (t === 'deleteCompositionText' || t === 'insertFromComposition') {\n if (e.cancelable) e.preventDefault()\n if (t === 'insertFromComposition' && e.data && e.data !== this.justComposed) {\n const sel = this.sel()\n if (sel) opInsert(this.host, sel, e.data, { remount: true })\n }\n this.justComposed = ''\n return\n }\n e.preventDefault()\n const target = this.rangeSel(e.getTargetRanges?.()[0])\n const sel = this.readSel() ?? this.lastSel\n if (!sel) return\n const h = this.host\n switch (t) {\n case 'insertText':\n case 'insertReplacementText': {\n const text = e.data ?? e.dataTransfer?.getData('text/plain') ?? ''\n opInsert(h, t === 'insertReplacementText' && target ? target : sel, text)\n break\n }\n case 'insertParagraph':\n opEnter(h, sel)\n break\n case 'insertLineBreak':\n opInsert(h, sel, '\\n', { label: 'linebreak' })\n break\n case 'insertFromPaste':\n case 'insertFromDrop':\n case 'insertFromYank': {\n if (e.dataTransfer && h.pasteRich?.(t === 'insertFromDrop' && target ? target : sel, e.dataTransfer)) break\n const text = e.dataTransfer?.getData('text/plain') ?? e.data ?? ''\n if (text) opInsert(h, sel, text)\n break\n }\n case 'deleteContentBackward':\n opBackspace(h, sel)\n break\n case 'deleteWordBackward':\n opBackspace(h, sel, true)\n break\n case 'deleteContentForward':\n opDeleteForward(h, sel)\n break\n case 'deleteWordForward':\n opDeleteForward(h, sel, true)\n break\n case 'deleteSoftLineBackward':\n case 'deleteHardLineBackward':\n case 'deleteSoftLineForward':\n case 'deleteHardLineForward':\n case 'deleteByCut':\n case 'deleteByDrag':\n case 'deleteContent':\n case 'deleteEntireSoftLine':\n if (!collapsed(sel)) opDelete(h, sel)\n else if (target && !collapsed(target)) opDelete(h, target)\n break\n case 'historyUndo':\n h.undo()\n break\n case 'historyRedo':\n h.redo()\n break\n case 'formatBold':\n h.toggle?.('b')\n break\n case 'formatItalic':\n h.toggle?.('i')\n break\n case 'formatUnderline':\n h.toggle?.('u')\n break\n }\n }\n\n private onCompStart = () => {\n this.composing = this.readSel() ?? this.lastSel\n }\n\n private onCompEnd = (e: CompositionEvent) => {\n const sel = this.composing\n this.composing = null\n if (!sel) return\n this.justComposed = e.data ?? ''\n // always rebuild the paragraph: the IME mutated its DOM\n if (e.data) opInsert(this.host, sel, e.data, { remount: true })\n else opInsert(this.host, sel, '', { remount: true })\n setTimeout(() => (this.justComposed = ''), 0)\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n if (e.isComposing || this.composing) return\n const mod = e.metaKey || e.ctrlKey\n const k = e.key.toLowerCase()\n if (this.host.shortcut?.(e)) {\n e.preventDefault()\n return\n }\n if (mod && !e.altKey) {\n if (k === 'z') {\n e.preventDefault()\n if (e.shiftKey) this.host.redo()\n else this.host.undo()\n return\n }\n if (k === 'y') {\n e.preventDefault()\n this.host.redo()\n return\n }\n if (k === 'b' || k === 'i' || k === 'u') {\n e.preventDefault()\n this.host.toggle?.(k)\n return\n }\n }\n if (e.key === 'Tab' && !mod) {\n e.preventDefault()\n const sel = this.sel()\n if (!sel) return\n if (!this.host.tab?.(sel, e.shiftKey) && !e.shiftKey) opInsert(this.host, sel, '\\t')\n }\n }\n\n private onSelChange = () => {\n if (this.raf) return\n this.raf = requestAnimationFrame(() => {\n this.raf = 0\n const s = this.readSel()\n if (s) this.lastSel = s\n this.host.onSelection?.(s)\n })\n }\n}\n","/**\n * DOCX collaboration: operations on the main-thread paragraph model (DocxEditor),\n * which mirrors every change to the worker itself.\n *\n * - `text` splice inside one paragraph (typing, deleting, inline formatting) — merges\n * character-wise with concurrent edits of the same paragraph\n * - `paras` contiguous paragraphs replaced (Enter, join, paste, paragraph formatting…) — last writer wins\n * - `blocks` top-level blocks replaced (tables)\n * - `image` / `link` package resources, shared by key (relationship ids differ per client)\n * - `call` other document-level worker calls (e.g. adding a built-in style), run in hub order\n */\nimport type { Block, Inline, Paragraph, StyleInfo } from '../core/docx/types'\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport type { DocState, DocxCommit, DocxEditor } from '../react/docx/DocxEditor'\nimport { domFromPos } from '../react/edit/input'\nimport { plen, runsText, splitRuns, type Pos, type RRun, type Sel } from '../react/edit/rich'\nimport { watchHost } from './hosts'\nimport type { Adapter, ApplyResult } from './session'\n\nexport interface DocxHost {\n editor: DocxEditor\n st: DocState\n}\n\n/** top-level block identity: paragraph id, or table (regenerated id / original body item) */\nexport type BKey = { p: number } | { tid?: number; item?: number }\n\nexport type DocxOp =\n | { t: 'text'; pid: number; at: number; del: number; ins: Inline[] }\n | { t: 'paras'; before: number[]; next: Paragraph[] }\n | { t: 'blocks'; before: BKey[]; prev: BKey | null; next: Block[] }\n | { t: 'image'; key: string; bytes: Uint8Array; ext: string }\n | { t: 'link'; key: string; url: string }\n | { t: 'call'; method: string; args: unknown[] }\n\n/** a point in the document that survives structural edits: paragraph id, page-break part, offset */\nexport interface DPos {\n pid: number\n k: number\n o: number\n}\n\nexport interface DocxPresence {\n k: 'docx'\n a: DPos\n f: DPos\n}\n\n/** how to undo one model change; `paras` with an empty `next` re-inserts `before` next to a neighbour */\ntype Step =\n | { t: 'paras'; before: Paragraph[]; next: Paragraph[]; prev?: { pid: number; k: number }; after?: { pid: number; k: number } }\n | { t: 'blocks'; before: Block[]; next: Block[]; prev: BKey | null }\n/** the steps of an op, undone in reverse order */\ntype Undo = Step[] | null\n\n/** worker methods that only read */\nconst READS = new Set<keyof Methods>(['open', 'part', 'docx.start', 'save', 'dirty'])\n\nconst bkey = (b: Block): BKey | null => (b.t === 'p' ? (b.pid !== undefined ? { p: b.pid } : null) : b.t === 'tbl' ? { tid: b.tid, item: b.item } : null)\n\nfunction matches(b: Block | undefined, k: BKey): boolean {\n if (!b) return false\n if ('p' in k) return b.t === 'p' && b.pid === k.p\n return b.t === 'tbl' && ((k.tid !== undefined && b.tid === k.tid) || (k.item !== undefined && b.item === k.item))\n}\n\nconst uniq = (xs: number[]) => [...new Set(xs)]\n\n/** paragraph ids inside blocks (table cells included) */\nfunction pidsOf(blocks: Block[], out: number[] = []): number[] {\n for (const b of blocks) {\n if (b.t === 'p' && b.pid !== undefined) out.push(b.pid)\n else if (b.t === 'tbl') for (const r of b.rows) for (const c of r.cells) pidsOf(c.blocks, out)\n }\n return out\n}\n\n// ---------------------------------------------------------------- run diff / splice\n\nfunction atomKey(r: Inline): string {\n if (r.t !== 'text') return JSON.stringify(r)\n const { text: _t, ...rest } = r\n return JSON.stringify(rest)\n}\n\n/** single replaced range between two run lists (common prefix / suffix, formatting included) */\nexport function diffRuns(a: Inline[], b: Inline[]): { at: number; del: number; ins: Inline[] } | null {\n // one entry per UTF-16 unit (what offsets count), formatting included\n const units = (runs: Inline[]) => {\n const out: string[] = []\n for (const r of runs) {\n const k = atomKey(r)\n if (r.t === 'text') for (let i = 0; i < r.text.length; i++) out.push(k + '\\u0000' + r.text[i])\n else out.push(k)\n }\n return out\n }\n const x = units(a)\n const y = units(b)\n let pre = 0\n while (pre < x.length && pre < y.length && x[pre] === y[pre]) pre++\n let suf = 0\n while (suf < x.length - pre && suf < y.length - pre && x[x.length - 1 - suf] === y[y.length - 1 - suf]) suf++\n if (pre === x.length && pre === y.length) return null\n const [, rest] = splitRuns(b as RRun[], pre)\n const [mid] = splitRuns(rest, y.length - pre - suf)\n return { at: pre, del: x.length - pre - suf, ins: mid as Inline[] }\n}\n\nexport function spliceRuns(runs: Inline[], at: number, del: number, ins: Inline[]): Inline[] {\n const n = plen(runs as RRun[])\n const a = Math.max(0, Math.min(at, n))\n const d = Math.max(0, Math.min(del, n - a))\n const [left, rest] = splitRuns(runs as RRun[], a)\n const [, right] = splitRuns(rest, d)\n return [...(left as Inline[]), ...ins, ...(right as Inline[])]\n}\n\n/** `x` (a position in the text before `prior` replaced [at, at+del) by `ins` chars) after it */\nfunction mapPos(x: number, at: number, del: number, ins: number, end: boolean): number {\n if (x < at || (x === at && (del > 0 || end))) return x\n if (x >= at + del) return x - del + ins\n return at + ins\n}\n\n/** maps an offset through an edit of the text, using the common prefix / suffix */\nfunction mapByDiff(o: number, before: string, after: string): number {\n if (before === after) return o\n let pre = 0\n while (pre < before.length && pre < after.length && before[pre] === after[pre]) pre++\n let suf = 0\n while (suf < before.length - pre && suf < after.length - pre && before[before.length - 1 - suf] === after[after.length - 1 - suf]) suf++\n if (o <= pre) return o\n if (o >= before.length - suf) return after.length - (before.length - o)\n return after.length - suf\n}\n\nconst sameProps = (a: Paragraph, b: Paragraph) =>\n a.pid === b.pid &&\n a.from === b.from &&\n a.sid === b.sid &&\n !!a.pb === !!b.pb &&\n a.keepSect === b.keepSect &&\n JSON.stringify(a.pd ?? null) === JSON.stringify(b.pd ?? null) &&\n JSON.stringify(a.ps) === JSON.stringify(b.ps) &&\n JSON.stringify(a.orig ?? null) === JSON.stringify(b.orig ?? null)\n\n// ---------------------------------------------------------------- adapter\n\nexport class DocxCollab implements Adapter<DocxOp> {\n private host?: DocxHost\n /** > 0 while this adapter drives the editor (its commits are not local ops) */\n private suppress = 0\n /** resource key → this client's value ({ rid, path } for images, link key for links) */\n private res = new Map<string, { rid: string; path: string } | string>()\n /** this client's rid / link key → resource key */\n private resKey = new Map<string, string>()\n private results = new WeakMap<DocxOp, unknown>()\n private snap: { a: DPos; f: DPos; text: Map<string, string>; focused: boolean } | null = null\n /** the model was changed since the last `settled` */\n private touchedModel = false\n private site = 0\n private counter = 0\n private offHost?: () => void\n /** sends presence (set by the session owner) */\n onPresence?: (p: DocxPresence) => void\n private lastPresence = ''\n private raf = 0\n\n /** registers a local op the editor already applied */\n push?: (op: DocxOp, undo: Undo) => void\n /** shares a local op through the session (applied by `apply`) */\n submit?: (op: DocxOp) => Promise<unknown>\n\n constructor(private client: DocumentClient) {}\n\n // ---------------------------------------------------------------- wiring\n\n ready(): Promise<void> {\n return new Promise((resolve) => {\n this.offHost = watchHost<DocxHost>(this.client, 'docx', (h) => {\n if (this.host?.editor === h.editor) return\n if (this.host) this.host.editor.onCommit = undefined\n this.host = h\n h.editor.onCommit = (c) => this.onCommit(c)\n this.allocPids()\n resolve()\n })\n if (typeof document !== 'undefined') document.addEventListener('selectionchange', this.onSel)\n })\n }\n\n /** gives this client its own range of paragraph / table ids */\n setSite(site: number) {\n this.site = site\n this.allocPids()\n }\n\n private allocPids() {\n const ed = this.host?.editor\n if (!ed || !this.site) return\n const base = 2_000_000_000 + this.site * 10_000_000\n if (ed.nextPid < base || ed.nextPid >= base + 10_000_000) ed.nextPid = base\n }\n\n dispose() {\n this.offHost?.()\n if (this.host) this.host.editor.onCommit = undefined\n if (typeof document !== 'undefined') document.removeEventListener('selectionchange', this.onSel)\n if (this.raf) cancelAnimationFrame(this.raf)\n }\n\n captures(method: keyof Methods): boolean {\n // paragraph / table writes mirror model changes (captured by DocxEditor.onCommit)\n return !this.suppress && !READS.has(method) && method !== 'docx.edit' && method !== 'docx.table' && method.startsWith('docx.')\n }\n\n /** client.call interceptor: package resources and document-level calls become ops */\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined {\n if (!this.submit || !this.captures(method)) return undefined\n switch (method) {\n case 'docx.image': {\n const bytes = new Uint8Array((args[0] as ArrayBuffer).slice(0))\n return this.submit({ t: 'image', key: this.key(), bytes, ext: args[1] as string })\n }\n case 'docx.link':\n return this.submit({ t: 'link', key: this.key(), url: args[0] as string })\n }\n return this.submit({ t: 'call', method, args })\n }\n\n private key() {\n return `${this.site}:${++this.counter}:${Math.random().toString(36).slice(2, 7)}`\n }\n\n // ---------------------------------------------------------------- model helpers\n\n private get st() {\n return this.host!.st\n }\n\n private get ed() {\n return this.host!.editor\n }\n\n /** every block of paragraph `pid` (page-break parts) with its address */\n private locate(pid: number): { list: Block[]; index: number; pa: string; p: Paragraph }[] {\n const out: { list: Block[]; index: number; pa: string; p: Paragraph }[] = []\n this.st.blocks.forEach((b, bi) => {\n if (b.t === 'p') {\n if (b.pid === pid) out.push({ list: this.st.blocks, index: bi, pa: String(bi), p: b })\n } else if (b.t === 'tbl')\n b.rows.forEach((r, ri) =>\n r.cells.forEach((cell, ci) =>\n cell.blocks.forEach((x, pi) => {\n if (x.t === 'p' && x.pid === pid) out.push({ list: cell.blocks, index: pi, pa: `${bi}.${ri}.${ci}.${pi}`, p: x })\n }),\n ),\n )\n })\n return out\n }\n\n private topIndex(k: BKey): number {\n return this.st.blocks.findIndex((b) => matches(b, k))\n }\n\n /** contiguous paragraph addresses from the first block of pids[0], following `pids` */\n private region(pids: number[]): string[] | null {\n const want = new Set(pids)\n for (const pid of pids) {\n const loc = this.locate(pid)[0]\n if (!loc) continue\n const pas: string[] = []\n for (let i = loc.index; i < loc.list.length; i++) {\n const b = loc.list[i]\n if (b.t !== 'p' || b.pid === undefined || !want.has(b.pid)) break\n pas.push(loc.pa.replace(/\\d+$/, String(i)))\n }\n return pas\n }\n return null\n }\n\n // ---------------------------------------------------------------- resources (ids differ per client)\n\n private remap<T extends Block | Inline>(x: T): T {\n if (x.t === 'img') {\n const ck = (x as { ck?: string }).ck\n const r = ck ? this.res.get(ck) : undefined\n return r && typeof r === 'object' ? { ...x, rid: r.rid, target: r.path } : x\n }\n if (x.t === 'text') {\n const ck = (x as { lck?: string }).lck\n const r = ck ? this.res.get(ck) : undefined\n return typeof r === 'string' ? { ...x, lk: r } : x\n }\n if (x.t === 'p') return { ...x, runs: x.runs.map((r) => this.remap(r)) }\n if (x.t === 'tbl') return { ...x, rows: x.rows.map((r) => ({ ...r, cells: r.cells.map((c) => ({ ...c, blocks: c.blocks.map((b) => this.remap(b)) })) })) }\n return x\n }\n\n /** tags runs referring to resources this client created, so others can map them */\n private tag<T extends Block | Inline>(x: T): T {\n if (x.t === 'img' && x.rid && this.resKey.has(x.rid) && !(x as { ck?: string }).ck) return { ...x, ck: this.resKey.get(x.rid) }\n if (x.t === 'text' && x.lk && this.resKey.has(x.lk) && !(x as { lck?: string }).lck) return { ...x, lck: this.resKey.get(x.lk) }\n if (x.t === 'p') return { ...x, runs: x.runs.map((r) => this.tag(r)), caret: undefined }\n if (x.t === 'tbl') return { ...x, rows: x.rows.map((r) => ({ ...r, cells: r.cells.map((c) => ({ ...c, blocks: c.blocks.map((b) => this.tag(b)) })) })) }\n return x\n }\n\n private async fetchRes(op: DocxOp) {\n if (op.t === 'image' && !this.res.has(op.key)) {\n const r = await this.client.direct('docx.image', op.bytes.slice().buffer as ArrayBuffer, op.ext)\n this.res.set(op.key, r)\n this.resKey.set(r.rid, op.key)\n } else if (op.t === 'link' && !this.res.has(op.key)) {\n const lk = await this.client.direct('docx.link', op.url)\n this.res.set(op.key, lk)\n this.resKey.set(lk, op.key)\n } else if (op.t === 'call' && !this.results.has(op)) {\n const call = this.client.direct as (m: string, ...a: unknown[]) => Promise<unknown>\n this.results.set(op, await call(op.method, ...op.args))\n }\n }\n\n // ---------------------------------------------------------------- local capture\n\n private onCommit(c: DocxCommit) {\n if (this.suppress || !this.push) return\n if (c.kind === 'paras') {\n const b = c.before\n const n = c.next\n if (b.length === 1 && n.length === 1 && b[0].pid !== undefined && sameProps(b[0], n[0]) && this.locate(b[0].pid).length === 1) {\n const d = diffRuns(b[0].runs, n[0].runs)\n if (!d) return\n this.push({ t: 'text', pid: b[0].pid, at: d.at, del: d.del, ins: d.ins.map((r) => this.tag(r)) }, [{ t: 'paras', before: b, next: n }])\n return\n }\n this.push({ t: 'paras', before: b.map((p) => p.pid!), next: n.map((p) => this.tag(p)) }, [{ t: 'paras', before: b, next: n }])\n return\n }\n const prev = c.bi > 0 ? bkey(this.st.blocks[c.bi - 1]) : null\n this.push(\n { t: 'blocks', before: c.before.map(bkey).filter((k): k is BKey => !!k), prev, next: c.next.map((b) => this.tag(b)) },\n [{ t: 'blocks', before: c.before, next: c.next, prev }],\n )\n }\n\n // ---------------------------------------------------------------- adapter\n\n transform(op: DocxOp, prior: DocxOp): DocxOp | null {\n if (op.t !== 'text') return op\n if (prior.t === 'text' && prior.pid === op.pid) {\n const pins = plen(prior.ins as RRun[])\n const at = mapPos(op.at, prior.at, prior.del, pins, false)\n const end = op.del ? Math.max(at, mapPos(op.at + op.del, prior.at, prior.del, pins, true)) : at\n return at === op.at && end - at === op.del ? op : { ...op, at, del: end - at }\n }\n if (prior.t === 'paras' && (prior.before.includes(op.pid) || prior.next.some((p) => p.pid === op.pid))) {\n // the paragraph was rewritten: keep the splice (clamped) while it still exists\n return prior.next.some((p) => p.pid === op.pid) ? op : null\n }\n if (prior.t === 'blocks' && prior.before.some((k) => 'p' in k && k.p === op.pid) && !pidsOf(prior.next).includes(op.pid)) return null\n return op\n }\n\n private touched(op: DocxOp): string[] {\n switch (op.t) {\n case 'text':\n return ['p' + op.pid]\n case 'paras':\n return [...op.before, ...op.next.map((p) => p.pid!)].map((p) => 'p' + p)\n case 'blocks': {\n const keys = [...op.before, ...(op.prev ? [op.prev] : []), ...op.next.map(bkey).filter((k): k is BKey => !!k)]\n const out = keys.map((k) => ('p' in k ? 'p' + k.p : 't' + (k.item ?? 'n' + k.tid)))\n for (const pid of pidsOf(op.next)) out.push('p' + pid)\n return out\n }\n default:\n return []\n }\n }\n\n conflicts(pending: DocxOp[], remote: DocxOp[]): boolean {\n const mine = new Set(pending.flatMap((o) => this.touched(o)))\n return remote.some((o) => this.touched(o).some((k) => mine.has(k)))\n }\n\n pessimistic(op: DocxOp): boolean {\n return op.t === 'call'\n }\n\n async prepare(ops: DocxOp[]) {\n // never rebuild paragraphs under an active IME composition\n while (this.host?.editor.input.isComposing) await new Promise((r) => setTimeout(r, 50))\n for (const op of ops) await this.fetchRes(op)\n this.capture()\n }\n\n async apply(op: DocxOp, kind: 'local' | 'replay' | 'remote'): Promise<ApplyResult> {\n switch (op.t) {\n case 'image':\n case 'link':\n await this.fetchRes(op)\n return { result: this.res.get(op.key) }\n case 'call': {\n await this.fetchRes(op)\n const result = this.results.get(op)\n if (op.method === 'docx.style' && result && typeof result === 'object' && this.host) {\n const styles = (result as { styles: StyleInfo[] }).styles\n this.ed.styles = styles\n this.ed.onStyles?.(styles)\n }\n return { result }\n }\n }\n if (!this.host) throw new Error('Document editor not ready')\n if (kind === 'remote' || kind === 'replay') this.capture()\n this.touchedModel = true\n this.suppress++\n try {\n return { undo: this.run(op) }\n } finally {\n this.suppress--\n }\n }\n\n /** applies a model op through the editor; returns how to revert it */\n private run(op: DocxOp): Undo {\n const ed = this.ed\n if (op.t === 'text') {\n const locs = this.locate(op.pid)\n if (locs.length !== 1 || !ed.para(locs[0].pa)) return null\n const p = locs[0].p\n const next: Paragraph = { ...p, runs: spliceRuns(p.runs, op.at, op.del, op.ins.map((r) => this.remap(r))), edited: true }\n ed.replace([locs[0].pa], [next], this.sel(), { history: false, label: 'collab' })\n return [{ t: 'paras', before: [p], next: [next] }]\n }\n if (op.t === 'paras') {\n const next = op.next.map((p) => this.remap(p))\n const nextPids = new Set(next.map((p) => p.pid!))\n const pas = this.region(op.before)\n if (!pas || !pas.length) return null\n const steps: Step[] = []\n // the same paragraphs elsewhere (moved by a concurrent edit) go away first\n const inRegion = new Set(pas.map((pa) => (ed.para(pa)?.pid ?? -1)))\n for (const pid of uniq([...op.before, ...nextPids])) {\n if (inRegion.has(pid)) continue\n for (const loc of this.locate(pid).reverse()) {\n if (!ed.para(loc.pa)) continue\n const nb = (i: number) => {\n const b = loc.list[i]\n return b?.t === 'p' && b.pid !== undefined ? { pid: b.pid, k: this.locate(b.pid).findIndex((x) => x.list === loc.list && x.index === i) } : undefined\n }\n const step: Step = { t: 'paras', before: [loc.p], next: [], prev: nb(loc.index - 1), after: nb(loc.index + 1) }\n ed.replace([loc.pa], [], this.sel(), { history: false, label: 'collab' })\n steps.push(step)\n }\n }\n const region = this.region(op.before)\n if (!region?.length) return steps\n const before = region.map((pa) => ed.para(pa)!).filter(Boolean)\n if (before.length !== region.length) return steps\n ed.replace(region, next, this.sel(), { history: false, label: 'collab' })\n steps.push({ t: 'paras', before, next })\n return steps\n }\n if (op.t === 'blocks') {\n let next = op.next.map((b) => this.remap(b))\n let bi: number\n let count = 0\n if (op.before.length) {\n bi = this.topIndex(op.before[0])\n if (bi < 0) {\n // first block gone: try the others\n const k = op.before.find((x) => this.topIndex(x) >= 0)\n if (!k) return null\n bi = this.topIndex(k)\n }\n while (bi + count < this.st.blocks.length && op.before.some((k) => matches(this.st.blocks[bi + count], k))) count++\n } else {\n bi = op.prev ? this.topIndex(op.prev) + 1 : 0\n if (op.prev && bi === 0) return null\n }\n const before = this.st.blocks.slice(bi, bi + count)\n // paragraphs around a table keep their current text: the op is about the blocks, not their content\n const cur = new Map(before.flatMap((b) => (b.t === 'p' && b.pid !== undefined ? [[b.pid, b] as const] : [])))\n next = next.map((b) => (b.t === 'p' && b.pid !== undefined && cur.has(b.pid) ? cur.get(b.pid)! : b))\n ed.replaceBlocks(bi, count, next, null, false)\n return [{ t: 'blocks', before, next, prev: bi > 0 ? bkey(this.st.blocks[bi - 1]) : null }]\n }\n return null\n }\n\n revert(undo: unknown) {\n const u = undo as Undo\n if (!u || !this.host) return\n this.capture()\n this.touchedModel = true\n this.suppress++\n try {\n for (let i = u.length - 1; i >= 0; i--) this.undoStep(u[i])\n } finally {\n this.suppress--\n }\n }\n\n private undoStep(u: Step) {\n const ed = this.ed\n if (u.t === 'paras') {\n if (!u.next.length) {\n // re-insert next to the neighbour it had\n const at = (n: { pid: number; k: number } | undefined) => (n ? this.locate(n.pid)[n.k] : undefined)\n const prev = at(u.prev)\n if (prev && ed.para(prev.pa)) return ed.replace([prev.pa], [prev.p, ...u.before], this.sel(), { history: false, label: 'collab' })\n const after = at(u.after)\n if (after && ed.para(after.pa)) ed.replace([after.pa], [...u.before, after.p], this.sel(), { history: false, label: 'collab' })\n return\n }\n const first = this.locate(u.next[0].pid!)[0]\n if (!first) return\n const pas = u.next.map((_, i) => first.pa.replace(/\\d+$/, String(first.index + i)))\n if (pas.some((pa, i) => ed.para(pa)?.pid !== u.next[i].pid)) return\n ed.replace(pas, u.before, this.sel(), { history: false, label: 'collab' })\n return\n }\n const k = u.next.length ? bkey(u.next[0]) : null\n const bi = k ? this.topIndex(k) : u.prev ? this.topIndex(u.prev) + 1 : 0\n if (bi < 0) return\n const cur = new Map(this.st.blocks.slice(bi, bi + u.next.length).flatMap((b) => (b.t === 'p' && b.pid !== undefined ? [[b.pid, b] as const] : [])))\n ed.replaceBlocks(bi, u.next.length, u.before.map((b) => (b.t === 'p' && b.pid !== undefined && cur.has(b.pid) ? cur.get(b.pid)! : b)), null, false)\n }\n\n // ---------------------------------------------------------------- selection across remote edits\n\n private toD(pos: Pos): DPos | null {\n const p = this.ed.para(pos.pa)\n if (!p || p.pid === undefined) return null\n const locs = this.locate(p.pid)\n return { pid: p.pid, k: Math.max(0, locs.findIndex((l) => l.pa === pos.pa)), o: pos.o }\n }\n\n private fromD(d: DPos): Pos | null {\n const locs = this.locate(d.pid)\n const l = locs[Math.min(d.k, locs.length - 1)]\n return l ? { pa: l.pa, o: Math.min(d.o, plen(l.p.runs as RRun[])) } : null\n }\n\n /** remembers the selection (by paragraph id + text) before the model changes */\n private capture() {\n if (this.snap || !this.host) return\n const focused = !!this.ed.input.readSel()\n const sel = this.ed.input.sel()\n const a = sel && this.toD(sel.a)\n const f = sel && this.toD(sel.f)\n if (!a || !f) return\n const text = new Map<string, string>()\n for (const d of [a, f]) {\n const l = this.locate(d.pid)[d.k]\n if (l) text.set(`${d.pid}:${d.k}`, runsText(l.p.runs as RRun[]))\n }\n this.snap = { a, f, text, focused }\n }\n\n /** the remembered selection in the current model */\n private sel(): Sel {\n const s = this.snap\n const fallback = { pa: '0', o: 0 }\n if (!s) return this.ed.input.lastSel ?? { a: fallback, f: fallback }\n const map = (d: DPos): Pos => {\n const l = this.locate(d.pid)[d.k] ?? this.locate(d.pid)[0]\n if (!l) return this.ed.input.lastSel?.f ?? fallback\n const was = s.text.get(`${d.pid}:${d.k}`)\n const now = runsText(l.p.runs as RRun[])\n return { pa: l.pa, o: was === undefined ? Math.min(d.o, now.length) : mapByDiff(d.o, was, now) }\n }\n return { a: map(s.a), f: map(s.f) }\n }\n\n settled() {\n const s = this.snap\n const touched = this.touchedModel\n this.touchedModel = false\n if (!this.host) return\n if (!s) {\n // nobody was editing: don't let the collaborators' edits focus the document\n if (touched) this.ed.pendingSel = null\n return\n }\n const sel = this.sel()\n this.snap = null\n // keep the caret where the user was; never steal focus from other controls\n this.ed.pendingSel = s.focused ? sel : null\n if (!s.focused) this.ed.input.lastSel = sel\n }\n\n // ---------------------------------------------------------------- presence\n\n private onSel = () => {\n if (this.raf || !this.host) return\n this.raf = requestAnimationFrame(() => {\n this.raf = 0\n const sel = this.host && this.ed.input.readSel()\n if (!sel) return\n const a = this.toD(sel.a)\n const f = this.toD(sel.f)\n if (!a || !f) return\n const p: DocxPresence = { k: 'docx', a, f }\n const key = JSON.stringify(p)\n if (key === this.lastPresence) return\n this.lastPresence = key\n this.onPresence?.(p)\n })\n }\n\n /** screen rectangles of a collaborator's selection (caret = last rect) inside `root` */\n rects(root: HTMLElement, p: DocxPresence): { caret: DOMRect | null; sel: DOMRect[] } {\n if (!this.host) return { caret: null, sel: [] }\n const pages = root.querySelector<HTMLElement>('.de-pages')\n const a = this.fromD(p.a)\n const f = this.fromD(p.f)\n if (!pages || !a || !f) return { caret: null, sel: [] }\n const fd = domFromPos(pages, f)\n let caret: DOMRect | null = null\n if (fd) {\n const r = document.createRange()\n try {\n r.setStart(fd[0], fd[1])\n r.collapse(true)\n caret = r.getClientRects()[0] ?? (fd[0].nodeType === 1 ? (fd[0] as Element).getBoundingClientRect() : r.getBoundingClientRect())\n } catch {\n caret = null\n }\n }\n const sel: DOMRect[] = []\n const ad = domFromPos(pages, a)\n if (ad && fd && (a.pa !== f.pa || a.o !== f.o)) {\n const r = document.createRange()\n try {\n const forward = this.ed.cmp(a.pa, f.pa) < 0 || (a.pa === f.pa && a.o < f.o)\n if (forward) {\n r.setStart(ad[0], ad[1])\n r.setEnd(fd[0], fd[1])\n } else {\n r.setStart(fd[0], fd[1])\n r.setEnd(ad[0], ad[1])\n }\n for (const x of Array.from(r.getClientRects())) if (x.width > 0.5) sel.push(x)\n } catch {\n /* nodes detached */\n }\n }\n return { caret, sel }\n }\n}\n","/**\n * Client side of the collaboration protocol (format-agnostic).\n *\n * Model: the hub totally orders batches of operations. Every client applies\n * the log in that order, each batch first transformed (deterministically)\n * against the concurrent batches sequenced before it — so all clients reach\n * the same state. Local operations are applied optimistically; when a remote\n * batch arrives while local ones are still unconfirmed, the client rebases:\n * reverts its pending ops, applies the remote batch, then replays the pending\n * ops transformed against it. Convergence therefore only needs `transform` and\n * `apply` to be deterministic (not the classic OT TP1/TP2 properties).\n *\n * Operations an adapter flags as `pessimistic` (structural ones that are hard\n * to rebase, like deleting a sheet) are not applied locally until the hub has\n * sequenced them.\n */\nimport type { Batch, HubMsg, PeerInfo, UserInfo } from './protocol'\nimport type { Transport } from './transport'\n\nexport interface ApplyResult {\n /** whatever `revert` needs to undo the op exactly (local ops only) */\n undo?: unknown\n /** returned to the caller of `submit` */\n result?: unknown\n}\n\nexport type ApplyKind = 'local' | 'replay' | 'remote'\n\nexport interface Adapter<Op> {\n /** resolves when the document can take operations (e.g. fully loaded) */\n ready?(): Promise<void>\n /**\n * `op` adjusted to apply after `prior`, a concurrent op of another site that was sequenced first.\n * Must be deterministic; return `op` itself when unaffected, null to drop it.\n */\n transform(op: Op, prior: Op): Op | null\n /**\n * Async work before ops get applied (fetching resources, waiting for IME composition to end…),\n * so that `revert` / `apply` during a rebase can run without yielding to user input.\n */\n prepare?(ops: Op[]): Promise<void> | void\n /** applies `op` to the local document */\n apply(op: Op, kind: ApplyKind): Promise<ApplyResult> | ApplyResult\n /** exactly undoes a pending local op (given its `undo` token) */\n revert(undo: unknown): Promise<void> | void\n /** op must be sequenced by the hub before it is applied */\n pessimistic?(op: Op): boolean\n /** whether remote ops interact with pending local ones (default: true → rebase) */\n conflicts?(pending: Op[], remote: Op[]): boolean\n /** after a remote batch / rebase was applied (views refresh here) */\n settled?(): void\n}\n\nexport type CollabStatus = 'connecting' | 'syncing' | 'live' | 'offline' | 'error'\n\ninterface Item<Op> {\n op: Op | null\n applied: boolean\n undo?: unknown\n /** pending `submit` of a pessimistic op */\n done?: (v: unknown) => void\n}\n\nexport interface SessionEvents {\n status: CollabStatus\n peers: PeerInfo[]\n /** remote changes were applied */\n change: void\n error: Error\n}\n\nexport interface SessionOptions {\n room: string\n user: UserInfo\n /** canonical batches kept to transform late batches (default 5000) */\n logWindow?: number\n}\n\nconst notNull = <T>(x: T | null): x is T => x !== null\n\nexport class CollabSession<Op = unknown> {\n site = 0\n /** last applied sequence number */\n rev = 0\n status: CollabStatus = 'connecting'\n error?: string\n readonly peers = new Map<number, PeerInfo>()\n private log: { seq: number; site: number; ops: Op[] }[] = []\n private inflight: { id: string; base: number; items: Item<Op>[] } | null = null\n private buffer: Item<Op>[] = []\n private queue: Promise<void>\n private joined = false\n private online = false\n private counter = 0\n private listeners = new Map<keyof SessionEvents, Set<(d: never) => void>>()\n private presence: unknown\n private presenceTimer?: ReturnType<typeof setTimeout>\n private presenceAt = 0\n private closed = false\n\n constructor(\n private transport: Transport,\n private adapter: Adapter<Op>,\n private opts: SessionOptions,\n ) {\n this.queue = Promise.resolve(adapter.ready?.()).catch((e) => this.fail((e as Error).message))\n transport.onMessage = (m) => this.enqueue(() => this.onMessage(m))\n transport.onStatus = (s) => {\n if (s === 'open') {\n this.online = true\n transport.send({ t: 'hello', room: opts.room, user: opts.user, have: this.joined ? this.rev : undefined, site: this.joined ? this.site : undefined })\n } else if (s === 'closed') {\n this.online = false\n this.peers.clear()\n this.emit('peers', [])\n if (this.status !== 'error') this.setStatus(this.joined ? 'offline' : 'connecting')\n }\n }\n transport.connect()\n }\n\n // ---------------------------------------------------------------- public API\n\n /** local ops not yet confirmed by the hub */\n get pending(): number {\n return (this.inflight?.items.length ?? 0) + this.buffer.length\n }\n\n /** a unique id for ops created by this client */\n nextId(): string {\n return `${this.site}.${++this.counter}.${Math.random().toString(36).slice(2, 6)}`\n }\n\n /** applies a local op (through the adapter) and shares it; resolves with the adapter's result */\n submit(op: Op): Promise<unknown> {\n return new Promise((resolve, reject) =>\n this.enqueue(async () => {\n if (this.status === 'error') return reject(new Error(this.error ?? 'Collaboration stopped'))\n if (this.adapter.pessimistic?.(op)) {\n this.buffer.push({ op, applied: false, done: resolve })\n } else {\n let res: ApplyResult\n try {\n res = await this.adapter.apply(op, 'local')\n } catch (e) {\n return reject(e)\n }\n this.buffer.push({ op, applied: true, undo: res.undo })\n resolve(res.result)\n }\n this.flush()\n }),\n )\n }\n\n /** registers a local op the caller already applied (synchronously); `undo` reverts it */\n push(op: Op, undo: unknown) {\n this.buffer.push({ op, applied: true, undo })\n this.enqueue(async () => this.flush())\n }\n\n setPresence(data: unknown) {\n this.presence = data\n if (this.presenceTimer) return\n const wait = Math.max(0, 80 - (Date.now() - this.presenceAt))\n this.presenceTimer = setTimeout(() => {\n this.presenceTimer = undefined\n this.presenceAt = Date.now()\n if (this.online && this.joined) this.transport.send({ t: 'presence', data: this.presence })\n }, wait)\n }\n\n on<K extends keyof SessionEvents>(event: K, fn: (d: SessionEvents[K]) => void): () => void {\n let set = this.listeners.get(event)\n if (!set) this.listeners.set(event, (set = new Set()))\n set.add(fn as (d: never) => void)\n return () => set!.delete(fn as (d: never) => void)\n }\n\n /** resolves once everything queued so far was processed */\n idle(): Promise<void> {\n return this.queue\n }\n\n close() {\n this.closed = true\n clearTimeout(this.presenceTimer)\n this.transport.close()\n this.listeners.clear()\n }\n\n // ---------------------------------------------------------------- internals\n\n private emit<K extends keyof SessionEvents>(event: K, data: SessionEvents[K]) {\n for (const fn of this.listeners.get(event) ?? []) (fn as (d: SessionEvents[K]) => void)(data)\n }\n\n private setStatus(s: CollabStatus) {\n if (this.status === s) return\n this.status = s\n this.emit('status', s)\n }\n\n private fail(message: string) {\n this.error = message\n this.setStatus('error')\n this.emit('error', new Error(message))\n }\n\n private enqueue(fn: () => Promise<void> | void) {\n this.queue = this.queue.then(fn).catch((e) => {\n console.error('[office-engine collab]', e)\n this.emit('error', e as Error)\n })\n }\n\n private async onMessage(m: HubMsg) {\n if (this.closed || this.status === 'error') return\n switch (m.t) {\n case 'welcome': {\n if (m.reset) return this.fail('The shared document history was reset; reopen the document')\n const first = !this.joined\n this.site = m.site\n this.joined = true\n if (first) this.setStatus('syncing')\n this.peers.clear()\n for (const p of m.peers) this.peers.set(p.site, p)\n this.emit('peers', [...this.peers.values()])\n for (const b of m.log) await this.onBatch(b)\n if (this.inflight) {\n // not sequenced before the connection dropped: its ops were rebased onto everything up to\n // `rev` meanwhile, so that is their base now (the hub ignores it if the first send arrived)\n this.inflight.base = this.rev\n this.transport.send({ t: 'ops', id: this.inflight.id, base: this.rev, ops: this.inflight.items.map((i) => i.op).filter(notNull) })\n }\n this.flush()\n if (this.presence !== undefined) this.transport.send({ t: 'presence', data: this.presence })\n this.setStatus('live')\n return\n }\n case 'batch':\n return this.onBatch(m.b)\n case 'presence': {\n const p = this.peers.get(m.site)\n if (p) {\n this.peers.set(m.site, { ...p, presence: m.data })\n this.emit('peers', [...this.peers.values()])\n }\n return\n }\n case 'join':\n this.peers.set(m.peer.site, m.peer)\n this.emit('peers', [...this.peers.values()])\n return\n case 'leave':\n this.peers.delete(m.site)\n this.emit('peers', [...this.peers.values()])\n return\n case 'error':\n return this.fail(m.message)\n }\n }\n\n private async onBatch(b: Batch) {\n if (b.seq <= this.rev) return\n if (b.seq !== this.rev + 1) return this.fail(`Missed operations (${this.rev + 1}…${b.seq - 1})`)\n if (this.inflight && b.id === this.inflight.id) await this.ack(b)\n else {\n const ops = this.canonical(b)\n if (ops === null) return\n await this.remote(ops)\n this.log.push({ seq: b.seq, site: b.site, ops })\n }\n this.rev = b.seq\n const max = this.opts.logWindow ?? 5000\n if (this.log.length > max) this.log.splice(0, this.log.length - max)\n this.flush()\n this.adapter.settled?.()\n this.emit('change', undefined)\n }\n\n /** batch ops transformed against the concurrent batches sequenced before it */\n private canonical(b: Batch): Op[] | null {\n let ops = (b.ops as Op[]).map((o) => o as Op | null)\n if (b.base < b.seq - 1 && (this.log[0]?.seq ?? Infinity) > b.base + 1 && this.rev > b.base) {\n this.fail('Operation is too old to merge; reopen the document')\n return null\n }\n for (const e of this.log) {\n if (e.seq <= b.base || e.site === b.site) continue\n for (const p of e.ops) ops = ops.map((o) => (o === null ? null : this.adapter.transform(o, p)))\n }\n return ops.filter(notNull)\n }\n\n private async revertAll(items: Item<Op>[]) {\n for (let i = items.length - 1; i >= 0; i--) {\n const it = items[i]\n if (!it.applied) continue\n try {\n await this.adapter.revert(it.undo)\n } catch (e) {\n console.error('[office-engine collab] revert failed', e)\n }\n it.applied = false\n it.undo = undefined\n }\n }\n\n private async replay(it: Item<Op>, kind: ApplyKind) {\n if (!it.op) return\n try {\n const res = await this.adapter.apply(it.op, kind)\n it.undo = res.undo\n it.applied = true\n if (it.done) {\n it.done(res.result)\n it.done = undefined\n }\n } catch (e) {\n // keep the op in the batch: other clients run it too and fail the same way\n console.error('[office-engine collab] replay failed', e)\n }\n }\n\n private async remote(ops: Op[]) {\n await this.adapter.prepare?.(ops)\n const pending = [...(this.inflight?.items ?? []), ...this.buffer]\n if (!pending.length) {\n for (const op of ops) await this.applyRemote(op)\n return\n }\n const next = pending.map((it) => {\n let o = it.op\n for (const r of ops) if (o !== null) o = this.adapter.transform(o, r)\n return o\n })\n const applied = pending.filter((it) => it.applied && it.op).map((it) => it.op as Op)\n const rebase = next.some((o, i) => o !== pending[i].op) || (applied.length > 0 && (this.adapter.conflicts?.(applied, ops) ?? true))\n if (rebase) await this.revertAll(pending)\n for (const op of ops) await this.applyRemote(op)\n pending.forEach((it, i) => (it.op = next[i]))\n if (!rebase) return\n for (const it of pending) {\n if (!it.op || (this.adapter.pessimistic?.(it.op) && !it.applied && it.done)) continue\n await this.replay(it, 'replay')\n }\n }\n\n private async applyRemote(op: Op) {\n try {\n await this.adapter.apply(op, 'remote')\n } catch (e) {\n console.error('[office-engine collab] remote op failed', e, op)\n this.emit('error', e as Error)\n }\n }\n\n /** our in-flight batch was sequenced */\n private async ack(b: Batch) {\n const items = this.inflight!.items\n this.inflight = null\n const hole = items.findIndex((it) => it.op && !it.applied)\n if (hole >= 0) {\n // pessimistic ops run now, in order: later local ops are replayed after them\n const tail = [...items.slice(hole), ...this.buffer]\n await this.adapter.prepare?.(items.slice(hole).filter((it) => it.op && !it.applied).map((it) => it.op as Op))\n await this.revertAll(tail)\n for (const it of tail) {\n const waiting = !items.includes(it) && it.op && this.adapter.pessimistic?.(it.op) && it.done\n if (!waiting) await this.replay(it, it.done ? 'local' : 'replay')\n }\n }\n for (const it of items) if (it.done) it.done(null)\n this.log.push({ seq: b.seq, site: b.site, ops: items.map((i) => i.op).filter(notNull) })\n }\n\n private flush() {\n if (this.inflight || !this.buffer.length || !this.online || !this.joined || this.status === 'error') return\n const items = this.buffer\n this.buffer = []\n const id = `${this.site}-${Date.now().toString(36)}-${++this.counter}`\n this.inflight = { id, base: this.rev, items }\n this.transport.send({ t: 'ops', id, base: this.rev, ops: items.map((i) => i.op).filter(notNull) })\n }\n}\n","/** JSON encoding that survives binary payloads (images inserted while collaborating). */\n\nconst B64 = '$b64'\n\nfunction toB64(u8: Uint8Array): string {\n let s = ''\n for (let i = 0; i < u8.length; i += 0x8000) s += String.fromCharCode(...u8.subarray(i, i + 0x8000))\n return btoa(s)\n}\n\nfunction fromB64(s: string): Uint8Array {\n const bin = atob(s)\n const out = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i)\n return out\n}\n\nexport function encode(value: unknown): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Uint8Array) return { [B64]: toB64(v) }\n if (v instanceof ArrayBuffer) return { [B64]: toB64(new Uint8Array(v)) }\n return v\n })\n}\n\nexport function decode<T = unknown>(text: string): T {\n return JSON.parse(text, (_k, v) => (v && typeof v === 'object' && typeof v[B64] === 'string' && Object.keys(v).length === 1 ? fromB64(v[B64]) : v)) as T\n}\n","import { decode, encode } from './codec'\nimport type { CollabHub, HubConnection } from './hub'\nimport type { ClientMsg, HubMsg } from './protocol'\n\nexport type TransportStatus = 'connecting' | 'open' | 'closed'\n\n/** Message pipe to a hub. Implement it to plug collaboration into your own backend. */\nexport interface Transport {\n connect(): void\n send(msg: ClientMsg): void\n close(): void\n onMessage?: (msg: HubMsg) => void\n onStatus?: (s: TransportStatus) => void\n}\n\n/** WebSocket transport with automatic reconnection (exponential backoff). */\nexport class WebSocketTransport implements Transport {\n onMessage?: (msg: HubMsg) => void\n onStatus?: (s: TransportStatus) => void\n private ws?: WebSocket\n private closed = false\n private retry = 0\n private timer?: ReturnType<typeof setTimeout>\n\n constructor(\n private url: string,\n private protocols?: string | string[],\n ) {}\n\n connect() {\n this.closed = false\n this.open()\n }\n\n private open() {\n if (this.closed) return\n this.onStatus?.('connecting')\n const ws = (this.ws = new WebSocket(this.url, this.protocols))\n ws.onopen = () => {\n this.retry = 0\n this.onStatus?.('open')\n }\n ws.onmessage = (e) => {\n if (typeof e.data === 'string') this.onMessage?.(decode<HubMsg>(e.data))\n }\n ws.onclose = () => {\n if (this.ws !== ws) return\n this.ws = undefined\n this.onStatus?.('closed')\n if (this.closed) return\n const delay = Math.min(10_000, 300 * 2 ** this.retry++) * (0.75 + Math.random() * 0.5)\n this.timer = setTimeout(() => this.open(), delay)\n }\n ws.onerror = () => ws.close()\n }\n\n send(msg: ClientMsg) {\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.send(encode(msg))\n }\n\n close() {\n this.closed = true\n clearTimeout(this.timer)\n const ws = this.ws\n this.ws = undefined\n ws?.close()\n this.onStatus?.('closed')\n }\n}\n\n/**\n * In-process transport to a `CollabHub` (tests, demos with several viewers on one page).\n * Messages go through the JSON codec and are delivered asynchronously, optionally with latency.\n */\nexport class MemoryTransport implements Transport {\n onMessage?: (msg: HubMsg) => void\n onStatus?: (s: TransportStatus) => void\n private conn?: HubConnection\n private up = Promise.resolve()\n private down = Promise.resolve()\n\n constructor(\n private hub: CollabHub,\n private latency: number | (() => number) = 0,\n ) {}\n\n private delay() {\n const ms = typeof this.latency === 'function' ? this.latency() : this.latency\n return new Promise<void>((r) => (ms > 0 ? setTimeout(r, ms) : queueMicrotask(r)))\n }\n\n connect() {\n if (this.conn) return\n this.onStatus?.('connecting')\n const conn = (this.conn = this.hub.connect((m) => {\n const wire = encode(m)\n // FIFO delivery, even with random latency\n this.down = this.down\n .then(() => this.delay())\n .then(() => {\n if (this.conn === conn) this.onMessage?.(decode<HubMsg>(wire))\n })\n }))\n queueMicrotask(() => this.onStatus?.('open'))\n }\n\n send(msg: ClientMsg) {\n const conn = this.conn\n if (!conn) return\n const wire = encode(msg)\n this.up = this.up\n .then(() => this.delay())\n .then(() => {\n if (this.conn === conn) conn.receive(decode<ClientMsg>(wire))\n })\n }\n\n /** simulates a dropped connection (messages in flight are lost) */\n drop() {\n const c = this.conn\n this.conn = undefined\n c?.close()\n this.onStatus?.('closed')\n }\n\n close() {\n this.drop()\n }\n}\n","/**\n * XLSX collaboration (main thread): turns the view's worker calls into shared operations.\n * Cell edits, formatting, layout, fill / sort / replace are applied optimistically; inserting /\n * deleting rows or columns and sheet-list changes wait for the hub's order. Undo / redo only\n * touch the local user's own operations (shared as `revert` operations).\n */\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport type { BookOp, Range, SheetOp, WorkbookMeta } from '../core/xlsx/types'\nimport { onLocal } from './hosts'\nimport type { Adapter, ApplyResult } from './session'\nimport { conflictsX, isStructural, transformX, type PBookOp, type XOp } from './xlsx-ops'\n\nconst CAPTURED = new Set<keyof Methods>(['xlsx.set', 'xlsx.format', 'xlsx.sheetOp', 'xlsx.replace', 'xlsx.bookOp', 'xlsx.undo', 'xlsx.redo'])\n\ntype UndoEntry = { kind: 'op'; id: string } | { kind: 'inverse'; sheet: string; undo: SheetOp; redo: SheetOp }\n\nexport interface XlsxPresence {\n k: 'xlsx'\n /** sheet part path */\n sheet: string\n /** selected range and active cell */\n range: Range\n ar: number\n ac: number\n}\n\n/** what XlsxView publishes about the local selection */\nexport interface XlsxLocalSel {\n sheet: number\n range: Range\n ar: number\n ac: number\n}\n\nexport class XlsxCollab implements Adapter<XOp> {\n submit?: (op: XOp) => Promise<unknown>\n nextId?: () => string\n onPresence?: (p: XlsxPresence) => void\n private undoStack: UndoEntry[] = []\n private redoStack: UndoEntry[] = []\n private offLocal: () => void\n\n constructor(private client: DocumentClient) {\n this.offLocal = onLocal(client, (d) => {\n const s = d as XlsxLocalSel\n const sheet = this.path(s.sheet)\n if (sheet) this.onPresence?.({ k: 'xlsx', sheet, range: s.range, ar: s.ar, ac: s.ac })\n })\n }\n\n dispose() {\n this.offLocal()\n }\n\n private get meta() {\n return this.client.info.xlsx as WorkbookMeta\n }\n\n private path(i: number): string {\n return this.meta.sheets[i]?.path ?? ''\n }\n\n private id() {\n return this.nextId!()\n }\n\n captures(method: keyof Methods): boolean {\n return CAPTURED.has(method)\n }\n\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined {\n if (!this.submit) return undefined\n const a = args as never[]\n switch (method) {\n case 'xlsx.set':\n return this.local({ t: 'set', id: this.id(), sheet: this.path(a[0]), cells: a[1] })\n case 'xlsx.format':\n return this.local({ t: 'fmt', id: this.id(), sheet: this.path(a[0]), range: a[1], patch: a[2] })\n case 'xlsx.sheetOp':\n return this.local({ t: 'sheet', id: this.id(), sheet: this.path(a[0]), op: a[1] })\n case 'xlsx.replace':\n return this.local({ t: 'replace', id: this.id(), sheet: this.path(a[0]), query: a[1], by: a[2], opts: a[3], at: a[4] })\n case 'xlsx.bookOp':\n return this.local({ t: 'book', id: this.id(), op: this.pbook(a[0]) })\n case 'xlsx.undo':\n return this.history(this.undoStack, this.redoStack, 'prev')\n case 'xlsx.redo':\n return this.history(this.redoStack, this.undoStack, 'next')\n }\n return undefined\n }\n\n private pbook(b: BookOp): PBookOp {\n switch (b.op) {\n case 'add':\n return { op: 'add', name: b.name, after: b.after !== undefined ? this.path(b.after) : undefined }\n case 'rename':\n return { op: 'rename', path: this.path(b.index), name: b.name }\n case 'delete':\n return { op: 'delete', path: this.path(b.index) }\n case 'move':\n return { op: 'move', path: this.path(b.from), to: b.to }\n }\n }\n\n private local(op: XOp): Promise<unknown> {\n if (op.t === 'sheet' && (op.op.op === 'insertRows' || op.op.op === 'insertCols')) {\n const del: SheetOp = { op: op.op.op === 'insertRows' ? 'deleteRows' : 'deleteCols', at: op.op.at, n: op.op.n }\n this.undoStack.push({ kind: 'inverse', sheet: op.sheet, undo: del, redo: op.op })\n } else if (!isStructural(op)) this.undoStack.push({ kind: 'op', id: op.id })\n if (this.undoStack.length > 200) this.undoStack.shift()\n this.redoStack = []\n return this.submit!(op)\n }\n\n private history(from: UndoEntry[], to: UndoEntry[], which: 'prev' | 'next'): Promise<unknown> {\n const e = from.pop()\n if (!e) return Promise.resolve(null)\n to.push(e)\n if (e.kind === 'op') return this.submit!({ t: 'revert', id: this.id(), target: e.id, which })\n return this.submit!({ t: 'sheet', id: this.id(), sheet: e.sheet, op: which === 'prev' ? e.undo : e.redo })\n }\n\n // ---------------------------------------------------------------- adapter\n\n transform(op: XOp, prior: XOp): XOp | null {\n return transformX(op, prior)\n }\n\n conflicts(pending: XOp[], remote: XOp[]): boolean {\n return conflictsX(pending, remote)\n }\n\n pessimistic(op: XOp): boolean {\n return isStructural(op)\n }\n\n async apply(op: XOp, kind: 'local' | 'replay' | 'remote'): Promise<ApplyResult> {\n const { res, rec } = await this.client.direct('collab.xlsx.apply', op)\n if (isStructural(op)) {\n // the worker dropped its records: older entries can't be reverted any more\n const keep = (e: UndoEntry) => e.kind === 'inverse' && kind === 'local'\n this.undoStack = this.undoStack.filter(keep)\n this.redoStack = this.redoStack.filter(keep)\n }\n if (kind !== 'local' && res) this.client.notify('collab:xlsx', res)\n return { result: res, undo: rec }\n }\n\n async revert(undo: unknown) {\n if (typeof undo !== 'number') return\n const res = await this.client.direct('collab.xlsx.revert', undo)\n if (res) this.client.notify('collab:xlsx', res)\n }\n}\n\n","/** PPTX collaboration operations. Slides are addressed by part path (indexes move), shapes by element id. */\nimport type { PParaSpec, ShapeOp } from '../core/pptx/types'\n\nexport type PSlideOp =\n | { op: 'add'; after: string | null; layout?: 'title' | 'content' | 'blank' }\n | { op: 'duplicate'; path: string }\n | { op: 'delete'; path: string }\n | { op: 'move'; path: string; to: number }\n | { op: 'hide'; path: string; hidden: boolean }\n\nexport type POp =\n /** whole text of shape `sid` (last writer wins per shape) */\n | { t: 'text'; id: string; slide: string; sid: number; paras: PParaSpec[] }\n /** shape edits; an inserted picture refers to its image by `key` */\n | { t: 'shapes'; id: string; slide: string; ops: (ShapeOp & { key?: string })[] }\n | { t: 'image'; id: string; key: string; slide: string; bytes: Uint8Array; ext: string }\n | { t: 'slides'; id: string; op: PSlideOp }\n /** puts the slide touched by op `target` back to its state before (`prev`) / after (`next`) it */\n | { t: 'revert'; id: string; target: string; which: 'prev' | 'next' }\n\nexport function transformP(op: POp, prior: POp): POp | null {\n if (prior.t === 'slides' && prior.op.op === 'delete' && 'slide' in op && op.slide === prior.op.path) return null\n return op\n}\n\n/** whether remote ops interact with pending local ones (→ rebase) */\nexport function conflictsP(pending: POp[], remote: POp[]): boolean {\n if (remote.some((o) => o.t === 'slides' || o.t === 'revert') || pending.some((o) => o.t === 'revert')) return true\n const mine = new Set(pending.flatMap((o) => ('slide' in o && o.t !== 'image' ? [o.slide] : [])))\n return remote.some((o) => 'slide' in o && o.t !== 'image' && mine.has(o.slide))\n}\n","/**\n * PPTX collaboration (main thread). Text and shape edits are applied optimistically (last writer\n * wins per shape); slide list changes wait for the hub's order. Undo / redo restore the slide\n * touched by the local user's own operation.\n */\nimport type { PresentationMeta, ShapeOp, SlideOp } from '../core/pptx/types'\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport { getHost, onLocal } from './hosts'\nimport { conflictsP, transformP, type POp, type PSlideOp } from './pptx-ops'\nimport type { PptxCollabResult } from './pptx-worker'\nimport type { Adapter, ApplyResult } from './session'\n\nconst CAPTURED = new Set<keyof Methods>(['pptx.setText', 'pptx.shapes', 'pptx.slides', 'pptx.image', 'pptx.undo'])\n\nexport interface PptxPresence {\n k: 'pptx'\n /** slide part path */\n slide: string\n /** selected element id */\n top?: number\n}\n\n/** what PptxView publishes about the local selection */\nexport interface PptxLocalSel {\n slide: number\n top?: number\n}\n\n/** PptxView registers this so remote slide-list changes can close its text editing first */\nexport interface PptxHost {\n endEditing(): void\n}\n\nexport class PptxCollab implements Adapter<POp> {\n submit?: (op: POp) => Promise<unknown>\n nextId?: () => string\n onPresence?: (p: PptxPresence) => void\n private undoStack: string[] = []\n private redoStack: string[] = []\n /** this client's image relationship id → image key */\n private ridKey = new Map<string, string>()\n private offLocal: () => void\n\n constructor(private client: DocumentClient) {\n this.offLocal = onLocal(client, (d) => {\n const s = d as PptxLocalSel\n const slide = this.path(s.slide)\n if (slide) this.onPresence?.({ k: 'pptx', slide, top: s.top })\n })\n }\n\n dispose() {\n this.offLocal()\n }\n\n private get meta() {\n return this.client.info.pptx as PresentationMeta\n }\n\n private path(i: number): string {\n return this.meta.slides[i]?.path ?? ''\n }\n\n private id() {\n return this.nextId!()\n }\n\n captures(method: keyof Methods): boolean {\n return CAPTURED.has(method)\n }\n\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined {\n if (!this.submit) return undefined\n const a = args as never[]\n switch (method) {\n case 'pptx.setText':\n return this.local({ t: 'text', id: this.id(), slide: this.path(a[0]), sid: a[1], paras: a[2] }).then((r) => (r as PptxCollabResult).model)\n case 'pptx.shapes': {\n const ops = (a[1] as ShapeOp[]).map((o) => (o.op === 'insert' && o.rid && this.ridKey.has(o.rid) ? { ...o, rid: undefined, key: this.ridKey.get(o.rid) } : o))\n return this.local({ t: 'shapes', id: this.id(), slide: this.path(a[0]), ops }).then((r) => (r as PptxCollabResult).model)\n }\n case 'pptx.image': {\n const key = `${this.id()}`\n const bytes = new Uint8Array((a[1] as ArrayBuffer).slice(0))\n return this.submit({ t: 'image', id: key, key, slide: this.path(a[0]), bytes, ext: a[2] }).then((r) => {\n const rid = (r as PptxCollabResult).rid\n if (rid) this.ridKey.set(rid, key)\n return rid\n })\n }\n case 'pptx.slides':\n return this.submit({ t: 'slides', id: this.id(), op: this.pslide(a[0]) }).then((r) => (r as PptxCollabResult | null)?.meta ?? this.meta)\n case 'pptx.undo':\n return this.history(a[0] ? this.redoStack : this.undoStack, a[0] ? this.undoStack : this.redoStack, a[0] ? 'next' : 'prev')\n }\n return undefined\n }\n\n private pslide(o: SlideOp): PSlideOp {\n switch (o.op) {\n case 'add':\n return { op: 'add', after: o.after >= 0 ? this.path(o.after) || null : null, layout: o.layout }\n case 'duplicate':\n return { op: 'duplicate', path: this.path(o.index) }\n case 'delete':\n return { op: 'delete', path: this.path(o.index) }\n case 'move':\n return { op: 'move', path: this.path(o.from), to: o.to }\n case 'hide':\n return { op: 'hide', path: this.path(o.index), hidden: o.hidden }\n }\n }\n\n private local(op: POp): Promise<unknown> {\n this.undoStack.push(op.id)\n if (this.undoStack.length > 200) this.undoStack.shift()\n this.redoStack = []\n return this.submit!(op)\n }\n\n private async history(from: string[], to: string[], which: 'prev' | 'next') {\n const target = from.pop()\n if (!target) return null\n to.push(target)\n const r = (await this.submit!({ t: 'revert', id: this.id(), target, which })) as PptxCollabResult\n return r.model && r.slide !== undefined ? { index: r.slide, model: r.model } : null\n }\n\n // ---------------------------------------------------------------- adapter\n\n transform(op: POp, prior: POp): POp | null {\n return transformP(op, prior)\n }\n\n conflicts(pending: POp[], remote: POp[]): boolean {\n return conflictsP(pending, remote)\n }\n\n pessimistic(op: POp): boolean {\n return op.t === 'slides'\n }\n\n prepare(ops: POp[]) {\n // slide indexes are about to move: let the text editor commit with the current ones first\n if (ops.some((o) => o.t === 'slides')) getHost<PptxHost>(this.client, 'pptx')?.endEditing()\n }\n\n async apply(op: POp, kind: 'local' | 'replay' | 'remote'): Promise<ApplyResult> {\n const { res, rec } = await this.client.direct('collab.pptx.apply', op)\n if (op.t === 'slides') {\n this.undoStack = []\n this.redoStack = []\n if (res.meta) Object.assign(this.meta, res.meta)\n }\n if (kind !== 'local') this.client.notify('collab:pptx', res)\n return { result: res, undo: rec }\n }\n\n async revert(undo: unknown) {\n if (typeof undo !== 'number') return\n this.client.notify('collab:pptx', await this.client.direct('collab.pptx.revert', undo))\n }\n}\n","/**\n * Wire protocol between collaboration clients and a hub (sequencer).\n *\n * The hub is format-agnostic: it assigns a global sequence number to every\n * batch of operations, stores the log and relays presence. All transformation\n * and conflict handling happens in the clients, deterministically, so every\n * client that applies the log ends up with the same document.\n */\n\nexport interface UserInfo {\n /** stable user id (optional, for the host app) */\n id?: string\n name: string\n /** CSS color; the hub assigns one when missing */\n color?: string\n}\n\nexport interface PeerInfo extends UserInfo {\n /** per-room connection id, assigned by the hub */\n site: number\n color: string\n presence?: unknown\n}\n\n/** A batch of operations as stored in the hub log. */\nexport interface Batch<Op = unknown> {\n seq: number\n site: number\n /** last seq the author had applied when creating the batch */\n base: number\n /** client generated id (dedupes resends after reconnects) */\n id: string\n ops: Op[]\n}\n\nexport type ClientMsg =\n /** join a room; `have`/`site` on reconnect */\n | { t: 'hello'; room: string; user: UserInfo; have?: number; site?: number }\n | { t: 'ops'; id: string; base: number; ops: unknown[] }\n | { t: 'presence'; data: unknown }\n\nexport type HubMsg =\n /** `log` holds every batch with seq > `from`; `reset` when the hub lost history newer than `have` */\n | { t: 'welcome'; site: number; seq: number; from: number; log: Batch[]; peers: PeerInfo[]; reset?: boolean }\n | { t: 'batch'; b: Batch }\n | { t: 'presence'; site: number; data: unknown }\n | { t: 'join'; peer: PeerInfo }\n | { t: 'leave'; site: number }\n | { t: 'error'; message: string }\n\nexport const PEER_COLORS = ['#1a73e8', '#e8710a', '#188038', '#d93025', '#9334e6', '#c5221f', '#007b83', '#b06000', '#3f51b5', '#e52592']\n","/**\n * Runtime-agnostic collaboration hub: one sequencer + op log per room.\n * Wire it to any socket server (see scripts/collab-server.ts for Bun):\n *\n * const conn = hub.connect((msg) => socket.send(encode(msg)))\n * socket.onmessage = (e) => conn.receive(decode(e.data))\n * socket.onclose = () => conn.close()\n */\nimport { PEER_COLORS, type Batch, type ClientMsg, type HubMsg, type PeerInfo } from './protocol'\n\nexport interface RoomState {\n id: string\n seq: number\n log: Batch[]\n ids: Set<string>\n peers: Map<number, { info: PeerInfo; send: (m: HubMsg) => void }>\n nextSite: number\n}\n\nexport interface HubOptions {\n /** called for every sequenced batch (persist it to rebuild rooms after a restart) */\n onBatch?: (room: string, batch: Batch) => void\n /** rebuilds a room log (e.g. from storage) the first time the room is used */\n loadLog?: (room: string) => Batch[] | undefined\n /** called when the last peer left a room */\n onIdle?: (room: string) => void\n}\n\nexport interface HubConnection {\n receive(msg: ClientMsg): void\n close(): void\n}\n\nexport class CollabHub {\n readonly rooms = new Map<string, RoomState>()\n\n constructor(private opts: HubOptions = {}) {}\n\n room(id: string): RoomState {\n let r = this.rooms.get(id)\n if (!r) {\n const log = this.opts.loadLog?.(id) ?? []\n r = { id, seq: log.length ? log[log.length - 1].seq : 0, log, ids: new Set(log.map((b) => b.id)), peers: new Map(), nextSite: 1 }\n for (const b of log) r.nextSite = Math.max(r.nextSite, b.site + 1)\n this.rooms.set(id, r)\n }\n return r\n }\n\n /** forgets a room (its log and peers) — e.g. when a new base file is uploaded */\n reset(id: string) {\n const r = this.rooms.get(id)\n if (r) for (const p of r.peers.values()) p.send({ t: 'error', message: 'Room was reset' })\n this.rooms.delete(id)\n }\n\n connect(send: (m: HubMsg) => void): HubConnection {\n let room: RoomState | undefined\n let site = 0\n const broadcast = (m: HubMsg, except?: number) => {\n if (!room) return\n for (const [s, p] of room.peers) if (s !== except) p.send(m)\n }\n return {\n receive: (msg) => {\n if (msg.t === 'hello') {\n if (room) return\n room = this.room(msg.room)\n site = msg.site && msg.site < room.nextSite && !room.peers.has(msg.site) ? msg.site : room.nextSite++\n const used = new Set([...room.peers.values()].map((p) => p.info.color))\n const color = msg.user.color || PEER_COLORS.find((c) => !used.has(c)) || PEER_COLORS[site % PEER_COLORS.length]\n const info: PeerInfo = { ...msg.user, site, color }\n const reset = msg.have !== undefined && msg.have > room.seq\n const from = msg.have !== undefined && !reset ? msg.have : 0\n send({\n t: 'welcome', site, seq: room.seq, from, reset,\n log: room.log.filter((b) => b.seq > from),\n peers: [...room.peers.values()].map((p) => p.info),\n })\n room.peers.set(site, { info, send })\n broadcast({ t: 'join', peer: info }, site)\n return\n }\n if (!room) return send({ t: 'error', message: 'Not joined' })\n if (msg.t === 'ops') {\n if (room.ids.has(msg.id)) return\n const b: Batch = { seq: ++room.seq, site, base: Math.min(msg.base, room.seq - 1), id: msg.id, ops: msg.ops }\n room.log.push(b)\n room.ids.add(b.id)\n this.opts.onBatch?.(room.id, b)\n broadcast({ t: 'batch', b })\n } else if (msg.t === 'presence') {\n const p = room.peers.get(site)\n if (p) p.info.presence = msg.data\n broadcast({ t: 'presence', site, data: msg.data }, site)\n }\n },\n close: () => {\n if (!room || !room.peers.has(site)) return\n room.peers.delete(site)\n broadcast({ t: 'leave', site })\n if (!room.peers.size) this.opts.onIdle?.(room.id)\n },\n }\n }\n}\n","/**\n * Real-time collaboration for office-engine documents.\n *\n * const collab = startCollab(client, { transport: 'wss://host/collab', room: 'doc-42', user: { name: 'Ann' } })\n * collab.on('status', console.log)\n * collab.close()\n *\n * Every participant must open the same base file; the hub keeps the operation log on top of it.\n * DocViewer does all of this through its `collab` prop.\n */\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport { DocxCollab, type DocxPresence } from './docx'\nimport { setPeers, type PeerView } from './hosts'\nimport type { PeerInfo, UserInfo } from './protocol'\nimport { CollabSession, type Adapter, type CollabStatus, type SessionEvents } from './session'\nimport { WebSocketTransport, type Transport } from './transport'\nimport { XlsxCollab } from './xlsx'\nimport { PptxCollab } from './pptx'\n\nexport interface CollabOptions {\n /** hub connection: a WebSocket URL or any Transport */\n transport: Transport | string\n /** shared document id */\n room: string\n user: UserInfo\n}\n\nexport interface Collab {\n readonly session: CollabSession<unknown>\n readonly status: CollabStatus\n /** collaborators currently connected (without the local user) */\n readonly peers: PeerInfo[]\n /** local operations not yet confirmed by the hub */\n readonly pending: number\n on<K extends keyof SessionEvents>(event: K, fn: (d: SessionEvents[K]) => void): () => void\n /** screen rectangles of a collaborator's DOCX selection (for custom overlays) */\n rects(root: HTMLElement, peer: PeerView): { caret: DOMRect | null; sel: DOMRect[] } | null\n close(): void\n}\n\ninterface AnyAdapter extends Adapter<unknown> {\n /** whether `method` changes the document (and becomes a shared operation) */\n captures(method: keyof Methods): boolean\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined\n submit?: (op: never) => Promise<unknown>\n push?: (op: never, undo: never) => void\n nextId?: () => string\n onPresence?: (p: never) => void\n setSite?(site: number): void\n dispose?(): void\n}\n\nexport function startCollab(client: DocumentClient, opts: CollabOptions): Collab {\n const transport = typeof opts.transport === 'string' ? new WebSocketTransport(opts.transport) : opts.transport\n const docx = client.kind === 'docx' ? new DocxCollab(client) : undefined\n const adapter = (docx ?? (client.kind === 'xlsx' ? new XlsxCollab(client) : new PptxCollab(client))) as unknown as AnyAdapter\n const session = new CollabSession<unknown>(transport, adapter, { room: opts.room, user: opts.user })\n adapter.submit = (op) => session.submit(op)\n adapter.push = (op, undo) => session.push(op, undo)\n adapter.nextId = () => session.nextId()\n adapter.onPresence = (p) => session.setPresence(p)\n client.interceptor = (method, args) => {\n if (!adapter.captures(method)) return undefined\n // editing before the shared history was replayed would fork the document\n if (session.status === 'connecting' || session.status === 'syncing' || session.status === 'error') {\n return Promise.reject(new Error(session.status === 'error' ? session.error ?? 'Collaboration stopped' : 'Document is still syncing'))\n }\n return adapter.intercept(method, args)\n }\n const offs = [\n session.on('peers', (peers) => setPeers(client, peers)),\n session.on('status', (s) => {\n if (s === 'live') adapter.setSite?.(session.site)\n }),\n ]\n return {\n session,\n get status() {\n return session.status\n },\n get peers() {\n return [...session.peers.values()]\n },\n get pending() {\n return session.pending\n },\n on: (event, fn) => session.on(event, fn),\n rects: (root, peer) => {\n const p = peer.presence as DocxPresence | undefined\n return docx && p?.k === 'docx' ? docx.rects(root, p) : null\n },\n close() {\n offs.forEach((f) => f())\n session.close()\n if (client.interceptor) client.interceptor = undefined\n adapter.dispose?.()\n setPeers(client, [])\n },\n }\n}\n\nexport { CollabHub, type HubOptions, type HubConnection } from './hub'\nexport { CollabSession, type Adapter, type CollabStatus } from './session'\nexport { MemoryTransport, WebSocketTransport, type Transport, type TransportStatus } from './transport'\nexport type { Batch, ClientMsg, HubMsg, PeerInfo, UserInfo } from './protocol'\nexport { encode, decode } from './codec'\n"],"mappings":";;;AAQA,IAAMI,oBAAQ,IAAI,QAAsC,GAClDC,oBAAU,IAAI,QAAsC;AAG1D,SAAgBC,EAAgB,GAAgB,GAAc,GAAqB;CACjF,IAAIC,IAAIH,EAAM,IAAII,CAAM;CAExB,AADKD,KAAGH,EAAM,IAAII,GAAS,oBAAI,IAAI,IAAI,CAAE,GACzCD,EAAE,IAAIE,GAAMC,CAAI;CAChB,KAAK,IAAMC,KAAMN,EAAQ,IAAIG,CAAM,CAAC,EAAE,IAAIC,CAAI,KAAK,CAAC,GAAG,EAAGC,CAAI;CAC9D,aAAa;EACX,AAAIH,EAAG,IAAIE,CAAI,MAAMC,KAAMH,EAAG,OAAOE,CAAI;CAC3C;AACF;AAEA,SAAgBG,EAAW,GAAgB,GAA6B;CACtE,OAAOR,EAAM,IAAII,CAAM,CAAC,EAAE,IAAIC,CAAI;AACpC;AAGA,SAAgBI,EAAa,GAAgB,GAAc,GAAmC;CAC5F,IAAIC,IAAIT,EAAQ,IAAIG,CAAM;CAC1B,AAAKM,KAAGT,EAAQ,IAAIG,GAAS,oBAAI,IAAI,IAAI,CAAE;CAC3C,IAAIO,IAAMD,EAAE,IAAIL,CAAI;CAEpB,AADKM,KAAKD,EAAE,IAAIL,GAAO,oBAAM,IAAI,IAAI,CAAE,GACvCM,EAAI,IAAIJ,CAAQ;CAChB,IAAMK,IAAMJ,EAAWJ,GAAQC,CAAI;CAEnC,OADIO,KAAKL,EAAGK,CAAG,SACFD,EAAK,OAAOJ,CAAQ;AACnC;AAiBA,IAAMM,oBAAW,IAAI,QAAyB;AAE9C,SAASC,EAAQ,GAAyB;CACxC,IAAIC,IAAIF,EAAS,IAAIT,CAAM;CAE3B,OADKW,KAAGF,EAAS,IAAIT,GAAS,IAAI;EAAE,OAAOY;EAAU,yBAAS,IAAI,IAAI;EAAG,0BAAU,IAAI,IAAI;CAAE,CAAE,GACxFD;AACT;AAGA,SAAgBE,EAAS,GAAgB,GAAmB;CAC1D,IAAMF,IAAID,EAAQV,CAAM;CACxB,EAAE,QAAQc;CACV,KAAK,IAAMX,KAAMQ,EAAE,SAAS,EAAG;AACjC;AAEA,IAAMC,IAAuB,CAAC;AAG9B,SAAgBG,EAAS,GAA4B;CACnD,OAAON,EAAS,IAAIT,CAAM,CAAC,EAAE,SAASY;AACxC;AAEA,SAAgBI,EAAe,GAAgB,GAA4B;CACzE,IAAML,IAAID,EAAQV,CAAM;CAExB,OADAW,EAAE,QAAQ,IAAIR,CAAE,SACHQ,EAAE,QAAQ,OAAOR,CAAE;AAClC;AAGA,SAAgBc,GAAa,GAAgB,GAAe;CAC1D,KAAK,IAAMd,KAAMM,EAAS,IAAIT,CAAM,CAAC,EAAE,YAAY,CAAC,GAAG,EAAGkB,CAAI;AAChE;AAEA,SAAgBC,EAAQ,GAAgB,GAAyC;CAC/E,IAAMR,IAAID,EAAQV,CAAM;CAExB,OADAW,EAAE,SAAS,IAAIR,CAAE,SACJQ,EAAE,SAAS,OAAOR,CAAE;AACnC;;ACjEA,IAAaiB,KAAQ,MAAaC,EAAE,MAAM,SAASA,EAAE,KAAM,SAAS,GACvDC,KAAQ,MAAiBC,EAAK,QAAQ,GAAG,MAAMC,IAAIJ,EAAKC,CAAC,GAAG,CAAC,GAC7DI,KAAa,MAAWC,EAAE,EAAE,OAAOA,EAAE,EAAE,MAAMA,EAAE,EAAE,MAAMA,EAAE,EAAE,GAC3DC,KAAW,GAAY,MAAcC,EAAG,QAAQ,WAAW,MAAM,OAAO,OAAOJ,CAAC,IAAIK,CAAC,CAAC;AAEnG,SAAgBC,EAAS,GAAsB;CAC7C,OAAOP,EAAK,KAAK,MAAOF,EAAE,MAAM,SAASA,EAAE,OAAO,GAAS,CAAC,CAAC,KAAK,EAAE;AACtE;AAEA,SAASU,EAAU,GAAuB,GAAgC;CACxE,IAAIC,MAAMC,GAAG,OAAO;CACpB,IAAI,CAACD,KAAK,CAACC,GAAG,OAAO,CAACD,KAAK,CAACC;CAC5B,IAAMC,IAAK,OAAO,KAAKF,CAAC;CACxB,IAAIE,EAAG,WAAW,OAAO,KAAKD,CAAC,CAAC,CAAC,QAAQ,OAAO;CAChD,KAAK,IAAME,KAAKD,GAAI,IAAKF,EAA8BG,OAAQF,EAA8BE,IAAI,OAAO;CACxG,OAAO;AACT;AAEA,IAAMC,MAAY,GAAS,MAAYJ,EAAE,MAAM,UAAUC,EAAE,MAAM,UAAUD,EAAE,SAASC,EAAE,QAAQD,EAAE,OAAOC,EAAE,MAAMF,EAAUC,EAAE,GAAGC,EAAE,CAAC,KAAKF,EAAUC,EAAE,GAAGC,EAAE,CAAC;AAG1J,SAAgBI,EAA0B,GAAgB;CACxD,IAAMC,IAAW,CAAC;CAClB,KAAK,IAAMjB,KAAKE,GAAM;EACpB,IAAIF,EAAE,MAAM,UAAU,CAACA,EAAE,MAAM;EAC/B,IAAMkB,IAAOD,EAAIA,EAAI,SAAS;EAC9B,AAAIC,KAAQH,GAASG,GAAMlB,CAAC,IAAG,EAAIiB,EAAI,SAAS,KAAK;GAAE,GAAGC;GAAM,MAAMA,EAAK,OAAQlB,EAAE;EAAM,IACtFiB,EAAI,KAAKjB,CAAC;CACjB;CACA,OAAOiB;AACT;AAGA,SAAgBE,EAA0B,GAAW,GAAuB;CAC1E,IAAMC,IAAY,CAAC,GACbC,IAAa,CAAC,GAChBC,IAAM;CACV,KAAK,IAAMtB,KAAKE,GAAM;EACpB,IAAMC,IAAIJ,EAAKC,CAAC;EAChB,IAAIsB,IAAMnB,KAAKoB,GAAG,EAAK,KAAKvB,CAAC;OACxB,IAAIsB,KAAOC,GAAG,EAAM,KAAKvB,CAAC;OAC1B;GACH,IAAMwB,IAAMD,IAAID;GAEhB,AADAF,EAAK,KAAK;IAAE,GAAGpB;IAAG,MAAMA,EAAE,KAAM,MAAM,GAAGwB,CAAG;GAAE,CAAC,GAC/CH,EAAM,KAAK;IAAE,GAAGrB;IAAG,MAAMA,EAAE,KAAM,MAAMwB,CAAG;GAAE,CAAC;EAC/C;EACA,KAAOrB;CACT;CACA,OAAO,CAACiB,GAAMC,CAAK;AACrB;AAOA,SAAgBI,EAAsB,GAAW,GAA0B;CACzE,IAAM,CAACC,GAAG,KAAKP,EAAUjB,GAAMqB,CAAC;CAChC,KAAK,IAAII,IAAID,EAAE,SAAS,GAAGC,KAAK,GAAG,KAAK,IAAID,EAAEC,EAAE,CAAC,MAAM,QAAQ,OAAOD,EAAEC;CACxE,OAAO,EAAE,MAAM,MAAMC,EAAE,MAAM,MAAM;AACrC;AAEA,SAAgBC,GAA2B,GAAW,GAAW,GAAc,GAAoB,GAA4B;CAC7H,IAAI,CAACC,GAAM,OAAO5B;CAClB,IAAM,CAACwB,GAAG1B,KAAKmB,EAAUjB,GAAMqB,CAAC,GAC1BQ,IAAON,EAAMvB,GAAMqB,CAAC,GACpBS,IAAM;EAAE,GAAG;EAAQ,GAAID,KAAQE,KAAY,CAAC;EAAI,GAAIC,KAAS,CAAC;EAAI;CAAK;CAI7E,OAHIA,GAAO,KAAKH,GAAM,MAAG,EAAI,IAAI;EAAE,GAAGA,EAAK;EAAG,GAAGG,EAAM;CAAE,KACrDA,GAAO,KAAKH,GAAM,OAAG,EAAI,IAAI;EAAE,GAAIA,GAAM,KAAK,CAAC;EAAI,GAAIG,GAAO,KAAK,CAAC;CAAG,IACvEF,EAAI,KAAK,CAAC,OAAO,KAAKA,EAAI,CAAC,CAAC,CAAC,UAAQ,OAAOA,EAAI,GAC7ChB,EAAU;EAAC,GAAGU;EAAGM;EAAK,GAAGhC;CAAC,CAAC;AACpC;AAEA,SAAgBmC,EAA4B,GAAW,GAAW,GAAgB;CAEhF,OADIvB,KAAKD,IAAUT,IACZc,EAAU,CAAC,GAAGG,EAAUjB,GAAMS,CAAC,CAAC,CAAC,IAAI,GAAGQ,EAAUjB,GAAMU,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE;AAEA,SAAgBwB,GAA4B,GAAW,GAAW,GAAW,GAAW,GAAgB;CACtG,IAAM,CAACV,GAAGW,KAAQlB,EAAUjB,GAAMS,CAAC,GAC7B,CAAC2B,GAAKtC,KAAKmB,EAAUkB,GAAMzB,IAAID,CAAC,GAChC4B,IAAMD,EAAI,KAAK,MAAOV,EAAE,MAAM,SAAS;EAAE,GAAGA;EAAG,GAAG;GAAE,GAAIA,EAAE,KAAK,CAAC;GAAI,GAAGvB;EAAE;EAAG,GAAG;GAAE,GAAIuB,EAAE,KAAK,CAAC;GAAI,GAAGpB;EAAE;CAAE,IAAIoB,CAAE;CACpH,OAAOZ,EAAU;EAAC,GAAGU;EAAG,GAAGa;EAAK,GAAGvC;CAAC,CAAC;AACvC;AAGA,SAAgBwC,GAAa,GAAc,GAAmB;CAC5D,IAAIjB,KAAK,GAAG,OAAO;CAEnB,IAAMkB,IAAa,KAAwE;CAC3F,IAAIA,GAAW;EACb,IAAIvB,IAAO;EACX,KAAK,IAAMb,KAAK,IAAIoC,EAAU,KAAA,GAAW,EAAE,aAAa,WAAW,CAAC,CAAC,CAAC,QAAQX,EAAK,MAAM,GAAGP,CAAC,CAAC,GAAG,IAAOlB,EAAE;EAC1G,OAAOa;CACT;CACA,IAAM5B,IAAIwC,EAAK,WAAWP,IAAI,CAAC;CAC/B,OAAOjC,KAAK,SAAUA,KAAK,SAAUiC,KAAK,IAAIA,IAAI,IAAIA,IAAI;AAC5D;AAEA,SAAgBmB,GAAa,GAAc,GAAmB;CAC5D,IAAInB,KAAKO,EAAK,QAAQ,OAAOA,EAAK;CAElC,IAAMW,IAAa,KAAwE;CAC3F,IAAIA,GACF,KAAK,IAAMpC,KAAK,IAAIoC,EAAU,KAAA,GAAW,EAAE,aAAa,WAAW,CAAC,CAAC,CAAC,QAAQX,EAAK,MAAMP,CAAC,CAAC,GAAG,OAAOA,IAAIlB,EAAE,QAAQ;CAErH,IAAMf,IAAIwC,EAAK,WAAWP,CAAC;CAC3B,OAAOjC,KAAK,SAAUA,KAAK,QAASiC,IAAI,IAAIA,IAAI;AAClD;;ACnFA,SAAgBoB,EAAQ,GAAgB,GAAoB;CAC1D,IAAMrD,IAAIT,EAAK,IAAIwB,EAAE,EAAE,IAAIA,EAAE,EAAE,EAAE;CAEjC,OADIf,IAAI,KAAMA,MAAM,KAAKe,EAAE,EAAE,KAAKA,EAAE,EAAE,IAAW,CAACA,EAAE,GAAGA,EAAE,CAAC,IACnD,CAACA,EAAE,GAAGA,EAAE,CAAC;AAClB;AAEA,IAAMuC,KAAS,OAAiB;CAAE,GAAGC;CAAG,GAAGA;AAAE;AAW7C,SAASC,EAA+B,GAAmB,GAA0B;CACnF,IAAM,CAACzC,GAAG0C,KAAKJ,EAAQ9D,GAAMmE,CAAG;CAChC,IAAI3C,EAAE,OAAO0C,EAAE,IAAI;EACjB,IAAMF,IAAIhE,EAAK,KAAKwB,EAAE,EAAE;EAExB,OADKwC,IACE;GAAE,KAAK,CAACxC,EAAE,EAAE;GAAG,OAAO,CAACxB,EAAK,SAASgE,GAAGV,EAAYU,EAAE,MAAMxC,EAAE,GAAG0C,EAAE,CAAC,CAAC,CAAC;GAAG,IAAI1C;EAAE,IADvE;CAEjB;CACA,IAAM4C,IAAOpE,EAAK,KAAKwB,EAAE,IAAI0C,EAAE,EAAE;CACjC,IAAI,CAACE,GAAM,OAAO;CAClB,IAAMC,IAAQrE,EAAK,KAAKoE,EAAK,EAAE,GACzB/B,IAAOrC,EAAK,KAAKoE,EAAKA,EAAK,SAAS,EAAE,GACtC/C,IAAOc,EAAU,CAAC,GAAGG,EAAU+B,EAAM,MAAM7C,EAAE,CAAC,CAAC,CAAC,IAAI,GAAGc,EAAUD,EAAK,MAAM6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAC1F,OAAO;EAAE,KAAKE;EAAM,OAAO,CAACpE,EAAK,KAAKqE,GAAOhC,GAAMhB,CAAI,CAAC;EAAG,IAAIG;CAAE;AACnE;AAEA,SAAgB8C,EAAS,GAAgB,GAAU,GAAoB;CACrE,IAAMC,IAAON,EAAWjE,GAAMmE,CAAG;CACjC,AAAKI,KACLvE,EAAK,QAAQuE,EAAK,KAAKA,EAAK,OAAOR,EAAMQ,EAAK,EAAE,GAAGC,CAAI;AACzD;AAEA,SAASC,EAAO,GAAgB,GAAiC;CAC/D,IAAI,CAAClD,EAAU4C,CAAG,GAAG,OAAOF,EAAWjE,GAAMmE,CAAG;CAChD,IAAMH,IAAIhE,EAAK,KAAKmE,EAAI,EAAE,EAAE;CAC5B,OAAOH,IAAI;EAAE,KAAK,CAACG,EAAI,EAAE,EAAE;EAAG,OAAO,CAACH,CAAC;EAAG,IAAIG,EAAI;CAAE,IAAI;AAC1D;AAMA,SAAgBO,EAAa,GAAgB,GAAU,GAAiB,IAAoB,CAAC,GAAG,GAAuC;CACrI,IAAMH,IAAOE,EAAOzE,GAAMmE,CAAG;CAC7B,IAAI,CAACI,GAAM;CACX,IAAMP,IAAIO,EAAK,MAAM,IACf7B,IAAI6B,EAAK,GAAG,GACZ,CAAChC,GAAMC,KAASF,EAAU0B,EAAE,MAAMtB,CAAC,GACnCU,IAAWR,EAAMoB,EAAE,MAAMtB,CAAC,KAAM1C,EAAK,aAAagE,CAAC,GACnDW,KAAQ,MAAiBtD,EAAK,KAAK,MAAOF,EAAE,MAAM,UAAU,CAACA,EAAE,KAAKiC,IAAW;EAAE,GAAGA;EAAU,GAAGjC;EAAG,GAAGiC,EAAS;EAAG,KAAKA,EAAS;CAAI,IAAIjC,CAAE;CACjJ,IAAIyD,EAAM,WAAW,GAAG;EACtB,IAAMC,IAAMF,EAAKC,EAAM,EAAE,GACnBvD,IAAOc,EAAU;GAAC,GAAGI;GAAM,GAAGsC;GAAK,GAAGrC;EAAK,CAAC;EAClD,EAAK,QAAQ+B,EAAK,KAAK,CAACvE,EAAK,SAASgE,GAAG3C,CAAI,CAAC,GAAG0C,EAAM;GAAE,IAAIQ,EAAK,GAAG;GAAI,GAAG7B,IAAItB,EAAKyD,CAAG;EAAE,CAAC,GAAG;GAAE,OAAO;GAAS,GAAGL;EAAK,CAAC;EACzH;CACF;CACA,IAAMpC,IAAkB,CAAC,GACrB9B,IAAMN,EAAK,SAASgE,GAAG7B,EAAU,CAAC,GAAGI,GAAM,GAAGoC,EAAKC,EAAM,EAAE,CAAC,CAAC,CAAC;CAClE,AAAIE,IAAQ,OAAI,IAAMA,EAAM,EAAE,CAACxE,CAAG;CAClC,KAAK,IAAIwC,IAAI,GAAGA,IAAI8B,EAAM,QAAQ,KAAK;EACrC,IAAMG,IAASjC,MAAM8B,EAAM,SAAS,GAC9BI,IAAOL,EAAKC,EAAM9B,EAAE,GACpB,CAAChB,GAAGmD,KAAMjF,EAAK,MAAMM,GAAKA,EAAI,MAAM6B,EAAU,CAAC,GAAG6C,GAAM,GAAID,IAASvC,IAAQ,CAAC,CAAE,CAAC,GAAG,CAACuC,CAAM;EAEjG,AADA3C,EAAI,KAAKN,CAAC,GACV,IAAMgD,IAAQhC,KAAKgC,EAAMhC,EAAE,CAACmC,CAAE,IAAIA;CACpC;CAEA,AADA7C,EAAI,KAAK9B,CAAG,GACZN,EAAK,QAAQuE,EAAK,KAAKnC,GAAK2B,EAAM;EAAE,IAAItC,EAAQ8C,EAAK,GAAG,IAAInC,EAAI,SAAS,CAAC;EAAG,GAAGhB,EAAKuD,EAAKC,EAAMA,EAAM,SAAS,EAAE,CAAC;CAAE,CAAC,GAAG;EAAE,OAAO;EAAS,GAAGJ;CAAK,CAAC;AACrJ;AAEA,SAAgBU,EAAS,GAAgB,GAAU,GAAc,GAAoB;CACnF,IAAMX,IAAOE,EAAOzE,GAAMmE,CAAG;CAC7B,IAAI,CAACI,GAAM;CACX,IAAMlB,IAAQrD,EAAK,eAAe;CAClC,EAAK,eAAe;CACpB,IAAMgE,IAAIO,EAAK,MAAM,IACf7B,IAAI6B,EAAK,GAAG,GACZK,IAAQ3B,EAAK,QAAQ,UAAU,IAAI,CAAC,CAAC,MAAM,IAAI;CACrD,IAAI2B,EAAM,WAAW,KAAKJ,GAAM,UAAU,aAAa;EACrD,IAAMnD,IAAO2B,GAAWgB,EAAE,MAAMtB,GAAGO,GAAMI,GAAOrD,EAAK,aAAagE,CAAC,CAAC;EACpE,EAAK,QAAQO,EAAK,KAAK,CAACvE,EAAK,SAASgE,GAAG3C,CAAI,CAAC,GAAG0C,EAAM;GAAE,IAAIQ,EAAK,GAAG;GAAI,GAAG7B,IAAIO,EAAK;EAAO,CAAC,GAAG;GAAE,OAAO;GAAQ,GAAGuB;EAAK,CAAC;EAC1H;CACF;CACA,IAAMtB,IAAQG,IAAQ;EAAE,GAAIT,EAAMoB,EAAE,MAAMtB,CAAC,KAAK1C,EAAK,aAAagE,CAAC,KAAK,CAAC;EAAI,GAAGX;CAAM,IAAI,KAAA;CAC1F,EAAarD,GAAMmE,GAAKS,EAAM,KAAK,MAAO/B,IAAI,CAAC;EAAE,GAAIK,KAAQ,CAAC;EAAI,GAAG;EAAQ,MAAML;CAAE,CAAS,IAAI,CAAC,CAAE,GAAG2B,CAAI;AAC9G;AAEA,SAAgBW,EAAQ,GAAgB,GAAU;CAChD,IAAMZ,IAAOhD,EAAU4C,CAAG,WAAW;EACnC,IAAMH,IAAIhE,EAAK,KAAKmE,EAAI,EAAE,EAAE;EAC5B,OAAOH,IAAI;GAAE,KAAK,CAACG,EAAI,EAAE,EAAE;GAAG,OAAO,CAACH,CAAC;GAAG,IAAIG,EAAI;EAAE,IAAI;CAC1D,EAAA,CAAG,IAAIF,EAAWjE,GAAMmE,CAAG;CAC3B,IAAI,CAACI,GAAM;CACX,IAAMP,IAAIO,EAAK,MAAM,IACf,CAAC1B,GAAG1B,KAAKmB,EAAU0B,EAAE,MAAMO,EAAK,GAAG,CAAC,GACpC,CAACzC,GAAGC,KAAK/B,EAAK,MAAMgE,GAAGnB,GAAG1B,GAAGoD,EAAK,GAAG,KAAKnD,EAAK4C,EAAE,IAAI,CAAC;CAC5D,EAAK,QAAQO,EAAK,KAAK,CAACzC,GAAGC,CAAC,GAAGgC,EAAM;EAAE,IAAItC,EAAQ8C,EAAK,GAAG,IAAI,CAAC;EAAG,GAAG;CAAE,CAAC,GAAG,EAAE,OAAO,QAAQ,CAAC;AAChG;AAEA,SAAgBa,EAAY,GAAgB,GAAU,IAAO,IAAO;CAClE,IAAI,CAAC7D,EAAU4C,CAAG,GAAG,OAAOG,EAAStE,GAAMmE,CAAG;CAC9C,IAAM,EAAE,OAAI,SAAMA,EAAI,GAChBH,IAAIhE,EAAK,KAAK0B,CAAE;CACtB,IAAI,CAACsC,GAAG;CACR,IAAItB,IAAI,GAAG;EACT,IAAMO,IAAOrB,EAASoC,EAAE,IAAI,GACxBqB,IAAO1B,GAAaV,GAAMP,CAAC;EAC/B,IAAI4C,GAAM;GACR,IAAMzF,IAAI,gBAAgB,KAAKoD,EAAK,MAAM,GAAGP,CAAC,CAAC;GAC/C,AAAI7C,MAAG,IAAO6C,IAAI7C,EAAE,EAAE,CAAC;EACzB;EACA,EAAK,QAAQ,CAAC6B,CAAE,GAAG,CAAC1B,EAAK,SAASgE,GAAGV,EAAYU,EAAE,MAAMqB,GAAM3C,CAAC,CAAC,CAAC,GAAGqB,EAAM;GAAE;GAAOsB;EAAK,CAAC,GAAG,EAAE,OAAO,SAAS,CAAC;EAChH;CACF;CACA,IAAIrF,EAAK,mBAAmB0B,GAAIsC,CAAC,GAAG;CACpC,IAAMuB,IAAOvF,EAAK,KAAK0B,CAAE,GACnB8D,IAAKD,IAAOvF,EAAK,KAAKuF,CAAI,IAAI,KAAA;CACpC,IAAI,CAACA,KAAQ,CAACC,GAAI;CAClB,IAAMC,IAASzF,EAAK,KAAKwF,GAAIxB,GAAG7B,EAAU,CAAC,GAAGqD,EAAG,MAAM,GAAGxB,EAAE,IAAI,CAAC,CAAC;CAClE,EAAK,QAAQ,CAACuB,GAAM7D,CAAE,GAAG,CAAC+D,CAAM,GAAG1B,EAAM;EAAE,IAAIwB;EAAM,GAAGnE,EAAKoE,EAAG,IAAI;CAAE,CAAC,GAAG,EAAE,OAAO,QAAQ,CAAC;AAC9F;AAEA,SAAgBE,EAAgB,GAAgB,GAAU,IAAO,IAAO;CACtE,IAAI,CAACnE,EAAU4C,CAAG,GAAG,OAAOG,EAAStE,GAAMmE,CAAG;CAC9C,IAAM,EAAE,OAAI,SAAMA,EAAI,GAChBH,IAAIhE,EAAK,KAAK0B,CAAE;CACtB,IAAI,CAACsC,GAAG;CAER,IAAItB,IADQtB,EAAK4C,EAAE,IACX,GAAK;EACX,IAAMf,IAAOrB,EAASoC,EAAE,IAAI,GACxB2B,IAAK9B,GAAaZ,GAAMP,CAAC;EAC7B,IAAI4C,GAAM;GACR,IAAMzF,IAAI,gBAAgB,KAAKoD,EAAK,MAAMP,CAAC,CAAC;GAC5C,AAAI7C,MAAG,IAAK6C,IAAI7C,EAAE,EAAE,CAAC;EACvB;EACA,EAAK,QAAQ,CAAC6B,CAAE,GAAG,CAAC1B,EAAK,SAASgE,GAAGV,EAAYU,EAAE,MAAMtB,GAAGiD,CAAE,CAAC,CAAC,GAAG5B,EAAM;GAAE;GAAI;EAAE,CAAC,GAAG,EAAE,OAAO,SAAS,CAAC;EACxG;CACF;CACA,IAAM6B,IAAO5F,EAAK,KAAK0B,CAAE,GACnBmE,IAAKD,IAAO5F,EAAK,KAAK4F,CAAI,IAAI,KAAA;CACpC,IAAI,CAACA,KAAQ,CAACC,GAAI;CAClB,IAAMJ,IAASzF,EAAK,KAAKgE,GAAG6B,GAAI1D,EAAU,CAAC,GAAG6B,EAAE,MAAM,GAAG6B,EAAG,IAAI,CAAC,CAAC;CAClE,EAAK,QAAQ,CAACnE,GAAIkE,CAAI,GAAG,CAACH,CAAM,GAAG1B,EAAM;EAAE;EAAI;CAAE,CAAC,GAAG,EAAE,OAAO,QAAQ,CAAC;AACzE;AAIA,SAAS+B,EAAQ,GAAgB,GAAmC;CAElE,IAAMtE,KADKF,MAAMA,EAAE,aAAa,IAAKA,IAAgBA,EAAE,eAAA,EACzC,QAAQ,UAAU;CAChC,OAAOE,KAAKuE,EAAK,SAASvE,CAAC,IAAIA,IAAI;AACrC;AAEA,SAASwE,EAAQ,GAAwB;CACvC,IAAMtD,IAAI,OAAOlB,EAAE,QAAQ,CAAC;CAG5B,OAFIA,EAAE,aAAa,UAAU,IAAUkB,IAAI,IACvClB,EAAE,aAAa,YAAY,IAAUkB,IAClCA,KAAKlB,EAAE,aAAa,UAAU;AACvC;AAEA,SAAgByE,EAAW,GAAmB,GAAY,GAA4B;CAEpF,IAAMC,KADQC,EAAK,aAAa,IAAKA,IAAmBA,EAAK,cAAA,EAC1C,QAAQ,WAAW;CACtC,IAAI,CAACD,KAAO,CAACE,EAAK,SAASF,CAAG,GAAG,OAAO;CACxC,IAAMxE,IAAKwE,EAAI,QAAQ;CACvB,IAAI,CAACJ,EAAQK,GAAMD,CAAG,GAAG;EAEvB,IAAM/E,IAAI,SAAS,YAAY;EAE/B,AADAA,EAAE,SAASgF,GAAME,CAAM,GACvBlF,EAAE,SAAS,EAAI;EACf,IAAIuB,IAAI;EACR,KAAK,IAAM4D,KAAM,MAAM,KAAKJ,EAAI,iBAA8B,UAAU,CAAC,GACvE,IAAI/E,EAAE,aAAamF,GAAIA,EAAG,WAAW,MAAM,IAAI,GAAG,IAAIN,EAAQM,CAAE;OAC3D;EAEP,OAAO;GAAE;GAAI;EAAE;CACjB;CACA,IAAMC,IAAOT,EAAQK,GAAMD,CAAG,GACxBhD,IAAO,OAAOqD,EAAK,QAAQ,CAAC;CAClC,IAAIA,EAAK,aAAa,YAAY,GAAG,OAAO;EAAE;EAAOrD;CAAK;CAC1D,IAAIqD,EAAK,aAAa,UAAU,GAAG,OAAO;EAAE;EAAI,GAAGF,IAAS,KAAKF,MAASI,IAAOrD,IAAO,IAAIA;CAAK;CACjG,IAAIiD,EAAK,aAAa,GAAG;EACvB,IAAIzD,IAAI,GACF8D,IAAS,SAAS,iBAAiBD,GAAM,WAAW,SAAS;EACnE,KAAK,IAAIE,IAAID,EAAO,SAAS,GAAGC,GAAG,IAAID,EAAO,SAAS,GAAG;GACxD,IAAIC,MAAMN,GAAM,OAAO;IAAE;IAAI,GAAGjD,IAAOR,IAAI,KAAK,IAAI2D,IAASI,EAAE,eAAe,GAAA,CAAI,MAAM;GAAE;GAC1F,KAAKA,EAAE,aAAa,UAAU;EAChC;EACA,OAAO;GAAE;GAAI,GAAGvD,IAAOR;EAAE;CAC3B;CAEA,IAAIA,IAAI;CACR,KAAK,IAAII,IAAI,GAAGA,IAAI,KAAK,IAAIuD,GAAQE,EAAK,WAAW,MAAM,GAAG,KAAK,KAAKA,EAAK,WAAWzD,EAAE,CAAC,aAAa,UAAU;CAClH,OAAO;EAAE;EAAI,GAAGI,IAAOR;CAAE;AAC3B;AAEA,SAAgBgE,EAAW,GAAmB,GAAiC;CAC7E,IAAMR,IAAME,EAAK,cAA2B,aAAa3D,EAAI,GAAG,GAAG;CACnE,IAAI,CAACyD,GAAK,OAAO;CACjB,IAAMS,IAAQ,MAAM,KAAKT,EAAI,iBAA8B,UAAU,CAAC;CACtE,IAAI,CAACS,EAAM,QAAQ,OAAO,CAACT,GAAKA,EAAI,WAAW,MAAM;CACrD,IAAIU;CACJ,KAAK,IAAMpF,KAAKmF,GAAO;EACrB,IAAMjE,IAAI,OAAOlB,EAAE,QAAQ,CAAC,GACtBqF,IAAMb,EAAQxE,CAAC;EACrB,IAAIiB,EAAI,KAAKC,KAAKD,EAAI,KAAKoE,MACzB,IAAOrF,GAEHiB,EAAI,IAAIoE,KAAO,CAACrF,EAAE,aAAa,UAAU,IAAG;CAEpD;CACA,MAASmF,EAAMA,EAAM,SAAS;CAC9B,IAAMjE,IAAI,OAAOkE,EAAK,QAAQ,CAAC;CAC/B,IAAIA,EAAK,aAAa,UAAU,KAAKA,EAAK,aAAa,YAAY,GAAG;EACpE,IAAME,IAASF,EAAK,YACdG,IAAM,MAAM,UAAU,QAAQ,KAAKD,EAAO,YAAYF,CAAI;EAChE,IAAIA,EAAK,aAAa,YAAY,GAAG;GACnC,IAAM,IAAIA,EAAK;GACf,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAACE,GAAQC,CAAG;EAClC;EACA,OAAO,CAACD,GAAQrE,EAAI,IAAIC,IAAIqE,IAAM,IAAIA,CAAG;CAC3C;CACA,IAAIC,IAAM,KAAK,IAAI,GAAGvE,EAAI,IAAIC,CAAC,GACzB8D,IAAS,SAAS,iBAAiBI,GAAM,WAAW,SAAS,GAC/DvE,IAAoB;CACxB,KAAK,IAAIoE,IAAID,EAAO,SAAS,GAAGC,GAAG,IAAID,EAAO,SAAS,GAAG;EACxD,IAAMlF,IAAImF,EAAE,aAAa,UAAU;EACnC,IAAIO,KAAO1F,GAAG,OAAO,CAACmF,GAAGO,CAAG;EAE5B,AADA,KAAO1F,GACP,IAAOmF;CACT;CACA,OAAOpE,IAAO,CAACA,GAAMA,EAAK,aAAa,UAAU,CAAC,IAAI,CAACuE,GAAM,CAAC;AAChE;AAGA,SAAgBK,EAAO,GAA8B;CACnD,IAAMC,IAAKf,EAAK,YAAY;CAE5B,OADI,OAAO,aAAe,OAAee,aAAc,cAAc,OAAOA,EAAG,gBAAiB,aAAmBA,EAAG,aAAa,KAC3Hf,EAAK,iBAAiB,SAAA,CAAU,aAAa;AACvD;AASA,SAASgB,GAAU,GAAqC;CACtD,IAAMD,IAAKd,EAAK,YAAY,GACtB5E,IAAIyF,EAAOb,CAAI;CACrB,IAAI,CAAC5E,GAAG,OAAO;CACf,IAAI,OAAO,aAAe,OAAe0F,aAAc,cAAc1F,EAAE,cAAc,CAAC4E,EAAK,SAAS5E,EAAE,UAAU,GAAG;EAGjH,IAAML,IADMK,EAA8F,mBAC5F,KAAKA,GAAG,EAAE,aAAa,CAAC0F,CAAE,EAAE,CAAC,CAAC,CAAC;EAC7C,IAAI/F,GAAG,OAAO;GAAE,YAAYA,EAAE;GAAgB,cAAcA,EAAE;GAAa,WAAWA,EAAE;GAAc,aAAaA,EAAE;EAAU;CACjI;CACA,OAAOK;AACT;AAIA,IAAa4F,KAAb,MAAuB;CAOD;CANpB,OAAmC;CACnC,YAAgC;CAChC,eAAuB;CACvB,MAAc;CACd,UAAsB;CAEtB,YAAY,GAAwB;EAAhB,KAAA,OAAApH;CAAiB;CAErC,OAAO,GAAmB;EACxB,AAAI,KAAK,SAASoG,MAClB,KAAK,OAAO,GACZ,KAAK,OAAOA,GACZA,EAAK,iBAAiB,eAAe,KAAK,aAAa,GACvDA,EAAK,iBAAiB,oBAAoB,KAAK,WAAW,GAC1DA,EAAK,iBAAiB,kBAAkB,KAAK,SAAS,GACtDA,EAAK,iBAAiB,WAAW,KAAK,SAAS,GAC/C,SAAS,iBAAiB,mBAAmB,KAAK,WAAW;CAC/D;CAEA,SAAS;EACP,IAAMjF,IAAI,KAAK;EACf,AAAKA,MACLA,EAAE,oBAAoB,eAAe,KAAK,aAAa,GACvDA,EAAE,oBAAoB,oBAAoB,KAAK,WAAW,GAC1DA,EAAE,oBAAoB,kBAAkB,KAAK,SAAS,GACtDA,EAAE,oBAAoB,WAAW,KAAK,SAAS,GAC/C,SAAS,oBAAoB,mBAAmB,KAAK,WAAW,GAChE,qBAAqB,KAAK,GAAG,GAC7B,KAAK,OAAO;CACd;CAEA,IAAI,cAAc;EAChB,OAAO,CAAC,CAAC,KAAK;CAChB;CAEA,UAAsB;EACpB,IAAMiF,IAAO,KAAK,MACZ5E,IAAI4E,IAAOe,GAAUf,CAAI,IAAI;EAEnC,IADI,CAACA,KAAQ,CAAC5E,KAAK,CAACA,EAAE,cAAc,CAACA,EAAE,aACnC,CAAC4E,EAAK,SAAS5E,EAAE,UAAU,KAAK,CAAC4E,EAAK,SAAS5E,EAAE,SAAS,GAAG,OAAO;EACxE,IAAMM,IAAImE,EAAWG,GAAM5E,EAAE,YAAYA,EAAE,YAAY,GACjD6F,IAAIpB,EAAWG,GAAM5E,EAAE,WAAWA,EAAE,WAAW;EACrD,OAAOM,KAAKuF,IAAI;GAAE;GAAG;EAAE,IAAI;CAC7B;CAGA,MAAkB;EAChB,OAAO,KAAK,QAAQ,KAAK,KAAK;CAChC;CAGA,QAAQ,GAAiB,IAAQ,IAAe;EAC9C,IAAMjB,IAAO,KAAK;EAClB,IAAI,CAACA,KAAQ,CAACjC,GAAK,OAAO;EAC1B,IAAMrC,IAAI4E,EAAWN,GAAMjC,EAAI,CAAC,GAC1BkD,IAAIX,EAAWN,GAAMjC,EAAI,CAAC;EAChC,IAAI,CAACrC,KAAK,CAACuF,GAET,OADA,KAAK,UAAUlD,GACR;EAET,IAAMmD,IAAUlB,EAAK,YAAY,CAAC,CAA2B;EAC7D,AAAImB,KAASD,MAAWlB,KAAQ,CAACA,EAAK,SAASkB,CAAM,KAAGlB,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC;EAC1F,IAAM5E,IAAIyF,EAAOb,CAAI;EACrB,IAAI;GACF,GAAG,iBAAiBtE,EAAE,IAAIA,EAAE,IAAIuF,EAAE,IAAIA,EAAE,EAAE;EAC5C,QAAQ,CAER;EAEA,OADA,KAAK,UAAUlD,GACR;CACT;CAEA,SAAiB,GAAgD;EAC/D,IAAI,CAAChD,KAAK,CAAC,KAAK,MAAM,OAAO;EAC7B,IAAMW,IAAImE,EAAW,KAAK,MAAM9E,EAAE,gBAAgBA,EAAE,WAAW,GACzDkG,IAAIpB,EAAW,KAAK,MAAM9E,EAAE,cAAcA,EAAE,SAAS;EAC3D,OAAOW,KAAKuF,IAAI;GAAE;GAAG;EAAE,IAAI;CAC7B;CAEA,iBAAyB,MAAkB;EACzC,IAAM,IAAI,EAAE;EACZ,IAAI,KAAK,aAAa,MAAM,yBAAyB;EACrD,IAAI,MAAM,2BAA2B,MAAM,yBAAyB;GAElE,IADI,EAAE,cAAY,EAAE,eAAe,GAC/B,MAAM,2BAA2B,EAAE,QAAQ,EAAE,SAAS,KAAK,cAAc;IAC3E,IAAMlD,IAAM,KAAK,IAAI;IACrB,AAAIA,KAAKe,EAAS,KAAK,MAAMf,GAAK,EAAE,MAAM,EAAE,SAAS,GAAK,CAAC;GAC7D;GACA,KAAK,eAAe;GACpB;EACF;EACA,EAAE,eAAe;EACjB,IAAMqD,IAAS,KAAK,SAAS,EAAE,kBAAkB,CAAC,CAAC,EAAE,GAC/CrD,IAAM,KAAK,QAAQ,KAAK,KAAK;EACnC,IAAI,CAACA,GAAK;EACV,IAAMsD,IAAI,KAAK;EACf,QAAQ,GAAR;GACE,KAAK;GACL,KAAK,yBAAyB;IAC5B,IAAMxE,IAAO,EAAE,QAAQ,EAAE,cAAc,QAAQ,YAAY,KAAK;IAChE,EAASwE,GAAG,MAAM,2BAA2BD,IAASA,IAASrD,GAAKlB,CAAI;IACxE;GACF;GACA,KAAK;IACH,EAAQwE,GAAGtD,CAAG;IACd;GACF,KAAK;IACH,EAASsD,GAAGtD,GAAK,MAAM,EAAE,OAAO,YAAY,CAAC;IAC7C;GACF,KAAK;GACL,KAAK;GACL,KAAK,kBAAkB;IACrB,IAAI,EAAE,gBAAgBsD,EAAE,YAAY,MAAM,oBAAoBD,IAASA,IAASrD,GAAK,EAAE,YAAY,GAAG;IACtG,IAAMlB,IAAO,EAAE,cAAc,QAAQ,YAAY,KAAK,EAAE,QAAQ;IAChE,AAAIA,KAAMiC,EAASuC,GAAGtD,GAAKlB,CAAI;IAC/B;GACF;GACA,KAAK;IACH,EAAYwE,GAAGtD,CAAG;IAClB;GACF,KAAK;IACH,EAAYsD,GAAGtD,GAAK,EAAI;IACxB;GACF,KAAK;IACH,EAAgBsD,GAAGtD,CAAG;IACtB;GACF,KAAK;IACH,EAAgBsD,GAAGtD,GAAK,EAAI;IAC5B;GACF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,AAAK5C,EAAU4C,CAAG,IACTqD,KAAU,CAACjG,EAAUiG,CAAM,KAAGlD,EAASmD,GAAGD,CAAM,IADpClD,EAASmD,GAAGtD,CAAG;IAEpC;GACF,KAAK;IACH,EAAE,KAAK;IACP;GACF,KAAK;IACH,EAAE,KAAK;IACP;GACF,KAAK;IACH,EAAE,SAAS,GAAG;IACd;GACF,KAAK;IACH,EAAE,SAAS,GAAG;IACd;GACF,KAAK,mBACH,EAAE,SAAS,GAAG;EAElB;CACF;CAEA,oBAA4B;EAC1B,KAAK,YAAY,KAAK,QAAQ,KAAK,KAAK;CAC1C;CAEA,aAAqB,MAAwB;EAC3C,IAAMA,IAAM,KAAK;EAEjB,AADA,KAAK,YAAY,MACZA,MACL,KAAK,eAAe,EAAE,QAAQ,IAE1B,EAAE,OAAMe,EAAS,KAAK,MAAMf,GAAK,EAAE,MAAM,EAAE,SAAS,GAAK,CAAC,IACzDe,EAAS,KAAK,MAAMf,GAAK,IAAI,EAAE,SAAS,GAAK,CAAC,GACnD,iBAAkB,KAAK,eAAe,IAAK,CAAC;CAC9C;CAEA,aAAqB,MAAqB;EACxC,IAAI,EAAE,eAAe,KAAK,WAAW;EACrC,IAAMuD,IAAM,EAAE,WAAW,EAAE,SACrBzF,IAAI,EAAE,IAAI,YAAY;EAC5B,IAAI,KAAK,KAAK,WAAW,CAAC,GACxB,EAAE,eAAe;OAGnB;OAAIyF,KAAO,CAAC,EAAE,QAAQ;IACpB,IAAIzF,MAAM,KAAK;KAEb,AADA,EAAE,eAAe,GACb,EAAE,WAAU,KAAK,KAAK,KAAK,IAC1B,KAAK,KAAK,KAAK;KACpB;IACF;IACA,IAAIA,MAAM,KAAK;KAEb,AADA,EAAE,eAAe,GACjB,KAAK,KAAK,KAAK;KACf;IACF;IACA,IAAIA,MAAM,OAAOA,MAAM,OAAOA,MAAM,KAAK;KAEvC,AADA,EAAE,eAAe,GACjB,KAAK,KAAK,SAASA,CAAC;KACpB;IACF;GACF;GACA,IAAI,EAAE,QAAQ,SAAS,CAACyF,GAAK;IAC3B,EAAE,eAAe;IACjB,IAAMvD,IAAM,KAAK,IAAI;IACrB,IAAI,CAACA,GAAK;IACV,AAAI,CAAC,KAAK,KAAK,MAAMA,GAAK,EAAE,QAAQ,KAAK,CAAC,EAAE,YAAUe,EAAS,KAAK,MAAMf,GAAK,GAAI;GACrF;EANA;CAOF;CAEA,oBAA4B;EAC1B,AACA,KAAK,QAAM,4BAA4B;GACrC,KAAK,MAAM;GACX,IAAM3C,IAAI,KAAK,QAAQ;GAEvB,AADIA,MAAG,KAAK,UAAUA,IACtB,KAAK,KAAK,cAAcA,CAAC;EAC3B,CAAC;CACH;AACF,GC/dMmG,qBAAQ,IAAI,IAAmB;CAAC;CAAQ;CAAQ;CAAc;CAAQ;AAAO,CAAC,GAE9EC,KAAQ,MAA2B7F,EAAE,MAAM,MAAOA,EAAE,QAAQ,KAAA,IAA2B,OAAf,EAAE,GAAGA,EAAE,IAAI,IAAYA,EAAE,MAAM,QAAQ;CAAE,KAAKA,EAAE;CAAK,MAAMA,EAAE;AAAK,IAAI;AAEpJ,SAAS8F,EAAQ,GAAsB,GAAkB;CAGvD,OAFK9F,IACD,OAAOE,IAAUF,EAAE,MAAM,OAAOA,EAAE,QAAQE,EAAE,IACzCF,EAAE,MAAM,UAAWE,EAAE,QAAQ,KAAA,KAAaF,EAAE,QAAQE,EAAE,OAASA,EAAE,SAAS,KAAA,KAAaF,EAAE,SAASE,EAAE,QAF5F;AAGjB;AAEA,IAAM6F,MAAQ,MAAiB,CAAC,GAAG,IAAI,IAAIC,CAAE,CAAC;AAG9C,SAASC,EAAO,GAAiB,IAAgB,CAAC,GAAa;CAC7D,KAAK,IAAMjG,KAAKkG,GACd,IAAIlG,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,GAAW,EAAI,KAAKA,EAAE,GAAG;MACjD,IAAIA,EAAE,MAAM,OAAO,KAAK,IAAMZ,KAAKY,EAAE,MAAM,KAAK,IAAMtB,KAAKU,EAAE,OAAO,EAAOV,EAAE,QAAQ2B,CAAG;CAE/F,OAAOA;AACT;AAIA,SAAS8F,EAAQ,GAAmB;CAClC,IAAI/G,EAAE,MAAM,QAAQ,OAAO,KAAK,UAAUA,CAAC;CAC3C,IAAM,EAAE,MAAMgH,GAAI,GAAG3E,MAASrC;CAC9B,OAAO,KAAK,UAAUqC,CAAI;AAC5B;AAGA,SAAgB4E,GAAS,GAAa,GAAgE;CAEpG,IAAMC,KAAS,MAAmB;EAChC,IAAMjG,IAAgB,CAAC;EACvB,KAAK,IAAMjB,KAAKE,GAAM;GACpB,IAAMY,IAAIiG,EAAQ/G,CAAC;GACnB,IAAIA,EAAE,MAAM,QAAQ,KAAK,IAAI2B,IAAI,GAAGA,IAAI3B,EAAE,KAAK,QAAQ,KAAK,EAAI,KAAKc,IAAI,OAAWd,EAAE,KAAK2B,EAAE;QACxF,EAAI,KAAKb,CAAC;EACjB;EACA,OAAOG;CACT,GACMW,IAAIsF,EAAMvG,CAAC,GACXwG,IAAID,EAAMtG,CAAC,GACbwG,IAAM;CACV,OAAOA,IAAMxF,EAAE,UAAUwF,IAAMD,EAAE,UAAUvF,EAAEwF,OAASD,EAAEC,KAAM;CAC9D,IAAIC,IAAM;CACV,OAAOA,IAAMzF,EAAE,SAASwF,KAAOC,IAAMF,EAAE,SAASC,KAAOxF,EAAEA,EAAE,SAAS,IAAIyF,OAASF,EAAEA,EAAE,SAAS,IAAIE,KAAM;CACxG,IAAID,MAAQxF,EAAE,UAAUwF,MAAQD,EAAE,QAAQ,OAAO;CACjD,IAAM,GAAG9E,KAAQlB,EAAUP,GAAawG,CAAG,GACrC,CAAC9E,KAAOnB,EAAUkB,GAAM8E,EAAE,SAASC,IAAMC,CAAG;CAClD,OAAO;EAAE,IAAID;EAAK,KAAKxF,EAAE,SAASwF,IAAMC;EAAK,KAAK/E;CAAgB;AACpE;AAEA,SAAgBgF,GAAW,GAAgB,GAAY,GAAa,GAAyB;CAC3F,IAAMnH,IAAIF,EAAKC,CAAc,GACvB,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIqH,GAAIpH,CAAC,CAAC,GAC/BK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIgH,GAAKrH,IAAI,CAAC,CAAC,GACpC,CAACiB,GAAMiB,KAAQlB,EAAUjB,GAAgB,CAAC,GAC1C,GAAGmB,KAASF,EAAUkB,GAAM7B,CAAC;CACnC,OAAO;EAAC,GAAIY;EAAmB,GAAGsC;EAAK,GAAIrC;CAAkB;AAC/D;AAGA,SAASoG,EAAO,GAAW,GAAY,GAAa,GAAa,GAAsB;CAGrF,OAFI7F,IAAI2F,KAAO3F,MAAM2F,MAAOC,IAAM,KAAK9B,KAAc9D,IACjDA,KAAK2F,IAAKC,IAAY5F,IAAI4F,IAAM9D,IAC7B6D,IAAK7D;AACd;AAGA,SAASgE,EAAU,GAAW,GAAgB,GAAuB;CACnE,IAAIC,MAAWC,GAAO,OAAOrG;CAC7B,IAAI6F,IAAM;CACV,OAAOA,IAAMO,EAAO,UAAUP,IAAMQ,EAAM,UAAUD,EAAOP,OAASQ,EAAMR,KAAM;CAChF,IAAIC,IAAM;CACV,OAAOA,IAAMM,EAAO,SAASP,KAAOC,IAAMO,EAAM,SAASR,KAAOO,EAAOA,EAAO,SAAS,IAAIN,OAASO,EAAMA,EAAM,SAAS,IAAIP,KAAM;CAGnI,OAFI9F,KAAK6F,IAAY7F,IACjBA,KAAKoG,EAAO,SAASN,IAAYO,EAAM,UAAUD,EAAO,SAASpG,KAC9DqG,EAAM,SAASP;AACxB;AAEA,IAAMQ,MAAa,GAAc,MAC/BlH,EAAE,QAAQC,EAAE,OACZD,EAAE,SAASC,EAAE,QACbD,EAAE,QAAQC,EAAE,OACZ,CAAC,CAACD,EAAE,MAAO,CAAC,CAACC,EAAE,MACfD,EAAE,aAAaC,EAAE,YACjB,KAAK,UAAUD,EAAE,MAAM,IAAI,MAAM,KAAK,UAAUC,EAAE,MAAM,IAAI,KAC5D,KAAK,UAAUD,EAAE,EAAE,MAAM,KAAK,UAAUC,EAAE,EAAE,KAC5C,KAAK,UAAUD,EAAE,QAAQ,IAAI,MAAM,KAAK,UAAUC,EAAE,QAAQ,IAAI,GAIrDkH,KAAb,MAAmD;CAyB7B;CAxBpB;CAEA,WAAmB;CAEnB,sBAAc,IAAI,IAAoD;CAEtE,yBAAiB,IAAI,IAAoB;CACzC,0BAAkB,IAAI,QAAyB;CAC/C,OAAyF;CAEzF,eAAuB;CACvB,OAAe;CACf,UAAkB;CAClB;CAEA;CACA,eAAuB;CACvB,MAAc;CAGd;CAEA;CAEA,YAAY,GAAgC;EAAxB,KAAA,SAAAnJ;CAAyB;CAI7C,QAAuB;EACrB,OAAO,IAAI,SAAS,MAAY;GAS9B,AARA,KAAK,UAAUK,EAAoB,KAAK,QAAQ,SAAS,MAAM;IAC7D,AAAI,KAAK,MAAM,WAAWsH,EAAE,WACxB,KAAK,SAAM,KAAK,KAAK,OAAO,WAAW,KAAA,IAC3C,KAAK,OAAOA,GACZ,EAAE,OAAO,YAAY,MAAM,KAAK,SAAShH,CAAC,GAC1C,KAAK,UAAU,GACfyI,EAAQ;GACV,CAAC,GACG,OAAO,WAAa,OAAa,SAAS,iBAAiB,mBAAmB,KAAK,KAAK;EAC9F,CAAC;CACH;CAGA,QAAQ,GAAc;EAEpB,AADA,KAAK,OAAOC,GACZ,KAAK,UAAU;CACjB;CAEA,YAAoB;EAClB,IAAMC,IAAK,KAAK,MAAM;EACtB,IAAI,CAACA,KAAM,CAAC,KAAK,MAAM;EACvB,IAAMlG,IAAO,MAAgB,KAAK,OAAO;EACzC,CAAIkG,EAAG,UAAUlG,KAAQkG,EAAG,WAAWlG,IAAO,SAAY,EAAG,UAAUA;CACzE;CAEA,UAAU;EAIR,AAHA,KAAK,UAAU,GACX,KAAK,SAAM,KAAK,KAAK,OAAO,WAAW,KAAA,IACvC,OAAO,WAAa,OAAa,SAAS,oBAAoB,mBAAmB,KAAK,KAAK,GAC3F,KAAK,OAAK,qBAAqB,KAAK,GAAG;CAC7C;CAEA,SAAS,GAAgC;EAEvC,OAAO,CAAC,KAAK,YAAY,CAACyE,GAAM,IAAI0B,CAAM,KAAKA,MAAW,eAAeA,MAAW,gBAAgBA,EAAO,WAAW,OAAO;CAC/H;CAGA,UAAU,GAAuB,GAA+C;EAC9E,IAAK,KAAK,UAAW,KAAK,SAASA,CAAM,GACzC;WAAQA,GAAR;IACE,KAAK,cAAc;KACjB,IAAMC,IAAQ,IAAI,WAAYC,EAAK,EAAE,CAAiB,MAAM,CAAC,CAAC;KAC9D,OAAO,KAAK,OAAO;MAAE,GAAG;MAAS,KAAK,KAAK,IAAI;MAAG;MAAO,KAAKA,EAAK;KAAa,CAAC;IACnF;IACA,KAAK,aACH,OAAO,KAAK,OAAO;KAAE,GAAG;KAAQ,KAAK,KAAK,IAAI;KAAG,KAAKA,EAAK;IAAa,CAAC;GAC7E;GACA,OAAO,KAAK,OAAO;IAAE,GAAG;IAAQ;IAAQ;GAAK,CAAC;EAD9C;CAEF;CAEA,MAAc;EACZ,OAAO,GAAG,KAAK,KAAK,GAAG,EAAE,KAAK,QAAQ,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;CAChF;CAIA,IAAY,KAAK;EACf,OAAO,KAAK,KAAM;CACpB;CAEA,IAAY,KAAK;EACf,OAAO,KAAK,KAAM;CACpB;CAGA,OAAe,GAA2E;EACxF,IAAMnH,IAAoE,CAAC;EAa3E,OAZA,KAAK,GAAG,OAAO,SAAS,GAAG,MAAO;GAChC,AAAIL,EAAE,MAAM,MACNA,EAAE,QAAQyH,KAAKpH,EAAI,KAAK;IAAE,MAAM,KAAK,GAAG;IAAQ,OAAOqH;IAAI,IAAI,OAAOA,CAAE;IAAG,GAAG1H;GAAE,CAAC,IAC5EA,EAAE,MAAM,SACjBA,EAAE,KAAK,SAAS,GAAG,MACjBZ,EAAE,MAAM,SAAS,GAAM,MACrBuI,EAAK,OAAO,SAAS,GAAG,MAAO;IAC7B,AAAI3G,EAAE,MAAM,OAAOA,EAAE,QAAQyG,KAAKpH,EAAI,KAAK;KAAE,MAAMsH,EAAK;KAAQ,OAAOC;KAAI,IAAI,GAAGF,EAAG,GAAGG,EAAG,GAAGC,EAAG,GAAGF;KAAM,GAAG5G;IAAE,CAAC;GAClH,CAAC,CACH,CACF;EACJ,CAAC,GACMX;CACT;CAEA,SAAiB,GAAiB;EAChC,OAAO,KAAK,GAAG,OAAO,WAAW,MAAMyF,EAAQ9F,GAAGE,CAAC,CAAC;CACtD;CAGA,OAAe,GAAiC;EAC9C,IAAM6H,IAAO,IAAI,IAAIC,CAAI;EACzB,KAAK,IAAMP,KAAOO,GAAM;GACtB,IAAMC,IAAM,KAAK,OAAOR,CAAG,CAAC,CAAC;GAC7B,IAAI,CAACQ,GAAK;GACV,IAAMC,IAAgB,CAAC;GACvB,KAAK,IAAInH,IAAIkH,EAAI,OAAOlH,IAAIkH,EAAI,KAAK,QAAQ,KAAK;IAChD,IAAMjI,IAAIiI,EAAI,KAAKlH;IACnB,IAAIf,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAa,CAAC+H,EAAK,IAAI/H,EAAE,GAAG,GAAG;IAC5D,EAAI,KAAKiI,EAAI,GAAG,QAAQ,QAAQ,OAAOlH,CAAC,CAAC,CAAC;GAC5C;GACA,OAAOmH;EACT;EACA,OAAO;CACT;CAIA,MAAwC,GAAS;EAC/C,IAAIlH,EAAE,MAAM,OAAO;GACjB,IAAMmH,IAAMnH,EAAsB,IAC5B5B,IAAI+I,IAAK,KAAK,IAAI,IAAIA,CAAE,IAAI,KAAA;GAClC,OAAO/I,KAAK,OAAOA,KAAM,WAAW;IAAE,GAAG4B;IAAG,KAAK5B,EAAE;IAAK,QAAQA,EAAE;GAAK,IAAI4B;EAC7E;EACA,IAAIA,EAAE,MAAM,QAAQ;GAClB,IAAMmH,IAAMnH,EAAuB,KAC7B5B,IAAI+I,IAAK,KAAK,IAAI,IAAIA,CAAE,IAAI,KAAA;GAClC,OAAO,OAAO/I,KAAM,WAAW;IAAE,GAAG4B;IAAG,IAAI5B;GAAE,IAAI4B;EACnD;EAGA,OAFIA,EAAE,MAAM,MAAY;GAAE,GAAGA;GAAG,MAAMA,EAAE,KAAK,KAAK,MAAM,KAAK,MAAM5B,CAAC,CAAC;EAAE,IACnE4B,EAAE,MAAM,QAAc;GAAE,GAAGA;GAAG,MAAMA,EAAE,KAAK,KAAK,OAAO;IAAE,GAAG5B;IAAG,OAAOA,EAAE,MAAM,KAAK,OAAO;KAAE,GAAGV;KAAG,QAAQA,EAAE,OAAO,KAAK,MAAM,KAAK,MAAMsB,CAAC,CAAC;IAAE,EAAE;GAAE,EAAE;EAAE,IAClJgB;CACT;CAGA,IAAsC,GAAS;EAK7C,OAJIA,EAAE,MAAM,SAASA,EAAE,OAAO,KAAK,OAAO,IAAIA,EAAE,GAAG,KAAK,CAAEA,EAAsB,KAAW;GAAE,GAAGA;GAAG,IAAI,KAAK,OAAO,IAAIA,EAAE,GAAG;EAAE,IAC1HA,EAAE,MAAM,UAAUA,EAAE,MAAM,KAAK,OAAO,IAAIA,EAAE,EAAE,KAAK,CAAEA,EAAuB,MAAY;GAAE,GAAGA;GAAG,KAAK,KAAK,OAAO,IAAIA,EAAE,EAAE;EAAE,IAC3HA,EAAE,MAAM,MAAY;GAAE,GAAGA;GAAG,MAAMA,EAAE,KAAK,KAAK,MAAM,KAAK,IAAI5B,CAAC,CAAC;GAAG,OAAO,KAAA;EAAU,IACnF4B,EAAE,MAAM,QAAc;GAAE,GAAGA;GAAG,MAAMA,EAAE,KAAK,KAAK,OAAO;IAAE,GAAG5B;IAAG,OAAOA,EAAE,MAAM,KAAK,OAAO;KAAE,GAAGV;KAAG,QAAQA,EAAE,OAAO,KAAK,MAAM,KAAK,IAAIsB,CAAC,CAAC;IAAE,EAAE;GAAE,EAAE;EAAE,IAChJgB;CACT;CAEA,MAAc,SAAS,GAAY;EACjC,IAAIoH,EAAG,MAAM,WAAW,CAAC,KAAK,IAAI,IAAIA,EAAG,GAAG,GAAG;GAC7C,IAAMhJ,IAAI,MAAM,KAAK,OAAO,OAAO,cAAcgJ,EAAG,MAAM,MAAM,CAAC,CAAC,QAAuBA,EAAG,GAAG;GAE/F,AADA,KAAK,IAAI,IAAIA,EAAG,KAAKhJ,CAAC,GACtB,KAAK,OAAO,IAAIA,EAAE,KAAKgJ,EAAG,GAAG;EAC/B,OAAO,IAAIA,EAAG,MAAM,UAAU,CAAC,KAAK,IAAI,IAAIA,EAAG,GAAG,GAAG;GACnD,IAAMC,IAAK,MAAM,KAAK,OAAO,OAAO,aAAaD,EAAG,GAAG;GAEvD,AADA,KAAK,IAAI,IAAIA,EAAG,KAAKC,CAAE,GACvB,KAAK,OAAO,IAAIA,GAAID,EAAG,GAAG;EAC5B,OAAO,IAAIA,EAAG,MAAM,UAAU,CAAC,KAAK,QAAQ,IAAIA,CAAE,GAAG;GACnD,IAAME,IAAO,KAAK,OAAO;GACzB,KAAK,QAAQ,IAAIF,GAAI,MAAME,EAAKF,EAAG,QAAQ,GAAGA,EAAG,IAAI,CAAC;EACxD;CACF;CAIA,SAAiB,GAAe;EAC9B,IAAI,KAAK,YAAY,CAAC,KAAK,MAAM;EACjC,IAAI1J,EAAE,SAAS,SAAS;GACtB,IAAMsB,IAAItB,EAAE,QACN,IAAIA,EAAE;GACZ,IAAIsB,EAAE,WAAW,KAAK,EAAE,WAAW,KAAKA,EAAE,EAAE,CAAC,QAAQ,KAAA,KAAaiH,GAAUjH,EAAE,IAAI,EAAE,EAAE,KAAK,KAAK,OAAOA,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG;IAC7H,IAAMJ,IAAIyG,GAASrG,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI;IACvC,IAAI,CAACJ,GAAG;IACR,KAAK,KAAK;KAAE,GAAG;KAAQ,KAAKI,EAAE,EAAE,CAAC;KAAK,IAAIJ,EAAE;KAAI,KAAKA,EAAE;KAAK,KAAKA,EAAE,IAAI,KAAK,MAAM,KAAK,IAAIR,CAAC,CAAC;IAAE,GAAG,CAAC;KAAE,GAAG;KAAS,QAAQY;KAAG,MAAM;IAAE,CAAC,CAAC;IACtI;GACF;GACA,KAAK,KAAK;IAAE,GAAG;IAAS,QAAQA,EAAE,KAAK,MAAMiC,EAAE,GAAI;IAAG,MAAM,EAAE,KAAK,MAAM,KAAK,IAAIA,CAAC,CAAC;GAAE,GAAG,CAAC;IAAE,GAAG;IAAS,QAAQjC;IAAG,MAAM;GAAE,CAAC,CAAC;GAC7H;EACF;EACA,IAAMwD,IAAO9E,EAAE,KAAK,IAAImH,EAAK,KAAK,GAAG,OAAOnH,EAAE,KAAK,EAAE,IAAI;EACzD,KAAK,KACH;GAAE,GAAG;GAAU,QAAQA,EAAE,OAAO,IAAImH,CAAI,CAAC,CAAC,QAAQ,MAAiB,CAAC,CAAC3F,CAAC;GAAG;GAAM,MAAMxB,EAAE,KAAK,KAAK,MAAM,KAAK,IAAIsB,CAAC,CAAC;EAAE,GACpH,CAAC;GAAE,GAAG;GAAU,QAAQtB,EAAE;GAAQ,MAAMA,EAAE;GAAM;EAAK,CAAC,CACxD;CACF;CAIA,UAAU,GAAY,GAA8B;EAClD,IAAI0J,EAAG,MAAM,QAAQ,OAAOA;EAC5B,IAAIG,EAAM,MAAM,UAAUA,EAAM,QAAQH,EAAG,KAAK;GAC9C,IAAMI,IAAOnJ,EAAKkJ,EAAM,GAAa,GAC/B5B,IAAKE,EAAOuB,EAAG,IAAIG,EAAM,IAAIA,EAAM,KAAKC,GAAM,EAAK,GACnD1D,IAAMsD,EAAG,MAAM,KAAK,IAAIzB,GAAIE,EAAOuB,EAAG,KAAKA,EAAG,KAAKG,EAAM,IAAIA,EAAM,KAAKC,GAAM,EAAI,CAAC,IAAI7B;GAC7F,OAAOA,MAAOyB,EAAG,MAAMtD,IAAM6B,MAAOyB,EAAG,MAAMA,IAAK;IAAE,GAAGA;IAAI;IAAI,KAAKtD,IAAM6B;GAAG;EAC/E;EAMA,OALI4B,EAAM,MAAM,YAAYA,EAAM,OAAO,SAASH,EAAG,GAAG,KAAKG,EAAM,KAAK,MAAM,MAAMtG,EAAE,QAAQmG,EAAG,GAAG,KAE3FG,EAAM,KAAK,MAAM,MAAMtG,EAAE,QAAQmG,EAAG,GAAG,IAAIA,IAAK,OAErDG,EAAM,MAAM,YAAYA,EAAM,OAAO,MAAM,MAAM,OAAOrI,KAAKA,EAAE,MAAMkI,EAAG,GAAG,KAAK,CAACnC,EAAOsC,EAAM,IAAI,CAAC,CAAC,SAASH,EAAG,GAAG,IAAU,OAC1HA;CACT;CAEA,QAAgB,GAAsB;EACpC,QAAQA,EAAG,GAAX;GACE,KAAK,QACH,OAAO,CAAC,MAAMA,EAAG,GAAG;GACtB,KAAK,SACH,OAAO,CAAC,GAAGA,EAAG,QAAQ,GAAGA,EAAG,KAAK,KAAK,MAAMnG,EAAE,GAAI,CAAC,CAAC,CAAC,KAAK,MAAM,MAAMA,CAAC;GACzE,KAAK,UAAU;IAEb,IAAM5B,IAAM;KADE,GAAG+H,EAAG;KAAQ,GAAIA,EAAG,OAAO,CAACA,EAAG,IAAI,IAAI,CAAC;KAAI,GAAGA,EAAG,KAAK,IAAIvC,CAAI,CAAC,CAAC,QAAQ,MAAiB,CAAC,CAAC3F,CAAC;IAChG,CAAA,CAAK,KAAK,MAAO,OAAOA,IAAI,MAAMA,EAAE,IAAI,OAAOA,EAAE,QAAQ,MAAMA,EAAE,IAAK;IAClF,KAAK,IAAMuH,KAAOxB,EAAOmC,EAAG,IAAI,GAAG,EAAI,KAAK,MAAMX,CAAG;IACrD,OAAOpH;GACT;GACA,SACE,OAAO,CAAC;EACZ;CACF;CAEA,UAAU,GAAmB,GAA2B;EACtD,IAAMoI,IAAO,IAAI,IAAIC,EAAQ,SAAS,MAAM,KAAK,QAAQ/H,CAAC,CAAC,CAAC;EAC5D,OAAOgI,EAAO,MAAM,MAAM,KAAK,QAAQhI,CAAC,CAAC,CAAC,MAAM,MAAM8H,EAAK,IAAIvI,CAAC,CAAC,CAAC;CACpE;CAEA,YAAY,GAAqB;EAC/B,OAAOkI,EAAG,MAAM;CAClB;CAEA,MAAM,QAAQ,GAAe;EAE3B,OAAO,KAAK,MAAM,OAAO,MAAM,cAAa,MAAM,IAAI,SAAS,MAAM,WAAWhJ,GAAG,EAAE,CAAC;EACtF,KAAK,IAAMgJ,KAAMQ,GAAK,MAAM,KAAK,SAASR,CAAE;EAC5C,KAAK,QAAQ;CACf;CAEA,MAAM,MAAM,GAAY,GAA2D;EACjF,QAAQA,EAAG,GAAX;GACE,KAAK;GACL,KAAK,QAEH,OADA,MAAM,KAAK,SAASA,CAAE,GACf,EAAE,QAAQ,KAAK,IAAI,IAAIA,EAAG,GAAG,EAAE;GACxC,KAAK,QAAQ;IACX,MAAM,KAAK,SAASA,CAAE;IACtB,IAAMS,IAAS,KAAK,QAAQ,IAAIT,CAAE;IAClC,IAAIA,EAAG,WAAW,gBAAgBS,KAAU,OAAOA,KAAW,YAAY,KAAK,MAAM;KACnF,IAAMC,IAAUD,EAAmC;KAEnD,AADA,KAAK,GAAG,SAASC,GACjB,KAAK,GAAG,WAAWA,CAAM;IAC3B;IACA,OAAO,EAAE,UAAO;GAClB;EACF;EACA,IAAI,CAAC,KAAK,MAAM,MAAU,MAAM,2BAA2B;EAG3D,CAFI9K,MAAS,YAAYA,MAAS,aAAU,KAAK,QAAQ,GACzD,KAAK,eAAe,IACpB,KAAK;EACL,IAAI;GACF,OAAO,EAAE,MAAM,KAAK,IAAIoK,CAAE,EAAE;EAC9B,UAAU;GACR,KAAK;EACP;CACF;CAGA,IAAY,GAAkB;EAC5B,IAAMf,IAAK,KAAK;EAChB,IAAIe,EAAG,MAAM,QAAQ;GACnB,IAAMW,IAAO,KAAK,OAAOX,EAAG,GAAG;GAC/B,IAAIW,EAAK,WAAW,KAAK,CAAC1B,EAAG,KAAK0B,EAAK,EAAE,CAAC,EAAE,GAAG,OAAO;GACtD,IAAM9G,IAAI8G,EAAK,EAAE,CAAC,GACZlF,IAAkB;IAAE,GAAG5B;IAAG,MAAMyE,GAAWzE,EAAE,MAAMmG,EAAG,IAAIA,EAAG,KAAKA,EAAG,IAAI,KAAK,MAAM,KAAK,MAAMhJ,CAAC,CAAC,CAAC;IAAG,QAAQ;GAAK;GAExH,OADAiI,EAAG,QAAQ,CAAC0B,EAAK,EAAE,CAAC,EAAE,GAAG,CAAClF,CAAI,GAAG,KAAK,IAAI,GAAG;IAAE,SAAS;IAAO,OAAO;GAAS,CAAC,GACzE,CAAC;IAAE,GAAG;IAAS,QAAQ,CAAC5B,CAAC;IAAG,MAAM,CAAC4B,CAAI;GAAE,CAAC;EACnD;EACA,IAAIuE,EAAG,MAAM,SAAS;GACpB,IAAMvE,IAAOuE,EAAG,KAAK,KAAK,MAAM,KAAK,MAAMnG,CAAC,CAAC,GACvC+G,IAAW,IAAI,IAAInF,EAAK,KAAK,MAAM5B,EAAE,GAAI,CAAC,GAC1CiG,IAAM,KAAK,OAAOE,EAAG,MAAM;GACjC,IAAI,CAACF,KAAO,CAACA,EAAI,QAAQ,OAAO;GAChC,IAAMe,IAAgB,CAAC,GAEjBC,IAAW,IAAI,IAAIhB,EAAI,KAAK,MAAQb,EAAG,KAAK1H,CAAE,CAAC,EAAE,OAAO,EAAG,CAAC;GAClE,KAAK,IAAM8H,KAAO1B,GAAK,CAAC,GAAGqC,EAAG,QAAQ,GAAGY,CAAQ,CAAC,GAChD,IAAI,GAAS,IAAIvB,CAAG,GACpB,KAAK,IAAMQ,KAAO,KAAK,OAAOR,CAAG,CAAC,CAAC,QAAQ,GAAG;IAC5C,IAAI,CAACJ,EAAG,KAAKY,EAAI,EAAE,GAAG;IACtB,IAAMkB,KAAM,MAAc;KACxB,IAAMnJ,IAAIiI,EAAI,KAAKlH;KACnB,OAAOf,GAAG,MAAM,OAAOA,EAAE,QAAQ,KAAA,IAAY;MAAE,KAAKA,EAAE;MAAK,GAAG,KAAK,OAAOA,EAAE,GAAG,CAAC,CAAC,WAAW,MAAMgB,EAAE,SAASiH,EAAI,QAAQjH,EAAE,UAAUD,CAAC;KAAE,IAAI,KAAA;IAC9I,GACMqI,IAAa;KAAE,GAAG;KAAS,QAAQ,CAACnB,EAAI,CAAC;KAAG,MAAM,CAAC;KAAG,MAAMkB,EAAGlB,EAAI,QAAQ,CAAC;KAAG,OAAOkB,EAAGlB,EAAI,QAAQ,CAAC;IAAE;IAE9G,AADAZ,EAAG,QAAQ,CAACY,EAAI,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG;KAAE,SAAS;KAAO,OAAO;IAAS,CAAC,GACxEgB,EAAM,KAAKG,CAAI;GACjB;GAEF,IAAMC,IAAS,KAAK,OAAOjB,EAAG,MAAM;GACpC,IAAI,CAACiB,GAAQ,QAAQ,OAAOJ;GAC5B,IAAMlC,IAASsC,EAAO,KAAK,MAAOhC,EAAG,KAAK1H,CAAE,CAAE,CAAC,CAAC,OAAO,OAAO;GAI9D,OAHIoH,EAAO,WAAWsC,EAAO,WAC7BhC,EAAG,QAAQgC,GAAQxF,GAAM,KAAK,IAAI,GAAG;IAAE,SAAS;IAAO,OAAO;GAAS,CAAC,GACxEoF,EAAM,KAAK;IAAE,GAAG;IAAS;IAAQ;GAAK,CAAC,IAChCA;EACT;EACA,IAAIb,EAAG,MAAM,UAAU;GACrB,IAAIvE,IAAOuE,EAAG,KAAK,KAAK,MAAM,KAAK,MAAMpI,CAAC,CAAC,GACvC0H,GACA4B,IAAQ;GACZ,IAAIlB,EAAG,OAAO,QAAQ;IAEpB,IADA,IAAK,KAAK,SAASA,EAAG,OAAO,EAAE,GAC3BV,IAAK,GAAG;KAEV,IAAMxH,IAAIkI,EAAG,OAAO,MAAM,MAAM,KAAK,SAASpH,CAAC,KAAK,CAAC;KACrD,IAAI,CAACd,GAAG,OAAO;KACf,IAAK,KAAK,SAASA,CAAC;IACtB;IACA,OAAOwH,IAAK4B,IAAQ,KAAK,GAAG,OAAO,UAAUlB,EAAG,OAAO,MAAM,MAAMtC,EAAQ,KAAK,GAAG,OAAO4B,IAAK4B,IAAQpJ,CAAC,CAAC,IAAG;GAC9G,OAEE,IADA,IAAKkI,EAAG,OAAO,KAAK,SAASA,EAAG,IAAI,IAAI,IAAI,GACxCA,EAAG,QAAQV,MAAO,GAAG,OAAO;GAElC,IAAMX,IAAS,KAAK,GAAG,OAAO,MAAMW,GAAIA,IAAK4B,CAAK,GAE5C/K,IAAM,IAAI,IAAIwI,EAAO,SAAS,MAAO/G,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,IAAY,CAAC,CAACA,EAAE,KAAKA,CAAC,CAAU,IAAI,CAAC,CAAE,CAAC;GAG5G,OAFA,IAAO6D,EAAK,KAAK,MAAO7D,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAazB,EAAI,IAAIyB,EAAE,GAAG,IAAIzB,EAAI,IAAIyB,EAAE,GAAG,IAAKA,CAAE,GACnGqH,EAAG,cAAcK,GAAI4B,GAAOzF,GAAM,MAAM,EAAK,GACtC,CAAC;IAAE,GAAG;IAAU;IAAQ;IAAM,MAAM6D,IAAK,IAAI7B,EAAK,KAAK,GAAG,OAAO6B,IAAK,EAAE,IAAI;GAAK,CAAC;EAC3F;EACA,OAAO;CACT;CAEA,OAAO,GAAe;EACpB,IAAM6B,IAAIC;EACV,IAAKD,KAAM,KAAK,MAChB;GAEA,AAFA,KAAK,QAAQ,GACb,KAAK,eAAe,IACpB,KAAK;GACL,IAAI;IACF,KAAK,IAAIxI,IAAIwI,EAAE,SAAS,GAAGxI,KAAK,GAAG,KAAK,KAAK,SAASwI,EAAExI,EAAE;GAC5D,UAAU;IACR,KAAK;GACP;EAPa;CAQf;CAEA,SAAiB,GAAS;EACxB,IAAMsG,IAAK,KAAK;EAChB,IAAIkC,EAAE,MAAM,SAAS;GACnB,IAAI,CAACA,EAAE,KAAK,QAAQ;IAElB,IAAM5C,KAAM,MAA+CpH,IAAI,KAAK,OAAOA,EAAE,GAAG,CAAC,CAACA,EAAE,KAAK,KAAA,GACnFiE,IAAOmD,EAAG4C,EAAE,IAAI;IACtB,IAAI/F,KAAQ6D,EAAG,KAAK7D,EAAK,EAAE,GAAG,OAAO6D,EAAG,QAAQ,CAAC7D,EAAK,EAAE,GAAG,CAACA,EAAK,GAAG,GAAG+F,EAAE,MAAM,GAAG,KAAK,IAAI,GAAG;KAAE,SAAS;KAAO,OAAO;IAAS,CAAC;IACjI,IAAMvC,IAAQL,EAAG4C,EAAE,KAAK;IACxB,AAAIvC,KAASK,EAAG,KAAKL,EAAM,EAAE,KAAGK,EAAG,QAAQ,CAACL,EAAM,EAAE,GAAG,CAAC,GAAGuC,EAAE,QAAQvC,EAAM,CAAC,GAAG,KAAK,IAAI,GAAG;KAAE,SAAS;KAAO,OAAO;IAAS,CAAC;IAC9H;GACF;GACA,IAAM1E,IAAQ,KAAK,OAAOiH,EAAE,KAAK,EAAE,CAAC,GAAI,CAAC,CAAC;GAC1C,IAAI,CAACjH,GAAO;GACZ,IAAM4F,IAAMqB,EAAE,KAAK,KAAK,GAAG,MAAMjH,EAAM,GAAG,QAAQ,QAAQ,OAAOA,EAAM,QAAQvB,CAAC,CAAC,CAAC;GAClF,IAAImH,EAAI,MAAM,GAAI,MAAMb,EAAG,KAAK1H,CAAE,CAAC,EAAE,QAAQ4J,EAAE,KAAKxI,EAAE,CAAC,GAAG,GAAG;GAC7D,EAAG,QAAQmH,GAAKqB,EAAE,QAAQ,KAAK,IAAI,GAAG;IAAE,SAAS;IAAO,OAAO;GAAS,CAAC;GACzE;EACF;EACA,IAAMrJ,IAAIqJ,EAAE,KAAK,SAAS1D,EAAK0D,EAAE,KAAK,EAAE,IAAI,MACtC7B,IAAKxH,IAAI,KAAK,SAASA,CAAC,IAAIqJ,EAAE,OAAO,KAAK,SAASA,EAAE,IAAI,IAAI,IAAI;EACvE,IAAI7B,IAAK,GAAG;EACZ,IAAMnJ,IAAM,IAAI,IAAI,KAAK,GAAG,OAAO,MAAMmJ,GAAIA,IAAK6B,EAAE,KAAK,MAAM,CAAC,CAAC,SAAS,MAAOvJ,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,IAAY,CAAC,CAACA,EAAE,KAAKA,CAAC,CAAU,IAAI,CAAC,CAAE,CAAC;EAClJ,EAAG,cAAc0H,GAAI6B,EAAE,KAAK,QAAQA,EAAE,OAAO,KAAK,MAAOvJ,EAAE,MAAM,OAAOA,EAAE,QAAQ,KAAA,KAAazB,EAAI,IAAIyB,EAAE,GAAG,IAAIzB,EAAI,IAAIyB,EAAE,GAAG,IAAKA,CAAE,GAAG,MAAM,EAAK;CACpJ;CAIA,IAAY,GAAuB;EACjC,IAAMiC,IAAI,KAAK,GAAG,KAAKvB,EAAI,EAAE;EAC7B,IAAI,CAACuB,KAAKA,EAAE,QAAQ,KAAA,GAAW,OAAO;EACtC,IAAM8G,IAAO,KAAK,OAAO9G,EAAE,GAAG;EAC9B,OAAO;GAAE,KAAKA,EAAE;GAAK,GAAG,KAAK,IAAI,GAAG8G,EAAK,WAAW,MAAMjI,EAAE,OAAOJ,EAAI,EAAE,CAAC;GAAG,GAAGA,EAAI;EAAE;CACxF;CAEA,MAAc,GAAqB;EACjC,IAAMqI,IAAO,KAAK,OAAOnJ,EAAE,GAAG,GACxBkB,IAAIiI,EAAK,KAAK,IAAInJ,EAAE,GAAGmJ,EAAK,SAAS,CAAC;EAC5C,OAAOjI,IAAI;GAAE,IAAIA,EAAE;GAAI,GAAG,KAAK,IAAIlB,EAAE,GAAGP,EAAKyB,EAAE,EAAE,IAAc,CAAC;EAAE,IAAI;CACxE;CAGA,UAAkB;EAChB,IAAI,KAAK,QAAQ,CAAC,KAAK,MAAM;EAC7B,IAAM2I,IAAU,CAAC,CAAC,KAAK,GAAG,MAAM,QAAQ,GAClCrH,IAAM,KAAK,GAAG,MAAM,IAAI,GACxBrC,IAAIqC,KAAO,KAAK,IAAIA,EAAI,CAAC,GACzBkD,IAAIlD,KAAO,KAAK,IAAIA,EAAI,CAAC;EAC/B,IAAI,CAACrC,KAAK,CAACuF,GAAG;EACd,IAAMpE,oBAAO,IAAI,IAAoB;EACrC,KAAK,IAAMtB,KAAK,CAACG,GAAGuF,CAAC,GAAG;GACtB,IAAMxE,IAAI,KAAK,OAAOlB,EAAE,GAAG,CAAC,CAACA,EAAE;GAC/B,AAAIkB,KAAGI,EAAK,IAAI,GAAGtB,EAAE,IAAI,GAAGA,EAAE,KAAKC,EAASiB,EAAE,EAAE,IAAc,CAAC;EACjE;EACA,KAAK,OAAO;GAAE;GAAG;GAAG;GAAM;EAAQ;CACpC;CAGA,MAAmB;EACjB,IAAMrB,IAAI,KAAK,MACT4B,IAAW;GAAE,IAAI;GAAK,GAAG;EAAE;EACjC,IAAI,CAAC5B,GAAG,OAAO,KAAK,GAAG,MAAM,WAAW;GAAE,GAAG4B;GAAU,GAAGA;EAAS;EACnE,IAAMqI,KAAO,MAAiB;GAC5B,IAAM5I,IAAI,KAAK,OAAOlB,EAAE,GAAG,CAAC,CAACA,EAAE,MAAM,KAAK,OAAOA,EAAE,GAAG,CAAC,CAAC;GACxD,IAAI,CAACkB,GAAG,OAAO,KAAK,GAAG,MAAM,SAAS,KAAKO;GAC3C,IAAMsI,IAAMlK,EAAE,KAAK,IAAI,GAAGG,EAAE,IAAI,GAAGA,EAAE,GAAG,GAClCgK,IAAM/J,EAASiB,EAAE,EAAE,IAAc;GACvC,OAAO;IAAE,IAAIA,EAAE;IAAI,GAAG6I,MAAQ,KAAA,IAAY,KAAK,IAAI/J,EAAE,GAAGgK,EAAI,MAAM,IAAI9C,EAAUlH,EAAE,GAAG+J,GAAKC,CAAG;GAAE;EACjG;EACA,OAAO;GAAE,GAAGF,EAAIjK,EAAE,CAAC;GAAG,GAAGiK,EAAIjK,EAAE,CAAC;EAAE;CACpC;CAEA,UAAU;EACR,IAAMA,IAAI,KAAK,MACToK,IAAU,KAAK;EAErB,IADA,KAAK,eAAe,IAChB,CAAC,KAAK,MAAM;EAChB,IAAI,CAACpK,GAAG;GAEN,AAAIoK,MAAS,KAAK,GAAG,aAAa;GAClC;EACF;EACA,IAAMzH,IAAM,KAAK,IAAI;EAIrB,AAHA,KAAK,OAAO,MAEZ,KAAK,GAAG,aAAa3C,EAAE,UAAU2C,IAAM,MAClC3C,EAAE,YAAS,KAAK,GAAG,MAAM,UAAU2C;CAC1C;CAIA,cAAsB;EACpB,AAAI,MAAK,OAAQ,KAAK,SACtB,KAAK,MAAM,4BAA4B;GACrC,KAAK,MAAM;GACX,IAAMA,IAAM,KAAK,QAAQ,KAAK,GAAG,MAAM,QAAQ;GAC/C,IAAI,CAACA,GAAK;GACV,IAAMrC,IAAI,KAAK,IAAIqC,EAAI,CAAC,GAClBkD,IAAI,KAAK,IAAIlD,EAAI,CAAC;GACxB,IAAI,CAACrC,KAAK,CAACuF,GAAG;GACd,IAAMrD,IAAkB;IAAE,GAAG;IAAQ;IAAG;GAAE,GACpC6H,IAAM,KAAK,UAAU7H,CAAC;GAC5B,AAAI6H,MAAQ,KAAK,iBACjB,KAAK,eAAeA,GACpB,KAAK,aAAa7H,CAAC;EACrB,CAAC;CACH;CAGA,MAAM,GAAmB,GAA4D;EACnF,IAAI,CAAC,KAAK,MAAM,OAAO;GAAE,OAAO;GAAM,KAAK,CAAC;EAAE;EAC9C,IAAM8H,IAAQ1F,EAAK,cAA2B,WAAW,GACnDtE,IAAI,KAAK,MAAMkC,EAAE,CAAC,GAClBqD,IAAI,KAAK,MAAMrD,EAAE,CAAC;EACxB,IAAI,CAAC8H,KAAS,CAAChK,KAAK,CAACuF,GAAG,OAAO;GAAE,OAAO;GAAM,KAAK,CAAC;EAAE;EACtD,IAAM0E,IAAKrF,EAAWoF,GAAOzE,CAAC,GAC1BtD,IAAwB;EAC5B,IAAIgI,GAAI;GACN,IAAM5K,IAAI,SAAS,YAAY;GAC/B,IAAI;IAGF,AAFAA,EAAE,SAAS4K,EAAG,IAAIA,EAAG,EAAE,GACvB5K,EAAE,SAAS,EAAI,GACf,IAAQA,EAAE,eAAe,CAAC,CAAC,OAAO4K,EAAG,EAAE,CAAC,aAAa,IAAKA,EAAG,EAAE,CAAa,sBAAsB,IAAI5K,EAAE,sBAAsB;GAChI,QAAQ;IACN,IAAQ;GACV;EACF;EACA,IAAMgD,IAAiB,CAAC,GAClB6H,IAAKtF,EAAWoF,GAAOhK,CAAC;EAC9B,IAAIkK,KAAMD,MAAOjK,EAAE,OAAOuF,EAAE,MAAMvF,EAAE,MAAMuF,EAAE,IAAI;GAC9C,IAAMlG,IAAI,SAAS,YAAY;GAC/B,IAAI;IAEF,AADgB,KAAK,GAAG,IAAIW,EAAE,IAAIuF,EAAE,EAAE,IAAI,KAAMvF,EAAE,OAAOuF,EAAE,MAAMvF,EAAE,IAAIuF,EAAE,KAEvElG,EAAE,SAAS6K,EAAG,IAAIA,EAAG,EAAE,GACvB7K,EAAE,OAAO4K,EAAG,IAAIA,EAAG,EAAE,MAErB5K,EAAE,SAAS4K,EAAG,IAAIA,EAAG,EAAE,GACvB5K,EAAE,OAAO6K,EAAG,IAAIA,EAAG,EAAE;IAEvB,KAAK,IAAMjJ,KAAK,MAAM,KAAK5B,EAAE,eAAe,CAAC,GAAG,AAAI4B,EAAE,QAAQ,MAAKoB,EAAI,KAAKpB,CAAC;GAC/E,QAAQ,CAER;EACF;EACA,OAAO;GAAE;GAAO;EAAI;CACtB;AACF,GClkBMkJ,KAAc,MAAwBlJ,MAAM,MAErCmJ,IAAb,MAAyC;CAqB7B;CACA;CACA;CAtBV,OAAO;CAEP,MAAM;CACN,SAAuB;CACvB;CACA,wBAAiB,IAAI,IAAsB;CAC3C,MAA0D,CAAC;CAC3D,WAA2E;CAC3E,SAA6B,CAAC;CAC9B;CACA,SAAiB;CACjB,SAAiB;CACjB,UAAkB;CAClB,4BAAoB,IAAI,IAAkD;CAC1E;CACA;CACA,aAAqB;CACrB,SAAiB;CAEjB,YACE,GACA,GACA,GACA;EAcA,AAjBQ,KAAA,YAAAC,GACA,KAAA,UAAAC,GACA,KAAA,OAAA5H,GAER,KAAK,QAAQ,QAAQ,QAAQ4H,EAAQ,QAAQ,CAAC,CAAC,CAAC,OAAO,MAAM,KAAK,KAAM,EAAY,OAAO,CAAC,GAC5F,EAAU,aAAa,MAAM,KAAK,cAAc,KAAK,UAAUvM,CAAC,CAAC,GACjE,EAAU,YAAY,MAAM;GAC1B,AAAI2B,MAAM,UACR,KAAK,SAAS,IACd2K,EAAU,KAAK;IAAE,GAAG;IAAS,MAAM3H,EAAK;IAAM,MAAMA,EAAK;IAAM,MAAM,KAAK,SAAS,KAAK,MAAM,KAAA;IAAW,MAAM,KAAK,SAAS,KAAK,OAAO,KAAA;GAAU,CAAC,KAC3IhD,MAAM,aACf,KAAK,SAAS,IACd,KAAK,MAAM,MAAM,GACjB,KAAK,KAAK,SAAS,CAAC,CAAC,GACjB,KAAK,WAAW,WAAS,KAAK,UAAU,KAAK,SAAS,YAAY,YAAY;EAEtF,GACA2K,EAAU,QAAQ;CACpB;CAKA,IAAI,UAAkB;EACpB,QAAQ,KAAK,UAAU,MAAM,UAAU,KAAK,KAAK,OAAO;CAC1D;CAGA,SAAiB;EACf,OAAO,GAAG,KAAK,KAAK,GAAG,EAAE,KAAK,QAAQ,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;CAChF;CAGA,OAAO,GAA0B;EAC/B,OAAO,IAAI,SAAS,GAAS,MAC3B,KAAK,QAAQ,YAAY;GACvB,IAAI,KAAK,WAAW,SAAS,OAAOE,EAAW,MAAM,KAAK,SAAS,uBAAuB,CAAC;GAC3F,IAAI,KAAK,QAAQ,cAAclC,CAAE,GAC/B,KAAK,OAAO,KAAK;IAAE;IAAI,SAAS;IAAO,MAAMjB;GAAQ,CAAC;QACjD;IACL,IAAIoD;IACJ,IAAI;KACF,IAAM,MAAM,KAAK,QAAQ,MAAMnC,GAAI,OAAO;IAC5C,SAAS,GAAG;KACV,OAAOkC,EAAO,CAAC;IACjB;IAEA,AADA,KAAK,OAAO,KAAK;KAAE;KAAI,SAAS;KAAM,MAAMC,EAAI;IAAK,CAAC,GACtDpD,EAAQoD,EAAI,MAAM;GACpB;GACA,KAAK,MAAM;EACb,CAAC,CACH;CACF;CAGA,KAAK,GAAQ,GAAe;EAE1B,AADA,KAAK,OAAO,KAAK;GAAE;GAAI,SAAS;GAAM;EAAK,CAAC,GAC5C,KAAK,QAAQ,YAAY,KAAK,MAAM,CAAC;CACvC;CAEA,YAAY,GAAe;EAEzB,IADA,KAAK,WAAWtL,GACZ,KAAK,eAAe;EACxB,IAAMuL,IAAO,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,IAAI,KAAK,WAAW;EAC5D,KAAK,gBAAgB,iBAAiB;GAGpC,AAFA,KAAK,gBAAgB,KAAA,GACrB,KAAK,aAAa,KAAK,IAAI,GACvB,KAAK,UAAU,KAAK,UAAQ,KAAK,UAAU,KAAK;IAAE,GAAG;IAAY,MAAM,KAAK;GAAS,CAAC;EAC5F,GAAGA,CAAI;CACT;CAEA,GAAkC,GAAU,GAA+C;EACzF,IAAIlM,IAAM,KAAK,UAAU,IAAImM,CAAK;EAGlC,OAFKnM,KAAK,KAAK,UAAU,IAAImM,GAAQ,oBAAM,IAAI,IAAI,CAAE,GACrDnM,EAAI,IAAIJ,CAAwB,SACnBI,EAAK,OAAOJ,CAAwB;CACnD;CAGA,OAAsB;EACpB,OAAO,KAAK;CACd;CAEA,QAAQ;EAIN,AAHA,KAAK,SAAS,IACd,aAAa,KAAK,aAAa,GAC/B,KAAK,UAAU,MAAM,GACrB,KAAK,UAAU,MAAM;CACvB;CAIA,KAA4C,GAAU,GAAwB;EAC5E,KAAK,IAAMA,KAAM,KAAK,UAAU,IAAIuM,CAAK,KAAK,CAAC,GAAG,EAAsCxL,CAAI;CAC9F;CAEA,UAAkB,GAAiB;EACjC,AAAI,KAAK,WAAWQ,MACpB,KAAK,SAASA,GACd,KAAK,KAAK,UAAUA,CAAC;CACvB;CAEA,KAAa,GAAiB;EAG5B,AAFA,KAAK,QAAQiL,GACb,KAAK,UAAU,OAAO,GACtB,KAAK,KAAK,SAAa,MAAMA,CAAO,CAAC;CACvC;CAEA,QAAgB,GAAgC;EAC9C,KAAK,QAAQ,KAAK,MAAM,KAAKxM,CAAE,CAAC,CAAC,OAAO,MAAM;GAE5C,AADA,QAAQ,MAAM,0BAA0B,CAAC,GACzC,KAAK,KAAK,SAAS,CAAU;EAC/B,CAAC;CACH;CAEA,MAAc,UAAU,GAAW;EACjC,IAAI,OAAK,UAAU,KAAK,WAAW,UACnC,QAAQJ,EAAE,GAAV;GACE,KAAK,WAAW;IACd,IAAIA,EAAE,OAAO,OAAO,KAAK,KAAK,4DAA4D;IAC1F,IAAMwE,IAAQ,CAAC,KAAK;IAIpB,AAHA,KAAK,OAAOxE,EAAE,MACd,KAAK,SAAS,IACVwE,KAAO,KAAK,UAAU,SAAS,GACnC,KAAK,MAAM,MAAM;IACjB,KAAK,IAAML,KAAKnE,EAAE,OAAO,KAAK,MAAM,IAAImE,EAAE,MAAMA,CAAC;IACjD,KAAK,KAAK,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;IAC3C,KAAK,IAAMjC,KAAKlC,EAAE,KAAK,MAAM,KAAK,QAAQkC,CAAC;IAS3C,AARI,KAAK,aAGP,KAAK,SAAS,OAAO,KAAK,KAC1B,KAAK,UAAU,KAAK;KAAE,GAAG;KAAO,IAAI,KAAK,SAAS;KAAI,MAAM,KAAK;KAAK,KAAK,KAAK,SAAS,MAAM,KAAK,MAAMe,EAAE,EAAE,CAAC,CAAC,OAAOmJ,CAAO;IAAE,CAAC,IAEnI,KAAK,MAAM,GACP,KAAK,aAAa,KAAA,KAAW,KAAK,UAAU,KAAK;KAAE,GAAG;KAAY,MAAM,KAAK;IAAS,CAAC,GAC3F,KAAK,UAAU,MAAM;IACrB;GACF;GACA,KAAK,SACH,OAAO,KAAK,QAAQpM,EAAE,CAAC;GACzB,KAAK,YAAY;IACf,IAAMmE,IAAI,KAAK,MAAM,IAAInE,EAAE,IAAI;IAC/B,AAAImE,MACF,KAAK,MAAM,IAAInE,EAAE,MAAM;KAAE,GAAGmE;KAAG,UAAUnE,EAAE;IAAK,CAAC,GACjD,KAAK,KAAK,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;IAE7C;GACF;GACA,KAAK;IAEH,AADA,KAAK,MAAM,IAAIA,EAAE,KAAK,MAAMA,EAAE,IAAI,GAClC,KAAK,KAAK,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;IAC3C;GACF,KAAK;IAEH,AADA,KAAK,MAAM,OAAOA,EAAE,IAAI,GACxB,KAAK,KAAK,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;IAC3C;GACF,KAAK,SACH,OAAO,KAAK,KAAKA,EAAE,OAAO;EAC9B;CACF;CAEA,MAAc,QAAQ,GAAU;EAC9B,IAAIkC,EAAE,OAAO,KAAK,KAAK;EACvB,IAAIA,EAAE,QAAQ,KAAK,MAAM,GAAG,OAAO,KAAK,KAAK,sBAAsB,KAAK,MAAM,EAAE,GAAGA,EAAE,MAAM,EAAE,EAAE;EAC/F,IAAI,KAAK,YAAYA,EAAE,OAAO,KAAK,SAAS,IAAI,MAAM,KAAK,IAAIA,CAAC;OAC3D;GACH,IAAM4I,IAAM,KAAK,UAAU5I,CAAC;GAC5B,IAAI4I,MAAQ,MAAM;GAElB,AADA,MAAM,KAAK,OAAOA,CAAG,GACrB,KAAK,IAAI,KAAK;IAAE,KAAK5I,EAAE;IAAK,MAAMA,EAAE;IAAM;GAAI,CAAC;EACjD;EACA,KAAK,MAAMA,EAAE;EACb,IAAM2K,IAAM,KAAK,KAAK,aAAa;EAInC,AAHI,KAAK,IAAI,SAASA,KAAK,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,SAASA,CAAG,GACnE,KAAK,MAAM,GACX,KAAK,QAAQ,UAAU,GACvB,KAAK,KAAK,UAAU,KAAA,CAAS;CAC/B;CAGA,UAAkB,GAAuB;EACvC,IAAI/B,IAAO5I,EAAE,IAAa,KAAK,MAAMW,CAAc;EACnD,IAAIX,EAAE,OAAOA,EAAE,MAAM,MAAM,KAAK,IAAI,EAAE,EAAE,OAAO,YAAYA,EAAE,OAAO,KAAK,KAAK,MAAMA,EAAE,MAEpF,OADA,KAAK,KAAK,oDAAoD,GACvD;EAET,KAAK,IAAMmC,KAAK,KAAK,KACnB,IAAI,IAAE,OAAOnC,EAAE,QAAQmC,EAAE,SAASnC,EAAE,OACpC,KAAK,IAAMiC,KAAKE,EAAE,KAAK,IAAMyG,EAAI,KAAK,MAAOjI,MAAM,OAAO,OAAO,KAAK,QAAQ,UAAUA,GAAGsB,CAAC,CAAE;EAEhG,OAAO2G,EAAI,OAAOsB,CAAO;CAC3B;CAEA,MAAc,UAAU,GAAmB;EACzC,KAAK,IAAInJ,IAAI6J,EAAM,SAAS,GAAG7J,KAAK,GAAG,KAAK;GAC1C,IAAM8J,IAAKD,EAAM7J;GACjB,IAAK8J,EAAG,SACR;QAAI;KACF,MAAM,KAAK,QAAQ,OAAOA,EAAG,IAAI;IACnC,SAAS,GAAG;KACV,QAAQ,MAAM,wCAAwC,CAAC;IACzD;IAEA,AADA,EAAG,UAAU,IACb,EAAG,OAAO,KAAA;GAFV;EAGF;CACF;CAEA,MAAc,OAAO,GAAc,GAAiB;EAClD,IAAKA,EAAG,IACR,IAAI;GACF,IAAMN,IAAM,MAAM,KAAK,QAAQ,MAAMM,EAAG,IAAI7M,CAAI;GAGhD,AAFA,EAAG,OAAOuM,EAAI,MACd,EAAG,UAAU,IACb,AAEEM,EAAG,UADHA,EAAG,KAAKN,EAAI,MAAM,GACR,KAAA;EAEd,SAAS,GAAG;GAEV,QAAQ,MAAM,wCAAwC,CAAC;EACzD;CACF;CAEA,MAAc,OAAO,GAAW;EAC9B,MAAM,KAAK,QAAQ,UAAU3B,CAAG;EAChC,IAAMF,IAAU,CAAC,GAAI,KAAK,UAAU,SAAS,CAAC,GAAI,GAAG,KAAK,MAAM;EAChE,IAAI,CAACA,EAAQ,QAAQ;GACnB,KAAK,IAAMN,KAAMQ,GAAK,MAAM,KAAK,YAAYR,CAAE;GAC/C;EACF;EACA,IAAMvE,IAAO6E,EAAQ,KAAK,MAAO;GAC/B,IAAI/H,IAAIkK,EAAG;GACX,KAAK,IAAMzL,KAAKwJ,GAAK,AAAIjI,MAAM,SAAM,IAAI,KAAK,QAAQ,UAAUA,GAAGvB,CAAC;GACpE,OAAOuB;EACT,CAAC,GACKmK,IAAUpC,EAAQ,QAAQ,MAAOmC,EAAG,WAAWA,EAAG,EAAE,CAAC,CAAC,KAAK,MAAOA,EAAG,EAAQ,GAC7EE,IAASlH,EAAK,MAAM,GAAG,MAAMlD,MAAM+H,EAAQ3H,EAAE,CAAC,EAAE,KAAM+J,EAAQ,SAAS,MAAM,KAAK,QAAQ,YAAYA,GAASlC,CAAG,KAAK;EAC7H,AAAImC,KAAQ,MAAM,KAAK,UAAUrC,CAAO;EACxC,KAAK,IAAMN,KAAMQ,GAAK,MAAM,KAAK,YAAYR,CAAE;EAE/C,IADAM,EAAQ,SAAS,GAAI,MAAO,EAAG,KAAK7E,EAAK9C,EAAG,GACvCgK,GACL,KAAK,IAAMF,KAAMnC,GACf,AAAI,CAACmC,EAAG,MAAO,KAAK,QAAQ,cAAcA,EAAG,EAAE,KAAK,CAACA,EAAG,WAAWA,EAAG,QACtE,MAAM,KAAK,OAAOA,GAAI,QAAQ;CAElC;CAEA,MAAc,YAAY,GAAQ;EAChC,IAAI;GACF,MAAM,KAAK,QAAQ,MAAMzC,GAAI,QAAQ;EACvC,SAASjG,GAAG;GAEV,AADA,QAAQ,MAAM,2CAA2CA,GAAGiG,CAAE,GAC9D,KAAK,KAAK,SAASjG,CAAU;EAC/B;CACF;CAGA,MAAc,IAAI,GAAU;EAC1B,IAAMyI,IAAQ,KAAK,SAAU;EAC7B,KAAK,WAAW;EAChB,IAAMI,IAAOJ,EAAM,WAAW,MAAOC,EAAG,MAAM,CAACA,EAAG,OAAO;EACzD,IAAIG,KAAQ,GAAG;GAEb,IAAMC,IAAO,CAAC,GAAGL,EAAM,MAAMI,CAAI,GAAG,GAAG,KAAK,MAAM;GAElD,AADA,MAAM,KAAK,QAAQ,UAAUJ,EAAM,MAAMI,CAAI,CAAC,CAAC,QAAQ,MAAOH,EAAG,MAAM,CAACA,EAAG,OAAO,CAAC,CAAC,KAAK,MAAOA,EAAG,EAAQ,CAAC,GAC5G,MAAM,KAAK,UAAUI,CAAI;GACzB,KAAK,IAAMJ,KAAMI,GAEf,AADgB,CAACL,EAAM,SAASC,CAAE,KAAKA,EAAG,MAAM,KAAK,QAAQ,cAAcA,EAAG,EAAE,KAAKA,EAAG,QAC1E,MAAM,KAAK,OAAOA,GAAIA,EAAG,OAAO,UAAU,QAAQ;EAEpE;EACA,KAAK,IAAMA,KAAMD,GAAO,AAAIC,EAAG,QAAMA,EAAG,KAAK,IAAI;EACjD,KAAK,IAAI,KAAK;GAAE,KAAK7K,EAAE;GAAK,MAAMA,EAAE;GAAM,KAAK4K,EAAM,KAAK,MAAM7J,EAAE,EAAE,CAAC,CAAC,OAAOmJ,CAAO;EAAE,CAAC;CACzF;CAEA,QAAgB;EACd,IAAI,KAAK,YAAY,CAAC,KAAK,OAAO,UAAU,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU,KAAK,WAAW,SAAS;EACrG,IAAMU,IAAQ,KAAK;EACnB,KAAK,SAAS,CAAC;EACf,IAAMM,IAAK,GAAG,KAAK,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK;EAE7D,AADA,KAAK,WAAW;GAAE;GAAI,MAAM,KAAK;GAAK;EAAM,GAC5C,KAAK,UAAU,KAAK;GAAE,GAAG;GAAO;GAAI,MAAM,KAAK;GAAK,KAAKN,EAAM,KAAK,MAAM7J,EAAE,EAAE,CAAC,CAAC,OAAOmJ,CAAO;EAAE,CAAC;CACnG;AACF,GC/XMiB,IAAM;AAEZ,SAASC,EAAM,GAAwB;CACrC,IAAI3L,IAAI;CACR,KAAK,IAAIsB,IAAI,GAAGA,IAAIsK,EAAG,QAAQ,KAAK,OAAQ,KAAK,OAAO,aAAa,GAAGA,EAAG,SAAStK,GAAGA,IAAI,KAAM,CAAC;CAClG,OAAO,KAAKtB,CAAC;AACf;AAEA,SAAS6L,GAAQ,GAAuB;CACtC,IAAMC,IAAM,KAAK9L,CAAC,GACZY,IAAM,IAAI,WAAWkL,EAAI,MAAM;CACrC,KAAK,IAAIxK,IAAI,GAAGA,IAAIwK,EAAI,QAAQ,KAAK,EAAIxK,KAAKwK,EAAI,WAAWxK,CAAC;CAC9D,OAAOV;AACT;AAEA,SAAgBmL,EAAO,GAAwB;CAC7C,OAAO,KAAK,UAAUC,IAAQ,GAAI,MAC5BC,aAAa,aAAmB,GAAGP,IAAMC,EAAMM,CAAC,EAAE,IAClDA,aAAa,cAAoB,GAAGP,IAAMC,EAAM,IAAI,WAAWM,CAAC,CAAC,EAAE,IAChEA,CACR;AACH;AAEA,SAAgBC,EAAoB,GAAiB;CACnD,OAAO,KAAK,MAAMzK,IAAO,GAAI,MAAOwK,KAAK,OAAOA,KAAM,YAAY,OAAOA,EAAEP,MAAS,YAAY,OAAO,KAAKO,CAAC,CAAC,CAAC,WAAW,IAAIJ,GAAQI,EAAEP,EAAI,IAAIO,CAAE;AACpJ;;ACXA,IAAaE,IAAb,MAAqD;CASzC;CACA;CATV;CACA;CACA;CACA,SAAiB;CACjB,QAAgB;CAChB;CAEA,YACE,GACA,GACA;EADQ,AADA,KAAA,MAAAC,GACA,KAAA,YAAAC;CACP;CAEH,UAAU;EAER,AADA,KAAK,SAAS,IACd,KAAK,KAAK;CACZ;CAEA,OAAe;EACb,IAAI,KAAK,QAAQ;EACjB,KAAK,WAAW,YAAY;EAC5B,IAAMC,IAAM,KAAK,KAAK,IAAI,UAAU,KAAK,KAAK,KAAK,SAAS;EAgB5D,AAfA,EAAG,eAAe;GAEhB,AADA,KAAK,QAAQ,GACb,KAAK,WAAW,MAAM;EACxB,GACA,EAAG,aAAa,MAAM;GACpB,AAAI,OAAO,EAAE,QAAS,YAAU,KAAK,YAAYJ,EAAe,EAAE,IAAI,CAAC;EACzE,GACA,EAAG,gBAAgB;GAIjB,IAHI,KAAK,OAAOI,MAChB,KAAK,KAAK,KAAA,GACV,KAAK,WAAW,QAAQ,GACpB,KAAK,SAAQ;GACjB,IAAMC,IAAQ,KAAK,IAAI,KAAQ,MAAM,KAAK,KAAK,OAAO,KAAK,MAAO,KAAK,OAAO,IAAI;GAClF,KAAK,QAAQ,iBAAiB,KAAK,KAAK,GAAGA,CAAK;EAClD,GACA,EAAG,gBAAgBD,EAAG,MAAM;CAC9B;CAEA,KAAK,GAAgB;EACnB,AAAI,KAAK,IAAI,eAAe,UAAU,QAAM,KAAK,GAAG,KAAKP,EAAOS,CAAG,CAAC;CACtE;CAEA,QAAQ;EAEN,AADA,KAAK,SAAS,IACd,aAAa,KAAK,KAAK;EACvB,IAAMF,IAAK,KAAK;EAGhB,AAFA,KAAK,KAAK,KAAA,GACVA,GAAI,MAAM,GACV,KAAK,WAAW,QAAQ;CAC1B;AACF,GAMaG,KAAb,MAAkD;CAQtC;CACA;CARV;CACA;CACA;CACA,KAAa,QAAQ,QAAQ;CAC7B,OAAe,QAAQ,QAAQ;CAE/B,YACE,GACA,IAA2C,GAC3C;EADQ,AADA,KAAA,MAAAC,GACA,KAAA,UAAAC;CACP;CAEH,QAAgB;EACd,IAAMC,IAAK,OAAO,KAAK,WAAY,aAAa,KAAK,QAAQ,IAAI,KAAK;EACtE,OAAO,IAAI,SAAe,MAAOA,IAAK,IAAI,WAAWjN,GAAGiN,CAAE,IAAI,eAAejN,CAAC,CAAE;CAClF;CAEA,UAAU;EACR,IAAI,KAAK,MAAM;EACf,KAAK,WAAW,YAAY;EAC5B,IAAMkN,IAAQ,KAAK,OAAO,KAAK,IAAI,SAAS,MAAM;GAChD,IAAMC,IAAOf,EAAO1N,CAAC;GAErB,KAAK,OAAO,KAAK,KACd,WAAW,KAAK,MAAM,CAAC,CAAC,CACxB,WAAW;IACV,AAAI,KAAK,SAASwO,KAAM,KAAK,YAAYX,EAAeY,CAAI,CAAC;GAC/D,CAAC;EACL,CAAC;EACD,qBAAqB,KAAK,WAAW,MAAM,CAAC;CAC9C;CAEA,KAAK,GAAgB;EACnB,IAAMD,IAAO,KAAK;EAClB,IAAI,CAACA,GAAM;EACX,IAAMC,IAAOf,EAAOS,CAAG;EACvB,KAAK,KAAK,KAAK,GACZ,WAAW,KAAK,MAAM,CAAC,CAAC,CACxB,WAAW;GACV,AAAI,KAAK,SAASK,KAAMA,EAAK,QAAQX,EAAkBY,CAAI,CAAC;EAC9D,CAAC;CACL;CAGA,OAAO;EACL,IAAM7N,IAAI,KAAK;EAGf,AAFA,KAAK,OAAO,KAAA,GACZA,GAAG,MAAM,GACT,KAAK,WAAW,QAAQ;CAC1B;CAEA,QAAQ;EACN,KAAK,KAAK;CACZ;AACF,GCnHMnB,qBAAW,IAAI,IAAmB;CAAC;CAAY;CAAe;CAAgB;CAAgB;CAAe;CAAa;AAAW,CAAC,GAsB/HkP,KAAb,MAAgD;CAQ1B;CAPpB;CACA;CACA;CACA,YAAiC,CAAC;CAClC,YAAiC,CAAC;CAClC;CAEA,YAAY,GAAgC;EAC1C,AADkB,KAAA,SAAA1O,GAClB,KAAK,WAAWmB,EAAQnB,IAAS,MAAM;GACrC,IAAM0B,IAAIG,GACJ8M,IAAQ,KAAK,KAAKjN,EAAE,KAAK;GAC/B,AAAIiN,KAAO,KAAK,aAAa;IAAE,GAAG;IAAQ;IAAO,OAAOjN,EAAE;IAAO,IAAIA,EAAE;IAAI,IAAIA,EAAE;GAAG,CAAC;EACvF,CAAC;CACH;CAEA,UAAU;EACR,KAAK,SAAS;CAChB;CAEA,IAAY,OAAO;EACjB,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,KAAa,GAAmB;EAC9B,OAAO,KAAK,KAAK,OAAOsB,EAAE,EAAE,QAAQ;CACtC;CAEA,KAAa;EACX,OAAO,KAAK,OAAQ;CACtB;CAEA,SAAS,GAAgC;EACvC,OAAOxD,GAAS,IAAI+J,CAAM;CAC5B;CAEA,UAAU,GAAuB,GAA+C;EAC9E,IAAI,CAAC,KAAK,QAAQ;EAClB,IAAMvH,IAAIyH;EACV,QAAQF,GAAR;GACE,KAAK,YACH,OAAO,KAAK,MAAM;IAAE,GAAG;IAAO,IAAI,KAAK,GAAG;IAAG,OAAO,KAAK,KAAKvH,EAAE,EAAE;IAAG,OAAOA,EAAE;GAAG,CAAC;GACpF,KAAK,eACH,OAAO,KAAK,MAAM;IAAE,GAAG;IAAO,IAAI,KAAK,GAAG;IAAG,OAAO,KAAK,KAAKA,EAAE,EAAE;IAAG,OAAOA,EAAE;IAAI,OAAOA,EAAE;GAAG,CAAC;GACjG,KAAK,gBACH,OAAO,KAAK,MAAM;IAAE,GAAG;IAAS,IAAI,KAAK,GAAG;IAAG,OAAO,KAAK,KAAKA,EAAE,EAAE;IAAG,IAAIA,EAAE;GAAG,CAAC;GACnF,KAAK,gBACH,OAAO,KAAK,MAAM;IAAE,GAAG;IAAW,IAAI,KAAK,GAAG;IAAG,OAAO,KAAK,KAAKA,EAAE,EAAE;IAAG,OAAOA,EAAE;IAAI,IAAIA,EAAE;IAAI,MAAMA,EAAE;IAAI,IAAIA,EAAE;GAAG,CAAC;GACxH,KAAK,eACH,OAAO,KAAK,MAAM;IAAE,GAAG;IAAQ,IAAI,KAAK,GAAG;IAAG,IAAI,KAAK,MAAMA,EAAE,EAAE;GAAE,CAAC;GACtE,KAAK,aACH,OAAO,KAAK,QAAQ,KAAK,WAAW,KAAK,WAAW,MAAM;GAC5D,KAAK,aACH,OAAO,KAAK,QAAQ,KAAK,WAAW,KAAK,WAAW,MAAM;EAC9D;CAEF;CAEA,MAAc,GAAoB;EAChC,QAAQC,EAAE,IAAV;GACE,KAAK,OACH,OAAO;IAAE,IAAI;IAAO,MAAMA,EAAE;IAAM,OAAOA,EAAE,UAAU,KAAA,IAAiC,KAAA,IAArB,KAAK,KAAKA,EAAE,KAAK;GAAc;GAClG,KAAK,UACH,OAAO;IAAE,IAAI;IAAU,MAAM,KAAK,KAAKA,EAAE,KAAK;IAAG,MAAMA,EAAE;GAAK;GAChE,KAAK,UACH,OAAO;IAAE,IAAI;IAAU,MAAM,KAAK,KAAKA,EAAE,KAAK;GAAE;GAClD,KAAK,QACH,OAAO;IAAE,IAAI;IAAQ,MAAM,KAAK,KAAKA,EAAE,IAAI;IAAG,IAAIA,EAAE;GAAG;EAC3D;CACF;CAEA,MAAc,GAA2B;EACvC,IAAIoI,EAAG,MAAM,YAAYA,EAAG,GAAG,OAAO,gBAAgBA,EAAG,GAAG,OAAO,eAAe;GAChF,IAAMxB,IAAe;IAAE,IAAIwB,EAAG,GAAG,OAAO,eAAe,eAAe;IAAc,IAAIA,EAAG,GAAG;IAAI,GAAGA,EAAG,GAAG;GAAE;GAC7G,KAAK,UAAU,KAAK;IAAE,MAAM;IAAW,OAAOA,EAAG;IAAO,MAAMxB;IAAK,MAAMwB,EAAG;GAAG,CAAC;EAClF,OAAO,AAAK1K,EAAa0K,CAAE,KAAG,KAAK,UAAU,KAAK;GAAE,MAAM;GAAM,IAAIA,EAAG;EAAG,CAAC;EAG3E,OAFI,KAAK,UAAU,SAAS,OAAK,KAAK,UAAU,MAAM,GACtD,KAAK,YAAY,CAAC,GACX,KAAK,OAAQA,CAAE;CACxB;CAEA,QAAgB,GAAmB,GAAiB,GAA0C;EAC5F,IAAMjG,IAAImB,EAAK,IAAI;EAInB,OAHKnB,KACLyB,EAAG,KAAKzB,CAAC,GACLA,EAAE,SAAS,OAAa,KAAK,OAAQ;GAAE,GAAG;GAAU,IAAI,KAAK,GAAG;GAAG,QAAQA,EAAE;GAAI;EAAM,CAAC,IACrF,KAAK,OAAQ;GAAE,GAAG;GAAS,IAAI,KAAK,GAAG;GAAG,OAAOA,EAAE;GAAO,IAAIwK,MAAU,SAASxK,EAAE,OAAOA,EAAE;EAAK,CAAC,KAH1F,QAAQ,QAAQ,IAAI;CAIrC;CAIA,UAAU,GAAS,GAAwB;EACzC,OAAO3E,EAAW4K,GAAIG,CAAK;CAC7B;CAEA,UAAU,GAAgB,GAAwB;EAChD,OAAO9K,EAAWiL,GAASC,CAAM;CACnC;CAEA,YAAY,GAAkB;EAC5B,OAAOjL,EAAa0K,CAAE;CACxB;CAEA,MAAM,MAAM,GAAS,GAA2D;EAC9E,IAAM,EAAE,QAAK,WAAQ,MAAM,KAAK,OAAO,OAAO,qBAAqBA,CAAE;EACrE,IAAI1K,EAAa0K,CAAE,GAAG;GAEpB,IAAMwE,KAAQ,MAAiB,EAAE,SAAS,aAAa5O,MAAS;GAEhE,AADA,KAAK,YAAY,KAAK,UAAU,OAAO4O,CAAI,GAC3C,KAAK,YAAY,KAAK,UAAU,OAAOA,CAAI;EAC7C;EAEA,OADI5O,MAAS,WAAWuM,KAAK,KAAK,OAAO,OAAO,eAAeA,CAAG,GAC3D;GAAE,QAAQA;GAAK,MAAMsC;EAAI;CAClC;CAEA,MAAM,OAAO,GAAe;EAC1B,IAAI,OAAOrD,KAAS,UAAU;EAC9B,IAAMe,IAAM,MAAM,KAAK,OAAO,OAAO,sBAAsBf,CAAI;EAC/D,AAAIe,KAAK,KAAK,OAAO,OAAO,eAAeA,CAAG;CAChD;AACF;;ACvIA,SAAgBuC,GAAW,GAAS,GAAwB;CAE1D,OADIvE,EAAM,MAAM,YAAYA,EAAM,GAAG,OAAO,YAAY,WAAWH,KAAMA,EAAG,UAAUG,EAAM,GAAG,OAAa,OACrGH;AACT;AAGA,SAAgB2E,GAAW,GAAgB,GAAwB;CACjE,IAAIpE,EAAO,MAAM,MAAMhI,EAAE,MAAM,YAAYA,EAAE,MAAM,QAAQ,KAAK+H,EAAQ,MAAM,MAAM/H,EAAE,MAAM,QAAQ,GAAG,OAAO;CAC9G,IAAM8H,IAAO,IAAI,IAAIC,EAAQ,SAAS,MAAO,WAAW/H,KAAKA,EAAE,MAAM,UAAU,CAACA,EAAE,KAAK,IAAI,CAAC,CAAE,CAAC;CAC/F,OAAOgI,EAAO,MAAM,MAAM,WAAWhI,KAAKA,EAAE,MAAM,WAAW8H,EAAK,IAAI9H,EAAE,KAAK,CAAC;AAChF;;ACjBA,IAAMqM,qBAAW,IAAI,IAAmB;CAAC;CAAgB;CAAe;CAAe;CAAc;AAAW,CAAC,GAqBpGC,KAAb,MAAgD;CAU1B;CATpB;CACA;CACA;CACA,YAA8B,CAAC;CAC/B,YAA8B,CAAC;CAE/B,yBAAiB,IAAI,IAAoB;CACzC;CAEA,YAAY,GAAgC;EAC1C,AADkB,KAAA,SAAAlP,GAClB,KAAK,WAAWmB,EAAQnB,IAAS,MAAM;GACrC,IAAM0B,IAAIG,GACJsN,IAAQ,KAAK,KAAKzN,EAAE,KAAK;GAC/B,AAAIyN,KAAO,KAAK,aAAa;IAAE,GAAG;IAAQ;IAAO,KAAKzN,EAAE;GAAI,CAAC;EAC/D,CAAC;CACH;CAEA,UAAU;EACR,KAAK,SAAS;CAChB;CAEA,IAAY,OAAO;EACjB,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,KAAa,GAAmB;EAC9B,OAAO,KAAK,KAAK,OAAOsB,EAAE,EAAE,QAAQ;CACtC;CAEA,KAAa;EACX,OAAO,KAAK,OAAQ;CACtB;CAEA,SAAS,GAAgC;EACvC,OAAOiM,GAAS,IAAI1F,CAAM;CAC5B;CAEA,UAAU,GAAuB,GAA+C;EAC9E,IAAI,CAAC,KAAK,QAAQ;EAClB,IAAMvH,IAAIyH;EACV,QAAQF,GAAR;GACE,KAAK,gBACH,OAAO,KAAK,MAAM;IAAE,GAAG;IAAQ,IAAI,KAAK,GAAG;IAAG,OAAO,KAAK,KAAKvH,EAAE,EAAE;IAAG,KAAKA,EAAE;IAAI,OAAOA,EAAE;GAAG,CAAC,CAAC,CAAC,MAAM,MAAOX,EAAuB,KAAK;GAC3I,KAAK,eAAe;IAClB,IAAMwJ,IAAO7I,EAAE,EAAE,CAAe,KAAK,MAAOY,EAAE,OAAO,YAAYA,EAAE,OAAO,KAAK,OAAO,IAAIA,EAAE,GAAG,IAAI;KAAE,GAAGA;KAAG,KAAK,KAAA;KAAW,KAAK,KAAK,OAAO,IAAIA,EAAE,GAAG;IAAE,IAAIA,CAAE;IAC7J,OAAO,KAAK,MAAM;KAAE,GAAG;KAAU,IAAI,KAAK,GAAG;KAAG,OAAO,KAAK,KAAKZ,EAAE,EAAE;KAAG;IAAI,CAAC,CAAC,CAAC,MAAM,MAAOX,EAAuB,KAAK;GAC1H;GACA,KAAK,cAAc;IACjB,IAAM0K,IAAM,GAAG,KAAK,GAAG,KACjBvC,IAAQ,IAAI,WAAYxH,EAAE,EAAE,CAAiB,MAAM,CAAC,CAAC;IAC3D,OAAO,KAAK,OAAO;KAAE,GAAG;KAAS,IAAI+J;KAAK;KAAK,OAAO,KAAK,KAAK/J,EAAE,EAAE;KAAG;KAAO,KAAKA,EAAE;IAAG,CAAC,CAAC,CAAC,MAAM,MAAM;KACrG,IAAMoN,IAAO/N,EAAuB;KAEpC,OADI+N,KAAK,KAAK,OAAO,IAAIA,GAAKrD,CAAG,GAC1BqD;IACT,CAAC;GACH;GACA,KAAK,eACH,OAAO,KAAK,OAAO;IAAE,GAAG;IAAU,IAAI,KAAK,GAAG;IAAG,IAAI,KAAK,OAAOpN,EAAE,EAAE;GAAE,CAAC,CAAC,CAAC,MAAM,MAAOX,GAA+B,QAAQ,KAAK,IAAI;GACzI,KAAK,aACH,OAAO,KAAK,QAAQW,EAAE,KAAK,KAAK,YAAY,KAAK,WAAWA,EAAE,KAAK,KAAK,YAAY,KAAK,WAAWA,EAAE,KAAK,SAAS,MAAM;EAC9H;CAEF;CAEA,OAAe,GAAsB;EACnC,QAAQY,EAAE,IAAV;GACE,KAAK,OACH,OAAO;IAAE,IAAI;IAAO,OAAOA,EAAE,SAAS,KAAI,KAAK,KAAKA,EAAE,KAAK,KAAK;IAAa,QAAQA,EAAE;GAAO;GAChG,KAAK,aACH,OAAO;IAAE,IAAI;IAAa,MAAM,KAAK,KAAKA,EAAE,KAAK;GAAE;GACrD,KAAK,UACH,OAAO;IAAE,IAAI;IAAU,MAAM,KAAK,KAAKA,EAAE,KAAK;GAAE;GAClD,KAAK,QACH,OAAO;IAAE,IAAI;IAAQ,MAAM,KAAK,KAAKA,EAAE,IAAI;IAAG,IAAIA,EAAE;GAAG;GACzD,KAAK,QACH,OAAO;IAAE,IAAI;IAAQ,MAAM,KAAK,KAAKA,EAAE,KAAK;IAAG,QAAQA,EAAE;GAAO;EACpE;CACF;CAEA,MAAc,GAA2B;EAIvC,OAHA,KAAK,UAAU,KAAKyH,EAAG,EAAE,GACrB,KAAK,UAAU,SAAS,OAAK,KAAK,UAAU,MAAM,GACtD,KAAK,YAAY,CAAC,GACX,KAAK,OAAQA,CAAE;CACxB;CAEA,MAAc,QAAQ,GAAgB,GAAc,GAAwB;EAC1E,IAAM3C,IAASnC,EAAK,IAAI;EACxB,IAAI,CAACmC,GAAQ,OAAO;EACpB,EAAG,KAAKA,CAAM;EACd,IAAMrG,IAAK,MAAM,KAAK,OAAQ;GAAE,GAAG;GAAU,IAAI,KAAK,GAAG;GAAG;GAAQ;EAAM,CAAC;EAC3E,OAAOA,EAAE,SAASA,EAAE,UAAU,KAAA,IAAY;GAAE,OAAOA,EAAE;GAAO,OAAOA,EAAE;EAAM,IAAI;CACjF;CAIA,UAAU,GAAS,GAAwB;EACzC,OAAO0N,GAAW1E,GAAIG,CAAK;CAC7B;CAEA,UAAU,GAAgB,GAAwB;EAChD,OAAOwE,GAAWrE,GAASC,CAAM;CACnC;CAEA,YAAY,GAAkB;EAC5B,OAAOP,EAAG,MAAM;CAClB;CAEA,QAAQ,GAAY;EAElB,AAAIQ,EAAI,MAAM,MAAMjI,EAAE,MAAM,QAAQ,KAAGxC,EAAkB,KAAK,QAAQ,MAAM,CAAC,EAAE,WAAW;CAC5F;CAEA,MAAM,MAAM,GAAS,GAA2D;EAC9E,IAAM,EAAE,QAAK,WAAQ,MAAM,KAAK,OAAO,OAAO,qBAAqBiK,CAAE;EAOrE,OANIA,EAAG,MAAM,aACX,KAAK,YAAY,CAAC,GAClB,KAAK,YAAY,CAAC,GACdmC,EAAI,QAAM,OAAO,OAAO,KAAK,MAAMA,EAAI,IAAI,IAE7CvM,MAAS,WAAS,KAAK,OAAO,OAAO,eAAeuM,CAAG,GACpD;GAAE,QAAQA;GAAK,MAAMsC;EAAI;CAClC;CAEA,MAAM,OAAO,GAAe;EAC1B,AAAI,OAAOrD,KAAS,YACpB,KAAK,OAAO,OAAO,eAAe,MAAM,KAAK,OAAO,OAAO,sBAAsBA,CAAI,CAAC;CACxF;AACF,GCjHa4D,IAAc;CAAC;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;CAAW;AAAS,GCjB3HC,KAAb,MAAuB;CAGD;CAFpB,wBAAiB,IAAI,IAAuB;CAE5C,YAAY,IAA2B,CAAC,GAAG;EAAvB,KAAA,OAAA5K;CAAwB;CAE5C,KAAK,GAAuB;EAC1B,IAAIrD,IAAI,KAAK,MAAM,IAAI8L,CAAE;EACzB,IAAI,CAAC9L,GAAG;GACN,IAAMkO,IAAM,KAAK,KAAK,UAAUpC,CAAE,KAAK,CAAC;GACxC,IAAI;IAAE;IAAI,KAAKoC,EAAI,SAASA,EAAIA,EAAI,SAAS,EAAE,CAAC,MAAM;IAAG;IAAK,KAAK,IAAI,IAAIA,EAAI,KAAK,MAAMtN,EAAE,EAAE,CAAC;IAAG,uBAAO,IAAI,IAAI;IAAG,UAAU;GAAE;GAChI,KAAK,IAAMA,KAAKsN,GAAK,EAAE,WAAW,KAAK,IAAIlO,EAAE,UAAUY,EAAE,OAAO,CAAC;GACjE,KAAK,MAAM,IAAIkL,GAAI9L,CAAC;EACtB;EACA,OAAOA;CACT;CAGA,MAAM,GAAY;EAChB,IAAMA,IAAI,KAAK,MAAM,IAAI8L,CAAE;EAC3B,IAAI9L,GAAG,KAAK,IAAM6C,KAAK7C,EAAE,MAAM,OAAO,GAAG,EAAE,KAAK;GAAE,GAAG;GAAS,SAAS;EAAiB,CAAC;EACzF,KAAK,MAAM,OAAO8L,CAAE;CACtB;CAEA,QAAQ,GAA0C;EAChD,IAAIqC,GACAnG,IAAO,GACLoG,KAAa,GAAW,MAAoB;GAChD,IAAKD,GACL,KAAK,IAAM,CAAC9N,GAAGwC,MAAMsL,EAAK,OAAO,AAAI9N,MAAMgO,KAAQxL,EAAE,KAAKnE,CAAC;EAC7D;EACA,OAAO;GACL,UAAU,MAAQ;IAChB,IAAImO,EAAI,MAAM,SAAS;KACrB,IAAIsB,GAAM;KAEV,AADA,IAAO,KAAK,KAAKtB,EAAI,IAAI,GACzB,IAAOA,EAAI,QAAQA,EAAI,OAAOsB,EAAK,YAAY,CAACA,EAAK,MAAM,IAAItB,EAAI,IAAI,IAAIA,EAAI,OAAO,EAAK;KAC3F,IAAMyB,IAAO,IAAI,IAAI,CAAC,GAAGH,EAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,MAAMtL,EAAE,KAAK,KAAK,CAAC,GAChE0L,IAAQ1B,EAAI,KAAK,SAASmB,EAAY,MAAM,MAAM,CAACM,EAAK,IAAIhP,CAAC,CAAC,KAAK0O,EAAYhG,IAAOgG,EAAY,SAClGQ,IAAiB;MAAE,GAAG3B,EAAI;MAAM;MAAM;KAAM,GAC5C4B,IAAQ5B,EAAI,SAAS,KAAA,KAAaA,EAAI,OAAOsB,EAAK,KAClDjK,IAAO2I,EAAI,SAAS,KAAA,KAAa,CAAC4B,IAAQ5B,EAAI,OAAO;KAO3D,AANA6B,EAAK;MACH,GAAG;MAAW;MAAM,KAAKP,EAAK;MAAK;MAAM;MACzC,KAAKA,EAAK,IAAI,QAAQ,MAAMvN,EAAE,MAAMsD,CAAI;MACxC,OAAO,CAAC,GAAGiK,EAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,MAAMtL,EAAE,IAAI;KACnD,CAAC,GACDsL,EAAK,MAAM,IAAInG,GAAM;MAAE;MAAM;KAAK,CAAC,GACnCoG,EAAU;MAAE,GAAG;MAAQ,MAAMI;KAAK,GAAGxG,CAAI;IAE3C,OACA;SAAI,CAACmG,GAAM,OAAOO,EAAK;MAAE,GAAG;MAAS,SAAS;KAAa,CAAC;KAC5D,IAAI7B,EAAI,MAAM,OAAO;MACnB,IAAIsB,EAAK,IAAI,IAAItB,EAAI,EAAE,GAAG;MAC1B,IAAMjM,IAAW;OAAE,KAAK,EAAEuN,EAAK;OAAK;OAAM,MAAM,KAAK,IAAItB,EAAI,MAAMsB,EAAK,MAAM,CAAC;OAAG,IAAItB,EAAI;OAAI,KAAKA,EAAI;MAAI;MAI3G,AAHAsB,EAAK,IAAI,KAAKvN,CAAC,GACfuN,EAAK,IAAI,IAAIvN,EAAE,EAAE,GACjB,KAAK,KAAK,UAAUuN,EAAK,IAAIvN,CAAC,GAC9BwN,EAAU;OAAE,GAAG;OAAS;MAAE,CAAC;KAC7B,OAAO,IAAIvB,EAAI,MAAM,YAAY;MAC/B,IAAMhK,IAAIsL,EAAK,MAAM,IAAInG,CAAI;MAE7B,AADInF,MAAG,EAAE,KAAK,WAAWgK,EAAI,OAC7BuB,EAAU;OAAE,GAAG;OAAY;OAAM,MAAMvB,EAAI;MAAK,GAAG7E,CAAI;KACzD;IAZ4D;GAa9D;GACA,aAAa;IACX,AAAKmG,KAASA,EAAK,MAAM,IAAInG,CAAI,MACjCmG,EAAK,MAAM,OAAOnG,CAAI,GACtBoG,EAAU;KAAE,GAAG;KAAS;IAAK,CAAC,GACzBD,EAAK,MAAM,QAAM,KAAK,KAAK,SAASA,EAAK,EAAE;GAClD;EACF;CACF;AACF;;ACpDA,SAAgBQ,GAAY,GAAwB,GAA6B;CAC/E,IAAM3D,IAAY,OAAO3H,EAAK,aAAc,WAAW,IAAImJ,EAAmBnJ,EAAK,SAAS,IAAIA,EAAK,WAC/FuL,IAAOjQ,EAAO,SAAS,SAAS,IAAImJ,GAAWnJ,CAAM,IAAI,KAAA,GACzDsM,IAAW2D,MAASjQ,EAAO,SAAS,SAAS,IAAI0O,GAAW1O,CAAM,IAAI,IAAIkP,GAAWlP,CAAM,IAC3FkQ,IAAU,IAAI9D,EAAuBC,GAAWC,GAAS;EAAE,MAAM5H,EAAK;EAAM,MAAMA,EAAK;CAAK,CAAC;CAKnG,AAJA,EAAQ,UAAU,MAAOwL,EAAQ,OAAO7F,CAAE,GAC1C,EAAQ,QAAQ,GAAI,MAAS6F,EAAQ,KAAK7F,GAAIoB,CAAI,GAClD,EAAQ,eAAeyE,EAAQ,OAAO,GACtC,EAAQ,cAAc,MAAMA,EAAQ,YAAYhM,CAAC,GACjD,EAAO,eAAe,GAAQ,MAAS;EACrC,IAAKoI,EAAQ,SAAS/C,CAAM,GAK5B,OAHI2G,EAAQ,WAAW,gBAAgBA,EAAQ,WAAW,aAAaA,EAAQ,WAAW,UACjF,QAAQ,OAAW,MAAMA,EAAQ,WAAW,UAAUA,EAAQ,SAAS,0BAA0B,2BAA2B,CAAC,IAE/H5D,EAAQ,UAAU/C,GAAQE,CAAI;CACvC;CACA,IAAM0G,IAAO,CACXD,EAAQ,GAAG,UAAU,MAAUrP,EAASb,GAAQc,CAAK,CAAC,GACtDoP,EAAQ,GAAG,WAAW,MAAM;EAC1B,AAAIxO,MAAM,UAAQ4K,EAAQ,UAAU4D,EAAQ,IAAI;CAClD,CAAC,CACH;CACA,OAAO;EACL;EACA,IAAI,SAAS;GACX,OAAOA,EAAQ;EACjB;EACA,IAAI,QAAQ;GACV,OAAO,CAAC,GAAGA,EAAQ,MAAM,OAAO,CAAC;EACnC;EACA,IAAI,UAAU;GACZ,OAAOA,EAAQ;EACjB;EACA,KAAK,GAAO,MAAOA,EAAQ,GAAGxD,GAAOvM,CAAE;EACvC,QAAQ,GAAM,MAAS;GACrB,IAAM+D,IAAIkM,EAAK;GACf,OAAOH,KAAQ/L,GAAG,MAAM,SAAS+L,EAAK,MAAM3J,GAAMpC,CAAC,IAAI;EACzD;EACA,QAAQ;GAKN,AAJAiM,EAAK,SAAS,MAAM5I,EAAE,CAAC,GACvB2I,EAAQ,MAAM,GACd,AAAwBlQ,EAAO,gBAAc,KAAA,GAC7CsM,EAAQ,UAAU,GAClBzL,EAASb,GAAQ,CAAC,CAAC;EACrB;CACF;AACF"}
|