@extable/core 0.3.4 → 0.3.6
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/core.css +1 -1
- package/dist/dataModel.d.ts +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2175 -1808
- package/dist/index.js.map +1 -1
- package/dist/numberIO-B8lMxkWc.js +984 -0
- package/dist/numberIO-B8lMxkWc.js.map +1 -0
- package/dist/numberIO-BMnYEoog.js +1011 -0
- package/dist/numberIO-BMnYEoog.js.map +1 -0
- package/dist/numberIO-BhW20Lm1.js +988 -0
- package/dist/numberIO-BhW20Lm1.js.map +1 -0
- package/dist/numberIO-C1R2zgBN.js +1010 -0
- package/dist/numberIO-C1R2zgBN.js.map +1 -0
- package/dist/selectionManager.d.ts +35 -0
- package/dist/ssr/index.js +1 -1
- package/dist/types.d.ts +69 -4
- package/package.json +2 -2
- package/src/styles.css +50 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/commandQueue.ts","../src/address.ts","../src/lockManager.ts","../../sequence/dist/index.js","../src/fillHandle.ts","../src/renderers.ts","../src/selectionManager.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import type { Command } from \"./types\";\n\ntype CommandGroup = { batchId: string | null; commands: Command[] };\nexport type CommandGroupSnapshot = { batchId: string | null; commands: Command[] };\n\nfunction getBatchId(cmd: Command) {\n const p = cmd.payload as Record<string, unknown> | null | undefined;\n if (!p) return null;\n const id = p.batchId;\n return typeof id === \"string\" && id.length ? id : null;\n}\n\nexport class CommandQueue {\n private applied: CommandGroup[] = [];\n private undone: CommandGroup[] = [];\n private cap: number;\n\n constructor(cap = 100) {\n this.cap = cap;\n }\n\n enqueue(command: Command) {\n const batchId = getBatchId(command);\n const last = this.applied.at(-1);\n if (batchId && last && last.batchId === batchId) {\n last.commands.push(command);\n } else {\n this.applied.push({ batchId, commands: [command] });\n }\n while (this.applied.length > this.cap) this.applied.shift();\n this.undone = [];\n }\n\n canUndo() {\n return this.applied.length > 0;\n }\n\n canRedo() {\n return this.undone.length > 0;\n }\n\n listApplied() {\n const out: Command[] = [];\n for (const group of this.applied) out.push(...group.commands);\n return out;\n }\n\n listUndoGroups(): CommandGroupSnapshot[] {\n // Return top = next undo.\n return this.applied\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n listRedoGroups(): CommandGroupSnapshot[] {\n // Return top = next redo.\n return this.undone\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n undo() {\n const group = this.applied.pop();\n if (group) this.undone.push(group);\n return group?.commands ?? null;\n }\n\n redo() {\n const group = this.undone.pop();\n if (group) this.applied.push(group);\n return group?.commands ?? null;\n }\n\n clear() {\n this.applied = [];\n this.undone = [];\n }\n}\n","import type { DataModel } from \"./dataModel\";\nimport type { CellAddress } from \"./types\";\n\nexport type ResolvedCellTarget = {\n rowId: string;\n colKey: string;\n rowIndex: number;\n colIndex: number;\n};\n\nexport function resolveCellAddress(dataModel: DataModel, address: CellAddress): ResolvedCellTarget | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n\n const resolveByIndex = (rowIndex: number, colIndex: number): ResolvedCellTarget | null => {\n if (!Number.isInteger(rowIndex) || !Number.isInteger(colIndex)) return null;\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n if (colIndex < 0 || colIndex >= schema.columns.length) return null;\n const row = rows[rowIndex]!;\n const col = schema.columns[colIndex]!;\n return { rowId: row.id, colKey: col.key, rowIndex, colIndex };\n };\n\n const resolveByKeys = (rowId: string, colKey: string): ResolvedCellTarget | null => {\n const rowIndex = dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (colIndex < 0) return null;\n return { rowId, colKey, rowIndex, colIndex };\n };\n\n if (\"rowId\" in address && \"colKey\" in address) {\n return resolveByKeys(address.rowId, address.colKey);\n }\n if (\"rowIndex\" in address && \"colIndex\" in address) {\n return resolveByIndex(address.rowIndex, address.colIndex);\n }\n if (\"rowId\" in address && \"colIndex\" in address) {\n const rowIndex = dataModel.getRowIndex(address.rowId);\n if (rowIndex < 0) return null;\n return resolveByIndex(rowIndex, address.colIndex);\n }\n if (\"rowIndex\" in address && \"colKey\" in address) {\n const colIndex = schema.columns.findIndex((c) => c.key === address.colKey);\n if (colIndex < 0) return null;\n return resolveByIndex(address.rowIndex, colIndex);\n }\n\n return null;\n}\n","import type { LockMode, ServerAdapter, UserInfo } from './types';\n\nexport class LockManager {\n private lockedRows = new Set<string>();\n private mode: LockMode = 'none';\n private server?: ServerAdapter;\n private user?: UserInfo;\n\n constructor(mode: LockMode, server?: ServerAdapter, user?: UserInfo) {\n this.mode = mode;\n this.server = server;\n this.user = user;\n }\n\n setMode(mode: LockMode) {\n this.mode = mode;\n }\n\n setUser(user?: UserInfo) {\n this.user = user;\n }\n\n async selectRow(rowId: string) {\n if (this.mode !== 'row') return;\n if (this.lockedRows.has(rowId)) return;\n this.lockedRows.add(rowId);\n if (this.server && this.user) {\n try {\n await this.server.lockRow(rowId, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('lockRow failed', e);\n }\n }\n }\n\n async unlockOnMove(currentRowId?: string) {\n if (this.mode !== 'row') return;\n if (!currentRowId) return;\n await this.unlockRows([currentRowId]);\n }\n\n async unlockOnCommit(keepRowId?: string) {\n if (this.mode !== 'row') return;\n const toUnlock: string[] = [];\n for (const id of this.lockedRows) {\n if (id !== keepRowId) toUnlock.push(id);\n }\n if (toUnlock.length) {\n await this.unlockRows(toUnlock);\n }\n }\n\n async unlockRows(rowIds: string[]) {\n for (const id of rowIds) this.lockedRows.delete(id);\n if (this.server && this.user) {\n try {\n await this.server.unlockRows(rowIds, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('unlockRows failed', e);\n }\n }\n }\n\n getLockedRows() {\n return new Set(this.lockedRows);\n }\n}\n","const g = (e) => e.trim().normalize(\"NFKC\").toLowerCase().replace(/\\s+/g, \" \"), V = (e) => {\n const t = [];\n if (e)\n for (const n of e) {\n const s = n.trim();\n !s || t.includes(s) || t.push(s);\n }\n return t.length === 0 ? t.push(\"en\") : t.includes(\"en\") || t.push(\"en\"), t;\n}, J = (e, t) => {\n const n = e.items.indexOf(t);\n if (n !== -1)\n return n;\n if (!e.aliases)\n return null;\n const s = e.aliases[t];\n if (!s)\n return null;\n const r = e.items.indexOf(s);\n return r === -1 ? null : r;\n}, R = (e, t) => {\n const n = g(t);\n if (g(e.id).includes(n))\n return !0;\n for (const s of e.items)\n if (g(s).includes(n))\n return !0;\n return e.aliases ? Object.keys(e.aliases).some(\n (s) => g(s).includes(n)\n ) : !1;\n}, D = (e, t) => {\n if (e.langs.length === 0)\n return 0;\n let n = Number.POSITIVE_INFINITY;\n for (const s of e.langs) {\n const r = t.indexOf(s);\n r !== -1 && r < n && (n = r);\n }\n return n;\n}, K = (e, t) => !e.langs || e.langs.length === 0 ? !0 : e.langs.some((n) => t.includes(n));\nclass z {\n constructor(t) {\n this.lists = [], this.matchers = [], this.langs = V(t?.langs);\n }\n register(t) {\n const n = this.lists.findIndex((s) => s.id === t.id);\n n === -1 ? this.lists.push(t) : this.lists[n] = t;\n }\n registerMatch(t) {\n const n = this.matchers.findIndex((s) => s.id === t.id);\n n === -1 ? this.matchers.push(t) : this.matchers[n] = t;\n }\n unregister(t) {\n this.lists = this.lists.filter((n) => n.id !== t), this.matchers = this.matchers.filter((n) => n.id !== t);\n }\n list(t) {\n let n = [...this.lists];\n if (t?.enabledIds && t.enabledIds.length > 0) {\n const r = new Set(t.enabledIds);\n n = n.filter((o) => r.has(o.id));\n }\n const s = t?.queryText;\n return s && (n = n.filter((r) => R(r, s))), n;\n }\n match(t, n) {\n if (t.length === 0)\n return null;\n let s = null, r = Number.NEGATIVE_INFINITY;\n const o = n?.enabledIds ? new Set(n.enabledIds) : null;\n for (const i of this.matchers) {\n if (o && !o.has(i.id) || !K(i, this.langs))\n continue;\n const a = i.match(t);\n if (!a)\n continue;\n const l = a.score;\n Number.isFinite(l) && l > r && (r = l, s = {\n kind: \"matcher\",\n matcher: i,\n step: a.step ?? 1,\n state: a.state\n });\n }\n const u = this.list(n).map((i) => ({ list: i, rank: D(i, this.langs) })).filter((i) => Number.isFinite(i.rank)).sort((i, a) => i.rank - a.rank);\n for (const { list: i, rank: a } of u) {\n const l = [];\n let c = !1;\n for (const P of t) {\n const k = J(i, P);\n if (k === null) {\n c = !0;\n break;\n }\n l.push(k);\n }\n if (c)\n continue;\n const f = this.inferStep(i, l);\n if (f === null)\n continue;\n const d = 10 - a;\n d > r && (r = d, s = {\n kind: \"list\",\n list: i,\n startIndex: l[l.length - 1] ?? 0,\n step: f\n });\n }\n return s;\n }\n inferStep(t, n) {\n if (n.length < 2)\n return 1;\n const s = t.items.length, r = this.stepBetween(t.mode, s, n[0], n[1]);\n if (r === null)\n return null;\n for (let o = 2; o < n.length; o += 1) {\n const u = this.nextIndex(t.mode, s, n[o - 1], r);\n if (u === null || u !== n[o])\n return null;\n }\n return r;\n }\n stepBetween(t, n, s, r) {\n if (t === \"cycle\")\n return (r - s + n) % n;\n const o = r - s;\n return o < 0 ? null : o;\n }\n nextIndex(t, n, s, r) {\n if (t === \"cycle\")\n return (s + r) % n;\n const o = s + r;\n return o >= n ? null : o;\n }\n}\nconst B = {\n id: \"weekdays-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n}, G = {\n id: \"weekdays-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n aliases: {\n Tues: \"Tue\",\n Thur: \"Thu\",\n Thurs: \"Thu\"\n }\n}, H = {\n id: \"weekdays-ja-long\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\", \"日曜日\"]\n}, U = {\n id: \"weekdays-ja-short\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜\", \"火曜\", \"水曜\", \"木曜\", \"金曜\", \"土曜\", \"日曜\"]\n}, Y = {\n id: \"weekdays-ja-single\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月\", \"火\", \"水\", \"木\", \"金\", \"土\", \"日\"]\n}, q = {\n id: \"months-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ]\n}, X = {\n id: \"months-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n aliases: {\n Sept: \"Sep\"\n }\n}, Q = {\n id: \"months-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"]\n}, Z = {\n id: \"months-ja-traditional\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"睦月\", \"如月\", \"弥生\", \"卯月\", \"皐月\", \"水無月\", \"文月\", \"葉月\", \"長月\", \"神無月\", \"霜月\", \"師走\"]\n}, _ = {\n id: \"quarters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n}, ee = {\n id: \"quarters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"第1四半期\", \"第2四半期\", \"第3四半期\", \"第4四半期\"]\n}, te = {\n id: \"zodiac-animals-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"子\", \"丑\", \"寅\", \"卯\", \"辰\", \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"]\n}, ne = {\n id: \"zodiac-signs-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Aries\",\n \"Taurus\",\n \"Gemini\",\n \"Cancer\",\n \"Leo\",\n \"Virgo\",\n \"Libra\",\n \"Scorpio\",\n \"Sagittarius\",\n \"Capricorn\",\n \"Aquarius\",\n \"Pisces\"\n ]\n}, se = {\n id: \"zodiac-signs-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"牡羊座\", \"牡牛座\", \"双子座\", \"蟹座\", \"獅子座\", \"乙女座\", \"天秤座\", \"蠍座\", \"射手座\", \"山羊座\", \"水瓶座\", \"魚座\"],\n aliases: {\n さそり座: \"蠍座\"\n }\n}, re = {\n id: \"directions-16-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"North\",\n \"North-Northeast\",\n \"Northeast\",\n \"East-Northeast\",\n \"East\",\n \"East-Southeast\",\n \"Southeast\",\n \"South-Southeast\",\n \"South\",\n \"South-Southwest\",\n \"Southwest\",\n \"West-Southwest\",\n \"West\",\n \"West-Northwest\",\n \"Northwest\",\n \"North-Northwest\"\n ]\n}, ie = {\n id: \"directions-16-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"北\",\n \"北北東\",\n \"北東\",\n \"東北東\",\n \"東\",\n \"東南東\",\n \"南東\",\n \"南南東\",\n \"南\",\n \"南南西\",\n \"南西\",\n \"西南西\",\n \"西\",\n \"西北西\",\n \"北西\",\n \"北北西\"\n ]\n}, oe = {\n id: \"ampm-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"AM\", \"PM\"],\n aliases: {\n \"A.M.\": \"AM\",\n \"P.M.\": \"PM\"\n }\n}, ae = {\n id: \"ampm-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"午前\", \"午後\"]\n}, ue = {\n id: \"seasons-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Spring\", \"Summer\", \"Autumn\", \"Winter\"],\n aliases: {\n Fall: \"Autumn\"\n }\n}, le = {\n id: \"seasons-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"春\", \"夏\", \"秋\", \"冬\"]\n}, ce = {\n id: \"solfege-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"ド\", \"レ\", \"ミ\", \"ファ\", \"ソ\", \"ラ\", \"シ\"]\n}, fe = {\n id: \"solfege-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Do\", \"Re\", \"Mi\", \"Fa\", \"Sol\", \"La\", \"Ti\"],\n aliases: {\n So: \"Sol\",\n Si: \"Ti\"\n }\n}, de = {\n id: \"greek-letters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Alpha\",\n \"Beta\",\n \"Gamma\",\n \"Delta\",\n \"Epsilon\",\n \"Zeta\",\n \"Eta\",\n \"Theta\",\n \"Iota\",\n \"Kappa\",\n \"Lambda\",\n \"Mu\",\n \"Nu\",\n \"Xi\",\n \"Omicron\",\n \"Pi\",\n \"Rho\",\n \"Sigma\",\n \"Tau\",\n \"Upsilon\",\n \"Phi\",\n \"Chi\",\n \"Psi\",\n \"Omega\"\n ]\n}, me = {\n id: \"greek-letters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"アルファ\",\n \"ベータ\",\n \"ガンマ\",\n \"デルタ\",\n \"イプシロン\",\n \"ゼータ\",\n \"イータ\",\n \"シータ\",\n \"イオタ\",\n \"カッパ\",\n \"ラムダ\",\n \"ミュー\",\n \"ニュー\",\n \"クサイ\",\n \"オミクロン\",\n \"パイ\",\n \"ロー\",\n \"シグマ\",\n \"タウ\",\n \"ウプシロン\",\n \"ファイ\",\n \"カイ\",\n \"プサイ\",\n \"オメガ\"\n ]\n}, he = {\n id: \"greek-letters-symbols\",\n mode: \"cycle\",\n langs: [\"en\", \"ja\"],\n items: [\n \"α\",\n \"β\",\n \"γ\",\n \"δ\",\n \"ε\",\n \"ζ\",\n \"η\",\n \"θ\",\n \"ι\",\n \"κ\",\n \"λ\",\n \"μ\",\n \"ν\",\n \"ξ\",\n \"ο\",\n \"π\",\n \"ρ\",\n \"σ\",\n \"τ\",\n \"υ\",\n \"φ\",\n \"χ\",\n \"ψ\",\n \"ω\"\n ],\n aliases: {\n ς: \"σ\"\n }\n}, ge = {\n id: \"rokuyo-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"先勝\", \"友引\", \"先負\", \"仏滅\", \"大安\", \"赤口\"]\n}, pe = {\n id: \"heavenly-stems-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"甲\", \"乙\", \"丙\", \"丁\", \"戊\", \"己\", \"庚\", \"辛\", \"壬\", \"癸\"]\n}, xe = {\n id: \"planets-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \"Uranus\", \"Neptune\"]\n}, ye = {\n id: \"planets-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"水星\", \"金星\", \"地球\", \"火星\", \"木星\", \"土星\", \"天王星\", \"海王星\"]\n}, be = {\n id: \"kuji-in-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"臨\", \"兵\", \"闘\", \"者\", \"皆\", \"陣\", \"烈\", \"在\", \"前\"]\n}, Se = {\n id: \"eight-virtues-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"仁\", \"義\", \"礼\", \"智\", \"忠\", \"信\", \"孝\", \"悌\"]\n}, je = {\n id: \"element-symbols\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"H\",\n \"He\",\n \"Li\",\n \"Be\",\n \"B\",\n \"C\",\n \"N\",\n \"O\",\n \"F\",\n \"Ne\",\n \"Na\",\n \"Mg\",\n \"Al\",\n \"Si\",\n \"P\",\n \"S\",\n \"Cl\",\n \"Ar\",\n \"K\",\n \"Ca\",\n \"Sc\",\n \"Ti\",\n \"V\",\n \"Cr\",\n \"Mn\",\n \"Fe\",\n \"Co\",\n \"Ni\",\n \"Cu\",\n \"Zn\",\n \"Ga\",\n \"Ge\",\n \"As\",\n \"Se\",\n \"Br\",\n \"Kr\",\n \"Rb\",\n \"Sr\",\n \"Y\",\n \"Zr\",\n \"Nb\",\n \"Mo\",\n \"Tc\",\n \"Ru\",\n \"Rh\",\n \"Pd\",\n \"Ag\",\n \"Cd\",\n \"In\",\n \"Sn\",\n \"Sb\",\n \"Te\",\n \"I\",\n \"Xe\",\n \"Cs\",\n \"Ba\",\n \"La\",\n \"Ce\",\n \"Pr\",\n \"Nd\",\n \"Pm\",\n \"Sm\",\n \"Eu\",\n \"Gd\",\n \"Tb\",\n \"Dy\",\n \"Ho\",\n \"Er\",\n \"Tm\",\n \"Yb\",\n \"Lu\",\n \"Hf\",\n \"Ta\",\n \"W\",\n \"Re\",\n \"Os\",\n \"Ir\",\n \"Pt\",\n \"Au\",\n \"Hg\",\n \"Tl\",\n \"Pb\",\n \"Bi\",\n \"Po\",\n \"At\",\n \"Rn\",\n \"Fr\",\n \"Ra\",\n \"Ac\",\n \"Th\",\n \"Pa\",\n \"U\",\n \"Np\",\n \"Pu\",\n \"Am\",\n \"Cm\",\n \"Bk\",\n \"Cf\",\n \"Es\",\n \"Fm\",\n \"Md\",\n \"No\",\n \"Lr\",\n \"Rf\",\n \"Db\",\n \"Sg\",\n \"Bh\",\n \"Hs\",\n \"Mt\",\n \"Ds\",\n \"Rg\",\n \"Cn\",\n \"Nh\",\n \"Fl\",\n \"Mc\",\n \"Lv\",\n \"Ts\",\n \"Og\"\n ]\n}, ke = {\n id: \"element-names-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"水素\",\n \"ヘリウム\",\n \"リチウム\",\n \"ベリリウム\",\n \"ホウ素\",\n \"炭素\",\n \"窒素\",\n \"酸素\",\n \"フッ素\",\n \"ネオン\",\n \"ナトリウム\",\n \"マグネシウム\",\n \"アルミニウム\",\n \"ケイ素\",\n \"リン\",\n \"硫黄\",\n \"塩素\",\n \"アルゴン\",\n \"カリウム\",\n \"カルシウム\",\n \"スカンジウム\",\n \"チタン\",\n \"バナジウム\",\n \"クロム\",\n \"マンガン\",\n \"鉄\",\n \"コバルト\",\n \"ニッケル\",\n \"銅\",\n \"亜鉛\",\n \"ガリウム\",\n \"ゲルマニウム\",\n \"ヒ素\",\n \"セレン\",\n \"臭素\",\n \"クリプトン\",\n \"ルビジウム\",\n \"ストロンチウム\",\n \"イットリウム\",\n \"ジルコニウム\",\n \"ニオブ\",\n \"モリブデン\",\n \"テクネチウム\",\n \"ルテニウム\",\n \"ロジウム\",\n \"パラジウム\",\n \"銀\",\n \"カドミウム\",\n \"インジウム\",\n \"スズ\",\n \"アンチモン\",\n \"テルル\",\n \"ヨウ素\",\n \"キセノン\",\n \"セシウム\",\n \"バリウム\",\n \"ランタン\",\n \"セリウム\",\n \"プラセオジム\",\n \"ネオジム\",\n \"プロメチウム\",\n \"サマリウム\",\n \"ユウロピウム\",\n \"ガドリニウム\",\n \"テルビウム\",\n \"ジスプロシウム\",\n \"ホルミウム\",\n \"エルビウム\",\n \"ツリウム\",\n \"イッテルビウム\",\n \"ルテチウム\",\n \"ハフニウム\",\n \"タンタル\",\n \"タングステン\",\n \"レニウム\",\n \"オスミウム\",\n \"イリジウム\",\n \"白金\",\n \"金\",\n \"水銀\",\n \"タリウム\",\n \"鉛\",\n \"ビスマス\",\n \"ポロニウム\",\n \"アスタチン\",\n \"ラドン\",\n \"フランシウム\",\n \"ラジウム\",\n \"アクチニウム\",\n \"トリウム\",\n \"プロトアクチニウム\",\n \"ウラン\",\n \"ネプツニウム\",\n \"プルトニウム\",\n \"アメリシウム\",\n \"キュリウム\",\n \"バークリウム\",\n \"カリホルニウム\",\n \"アインスタイニウム\",\n \"フェルミウム\",\n \"メンデレビウム\",\n \"ノーベリウム\",\n \"ローレンシウム\",\n \"ラザホージウム\",\n \"ドブニウム\",\n \"シーボーギウム\",\n \"ボーリウム\",\n \"ハッシウム\",\n \"マイトネリウム\",\n \"ダームスタチウム\",\n \"レントゲニウム\",\n \"コペルニシウム\",\n \"ニホニウム\",\n \"フレロビウム\",\n \"モスコビウム\",\n \"リバモリウム\",\n \"テネシン\",\n \"オガネソン\"\n ]\n}, we = {\n id: \"shoguns-kamakura-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"源頼朝\",\n \"源頼家\",\n \"源実朝\",\n \"九条頼経\",\n \"九条頼嗣\",\n \"宗尊親王\",\n \"惟康親王\",\n \"久明親王\",\n \"守邦親王\"\n ]\n}, Ne = {\n id: \"shoguns-ashikaga-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"足利尊氏\",\n \"足利義詮\",\n \"足利義満\",\n \"足利義持\",\n \"足利義量\",\n \"足利義教\",\n \"足利義勝\",\n \"足利義政\",\n \"足利義尚\",\n \"足利義稙\",\n \"足利義澄\",\n \"足利義晴\",\n \"足利義輝\",\n \"足利義栄\",\n \"足利義昭\"\n ]\n}, Ie = {\n id: \"shoguns-ashikaga-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"尊氏\",\n \"義詮\",\n \"義満\",\n \"義持\",\n \"義量\",\n \"義教\",\n \"義勝\",\n \"義政\",\n \"義尚\",\n \"義稙\",\n \"義澄\",\n \"義晴\",\n \"義輝\",\n \"義栄\",\n \"義昭\"\n ]\n}, Te = {\n id: \"shoguns-tokugawa-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"徳川家康\",\n \"徳川秀忠\",\n \"徳川家光\",\n \"徳川家綱\",\n \"徳川綱吉\",\n \"徳川家宣\",\n \"徳川家継\",\n \"徳川吉宗\",\n \"徳川家重\",\n \"徳川家治\",\n \"徳川家斉\",\n \"徳川家慶\",\n \"徳川家定\",\n \"徳川家茂\",\n \"徳川慶喜\"\n ]\n}, Me = {\n id: \"shoguns-tokugawa-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"家康\",\n \"秀忠\",\n \"家光\",\n \"家綱\",\n \"綱吉\",\n \"家宣\",\n \"家継\",\n \"吉宗\",\n \"家重\",\n \"家治\",\n \"家斉\",\n \"家慶\",\n \"家定\",\n \"家茂\",\n \"慶喜\"\n ]\n}, T = [\n \"北海道\",\n \"青森県\",\n \"岩手県\",\n \"宮城県\",\n \"秋田県\",\n \"山形県\",\n \"福島県\",\n \"茨城県\",\n \"栃木県\",\n \"群馬県\",\n \"埼玉県\",\n \"千葉県\",\n \"東京都\",\n \"神奈川県\",\n \"新潟県\",\n \"富山県\",\n \"石川県\",\n \"福井県\",\n \"山梨県\",\n \"長野県\",\n \"岐阜県\",\n \"静岡県\",\n \"愛知県\",\n \"三重県\",\n \"滋賀県\",\n \"京都府\",\n \"大阪府\",\n \"兵庫県\",\n \"奈良県\",\n \"和歌山県\",\n \"鳥取県\",\n \"島根県\",\n \"岡山県\",\n \"広島県\",\n \"山口県\",\n \"徳島県\",\n \"香川県\",\n \"愛媛県\",\n \"高知県\",\n \"福岡県\",\n \"佐賀県\",\n \"長崎県\",\n \"熊本県\",\n \"大分県\",\n \"宮崎県\",\n \"鹿児島県\",\n \"沖縄県\"\n], Ae = T.reduce(\n (e, t) => {\n if (t === \"北海道\")\n return e;\n if (/[都府県]$/.test(t)) {\n const n = t.slice(0, -1);\n e[n] = t;\n }\n return e;\n },\n {}\n), ve = {\n id: \"prefectures-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: T,\n aliases: Ae\n}, Le = {\n id: \"us-states-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"Alabama\",\n \"Alaska\",\n \"Arizona\",\n \"Arkansas\",\n \"California\",\n \"Colorado\",\n \"Connecticut\",\n \"Delaware\",\n \"Florida\",\n \"Georgia\",\n \"Hawaii\",\n \"Idaho\",\n \"Illinois\",\n \"Indiana\",\n \"Iowa\",\n \"Kansas\",\n \"Kentucky\",\n \"Louisiana\",\n \"Maine\",\n \"Maryland\",\n \"Massachusetts\",\n \"Michigan\",\n \"Minnesota\",\n \"Mississippi\",\n \"Missouri\",\n \"Montana\",\n \"Nebraska\",\n \"Nevada\",\n \"New Hampshire\",\n \"New Jersey\",\n \"New Mexico\",\n \"New York\",\n \"North Carolina\",\n \"North Dakota\",\n \"Ohio\",\n \"Oklahoma\",\n \"Oregon\",\n \"Pennsylvania\",\n \"Rhode Island\",\n \"South Carolina\",\n \"South Dakota\",\n \"Tennessee\",\n \"Texas\",\n \"Utah\",\n \"Vermont\",\n \"Virginia\",\n \"Washington\",\n \"West Virginia\",\n \"Wisconsin\",\n \"Wyoming\"\n ]\n}, Ee = {\n id: \"us-states-abbrev-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\"\n ]\n}, We = {\n id: \"windows-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Windows 1.0\",\n \"Windows 2.0\",\n \"Windows 2.1\",\n \"Windows 3.0\",\n \"Windows 3.1\",\n \"Windows 3.11\",\n \"Windows 95\",\n \"Windows 98\",\n \"Windows 98 SE\",\n \"Windows Me\",\n \"Windows XP\",\n \"Windows Vista\",\n \"Windows 7\",\n \"Windows 8\",\n \"Windows 8.1\",\n \"Windows 10\",\n \"Windows 11\"\n ]\n}, Ce = {\n id: \"macos-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Cheetah\",\n \"Puma\",\n \"Jaguar\",\n \"Panther\",\n \"Tiger\",\n \"Leopard\",\n \"Snow Leopard\",\n \"Lion\",\n \"Mountain Lion\",\n \"Mavericks\",\n \"Yosemite\",\n \"El Capitan\",\n \"Sierra\",\n \"High Sierra\",\n \"Mojave\",\n \"Catalina\",\n \"Big Sur\",\n \"Monterey\",\n \"Ventura\",\n \"Sonoma\",\n \"Sequoia\",\n \"Tahoe\"\n ]\n}, Oe = {\n id: \"debian-codenames\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"buzz\",\n \"rex\",\n \"bo\",\n \"hamm\",\n \"slink\",\n \"potato\",\n \"woody\",\n \"sarge\",\n \"etch\",\n \"lenny\",\n \"squeeze\",\n \"wheezy\",\n \"jessie\",\n \"stretch\",\n \"buster\",\n \"bullseye\",\n \"bookworm\",\n \"trixie\"\n ]\n}, $e = [\n B,\n G,\n H,\n U,\n Y,\n q,\n X,\n Q,\n Z,\n _,\n ee,\n te,\n ne,\n se,\n re,\n ie,\n oe,\n ae,\n ue,\n le,\n ce,\n fe,\n de,\n me,\n he,\n ge,\n pe,\n xe,\n ye,\n be,\n Se,\n je,\n ke,\n we,\n Ne,\n Ie,\n Te,\n Me,\n ve,\n Le,\n Ee,\n We,\n Ce,\n Oe\n], p = (e) => {\n const t = e % 100;\n if (t >= 11 && t <= 13) return \"th\";\n const n = e % 10;\n return n === 1 ? \"st\" : n === 2 ? \"nd\" : n === 3 ? \"rd\" : \"th\";\n}, x = {\n 1: \"first\",\n 2: \"second\",\n 3: \"third\",\n 4: \"fourth\",\n 5: \"fifth\",\n 6: \"sixth\",\n 7: \"seventh\",\n 8: \"eighth\",\n 9: \"ninth\",\n 10: \"tenth\",\n 11: \"eleventh\",\n 12: \"twelfth\",\n 13: \"thirteenth\",\n 14: \"fourteenth\",\n 15: \"fifteenth\",\n 16: \"sixteenth\",\n 17: \"seventeenth\",\n 18: \"eighteenth\",\n 19: \"nineteenth\"\n}, y = {\n 20: \"twentieth\",\n 30: \"thirtieth\",\n 40: \"fortieth\",\n 50: \"fiftieth\",\n 60: \"sixtieth\",\n 70: \"seventieth\",\n 80: \"eightieth\",\n 90: \"ninetieth\"\n}, M = {\n 20: \"twenty\",\n 30: \"thirty\",\n 40: \"forty\",\n 50: \"fifty\",\n 60: \"sixty\",\n 70: \"seventy\",\n 80: \"eighty\",\n 90: \"ninety\"\n}, w = Object.fromEntries(\n Object.entries(x).map(([e, t]) => [t, Number(e)])\n), Fe = Object.fromEntries(\n Object.entries(y).map(([e, t]) => [t, Number(e)])\n), Pe = Object.fromEntries(\n Object.entries(M).map(([e, t]) => [t, Number(e)])\n), A = (e) => {\n const t = e.trim().toLowerCase();\n if (!t) return null;\n const n = w[t] ?? Fe[t];\n if (n) return n;\n const s = t.split(/[-\\s]+/);\n if (s.length !== 2) return null;\n const r = Pe[s[0] ?? \"\"], o = w[s[1] ?? \"\"];\n return !r || !o ? null : r + o;\n}, v = (e) => {\n if (!Number.isFinite(e) || e <= 0 || Math.floor(e) !== e) return null;\n if (e <= 19) return x[e] ?? null;\n if (e < 100) {\n if (y[e]) return y[e] ?? null;\n const t = Math.floor(e / 10) * 10, n = e % 10, s = M[t], r = x[n];\n return !s || !r ? null : `${s}-${r}`;\n }\n return null;\n}, N = (e) => {\n const t = /^(\\d+)(st|nd|rd|th)$/i.exec(e);\n if (t) {\n const s = Number(t[1]);\n if (!Number.isFinite(s) || s <= 0) return null;\n const r = t[2]?.toLowerCase();\n return p(s) !== r ? null : { value: s, format: \"numeric\" };\n }\n const n = A(e);\n return n !== null ? { value: n, format: \"word\" } : null;\n}, Ve = {\n id: \"ordinal-en\",\n langs: [\"en\"],\n match(e) {\n if (e.length < 2) return null;\n const t = e.map((o) => N(o));\n if (t.some((o) => o === null)) return null;\n const n = t[0].format;\n if (t.some((o) => o?.format !== n)) return null;\n const s = t.map((o) => o.value), r = s[1] - s[0];\n for (let o = 2; o < s.length; o += 1)\n if (s[o] - s[o - 1] !== r) return null;\n return { score: 80, step: r, state: { format: n } };\n },\n createIterator(e, t) {\n const n = N(e[e.length - 1] ?? \"\"), s = t.state?.format ?? \"numeric\";\n let r = n?.value ?? 0;\n return {\n next() {\n if (r += t.step, r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (s === \"word\") {\n const o = v(r);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n return { value: `${r}${p(r)}`, done: !1 };\n }\n };\n }\n}, Je = (e) => {\n for (const t of $e)\n e.register(t);\n}, Re = (e) => {\n e.registerMatch(Ve);\n}, De = (e) => {\n const t = e ?? [\"en\", \"ja\"], n = new z({ langs: t });\n return Je(n), Re(n), n;\n}, Ke = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n};\nclass m {\n constructor(...t) {\n const n = t;\n this.seed = n, this.kind = n.length === 1 ? \"copy\" : \"seed-repeat\", this.iterator = Ke(n);\n }\n static fromSeed(t, n, s) {\n const r = new m(...t);\n return r.kind = n, r.iterator = s, r;\n }\n next() {\n return this.iterator.next();\n }\n [Symbol.iterator]() {\n return this;\n }\n}\nconst L = 1e-9, ze = 100, Be = (e) => ({\n next() {\n return { value: e, done: !1 };\n }\n}), I = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n}, Ge = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e + t * n, done: !1 };\n }\n };\n}, He = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: new Date(e.getTime() + t * n), done: !1 };\n }\n };\n}, Ue = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e * t ** n, done: !1 };\n }\n };\n}, Ye = (e, t) => {\n if (e.kind === \"matcher\")\n return e.matcher.createIterator(t, { step: e.step, state: e.state });\n const { list: n, startIndex: s, step: r } = e, o = n.items.length;\n let u = s;\n return {\n next() {\n if (n.mode === \"finite\") {\n const i = u + r;\n return i >= o ? { value: void 0, done: !0 } : (u = i, { value: n.items[u], done: !1 });\n }\n return u = (u + r) % o, { value: n.items[u], done: !1 };\n }\n };\n}, qe = (e) => e.every((t) => typeof t == \"number\" && Number.isFinite(t)), Xe = (e) => e.every((t) => t instanceof Date && !Number.isNaN(t.getTime())), Qe = (e) => e.every((t) => typeof t == \"string\"), Ze = (e) => {\n const t = /^(.*?)(-?\\d+)([^0-9]*)$/.exec(e);\n if (!t)\n return null;\n const n = t[1] ?? \"\", s = t[2] ?? \"\", r = t[3] ?? \"\", o = Number(s);\n if (!Number.isFinite(o))\n return null;\n const u = s.replace(\"-\", \"\").length;\n return { prefix: n, num: o, width: u, suffix: r };\n}, _e = (e) => {\n const t = /^(.*?)(\\d+)(st|nd|rd|th)([^0-9]*)$/i.exec(e);\n if (t) {\n const r = Number(t[2]);\n if (!Number.isFinite(r) || r <= 0) return null;\n const o = t[3]?.toLowerCase();\n return p(r) !== o ? null : {\n prefix: t[1] ?? \"\",\n num: r,\n suffix: t[4] ?? \"\",\n format: \"numeric\"\n };\n }\n const n = /^(.*?)([A-Za-z-]+)([^A-Za-z]*)$/.exec(e);\n if (!n) return null;\n const s = A(n[2] ?? \"\");\n return s === null ? null : {\n prefix: n[1] ?? \"\",\n num: s,\n suffix: n[3] ?? \"\",\n format: \"word\"\n };\n}, et = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s;\n if (r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (e.format === \"word\") {\n const o = v(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n return {\n value: `${e.prefix}${r}${p(r)}${e.suffix}`,\n done: !1\n };\n }\n };\n}, tt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = r < 0 ? \"-\" : \"\", u = Math.abs(r).toString().padStart(e.width, \"0\");\n return { value: `${e.prefix}${o}${u}${e.suffix}`, done: !1 };\n }\n };\n}, E = [\n [\"C\", 100],\n [\"XC\", 90],\n [\"L\", 50],\n [\"XL\", 40],\n [\"X\", 10],\n [\"IX\", 9],\n [\"V\", 5],\n [\"IV\", 4],\n [\"I\", 1]\n], j = (e) => {\n if (e < 1 || e > ze)\n return null;\n let t = e, n = \"\";\n for (const [s, r] of E)\n for (; t >= r; )\n n += s, t -= r;\n return n;\n}, W = (e) => {\n if (e.length === 0 || e !== e.toUpperCase())\n return null;\n let t = e, n = 0;\n for (const [r, o] of E)\n for (; t.startsWith(r); )\n n += o, t = t.slice(r.length);\n if (t.length > 0)\n return null;\n const s = j(n);\n return !s || s !== e ? null : n;\n}, nt = (e, t) => {\n let n = 0;\n return {\n next() {\n n += 1;\n const s = e + t * n, r = j(s);\n return r ? { value: r, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, st = (e) => new RegExp(\"\\\\p{White_Space}\", \"u\").test(e) ? \"space\" : new RegExp(\"\\\\p{P}\", \"u\").test(e) ? \"punct\" : new RegExp(\"\\\\p{S}\", \"u\").test(e) ? \"symbol\" : new RegExp(\"\\\\p{Script=Latin}\", \"u\").test(e) ? \"latin\" : new RegExp(\"\\\\p{Script=Han}\", \"u\").test(e) ? \"han\" : new RegExp(\"\\\\p{Script=Hiragana}\", \"u\").test(e) ? \"hiragana\" : new RegExp(\"\\\\p{Script=Katakana}\", \"u\").test(e) ? \"katakana\" : new RegExp(\"\\\\p{N}\", \"u\").test(e) ? \"number\" : \"other\", rt = (e) => {\n const t = [];\n let n = \"\", s = null;\n for (const r of e) {\n const o = st(r);\n if (s === o) {\n n += r;\n continue;\n }\n s !== null && t.push({ value: n, group: s }), n = r, s = o;\n }\n return s !== null && t.push({ value: n, group: s }), t;\n}, it = (e) => {\n const t = rt(e), n = t.map((i, a) => ({ index: a, num: W(i.value) })).filter((i) => i.num !== null);\n if (n.length !== 1)\n return null;\n const s = n[0].index, r = n[0].num, o = t.slice(0, s).map((i) => i.value).join(\"\"), u = t.slice(s + 1).map((i) => i.value).join(\"\");\n return { prefix: o, num: r, suffix: u };\n}, ot = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = j(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, b = {\n 一: 1,\n 二: 2,\n 三: 3,\n 四: 4,\n 五: 5,\n 六: 6,\n 七: 7,\n 八: 8,\n 九: 9\n}, S = {\n 壱: 1,\n 弐: 2,\n 参: 3,\n 肆: 4,\n 伍: 5,\n 陸: 6,\n 柒: 7,\n 捌: 8,\n 玖: 9\n}, C = {\n 十: 10,\n 拾: 10,\n 百: 100,\n 佰: 100,\n 千: 1e3,\n 仟: 1e3\n}, O = {\n 万: 1e4,\n 萬: 1e4\n}, at = /* @__PURE__ */ new Set([\n ...Object.keys(b),\n ...Object.keys(S),\n ...Object.keys(C),\n ...Object.keys(O)\n]), ut = (e) => at.has(e), lt = (e) => /[壱弐参肆伍陸柒捌玖拾萬佰仟]/.test(e) ? \"traditional\" : \"modern\", $ = (e) => {\n if (!e)\n return null;\n const t = lt(e);\n if (e.includes(\"万\") || e.includes(\"萬\")) {\n const i = /^([一二三四五六七八九壱弐参肆伍陸柒捌玖])?(万|萬)$/.exec(e);\n if (!i)\n return null;\n const a = i[1];\n return a ? (b[a] ?? S[a]) !== 1 ? null : { num: 1e4, style: t } : { num: 1e4, style: t };\n }\n let s = 0, r = 0, o = Number.POSITIVE_INFINITY, u = !1;\n for (const i of e) {\n const a = b[i] ?? S[i];\n if (a) {\n if (u)\n return null;\n r = a, u = !0;\n continue;\n }\n const l = C[i];\n if (l) {\n if (l >= o)\n return null;\n r === 0 && (r = 1), s += r * l, r = 0, o = l, u = !1;\n continue;\n }\n return O[i], null;\n }\n return s += r, s <= 0 || s > 1e4 ? null : { num: s, style: t };\n}, ct = (e) => {\n const t = [];\n let n = \"\", s = 0, r = 0;\n for (const l of e)\n ut(l) ? (n || (s = r), n += l) : n && (t.push({ start: s, end: r, text: n }), n = \"\"), r += l.length;\n n && t.push({ start: s, end: r, text: n });\n const o = t.map((l) => ({ run: l, parsed: $(l.text) })).filter((l) => l.parsed !== null);\n if (o.length !== 1)\n return null;\n const u = o[0], i = e.slice(0, u.run.start), a = e.slice(u.run.end);\n return {\n prefix: i,\n num: u.parsed.num,\n suffix: a,\n style: u.parsed.style\n };\n}, F = (e, t) => {\n if (!Number.isFinite(e) || e <= 0 || e > 1e4)\n return null;\n const n = t === \"traditional\" ? [\"\", \"壱\", \"弐\", \"参\", \"肆\", \"伍\", \"陸\", \"柒\", \"捌\", \"玖\"] : [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"], s = t === \"traditional\" ? \"拾\" : \"十\", r = t === \"traditional\" ? \"萬\" : \"万\";\n if (e === 1e4)\n return `${n[1]}${r}`;\n let o = e, u = \"\";\n const i = Math.floor(o / 1e3);\n i > 0 && (i > 1 && (u += n[i]), u += \"千\", o %= 1e3);\n const a = Math.floor(o / 100);\n a > 0 && (a > 1 && (u += n[a]), u += \"百\", o %= 100);\n const l = Math.floor(o / 10);\n return l > 0 && (l > 1 && (u += n[l]), u += s, o %= 10), o > 0 && (u += n[o]), u || null;\n}, ft = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = e + t * s, o = F(r, n);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, dt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = F(r, e.style);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, h = (e) => {\n if (e.length < 2)\n return null;\n const t = e[1] - e[0];\n for (let n = 2; n < e.length; n += 1)\n if (Math.abs(e[n] - e[n - 1] - t) > L)\n return null;\n return t;\n}, mt = (e) => {\n if (e.length < 2 || e[0] === 0)\n return null;\n const t = e[1] / e[0];\n for (let n = 2; n < e.length; n += 1)\n if (e[n - 1] === 0 || Math.abs(e[n] / e[n - 1] - t) > L)\n return null;\n return t;\n}, ht = (e) => {\n const t = e.map((i) => _e(i));\n if (t.every((i) => i !== null)) {\n const i = t, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.format === a.format\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: et(\n { prefix: a.prefix, suffix: a.suffix, format: a.format },\n d.num,\n f\n )\n };\n }\n }\n }\n const n = e.map((i) => Ze(i));\n if (n.every(Boolean)) {\n const i = n[0], a = n[n.length - 1];\n if (n.every(\n (c) => c?.prefix === i.prefix && c?.suffix === i.suffix\n )) {\n const c = n.map((d) => d?.num ?? 0), f = h(c);\n if (f !== null)\n return {\n kind: \"arithmetic\",\n iterator: tt(\n { prefix: a.prefix, suffix: a.suffix, width: a.width },\n a.num,\n f\n )\n };\n }\n }\n const s = e.map((i) => W(i));\n if (s.every((i) => i !== null)) {\n const i = s, a = h(i);\n if (a !== null) {\n const l = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: nt(l, a)\n };\n }\n }\n const r = e.map((i) => $(i));\n if (r.every((i) => i !== null)) {\n const i = r, a = i[0].style;\n if (i.every((l) => l.style === a)) {\n const l = i.map((f) => f.num), c = h(l);\n if (c !== null) {\n const f = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ft(f.num, c, f.style)\n };\n }\n }\n }\n const o = e.map((i) => it(i));\n if (o.every((i) => i !== null)) {\n const i = o, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = c[c.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ot(\n { prefix: a.prefix, suffix: a.suffix },\n d,\n f\n )\n };\n }\n }\n }\n const u = e.map((i) => ct(i));\n if (u.every((i) => i !== null)) {\n const i = u, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.style === a.style\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: dt(\n { prefix: a.prefix, suffix: a.suffix, style: a.style },\n d.num,\n f\n )\n };\n }\n }\n }\n return null;\n}, gt = (e, t) => {\n const n = t.match(e);\n return n ? {\n kind: \"list\",\n iterator: Ye(n, e)\n } : null;\n};\nfunction pt(e, t) {\n const n = t?.registry ?? De();\n if (e.length === 0)\n return m.fromSeed(e, \"seed-repeat\", I(e));\n if (e.length === 1)\n return m.fromSeed(e, \"copy\", Be(e[0]));\n if (Qe(e)) {\n const s = gt(e, n);\n if (s)\n return m.fromSeed(e, s.kind, s.iterator);\n const r = ht(e);\n if (r)\n return m.fromSeed(e, r.kind, r.iterator);\n }\n if (qe(e)) {\n const s = h(e);\n if (s !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n Ge(e[e.length - 1], s)\n );\n const r = mt(e);\n if (r !== null)\n return m.fromSeed(\n e,\n \"geometric\",\n Ue(e[e.length - 1], r)\n );\n }\n if (Xe(e)) {\n const s = e.map((o) => o.getTime()), r = h(s);\n if (r !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n He(e[e.length - 1], r)\n );\n }\n return m.fromSeed(e, \"seed-repeat\", I(e));\n}\nexport {\n m as Sequence,\n z as SequenceRegistry,\n De as createBuiltInRegistry,\n v as formatEnglishOrdinalWord,\n pt as inferSequence,\n p as ordinalSuffix,\n A as parseEnglishOrdinalWord,\n Je as registerBuiltInLists,\n Re as registerBuiltInMatchers\n};\n//# sourceMappingURL=index.js.map\n","import type { DataModel } from \"./dataModel\";\nimport type { EditMode, SelectionRange } from \"./types\";\nimport { createBuiltInRegistry, inferSequence } from \"@extable/sequence\";\n\nexport type FillHandleMode = 'copy' | 'sequence';\n\nexport interface FillHandleSource {\n colKey: string;\n colIndex: number;\n startRowIndex: number;\n endRowIndex: number;\n mode: FillHandleMode;\n}\n\nfunction normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol)\n };\n}\n\nfunction coerceToTime(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const s = value.trim();\n if (/^\\d{1,2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?$/.test(s)) {\n const d = new Date(`1970-01-01T${s}`);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(s);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction coerceToDate(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function getFillHandleSource(dataModel: DataModel, ranges: SelectionRange[]): FillHandleSource | null {\n if (ranges.length !== 1) return null;\n const range = normalizeRange(ranges[0]!);\n if (range.kind !== 'cells') return null;\n const width = range.endCol - range.startCol + 1;\n const height = range.endRow - range.startRow + 1;\n if (width !== 1) return null;\n if (height < 1) return null;\n\n const schema = dataModel.getSchema();\n const col = schema.columns[range.startCol];\n if (!col) return null;\n\n if (height === 1) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'copy'\n };\n }\n\n if (col.type === 'boolean') {\n return null;\n }\n\n if (\n col.type === 'number' ||\n col.type === 'date' ||\n col.type === 'time' ||\n col.type === 'datetime' ||\n col.type === 'string'\n ) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'sequence'\n };\n }\n\n // enum/tags: sequence not supported (copy only, but 2-cell handle should not appear)\n return null;\n}\n\nexport function makeFillValueGetter(\n dataModel: DataModel,\n source: FillHandleSource,\n langs?: readonly string[]\n): ((offsetFromEnd: number) => unknown) | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return null;\n const seed: unknown[] = [];\n for (let r = source.startRowIndex; r <= source.endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) return null;\n seed.push(dataModel.getCell(row.id, col.key));\n }\n\n if (source.mode === 'copy') {\n const last = seed[seed.length - 1];\n return () => last;\n }\n\n const registry = createBuiltInRegistry(langs);\n if (col.type === 'number') {\n const numbers = seed.map((value) => (typeof value === 'number' ? value : Number(value)));\n if (!numbers.every((value) => Number.isFinite(value))) return null;\n const seq = inferSequence(numbers, { registry });\n const cache: number[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n const dates = seed.map((value) =>\n col.type === 'time' ? coerceToTime(value) : coerceToDate(value)\n );\n if (!dates.every((value) => value instanceof Date)) return null;\n const seq = inferSequence(dates as Date[], { registry });\n const cache: Date[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'string') {\n const strings = seed.map((value) => String(value ?? ''));\n const seq = inferSequence(strings, { registry });\n const cache: string[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n return null;\n}\n\nexport const FILL_HANDLE_VISUAL_SIZE_PX = 12;\nexport const FILL_HANDLE_HIT_SIZE_PX = 14;\n\nexport function getFillHandleRect(cellRect: DOMRect, size = FILL_HANDLE_VISUAL_SIZE_PX): DOMRect {\n return new DOMRect(cellRect.right - size - 1, cellRect.bottom - size - 1, size, size);\n}\n\nexport function isPointInRect(x: number, y: number, rect: DOMRect) {\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nexport function shouldShowFillHandle(\n dataModel: DataModel,\n ranges: SelectionRange[],\n activeRowId: string | null,\n activeColKey: string | null,\n editMode: EditMode,\n): boolean {\n if (editMode === \"readonly\") return false;\n const src = getFillHandleSource(dataModel, ranges);\n if (!src) return false;\n if (!activeRowId || activeRowId === '__all__') return false;\n if (activeColKey === null) return false;\n if (activeColKey === '__all__' || activeColKey === null) return false;\n if (activeColKey !== src.colKey) return false;\n if (dataModel.isReadonly(activeRowId, activeColKey)) return false;\n return true;\n}\n","import type { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n NumberFormat,\n IntegerFormat,\n SelectionRange,\n View,\n ViewFilterValues,\n EditMode,\n} from \"./types\";\nimport { coerceDatePattern, formatDateLite, parseIsoDate } from \"./dateUtils\";\nimport { toRawValue } from \"./cellValueCodec\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n FILL_HANDLE_VISUAL_SIZE_PX,\n getFillHandleRect,\n isPointInRect,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport { columnFormatToStyle, mergeStyle, styleToCssText } from \"./styleResolver\";\nimport { getButtonLabel, getLinkLabel, resolveButtonAction, resolveLinkAction } from \"./actionValue\";\nimport { formatIntegerWithPrefix, formatNumberForEdit } from \"./numberIO\";\n\nconst CANVAS_FONT_FAMILY = '\"Inter\",\"Segoe UI\",system-ui,-apple-system,\"Helvetica Neue\",sans-serif';\n// Canvas text tends to render slightly larger than HTML with the same nominal size.\n// Use a slightly smaller size to visually match HTML's 14px.\nconst CANVAS_FONT_SIZE_PX = 13.5;\n\nfunction getColumnSortDir(view: View, colKey: string): \"asc\" | \"desc\" | null {\n const s = view.sorts?.[0];\n if (!s) return null;\n return s.key === colKey ? s.dir : null;\n}\n\nfunction hasActiveColumnFilter(view: View, colKey: string): boolean {\n const hasValues = (view.filters ?? []).some((f) => {\n const vf = f as ViewFilterValues;\n return vf?.kind === \"values\" && vf.key === colKey;\n });\n if (hasValues) return true;\n const diag = view.columnDiagnostics?.[colKey];\n return Boolean(diag?.errors || diag?.warnings);\n}\n\nfunction svgFunnel() {\n // Simple funnel icon (stroke only) for filter affordance.\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 5h18l-7 8v6l-4 2v-8L3 5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n </svg>\n `.trim();\n}\n\nfunction svgArrow(dir: \"asc\" | \"desc\") {\n const d = dir === \"asc\" ? \"M12 6l6 8H6l6-8z\" : \"M12 18l-6-8h12l-6 8z\";\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"${d}\" fill=\"currentColor\"/>\n </svg>\n `.trim();\n}\n\nfunction drawDiagnosticCorner(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n level: \"warning\" | \"error\",\n) {\n const size = Math.min(10, Math.floor(Math.min(w, h) / 2));\n if (size <= 0) return;\n const color = level === \"error\" ? \"#ef4444\" : \"#f59e0b\";\n ctx.save();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x + w, y);\n ctx.lineTo(x + w - size, y);\n ctx.lineTo(x + w, y + size);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nclass ValueFormatCache {\n private numberFormatCache = new Map<string, Intl.NumberFormat>();\n private dateParseCache = new Map<string, Date>();\n\n getNumberFormatter(options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = JSON.stringify(options);\n let fmt = this.numberFormatCache.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat(\"en-US\", options);\n this.numberFormatCache.set(key, fmt);\n }\n return fmt;\n }\n\n parseIsoDate(value: string): Date | null {\n const cached = this.dateParseCache.get(value);\n if (cached) return cached;\n const parsed = parseIsoDate(value);\n if (!parsed || Number.isNaN(parsed.getTime())) return null;\n this.dateParseCache.set(value, parsed);\n return parsed;\n }\n}\n\nfunction drawFunnelIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.strokeStyle = \"rgba(15,23,42,1)\";\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n // Top trapezoid\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + Math.round(size * 0.62), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.38), y + Math.round(size * 0.46));\n ctx.closePath();\n ctx.stroke();\n // Stem\n ctx.beginPath();\n ctx.moveTo(x + Math.round(size * 0.46), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.46), y + size);\n ctx.lineTo(x + Math.round(size * 0.54), y + size - 2);\n ctx.lineTo(x + Math.round(size * 0.54), y + Math.round(size * 0.46));\n ctx.stroke();\n ctx.restore();\n}\n\nfunction drawSortArrowIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n dir: \"asc\" | \"desc\",\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.fillStyle = \"rgba(15,23,42,1)\";\n ctx.beginPath();\n if (dir === \"asc\") {\n ctx.moveTo(x + size / 2, y);\n ctx.lineTo(x + size, y + size);\n ctx.lineTo(x, y + size);\n } else {\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + size / 2, y + size);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nfunction resolveTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n if (Array.isArray(values)) {\n return values.filter((v): v is string => typeof v === \"string\");\n }\n }\n }\n return null;\n}\n\nclass FenwickTree {\n // 1-based BIT\n private tree: number[];\n private n: number;\n\n constructor(n: number) {\n this.n = n;\n this.tree = new Array(n + 1).fill(0);\n }\n\n static from(values: number[]) {\n const ft = new FenwickTree(values.length);\n for (let i = 0; i < values.length; i += 1) ft.add(i, values[i] ?? 0);\n return ft;\n }\n\n sum(count: number) {\n // sum of first `count` items: [0..count-1]\n let i = Math.max(0, Math.min(this.n, count));\n let res = 0;\n while (i > 0) {\n res += this.tree[i] ?? 0;\n i -= i & -i;\n }\n return res;\n }\n\n total() {\n return this.sum(this.n);\n }\n\n add(index0: number, delta: number) {\n let i = index0 + 1;\n if (i <= 0 || i > this.n) return;\n while (i <= this.n) {\n this.tree[i] = (this.tree[i] ?? 0) + delta;\n i += i & -i;\n }\n }\n\n /**\n * Returns the smallest index `i` (0-based) such that `sum(i + 1) >= target`.\n * If `target <= 0`, returns 0. If `target > total`, returns `n - 1`.\n */\n lowerBound(target: number) {\n if (this.n <= 0) return 0;\n if (target <= 0) return 0;\n const total = this.total();\n if (target > total) return this.n - 1;\n let idx = 0;\n // Largest power of two >= n\n let bit = 1;\n while (bit <= this.n) bit <<= 1;\n let acc = 0;\n for (let step = bit; step !== 0; step >>= 1) {\n const next = idx + step;\n if (next <= this.n) {\n const nextAcc = acc + (this.tree[next] ?? 0);\n if (nextAcc < target) {\n idx = next;\n acc = nextAcc;\n }\n }\n }\n // idx is the last position where prefix sum < target; answer is idx (0-based)\n return Math.min(this.n - 1, idx);\n }\n}\n\nexport interface ViewportState {\n scrollTop: number;\n scrollLeft: number;\n clientWidth: number;\n clientHeight: number;\n deltaX: number;\n deltaY: number;\n timestamp: number;\n}\n\nexport interface Renderer {\n mount(root: HTMLElement): void;\n render(state?: ViewportState): void;\n destroy(): void;\n getCellElements(): NodeListOf<HTMLElement> | null;\n hitTest(\n event: MouseEvent,\n ): { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\n hitTestAction?(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null;\n setActiveCell(rowId: string | null, colKey: string | null): void;\n setSelection(ranges: SelectionRange[]): void;\n}\n\nexport class HTMLRenderer implements Renderer {\n private tableEl: HTMLTableElement | null = null;\n private defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n private rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private measureCache = new Map<string, { height: number; frame: number }>();\n private frame = 0;\n constructor(private dataModel: DataModel) {}\n\n mount(root: HTMLElement) {\n this.tableEl = document.createElement(\"table\");\n this.tableEl.dataset.extableRenderer = \"html\";\n root.innerHTML = \"\";\n root.appendChild(this.tableEl);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.updateActiveClasses();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.applySelectionClasses();\n }\n\n render(_state?: ViewportState) {\n this.frame += 1;\n if (!this.tableEl) return;\n const scrollContainer = this.tableEl.parentElement;\n const prevTop = scrollContainer?.scrollTop ?? 0;\n const prevLeft = scrollContainer?.scrollLeft ?? 0;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n this.tableEl.innerHTML = \"\";\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const colBaseCss = colBaseStyles.map((s) => styleToCssText(s));\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n this.tableEl.style.width = `${totalWidth}px`;\n this.tableEl.appendChild(this.renderHeader(schema, colWidths));\n const body = document.createElement(\"tbody\");\n for (const row of rows) {\n body.appendChild(this.renderRow(row, schema, colWidths, colBaseStyles, colBaseCss));\n }\n this.tableEl.appendChild(body);\n this.updateActiveClasses();\n this.applySelectionClasses();\n if (scrollContainer) {\n scrollContainer.scrollTop = prevTop;\n scrollContainer.scrollLeft = prevLeft;\n }\n for (const [key, entry] of Array.from(this.measureCache.entries())) {\n if (entry.frame !== this.frame) this.measureCache.delete(key);\n }\n }\n\n destroy() {\n removeFromParent(this.tableEl);\n this.tableEl = null;\n }\n\n getCellElements() {\n return this.tableEl?.querySelectorAll<HTMLElement>(\"tr[data-row-id] td[data-col-key]\") ?? null;\n }\n\n hitTest(event: MouseEvent) {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const corner = target.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = target.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const cell = target.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n\n hitTestAction(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const tagRemove = target.closest<HTMLButtonElement>(\"[data-extable-tag-remove]\");\n if (tagRemove && !tagRemove.disabled) {\n const cell = tagRemove.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const indexStr = tagRemove.dataset.extableTagIndex;\n const tagIndex = indexStr ? Number.parseInt(indexStr, 10) : Number.NaN;\n if (!Number.isFinite(tagIndex)) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind: \"tag-remove\" as const,\n tagIndex,\n };\n }\n const actionEl = target.closest<HTMLElement>(\"[data-extable-action]\");\n if (!actionEl) return null;\n const cell = actionEl.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const kind = actionEl.dataset.extableAction as \"button\" | \"link\" | undefined;\n if (kind !== \"button\" && kind !== \"link\") return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind,\n };\n }\n\n private renderHeader(schema: Schema, colWidths: number[]) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n tr.style.height = `${this.defaultRowHeight}px`;\n const rowTh = document.createElement(\"th\");\n rowTh.classList.add(\"extable-row-header\", \"extable-corner\");\n rowTh.textContent = \"\";\n rowTh.style.width = `${this.rowHeaderWidth}px`;\n if (this.activeRowId) rowTh.classList.toggle(\"extable-active-row-header\", true);\n rowTh.dataset.colKey = \"\";\n tr.appendChild(rowTh);\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const th = document.createElement(\"th\");\n th.dataset.colKey = col.key;\n const sortDir = getColumnSortDir(view, col.key);\n const hasFilter = hasActiveColumnFilter(view, col.key);\n if (sortDir) th.dataset.extableSortDir = sortDir;\n else th.removeAttribute(\"data-extable-sort-dir\");\n if (hasFilter) th.dataset.extableFsActive = \"1\";\n else th.removeAttribute(\"data-extable-fs-active\");\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"extable-col-header\";\n const label = document.createElement(\"span\");\n label.className = \"extable-col-header-text\";\n label.textContent = col.header ?? col.key;\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"extable-filter-sort-trigger\";\n btn.dataset.extableFsOpen = \"1\";\n btn.dataset.extableColKey = col.key;\n btn.title = \"Filter / Sort\";\n btn.innerHTML = sortDir ? svgArrow(sortDir) : svgFunnel();\n wrap.appendChild(label);\n wrap.appendChild(btn);\n th.appendChild(wrap);\n const width = colWidths[idx] ?? col.width;\n if (width) th.style.width = `${width}px`;\n th.dataset.colKey = col.key;\n if (this.activeColKey !== null && this.activeColKey === col.key) {\n th.classList.add(\"extable-active-col-header\");\n }\n tr.appendChild(th);\n }\n thead.appendChild(tr);\n return thead;\n }\n\n private renderRow(\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n colBaseStyles: ReturnType<typeof columnFormatToStyle>[],\n colBaseCss: string[],\n ) {\n const tr = document.createElement(\"tr\");\n tr.dataset.rowId = row.id;\n tr.style.height = `${this.defaultRowHeight}px`;\n const view = this.dataModel.getView();\n const rowHeader = document.createElement(\"th\");\n rowHeader.scope = \"row\";\n rowHeader.classList.add(\"extable-row-header\");\n const index = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n rowHeader.textContent = String(index);\n if (this.activeRowId === row.id) rowHeader.classList.add(\"extable-active-row-header\");\n tr.appendChild(rowHeader);\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const td = document.createElement(\"td\");\n td.classList.add(\"extable-cell\");\n td.dataset.colKey = col.key;\n if (col.type === \"boolean\") td.classList.add(\"extable-boolean\");\n const isPending = this.dataModel.hasPending(row.id, col.key);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const cellStyle = this.dataModel.getCellStyle(row.id, col.key);\n const hasTextColor = Boolean(\n cellStyle?.textColor || condRes.delta?.textColor || col.style?.textColor,\n );\n if (!cellStyle && !condRes.delta && !isPending) {\n const css = colBaseCss[idx] ?? \"\";\n if (css) td.style.cssText = css;\n } else {\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const merged = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const forCss = isPending ? { ...merged, textColor: undefined } : merged;\n const css = styleToCssText(forCss);\n if (css) td.style.cssText = css;\n }\n const wrap = view.wrapText?.[col.key] ?? col.wrapText;\n td.classList.add(wrap ? \"cell-wrap\" : \"cell-nowrap\");\n const raw = this.dataModel.getRawCell(row.id, col.key);\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride\n ? { text: textOverride as string }\n : this.formatValue(valueRes.value, col);\n const interaction = this.dataModel.getCellInteraction(row.id, col.key);\n const tagValues =\n col.type === \"tags\" && !textOverride ? resolveTagValues(valueRes.value) : null;\n const isActionType = col.type === \"button\" || col.type === \"link\";\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(valueRes.value)\n : getLinkLabel(valueRes.value)\n : \"\";\n if (tagValues && tagValues.length) {\n const list = document.createElement(\"div\");\n list.className = \"extable-tag-list\";\n tagValues.forEach((tag, index) => {\n const chip = document.createElement(\"span\");\n chip.className = \"extable-tag\";\n const label = document.createElement(\"span\");\n label.className = \"extable-tag-label\";\n label.textContent = tag;\n const remove = document.createElement(\"button\");\n remove.type = \"button\";\n remove.className = \"extable-tag-remove\";\n remove.dataset.extableTagRemove = \"1\";\n remove.dataset.extableTagIndex = String(index);\n remove.textContent = \"×\";\n if (interaction.readonly || interaction.disabled) {\n remove.disabled = true;\n }\n chip.appendChild(label);\n chip.appendChild(remove);\n list.appendChild(chip);\n });\n td.replaceChildren(list);\n } else if (isActionType && !textOverride && actionValue && actionLabel) {\n const actionEl =\n col.type === \"button\" ? document.createElement(\"button\") : document.createElement(\"span\");\n if (actionEl instanceof HTMLButtonElement) actionEl.type = \"button\";\n actionEl.className =\n col.type === \"button\" ? \"extable-action-button\" : \"extable-action-link\";\n if (interaction.disabled) actionEl.classList.add(\"extable-action-disabled\");\n if (col.type === \"link\" && hasTextColor) actionEl.style.color = \"inherit\";\n actionEl.dataset.extableAction = col.type;\n actionEl.textContent = actionLabel;\n td.replaceChildren(actionEl);\n } else {\n td.textContent = actionLabel || formatted.text;\n if (formatted.color) td.style.color = formatted.color;\n }\n const marker = this.dataModel.getCellMarker(row.id, col.key);\n if (marker) {\n td.classList.toggle(\"extable-diag-warning\", marker.level === \"warning\");\n td.classList.toggle(\"extable-diag-error\", marker.level === \"error\");\n td.dataset.extableDiagMessage = marker.message;\n } else {\n td.classList.remove(\"extable-diag-warning\", \"extable-diag-error\");\n td.removeAttribute(\"data-extable-diag-message\");\n }\n const align =\n col.style?.align ??\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\" ? \"right\" : \"left\");\n td.classList.add(align === \"right\" ? \"align-right\" : \"align-left\");\n const rawNumbered = toRawValue(raw, valueRes.value, col);\n if (rawNumbered !== null) {\n td.dataset.raw = rawNumbered;\n } else {\n const rawStr = raw === null || raw === undefined ? \"\" : String(raw);\n td.dataset.raw = rawStr;\n }\n if (isPending) td.classList.add(\"pending\");\n if (interaction.readonly) {\n td.classList.add(\"extable-readonly\");\n if (col.formula) td.classList.add(\"extable-readonly-formula\");\n } else {\n td.classList.add(\"extable-editable\");\n }\n if (interaction.muted) td.classList.add(\"extable-readonly-muted\");\n if (interaction.disabled) td.classList.add(\"extable-disabled\");\n if (\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === col.key\n ) {\n td.classList.add(\"extable-active-cell\");\n }\n tr.appendChild(td);\n }\n // variable row height based on measured content when wrap enabled\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (wrapAny) {\n let maxHeight = this.defaultRowHeight;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col || !col.wrapText) continue;\n const width = colWidths[idx] ?? view.columnWidths?.[col.key] ?? col.width ?? 100;\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride\n ? \"#ERROR\"\n : valueRes.value === null || valueRes.value === undefined\n ? \"\"\n : String(valueRes.value);\n const version = this.dataModel.getRowVersion(row.id);\n const key = `${row.id}|${col.key}|${version}|${width}|${text}`;\n const cached = this.measureCache.get(key);\n if (cached) {\n cached.frame = this.frame;\n this.measureCache.set(key, cached);\n maxHeight = Math.max(maxHeight, cached.height);\n continue;\n }\n const measure = document.createElement(\"span\");\n measure.style.visibility = \"hidden\";\n measure.style.position = \"absolute\";\n measure.style.left = \"-10000px\";\n measure.style.top = \"0\";\n measure.style.whiteSpace = \"pre-wrap\";\n measure.style.overflowWrap = \"anywhere\";\n measure.style.display = \"inline-block\";\n measure.style.width = `${width}px`;\n measure.textContent = text;\n const measureHost = this.tableEl?.parentElement;\n if (!measureHost) continue;\n measureHost.appendChild(measure);\n const h =\n measure.clientHeight +\n CELL_PADDING_TOP_PX +\n CELL_PADDING_BOTTOM_PX +\n 2; // border allowance (top+bottom)\n measure.remove();\n this.measureCache.set(key, { height: h, frame: this.frame });\n maxHeight = Math.max(maxHeight, h);\n }\n tr.style.height = `${maxHeight}px`;\n this.dataModel.setRowHeight(row.id, maxHeight);\n } else {\n tr.style.height = `${this.defaultRowHeight}px`;\n this.dataModel.setRowHeight(row.id, this.defaultRowHeight);\n }\n return tr;\n }\n\n private updateActiveClasses() {\n if (!this.tableEl) return;\n const isAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n this.tableEl.classList.toggle(\"extable-all-selected\", isAll);\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-row-header\"))) {\n el.classList.remove(\"extable-active-row-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-col-header\"))) {\n el.classList.remove(\"extable-active-col-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-cell\"))) {\n el.classList.remove(\"extable-active-cell\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] .extable-row-header`,\n ),\n )) {\n el.classList.add(\"extable-active-row-header\");\n }\n }\n if (this.activeColKey !== null) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(`th[data-col-key=\"${this.activeColKey}\"]`),\n )) {\n el.classList.add(\"extable-active-col-header\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] td[data-col-key=\"${this.activeColKey}\"]`,\n ),\n )) {\n el.classList.add(\"extable-active-cell\");\n }\n }\n }\n }\n\n private applySelectionClasses() {\n if (!this.tableEl) return;\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-selected\"))) {\n el.classList.remove(\"extable-selected\");\n }\n if (!this.selection.length) return;\n const rows = Array.from(this.tableEl.querySelectorAll<HTMLTableRowElement>(\"tbody tr\"));\n const schema = this.dataModel.getSchema();\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(schema.columns.length - 1, Math.max(range.startCol, range.endCol));\n for (let r = startRow; r <= endRow; r += 1) {\n const rowEl = rows[r];\n if (!rowEl) continue;\n const th = rowEl.querySelector(\"th.extable-row-header\");\n if (th) th.classList.add(\"extable-selected\");\n const cells = Array.from(rowEl.querySelectorAll<HTMLTableCellElement>(\"td\"));\n for (let c = startCol; c <= endCol; c += 1) {\n const cell = cells[c];\n if (cell) cell.classList.add(\"extable-selected\");\n }\n }\n }\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(fmtValue, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(fmtValue, \"time\")\n : coerceDatePattern(fmtValue, \"datetime\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n\nexport class CanvasRenderer implements Renderer {\n private static readonly MAX_CANVAS_DIM_PX = 8192;\n private static readonly ROW_HEIGHT_MEASURE_CHUNK = 500;\n private static readonly ROW_HEIGHT_MEASURE_TIME_BUDGET_MS = 8;\n private static readonly TEXT_MEASURE_CACHE_MAX = 2000;\n private root: HTMLElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private spacer: HTMLDivElement | null = null;\n private overlayLayer: HTMLDivElement | null = null;\n private tooltip: HTMLDivElement | null = null;\n private tooltipTarget: { rowId: string; colKey: string } | null = null;\n private tooltipMessage: string | null = null;\n private dataModel: DataModel;\n private readonly rowHeight = DEFAULT_ROW_HEIGHT_PX;\n private readonly headerHeight = HEADER_HEIGHT_PX;\n private readonly lineHeight = 16;\n private readonly padding = 12;\n private readonly rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private textMeasureCache = new Map<string, { lines: string[] }>();\n private frame = 0;\n private cursorTimer: number | null = null;\n private pendingCursorPoint: { x: number; y: number } | null = null;\n private hoverHeaderColKey: string | null = null;\n private hoverHeaderIcon = false;\n private hoverActionKey: string | null = null;\n private activeActionKey: string | null = null;\n private rowHeightCacheKey: string | null = null;\n private rowHeightMeasuredVersion = new Map<string, number>();\n private rowHeightMeasureRaf: number | null = null;\n private rowHeightMeasureTask: { key: string; nextIndex: number } | null = null;\n private heightIndex: {\n key: string | null;\n rowsRef: InternalRow[];\n idToIndex: Map<string, number>;\n heights: number[];\n fenwick: FenwickTree;\n } | null = null;\n\n constructor(\n dataModel: DataModel,\n private getEditMode: () => EditMode = () => \"direct\",\n ) {\n this.dataModel = dataModel;\n }\n\n mount(root: HTMLElement) {\n this.root = root;\n this.canvas = document.createElement(\"canvas\");\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n this.canvas.width = Math.max(1, Math.min(maxDim, Math.floor(root.clientWidth || 600)));\n this.canvas.height = Math.max(1, Math.min(maxDim, Math.floor(root.clientHeight || 400)));\n this.canvas.style.width = `${this.canvas.width}px`;\n this.canvas.style.height = `${this.canvas.height}px`;\n this.canvas.dataset.extableRenderer = \"canvas\";\n this.canvas.style.position = \"sticky\";\n this.canvas.style.top = \"0\";\n this.canvas.style.left = \"0\";\n this.canvas.style.zIndex = \"1\";\n this.canvas.style.cursor = \"cell\";\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.addEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.addEventListener(\"click\", this.handleClick);\n this.spacer = document.createElement(\"div\");\n this.spacer.style.width = \"1px\";\n if (this.tooltip) this.tooltip.remove();\n if (this.overlayLayer) this.overlayLayer.remove();\n this.overlayLayer = document.createElement(\"div\");\n this.overlayLayer.className = \"extable-overlay-layer\";\n this.tooltip = document.createElement(\"div\");\n this.tooltip.className = \"extable-tooltip\";\n this.tooltip.dataset.visible = \"0\";\n this.overlayLayer.appendChild(this.tooltip);\n root.innerHTML = \"\";\n root.style.position = \"relative\";\n root.appendChild(this.overlayLayer);\n root.appendChild(this.canvas);\n root.appendChild(this.spacer);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.render();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.render();\n }\n\n render(state?: ViewportState) {\n try {\n this.frame += 1;\n if (!this.canvas || !this.root) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n let baseFont = ctx.font;\n const selectAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const fontCache = new Map<string, string>();\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const cacheKey = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n if (cacheKey !== this.rowHeightCacheKey) {\n this.rowHeightCacheKey = cacheKey;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n if (!wrapAny) this.cancelRowHeightMeasurement();\n\n this.ensureHeightIndex(rows, wrapAny ? cacheKey : null, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return;\n\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const desiredCanvasWidth = state?.clientWidth ?? (this.root.clientWidth || 600);\n const desiredCanvasHeight =\n state?.clientHeight ?? (this.root.clientHeight || this.canvas.height || 400);\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n const nextWidth = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasWidth)));\n const nextHeight = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasHeight)));\n if (this.canvas.width !== nextWidth) this.canvas.width = nextWidth;\n if (this.canvas.height !== nextHeight) this.canvas.height = nextHeight;\n this.canvas.style.width = `${nextWidth}px`;\n this.canvas.style.height = `${nextHeight}px`;\n // Resizing resets 2D state, so reapply after size update.\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n baseFont = ctx.font;\n this.refreshTooltipPosition();\n\n const scrollTop = state?.scrollTop ?? this.root.scrollTop;\n const scrollLeft = state?.scrollLeft ?? this.root.scrollLeft;\n const computeVisibleRange = (contentTop: number) => {\n const target = contentTop + 1;\n const visibleStart = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(target)),\n );\n const accum = heightIndex.fenwick.sum(visibleStart);\n let visibleEnd = visibleStart;\n let drawnHeight = 0;\n const maxHeight = (this.canvas?.height ?? 0) + this.rowHeight * 2;\n for (let i = visibleStart; i < rows.length && drawnHeight < maxHeight; i += 1) {\n drawnHeight += heightIndex.heights[i] ?? this.rowHeight;\n visibleEnd = i + 1;\n }\n return { accum, visibleStart, visibleEnd };\n };\n\n let totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n let maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n let contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n let { accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop);\n\n if (wrapAny && cacheKey) {\n const updates: Record<string, number> = {};\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const nextH = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = nextH;\n this.rowHeightMeasuredVersion.set(row.id, version);\n }\n this.applyRowHeightUpdates(updates);\n totalRowsHeight = heightIndex.fenwick.total();\n this.dataModel.setRowHeightsBulk(updates);\n maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n ({ accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop));\n if (this.rowHeightMeasureTask || Object.keys(updates).length > 0)\n this.scheduleRowHeightMeasurement();\n }\n\n if (this.spacer) {\n this.spacer.style.height = `${maxContentScrollTop}px`;\n this.spacer.style.width = `${totalWidth}px`;\n }\n const dataXOffset = this.rowHeaderWidth - scrollLeft;\n\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n // Keep row-header column background visible across scroll\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.canvas.height);\n // Body\n let yCursor = this.headerHeight + accum - contentScrollTop;\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n const rowH = heightIndex.heights[i] ?? this.rowHeight;\n // row header cell\n ctx.strokeStyle = \"#d0d7de\";\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n ctx.strokeRect(0, yCursor, this.rowHeaderWidth, rowH);\n const idxText = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n if (this.activeRowId === row.id) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n }\n ctx.fillStyle = \"#0f172a\";\n ctx.font = `bold ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(String(idxText), this.rowHeaderWidth / 2, yCursor + rowH / 2);\n ctx.font = baseFont;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let x = 0;\n let lastFontKey = \"\";\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n x += w;\n continue;\n }\n const interaction = this.dataModel.getCellInteraction(row.id, c.key);\n const muted = interaction.muted;\n ctx.strokeStyle = \"#d0d7de\";\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const cellStyle = this.dataModel.getCellStyle(row.id, c.key);\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const bg = muted ? \"#f3f4f6\" : (mergedStyle.backgroundColor ?? \"#ffffff\");\n ctx.fillStyle = bg;\n ctx.fillRect(x, yCursor, w, rowH);\n ctx.strokeRect(x, yCursor, w, rowH);\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride ? { text: \"#ERROR\" } : this.formatValue(valueRes.value, c);\n const isActionType = c.type === \"button\" || c.type === \"link\";\n const actionValue = isActionType\n ? c.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? actionValue?.label ??\n (c.type === \"button\" ? getButtonLabel(valueRes.value) : getLinkLabel(valueRes.value))\n : \"\";\n const renderAction = Boolean(isActionType && actionValue && actionLabel && !textOverride);\n const text = actionLabel || formatted.text;\n const align = c.style?.align ?? (c.type === \"number\" ? \"right\" : \"left\");\n const isActiveCell =\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === c.key;\n if (isActiveCell) {\n ctx.strokeStyle = \"#3b82f6\";\n ctx.lineWidth = 2;\n ctx.strokeRect(x + 1, yCursor + 1, w - 2, rowH - 2);\n ctx.lineWidth = 1;\n if (\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const size = FILL_HANDLE_VISUAL_SIZE_PX;\n const left = x + w - size - 1;\n const top = yCursor + rowH - size - 1;\n ctx.fillStyle = \"#3b82f6\";\n ctx.fillRect(left, top, size, size);\n ctx.strokeStyle = \"#ffffff\";\n ctx.strokeRect(left + 0.5, top + 0.5, size - 1, size - 1);\n }\n }\n const actionColor =\n renderAction && c.type === \"link\" && !muted && !mergedStyle.textColor\n ? \"#2563eb\"\n : undefined;\n const isGlobalReadonly = this.getEditMode() === \"readonly\";\n const hasExplicitTextColor = Boolean(formatted.color || mergedStyle.textColor || actionColor);\n const formulaReadonlyColor =\n !isGlobalReadonly && Boolean(c.formula) && interaction.readonly && !muted && !hasExplicitTextColor\n ? \"#99aaff\"\n : undefined;\n ctx.fillStyle = this.dataModel.hasPending(row.id, c.key)\n ? \"#b91c1c\"\n : formatted.color\n ? formatted.color\n : muted\n ? \"#94a3b8\"\n : (actionColor ?? mergedStyle.textColor ?? formulaReadonlyColor ?? \"#0f172a\");\n const wrap = view.wrapText?.[c.key] ?? c.wrapText ?? false;\n const isBoolean = c.type === \"boolean\" && (!c.format || c.format === \"checkbox\");\n const isCustomBoolean = c.type === \"boolean\" && Boolean(c.format && c.format !== \"checkbox\");\n if (!isBoolean) {\n const fontKey = `${mergedStyle.italic ? \"i\" : \"\"}${mergedStyle.bold ? \"b\" : \"\"}`;\n if (fontKey !== lastFontKey) {\n const cached = fontCache.get(fontKey);\n if (cached) ctx.font = cached;\n else {\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n const f = `${ital}${weight}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\n fontCache.set(fontKey, f);\n ctx.font = f;\n }\n lastFontKey = fontKey;\n }\n } else {\n ctx.font = baseFont;\n lastFontKey = \"\";\n }\n const textAreaX = x + CELL_PADDING_X_PX;\n const textAreaY = yCursor + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, w - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(0, rowH - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX));\n const decorations = {\n underline: Boolean(mergedStyle.underline) || (renderAction && c.type === \"link\"),\n strike: Boolean(mergedStyle.strike),\n };\n const actionBounds =\n renderAction && !isBoolean\n ? this.measureTextBounds(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n )\n : null;\n if (renderAction && c.type === \"button\" && actionBounds) {\n const padX = 6;\n const padY = 4;\n const left = Math.max(textAreaX, actionBounds.x - padX);\n const top = Math.max(textAreaY, actionBounds.y - padY);\n const right = Math.min(textAreaX + textAreaW, actionBounds.x + actionBounds.width + padX);\n const bottom = Math.min(textAreaY + textAreaH, actionBounds.y + actionBounds.height + padY);\n const bw = Math.max(0, right - left);\n const bh = Math.max(0, bottom - top);\n ctx.save();\n const actionKey = `${row.id}::${c.key}::button`;\n const isHover = this.hoverActionKey === actionKey;\n const isActive = this.activeActionKey === actionKey;\n if (muted) {\n ctx.fillStyle = \"#f3f4f6\";\n ctx.strokeStyle = \"#e2e8f0\";\n } else if (isActive) {\n ctx.fillStyle = \"#cbd5e1\";\n ctx.strokeStyle = \"#94a3b8\";\n } else if (isHover) {\n ctx.fillStyle = \"#e2e8f0\";\n ctx.strokeStyle = \"#94a3b8\";\n } else {\n ctx.fillStyle = \"#f8fafc\";\n ctx.strokeStyle = \"#cbd5e1\";\n }\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") {\n ctx.roundRect(left, top, bw, bh, 6);\n } else {\n ctx.rect(left, top, bw, bh);\n }\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n this.drawCellText(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n isBoolean,\n isCustomBoolean,\n decorations,\n );\n const marker = this.dataModel.getCellMarker(row.id, c.key);\n if (marker) drawDiagnosticCorner(ctx, x, yCursor, w, rowH, marker.level);\n x += w;\n }\n ctx.restore();\n yCursor += rowH;\n }\n\n // Header (draw last to stay on top)\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.canvas.width, this.headerHeight);\n ctx.strokeStyle = \"#d0d7de\";\n // corner\n ctx.strokeRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n ctx.fillStyle = \"#9ca3af\";\n ctx.beginPath();\n ctx.moveTo(4, 4);\n ctx.lineTo(16, 4);\n ctx.lineTo(4, 16);\n ctx.closePath();\n ctx.fill();\n if (this.activeRowId) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(this.rowHeaderWidth, 0, this.canvas.width - this.rowHeaderWidth, this.headerHeight);\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let xHeader = 0;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n xHeader += w;\n continue;\n }\n const isActiveCol = this.activeColKey !== null && this.activeColKey === c.key;\n if (isActiveCol) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(xHeader, 0, w, this.headerHeight);\n }\n ctx.strokeStyle = \"#d0d7de\";\n ctx.strokeRect(xHeader, 0, w, this.headerHeight);\n ctx.fillStyle = \"#0f172a\";\n ctx.font = `bold ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n ctx.fillText(c.header ?? c.key, xHeader + 8, this.headerHeight - 8);\n ctx.font = baseFont;\n\n const sortDir = getColumnSortDir(view, c.key);\n const hasFilter = hasActiveColumnFilter(view, c.key);\n const isHover = this.hoverHeaderColKey !== null && this.hoverHeaderColKey === c.key;\n const showIcon = Boolean(sortDir) || hasFilter || isHover;\n if (showIcon) {\n const alpha = isHover ? 0.9 : hasFilter || sortDir ? 0.75 : 0.45;\n const iconBox = 16;\n const pad = 6;\n const ix = xHeader + w - iconBox - pad;\n const iy = Math.floor((this.headerHeight - iconBox) / 2);\n if (sortDir) {\n drawSortArrowIcon(ctx, ix + 3, iy + 3, iconBox - 6, alpha, sortDir);\n } else {\n drawFunnelIcon(ctx, ix + 2, iy + 2, iconBox - 4, alpha);\n }\n }\n xHeader += w;\n }\n ctx.restore();\n\n // selection overlay\n if (this.selection.length) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.strokeStyle = \"#3b82f6\";\n ctx.fillStyle = \"rgba(59,130,246,0.12)\";\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(\n schema.columns.length - 1,\n Math.max(range.startCol, range.endCol),\n );\n const yTop = this.headerHeight + heightIndex.fenwick.sum(startRow) - contentScrollTop;\n const height = heightIndex.fenwick.sum(endRow + 1) - heightIndex.fenwick.sum(startRow);\n let xLeft = this.rowHeaderWidth;\n for (let c = 0; c < startCol; c += 1) {\n xLeft += colWidths[c] ?? 100;\n }\n let width = 0;\n for (let c = startCol; c <= endCol; c += 1) {\n width += colWidths[c] ?? 100;\n }\n xLeft -= scrollLeft;\n ctx.fillRect(xLeft, yTop, width, height);\n ctx.strokeRect(xLeft + 0.5, yTop + 0.5, width - 1, height - 1);\n }\n ctx.restore();\n }\n\n if (selectAll) {\n ctx.save();\n ctx.fillStyle = \"rgba(59,130,246,0.08)\";\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n ctx.restore();\n }\n } catch {\n // Ignore canvas rendering errors (e.g. context enters an error state after huge resize).\n // A subsequent resize typically recovers.\n return;\n }\n }\n\n destroy() {\n this.cancelRowHeightMeasurement();\n this.heightIndex = null;\n if (this.canvas) {\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.removeEventListener(\"click\", this.handleClick);\n }\n if (this.cursorTimer) {\n window.clearTimeout(this.cursorTimer);\n this.cursorTimer = null;\n }\n this.pendingCursorPoint = null;\n removeFromParent(this.canvas);\n removeFromParent(this.spacer);\n removeFromParent(this.overlayLayer);\n removeFromParent(this.tooltip);\n this.canvas = null;\n this.spacer = null;\n this.overlayLayer = null;\n this.tooltip = null;\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.root = null;\n }\n\n private ensureHeightIndex(rows: InternalRow[], key: string | null, wrapAny: boolean) {\n const existing = this.heightIndex;\n if (existing && existing.rowsRef === rows && existing.key === key) return;\n const heights = new Array(rows.length);\n const idToIndex = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n if (!row) continue;\n idToIndex.set(row.id, i);\n let h = this.rowHeight;\n if (wrapAny && key) {\n const version = this.dataModel.getRowVersion(row.id);\n const measuredVersion = this.rowHeightMeasuredVersion.get(row.id);\n const cachedHeight = this.dataModel.getRowHeight(row.id);\n if (measuredVersion === version && typeof cachedHeight === \"number\") h = cachedHeight;\n }\n heights[i] = h;\n }\n this.heightIndex = {\n key,\n rowsRef: rows,\n idToIndex,\n heights,\n fenwick: FenwickTree.from(heights),\n };\n }\n\n private applyRowHeightUpdates(updates: Record<string, number>) {\n const index = this.heightIndex;\n if (!index) return;\n for (const [rowId, next] of Object.entries(updates)) {\n const i = index.idToIndex.get(rowId);\n if (i === undefined) continue;\n const prev = index.heights[i] ?? this.rowHeight;\n if (prev === next) continue;\n index.heights[i] = next;\n index.fenwick.add(i, next - prev);\n }\n }\n\n private getRowHeightCacheKey(schema: Schema, view: View, colWidths: number[]) {\n const wraps = schema.columns\n .map((c) => ((view.wrapText?.[c.key] ?? c.wrapText) ? \"1\" : \"0\"))\n .join(\"\");\n const widths = colWidths.map((w) => String(w ?? 0)).join(\",\");\n return `${wraps}|${widths}`;\n }\n\n private cancelRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) {\n cancelAnimationFrame(this.rowHeightMeasureRaf);\n this.rowHeightMeasureRaf = null;\n }\n this.rowHeightMeasureTask = null;\n }\n\n private scheduleRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) return;\n this.rowHeightMeasureRaf = requestAnimationFrame(() => {\n this.rowHeightMeasureRaf = null;\n this.runRowHeightMeasurement();\n });\n }\n\n private runRowHeightMeasurement() {\n if (!this.canvas) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (!wrapAny) return;\n const key = this.getRowHeightCacheKey(schema, view, colWidths);\n if (this.rowHeightCacheKey !== key) {\n this.rowHeightCacheKey = key;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n const task = this.rowHeightMeasureTask ?? { key, nextIndex: 0 };\n if (task.key !== key) return;\n\n const rows = this.dataModel.listRows();\n const updates: Record<string, number> = {};\n let measured = 0;\n const start = performance.now();\n while (task.nextIndex < rows.length && measured < CanvasRenderer.ROW_HEIGHT_MEASURE_CHUNK) {\n if (performance.now() - start > CanvasRenderer.ROW_HEIGHT_MEASURE_TIME_BUDGET_MS) break;\n const row = rows[task.nextIndex];\n task.nextIndex += 1;\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const h = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = h;\n this.rowHeightMeasuredVersion.set(row.id, version);\n measured += 1;\n }\n this.rowHeightMeasureTask = task.nextIndex < rows.length ? task : null;\n this.ensureHeightIndex(rows, this.rowHeightCacheKey, true);\n this.applyRowHeightUpdates(updates);\n this.dataModel.setRowHeightsBulk(updates);\n if (this.rowHeightMeasureTask) this.scheduleRowHeightMeasurement();\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (!this.root || !this.canvas) return;\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = ev.clientX - rect.left;\n const viewportY = ev.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n if (y >= this.headerHeight) return;\n if (x < this.rowHeaderWidth) return;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex < 0) return;\n const col = schema.columns[colIndex];\n if (!col) return;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n const inIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n if (!inIcon) return;\n this.root.dispatchEvent(\n new CustomEvent(\"extable:filter-sort-open\", { bubbles: true, detail: { colKey: col.key } }),\n );\n };\n\n getCellElements() {\n return null;\n }\n\n hitTest(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n // Use viewport-relative coordinates first because headers are rendered as \"sticky\"\n // (they should not be offset by scrollTop in hit-test).\n const viewportX = event.clientX - rect.left;\n const viewportY = event.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const headerHeight = this.headerHeight;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n const maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n const contentScrollTop = Math.max(0, Math.min(this.root.scrollTop, maxContentScrollTop));\n if (viewportY < headerHeight && viewportX < this.rowHeaderWidth) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n rect: new DOMRect(rect.left, rect.top, this.rowHeaderWidth, headerHeight),\n };\n }\n if (viewportY < headerHeight) {\n // Column header region (canvas)\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex >= 0) {\n const col = schema.columns[colIndex];\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top,\n colWidths[colIndex] ?? 100,\n headerHeight,\n );\n return { rowId: \"__header__\", colKey: col.key, rect: cellRect };\n }\n return null;\n }\n if (viewportX < this.rowHeaderWidth) {\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)),\n );\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n const row = rows[rowIndex];\n const topPx = rect.top + headerHeight + accumHeight - contentScrollTop;\n const cellRect = new DOMRect(\n rect.left,\n topPx,\n this.rowHeaderWidth,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: null, rect: cellRect };\n }\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(0, Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)));\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex === -1) return null;\n const row = rows[rowIndex];\n const col = schema.columns[colIndex];\n const rowTop = accumHeight;\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + headerHeight + rowTop - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: col.key, rect: cellRect };\n }\n\n hitTestAction(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const hit = this.hitTest(event);\n if (!hit || !hit.rowId || !hit.colKey) return null;\n if (hit.rowId === \"__all__\" || hit.rowId === \"__header__\") return null;\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(hit.colKey));\n if (!col || (col.type !== \"button\" && col.type !== \"link\")) return null;\n const valueRes = this.dataModel.resolveCellValue(hit.rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(hit.rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return null;\n const actionValue =\n col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value);\n if (!actionValue || !actionValue.label) return null;\n\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return null;\n const baseStyle = columnFormatToStyle(col);\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const cellStyle = this.dataModel.getCellStyle(hit.rowId, col.key);\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n ctx.save();\n ctx.font = `${ital}${weight}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\n ctx.textBaseline = \"alphabetic\";\n const view = this.dataModel.getView();\n const wrap = view.wrapText?.[col.key] ?? col.wrapText ?? false;\n const align = col.style?.align ?? \"left\";\n const textAreaX = hit.rect.left + CELL_PADDING_X_PX;\n const textAreaY = hit.rect.top + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, hit.rect.width - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(\n 0,\n hit.rect.height - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX),\n );\n const bounds = this.measureTextBounds(\n ctx,\n actionValue.label,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n );\n ctx.restore();\n if (!bounds) return null;\n const pad = col.type === \"button\" ? 6 : 2;\n const left = Math.max(hit.rect.left, bounds.x - pad);\n const top = Math.max(hit.rect.top, bounds.y - pad);\n const right = Math.min(hit.rect.right, bounds.x + bounds.width + pad);\n const bottom = Math.min(hit.rect.bottom, bounds.y + bounds.height + pad);\n if (\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom\n ) {\n return { rowId: hit.rowId, colKey: String(hit.colKey), kind: col.type };\n }\n return null;\n }\n\n private isPointInSelection(rowId: string, colKey: string) {\n if (!this.selection.length) return false;\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return false;\n for (const range of this.selection) {\n if (range.kind !== \"cells\") continue;\n const startRow = Math.min(range.startRow, range.endRow);\n const endRow = Math.max(range.startRow, range.endRow);\n const startCol = Math.min(range.startCol, range.endCol);\n const endCol = Math.max(range.startCol, range.endCol);\n if (rowIndex >= startRow && rowIndex <= endRow && colIndex >= startCol && colIndex <= endCol)\n return true;\n }\n return false;\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.pendingCursorPoint = { x: ev.clientX, y: ev.clientY };\n if (this.cursorTimer) return;\n this.cursorTimer = window.setTimeout(() => {\n this.cursorTimer = null;\n const p = this.pendingCursorPoint;\n if (!p) return;\n this.updateCanvasCursor(p.x, p.y);\n }, 50);\n };\n\n private handlePointerLeave = () => {\n if (!this.canvas) return;\n this.canvas.style.cursor = \"cell\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (this.hoverActionKey || this.activeActionKey) {\n this.hoverActionKey = null;\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (!this.canvas) return;\n const actionHit = this.hitTestAction(\n new MouseEvent(\"mousemove\", { clientX: ev.clientX, clientY: ev.clientY }),\n );\n if (!actionHit || actionHit.kind !== \"button\") return;\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (interaction.disabled) return;\n const nextKey = `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}`;\n if (nextKey !== this.activeActionKey) {\n this.activeActionKey = nextKey;\n this.render();\n }\n };\n\n private handlePointerUp = () => {\n if (this.activeActionKey) {\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private positionTooltipAtRect(rect: DOMRect) {\n if (!this.tooltip) return;\n if (!this.root) return;\n const pad = 8;\n const rootRect = this.root.getBoundingClientRect();\n const maxW = this.root.clientWidth;\n const maxH = this.root.clientHeight;\n let left = rect.right - rootRect.left + pad;\n let top = rect.top - rootRect.top + pad;\n let side: \"right\" | \"left\" = \"right\";\n const tRect = this.tooltip.getBoundingClientRect();\n if (left + tRect.width > maxW) {\n left = Math.max(0, rect.left - rootRect.left - tRect.width - pad);\n side = \"left\";\n }\n if (top + tRect.height > maxH) top = Math.max(0, maxH - tRect.height - pad);\n this.tooltip.style.left = `${left}px`;\n this.tooltip.style.top = `${top}px`;\n this.tooltip.dataset.side = side;\n }\n\n private refreshTooltipPosition() {\n if (!this.tooltip || this.tooltip.dataset.visible !== \"1\") return;\n if (!this.tooltipTarget || !this.tooltipMessage) return;\n const rect = this.getCellRect(this.tooltipTarget.rowId, this.tooltipTarget.colKey);\n if (!rect) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n this.tooltip.textContent = this.tooltipMessage;\n this.positionTooltipAtRect(rect);\n }\n\n private getCellRect(rowId: string, colKey: string): DOMRect | null {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return null;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n let xCursor = this.rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) {\n xCursor += colWidths[i] ?? 100;\n }\n return new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + this.headerHeight + accumHeight - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n }\n\n private updateCanvasCursor(clientX: number, clientY: number) {\n if (!this.root || !this.canvas) return;\n if (this.root.dataset.extableFillDragging === \"1\") {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n // Header hover (filter/sort icon affordance)\n {\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = clientX - rect.left;\n const viewportY = clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n const prevKey = this.hoverHeaderColKey;\n const prevIcon = this.hoverHeaderIcon;\n let nextKey: string | null = null;\n let nextIcon = false;\n if (y >= 0 && y < this.headerHeight && x >= this.rowHeaderWidth) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n const col = colIndex >= 0 ? schema.columns[colIndex] : null;\n if (col) {\n nextKey = col.key;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n nextIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n }\n }\n const changed =\n String(prevKey ?? \"\") !== String(nextKey ?? \"\") || Boolean(prevIcon) !== Boolean(nextIcon);\n this.hoverHeaderColKey = nextKey;\n this.hoverHeaderIcon = nextIcon;\n if (nextKey !== null) {\n this.canvas.style.cursor = nextIcon ? \"pointer\" : \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (changed) this.render();\n return;\n }\n if (changed) this.render();\n }\n // Cursor spec:\n // - No selection or outside selection: cell\n // - Inside selection & on fill handle: crosshair\n // - Inside selection & readonly/boolean: default\n // - Inside selection & others: text\n let cursor = \"cell\";\n\n const hit = this.hitTest(new MouseEvent(\"mousemove\", { clientX, clientY }));\n if (!hit) {\n this.canvas.style.cursor = cursor;\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.hoverActionKey = null;\n return;\n }\n if (hit.colKey === \"__all__\" || hit.colKey === null) {\n this.canvas.style.cursor = \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.hoverActionKey = null;\n return;\n }\n // In readonly editMode, keep spreadsheet-like cursor for all body cells.\n if (this.getEditMode() === \"readonly\") {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n const marker = this.dataModel.getCellMarker(hit.rowId, hit.colKey);\n if (this.tooltip && marker) {\n const sameCell =\n this.tooltipTarget &&\n this.tooltipTarget.rowId === hit.rowId &&\n this.tooltipTarget.colKey === hit.colKey;\n const sameMessage = this.tooltipMessage === marker.message;\n if (!sameCell || !sameMessage || this.tooltip.dataset.visible !== \"1\") {\n this.tooltipTarget = { rowId: hit.rowId, colKey: hit.colKey };\n this.tooltipMessage = marker.message;\n this.tooltip.textContent = marker.message;\n const rect = this.getCellRect(hit.rowId, hit.colKey);\n if (rect) {\n this.positionTooltipAtRect(rect);\n this.tooltip.dataset.visible = \"1\";\n } else {\n this.tooltip.dataset.visible = \"0\";\n }\n }\n } else if (this.tooltip) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n }\n\n const actionHit = this.hitTestAction(new MouseEvent(\"mousemove\", { clientX, clientY }));\n const nextHoverKey = actionHit ? `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}` : null;\n if (nextHoverKey !== this.hoverActionKey) {\n this.hoverActionKey = nextHoverKey;\n this.render();\n }\n if (actionHit) {\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (!interaction.disabled) {\n this.canvas.style.cursor = \"pointer\";\n return;\n }\n }\n\n if (!this.isPointInSelection(hit.rowId, hit.colKey)) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Only the active cell shows edit-mode cursor affordances. Other selected cells stay `cell`.\n const isActiveCell =\n this.activeRowId === hit.rowId &&\n this.activeColKey !== null &&\n this.activeColKey === hit.colKey;\n if (!isActiveCell) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Fill handle hover is only considered inside the active cell and when fill handle is shown.\n if (\n this.activeRowId &&\n this.activeColKey !== null &&\n this.activeRowId !== \"__all__\" &&\n this.activeColKey !== \"__all__\" &&\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const cellRect = this.getCellRect(this.activeRowId, this.activeColKey);\n if (cellRect) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(clientX, clientY, handleRect)) {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n }\n }\n\n const col = this.dataModel.getSchema().columns.find((c) => c.key === hit.colKey);\n const interaction = this.dataModel.getCellInteraction(hit.rowId, hit.colKey);\n if (interaction.readonly || col?.type === \"boolean\") cursor = \"default\";\n else cursor = \"text\";\n this.canvas.style.cursor = cursor;\n }\n\n private measureRowHeight(\n ctx: CanvasRenderingContext2D,\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n ) {\n let maxHeight = this.rowHeight;\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n if (!c) continue;\n const wrap = view.wrapText?.[c.key] ?? c.wrapText;\n if (!wrap) continue;\n const w = (colWidths[idx] ?? 100) - this.padding;\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride ? \"#ERROR\" : this.formatValue(valueRes.value, c).text;\n const lines = this.wrapLines(ctx, text, w);\n const h = lines.length * this.lineHeight + this.padding;\n maxHeight = Math.max(maxHeight, h);\n }\n return maxHeight;\n }\n\n private wrapLines(ctx: CanvasRenderingContext2D, text: string, width: number) {\n const key = `${ctx.font}|${width}|${text}`;\n const cached = this.textMeasureCache.get(key);\n if (cached) {\n // LRU refresh\n this.textMeasureCache.delete(key);\n this.textMeasureCache.set(key, cached);\n return cached.lines;\n }\n const rawLines = text.split(\"\\n\");\n const lines: string[] = [];\n for (const line of rawLines) {\n let current = line;\n while (ctx.measureText(current).width > width && current.length > 1) {\n let cut = current.length;\n while (cut > 1 && ctx.measureText(current.slice(0, cut)).width > width) {\n cut -= 1;\n }\n lines.push(current.slice(0, cut));\n current = current.slice(cut);\n }\n lines.push(current);\n }\n this.textMeasureCache.set(key, { lines });\n while (this.textMeasureCache.size > CanvasRenderer.TEXT_MEASURE_CACHE_MAX) {\n const firstKey = this.textMeasureCache.keys().next().value as string | undefined;\n if (!firstKey) break;\n this.textMeasureCache.delete(firstKey);\n }\n return lines;\n }\n\n private fitTextLine(ctx: CanvasRenderingContext2D, text: string, width: number) {\n let out = text;\n while (ctx.measureText(out).width > width && out.length > 1) {\n out = `${out.slice(0, -2)}…`;\n }\n return out;\n }\n\n private getTextLinesForBounds(\n ctx: CanvasRenderingContext2D,\n text: string,\n width: number,\n wrap: boolean,\n height: number,\n ) {\n const raw = wrap ? this.wrapLines(ctx, text, width) : [this.fitTextLine(ctx, text, width)];\n const maxLines = Math.max(1, Math.floor(height / this.lineHeight));\n return raw.slice(0, maxLines);\n }\n\n private measureTextBounds(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\",\n ): DOMRect | null {\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n if (!lines.length) return null;\n let minX = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx] ?? \"\";\n const lineWidth = ctx.measureText(line).width;\n let startX = x;\n if (align === \"right\") startX = x + width - lineWidth;\n else if (align === \"center\") startX = x + (width - lineWidth) / 2;\n const lineTop = y + this.lineHeight * idx;\n const lineBottom = lineTop + this.lineHeight;\n minX = Math.min(minX, startX);\n maxX = Math.max(maxX, startX + lineWidth);\n minY = Math.min(minY, lineTop);\n maxY = Math.max(maxY, lineBottom);\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) return null;\n return new DOMRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n private drawCellText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\" = \"left\",\n isBoolean = false,\n isCustomBoolean = false,\n decorations?: { underline?: boolean; strike?: boolean },\n ) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x - 4, y - 4, width + 8, height + 8);\n ctx.clip();\n const fontBackup = ctx.font;\n if (isBoolean) {\n ctx.font = \"28px sans-serif\";\n } else if (isCustomBoolean) {\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n }\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n const totalTextHeight = lines.length * this.lineHeight;\n const baseY = y + Math.max(0, Math.floor((height - totalTextHeight) / 2));\n const renderLine = (ln: string, lineIdx: number) => {\n const baseline = baseY + this.lineHeight * lineIdx;\n let startX = x;\n let endX = x;\n if (align === \"right\") {\n ctx.textAlign = \"right\";\n endX = x + width;\n startX = endX - ctx.measureText(ln).width;\n ctx.fillText(ln, endX, baseline);\n } else if (align === \"center\") {\n ctx.textAlign = \"center\";\n const center = x + width / 2;\n const w = ctx.measureText(ln).width;\n startX = center - w / 2;\n endX = center + w / 2;\n ctx.fillText(ln, center, baseline);\n } else {\n ctx.textAlign = \"left\";\n startX = x;\n endX = x + ctx.measureText(ln).width;\n ctx.fillText(ln, x, baseline);\n }\n if (decorations?.underline || decorations?.strike) {\n const strokeBackup = ctx.strokeStyle;\n const lineWidthBackup = ctx.lineWidth;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (decorations.underline) {\n const yUnderline = baseline + 2;\n ctx.moveTo(startX, yUnderline);\n ctx.lineTo(endX, yUnderline);\n }\n if (decorations.strike) {\n const yStrike = baseline - Math.floor(this.lineHeight / 2) + 2;\n ctx.moveTo(startX, yStrike);\n ctx.lineTo(endX, yStrike);\n }\n ctx.stroke();\n ctx.strokeStyle = strokeBackup;\n ctx.lineWidth = lineWidthBackup;\n }\n };\n for (let idx = 0; idx < lines.length; idx += 1) {\n renderLine(lines[idx] ?? \"\", idx + 1);\n }\n ctx.textAlign = \"left\";\n ctx.font = fontBackup;\n ctx.restore();\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? (fmtValue ?? \"yyyy-MM-dd\")\n : col.type === \"time\"\n ? (fmtValue ?? \"HH:mm\")\n : (fmtValue ?? \"yyyy-MM-dd'T'HH:mm:ss'Z'\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n","import type { CellAction, Command, EditMode, SelectionRange } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\nimport {\n coerceNumericForColumn,\n formatIntegerWithPrefix,\n formatNumberForEdit,\n normalizeNumericInput,\n parseNumericText,\n} from \"./numberIO\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n getFillHandleRect,\n getFillHandleSource,\n isPointInRect,\n makeFillValueGetter,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport { resolveButtonAction, resolveLinkAction } from \"./actionValue\";\n\ntype EditHandler = (cmd: Command, commit: boolean) => void;\ntype RowSelectHandler = (rowId: string) => void;\ntype MoveHandler = (rowId?: string) => void;\ntype HitTest = (\n event: MouseEvent,\n) => { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\ntype ActionHitTest = (\n event: MouseEvent,\n) =>\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null;\ntype ActiveChange = (rowId: string | null, colKey: string | null) => void;\ntype ContextMenuHandler = (\n rowId: string | null,\n colKey: string | null,\n clientX: number,\n clientY: number,\n) => void;\ntype SelectionChange = (ranges: SelectionRange[]) => void;\ntype UndoRedoHandler = () => void;\ntype ActionHandler = (action: CellAction) => void;\n\nexport class SelectionManager {\n private root: HTMLElement;\n private editMode: EditMode;\n private onEdit: EditHandler;\n private onRowSelect: RowSelectHandler;\n private onMove: MoveHandler;\n private hitTest: HitTest;\n private hitAction: ActionHitTest | null = null;\n private onContextMenu: ContextMenuHandler;\n private handleDocumentContextMenu: ((ev: MouseEvent) => void) | null = null;\n private selectionRanges: SelectionRange[] = [];\n private inputEl: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n private floatingInputWrapper: HTMLDivElement | null = null;\n private selectionInput: HTMLInputElement | null = null;\n private copyToastEl: HTMLDivElement | null = null;\n private copyToastTimer: number | null = null;\n private selectionMode = true;\n private lastBooleanCell: { rowId: string; colKey: string } | null = null;\n private selectionAnchor: { rowIndex: number; colIndex: number } | null = null;\n private dragging = false;\n private dragStart: { rowIndex: number; colIndex: number; kind: \"cells\" | \"rows\" } | null = null;\n private pointerDownClient: { x: number; y: number } | null = null;\n private dragMoved = false;\n private dragSelectionChanged = false;\n private suppressNextClick = false;\n private fillDragging = false;\n private fillSource: import(\"./fillHandle\").FillHandleSource | null = null;\n private fillEndRowIndex: number | null = null;\n private rootCursorBackup: string | null = null;\n private lastPointerClient: { x: number; y: number } | null = null;\n private autoScrollRaf: number | null = null;\n private autoScrollActive = false;\n private activeCell: { rowId: string; colKey: string | null } | null = null;\n private activeHost: HTMLElement | null = null;\n private activeHostOriginalText: string | null = null;\n private activeOriginalValue: { rowId: string; colKey: string; value: unknown } | null = null;\n private composing = false;\n private lastCompositionEnd = 0;\n private readonly handleInputCompositionStart = () => {\n this.composing = true;\n };\n private readonly handleInputCompositionEnd = () => {\n this.composing = false;\n this.lastCompositionEnd = Date.now();\n };\n private readonly handleSelectionBlur = () => this.teardownSelectionInput();\n private readonly handleRootKeydown = async (ev: KeyboardEvent) => {\n if (ev.defaultPrevented) return;\n if (!this.selectionMode) return;\n if (this.inputEl) return;\n if (ev.isComposing || this.composing) return;\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (!accel) return;\n const key = ev.key.toLowerCase();\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n } else if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n }\n };\n private isCellReadonly: (rowId: string, colKey: string) => boolean;\n private sequenceLangs?: readonly string[];\n private onCellAction: ActionHandler;\n\n constructor(\n root: HTMLElement,\n editMode: EditMode,\n onEdit: EditHandler,\n onRowSelect: RowSelectHandler,\n onMove: MoveHandler,\n hitTest: HitTest,\n hitAction: ActionHitTest | null,\n private dataModel: DataModel,\n sequenceLangs: readonly string[] | undefined,\n isCellReadonly: (rowId: string, colKey: string) => boolean,\n onCellAction: ActionHandler,\n private onActiveChange: ActiveChange,\n onContextMenu: ContextMenuHandler,\n private onSelectionChange: SelectionChange,\n private onUndo: UndoRedoHandler,\n private onRedo: UndoRedoHandler,\n ) {\n this.root = root;\n this.editMode = editMode;\n this.onEdit = onEdit;\n this.onRowSelect = onRowSelect;\n this.onMove = onMove;\n this.hitTest = hitTest;\n this.hitAction = hitAction;\n this.sequenceLangs = sequenceLangs;\n this.isCellReadonly = isCellReadonly;\n this.onCellAction = onCellAction;\n this.onContextMenu = onContextMenu;\n this.bind();\n }\n\n setEditMode(mode: EditMode) {\n this.editMode = mode;\n }\n\n syncAfterRowsChanged() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) {\n this.selectionRanges = [];\n this.activeCell = null;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(true);\n this.onActiveChange(null, null);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n const maxRow = rows.length - 1;\n const maxCol = schema.columns.length - 1;\n\n const activeRowId = this.activeCell?.rowId ?? null;\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : -1;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : -1;\n\n // If current active cell is still visible, just clamp selection ranges when needed.\n if (activeRowIndex >= 0 && activeColIndex >= 0) {\n let changed = false;\n if (!this.selectionRanges.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: activeRowIndex,\n endRow: activeRowIndex,\n startCol: activeColIndex,\n endCol: activeColIndex,\n },\n ];\n changed = true;\n } else {\n const nextRanges: SelectionRange[] = this.selectionRanges.map((r) => {\n const clamp = (n: number, max: number) => Math.max(0, Math.min(max, n));\n const next: SelectionRange = {\n ...r,\n startRow: clamp(r.startRow, maxRow),\n endRow: clamp(r.endRow, maxRow),\n startCol: clamp(r.startCol, maxCol),\n endCol: clamp(r.endCol, maxCol),\n };\n if (\n next.startRow !== r.startRow ||\n next.endRow !== r.endRow ||\n next.startCol !== r.startCol ||\n next.endCol !== r.endCol\n ) {\n changed = true;\n }\n return next;\n });\n this.selectionRanges = nextRanges;\n }\n if (changed) this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n // Active row got filtered out (or active col disappeared): move to the nearest visible row/col.\n const desiredColKey = activeColKey ?? schema.columns[0]?.key ?? \"\";\n let colIndex = schema.columns.findIndex((c) => String(c.key) === String(desiredColKey));\n if (colIndex < 0) colIndex = 0;\n const colKey = schema.columns[colIndex]?.key ?? \"\";\n\n const baseIndex = activeRowId ? this.dataModel.getBaseRowIndex(activeRowId) : 0;\n const fallbackRow = rows[rows.length - 1] ?? rows[0] ?? null;\n const nextRow =\n rows.find((r) => this.dataModel.getBaseRowIndex(r.id) >= baseIndex) ?? fallbackRow;\n if (!nextRow) return;\n const rowId = nextRow.id;\n const rowIndex = this.dataModel.getRowIndex(rowId);\n\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n navigateToCell(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n const nextRange: SelectionRange = {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n cancelEditing() {\n this.teardownInput(true);\n }\n\n destroy() {\n this.root.removeEventListener(\"click\", this.handleClick);\n this.root.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.root.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.root.removeEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.removeEventListener(\"keydown\", this.handleRootKeydown);\n if (this.handleDocumentContextMenu) {\n document.removeEventListener(\"contextmenu\", this.handleDocumentContextMenu, true);\n }\n this.teardownInput(true);\n this.teardownSelectionInput();\n this.teardownCopyToast();\n this.stopAutoScroll();\n }\n\n onScroll(scrollTop: number, scrollLeft: number) {\n // Editors are positioned in scroll-container content coordinates and follow scroll automatically.\n void scrollTop;\n void scrollLeft;\n this.positionCopyToast();\n }\n\n private bind() {\n this.root.addEventListener(\"click\", this.handleClick);\n this.root.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.addEventListener(\"pointermove\", this.handlePointerMove);\n this.root.addEventListener(\"pointerup\", this.handlePointerUp);\n this.root.addEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.addEventListener(\"keydown\", this.handleRootKeydown);\n this.handleDocumentContextMenu = (ev: MouseEvent) => this.handleContextMenu(ev);\n document.addEventListener(\"contextmenu\", this.handleDocumentContextMenu, { capture: true });\n }\n\n private updateFillHandleFlag() {\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowId = this.activeCell?.rowId ?? null;\n this.root.dataset.extableFillHandle = shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n activeRowId,\n activeColKey,\n this.editMode,\n )\n ? \"1\"\n : \"\";\n }\n\n private findColumn(colKey: string) {\n const schema = this.dataModel.getSchema();\n return schema.columns.find((c) => c.key === colKey);\n }\n\n private pad2(n: number) {\n return String(n).padStart(2, \"0\");\n }\n\n private formatLocalDateForInput(d: Date) {\n return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())}`;\n }\n\n private formatLocalTimeForInput(d: Date) {\n return `${this.pad2(d.getHours())}:${this.pad2(d.getMinutes())}`;\n }\n\n private formatLocalDateTimeForInput(d: Date) {\n return `${this.formatLocalDateForInput(d)}T${this.formatLocalTimeForInput(d)}`;\n }\n\n private normalizeTemporalInitialValue(colType: \"date\" | \"time\" | \"datetime\", initial: string) {\n const value = initial.trim();\n if (!value) return \"\";\n\n if (colType === \"date\") {\n const m = value.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateForInput(d);\n return \"\";\n }\n\n if (colType === \"time\") {\n const m = value.match(/(\\d{2}:\\d{2})(?::\\d{2})?/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalTimeForInput(d);\n return \"\";\n }\n\n // datetime => input[type=\"datetime-local\"] expects \"YYYY-MM-DDTHH:mm\" (no timezone).\n if (/Z$/.test(value) && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value)) {\n return value.replace(/Z$/, \"\").slice(0, 16);\n }\n if (\n /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}/.test(value) &&\n !/[+-]\\d{2}:\\d{2}$/.test(value)\n ) {\n return value.slice(0, 16);\n }\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateTimeForInput(d);\n return \"\";\n }\n\n private ensureCopyToast() {\n if (this.copyToastEl) return this.copyToastEl;\n // Ensure a positioning context for the toast.\n const computed = window.getComputedStyle(this.root);\n if (computed.position === \"static\") {\n this.root.style.position = \"relative\";\n }\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.dataset.extableCopyToast = \"1\";\n toast.style.position = \"absolute\";\n toast.style.left = \"0\";\n toast.style.top = \"0\";\n toast.style.pointerEvents = \"none\";\n toast.style.zIndex = \"1000\";\n toast.style.display = \"none\";\n // Keep it from affecting layout.\n toast.style.margin = \"0\";\n this.root.appendChild(toast);\n this.copyToastEl = toast;\n return toast;\n }\n\n private teardownCopyToast() {\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n if (!this.copyToastEl) return;\n this.copyToastEl.style.display = \"none\";\n removeFromParent(this.copyToastEl);\n this.copyToastEl = null;\n }\n\n private positionCopyToast() {\n if (!this.copyToastEl) return;\n const w = this.copyToastEl.offsetWidth || 0;\n const h = this.copyToastEl.offsetHeight || 0;\n const inset = 16;\n const maxLeft = Math.max(0, this.root.scrollLeft + this.root.clientWidth - w - inset);\n const maxTop = Math.max(0, this.root.scrollTop + this.root.clientHeight - h - inset);\n const minLeft = Math.max(0, this.root.scrollLeft + inset);\n const minTop = Math.max(0, this.root.scrollTop + inset);\n const rootRect = this.root.getBoundingClientRect();\n const rect = this.getActiveCellRect();\n if (rect) {\n const candidateLeft = rect.right - rootRect.left + this.root.scrollLeft - w + 8;\n const candidateTop = rect.top - rootRect.top + this.root.scrollTop - h + 8;\n const left = Math.min(maxLeft, Math.max(minLeft, candidateLeft));\n const top = Math.min(maxTop, Math.max(minTop, candidateTop));\n this.copyToastEl.style.left = `${left}px`;\n this.copyToastEl.style.top = `${top}px`;\n return;\n }\n this.copyToastEl.style.left = `${maxLeft}px`;\n this.copyToastEl.style.top = `${maxTop}px`;\n }\n\n private showCopyToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 1200) {\n const toast = this.ensureCopyToast();\n toast.textContent = message;\n toast.dataset.variant = variant;\n toast.style.display = \"block\";\n this.positionCopyToast();\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n this.copyToastTimer = window.setTimeout(() => {\n toast.style.display = \"none\";\n }, durationMs);\n }\n\n private ensureSelectionInput() {\n if (this.selectionInput) return this.selectionInput;\n const input = document.createElement(\"input\");\n input.type = \"text\";\n // This input exists only to receive keyboard/clipboard/IME events in selection mode.\n // It is not a text editor.\n input.readOnly = true;\n // Helps suppress virtual keyboards; also reduces IME oddities on some platforms.\n input.inputMode = \"none\";\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.style.position = \"absolute\";\n input.style.left = \"0\";\n input.style.top = \"0\";\n // Avoid affecting scroll extents in the scroll container.\n input.style.transform = \"translate(-10000px, 0)\";\n input.style.width = \"1px\";\n input.style.height = \"1px\";\n input.style.opacity = \"0\";\n input.style.pointerEvents = \"none\";\n input.addEventListener(\"keydown\", this.handleSelectionKeydown);\n input.addEventListener(\"beforeinput\", this.handleSelectionBeforeInput);\n input.addEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.addEventListener(\"copy\", this.handleSelectionCopy);\n input.addEventListener(\"cut\", this.handleSelectionCut);\n input.addEventListener(\"paste\", this.handleSelectionPaste);\n input.addEventListener(\"blur\", this.handleSelectionBlur);\n // Keep the selection input inside the table container (root), but offscreen.\n this.root.appendChild(input);\n this.selectionInput = input;\n return input;\n }\n\n private focusSelectionInput(valueForSelection: string) {\n const input = this.ensureSelectionInput();\n input.value = valueForSelection;\n this.selectionMode = true;\n input.focus({ preventScroll: true });\n input.select();\n }\n\n private openEditorAtActiveCell(options?: {\n initialValueOverride?: string;\n placeCursorAtEnd?: boolean;\n }) {\n if (!this.activeCell) return;\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const cell = this.findHtmlCellElement(rowId, colKey);\n if (cell) {\n this.activateCellElement(cell, rowId, colKey, options);\n return;\n }\n const rect = this.computeCanvasCellRect(rowId, colKey);\n if (rect) {\n this.activateFloating(rect, rowId, colKey, options);\n }\n }\n\n private escapeCssAttrValue(value: string) {\n const css = (globalThis as unknown as { CSS?: { escape?: (s: string) => string } }).CSS;\n const escapeFn = css?.escape;\n if (typeof escapeFn === \"function\") return escapeFn(value);\n // Minimal escaping for attribute selector values inside double quotes.\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n }\n\n private findHtmlCellElement(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const key = String(colKey);\n const rowIdEsc = this.escapeCssAttrValue(rowId);\n const keyEsc = this.escapeCssAttrValue(key);\n return (\n this.root.querySelector<HTMLElement>(\n `tr[data-row-id=\"${rowIdEsc}\"] td[data-col-key=\"${keyEsc}\"]`,\n ) ?? null\n );\n }\n\n private computeCanvasCellRect(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return null;\n const rootRect = this.root.getBoundingClientRect();\n return new DOMRect(\n rootRect.left + box.left - this.root.scrollLeft,\n rootRect.top + box.top - this.root.scrollTop,\n box.width,\n box.height,\n );\n }\n\n private computeCanvasCellBoxContent(rowId: string, colKey: string) {\n const canvas = this.root.querySelector<HTMLCanvasElement>(\n 'canvas[data-extable-renderer=\"canvas\"]',\n );\n if (!canvas) return null;\n return this.getCanvasCellMetrics(rowId, colKey);\n }\n\n private getCanvasCellMetrics(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = rows.findIndex((r) => r.id === rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return null;\n\n const headerHeight = HEADER_HEIGHT_PX;\n const rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n const defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n const colWidths = getColumnWidths(schema, view);\n\n let left = rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) left += colWidths[i] ?? 100;\n\n let top = headerHeight;\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) return null;\n const h = this.dataModel.getRowHeight(row.id) ?? defaultRowHeight;\n top += h;\n }\n const height = this.dataModel.getRowHeight(rowId) ?? defaultRowHeight;\n const width = colWidths[colIndex] ?? 100;\n return { left, top, width, height, rowIndex, colIndex };\n }\n\n private getActiveCellRect() {\n const active = this.activeCell;\n if (!active) return null;\n const rootRect = this.root.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n if (active.rowId === \"__all__\" && active.colKey === \"__all__\") {\n return new DOMRect(rootRect.left, rootRect.top, ROW_HEADER_WIDTH_PX, HEADER_HEIGHT_PX);\n }\n if (active.rowId === \"__header__\" && active.colKey !== null) {\n const key = this.escapeCssAttrValue(String(active.colKey));\n const headerEl = this.root.querySelector<HTMLElement>(`th[data-col-key=\"${key}\"]`);\n if (headerEl) return headerEl.getBoundingClientRect();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(active.colKey));\n if (colIndex >= 0) {\n const colWidths = getColumnWidths(schema, view);\n let x = ROW_HEADER_WIDTH_PX;\n for (let i = 0; i < colIndex; i += 1) x += colWidths[i] ?? 100;\n const width = colWidths[colIndex] ?? 100;\n return new DOMRect(\n rootRect.left + x - this.root.scrollLeft,\n rootRect.top,\n width,\n HEADER_HEIGHT_PX,\n );\n }\n }\n if (active.colKey === null) {\n const rowIndex = this.dataModel.getRowIndex(active.rowId);\n if (rowIndex >= 0) {\n let y = HEADER_HEIGHT_PX;\n const rows = this.dataModel.listRows();\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) break;\n y += this.dataModel.getRowHeight(row.id) ?? DEFAULT_ROW_HEIGHT_PX;\n }\n const height = this.dataModel.getRowHeight(active.rowId) ?? DEFAULT_ROW_HEIGHT_PX;\n return new DOMRect(\n rootRect.left,\n rootRect.top + y - this.root.scrollTop,\n ROW_HEADER_WIDTH_PX,\n height,\n );\n }\n }\n if (active.colKey === null) return null;\n const cellEl = this.findHtmlCellElement(active.rowId, active.colKey);\n if (cellEl) return cellEl.getBoundingClientRect();\n return this.computeCanvasCellRect(active.rowId, active.colKey);\n }\n\n private ensureVisibleCell(rowId: string, colKey: string) {\n const htmlCell = this.findHtmlCellElement(rowId, colKey);\n if (htmlCell) {\n if (typeof (htmlCell as HTMLElement).scrollIntoView === \"function\") {\n (htmlCell as HTMLElement).scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }\n return;\n }\n const metrics = this.getCanvasCellMetrics(rowId, colKey);\n if (!metrics) return;\n const xStart = metrics.left;\n const xEnd = metrics.left + metrics.width;\n const yStart = metrics.top;\n const yEnd = metrics.top + metrics.height;\n\n const leftVis = this.root.scrollLeft;\n const rightVis = this.root.scrollLeft + this.root.clientWidth;\n const topVis = this.root.scrollTop;\n const bottomVis = this.root.scrollTop + this.root.clientHeight;\n\n if (xStart < leftVis) this.root.scrollLeft = Math.max(0, xStart);\n else if (xEnd > rightVis) this.root.scrollLeft = Math.max(0, xEnd - this.root.clientWidth);\n\n if (yStart < topVis) this.root.scrollTop = Math.max(0, yStart);\n else if (yEnd > bottomVis) this.root.scrollTop = Math.max(0, yEnd - this.root.clientHeight);\n }\n\n private moveActiveCell(deltaRow: number, deltaCol: number, extendSelection = false) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) return;\n const { rowIndex, colIndex } = this.getActiveIndices();\n if (!extendSelection) this.selectionAnchor = null;\n const anchor =\n extendSelection && this.selectionAnchor\n ? this.selectionAnchor\n : extendSelection\n ? { rowIndex, colIndex }\n : null;\n if (extendSelection && !this.selectionAnchor) this.selectionAnchor = { rowIndex, colIndex };\n const nextRowIndex = Math.max(0, Math.min(rows.length - 1, rowIndex + deltaRow));\n const nextColIndex = Math.max(0, Math.min(schema.columns.length - 1, colIndex + deltaCol));\n {\n const row = rows[nextRowIndex];\n if (!row) return;\n const col = schema.columns[nextColIndex];\n if (!col) return;\n const rowId = row.id;\n const colKey = col.key;\n\n const nextRange: SelectionRange = anchor\n ? {\n kind: \"cells\",\n startRow: anchor.rowIndex,\n endRow: nextRowIndex,\n startCol: anchor.colIndex,\n endCol: nextColIndex,\n }\n : {\n kind: \"cells\",\n startRow: nextRowIndex,\n endRow: nextRowIndex,\n startCol: nextColIndex,\n endCol: nextColIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n this.updateFillHandleFlag();\n return;\n }\n }\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (ev.button !== 0) return;\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) return;\n if (el?.closest(\".extable-filter-sort-trigger\")) return;\n // Avoid starting a drag from inside an active editor.\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) return;\n // Commit current editor before starting a drag/select operation.\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n if (!this.tryCommitActiveEditor()) return;\n }\n if (this.fillDragging) return;\n const hit = this.hitTest(ev as unknown as MouseEvent);\n if (!hit) return;\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") return;\n if (hit.colKey === \"__all__\") return;\n\n // Fill handle drag starts only when the pointer is down on the handle area.\n const fillSrc = getFillHandleSource(this.dataModel, this.selectionRanges);\n if (fillSrc && this.activeCell) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const handleRowIndex = fillSrc.endRowIndex;\n const handleColIndex = fillSrc.colIndex;\n const handleRow = rows[handleRowIndex];\n const handleCol = schema.columns[handleColIndex];\n if (handleRow && handleCol) {\n const cellRect =\n this.findHtmlCellElement(handleRow.id, handleCol.key)?.getBoundingClientRect() ??\n this.computeCanvasCellRect(handleRow.id, handleCol.key);\n if (\n cellRect &&\n shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n this.activeCell.rowId,\n this.activeCell.colKey,\n this.editMode,\n )\n ) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(ev.clientX, ev.clientY, handleRect)) {\n ev.preventDefault();\n this.fillDragging = true;\n this.fillSource = fillSrc;\n this.fillEndRowIndex = fillSrc.endRowIndex;\n this.root.dataset.extableFillDragging = \"1\";\n if (this.rootCursorBackup === null)\n this.rootCursorBackup = this.root.style.cursor || \"\";\n this.root.style.cursor = \"crosshair\";\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n this.dragging = false;\n this.dragStart = null;\n this.suppressNextClick = true;\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n // Expand selection to include filled range preview (start with source).\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: fillSrc.startRowIndex,\n endRow: fillSrc.endRowIndex,\n startCol: fillSrc.colIndex,\n endCol: fillSrc.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n this.startAutoScroll();\n return;\n }\n }\n }\n }\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const rowIndex = hit.rowId === \"__header__\" ? 0 : this.dataModel.getRowIndex(hit.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex < 0) return;\n\n if (hit.rowId === \"__header__\") {\n // Select entire column when clicking column header.\n if (!rows.length) return;\n const range: SelectionRange = {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [range];\n this.onSelectionChange(this.selectionRanges);\n this.dragging = false;\n this.selectionMode = true;\n this.dragStart = null;\n this.selectionAnchor = null;\n this.suppressNextClick = false;\n const targetRow = rows[0];\n const targetCol = schema.columns[colIndex];\n if (targetRow && targetCol) {\n this.activeCell = { rowId: targetRow.id, colKey: targetCol.key };\n this.onActiveChange(targetRow.id, targetCol.key);\n }\n this.focusSelectionInput(\"\");\n return;\n }\n\n if (rowIndex < 0) return;\n\n const kind: \"cells\" | \"rows\" = hit.colKey === null ? \"rows\" : \"cells\";\n this.dragging = true;\n this.pointerDownClient = { x: ev.clientX, y: ev.clientY };\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.dragStart = { rowIndex, colIndex, kind };\n this.suppressNextClick = false;\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.startAutoScroll();\n };\n\n private getHitAtClientPoint(clientX: number, clientY: number) {\n // Prefer coordinate-based hit-test for auto-scroll ticks (no real event.target).\n if (typeof document.elementFromPoint !== \"function\") return null;\n const el = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n if (el && this.root.contains(el)) {\n const corner = el.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = el.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const colHeader = el.closest<HTMLElement>(\"th[data-col-key]\");\n if (colHeader) {\n return {\n rowId: \"__header__\",\n colKey: colHeader.dataset.colKey ?? \"\",\n element: colHeader,\n rect: colHeader.getBoundingClientRect(),\n };\n }\n const cell = el.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (cell && row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n }\n // Canvas renderer hitTest does not rely on target; a minimal shape is enough.\n return this.hitTest({ clientX, clientY } as unknown as MouseEvent);\n }\n\n private updateDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.dragging || !this.dragStart) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (\n hit.colKey === \"__all__\" ||\n (this.dragStart.kind === \"cells\" && hit.colKey === null)\n )\n return;\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const endColIndex =\n this.dragStart.kind === \"rows\"\n ? schema.columns.length - 1\n : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (endColIndex < 0) return;\n\n const startRow = this.dragStart.rowIndex;\n const startCol = this.dragStart.kind === \"rows\" ? 0 : this.dragStart.colIndex;\n const endCol = this.dragStart.kind === \"rows\" ? schema.columns.length - 1 : endColIndex;\n if (endRowIndex !== startRow || endCol !== startCol) {\n this.dragSelectionChanged = true;\n }\n const nextRange: SelectionRange = {\n kind: this.dragStart.kind,\n startRow,\n endRow: endRowIndex,\n startCol,\n endCol,\n };\n this.selectionRanges = [nextRange];\n const activeRowId = rows[endRowIndex]?.id ?? hit.rowId;\n const activeColKey =\n this.dragStart.kind === \"rows\"\n ? (schema.columns[0]?.key ?? hit.colKey)\n : (schema.columns[endColIndex]?.key ?? hit.colKey);\n this.activeCell = { rowId: activeRowId, colKey: activeColKey };\n this.onActiveChange(activeRowId, activeColKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n }\n\n private updateFillDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.fillDragging || !this.fillSource) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (hit.colKey === \"__all__\" || hit.colKey === null) return;\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex !== this.fillSource.colIndex) return;\n\n // Vertical fill only; allow dragging downwards from the source end.\n const nextEnd = Math.max(this.fillSource.endRowIndex, endRowIndex);\n if (this.fillEndRowIndex !== nextEnd) {\n this.fillEndRowIndex = nextEnd;\n const activeRowId = rows[nextEnd]?.id ?? hit.rowId;\n const col = schema.columns[this.fillSource.colIndex];\n if (!col) return;\n const colKey = col.key;\n this.activeCell = { rowId: activeRowId, colKey };\n this.onActiveChange(activeRowId, colKey);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: this.fillSource.startRowIndex,\n endRow: nextEnd,\n startCol: this.fillSource.colIndex,\n endCol: this.fillSource.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n }\n this.suppressNextClick = true;\n }\n\n private computeAutoScrollDelta(clientX: number, clientY: number) {\n const rect = this.root.getBoundingClientRect();\n const threshold = 24;\n const maxStep = 18;\n let dx = 0;\n let dy = 0;\n if (clientX < rect.left + threshold) {\n dx = -Math.ceil(((rect.left + threshold - clientX) / threshold) * maxStep);\n } else if (clientX > rect.right - threshold) {\n dx = Math.ceil(((clientX - (rect.right - threshold)) / threshold) * maxStep);\n }\n if (clientY < rect.top + threshold) {\n dy = -Math.ceil(((rect.top + threshold - clientY) / threshold) * maxStep);\n } else if (clientY > rect.bottom - threshold) {\n dy = Math.ceil(((clientY - (rect.bottom - threshold)) / threshold) * maxStep);\n }\n return { dx, dy };\n }\n\n private startAutoScroll() {\n if (this.autoScrollActive) return;\n this.autoScrollActive = true;\n const tick = () => {\n if (!this.autoScrollActive) return;\n const p = this.lastPointerClient;\n if (!p || (!this.dragging && !this.fillDragging)) {\n this.stopAutoScroll();\n return;\n }\n const { dx, dy } = this.computeAutoScrollDelta(p.x, p.y);\n if (dx !== 0 || dy !== 0) {\n const prevTop = this.root.scrollTop;\n const prevLeft = this.root.scrollLeft;\n this.root.scrollTop = Math.max(0, prevTop + dy);\n this.root.scrollLeft = Math.max(0, prevLeft + dx);\n // While scrolling, keep updating selection/fill based on the latest pointer position.\n if (this.fillDragging) this.updateFillDragFromClientPoint(p.x, p.y);\n else this.updateDragFromClientPoint(p.x, p.y);\n }\n const raf =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf(tick);\n };\n const raf2 =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf2(tick);\n }\n\n private stopAutoScroll() {\n this.autoScrollActive = false;\n if (this.autoScrollRaf !== null) {\n const caf = window.cancelAnimationFrame ?? ((id: number) => window.clearTimeout(id));\n caf(this.autoScrollRaf);\n this.autoScrollRaf = null;\n }\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n if (this.fillDragging && this.fillSource) {\n this.updateFillDragFromClientPoint(ev.clientX, ev.clientY);\n return;\n }\n if (!this.dragging || !this.dragStart) return;\n if (!this.dragMoved && this.pointerDownClient) {\n const dx = ev.clientX - this.pointerDownClient.x;\n const dy = ev.clientY - this.pointerDownClient.y;\n // Ignore tiny pointer jitter so clicks aren't suppressed.\n if (dx * dx + dy * dy < 9) return;\n this.dragMoved = true;\n }\n this.updateDragFromClientPoint(ev.clientX, ev.clientY);\n };\n\n private handlePointerUp = (ev: PointerEvent) => {\n if (this.fillDragging && this.fillSource) {\n const src = this.fillSource;\n const endRowIndex = this.fillEndRowIndex ?? src.endRowIndex;\n this.fillDragging = false;\n this.fillSource = null;\n this.fillEndRowIndex = null;\n this.root.dataset.extableFillDragging = \"\";\n if (this.rootCursorBackup !== null) {\n this.root.style.cursor = this.rootCursorBackup;\n this.rootCursorBackup = null;\n }\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.commitFill(src, endRowIndex);\n this.suppressNextClick = true;\n return;\n }\n if (!this.dragging) return;\n this.dragging = false;\n this.dragStart = null;\n const suppressTrailingClick = this.dragSelectionChanged;\n this.pointerDownClient = null;\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n if (suppressTrailingClick) this.suppressNextClick = true;\n if (this.suppressNextClick) {\n // Keep selection mode focus; prevent the trailing click from opening edit.\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n }\n };\n\n private commitFill(source: import(\"./fillHandle\").FillHandleSource, endRowIndex: number) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return;\n if (endRowIndex <= source.endRowIndex) return;\n\n const getValue = makeFillValueGetter(this.dataModel, source, this.sequenceLangs);\n if (!getValue) return;\n\n const commitNow = this.editMode === \"direct\";\n const batchId = `fill:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = source.endRowIndex + 1; r <= endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const offset = r - source.endRowIndex;\n const next = getValue(offset);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n\n // Select the filled range after commit and focus selection mode.\n const endRow = rows[endRowIndex];\n if (!endRow) return;\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: source.startRowIndex,\n endRow: endRowIndex,\n startCol: source.colIndex,\n endCol: source.colIndex,\n },\n ];\n this.activeCell = { rowId: endRow.id, colKey: col.key };\n this.onActiveChange(endRow.id, col.key);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.ensureVisibleCell(endRow.id, col.key);\n const current = this.dataModel.getCell(endRow.id, col.key);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n\n private teardownSelectionInput() {\n const input = this.selectionInput;\n if (!input) return;\n\n // Avoid re-entrancy via blur fired during DOM removal.\n this.selectionInput = null;\n\n input.removeEventListener(\"keydown\", this.handleSelectionKeydown);\n input.removeEventListener(\"beforeinput\", this.handleSelectionBeforeInput);\n input.removeEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.removeEventListener(\"copy\", this.handleSelectionCopy);\n input.removeEventListener(\"cut\", this.handleSelectionCut);\n input.removeEventListener(\"paste\", this.handleSelectionPaste);\n input.removeEventListener(\"blur\", this.handleSelectionBlur);\n removeFromParent(input);\n }\n\n private handleSelectionCopy = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.showCopyToast(`Copied ${payload.cellCount} cells`, \"info\");\n };\n\n private handleSelectionCut = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.clearSelectionValues();\n };\n\n private handleSelectionPaste = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n ev.preventDefault();\n const html = ev.clipboardData?.getData(\"text/html\") ?? \"\";\n const tsv = ev.clipboardData?.getData(\"text/tab-separated-values\") ?? \"\";\n const text = ev.clipboardData?.getData(\"text/plain\") ?? \"\";\n const grid = this.parseClipboardGrid({ html, tsv, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n };\n\n private handleSelectionCompositionStart = (ev?: CompositionEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n\n if (this.isCellReadonly(ac.rowId, ac.colKey)) {\n // Keep selection mode for readonly cells.\n // IMPORTANT: cancel any ongoing IME composition by tearing down the focused hidden input.\n // Otherwise, some IMEs show a floating preedit UI (e.g. an \"a\") even though we ignore edits.\n ev?.preventDefault?.();\n ev?.stopPropagation?.();\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n this.teardownSelectionInput();\n this.focusSelectionInput(currentText);\n return;\n }\n\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n };\n\n private handleSelectionBeforeInput = (ev: InputEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n if (!this.isCellReadonly(ac.rowId, ac.colKey)) return;\n\n // Block text insertion into the hidden selection input while readonly.\n ev.preventDefault();\n try {\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n const input = this.ensureSelectionInput();\n input.value = currentText;\n input.select();\n } catch {\n // ignore\n }\n };\n\n public async copySelection() {\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n const { text, html, cellCount } = payload;\n\n const copyViaClipboardApi = async () => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard) return false;\n if (typeof ClipboardItem !== \"undefined\" && navigator.clipboard.write) {\n try {\n const item = new ClipboardItem({\n \"text/plain\": new Blob([text], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n });\n await navigator.clipboard.write([item]);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n if (navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n return false;\n };\n\n const copyViaFallbackInput = () => {\n const input = this.ensureSelectionInput();\n const prev = input.value;\n input.value = text;\n input.select();\n document.execCommand?.(\"copy\");\n input.value = prev;\n };\n\n const copied = await copyViaClipboardApi();\n if (!copied) copyViaFallbackInput();\n this.showCopyToast(`Copied ${cellCount} cells`, \"info\");\n }\n\n public async pasteFromClipboard() {\n if (this.editMode === \"readonly\") return;\n if (!this.selectionMode) return;\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.readText) return;\n try {\n const text = await navigator.clipboard.readText();\n if (!text) return;\n const grid = this.parseClipboardGrid({ html: \"\", tsv: text, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n } catch {\n /* ignore */\n }\n }\n\n private handleSelectionKeydown = async (ev: KeyboardEvent) => {\n if (!this.selectionMode) return;\n if (!this.activeCell) return;\n if (ev.isComposing || this.composing) return;\n\n // Ignore modifier-only keys in selection mode (do not enter edit mode).\n if (\n ev.key === \"Shift\" ||\n ev.key === \"Control\" ||\n ev.key === \"Alt\" ||\n ev.key === \"Meta\" ||\n ev.key === \"CapsLock\" ||\n ev.key === \"NumLock\" ||\n ev.key === \"ScrollLock\"\n ) {\n return;\n }\n\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (accel) {\n const key = ev.key.toLowerCase();\n if (key === \"z\") {\n ev.preventDefault();\n if (isMac && ev.shiftKey) this.onRedo();\n else this.onUndo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"y\") {\n ev.preventDefault();\n this.onRedo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"v\") {\n // Let the paste event fire; it will be handled on the input.\n this.selectionAnchor = null;\n return;\n }\n }\n\n if (ev.key === \" \" && this.activeCell.colKey !== null) {\n const col = this.findColumn(this.activeCell.colKey);\n if (col?.type === \"button\" || col?.type === \"link\") {\n ev.preventDefault();\n this.triggerCellAction(this.activeCell.rowId, this.activeCell.colKey, col.type);\n this.selectionAnchor = null;\n return;\n }\n if (col?.type === \"boolean\") {\n ev.preventDefault();\n this.toggleBoolean(this.activeCell.rowId, this.activeCell.colKey);\n this.selectionAnchor = null;\n return;\n }\n this.selectionAnchor = null;\n return;\n }\n\n const isTab = ev.key === \"Tab\";\n const isEnter = ev.key === \"Enter\";\n const isArrow =\n ev.key === \"ArrowLeft\" ||\n ev.key === \"ArrowRight\" ||\n ev.key === \"ArrowUp\" ||\n ev.key === \"ArrowDown\";\n if (isTab || isEnter || isArrow) {\n ev.preventDefault();\n this.teardownSelectionInput();\n if (isTab) {\n this.moveActiveCell(0, ev.shiftKey ? -1 : 1, false);\n return;\n }\n if (isEnter) {\n this.moveActiveCell(ev.shiftKey ? -1 : 1, 0, false);\n return;\n }\n const extend = ev.shiftKey;\n if (ev.key === \"ArrowLeft\") this.moveActiveCell(0, -1, extend);\n else if (ev.key === \"ArrowRight\") this.moveActiveCell(0, 1, extend);\n else if (ev.key === \"ArrowUp\") this.moveActiveCell(-1, 0, extend);\n else if (ev.key === \"ArrowDown\") this.moveActiveCell(1, 0, extend);\n return;\n }\n\n if (\n this.activeCell.colKey !== null &&\n this.isCellReadonly(this.activeCell.rowId, this.activeCell.colKey)\n ) {\n ev.preventDefault();\n this.selectionAnchor = null;\n return;\n }\n\n this.selectionMode = false;\n this.selectionAnchor = null;\n this.teardownSelectionInput();\n // Let the original keydown insert the character into the now-focused editor naturally.\n this.openEditorAtActiveCell();\n };\n\n private getActiveIndices() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const fallback = { rowIndex: 0, colIndex: 0 };\n const ac = this.activeCell;\n if (!ac) return fallback;\n const rowIndex = rows.findIndex((r) => r.id === ac.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n return { rowIndex: rowIndex >= 0 ? rowIndex : 0, colIndex: colIndex >= 0 ? colIndex : 0 };\n }\n\n private normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol),\n };\n }\n\n private getCopyRange(): SelectionRange | null {\n const schema = this.dataModel.getSchema();\n if (this.selectionRanges.length > 0) {\n const first = this.selectionRanges[0];\n if (!first) return null;\n const normalized = this.normalizeRange(first);\n if (normalized.kind === \"rows\") {\n return {\n kind: \"cells\",\n startRow: normalized.startRow,\n endRow: normalized.endRow,\n startCol: normalized.startCol,\n endCol: normalized.endCol,\n };\n }\n return normalized;\n }\n if (!this.activeCell) return null;\n const ac = this.activeCell;\n if (!ac) return null;\n const rowIdx = this.dataModel.getRowIndex(ac.rowId);\n const colIdx = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n if (rowIdx < 0 || colIdx < 0) return null;\n return { kind: \"cells\", startRow: rowIdx, endRow: rowIdx, startCol: colIdx, endCol: colIdx };\n }\n\n private cellToClipboardString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"number\") return String(value);\n const linkAction = resolveLinkAction(value);\n if (linkAction?.href) return linkAction.href;\n const buttonAction = resolveButtonAction(value);\n if (buttonAction?.label) return buttonAction.label;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(value);\n }\n\n private escapeHtml(text: string) {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n }\n\n private buildSelectionClipboardPayload(): {\n text: string;\n html: string;\n cellCount: number;\n } | null {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range) return null;\n if (range.kind !== \"cells\") return null;\n\n const out: string[] = [];\n const htmlRows: string[] = [];\n const tableStyle = \"border-collapse:collapse;border-spacing:0;\";\n const cellStyle = \"border:1px solid #d0d7de;padding:4px 6px;vertical-align:top;\";\n let cellCount = 0;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n const line: string[] = [];\n const htmlCells: string[] = [];\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n const v = this.dataModel.getCell(row.id, col.key);\n const s = this.cellToClipboardString(v);\n line.push(s);\n htmlCells.push(`<td style=\"${cellStyle}\">${this.escapeHtml(s)}</td>`);\n cellCount += 1;\n }\n out.push(line.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCells.join(\"\")}</tr>`);\n }\n const text = out.join(\"\\r\\n\");\n const html = `<table style=\"${tableStyle}\"><tbody>${htmlRows.join(\"\")}</tbody></table>`;\n return { text, html, cellCount };\n }\n\n private clearSelectionValues() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range || range.kind !== \"cells\") return;\n const commitNow = this.editMode === \"direct\";\n const batchId = `cut:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = col.type === \"boolean\" ? false : \"\";\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private parseClipboardGrid(payload: { html: string; tsv: string; text: string }):\n | string[][]\n | null {\n const fromHtml = this.parseHtmlTable(payload.html);\n if (fromHtml) return fromHtml;\n const raw = payload.tsv || payload.text;\n return this.parseTsv(raw);\n }\n\n private parseTsv(text: string): string[][] | null {\n const trimmed = text.replace(/\\r\\n$/, \"\").replace(/\\n$/, \"\");\n if (!trimmed) return null;\n const rows = trimmed.split(/\\r\\n|\\n/);\n return rows.map((r) => r.split(\"\\t\"));\n }\n\n private parseHtmlTable(html: string): string[][] | null {\n if (!html) return null;\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const table = doc.querySelector(\"table\");\n if (!table) return null;\n const trs = Array.from(table.querySelectorAll(\"tr\"));\n if (trs.length === 0) return null;\n const grid: string[][] = [];\n for (const tr of trs) {\n const cells = Array.from(tr.querySelectorAll(\"th,td\"));\n if (\n cells.some(\n (c) =>\n (c as HTMLTableCellElement).rowSpan > 1 || (c as HTMLTableCellElement).colSpan > 1,\n )\n ) {\n return null;\n }\n grid.push(cells.map((c) => (c.textContent ?? \"\").trim()));\n }\n return grid.length ? grid : null;\n } catch {\n return null;\n }\n }\n\n private coerceCellValue(raw: string, colKey: string): unknown {\n const col = this.findColumn(colKey);\n if (!col) return raw;\n if (raw === \"\") return \"\";\n if (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") {\n const parsed = parseNumericText(raw);\n if (!parsed.ok) return raw;\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n return coerced.ok ? coerced.value : raw;\n }\n if (col.type === \"boolean\") {\n const v = raw.trim().toLowerCase();\n if (v === \"true\" || v === \"1\" || v === \"yes\") return true;\n if (v === \"false\" || v === \"0\" || v === \"no\") return false;\n return raw;\n }\n return raw;\n }\n\n private applyClipboardGrid(grid: string[][]) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const { rowIndex: startRow, colIndex: startCol } = this.getActiveIndices();\n const commitNow = this.editMode === \"direct\";\n const batchId = `paste:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = 0; r < grid.length; r += 1) {\n const row = rows[startRow + r];\n if (!row) break;\n const line = grid[r] ?? [];\n for (let c = 0; c < line.length; c += 1) {\n const col = schema.columns[startCol + c];\n if (!col) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = this.coerceCellValue(line[c] ?? \"\", col.key);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private createEditor(colKey: string, initial: string) {\n const col = this.findColumn(colKey);\n const needsTextarea = col?.wrapText || initial.includes(\"\\n\");\n if (needsTextarea) {\n const ta = document.createElement(\"textarea\");\n ta.value = initial;\n ta.style.resize = \"none\";\n ta.style.whiteSpace = \"pre-wrap\";\n ta.style.overflowWrap = \"anywhere\";\n ta.style.overflow = \"hidden\";\n this.autosize(ta);\n ta.addEventListener(\"input\", () => this.autosize(ta));\n return { control: ta, value: initial };\n }\n if (col?.type === \"boolean\") {\n const input = document.createElement(\"input\");\n input.type = \"checkbox\";\n input.checked = initial === \"true\" || initial === \"1\" || initial === \"on\";\n return { control: input, value: initial };\n }\n if (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\") {\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n if (col?.type === \"date\" || col?.type === \"time\" || col?.type === \"datetime\") {\n const input = document.createElement(\"input\");\n input.type = col.type === \"date\" ? \"date\" : col.type === \"time\" ? \"time\" : \"datetime-local\";\n const normalized = this.normalizeTemporalInitialValue(col.type, initial);\n input.value = normalized;\n return { control: input, value: normalized };\n }\n if (col?.type === \"enum\" || col?.type === \"tags\") {\n const allowCustom = col.enum?.allowCustom ?? col.tags?.allowCustom;\n const options = col.enum?.options ?? col.tags?.options ?? [];\n if (allowCustom === false) {\n const select = document.createElement(\"select\");\n const empty = document.createElement(\"option\");\n empty.value = \"\";\n empty.textContent = \"\";\n select.appendChild(empty);\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n op.textContent = opt;\n if (initial === opt) op.selected = true;\n select.appendChild(op);\n }\n return { control: select, value: initial };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n const listId = `extable-datalist-${String(colKey)}`;\n input.setAttribute(\"list\", listId);\n input.value = initial;\n let datalist = document.getElementById(listId) as HTMLDataListElement | null;\n if (!datalist) {\n datalist = document.createElement(\"datalist\");\n datalist.id = listId;\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n datalist.appendChild(op);\n }\n this.root.appendChild(datalist);\n }\n return { control: input, value: initial, datalistId: listId };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n\n private getInitialEditValue(colKey: string, current: unknown): string {\n if (current === null || current === undefined) return \"\";\n const col = this.findColumn(colKey);\n if (!col) return String(current);\n\n if ((col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") && typeof current === \"number\") {\n if (col.type === \"number\") {\n const fmt = col.format as { format?: string; precision?: number; scale?: number } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n return formatNumberForEdit(current, { format: \"scientific\", precision: fmt?.precision });\n }\n return formatNumberForEdit(current, { format: \"decimal\", scale: fmt?.scale });\n }\n\n const fmt = col.format as { format?: string } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n return formatIntegerWithPrefix(current, token);\n }\n return String(current);\n }\n\n return String(current);\n }\n\n private readActiveValueForCommit(): { ok: true; value: unknown } | { ok: false } {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) {\n return { ok: true, value: this.inputEl?.value ?? \"\" };\n }\n\n const col = this.findColumn(this.activeCell.colKey);\n if (\n col &&\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") &&\n this.inputEl instanceof HTMLInputElement\n ) {\n const normalized = normalizeNumericInput(this.inputEl.value);\n if (normalized === \"\") return { ok: true, value: \"\" };\n\n const parsed = parseNumericText(normalized);\n if (!parsed.ok) return { ok: false };\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n if (!coerced.ok) return { ok: false };\n return { ok: true, value: coerced.value };\n }\n\n return { ok: true, value: this.readActiveValue() };\n }\n\n private tryCommitActiveEditor(): boolean {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) return true;\n const { rowId, colKey } = this.activeCell;\n const next = this.readActiveValueForCommit();\n if (!next.ok) {\n this.inputEl.focus({ preventScroll: true });\n return false;\n }\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n return true;\n }\n\n private autosize(ta: HTMLTextAreaElement) {\n const style = window.getComputedStyle(ta);\n let lineHeight = Number.parseFloat(style.lineHeight);\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) lineHeight = 16;\n ta.rows = 1; // shrink to measure\n const lines = Math.ceil(ta.scrollHeight / lineHeight);\n ta.rows = Math.max(1, lines);\n ta.style.minHeight = `${lineHeight}px`;\n }\n\n private positionFloatingContentBox(\n box: { left: number; top: number; width: number; height: number },\n wrapper: HTMLDivElement,\n ) {\n const insetX = CELL_PADDING_X_PX;\n const insetTop = CELL_PADDING_TOP_PX;\n const insetBottom = CELL_PADDING_BOTTOM_PX;\n wrapper.style.left = `${box.left + insetX}px`;\n wrapper.style.top = `${box.top + insetTop}px`;\n wrapper.style.width = `${Math.max(8, box.width - insetX * 2)}px`;\n wrapper.style.height = `${Math.max(8, box.height - (insetTop + insetBottom))}px`;\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (ev.button !== 0) {\n return; // only left click starts edit/selection; right-click is handled by contextmenu\n }\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) {\n return;\n }\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) {\n return;\n }\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n if (!this.tryCommitActiveEditor()) return;\n }\n const hit =\n typeof document.elementFromPoint === \"function\"\n ? this.getHitAtClientPoint(ev.clientX, ev.clientY)\n : this.hitTest(ev);\n if (!hit) return;\n const actionHit = this.hitAction ? this.hitAction(ev) : null;\n if (actionHit) {\n if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", actionHit);\n }\n if (actionHit.kind === \"tag-remove\") {\n const removed = this.removeTagValue(actionHit.rowId, actionHit.colKey, actionHit.tagIndex);\n if (removed) {\n ev.preventDefault();\n return;\n }\n } else {\n const triggered = this.triggerCellAction(actionHit.rowId, actionHit.colKey, actionHit.kind);\n if (triggered) {\n ev.preventDefault();\n return;\n }\n }\n } else if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", null);\n }\n const wasSameCell =\n this.selectionMode &&\n !ev.shiftKey &&\n !ev.metaKey &&\n !ev.ctrlKey &&\n this.activeCell?.rowId === hit.rowId &&\n String(this.activeCell?.colKey) === String(hit.colKey);\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n this.teardownInput(false);\n if (rows.length && schema.columns.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: 0,\n endCol: schema.columns.length - 1,\n },\n ];\n this.activeCell = { rowId: \"__all__\", colKey: \"__all__\" };\n this.onActiveChange(\"__all__\", \"__all__\");\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n } else {\n this.activeCell = null;\n this.onActiveChange(\"__all__\", \"__all__\");\n this.selectionAnchor = null;\n }\n return;\n }\n this.onRowSelect(hit.rowId);\n if (hit.rowId === \"__header__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (rows.length && colIndex >= 0) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId: rows[0].id, colKey: hit.colKey };\n this.onActiveChange(this.activeCell.rowId, this.activeCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n return;\n }\n this.applySelectionFromHit(ev, hit);\n if (hit.colKey === null || hit.colKey === \"__all__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (hit.rowId === \"__header__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (this.isCellReadonly(hit.rowId, hit.colKey)) {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n return;\n }\n const col = this.findColumn(hit.colKey);\n const isBoolean = col?.type === \"boolean\";\n if (isBoolean) {\n const isSecondClick =\n this.lastBooleanCell?.rowId === hit.rowId &&\n String(this.lastBooleanCell?.colKey) === String(hit.colKey);\n this.lastBooleanCell = { rowId: hit.rowId, colKey: hit.colKey };\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n this.teardownSelectionInput();\n if (isSecondClick) {\n this.toggleBoolean(hit.rowId, hit.colKey);\n // Keep focus on the hidden selection input so Space does not scroll the container/page.\n this.focusSelectionInput(\"\");\n return;\n }\n // Keep focus on the hidden selection input so Space can toggle.\n this.focusSelectionInput(\"\");\n return;\n }\n this.lastBooleanCell = null;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n if (wasSameCell) {\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n }\n };\n\n private triggerCellAction(rowId: string, colKey: string, kind: \"button\" | \"link\") {\n const col = this.findColumn(colKey);\n if (!col) return false;\n if (col.type !== kind) return false;\n const interaction = this.dataModel.getCellInteraction(rowId, colKey);\n if (interaction.disabled) return false;\n const valueRes = this.dataModel.resolveCellValue(rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return false;\n if (col.type === \"button\") {\n const actionValue = resolveButtonAction(valueRes.value);\n if (!actionValue) return false;\n this.onCellAction({ kind: \"button\", rowId, colKey, value: actionValue });\n return true;\n }\n if (col.type === \"link\") {\n const linkValue = resolveLinkAction(valueRes.value);\n if (!linkValue?.href) return false;\n this.openLink(linkValue.href, linkValue.target);\n return true;\n }\n return false;\n }\n\n private removeTagValue(rowId: string, colKey: string, tagIndex: number) {\n if (this.isCellReadonly(rowId, colKey)) return false;\n const col = this.findColumn(colKey);\n if (!col || col.type !== \"tags\") return false;\n const current = this.dataModel.getCell(rowId, colKey);\n const values = this.normalizeTagValues(current);\n if (!values || tagIndex < 0 || tagIndex >= values.length) return false;\n const nextValues = values.filter((_, i) => i !== tagIndex);\n const next =\n current && typeof current === \"object\" && (current as Record<string, unknown>).kind === \"tags\"\n ? { kind: \"tags\", values: nextValues }\n : nextValues;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n return true;\n }\n\n private normalizeTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((v): v is string => typeof v === \"string\");\n }\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return [];\n return trimmed.split(/\\s*,\\s*/).filter(Boolean);\n }\n return null;\n }\n\n private openLink(href: string, target?: string) {\n if (typeof document === \"undefined\") return;\n if (!href) return;\n const link = document.createElement(\"a\");\n link.href = href;\n link.target = target ?? \"_self\";\n link.rel = \"noopener noreferrer\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n\n private toggleBoolean(rowId: string, colKey: string) {\n const current = this.dataModel.getCell(rowId, colKey);\n const currentBool = current === true || current === \"true\" || current === \"1\" || current === 1;\n const next = !currentBool;\n const cmd: Command = { kind: \"edit\", rowId, colKey, next };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n this.onMove(rowId);\n }\n\n private handleContextMenu = (ev: MouseEvent) => {\n const target = ev.target as Node | null;\n if (ev.ctrlKey) {\n ev.preventDefault();\n return;\n }\n if (!target || !this.root.contains(target)) return;\n ev.preventDefault();\n ev.stopPropagation();\n const hit = this.hitTest(ev);\n const rowId = hit?.rowId ?? null;\n const colKey = hit?.colKey ?? null;\n this.onContextMenu(rowId, colKey, ev.clientX, ev.clientY);\n };\n\n private applySelectionFromHit(ev: MouseEvent, hit: { rowId: string; colKey: string | null }) {\n const schema = this.dataModel.getSchema();\n const rowIdx = this.dataModel.getRowIndex(hit.rowId);\n const isRow = hit.colKey === null;\n const colIdx = isRow ? (schema.columns.length > 0 ? 0 : -1) : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIdx < 0) return;\n const targetRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: Math.max(0, colIdx),\n endCol: Math.max(0, colIdx),\n };\n let nextRanges: SelectionRange[] = [];\n if (ev.shiftKey && this.activeCell) {\n const ac = this.activeCell;\n const anchorRow = this.dataModel.getRowIndex(ac.rowId);\n const anchorCol = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n const anchorRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: Math.max(0, anchorCol),\n endCol: Math.max(0, colIdx),\n };\n nextRanges = [anchorRange];\n } else if (ev.metaKey || ev.ctrlKey) {\n nextRanges = [...this.selectionRanges, targetRange];\n } else {\n nextRanges = [targetRange];\n }\n this.selectionRanges = this.mergeRanges(nextRanges);\n const anchorCell =\n targetRange.kind === \"rows\"\n ? { rowId: hit.rowId, colKey: schema.columns[colIdx]?.key ?? null }\n : { rowId: hit.rowId, colKey: hit.colKey };\n this.activeCell = anchorCell;\n this.onActiveChange(anchorCell.rowId, anchorCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n if (targetRange.kind === \"rows\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n }\n\n private mergeRanges(ranges: SelectionRange[]) {\n const merged: SelectionRange[] = [];\n const sorted = [...ranges].sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"rows\" ? -1 : 1;\n if (a.startRow !== b.startRow) return a.startRow - b.startRow;\n if (a.startCol !== b.startCol) return a.startCol - b.startCol;\n if (a.endRow !== b.endRow) return a.endRow - b.endRow;\n return a.endCol - b.endCol;\n });\n for (const r of sorted) {\n const last = merged.at(-1);\n if (!last) {\n merged.push({ ...r });\n continue;\n }\n if (last.kind !== r.kind) {\n merged.push({ ...r });\n continue;\n }\n if (r.kind === \"rows\") {\n const canMerge =\n last.startCol === r.startCol &&\n last.endCol === r.endCol &&\n last.startRow <= r.endRow + 1 &&\n r.startRow <= last.endRow + 1;\n if (canMerge) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n } else {\n const sameCols = last.startCol === r.startCol && last.endCol === r.endCol;\n const sameRows = last.startRow === r.startRow && last.endRow === r.endRow;\n const rowsTouch = last.startRow <= r.endRow + 1 && r.startRow <= last.endRow + 1;\n const colsTouch = last.startCol <= r.endCol + 1 && r.startCol <= last.endCol + 1;\n if (sameCols && rowsTouch) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n if (sameRows && colsTouch) {\n last.startCol = Math.min(last.startCol, r.startCol);\n last.endCol = Math.max(last.endCol, r.endCol);\n continue;\n }\n }\n merged.push({ ...r });\n }\n return merged;\n }\n\n private activateCellElement(\n cell: HTMLElement,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n this.activeHost = cell;\n this.activeHostOriginalText = cell.textContent ?? \"\";\n const current = this.dataModel.getCell(rowId, colKey);\n this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, cell));\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n cell.textContent = \"\";\n cell.appendChild(input);\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n }\n\n private activateFloating(\n rect: DOMRect,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n void rect;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return;\n const wrapper = document.createElement(\"div\");\n this.activeHost = wrapper;\n this.activeHostOriginalText = null;\n wrapper.style.position = \"absolute\";\n wrapper.dataset.extableFloating = \"fixed\";\n wrapper.style.pointerEvents = \"auto\";\n wrapper.style.padding = \"0\";\n wrapper.style.zIndex = \"10\";\n const current = this.dataModel.getCell(rowId, colKey);\n this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.height = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.height = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.style.pointerEvents = \"auto\";\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, wrapper));\n input.addEventListener(\"compositionstart\", this.handleInputCompositionStart);\n input.addEventListener(\"compositionend\", this.handleInputCompositionEnd);\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n wrapper.appendChild(input);\n if (input instanceof HTMLSelectElement) {\n // No auto focus/click for select; standard focus will allow selection on first interaction\n }\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n this.root.appendChild(wrapper);\n this.positionFloatingContentBox(box, wrapper);\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n this.floatingInputWrapper = wrapper;\n }\n\n private handleKey(e: KeyboardEvent, cell: HTMLElement) {\n if (!this.activeCell || !this.inputEl) return;\n const now = Date.now();\n if (e.isComposing || this.composing) return; // IME composing; ignore control keys\n if (now - this.lastCompositionEnd < 24) return; // absorb trailing key events right after IME commit\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const isTextarea = this.inputEl.tagName.toLowerCase() === \"textarea\";\n const isAltEnter = e.key === \"Enter\" && e.altKey;\n const commitAndMove = (deltaRow: number, deltaCol: number) => {\n const next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(deltaRow, deltaCol);\n };\n\n if (e.key === \"Tab\") {\n e.preventDefault();\n commitAndMove(0, e.shiftKey ? -1 : 1);\n return;\n }\n if (e.key === \"Enter\") {\n if (isTextarea && isAltEnter) {\n // allow newline insertion (Excel-like Alt+Enter)\n return;\n }\n e.preventDefault();\n commitAndMove(e.shiftKey ? -1 : 1, 0);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.cancelEdit(cell);\n this.onMove();\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n }\n } else if (e.key === \"Backspace\" && this.inputEl.value === \"\") {\n e.preventDefault();\n this.commitEdit(rowId, colKey, \"\");\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(0, 0);\n }\n }\n\n private commitEdit(rowId: string, colKey: string | null, value: unknown) {\n if (colKey === null) return;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: value,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n }\n\n private readActiveValue() {\n if (!this.inputEl || !this.activeCell) return this.inputEl?.value ?? \"\";\n if (this.inputEl instanceof HTMLInputElement) {\n if (this.inputEl.type === \"checkbox\") {\n return this.inputEl.checked;\n }\n if (this.inputEl.type === \"number\") {\n if (this.inputEl.value === \"\") return \"\";\n const parsed = Number(this.inputEl.value);\n return Number.isNaN(parsed) ? \"\" : parsed;\n }\n return this.inputEl.value;\n }\n if (this.inputEl instanceof HTMLSelectElement) {\n return this.inputEl.value;\n }\n return (this.inputEl as HTMLTextAreaElement).value;\n }\n\n private bindImmediateCommit(control: HTMLElement) {\n if (!this.activeCell) return;\n const isInstant =\n control instanceof HTMLInputElement\n ? control.type === \"checkbox\" ||\n control.type === \"date\" ||\n control.type === \"time\" ||\n control.type === \"datetime-local\"\n : control instanceof HTMLSelectElement;\n if (!isInstant) return;\n control.addEventListener(\"change\", () => {\n const ac = this.activeCell;\n if (!ac) return;\n const { rowId, colKey } = ac;\n if (colKey === null) return;\n const next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n });\n }\n\n private cancelEdit(cell: HTMLElement) {\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) {\n this.teardownInput(false);\n cell.blur();\n return;\n }\n\n const { rowId, colKey } = ac;\n const orig =\n this.activeOriginalValue &&\n this.activeOriginalValue.rowId === rowId &&\n this.activeOriginalValue.colKey === colKey\n ? this.activeOriginalValue.value\n : this.dataModel.getCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const norm = (v: unknown) => (v === null || v === undefined ? \"\" : v);\n const normalizedOrig = norm(orig);\n const normalizedCurrent = norm(current);\n\n // If something committed/changed during this edit session (e.g. due to a validation path),\n // revert it back to the original value. Otherwise, do not emit any command.\n if (!Object.is(normalizedCurrent, normalizedOrig)) {\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: normalizedOrig,\n prev: normalizedCurrent,\n };\n this.onEdit(cmd, true);\n }\n\n this.teardownInput(false);\n cell.blur();\n }\n\n private teardownInput(clearActive = false) {\n removeFromParent(this.inputEl);\n removeFromParent(this.floatingInputWrapper);\n if (this.activeHost && this.activeHostOriginalText !== null) {\n this.activeHost.textContent = this.activeHostOriginalText;\n }\n this.inputEl = null;\n this.floatingInputWrapper = null;\n this.activeHost = null;\n this.activeHostOriginalText = null;\n this.activeOriginalValue = null;\n this.composing = false;\n if (clearActive) {\n this.activeCell = null;\n this.onActiveChange(null, null);\n }\n }\n}\n","export type CellPrimitive = string | number | boolean | null;\n\nexport type ButtonValue = string | { label: string; command: string; commandfor: string };\nexport type LinkValue = string | { label: string; href: string; target?: string };\n\nexport type CellValue =\n | CellPrimitive\n | Date\n | { kind: \"enum\"; value: string }\n | { kind: \"tags\"; values: string[] }\n | ButtonValue\n | LinkValue;\n\nexport type ColumnType =\n | \"string\"\n | \"number\"\n | \"int\"\n | \"uint\"\n | \"boolean\"\n | \"datetime\"\n | \"date\"\n | \"time\"\n | \"enum\"\n | \"tags\"\n | \"button\"\n | \"link\";\n\nexport type StringFormat = {\n maxLength?: number;\n regex?: string;\n};\n\nexport type NumberFormat = {\n precision?: number;\n scale?: number;\n signed?: boolean;\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for number display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"scientific\": scientific notation\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type IntegerFormat = {\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for integer display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"binary\" | \"octal\" | \"hex\": prefixed base literals\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type BooleanFormat = \"checkbox\" | string | [string, string];\nexport type DateFormat = string;\nexport type TimeFormat = string;\nexport type DateTimeFormat = string;\n\nexport type ColumnFormat<TType extends ColumnType> = TType extends \"string\"\n ? StringFormat\n : TType extends \"number\"\n ? NumberFormat\n : TType extends \"int\" | \"uint\"\n ? IntegerFormat\n : TType extends \"boolean\"\n ? BooleanFormat\n : TType extends \"date\"\n ? DateFormat\n : TType extends \"time\"\n ? TimeFormat\n : TType extends \"datetime\"\n ? DateTimeFormat\n : never;\n\nexport type ResolvedCellStyle = {\n backgroundColor?: string;\n textColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n readonly?: boolean;\n disabled?: boolean;\n};\n\nexport type StyleDelta = Partial<ResolvedCellStyle>;\n\nexport type DiagnosticLevel = \"warning\" | \"error\";\nexport type CellDiagnostic = {\n level: DiagnosticLevel;\n message: string;\n source: \"formula\" | \"conditionalStyle\";\n};\n\nexport type FormulaOk = string | boolean | number | Date;\nexport type FormulaWarn<T extends FormulaOk> = readonly [value: T, warning: Error];\nexport type FormulaReturn<T extends FormulaOk = FormulaOk> = T | FormulaWarn<T>;\n\nexport type ConditionalStyleFn<TData extends object = object> = (\n data: TData,\n) => StyleDelta | null | Error;\n\nexport type Updater<T> = T | ((oldValue: T) => T);\n\nexport type CellAddress =\n | { rowId: string; colKey: string }\n | { rowIndex: number; colIndex: number }\n | { rowId: string; colIndex: number }\n | { rowIndex: number; colKey: string };\n\nexport type CellTarget = {\n rowId: string;\n colKey: string;\n};\n\n// Forward declaration for recursive type inference\nexport interface ColumnSchema<\n TData extends object = object,\n RData extends object = TData,\n TType extends ColumnType = ColumnType,\n K extends string = string,\n> {\n key: K;\n type: TType;\n header?: string;\n readonly?: boolean;\n /**\n * When true, enforce uniqueness within this column (per table).\n * Duplicate (non-empty) values mark all duplicated cells as invalid.\n */\n unique?: boolean;\n nullable?: boolean;\n format?: ColumnFormat<TType>;\n enum?: { options: string[]; allowCustom?: boolean };\n tags?: { options: string[]; allowCustom?: boolean };\n width?: number; // px\n wrapText?: boolean; // allow per-column wrapping\n style?: {\n textColor?: string;\n backgroundColor?: string;\n align?: \"left\" | \"right\" | \"center\";\n decorations?: { strike?: boolean; underline?: boolean; bold?: boolean; italic?: boolean };\n readonly?: boolean;\n disabled?: boolean;\n };\n formula?: (data: TData) => unknown;\n conditionalStyle?: ConditionalStyleFn<RData>;\n}\n\n// Infer row data type from schema columns\nexport type InferSchemaData<TColumns extends readonly ColumnSchema<any>[]> = {\n [I in keyof TColumns]: TColumns[I] extends ColumnSchema<infer TData, any, infer TType, infer K>\n ? K extends keyof TData\n ? TData[K]\n : never\n : never;\n} extends (infer U)[]\n ? U extends object\n ? U\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport interface Schema<TData extends object = object, RData extends object = TData> {\n columns: ColumnSchema<TData, RData>[];\n row?: { conditionalStyle?: ConditionalStyleFn<RData> };\n}\n\n/**\n * Helper to lock schema generics so `formula`/`conditionalStyle` receive the correct row type.\n * Usage: `const schema = defineSchema<MyRow>({ columns: [...], row: {...} });`\n */\nexport const defineSchema = <TData extends object, RData extends object = TData>(\n schema: Schema<TData, RData>,\n): Schema<TData, RData> => schema;\n\nexport type RowObject<T extends object = Record<string, unknown>> = {\n _readonly?: boolean;\n} & T &\n Record<string, unknown>;\n\n// Public data is object-row arrays only. Use `null` or `undefined` for async loading.\nexport type NullableData<T extends object = object> = T[] | null | undefined;\n\nexport type ViewFilterOp = {\n kind: \"op\";\n key: string;\n op: \"eq\" | \"neq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"contains\";\n value: unknown;\n};\n\nexport type ViewFilterValues = {\n kind: \"values\";\n key: string;\n /** Allow-list of selected non-blank values. */\n values: unknown[];\n /** When true, blanks (null/undefined/\"\") are included. */\n includeBlanks?: boolean;\n};\n\nexport type ViewFilter = ViewFilterOp | ViewFilterValues;\n\nexport type ColumnDiagnosticFilter = {\n errors?: boolean;\n warnings?: boolean;\n};\n\nexport type ColumnDiagnosticFilterMap = Record<string, ColumnDiagnosticFilter>;\n\nexport interface ViewSort {\n key: string;\n dir: \"asc\" | \"desc\";\n}\n\nexport interface View {\n hiddenColumns?: string[];\n filters?: ViewFilter[];\n sorts?: ViewSort[];\n /**\n * Column-scoped diagnostic quick filters.\n * Key is the column key (stringified).\n */\n columnDiagnostics?: ColumnDiagnosticFilterMap;\n userId?: string; // personalization\n columnWidths?: Record<string, number>; // key -> px\n rowHeights?: Record<string, number>;\n wrapText?: Record<string, boolean>; // view override per column\n}\n\nexport type RenderMode = \"html\" | \"canvas\" | \"auto\";\nexport type EditMode = \"direct\" | \"commit\" | \"readonly\";\nexport type LockMode = \"none\" | \"row\";\n\nexport interface Command {\n kind: \"edit\" | \"deleteRow\" | \"insertRow\" | \"updateView\" | \"lock\" | \"unlock\";\n rowId?: string;\n colKey?: string;\n rowData?: RowObject;\n prev?: unknown;\n next?: unknown;\n payload?: unknown;\n}\n\nexport type CommitChanges = {\n commands: Command[];\n user?: UserInfo;\n};\n\nexport type CommitHandler = (changes: CommitChanges) => Promise<void>;\n\nexport interface UserInfo {\n id: string;\n name: string;\n}\n\nexport interface ServerAdapter {\n fetchInitial?: () => Promise<{\n data: Record<string, unknown>[];\n view?: View;\n schema?: Schema;\n user: UserInfo;\n }>;\n lockRow: (rowId: string, user: UserInfo) => Promise<void>;\n unlockRows: (rowIds: string[], user: UserInfo) => Promise<void>;\n commit: (commands: Command[], user: UserInfo) => Promise<void>;\n subscribe: (onEvent: (event: ServerEvent) => void) => () => void;\n}\n\nexport type ServerEvent = { type: \"update\"; commands: Command[]; user: UserInfo };\n\nexport interface CoreOptions {\n renderMode?: RenderMode;\n editMode?: EditMode;\n lockMode?: LockMode;\n /** Preferred languages for auto-fill sequence matching (e.g. [\"ja\", \"en\"]). */\n langs?: string[];\n defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n server?: ServerAdapter;\n user?: UserInfo;\n}\n\nexport interface TableConfig<T extends object = Record<string, unknown>> {\n data: T[] | null;\n view: View;\n schema: Schema;\n}\n\nexport type HistoryCommandKind = Command[\"kind\"];\n\nexport type UndoRedoStep = {\n batchId: string | null;\n kinds: HistoryCommandKind[];\n commandCount: number;\n label: string;\n};\n\nexport type UndoRedoHistory = {\n /** Top (index 0) is the next undo step. */\n undo: UndoRedoStep[];\n /** Top (index 0) is the next redo step. */\n redo: UndoRedoStep[];\n};\n\nexport interface InternalRow {\n id: string;\n raw: RowObject;\n displayIndex: number;\n}\n\nexport type SelectionKind = \"cells\" | \"rows\";\n\nexport interface SelectionRange {\n kind: SelectionKind;\n startRow: number;\n endRow: number;\n startCol: number;\n endCol: number;\n}\n\nexport type ToggleState = \"on\" | \"off\" | \"mixed\" | \"disabled\";\nexport type ColorState = string | \"mixed\" | null | \"disabled\";\n\nexport type TableError = {\n scope: \"validation\" | \"commit\" | \"render\" | \"formula\" | \"conditionalStyle\" | \"unknown\";\n message: string;\n target?: { rowId?: string; colKey?: string };\n};\n\nexport type ButtonActionValue =\n | { label: string; command?: undefined; commandfor?: undefined }\n | { label: string; command: string; commandfor: string };\n\nexport type CellAction = {\n kind: \"button\";\n rowId: string;\n colKey: string;\n value: ButtonActionValue;\n};\n\nexport type TableState = {\n canCommit: boolean;\n pendingCommandCount: number;\n pendingCellCount?: number;\n undoRedo: { canUndo: boolean; canRedo: boolean };\n renderMode: \"html\" | \"canvas\";\n activeErrors: TableError[];\n};\n\nexport type TableStateListener = (next: TableState, prev: TableState | null) => void;\n\nexport type RowStateSnapshot<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = {\n rowId: string;\n rowIndex: number;\n data: TResult;\n pending?: Partial<TInput>;\n diagnostics?: TableError[];\n};\n\nexport type RowChangeReason = \"new\" | \"edit\" | \"delete\";\nexport type RowStateListener<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = (\n rowId: string,\n next: RowStateSnapshot<TInput, TResult> | null,\n prev: RowStateSnapshot<TInput, TResult> | null,\n reason: RowChangeReason,\n) => void;\n\nexport type SelectionSnapshot = {\n ranges: SelectionRange[];\n activeRowIndex: number | null;\n activeRowKey: string | null;\n activeColumnIndex: number | null;\n activeColumnKey: string | null;\n activeValueRaw: unknown;\n activeValueDisplay: string;\n activeValueType: ColumnType | null;\n diagnostic: CellDiagnostic | null;\n action?: CellAction | null;\n styles: {\n columnStyle: Partial<ResolvedCellStyle>;\n cellStyle: Partial<ResolvedCellStyle>;\n resolved: Partial<ResolvedCellStyle>;\n };\n};\n\nexport type SelectionChangeReason =\n | \"selection\"\n | \"edit\"\n | \"action\"\n | \"style\"\n | \"schema\"\n | \"view\"\n | \"data\"\n | \"unknown\";\nexport type SelectionListener = (\n next: SelectionSnapshot,\n prev: SelectionSnapshot | null,\n reason: SelectionChangeReason,\n) => void;\n","import \"./styles.css\";\nimport { CommandQueue } from \"./commandQueue\";\nimport { DataModel } from \"./dataModel\";\nimport { resolveCellAddress } from \"./address\";\nimport { LockManager } from \"./lockManager\";\nimport { CanvasRenderer, HTMLRenderer, type Renderer, type ViewportState } from \"./renderers\";\nimport { SelectionManager } from \"./selectionManager\";\nimport { resolveCellStyles } from \"./styleResolver\";\nimport { getButtonLabel, getLinkLabel } from \"./actionValue\";\nimport { removeFromParent, toArray } from \"./utils\";\nimport type {\n CellAction,\n CellTarget,\n Command,\n CommitHandler,\n CoreOptions,\n HistoryCommandKind,\n InternalRow,\n NullableData,\n EditMode,\n LockMode,\n RenderMode,\n Schema,\n ServerAdapter,\n SelectionChangeReason,\n SelectionListener,\n SelectionRange,\n SelectionSnapshot,\n TableConfig,\n TableError,\n TableState,\n TableStateListener,\n UndoRedoHistory,\n UndoRedoStep,\n UserInfo,\n Updater,\n View,\n ViewFilterValues,\n RowObject,\n RowStateSnapshot,\n RowStateListener,\n RowChangeReason,\n} from \"./types\";\n\nexport * from \"./types\";\n\nexport interface CoreInit<T extends object = Record<string, unknown>> {\n root: HTMLElement;\n defaultData: NullableData<T>;\n defaultView: View;\n schema: Schema<any>;\n options?: CoreOptions;\n}\n\nexport class ExtableCore<T extends object = Record<string, unknown>, R extends object = T> {\n private root: HTMLElement;\n private shell: HTMLDivElement | null = null;\n private viewportEl: HTMLDivElement | null = null;\n private viewportResizeObserver: ResizeObserver | null = null;\n private dataModel: DataModel;\n private dataLoaded: boolean;\n private commandQueue: CommandQueue;\n private lockManager: LockManager;\n private renderer: Renderer;\n private selectionManager: SelectionManager | null = null;\n private renderMode: RenderMode;\n private editMode: EditMode;\n private lockMode: LockMode;\n private server?: ServerAdapter;\n private user?: UserInfo;\n private unsubscribe?: () => void;\n private resizeHandler: (() => void) | null = null;\n private scrollHandler: (() => void) | null = null;\n private viewportState: ViewportState | null = null;\n private rafId: number | null = null;\n private contextMenu: HTMLDivElement | null = null;\n private contextMenuRowId: string | null = null;\n private handleGlobalPointer: ((ev: MouseEvent | PointerEvent) => void) | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: number | null = null;\n private sequenceLangs?: readonly string[];\n\n private mounted = false;\n\n private isCellReadonly(rowId: string, colKey: string) {\n return this.editMode === \"readonly\" || this.dataModel.isReadonly(rowId, colKey);\n }\n\n private resolveRowId(row: string | number): string | null {\n if (typeof row === \"string\") {\n return this.findRowById(row)?.id ?? null;\n }\n const found = this.dataModel.listAllRows()[row] ?? null;\n return found?.id ?? null;\n }\n\n private filterSortSidebar: HTMLElement | null = null;\n private filterSortSidebarUnsub: (() => void) | null = null;\n private filterSortKeydown: ((ev: KeyboardEvent) => void) | null = null;\n private filterSortClickCapture: ((ev: MouseEvent) => void) | null = null;\n private filterSortOpenEvent: ((ev: Event) => void) | null = null;\n private filterSortActiveColumnKey: string | null = null;\n private filterSortDraft: {\n colKey: string;\n values: Array<{ key: string; value: unknown; label: string }>;\n hasBlanks: boolean;\n selected: Set<string>;\n includeBlanks: boolean;\n diagErrors: boolean;\n diagWarnings: boolean;\n search: string;\n } | null = null;\n\n private tableStateListeners = new Set<TableStateListener>();\n private selectionListeners = new Set<SelectionListener>();\n private lastTableState: TableState | null = null;\n private lastSelectionSnapshot: SelectionSnapshot | null = null;\n private lastAction: CellAction | null = null;\n private selectionRanges: SelectionRange[] = [];\n private activeCell: CellTarget | null = null;\n private activeErrors: TableError[] = [];\n private rowStateListeners = new Set<RowStateListener<T, R>>();\n private lastRowStates = new Map<string, RowStateSnapshot<T, R>>();\n\n private isFilterSortPanelVisible() {\n return this.root.classList.contains(\"extable-filter-sort-open\");\n }\n\n private safeRender(state?: ViewportState) {\n try {\n this.renderer.render(state);\n const hadRenderError = this.activeErrors.some((e) => e.scope === \"render\");\n if (hadRenderError) {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"render\");\n this.emitTableState();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"render\"),\n { scope: \"render\", message },\n ];\n this.emitTableState();\n }\n }\n\n constructor(init: CoreInit<T>) {\n this.root = init.root;\n this.root.classList.add(\"extable-root\");\n this.renderMode = init.options?.renderMode ?? \"auto\";\n this.editMode = init.options?.editMode ?? \"direct\";\n this.lockMode = init.options?.lockMode ?? \"none\";\n this.server = init.options?.server;\n this.user = init.options?.user;\n this.sequenceLangs = init.options?.langs;\n\n const defaultData = init.defaultData ?? null;\n const initialData = defaultData ?? [];\n this.dataLoaded = defaultData !== null && defaultData !== undefined;\n this.dataModel = new DataModel(\n initialData as unknown as RowObject[],\n init.schema,\n init.defaultView,\n );\n this.commandQueue = new CommandQueue();\n this.lockManager = new LockManager(this.lockMode, this.server, this.user);\n this.renderer = this.chooseRenderer(this.renderMode);\n this.applyRootDecor(init.options);\n this.applyReadonlyClass();\n void this.loadInitial();\n }\n\n private async loadInitial() {\n if (this.server?.fetchInitial) {\n try {\n const initial = await this.server.fetchInitial();\n this.dataModel.setData(initial.data);\n if (initial.schema) this.dataModel.setSchema(initial.schema);\n if (initial.view) this.dataModel.setView(initial.view);\n this.user = initial.user ?? this.user;\n this.lockManager.setUser(this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"fetchInitial failed\", e);\n }\n }\n this.mount();\n }\n\n private applyRootDecor(options?: CoreOptions) {\n const classes = toArray(options?.defaultClass);\n if (classes?.length) {\n this.root.classList.add(...classes);\n }\n if (options?.defaultStyle) {\n for (const [k, v] of Object.entries(options.defaultStyle)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n }\n\n private applyReadonlyClass() {\n this.root.classList.toggle(\"extable-readonly-all\", this.editMode === \"readonly\");\n }\n\n private chooseRenderer(mode: RenderMode): Renderer {\n if (mode === \"auto\") {\n const ua = typeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n type UserAgentBrand = { brand?: string };\n type NavigatorWithUAData = Navigator & { userAgentData?: { brands?: UserAgentBrand[] } };\n const isBot =\n /bot|crawl|spider|playwright|puppeteer|selenium|phantomjs/i.test(ua) ||\n (typeof navigator !== \"undefined\" &&\n \"userAgentData\" in navigator &&\n (navigator as NavigatorWithUAData).userAgentData?.brands?.some((b) =>\n /bot/i.test(b.brand ?? \"\"),\n ));\n return isBot\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n return mode === \"html\"\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n\n private ensureShell() {\n if (this.shell && this.viewportEl && this.shell.parentElement === this.root) return;\n this.root.innerHTML = \"\";\n const shell = document.createElement(\"div\");\n shell.className = \"extable-shell\";\n const viewport = document.createElement(\"div\");\n viewport.className = \"extable-viewport\";\n shell.appendChild(viewport);\n this.root.appendChild(shell);\n this.shell = shell;\n this.viewportEl = viewport;\n\n this.viewportResizeObserver?.disconnect();\n const anyRO = globalThis.ResizeObserver as typeof ResizeObserver | undefined;\n if (typeof anyRO === \"function\") {\n this.viewportResizeObserver = new anyRO(() => {\n this.updateViewportFromRoot();\n });\n this.viewportResizeObserver.observe(viewport);\n } else {\n this.viewportResizeObserver = null;\n }\n }\n\n private getScrollHost() {\n return this.viewportEl ?? this.root;\n }\n\n private mount(force = false) {\n if (this.mounted && !force) return;\n this.ensureShell();\n const host = this.viewportEl ?? this.root;\n this.renderer.mount(host);\n this.ensureContextMenu();\n this.ensureToast();\n this.initViewportState();\n\n this.root.classList.toggle(\"extable-loading\", !this.dataLoaded);\n if (!this.dataLoaded) {\n this.root.dataset.extable = \"loading\";\n this.bindViewport();\n this.ensureFilterSort();\n this.emitTableState();\n this.emitSelection(\"data\");\n return;\n }\n this.selectionManager = new SelectionManager(\n host,\n this.editMode,\n (cmd, commitNow) => this.handleEdit(cmd, commitNow),\n (rowId) => void this.lockManager.selectRow(rowId),\n (rowId) => void this.lockManager.unlockOnMove(rowId),\n (ev) => this.renderer.hitTest(ev),\n this.renderer.hitTestAction ? (ev) => this.renderer.hitTestAction!(ev) : null,\n this.dataModel,\n this.sequenceLangs,\n (rowId, colKey) => this.isCellReadonly(rowId, colKey),\n (action) => this.emitAction(action),\n (rowId, colKey) => {\n const target: CellTarget | null = rowId && colKey !== null ? { rowId, colKey } : null;\n if (target) this.renderer.setActiveCell(target.rowId, target.colKey);\n this.activeCell = target;\n this.emitSelection(\"selection\");\n },\n (rowId, _colKey, x, y) => this.showContextMenu(rowId, x, y),\n (ranges) => {\n this.selectionRanges = ranges;\n this.renderer.setSelection(ranges);\n this.emitSelection(\"selection\");\n },\n () => this.undo(),\n () => this.redo(),\n );\n this.root.dataset.extable = \"ready\";\n this.bindViewport();\n this.ensureFilterSort();\n if (this.server) {\n this.unsubscribe = this.server.subscribe((event) => this.handleServerEvent(event));\n }\n this.emitTableState();\n this.emitSelection(\"selection\");\n this.mounted = true;\n }\n\n destroy() {\n this.teardownFilterSort();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.unsubscribe?.();\n this.unbindViewport();\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.mounted = false;\n }\n\n // editMode/lockMode are configured only at construction time for consistency.\n\n setRootClass(classNames: string | string[]) {\n this.root.className = \"\";\n this.root.classList.add(...(toArray(classNames) ?? []));\n }\n\n setRootStyle(style: Partial<CSSStyleDeclaration>) {\n for (const [k, v] of Object.entries(style)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n\n setData(data: NullableData<T>) {\n if (data == null) {\n // Allow loading only before the first successful data load.\n if (this.dataLoaded) return;\n this.dataLoaded = false;\n this.safeRender(this.viewportState ?? undefined);\n this.emitSelection(\"data\");\n this.emitTableState();\n return;\n }\n const wasLoaded = this.dataLoaded;\n this.dataLoaded = true;\n this.dataModel.setData(data as unknown as RowObject[]);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n\n if (!wasLoaded) {\n this.root.classList.remove(\"extable-loading\");\n this.selectionManager?.destroy();\n this.selectionManager = null;\n this.mount();\n }\n }\n\n setView(view: View) {\n this.dataModel.setView(view);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"view\");\n this.emitTableState();\n }\n\n // Public API: configuration getters (mirror setters)\n getSchema(): Schema {\n return this.dataModel.getSchema();\n }\n\n getView(): View {\n return this.dataModel.getView();\n }\n\n /**\n * Returns the current table data (includes pending edits in commit mode and formula results).\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getData(): R[] {\n return this.getTableData();\n }\n\n /**\n * Returns the raw dataset without pending edits and without formula results.\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getRawData(): T[] {\n return this.dataModel.listAllRows().map((r) => ({ ...(r.raw as unknown as T) }));\n }\n\n // Public API: cell-level access\n getCell<K extends keyof R & string>(rowId: string, colKey: K): R[K] | undefined {\n return this.dataModel.getCell(rowId, colKey) as R[K] | undefined;\n }\n\n // Public API: row/column index utilities\n getRowIndex(rowId: string): number {\n return this.dataModel.getRowIndex(rowId);\n }\n\n getColumnIndex(colKey: string): number {\n return this.dataModel.getColumnIndex(colKey);\n }\n\n // Public API: row-level access\n findRowById(rowId: string): InternalRow | null {\n const idx = this.dataModel.getBaseRowIndex(rowId);\n if (idx < 0) return null;\n return this.dataModel.listAllRows()[idx] ?? null;\n }\n\n listRows(): InternalRow[] {\n return this.dataModel.listRows();\n }\n\n getAllRows(): InternalRow[] {\n return this.dataModel.listAllRows();\n }\n\n /**\n * Returns a single row as an object (includes pending edits in commit mode and formula results).\n * When a number is passed, it is interpreted as the base row index (not affected by view filters/sorts).\n */\n getRow(rowIdOrIndex: string | number): R | null {\n const rowId = this.resolveRowId(rowIdOrIndex);\n if (!rowId) return null;\n return this.buildRow(rowId);\n }\n\n private buildRow(rowId: string): R | null {\n const found = this.findRowById(rowId);\n if (!found) return null;\n const schema = this.dataModel.getSchema();\n const out: Record<string, unknown> = { ...(found.raw as Record<string, unknown>) };\n for (const col of schema.columns) {\n out[col.key] = this.dataModel.resolveCellValue(rowId, col).value;\n }\n return out as R;\n }\n\n // Public API: bulk data access\n getTableData(): R[] {\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.buildRow(r.id)).filter(Boolean) as R[];\n }\n\n getColumnData<K extends keyof R & string>(colKey: K): R[K][] {\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => c.key === colKey);\n if (!col) return [];\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.dataModel.resolveCellValue(r.id, col).value as R[K]);\n }\n\n // Public API: commit-mode pending helpers\n getPending(): Map<string, Record<string, unknown>> {\n if (this.editMode !== \"commit\") return new Map();\n return new Map(this.dataModel.getPending());\n }\n\n getPendingRowIds(): string[] {\n return [...this.getPending().keys()];\n }\n\n hasPendingChanges(): boolean {\n return this.getPending().size > 0;\n }\n\n getPendingCellCount(): number {\n const pending = this.getPending();\n let count = 0;\n for (const row of pending.values()) count += Object.keys(row).length;\n return count;\n }\n\n getCellPending<K extends keyof R & string>(row: string | number, colKey: K): boolean {\n if (this.editMode !== \"commit\") return false;\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n return this.dataModel.hasPending(rowId, colKey);\n }\n\n getDisplayValue<K extends keyof R & string>(row: string | number, colKey: K): string {\n const rowId = this.resolveRowId(row);\n if (!rowId) return \"\";\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return \"\";\n const res = this.dataModel.resolveCellValue(rowId, col);\n if (res.textOverride) return res.textOverride;\n const v = res.value;\n if (col.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const vv = v as Record<string, unknown>;\n if (vv.kind === \"enum\" && typeof vv.value === \"string\") return vv.value;\n if (vv.kind === \"tags\" && Array.isArray(vv.values)) {\n const values = vv.values.filter((x): x is string => typeof x === \"string\");\n return values.join(\", \");\n }\n }\n return String(v);\n }\n\n insertRow(rowData: T, position?: number | string): string | null {\n let insertAt: number | null = null;\n if (typeof position === \"number\" && Number.isFinite(position)) {\n insertAt = Math.max(0, Math.min(Math.floor(position), this.dataModel.getAllRowCount()));\n } else if (typeof position === \"string\") {\n const baseIdx = this.dataModel.getBaseRowIndex(position);\n if (baseIdx >= 0) insertAt = baseIdx;\n }\n if (insertAt === null) insertAt = this.dataModel.getAllRowCount();\n const newId = this.dataModel.insertRowAt(rowData as unknown as RowObject, insertAt);\n const cmd: Command = {\n kind: \"insertRow\",\n rowId: newId,\n rowData: rowData as unknown as RowObject,\n payload: { index: insertAt },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return newId;\n }\n\n deleteRow(row: string | number): boolean {\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n const removed = this.dataModel.removeRow(rowId);\n if (!removed) return false;\n const cmd: Command = {\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(rowId, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return true;\n }\n\n private handleEdit(cmd: Command, commitNow: boolean) {\n if (this.editMode === \"readonly\") return;\n if (!cmd.rowId || cmd.colKey === undefined) return;\n const prev = this.dataModel.getCell(cmd.rowId, cmd.colKey);\n this.commandQueue.enqueue({ ...cmd, prev });\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, commitNow);\n this.emitRowState(cmd.rowId, \"edit\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n if (commitNow) {\n void this.sendCommit([cmd]);\n }\n }\n\n undo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.undo();\n if (!cmds || !cmds.length) return;\n // Apply inverse operations in reverse order.\n for (let i = cmds.length - 1; i >= 0; i -= 1) {\n const cmd = cmds[i];\n if (!cmd) continue;\n this.applyInverse(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n redo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.redo();\n if (!cmds || !cmds.length) return;\n for (const cmd of cmds) {\n this.applyForward(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n getUndoRedoHistory(): UndoRedoHistory {\n const toKinds = (cmds: Command[]): HistoryCommandKind[] => {\n const seen = new Set<HistoryCommandKind>();\n const kinds: HistoryCommandKind[] = [];\n for (const c of cmds) {\n if (seen.has(c.kind)) continue;\n seen.add(c.kind);\n kinds.push(c.kind);\n }\n return kinds;\n };\n\n const labelFor = (kinds: HistoryCommandKind[], commandCount: number) => {\n if (kinds.length === 1 && kinds[0] === \"edit\") {\n return `Edit ${commandCount} cell(s)`;\n }\n if (kinds.length === 1 && kinds[0] === \"insertRow\") {\n return commandCount === 1 ? \"Insert row\" : `Insert row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"deleteRow\") {\n return commandCount === 1 ? \"Delete row\" : `Delete row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"updateView\") {\n return \"Update view\";\n }\n return `Command: ${kinds.join(\", \")} (${commandCount})`;\n };\n\n const toSteps = (groups: { batchId: string | null; commands: Command[] }[]): UndoRedoStep[] =>\n groups.map((g) => {\n const kinds = toKinds(g.commands);\n const commandCount = g.commands.length;\n return {\n batchId: g.batchId,\n kinds,\n commandCount,\n label: labelFor(kinds, commandCount),\n };\n });\n\n return {\n undo: toSteps(this.commandQueue.listUndoGroups()),\n redo: toSteps(this.commandQueue.listRedoGroups()),\n };\n }\n\n private applyInverse(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.prev, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowId) this.dataModel.removeRow(cmd.rowId);\n if (cmd.rowId) this.emitRowState(cmd.rowId, \"delete\");\n return;\n case \"deleteRow\":\n if (cmd.rowId && cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n this.dataModel.insertRowAt(cmd.rowData, index, cmd.rowId);\n this.emitRowState(cmd.rowId, \"new\");\n }\n return;\n default:\n return;\n }\n }\n\n private applyForward(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n const forcedId = typeof cmd.rowId === \"string\" ? cmd.rowId : undefined;\n this.dataModel.insertRowAt(cmd.rowData, index, forcedId);\n if (forcedId) this.emitRowState(forcedId, \"new\");\n }\n return;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n return;\n default:\n return;\n }\n }\n\n async commit(): Promise<RowStateSnapshot<T, R>[]>;\n async commit(handler: CommitHandler): Promise<RowStateSnapshot<T, R>[]>;\n async commit(handler?: CommitHandler): Promise<RowStateSnapshot<T, R>[]> {\n const pending = this.commandQueue.listApplied();\n if (!pending.length) return [];\n if (handler) {\n try {\n await handler({ commands: pending, user: this.user });\n this.clearCommitErrors();\n } catch (e) {\n this.recordCommitError(e);\n throw e;\n }\n return this.finalizeCommit(pending);\n }\n const snapshots = this.finalizeCommit(pending, () => this.sendCommit(pending));\n return snapshots;\n }\n\n private async sendCommit(commands: Command[]) {\n if (this.server && this.user) {\n try {\n await this.server.commit(commands, this.user);\n this.clearCommitErrors();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"commit failed\", e);\n this.recordCommitError(e);\n }\n }\n }\n\n private clearCommitErrors() {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"commit\");\n this.emitTableState();\n }\n\n private recordCommitError(error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"commit\"),\n { scope: \"commit\", message: msg },\n ];\n this.emitTableState();\n }\n\n private finalizeCommit(\n pending: Command[],\n afterApply?: () => Promise<void>,\n ): Promise<RowStateSnapshot<T, R>[]> {\n const touched = new Set<string>();\n for (const cmd of pending) {\n if (cmd.rowId) {\n this.dataModel.applyPending(cmd.rowId);\n touched.add(cmd.rowId);\n }\n }\n const run = async () => {\n if (afterApply) await afterApply();\n await this.lockManager.unlockOnCommit(pending.at(-1)?.rowId);\n this.commandQueue.clear();\n const snapshots: RowStateSnapshot<T, R>[] = [];\n for (const rowId of touched) {\n this.emitRowState(rowId, \"edit\");\n const snap = this.getRowStateSnapshot(rowId);\n if (snap) snapshots.push(snap);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n return snapshots;\n };\n return run();\n }\n\n private handleServerEvent(event: {\n type: \"update\";\n commands: Command[];\n user: UserInfo;\n }) {\n for (const cmd of event.commands) {\n this.applyCommand(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n }\n\n private applyCommand(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, true);\n this.emitRowState(cmd.rowId, \"edit\");\n }\n break;\n case \"insertRow\":\n if (cmd.rowData) {\n const id = this.dataModel.insertRow(cmd.rowData);\n if (id) this.emitRowState(id, \"new\");\n }\n break;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n break;\n case \"updateView\":\n if (cmd.next && typeof cmd.next === \"object\") {\n this.dataModel.setView(cmd.next as View);\n }\n break;\n default:\n break;\n }\n }\n\n private ensureContextMenu() {\n if (this.contextMenu?.isConnected) return;\n this.contextMenu = null;\n const pop = document.createElement(\"div\");\n pop.className = \"extable-context-menu\";\n pop.setAttribute(\"popover\", \"manual\");\n pop.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n const readonlyMode = this.editMode === \"readonly\";\n const actions: Array<{ key: string; label?: string; kind?: \"sep\" }> = readonlyMode\n ? [{ key: \"copy\", label: \"Copy\" }]\n : [\n { key: \"copy\", label: \"Copy\" },\n { key: \"paste\", label: \"Paste\" },\n { key: \"sep-top\", kind: \"sep\" },\n { key: \"undo\", label: \"Undo\" },\n { key: \"redo\", label: \"Redo\" },\n { key: \"sep-mid\", kind: \"sep\" },\n { key: \"insert-above\", label: \"Insert row above\" },\n { key: \"insert-below\", label: \"Insert row below\" },\n { key: \"delete-row\", label: \"Delete row\" },\n ];\n const list = document.createElement(\"div\");\n for (const act of actions) {\n if (act.kind === \"sep\") {\n const hr = document.createElement(\"hr\");\n hr.className = \"extable-context-sep\";\n list.appendChild(hr);\n continue;\n }\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.dataset.action = act.key;\n btn.textContent = act.label ?? \"\";\n btn.addEventListener(\"click\", () => {\n this.handleContextAction(act.key);\n this.closeContextMenu();\n });\n list.appendChild(btn);\n }\n pop.appendChild(list);\n (this.viewportEl ?? this.root).appendChild(pop);\n this.contextMenu = pop;\n }\n\n private showContextMenu(rowId: string | null, clientX: number, clientY: number) {\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n if (!this.contextMenu.isConnected) {\n // Host may have been rebuilt (e.g. renderer switch). Recreate.\n this.contextMenu = null;\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n }\n this.contextMenuRowId = rowId;\n // Update enable/disable state for undo/redo.\n for (const btn of Array.from(\n this.contextMenu.querySelectorAll<HTMLButtonElement>(\"button[data-action]\"),\n )) {\n const action = btn.dataset.action;\n if (action === \"undo\") btn.disabled = !this.commandQueue.canUndo();\n else if (action === \"redo\") btn.disabled = !this.commandQueue.canRedo();\n }\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const rect = { width: 220, height: 160 };\n let left = clientX;\n let top = clientY;\n if (left + rect.width > viewportWidth) left = Math.max(0, viewportWidth - rect.width - 8);\n if (top + rect.height > viewportHeight) top = Math.max(0, viewportHeight - rect.height - 8);\n this.contextMenu.style.left = `${left}px`;\n this.contextMenu.style.top = `${top}px`;\n this.contextMenu.hidePopover?.();\n this.contextMenu.showPopover?.();\n }\n\n private handleContextAction(action: string) {\n if (action === \"copy\") {\n void this.selectionManager?.copySelection();\n return;\n }\n if (action === \"paste\") {\n void this.selectionManager?.pasteFromClipboard();\n return;\n }\n if (action === \"undo\") {\n this.undo();\n return;\n }\n if (action === \"redo\") {\n this.redo();\n return;\n }\n if (!this.contextMenuRowId) return;\n const idx = this.dataModel.getBaseRowIndex(this.contextMenuRowId);\n const targetIndex = idx >= 0 ? idx : this.dataModel.getAllRowCount();\n if (action === \"insert-above\" || action === \"insert-below\") {\n const insertAt = action === \"insert-above\" ? targetIndex : targetIndex + 1;\n const raw = this.createBlankRow();\n const newId = this.dataModel.insertRowAt(raw, insertAt);\n this.commandQueue.enqueue({\n kind: \"insertRow\",\n rowId: newId,\n rowData: raw,\n payload: { index: insertAt },\n });\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row inserted\", \"info\");\n return;\n }\n if (action === \"delete-row\") {\n const removed = this.dataModel.removeRow(this.contextMenuRowId);\n if (!removed) return;\n this.commandQueue.enqueue({\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n });\n this.emitRowState(removed.row.id, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row deleted\", \"info\");\n return;\n }\n }\n\n private createBlankRow(): RowObject {\n const schema = this.dataModel.getSchema();\n const obj: RowObject = {};\n for (const col of schema.columns) {\n obj[String(col.key)] = null;\n }\n return obj;\n }\n\n private closeContextMenu() {\n this.contextMenu?.hidePopover?.();\n }\n\n private ensureToast() {\n if (this.toast?.isConnected) return;\n this.toast = null;\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.setAttribute(\"popover\", \"manual\");\n toast.style.right = \"16px\";\n toast.style.bottom = \"16px\";\n toast.style.position = \"fixed\";\n (this.viewportEl ?? this.root).appendChild(toast);\n this.toast = toast;\n }\n\n private showToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 2500) {\n this.ensureToast();\n if (!this.toast) return;\n this.toast.textContent = message;\n this.toast.dataset.variant = variant;\n this.toast.hidePopover?.();\n this.toast.showPopover?.();\n if (this.toastTimer) {\n window.clearTimeout(this.toastTimer);\n this.toastTimer = null;\n }\n this.toastTimer = window.setTimeout(() => {\n this.toast?.hidePopover?.();\n }, durationMs);\n }\n\n private bindViewport() {\n this.resizeHandler = () => this.updateViewportFromRoot();\n this.scrollHandler = () => this.updateViewportFromRoot();\n this.getScrollHost().addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.resizeHandler);\n this.handleGlobalPointer = (ev: MouseEvent | PointerEvent) => {\n if (this.contextMenu && !this.contextMenu.contains(ev.target as Node)) {\n this.contextMenu.hidePopover?.();\n }\n };\n document.addEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n\n }\n\n private unbindViewport() {\n if (this.resizeHandler) window.removeEventListener(\"resize\", this.resizeHandler);\n if (this.scrollHandler) this.getScrollHost().removeEventListener(\"scroll\", this.scrollHandler);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n if (this.handleGlobalPointer) {\n document.removeEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n this.handleGlobalPointer = null;\n }\n if (this.contextMenu) {\n this.contextMenu.hidePopover?.();\n if (this.contextMenu.parentElement) removeFromParent(this.contextMenu);\n this.contextMenu = null;\n }\n if (this.toast) {\n this.toast.hidePopover?.();\n if (this.toast.parentElement) removeFromParent(this.toast);\n this.toast = null;\n }\n }\n\n remount(target: HTMLElement) {\n this.unbindViewport();\n this.teardownFilterSort();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.root = target;\n this.applyReadonlyClass();\n this.shell = null;\n this.viewportEl = null;\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.renderer = this.chooseRenderer(this.renderMode);\n this.mounted = false;\n this.mount(true);\n }\n\n // Public API: table-level state callbacks\n getTableState(): TableState {\n const effective = this.renderer instanceof HTMLRenderer ? \"html\" : \"canvas\";\n const applied = this.commandQueue.listApplied();\n const pendingCommands = this.editMode === \"commit\" ? applied : [];\n const pendingCommandCount = pendingCommands.length;\n const pendingCellCount = (() => {\n const keys = new Set<string>();\n for (const c of pendingCommands) {\n if (c.kind !== \"edit\") continue;\n if (!c.rowId || c.colKey === undefined) continue;\n keys.add(`${c.rowId}::${String(c.colKey)}`);\n }\n return keys.size;\n })();\n const validationErrors: TableError[] = this.dataModel.getValidationErrors().map((e) => ({\n scope: \"validation\",\n message: e.message,\n target: { rowId: e.rowId, colKey: e.colKey },\n }));\n const diagnosticErrors: TableError[] = this.dataModel\n .getDiagnostics()\n .map((x) => {\n if (!x.diag) return null;\n return {\n scope: x.diag.source,\n message: x.diag.message,\n target: { rowId: x.rowId, colKey: x.colKey },\n } as TableError;\n })\n .filter(Boolean) as TableError[];\n diagnosticErrors.sort((a, b) => {\n const ar = a.target?.rowId ? this.dataModel.getRowIndex(a.target.rowId) : -1;\n const br = b.target?.rowId ? this.dataModel.getRowIndex(b.target.rowId) : -1;\n if (ar !== br) return ar - br;\n const ac =\n a.target?.colKey !== undefined ? this.dataModel.getColumnIndex(a.target.colKey) : -1;\n const bc =\n b.target?.colKey !== undefined ? this.dataModel.getColumnIndex(b.target.colKey) : -1;\n if (ac !== bc) return ac - bc;\n if (a.scope !== b.scope) return a.scope < b.scope ? -1 : 1;\n return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;\n });\n const activeErrors = [\n ...validationErrors,\n ...diagnosticErrors.slice(0, 200),\n ...this.activeErrors,\n ];\n return {\n canCommit: this.editMode === \"commit\" && pendingCommandCount > 0,\n pendingCommandCount,\n pendingCellCount,\n undoRedo: { canUndo: this.commandQueue.canUndo(), canRedo: this.commandQueue.canRedo() },\n renderMode: effective,\n activeErrors,\n };\n }\n\n subscribeTableState(listener: TableStateListener) {\n this.tableStateListeners.add(listener);\n listener(this.getTableState(), null);\n return () => this.tableStateListeners.delete(listener);\n }\n\n private emitTableState() {\n const next = this.getTableState();\n const prev = this.lastTableState;\n const errorsEqual = (() => {\n if (!prev) return false;\n if (prev.activeErrors.length !== next.activeErrors.length) return false;\n for (let i = 0; i < next.activeErrors.length; i += 1) {\n const a = prev.activeErrors[i];\n const b = next.activeErrors[i];\n if (!a || !b) return false;\n if (a.scope !== b.scope) return false;\n if (a.message !== b.message) return false;\n const at = a.target;\n const bt = b.target;\n if (!at && !bt) continue;\n if (!at || !bt) return false;\n if ((at.rowId ?? null) !== (bt.rowId ?? null)) return false;\n if (String(at.colKey ?? \"\") !== String(bt.colKey ?? \"\")) return false;\n }\n return true;\n })();\n // Shallow equality shortcut.\n const same =\n prev &&\n prev.canCommit === next.canCommit &&\n prev.pendingCommandCount === next.pendingCommandCount &&\n prev.pendingCellCount === next.pendingCellCount &&\n prev.undoRedo.canUndo === next.undoRedo.canUndo &&\n prev.undoRedo.canRedo === next.undoRedo.canRedo &&\n prev.renderMode === next.renderMode &&\n errorsEqual;\n if (same) return;\n this.lastTableState = next;\n for (const l of this.tableStateListeners) l(next, prev);\n }\n\n // Public API: selection callbacks\n getSelectionSnapshot(): SelectionSnapshot {\n const ranges = this.selectionRanges;\n const schema = this.dataModel.getSchema();\n const active = this.activeCell;\n const activeRowId = active?.rowId ?? null;\n const activeColKey = active?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : null;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : null;\n const col =\n activeColIndex !== null && activeColIndex >= 0 ? schema.columns[activeColIndex] : null;\n\n const activeValueRes =\n activeRowId && col ? this.dataModel.resolveCellValue(activeRowId, col) : null;\n const activeCondRes =\n activeRowId && col ? this.dataModel.resolveConditionalStyle(activeRowId, col) : null;\n const activeTextOverride =\n activeValueRes?.textOverride ?? (activeCondRes?.forceErrorText ? \"#ERROR\" : undefined);\n const activeValueRaw = activeValueRes ? activeValueRes.value : null;\n const activeValueDisplay = (() => {\n if (activeTextOverride) return activeTextOverride;\n const v = activeValueRaw;\n if (col?.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col?.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n const activeValueType = col?.type ?? null;\n const diagnostic =\n activeRowId && activeColKey !== null\n ? this.dataModel.getCellDiagnostic(activeRowId, activeColKey)\n : null;\n\n const activeStyles = (() => {\n if (!activeRowId || !col) {\n return { columnStyle: {}, cellStyle: {}, resolved: {} };\n }\n const { columnStyle, cellStyle, resolved } = resolveCellStyles(\n this.dataModel,\n activeRowId,\n col,\n );\n return { columnStyle, cellStyle, resolved };\n })();\n\n return {\n ranges: [...ranges],\n activeRowIndex: activeRowIndex !== null && activeRowIndex >= 0 ? activeRowIndex : null,\n activeRowKey: activeRowId,\n activeColumnIndex: activeColIndex !== null && activeColIndex >= 0 ? activeColIndex : null,\n activeColumnKey: activeColKey,\n activeValueRaw,\n activeValueDisplay,\n activeValueType,\n diagnostic,\n action: this.lastAction,\n styles: activeStyles,\n };\n }\n\n subscribeSelection(listener: SelectionListener) {\n this.selectionListeners.add(listener);\n listener(this.getSelectionSnapshot(), null, \"selection\");\n return () => this.selectionListeners.delete(listener);\n }\n\n private emitAction(action: CellAction) {\n this.lastAction = action;\n this.emitSelection(\"action\");\n this.lastAction = null;\n }\n\n private emitSelection(reason: SelectionChangeReason) {\n const next = this.getSelectionSnapshot();\n const prev = this.lastSelectionSnapshot;\n this.lastSelectionSnapshot = next;\n for (const l of this.selectionListeners) l(next, prev, reason);\n }\n\n private getRowStateSnapshot(rowId: string): RowStateSnapshot<T, R> | null {\n const rowIndex = this.dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const data = this.buildRow(rowId);\n if (!data) return null;\n const pending =\n this.editMode === \"commit\"\n ? (this.dataModel.getPending().get(rowId) ?? undefined)\n : undefined;\n const diagnostics = this.getTableState().activeErrors.filter((e) => e.target?.rowId === rowId);\n return {\n rowId,\n rowIndex,\n data,\n pending: pending as Partial<T> | undefined,\n diagnostics: diagnostics.length ? diagnostics : undefined,\n };\n }\n\n subscribeRowState(listener: RowStateListener<T, R>) {\n this.rowStateListeners.add(listener);\n const rows = this.dataModel.listAllRows();\n for (const row of rows) {\n const snap = this.getRowStateSnapshot(row.id);\n if (!snap) continue;\n this.lastRowStates.set(row.id, snap);\n listener(row.id, snap, null, \"new\");\n }\n return () => this.rowStateListeners.delete(listener);\n }\n\n private emitRowState(rowId: string, reason: RowChangeReason) {\n const prev = this.lastRowStates.get(rowId) ?? null;\n if (reason === \"delete\") {\n this.lastRowStates.delete(rowId);\n for (const l of this.rowStateListeners) l(rowId, null, prev, reason);\n return;\n }\n const next = this.getRowStateSnapshot(rowId);\n if (!next) return;\n this.lastRowStates.set(rowId, next);\n for (const l of this.rowStateListeners) l(rowId, next, prev, reason);\n }\n\n // Public API: value updates\n setCellValue<K extends keyof T & string>(row: number | string, colKey: K, next: Updater<T[K]>) {\n const rowId = typeof row === \"string\" ? row : this.dataModel.listRows()[row]?.id;\n const resolved = rowId ? resolveCellAddress(this.dataModel, { rowId, colKey }) : null;\n if (!resolved) return;\n if (this.isCellReadonly(resolved.rowId, resolved.colKey)) return;\n const current = this.dataModel.getCell(resolved.rowId, resolved.colKey) as T[K];\n const computed = typeof next === \"function\" ? (next as (old: T[K]) => T[K])(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: resolved.rowId, colKey: resolved.colKey, next: computed },\n this.editMode === \"direct\",\n );\n }\n\n setValueToSelection(next: Updater<unknown>) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const unique = new Set<string>();\n for (const r of this.selectionRanges) {\n if (r.kind !== \"cells\") continue;\n const sr = Math.min(r.startRow, r.endRow);\n const er = Math.max(r.startRow, r.endRow);\n const sc = Math.min(r.startCol, r.endCol);\n const ec = Math.max(r.startCol, r.endCol);\n for (let rowIndex = sr; rowIndex <= er; rowIndex += 1) {\n const row = rows[rowIndex];\n if (!row) continue;\n for (let colIndex = sc; colIndex <= ec; colIndex += 1) {\n const col = schema.columns[colIndex];\n if (!col) continue;\n const key = `${row.id}::${String(col.key)}`;\n if (unique.has(key)) continue;\n unique.add(key);\n if (this.isCellReadonly(row.id, col.key)) continue;\n const current = this.dataModel.getCell(row.id, col.key);\n const computed = typeof next === \"function\" ? next(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: row.id, colKey: col.key, next: computed },\n this.editMode === \"direct\",\n );\n }\n }\n }\n }\n\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private ensureFilterSort() {\n this.ensureFilterSortSidebar();\n this.ensureFilterSortHeaderIntegration();\n this.ensureFilterSortEscape();\n }\n\n private ensureFilterSortEscape() {\n if (this.filterSortKeydown) return;\n this.filterSortKeydown = (ev: KeyboardEvent) => {\n if (!this.isFilterSortPanelVisible()) return;\n if (ev.key !== \"Escape\") return;\n ev.preventDefault();\n ev.stopPropagation();\n this.hideFilterSortPanel();\n };\n document.addEventListener(\"keydown\", this.filterSortKeydown, true);\n }\n\n private ensureFilterSortHeaderIntegration() {\n if (this.filterSortClickCapture) return;\n const host = this.viewportEl ?? this.root;\n this.filterSortClickCapture = (ev: MouseEvent) => {\n const el = ev.target as HTMLElement | null;\n const btn = el?.closest<HTMLButtonElement>('button[data-extable-fs-open=\"1\"]');\n if (!btn) return;\n const key =\n btn.dataset.extableColKey ?? btn.closest<HTMLElement>(\"th[data-col-key]\")?.dataset.colKey;\n if (!key) return;\n ev.preventDefault();\n ev.stopPropagation();\n this.showFilterSortPanel(key);\n };\n host.addEventListener(\"click\", this.filterSortClickCapture, true);\n this.filterSortOpenEvent = (ev: Event) => {\n const anyEv = ev as CustomEvent<unknown>;\n const detail = anyEv.detail as Record<string, unknown> | null | undefined;\n const key = detail?.colKey;\n if (key === undefined || key === null) return;\n this.showFilterSortPanel(String(key));\n };\n host.addEventListener(\"extable:filter-sort-open\", this.filterSortOpenEvent);\n }\n\n private ensureFilterSortSidebar() {\n if (this.filterSortSidebar) {\n if (this.filterSortSidebar.isConnected) return;\n this.filterSortSidebar = null;\n }\n this.ensureShell();\n const shell = this.shell ?? this.root;\n\n const aside = document.createElement(\"aside\");\n aside.className = \"extable-filter-sort-sidebar\";\n aside.innerHTML = `\n <div class=\"extable-filter-sort-header\">\n <div class=\"extable-filter-sort-row\">\n <div class=\"extable-filter-sort-title\" data-extable-fs=\"title\">Sort/Filter</div>\n <button type=\"button\" data-extable-fs=\"close\" class=\"extable-filter-sort-close\">×</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-body\">\n <div class=\"extable-filter-sort-section extable-filter-sort-section-filter\">\n <div class=\"extable-filter-sort-section-title\">Filter</div>\n <div class=\"extable-filter-sort-actions\">\n <label><input type=\"checkbox\" data-extable-fs=\"col-errors\" /> Errors</label>\n <label><input type=\"checkbox\" data-extable-fs=\"col-warnings\" /> Warnings</label>\n </div>\n <input data-extable-fs=\"search\" type=\"text\" placeholder=\"Search values\" />\n <div class=\"extable-filter-sort-values\" data-extable-fs=\"values\"></div>\n <div class=\"extable-filter-sort-actions\" data-align=\"split\">\n <button type=\"button\" data-extable-fs=\"select-all\">Select All</button>\n <button type=\"button\" data-extable-fs=\"select-none\">Select None</button>\n <button type=\"button\" data-extable-fs=\"apply-filter\">Apply</button>\n <button type=\"button\" data-extable-fs=\"clear-filter\">Clear</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-section extable-filter-sort-section-sort\">\n <div class=\"extable-filter-sort-section-title\">Sort</div>\n <div class=\"extable-filter-sort-actions\" data-align=\"right\">\n <button type=\"button\" data-extable-fs=\"sort-asc\">Sort Asc</button>\n <button type=\"button\" data-extable-fs=\"sort-desc\">Sort Desc</button>\n <button type=\"button\" data-extable-fs=\"clear-sort\">Clear Sort</button>\n </div>\n </div>\n </div>\n `;\n shell.appendChild(aside);\n this.filterSortSidebar = aside;\n\n const btnClose = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"close\"]');\n const cbErrors = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"col-errors\"]');\n const cbWarnings = aside.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]');\n const values = aside.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n const btnAll = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-all\"]');\n const btnNone = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-none\"]');\n const btnApply = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"apply-filter\"]',\n );\n const btnClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-filter\"]',\n );\n const btnSortAsc = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"sort-asc\"]');\n const btnSortDesc = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const btnSortClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-sort\"]',\n );\n\n if (\n !btnClose ||\n !cbErrors ||\n !cbWarnings ||\n !search ||\n !values ||\n !btnAll ||\n !btnNone ||\n !btnApply ||\n !btnClear ||\n !btnSortAsc ||\n !btnSortDesc ||\n !btnSortClear\n ) {\n removeFromParent(aside);\n this.filterSortSidebar = null;\n return;\n }\n\n btnClose.addEventListener(\"click\", () => this.hideFilterSortPanel());\n\n cbErrors.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagErrors = cbErrors.checked;\n });\n cbWarnings.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagWarnings = cbWarnings.checked;\n });\n search.addEventListener(\"input\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.search = search.value;\n this.renderFilterSortValues();\n });\n\n values.addEventListener(\"change\", (e) => {\n const input = (e.target as HTMLElement | null)?.closest<HTMLInputElement>(\n 'input[type=\"checkbox\"][data-fs-val]',\n );\n if (!input || !this.filterSortDraft) return;\n const k = input.dataset.fsVal ?? \"\";\n if (!k) return;\n if (k === \"__blanks__\") {\n this.filterSortDraft.includeBlanks = input.checked;\n } else if (input.checked) {\n this.filterSortDraft.selected.add(k);\n } else {\n this.filterSortDraft.selected.delete(k);\n }\n });\n\n btnAll.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set(this.filterSortDraft.values.map((v) => v.key));\n this.filterSortDraft.includeBlanks = this.filterSortDraft.hasBlanks;\n this.renderFilterSortValues();\n });\n btnNone.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set();\n this.filterSortDraft.includeBlanks = false;\n this.renderFilterSortValues();\n });\n btnApply.addEventListener(\"click\", () => this.applyFilterSortDraft());\n btnClear.addEventListener(\"click\", () => this.clearFilterSortForActiveColumn());\n btnSortAsc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"asc\"));\n btnSortDesc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"desc\"));\n btnSortClear.addEventListener(\"click\", () => this.clearSort());\n\n this.filterSortSidebarUnsub = this.dataModel.subscribe(() => {\n if (!this.isFilterSortPanelVisible()) return;\n if (!this.filterSortActiveColumnKey) return;\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n });\n }\n\n showFilterSortPanel(colKey: string) {\n this.filterSortActiveColumnKey = colKey;\n this.buildFilterSortDraft(colKey);\n this.root.classList.toggle(\"extable-filter-sort-open\", true);\n this.renderFilterSortSidebar();\n const input =\n this.filterSortSidebar?.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]') ??\n null;\n input?.focus();\n }\n\n hideFilterSortPanel() {\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n toggleFilterSortPanel(colKey: string) {\n if (this.isFilterSortPanelVisible()) this.hideFilterSortPanel();\n else this.showFilterSortPanel(colKey);\n }\n\n private buildFilterSortDraft(colKey: string) {\n const view = this.dataModel.getView();\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n this.filterSortDraft = null;\n return;\n }\n const prevSearch =\n this.filterSortDraft && String(this.filterSortDraft.colKey) === String(col.key)\n ? this.filterSortDraft.search\n : \"\";\n const distinct = this.dataModel.getDistinctValuesForColumn(col.key);\n const values = distinct.values.map((v) => ({ ...v, key: this.stableValueKey(v.value) }));\n const existing = (view.filters ?? []).find(\n (f) =>\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(col.key),\n ) as ViewFilterValues | undefined;\n\n const selected = new Set<string>();\n if (existing) {\n for (const v of existing.values ?? []) selected.add(this.stableValueKey(v));\n } else {\n for (const v of values) selected.add(v.key);\n }\n const includeBlanks = existing ? Boolean(existing.includeBlanks) : distinct.hasBlanks;\n const diag = view.columnDiagnostics?.[String(col.key)];\n this.filterSortDraft = {\n colKey: col.key,\n values,\n hasBlanks: distinct.hasBlanks,\n selected,\n includeBlanks,\n diagErrors: Boolean(diag?.errors),\n diagWarnings: Boolean(diag?.warnings),\n search: prevSearch,\n };\n }\n\n private renderFilterSortSidebar() {\n if (!this.filterSortSidebar) return;\n const title = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"title\"]');\n const cbErrors = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-errors\"]',\n );\n const cbWarnings = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"search\"]',\n );\n if (!title || !cbErrors || !cbWarnings || !search) return;\n const btnSortAsc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-asc\"]',\n );\n const btnSortDesc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const draft = this.filterSortDraft;\n if (!draft) {\n title.textContent = \"Sort/Filter\";\n cbErrors.checked = false;\n cbWarnings.checked = false;\n search.value = \"\";\n if (btnSortAsc) btnSortAsc.dataset.active = \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = \"0\";\n this.renderFilterSortValues();\n return;\n }\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(draft.colKey));\n const name = col?.header ?? String(draft.colKey);\n title.textContent = `Sort/Filter: ${name}`;\n cbErrors.checked = draft.diagErrors;\n cbWarnings.checked = draft.diagWarnings;\n search.value = draft.search;\n const view = this.dataModel.getView();\n const sort = view.sorts?.find((s) => String(s.key) === String(draft.colKey));\n if (btnSortAsc) btnSortAsc.dataset.active = sort?.dir === \"asc\" ? \"1\" : \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = sort?.dir === \"desc\" ? \"1\" : \"0\";\n this.renderFilterSortValues();\n }\n\n private renderFilterSortValues() {\n if (!this.filterSortSidebar) return;\n const values = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n if (!values) return;\n values.innerHTML = \"\";\n const draft = this.filterSortDraft;\n if (!draft) return;\n\n const q = draft.search.trim().toLowerCase();\n const total = draft.values.length + (draft.hasBlanks ? 1 : 0);\n if (total > 100 && !q) {\n const msg = document.createElement(\"div\");\n msg.textContent = \"Too many values (100+). Type to search.\";\n values.appendChild(msg);\n return;\n }\n\n if (draft.hasBlanks) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = \"__blanks__\";\n cb.checked = draft.includeBlanks;\n const text = document.createElement(\"span\");\n text.textContent = \"(Blanks)\";\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n\n const filtered = q\n ? draft.values.filter((v) => v.label.toLowerCase().includes(q))\n : draft.values;\n for (const v of filtered.slice(0, 200)) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = v.key;\n cb.checked = draft.selected.has(v.key);\n const text = document.createElement(\"span\");\n text.textContent = v.label;\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n }\n\n private applyFilterSortDraft() {\n const draft = this.filterSortDraft;\n if (!draft) return;\n const view = this.dataModel.getView();\n const existingFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(draft.colKey)\n ),\n );\n\n const allSelected =\n draft.selected.size === draft.values.length &&\n draft.includeBlanks === Boolean(draft.hasBlanks);\n const nextFilters = allSelected\n ? existingFilters\n : [\n ...existingFilters,\n {\n kind: \"values\",\n key: draft.colKey,\n values: draft.values.filter((v) => draft.selected.has(v.key)).map((v) => v.value),\n includeBlanks: draft.includeBlanks,\n } satisfies ViewFilterValues,\n ];\n\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n if (draft.diagErrors || draft.diagWarnings) {\n nextDiagnostics[String(draft.colKey)] = {\n errors: draft.diagErrors,\n warnings: draft.diagWarnings,\n };\n } else {\n delete nextDiagnostics[String(draft.colKey)];\n }\n\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n }\n\n private clearFilterSortForActiveColumn() {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(colKey)\n ),\n );\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n delete nextDiagnostics[String(colKey)];\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private setSortForActiveColumn(dir: \"asc\" | \"desc\") {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextView: View = { ...view, sorts: [{ key: colKey, dir }] };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private clearSort() {\n const view = this.dataModel.getView();\n if (!view.sorts?.length) return;\n const nextView: View = { ...view, sorts: undefined };\n this.setView(nextView);\n if (this.filterSortActiveColumnKey !== null) {\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n }\n }\n\n private teardownFilterSort() {\n this.filterSortSidebarUnsub?.();\n this.filterSortSidebarUnsub = null;\n if (this.filterSortSidebar) {\n removeFromParent(this.filterSortSidebar);\n this.filterSortSidebar = null;\n }\n if (this.filterSortKeydown) {\n document.removeEventListener(\"keydown\", this.filterSortKeydown, true);\n this.filterSortKeydown = null;\n }\n if (this.filterSortClickCapture) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"click\",\n this.filterSortClickCapture,\n true,\n );\n this.filterSortClickCapture = null;\n }\n if (this.filterSortOpenEvent) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"extable:filter-sort-open\",\n this.filterSortOpenEvent,\n );\n this.filterSortOpenEvent = null;\n }\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n private initViewportState() {\n const host = this.getScrollHost();\n this.viewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n }\n\n private updateViewportFromRoot() {\n if (!this.viewportState) this.initViewportState();\n const prev = this.viewportState ?? {\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n const host = this.getScrollHost();\n const next: ViewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: host.scrollLeft - prev.scrollLeft,\n deltaY: host.scrollTop - prev.scrollTop,\n timestamp: performance.now(),\n };\n this.viewportState = next;\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => this.flushRender());\n }\n }\n\n private flushRender() {\n this.rafId = null;\n if (!this.viewportState) return;\n this.selectionManager?.onScroll(this.viewportState.scrollTop, this.viewportState.scrollLeft);\n // HTML renderer re-renders DOM; avoid doing it on scroll to preserve scroll position.\n if (this.renderer instanceof HTMLRenderer) return;\n this.safeRender(this.viewportState);\n }\n}\n\n// Compatibility helpers for wrappers/tests\nexport function createTablePlaceholder<T extends object = Record<string, unknown>>(\n config: TableConfig<T>,\n options?: CoreOptions,\n) {\n const core = new ExtableCore<T>({\n root: document.createElement(\"div\"),\n defaultData: config.data,\n defaultView: config.view,\n schema: config.schema,\n options,\n });\n return core;\n}\n\nexport function mountTable(target: HTMLElement, core: ExtableCore) {\n core.remount(target);\n return core;\n}\n"],"names":["getBatchId","cmd","p","id","CommandQueue","cap","command","batchId","last","out","group","g","resolveCellAddress","dataModel","address","schema","rows","resolveByIndex","rowIndex","colIndex","row","col","resolveByKeys","rowId","colKey","c","LockManager","mode","server","user","currentRowId","keepRowId","toUnlock","rowIds","e","V","n","s","J","r","R","D","K","z","i","a","l","u","P","k","f","B","G","H","U","Y","q","X","Q","Z","_","ee","te","ne","se","re","ie","oe","ae","ue","le","ce","fe","de","me","he","ge","pe","xe","ye","be","Se","je","ke","we","Ne","Ie","Te","Me","T","Ae","ve","Le","Ee","We","Ce","Oe","$e","x","y","M","w","Fe","Pe","A","v","N","Ve","Je","Re","De","Ke","m","L","ze","Be","I","Ge","He","Ue","Ye","qe","Xe","Qe","Ze","_e","et","tt","E","j","W","nt","st","rt","it","ot","b","S","C","O","at","ut","lt","$","o","ct","F","ft","dt","h","mt","ht","d","gt","pt","normalizeRange","range","coerceToTime","value","coerceToDate","getFillHandleSource","ranges","width","height","makeFillValueGetter","source","langs","seed","registry","createBuiltInRegistry","numbers","seq","inferSequence","cache","done","offsetFromEnd","next","dates","strings","FILL_HANDLE_VISUAL_SIZE_PX","FILL_HANDLE_HIT_SIZE_PX","getFillHandleRect","cellRect","size","isPointInRect","rect","shouldShowFillHandle","activeRowId","activeColKey","editMode","src","CANVAS_FONT_FAMILY","CANVAS_FONT_SIZE_PX","getColumnSortDir","view","hasActiveColumnFilter","vf","diag","svgFunnel","svgArrow","dir","drawDiagnosticCorner","ctx","level","color","ValueFormatCache","options","key","fmt","cached","parsed","parseIsoDate","drawFunnelIcon","alpha","drawSortArrowIcon","resolveTagValues","obj","values","FenwickTree","count","res","index0","delta","target","total","idx","bit","acc","step","nextAcc","HTMLRenderer","DEFAULT_ROW_HEIGHT_PX","ROW_HEADER_WIDTH_PX","root","_state","scrollContainer","prevTop","prevLeft","colWidths","getColumnWidths","colBaseStyles","columnFormatToStyle","colBaseCss","styleToCssText","totalWidth","body","entry","removeFromParent","event","corner","rowHeader","cell","tagRemove","indexStr","tagIndex","actionEl","kind","thead","tr","rowTh","th","sortDir","hasFilter","wrap","label","btn","index","td","isPending","condRes","cellStyle","hasTextColor","css","baseStyle","withCond","mergeStyle","merged","forCss","raw","valueRes","textOverride","formatted","interaction","tagValues","isActionType","actionValue","resolveButtonAction","resolveLinkAction","actionLabel","getButtonLabel","getLinkLabel","list","tag","chip","remove","marker","align","rawNumbered","toRawValue","rawStr","maxHeight","text","version","measure","measureHost","CELL_PADDING_TOP_PX","CELL_PADDING_BOTTOM_PX","isAll","el","startRow","endRow","startCol","endCol","rowEl","cells","tags","num","formatNumberForEdit","opts","token","formatIntegerWithPrefix","fmtValue","coerceDatePattern","formatDateLite","_CanvasRenderer","getEditMode","HEADER_HEIGHT_PX","ev","viewportX","viewportY","xCursor","iconSize","iconLeft","iconTop","actionHit","nextKey","maxDim","state","baseFont","selectAll","fontCache","wrapAny","cacheKey","heightIndex","desiredCanvasWidth","desiredCanvasHeight","nextWidth","nextHeight","scrollTop","scrollLeft","computeVisibleRange","contentTop","visibleStart","accum","visibleEnd","drawnHeight","totalRowsHeight","viewportHeight","dataViewportHeight","maxContentScrollTop","contentScrollTop","updates","nextH","dataXOffset","yCursor","rowH","idxText","lastFontKey","muted","mergedStyle","bg","renderAction","left","top","actionColor","isGlobalReadonly","hasExplicitTextColor","formulaReadonlyColor","isBoolean","isCustomBoolean","fontKey","weight","textAreaX","CELL_PADDING_X_PX","textAreaY","textAreaW","textAreaH","decorations","actionBounds","right","bottom","bw","bh","actionKey","isHover","isActive","xHeader","iconBox","ix","iy","yTop","xLeft","existing","heights","idToIndex","measuredVersion","cachedHeight","prev","wraps","widths","task","measured","start","headerHeight","accumHeight","topPx","rowTop","hit","ital","bounds","pad","rootRect","maxW","maxH","side","tRect","clientX","clientY","prevKey","prevIcon","nextIcon","changed","cursor","sameCell","sameMessage","nextHoverKey","handleRect","rawLines","lines","line","current","cut","firstKey","maxLines","minX","maxX","minY","maxY","lineWidth","startX","lineTop","lineBottom","fontBackup","totalTextHeight","baseY","renderLine","ln","lineIdx","baseline","endX","center","strokeBackup","lineWidthBackup","yUnderline","yStrike","CanvasRenderer","SelectionManager","onEdit","onRowSelect","onMove","hitTest","hitAction","sequenceLangs","isCellReadonly","onCellAction","onActiveChange","onContextMenu","onSelectionChange","onUndo","onRedo","fillSrc","handleRowIndex","handleColIndex","handleRow","handleCol","targetRow","targetCol","dx","dy","endRowIndex","suppressTrailingClick","payload","html","tsv","grid","ac","currentText","input","isMac","isTab","isEnter","isArrow","extend","wasSameCell","isSecondClick","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","baseIndex","fallbackRow","nextRow","nextRange","colType","initial","toast","inset","maxLeft","maxTop","minLeft","minTop","candidateLeft","candidateTop","message","variant","durationMs","valueForSelection","escapeFn","rowIdEsc","keyEsc","box","rowHeaderWidth","defaultRowHeight","active","headerEl","cellEl","htmlCell","metrics","xStart","xEnd","yStart","yEnd","leftVis","rightVis","topVis","bottomVis","deltaRow","deltaCol","extendSelection","anchor","nextRowIndex","nextColIndex","colHeader","endColIndex","nextEnd","threshold","maxStep","tick","raf","cb","raf2","getValue","commitNow","offset","cellCount","copyViaClipboardApi","item","copyViaFallbackInput","fallback","first","normalized","rowIdx","colIdx","linkAction","buttonAction","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","parseNumericText","coerced","coerceNumericForColumn","ta","allowCustom","select","empty","opt","op","listId","datalist","normalizeNumericInput","style","lineHeight","wrapper","insetX","insetTop","insetBottom","linkValue","nextValues","href","link","isRow","targetRange","anchorRow","anchorCol","anchorCell","sorted","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","isCheckbox","end","now","isTextarea","isAltEnter","commitAndMove","orig","norm","normalizedOrig","normalizedCurrent","clearActive","defineSchema","ExtableCore","init","defaultData","initialData","DataModel","classes","toArray","ua","shell","viewport","anyRO","force","host","action","_colKey","classNames","data","wasLoaded","rowIdOrIndex","found","pending","vv","rowData","position","insertAt","baseIdx","newId","removed","cmds","toKinds","seen","kinds","labelFor","commandCount","toSteps","groups","forcedId","handler","commands","error","msg","afterApply","touched","snapshots","snap","pop","actions","act","hr","viewportWidth","targetIndex","effective","applied","pendingCommands","pendingCommandCount","pendingCellCount","keys","validationErrors","diagnosticErrors","ar","br","bc","activeErrors","listener","errorsEqual","bt","activeValueRes","activeCondRes","activeTextOverride","activeValueRaw","activeValueDisplay","activeValueType","diagnostic","activeStyles","columnStyle","resolved","resolveCellStyles","reason","diagnostics","computed","unique","sr","er","sc","ec","aside","btnClose","cbErrors","cbWarnings","search","btnAll","btnNone","btnApply","btnClear","btnSortAsc","btnSortDesc","btnSortClear","prevSearch","distinct","selected","includeBlanks","title","draft","name","sort","filtered","existingFilters","nextFilters","nextDiagnostics","nextView","createTablePlaceholder","config","mountTable","core"],"mappings":"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AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EA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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/commandQueue.ts","../src/address.ts","../src/lockManager.ts","../../sequence/dist/index.js","../src/fillHandle.ts","../src/renderers.ts","../src/selectionManager.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import type { Command } from \"./types\";\n\ntype CommandGroup = { batchId: string | null; commands: Command[] };\nexport type CommandGroupSnapshot = { batchId: string | null; commands: Command[] };\n\nfunction getBatchId(cmd: Command) {\n const p = cmd.payload as Record<string, unknown> | null | undefined;\n if (!p) return null;\n const id = p.batchId;\n return typeof id === \"string\" && id.length ? id : null;\n}\n\nexport class CommandQueue {\n private applied: CommandGroup[] = [];\n private undone: CommandGroup[] = [];\n private cap: number;\n\n constructor(cap = 100) {\n this.cap = cap;\n }\n\n enqueue(command: Command) {\n const batchId = getBatchId(command);\n const last = this.applied.at(-1);\n if (batchId && last && last.batchId === batchId) {\n last.commands.push(command);\n } else {\n this.applied.push({ batchId, commands: [command] });\n }\n while (this.applied.length > this.cap) this.applied.shift();\n this.undone = [];\n }\n\n canUndo() {\n return this.applied.length > 0;\n }\n\n canRedo() {\n return this.undone.length > 0;\n }\n\n listApplied() {\n const out: Command[] = [];\n for (const group of this.applied) out.push(...group.commands);\n return out;\n }\n\n listUndoGroups(): CommandGroupSnapshot[] {\n // Return top = next undo.\n return this.applied\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n listRedoGroups(): CommandGroupSnapshot[] {\n // Return top = next redo.\n return this.undone\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n undo() {\n const group = this.applied.pop();\n if (group) this.undone.push(group);\n return group?.commands ?? null;\n }\n\n redo() {\n const group = this.undone.pop();\n if (group) this.applied.push(group);\n return group?.commands ?? null;\n }\n\n clear() {\n this.applied = [];\n this.undone = [];\n }\n}\n","import type { DataModel } from \"./dataModel\";\nimport type { CellAddress } from \"./types\";\n\nexport type ResolvedCellTarget = {\n rowId: string;\n colKey: string;\n rowIndex: number;\n colIndex: number;\n};\n\nexport function resolveCellAddress(dataModel: DataModel, address: CellAddress): ResolvedCellTarget | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n\n const resolveByIndex = (rowIndex: number, colIndex: number): ResolvedCellTarget | null => {\n if (!Number.isInteger(rowIndex) || !Number.isInteger(colIndex)) return null;\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n if (colIndex < 0 || colIndex >= schema.columns.length) return null;\n const row = rows[rowIndex]!;\n const col = schema.columns[colIndex]!;\n return { rowId: row.id, colKey: col.key, rowIndex, colIndex };\n };\n\n const resolveByKeys = (rowId: string, colKey: string): ResolvedCellTarget | null => {\n const rowIndex = dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (colIndex < 0) return null;\n return { rowId, colKey, rowIndex, colIndex };\n };\n\n if (\"rowId\" in address && \"colKey\" in address) {\n return resolveByKeys(address.rowId, address.colKey);\n }\n if (\"rowIndex\" in address && \"colIndex\" in address) {\n return resolveByIndex(address.rowIndex, address.colIndex);\n }\n if (\"rowId\" in address && \"colIndex\" in address) {\n const rowIndex = dataModel.getRowIndex(address.rowId);\n if (rowIndex < 0) return null;\n return resolveByIndex(rowIndex, address.colIndex);\n }\n if (\"rowIndex\" in address && \"colKey\" in address) {\n const colIndex = schema.columns.findIndex((c) => c.key === address.colKey);\n if (colIndex < 0) return null;\n return resolveByIndex(address.rowIndex, colIndex);\n }\n\n return null;\n}\n","import type { LockMode, ServerAdapter, UserInfo } from './types';\n\nexport class LockManager {\n private lockedRows = new Set<string>();\n private mode: LockMode = 'none';\n private server?: ServerAdapter;\n private user?: UserInfo;\n\n constructor(mode: LockMode, server?: ServerAdapter, user?: UserInfo) {\n this.mode = mode;\n this.server = server;\n this.user = user;\n }\n\n setMode(mode: LockMode) {\n this.mode = mode;\n }\n\n setUser(user?: UserInfo) {\n this.user = user;\n }\n\n async selectRow(rowId: string) {\n if (this.mode !== 'row') return;\n if (this.lockedRows.has(rowId)) return;\n this.lockedRows.add(rowId);\n if (this.server && this.user) {\n try {\n await this.server.lockRow(rowId, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('lockRow failed', e);\n }\n }\n }\n\n async unlockOnMove(currentRowId?: string) {\n if (this.mode !== 'row') return;\n if (!currentRowId) return;\n await this.unlockRows([currentRowId]);\n }\n\n async unlockOnCommit(keepRowId?: string) {\n if (this.mode !== 'row') return;\n const toUnlock: string[] = [];\n for (const id of this.lockedRows) {\n if (id !== keepRowId) toUnlock.push(id);\n }\n if (toUnlock.length) {\n await this.unlockRows(toUnlock);\n }\n }\n\n async unlockRows(rowIds: string[]) {\n for (const id of rowIds) this.lockedRows.delete(id);\n if (this.server && this.user) {\n try {\n await this.server.unlockRows(rowIds, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('unlockRows failed', e);\n }\n }\n }\n\n getLockedRows() {\n return new Set(this.lockedRows);\n }\n}\n","const g = (e) => e.trim().normalize(\"NFKC\").toLowerCase().replace(/\\s+/g, \" \"), V = (e) => {\n const t = [];\n if (e)\n for (const n of e) {\n const s = n.trim();\n !s || t.includes(s) || t.push(s);\n }\n return t.length === 0 ? t.push(\"en\") : t.includes(\"en\") || t.push(\"en\"), t;\n}, J = (e, t) => {\n const n = e.items.indexOf(t);\n if (n !== -1)\n return n;\n if (!e.aliases)\n return null;\n const s = e.aliases[t];\n if (!s)\n return null;\n const r = e.items.indexOf(s);\n return r === -1 ? null : r;\n}, R = (e, t) => {\n const n = g(t);\n if (g(e.id).includes(n))\n return !0;\n for (const s of e.items)\n if (g(s).includes(n))\n return !0;\n return e.aliases ? Object.keys(e.aliases).some(\n (s) => g(s).includes(n)\n ) : !1;\n}, D = (e, t) => {\n if (e.langs.length === 0)\n return 0;\n let n = Number.POSITIVE_INFINITY;\n for (const s of e.langs) {\n const r = t.indexOf(s);\n r !== -1 && r < n && (n = r);\n }\n return n;\n}, K = (e, t) => !e.langs || e.langs.length === 0 ? !0 : e.langs.some((n) => t.includes(n));\nclass z {\n constructor(t) {\n this.lists = [], this.matchers = [], this.langs = V(t?.langs);\n }\n register(t) {\n const n = this.lists.findIndex((s) => s.id === t.id);\n n === -1 ? this.lists.push(t) : this.lists[n] = t;\n }\n registerMatch(t) {\n const n = this.matchers.findIndex((s) => s.id === t.id);\n n === -1 ? this.matchers.push(t) : this.matchers[n] = t;\n }\n unregister(t) {\n this.lists = this.lists.filter((n) => n.id !== t), this.matchers = this.matchers.filter((n) => n.id !== t);\n }\n list(t) {\n let n = [...this.lists];\n if (t?.enabledIds && t.enabledIds.length > 0) {\n const r = new Set(t.enabledIds);\n n = n.filter((o) => r.has(o.id));\n }\n const s = t?.queryText;\n return s && (n = n.filter((r) => R(r, s))), n;\n }\n match(t, n) {\n if (t.length === 0)\n return null;\n let s = null, r = Number.NEGATIVE_INFINITY;\n const o = n?.enabledIds ? new Set(n.enabledIds) : null;\n for (const i of this.matchers) {\n if (o && !o.has(i.id) || !K(i, this.langs))\n continue;\n const a = i.match(t);\n if (!a)\n continue;\n const l = a.score;\n Number.isFinite(l) && l > r && (r = l, s = {\n kind: \"matcher\",\n matcher: i,\n step: a.step ?? 1,\n state: a.state\n });\n }\n const u = this.list(n).map((i) => ({ list: i, rank: D(i, this.langs) })).filter((i) => Number.isFinite(i.rank)).sort((i, a) => i.rank - a.rank);\n for (const { list: i, rank: a } of u) {\n const l = [];\n let c = !1;\n for (const P of t) {\n const k = J(i, P);\n if (k === null) {\n c = !0;\n break;\n }\n l.push(k);\n }\n if (c)\n continue;\n const f = this.inferStep(i, l);\n if (f === null)\n continue;\n const d = 10 - a;\n d > r && (r = d, s = {\n kind: \"list\",\n list: i,\n startIndex: l[l.length - 1] ?? 0,\n step: f\n });\n }\n return s;\n }\n inferStep(t, n) {\n if (n.length < 2)\n return 1;\n const s = t.items.length, r = this.stepBetween(t.mode, s, n[0], n[1]);\n if (r === null)\n return null;\n for (let o = 2; o < n.length; o += 1) {\n const u = this.nextIndex(t.mode, s, n[o - 1], r);\n if (u === null || u !== n[o])\n return null;\n }\n return r;\n }\n stepBetween(t, n, s, r) {\n if (t === \"cycle\")\n return (r - s + n) % n;\n const o = r - s;\n return o < 0 ? null : o;\n }\n nextIndex(t, n, s, r) {\n if (t === \"cycle\")\n return (s + r) % n;\n const o = s + r;\n return o >= n ? null : o;\n }\n}\nconst B = {\n id: \"weekdays-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n}, G = {\n id: \"weekdays-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n aliases: {\n Tues: \"Tue\",\n Thur: \"Thu\",\n Thurs: \"Thu\"\n }\n}, H = {\n id: \"weekdays-ja-long\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\", \"日曜日\"]\n}, U = {\n id: \"weekdays-ja-short\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜\", \"火曜\", \"水曜\", \"木曜\", \"金曜\", \"土曜\", \"日曜\"]\n}, Y = {\n id: \"weekdays-ja-single\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月\", \"火\", \"水\", \"木\", \"金\", \"土\", \"日\"]\n}, q = {\n id: \"months-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ]\n}, X = {\n id: \"months-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n aliases: {\n Sept: \"Sep\"\n }\n}, Q = {\n id: \"months-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"]\n}, Z = {\n id: \"months-ja-traditional\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"睦月\", \"如月\", \"弥生\", \"卯月\", \"皐月\", \"水無月\", \"文月\", \"葉月\", \"長月\", \"神無月\", \"霜月\", \"師走\"]\n}, _ = {\n id: \"quarters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n}, ee = {\n id: \"quarters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"第1四半期\", \"第2四半期\", \"第3四半期\", \"第4四半期\"]\n}, te = {\n id: \"zodiac-animals-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"子\", \"丑\", \"寅\", \"卯\", \"辰\", \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"]\n}, ne = {\n id: \"zodiac-signs-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Aries\",\n \"Taurus\",\n \"Gemini\",\n \"Cancer\",\n \"Leo\",\n \"Virgo\",\n \"Libra\",\n \"Scorpio\",\n \"Sagittarius\",\n \"Capricorn\",\n \"Aquarius\",\n \"Pisces\"\n ]\n}, se = {\n id: \"zodiac-signs-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"牡羊座\", \"牡牛座\", \"双子座\", \"蟹座\", \"獅子座\", \"乙女座\", \"天秤座\", \"蠍座\", \"射手座\", \"山羊座\", \"水瓶座\", \"魚座\"],\n aliases: {\n さそり座: \"蠍座\"\n }\n}, re = {\n id: \"directions-16-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"North\",\n \"North-Northeast\",\n \"Northeast\",\n \"East-Northeast\",\n \"East\",\n \"East-Southeast\",\n \"Southeast\",\n \"South-Southeast\",\n \"South\",\n \"South-Southwest\",\n \"Southwest\",\n \"West-Southwest\",\n \"West\",\n \"West-Northwest\",\n \"Northwest\",\n \"North-Northwest\"\n ]\n}, ie = {\n id: \"directions-16-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"北\",\n \"北北東\",\n \"北東\",\n \"東北東\",\n \"東\",\n \"東南東\",\n \"南東\",\n \"南南東\",\n \"南\",\n \"南南西\",\n \"南西\",\n \"西南西\",\n \"西\",\n \"西北西\",\n \"北西\",\n \"北北西\"\n ]\n}, oe = {\n id: \"ampm-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"AM\", \"PM\"],\n aliases: {\n \"A.M.\": \"AM\",\n \"P.M.\": \"PM\"\n }\n}, ae = {\n id: \"ampm-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"午前\", \"午後\"]\n}, ue = {\n id: \"seasons-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Spring\", \"Summer\", \"Autumn\", \"Winter\"],\n aliases: {\n Fall: \"Autumn\"\n }\n}, le = {\n id: \"seasons-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"春\", \"夏\", \"秋\", \"冬\"]\n}, ce = {\n id: \"solfege-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"ド\", \"レ\", \"ミ\", \"ファ\", \"ソ\", \"ラ\", \"シ\"]\n}, fe = {\n id: \"solfege-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Do\", \"Re\", \"Mi\", \"Fa\", \"Sol\", \"La\", \"Ti\"],\n aliases: {\n So: \"Sol\",\n Si: \"Ti\"\n }\n}, de = {\n id: \"greek-letters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Alpha\",\n \"Beta\",\n \"Gamma\",\n \"Delta\",\n \"Epsilon\",\n \"Zeta\",\n \"Eta\",\n \"Theta\",\n \"Iota\",\n \"Kappa\",\n \"Lambda\",\n \"Mu\",\n \"Nu\",\n \"Xi\",\n \"Omicron\",\n \"Pi\",\n \"Rho\",\n \"Sigma\",\n \"Tau\",\n \"Upsilon\",\n \"Phi\",\n \"Chi\",\n \"Psi\",\n \"Omega\"\n ]\n}, me = {\n id: \"greek-letters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"アルファ\",\n \"ベータ\",\n \"ガンマ\",\n \"デルタ\",\n \"イプシロン\",\n \"ゼータ\",\n \"イータ\",\n \"シータ\",\n \"イオタ\",\n \"カッパ\",\n \"ラムダ\",\n \"ミュー\",\n \"ニュー\",\n \"クサイ\",\n \"オミクロン\",\n \"パイ\",\n \"ロー\",\n \"シグマ\",\n \"タウ\",\n \"ウプシロン\",\n \"ファイ\",\n \"カイ\",\n \"プサイ\",\n \"オメガ\"\n ]\n}, he = {\n id: \"greek-letters-symbols\",\n mode: \"cycle\",\n langs: [\"en\", \"ja\"],\n items: [\n \"α\",\n \"β\",\n \"γ\",\n \"δ\",\n \"ε\",\n \"ζ\",\n \"η\",\n \"θ\",\n \"ι\",\n \"κ\",\n \"λ\",\n \"μ\",\n \"ν\",\n \"ξ\",\n \"ο\",\n \"π\",\n \"ρ\",\n \"σ\",\n \"τ\",\n \"υ\",\n \"φ\",\n \"χ\",\n \"ψ\",\n \"ω\"\n ],\n aliases: {\n ς: \"σ\"\n }\n}, ge = {\n id: \"rokuyo-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"先勝\", \"友引\", \"先負\", \"仏滅\", \"大安\", \"赤口\"]\n}, pe = {\n id: \"heavenly-stems-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"甲\", \"乙\", \"丙\", \"丁\", \"戊\", \"己\", \"庚\", \"辛\", \"壬\", \"癸\"]\n}, xe = {\n id: \"planets-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \"Uranus\", \"Neptune\"]\n}, ye = {\n id: \"planets-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"水星\", \"金星\", \"地球\", \"火星\", \"木星\", \"土星\", \"天王星\", \"海王星\"]\n}, be = {\n id: \"kuji-in-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"臨\", \"兵\", \"闘\", \"者\", \"皆\", \"陣\", \"烈\", \"在\", \"前\"]\n}, Se = {\n id: \"eight-virtues-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"仁\", \"義\", \"礼\", \"智\", \"忠\", \"信\", \"孝\", \"悌\"]\n}, je = {\n id: \"element-symbols\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"H\",\n \"He\",\n \"Li\",\n \"Be\",\n \"B\",\n \"C\",\n \"N\",\n \"O\",\n \"F\",\n \"Ne\",\n \"Na\",\n \"Mg\",\n \"Al\",\n \"Si\",\n \"P\",\n \"S\",\n \"Cl\",\n \"Ar\",\n \"K\",\n \"Ca\",\n \"Sc\",\n \"Ti\",\n \"V\",\n \"Cr\",\n \"Mn\",\n \"Fe\",\n \"Co\",\n \"Ni\",\n \"Cu\",\n \"Zn\",\n \"Ga\",\n \"Ge\",\n \"As\",\n \"Se\",\n \"Br\",\n \"Kr\",\n \"Rb\",\n \"Sr\",\n \"Y\",\n \"Zr\",\n \"Nb\",\n \"Mo\",\n \"Tc\",\n \"Ru\",\n \"Rh\",\n \"Pd\",\n \"Ag\",\n \"Cd\",\n \"In\",\n \"Sn\",\n \"Sb\",\n \"Te\",\n \"I\",\n \"Xe\",\n \"Cs\",\n \"Ba\",\n \"La\",\n \"Ce\",\n \"Pr\",\n \"Nd\",\n \"Pm\",\n \"Sm\",\n \"Eu\",\n \"Gd\",\n \"Tb\",\n \"Dy\",\n \"Ho\",\n \"Er\",\n \"Tm\",\n \"Yb\",\n \"Lu\",\n \"Hf\",\n \"Ta\",\n \"W\",\n \"Re\",\n \"Os\",\n \"Ir\",\n \"Pt\",\n \"Au\",\n \"Hg\",\n \"Tl\",\n \"Pb\",\n \"Bi\",\n \"Po\",\n \"At\",\n \"Rn\",\n \"Fr\",\n \"Ra\",\n \"Ac\",\n \"Th\",\n \"Pa\",\n \"U\",\n \"Np\",\n \"Pu\",\n \"Am\",\n \"Cm\",\n \"Bk\",\n \"Cf\",\n \"Es\",\n \"Fm\",\n \"Md\",\n \"No\",\n \"Lr\",\n \"Rf\",\n \"Db\",\n \"Sg\",\n \"Bh\",\n \"Hs\",\n \"Mt\",\n \"Ds\",\n \"Rg\",\n \"Cn\",\n \"Nh\",\n \"Fl\",\n \"Mc\",\n \"Lv\",\n \"Ts\",\n \"Og\"\n ]\n}, ke = {\n id: \"element-names-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"水素\",\n \"ヘリウム\",\n \"リチウム\",\n \"ベリリウム\",\n \"ホウ素\",\n \"炭素\",\n \"窒素\",\n \"酸素\",\n \"フッ素\",\n \"ネオン\",\n \"ナトリウム\",\n \"マグネシウム\",\n \"アルミニウム\",\n \"ケイ素\",\n \"リン\",\n \"硫黄\",\n \"塩素\",\n \"アルゴン\",\n \"カリウム\",\n \"カルシウム\",\n \"スカンジウム\",\n \"チタン\",\n \"バナジウム\",\n \"クロム\",\n \"マンガン\",\n \"鉄\",\n \"コバルト\",\n \"ニッケル\",\n \"銅\",\n \"亜鉛\",\n \"ガリウム\",\n \"ゲルマニウム\",\n \"ヒ素\",\n \"セレン\",\n \"臭素\",\n \"クリプトン\",\n \"ルビジウム\",\n \"ストロンチウム\",\n \"イットリウム\",\n \"ジルコニウム\",\n \"ニオブ\",\n \"モリブデン\",\n \"テクネチウム\",\n \"ルテニウム\",\n \"ロジウム\",\n \"パラジウム\",\n \"銀\",\n \"カドミウム\",\n \"インジウム\",\n \"スズ\",\n \"アンチモン\",\n \"テルル\",\n \"ヨウ素\",\n \"キセノン\",\n \"セシウム\",\n \"バリウム\",\n \"ランタン\",\n \"セリウム\",\n \"プラセオジム\",\n \"ネオジム\",\n \"プロメチウム\",\n \"サマリウム\",\n \"ユウロピウム\",\n \"ガドリニウム\",\n \"テルビウム\",\n \"ジスプロシウム\",\n \"ホルミウム\",\n \"エルビウム\",\n \"ツリウム\",\n \"イッテルビウム\",\n \"ルテチウム\",\n \"ハフニウム\",\n \"タンタル\",\n \"タングステン\",\n \"レニウム\",\n \"オスミウム\",\n \"イリジウム\",\n \"白金\",\n \"金\",\n \"水銀\",\n \"タリウム\",\n \"鉛\",\n \"ビスマス\",\n \"ポロニウム\",\n \"アスタチン\",\n \"ラドン\",\n \"フランシウム\",\n \"ラジウム\",\n \"アクチニウム\",\n \"トリウム\",\n \"プロトアクチニウム\",\n \"ウラン\",\n \"ネプツニウム\",\n \"プルトニウム\",\n \"アメリシウム\",\n \"キュリウム\",\n \"バークリウム\",\n \"カリホルニウム\",\n \"アインスタイニウム\",\n \"フェルミウム\",\n \"メンデレビウム\",\n \"ノーベリウム\",\n \"ローレンシウム\",\n \"ラザホージウム\",\n \"ドブニウム\",\n \"シーボーギウム\",\n \"ボーリウム\",\n \"ハッシウム\",\n \"マイトネリウム\",\n \"ダームスタチウム\",\n \"レントゲニウム\",\n \"コペルニシウム\",\n \"ニホニウム\",\n \"フレロビウム\",\n \"モスコビウム\",\n \"リバモリウム\",\n \"テネシン\",\n \"オガネソン\"\n ]\n}, we = {\n id: \"shoguns-kamakura-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"源頼朝\",\n \"源頼家\",\n \"源実朝\",\n \"九条頼経\",\n \"九条頼嗣\",\n \"宗尊親王\",\n \"惟康親王\",\n \"久明親王\",\n \"守邦親王\"\n ]\n}, Ne = {\n id: \"shoguns-ashikaga-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"足利尊氏\",\n \"足利義詮\",\n \"足利義満\",\n \"足利義持\",\n \"足利義量\",\n \"足利義教\",\n \"足利義勝\",\n \"足利義政\",\n \"足利義尚\",\n \"足利義稙\",\n \"足利義澄\",\n \"足利義晴\",\n \"足利義輝\",\n \"足利義栄\",\n \"足利義昭\"\n ]\n}, Ie = {\n id: \"shoguns-ashikaga-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"尊氏\",\n \"義詮\",\n \"義満\",\n \"義持\",\n \"義量\",\n \"義教\",\n \"義勝\",\n \"義政\",\n \"義尚\",\n \"義稙\",\n \"義澄\",\n \"義晴\",\n \"義輝\",\n \"義栄\",\n \"義昭\"\n ]\n}, Te = {\n id: \"shoguns-tokugawa-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"徳川家康\",\n \"徳川秀忠\",\n \"徳川家光\",\n \"徳川家綱\",\n \"徳川綱吉\",\n \"徳川家宣\",\n \"徳川家継\",\n \"徳川吉宗\",\n \"徳川家重\",\n \"徳川家治\",\n \"徳川家斉\",\n \"徳川家慶\",\n \"徳川家定\",\n \"徳川家茂\",\n \"徳川慶喜\"\n ]\n}, Me = {\n id: \"shoguns-tokugawa-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"家康\",\n \"秀忠\",\n \"家光\",\n \"家綱\",\n \"綱吉\",\n \"家宣\",\n \"家継\",\n \"吉宗\",\n \"家重\",\n \"家治\",\n \"家斉\",\n \"家慶\",\n \"家定\",\n \"家茂\",\n \"慶喜\"\n ]\n}, T = [\n \"北海道\",\n \"青森県\",\n \"岩手県\",\n \"宮城県\",\n \"秋田県\",\n \"山形県\",\n \"福島県\",\n \"茨城県\",\n \"栃木県\",\n \"群馬県\",\n \"埼玉県\",\n \"千葉県\",\n \"東京都\",\n \"神奈川県\",\n \"新潟県\",\n \"富山県\",\n \"石川県\",\n \"福井県\",\n \"山梨県\",\n \"長野県\",\n \"岐阜県\",\n \"静岡県\",\n \"愛知県\",\n \"三重県\",\n \"滋賀県\",\n \"京都府\",\n \"大阪府\",\n \"兵庫県\",\n \"奈良県\",\n \"和歌山県\",\n \"鳥取県\",\n \"島根県\",\n \"岡山県\",\n \"広島県\",\n \"山口県\",\n \"徳島県\",\n \"香川県\",\n \"愛媛県\",\n \"高知県\",\n \"福岡県\",\n \"佐賀県\",\n \"長崎県\",\n \"熊本県\",\n \"大分県\",\n \"宮崎県\",\n \"鹿児島県\",\n \"沖縄県\"\n], Ae = T.reduce(\n (e, t) => {\n if (t === \"北海道\")\n return e;\n if (/[都府県]$/.test(t)) {\n const n = t.slice(0, -1);\n e[n] = t;\n }\n return e;\n },\n {}\n), ve = {\n id: \"prefectures-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: T,\n aliases: Ae\n}, Le = {\n id: \"us-states-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"Alabama\",\n \"Alaska\",\n \"Arizona\",\n \"Arkansas\",\n \"California\",\n \"Colorado\",\n \"Connecticut\",\n \"Delaware\",\n \"Florida\",\n \"Georgia\",\n \"Hawaii\",\n \"Idaho\",\n \"Illinois\",\n \"Indiana\",\n \"Iowa\",\n \"Kansas\",\n \"Kentucky\",\n \"Louisiana\",\n \"Maine\",\n \"Maryland\",\n \"Massachusetts\",\n \"Michigan\",\n \"Minnesota\",\n \"Mississippi\",\n \"Missouri\",\n \"Montana\",\n \"Nebraska\",\n \"Nevada\",\n \"New Hampshire\",\n \"New Jersey\",\n \"New Mexico\",\n \"New York\",\n \"North Carolina\",\n \"North Dakota\",\n \"Ohio\",\n \"Oklahoma\",\n \"Oregon\",\n \"Pennsylvania\",\n \"Rhode Island\",\n \"South Carolina\",\n \"South Dakota\",\n \"Tennessee\",\n \"Texas\",\n \"Utah\",\n \"Vermont\",\n \"Virginia\",\n \"Washington\",\n \"West Virginia\",\n \"Wisconsin\",\n \"Wyoming\"\n ]\n}, Ee = {\n id: \"us-states-abbrev-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\"\n ]\n}, We = {\n id: \"windows-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Windows 1.0\",\n \"Windows 2.0\",\n \"Windows 2.1\",\n \"Windows 3.0\",\n \"Windows 3.1\",\n \"Windows 3.11\",\n \"Windows 95\",\n \"Windows 98\",\n \"Windows 98 SE\",\n \"Windows Me\",\n \"Windows XP\",\n \"Windows Vista\",\n \"Windows 7\",\n \"Windows 8\",\n \"Windows 8.1\",\n \"Windows 10\",\n \"Windows 11\"\n ]\n}, Ce = {\n id: \"macos-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Cheetah\",\n \"Puma\",\n \"Jaguar\",\n \"Panther\",\n \"Tiger\",\n \"Leopard\",\n \"Snow Leopard\",\n \"Lion\",\n \"Mountain Lion\",\n \"Mavericks\",\n \"Yosemite\",\n \"El Capitan\",\n \"Sierra\",\n \"High Sierra\",\n \"Mojave\",\n \"Catalina\",\n \"Big Sur\",\n \"Monterey\",\n \"Ventura\",\n \"Sonoma\",\n \"Sequoia\",\n \"Tahoe\"\n ]\n}, Oe = {\n id: \"debian-codenames\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"buzz\",\n \"rex\",\n \"bo\",\n \"hamm\",\n \"slink\",\n \"potato\",\n \"woody\",\n \"sarge\",\n \"etch\",\n \"lenny\",\n \"squeeze\",\n \"wheezy\",\n \"jessie\",\n \"stretch\",\n \"buster\",\n \"bullseye\",\n \"bookworm\",\n \"trixie\"\n ]\n}, $e = [\n B,\n G,\n H,\n U,\n Y,\n q,\n X,\n Q,\n Z,\n _,\n ee,\n te,\n ne,\n se,\n re,\n ie,\n oe,\n ae,\n ue,\n le,\n ce,\n fe,\n de,\n me,\n he,\n ge,\n pe,\n xe,\n ye,\n be,\n Se,\n je,\n ke,\n we,\n Ne,\n Ie,\n Te,\n Me,\n ve,\n Le,\n Ee,\n We,\n Ce,\n Oe\n], p = (e) => {\n const t = e % 100;\n if (t >= 11 && t <= 13) return \"th\";\n const n = e % 10;\n return n === 1 ? \"st\" : n === 2 ? \"nd\" : n === 3 ? \"rd\" : \"th\";\n}, x = {\n 1: \"first\",\n 2: \"second\",\n 3: \"third\",\n 4: \"fourth\",\n 5: \"fifth\",\n 6: \"sixth\",\n 7: \"seventh\",\n 8: \"eighth\",\n 9: \"ninth\",\n 10: \"tenth\",\n 11: \"eleventh\",\n 12: \"twelfth\",\n 13: \"thirteenth\",\n 14: \"fourteenth\",\n 15: \"fifteenth\",\n 16: \"sixteenth\",\n 17: \"seventeenth\",\n 18: \"eighteenth\",\n 19: \"nineteenth\"\n}, y = {\n 20: \"twentieth\",\n 30: \"thirtieth\",\n 40: \"fortieth\",\n 50: \"fiftieth\",\n 60: \"sixtieth\",\n 70: \"seventieth\",\n 80: \"eightieth\",\n 90: \"ninetieth\"\n}, M = {\n 20: \"twenty\",\n 30: \"thirty\",\n 40: \"forty\",\n 50: \"fifty\",\n 60: \"sixty\",\n 70: \"seventy\",\n 80: \"eighty\",\n 90: \"ninety\"\n}, w = Object.fromEntries(\n Object.entries(x).map(([e, t]) => [t, Number(e)])\n), Fe = Object.fromEntries(\n Object.entries(y).map(([e, t]) => [t, Number(e)])\n), Pe = Object.fromEntries(\n Object.entries(M).map(([e, t]) => [t, Number(e)])\n), A = (e) => {\n const t = e.trim().toLowerCase();\n if (!t) return null;\n const n = w[t] ?? Fe[t];\n if (n) return n;\n const s = t.split(/[-\\s]+/);\n if (s.length !== 2) return null;\n const r = Pe[s[0] ?? \"\"], o = w[s[1] ?? \"\"];\n return !r || !o ? null : r + o;\n}, v = (e) => {\n if (!Number.isFinite(e) || e <= 0 || Math.floor(e) !== e) return null;\n if (e <= 19) return x[e] ?? null;\n if (e < 100) {\n if (y[e]) return y[e] ?? null;\n const t = Math.floor(e / 10) * 10, n = e % 10, s = M[t], r = x[n];\n return !s || !r ? null : `${s}-${r}`;\n }\n return null;\n}, N = (e) => {\n const t = /^(\\d+)(st|nd|rd|th)$/i.exec(e);\n if (t) {\n const s = Number(t[1]);\n if (!Number.isFinite(s) || s <= 0) return null;\n const r = t[2]?.toLowerCase();\n return p(s) !== r ? null : { value: s, format: \"numeric\" };\n }\n const n = A(e);\n return n !== null ? { value: n, format: \"word\" } : null;\n}, Ve = {\n id: \"ordinal-en\",\n langs: [\"en\"],\n match(e) {\n if (e.length < 2) return null;\n const t = e.map((o) => N(o));\n if (t.some((o) => o === null)) return null;\n const n = t[0].format;\n if (t.some((o) => o?.format !== n)) return null;\n const s = t.map((o) => o.value), r = s[1] - s[0];\n for (let o = 2; o < s.length; o += 1)\n if (s[o] - s[o - 1] !== r) return null;\n return { score: 80, step: r, state: { format: n } };\n },\n createIterator(e, t) {\n const n = N(e[e.length - 1] ?? \"\"), s = t.state?.format ?? \"numeric\";\n let r = n?.value ?? 0;\n return {\n next() {\n if (r += t.step, r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (s === \"word\") {\n const o = v(r);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n return { value: `${r}${p(r)}`, done: !1 };\n }\n };\n }\n}, Je = (e) => {\n for (const t of $e)\n e.register(t);\n}, Re = (e) => {\n e.registerMatch(Ve);\n}, De = (e) => {\n const t = e ?? [\"en\", \"ja\"], n = new z({ langs: t });\n return Je(n), Re(n), n;\n}, Ke = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n};\nclass m {\n constructor(...t) {\n const n = t;\n this.seed = n, this.kind = n.length === 1 ? \"copy\" : \"seed-repeat\", this.iterator = Ke(n);\n }\n static fromSeed(t, n, s) {\n const r = new m(...t);\n return r.kind = n, r.iterator = s, r;\n }\n next() {\n return this.iterator.next();\n }\n [Symbol.iterator]() {\n return this;\n }\n}\nconst L = 1e-9, ze = 100, Be = (e) => ({\n next() {\n return { value: e, done: !1 };\n }\n}), I = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n}, Ge = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e + t * n, done: !1 };\n }\n };\n}, He = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: new Date(e.getTime() + t * n), done: !1 };\n }\n };\n}, Ue = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e * t ** n, done: !1 };\n }\n };\n}, Ye = (e, t) => {\n if (e.kind === \"matcher\")\n return e.matcher.createIterator(t, { step: e.step, state: e.state });\n const { list: n, startIndex: s, step: r } = e, o = n.items.length;\n let u = s;\n return {\n next() {\n if (n.mode === \"finite\") {\n const i = u + r;\n return i >= o ? { value: void 0, done: !0 } : (u = i, { value: n.items[u], done: !1 });\n }\n return u = (u + r) % o, { value: n.items[u], done: !1 };\n }\n };\n}, qe = (e) => e.every((t) => typeof t == \"number\" && Number.isFinite(t)), Xe = (e) => e.every((t) => t instanceof Date && !Number.isNaN(t.getTime())), Qe = (e) => e.every((t) => typeof t == \"string\"), Ze = (e) => {\n const t = /^(.*?)(-?\\d+)([^0-9]*)$/.exec(e);\n if (!t)\n return null;\n const n = t[1] ?? \"\", s = t[2] ?? \"\", r = t[3] ?? \"\", o = Number(s);\n if (!Number.isFinite(o))\n return null;\n const u = s.replace(\"-\", \"\").length;\n return { prefix: n, num: o, width: u, suffix: r };\n}, _e = (e) => {\n const t = /^(.*?)(\\d+)(st|nd|rd|th)([^0-9]*)$/i.exec(e);\n if (t) {\n const r = Number(t[2]);\n if (!Number.isFinite(r) || r <= 0) return null;\n const o = t[3]?.toLowerCase();\n return p(r) !== o ? null : {\n prefix: t[1] ?? \"\",\n num: r,\n suffix: t[4] ?? \"\",\n format: \"numeric\"\n };\n }\n const n = /^(.*?)([A-Za-z-]+)([^A-Za-z]*)$/.exec(e);\n if (!n) return null;\n const s = A(n[2] ?? \"\");\n return s === null ? null : {\n prefix: n[1] ?? \"\",\n num: s,\n suffix: n[3] ?? \"\",\n format: \"word\"\n };\n}, et = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s;\n if (r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (e.format === \"word\") {\n const o = v(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n return {\n value: `${e.prefix}${r}${p(r)}${e.suffix}`,\n done: !1\n };\n }\n };\n}, tt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = r < 0 ? \"-\" : \"\", u = Math.abs(r).toString().padStart(e.width, \"0\");\n return { value: `${e.prefix}${o}${u}${e.suffix}`, done: !1 };\n }\n };\n}, E = [\n [\"C\", 100],\n [\"XC\", 90],\n [\"L\", 50],\n [\"XL\", 40],\n [\"X\", 10],\n [\"IX\", 9],\n [\"V\", 5],\n [\"IV\", 4],\n [\"I\", 1]\n], j = (e) => {\n if (e < 1 || e > ze)\n return null;\n let t = e, n = \"\";\n for (const [s, r] of E)\n for (; t >= r; )\n n += s, t -= r;\n return n;\n}, W = (e) => {\n if (e.length === 0 || e !== e.toUpperCase())\n return null;\n let t = e, n = 0;\n for (const [r, o] of E)\n for (; t.startsWith(r); )\n n += o, t = t.slice(r.length);\n if (t.length > 0)\n return null;\n const s = j(n);\n return !s || s !== e ? null : n;\n}, nt = (e, t) => {\n let n = 0;\n return {\n next() {\n n += 1;\n const s = e + t * n, r = j(s);\n return r ? { value: r, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, st = (e) => new RegExp(\"\\\\p{White_Space}\", \"u\").test(e) ? \"space\" : new RegExp(\"\\\\p{P}\", \"u\").test(e) ? \"punct\" : new RegExp(\"\\\\p{S}\", \"u\").test(e) ? \"symbol\" : new RegExp(\"\\\\p{Script=Latin}\", \"u\").test(e) ? \"latin\" : new RegExp(\"\\\\p{Script=Han}\", \"u\").test(e) ? \"han\" : new RegExp(\"\\\\p{Script=Hiragana}\", \"u\").test(e) ? \"hiragana\" : new RegExp(\"\\\\p{Script=Katakana}\", \"u\").test(e) ? \"katakana\" : new RegExp(\"\\\\p{N}\", \"u\").test(e) ? \"number\" : \"other\", rt = (e) => {\n const t = [];\n let n = \"\", s = null;\n for (const r of e) {\n const o = st(r);\n if (s === o) {\n n += r;\n continue;\n }\n s !== null && t.push({ value: n, group: s }), n = r, s = o;\n }\n return s !== null && t.push({ value: n, group: s }), t;\n}, it = (e) => {\n const t = rt(e), n = t.map((i, a) => ({ index: a, num: W(i.value) })).filter((i) => i.num !== null);\n if (n.length !== 1)\n return null;\n const s = n[0].index, r = n[0].num, o = t.slice(0, s).map((i) => i.value).join(\"\"), u = t.slice(s + 1).map((i) => i.value).join(\"\");\n return { prefix: o, num: r, suffix: u };\n}, ot = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = j(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, b = {\n 一: 1,\n 二: 2,\n 三: 3,\n 四: 4,\n 五: 5,\n 六: 6,\n 七: 7,\n 八: 8,\n 九: 9\n}, S = {\n 壱: 1,\n 弐: 2,\n 参: 3,\n 肆: 4,\n 伍: 5,\n 陸: 6,\n 柒: 7,\n 捌: 8,\n 玖: 9\n}, C = {\n 十: 10,\n 拾: 10,\n 百: 100,\n 佰: 100,\n 千: 1e3,\n 仟: 1e3\n}, O = {\n 万: 1e4,\n 萬: 1e4\n}, at = /* @__PURE__ */ new Set([\n ...Object.keys(b),\n ...Object.keys(S),\n ...Object.keys(C),\n ...Object.keys(O)\n]), ut = (e) => at.has(e), lt = (e) => /[壱弐参肆伍陸柒捌玖拾萬佰仟]/.test(e) ? \"traditional\" : \"modern\", $ = (e) => {\n if (!e)\n return null;\n const t = lt(e);\n if (e.includes(\"万\") || e.includes(\"萬\")) {\n const i = /^([一二三四五六七八九壱弐参肆伍陸柒捌玖])?(万|萬)$/.exec(e);\n if (!i)\n return null;\n const a = i[1];\n return a ? (b[a] ?? S[a]) !== 1 ? null : { num: 1e4, style: t } : { num: 1e4, style: t };\n }\n let s = 0, r = 0, o = Number.POSITIVE_INFINITY, u = !1;\n for (const i of e) {\n const a = b[i] ?? S[i];\n if (a) {\n if (u)\n return null;\n r = a, u = !0;\n continue;\n }\n const l = C[i];\n if (l) {\n if (l >= o)\n return null;\n r === 0 && (r = 1), s += r * l, r = 0, o = l, u = !1;\n continue;\n }\n return O[i], null;\n }\n return s += r, s <= 0 || s > 1e4 ? null : { num: s, style: t };\n}, ct = (e) => {\n const t = [];\n let n = \"\", s = 0, r = 0;\n for (const l of e)\n ut(l) ? (n || (s = r), n += l) : n && (t.push({ start: s, end: r, text: n }), n = \"\"), r += l.length;\n n && t.push({ start: s, end: r, text: n });\n const o = t.map((l) => ({ run: l, parsed: $(l.text) })).filter((l) => l.parsed !== null);\n if (o.length !== 1)\n return null;\n const u = o[0], i = e.slice(0, u.run.start), a = e.slice(u.run.end);\n return {\n prefix: i,\n num: u.parsed.num,\n suffix: a,\n style: u.parsed.style\n };\n}, F = (e, t) => {\n if (!Number.isFinite(e) || e <= 0 || e > 1e4)\n return null;\n const n = t === \"traditional\" ? [\"\", \"壱\", \"弐\", \"参\", \"肆\", \"伍\", \"陸\", \"柒\", \"捌\", \"玖\"] : [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"], s = t === \"traditional\" ? \"拾\" : \"十\", r = t === \"traditional\" ? \"萬\" : \"万\";\n if (e === 1e4)\n return `${n[1]}${r}`;\n let o = e, u = \"\";\n const i = Math.floor(o / 1e3);\n i > 0 && (i > 1 && (u += n[i]), u += \"千\", o %= 1e3);\n const a = Math.floor(o / 100);\n a > 0 && (a > 1 && (u += n[a]), u += \"百\", o %= 100);\n const l = Math.floor(o / 10);\n return l > 0 && (l > 1 && (u += n[l]), u += s, o %= 10), o > 0 && (u += n[o]), u || null;\n}, ft = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = e + t * s, o = F(r, n);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, dt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = F(r, e.style);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, h = (e) => {\n if (e.length < 2)\n return null;\n const t = e[1] - e[0];\n for (let n = 2; n < e.length; n += 1)\n if (Math.abs(e[n] - e[n - 1] - t) > L)\n return null;\n return t;\n}, mt = (e) => {\n if (e.length < 2 || e[0] === 0)\n return null;\n const t = e[1] / e[0];\n for (let n = 2; n < e.length; n += 1)\n if (e[n - 1] === 0 || Math.abs(e[n] / e[n - 1] - t) > L)\n return null;\n return t;\n}, ht = (e) => {\n const t = e.map((i) => _e(i));\n if (t.every((i) => i !== null)) {\n const i = t, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.format === a.format\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: et(\n { prefix: a.prefix, suffix: a.suffix, format: a.format },\n d.num,\n f\n )\n };\n }\n }\n }\n const n = e.map((i) => Ze(i));\n if (n.every(Boolean)) {\n const i = n[0], a = n[n.length - 1];\n if (n.every(\n (c) => c?.prefix === i.prefix && c?.suffix === i.suffix\n )) {\n const c = n.map((d) => d?.num ?? 0), f = h(c);\n if (f !== null)\n return {\n kind: \"arithmetic\",\n iterator: tt(\n { prefix: a.prefix, suffix: a.suffix, width: a.width },\n a.num,\n f\n )\n };\n }\n }\n const s = e.map((i) => W(i));\n if (s.every((i) => i !== null)) {\n const i = s, a = h(i);\n if (a !== null) {\n const l = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: nt(l, a)\n };\n }\n }\n const r = e.map((i) => $(i));\n if (r.every((i) => i !== null)) {\n const i = r, a = i[0].style;\n if (i.every((l) => l.style === a)) {\n const l = i.map((f) => f.num), c = h(l);\n if (c !== null) {\n const f = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ft(f.num, c, f.style)\n };\n }\n }\n }\n const o = e.map((i) => it(i));\n if (o.every((i) => i !== null)) {\n const i = o, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = c[c.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ot(\n { prefix: a.prefix, suffix: a.suffix },\n d,\n f\n )\n };\n }\n }\n }\n const u = e.map((i) => ct(i));\n if (u.every((i) => i !== null)) {\n const i = u, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.style === a.style\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: dt(\n { prefix: a.prefix, suffix: a.suffix, style: a.style },\n d.num,\n f\n )\n };\n }\n }\n }\n return null;\n}, gt = (e, t) => {\n const n = t.match(e);\n return n ? {\n kind: \"list\",\n iterator: Ye(n, e)\n } : null;\n};\nfunction pt(e, t) {\n const n = t?.registry ?? De();\n if (e.length === 0)\n return m.fromSeed(e, \"seed-repeat\", I(e));\n if (e.length === 1)\n return m.fromSeed(e, \"copy\", Be(e[0]));\n if (Qe(e)) {\n const s = gt(e, n);\n if (s)\n return m.fromSeed(e, s.kind, s.iterator);\n const r = ht(e);\n if (r)\n return m.fromSeed(e, r.kind, r.iterator);\n }\n if (qe(e)) {\n const s = h(e);\n if (s !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n Ge(e[e.length - 1], s)\n );\n const r = mt(e);\n if (r !== null)\n return m.fromSeed(\n e,\n \"geometric\",\n Ue(e[e.length - 1], r)\n );\n }\n if (Xe(e)) {\n const s = e.map((o) => o.getTime()), r = h(s);\n if (r !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n He(e[e.length - 1], r)\n );\n }\n return m.fromSeed(e, \"seed-repeat\", I(e));\n}\nexport {\n m as Sequence,\n z as SequenceRegistry,\n De as createBuiltInRegistry,\n v as formatEnglishOrdinalWord,\n pt as inferSequence,\n p as ordinalSuffix,\n A as parseEnglishOrdinalWord,\n Je as registerBuiltInLists,\n Re as registerBuiltInMatchers\n};\n//# sourceMappingURL=index.js.map\n","import type { DataModel } from \"./dataModel\";\nimport type { EditMode, SelectionRange } from \"./types\";\nimport { createBuiltInRegistry, inferSequence } from \"@extable/sequence\";\n\nexport type FillHandleMode = 'copy' | 'sequence';\n\nexport interface FillHandleSource {\n colKey: string;\n colIndex: number;\n startRowIndex: number;\n endRowIndex: number;\n mode: FillHandleMode;\n}\n\nfunction normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol)\n };\n}\n\nfunction coerceToTime(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const s = value.trim();\n if (/^\\d{1,2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?$/.test(s)) {\n const d = new Date(`1970-01-01T${s}`);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(s);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction coerceToDate(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function getFillHandleSource(dataModel: DataModel, ranges: SelectionRange[]): FillHandleSource | null {\n if (ranges.length !== 1) return null;\n const range = normalizeRange(ranges[0]!);\n if (range.kind !== 'cells') return null;\n const width = range.endCol - range.startCol + 1;\n const height = range.endRow - range.startRow + 1;\n if (width !== 1) return null;\n if (height < 1) return null;\n\n const schema = dataModel.getSchema();\n const col = schema.columns[range.startCol];\n if (!col) return null;\n\n if (height === 1) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'copy'\n };\n }\n\n if (col.type === 'boolean') {\n return null;\n }\n\n if (\n col.type === 'number' ||\n col.type === 'date' ||\n col.type === 'time' ||\n col.type === 'datetime' ||\n col.type === 'string'\n ) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'sequence'\n };\n }\n\n // enum/tags: sequence not supported (copy only, but 2-cell handle should not appear)\n return null;\n}\n\nexport function makeFillValueGetter(\n dataModel: DataModel,\n source: FillHandleSource,\n langs?: readonly string[]\n): ((offsetFromEnd: number) => unknown) | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return null;\n const seed: unknown[] = [];\n for (let r = source.startRowIndex; r <= source.endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) return null;\n seed.push(dataModel.getCell(row.id, col.key));\n }\n\n if (source.mode === 'copy') {\n const last = seed[seed.length - 1];\n return () => last;\n }\n\n const registry = createBuiltInRegistry(langs);\n if (col.type === 'number') {\n const numbers = seed.map((value) => (typeof value === 'number' ? value : Number(value)));\n if (!numbers.every((value) => Number.isFinite(value))) return null;\n const seq = inferSequence(numbers, { registry });\n const cache: number[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n const dates = seed.map((value) =>\n col.type === 'time' ? coerceToTime(value) : coerceToDate(value)\n );\n if (!dates.every((value) => value instanceof Date)) return null;\n const seq = inferSequence(dates as Date[], { registry });\n const cache: Date[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'string') {\n const strings = seed.map((value) => String(value ?? ''));\n const seq = inferSequence(strings, { registry });\n const cache: string[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n return null;\n}\n\nexport const FILL_HANDLE_VISUAL_SIZE_PX = 12;\nexport const FILL_HANDLE_HIT_SIZE_PX = 14;\n\nexport function getFillHandleRect(cellRect: DOMRect, size = FILL_HANDLE_VISUAL_SIZE_PX): DOMRect {\n return new DOMRect(cellRect.right - size - 1, cellRect.bottom - size - 1, size, size);\n}\n\nexport function isPointInRect(x: number, y: number, rect: DOMRect) {\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nexport function shouldShowFillHandle(\n dataModel: DataModel,\n ranges: SelectionRange[],\n activeRowId: string | null,\n activeColKey: string | null,\n editMode: EditMode,\n): boolean {\n if (editMode === \"readonly\") return false;\n const src = getFillHandleSource(dataModel, ranges);\n if (!src) return false;\n if (!activeRowId || activeRowId === '__all__') return false;\n if (activeColKey === null) return false;\n if (activeColKey === '__all__' || activeColKey === null) return false;\n if (activeColKey !== src.colKey) return false;\n if (dataModel.isReadonly(activeRowId, activeColKey)) return false;\n return true;\n}\n","import type { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n NumberFormat,\n IntegerFormat,\n SelectionRange,\n View,\n ViewFilterValues,\n EditMode,\n} from \"./types\";\nimport { coerceDatePattern, formatDateLite, parseIsoDate } from \"./dateUtils\";\nimport { toRawValue } from \"./cellValueCodec\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n FILL_HANDLE_VISUAL_SIZE_PX,\n getFillHandleRect,\n isPointInRect,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport { columnFormatToStyle, mergeStyle, styleToCssText } from \"./styleResolver\";\nimport { getButtonLabel, getLinkLabel, resolveButtonAction, resolveLinkAction } from \"./actionValue\";\nimport { formatIntegerWithPrefix, formatNumberForEdit } from \"./numberIO\";\n\nconst CANVAS_FONT_FAMILY = '\"Inter\",\"Segoe UI\",system-ui,-apple-system,\"Helvetica Neue\",sans-serif';\n// Canvas text tends to render slightly larger than HTML with the same nominal size.\n// Use a smaller size to reduce visual weight on canvas; set approximately half of prior size.\nconst CANVAS_FONT_SIZE_PX = 13.5;\nconst UNIQUE_BOOL_FONT_SIZE_PX = 10;\n\nfunction getColumnSortDir(view: View, colKey: string): \"asc\" | \"desc\" | null {\n const s = view.sorts?.[0];\n if (!s) return null;\n return s.key === colKey ? s.dir : null;\n}\n\nfunction hasActiveColumnFilter(view: View, colKey: string): boolean {\n const hasValues = (view.filters ?? []).some((f) => {\n const vf = f as ViewFilterValues;\n return vf?.kind === \"values\" && vf.key === colKey;\n });\n if (hasValues) return true;\n const diag = view.columnDiagnostics?.[colKey];\n return Boolean(diag?.errors || diag?.warnings);\n}\n\nfunction svgFunnel() {\n // Simple funnel icon (stroke only) for filter affordance.\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 5h18l-7 8v6l-4 2v-8L3 5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n </svg>\n `.trim();\n}\n\nfunction svgArrow(dir: \"asc\" | \"desc\") {\n const d = dir === \"asc\" ? \"M12 6l6 8H6l6-8z\" : \"M12 18l-6-8h12l-6 8z\";\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"${d}\" fill=\"currentColor\"/>\n </svg>\n `.trim();\n}\n\nfunction drawDiagnosticCorner(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n level: \"warning\" | \"error\",\n) {\n const size = Math.min(10, Math.floor(Math.min(w, h) / 2));\n if (size <= 0) return;\n const color = level === \"error\" ? \"#ef4444\" : \"#f59e0b\";\n ctx.save();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x + w, y);\n ctx.lineTo(x + w - size, y);\n ctx.lineTo(x + w, y + size);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nclass ValueFormatCache {\n private numberFormatCache = new Map<string, Intl.NumberFormat>();\n private dateParseCache = new Map<string, Date>();\n\n getNumberFormatter(options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = JSON.stringify(options);\n let fmt = this.numberFormatCache.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat(\"en-US\", options);\n this.numberFormatCache.set(key, fmt);\n }\n return fmt;\n }\n\n parseIsoDate(value: string): Date | null {\n const cached = this.dateParseCache.get(value);\n if (cached) return cached;\n const parsed = parseIsoDate(value);\n if (!parsed || Number.isNaN(parsed.getTime())) return null;\n this.dateParseCache.set(value, parsed);\n return parsed;\n }\n}\n\nfunction drawFunnelIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.strokeStyle = \"rgba(15,23,42,1)\";\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n // Top trapezoid\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + Math.round(size * 0.62), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.38), y + Math.round(size * 0.46));\n ctx.closePath();\n ctx.stroke();\n // Stem\n ctx.beginPath();\n ctx.moveTo(x + Math.round(size * 0.46), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.46), y + size);\n ctx.lineTo(x + Math.round(size * 0.54), y + size - 2);\n ctx.lineTo(x + Math.round(size * 0.54), y + Math.round(size * 0.46));\n ctx.stroke();\n ctx.restore();\n}\n\nfunction drawSortArrowIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n dir: \"asc\" | \"desc\",\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.fillStyle = \"rgba(15,23,42,1)\";\n ctx.beginPath();\n if (dir === \"asc\") {\n ctx.moveTo(x + size / 2, y);\n ctx.lineTo(x + size, y + size);\n ctx.lineTo(x, y + size);\n } else {\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + size / 2, y + size);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nfunction resolveTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n if (Array.isArray(values)) {\n return values.filter((v): v is string => typeof v === \"string\");\n }\n }\n }\n return null;\n}\n\nfunction resolveLabeledText(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const obj = value as Record<string, unknown>;\n // Avoid interfering with discriminated objects.\n if (typeof obj.kind === \"string\") return null;\n if (typeof obj.label === \"string\" && \"value\" in obj) return obj.label;\n return null;\n}\n\nclass FenwickTree {\n // 1-based BIT\n private tree: number[];\n private n: number;\n\n constructor(n: number) {\n this.n = n;\n this.tree = new Array(n + 1).fill(0);\n }\n\n static from(values: number[]) {\n const ft = new FenwickTree(values.length);\n for (let i = 0; i < values.length; i += 1) ft.add(i, values[i] ?? 0);\n return ft;\n }\n\n sum(count: number) {\n // sum of first `count` items: [0..count-1]\n let i = Math.max(0, Math.min(this.n, count));\n let res = 0;\n while (i > 0) {\n res += this.tree[i] ?? 0;\n i -= i & -i;\n }\n return res;\n }\n\n total() {\n return this.sum(this.n);\n }\n\n add(index0: number, delta: number) {\n let i = index0 + 1;\n if (i <= 0 || i > this.n) return;\n while (i <= this.n) {\n this.tree[i] = (this.tree[i] ?? 0) + delta;\n i += i & -i;\n }\n }\n\n /**\n * Returns the smallest index `i` (0-based) such that `sum(i + 1) >= target`.\n * If `target <= 0`, returns 0. If `target > total`, returns `n - 1`.\n */\n lowerBound(target: number) {\n if (this.n <= 0) return 0;\n if (target <= 0) return 0;\n const total = this.total();\n if (target > total) return this.n - 1;\n let idx = 0;\n // Largest power of two >= n\n let bit = 1;\n while (bit <= this.n) bit <<= 1;\n let acc = 0;\n for (let step = bit; step !== 0; step >>= 1) {\n const next = idx + step;\n if (next <= this.n) {\n const nextAcc = acc + (this.tree[next] ?? 0);\n if (nextAcc < target) {\n idx = next;\n acc = nextAcc;\n }\n }\n }\n // idx is the last position where prefix sum < target; answer is idx (0-based)\n return Math.min(this.n - 1, idx);\n }\n}\n\nexport interface ViewportState {\n scrollTop: number;\n scrollLeft: number;\n clientWidth: number;\n clientHeight: number;\n deltaX: number;\n deltaY: number;\n timestamp: number;\n}\n\nexport interface Renderer {\n mount(root: HTMLElement): void;\n render(state?: ViewportState): void;\n destroy(): void;\n getCellElements(): NodeListOf<HTMLElement> | null;\n hitTest(\n event: MouseEvent,\n ): { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\n hitTestAction?(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null;\n setActiveCell(rowId: string | null, colKey: string | null): void;\n setSelection(ranges: SelectionRange[]): void;\n}\n\nexport class HTMLRenderer implements Renderer {\n private tableEl: HTMLTableElement | null = null;\n private defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n private rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private measureCache = new Map<string, { height: number; frame: number }>();\n private frame = 0;\n constructor(private dataModel: DataModel) {}\n\n mount(root: HTMLElement) {\n this.tableEl = document.createElement(\"table\");\n this.tableEl.dataset.extableRenderer = \"html\";\n root.innerHTML = \"\";\n root.appendChild(this.tableEl);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.updateActiveClasses();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.applySelectionClasses();\n }\n\n render(_state?: ViewportState) {\n this.frame += 1;\n if (!this.tableEl) return;\n const scrollContainer = this.tableEl.parentElement;\n const prevTop = scrollContainer?.scrollTop ?? 0;\n const prevLeft = scrollContainer?.scrollLeft ?? 0;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n this.tableEl.innerHTML = \"\";\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const colBaseCss = colBaseStyles.map((s) => styleToCssText(s));\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n this.tableEl.style.width = `${totalWidth}px`;\n this.tableEl.appendChild(this.renderHeader(schema, colWidths));\n const body = document.createElement(\"tbody\");\n for (const row of rows) {\n body.appendChild(this.renderRow(row, schema, colWidths, colBaseStyles, colBaseCss));\n }\n this.tableEl.appendChild(body);\n this.updateActiveClasses();\n this.applySelectionClasses();\n if (scrollContainer) {\n scrollContainer.scrollTop = prevTop;\n scrollContainer.scrollLeft = prevLeft;\n }\n for (const [key, entry] of Array.from(this.measureCache.entries())) {\n if (entry.frame !== this.frame) this.measureCache.delete(key);\n }\n }\n\n destroy() {\n removeFromParent(this.tableEl);\n this.tableEl = null;\n }\n\n getCellElements() {\n return this.tableEl?.querySelectorAll<HTMLElement>(\"tr[data-row-id] td[data-col-key]\") ?? null;\n }\n\n hitTest(event: MouseEvent) {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const corner = target.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = target.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const cell = target.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n\n hitTestAction(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const tagRemove = target.closest<HTMLButtonElement>(\"[data-extable-tag-remove]\");\n if (tagRemove && !tagRemove.disabled) {\n const cell = tagRemove.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const indexStr = tagRemove.dataset.extableTagIndex;\n const tagIndex = indexStr ? Number.parseInt(indexStr, 10) : Number.NaN;\n if (!Number.isFinite(tagIndex)) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind: \"tag-remove\" as const,\n tagIndex,\n };\n }\n const actionEl = target.closest<HTMLElement>(\"[data-extable-action]\");\n if (!actionEl) return null;\n const cell = actionEl.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const kind = actionEl.dataset.extableAction as \"button\" | \"link\" | undefined;\n if (kind !== \"button\" && kind !== \"link\") return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind,\n };\n }\n\n private renderHeader(schema: Schema, colWidths: number[]) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n tr.style.height = `${this.defaultRowHeight}px`;\n const rowTh = document.createElement(\"th\");\n rowTh.classList.add(\"extable-row-header\", \"extable-corner\");\n rowTh.textContent = \"\";\n rowTh.style.width = `${this.rowHeaderWidth}px`;\n if (this.activeRowId) rowTh.classList.toggle(\"extable-active-row-header\", true);\n rowTh.dataset.colKey = \"\";\n tr.appendChild(rowTh);\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const th = document.createElement(\"th\");\n th.dataset.colKey = col.key;\n const sortDir = getColumnSortDir(view, col.key);\n const hasFilter = hasActiveColumnFilter(view, col.key);\n if (sortDir) th.dataset.extableSortDir = sortDir;\n else th.removeAttribute(\"data-extable-sort-dir\");\n if (hasFilter) th.dataset.extableFsActive = \"1\";\n else th.removeAttribute(\"data-extable-fs-active\");\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"extable-col-header\";\n const label = document.createElement(\"span\");\n label.className = \"extable-col-header-text\";\n label.textContent = col.header ?? col.key;\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"extable-filter-sort-trigger\";\n btn.dataset.extableFsOpen = \"1\";\n btn.dataset.extableColKey = col.key;\n btn.title = \"Filter / Sort\";\n btn.innerHTML = sortDir ? svgArrow(sortDir) : svgFunnel();\n wrap.appendChild(label);\n wrap.appendChild(btn);\n th.appendChild(wrap);\n const width = colWidths[idx] ?? col.width;\n if (width) th.style.width = `${width}px`;\n th.dataset.colKey = col.key;\n if (this.activeColKey !== null && this.activeColKey === col.key) {\n th.classList.add(\"extable-active-col-header\");\n }\n tr.appendChild(th);\n }\n thead.appendChild(tr);\n return thead;\n }\n\n private renderRow(\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n colBaseStyles: ReturnType<typeof columnFormatToStyle>[],\n colBaseCss: string[],\n ) {\n const tr = document.createElement(\"tr\");\n tr.dataset.rowId = row.id;\n tr.style.height = `${this.defaultRowHeight}px`;\n // Highlight rows where any unique-boolean column is true\n const anyUniqueTrue = schema.columns.some((c) => c && c.type === \"boolean\" && c.unique && this.dataModel.getCell(row.id, c.key) === true);\n if (anyUniqueTrue) tr.classList.add(\"extable-row--unique-true\");\n const view = this.dataModel.getView();\n const rowHeader = document.createElement(\"th\");\n rowHeader.scope = \"row\";\n rowHeader.classList.add(\"extable-row-header\");\n const index = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n rowHeader.textContent = String(index);\n if (this.activeRowId === row.id) rowHeader.classList.add(\"extable-active-row-header\");\n tr.appendChild(rowHeader);\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const td = document.createElement(\"td\");\n td.classList.add(\"extable-cell\");\n td.dataset.colKey = col.key;\n if (col.type === \"boolean\") td.classList.add(\"extable-boolean\");\n const isPending = this.dataModel.hasPending(row.id, col.key);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const cellStyle = this.dataModel.getCellStyle(row.id, col.key);\n const hasTextColor = Boolean(\n cellStyle?.textColor || condRes.delta?.textColor || col.style?.textColor,\n );\n if (!cellStyle && !condRes.delta && !isPending) {\n const css = colBaseCss[idx] ?? \"\";\n if (css) td.style.cssText = css;\n } else {\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const merged = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const forCss = isPending ? { ...merged, textColor: undefined } : merged;\n const css = styleToCssText(forCss);\n if (css) td.style.cssText = css;\n }\n const wrap = view.wrapText?.[col.key] ?? col.wrapText;\n td.classList.add(wrap ? \"cell-wrap\" : \"cell-nowrap\");\n const raw = this.dataModel.getRawCell(row.id, col.key);\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride\n ? { text: textOverride as string }\n : this.formatValue(valueRes.value, col);\n const interaction = this.dataModel.getCellInteraction(row.id, col.key);\n const tagValues =\n col.type === \"tags\" && !textOverride ? resolveTagValues(valueRes.value) : null;\n const isActionType = col.type === \"button\" || col.type === \"link\";\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(valueRes.value)\n : getLinkLabel(valueRes.value)\n : \"\";\n if (tagValues && tagValues.length) {\n const list = document.createElement(\"div\");\n list.className = \"extable-tag-list\";\n tagValues.forEach((tag, index) => {\n const chip = document.createElement(\"span\");\n chip.className = \"extable-tag\";\n const label = document.createElement(\"span\");\n label.className = \"extable-tag-label\";\n label.textContent = tag;\n const remove = document.createElement(\"button\");\n remove.type = \"button\";\n remove.className = \"extable-tag-remove\";\n remove.dataset.extableTagRemove = \"1\";\n remove.dataset.extableTagIndex = String(index);\n remove.textContent = \"×\";\n if (interaction.readonly || interaction.disabled) {\n remove.disabled = true;\n }\n chip.appendChild(label);\n chip.appendChild(remove);\n list.appendChild(chip);\n });\n td.replaceChildren(list);\n } else if (isActionType && !textOverride && actionValue && actionLabel) {\n const actionEl =\n col.type === \"button\" ? document.createElement(\"button\") : document.createElement(\"span\");\n if (actionEl instanceof HTMLButtonElement) actionEl.type = \"button\";\n actionEl.className =\n col.type === \"button\" ? \"extable-action-button\" : \"extable-action-link\";\n if (interaction.disabled) actionEl.classList.add(\"extable-action-disabled\");\n if (col.type === \"link\" && hasTextColor) actionEl.style.color = \"inherit\";\n actionEl.dataset.extableAction = col.type;\n actionEl.textContent = actionLabel;\n td.replaceChildren(actionEl);\n } else {\n if (col.type === \"boolean\" && !textOverride) {\n if (col.unique) {\n const input = document.createElement(\"input\");\n input.type = \"radio\";\n input.name = `extable-unique-${String(col.key)}`;\n input.checked = Boolean(valueRes.value);\n if (interaction.readonly || interaction.disabled) input.disabled = true;\n input.className = \"extable-unique-radio\";\n input.setAttribute(\"aria-label\", col.header ?? String(col.key));\n td.replaceChildren(input);\n } else {\n td.textContent = formatted.text;\n if (formatted.color) td.style.color = formatted.color;\n }\n } else {\n td.textContent = actionLabel || formatted.text;\n if (formatted.color) td.style.color = formatted.color;\n }\n }\n const marker = this.dataModel.getCellMarker(row.id, col.key);\n if (marker) {\n td.classList.toggle(\"extable-diag-warning\", marker.level === \"warning\");\n td.classList.toggle(\"extable-diag-error\", marker.level === \"error\");\n td.dataset.extableDiagMessage = marker.message;\n } else {\n td.classList.remove(\"extable-diag-warning\", \"extable-diag-error\");\n td.removeAttribute(\"data-extable-diag-message\");\n }\n const align =\n col.style?.align ??\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\" ? \"right\" : \"left\");\n td.classList.add(align === \"right\" ? \"align-right\" : \"align-left\");\n const rawNumbered = toRawValue(raw, valueRes.value, col);\n if (rawNumbered !== null) {\n td.dataset.raw = rawNumbered;\n } else {\n const rawStr = raw === null || raw === undefined ? \"\" : String(raw);\n td.dataset.raw = rawStr;\n }\n if (isPending) td.classList.add(\"pending\");\n if (interaction.readonly) {\n td.classList.add(\"extable-readonly\");\n if (col.formula) td.classList.add(\"extable-readonly-formula\");\n } else {\n td.classList.add(\"extable-editable\");\n }\n if (interaction.muted) td.classList.add(\"extable-readonly-muted\");\n if (interaction.disabled) td.classList.add(\"extable-disabled\");\n if (\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === col.key\n ) {\n td.classList.add(\"extable-active-cell\");\n }\n tr.appendChild(td);\n }\n // variable row height based on measured content when wrap enabled\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (wrapAny) {\n let maxHeight = this.defaultRowHeight;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col || !col.wrapText) continue;\n const width = colWidths[idx] ?? view.columnWidths?.[col.key] ?? col.width ?? 100;\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride ? \"#ERROR\" : this.formatValue(valueRes.value, col).text;\n const version = this.dataModel.getRowVersion(row.id);\n const key = `${row.id}|${col.key}|${version}|${width}|${text}`;\n const cached = this.measureCache.get(key);\n if (cached) {\n cached.frame = this.frame;\n this.measureCache.set(key, cached);\n maxHeight = Math.max(maxHeight, cached.height);\n continue;\n }\n const measure = document.createElement(\"span\");\n measure.style.visibility = \"hidden\";\n measure.style.position = \"absolute\";\n measure.style.left = \"-10000px\";\n measure.style.top = \"0\";\n measure.style.whiteSpace = \"pre-wrap\";\n measure.style.overflowWrap = \"anywhere\";\n measure.style.display = \"inline-block\";\n measure.style.width = `${width}px`;\n measure.textContent = text;\n const measureHost = this.tableEl?.parentElement;\n if (!measureHost) continue;\n measureHost.appendChild(measure);\n const h =\n measure.clientHeight +\n CELL_PADDING_TOP_PX +\n CELL_PADDING_BOTTOM_PX +\n 2; // border allowance (top+bottom)\n measure.remove();\n this.measureCache.set(key, { height: h, frame: this.frame });\n maxHeight = Math.max(maxHeight, h);\n }\n tr.style.height = `${maxHeight}px`;\n this.dataModel.setRowHeight(row.id, maxHeight);\n } else {\n tr.style.height = `${this.defaultRowHeight}px`;\n this.dataModel.setRowHeight(row.id, this.defaultRowHeight);\n }\n return tr;\n }\n\n private updateActiveClasses() {\n if (!this.tableEl) return;\n const isAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n this.tableEl.classList.toggle(\"extable-all-selected\", isAll);\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-row-header\"))) {\n el.classList.remove(\"extable-active-row-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-col-header\"))) {\n el.classList.remove(\"extable-active-col-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-cell\"))) {\n el.classList.remove(\"extable-active-cell\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] .extable-row-header`,\n ),\n )) {\n el.classList.add(\"extable-active-row-header\");\n }\n }\n if (this.activeColKey !== null) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(`th[data-col-key=\"${this.activeColKey}\"]`),\n )) {\n el.classList.add(\"extable-active-col-header\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] td[data-col-key=\"${this.activeColKey}\"]`,\n ),\n )) {\n el.classList.add(\"extable-active-cell\");\n }\n }\n }\n }\n\n private applySelectionClasses() {\n if (!this.tableEl) return;\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-selected\"))) {\n el.classList.remove(\"extable-selected\");\n }\n if (!this.selection.length) return;\n const rows = Array.from(this.tableEl.querySelectorAll<HTMLTableRowElement>(\"tbody tr\"));\n const schema = this.dataModel.getSchema();\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(schema.columns.length - 1, Math.max(range.startCol, range.endCol));\n for (let r = startRow; r <= endRow; r += 1) {\n const rowEl = rows[r];\n if (!rowEl) continue;\n const th = rowEl.querySelector(\"th.extable-row-header\");\n if (th) th.classList.add(\"extable-selected\");\n const cells = Array.from(rowEl.querySelectorAll<HTMLTableCellElement>(\"td\"));\n for (let c = startCol; c <= endCol; c += 1) {\n const cell = cells[c];\n if (cell) cell.classList.add(\"extable-selected\");\n }\n }\n }\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"lookup\" && typeof obj.label === \"string\") {\n return { text: obj.label };\n }\n const labeled = resolveLabeledText(value);\n if (labeled !== null) return { text: labeled };\n }\n if (col.type === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(fmtValue, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(fmtValue, \"time\")\n : coerceDatePattern(fmtValue, \"datetime\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n\nexport class CanvasRenderer implements Renderer {\n private static readonly MAX_CANVAS_DIM_PX = 8192;\n private static readonly ROW_HEIGHT_MEASURE_CHUNK = 500;\n private static readonly ROW_HEIGHT_MEASURE_TIME_BUDGET_MS = 8;\n private static readonly TEXT_MEASURE_CACHE_MAX = 2000;\n private root: HTMLElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private spacer: HTMLDivElement | null = null;\n private overlayLayer: HTMLDivElement | null = null;\n private tooltip: HTMLDivElement | null = null;\n private tooltipTarget: { rowId: string; colKey: string } | null = null;\n private tooltipMessage: string | null = null;\n private dataModel: DataModel;\n private readonly rowHeight = DEFAULT_ROW_HEIGHT_PX;\n private readonly headerHeight = HEADER_HEIGHT_PX;\n private readonly lineHeight = 16;\n private readonly padding = 12;\n private readonly rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private textMeasureCache = new Map<string, { lines: string[] }>();\n private frame = 0;\n private cursorTimer: number | null = null;\n private pendingCursorPoint: { x: number; y: number } | null = null;\n private hoverHeaderColKey: string | null = null;\n private hoverHeaderIcon = false;\n private hoverActionKey: string | null = null;\n private activeActionKey: string | null = null;\n private rowHeightCacheKey: string | null = null;\n private rowHeightMeasuredVersion = new Map<string, number>();\n private rowHeightMeasureRaf: number | null = null;\n private rowHeightMeasureTask: { key: string; nextIndex: number } | null = null;\n private heightIndex: {\n key: string | null;\n rowsRef: InternalRow[];\n idToIndex: Map<string, number>;\n heights: number[];\n fenwick: FenwickTree;\n } | null = null;\n\n constructor(\n dataModel: DataModel,\n private getEditMode: () => EditMode = () => \"direct\",\n ) {\n this.dataModel = dataModel;\n }\n\n mount(root: HTMLElement) {\n this.root = root;\n this.canvas = document.createElement(\"canvas\");\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n this.canvas.width = Math.max(1, Math.min(maxDim, Math.floor(root.clientWidth || 600)));\n this.canvas.height = Math.max(1, Math.min(maxDim, Math.floor(root.clientHeight || 400)));\n this.canvas.style.width = `${this.canvas.width}px`;\n this.canvas.style.height = `${this.canvas.height}px`;\n this.canvas.dataset.extableRenderer = \"canvas\";\n this.canvas.style.position = \"sticky\";\n this.canvas.style.top = \"0\";\n this.canvas.style.left = \"0\";\n this.canvas.style.zIndex = \"1\";\n this.canvas.style.cursor = \"cell\";\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.addEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.addEventListener(\"click\", this.handleClick);\n this.spacer = document.createElement(\"div\");\n this.spacer.style.width = \"1px\";\n if (this.tooltip) this.tooltip.remove();\n if (this.overlayLayer) this.overlayLayer.remove();\n this.overlayLayer = document.createElement(\"div\");\n this.overlayLayer.className = \"extable-overlay-layer\";\n this.tooltip = document.createElement(\"div\");\n this.tooltip.className = \"extable-tooltip\";\n this.tooltip.dataset.visible = \"0\";\n this.overlayLayer.appendChild(this.tooltip);\n root.innerHTML = \"\";\n root.style.position = \"relative\";\n root.appendChild(this.overlayLayer);\n root.appendChild(this.canvas);\n root.appendChild(this.spacer);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.render();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.render();\n }\n\n render(state?: ViewportState) {\n try {\n this.frame += 1;\n if (!this.canvas || !this.root) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n let baseFont = ctx.font;\n const selectAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const fontCache = new Map<string, string>();\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const cacheKey = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n if (cacheKey !== this.rowHeightCacheKey) {\n this.rowHeightCacheKey = cacheKey;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n if (!wrapAny) this.cancelRowHeightMeasurement();\n\n this.ensureHeightIndex(rows, wrapAny ? cacheKey : null, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return;\n\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const desiredCanvasWidth = state?.clientWidth ?? (this.root.clientWidth || 600);\n const desiredCanvasHeight =\n state?.clientHeight ?? (this.root.clientHeight || this.canvas.height || 400);\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n const nextWidth = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasWidth)));\n const nextHeight = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasHeight)));\n if (this.canvas.width !== nextWidth) this.canvas.width = nextWidth;\n if (this.canvas.height !== nextHeight) this.canvas.height = nextHeight;\n this.canvas.style.width = `${nextWidth}px`;\n this.canvas.style.height = `${nextHeight}px`;\n // Resizing resets 2D state, so reapply after size update.\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n baseFont = ctx.font;\n this.refreshTooltipPosition();\n\n const scrollTop = state?.scrollTop ?? this.root.scrollTop;\n const scrollLeft = state?.scrollLeft ?? this.root.scrollLeft;\n const computeVisibleRange = (contentTop: number) => {\n const target = contentTop + 1;\n const visibleStart = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(target)),\n );\n const accum = heightIndex.fenwick.sum(visibleStart);\n let visibleEnd = visibleStart;\n let drawnHeight = 0;\n const maxHeight = (this.canvas?.height ?? 0) + this.rowHeight * 2;\n for (let i = visibleStart; i < rows.length && drawnHeight < maxHeight; i += 1) {\n drawnHeight += heightIndex.heights[i] ?? this.rowHeight;\n visibleEnd = i + 1;\n }\n return { accum, visibleStart, visibleEnd };\n };\n\n let totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n let maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n let contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n let { accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop);\n\n if (wrapAny && cacheKey) {\n const updates: Record<string, number> = {};\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const nextH = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = nextH;\n this.rowHeightMeasuredVersion.set(row.id, version);\n }\n this.applyRowHeightUpdates(updates);\n totalRowsHeight = heightIndex.fenwick.total();\n this.dataModel.setRowHeightsBulk(updates);\n maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n ({ accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop));\n if (this.rowHeightMeasureTask || Object.keys(updates).length > 0)\n this.scheduleRowHeightMeasurement();\n }\n\n if (this.spacer) {\n this.spacer.style.height = `${maxContentScrollTop}px`;\n this.spacer.style.width = `${totalWidth}px`;\n }\n const dataXOffset = this.rowHeaderWidth - scrollLeft;\n\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n // Keep row-header column background visible across scroll\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.canvas.height);\n // Body\n let yCursor = this.headerHeight + accum - contentScrollTop;\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n const rowH = heightIndex.heights[i] ?? this.rowHeight;\n // row header cell\n ctx.strokeStyle = \"#d0d7de\";\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n ctx.strokeRect(0, yCursor, this.rowHeaderWidth, rowH);\n const idxText = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n if (this.activeRowId === row.id) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n }\n ctx.fillStyle = \"#0f172a\";\n ctx.font = `bold ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(String(idxText), this.rowHeaderWidth / 2, yCursor + rowH / 2);\n ctx.font = baseFont;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let x = 0;\n let lastFontKey = \"\";\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n x += w;\n continue;\n }\n const interaction = this.dataModel.getCellInteraction(row.id, c.key);\n const muted = interaction.muted;\n ctx.strokeStyle = \"#d0d7de\";\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const cellStyle = this.dataModel.getCellStyle(row.id, c.key);\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n // Row highlight when a unique-boolean in this row is true\n const anyUniqueTrueRow = schema.columns.some((cc) => cc && cc.type === \"boolean\" && cc.unique && this.dataModel.getCell(row.id, cc.key) === true);\n const bg = anyUniqueTrueRow ? \"rgba(59,130,246,0.06)\" : (muted ? \"#f3f4f6\" : (mergedStyle.backgroundColor ?? \"#ffffff\"));\n ctx.fillStyle = bg;\n ctx.fillRect(x, yCursor, w, rowH);\n ctx.strokeRect(x, yCursor, w, rowH);\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride ? { text: \"#ERROR\" } : this.formatValue(valueRes.value, c);\n const isActionType = c.type === \"button\" || c.type === \"link\";\n const actionValue = isActionType\n ? c.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? actionValue?.label ?? (c.type === \"button\" ? getButtonLabel(valueRes.value) : getLinkLabel(valueRes.value))\n : \"\";\n const renderAction = Boolean(isActionType && actionValue && actionLabel && !textOverride);\n // Render unique boolean as radio glyphs in Canvas mode\n let text = actionLabel || formatted.text;\n if (c.type === \"boolean\" && c.unique) {\n const val = valueRes.value === true || valueRes.value === \"true\" || valueRes.value === \"1\" || valueRes.value === 1;\n // Use blue circle for ON; render nothing for OFF to keep canvas clean.\n text = val ? \"🔵\" : \"\";\n }\n const align = c.style?.align ?? (c.type === \"number\" ? \"right\" : \"left\");\n const isActiveCell =\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === c.key;\n if (isActiveCell) {\n ctx.strokeStyle = \"#3b82f6\";\n ctx.lineWidth = 2;\n ctx.strokeRect(x + 1, yCursor + 1, w - 2, rowH - 2);\n ctx.lineWidth = 1;\n if (\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const size = FILL_HANDLE_VISUAL_SIZE_PX;\n const left = x + w - size - 1;\n const top = yCursor + rowH - size - 1;\n ctx.fillStyle = \"#3b82f6\";\n ctx.fillRect(left, top, size, size);\n ctx.strokeStyle = \"#ffffff\";\n ctx.strokeRect(left + 0.5, top + 0.5, size - 1, size - 1);\n }\n }\n const actionColor =\n renderAction && c.type === \"link\" && !muted && !mergedStyle.textColor\n ? \"#2563eb\"\n : undefined;\n const isGlobalReadonly = this.getEditMode() === \"readonly\";\n const hasExplicitTextColor = Boolean(formatted.color || mergedStyle.textColor || actionColor);\n const formulaReadonlyColor =\n !isGlobalReadonly && Boolean(c.formula) && interaction.readonly && !muted && !hasExplicitTextColor\n ? \"#99aaff\"\n : undefined;\n ctx.fillStyle = this.dataModel.hasPending(row.id, c.key)\n ? \"#b91c1c\"\n : formatted.color\n ? formatted.color\n : muted\n ? \"#94a3b8\"\n : (actionColor ?? mergedStyle.textColor ?? formulaReadonlyColor ?? \"#0f172a\");\n const wrap = view.wrapText?.[c.key] ?? c.wrapText ?? false;\n const isBoolean = c.type === \"boolean\" && (!c.format || c.format === \"checkbox\");\n const isCustomBoolean = c.type === \"boolean\" && Boolean(c.format && c.format !== \"checkbox\");\n if (!isBoolean) {\n const fontKey = `${mergedStyle.italic ? \"i\" : \"\"}${mergedStyle.bold ? \"b\" : \"\"}`;\n if (fontKey !== lastFontKey) {\n const cached = fontCache.get(fontKey);\n if (cached) ctx.font = cached;\n else {\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n const f = `${ital}${weight}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\n fontCache.set(fontKey, f);\n ctx.font = f;\n }\n lastFontKey = fontKey;\n }\n } else {\n ctx.font = baseFont;\n lastFontKey = \"\";\n }\n const textAreaX = x + CELL_PADDING_X_PX;\n const textAreaY = yCursor + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, w - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(0, rowH - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX));\n const decorations = {\n underline: Boolean(mergedStyle.underline) || (renderAction && c.type === \"link\"),\n strike: Boolean(mergedStyle.strike),\n };\n const actionBounds =\n renderAction && !isBoolean\n ? this.measureTextBounds(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n )\n : null;\n if (renderAction && c.type === \"button\" && actionBounds) {\n const padX = 6;\n const padY = 4;\n const left = Math.max(textAreaX, actionBounds.x - padX);\n const top = Math.max(textAreaY, actionBounds.y - padY);\n const right = Math.min(textAreaX + textAreaW, actionBounds.x + actionBounds.width + padX);\n const bottom = Math.min(textAreaY + textAreaH, actionBounds.y + actionBounds.height + padY);\n const bw = Math.max(0, right - left);\n const bh = Math.max(0, bottom - top);\n ctx.save();\n const actionKey = `${row.id}::${c.key}::button`;\n const isHover = this.hoverActionKey === actionKey;\n const isActive = this.activeActionKey === actionKey;\n if (muted) {\n ctx.fillStyle = \"#f3f4f6\";\n ctx.strokeStyle = \"#e2e8f0\";\n } else if (isActive) {\n ctx.fillStyle = \"#cbd5e1\";\n ctx.strokeStyle = \"#94a3b8\";\n } else if (isHover) {\n ctx.fillStyle = \"#e2e8f0\";\n ctx.strokeStyle = \"#94a3b8\";\n } else {\n ctx.fillStyle = \"#f8fafc\";\n ctx.strokeStyle = \"#cbd5e1\";\n }\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") {\n ctx.roundRect(left, top, bw, bh, 6);\n } else {\n ctx.rect(left, top, bw, bh);\n }\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n this.drawCellText(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n isBoolean,\n isCustomBoolean,\n Boolean(c.unique),\n decorations,\n );\n const marker = this.dataModel.getCellMarker(row.id, c.key);\n if (marker) drawDiagnosticCorner(ctx, x, yCursor, w, rowH, marker.level);\n x += w;\n }\n ctx.restore();\n yCursor += rowH;\n }\n\n // Header (draw last to stay on top)\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.canvas.width, this.headerHeight);\n ctx.strokeStyle = \"#d0d7de\";\n // corner\n ctx.strokeRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n ctx.fillStyle = \"#9ca3af\";\n ctx.beginPath();\n ctx.moveTo(4, 4);\n ctx.lineTo(16, 4);\n ctx.lineTo(4, 16);\n ctx.closePath();\n ctx.fill();\n if (this.activeRowId) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(this.rowHeaderWidth, 0, this.canvas.width - this.rowHeaderWidth, this.headerHeight);\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let xHeader = 0;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n xHeader += w;\n continue;\n }\n const isActiveCol = this.activeColKey !== null && this.activeColKey === c.key;\n if (isActiveCol) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(xHeader, 0, w, this.headerHeight);\n }\n ctx.strokeStyle = \"#d0d7de\";\n ctx.strokeRect(xHeader, 0, w, this.headerHeight);\n ctx.fillStyle = \"#0f172a\";\n ctx.font = `bold ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n ctx.fillText(c.header ?? c.key, xHeader + 8, this.headerHeight - 8);\n ctx.font = baseFont;\n\n const sortDir = getColumnSortDir(view, c.key);\n const hasFilter = hasActiveColumnFilter(view, c.key);\n const isHover = this.hoverHeaderColKey !== null && this.hoverHeaderColKey === c.key;\n const showIcon = Boolean(sortDir) || hasFilter || isHover;\n if (showIcon) {\n const alpha = isHover ? 0.9 : hasFilter || sortDir ? 0.75 : 0.45;\n const iconBox = 16;\n const pad = 6;\n const ix = xHeader + w - iconBox - pad;\n const iy = Math.floor((this.headerHeight - iconBox) / 2);\n if (sortDir) {\n drawSortArrowIcon(ctx, ix + 3, iy + 3, iconBox - 6, alpha, sortDir);\n } else {\n drawFunnelIcon(ctx, ix + 2, iy + 2, iconBox - 4, alpha);\n }\n }\n xHeader += w;\n }\n ctx.restore();\n\n // selection overlay\n if (this.selection.length) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.strokeStyle = \"#3b82f6\";\n ctx.fillStyle = \"rgba(59,130,246,0.12)\";\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(\n schema.columns.length - 1,\n Math.max(range.startCol, range.endCol),\n );\n const yTop = this.headerHeight + heightIndex.fenwick.sum(startRow) - contentScrollTop;\n const height = heightIndex.fenwick.sum(endRow + 1) - heightIndex.fenwick.sum(startRow);\n let xLeft = this.rowHeaderWidth;\n for (let c = 0; c < startCol; c += 1) {\n xLeft += colWidths[c] ?? 100;\n }\n let width = 0;\n for (let c = startCol; c <= endCol; c += 1) {\n width += colWidths[c] ?? 100;\n }\n xLeft -= scrollLeft;\n ctx.fillRect(xLeft, yTop, width, height);\n ctx.strokeRect(xLeft + 0.5, yTop + 0.5, width - 1, height - 1);\n }\n ctx.restore();\n }\n\n if (selectAll) {\n ctx.save();\n ctx.fillStyle = \"rgba(59,130,246,0.08)\";\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n ctx.restore();\n }\n } catch {\n // Ignore canvas rendering errors (e.g. context enters an error state after huge resize).\n // A subsequent resize typically recovers.\n return;\n }\n }\n\n destroy() {\n this.cancelRowHeightMeasurement();\n this.heightIndex = null;\n if (this.canvas) {\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.removeEventListener(\"click\", this.handleClick);\n }\n if (this.cursorTimer) {\n window.clearTimeout(this.cursorTimer);\n this.cursorTimer = null;\n }\n this.pendingCursorPoint = null;\n removeFromParent(this.canvas);\n removeFromParent(this.spacer);\n removeFromParent(this.overlayLayer);\n removeFromParent(this.tooltip);\n this.canvas = null;\n this.spacer = null;\n this.overlayLayer = null;\n this.tooltip = null;\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.root = null;\n }\n\n private ensureHeightIndex(rows: InternalRow[], key: string | null, wrapAny: boolean) {\n const existing = this.heightIndex;\n if (existing && existing.rowsRef === rows && existing.key === key) return;\n const heights = new Array(rows.length);\n const idToIndex = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n if (!row) continue;\n idToIndex.set(row.id, i);\n let h = this.rowHeight;\n if (wrapAny && key) {\n const version = this.dataModel.getRowVersion(row.id);\n const measuredVersion = this.rowHeightMeasuredVersion.get(row.id);\n const cachedHeight = this.dataModel.getRowHeight(row.id);\n if (measuredVersion === version && typeof cachedHeight === \"number\") h = cachedHeight;\n }\n heights[i] = h;\n }\n this.heightIndex = {\n key,\n rowsRef: rows,\n idToIndex,\n heights,\n fenwick: FenwickTree.from(heights),\n };\n }\n\n private applyRowHeightUpdates(updates: Record<string, number>) {\n const index = this.heightIndex;\n if (!index) return;\n for (const [rowId, next] of Object.entries(updates)) {\n const i = index.idToIndex.get(rowId);\n if (i === undefined) continue;\n const prev = index.heights[i] ?? this.rowHeight;\n if (prev === next) continue;\n index.heights[i] = next;\n index.fenwick.add(i, next - prev);\n }\n }\n\n private getRowHeightCacheKey(schema: Schema, view: View, colWidths: number[]) {\n const wraps = schema.columns\n .map((c) => ((view.wrapText?.[c.key] ?? c.wrapText) ? \"1\" : \"0\"))\n .join(\"\");\n const widths = colWidths.map((w) => String(w ?? 0)).join(\",\");\n return `${wraps}|${widths}`;\n }\n\n private cancelRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) {\n cancelAnimationFrame(this.rowHeightMeasureRaf);\n this.rowHeightMeasureRaf = null;\n }\n this.rowHeightMeasureTask = null;\n }\n\n private scheduleRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) return;\n this.rowHeightMeasureRaf = requestAnimationFrame(() => {\n this.rowHeightMeasureRaf = null;\n this.runRowHeightMeasurement();\n });\n }\n\n private runRowHeightMeasurement() {\n if (!this.canvas) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (!wrapAny) return;\n const key = this.getRowHeightCacheKey(schema, view, colWidths);\n if (this.rowHeightCacheKey !== key) {\n this.rowHeightCacheKey = key;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n const task = this.rowHeightMeasureTask ?? { key, nextIndex: 0 };\n if (task.key !== key) return;\n\n const rows = this.dataModel.listRows();\n const updates: Record<string, number> = {};\n let measured = 0;\n const start = performance.now();\n while (task.nextIndex < rows.length && measured < CanvasRenderer.ROW_HEIGHT_MEASURE_CHUNK) {\n if (performance.now() - start > CanvasRenderer.ROW_HEIGHT_MEASURE_TIME_BUDGET_MS) break;\n const row = rows[task.nextIndex];\n task.nextIndex += 1;\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const h = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = h;\n this.rowHeightMeasuredVersion.set(row.id, version);\n measured += 1;\n }\n this.rowHeightMeasureTask = task.nextIndex < rows.length ? task : null;\n this.ensureHeightIndex(rows, this.rowHeightCacheKey, true);\n this.applyRowHeightUpdates(updates);\n this.dataModel.setRowHeightsBulk(updates);\n if (this.rowHeightMeasureTask) this.scheduleRowHeightMeasurement();\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (!this.root || !this.canvas) return;\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = ev.clientX - rect.left;\n const viewportY = ev.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n if (y >= this.headerHeight) return;\n if (x < this.rowHeaderWidth) return;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex < 0) return;\n const col = schema.columns[colIndex];\n if (!col) return;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n const inIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n if (!inIcon) return;\n this.root.dispatchEvent(\n new CustomEvent(\"extable:filter-sort-open\", { bubbles: true, detail: { colKey: col.key } }),\n );\n };\n\n getCellElements() {\n return null;\n }\n\n hitTest(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n // Use viewport-relative coordinates first because headers are rendered as \"sticky\"\n // (they should not be offset by scrollTop in hit-test).\n const viewportX = event.clientX - rect.left;\n const viewportY = event.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const headerHeight = this.headerHeight;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n const maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n const contentScrollTop = Math.max(0, Math.min(this.root.scrollTop, maxContentScrollTop));\n if (viewportY < headerHeight && viewportX < this.rowHeaderWidth) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n rect: new DOMRect(rect.left, rect.top, this.rowHeaderWidth, headerHeight),\n };\n }\n if (viewportY < headerHeight) {\n // Column header region (canvas)\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex >= 0) {\n const col = schema.columns[colIndex];\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top,\n colWidths[colIndex] ?? 100,\n headerHeight,\n );\n return { rowId: \"__header__\", colKey: col.key, rect: cellRect };\n }\n return null;\n }\n if (viewportX < this.rowHeaderWidth) {\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)),\n );\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n const row = rows[rowIndex];\n const topPx = rect.top + headerHeight + accumHeight - contentScrollTop;\n const cellRect = new DOMRect(\n rect.left,\n topPx,\n this.rowHeaderWidth,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: null, rect: cellRect };\n }\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(0, Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)));\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex === -1) return null;\n const row = rows[rowIndex];\n const col = schema.columns[colIndex];\n const rowTop = accumHeight;\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + headerHeight + rowTop - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: col.key, rect: cellRect };\n }\n\n hitTestAction(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const hit = this.hitTest(event);\n if (!hit || !hit.rowId || !hit.colKey) return null;\n if (hit.rowId === \"__all__\" || hit.rowId === \"__header__\") return null;\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(hit.colKey));\n if (!col || (col.type !== \"button\" && col.type !== \"link\")) return null;\n const valueRes = this.dataModel.resolveCellValue(hit.rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(hit.rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return null;\n const actionValue =\n col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value);\n if (!actionValue || !actionValue.label) return null;\n\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return null;\n const baseStyle = columnFormatToStyle(col);\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const cellStyle = this.dataModel.getCellStyle(hit.rowId, col.key);\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n ctx.save();\n ctx.font = `${ital}${weight}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\n ctx.textBaseline = \"alphabetic\";\n const view = this.dataModel.getView();\n const wrap = view.wrapText?.[col.key] ?? col.wrapText ?? false;\n const align = col.style?.align ?? \"left\";\n const textAreaX = hit.rect.left + CELL_PADDING_X_PX;\n const textAreaY = hit.rect.top + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, hit.rect.width - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(\n 0,\n hit.rect.height - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX),\n );\n const bounds = this.measureTextBounds(\n ctx,\n actionValue.label,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n );\n ctx.restore();\n if (!bounds) return null;\n const pad = col.type === \"button\" ? 6 : 2;\n const left = Math.max(hit.rect.left, bounds.x - pad);\n const top = Math.max(hit.rect.top, bounds.y - pad);\n const right = Math.min(hit.rect.right, bounds.x + bounds.width + pad);\n const bottom = Math.min(hit.rect.bottom, bounds.y + bounds.height + pad);\n if (\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom\n ) {\n return { rowId: hit.rowId, colKey: String(hit.colKey), kind: col.type };\n }\n return null;\n }\n\n private isPointInSelection(rowId: string, colKey: string) {\n if (!this.selection.length) return false;\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return false;\n for (const range of this.selection) {\n if (range.kind !== \"cells\") continue;\n const startRow = Math.min(range.startRow, range.endRow);\n const endRow = Math.max(range.startRow, range.endRow);\n const startCol = Math.min(range.startCol, range.endCol);\n const endCol = Math.max(range.startCol, range.endCol);\n if (rowIndex >= startRow && rowIndex <= endRow && colIndex >= startCol && colIndex <= endCol)\n return true;\n }\n return false;\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.pendingCursorPoint = { x: ev.clientX, y: ev.clientY };\n if (this.cursorTimer) return;\n this.cursorTimer = window.setTimeout(() => {\n this.cursorTimer = null;\n const p = this.pendingCursorPoint;\n if (!p) return;\n this.updateCanvasCursor(p.x, p.y);\n }, 50);\n };\n\n private handlePointerLeave = () => {\n if (!this.canvas) return;\n this.canvas.style.cursor = \"cell\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (this.hoverActionKey || this.activeActionKey) {\n this.hoverActionKey = null;\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (!this.canvas) return;\n const actionHit = this.hitTestAction(\n new MouseEvent(\"mousemove\", { clientX: ev.clientX, clientY: ev.clientY }),\n );\n if (!actionHit || actionHit.kind !== \"button\") return;\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (interaction.disabled) return;\n const nextKey = `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}`;\n if (nextKey !== this.activeActionKey) {\n this.activeActionKey = nextKey;\n this.render();\n }\n };\n\n private handlePointerUp = () => {\n if (this.activeActionKey) {\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private positionTooltipAtRect(rect: DOMRect) {\n if (!this.tooltip) return;\n if (!this.root) return;\n const pad = 8;\n const rootRect = this.root.getBoundingClientRect();\n const maxW = this.root.clientWidth;\n const maxH = this.root.clientHeight;\n let left = rect.right - rootRect.left + pad;\n let top = rect.top - rootRect.top + pad;\n let side: \"right\" | \"left\" = \"right\";\n const tRect = this.tooltip.getBoundingClientRect();\n if (left + tRect.width > maxW) {\n left = Math.max(0, rect.left - rootRect.left - tRect.width - pad);\n side = \"left\";\n }\n if (top + tRect.height > maxH) top = Math.max(0, maxH - tRect.height - pad);\n this.tooltip.style.left = `${left}px`;\n this.tooltip.style.top = `${top}px`;\n this.tooltip.dataset.side = side;\n }\n\n private refreshTooltipPosition() {\n if (!this.tooltip || this.tooltip.dataset.visible !== \"1\") return;\n if (!this.tooltipTarget || !this.tooltipMessage) return;\n const rect = this.getCellRect(this.tooltipTarget.rowId, this.tooltipTarget.colKey);\n if (!rect) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n this.tooltip.textContent = this.tooltipMessage;\n this.positionTooltipAtRect(rect);\n }\n\n private getCellRect(rowId: string, colKey: string): DOMRect | null {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return null;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n let xCursor = this.rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) {\n xCursor += colWidths[i] ?? 100;\n }\n return new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + this.headerHeight + accumHeight - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n }\n\n private updateCanvasCursor(clientX: number, clientY: number) {\n if (!this.root || !this.canvas) return;\n if (this.root.dataset.extableFillDragging === \"1\") {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n // Header hover (filter/sort icon affordance)\n {\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = clientX - rect.left;\n const viewportY = clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n const prevKey = this.hoverHeaderColKey;\n const prevIcon = this.hoverHeaderIcon;\n let nextKey: string | null = null;\n let nextIcon = false;\n if (y >= 0 && y < this.headerHeight && x >= this.rowHeaderWidth) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n const col = colIndex >= 0 ? schema.columns[colIndex] : null;\n if (col) {\n nextKey = col.key;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n nextIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n }\n }\n const changed =\n String(prevKey ?? \"\") !== String(nextKey ?? \"\") || Boolean(prevIcon) !== Boolean(nextIcon);\n this.hoverHeaderColKey = nextKey;\n this.hoverHeaderIcon = nextIcon;\n if (nextKey !== null) {\n this.canvas.style.cursor = nextIcon ? \"pointer\" : \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (changed) this.render();\n return;\n }\n if (changed) this.render();\n }\n // Cursor spec:\n // - No selection or outside selection: cell\n // - Inside selection & on fill handle: crosshair\n // - Inside selection & readonly/boolean: default\n // - Inside selection & others: text\n let cursor = \"cell\";\n\n const hit = this.hitTest(new MouseEvent(\"mousemove\", { clientX, clientY }));\n if (!hit) {\n this.canvas.style.cursor = cursor;\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.hoverActionKey = null;\n return;\n }\n if (hit.colKey === \"__all__\" || hit.colKey === null) {\n this.canvas.style.cursor = \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.hoverActionKey = null;\n return;\n }\n // In readonly editMode, keep spreadsheet-like cursor for all body cells.\n if (this.getEditMode() === \"readonly\") {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n const marker = this.dataModel.getCellMarker(hit.rowId, hit.colKey);\n if (this.tooltip && marker) {\n const sameCell =\n this.tooltipTarget &&\n this.tooltipTarget.rowId === hit.rowId &&\n this.tooltipTarget.colKey === hit.colKey;\n const sameMessage = this.tooltipMessage === marker.message;\n if (!sameCell || !sameMessage || this.tooltip.dataset.visible !== \"1\") {\n this.tooltipTarget = { rowId: hit.rowId, colKey: hit.colKey };\n this.tooltipMessage = marker.message;\n this.tooltip.textContent = marker.message;\n const rect = this.getCellRect(hit.rowId, hit.colKey);\n if (rect) {\n this.positionTooltipAtRect(rect);\n this.tooltip.dataset.visible = \"1\";\n } else {\n this.tooltip.dataset.visible = \"0\";\n }\n }\n } else if (this.tooltip) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n }\n\n const actionHit = this.hitTestAction(new MouseEvent(\"mousemove\", { clientX, clientY }));\n const nextHoverKey = actionHit ? `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}` : null;\n if (nextHoverKey !== this.hoverActionKey) {\n this.hoverActionKey = nextHoverKey;\n this.render();\n }\n if (actionHit) {\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (!interaction.disabled) {\n this.canvas.style.cursor = \"pointer\";\n return;\n }\n }\n\n if (!this.isPointInSelection(hit.rowId, hit.colKey)) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Only the active cell shows edit-mode cursor affordances. Other selected cells stay `cell`.\n const isActiveCell =\n this.activeRowId === hit.rowId &&\n this.activeColKey !== null &&\n this.activeColKey === hit.colKey;\n if (!isActiveCell) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Fill handle hover is only considered inside the active cell and when fill handle is shown.\n if (\n this.activeRowId &&\n this.activeColKey !== null &&\n this.activeRowId !== \"__all__\" &&\n this.activeColKey !== \"__all__\" &&\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const cellRect = this.getCellRect(this.activeRowId, this.activeColKey);\n if (cellRect) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(clientX, clientY, handleRect)) {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n }\n }\n\n const col = this.dataModel.getSchema().columns.find((c) => c.key === hit.colKey);\n const interaction = this.dataModel.getCellInteraction(hit.rowId, hit.colKey);\n if (interaction.readonly || col?.type === \"boolean\") cursor = \"default\";\n else cursor = \"text\";\n this.canvas.style.cursor = cursor;\n }\n\n private measureRowHeight(\n ctx: CanvasRenderingContext2D,\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n ) {\n let maxHeight = this.rowHeight;\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n if (!c) continue;\n const wrap = view.wrapText?.[c.key] ?? c.wrapText;\n if (!wrap) continue;\n const w = (colWidths[idx] ?? 100) - this.padding;\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride ? \"#ERROR\" : this.formatValue(valueRes.value, c).text;\n const lines = this.wrapLines(ctx, text, w);\n const h = lines.length * this.lineHeight + this.padding;\n maxHeight = Math.max(maxHeight, h);\n }\n return maxHeight;\n }\n\n private wrapLines(ctx: CanvasRenderingContext2D, text: string, width: number) {\n const key = `${ctx.font}|${width}|${text}`;\n const cached = this.textMeasureCache.get(key);\n if (cached) {\n // LRU refresh\n this.textMeasureCache.delete(key);\n this.textMeasureCache.set(key, cached);\n return cached.lines;\n }\n const rawLines = text.split(\"\\n\");\n const lines: string[] = [];\n for (const line of rawLines) {\n let current = line;\n while (ctx.measureText(current).width > width && current.length > 1) {\n let cut = current.length;\n while (cut > 1 && ctx.measureText(current.slice(0, cut)).width > width) {\n cut -= 1;\n }\n lines.push(current.slice(0, cut));\n current = current.slice(cut);\n }\n lines.push(current);\n }\n this.textMeasureCache.set(key, { lines });\n while (this.textMeasureCache.size > CanvasRenderer.TEXT_MEASURE_CACHE_MAX) {\n const firstKey = this.textMeasureCache.keys().next().value as string | undefined;\n if (!firstKey) break;\n this.textMeasureCache.delete(firstKey);\n }\n return lines;\n }\n\n private fitTextLine(ctx: CanvasRenderingContext2D, text: string, width: number) {\n let out = text;\n while (ctx.measureText(out).width > width && out.length > 1) {\n out = `${out.slice(0, -2)}…`;\n }\n return out;\n }\n\n private getTextLinesForBounds(\n ctx: CanvasRenderingContext2D,\n text: string,\n width: number,\n wrap: boolean,\n height: number,\n ) {\n const raw = wrap ? this.wrapLines(ctx, text, width) : [this.fitTextLine(ctx, text, width)];\n const maxLines = Math.max(1, Math.floor(height / this.lineHeight));\n return raw.slice(0, maxLines);\n }\n\n private measureTextBounds(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\",\n ): DOMRect | null {\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n if (!lines.length) return null;\n let minX = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx] ?? \"\";\n const lineWidth = ctx.measureText(line).width;\n let startX = x;\n if (align === \"right\") startX = x + width - lineWidth;\n else if (align === \"center\") startX = x + (width - lineWidth) / 2;\n const lineTop = y + this.lineHeight * idx;\n const lineBottom = lineTop + this.lineHeight;\n minX = Math.min(minX, startX);\n maxX = Math.max(maxX, startX + lineWidth);\n minY = Math.min(minY, lineTop);\n maxY = Math.max(maxY, lineBottom);\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) return null;\n return new DOMRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n private drawCellText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\" = \"left\",\n isBoolean = false,\n isCustomBoolean = false,\n isUniqueBoolean = false,\n decorations?: { underline?: boolean; strike?: boolean },\n ) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x - 4, y - 4, width + 8, height + 8);\n ctx.clip();\n const fontBackup = ctx.font;\n if (isBoolean) {\n if (isUniqueBoolean) {\n ctx.font = `${UNIQUE_BOOL_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n } else {\n ctx.font = \"28px sans-serif\";\n }\n } else if (isCustomBoolean) {\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n }\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n const totalTextHeight = lines.length * this.lineHeight;\n const baseY = y + Math.max(0, Math.floor((height - totalTextHeight) / 2));\n const renderLine = (ln: string, lineIdx: number) => {\n const baseline = baseY + this.lineHeight * lineIdx;\n let startX = x;\n let endX = x;\n if (align === \"right\") {\n ctx.textAlign = \"right\";\n endX = x + width;\n startX = endX - ctx.measureText(ln).width;\n ctx.fillText(ln, endX, baseline);\n } else if (align === \"center\") {\n ctx.textAlign = \"center\";\n const center = x + width / 2;\n const w = ctx.measureText(ln).width;\n startX = center - w / 2;\n endX = center + w / 2;\n ctx.fillText(ln, center, baseline);\n } else {\n ctx.textAlign = \"left\";\n startX = x;\n endX = x + ctx.measureText(ln).width;\n ctx.fillText(ln, x, baseline);\n }\n if (decorations?.underline || decorations?.strike) {\n const strokeBackup = ctx.strokeStyle;\n const lineWidthBackup = ctx.lineWidth;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (decorations.underline) {\n const yUnderline = baseline + 2;\n ctx.moveTo(startX, yUnderline);\n ctx.lineTo(endX, yUnderline);\n }\n if (decorations.strike) {\n const yStrike = baseline - Math.floor(this.lineHeight / 2) + 2;\n ctx.moveTo(startX, yStrike);\n ctx.lineTo(endX, yStrike);\n }\n ctx.stroke();\n ctx.strokeStyle = strokeBackup;\n ctx.lineWidth = lineWidthBackup;\n }\n };\n for (let idx = 0; idx < lines.length; idx += 1) {\n renderLine(lines[idx] ?? \"\", idx + 1);\n }\n ctx.textAlign = \"left\";\n ctx.font = fontBackup;\n ctx.restore();\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"lookup\" && typeof obj.label === \"string\") {\n return { text: obj.label };\n }\n const labeled = resolveLabeledText(value);\n if (labeled !== null) return { text: labeled };\n }\n if (col.type === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? (fmtValue ?? \"yyyy-MM-dd\")\n : col.type === \"time\"\n ? (fmtValue ?? \"HH:mm\")\n : (fmtValue ?? \"yyyy-MM-dd'T'HH:mm:ss'Z'\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n","import type { CellAction, Command, EditMode, LookupCandidate, SelectionRange } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\nimport {\n coerceNumericForColumn,\n formatIntegerWithPrefix,\n formatNumberForEdit,\n normalizeNumericInput,\n parseNumericText,\n} from \"./numberIO\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n getFillHandleRect,\n getFillHandleSource,\n isPointInRect,\n makeFillValueGetter,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport { resolveButtonAction, resolveLinkAction } from \"./actionValue\";\n\ntype EditHandler = (cmd: Command, commit: boolean) => void;\ntype RowSelectHandler = (rowId: string) => void;\ntype MoveHandler = (rowId?: string) => void;\ntype HitTest = (\n event: MouseEvent,\n) => { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\ntype ActionHitTest = (\n event: MouseEvent,\n) =>\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null;\ntype ActiveChange = (rowId: string | null, colKey: string | null) => void;\ntype ContextMenuHandler = (\n rowId: string | null,\n colKey: string | null,\n clientX: number,\n clientY: number,\n) => void;\ntype SelectionChange = (ranges: SelectionRange[]) => void;\ntype UndoRedoHandler = () => void;\ntype ActionHandler = (action: CellAction) => void;\n\nexport class SelectionManager {\n private root: HTMLElement;\n private editMode: EditMode;\n private onEdit: EditHandler;\n private onRowSelect: RowSelectHandler;\n private onMove: MoveHandler;\n private hitTest: HitTest;\n private hitAction: ActionHitTest | null = null;\n private onContextMenu: ContextMenuHandler;\n private handleDocumentContextMenu: ((ev: MouseEvent) => void) | null = null;\n private selectionRanges: SelectionRange[] = [];\n private inputEl: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n private floatingInputWrapper: HTMLDivElement | null = null;\n private selectionInput: HTMLInputElement | null = null;\n private copyToastEl: HTMLDivElement | null = null;\n private copyToastTimer: number | null = null;\n\n private lookupDropdownEl: HTMLDivElement | null = null;\n private lookupDropdownTarget: { rowId: string; colKey: string } | null = null;\n private lookupCandidates: readonly LookupCandidate[] = [];\n private lookupHighlightIndex = -1;\n private lookupRequestId = 0;\n private lookupAbort: AbortController | null = null;\n private lookupDebounceTimer: number | null = null;\n private lookupInputCleanup: (() => void) | null = null;\n private lookupRecentHistory: Map<string, LookupCandidate> = new Map(); // colKey -> last selected candidate\n private lastCommittedLookupCell: { rowId: string; colKey: string } | null = null; // Track last committed lookup to prevent immediate re-popup\n\n private hoverTooltipEl: HTMLDivElement | null = null;\n private hoverTooltipTarget: { rowId: string; colKey: string } | null = null;\n private hoverTooltipMessage: string | null = null;\n private hoverTooltipRequestId = 0;\n private hoverTooltipAbort: AbortController | null = null;\n\n private externalEditInFlight = false;\n private externalEditRequestId = 0;\n private selectionMode = true;\n private lastBooleanCell: { rowId: string; colKey: string } | null = null;\n private selectionAnchor: { rowIndex: number; colIndex: number } | null = null;\n private dragging = false;\n private dragStart: { rowIndex: number; colIndex: number; kind: \"cells\" | \"rows\" } | null = null;\n private pointerDownClient: { x: number; y: number } | null = null;\n private dragMoved = false;\n private dragSelectionChanged = false;\n private suppressNextClick = false;\n private fillDragging = false;\n private fillSource: import(\"./fillHandle\").FillHandleSource | null = null;\n private fillEndRowIndex: number | null = null;\n private rootCursorBackup: string | null = null;\n private lastPointerClient: { x: number; y: number } | null = null;\n private autoScrollRaf: number | null = null;\n private autoScrollActive = false;\n private activeCell: { rowId: string; colKey: string | null } | null = null;\n private activeHost: HTMLElement | null = null;\n private activeHostOriginalText: string | null = null;\n private activeOriginalValue: { rowId: string; colKey: string; value: unknown } | null = null;\n private composing = false;\n private lastCompositionEnd = 0;\n private readonly handleInputCompositionStart = () => {\n this.composing = true;\n };\n private readonly handleInputCompositionEnd = () => {\n this.composing = false;\n this.lastCompositionEnd = Date.now();\n };\n private readonly handleSelectionBlur = (ev?: FocusEvent) => {\n // If focus is moving to the lookup dropdown, don't teardown\n if (ev?.relatedTarget instanceof HTMLElement) {\n if (this.lookupDropdownEl?.contains(ev.relatedTarget)) {\n return;\n }\n }\n this.teardownSelectionInput();\n };\n private readonly handleRootKeydown = async (ev: KeyboardEvent) => {\n if (ev.defaultPrevented) return;\n if (!this.selectionMode) return;\n if (this.inputEl) return;\n if (ev.isComposing || this.composing) return;\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (!accel) return;\n const key = ev.key.toLowerCase();\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n } else if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n }\n };\n private isCellReadonly: (rowId: string, colKey: string) => boolean;\n private sequenceLangs?: readonly string[];\n private onCellAction: ActionHandler;\n\n constructor(\n root: HTMLElement,\n editMode: EditMode,\n onEdit: EditHandler,\n onRowSelect: RowSelectHandler,\n onMove: MoveHandler,\n hitTest: HitTest,\n hitAction: ActionHitTest | null,\n private dataModel: DataModel,\n sequenceLangs: readonly string[] | undefined,\n isCellReadonly: (rowId: string, colKey: string) => boolean,\n onCellAction: ActionHandler,\n private onActiveChange: ActiveChange,\n onContextMenu: ContextMenuHandler,\n private onSelectionChange: SelectionChange,\n private onUndo: UndoRedoHandler,\n private onRedo: UndoRedoHandler,\n ) {\n this.root = root;\n this.editMode = editMode;\n this.onEdit = onEdit;\n this.onRowSelect = onRowSelect;\n this.onMove = onMove;\n this.hitTest = hitTest;\n this.hitAction = hitAction;\n this.sequenceLangs = sequenceLangs;\n this.isCellReadonly = isCellReadonly;\n this.onCellAction = onCellAction;\n this.onContextMenu = onContextMenu;\n this.bind();\n }\n\n setEditMode(mode: EditMode) {\n this.editMode = mode;\n }\n\n syncAfterRowsChanged() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) {\n this.selectionRanges = [];\n this.activeCell = null;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(true);\n this.onActiveChange(null, null);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n const maxRow = rows.length - 1;\n const maxCol = schema.columns.length - 1;\n\n const activeRowId = this.activeCell?.rowId ?? null;\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : -1;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : -1;\n\n // If current active cell is still visible, just clamp selection ranges when needed.\n if (activeRowIndex >= 0 && activeColIndex >= 0) {\n let changed = false;\n if (!this.selectionRanges.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: activeRowIndex,\n endRow: activeRowIndex,\n startCol: activeColIndex,\n endCol: activeColIndex,\n },\n ];\n changed = true;\n } else {\n const nextRanges: SelectionRange[] = this.selectionRanges.map((r) => {\n const clamp = (n: number, max: number) => Math.max(0, Math.min(max, n));\n const next: SelectionRange = {\n ...r,\n startRow: clamp(r.startRow, maxRow),\n endRow: clamp(r.endRow, maxRow),\n startCol: clamp(r.startCol, maxCol),\n endCol: clamp(r.endCol, maxCol),\n };\n if (\n next.startRow !== r.startRow ||\n next.endRow !== r.endRow ||\n next.startCol !== r.startCol ||\n next.endCol !== r.endCol\n ) {\n changed = true;\n }\n return next;\n });\n this.selectionRanges = nextRanges;\n }\n if (changed) this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n // Active row got filtered out (or active col disappeared): move to the nearest visible row/col.\n const desiredColKey = activeColKey ?? schema.columns[0]?.key ?? \"\";\n let colIndex = schema.columns.findIndex((c) => String(c.key) === String(desiredColKey));\n if (colIndex < 0) colIndex = 0;\n const colKey = schema.columns[colIndex]?.key ?? \"\";\n\n const baseIndex = activeRowId ? this.dataModel.getBaseRowIndex(activeRowId) : 0;\n const fallbackRow = rows[rows.length - 1] ?? rows[0] ?? null;\n const nextRow =\n rows.find((r) => this.dataModel.getBaseRowIndex(r.id) >= baseIndex) ?? fallbackRow;\n if (!nextRow) return;\n const rowId = nextRow.id;\n const rowIndex = this.dataModel.getRowIndex(rowId);\n\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n navigateToCell(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return;\n // Clear lastCommittedLookupCell when navigating to a cell\n this.lastCommittedLookupCell = null;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n const nextRange: SelectionRange = {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n cancelEditing() {\n this.teardownInput(true);\n }\n\n destroy() {\n this.root.removeEventListener(\"click\", this.handleClick);\n this.root.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.root.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.root.removeEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n this.root.removeEventListener(\"keydown\", this.handleRootKeydown);\n if (this.handleDocumentContextMenu) {\n document.removeEventListener(\"contextmenu\", this.handleDocumentContextMenu, true);\n }\n this.teardownInput(true);\n this.teardownSelectionInput();\n this.teardownCopyToast();\n removeFromParent(this.lookupDropdownEl);\n this.lookupDropdownEl = null;\n this.hideHoverTooltip();\n this.teardownHoverTooltip();\n this.stopAutoScroll();\n }\n\n onScroll(scrollTop: number, scrollLeft: number) {\n // Editors are positioned in scroll-container content coordinates and follow scroll automatically.\n void scrollTop;\n void scrollLeft;\n this.positionCopyToast();\n this.refreshHoverTooltipPosition();\n this.refreshLookupDropdownPosition();\n }\n\n private bind() {\n this.root.addEventListener(\"click\", this.handleClick);\n this.root.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.addEventListener(\"pointermove\", this.handlePointerMove);\n this.root.addEventListener(\"pointerup\", this.handlePointerUp);\n this.root.addEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.root.addEventListener(\"keydown\", this.handleRootKeydown);\n this.handleDocumentContextMenu = (ev: MouseEvent) => this.handleContextMenu(ev);\n document.addEventListener(\"contextmenu\", this.handleDocumentContextMenu, { capture: true });\n }\n\n private updateFillHandleFlag() {\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowId = this.activeCell?.rowId ?? null;\n this.root.dataset.extableFillHandle = shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n activeRowId,\n activeColKey,\n this.editMode,\n )\n ? \"1\"\n : \"\";\n }\n\n private findColumn(colKey: string) {\n const schema = this.dataModel.getSchema();\n return schema.columns.find((c) => c.key === colKey);\n }\n\n private pad2(n: number) {\n return String(n).padStart(2, \"0\");\n }\n\n private formatLocalDateForInput(d: Date) {\n return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())}`;\n }\n\n private formatLocalTimeForInput(d: Date) {\n return `${this.pad2(d.getHours())}:${this.pad2(d.getMinutes())}`;\n }\n\n private formatLocalDateTimeForInput(d: Date) {\n return `${this.formatLocalDateForInput(d)}T${this.formatLocalTimeForInput(d)}`;\n }\n\n private normalizeTemporalInitialValue(colType: \"date\" | \"time\" | \"datetime\", initial: string) {\n const value = initial.trim();\n if (!value) return \"\";\n\n if (colType === \"date\") {\n const m = value.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateForInput(d);\n return \"\";\n }\n\n if (colType === \"time\") {\n const m = value.match(/(\\d{2}:\\d{2})(?::\\d{2})?/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalTimeForInput(d);\n return \"\";\n }\n\n // datetime => input[type=\"datetime-local\"] expects \"YYYY-MM-DDTHH:mm\" (no timezone).\n if (/Z$/.test(value) && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value)) {\n return value.replace(/Z$/, \"\").slice(0, 16);\n }\n if (\n /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}/.test(value) &&\n !/[+-]\\d{2}:\\d{2}$/.test(value)\n ) {\n return value.slice(0, 16);\n }\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateTimeForInput(d);\n return \"\";\n }\n\n private ensureCopyToast() {\n if (this.copyToastEl) return this.copyToastEl;\n // Ensure a positioning context for the toast.\n const computed = window.getComputedStyle(this.root);\n if (computed.position === \"static\") {\n this.root.style.position = \"relative\";\n }\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.dataset.extableCopyToast = \"1\";\n toast.style.position = \"absolute\";\n toast.style.left = \"0\";\n toast.style.top = \"0\";\n toast.style.pointerEvents = \"none\";\n toast.style.zIndex = \"1000\";\n toast.style.display = \"none\";\n // Keep it from affecting layout.\n toast.style.margin = \"0\";\n this.root.appendChild(toast);\n this.copyToastEl = toast;\n return toast;\n }\n\n private teardownCopyToast() {\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n if (!this.copyToastEl) return;\n this.copyToastEl.style.display = \"none\";\n removeFromParent(this.copyToastEl);\n this.copyToastEl = null;\n }\n\n private positionCopyToast() {\n if (!this.copyToastEl) return;\n const w = this.copyToastEl.offsetWidth || 0;\n const h = this.copyToastEl.offsetHeight || 0;\n const inset = 16;\n const maxLeft = Math.max(0, this.root.scrollLeft + this.root.clientWidth - w - inset);\n const maxTop = Math.max(0, this.root.scrollTop + this.root.clientHeight - h - inset);\n const minLeft = Math.max(0, this.root.scrollLeft + inset);\n const minTop = Math.max(0, this.root.scrollTop + inset);\n const rootRect = this.root.getBoundingClientRect();\n const rect = this.getActiveCellRect();\n if (rect) {\n const candidateLeft = rect.right - rootRect.left + this.root.scrollLeft - w + 8;\n const candidateTop = rect.top - rootRect.top + this.root.scrollTop - h + 8;\n const left = Math.min(maxLeft, Math.max(minLeft, candidateLeft));\n const top = Math.min(maxTop, Math.max(minTop, candidateTop));\n this.copyToastEl.style.left = `${left}px`;\n this.copyToastEl.style.top = `${top}px`;\n return;\n }\n this.copyToastEl.style.left = `${maxLeft}px`;\n this.copyToastEl.style.top = `${maxTop}px`;\n }\n\n private showCopyToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 1200) {\n const toast = this.ensureCopyToast();\n toast.textContent = message;\n toast.dataset.variant = variant;\n toast.style.display = \"block\";\n this.positionCopyToast();\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n this.copyToastTimer = window.setTimeout(() => {\n toast.style.display = \"none\";\n }, durationMs);\n }\n\n private ensureHoverTooltip() {\n if (this.hoverTooltipEl) return this.hoverTooltipEl;\n // Ensure a positioning context.\n const computed = window.getComputedStyle(this.root);\n if (computed.position === \"static\") {\n this.root.style.position = \"relative\";\n }\n const tip = document.createElement(\"div\");\n tip.className = \"extable-tooltip\";\n tip.dataset.visible = \"0\";\n tip.style.position = \"absolute\";\n tip.style.left = \"0\";\n tip.style.top = \"0\";\n tip.style.pointerEvents = \"none\";\n tip.style.zIndex = \"1000\";\n this.root.appendChild(tip);\n this.hoverTooltipEl = tip;\n return tip;\n }\n\n private teardownHoverTooltip() {\n this.hoverTooltipAbort?.abort();\n this.hoverTooltipAbort = null;\n this.hoverTooltipRequestId += 1;\n this.hoverTooltipTarget = null;\n this.hoverTooltipMessage = null;\n removeFromParent(this.hoverTooltipEl);\n this.hoverTooltipEl = null;\n }\n\n private hideHoverTooltip() {\n if (this.hoverTooltipEl) this.hoverTooltipEl.dataset.visible = \"0\";\n this.hoverTooltipTarget = null;\n this.hoverTooltipMessage = null;\n this.hoverTooltipAbort?.abort();\n this.hoverTooltipAbort = null;\n this.hoverTooltipRequestId += 1;\n }\n\n private getCellRect(rowId: string, colKey: string): DOMRect | null {\n const cell = this.findHtmlCellElement(rowId, colKey);\n if (cell) return cell.getBoundingClientRect();\n return this.computeCanvasCellRect(rowId, colKey);\n }\n\n private positionTooltipAtRect(rect: DOMRect) {\n const tip = this.hoverTooltipEl;\n if (!tip) return;\n const pad = 8;\n const rootRect = this.root.getBoundingClientRect();\n const maxW = this.root.clientWidth;\n const maxH = this.root.clientHeight;\n let left = rect.right - rootRect.left + pad;\n let top = rect.top - rootRect.top + pad;\n let side: \"right\" | \"left\" = \"right\";\n const tRect = tip.getBoundingClientRect();\n if (left + tRect.width > maxW) {\n left = Math.max(0, rect.left - rootRect.left - tRect.width - pad);\n side = \"left\";\n }\n if (top + tRect.height > maxH) top = Math.max(0, maxH - tRect.height - pad);\n tip.style.left = `${left}px`;\n tip.style.top = `${top}px`;\n tip.dataset.side = side;\n }\n\n private refreshHoverTooltipPosition() {\n const tip = this.hoverTooltipEl;\n if (!tip || tip.dataset.visible !== \"1\") return;\n if (!this.hoverTooltipTarget || !this.hoverTooltipMessage) return;\n const rect = this.getCellRect(this.hoverTooltipTarget.rowId, this.hoverTooltipTarget.colKey);\n if (!rect) {\n this.hideHoverTooltip();\n return;\n }\n tip.textContent = this.hoverTooltipMessage;\n this.positionTooltipAtRect(rect);\n }\n\n private updateHoverTooltip(ev: PointerEvent) {\n if (this.inputEl) {\n this.hideHoverTooltip();\n return;\n }\n const hit = this.hitTest(ev as unknown as MouseEvent);\n if (!hit || hit.colKey === null || hit.colKey === \"__all__\" || hit.rowId === \"__header__\") {\n this.hideHoverTooltip();\n return;\n }\n const colKey = String(hit.colKey);\n const rowId = hit.rowId;\n // Keep existing marker tooltips (HTML: CSS, Canvas: renderer).\n const marker = this.dataModel.getCellMarker(rowId, colKey);\n if (marker) {\n this.hideHoverTooltip();\n return;\n }\n const col = this.findColumn(colKey);\n const getText = col?.tooltip?.getText;\n if (!getText) {\n this.hideHoverTooltip();\n return;\n }\n\n const sameTarget =\n this.hoverTooltipTarget?.rowId === rowId && this.hoverTooltipTarget?.colKey === colKey;\n if (sameTarget && this.hoverTooltipMessage) {\n const tip = this.ensureHoverTooltip();\n tip.textContent = this.hoverTooltipMessage;\n this.positionTooltipAtRect(hit.rect);\n tip.dataset.visible = \"1\";\n return;\n }\n\n this.hoverTooltipAbort?.abort();\n const controller = new AbortController();\n this.hoverTooltipAbort = controller;\n const requestId = (this.hoverTooltipRequestId += 1);\n this.hoverTooltipTarget = { rowId, colKey };\n this.hoverTooltipMessage = null;\n const value = this.dataModel.getCell(rowId, colKey);\n\n const applyText = (text: string | null) => {\n if (requestId !== this.hoverTooltipRequestId) return;\n if (controller.signal.aborted) return;\n if (!text) {\n this.hideHoverTooltip();\n return;\n }\n const tip = this.ensureHoverTooltip();\n this.hoverTooltipMessage = text;\n tip.textContent = text;\n this.positionTooltipAtRect(hit.rect);\n tip.dataset.visible = \"1\";\n };\n\n try {\n const res = getText({ rowId, colKey, value, signal: controller.signal });\n if (res && typeof (res as Promise<unknown>).then === \"function\") {\n void (res as Promise<string | null>).then(applyText).catch((err) => {\n if (requestId !== this.hoverTooltipRequestId) return;\n if (controller.signal.aborted) return;\n void err;\n this.hideHoverTooltip();\n this.showCopyToast(\"Tooltip failed\", \"error\", 1800);\n });\n } else {\n applyText(res as string | null);\n }\n } catch (err) {\n void err;\n this.hideHoverTooltip();\n this.showCopyToast(\"Tooltip failed\", \"error\", 1800);\n }\n }\n\n private ensureLookupDropdown() {\n if (this.lookupDropdownEl) {\n return this.lookupDropdownEl;\n }\n const computed = window.getComputedStyle(this.root);\n if (computed.position === \"static\") {\n this.root.style.position = \"relative\";\n }\n const el = document.createElement(\"div\");\n el.className = \"extable-lookup-dropdown\";\n el.dataset.visible = \"0\";\n el.style.position = \"absolute\";\n el.style.left = \"0\";\n el.style.top = \"0\";\n el.style.zIndex = \"1001\";\n el.style.display = \"none\";\n el.style.pointerEvents = \"auto\";\n this.root.appendChild(el);\n this.lookupDropdownEl = el;\n return el;\n }\n\n private hideLookupDropdown() {\n const el = this.lookupDropdownEl;\n if (!el) return;\n el.dataset.visible = \"0\";\n el.style.display = \"none\";\n el.replaceChildren();\n this.lookupCandidates = [];\n this.lookupHighlightIndex = -1;\n }\n\n private refreshLookupDropdownPosition() {\n const el = this.lookupDropdownEl;\n if (!el || el.dataset.visible !== \"1\") return;\n const target = this.lookupDropdownTarget;\n if (!target) {\n this.hideLookupDropdown();\n return;\n }\n const rect = this.getCellRect(target.rowId, target.colKey);\n if (!rect) {\n this.hideLookupDropdown();\n return;\n }\n const rootRect = this.root.getBoundingClientRect();\n el.style.left = `${rect.left - rootRect.left}px`;\n el.style.top = `${rect.bottom - rootRect.top + 2}px`;\n el.style.minWidth = `${Math.max(120, rect.width)}px`;\n }\n\n private renderLookupDropdown() {\n const el = this.ensureLookupDropdown();\n const items = this.lookupCandidates;\n if (!items.length || !this.lookupDropdownTarget) {\n this.hideLookupDropdown();\n return;\n }\n el.replaceChildren();\n items.forEach((c, index) => {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"extable-lookup-option\";\n btn.dataset.index = String(index);\n btn.dataset.active = index === this.lookupHighlightIndex ? \"1\" : \"0\";\n // Add [recent] badge for recently selected candidates\n const displayLabel = c.isRecent ? `${c.label} [recent]` : c.label;\n btn.textContent = displayLabel;\n btn.style.pointerEvents = \"auto\";\n btn.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n this.commitLookupCandidate(index);\n });\n el.appendChild(btn);\n });\n el.dataset.visible = \"1\";\n el.style.display = \"block\";\n el.style.zIndex = \"1001\";\n el.style.pointerEvents = \"auto\";\n this.refreshLookupDropdownPosition();\n }\n\n private commitLookupCandidate(index: number) {\n const target = this.lookupDropdownTarget;\n if (!target) {\n return;\n }\n const col = this.findColumn(target.colKey);\n const hook = col?.edit?.lookup;\n if (!hook) {\n return;\n }\n const candidate = this.lookupCandidates[index];\n if (!candidate) {\n return;\n }\n // Store original candidate (without isRecent flag) for history and commit\n const originalCandidate = { label: candidate.label, value: candidate.value, meta: candidate.meta };\n const stored = hook.toStoredValue\n ? hook.toStoredValue(originalCandidate)\n : col?.type === \"labeled\"\n ? { label: originalCandidate.label, value: originalCandidate.value }\n : { kind: \"lookup\", label: originalCandidate.label, value: originalCandidate.value, meta: originalCandidate.meta };\n // Store in recent history if recentLookup is enabled\n if (hook.recentLookup !== false) { // Default: true\n this.lookupRecentHistory.set(target.colKey, originalCandidate);\n }\n // Record committed cell to prevent immediate re-popup\n this.lastCommittedLookupCell = { rowId: target.rowId, colKey: target.colKey };\n // Hide lookup dropdown before teardown to prevent input event interference\n this.hideLookupDropdown();\n // Teardown current input editor\n this.teardownInput(false);\n // Commit edit to data model\n this.commitEdit(target.rowId, target.colKey, stored);\n // Notify listeners of move\n this.onMove(target.rowId);\n // Delay focusSelectionInput to ensure all synchronous processing (including external render) completes first\n requestAnimationFrame(() => {\n // Verify we're still on the same cell\n if (this.activeCell?.rowId === target.rowId && this.activeCell?.colKey === target.colKey) {\n // Show the committed label, not the partial input text\n this.focusSelectionInput(originalCandidate.label);\n } else {\n }\n });\n }\n\n private setupLookupEditor(\n rowId: string,\n colKey: string,\n input: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n ) {\n this.teardownLookupEditor();\n const col = this.findColumn(colKey);\n const hook = col?.edit?.lookup;\n if (!hook) {\n return;\n }\n if (!(input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)) {\n return;\n }\n\n this.lookupDropdownTarget = { rowId, colKey };\n\n // If using selectionInput in edit mode, make it visible and editable\n // In selection mode, keep input hidden but show dropdown\n if (input === this.selectionInput && !this.selectionMode) {\n input.readOnly = false;\n input.inputMode = \"text\";\n // Position input inside the cell for visual feedback\n const rect = this.getCellRect(rowId, colKey);\n if (rect) {\n const rootRect = this.root.getBoundingClientRect();\n input.style.transform = \"none\";\n input.style.left = `${rect.left - rootRect.left}px`;\n input.style.top = `${rect.top - rootRect.top}px`;\n input.style.width = `${rect.width}px`;\n input.style.height = `${rect.height}px`;\n input.style.opacity = \"1\";\n input.style.pointerEvents = \"auto\";\n input.style.padding = \"2px 4px\";\n input.style.border = \"none\";\n input.style.background = \"#fff\";\n input.style.color = \"#000\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.boxSizing = \"border-box\";\n input.style.zIndex = \"100\";\n // Safari-specific fixes\n (input.style as any).WebkitAppearance = \"none\";\n (input.style as any).WebkitUserSelect = \"text\";\n (input.style as any).WebkitUserModify = \"read-write\";\n }\n }\n\n // Initialize recent history from current cell value if it's a labeled value\n if (hook.recentLookup !== false) {\n const currentValue = this.dataModel.getCell(rowId, colKey);\n if (typeof currentValue === \"object\" && currentValue !== null) {\n const obj = currentValue as Record<string, unknown>;\n if (typeof obj.label === \"string\" && \"value\" in obj && !obj.kind) {\n // This is a labeled value\n this.lookupRecentHistory.set(colKey, {\n label: obj.label as string,\n value: obj.value as string,\n });\n }\n }\n }\n\n let lastFetchedCandidateCount = -1;\n const debounceMs = hook.debounceMs ?? 250;\n\n const schedule = (immediateOrEvent?: boolean | Event) => {\n const immediate = typeof immediateOrEvent === \"boolean\" ? immediateOrEvent : false;\n const query = input.value;\n if (this.lookupDebounceTimer) {\n window.clearTimeout(this.lookupDebounceTimer);\n this.lookupDebounceTimer = null;\n }\n this.lookupAbort?.abort();\n this.lookupAbort = null;\n this.lookupRequestId += 1;\n\n const requestId = this.lookupRequestId;\n const prevCandidateCount = lastFetchedCandidateCount;\n\n const executeFetch = () => {\n this.lookupDebounceTimer = null;\n const controller = new AbortController();\n this.lookupAbort = controller;\n void hook\n .fetchCandidates({ query, rowId, colKey, signal: controller.signal })\n .then((candidates) => {\n if (requestId !== this.lookupRequestId) return;\n if (controller.signal.aborted) return;\n if (!this.activeCell || this.activeCell.rowId !== rowId || this.activeCell.colKey !== colKey)\n return;\n\n // Apply recentLookup: add recently selected candidate to the beginning if not already present\n let finalCandidates = Array.from(candidates);\n if (hook.recentLookup !== false) { // Default: true\n const recentCandidate = this.lookupRecentHistory.get(colKey);\n if (recentCandidate) {\n // Remove if duplicate exists\n finalCandidates = finalCandidates.filter(c => !(c.label === recentCandidate.label && c.value === recentCandidate.value));\n // Add to front with isRecent flag for UI display\n const recentWithBadge = { ...recentCandidate, isRecent: true };\n finalCandidates.unshift(recentWithBadge);\n }\n }\n\n lastFetchedCandidateCount = finalCandidates.length;\n // Auto-commit if narrowed down from multiple to exactly one (only if allowFreeInput is false/disabled)\n // Recent candidates should not trigger auto-selection\n const nonRecentCandidates = finalCandidates.filter(c => !c.isRecent);\n if (!hook.allowFreeInput && prevCandidateCount > 1 && nonRecentCandidates.length === 1) {\n const autoSelectIndex = finalCandidates.indexOf(nonRecentCandidates[0]);\n this.lookupCandidates = finalCandidates;\n this.lookupHighlightIndex = autoSelectIndex;\n this.commitLookupCandidate(autoSelectIndex);\n return;\n }\n this.lookupCandidates = finalCandidates;\n this.lookupHighlightIndex = finalCandidates.length ? 0 : -1;\n this.renderLookupDropdown();\n })\n .catch((err) => {\n if (requestId !== this.lookupRequestId) return;\n if (controller.signal.aborted) return;\n void err;\n this.hideLookupDropdown();\n this.showCopyToast(\"Lookup failed\", \"error\", 1800);\n });\n };\n\n if (immediate) {\n executeFetch();\n } else {\n this.lookupDebounceTimer = window.setTimeout(executeFetch, debounceMs);\n }\n };\n\n input.addEventListener(\"input\", schedule);\n this.lookupInputCleanup = () => input.removeEventListener(\"input\", schedule);\n // Kick off the initial fetch immediately (no debounce)\n schedule(true);\n }\n\n private teardownLookupEditor() {\n if (this.lookupDebounceTimer) {\n window.clearTimeout(this.lookupDebounceTimer);\n this.lookupDebounceTimer = null;\n }\n this.lookupAbort?.abort();\n this.lookupAbort = null;\n this.lookupRequestId += 1;\n this.lookupInputCleanup?.();\n this.lookupInputCleanup = null;\n this.lookupDropdownTarget = null;\n this.hideLookupDropdown();\n // Reset selectionInput to hidden state if it was used for lookup\n if (this.selectionInput) {\n const input = this.selectionInput;\n input.readOnly = true;\n input.inputMode = \"none\";\n input.style.transform = \"translate(-10000px, 0)\";\n input.style.width = \"1px\";\n input.style.height = \"1px\";\n input.style.opacity = \"0\";\n input.style.pointerEvents = \"none\";\n input.style.padding = \"0\";\n input.style.border = \"none\";\n input.style.background = \"transparent\";\n }\n }\n\n private handleLookupKeydown(e: KeyboardEvent): boolean {\n const el = this.lookupDropdownEl;\n if (!el || el.dataset.visible !== \"1\") return false;\n if (!this.lookupCandidates.length) return false;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this.lookupHighlightIndex = Math.min(\n this.lookupCandidates.length - 1,\n Math.max(0, this.lookupHighlightIndex + 1),\n );\n this.renderLookupDropdown();\n return true;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this.lookupHighlightIndex = Math.max(0, this.lookupHighlightIndex - 1);\n this.renderLookupDropdown();\n return true;\n }\n if (e.key === \"Enter\") {\n const target = this.lookupDropdownTarget;\n const col = target ? this.findColumn(target.colKey) : null;\n const hook = col?.edit?.lookup;\n\n // If allowFreeInput is enabled, commit the free text input instead of selected candidate\n if (hook?.allowFreeInput) {\n e.preventDefault();\n const inputEl = this.selectionInput || this.inputEl;\n if (inputEl && target) {\n const freeText = inputEl.value;\n this.hideLookupDropdown();\n this.teardownInput(false);\n this.commitEdit(target.rowId, target.colKey, freeText);\n this.onMove(target.rowId);\n requestAnimationFrame(() => {\n if (this.activeCell?.rowId === target.rowId && this.activeCell?.colKey === target.colKey) {\n this.focusSelectionInput(freeText);\n }\n });\n }\n return true;\n }\n\n // For non-allowFreeInput, commit the highlighted candidate\n if (this.lookupHighlightIndex >= 0) {\n e.preventDefault();\n this.commitLookupCandidate(this.lookupHighlightIndex);\n return true;\n }\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.hideLookupDropdown();\n return true;\n }\n return false;\n }\n\n private tryStartExternalEditor(rowId: string, colKey: string): boolean {\n const col = this.findColumn(colKey);\n const open = col?.edit?.externalEditor?.open;\n if (!open) return false;\n if (this.editMode === \"readonly\") return true;\n if (this.isCellReadonly(rowId, colKey)) return true;\n\n if (this.externalEditInFlight) return true;\n\n const requestId = (this.externalEditRequestId += 1);\n this.externalEditInFlight = true;\n const currentValue = this.dataModel.getCell(rowId, colKey);\n\n // Ensure we stay in selection mode (no inline editor).\n this.selectionMode = true;\n try {\n const currentText = this.cellToClipboardString(currentValue);\n this.focusSelectionInput(currentText);\n } catch {\n // ignore\n }\n\n void open({ rowId, colKey, currentValue })\n .then((res) => {\n if (requestId !== this.externalEditRequestId) return;\n this.externalEditInFlight = false;\n if (!this.activeCell || this.activeCell.rowId !== rowId || this.activeCell.colKey !== colKey)\n return;\n if (res.kind === \"commit\") {\n this.commitEdit(rowId, colKey, res.value);\n const nextText = this.cellToClipboardString(res.value);\n this.focusSelectionInput(nextText);\n }\n if (res.kind === \"cancel\") {\n try {\n const nextText = this.cellToClipboardString(currentValue);\n this.focusSelectionInput(nextText);\n } catch {\n // ignore\n }\n }\n })\n .catch((err) => {\n if (requestId !== this.externalEditRequestId) return;\n this.externalEditInFlight = false;\n void err;\n this.showCopyToast(\"External editor failed\", \"error\", 1800);\n });\n\n return true;\n }\n\n private handlePointerLeave = () => {\n this.hideHoverTooltip();\n };\n\n private ensureSelectionInput() {\n if (this.selectionInput) return this.selectionInput;\n const input = document.createElement(\"input\");\n input.type = \"text\";\n // This input exists only to receive keyboard/clipboard/IME events in selection mode.\n // It is not a text editor.\n input.readOnly = true;\n // Helps suppress virtual keyboards; also reduces IME oddities on some platforms.\n input.inputMode = \"none\";\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.style.position = \"absolute\";\n input.style.left = \"0\";\n input.style.top = \"0\";\n // Avoid affecting scroll extents in the scroll container.\n input.style.transform = \"translate(-10000px, 0)\";\n input.style.width = \"1px\";\n input.style.height = \"1px\";\n input.style.opacity = \"0\";\n input.style.pointerEvents = \"none\";\n input.addEventListener(\"keydown\", (e) => {\n this.handleSelectionKeydown(e);\n });\n input.addEventListener(\"beforeinput\", (e) => {\n this.handleSelectionBeforeInput(e);\n });\n input.addEventListener(\"input\", (e) => {\n });\n input.addEventListener(\"change\", (e) => {\n });\n input.addEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.addEventListener(\"copy\", this.handleSelectionCopy);\n input.addEventListener(\"cut\", this.handleSelectionCut);\n input.addEventListener(\"paste\", this.handleSelectionPaste);\n input.addEventListener(\"blur\", (e) => {\n this.handleSelectionBlur(e);\n });\n input.addEventListener(\"focus\", (e) => {\n });\n // Keep the selection input inside the table container (root), but offscreen.\n this.root.appendChild(input);\n this.selectionInput = input;\n return input;\n }\n\n private focusSelectionInput(valueForSelection: string) {\n const input = this.ensureSelectionInput();\n input.value = valueForSelection;\n this.selectionMode = true;\n input.focus({ preventScroll: true });\n input.select();\n\n // If active cell has lookup, setup lookup editor to show dropdown on selection\n // Skip if this is the cell where we just committed a lookup candidate (prevent immediate re-popup)\n if (this.activeCell && this.activeCell.colKey) {\n const isJustCommitted = this.lastCommittedLookupCell &&\n this.lastCommittedLookupCell.rowId === this.activeCell.rowId &&\n this.lastCommittedLookupCell.colKey === this.activeCell.colKey;\n\n if (!isJustCommitted) {\n const col = this.findColumn(this.activeCell.colKey);\n if (col?.edit?.lookup) {\n this.setupLookupEditor(this.activeCell.rowId, this.activeCell.colKey, input);\n }\n }\n }\n }\n\n private openEditorAtActiveCell(options?: {\n initialValueOverride?: string;\n placeCursorAtEnd?: boolean;\n }) {\n if (!this.activeCell) return;\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n\n if (this.tryStartExternalEditor(rowId, colKey)) {\n return;\n }\n\n // Check if we can use selectionInput (only for simple text/textarea inputs)\n const col = this.findColumn(colKey);\n const canUseSelectionInput = col && this.canReuseSelectionInput(col);\n\n if (this.selectionInput && canUseSelectionInput) {\n // Make selectionInput visible and editable\n const input = this.selectionInput;\n input.readOnly = false;\n input.inputMode = \"text\";\n\n // Position input inside the cell\n const rect = this.getCellRect(rowId, colKey);\n if (rect) {\n const rootRect = this.root.getBoundingClientRect();\n input.style.transform = \"none\";\n input.style.left = `${rect.left - rootRect.left}px`;\n input.style.top = `${rect.top - rootRect.top}px`;\n input.style.width = `${rect.width}px`;\n input.style.height = `${rect.height}px`;\n input.style.opacity = \"1\";\n input.style.pointerEvents = \"auto\";\n input.style.padding = \"2px 4px\";\n input.style.border = \"none\";\n input.style.background = \"#fff\";\n input.style.color = \"#000\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.boxSizing = \"border-box\";\n input.style.zIndex = \"100\";\n // Safari-specific fixes\n (input.style as any).WebkitAppearance = \"none\";\n (input.style as any).WebkitUserSelect = \"text\";\n (input.style as any).WebkitUserModify = \"read-write\";\n }\n\n // Set initial value if provided\n if (options?.initialValueOverride !== undefined) {\n input.value = options.initialValueOverride;\n } else {\n const current = this.dataModel.getCell(rowId, colKey);\n input.value = this.getInitialEditValue(colKey, current);\n }\n\n // Store input as inputEl for edit mode operations\n this.inputEl = input;\n this.activeOriginalValue = { rowId, colKey, value: this.dataModel.getCell(rowId, colKey) };\n\n // Setup lookup editor if column has lookup\n if (col?.edit?.lookup) {\n this.setupLookupEditor(rowId, colKey, input);\n }\n\n input.focus({ preventScroll: true });\n if (options?.placeCursorAtEnd) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n return;\n }\n\n // Use traditional cell-based editor for special input types\n const cell = this.findHtmlCellElement(rowId, colKey);\n if (cell) {\n this.activateCellElement(cell, rowId, colKey, options);\n return;\n }\n const rect = this.computeCanvasCellRect(rowId, colKey);\n if (rect) {\n this.activateFloating(rect, rowId, colKey, options);\n }\n }\n\n private canReuseSelectionInput(col: import(\"./types\").ColumnSchema): boolean {\n // Only reuse selectionInput for simple text inputs\n // Special input types (date, datetime, time, select, etc.) need dedicated elements\n if (col.type === \"string\" || col.type === \"labeled\") {\n // Check if lookup is present - lookup with text input can reuse selectionInput\n return true;\n }\n if (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") {\n // Number inputs can reuse selectionInput\n return true;\n }\n // Other types need specialized inputs\n return false;\n }\n\n private escapeCssAttrValue(value: string) {\n return CSS.escape(value);\n }\n\n private findHtmlCellElement(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const key = String(colKey);\n const rowIdEsc = this.escapeCssAttrValue(rowId);\n const keyEsc = this.escapeCssAttrValue(key);\n return (\n this.root.querySelector<HTMLElement>(\n `tr[data-row-id=\"${rowIdEsc}\"] td[data-col-key=\"${keyEsc}\"]`,\n ) ?? null\n );\n }\n\n private computeCanvasCellRect(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return null;\n const rootRect = this.root.getBoundingClientRect();\n return new DOMRect(\n rootRect.left + box.left - this.root.scrollLeft,\n rootRect.top + box.top - this.root.scrollTop,\n box.width,\n box.height,\n );\n }\n\n private computeCanvasCellBoxContent(rowId: string, colKey: string) {\n const canvas = this.root.querySelector<HTMLCanvasElement>(\n 'canvas[data-extable-renderer=\"canvas\"]',\n );\n if (!canvas) return null;\n return this.getCanvasCellMetrics(rowId, colKey);\n }\n\n private getCanvasCellMetrics(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = rows.findIndex((r) => r.id === rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return null;\n\n const headerHeight = HEADER_HEIGHT_PX;\n const rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n const defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n const colWidths = getColumnWidths(schema, view);\n\n let left = rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) left += colWidths[i] ?? 100;\n\n let top = headerHeight;\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) return null;\n const h = this.dataModel.getRowHeight(row.id) ?? defaultRowHeight;\n top += h;\n }\n const height = this.dataModel.getRowHeight(rowId) ?? defaultRowHeight;\n const width = colWidths[colIndex] ?? 100;\n return { left, top, width, height, rowIndex, colIndex };\n }\n\n private getActiveCellRect() {\n const active = this.activeCell;\n if (!active) return null;\n const rootRect = this.root.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n if (active.rowId === \"__all__\" && active.colKey === \"__all__\") {\n return new DOMRect(rootRect.left, rootRect.top, ROW_HEADER_WIDTH_PX, HEADER_HEIGHT_PX);\n }\n if (active.rowId === \"__header__\" && active.colKey !== null) {\n const key = this.escapeCssAttrValue(String(active.colKey));\n const headerEl = this.root.querySelector<HTMLElement>(`th[data-col-key=\"${key}\"]`);\n if (headerEl) return headerEl.getBoundingClientRect();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(active.colKey));\n if (colIndex >= 0) {\n const colWidths = getColumnWidths(schema, view);\n let x = ROW_HEADER_WIDTH_PX;\n for (let i = 0; i < colIndex; i += 1) x += colWidths[i] ?? 100;\n const width = colWidths[colIndex] ?? 100;\n return new DOMRect(\n rootRect.left + x - this.root.scrollLeft,\n rootRect.top,\n width,\n HEADER_HEIGHT_PX,\n );\n }\n }\n if (active.colKey === null) {\n const rowIndex = this.dataModel.getRowIndex(active.rowId);\n if (rowIndex >= 0) {\n let y = HEADER_HEIGHT_PX;\n const rows = this.dataModel.listRows();\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) break;\n y += this.dataModel.getRowHeight(row.id) ?? DEFAULT_ROW_HEIGHT_PX;\n }\n const height = this.dataModel.getRowHeight(active.rowId) ?? DEFAULT_ROW_HEIGHT_PX;\n return new DOMRect(\n rootRect.left,\n rootRect.top + y - this.root.scrollTop,\n ROW_HEADER_WIDTH_PX,\n height,\n );\n }\n }\n if (active.colKey === null) return null;\n const cellEl = this.findHtmlCellElement(active.rowId, active.colKey);\n if (cellEl) return cellEl.getBoundingClientRect();\n return this.computeCanvasCellRect(active.rowId, active.colKey);\n }\n\n private ensureVisibleCell(rowId: string, colKey: string) {\n const htmlCell = this.findHtmlCellElement(rowId, colKey);\n if (htmlCell) {\n if (typeof (htmlCell as HTMLElement).scrollIntoView === \"function\") {\n (htmlCell as HTMLElement).scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }\n return;\n }\n const metrics = this.getCanvasCellMetrics(rowId, colKey);\n if (!metrics) return;\n const xStart = metrics.left;\n const xEnd = metrics.left + metrics.width;\n const yStart = metrics.top;\n const yEnd = metrics.top + metrics.height;\n\n const leftVis = this.root.scrollLeft;\n const rightVis = this.root.scrollLeft + this.root.clientWidth;\n const topVis = this.root.scrollTop;\n const bottomVis = this.root.scrollTop + this.root.clientHeight;\n\n if (xStart < leftVis) this.root.scrollLeft = Math.max(0, xStart);\n else if (xEnd > rightVis) this.root.scrollLeft = Math.max(0, xEnd - this.root.clientWidth);\n\n if (yStart < topVis) this.root.scrollTop = Math.max(0, yStart);\n else if (yEnd > bottomVis) this.root.scrollTop = Math.max(0, yEnd - this.root.clientHeight);\n }\n\n private moveActiveCell(deltaRow: number, deltaCol: number, extendSelection = false) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) return;\n const { rowIndex, colIndex } = this.getActiveIndices();\n // Clear lastCommittedLookupCell when moving to a different cell\n this.lastCommittedLookupCell = null;\n if (!extendSelection) this.selectionAnchor = null;\n const anchor =\n extendSelection && this.selectionAnchor\n ? this.selectionAnchor\n : extendSelection\n ? { rowIndex, colIndex }\n : null;\n if (extendSelection && !this.selectionAnchor) this.selectionAnchor = { rowIndex, colIndex };\n const nextRowIndex = Math.max(0, Math.min(rows.length - 1, rowIndex + deltaRow));\n const nextColIndex = Math.max(0, Math.min(schema.columns.length - 1, colIndex + deltaCol));\n {\n const row = rows[nextRowIndex];\n if (!row) return;\n const col = schema.columns[nextColIndex];\n if (!col) return;\n const rowId = row.id;\n const colKey = col.key;\n\n const nextRange: SelectionRange = anchor\n ? {\n kind: \"cells\",\n startRow: anchor.rowIndex,\n endRow: nextRowIndex,\n startCol: anchor.colIndex,\n endCol: nextColIndex,\n }\n : {\n kind: \"cells\",\n startRow: nextRowIndex,\n endRow: nextRowIndex,\n startCol: nextColIndex,\n endCol: nextColIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n this.updateFillHandleFlag();\n return;\n }\n }\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (ev.button !== 0) return;\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) return;\n if (el?.closest(\".extable-filter-sort-trigger\")) return;\n // Don't interfere with lookup dropdown button clicks\n if (el?.closest('button.extable-lookup-option')) {\n return;\n }\n // Avoid starting a drag from inside an active editor.\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) return;\n // Commit current editor before starting a drag/select operation.\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n if (!this.tryCommitActiveEditor()) return;\n }\n if (this.fillDragging) return;\n const hit = this.hitTest(ev as unknown as MouseEvent);\n if (!hit) return;\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") return;\n if (hit.colKey === \"__all__\") return;\n\n // Fill handle drag starts only when the pointer is down on the handle area.\n const fillSrc = getFillHandleSource(this.dataModel, this.selectionRanges);\n if (fillSrc && this.activeCell) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const handleRowIndex = fillSrc.endRowIndex;\n const handleColIndex = fillSrc.colIndex;\n const handleRow = rows[handleRowIndex];\n const handleCol = schema.columns[handleColIndex];\n if (handleRow && handleCol) {\n const cellRect =\n this.findHtmlCellElement(handleRow.id, handleCol.key)?.getBoundingClientRect() ??\n this.computeCanvasCellRect(handleRow.id, handleCol.key);\n if (\n cellRect &&\n shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n this.activeCell.rowId,\n this.activeCell.colKey,\n this.editMode,\n )\n ) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(ev.clientX, ev.clientY, handleRect)) {\n ev.preventDefault();\n this.fillDragging = true;\n this.fillSource = fillSrc;\n this.fillEndRowIndex = fillSrc.endRowIndex;\n this.root.dataset.extableFillDragging = \"1\";\n if (this.rootCursorBackup === null)\n this.rootCursorBackup = this.root.style.cursor || \"\";\n this.root.style.cursor = \"crosshair\";\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n this.dragging = false;\n this.dragStart = null;\n this.suppressNextClick = true;\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n // Expand selection to include filled range preview (start with source).\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: fillSrc.startRowIndex,\n endRow: fillSrc.endRowIndex,\n startCol: fillSrc.colIndex,\n endCol: fillSrc.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n this.startAutoScroll();\n return;\n }\n }\n }\n }\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const rowIndex = hit.rowId === \"__header__\" ? 0 : this.dataModel.getRowIndex(hit.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex < 0) return;\n\n if (hit.rowId === \"__header__\") {\n // Select entire column when clicking column header.\n if (!rows.length) return;\n const range: SelectionRange = {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [range];\n this.onSelectionChange(this.selectionRanges);\n this.dragging = false;\n this.selectionMode = true;\n this.dragStart = null;\n this.selectionAnchor = null;\n this.suppressNextClick = false;\n const targetRow = rows[0];\n const targetCol = schema.columns[colIndex];\n if (targetRow && targetCol) {\n this.activeCell = { rowId: targetRow.id, colKey: targetCol.key };\n this.onActiveChange(targetRow.id, targetCol.key);\n }\n this.focusSelectionInput(\"\");\n return;\n }\n\n if (rowIndex < 0) return;\n\n const kind: \"cells\" | \"rows\" = hit.colKey === null ? \"rows\" : \"cells\";\n this.dragging = true;\n this.pointerDownClient = { x: ev.clientX, y: ev.clientY };\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.dragStart = { rowIndex, colIndex, kind };\n this.suppressNextClick = false;\n this.selectionMode = true;\n this.selectionAnchor = null;\n // Clear lastCommittedLookupCell when clicking on a cell (starting drag/select)\n this.lastCommittedLookupCell = null;\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.startAutoScroll();\n };\n\n private getHitAtClientPoint(\n clientX: number,\n clientY: number,\n fallbackTarget?: EventTarget | null,\n ) {\n // Prefer coordinate-based hit-test for auto-scroll ticks (no real event.target).\n let el = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n if (!el && fallbackTarget instanceof HTMLElement) {\n el = fallbackTarget;\n }\n if (el && this.root.contains(el)) {\n const corner = el.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = el.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const colHeader = el.closest<HTMLElement>(\"th[data-col-key]\");\n if (colHeader) {\n return {\n rowId: \"__header__\",\n colKey: colHeader.dataset.colKey ?? \"\",\n element: colHeader,\n rect: colHeader.getBoundingClientRect(),\n };\n }\n const cell = el.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (cell && row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n }\n // Canvas renderer hitTest does not rely on target; a minimal shape is enough.\n const target = fallbackTarget instanceof HTMLElement ? fallbackTarget : null;\n return this.hitTest({ clientX, clientY, target } as unknown as MouseEvent);\n }\n\n private updateDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.dragging || !this.dragStart) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (\n hit.colKey === \"__all__\" ||\n (this.dragStart.kind === \"cells\" && hit.colKey === null)\n )\n return;\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const endColIndex =\n this.dragStart.kind === \"rows\"\n ? schema.columns.length - 1\n : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (endColIndex < 0) return;\n\n const startRow = this.dragStart.rowIndex;\n const startCol = this.dragStart.kind === \"rows\" ? 0 : this.dragStart.colIndex;\n const endCol = this.dragStart.kind === \"rows\" ? schema.columns.length - 1 : endColIndex;\n if (endRowIndex !== startRow || endCol !== startCol) {\n this.dragSelectionChanged = true;\n }\n const nextRange: SelectionRange = {\n kind: this.dragStart.kind,\n startRow,\n endRow: endRowIndex,\n startCol,\n endCol,\n };\n this.selectionRanges = [nextRange];\n const activeRowId = rows[endRowIndex]?.id ?? hit.rowId;\n const activeColKey =\n this.dragStart.kind === \"rows\"\n ? (schema.columns[0]?.key ?? hit.colKey)\n : (schema.columns[endColIndex]?.key ?? hit.colKey);\n this.activeCell = { rowId: activeRowId, colKey: activeColKey };\n this.onActiveChange(activeRowId, activeColKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n }\n\n private updateFillDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.fillDragging || !this.fillSource) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (hit.colKey === \"__all__\" || hit.colKey === null) return;\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex !== this.fillSource.colIndex) return;\n\n // Vertical fill only; allow dragging downwards from the source end.\n const nextEnd = Math.max(this.fillSource.endRowIndex, endRowIndex);\n if (this.fillEndRowIndex !== nextEnd) {\n this.fillEndRowIndex = nextEnd;\n const activeRowId = rows[nextEnd]?.id ?? hit.rowId;\n const col = schema.columns[this.fillSource.colIndex];\n if (!col) return;\n const colKey = col.key;\n this.activeCell = { rowId: activeRowId, colKey };\n this.onActiveChange(activeRowId, colKey);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: this.fillSource.startRowIndex,\n endRow: nextEnd,\n startCol: this.fillSource.colIndex,\n endCol: this.fillSource.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n }\n this.suppressNextClick = true;\n }\n\n private computeAutoScrollDelta(clientX: number, clientY: number) {\n const rect = this.root.getBoundingClientRect();\n const threshold = 24;\n const maxStep = 18;\n let dx = 0;\n let dy = 0;\n if (clientX < rect.left + threshold) {\n dx = -Math.ceil(((rect.left + threshold - clientX) / threshold) * maxStep);\n } else if (clientX > rect.right - threshold) {\n dx = Math.ceil(((clientX - (rect.right - threshold)) / threshold) * maxStep);\n }\n if (clientY < rect.top + threshold) {\n dy = -Math.ceil(((rect.top + threshold - clientY) / threshold) * maxStep);\n } else if (clientY > rect.bottom - threshold) {\n dy = Math.ceil(((clientY - (rect.bottom - threshold)) / threshold) * maxStep);\n }\n return { dx, dy };\n }\n\n private startAutoScroll() {\n if (this.autoScrollActive) return;\n this.autoScrollActive = true;\n const tick = () => {\n if (!this.autoScrollActive) return;\n const p = this.lastPointerClient;\n if (!p || (!this.dragging && !this.fillDragging)) {\n this.stopAutoScroll();\n return;\n }\n const { dx, dy } = this.computeAutoScrollDelta(p.x, p.y);\n if (dx !== 0 || dy !== 0) {\n const prevTop = this.root.scrollTop;\n const prevLeft = this.root.scrollLeft;\n this.root.scrollTop = Math.max(0, prevTop + dy);\n this.root.scrollLeft = Math.max(0, prevLeft + dx);\n // While scrolling, keep updating selection/fill based on the latest pointer position.\n if (this.fillDragging) this.updateFillDragFromClientPoint(p.x, p.y);\n else this.updateDragFromClientPoint(p.x, p.y);\n }\n this.autoScrollRaf = window.requestAnimationFrame(tick);\n };\n this.autoScrollRaf = window.requestAnimationFrame(tick);\n }\n\n private stopAutoScroll() {\n this.autoScrollActive = false;\n if (this.autoScrollRaf !== null) {\n window.cancelAnimationFrame(this.autoScrollRaf);\n this.autoScrollRaf = null;\n }\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n if (this.fillDragging && this.fillSource) {\n this.updateFillDragFromClientPoint(ev.clientX, ev.clientY);\n return;\n }\n if (!this.dragging || !this.dragStart) {\n this.updateHoverTooltip(ev);\n return;\n }\n if (!this.dragMoved && this.pointerDownClient) {\n const dx = ev.clientX - this.pointerDownClient.x;\n const dy = ev.clientY - this.pointerDownClient.y;\n // Ignore tiny pointer jitter so clicks aren't suppressed.\n if (dx * dx + dy * dy < 9) return;\n this.dragMoved = true;\n }\n this.updateDragFromClientPoint(ev.clientX, ev.clientY);\n };\n\n private handlePointerUp = (ev: PointerEvent) => {\n if (this.fillDragging && this.fillSource) {\n const src = this.fillSource;\n const endRowIndex = this.fillEndRowIndex ?? src.endRowIndex;\n this.fillDragging = false;\n this.fillSource = null;\n this.fillEndRowIndex = null;\n this.root.dataset.extableFillDragging = \"\";\n if (this.rootCursorBackup !== null) {\n this.root.style.cursor = this.rootCursorBackup;\n this.rootCursorBackup = null;\n }\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.commitFill(src, endRowIndex);\n this.suppressNextClick = true;\n return;\n }\n if (!this.dragging) return;\n this.dragging = false;\n this.dragStart = null;\n const suppressTrailingClick = this.dragSelectionChanged;\n this.pointerDownClient = null;\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n if (suppressTrailingClick) this.suppressNextClick = true;\n if (this.suppressNextClick) {\n // Keep selection mode focus; prevent the trailing click from opening edit.\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n }\n };\n\n private commitFill(source: import(\"./fillHandle\").FillHandleSource, endRowIndex: number) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return;\n if (endRowIndex <= source.endRowIndex) return;\n\n const getValue = makeFillValueGetter(this.dataModel, source, this.sequenceLangs);\n if (!getValue) return;\n\n const commitNow = this.editMode === \"direct\";\n const batchId = `fill:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = source.endRowIndex + 1; r <= endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const offset = r - source.endRowIndex;\n const next = getValue(offset);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n\n // Select the filled range after commit and focus selection mode.\n const endRow = rows[endRowIndex];\n if (!endRow) return;\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: source.startRowIndex,\n endRow: endRowIndex,\n startCol: source.colIndex,\n endCol: source.colIndex,\n },\n ];\n this.activeCell = { rowId: endRow.id, colKey: col.key };\n this.onActiveChange(endRow.id, col.key);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.ensureVisibleCell(endRow.id, col.key);\n const current = this.dataModel.getCell(endRow.id, col.key);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n\n private teardownSelectionInput() {\n const input = this.selectionInput;\n if (!input) return;\n\n // Avoid re-entrancy via blur fired during DOM removal.\n this.selectionInput = null;\n\n input.removeEventListener(\"keydown\", this.handleSelectionKeydown);\n input.removeEventListener(\"beforeinput\", this.handleSelectionBeforeInput);\n input.removeEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.removeEventListener(\"copy\", this.handleSelectionCopy);\n input.removeEventListener(\"cut\", this.handleSelectionCut);\n input.removeEventListener(\"paste\", this.handleSelectionPaste);\n input.removeEventListener(\"blur\", this.handleSelectionBlur);\n removeFromParent(input);\n }\n\n private handleSelectionCopy = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.showCopyToast(`Copied ${payload.cellCount} cells`, \"info\");\n };\n\n private handleSelectionCut = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.clearSelectionValues();\n };\n\n private handleSelectionPaste = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n ev.preventDefault();\n const html = ev.clipboardData?.getData(\"text/html\") ?? \"\";\n const tsv = ev.clipboardData?.getData(\"text/tab-separated-values\") ?? \"\";\n const text = ev.clipboardData?.getData(\"text/plain\") ?? \"\";\n const grid = this.parseClipboardGrid({ html, tsv, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n };\n\n private handleSelectionCompositionStart = (ev?: CompositionEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n\n if (this.isCellReadonly(ac.rowId, ac.colKey)) {\n // Keep selection mode for readonly cells.\n // IMPORTANT: cancel any ongoing IME composition by tearing down the focused hidden input.\n // Otherwise, some IMEs show a floating preedit UI (e.g. an \"a\") even though we ignore edits.\n ev?.preventDefault?.();\n ev?.stopPropagation?.();\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n this.teardownSelectionInput();\n this.focusSelectionInput(currentText);\n return;\n }\n\n this.selectionMode = false;\n // Don't teardown selectionInput - keep it to preserve IME state\n this.openEditorAtActiveCell();\n };\n\n private handleSelectionBeforeInput = (ev: InputEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n if (!this.isCellReadonly(ac.rowId, ac.colKey)) return;\n\n // Block text insertion into the hidden selection input while readonly.\n ev.preventDefault();\n try {\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n const input = this.ensureSelectionInput();\n input.value = currentText;\n input.select();\n } catch {\n // ignore\n }\n };\n\n public async copySelection() {\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n const { text, html, cellCount } = payload;\n\n const copyViaClipboardApi = async () => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard) return false;\n if (typeof ClipboardItem !== \"undefined\" && navigator.clipboard.write) {\n try {\n const item = new ClipboardItem({\n \"text/plain\": new Blob([text], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n });\n await navigator.clipboard.write([item]);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n if (navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n return false;\n };\n\n const copyViaFallbackInput = () => {\n const input = this.ensureSelectionInput();\n const prev = input.value;\n input.value = text;\n input.select();\n document.execCommand?.(\"copy\");\n input.value = prev;\n };\n\n const copied = await copyViaClipboardApi();\n if (!copied) copyViaFallbackInput();\n this.showCopyToast(`Copied ${cellCount} cells`, \"info\");\n }\n\n public async pasteFromClipboard() {\n if (this.editMode === \"readonly\") return;\n if (!this.selectionMode) return;\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.readText) return;\n try {\n const text = await navigator.clipboard.readText();\n if (!text) return;\n const grid = this.parseClipboardGrid({ html: \"\", tsv: text, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n } catch {\n /* ignore */\n }\n }\n\n private handleSelectionKeydown = async (ev: KeyboardEvent) => {\n if (!this.activeCell) return;\n if (ev.isComposing || this.composing) return;\n\n // In edit mode, delegate to handleKey if inputEl is set\n if (!this.selectionMode && this.inputEl) {\n this.handleKey(ev, document.createElement('div')); // dummy cell element\n return;\n }\n\n // Selection mode logic\n if (!this.selectionMode) return;\n\n // Ignore modifier-only keys in selection mode (do not enter edit mode).\n if (\n ev.key === \"Shift\" ||\n ev.key === \"Control\" ||\n ev.key === \"Alt\" ||\n ev.key === \"Meta\" ||\n ev.key === \"CapsLock\" ||\n ev.key === \"NumLock\" ||\n ev.key === \"ScrollLock\"\n ) {\n return;\n }\n\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (accel) {\n const key = ev.key.toLowerCase();\n if (key === \"z\") {\n ev.preventDefault();\n if (isMac && ev.shiftKey) this.onRedo();\n else this.onUndo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"y\") {\n ev.preventDefault();\n this.onRedo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"v\") {\n // Let the paste event fire; it will be handled on the input.\n this.selectionAnchor = null;\n return;\n }\n }\n\n if (ev.key === \" \" && this.activeCell.colKey !== null) {\n const col = this.findColumn(this.activeCell.colKey);\n if (col?.type === \"button\" || col?.type === \"link\") {\n ev.preventDefault();\n this.triggerCellAction(this.activeCell.rowId, this.activeCell.colKey, col.type);\n this.selectionAnchor = null;\n return;\n }\n if (col?.type === \"boolean\") {\n ev.preventDefault();\n this.toggleBoolean(this.activeCell.rowId, this.activeCell.colKey);\n this.selectionAnchor = null;\n return;\n }\n this.selectionAnchor = null;\n return;\n }\n\n const isTab = ev.key === \"Tab\";\n const isEnter = ev.key === \"Enter\";\n const isArrow =\n ev.key === \"ArrowLeft\" ||\n ev.key === \"ArrowRight\" ||\n ev.key === \"ArrowUp\" ||\n ev.key === \"ArrowDown\";\n if (isTab || isEnter || isArrow) {\n ev.preventDefault();\n this.teardownSelectionInput();\n if (isTab) {\n this.moveActiveCell(0, ev.shiftKey ? -1 : 1, false);\n return;\n }\n if (isEnter) {\n this.moveActiveCell(ev.shiftKey ? -1 : 1, 0, false);\n return;\n }\n const extend = ev.shiftKey;\n if (ev.key === \"ArrowLeft\") this.moveActiveCell(0, -1, extend);\n else if (ev.key === \"ArrowRight\") this.moveActiveCell(0, 1, extend);\n else if (ev.key === \"ArrowUp\") this.moveActiveCell(-1, 0, extend);\n else if (ev.key === \"ArrowDown\") this.moveActiveCell(1, 0, extend);\n return;\n }\n\n if (\n this.activeCell.colKey !== null &&\n this.isCellReadonly(this.activeCell.rowId, this.activeCell.colKey)\n ) {\n ev.preventDefault();\n this.selectionAnchor = null;\n return;\n }\n\n this.selectionMode = false;\n this.selectionAnchor = null;\n // Don't teardown selectionInput - keep it to preserve IME state\n // Let the original keydown insert the character into the now-focused editor naturally.\n this.openEditorAtActiveCell();\n };\n\n private getActiveIndices() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const fallback = { rowIndex: 0, colIndex: 0 };\n const ac = this.activeCell;\n if (!ac) return fallback;\n const rowIndex = rows.findIndex((r) => r.id === ac.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n return { rowIndex: rowIndex >= 0 ? rowIndex : 0, colIndex: colIndex >= 0 ? colIndex : 0 };\n }\n\n private normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol),\n };\n }\n\n private getCopyRange(): SelectionRange | null {\n const schema = this.dataModel.getSchema();\n if (this.selectionRanges.length > 0) {\n const first = this.selectionRanges[0];\n if (!first) return null;\n const normalized = this.normalizeRange(first);\n if (normalized.kind === \"rows\") {\n return {\n kind: \"cells\",\n startRow: normalized.startRow,\n endRow: normalized.endRow,\n startCol: normalized.startCol,\n endCol: normalized.endCol,\n };\n }\n return normalized;\n }\n if (!this.activeCell) return null;\n const ac = this.activeCell;\n if (!ac) return null;\n const rowIdx = this.dataModel.getRowIndex(ac.rowId);\n const colIdx = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n if (rowIdx < 0 || colIdx < 0) return null;\n return { kind: \"cells\", startRow: rowIdx, endRow: rowIdx, startCol: colIdx, endCol: colIdx };\n }\n\n private cellToClipboardString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"number\") return String(value);\n const linkAction = resolveLinkAction(value);\n if (linkAction?.href) return linkAction.href;\n const buttonAction = resolveButtonAction(value);\n if (buttonAction?.label) return buttonAction.label;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n if (kind === \"lookup\" && typeof obj.label === \"string\") return obj.label;\n if (typeof obj.kind !== \"string\" && typeof obj.label === \"string\" && \"value\" in obj) return obj.label;\n }\n return String(value);\n }\n\n private escapeHtml(text: string) {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n }\n\n private buildSelectionClipboardPayload(): {\n text: string;\n html: string;\n cellCount: number;\n } | null {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range) return null;\n if (range.kind !== \"cells\") return null;\n\n const out: string[] = [];\n const htmlRows: string[] = [];\n const tableStyle = \"border-collapse:collapse;border-spacing:0;\";\n const cellStyle = \"border:1px solid #d0d7de;padding:4px 6px;vertical-align:top;\";\n let cellCount = 0;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n const line: string[] = [];\n const htmlCells: string[] = [];\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n const v = this.dataModel.getCell(row.id, col.key);\n const s = this.cellToClipboardString(v);\n line.push(s);\n htmlCells.push(`<td style=\"${cellStyle}\">${this.escapeHtml(s)}</td>`);\n cellCount += 1;\n }\n out.push(line.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCells.join(\"\")}</tr>`);\n }\n const text = out.join(\"\\r\\n\");\n const html = `<table style=\"${tableStyle}\"><tbody>${htmlRows.join(\"\")}</tbody></table>`;\n return { text, html, cellCount };\n }\n\n private clearSelectionValues() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range || range.kind !== \"cells\") return;\n const commitNow = this.editMode === \"direct\";\n const batchId = `cut:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = col.type === \"boolean\" ? false : \"\";\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private parseClipboardGrid(payload: { html: string; tsv: string; text: string }):\n | string[][]\n | null {\n const fromHtml = this.parseHtmlTable(payload.html);\n if (fromHtml) return fromHtml;\n const raw = payload.tsv || payload.text;\n return this.parseTsv(raw);\n }\n\n private parseTsv(text: string): string[][] | null {\n const trimmed = text.replace(/\\r\\n$/, \"\").replace(/\\n$/, \"\");\n if (!trimmed) return null;\n const rows = trimmed.split(/\\r\\n|\\n/);\n return rows.map((r) => r.split(\"\\t\"));\n }\n\n private parseHtmlTable(html: string): string[][] | null {\n if (!html) return null;\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const table = doc.querySelector(\"table\");\n if (!table) return null;\n const trs = Array.from(table.querySelectorAll(\"tr\"));\n if (trs.length === 0) return null;\n const grid: string[][] = [];\n for (const tr of trs) {\n const cells = Array.from(tr.querySelectorAll(\"th,td\"));\n if (\n cells.some(\n (c) =>\n (c as HTMLTableCellElement).rowSpan > 1 || (c as HTMLTableCellElement).colSpan > 1,\n )\n ) {\n return null;\n }\n grid.push(cells.map((c) => (c.textContent ?? \"\").trim()));\n }\n return grid.length ? grid : null;\n } catch {\n return null;\n }\n }\n\n private coerceCellValue(raw: string, colKey: string): unknown {\n const col = this.findColumn(colKey);\n if (!col) return raw;\n if (raw === \"\") return \"\";\n if (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") {\n const parsed = parseNumericText(raw);\n if (!parsed.ok) return raw;\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n return coerced.ok ? coerced.value : raw;\n }\n if (col.type === \"boolean\") {\n const v = raw.trim().toLowerCase();\n if (v === \"true\" || v === \"1\" || v === \"yes\") return true;\n if (v === \"false\" || v === \"0\" || v === \"no\") return false;\n return raw;\n }\n return raw;\n }\n\n private applyClipboardGrid(grid: string[][]) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const { rowIndex: startRow, colIndex: startCol } = this.getActiveIndices();\n const commitNow = this.editMode === \"direct\";\n const batchId = `paste:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = 0; r < grid.length; r += 1) {\n const row = rows[startRow + r];\n if (!row) break;\n const line = grid[r] ?? [];\n for (let c = 0; c < line.length; c += 1) {\n const col = schema.columns[startCol + c];\n if (!col) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = this.coerceCellValue(line[c] ?? \"\", col.key);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private createEditor(colKey: string, initial: string) {\n const col = this.findColumn(colKey);\n if (col?.edit?.lookup) {\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n input.autocomplete = \"off\";\n input.spellcheck = false;\n return { control: input, value: initial };\n }\n const needsTextarea = col?.wrapText || initial.includes(\"\\n\");\n if (needsTextarea) {\n const ta = document.createElement(\"textarea\");\n ta.value = initial;\n ta.style.resize = \"none\";\n ta.style.whiteSpace = \"pre-wrap\";\n ta.style.overflowWrap = \"anywhere\";\n ta.style.overflow = \"hidden\";\n this.autosize(ta);\n ta.addEventListener(\"input\", () => this.autosize(ta));\n return { control: ta, value: initial };\n }\n if (col?.type === \"boolean\") {\n const input = document.createElement(\"input\");\n input.type = \"checkbox\";\n input.checked = initial === \"true\" || initial === \"1\" || initial === \"on\";\n return { control: input, value: initial };\n }\n if (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\") {\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n if (col?.type === \"date\" || col?.type === \"time\" || col?.type === \"datetime\") {\n const input = document.createElement(\"input\");\n input.type = col.type === \"date\" ? \"date\" : col.type === \"time\" ? \"time\" : \"datetime-local\";\n const normalized = this.normalizeTemporalInitialValue(col.type, initial);\n input.value = normalized;\n return { control: input, value: normalized };\n }\n if (col?.type === \"enum\" || col?.type === \"tags\") {\n const allowCustom = col.enum?.allowCustom ?? col.tags?.allowCustom;\n const options = col.enum?.options ?? col.tags?.options ?? [];\n if (allowCustom === false) {\n const select = document.createElement(\"select\");\n const empty = document.createElement(\"option\");\n empty.value = \"\";\n empty.textContent = \"\";\n select.appendChild(empty);\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n op.textContent = opt;\n if (initial === opt) op.selected = true;\n select.appendChild(op);\n }\n return { control: select, value: initial };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n const listId = `extable-datalist-${String(colKey)}`;\n input.setAttribute(\"list\", listId);\n input.value = initial;\n let datalist = document.getElementById(listId) as HTMLDataListElement | null;\n if (!datalist) {\n datalist = document.createElement(\"datalist\");\n datalist.id = listId;\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n datalist.appendChild(op);\n }\n this.root.appendChild(datalist);\n }\n return { control: input, value: initial, datalistId: listId };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n\n private getInitialEditValue(colKey: string, current: unknown): string {\n if (current === null || current === undefined) return \"\";\n const col = this.findColumn(colKey);\n if (!col) return String(current);\n\n if (typeof current === \"object\") {\n const obj = current as Record<string, unknown>;\n if (obj.kind === \"lookup\" && typeof obj.label === \"string\") {\n return obj.label;\n }\n if (typeof obj.kind !== \"string\" && typeof obj.label === \"string\" && \"value\" in obj) {\n return obj.label;\n }\n }\n\n if ((col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") && typeof current === \"number\") {\n if (col.type === \"number\") {\n const fmt = col.format as { format?: string; precision?: number; scale?: number } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n return formatNumberForEdit(current, { format: \"scientific\", precision: fmt?.precision });\n }\n return formatNumberForEdit(current, { format: \"decimal\", scale: fmt?.scale });\n }\n\n const fmt = col.format as { format?: string } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n return formatIntegerWithPrefix(current, token);\n }\n return String(current);\n }\n\n return String(current);\n }\n\n private readActiveValueForCommit(): { ok: true; value: unknown } | { ok: false } {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) {\n return { ok: true, value: this.inputEl?.value ?? \"\" };\n }\n\n const col = this.findColumn(this.activeCell.colKey);\n if (\n col &&\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") &&\n this.inputEl instanceof HTMLInputElement\n ) {\n const normalized = normalizeNumericInput(this.inputEl.value);\n if (normalized === \"\") return { ok: true, value: \"\" };\n\n const parsed = parseNumericText(normalized);\n if (!parsed.ok) return { ok: false };\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n if (!coerced.ok) return { ok: false };\n return { ok: true, value: coerced.value };\n }\n\n return { ok: true, value: this.readActiveValue() };\n }\n\n private tryCommitActiveEditor(): boolean {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) return true;\n const { rowId, colKey } = this.activeCell;\n const next = this.readActiveValueForCommit();\n if (!next.ok) {\n this.inputEl.focus({ preventScroll: true });\n return false;\n }\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n return true;\n }\n\n private autosize(ta: HTMLTextAreaElement) {\n const style = window.getComputedStyle(ta);\n let lineHeight = Number.parseFloat(style.lineHeight);\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) lineHeight = 16;\n ta.rows = 1; // shrink to measure\n const lines = Math.ceil(ta.scrollHeight / lineHeight);\n ta.rows = Math.max(1, lines);\n ta.style.minHeight = `${lineHeight}px`;\n }\n\n private positionFloatingContentBox(\n box: { left: number; top: number; width: number; height: number },\n wrapper: HTMLDivElement,\n ) {\n const insetX = CELL_PADDING_X_PX;\n const insetTop = CELL_PADDING_TOP_PX;\n const insetBottom = CELL_PADDING_BOTTOM_PX;\n wrapper.style.left = `${box.left + insetX}px`;\n wrapper.style.top = `${box.top + insetTop}px`;\n wrapper.style.width = `${Math.max(8, box.width - insetX * 2)}px`;\n wrapper.style.height = `${Math.max(8, box.height - (insetTop + insetBottom))}px`;\n }\n\n private handleClick = (ev: MouseEvent) => {\n const el = ev.target as HTMLElement | null;\n if (ev.button !== 0) {\n return; // only left click starts edit/selection; right-click is handled by contextmenu\n }\n // Allow clicks on lookup dropdown buttons to propagate\n if (el?.closest('button.extable-lookup-option')) {\n return;\n }\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) {\n return;\n }\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) {\n return;\n }\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n if (!this.tryCommitActiveEditor()) return;\n }\n const hit = this.getHitAtClientPoint(ev.clientX, ev.clientY, ev.target);\n // If the click target is a unique-radio input, perform immediate unique toggle.\n const radioInput = (ev.target as HTMLElement | null)?.closest(\"input.extable-unique-radio\") as HTMLInputElement | null;\n if (radioInput && hit) {\n if (hit.colKey === null) return;\n const col = this.findColumn(hit.colKey);\n if (col && col.type === \"boolean\" && col.unique) {\n this.toggleBoolean(hit.rowId, hit.colKey);\n ev.preventDefault();\n return;\n }\n }\n if (!hit) return;\n const actionHit = this.hitAction ? this.hitAction(ev) : null;\n if (actionHit) {\n if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n }\n if (actionHit.kind === \"tag-remove\") {\n const removed = this.removeTagValue(actionHit.rowId, actionHit.colKey, actionHit.tagIndex);\n if (removed) {\n ev.preventDefault();\n return;\n }\n } else {\n const triggered = this.triggerCellAction(actionHit.rowId, actionHit.colKey, actionHit.kind);\n if (triggered) {\n ev.preventDefault();\n return;\n }\n }\n } else if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n }\n const wasSameCell =\n this.selectionMode &&\n !ev.shiftKey &&\n !ev.metaKey &&\n !ev.ctrlKey &&\n this.activeCell?.rowId === hit.rowId &&\n String(this.activeCell?.colKey) === String(hit.colKey);\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n this.teardownInput(false);\n if (rows.length && schema.columns.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: 0,\n endCol: schema.columns.length - 1,\n },\n ];\n this.activeCell = { rowId: \"__all__\", colKey: \"__all__\" };\n this.onActiveChange(\"__all__\", \"__all__\");\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n } else {\n this.activeCell = null;\n this.onActiveChange(\"__all__\", \"__all__\");\n this.selectionAnchor = null;\n }\n return;\n }\n this.onRowSelect(hit.rowId);\n if (hit.rowId === \"__header__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (rows.length && colIndex >= 0) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId: rows[0].id, colKey: hit.colKey };\n this.onActiveChange(this.activeCell.rowId, this.activeCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n return;\n }\n this.applySelectionFromHit(ev, hit);\n if (hit.colKey === null || hit.colKey === \"__all__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (hit.rowId === \"__header__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (this.isCellReadonly(hit.rowId, hit.colKey)) {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n return;\n }\n const col = this.findColumn(hit.colKey);\n const isBoolean = col?.type === \"boolean\";\n if (isBoolean) {\n const isSecondClick =\n this.lastBooleanCell?.rowId === hit.rowId &&\n String(this.lastBooleanCell?.colKey) === String(hit.colKey);\n this.lastBooleanCell = { rowId: hit.rowId, colKey: hit.colKey };\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n this.teardownSelectionInput();\n if (isSecondClick) {\n this.toggleBoolean(hit.rowId, hit.colKey);\n // Keep focus on the hidden selection input so Space does not scroll the container/page.\n this.focusSelectionInput(\"\");\n return;\n }\n // Keep focus on the hidden selection input so Space can toggle.\n this.focusSelectionInput(\"\");\n return;\n }\n this.lastBooleanCell = null;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n const currentText = this.cellToClipboardString(current);\n\n // Focus selection input with current value (hidden, no cursor visible)\n this.focusSelectionInput(currentText);\n\n if (wasSameCell) {\n this.selectionMode = false;\n // Don't teardown selectionInput - keep it to preserve IME state\n this.openEditorAtActiveCell();\n }\n };\n\n private triggerCellAction(rowId: string, colKey: string, kind: \"button\" | \"link\") {\n const col = this.findColumn(colKey);\n if (!col) return false;\n if (col.type !== kind) return false;\n const interaction = this.dataModel.getCellInteraction(rowId, colKey);\n if (interaction.disabled) return false;\n const valueRes = this.dataModel.resolveCellValue(rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return false;\n if (col.type === \"button\") {\n const actionValue = resolveButtonAction(valueRes.value);\n if (!actionValue) return false;\n this.onCellAction({ kind: \"button\", rowId, colKey, value: actionValue });\n return true;\n }\n if (col.type === \"link\") {\n const linkValue = resolveLinkAction(valueRes.value);\n if (!linkValue?.href) return false;\n this.openLink(linkValue.href, linkValue.target);\n return true;\n }\n return false;\n }\n\n private removeTagValue(rowId: string, colKey: string, tagIndex: number) {\n if (this.isCellReadonly(rowId, colKey)) return false;\n const col = this.findColumn(colKey);\n if (!col || col.type !== \"tags\") return false;\n const current = this.dataModel.getCell(rowId, colKey);\n const values = this.normalizeTagValues(current);\n if (!values || tagIndex < 0 || tagIndex >= values.length) return false;\n const nextValues = values.filter((_, i) => i !== tagIndex);\n const next =\n current && typeof current === \"object\" && (current as Record<string, unknown>).kind === \"tags\"\n ? { kind: \"tags\", values: nextValues }\n : nextValues;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n return true;\n }\n\n private normalizeTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((v): v is string => typeof v === \"string\");\n }\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return [];\n return trimmed.split(/\\s*,\\s*/).filter(Boolean);\n }\n return null;\n }\n\n private openLink(href: string, target?: string) {\n if (typeof document === \"undefined\") return;\n if (!href) return;\n const link = document.createElement(\"a\");\n link.href = href;\n link.target = target ?? \"_self\";\n link.rel = \"noopener noreferrer\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n\n private toggleBoolean(rowId: string, colKey: string) {\n const current = this.dataModel.getCell(rowId, colKey);\n const currentBool = current === true || current === \"true\" || current === \"1\" || current === 1;\n const col = this.findColumn(colKey);\n const commitNow = this.editMode === \"direct\";\n if (col && col.unique) {\n // If already selected, no-op (radio cannot be deselected)\n if (currentBool) {\n return;\n }\n const batchId = `unique-bool:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n // Set this row true\n const cmds: Command[] = [\n { kind: \"edit\", rowId, colKey, next: true, payload: { batchId } },\n ];\n // Clear other rows that are currently true for this column\n const rows = this.dataModel.listRows();\n for (const r of rows) {\n if (!r) continue;\n if (r.id === rowId) continue;\n const val = this.dataModel.getCell(r.id, colKey);\n const isTrue = val === true || val === \"true\" || val === \"1\" || val === 1;\n if (isTrue) {\n cmds.push({ kind: \"edit\", rowId: r.id, colKey, next: false, payload: { batchId } });\n }\n }\n for (const c of cmds) this.onEdit(c, commitNow);\n this.onMove(rowId);\n return;\n }\n\n const next = !currentBool;\n const cmd: Command = { kind: \"edit\", rowId, colKey, next };\n this.onEdit(cmd, commitNow);\n this.onMove(rowId);\n }\n\n private handleContextMenu = (ev: MouseEvent) => {\n const target = ev.target as Node | null;\n if (ev.ctrlKey) {\n ev.preventDefault();\n return;\n }\n if (!target || !this.root.contains(target)) return;\n ev.preventDefault();\n ev.stopPropagation();\n const hit = this.hitTest(ev);\n const rowId = hit?.rowId ?? null;\n const colKey = hit?.colKey ?? null;\n this.onContextMenu(rowId, colKey, ev.clientX, ev.clientY);\n };\n\n private applySelectionFromHit(ev: MouseEvent, hit: { rowId: string; colKey: string | null }) {\n const schema = this.dataModel.getSchema();\n const rowIdx = this.dataModel.getRowIndex(hit.rowId);\n const isRow = hit.colKey === null;\n const colIdx = isRow ? (schema.columns.length > 0 ? 0 : -1) : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIdx < 0) return;\n const targetRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: Math.max(0, colIdx),\n endCol: Math.max(0, colIdx),\n };\n let nextRanges: SelectionRange[] = [];\n if (ev.shiftKey && this.activeCell) {\n const ac = this.activeCell;\n const anchorRow = this.dataModel.getRowIndex(ac.rowId);\n const anchorCol = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n const anchorRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: Math.max(0, anchorCol),\n endCol: Math.max(0, colIdx),\n };\n nextRanges = [anchorRange];\n } else if (ev.metaKey || ev.ctrlKey) {\n nextRanges = [...this.selectionRanges, targetRange];\n } else {\n nextRanges = [targetRange];\n }\n this.selectionRanges = this.mergeRanges(nextRanges);\n const anchorCell =\n targetRange.kind === \"rows\"\n ? { rowId: hit.rowId, colKey: schema.columns[colIdx]?.key ?? null }\n : { rowId: hit.rowId, colKey: hit.colKey };\n this.activeCell = anchorCell;\n this.onActiveChange(anchorCell.rowId, anchorCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n if (targetRange.kind === \"rows\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n }\n\n private mergeRanges(ranges: SelectionRange[]) {\n const merged: SelectionRange[] = [];\n const sorted = [...ranges].sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"rows\" ? -1 : 1;\n if (a.startRow !== b.startRow) return a.startRow - b.startRow;\n if (a.startCol !== b.startCol) return a.startCol - b.startCol;\n if (a.endRow !== b.endRow) return a.endRow - b.endRow;\n return a.endCol - b.endCol;\n });\n for (const r of sorted) {\n const last = merged.at(-1);\n if (!last) {\n merged.push({ ...r });\n continue;\n }\n if (last.kind !== r.kind) {\n merged.push({ ...r });\n continue;\n }\n if (r.kind === \"rows\") {\n const canMerge =\n last.startCol === r.startCol &&\n last.endCol === r.endCol &&\n last.startRow <= r.endRow + 1 &&\n r.startRow <= last.endRow + 1;\n if (canMerge) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n } else {\n const sameCols = last.startCol === r.startCol && last.endCol === r.endCol;\n const sameRows = last.startRow === r.startRow && last.endRow === r.endRow;\n const rowsTouch = last.startRow <= r.endRow + 1 && r.startRow <= last.endRow + 1;\n const colsTouch = last.startCol <= r.endCol + 1 && r.startCol <= last.endCol + 1;\n if (sameCols && rowsTouch) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n if (sameRows && colsTouch) {\n last.startCol = Math.min(last.startCol, r.startCol);\n last.endCol = Math.max(last.endCol, r.endCol);\n continue;\n }\n }\n merged.push({ ...r });\n }\n return merged;\n }\n\n private activateCellElement(\n cell: HTMLElement,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n this.activeHost = cell;\n this.activeHostOriginalText = cell.textContent ?? \"\";\n const current = this.dataModel.getCell(rowId, colKey);\n this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = isCheckbox ? \"0\" : \"2px 4px\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.color = \"#000\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"16px\";\n input.style.fontWeight = \"inherit\";\n // Safari-specific fixes\n (input.style as any).WebkitAppearance = \"none\";\n (input.style as any).WebkitBorderRadius = \"0\";\n (input.style as any).WebkitBoxShadow = \"none\";\n (input.style as any).WebkitUserSelect = \"text\";\n (input.style as any).WebkitUserModify = \"read-write\";\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) {\n input.style.visibility = \"visible\";\n input.style.opacity = \"1\";\n input.style.display = \"block\";\n }\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, cell));\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n cell.textContent = \"\";\n cell.appendChild(input);\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n this.setupLookupEditor(rowId, colKey, input);\n }\n\n private activateFloating(\n rect: DOMRect,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n void rect;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return;\n const wrapper = document.createElement(\"div\");\n this.activeHost = wrapper;\n this.activeHostOriginalText = null;\n wrapper.style.position = \"absolute\";\n wrapper.style.display = \"block\";\n wrapper.style.visibility = \"visible\";\n wrapper.dataset.extableFloating = \"fixed\";\n wrapper.style.pointerEvents = \"auto\";\n wrapper.style.padding = \"0\";\n wrapper.style.zIndex = \"10\";\n const current = this.dataModel.getCell(rowId, colKey);\n this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.height = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = isCheckbox ? \"0\" : \"2px 4px\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.color = \"#000\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"16px\";\n input.style.fontWeight = \"inherit\";\n // Safari-specific fixes\n (input.style as any).WebkitAppearance = \"none\";\n (input.style as any).WebkitBorderRadius = \"0\";\n (input.style as any).WebkitBoxShadow = \"none\";\n (input.style as any).WebkitUserSelect = \"text\";\n (input.style as any).WebkitUserModify = \"read-write\";\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) {\n input.style.visibility = \"visible\";\n input.style.opacity = \"1\";\n input.style.display = \"block\";\n }\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.height = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.style.pointerEvents = \"auto\";\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, wrapper));\n input.addEventListener(\"compositionstart\", this.handleInputCompositionStart);\n input.addEventListener(\"compositionend\", this.handleInputCompositionEnd);\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n wrapper.appendChild(input);\n if (input instanceof HTMLSelectElement) {\n // No auto focus/click for select; standard focus will allow selection on first interaction\n }\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n this.root.appendChild(wrapper);\n this.positionFloatingContentBox(box, wrapper);\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n this.floatingInputWrapper = wrapper;\n this.setupLookupEditor(rowId, colKey, input);\n }\n\n private handleKey(e: KeyboardEvent, cell: HTMLElement) {\n if (!this.activeCell || !this.inputEl) return;\n const now = Date.now();\n if (e.isComposing || this.composing) return; // IME composing; ignore control keys\n if (now - this.lastCompositionEnd < 24) return; // absorb trailing key events right after IME commit\n if (this.handleLookupKeydown(e)) return;\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const isTextarea = this.inputEl.tagName.toLowerCase() === \"textarea\";\n const isAltEnter = e.key === \"Enter\" && e.altKey;\n const commitAndMove = (deltaRow: number, deltaCol: number) => {\n const next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(deltaRow, deltaCol);\n };\n\n if (e.key === \"Tab\") {\n e.preventDefault();\n commitAndMove(0, e.shiftKey ? -1 : 1);\n return;\n }\n if (e.key === \"Enter\") {\n if (isTextarea && isAltEnter) {\n // allow newline insertion (Excel-like Alt+Enter)\n return;\n }\n e.preventDefault();\n commitAndMove(e.shiftKey ? -1 : 1, 0);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.cancelEdit(cell);\n this.onMove();\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n }\n } else if (e.key === \"Backspace\" && this.inputEl.value === \"\") {\n e.preventDefault();\n this.commitEdit(rowId, colKey, \"\");\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(0, 0);\n }\n }\n\n private commitEdit(rowId: string, colKey: string | null, value: unknown) {\n if (colKey === null) return;\n const col = this.findColumn(colKey);\n const normalized =\n col?.type === \"labeled\"\n ? value &&\n typeof value === \"object\" &&\n typeof (value as any).label === \"string\" &&\n \"value\" in (value as any)\n ? value\n : { label: value === null || value === undefined ? \"\" : String(value), value: value ?? \"\" }\n : value;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: normalized,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n }\n\n private readActiveValue() {\n if (!this.inputEl || !this.activeCell) return this.inputEl?.value ?? \"\";\n if (this.inputEl instanceof HTMLInputElement) {\n if (this.inputEl.type === \"checkbox\") {\n return this.inputEl.checked;\n }\n if (this.inputEl.type === \"number\") {\n if (this.inputEl.value === \"\") return \"\";\n const parsed = Number(this.inputEl.value);\n return Number.isNaN(parsed) ? \"\" : parsed;\n }\n return this.inputEl.value;\n }\n if (this.inputEl instanceof HTMLSelectElement) {\n return this.inputEl.value;\n }\n return (this.inputEl as HTMLTextAreaElement).value;\n }\n\n private bindImmediateCommit(control: HTMLElement) {\n if (!this.activeCell) return;\n const isInstant =\n control instanceof HTMLInputElement\n ? control.type === \"checkbox\" ||\n control.type === \"date\" ||\n control.type === \"time\" ||\n control.type === \"datetime-local\"\n : control instanceof HTMLSelectElement;\n if (!isInstant) return;\n control.addEventListener(\"change\", () => {\n const ac = this.activeCell;\n if (!ac) return;\n const { rowId, colKey } = ac;\n if (colKey === null) return;\n const next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n });\n }\n\n private cancelEdit(cell: HTMLElement) {\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) {\n this.teardownInput(false);\n cell.blur();\n return;\n }\n\n const { rowId, colKey } = ac;\n const orig =\n this.activeOriginalValue &&\n this.activeOriginalValue.rowId === rowId &&\n this.activeOriginalValue.colKey === colKey\n ? this.activeOriginalValue.value\n : this.dataModel.getCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const norm = (v: unknown) => (v === null || v === undefined ? \"\" : v);\n const normalizedOrig = norm(orig);\n const normalizedCurrent = norm(current);\n\n // If something committed/changed during this edit session (e.g. due to a validation path),\n // revert it back to the original value. Otherwise, do not emit any command.\n if (!Object.is(normalizedCurrent, normalizedOrig)) {\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: normalizedOrig,\n prev: normalizedCurrent,\n };\n this.onEdit(cmd, true);\n }\n\n this.teardownInput(false);\n cell.blur();\n }\n\n private teardownInput(clearActive = false) {\n this.teardownLookupEditor();\n // Don't remove selectionInput from DOM - it's reused across edits\n if (this.inputEl && this.inputEl !== this.selectionInput) {\n removeFromParent(this.inputEl);\n }\n removeFromParent(this.floatingInputWrapper);\n if (this.activeHost && this.activeHostOriginalText !== null) {\n this.activeHost.textContent = this.activeHostOriginalText;\n }\n this.inputEl = null;\n this.floatingInputWrapper = null;\n this.activeHost = null;\n this.activeHostOriginalText = null;\n this.activeOriginalValue = null;\n this.composing = false;\n if (clearActive) {\n this.activeCell = null;\n this.onActiveChange(null, null);\n this.hideHoverTooltip();\n }\n }\n}\n","export type CellPrimitive = string | number | boolean | null;\n\nexport type ButtonValue = string | { label: string; command: string; commandfor: string };\nexport type LinkValue = string | { label: string; href: string; target?: string };\n\nexport type LookupCellValue = {\n kind: \"lookup\";\n label: string;\n value: string;\n meta?: unknown;\n};\n\nexport type LookupCandidate = {\n label: string;\n value: string;\n meta?: unknown;\n isRecent?: boolean; // Internal flag: candidate is from recentLookup history\n};\n\nexport type LabeledValue = {\n label: string;\n value: unknown;\n};\n\nexport type TooltipText = string | null;\nexport type TooltipTextResult = TooltipText | Promise<TooltipText>;\n\nexport type ExternalEditResult = { kind: \"commit\"; value: unknown } | { kind: \"cancel\" };\n\nexport type LookupQueryContext = {\n query: string;\n rowId: string;\n colKey: string;\n signal: AbortSignal;\n};\n\nexport type ExternalEditorContext = {\n rowId: string;\n colKey: string;\n currentValue: unknown;\n};\n\nexport type TooltipContext = {\n rowId: string;\n colKey: string;\n value: unknown;\n signal: AbortSignal;\n};\n\nexport type ColumnEditHooks = {\n lookup?: {\n fetchCandidates(ctx: LookupQueryContext): Promise<readonly LookupCandidate[]>;\n toStoredValue?(candidate: LookupCandidate): unknown;\n debounceMs?: number;\n recentLookup?: boolean; // Default: true. Show recently selected items first.\n allowFreeInput?: boolean; // Default: false. Allow freetext input even without matching candidate.\n };\n\n externalEditor?: {\n open(ctx: ExternalEditorContext): Promise<ExternalEditResult>;\n };\n};\n\nexport type ColumnTooltipHook = {\n getText(ctx: TooltipContext): TooltipTextResult;\n};\n\nexport type CellValue =\n | CellPrimitive\n | Date\n | { kind: \"enum\"; value: string }\n | { kind: \"tags\"; values: string[] }\n | LookupCellValue\n | LabeledValue\n | ButtonValue\n | LinkValue;\n\nexport type ColumnType =\n | \"string\"\n | \"labeled\"\n | \"number\"\n | \"int\"\n | \"uint\"\n | \"boolean\"\n | \"datetime\"\n | \"date\"\n | \"time\"\n | \"enum\"\n | \"tags\"\n | \"button\"\n | \"link\";\n\nexport type StringFormat = {\n maxLength?: number;\n regex?: string;\n};\n\nexport type NumberFormat = {\n precision?: number;\n scale?: number;\n signed?: boolean;\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for number display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"scientific\": scientific notation\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type IntegerFormat = {\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for integer display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"binary\" | \"octal\" | \"hex\": prefixed base literals\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type BooleanFormat = \"checkbox\" | string | [string, string];\nexport type DateFormat = string;\nexport type TimeFormat = string;\nexport type DateTimeFormat = string;\n\nexport type ColumnFormat<TType extends ColumnType> = TType extends \"string\"\n ? StringFormat\n : TType extends \"labeled\"\n ? StringFormat\n : TType extends \"number\"\n ? NumberFormat\n : TType extends \"int\" | \"uint\"\n ? IntegerFormat\n : TType extends \"boolean\"\n ? BooleanFormat\n : TType extends \"date\"\n ? DateFormat\n : TType extends \"time\"\n ? TimeFormat\n : TType extends \"datetime\"\n ? DateTimeFormat\n : never;\n\nexport type ResolvedCellStyle = {\n backgroundColor?: string;\n textColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n readonly?: boolean;\n disabled?: boolean;\n};\n\nexport type StyleDelta = Partial<ResolvedCellStyle>;\n\nexport type DiagnosticLevel = \"warning\" | \"error\";\nexport type CellDiagnostic = {\n level: DiagnosticLevel;\n message: string;\n source: \"formula\" | \"conditionalStyle\";\n};\n\nexport type FormulaOk = string | boolean | number | Date;\nexport type FormulaWarn<T extends FormulaOk> = readonly [value: T, warning: Error];\nexport type FormulaReturn<T extends FormulaOk = FormulaOk> = T | FormulaWarn<T>;\n\nexport type ConditionalStyleFn<TData extends object = object> = (\n data: TData,\n) => StyleDelta | null | Error;\n\nexport type Updater<T> = T | ((oldValue: T) => T);\n\nexport type CellAddress =\n | { rowId: string; colKey: string }\n | { rowIndex: number; colIndex: number }\n | { rowId: string; colIndex: number }\n | { rowIndex: number; colKey: string };\n\nexport type CellTarget = {\n rowId: string;\n colKey: string;\n};\n\n// Forward declaration for recursive type inference\nexport interface ColumnSchema<\n TData extends object = object,\n RData extends object = TData,\n TType extends ColumnType = ColumnType,\n K extends string = string,\n> {\n key: K;\n type: TType;\n header?: string;\n /**\n * `readonly` may be a static boolean or a predicate evaluated per-row.\n * - `true` prevents edits for all rows\n * - `(row) => boolean` returns per-row readonly state\n */\n readonly?: boolean | ((row: RData) => boolean);\n edit?: ColumnEditHooks;\n tooltip?: ColumnTooltipHook;\n /**\n * When true, enforce uniqueness within this column (per table).\n * Duplicate (non-empty) values mark all duplicated cells as invalid.\n */\n unique?: boolean;\n nullable?: boolean;\n format?: ColumnFormat<TType>;\n enum?: { options: string[]; allowCustom?: boolean };\n tags?: { options: string[]; allowCustom?: boolean };\n width?: number; // px\n wrapText?: boolean; // allow per-column wrapping\n style?: {\n textColor?: string;\n backgroundColor?: string;\n align?: \"left\" | \"right\" | \"center\";\n decorations?: { strike?: boolean; underline?: boolean; bold?: boolean; italic?: boolean };\n readonly?: boolean;\n disabled?: boolean;\n };\n formula?: (data: TData) => unknown;\n conditionalStyle?: ConditionalStyleFn<RData>;\n}\n\n// Infer row data type from schema columns\nexport type InferSchemaData<TColumns extends readonly ColumnSchema<any>[]> = {\n [I in keyof TColumns]: TColumns[I] extends ColumnSchema<infer TData, any, infer TType, infer K>\n ? K extends keyof TData\n ? TData[K]\n : never\n : never;\n} extends (infer U)[]\n ? U extends object\n ? U\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport interface Schema<TData extends object = object, RData extends object = TData> {\n columns: ColumnSchema<TData, RData>[];\n row?: { conditionalStyle?: ConditionalStyleFn<RData> };\n}\n\n/**\n * Helper to lock schema generics so `formula`/`conditionalStyle` receive the correct row type.\n * Usage: `const schema = defineSchema<MyRow>({ columns: [...], row: {...} });`\n */\nexport const defineSchema = <TData extends object, RData extends object = TData>(\n schema: Schema<TData, RData>,\n): Schema<TData, RData> => schema;\n\nexport type RowObject<T extends object = Record<string, unknown>> = {\n _readonly?: boolean;\n /** Optional externally-provided row id. If present and a string, it will be used as the internal row id. */\n id?: string;\n} & T &\n Record<string, unknown>;\n\n// Public data is object-row arrays only. Use `null` or `undefined` for async loading.\nexport type NullableData<T extends object = object> = T[] | null | undefined;\n\nexport type ViewFilterOp = {\n kind: \"op\";\n key: string;\n op: \"eq\" | \"neq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"contains\";\n value: unknown;\n};\n\nexport type ViewFilterValues = {\n kind: \"values\";\n key: string;\n /** Allow-list of selected non-blank values. */\n values: unknown[];\n /** When true, blanks (null/undefined/\"\") are included. */\n includeBlanks?: boolean;\n};\n\nexport type ViewFilter = ViewFilterOp | ViewFilterValues;\n\nexport type ColumnDiagnosticFilter = {\n errors?: boolean;\n warnings?: boolean;\n};\n\nexport type ColumnDiagnosticFilterMap = Record<string, ColumnDiagnosticFilter>;\n\nexport interface ViewSort {\n key: string;\n dir: \"asc\" | \"desc\";\n}\n\nexport interface View {\n hiddenColumns?: string[];\n filters?: ViewFilter[];\n sorts?: ViewSort[];\n /**\n * Column-scoped diagnostic quick filters.\n * Key is the column key (stringified).\n */\n columnDiagnostics?: ColumnDiagnosticFilterMap;\n userId?: string; // personalization\n columnWidths?: Record<string, number>; // key -> px\n rowHeights?: Record<string, number>;\n wrapText?: Record<string, boolean>; // view override per column\n}\n\nexport type RenderMode = \"html\" | \"canvas\" | \"auto\";\nexport type EditMode = \"direct\" | \"commit\" | \"readonly\";\nexport type LockMode = \"none\" | \"row\";\n\nexport interface Command {\n kind: \"edit\" | \"deleteRow\" | \"insertRow\" | \"updateView\" | \"lock\" | \"unlock\";\n rowId?: string;\n colKey?: string;\n rowData?: RowObject;\n prev?: unknown;\n next?: unknown;\n payload?: unknown;\n}\n\nexport type CommitChanges = {\n commands: Command[];\n user?: UserInfo;\n};\n\nexport type CommitHandler = (changes: CommitChanges) => Promise<void>;\n\nexport interface UserInfo {\n id: string;\n name: string;\n}\n\nexport interface ServerAdapter {\n fetchInitial?: () => Promise<{\n data: Record<string, unknown>[];\n view?: View;\n schema?: Schema;\n user: UserInfo;\n }>;\n lockRow: (rowId: string, user: UserInfo) => Promise<void>;\n unlockRows: (rowIds: string[], user: UserInfo) => Promise<void>;\n commit: (commands: Command[], user: UserInfo) => Promise<void>;\n subscribe: (onEvent: (event: ServerEvent) => void) => () => void;\n}\n\nexport type ServerEvent = { type: \"update\"; commands: Command[]; user: UserInfo };\n\nexport interface CoreOptions {\n renderMode?: RenderMode;\n editMode?: EditMode;\n lockMode?: LockMode;\n /** Preferred languages for auto-fill sequence matching (e.g. [\"ja\", \"en\"]). */\n langs?: string[];\n defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n server?: ServerAdapter;\n user?: UserInfo;\n}\n\nexport interface TableConfig<T extends object = Record<string, unknown>> {\n data: T[] | null;\n view: View;\n schema: Schema;\n}\n\nexport type HistoryCommandKind = Command[\"kind\"];\n\nexport type UndoRedoStep = {\n batchId: string | null;\n kinds: HistoryCommandKind[];\n commandCount: number;\n label: string;\n};\n\nexport type UndoRedoHistory = {\n /** Top (index 0) is the next undo step. */\n undo: UndoRedoStep[];\n /** Top (index 0) is the next redo step. */\n redo: UndoRedoStep[];\n};\n\nexport interface InternalRow {\n id: string;\n raw: RowObject;\n displayIndex: number;\n}\n\nexport type SelectionKind = \"cells\" | \"rows\";\n\nexport interface SelectionRange {\n kind: SelectionKind;\n startRow: number;\n endRow: number;\n startCol: number;\n endCol: number;\n}\n\nexport type ToggleState = \"on\" | \"off\" | \"mixed\" | \"disabled\";\nexport type ColorState = string | \"mixed\" | null | \"disabled\";\n\nexport type TableError = {\n scope: \"validation\" | \"commit\" | \"render\" | \"formula\" | \"conditionalStyle\" | \"unknown\";\n message: string;\n target?: { rowId?: string; colKey?: string };\n};\n\nexport type ButtonActionValue =\n | { label: string; command?: undefined; commandfor?: undefined }\n | { label: string; command: string; commandfor: string };\n\nexport type CellAction = {\n kind: \"button\";\n rowId: string;\n colKey: string;\n value: ButtonActionValue;\n};\n\nexport type TableState = {\n canCommit: boolean;\n pendingCommandCount: number;\n pendingCellCount?: number;\n undoRedo: { canUndo: boolean; canRedo: boolean };\n renderMode: \"html\" | \"canvas\";\n activeErrors: TableError[];\n};\n\nexport type TableStateListener = (next: TableState, prev: TableState | null) => void;\n\nexport type RowStateSnapshot<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = {\n rowId: string;\n rowIndex: number;\n data: TResult;\n pending?: Partial<TInput>;\n diagnostics?: TableError[];\n};\n\nexport type RowChangeReason = \"new\" | \"edit\" | \"delete\";\nexport type RowStateListener<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = (\n rowId: string,\n next: RowStateSnapshot<TInput, TResult> | null,\n prev: RowStateSnapshot<TInput, TResult> | null,\n reason: RowChangeReason,\n) => void;\n\nexport type SelectionSnapshot = {\n ranges: SelectionRange[];\n activeRowIndex: number | null;\n activeRowKey: string | null;\n activeColumnIndex: number | null;\n activeColumnKey: string | null;\n activeValueRaw: unknown;\n activeValueDisplay: string;\n activeValueType: ColumnType | null;\n diagnostic: CellDiagnostic | null;\n action?: CellAction | null;\n styles: {\n columnStyle: Partial<ResolvedCellStyle>;\n cellStyle: Partial<ResolvedCellStyle>;\n resolved: Partial<ResolvedCellStyle>;\n };\n};\n\nexport type SelectionChangeReason =\n | \"selection\"\n | \"edit\"\n | \"action\"\n | \"style\"\n | \"schema\"\n | \"view\"\n | \"data\"\n | \"unknown\";\nexport type SelectionListener = (\n next: SelectionSnapshot,\n prev: SelectionSnapshot | null,\n reason: SelectionChangeReason,\n) => void;\n","import \"./styles.css\";\nimport { CommandQueue } from \"./commandQueue\";\nimport { DataModel } from \"./dataModel\";\nimport { resolveCellAddress } from \"./address\";\nimport { LockManager } from \"./lockManager\";\nimport { CanvasRenderer, HTMLRenderer, type Renderer, type ViewportState } from \"./renderers\";\nimport { SelectionManager } from \"./selectionManager\";\nimport { resolveCellStyles } from \"./styleResolver\";\nimport { getButtonLabel, getLinkLabel } from \"./actionValue\";\nimport { removeFromParent, toArray } from \"./utils\";\nimport type {\n CellAction,\n CellTarget,\n Command,\n CommitHandler,\n CoreOptions,\n HistoryCommandKind,\n InternalRow,\n NullableData,\n EditMode,\n LockMode,\n RenderMode,\n Schema,\n ServerAdapter,\n SelectionChangeReason,\n SelectionListener,\n SelectionRange,\n SelectionSnapshot,\n TableConfig,\n TableError,\n TableState,\n TableStateListener,\n UndoRedoHistory,\n UndoRedoStep,\n UserInfo,\n Updater,\n View,\n ViewFilterValues,\n RowObject,\n RowStateSnapshot,\n RowStateListener,\n RowChangeReason,\n} from \"./types\";\n\nexport * from \"./types\";\n\nexport interface CoreInit<T extends object = Record<string, unknown>> {\n root: HTMLElement;\n defaultData: NullableData<T>;\n defaultView: View;\n schema: Schema<any>;\n options?: CoreOptions;\n}\n\nexport class ExtableCore<T extends object = Record<string, unknown>, R extends object = T> {\n private root: HTMLElement;\n private shell: HTMLDivElement | null = null;\n private viewportEl: HTMLDivElement | null = null;\n private viewportResizeObserver: ResizeObserver | null = null;\n private dataModel: DataModel;\n private dataLoaded: boolean;\n private commandQueue: CommandQueue;\n private lockManager: LockManager;\n private renderer: Renderer;\n private selectionManager: SelectionManager | null = null;\n private renderMode: RenderMode;\n private editMode: EditMode;\n private lockMode: LockMode;\n private server?: ServerAdapter;\n private user?: UserInfo;\n private unsubscribe?: () => void;\n private resizeHandler: (() => void) | null = null;\n private scrollHandler: (() => void) | null = null;\n private viewportState: ViewportState | null = null;\n private rafId: number | null = null;\n private contextMenu: HTMLDivElement | null = null;\n private contextMenuRowId: string | null = null;\n private handleGlobalPointer: ((ev: MouseEvent | PointerEvent) => void) | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: number | null = null;\n private sequenceLangs?: readonly string[];\n\n private mounted = false;\n\n private isCellReadonly(rowId: string, colKey: string) {\n return this.editMode === \"readonly\" || this.dataModel.isReadonly(rowId, colKey);\n }\n\n private resolveRowId(row: string | number): string | null {\n if (typeof row === \"string\") {\n return this.findRowById(row)?.id ?? null;\n }\n const found = this.dataModel.listAllRows()[row] ?? null;\n return found?.id ?? null;\n }\n\n private filterSortSidebar: HTMLElement | null = null;\n private filterSortSidebarUnsub: (() => void) | null = null;\n private filterSortKeydown: ((ev: KeyboardEvent) => void) | null = null;\n private filterSortClickCapture: ((ev: MouseEvent) => void) | null = null;\n private filterSortOpenEvent: ((ev: Event) => void) | null = null;\n private filterSortActiveColumnKey: string | null = null;\n private filterSortDraft: {\n colKey: string;\n values: Array<{ key: string; value: unknown; label: string }>;\n hasBlanks: boolean;\n selected: Set<string>;\n includeBlanks: boolean;\n diagErrors: boolean;\n diagWarnings: boolean;\n search: string;\n } | null = null;\n\n private tableStateListeners = new Set<TableStateListener>();\n private selectionListeners = new Set<SelectionListener>();\n private lastTableState: TableState | null = null;\n private lastSelectionSnapshot: SelectionSnapshot | null = null;\n private lastAction: CellAction | null = null;\n private selectionRanges: SelectionRange[] = [];\n private activeCell: CellTarget | null = null;\n private activeErrors: TableError[] = [];\n private rowStateListeners = new Set<RowStateListener<T, R>>();\n private lastRowStates = new Map<string, RowStateSnapshot<T, R>>();\n\n private isFilterSortPanelVisible() {\n return this.root.classList.contains(\"extable-filter-sort-open\");\n }\n\n private safeRender(state?: ViewportState) {\n try {\n this.renderer.render(state);\n const hadRenderError = this.activeErrors.some((e) => e.scope === \"render\");\n if (hadRenderError) {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"render\");\n this.emitTableState();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"render\"),\n { scope: \"render\", message },\n ];\n this.emitTableState();\n }\n }\n\n constructor(init: CoreInit<T>) {\n this.root = init.root;\n this.root.classList.add(\"extable-root\");\n this.renderMode = init.options?.renderMode ?? \"auto\";\n this.editMode = init.options?.editMode ?? \"direct\";\n this.lockMode = init.options?.lockMode ?? \"none\";\n this.server = init.options?.server;\n this.user = init.options?.user;\n this.sequenceLangs = init.options?.langs;\n\n const defaultData = init.defaultData ?? null;\n const initialData = defaultData ?? [];\n this.dataLoaded = defaultData !== null && defaultData !== undefined;\n this.dataModel = new DataModel(\n initialData as unknown as RowObject[],\n init.schema,\n init.defaultView,\n );\n this.commandQueue = new CommandQueue();\n this.lockManager = new LockManager(this.lockMode, this.server, this.user);\n this.renderer = this.chooseRenderer(this.renderMode);\n this.applyRootDecor(init.options);\n this.applyReadonlyClass();\n void this.loadInitial();\n }\n\n private async loadInitial() {\n if (this.server?.fetchInitial) {\n try {\n const initial = await this.server.fetchInitial();\n this.dataModel.setData(initial.data);\n if (initial.schema) this.dataModel.setSchema(initial.schema);\n if (initial.view) this.dataModel.setView(initial.view);\n this.user = initial.user ?? this.user;\n this.lockManager.setUser(this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"fetchInitial failed\", e);\n }\n }\n this.mount();\n }\n\n private applyRootDecor(options?: CoreOptions) {\n const classes = toArray(options?.defaultClass);\n if (classes?.length) {\n this.root.classList.add(...classes);\n }\n if (options?.defaultStyle) {\n for (const [k, v] of Object.entries(options.defaultStyle)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n }\n\n private applyReadonlyClass() {\n this.root.classList.toggle(\"extable-readonly-all\", this.editMode === \"readonly\");\n }\n\n private chooseRenderer(mode: RenderMode): Renderer {\n if (mode === \"auto\") {\n const ua = typeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n type UserAgentBrand = { brand?: string };\n type NavigatorWithUAData = Navigator & { userAgentData?: { brands?: UserAgentBrand[] } };\n const isBot =\n /bot|crawl|spider|playwright|puppeteer|selenium|phantomjs/i.test(ua) ||\n (typeof navigator !== \"undefined\" &&\n \"userAgentData\" in navigator &&\n (navigator as NavigatorWithUAData).userAgentData?.brands?.some((b) =>\n /bot/i.test(b.brand ?? \"\"),\n ));\n return isBot\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n return mode === \"html\"\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n\n private ensureShell() {\n if (this.shell && this.viewportEl && this.shell.parentElement === this.root) return;\n this.root.innerHTML = \"\";\n const shell = document.createElement(\"div\");\n shell.className = \"extable-shell\";\n const viewport = document.createElement(\"div\");\n viewport.className = \"extable-viewport\";\n shell.appendChild(viewport);\n this.root.appendChild(shell);\n this.shell = shell;\n this.viewportEl = viewport;\n\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = new ResizeObserver(() => {\n this.updateViewportFromRoot();\n });\n this.viewportResizeObserver.observe(viewport);\n }\n\n private getScrollHost() {\n return this.viewportEl ?? this.root;\n }\n\n private mount(force = false) {\n if (this.mounted && !force) return;\n this.ensureShell();\n const host = this.viewportEl ?? this.root;\n this.renderer.mount(host);\n this.ensureContextMenu();\n this.ensureToast();\n this.initViewportState();\n\n this.root.classList.toggle(\"extable-loading\", !this.dataLoaded);\n if (!this.dataLoaded) {\n this.root.dataset.extable = \"loading\";\n this.bindViewport();\n this.ensureFilterSort();\n this.emitTableState();\n this.emitSelection(\"data\");\n return;\n }\n this.selectionManager = new SelectionManager(\n host,\n this.editMode,\n (cmd, commitNow) => this.handleEdit(cmd, commitNow),\n (rowId) => void this.lockManager.selectRow(rowId),\n (rowId) => void this.lockManager.unlockOnMove(rowId),\n (ev) => this.renderer.hitTest(ev),\n this.renderer.hitTestAction ? (ev) => this.renderer.hitTestAction!(ev) : null,\n this.dataModel,\n this.sequenceLangs,\n (rowId, colKey) => this.isCellReadonly(rowId, colKey),\n (action) => this.emitAction(action),\n (rowId, colKey) => {\n const target: CellTarget | null = rowId && colKey !== null ? { rowId, colKey } : null;\n if (target) this.renderer.setActiveCell(target.rowId, target.colKey);\n this.activeCell = target;\n this.emitSelection(\"selection\");\n },\n (rowId, _colKey, x, y) => this.showContextMenu(rowId, x, y),\n (ranges) => {\n this.selectionRanges = ranges;\n this.renderer.setSelection(ranges);\n this.emitSelection(\"selection\");\n },\n () => this.undo(),\n () => this.redo(),\n );\n this.root.dataset.extable = \"ready\";\n this.bindViewport();\n this.ensureFilterSort();\n if (this.server) {\n this.unsubscribe = this.server.subscribe((event) => this.handleServerEvent(event));\n }\n this.emitTableState();\n this.emitSelection(\"selection\");\n this.mounted = true;\n }\n\n destroy() {\n this.teardownFilterSort();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.unsubscribe?.();\n this.unbindViewport();\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.mounted = false;\n }\n\n // editMode/lockMode are configured only at construction time for consistency.\n\n setRootClass(classNames: string | string[]) {\n this.root.className = \"\";\n this.root.classList.add(...(toArray(classNames) ?? []));\n }\n\n setRootStyle(style: Partial<CSSStyleDeclaration>) {\n for (const [k, v] of Object.entries(style)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n\n setData(data: NullableData<T>) {\n if (data == null) {\n // Allow loading only before the first successful data load.\n if (this.dataLoaded) return;\n this.dataLoaded = false;\n this.safeRender(this.viewportState ?? undefined);\n this.emitSelection(\"data\");\n this.emitTableState();\n return;\n }\n const wasLoaded = this.dataLoaded;\n this.dataLoaded = true;\n this.dataModel.setData(data as unknown as RowObject[]);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n\n if (!wasLoaded) {\n this.root.classList.remove(\"extable-loading\");\n this.selectionManager?.destroy();\n this.selectionManager = null;\n this.mount();\n }\n }\n\n setView(view: View) {\n this.dataModel.setView(view);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"view\");\n this.emitTableState();\n }\n\n // Public API: configuration getters (mirror setters)\n getSchema(): Schema {\n return this.dataModel.getSchema();\n }\n\n getView(): View {\n return this.dataModel.getView();\n }\n\n /**\n * Returns the current table data (includes pending edits in commit mode and formula results).\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getData(): R[] {\n return this.getTableData();\n }\n\n /**\n * Returns the raw dataset without pending edits and without formula results.\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getRawData(): T[] {\n return this.dataModel.listAllRows().map((r) => ({ ...(r.raw as unknown as T) }));\n }\n\n // Public API: cell-level access\n getCell<K extends keyof R & string>(rowId: string, colKey: K): R[K] | undefined {\n return this.dataModel.getCell(rowId, colKey) as R[K] | undefined;\n }\n\n // Public API: row/column index utilities\n getRowIndex(rowId: string): number {\n return this.dataModel.getRowIndex(rowId);\n }\n\n getColumnIndex(colKey: string): number {\n return this.dataModel.getColumnIndex(colKey);\n }\n\n // Public API: row-level access\n findRowById(rowId: string): InternalRow | null {\n const idx = this.dataModel.getBaseRowIndex(rowId);\n if (idx < 0) return null;\n return this.dataModel.listAllRows()[idx] ?? null;\n }\n\n listRows(): InternalRow[] {\n return this.dataModel.listRows();\n }\n\n getAllRows(): InternalRow[] {\n return this.dataModel.listAllRows();\n }\n\n /**\n * Returns a single row as an object (includes pending edits in commit mode and formula results).\n * When a number is passed, it is interpreted as the base row index (not affected by view filters/sorts).\n */\n getRow(rowIdOrIndex: string | number): R | null {\n const rowId = this.resolveRowId(rowIdOrIndex);\n if (!rowId) return null;\n return this.buildRow(rowId);\n }\n\n private buildRow(rowId: string): R | null {\n const found = this.findRowById(rowId);\n if (!found) return null;\n const schema = this.dataModel.getSchema();\n const out: Record<string, unknown> = { ...(found.raw as Record<string, unknown>) };\n for (const col of schema.columns) {\n out[col.key] = this.dataModel.resolveCellValue(rowId, col).value;\n }\n return out as R;\n }\n\n // Public API: bulk data access\n getTableData(): R[] {\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.buildRow(r.id)).filter(Boolean) as R[];\n }\n\n getColumnData<K extends keyof R & string>(colKey: K): R[K][] {\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => c.key === colKey);\n if (!col) return [];\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.dataModel.resolveCellValue(r.id, col).value as R[K]);\n }\n\n // Public API: commit-mode pending helpers\n getPending(): Map<string, Record<string, unknown>> {\n if (this.editMode !== \"commit\") return new Map();\n return new Map(this.dataModel.getPending());\n }\n\n getPendingRowIds(): string[] {\n return [...this.getPending().keys()];\n }\n\n hasPendingChanges(): boolean {\n return this.getPending().size > 0;\n }\n\n getPendingCellCount(): number {\n const pending = this.getPending();\n let count = 0;\n for (const row of pending.values()) count += Object.keys(row).length;\n return count;\n }\n\n getCellPending<K extends keyof R & string>(row: string | number, colKey: K): boolean {\n if (this.editMode !== \"commit\") return false;\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n return this.dataModel.hasPending(rowId, colKey);\n }\n\n getDisplayValue<K extends keyof R & string>(row: string | number, colKey: K): string {\n const rowId = this.resolveRowId(row);\n if (!rowId) return \"\";\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return \"\";\n const res = this.dataModel.resolveCellValue(rowId, col);\n if (res.textOverride) return res.textOverride;\n const v = res.value;\n if (col.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const vv = v as Record<string, unknown>;\n if (vv.kind === \"enum\" && typeof vv.value === \"string\") return vv.value;\n if (vv.kind === \"tags\" && Array.isArray(vv.values)) {\n const values = vv.values.filter((x): x is string => typeof x === \"string\");\n return values.join(\", \");\n }\n }\n return String(v);\n }\n\n insertRow(rowData: T, position?: number | string): string | null {\n let insertAt: number | null = null;\n if (typeof position === \"number\" && Number.isFinite(position)) {\n insertAt = Math.max(0, Math.min(Math.floor(position), this.dataModel.getAllRowCount()));\n } else if (typeof position === \"string\") {\n const baseIdx = this.dataModel.getBaseRowIndex(position);\n if (baseIdx >= 0) insertAt = baseIdx;\n }\n if (insertAt === null) insertAt = this.dataModel.getAllRowCount();\n const newId = this.dataModel.insertRowAt(rowData as unknown as RowObject, insertAt);\n const cmd: Command = {\n kind: \"insertRow\",\n rowId: newId,\n rowData: rowData as unknown as RowObject,\n payload: { index: insertAt },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return newId;\n }\n\n deleteRow(row: string | number): boolean {\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n const removed = this.dataModel.removeRow(rowId);\n if (!removed) return false;\n const cmd: Command = {\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(rowId, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return true;\n }\n\n private handleEdit(cmd: Command, commitNow: boolean) {\n if (this.editMode === \"readonly\") return;\n if (!cmd.rowId || cmd.colKey === undefined) return;\n const prev = this.dataModel.getCell(cmd.rowId, cmd.colKey);\n this.commandQueue.enqueue({ ...cmd, prev });\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, commitNow);\n this.emitRowState(cmd.rowId, \"edit\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n if (commitNow) {\n void this.sendCommit([cmd]);\n }\n }\n\n undo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.undo();\n if (!cmds || !cmds.length) return;\n // Apply inverse operations in reverse order.\n for (let i = cmds.length - 1; i >= 0; i -= 1) {\n const cmd = cmds[i];\n if (!cmd) continue;\n this.applyInverse(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n redo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.redo();\n if (!cmds || !cmds.length) return;\n for (const cmd of cmds) {\n this.applyForward(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n getUndoRedoHistory(): UndoRedoHistory {\n const toKinds = (cmds: Command[]): HistoryCommandKind[] => {\n const seen = new Set<HistoryCommandKind>();\n const kinds: HistoryCommandKind[] = [];\n for (const c of cmds) {\n if (seen.has(c.kind)) continue;\n seen.add(c.kind);\n kinds.push(c.kind);\n }\n return kinds;\n };\n\n const labelFor = (kinds: HistoryCommandKind[], commandCount: number) => {\n if (kinds.length === 1 && kinds[0] === \"edit\") {\n return `Edit ${commandCount} cell(s)`;\n }\n if (kinds.length === 1 && kinds[0] === \"insertRow\") {\n return commandCount === 1 ? \"Insert row\" : `Insert row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"deleteRow\") {\n return commandCount === 1 ? \"Delete row\" : `Delete row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"updateView\") {\n return \"Update view\";\n }\n return `Command: ${kinds.join(\", \")} (${commandCount})`;\n };\n\n const toSteps = (groups: { batchId: string | null; commands: Command[] }[]): UndoRedoStep[] =>\n groups.map((g) => {\n const kinds = toKinds(g.commands);\n const commandCount = g.commands.length;\n return {\n batchId: g.batchId,\n kinds,\n commandCount,\n label: labelFor(kinds, commandCount),\n };\n });\n\n return {\n undo: toSteps(this.commandQueue.listUndoGroups()),\n redo: toSteps(this.commandQueue.listRedoGroups()),\n };\n }\n\n private applyInverse(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.prev, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowId) this.dataModel.removeRow(cmd.rowId);\n if (cmd.rowId) this.emitRowState(cmd.rowId, \"delete\");\n return;\n case \"deleteRow\":\n if (cmd.rowId && cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n this.dataModel.insertRowAt(cmd.rowData, index, cmd.rowId);\n this.emitRowState(cmd.rowId, \"new\");\n }\n return;\n default:\n return;\n }\n }\n\n private applyForward(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n const forcedId = typeof cmd.rowId === \"string\" ? cmd.rowId : undefined;\n this.dataModel.insertRowAt(cmd.rowData, index, forcedId);\n if (forcedId) this.emitRowState(forcedId, \"new\");\n }\n return;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n return;\n default:\n return;\n }\n }\n\n async commit(): Promise<RowStateSnapshot<T, R>[]>;\n async commit(handler: CommitHandler): Promise<RowStateSnapshot<T, R>[]>;\n async commit(handler?: CommitHandler): Promise<RowStateSnapshot<T, R>[]> {\n const pending = this.commandQueue.listApplied();\n if (!pending.length) return [];\n if (handler) {\n try {\n await handler({ commands: pending, user: this.user });\n this.clearCommitErrors();\n } catch (e) {\n this.recordCommitError(e);\n throw e;\n }\n return this.finalizeCommit(pending);\n }\n const snapshots = this.finalizeCommit(pending, () => this.sendCommit(pending));\n return snapshots;\n }\n\n private async sendCommit(commands: Command[]) {\n if (this.server && this.user) {\n try {\n await this.server.commit(commands, this.user);\n this.clearCommitErrors();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"commit failed\", e);\n this.recordCommitError(e);\n }\n }\n }\n\n private clearCommitErrors() {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"commit\");\n this.emitTableState();\n }\n\n private recordCommitError(error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"commit\"),\n { scope: \"commit\", message: msg },\n ];\n this.emitTableState();\n }\n\n private finalizeCommit(\n pending: Command[],\n afterApply?: () => Promise<void>,\n ): Promise<RowStateSnapshot<T, R>[]> {\n const touched = new Set<string>();\n for (const cmd of pending) {\n if (cmd.rowId) {\n this.dataModel.applyPending(cmd.rowId);\n touched.add(cmd.rowId);\n }\n }\n const run = async () => {\n if (afterApply) await afterApply();\n await this.lockManager.unlockOnCommit(pending.at(-1)?.rowId);\n this.commandQueue.clear();\n const snapshots: RowStateSnapshot<T, R>[] = [];\n for (const rowId of touched) {\n this.emitRowState(rowId, \"edit\");\n const snap = this.getRowStateSnapshot(rowId);\n if (snap) snapshots.push(snap);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n return snapshots;\n };\n return run();\n }\n\n private handleServerEvent(event: {\n type: \"update\";\n commands: Command[];\n user: UserInfo;\n }) {\n for (const cmd of event.commands) {\n this.applyCommand(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n }\n\n private applyCommand(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, true);\n this.emitRowState(cmd.rowId, \"edit\");\n }\n break;\n case \"insertRow\":\n if (cmd.rowData) {\n const id = this.dataModel.insertRow(cmd.rowData);\n if (id) this.emitRowState(id, \"new\");\n }\n break;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n break;\n case \"updateView\":\n if (cmd.next && typeof cmd.next === \"object\") {\n this.dataModel.setView(cmd.next as View);\n }\n break;\n default:\n break;\n }\n }\n\n private ensureContextMenu() {\n if (this.contextMenu?.isConnected) return;\n this.contextMenu = null;\n const pop = document.createElement(\"div\");\n pop.className = \"extable-context-menu\";\n pop.setAttribute(\"popover\", \"manual\");\n pop.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n const readonlyMode = this.editMode === \"readonly\";\n const actions: Array<{ key: string; label?: string; kind?: \"sep\" }> = readonlyMode\n ? [{ key: \"copy\", label: \"Copy\" }]\n : [\n { key: \"copy\", label: \"Copy\" },\n { key: \"paste\", label: \"Paste\" },\n { key: \"sep-top\", kind: \"sep\" },\n { key: \"undo\", label: \"Undo\" },\n { key: \"redo\", label: \"Redo\" },\n { key: \"sep-mid\", kind: \"sep\" },\n { key: \"insert-above\", label: \"Insert row above\" },\n { key: \"insert-below\", label: \"Insert row below\" },\n { key: \"delete-row\", label: \"Delete row\" },\n ];\n const list = document.createElement(\"div\");\n for (const act of actions) {\n if (act.kind === \"sep\") {\n const hr = document.createElement(\"hr\");\n hr.className = \"extable-context-sep\";\n list.appendChild(hr);\n continue;\n }\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.dataset.action = act.key;\n btn.textContent = act.label ?? \"\";\n btn.addEventListener(\"click\", () => {\n this.handleContextAction(act.key);\n this.closeContextMenu();\n });\n list.appendChild(btn);\n }\n pop.appendChild(list);\n (this.viewportEl ?? this.root).appendChild(pop);\n this.contextMenu = pop;\n }\n\n private showContextMenu(rowId: string | null, clientX: number, clientY: number) {\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n if (!this.contextMenu.isConnected) {\n // Host may have been rebuilt (e.g. renderer switch). Recreate.\n this.contextMenu = null;\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n }\n this.contextMenuRowId = rowId;\n // Update enable/disable state for undo/redo.\n for (const btn of Array.from(\n this.contextMenu.querySelectorAll<HTMLButtonElement>(\"button[data-action]\"),\n )) {\n const action = btn.dataset.action;\n if (action === \"undo\") btn.disabled = !this.commandQueue.canUndo();\n else if (action === \"redo\") btn.disabled = !this.commandQueue.canRedo();\n }\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const rect = { width: 220, height: 160 };\n let left = clientX;\n let top = clientY;\n if (left + rect.width > viewportWidth) left = Math.max(0, viewportWidth - rect.width - 8);\n if (top + rect.height > viewportHeight) top = Math.max(0, viewportHeight - rect.height - 8);\n this.contextMenu.style.left = `${left}px`;\n this.contextMenu.style.top = `${top}px`;\n this.contextMenu.hidePopover?.();\n this.contextMenu.showPopover?.();\n }\n\n private handleContextAction(action: string) {\n if (action === \"copy\") {\n void this.selectionManager?.copySelection();\n return;\n }\n if (action === \"paste\") {\n void this.selectionManager?.pasteFromClipboard();\n return;\n }\n if (action === \"undo\") {\n this.undo();\n return;\n }\n if (action === \"redo\") {\n this.redo();\n return;\n }\n if (!this.contextMenuRowId) return;\n const idx = this.dataModel.getBaseRowIndex(this.contextMenuRowId);\n const targetIndex = idx >= 0 ? idx : this.dataModel.getAllRowCount();\n if (action === \"insert-above\" || action === \"insert-below\") {\n const insertAt = action === \"insert-above\" ? targetIndex : targetIndex + 1;\n const raw = this.createBlankRow();\n const newId = this.dataModel.insertRowAt(raw, insertAt);\n this.commandQueue.enqueue({\n kind: \"insertRow\",\n rowId: newId,\n rowData: raw,\n payload: { index: insertAt },\n });\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row inserted\", \"info\");\n return;\n }\n if (action === \"delete-row\") {\n const removed = this.dataModel.removeRow(this.contextMenuRowId);\n if (!removed) return;\n this.commandQueue.enqueue({\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n });\n this.emitRowState(removed.row.id, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row deleted\", \"info\");\n return;\n }\n }\n\n private createBlankRow(): RowObject {\n const schema = this.dataModel.getSchema();\n const obj: RowObject = {};\n for (const col of schema.columns) {\n obj[String(col.key)] = null;\n }\n return obj;\n }\n\n private closeContextMenu() {\n this.contextMenu?.hidePopover?.();\n }\n\n private ensureToast() {\n if (this.toast?.isConnected) return;\n this.toast = null;\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.setAttribute(\"popover\", \"manual\");\n toast.style.right = \"16px\";\n toast.style.bottom = \"16px\";\n toast.style.position = \"fixed\";\n (this.viewportEl ?? this.root).appendChild(toast);\n this.toast = toast;\n }\n\n private showToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 2500) {\n this.ensureToast();\n if (!this.toast) return;\n this.toast.textContent = message;\n this.toast.dataset.variant = variant;\n this.toast.hidePopover?.();\n this.toast.showPopover?.();\n if (this.toastTimer) {\n window.clearTimeout(this.toastTimer);\n this.toastTimer = null;\n }\n this.toastTimer = window.setTimeout(() => {\n this.toast?.hidePopover?.();\n }, durationMs);\n }\n\n private bindViewport() {\n this.resizeHandler = () => this.updateViewportFromRoot();\n this.scrollHandler = () => this.updateViewportFromRoot();\n this.getScrollHost().addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.resizeHandler);\n this.handleGlobalPointer = (ev: MouseEvent | PointerEvent) => {\n if (this.contextMenu && !this.contextMenu.contains(ev.target as Node)) {\n this.contextMenu.hidePopover?.();\n }\n };\n document.addEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n\n }\n\n private unbindViewport() {\n if (this.resizeHandler) window.removeEventListener(\"resize\", this.resizeHandler);\n if (this.scrollHandler) this.getScrollHost().removeEventListener(\"scroll\", this.scrollHandler);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n if (this.handleGlobalPointer) {\n document.removeEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n this.handleGlobalPointer = null;\n }\n if (this.contextMenu) {\n this.contextMenu.hidePopover?.();\n if (this.contextMenu.parentElement) removeFromParent(this.contextMenu);\n this.contextMenu = null;\n }\n if (this.toast) {\n this.toast.hidePopover?.();\n if (this.toast.parentElement) removeFromParent(this.toast);\n this.toast = null;\n }\n }\n\n remount(target: HTMLElement) {\n this.unbindViewport();\n this.teardownFilterSort();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.root = target;\n this.applyReadonlyClass();\n this.shell = null;\n this.viewportEl = null;\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.renderer = this.chooseRenderer(this.renderMode);\n this.mounted = false;\n this.mount(true);\n }\n\n // Public API: table-level state callbacks\n getTableState(): TableState {\n const effective = this.renderer instanceof HTMLRenderer ? \"html\" : \"canvas\";\n const applied = this.commandQueue.listApplied();\n const pendingCommands = this.editMode === \"commit\" ? applied : [];\n const pendingCommandCount = pendingCommands.length;\n const pendingCellCount = (() => {\n const keys = new Set<string>();\n for (const c of pendingCommands) {\n if (c.kind !== \"edit\") continue;\n if (!c.rowId || c.colKey === undefined) continue;\n keys.add(`${c.rowId}::${String(c.colKey)}`);\n }\n return keys.size;\n })();\n const validationErrors: TableError[] = this.dataModel.getValidationErrors().map((e) => ({\n scope: \"validation\",\n message: e.message,\n target: { rowId: e.rowId, colKey: e.colKey },\n }));\n const diagnosticErrors: TableError[] = this.dataModel\n .getDiagnostics()\n .map((x) => {\n if (!x.diag) return null;\n return {\n scope: x.diag.source,\n message: x.diag.message,\n target: { rowId: x.rowId, colKey: x.colKey },\n } as TableError;\n })\n .filter(Boolean) as TableError[];\n diagnosticErrors.sort((a, b) => {\n const ar = a.target?.rowId ? this.dataModel.getRowIndex(a.target.rowId) : -1;\n const br = b.target?.rowId ? this.dataModel.getRowIndex(b.target.rowId) : -1;\n if (ar !== br) return ar - br;\n const ac =\n a.target?.colKey !== undefined ? this.dataModel.getColumnIndex(a.target.colKey) : -1;\n const bc =\n b.target?.colKey !== undefined ? this.dataModel.getColumnIndex(b.target.colKey) : -1;\n if (ac !== bc) return ac - bc;\n if (a.scope !== b.scope) return a.scope < b.scope ? -1 : 1;\n return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;\n });\n const activeErrors = [\n ...validationErrors,\n ...diagnosticErrors.slice(0, 200),\n ...this.activeErrors,\n ];\n return {\n canCommit: this.editMode === \"commit\" && pendingCommandCount > 0,\n pendingCommandCount,\n pendingCellCount,\n undoRedo: { canUndo: this.commandQueue.canUndo(), canRedo: this.commandQueue.canRedo() },\n renderMode: effective,\n activeErrors,\n };\n }\n\n subscribeTableState(listener: TableStateListener) {\n this.tableStateListeners.add(listener);\n listener(this.getTableState(), null);\n return () => this.tableStateListeners.delete(listener);\n }\n\n private emitTableState() {\n const next = this.getTableState();\n const prev = this.lastTableState;\n const errorsEqual = (() => {\n if (!prev) return false;\n if (prev.activeErrors.length !== next.activeErrors.length) return false;\n for (let i = 0; i < next.activeErrors.length; i += 1) {\n const a = prev.activeErrors[i];\n const b = next.activeErrors[i];\n if (!a || !b) return false;\n if (a.scope !== b.scope) return false;\n if (a.message !== b.message) return false;\n const at = a.target;\n const bt = b.target;\n if (!at && !bt) continue;\n if (!at || !bt) return false;\n if ((at.rowId ?? null) !== (bt.rowId ?? null)) return false;\n if (String(at.colKey ?? \"\") !== String(bt.colKey ?? \"\")) return false;\n }\n return true;\n })();\n // Shallow equality shortcut.\n const same =\n prev &&\n prev.canCommit === next.canCommit &&\n prev.pendingCommandCount === next.pendingCommandCount &&\n prev.pendingCellCount === next.pendingCellCount &&\n prev.undoRedo.canUndo === next.undoRedo.canUndo &&\n prev.undoRedo.canRedo === next.undoRedo.canRedo &&\n prev.renderMode === next.renderMode &&\n errorsEqual;\n if (same) return;\n this.lastTableState = next;\n for (const l of this.tableStateListeners) l(next, prev);\n }\n\n // Public API: selection callbacks\n getSelectionSnapshot(): SelectionSnapshot {\n const ranges = this.selectionRanges;\n const schema = this.dataModel.getSchema();\n const active = this.activeCell;\n const activeRowId = active?.rowId ?? null;\n const activeColKey = active?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : null;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : null;\n const col =\n activeColIndex !== null && activeColIndex >= 0 ? schema.columns[activeColIndex] : null;\n\n const activeValueRes =\n activeRowId && col ? this.dataModel.resolveCellValue(activeRowId, col) : null;\n const activeCondRes =\n activeRowId && col ? this.dataModel.resolveConditionalStyle(activeRowId, col) : null;\n const activeTextOverride =\n activeValueRes?.textOverride ?? (activeCondRes?.forceErrorText ? \"#ERROR\" : undefined);\n const activeValueRaw = activeValueRes ? activeValueRes.value : null;\n const activeValueDisplay = (() => {\n if (activeTextOverride) return activeTextOverride;\n const v = activeValueRaw;\n if (col?.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col?.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n const activeValueType = col?.type ?? null;\n const diagnostic =\n activeRowId && activeColKey !== null\n ? this.dataModel.getCellDiagnostic(activeRowId, activeColKey)\n : null;\n\n const activeStyles = (() => {\n if (!activeRowId || !col) {\n return { columnStyle: {}, cellStyle: {}, resolved: {} };\n }\n const { columnStyle, cellStyle, resolved } = resolveCellStyles(\n this.dataModel,\n activeRowId,\n col,\n );\n return { columnStyle, cellStyle, resolved };\n })();\n\n return {\n ranges: [...ranges],\n activeRowIndex: activeRowIndex !== null && activeRowIndex >= 0 ? activeRowIndex : null,\n activeRowKey: activeRowId,\n activeColumnIndex: activeColIndex !== null && activeColIndex >= 0 ? activeColIndex : null,\n activeColumnKey: activeColKey,\n activeValueRaw,\n activeValueDisplay,\n activeValueType,\n diagnostic,\n action: this.lastAction,\n styles: activeStyles,\n };\n }\n\n subscribeSelection(listener: SelectionListener) {\n this.selectionListeners.add(listener);\n listener(this.getSelectionSnapshot(), null, \"selection\");\n return () => this.selectionListeners.delete(listener);\n }\n\n private emitAction(action: CellAction) {\n this.lastAction = action;\n this.emitSelection(\"action\");\n this.lastAction = null;\n }\n\n private emitSelection(reason: SelectionChangeReason) {\n const next = this.getSelectionSnapshot();\n const prev = this.lastSelectionSnapshot;\n this.lastSelectionSnapshot = next;\n for (const l of this.selectionListeners) l(next, prev, reason);\n }\n\n private getRowStateSnapshot(rowId: string): RowStateSnapshot<T, R> | null {\n const rowIndex = this.dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const data = this.buildRow(rowId);\n if (!data) return null;\n const pending =\n this.editMode === \"commit\"\n ? (this.dataModel.getPending().get(rowId) ?? undefined)\n : undefined;\n const diagnostics = this.getTableState().activeErrors.filter((e) => e.target?.rowId === rowId);\n return {\n rowId,\n rowIndex,\n data,\n pending: pending as Partial<T> | undefined,\n diagnostics: diagnostics.length ? diagnostics : undefined,\n };\n }\n\n subscribeRowState(listener: RowStateListener<T, R>) {\n this.rowStateListeners.add(listener);\n const rows = this.dataModel.listAllRows();\n for (const row of rows) {\n const snap = this.getRowStateSnapshot(row.id);\n if (!snap) continue;\n this.lastRowStates.set(row.id, snap);\n listener(row.id, snap, null, \"new\");\n }\n return () => this.rowStateListeners.delete(listener);\n }\n\n private emitRowState(rowId: string, reason: RowChangeReason) {\n const prev = this.lastRowStates.get(rowId) ?? null;\n if (reason === \"delete\") {\n this.lastRowStates.delete(rowId);\n for (const l of this.rowStateListeners) l(rowId, null, prev, reason);\n return;\n }\n const next = this.getRowStateSnapshot(rowId);\n if (!next) return;\n this.lastRowStates.set(rowId, next);\n for (const l of this.rowStateListeners) l(rowId, next, prev, reason);\n }\n\n // Public API: value updates\n setCellValue<K extends keyof T & string>(row: number | string, colKey: K, next: Updater<T[K]>) {\n const rowId = typeof row === \"string\" ? row : this.dataModel.listRows()[row]?.id;\n const resolved = rowId ? resolveCellAddress(this.dataModel, { rowId, colKey }) : null;\n if (!resolved) return;\n if (this.isCellReadonly(resolved.rowId, resolved.colKey)) return;\n const current = this.dataModel.getCell(resolved.rowId, resolved.colKey) as T[K];\n const computed = typeof next === \"function\" ? (next as (old: T[K]) => T[K])(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: resolved.rowId, colKey: resolved.colKey, next: computed },\n this.editMode === \"direct\",\n );\n }\n\n setValueToSelection(next: Updater<unknown>) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const unique = new Set<string>();\n for (const r of this.selectionRanges) {\n if (r.kind !== \"cells\") continue;\n const sr = Math.min(r.startRow, r.endRow);\n const er = Math.max(r.startRow, r.endRow);\n const sc = Math.min(r.startCol, r.endCol);\n const ec = Math.max(r.startCol, r.endCol);\n for (let rowIndex = sr; rowIndex <= er; rowIndex += 1) {\n const row = rows[rowIndex];\n if (!row) continue;\n for (let colIndex = sc; colIndex <= ec; colIndex += 1) {\n const col = schema.columns[colIndex];\n if (!col) continue;\n const key = `${row.id}::${String(col.key)}`;\n if (unique.has(key)) continue;\n unique.add(key);\n if (this.isCellReadonly(row.id, col.key)) continue;\n const current = this.dataModel.getCell(row.id, col.key);\n const computed = typeof next === \"function\" ? next(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: row.id, colKey: col.key, next: computed },\n this.editMode === \"direct\",\n );\n }\n }\n }\n }\n\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private ensureFilterSort() {\n this.ensureFilterSortSidebar();\n this.ensureFilterSortHeaderIntegration();\n this.ensureFilterSortEscape();\n }\n\n private ensureFilterSortEscape() {\n if (this.filterSortKeydown) return;\n this.filterSortKeydown = (ev: KeyboardEvent) => {\n if (!this.isFilterSortPanelVisible()) return;\n if (ev.key !== \"Escape\") return;\n ev.preventDefault();\n ev.stopPropagation();\n this.hideFilterSortPanel();\n };\n document.addEventListener(\"keydown\", this.filterSortKeydown, true);\n }\n\n private ensureFilterSortHeaderIntegration() {\n if (this.filterSortClickCapture) return;\n const host = this.viewportEl ?? this.root;\n this.filterSortClickCapture = (ev: MouseEvent) => {\n const el = ev.target as HTMLElement | null;\n const btn = el?.closest<HTMLButtonElement>('button[data-extable-fs-open=\"1\"]');\n if (!btn) return;\n const key =\n btn.dataset.extableColKey ?? btn.closest<HTMLElement>(\"th[data-col-key]\")?.dataset.colKey;\n if (!key) return;\n ev.preventDefault();\n ev.stopPropagation();\n this.showFilterSortPanel(key);\n };\n host.addEventListener(\"click\", this.filterSortClickCapture, true);\n this.filterSortOpenEvent = (ev: Event) => {\n const anyEv = ev as CustomEvent<unknown>;\n const detail = anyEv.detail as Record<string, unknown> | null | undefined;\n const key = detail?.colKey;\n if (key === undefined || key === null) return;\n this.showFilterSortPanel(String(key));\n };\n host.addEventListener(\"extable:filter-sort-open\", this.filterSortOpenEvent);\n }\n\n private ensureFilterSortSidebar() {\n if (this.filterSortSidebar) {\n if (this.filterSortSidebar.isConnected) return;\n this.filterSortSidebar = null;\n }\n this.ensureShell();\n const shell = this.shell ?? this.root;\n\n const aside = document.createElement(\"aside\");\n aside.className = \"extable-filter-sort-sidebar\";\n aside.innerHTML = `\n <div class=\"extable-filter-sort-header\">\n <div class=\"extable-filter-sort-row\">\n <div class=\"extable-filter-sort-title\" data-extable-fs=\"title\">Sort/Filter</div>\n <button type=\"button\" data-extable-fs=\"close\" class=\"extable-filter-sort-close\">×</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-body\">\n <div class=\"extable-filter-sort-section extable-filter-sort-section-filter\">\n <div class=\"extable-filter-sort-section-title\">Filter</div>\n <div class=\"extable-filter-sort-actions\">\n <label><input type=\"checkbox\" data-extable-fs=\"col-errors\" /> Errors</label>\n <label><input type=\"checkbox\" data-extable-fs=\"col-warnings\" /> Warnings</label>\n </div>\n <input data-extable-fs=\"search\" type=\"text\" placeholder=\"Search values\" />\n <div class=\"extable-filter-sort-values\" data-extable-fs=\"values\"></div>\n <div class=\"extable-filter-sort-actions\" data-align=\"split\">\n <button type=\"button\" data-extable-fs=\"select-all\">Select All</button>\n <button type=\"button\" data-extable-fs=\"select-none\">Select None</button>\n <button type=\"button\" data-extable-fs=\"apply-filter\">Apply</button>\n <button type=\"button\" data-extable-fs=\"clear-filter\">Clear</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-section extable-filter-sort-section-sort\">\n <div class=\"extable-filter-sort-section-title\">Sort</div>\n <div class=\"extable-filter-sort-actions\" data-align=\"right\">\n <button type=\"button\" data-extable-fs=\"sort-asc\">Sort Asc</button>\n <button type=\"button\" data-extable-fs=\"sort-desc\">Sort Desc</button>\n <button type=\"button\" data-extable-fs=\"clear-sort\">Clear Sort</button>\n </div>\n </div>\n </div>\n `;\n shell.appendChild(aside);\n this.filterSortSidebar = aside;\n\n const btnClose = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"close\"]');\n const cbErrors = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"col-errors\"]');\n const cbWarnings = aside.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]');\n const values = aside.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n const btnAll = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-all\"]');\n const btnNone = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-none\"]');\n const btnApply = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"apply-filter\"]',\n );\n const btnClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-filter\"]',\n );\n const btnSortAsc = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"sort-asc\"]');\n const btnSortDesc = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const btnSortClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-sort\"]',\n );\n\n if (\n !btnClose ||\n !cbErrors ||\n !cbWarnings ||\n !search ||\n !values ||\n !btnAll ||\n !btnNone ||\n !btnApply ||\n !btnClear ||\n !btnSortAsc ||\n !btnSortDesc ||\n !btnSortClear\n ) {\n removeFromParent(aside);\n this.filterSortSidebar = null;\n return;\n }\n\n btnClose.addEventListener(\"click\", () => this.hideFilterSortPanel());\n\n cbErrors.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagErrors = cbErrors.checked;\n });\n cbWarnings.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagWarnings = cbWarnings.checked;\n });\n search.addEventListener(\"input\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.search = search.value;\n this.renderFilterSortValues();\n });\n\n values.addEventListener(\"change\", (e) => {\n const input = (e.target as HTMLElement | null)?.closest<HTMLInputElement>(\n 'input[type=\"checkbox\"][data-fs-val]',\n );\n if (!input || !this.filterSortDraft) return;\n const k = input.dataset.fsVal ?? \"\";\n if (!k) return;\n if (k === \"__blanks__\") {\n this.filterSortDraft.includeBlanks = input.checked;\n } else if (input.checked) {\n this.filterSortDraft.selected.add(k);\n } else {\n this.filterSortDraft.selected.delete(k);\n }\n });\n\n btnAll.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set(this.filterSortDraft.values.map((v) => v.key));\n this.filterSortDraft.includeBlanks = this.filterSortDraft.hasBlanks;\n this.renderFilterSortValues();\n });\n btnNone.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set();\n this.filterSortDraft.includeBlanks = false;\n this.renderFilterSortValues();\n });\n btnApply.addEventListener(\"click\", () => this.applyFilterSortDraft());\n btnClear.addEventListener(\"click\", () => this.clearFilterSortForActiveColumn());\n btnSortAsc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"asc\"));\n btnSortDesc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"desc\"));\n btnSortClear.addEventListener(\"click\", () => this.clearSort());\n\n this.filterSortSidebarUnsub = this.dataModel.subscribe(() => {\n if (!this.isFilterSortPanelVisible()) return;\n if (!this.filterSortActiveColumnKey) return;\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n });\n }\n\n showFilterSortPanel(colKey: string) {\n this.filterSortActiveColumnKey = colKey;\n this.buildFilterSortDraft(colKey);\n this.root.classList.toggle(\"extable-filter-sort-open\", true);\n this.renderFilterSortSidebar();\n const input =\n this.filterSortSidebar?.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]') ??\n null;\n input?.focus();\n }\n\n hideFilterSortPanel() {\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n toggleFilterSortPanel(colKey: string) {\n if (this.isFilterSortPanelVisible()) this.hideFilterSortPanel();\n else this.showFilterSortPanel(colKey);\n }\n\n private buildFilterSortDraft(colKey: string) {\n const view = this.dataModel.getView();\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n this.filterSortDraft = null;\n return;\n }\n const prevSearch =\n this.filterSortDraft && String(this.filterSortDraft.colKey) === String(col.key)\n ? this.filterSortDraft.search\n : \"\";\n const distinct = this.dataModel.getDistinctValuesForColumn(col.key);\n const values = distinct.values.map((v) => ({ ...v, key: this.stableValueKey(v.value) }));\n const existing = (view.filters ?? []).find(\n (f) =>\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(col.key),\n ) as ViewFilterValues | undefined;\n\n const selected = new Set<string>();\n if (existing) {\n for (const v of existing.values ?? []) selected.add(this.stableValueKey(v));\n } else {\n for (const v of values) selected.add(v.key);\n }\n const includeBlanks = existing ? Boolean(existing.includeBlanks) : distinct.hasBlanks;\n const diag = view.columnDiagnostics?.[String(col.key)];\n this.filterSortDraft = {\n colKey: col.key,\n values,\n hasBlanks: distinct.hasBlanks,\n selected,\n includeBlanks,\n diagErrors: Boolean(diag?.errors),\n diagWarnings: Boolean(diag?.warnings),\n search: prevSearch,\n };\n }\n\n private renderFilterSortSidebar() {\n if (!this.filterSortSidebar) return;\n const title = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"title\"]');\n const cbErrors = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-errors\"]',\n );\n const cbWarnings = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"search\"]',\n );\n if (!title || !cbErrors || !cbWarnings || !search) return;\n const btnSortAsc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-asc\"]',\n );\n const btnSortDesc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const draft = this.filterSortDraft;\n if (!draft) {\n title.textContent = \"Sort/Filter\";\n cbErrors.checked = false;\n cbWarnings.checked = false;\n search.value = \"\";\n if (btnSortAsc) btnSortAsc.dataset.active = \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = \"0\";\n this.renderFilterSortValues();\n return;\n }\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(draft.colKey));\n const name = col?.header ?? String(draft.colKey);\n title.textContent = `Sort/Filter: ${name}`;\n cbErrors.checked = draft.diagErrors;\n cbWarnings.checked = draft.diagWarnings;\n search.value = draft.search;\n const view = this.dataModel.getView();\n const sort = view.sorts?.find((s) => String(s.key) === String(draft.colKey));\n if (btnSortAsc) btnSortAsc.dataset.active = sort?.dir === \"asc\" ? \"1\" : \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = sort?.dir === \"desc\" ? \"1\" : \"0\";\n this.renderFilterSortValues();\n }\n\n private renderFilterSortValues() {\n if (!this.filterSortSidebar) return;\n const values = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n if (!values) return;\n values.innerHTML = \"\";\n const draft = this.filterSortDraft;\n if (!draft) return;\n\n const q = draft.search.trim().toLowerCase();\n const total = draft.values.length + (draft.hasBlanks ? 1 : 0);\n if (total > 100 && !q) {\n const msg = document.createElement(\"div\");\n msg.textContent = \"Too many values (100+). Type to search.\";\n values.appendChild(msg);\n return;\n }\n\n if (draft.hasBlanks) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = \"__blanks__\";\n cb.checked = draft.includeBlanks;\n const text = document.createElement(\"span\");\n text.textContent = \"(Blanks)\";\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n\n const filtered = q\n ? draft.values.filter((v) => v.label.toLowerCase().includes(q))\n : draft.values;\n for (const v of filtered.slice(0, 200)) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = v.key;\n cb.checked = draft.selected.has(v.key);\n const text = document.createElement(\"span\");\n text.textContent = v.label;\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n }\n\n private applyFilterSortDraft() {\n const draft = this.filterSortDraft;\n if (!draft) return;\n const view = this.dataModel.getView();\n const existingFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(draft.colKey)\n ),\n );\n\n const allSelected =\n draft.selected.size === draft.values.length &&\n draft.includeBlanks === Boolean(draft.hasBlanks);\n const nextFilters = allSelected\n ? existingFilters\n : [\n ...existingFilters,\n {\n kind: \"values\",\n key: draft.colKey,\n values: draft.values.filter((v) => draft.selected.has(v.key)).map((v) => v.value),\n includeBlanks: draft.includeBlanks,\n } satisfies ViewFilterValues,\n ];\n\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n if (draft.diagErrors || draft.diagWarnings) {\n nextDiagnostics[String(draft.colKey)] = {\n errors: draft.diagErrors,\n warnings: draft.diagWarnings,\n };\n } else {\n delete nextDiagnostics[String(draft.colKey)];\n }\n\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n }\n\n private clearFilterSortForActiveColumn() {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(colKey)\n ),\n );\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n delete nextDiagnostics[String(colKey)];\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private setSortForActiveColumn(dir: \"asc\" | \"desc\") {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextView: View = { ...view, sorts: [{ key: colKey, dir }] };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private clearSort() {\n const view = this.dataModel.getView();\n if (!view.sorts?.length) return;\n const nextView: View = { ...view, sorts: undefined };\n this.setView(nextView);\n if (this.filterSortActiveColumnKey !== null) {\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n }\n }\n\n private teardownFilterSort() {\n this.filterSortSidebarUnsub?.();\n this.filterSortSidebarUnsub = null;\n if (this.filterSortSidebar) {\n removeFromParent(this.filterSortSidebar);\n this.filterSortSidebar = null;\n }\n if (this.filterSortKeydown) {\n document.removeEventListener(\"keydown\", this.filterSortKeydown, true);\n this.filterSortKeydown = null;\n }\n if (this.filterSortClickCapture) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"click\",\n this.filterSortClickCapture,\n true,\n );\n this.filterSortClickCapture = null;\n }\n if (this.filterSortOpenEvent) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"extable:filter-sort-open\",\n this.filterSortOpenEvent,\n );\n this.filterSortOpenEvent = null;\n }\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n private initViewportState() {\n const host = this.getScrollHost();\n this.viewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n }\n\n private updateViewportFromRoot() {\n if (!this.viewportState) this.initViewportState();\n const prev = this.viewportState ?? {\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n const host = this.getScrollHost();\n const next: ViewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: host.scrollLeft - prev.scrollLeft,\n deltaY: host.scrollTop - prev.scrollTop,\n timestamp: performance.now(),\n };\n this.viewportState = next;\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => this.flushRender());\n }\n }\n\n private flushRender() {\n this.rafId = null;\n if (!this.viewportState) return;\n this.selectionManager?.onScroll(this.viewportState.scrollTop, this.viewportState.scrollLeft);\n // HTML renderer re-renders DOM; avoid doing it on scroll to preserve scroll position.\n if (this.renderer instanceof HTMLRenderer) return;\n this.safeRender(this.viewportState);\n }\n}\n\n// Compatibility helpers for wrappers/tests\nexport function createTablePlaceholder<T extends object = Record<string, unknown>>(\n config: TableConfig<T>,\n options?: CoreOptions,\n) {\n const core = new ExtableCore<T>({\n root: document.createElement(\"div\"),\n defaultData: config.data,\n defaultView: config.view,\n schema: config.schema,\n options,\n });\n return core;\n}\n\nexport function mountTable<T extends object = Record<string, unknown>, R extends object = T>(\n target: HTMLElement,\n core: ExtableCore<T, R>,\n) {\n core.remount(target);\n return core;\n}\n"],"names":["getBatchId","cmd","p","id","CommandQueue","cap","command","batchId","last","out","group","g","resolveCellAddress","dataModel","address","schema","rows","resolveByIndex","rowIndex","colIndex","row","col","resolveByKeys","rowId","colKey","c","LockManager","mode","server","user","currentRowId","keepRowId","toUnlock","rowIds","e","V","n","s","J","r","R","D","K","z","o","i","l","u","P","k","f","d","B","G","H","U","Y","q","X","Q","Z","_","ee","te","ne","se","re","ie","oe","ae","ue","le","ce","fe","de","me","he","ge","pe","xe","ye","be","Se","je","ke","we","Ne","Ie","Te","Me","T","Ae","ve","Le","Ee","We","Ce","Oe","$e","x","y","M","w","Fe","Pe","A","v","N","Ve","Je","Re","De","Ke","m","L","ze","Be","I","Ge","He","Ue","Ye","qe","Xe","Qe","Ze","_e","et","tt","E","j","W","nt","st","rt","it","ot","b","S","C","O","at","ut","lt","$","a","ct","F","ft","dt","h","mt","ht","gt","pt","normalizeRange","range","coerceToTime","value","coerceToDate","getFillHandleSource","ranges","width","height","makeFillValueGetter","source","langs","seed","registry","createBuiltInRegistry","numbers","seq","inferSequence","cache","done","offsetFromEnd","next","dates","strings","FILL_HANDLE_VISUAL_SIZE_PX","FILL_HANDLE_HIT_SIZE_PX","getFillHandleRect","cellRect","size","isPointInRect","rect","shouldShowFillHandle","activeRowId","activeColKey","editMode","src","CANVAS_FONT_FAMILY","CANVAS_FONT_SIZE_PX","UNIQUE_BOOL_FONT_SIZE_PX","getColumnSortDir","view","hasActiveColumnFilter","vf","diag","svgFunnel","svgArrow","dir","drawDiagnosticCorner","ctx","level","color","ValueFormatCache","options","key","fmt","cached","parsed","parseIsoDate","drawFunnelIcon","alpha","drawSortArrowIcon","resolveTagValues","obj","values","resolveLabeledText","FenwickTree","count","res","index0","delta","target","total","idx","bit","acc","step","nextAcc","HTMLRenderer","DEFAULT_ROW_HEIGHT_PX","ROW_HEADER_WIDTH_PX","root","_state","scrollContainer","prevTop","prevLeft","colWidths","getColumnWidths","colBaseStyles","columnFormatToStyle","colBaseCss","styleToCssText","totalWidth","body","entry","removeFromParent","event","corner","rowHeader","cell","tagRemove","indexStr","tagIndex","actionEl","kind","thead","tr","rowTh","th","sortDir","hasFilter","wrap","label","btn","index","td","isPending","condRes","cellStyle","hasTextColor","css","baseStyle","withCond","mergeStyle","merged","forCss","raw","valueRes","textOverride","formatted","interaction","tagValues","isActionType","actionValue","resolveButtonAction","resolveLinkAction","actionLabel","getButtonLabel","getLinkLabel","list","tag","chip","remove","input","marker","align","rawNumbered","toRawValue","rawStr","maxHeight","text","version","measure","measureHost","CELL_PADDING_TOP_PX","CELL_PADDING_BOTTOM_PX","isAll","el","startRow","endRow","startCol","endCol","rowEl","cells","labeled","tags","num","formatNumberForEdit","opts","token","formatIntegerWithPrefix","fmtValue","coerceDatePattern","formatDateLite","_CanvasRenderer","getEditMode","HEADER_HEIGHT_PX","ev","viewportX","viewportY","xCursor","iconSize","iconLeft","iconTop","actionHit","nextKey","maxDim","state","baseFont","selectAll","fontCache","wrapAny","cacheKey","heightIndex","desiredCanvasWidth","desiredCanvasHeight","nextWidth","nextHeight","scrollTop","scrollLeft","computeVisibleRange","contentTop","visibleStart","accum","visibleEnd","drawnHeight","totalRowsHeight","viewportHeight","dataViewportHeight","maxContentScrollTop","contentScrollTop","updates","nextH","dataXOffset","yCursor","rowH","idxText","lastFontKey","muted","mergedStyle","bg","cc","renderAction","left","top","actionColor","isGlobalReadonly","hasExplicitTextColor","formulaReadonlyColor","isBoolean","isCustomBoolean","fontKey","weight","textAreaX","CELL_PADDING_X_PX","textAreaY","textAreaW","textAreaH","decorations","actionBounds","right","bottom","bw","bh","actionKey","isHover","isActive","xHeader","iconBox","ix","iy","yTop","xLeft","existing","heights","idToIndex","measuredVersion","cachedHeight","prev","wraps","widths","task","measured","start","headerHeight","accumHeight","topPx","rowTop","hit","ital","bounds","pad","rootRect","maxW","maxH","side","tRect","clientX","clientY","prevKey","prevIcon","nextIcon","changed","cursor","sameCell","sameMessage","nextHoverKey","handleRect","rawLines","lines","line","current","cut","firstKey","maxLines","minX","maxX","minY","maxY","lineWidth","startX","lineTop","lineBottom","isUniqueBoolean","fontBackup","totalTextHeight","baseY","renderLine","ln","lineIdx","baseline","endX","center","strokeBackup","lineWidthBackup","yUnderline","yStrike","CanvasRenderer","SelectionManager","onEdit","onRowSelect","onMove","hitTest","hitAction","sequenceLangs","isCellReadonly","onCellAction","onActiveChange","onContextMenu","onSelectionChange","onUndo","onRedo","fillSrc","handleRowIndex","handleColIndex","handleRow","handleCol","targetRow","targetCol","dx","dy","endRowIndex","suppressTrailingClick","payload","html","tsv","grid","ac","currentText","isMac","isTab","isEnter","isArrow","extend","wasSameCell","isSecondClick","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","baseIndex","fallbackRow","nextRow","nextRange","colType","initial","toast","inset","maxLeft","maxTop","minLeft","minTop","candidateLeft","candidateTop","message","variant","durationMs","tip","getText","controller","requestId","applyText","err","items","displayLabel","hook","candidate","originalCandidate","stored","currentValue","lastFetchedCandidateCount","debounceMs","schedule","immediateOrEvent","immediate","query","prevCandidateCount","executeFetch","candidates","finalCandidates","recentCandidate","recentWithBadge","nonRecentCandidates","autoSelectIndex","inputEl","freeText","open","nextText","valueForSelection","canUseSelectionInput","end","rowIdEsc","keyEsc","box","rowHeaderWidth","defaultRowHeight","active","headerEl","cellEl","htmlCell","metrics","xStart","xEnd","yStart","yEnd","leftVis","rightVis","topVis","bottomVis","deltaRow","deltaCol","extendSelection","anchor","nextRowIndex","nextColIndex","fallbackTarget","colHeader","endColIndex","nextEnd","threshold","maxStep","tick","getValue","commitNow","offset","cellCount","copyViaClipboardApi","item","copyViaFallbackInput","fallback","first","normalized","rowIdx","colIdx","linkAction","buttonAction","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","parseNumericText","coerced","coerceNumericForColumn","ta","allowCustom","select","empty","opt","op","listId","datalist","normalizeNumericInput","style","lineHeight","wrapper","insetX","insetTop","insetBottom","linkValue","nextValues","href","link","currentBool","cmds","val","isRow","targetRange","anchorRow","anchorCol","anchorCell","sorted","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","isCheckbox","now","isTextarea","isAltEnter","commitAndMove","orig","norm","normalizedOrig","normalizedCurrent","clearActive","defineSchema","ExtableCore","init","defaultData","initialData","DataModel","classes","toArray","ua","shell","viewport","force","host","action","_colKey","classNames","data","wasLoaded","rowIdOrIndex","found","pending","vv","rowData","position","insertAt","baseIdx","newId","removed","toKinds","seen","kinds","labelFor","commandCount","toSteps","groups","forcedId","handler","commands","error","msg","afterApply","touched","snapshots","snap","pop","actions","act","hr","viewportWidth","targetIndex","effective","applied","pendingCommands","pendingCommandCount","pendingCellCount","keys","validationErrors","diagnosticErrors","ar","br","bc","activeErrors","listener","errorsEqual","bt","activeValueRes","activeCondRes","activeTextOverride","activeValueRaw","activeValueDisplay","activeValueType","diagnostic","activeStyles","columnStyle","resolved","resolveCellStyles","reason","diagnostics","computed","unique","sr","er","sc","ec","aside","btnClose","cbErrors","cbWarnings","search","btnAll","btnNone","btnApply","btnClear","btnSortAsc","btnSortDesc","btnSortClear","prevSearch","distinct","selected","includeBlanks","title","draft","name","sort","cb","filtered","existingFilters","nextFilters","nextDiagnostics","nextView","createTablePlaceholder","config","mountTable","core"],"mappings":"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IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAI;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAKD,GAAE;AAAA,EACR,CAACxD,GAAG,MAAM;AACR,QAAI,MAAM;AACR,aAAOA;AACT,QAAI,SAAS,KAAK,CAAC,GAAG;AACpB,YAAME,IAAI,EAAE,MAAM,GAAG,EAAE;AACvB,MAAAF,EAAEE,CAAC,IAAI;AAAA,IACT;AACA,WAAOF;AAAA,EACT;AAAA,EACA,CAAA;AACF,GAAG0D,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAOF;AAAA,EACP,SAASC;AACX,GAAGE,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,MAAM,IAAI;AAAA,EAClB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,MAAM,IAAI;AAAA,EAClB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,MAAM,IAAI;AAAA,EAClB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN9C;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,GAAG/F,KAAI,CAACgC,MAAM;AACZ,QAAM,IAAIA,IAAI;AACd,MAAI,KAAK,MAAM,KAAK,GAAI,QAAO;AAC/B,QAAME,IAAIF,IAAI;AACd,SAAOE,MAAM,IAAI,OAAOA,MAAM,IAAI,OAAOA,MAAM,IAAI,OAAO;AAC5D,GAAG+D,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAAGC,KAAI;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAAGC,KAAI;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAAGC,KAAI,OAAO;AAAA,EACZ,OAAO,QAAQH,EAAC,EAAE,IAAI,CAAC,CAACjE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAOA,CAAC,CAAC,CAAC;AAClD,GAAGqE,KAAK,OAAO;AAAA,EACb,OAAO,QAAQH,EAAC,EAAE,IAAI,CAAC,CAAClE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAOA,CAAC,CAAC,CAAC;AAClD,GAAGsE,KAAK,OAAO;AAAA,EACb,OAAO,QAAQH,EAAC,EAAE,IAAI,CAAC,CAACnE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAOA,CAAC,CAAC,CAAC;AAClD,GAAGuE,KAAI,CAACvE,MAAM;AACZ,QAAM,IAAIA,EAAE,KAAI,EAAG,YAAW;AAC9B,MAAI,CAAC,EAAG,QAAO;AACf,QAAME,IAAIkE,GAAE,CAAC,KAAKC,GAAG,CAAC;AACtB,MAAInE,EAAG,QAAOA;AACd,QAAMC,IAAI,EAAE,MAAM,QAAQ;AAC1B,MAAIA,EAAE,WAAW,EAAG,QAAO;AAC3B,QAAME,IAAIiE,GAAGnE,EAAE,CAAC,KAAK,EAAE,GAAGO,IAAI0D,GAAEjE,EAAE,CAAC,KAAK,EAAE;AAC1C,SAAO,CAACE,KAAK,CAACK,IAAI,OAAOL,IAAIK;AAC/B,GAAG8D,KAAI,CAACxE,MAAM;AACZ,MAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,KAAK,KAAK,MAAMA,CAAC,MAAMA,EAAG,QAAO;AACjE,MAAIA,KAAK,GAAI,QAAOiE,GAAEjE,CAAC,KAAK;AAC5B,MAAIA,IAAI,KAAK;AACX,QAAIkE,GAAElE,CAAC,EAAG,QAAOkE,GAAElE,CAAC,KAAK;AACzB,UAAM,IAAI,KAAK,MAAMA,IAAI,EAAE,IAAI,IAAIE,IAAIF,IAAI,IAAIG,IAAIgE,GAAE,CAAC,GAAG9D,IAAI4D,GAAE/D,CAAC;AAChE,WAAO,CAACC,KAAK,CAACE,IAAI,OAAO,GAAGF,CAAC,IAAIE,CAAC;AAAA,EACpC;AACA,SAAO;AACT,GAAGoE,KAAI,CAACzE,MAAM;AACZ,QAAM,IAAI,wBAAwB,KAAKA,CAAC;AACxC,MAAI,GAAG;AACL,UAAMG,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,QAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,EAAG,QAAO;AAC1C,UAAME,IAAI,EAAE,CAAC,GAAG,YAAW;AAC3B,WAAOrC,GAAEmC,CAAC,MAAME,IAAI,OAAO,EAAE,OAAOF,GAAG,QAAQ,UAAS;AAAA,EAC1D;AACA,QAAMD,IAAIqE,GAAEvE,CAAC;AACb,SAAOE,MAAM,OAAO,EAAE,OAAOA,GAAG,QAAQ,OAAM,IAAK;AACrD,GAAGwE,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,OAAO,CAAC,IAAI;AAAA,EACZ,MAAM1E,GAAG;AACP,QAAIA,EAAE,SAAS,EAAG,QAAO;AACzB,UAAM,IAAIA,EAAE,IAAI,CAACU,MAAM+D,GAAE/D,CAAC,CAAC;AAC3B,QAAI,EAAE,KAAK,CAACA,MAAMA,MAAM,IAAI,EAAG,QAAO;AACtC,UAAMR,IAAI,EAAE,CAAC,EAAE;AACf,QAAI,EAAE,KAAK,CAACQ,MAAMA,GAAG,WAAWR,CAAC,EAAG,QAAO;AAC3C,UAAMC,IAAI,EAAE,IAAI,CAACO,MAAMA,EAAE,KAAK,GAAGL,IAAIF,EAAE,CAAC,IAAIA,EAAE,CAAC;AAC/C,aAASO,IAAI,GAAGA,IAAIP,EAAE,QAAQO,KAAK;AACjC,UAAIP,EAAEO,CAAC,IAAIP,EAAEO,IAAI,CAAC,MAAML,EAAG,QAAO;AACpC,WAAO,EAAE,OAAO,IAAI,MAAMA,GAAG,OAAO,EAAE,QAAQH,IAAG;AAAA,EACnD;AAAA,EACA,eAAeF,GAAG,GAAG;AACnB,UAAME,IAAIuE,GAAEzE,EAAEA,EAAE,SAAS,CAAC,KAAK,EAAE,GAAGG,IAAI,EAAE,OAAO,UAAU;AAC3D,QAAIE,IAAIH,GAAG,SAAS;AACpB,WAAO;AAAA,MACL,OAAO;AACL,YAAIG,KAAK,EAAE,MAAMA,KAAK,KAAK,CAAC,OAAO,SAASA,CAAC;AAC3C,iBAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,YAAIF,MAAM,QAAQ;AAChB,gBAAMO,IAAI8D,GAAEnE,CAAC;AACb,iBAAOK,IAAI,EAAE,OAAOA,GAAG,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,QAC/D;AACA,eAAO,EAAE,OAAO,GAAGL,CAAC,GAAGrC,GAAEqC,CAAC,CAAC,IAAI,MAAM,GAAE;AAAA,MACzC;AAAA,IACN;AAAA,EACE;AACF,GAAGsE,KAAK,CAAC3E,MAAM;AACb,aAAW,KAAKgE;AACd,IAAAhE,EAAE,SAAS,CAAC;AAChB,GAAG4E,KAAK,CAAC5E,MAAM;AACb,EAAAA,EAAE,cAAc0E,EAAE;AACpB,GAAGG,KAAK,CAAC7E,MAAM;AACb,QAAM,IAAIA,KAAK,CAAC,MAAM,IAAI,GAAGE,IAAI,IAAIO,GAAE,EAAE,OAAO,EAAC,CAAE;AACnD,SAAOkE,GAAGzE,CAAC,GAAG0E,GAAG1E,CAAC,GAAGA;AACvB,GAAG4E,KAAK,CAAC9E,MAAM;AACb,MAAI,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,UAAIA,EAAE,WAAW;AACf,eAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,YAAME,IAAIF,EAAE,IAAIA,EAAE,MAAM;AACxB,aAAO,KAAK,GAAG,EAAE,OAAOE,GAAG,MAAM,GAAE;AAAA,IACrC;AAAA,EACJ;AACA;AACA,MAAM6E,EAAE;AAAA,EACN,eAAe,GAAG;AAChB,UAAM7E,IAAI;AACV,SAAK,OAAOA,GAAG,KAAK,OAAOA,EAAE,WAAW,IAAI,SAAS,eAAe,KAAK,WAAW4E,GAAG5E,CAAC;AAAA,EAC1F;AAAA,EACA,OAAO,SAAS,GAAGA,GAAGC,GAAG;AACvB,UAAME,IAAI,IAAI0E,EAAE,GAAG,CAAC;AACpB,WAAO1E,EAAE,OAAOH,GAAGG,EAAE,WAAWF,GAAGE;AAAA,EACrC;AAAA,EACA,OAAO;AACL,WAAO,KAAK,SAAS,KAAI;AAAA,EAC3B;AAAA,EACA,CAAC,OAAO,QAAQ,IAAI;AAClB,WAAO;AAAA,EACT;AACF;AACA,MAAM2E,KAAI,MAAMC,KAAK,KAAKC,KAAK,CAAClF,OAAO;AAAA,EACrC,OAAO;AACL,WAAO,EAAE,OAAOA,GAAG,MAAM,GAAE;AAAA,EAC7B;AACF,IAAImF,KAAI,CAACnF,MAAM;AACb,MAAI,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,UAAIA,EAAE,WAAW;AACf,eAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,YAAME,IAAIF,EAAE,IAAIA,EAAE,MAAM;AACxB,aAAO,KAAK,GAAG,EAAE,OAAOE,GAAG,MAAM,GAAE;AAAA,IACrC;AAAA,EACJ;AACA,GAAGkF,KAAK,CAACpF,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,aAAOA,KAAK,GAAG,EAAE,OAAOF,IAAI,IAAIE,GAAG,MAAM,GAAE;AAAA,IAC7C;AAAA,EACJ;AACA,GAAGmF,KAAK,CAACrF,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,aAAOA,KAAK,GAAG,EAAE,OAAO,IAAI,KAAKF,EAAE,QAAO,IAAK,IAAIE,CAAC,GAAG,MAAM,GAAE;AAAA,IACjE;AAAA,EACJ;AACA,GAAGoF,KAAK,CAACtF,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,aAAOA,KAAK,GAAG,EAAE,OAAOF,IAAI,KAAKE,GAAG,MAAM,GAAE;AAAA,IAC9C;AAAA,EACJ;AACA,GAAGqF,KAAK,CAACvF,GAAG,MAAM;AAChB,MAAIA,EAAE,SAAS;AACb,WAAOA,EAAE,QAAQ,eAAe,GAAG,EAAE,MAAMA,EAAE,MAAM,OAAOA,EAAE,MAAK,CAAE;AACrE,QAAM,EAAE,MAAME,GAAG,YAAYC,GAAG,MAAME,EAAC,IAAKL,GAAGU,IAAIR,EAAE,MAAM;AAC3D,MAAIW,IAAIV;AACR,SAAO;AAAA,IACL,OAAO;AACL,UAAID,EAAE,SAAS,UAAU;AACvB,cAAMS,IAAIE,IAAIR;AACd,eAAOM,KAAKD,IAAI,EAAE,OAAO,QAAQ,MAAM,QAAQG,IAAIF,GAAG,EAAE,OAAOT,EAAE,MAAMW,CAAC,GAAG,MAAM;MACnF;AACA,aAAOA,KAAKA,IAAIR,KAAKK,GAAG,EAAE,OAAOR,EAAE,MAAMW,CAAC,GAAG,MAAM,GAAE;AAAA,IACvD;AAAA,EACJ;AACA,GAAG2E,KAAK,CAACxF,MAAMA,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,YAAY,OAAO,SAAS,CAAC,CAAC,GAAGyF,KAAK,CAACzF,MAAMA,EAAE,MAAM,CAAC,MAAM,aAAa,QAAQ,CAAC,OAAO,MAAM,EAAE,SAAS,CAAC,GAAG0F,KAAK,CAAC1F,MAAMA,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,QAAQ,GAAG2F,KAAK,CAAC3F,MAAM;AACpN,QAAM,IAAI,0BAA0B,KAAKA,CAAC;AAC1C,MAAI,CAAC;AACH,WAAO;AACT,QAAME,IAAI,EAAE,CAAC,KAAK,IAAIC,IAAI,EAAE,CAAC,KAAK,IAAIE,IAAI,EAAE,CAAC,KAAK,IAAIK,IAAI,OAAOP,CAAC;AAClE,MAAI,CAAC,OAAO,SAASO,CAAC;AACpB,WAAO;AACT,QAAMG,IAAIV,EAAE,QAAQ,KAAK,EAAE,EAAE;AAC7B,SAAO,EAAE,QAAQD,GAAG,KAAKQ,GAAG,OAAOG,GAAG,QAAQR,EAAC;AACjD,GAAGuF,KAAK,CAAC5F,MAAM;AACb,QAAM,IAAI,sCAAsC,KAAKA,CAAC;AACtD,MAAI,GAAG;AACL,UAAMK,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,QAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,EAAG,QAAO;AAC1C,UAAMK,IAAI,EAAE,CAAC,GAAG,YAAW;AAC3B,WAAO1C,GAAEqC,CAAC,MAAMK,IAAI,OAAO;AAAA,MACzB,QAAQ,EAAE,CAAC,KAAK;AAAA,MAChB,KAAKL;AAAA,MACL,QAAQ,EAAE,CAAC,KAAK;AAAA,MAChB,QAAQ;AAAA,IACd;AAAA,EACE;AACA,QAAMH,IAAI,kCAAkC,KAAKF,CAAC;AAClD,MAAI,CAACE,EAAG,QAAO;AACf,QAAMC,IAAIoE,GAAErE,EAAE,CAAC,KAAK,EAAE;AACtB,SAAOC,MAAM,OAAO,OAAO;AAAA,IACzB,QAAQD,EAAE,CAAC,KAAK;AAAA,IAChB,KAAKC;AAAA,IACL,QAAQD,EAAE,CAAC,KAAK;AAAA,IAChB,QAAQ;AAAA,EACZ;AACA,GAAG2F,KAAK,CAAC7F,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC;AAClB,UAAIE,KAAK,KAAK,CAAC,OAAO,SAASA,CAAC;AAC9B,eAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,UAAIL,EAAE,WAAW,QAAQ;AACvB,cAAMU,IAAI8D,GAAEnE,CAAC;AACb,eAAOK,IAAI,EAAE,OAAO,GAAGV,EAAE,MAAM,GAAGU,CAAC,GAAGV,EAAE,MAAM,IAAI,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,MAC1F;AACA,aAAO;AAAA,QACL,OAAO,GAAGA,EAAE,MAAM,GAAGK,CAAC,GAAGrC,GAAEqC,CAAC,CAAC,GAAGL,EAAE,MAAM;AAAA,QACxC,MAAM;AAAA,MACd;AAAA,IACI;AAAA,EACJ;AACA,GAAG8F,KAAK,CAAC9F,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC,GAAGO,IAAIL,IAAI,IAAI,MAAM,IAAIQ,IAAI,KAAK,IAAIR,CAAC,EAAE,SAAQ,EAAG,SAASL,EAAE,OAAO,GAAG;AAC3F,aAAO,EAAE,OAAO,GAAGA,EAAE,MAAM,GAAGU,CAAC,GAAGG,CAAC,GAAGb,EAAE,MAAM,IAAI,MAAM,GAAE;AAAA,IAC5D;AAAA,EACJ;AACA,GAAG+F,KAAI;AAAA,EACL,CAAC,KAAK,GAAG;AAAA,EACT,CAAC,MAAM,EAAE;AAAA,EACT,CAAC,KAAK,EAAE;AAAA,EACR,CAAC,MAAM,EAAE;AAAA,EACT,CAAC,KAAK,EAAE;AAAA,EACR,CAAC,MAAM,CAAC;AAAA,EACR,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,MAAM,CAAC;AAAA,EACR,CAAC,KAAK,CAAC;AACT,GAAGC,KAAI,CAAChG,MAAM;AACZ,MAAIA,IAAI,KAAKA,IAAIiF;AACf,WAAO;AACT,MAAI,IAAIjF,GAAGE,IAAI;AACf,aAAW,CAACC,GAAGE,CAAC,KAAK0F;AACnB,WAAO,KAAK1F;AACV,MAAAH,KAAKC,GAAG,KAAKE;AACjB,SAAOH;AACT,GAAG+F,KAAI,CAACjG,MAAM;AACZ,MAAIA,EAAE,WAAW,KAAKA,MAAMA,EAAE,YAAW;AACvC,WAAO;AACT,MAAI,IAAIA,GAAGE,IAAI;AACf,aAAW,CAACG,GAAGK,CAAC,KAAKqF;AACnB,WAAO,EAAE,WAAW1F,CAAC;AACnB,MAAAH,KAAKQ,GAAG,IAAI,EAAE,MAAML,EAAE,MAAM;AAChC,MAAI,EAAE,SAAS;AACb,WAAO;AACT,QAAMF,IAAI6F,GAAE9F,CAAC;AACb,SAAO,CAACC,KAAKA,MAAMH,IAAI,OAAOE;AAChC,GAAGgG,KAAK,CAAClG,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAMC,IAAIH,IAAI,IAAIE,GAAGG,IAAI2F,GAAE7F,CAAC;AAC5B,aAAOE,IAAI,EAAE,OAAOA,GAAG,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC/D;AAAA,EACJ;AACA,GAAG8F,KAAK,CAACnG,MAAM,IAAI,OAAO,oBAAoB,GAAG,EAAE,KAAKA,CAAC,IAAI,UAAU,IAAI,OAAO,UAAU,GAAG,EAAE,KAAKA,CAAC,IAAI,UAAU,IAAI,OAAO,UAAU,GAAG,EAAE,KAAKA,CAAC,IAAI,WAAW,IAAI,OAAO,qBAAqB,GAAG,EAAE,KAAKA,CAAC,IAAI,UAAU,IAAI,OAAO,mBAAmB,GAAG,EAAE,KAAKA,CAAC,IAAI,QAAQ,IAAI,OAAO,wBAAwB,GAAG,EAAE,KAAKA,CAAC,IAAI,aAAa,IAAI,OAAO,wBAAwB,GAAG,EAAE,KAAKA,CAAC,IAAI,aAAa,IAAI,OAAO,UAAU,GAAG,EAAE,KAAKA,CAAC,IAAI,WAAW,SAASoG,KAAK,CAACpG,MAAM;AACld,QAAM,IAAI,CAAA;AACV,MAAIE,IAAI,IAAIC,IAAI;AAChB,aAAWE,KAAKL,GAAG;AACjB,UAAMU,IAAIyF,GAAG9F,CAAC;AACd,QAAIF,MAAMO,GAAG;AACX,MAAAR,KAAKG;AACL;AAAA,IACF;AACA,IAAAF,MAAM,QAAQ,EAAE,KAAK,EAAE,OAAOD,GAAG,OAAOC,EAAC,CAAE,GAAGD,IAAIG,GAAGF,IAAIO;AAAA,EAC3D;AACA,SAAOP,MAAM,QAAQ,EAAE,KAAK,EAAE,OAAOD,GAAG,OAAOC,EAAC,CAAE,GAAG;AACvD,GAAGkG,KAAK,CAACrG,MAAM;AACb,QAAM,IAAIoG,GAAGpG,CAAC,GAAGE,IAAI,EAAE,IAAI,CAACS,GAAG,OAAO,EAAE,OAAO,GAAG,KAAKsF,GAAEtF,EAAE,KAAK,IAAI,EAAE,OAAO,CAACA,MAAMA,EAAE,QAAQ,IAAI;AAClG,MAAIT,EAAE,WAAW;AACf,WAAO;AACT,QAAMC,IAAID,EAAE,CAAC,EAAE,OAAOG,IAAIH,EAAE,CAAC,EAAE,KAAKQ,IAAI,EAAE,MAAM,GAAGP,CAAC,EAAE,IAAI,CAACQ,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE,GAAGE,IAAI,EAAE,MAAMV,IAAI,CAAC,EAAE,IAAI,CAACQ,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE;AAClI,SAAO,EAAE,QAAQD,GAAG,KAAKL,GAAG,QAAQQ,EAAC;AACvC,GAAGyF,KAAK,CAACtG,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC,GAAGO,IAAIsF,GAAE3F,CAAC;AAC5B,aAAOK,IAAI,EAAE,OAAO,GAAGV,EAAE,MAAM,GAAGU,CAAC,GAAGV,EAAE,MAAM,IAAI,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC1F;AAAA,EACJ;AACA,GAAGuG,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAqB,oBAAI,IAAI;AAAA,EAC9B,GAAG,OAAO,KAAKJ,EAAC;AAAA,EAChB,GAAG,OAAO,KAAKC,EAAC;AAAA,EAChB,GAAG,OAAO,KAAKC,EAAC;AAAA,EAChB,GAAG,OAAO,KAAKC,EAAC;AAClB,CAAC,GAAGE,KAAK,CAAC5G,MAAM2G,GAAG,IAAI3G,CAAC,GAAG6G,KAAK,CAAC7G,MAAM,kBAAkB,KAAKA,CAAC,IAAI,gBAAgB,UAAU8G,KAAI,CAAC9G,MAAM;AACtG,MAAI,CAACA;AACH,WAAO;AACT,QAAM,IAAI6G,GAAG7G,CAAC;AACd,MAAIA,EAAE,SAAS,GAAG,KAAKA,EAAE,SAAS,GAAG,GAAG;AACtC,UAAMW,IAAI,iCAAiC,KAAKX,CAAC;AACjD,QAAI,CAACW;AACH,aAAO;AACT,UAAMoG,IAAIpG,EAAE,CAAC;AACb,WAAOoG,KAAKR,GAAEQ,CAAC,KAAKP,GAAEO,CAAC,OAAO,IAAI,OAAO,EAAE,KAAK,KAAK,OAAO,EAAC,IAAK,EAAE,KAAK,KAAK,OAAO,EAAC;AAAA,EACxF;AACA,MAAI5G,IAAI,GAAGE,IAAI,GAAG,IAAI,OAAO,mBAAmBQ,IAAI;AACpD,aAAWF,KAAKX,GAAG;AACjB,UAAM+G,IAAIR,GAAE5F,CAAC,KAAK6F,GAAE7F,CAAC;AACrB,QAAIoG,GAAG;AACL,UAAIlG;AACF,eAAO;AACT,MAAAR,IAAI0G,GAAGlG,IAAI;AACX;AAAA,IACF;AACA,UAAMD,IAAI6F,GAAE9F,CAAC;AACb,QAAIC,GAAG;AACL,UAAIA,KAAK;AACP,eAAO;AACT,MAAAP,MAAM,MAAMA,IAAI,IAAIF,KAAKE,IAAIO,GAAGP,IAAI,GAAG,IAAIO,GAAGC,IAAI;AAClD;AAAA,IACF;AACA,WAAa;AAAA,EACf;AACA,SAAOV,KAAKE,GAAGF,KAAK,KAAKA,IAAI,MAAM,OAAO,EAAE,KAAKA,GAAG,OAAO,EAAC;AAC9D,GAAG6G,KAAK,CAAChH,MAAM;AACb,QAAM,IAAI,CAAA;AACV,MAAIE,IAAI,IAAIC,IAAI,GAAGE,IAAI;AACvB,aAAWO,KAAKZ;AACd,IAAA4G,GAAGhG,CAAC,KAAKV,MAAMC,IAAIE,IAAIH,KAAKU,KAAKV,MAAM,EAAE,KAAK,EAAE,OAAOC,GAAG,KAAKE,GAAG,MAAMH,EAAC,CAAE,GAAGA,IAAI,KAAKG,KAAKO,EAAE;AAChG,EAAAV,KAAK,EAAE,KAAK,EAAE,OAAOC,GAAG,KAAKE,GAAG,MAAMH,GAAG;AACzC,QAAMQ,IAAI,EAAE,IAAI,CAACE,OAAO,EAAE,KAAKA,GAAG,QAAQkG,GAAElG,EAAE,IAAI,EAAC,EAAG,EAAE,OAAO,CAACA,MAAMA,EAAE,WAAW,IAAI;AACvF,MAAIF,EAAE,WAAW;AACf,WAAO;AACT,QAAMG,IAAIH,EAAE,CAAC,GAAGC,IAAIX,EAAE,MAAM,GAAGa,EAAE,IAAI,KAAK,GAAG,IAAIb,EAAE,MAAMa,EAAE,IAAI,GAAG;AAClE,SAAO;AAAA,IACL,QAAQF;AAAA,IACR,KAAKE,EAAE,OAAO;AAAA,IACd,QAAQ;AAAA,IACR,OAAOA,EAAE,OAAO;AAAA,EACpB;AACA,GAAGoG,KAAI,CAACjH,GAAG,MAAM;AACf,MAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,KAAKA,IAAI;AACvC,WAAO;AACT,QAAME,IAAI,MAAM,gBAAgB,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAGC,IAAI,MAAM,gBAAgB,MAAM,KAAKE,IAAI,MAAM,gBAAgB,MAAM;AAC5M,MAAIL,MAAM;AACR,WAAO,GAAGE,EAAE,CAAC,CAAC,GAAGG,CAAC;AACpB,MAAIK,IAAIV,GAAGa,IAAI;AACf,QAAMF,IAAI,KAAK,MAAMD,IAAI,GAAG;AAC5B,EAAAC,IAAI,MAAMA,IAAI,MAAME,KAAKX,EAAES,CAAC,IAAIE,KAAK,KAAKH,KAAK;AAC/C,QAAM,IAAI,KAAK,MAAMA,IAAI,GAAG;AAC5B,MAAI,MAAM,IAAI,MAAMG,KAAKX,EAAE,CAAC,IAAIW,KAAK,KAAKH,KAAK;AAC/C,QAAME,IAAI,KAAK,MAAMF,IAAI,EAAE;AAC3B,SAAOE,IAAI,MAAMA,IAAI,MAAMC,KAAKX,EAAEU,CAAC,IAAIC,KAAKV,GAAGO,KAAK,KAAKA,IAAI,MAAMG,KAAKX,EAAEQ,CAAC,IAAIG,KAAK;AACtF,GAAGqG,KAAK,CAAClH,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAIL,IAAI,IAAIG,GAAGO,IAAIuG,GAAE5G,GAAGH,CAAC;AAC/B,aAAOQ,IAAI,EAAE,OAAOA,GAAG,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC/D;AAAA,EACJ;AACA,GAAGyG,KAAK,CAACnH,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC,GAAGO,IAAIuG,GAAE5G,GAAGL,EAAE,KAAK;AACrC,aAAOU,IAAI,EAAE,OAAO,GAAGV,EAAE,MAAM,GAAGU,CAAC,GAAGV,EAAE,MAAM,IAAI,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC1F;AAAA,EACJ;AACA,GAAGoH,KAAI,CAACpH,MAAM;AACZ,MAAIA,EAAE,SAAS;AACb,WAAO;AACT,QAAM,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AACpB,WAASE,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,QAAI,KAAK,IAAIF,EAAEE,CAAC,IAAIF,EAAEE,IAAI,CAAC,IAAI,CAAC,IAAI8E;AAClC,aAAO;AACX,SAAO;AACT,GAAGqC,KAAK,CAACrH,MAAM;AACb,MAAIA,EAAE,SAAS,KAAKA,EAAE,CAAC,MAAM;AAC3B,WAAO;AACT,QAAM,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AACpB,WAASE,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,QAAIF,EAAEE,IAAI,CAAC,MAAM,KAAK,KAAK,IAAIF,EAAEE,CAAC,IAAIF,EAAEE,IAAI,CAAC,IAAI,CAAC,IAAI8E;AACpD,aAAO;AACX,SAAO;AACT,GAAGsC,KAAK,CAACtH,MAAM;AACb,QAAM,IAAIA,EAAE,IAAI,CAACW,MAAMiF,GAAGjF,CAAC,CAAC;AAC5B,MAAI,EAAE,MAAM,CAACA,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAI,GAAG,IAAIA,EAAE,CAAC;AACpB,QAAIA,EAAE;AAAA,MACJ,CAACpB,MAAMA,EAAE,WAAW,EAAE,UAAUA,EAAE,WAAW,EAAE,UAAUA,EAAE,WAAW,EAAE;AAAA,IAC9E,GAAO;AACD,YAAMA,IAAIoB,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAGK,IAAIoG,GAAE7H,CAAC;AACtC,UAAIyB,MAAM,MAAM;AACd,cAAM,IAAIL,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAUkF;AAAA,YACR,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,EAAE,OAAM;AAAA,YACtD,EAAE;AAAA,YACF7E;AAAA,UACZ;AAAA,QACA;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,QAAMd,IAAIF,EAAE,IAAI,CAACW,MAAMgF,GAAGhF,CAAC,CAAC;AAC5B,MAAIT,EAAE,MAAM,OAAO,GAAG;AACpB,UAAMS,IAAIT,EAAE,CAAC,GAAG,IAAIA,EAAEA,EAAE,SAAS,CAAC;AAClC,QAAIA,EAAE;AAAA,MACJ,CAACX,MAAMA,GAAG,WAAWoB,EAAE,UAAUpB,GAAG,WAAWoB,EAAE;AAAA,IACvD,GAAO;AACD,YAAMpB,IAAIW,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAGc,IAAIoG,GAAE7H,CAAC;AAC5C,UAAIyB,MAAM;AACR,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU8E;AAAA,YACR,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,QAAQ,OAAO,EAAE,MAAK;AAAA,YACpD,EAAE;AAAA,YACF9E;AAAA,UACZ;AAAA,QACA;AAAA,IACI;AAAA,EACF;AACA,QAAMb,IAAIH,EAAE,IAAI,CAACW,MAAMsF,GAAEtF,CAAC,CAAC;AAC3B,MAAIR,EAAE,MAAM,CAACQ,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAIR,GAAG,IAAIiH,GAAEzG,CAAC;AACpB,QAAI,MAAM,MAAM;AACd,YAAMC,IAAID,EAAEA,EAAE,SAAS,CAAC;AACxB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAUuF,GAAGtF,GAAG,CAAC;AAAA,MACzB;AAAA,IACI;AAAA,EACF;AACA,QAAMP,IAAIL,EAAE,IAAI,CAACW,MAAMmG,GAAEnG,CAAC,CAAC;AAC3B,MAAIN,EAAE,MAAM,CAACM,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAIN,GAAG,IAAIM,EAAE,CAAC,EAAE;AACtB,QAAIA,EAAE,MAAM,CAACC,MAAMA,EAAE,UAAU,CAAC,GAAG;AACjC,YAAMA,IAAID,EAAE,IAAI,CAACK,MAAMA,EAAE,GAAG,GAAGzB,IAAI6H,GAAExG,CAAC;AACtC,UAAIrB,MAAM,MAAM;AACd,cAAMyB,IAAIL,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAUuG,GAAGlG,EAAE,KAAKzB,GAAGyB,EAAE,KAAK;AAAA,QACxC;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,QAAMN,IAAIV,EAAE,IAAI,CAACW,MAAM0F,GAAG1F,CAAC,CAAC;AAC5B,MAAID,EAAE,MAAM,CAACC,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAID,GAAG,IAAIC,EAAE,CAAC;AACpB,QAAIA,EAAE;AAAA,MACJ,CAACpB,MAAMA,EAAE,WAAW,EAAE,UAAUA,EAAE,WAAW,EAAE;AAAA,IACrD,GAAO;AACD,YAAMA,IAAIoB,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAGK,IAAIoG,GAAE7H,CAAC;AACtC,UAAIyB,MAAM,MAAM;AACd,cAAM,IAAIzB,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU+G;AAAA,YACR,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,OAAM;AAAA,YACpC;AAAA,YACAtF;AAAA,UACZ;AAAA,QACA;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,QAAMH,IAAIb,EAAE,IAAI,CAACW,MAAMqG,GAAGrG,CAAC,CAAC;AAC5B,MAAIE,EAAE,MAAM,CAACF,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAIE,GAAG,IAAIF,EAAE,CAAC;AACpB,QAAIA,EAAE;AAAA,MACJ,CAACpB,MAAMA,EAAE,WAAW,EAAE,UAAUA,EAAE,WAAW,EAAE,UAAUA,EAAE,UAAU,EAAE;AAAA,IAC7E,GAAO;AACD,YAAMA,IAAIoB,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAGK,IAAIoG,GAAE7H,CAAC;AACtC,UAAIyB,MAAM,MAAM;AACd,cAAM,IAAIL,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAUwG;AAAA,YACR,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,QAAQ,OAAO,EAAE,MAAK;AAAA,YACpD,EAAE;AAAA,YACFnG;AAAA,UACZ;AAAA,QACA;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT,GAAGuG,KAAK,CAACvH,GAAG,MAAM;AAChB,QAAME,IAAI,EAAE,MAAMF,CAAC;AACnB,SAAOE,IAAI;AAAA,IACT,MAAM;AAAA,IACN,UAAUqF,GAAGrF,GAAGF,CAAC;AAAA,EACrB,IAAM;AACN;AACA,SAASwH,GAAGxH,GAAG,GAAG;AAChB,QAAME,IAAI,GAAG,YAAY2E,GAAE;AAC3B,MAAI7E,EAAE,WAAW;AACf,WAAO+E,EAAE,SAAS/E,GAAG,eAAemF,GAAEnF,CAAC,CAAC;AAC1C,MAAIA,EAAE,WAAW;AACf,WAAO+E,EAAE,SAAS/E,GAAG,QAAQkF,GAAGlF,EAAE,CAAC,CAAC,CAAC;AACvC,MAAI0F,GAAG1F,CAAC,GAAG;AACT,UAAMG,IAAIoH,GAAGvH,GAAGE,CAAC;AACjB,QAAIC;AACF,aAAO4E,EAAE,SAAS/E,GAAGG,EAAE,MAAMA,EAAE,QAAQ;AACzC,UAAME,IAAIiH,GAAGtH,CAAC;AACd,QAAIK;AACF,aAAO0E,EAAE,SAAS/E,GAAGK,EAAE,MAAMA,EAAE,QAAQ;AAAA,EAC3C;AACA,MAAImF,GAAGxF,CAAC,GAAG;AACT,UAAMG,IAAIiH,GAAEpH,CAAC;AACb,QAAIG,MAAM;AACR,aAAO4E,EAAE;AAAA,QACP/E;AAAA,QACA;AAAA,QACAoF,GAAGpF,EAAEA,EAAE,SAAS,CAAC,GAAGG,CAAC;AAAA,MAC7B;AACI,UAAME,IAAIgH,GAAGrH,CAAC;AACd,QAAIK,MAAM;AACR,aAAO0E,EAAE;AAAA,QACP/E;AAAA,QACA;AAAA,QACAsF,GAAGtF,EAAEA,EAAE,SAAS,CAAC,GAAGK,CAAC;AAAA,MAC7B;AAAA,EACE;AACA,MAAIoF,GAAGzF,CAAC,GAAG;AACT,UAAMG,IAAIH,EAAE,IAAI,CAACU,MAAMA,EAAE,SAAS,GAAGL,IAAI+G,GAAEjH,CAAC;AAC5C,QAAIE,MAAM;AACR,aAAO0E,EAAE;AAAA,QACP/E;AAAA,QACA;AAAA,QACAqF,GAAGrF,EAAEA,EAAE,SAAS,CAAC,GAAGK,CAAC;AAAA,MAC7B;AAAA,EACE;AACA,SAAO0E,EAAE,SAAS/E,GAAG,eAAemF,GAAEnF,CAAC,CAAC;AAC1C;ACzoDA,SAASyH,GAAeC,GAAuC;AAC7D,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAC7C,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,EAAA;AAEjD;AAEA,SAASC,GAAaC,GAA6B;AACjD,MAAIA,aAAiB,KAAM,QAAOA;AAClC,MAAI,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,EAAG,QAAO,IAAI,KAAKA,CAAK;AAC9E,MAAI,OAAOA,KAAU,UAAU;AAC7B,UAAMzH,IAAIyH,EAAM,KAAA;AAChB,QAAI,uCAAuC,KAAKzH,CAAC,GAAG;AAClD,YAAMc,IAAI,oBAAI,KAAK,cAAcd,CAAC,EAAE;AACpC,aAAO,OAAO,MAAMc,EAAE,QAAA,CAAS,IAAI,OAAOA;AAAAA,IAC5C;AACA,UAAMA,IAAI,IAAI,KAAKd,CAAC;AACpB,WAAO,OAAO,MAAMc,EAAE,QAAA,CAAS,IAAI,OAAOA;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS4G,GAAaD,GAA6B;AACjD,MAAIA,aAAiB,KAAM,QAAOA;AAClC,MAAI,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,EAAG,QAAO,IAAI,KAAKA,CAAK;AAC9E,MAAI,OAAOA,KAAU,UAAU;AAC7B,UAAM3G,IAAI,IAAI,KAAK2G,CAAK;AACxB,WAAO,OAAO,MAAM3G,EAAE,QAAA,CAAS,IAAI,OAAOA;AAAA,EAC5C;AACA,SAAO;AACT;AAEO,SAAS6G,GAAoBnJ,GAAsBoJ,GAAmD;AAC3G,MAAIA,EAAO,WAAW,EAAG,QAAO;AAChC,QAAML,IAAQD,GAAeM,EAAO,CAAC,CAAE;AACvC,MAAIL,EAAM,SAAS,QAAS,QAAO;AACnC,QAAMM,IAAQN,EAAM,SAASA,EAAM,WAAW,GACxCO,IAASP,EAAM,SAASA,EAAM,WAAW;AAE/C,MADIM,MAAU,KACVC,IAAS,EAAG,QAAO;AAGvB,QAAM9I,IADSR,EAAU,UAAA,EACN,QAAQ+I,EAAM,QAAQ;AACzC,SAAKvI,IAED8I,MAAW,IACN;AAAA,IACL,QAAQ9I,EAAI;AAAA,IACZ,UAAUuI,EAAM;AAAA,IAChB,eAAeA,EAAM;AAAA,IACrB,aAAaA,EAAM;AAAA,IACnB,MAAM;AAAA,EAAA,IAINvI,EAAI,SAAS,YACR,OAIPA,EAAI,SAAS,YACbA,EAAI,SAAS,UACbA,EAAI,SAAS,UACbA,EAAI,SAAS,cACbA,EAAI,SAAS,WAEN;AAAA,IACL,QAAQA,EAAI;AAAA,IACZ,UAAUuI,EAAM;AAAA,IAChB,eAAeA,EAAM;AAAA,IACrB,aAAaA,EAAM;AAAA,IACnB,MAAM;AAAA,EAAA,IAKH,OAjCU;AAkCnB;AAEO,SAASQ,GACdvJ,GACAwJ,GACAC,GAC6C;AAC7C,QAAMvJ,IAASF,EAAU,UAAA,GACnBG,IAAOH,EAAU,SAAA,GACjBQ,IAAMN,EAAO,QAAQsJ,EAAO,QAAQ;AAC1C,MAAI,CAAChJ,EAAK,QAAO;AACjB,QAAMkJ,IAAkB,CAAA;AACxB,WAAShI,IAAI8H,EAAO,eAAe9H,KAAK8H,EAAO,aAAa9H,KAAK,GAAG;AAClE,UAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,QAAI,CAACnB,EAAK,QAAO;AACjB,IAAAmJ,EAAK,KAAK1J,EAAU,QAAQO,EAAI,IAAIC,EAAI,GAAG,CAAC;AAAA,EAC9C;AAEA,MAAIgJ,EAAO,SAAS,QAAQ;AAC1B,UAAM7J,IAAO+J,EAAKA,EAAK,SAAS,CAAC;AACjC,WAAO,MAAM/J;AAAA,EACf;AAEA,QAAMgK,IAAWC,GAAsBH,CAAK;AAC5C,MAAIjJ,EAAI,SAAS,UAAU;AACzB,UAAMqJ,IAAUH,EAAK,IAAI,CAACT,MAAW,OAAOA,KAAU,WAAWA,IAAQ,OAAOA,CAAK,CAAE;AACvF,QAAI,CAACY,EAAQ,MAAM,CAACZ,MAAU,OAAO,SAASA,CAAK,CAAC,EAAG,QAAO;AAC9D,UAAMa,IAAMC,GAAcF,GAAS,EAAE,UAAAF,GAAU,GACzCK,IAAkB,CAAA;AACxB,QAAIC,IAAO;AACX,WAAO,CAACC,MAAkB;AACxB,aAAO,CAACD,KAAQD,EAAM,SAASE,KAAe;AAC5C,cAAMC,IAAOL,EAAI,KAAA;AACjB,YAAIK,EAAK,MAAM;AACb,UAAAF,IAAO;AACP;AAAA,QACF;AACA,QAAAD,EAAM,KAAKG,EAAK,KAAK;AAAA,MACvB;AACA,aAAID,KAAiB,IAAU,OACxBF,EAAME,IAAgB,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,MAAI1J,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,YAAY;AACzE,UAAM4J,IAAQV,EAAK;AAAA,MAAI,CAACT,MACtBzI,EAAI,SAAS,SAASwI,GAAaC,CAAK,IAAIC,GAAaD,CAAK;AAAA,IAAA;AAEhE,QAAI,CAACmB,EAAM,MAAM,CAACnB,MAAUA,aAAiB,IAAI,EAAG,QAAO;AAC3D,UAAMa,IAAMC,GAAcK,GAAiB,EAAE,UAAAT,GAAU,GACjDK,IAAgB,CAAA;AACtB,QAAIC,IAAO;AACX,WAAO,CAACC,MAAkB;AACxB,aAAO,CAACD,KAAQD,EAAM,SAASE,KAAe;AAC5C,cAAMC,IAAOL,EAAI,KAAA;AACjB,YAAIK,EAAK,MAAM;AACb,UAAAF,IAAO;AACP;AAAA,QACF;AACA,QAAAD,EAAM,KAAKG,EAAK,KAAK;AAAA,MACvB;AACA,aAAID,KAAiB,IAAU,OACxBF,EAAME,IAAgB,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,MAAI1J,EAAI,SAAS,UAAU;AACzB,UAAM6J,IAAUX,EAAK,IAAI,CAACT,MAAU,OAAOA,KAAS,EAAE,CAAC,GACjDa,IAAMC,GAAcM,GAAS,EAAE,UAAAV,GAAU,GACzCK,IAAkB,CAAA;AACxB,QAAIC,IAAO;AACX,WAAO,CAACC,MAAkB;AACxB,aAAO,CAACD,KAAQD,EAAM,SAASE,KAAe;AAC5C,cAAMC,IAAOL,EAAI,KAAA;AACjB,YAAIK,EAAK,MAAM;AACb,UAAAF,IAAO;AACP;AAAA,QACF;AACA,QAAAD,EAAM,KAAKG,EAAK,KAAK;AAAA,MACvB;AACA,aAAID,KAAiB,IAAU,OACxBF,EAAME,IAAgB,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,MAAMI,KAA6B,IAC7BC,KAA0B;AAEhC,SAASC,GAAkBC,GAAmBC,IAAOJ,IAAqC;AAC/F,SAAO,IAAI,QAAQG,EAAS,QAAQC,IAAO,GAAGD,EAAS,SAASC,IAAO,GAAGA,GAAMA,CAAI;AACtF;AAEO,SAASC,GAAcrF,GAAWC,GAAWqF,GAAe;AACjE,SAAOtF,KAAKsF,EAAK,QAAQtF,KAAKsF,EAAK,SAASrF,KAAKqF,EAAK,OAAOrF,KAAKqF,EAAK;AACzE;AAEO,SAASC,GACd7K,GACAoJ,GACA0B,GACAC,GACAC,GACS;AACT,MAAIA,MAAa,WAAY,QAAO;AACpC,QAAMC,IAAM9B,GAAoBnJ,GAAWoJ,CAAM;AAMjD,SALI,GAAC6B,KACD,CAACH,KAAeA,MAAgB,aAChCC,MAAiB,QACjBA,MAAiB,aAAaA,MAAiB,QAC/CA,MAAiBE,EAAI,UACrBjL,EAAU,WAAW8K,GAAaC,CAAY;AAEpD;AC9KA,MAAMG,IAAqB,0EAGrBC,IAAsB,MACtBC,KAA2B;AAEjC,SAASC,GAAiBC,GAAY3K,GAAuC;AAC3E,QAAMa,IAAI8J,EAAK,QAAQ,CAAC;AACxB,SAAK9J,KACEA,EAAE,QAAQb,IAASa,EAAE,MADb;AAEjB;AAEA,SAAS+J,GAAsBD,GAAY3K,GAAyB;AAKlE,OAJmB2K,EAAK,WAAW,CAAA,GAAI,KAAK,CAACjJ,MAAM;AACjD,UAAMmJ,IAAKnJ;AACX,WAAOmJ,GAAI,SAAS,YAAYA,EAAG,QAAQ7K;AAAA,EAC7C,CAAC,EACc,QAAO;AACtB,QAAM8K,IAAOH,EAAK,oBAAoB3K,CAAM;AAC5C,SAAO,GAAQ8K,GAAM,UAAUA,GAAM;AACvC;AAEA,SAASC,KAAY;AAEnB,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,KAAA;AACJ;AAEA,SAASC,GAASC,GAAqB;AAErC,SAAO;AAAA;AAAA,iBADGA,MAAQ,QAAQ,qBAAqB,sBAG/B;AAAA;AAAA,IAEd,KAAA;AACJ;AAEA,SAASC,GACPC,GACAxG,GACAC,GACAE,GACAgD,GACAsD,GACA;AACA,QAAMrB,IAAO,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAIjF,GAAGgD,CAAC,IAAI,CAAC,CAAC;AACxD,MAAIiC,KAAQ,EAAG;AACf,QAAMsB,IAAQD,MAAU,UAAU,YAAY;AAC9C,EAAAD,EAAI,KAAA,GACJA,EAAI,YAAYE,GAChBF,EAAI,UAAA,GACJA,EAAI,OAAOxG,IAAIG,GAAGF,CAAC,GACnBuG,EAAI,OAAOxG,IAAIG,IAAIiF,GAAMnF,CAAC,GAC1BuG,EAAI,OAAOxG,IAAIG,GAAGF,IAAImF,CAAI,GAC1BoB,EAAI,UAAA,GACJA,EAAI,KAAA,GACJA,EAAI,QAAA;AACN;AAEA,MAAMG,GAAiB;AAAA,EAAvB,cAAA;AACE,SAAQ,wCAAwB,IAAA,GAChC,KAAQ,qCAAqB,IAAA;AAAA,EAAkB;AAAA,EAE/C,mBAAmBC,GAAsD;AACvE,UAAMC,IAAM,KAAK,UAAUD,CAAO;AAClC,QAAIE,IAAM,KAAK,kBAAkB,IAAID,CAAG;AACxC,WAAKC,MACHA,IAAM,IAAI,KAAK,aAAa,SAASF,CAAO,GAC5C,KAAK,kBAAkB,IAAIC,GAAKC,CAAG,IAE9BA;AAAA,EACT;AAAA,EAEA,aAAanD,GAA4B;AACvC,UAAMoD,IAAS,KAAK,eAAe,IAAIpD,CAAK;AAC5C,QAAIoD,EAAQ,QAAOA;AACnB,UAAMC,IAASC,GAAatD,CAAK;AACjC,WAAI,CAACqD,KAAU,OAAO,MAAMA,EAAO,QAAA,CAAS,IAAU,QACtD,KAAK,eAAe,IAAIrD,GAAOqD,CAAM,GAC9BA;AAAA,EACT;AACF;AAEA,SAASE,GACPV,GACAxG,GACAC,GACAmF,GACA+B,GACA;AACA,EAAAX,EAAI,KAAA,GACJA,EAAI,cAAcW,GAClBX,EAAI,cAAc,oBAClBA,EAAI,YAAY,GAChBA,EAAI,WAAW,SACfA,EAAI,UAAA,GAEJA,EAAI,OAAOxG,GAAGC,CAAC,GACfuG,EAAI,OAAOxG,IAAIoF,GAAMnF,CAAC,GACtBuG,EAAI,OAAOxG,IAAI,KAAK,MAAMoF,IAAO,IAAI,GAAGnF,IAAI,KAAK,MAAMmF,IAAO,IAAI,CAAC,GACnEoB,EAAI,OAAOxG,IAAI,KAAK,MAAMoF,IAAO,IAAI,GAAGnF,IAAI,KAAK,MAAMmF,IAAO,IAAI,CAAC,GACnEoB,EAAI,UAAA,GACJA,EAAI,OAAA,GAEJA,EAAI,UAAA,GACJA,EAAI,OAAOxG,IAAI,KAAK,MAAMoF,IAAO,IAAI,GAAGnF,IAAI,KAAK,MAAMmF,IAAO,IAAI,CAAC,GACnEoB,EAAI,OAAOxG,IAAI,KAAK,MAAMoF,IAAO,IAAI,GAAGnF,IAAImF,CAAI,GAChDoB,EAAI,OAAOxG,IAAI,KAAK,MAAMoF,IAAO,IAAI,GAAGnF,IAAImF,IAAO,CAAC,GACpDoB,EAAI,OAAOxG,IAAI,KAAK,MAAMoF,IAAO,IAAI,GAAGnF,IAAI,KAAK,MAAMmF,IAAO,IAAI,CAAC,GACnEoB,EAAI,OAAA,GACJA,EAAI,QAAA;AACN;AAEA,SAASY,GACPZ,GACAxG,GACAC,GACAmF,GACA+B,GACAb,GACA;AACA,EAAAE,EAAI,KAAA,GACJA,EAAI,cAAcW,GAClBX,EAAI,YAAY,oBAChBA,EAAI,UAAA,GACAF,MAAQ,SACVE,EAAI,OAAOxG,IAAIoF,IAAO,GAAGnF,CAAC,GAC1BuG,EAAI,OAAOxG,IAAIoF,GAAMnF,IAAImF,CAAI,GAC7BoB,EAAI,OAAOxG,GAAGC,IAAImF,CAAI,MAEtBoB,EAAI,OAAOxG,GAAGC,CAAC,GACfuG,EAAI,OAAOxG,IAAIoF,GAAMnF,CAAC,GACtBuG,EAAI,OAAOxG,IAAIoF,IAAO,GAAGnF,IAAImF,CAAI,IAEnCoB,EAAI,UAAA,GACJA,EAAI,KAAA,GACJA,EAAI,QAAA;AACN;AAEA,SAASa,GAAiB1D,GAAiC;AACzD,MAAI,MAAM,QAAQA,CAAK,KAAKA,EAAM,MAAM,CAACpD,MAAM,OAAOA,KAAM,QAAQ;AAClE,WAAOoD;AAET,MAAIA,KAAS,OAAOA,KAAU,UAAU;AACtC,UAAM2D,IAAM3D;AACZ,QAAI2D,EAAI,SAAS,QAAQ;AACvB,YAAMC,IAASD,EAAI;AACnB,UAAI,MAAM,QAAQC,CAAM;AACtB,eAAOA,EAAO,OAAO,CAAChH,MAAmB,OAAOA,KAAM,QAAQ;AAAA,IAElE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASiH,GAAmB7D,GAA+B;AACzD,MAAI,CAACA,KAAS,OAAOA,KAAU,SAAU,QAAO;AAChD,QAAM2D,IAAM3D;AAEZ,SAAI,OAAO2D,EAAI,QAAS,WAAiB,OACrC,OAAOA,EAAI,SAAU,YAAY,WAAWA,IAAYA,EAAI,QACzD;AACT;AAEA,MAAMG,GAAY;AAAA,EAKhB,YAAYxL,GAAW;AACrB,SAAK,IAAIA,GACT,KAAK,OAAO,IAAI,MAAMA,IAAI,CAAC,EAAE,KAAK,CAAC;AAAA,EACrC;AAAA,EAEA,OAAO,KAAKsL,GAAkB;AAC5B,UAAMtE,IAAK,IAAIwE,GAAYF,EAAO,MAAM;AACxC,aAAS,IAAI,GAAG,IAAIA,EAAO,QAAQ,KAAK,EAAG,CAAAtE,EAAG,IAAI,GAAGsE,EAAO,CAAC,KAAK,CAAC;AACnE,WAAOtE;AAAA,EACT;AAAA,EAEA,IAAIyE,GAAe;AAEjB,QAAIhL,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,GAAGgL,CAAK,CAAC,GACvCC,IAAM;AACV,WAAOjL,IAAI;AACT,MAAAiL,KAAO,KAAK,KAAKjL,CAAC,KAAK,GACvBA,KAAKA,IAAI,CAACA;AAEZ,WAAOiL;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,IAAI,KAAK,CAAC;AAAA,EACxB;AAAA,EAEA,IAAIC,GAAgBC,GAAe;AACjC,QAAI,IAAID,IAAS;AACjB,QAAI,OAAK,KAAK,IAAI,KAAK;AACvB,aAAO,KAAK,KAAK;AACf,aAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAKC,GACrC,KAAK,IAAI,CAAC;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWC,GAAgB;AAEzB,QADI,KAAK,KAAK,KACVA,KAAU,EAAG,QAAO;AACxB,UAAMC,IAAQ,KAAK,MAAA;AACnB,QAAID,IAASC,EAAO,QAAO,KAAK,IAAI;AACpC,QAAIC,IAAM,GAENC,IAAM;AACV,WAAOA,KAAO,KAAK,IAAG,CAAAA,MAAQ;AAC9B,QAAIC,IAAM;AACV,aAASC,IAAOF,GAAKE,MAAS,GAAGA,MAAS,GAAG;AAC3C,YAAMtD,IAAOmD,IAAMG;AACnB,UAAItD,KAAQ,KAAK,GAAG;AAClB,cAAMuD,IAAUF,KAAO,KAAK,KAAKrD,CAAI,KAAK;AAC1C,QAAIuD,IAAUN,MACZE,IAAMnD,GACNqD,IAAME;AAAA,MAEV;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,KAAK,IAAI,GAAGJ,CAAG;AAAA,EACjC;AACF;AA8BO,MAAMK,GAAiC;AAAA,EAU5C,YAAoB3N,GAAsB;AAAtB,SAAA,YAAAA,GATpB,KAAQ,UAAmC,MAC3C,KAAQ,mBAAmB4N,IAC3B,KAAQ,iBAAiBC,IACzB,KAAQ,cAA6B,MACrC,KAAQ,eAA8B,MACtC,KAAQ,YAA8B,CAAA,GACtC,KAAQ,mBAAmB,IAAI5B,GAAA,GAC/B,KAAQ,mCAAmB,IAAA,GAC3B,KAAQ,QAAQ;AAAA,EAC2B;AAAA,EAE3C,MAAM6B,GAAmB;AACvB,SAAK,UAAU,SAAS,cAAc,OAAO,GAC7C,KAAK,QAAQ,QAAQ,kBAAkB,QACvCA,EAAK,YAAY,IACjBA,EAAK,YAAY,KAAK,OAAO,GAC7B,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,cAAcpN,GAAsBC,GAAuB;AACzD,SAAK,cAAcD,GACnB,KAAK,eAAeC,GACpB,KAAK,oBAAA;AAAA,EACP;AAAA,EAEA,aAAayI,GAA0B;AACrC,SAAK,YAAYA,GACjB,KAAK,sBAAA;AAAA,EACP;AAAA,EAEA,OAAO2E,GAAwB;AAE7B,QADA,KAAK,SAAS,GACV,CAAC,KAAK,QAAS;AACnB,UAAMC,IAAkB,KAAK,QAAQ,eAC/BC,IAAUD,GAAiB,aAAa,GACxCE,IAAWF,GAAiB,cAAc,GAC1C9N,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtBnL,IAAO,KAAK,UAAU,SAAA;AAC5B,SAAK,QAAQ,YAAY;AACzB,UAAMgO,IAAYC,EAAgBlO,GAAQoL,CAAI,GACxC+C,IAAgBnO,EAAO,QAAQ,IAAI,CAACU,MAAM0N,GAAoB1N,CAAC,CAAC,GAChE2N,IAAaF,EAAc,IAAI,CAAC7M,MAAMgN,GAAehN,CAAC,CAAC,GACvDiN,IAAa,KAAK,iBAAiBN,EAAU,OAAO,CAACX,GAAK/H,MAAM+H,KAAO/H,KAAK,IAAI,CAAC;AACvF,SAAK,QAAQ,MAAM,QAAQ,GAAGgJ,CAAU,MACxC,KAAK,QAAQ,YAAY,KAAK,aAAavO,GAAQiO,CAAS,CAAC;AAC7D,UAAMO,IAAO,SAAS,cAAc,OAAO;AAC3C,eAAWnO,KAAOJ;AAChB,MAAAuO,EAAK,YAAY,KAAK,UAAUnO,GAAKL,GAAQiO,GAAWE,GAAeE,CAAU,CAAC;AAEpF,SAAK,QAAQ,YAAYG,CAAI,GAC7B,KAAK,oBAAA,GACL,KAAK,sBAAA,GACDV,MACFA,EAAgB,YAAYC,GAC5BD,EAAgB,aAAaE;AAE/B,eAAW,CAAC/B,GAAKwC,CAAK,KAAK,MAAM,KAAK,KAAK,aAAa,QAAA,CAAS;AAC/D,MAAIA,EAAM,UAAU,KAAK,SAAO,KAAK,aAAa,OAAOxC,CAAG;AAAA,EAEhE;AAAA,EAEA,UAAU;AACR,IAAAyC,EAAiB,KAAK,OAAO,GAC7B,KAAK,UAAU;AAAA,EACjB;AAAA,EAEA,kBAAkB;AAChB,WAAO,KAAK,SAAS,iBAA8B,kCAAkC,KAAK;AAAA,EAC5F;AAAA,EAEA,QAAQC,GAAmB;AACzB,UAAMzB,IAASyB,EAAM;AACrB,QAAI,CAACzB,EAAQ,QAAO;AACpB,UAAM0B,IAAS1B,EAAO,QAAqB,mBAAmB;AAC9D,QAAI0B;AACF,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAASA;AAAA,QACT,MAAMA,EAAO,sBAAA;AAAA,MAAsB;AAGvC,UAAMC,IAAY3B,EAAO,QAAqB,4CAA4C;AAC1F,QAAI2B,GAAW;AACb,YAAMxO,IAAMwO,EAAU,QAAqB,iBAAiB;AAC5D,UAAIxO;AACF,eAAO;AAAA,UACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,UAC5B,QAAQ;AAAA,UACR,SAASwO;AAAA,UACT,MAAMA,EAAU,sBAAA;AAAA,QAAsB;AAAA,IAG5C;AACA,UAAMC,IAAO5B,EAAO,QAAqB,kBAAkB,GACrD7M,IAAMyO,GAAM,QAAqB,iBAAiB;AACxD,WAAI,CAACA,KAAQ,CAACzO,IAAY,OACnB;AAAA,MACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,MAC5B,QAAQyO,EAAK,QAAQ,UAAU;AAAA,MAC/B,SAASA;AAAA,MACT,MAAMA,EAAK,sBAAA;AAAA,IAAsB;AAAA,EAErC;AAAA,EAEA,cACEH,GAIO;AACP,UAAMzB,IAASyB,EAAM;AACrB,QAAI,CAACzB,EAAQ,QAAO;AACpB,UAAM6B,IAAY7B,EAAO,QAA2B,2BAA2B;AAC/E,QAAI6B,KAAa,CAACA,EAAU,UAAU;AACpC,YAAMD,IAAOC,EAAU,QAAqB,kBAAkB,GACxD1O,IAAMyO,GAAM,QAAqB,iBAAiB;AACxD,UAAI,CAACA,KAAQ,CAACzO,EAAK,QAAO;AAC1B,YAAM2O,IAAWD,EAAU,QAAQ,iBAC7BE,IAAWD,IAAW,OAAO,SAASA,GAAU,EAAE,IAAI,OAAO;AACnE,aAAK,OAAO,SAASC,CAAQ,IACtB;AAAA,QACL,OAAO5O,EAAI,QAAQ,SAAS;AAAA,QAC5B,QAAQyO,EAAK,QAAQ,UAAU;AAAA,QAC/B,MAAM;AAAA,QACN,UAAAG;AAAA,MAAA,IALqC;AAAA,IAOzC;AACA,UAAMC,IAAWhC,EAAO,QAAqB,uBAAuB;AACpE,QAAI,CAACgC,EAAU,QAAO;AACtB,UAAMJ,IAAOI,EAAS,QAAqB,kBAAkB,GACvD7O,IAAMyO,GAAM,QAAqB,iBAAiB;AACxD,QAAI,CAACA,KAAQ,CAACzO,EAAK,QAAO;AAC1B,UAAM8O,IAAOD,EAAS,QAAQ;AAC9B,WAAIC,MAAS,YAAYA,MAAS,SAAe,OAC1C;AAAA,MACL,OAAO9O,EAAI,QAAQ,SAAS;AAAA,MAC5B,QAAQyO,EAAK,QAAQ,UAAU;AAAA,MAC/B,MAAAK;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,aAAanP,GAAgBiO,GAAqB;AACxD,UAAMmB,IAAQ,SAAS,cAAc,OAAO,GACtCC,IAAK,SAAS,cAAc,IAAI;AACtC,IAAAA,EAAG,MAAM,SAAS,GAAG,KAAK,gBAAgB;AAC1C,UAAMC,IAAQ,SAAS,cAAc,IAAI;AACzC,IAAAA,EAAM,UAAU,IAAI,sBAAsB,gBAAgB,GAC1DA,EAAM,cAAc,IACpBA,EAAM,MAAM,QAAQ,GAAG,KAAK,cAAc,MACtC,KAAK,eAAaA,EAAM,UAAU,OAAO,6BAA6B,EAAI,GAC9EA,EAAM,QAAQ,SAAS,IACvBD,EAAG,YAAYC,CAAK;AACpB,UAAMlE,IAAO,KAAK,UAAU,QAAA;AAC5B,aAASgC,IAAM,GAAGA,IAAMpN,EAAO,QAAQ,QAAQoN,KAAO,GAAG;AACvD,YAAM9M,IAAMN,EAAO,QAAQoN,CAAG;AAC9B,UAAI,CAAC9M,EAAK;AACV,YAAMiP,IAAK,SAAS,cAAc,IAAI;AACtC,MAAAA,EAAG,QAAQ,SAASjP,EAAI;AACxB,YAAMkP,IAAUrE,GAAiBC,GAAM9K,EAAI,GAAG,GACxCmP,IAAYpE,GAAsBD,GAAM9K,EAAI,GAAG;AACrD,MAAIkP,IAASD,EAAG,QAAQ,iBAAiBC,IACpCD,EAAG,gBAAgB,uBAAuB,GAC3CE,IAAWF,EAAG,QAAQ,kBAAkB,MACvCA,EAAG,gBAAgB,wBAAwB;AAEhD,YAAMG,IAAO,SAAS,cAAc,KAAK;AACzC,MAAAA,EAAK,YAAY;AACjB,YAAMC,IAAQ,SAAS,cAAc,MAAM;AAC3C,MAAAA,EAAM,YAAY,2BAClBA,EAAM,cAAcrP,EAAI,UAAUA,EAAI;AACtC,YAAMsP,IAAM,SAAS,cAAc,QAAQ;AAC3C,MAAAA,EAAI,OAAO,UACXA,EAAI,YAAY,+BAChBA,EAAI,QAAQ,gBAAgB,KAC5BA,EAAI,QAAQ,gBAAgBtP,EAAI,KAChCsP,EAAI,QAAQ,iBACZA,EAAI,YAAYJ,IAAU/D,GAAS+D,CAAO,IAAIhE,GAAA,GAC9CkE,EAAK,YAAYC,CAAK,GACtBD,EAAK,YAAYE,CAAG,GACpBL,EAAG,YAAYG,CAAI;AACnB,YAAMvG,IAAQ8E,EAAUb,CAAG,KAAK9M,EAAI;AACpC,MAAI6I,MAAOoG,EAAG,MAAM,QAAQ,GAAGpG,CAAK,OACpCoG,EAAG,QAAQ,SAASjP,EAAI,KACpB,KAAK,iBAAiB,QAAQ,KAAK,iBAAiBA,EAAI,OAC1DiP,EAAG,UAAU,IAAI,2BAA2B,GAE9CF,EAAG,YAAYE,CAAE;AAAA,IACnB;AACA,WAAAH,EAAM,YAAYC,CAAE,GACbD;AAAA,EACT;AAAA,EAEQ,UACN/O,GACAL,GACAiO,GACAE,GACAE,GACA;AACA,UAAMgB,IAAK,SAAS,cAAc,IAAI;AACtC,IAAAA,EAAG,QAAQ,QAAQhP,EAAI,IACvBgP,EAAG,MAAM,SAAS,GAAG,KAAK,gBAAgB,MAEpBrP,EAAO,QAAQ,KAAK,CAACU,MAAMA,KAAKA,EAAE,SAAS,aAAaA,EAAE,UAAU,KAAK,UAAU,QAAQL,EAAI,IAAIK,EAAE,GAAG,MAAM,EAAI,KACrH2O,EAAG,UAAU,IAAI,0BAA0B;AAC9D,UAAMjE,IAAO,KAAK,UAAU,QAAA,GACtByD,IAAY,SAAS,cAAc,IAAI;AAC7C,IAAAA,EAAU,QAAQ,OAClBA,EAAU,UAAU,IAAI,oBAAoB;AAC5C,UAAMgB,IAAQ,KAAK,UAAU,gBAAgBxP,EAAI,EAAE,KAAK;AACxD,IAAAwO,EAAU,cAAc,OAAOgB,CAAK,GAChC,KAAK,gBAAgBxP,EAAI,MAAIwO,EAAU,UAAU,IAAI,2BAA2B,GACpFQ,EAAG,YAAYR,CAAS;AACxB,aAASzB,IAAM,GAAGA,IAAMpN,EAAO,QAAQ,QAAQoN,KAAO,GAAG;AACvD,YAAM9M,IAAMN,EAAO,QAAQoN,CAAG;AAC9B,UAAI,CAAC9M,EAAK;AACV,YAAMwP,IAAK,SAAS,cAAc,IAAI;AACtC,MAAAA,EAAG,UAAU,IAAI,cAAc,GAC/BA,EAAG,QAAQ,SAASxP,EAAI,KACpBA,EAAI,SAAS,aAAWwP,EAAG,UAAU,IAAI,iBAAiB;AAC9D,YAAMC,IAAY,KAAK,UAAU,WAAW1P,EAAI,IAAIC,EAAI,GAAG,GACrD0P,IAAU,KAAK,UAAU,wBAAwB3P,EAAI,IAAIC,CAAG,GAC5D2P,IAAY,KAAK,UAAU,aAAa5P,EAAI,IAAIC,EAAI,GAAG,GACvD4P,IAAe,GACnBD,GAAW,aAAaD,EAAQ,OAAO,aAAa1P,EAAI,OAAO;AAEjE,UAAI,CAAC2P,KAAa,CAACD,EAAQ,SAAS,CAACD,GAAW;AAC9C,cAAMI,IAAM9B,EAAWjB,CAAG,KAAK;AAC/B,QAAI+C,MAAKL,EAAG,MAAM,UAAUK;AAAA,MAC9B,OAAO;AACL,cAAMC,IAAYjC,EAAcf,CAAG,KAAK,CAAA,GAClCiD,IAAWL,EAAQ,QAAQM,GAAWF,GAAWJ,EAAQ,KAAK,IAAII,GAClEG,IAASN,IAAYK,GAAWD,GAAUJ,CAAS,IAAII,GACvDG,IAAST,IAAY,EAAE,GAAGQ,GAAQ,WAAW,WAAcA,GAC3DJ,IAAM7B,GAAekC,CAAM;AACjC,QAAIL,MAAKL,EAAG,MAAM,UAAUK;AAAA,MAC9B;AACA,YAAMT,IAAOtE,EAAK,WAAW9K,EAAI,GAAG,KAAKA,EAAI;AAC7C,MAAAwP,EAAG,UAAU,IAAIJ,IAAO,cAAc,aAAa;AACnD,YAAMe,IAAM,KAAK,UAAU,WAAWpQ,EAAI,IAAIC,EAAI,GAAG,GAC/CoQ,IAAW,KAAK,UAAU,iBAAiBrQ,EAAI,IAAIC,CAAG,GACtDqQ,IAAeD,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,SAC7EY,IAAYD,IACd,EAAE,MAAMA,EAAA,IACR,KAAK,YAAYD,EAAS,OAAOpQ,CAAG,GAClCuQ,IAAc,KAAK,UAAU,mBAAmBxQ,EAAI,IAAIC,EAAI,GAAG,GAC/DwQ,IACJxQ,EAAI,SAAS,UAAU,CAACqQ,IAAelE,GAAiBiE,EAAS,KAAK,IAAI,MACtEK,IAAezQ,EAAI,SAAS,YAAYA,EAAI,SAAS,QACrD0Q,IAAcD,IAChBzQ,EAAI,SAAS,WACX2Q,GAAoBP,EAAS,KAAK,IAClCQ,GAAkBR,EAAS,KAAK,IAClC,MACES,IAAcJ,IAChBzQ,EAAI,SAAS,WACX8Q,GAAeV,EAAS,KAAK,IAC7BW,GAAaX,EAAS,KAAK,IAC7B;AACJ,UAAII,KAAaA,EAAU,QAAQ;AACjC,cAAMQ,IAAO,SAAS,cAAc,KAAK;AACzC,QAAAA,EAAK,YAAY,oBACjBR,EAAU,QAAQ,CAACS,GAAK1B,MAAU;AAChC,gBAAM2B,IAAO,SAAS,cAAc,MAAM;AAC1C,UAAAA,EAAK,YAAY;AACjB,gBAAM7B,IAAQ,SAAS,cAAc,MAAM;AAC3C,UAAAA,EAAM,YAAY,qBAClBA,EAAM,cAAc4B;AACpB,gBAAME,IAAS,SAAS,cAAc,QAAQ;AAC9C,UAAAA,EAAO,OAAO,UACdA,EAAO,YAAY,sBACnBA,EAAO,QAAQ,mBAAmB,KAClCA,EAAO,QAAQ,kBAAkB,OAAO5B,CAAK,GAC7C4B,EAAO,cAAc,MACjBZ,EAAY,YAAYA,EAAY,cACtCY,EAAO,WAAW,KAEpBD,EAAK,YAAY7B,CAAK,GACtB6B,EAAK,YAAYC,CAAM,GACvBH,EAAK,YAAYE,CAAI;AAAA,QACvB,CAAC,GACD1B,EAAG,gBAAgBwB,CAAI;AAAA,MACzB,WAAWP,KAAgB,CAACJ,KAAgBK,KAAeG,GAAa;AACtE,cAAMjC,IACJ5O,EAAI,SAAS,WAAW,SAAS,cAAc,QAAQ,IAAI,SAAS,cAAc,MAAM;AAC1F,QAAI4O,aAAoB,sBAAmBA,EAAS,OAAO,WAC3DA,EAAS,YACP5O,EAAI,SAAS,WAAW,0BAA0B,uBAChDuQ,EAAY,YAAU3B,EAAS,UAAU,IAAI,yBAAyB,GACtE5O,EAAI,SAAS,UAAU4P,MAAchB,EAAS,MAAM,QAAQ,YAChEA,EAAS,QAAQ,gBAAgB5O,EAAI,MACrC4O,EAAS,cAAciC,GACvBrB,EAAG,gBAAgBZ,CAAQ;AAAA,MAC7B,WACM5O,EAAI,SAAS,aAAa,CAACqQ;AAC7B,YAAIrQ,EAAI,QAAQ;AACd,gBAAMoR,IAAQ,SAAS,cAAc,OAAO;AAC5C,UAAAA,EAAM,OAAO,SACbA,EAAM,OAAO,kBAAkB,OAAOpR,EAAI,GAAG,CAAC,IAC9CoR,EAAM,UAAU,EAAQhB,EAAS,QAC7BG,EAAY,YAAYA,EAAY,gBAAgB,WAAW,KACnEa,EAAM,YAAY,wBAClBA,EAAM,aAAa,cAAcpR,EAAI,UAAU,OAAOA,EAAI,GAAG,CAAC,GAC9DwP,EAAG,gBAAgB4B,CAAK;AAAA,QAC1B;AACE,UAAA5B,EAAG,cAAcc,EAAU,MACvBA,EAAU,UAAOd,EAAG,MAAM,QAAQc,EAAU;AAAA;AAGlD,QAAAd,EAAG,cAAcqB,KAAeP,EAAU,MACtCA,EAAU,UAAOd,EAAG,MAAM,QAAQc,EAAU;AAGpD,YAAMe,IAAS,KAAK,UAAU,cAActR,EAAI,IAAIC,EAAI,GAAG;AAC3D,MAAIqR,KACF7B,EAAG,UAAU,OAAO,wBAAwB6B,EAAO,UAAU,SAAS,GACtE7B,EAAG,UAAU,OAAO,sBAAsB6B,EAAO,UAAU,OAAO,GAClE7B,EAAG,QAAQ,qBAAqB6B,EAAO,YAEvC7B,EAAG,UAAU,OAAO,wBAAwB,oBAAoB,GAChEA,EAAG,gBAAgB,2BAA2B;AAEhD,YAAM8B,IACJtR,EAAI,OAAO,UACVA,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,SAAS,UAAU;AAClF,MAAAwP,EAAG,UAAU,IAAI8B,MAAU,UAAU,gBAAgB,YAAY;AACjE,YAAMC,IAAcC,GAAWrB,GAAKC,EAAS,OAAOpQ,CAAG;AACvD,UAAIuR,MAAgB;AAClB,QAAA/B,EAAG,QAAQ,MAAM+B;AAAA,WACZ;AACL,cAAME,IAAStB,KAAQ,OAA4B,KAAK,OAAOA,CAAG;AAClE,QAAAX,EAAG,QAAQ,MAAMiC;AAAA,MACnB;AACA,MAAIhC,KAAWD,EAAG,UAAU,IAAI,SAAS,GACrCe,EAAY,YACdf,EAAG,UAAU,IAAI,kBAAkB,GAC/BxP,EAAI,WAASwP,EAAG,UAAU,IAAI,0BAA0B,KAE5DA,EAAG,UAAU,IAAI,kBAAkB,GAEjCe,EAAY,SAAOf,EAAG,UAAU,IAAI,wBAAwB,GAC5De,EAAY,YAAUf,EAAG,UAAU,IAAI,kBAAkB,GAE3D,KAAK,gBAAgBzP,EAAI,MACzB,KAAK,iBAAiB,QACtB,KAAK,iBAAiBC,EAAI,OAE1BwP,EAAG,UAAU,IAAI,qBAAqB,GAExCT,EAAG,YAAYS,CAAE;AAAA,IACnB;AAGA,QADgB9P,EAAO,QAAQ,KAAK,CAACU,MAAM0K,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,QAAQ,GAClE;AACX,UAAIsR,IAAY,KAAK;AACrB,eAAS5E,IAAM,GAAGA,IAAMpN,EAAO,QAAQ,QAAQoN,KAAO,GAAG;AACvD,cAAM9M,IAAMN,EAAO,QAAQoN,CAAG;AAC9B,YAAI,CAAC9M,KAAO,CAACA,EAAI,SAAU;AAC3B,cAAM6I,IAAQ8E,EAAUb,CAAG,KAAKhC,EAAK,eAAe9K,EAAI,GAAG,KAAKA,EAAI,SAAS,KACvEoQ,IAAW,KAAK,UAAU,iBAAiBrQ,EAAI,IAAIC,CAAG,GACtD0P,IAAU,KAAK,UAAU,wBAAwB3P,EAAI,IAAIC,CAAG,GAG5D2R,IADJvB,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,UACpC,WAAW,KAAK,YAAYU,EAAS,OAAOpQ,CAAG,EAAE,MACvE4R,IAAU,KAAK,UAAU,cAAc7R,EAAI,EAAE,GAC7C4L,IAAM,GAAG5L,EAAI,EAAE,IAAIC,EAAI,GAAG,IAAI4R,CAAO,IAAI/I,CAAK,IAAI8I,CAAI,IACtD9F,IAAS,KAAK,aAAa,IAAIF,CAAG;AACxC,YAAIE,GAAQ;AACV,UAAAA,EAAO,QAAQ,KAAK,OACpB,KAAK,aAAa,IAAIF,GAAKE,CAAM,GACjC6F,IAAY,KAAK,IAAIA,GAAW7F,EAAO,MAAM;AAC7C;AAAA,QACF;AACA,cAAMgG,IAAU,SAAS,cAAc,MAAM;AAC7C,QAAAA,EAAQ,MAAM,aAAa,UAC3BA,EAAQ,MAAM,WAAW,YACzBA,EAAQ,MAAM,OAAO,YACrBA,EAAQ,MAAM,MAAM,KACpBA,EAAQ,MAAM,aAAa,YAC3BA,EAAQ,MAAM,eAAe,YAC7BA,EAAQ,MAAM,UAAU,gBACxBA,EAAQ,MAAM,QAAQ,GAAGhJ,CAAK,MAC9BgJ,EAAQ,cAAcF;AACtB,cAAMG,IAAc,KAAK,SAAS;AAClC,YAAI,CAACA,EAAa;AAClB,QAAAA,EAAY,YAAYD,CAAO;AAC/B,cAAM5J,IACJ4J,EAAQ,eACRE,KACAC,KACA;AACF,QAAAH,EAAQ,OAAA,GACR,KAAK,aAAa,IAAIlG,GAAK,EAAE,QAAQ1D,GAAG,OAAO,KAAK,OAAO,GAC3DyJ,IAAY,KAAK,IAAIA,GAAWzJ,CAAC;AAAA,MACnC;AACA,MAAA8G,EAAG,MAAM,SAAS,GAAG2C,CAAS,MAC9B,KAAK,UAAU,aAAa3R,EAAI,IAAI2R,CAAS;AAAA,IAC/C;AACE,MAAA3C,EAAG,MAAM,SAAS,GAAG,KAAK,gBAAgB,MAC1C,KAAK,UAAU,aAAahP,EAAI,IAAI,KAAK,gBAAgB;AAE3D,WAAOgP;AAAA,EACT;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,CAAC,KAAK,QAAS;AACnB,UAAMkD,IAAQ,KAAK,gBAAgB,aAAa,KAAK,iBAAiB;AACtE,SAAK,QAAQ,UAAU,OAAO,wBAAwBA,CAAK;AAC3D,eAAWC,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,4BAA4B,CAAC;AACrF,MAAAA,EAAG,UAAU,OAAO,2BAA2B;AAEjD,eAAWA,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,4BAA4B,CAAC;AACrF,MAAAA,EAAG,UAAU,OAAO,2BAA2B;AAEjD,eAAWA,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,sBAAsB,CAAC;AAC/E,MAAAA,EAAG,UAAU,OAAO,qBAAqB;AAE3C,QAAI,KAAK;AACP,iBAAWA,KAAM,MAAM;AAAA,QACrB,KAAK,QAAQ;AAAA,UACX,mBAAmB,KAAK,WAAW;AAAA,QAAA;AAAA,MACrC;AAEA,QAAAA,EAAG,UAAU,IAAI,2BAA2B;AAGhD,QAAI,KAAK,iBAAiB,MAAM;AAC9B,iBAAWA,KAAM,MAAM;AAAA,QACrB,KAAK,QAAQ,iBAA8B,oBAAoB,KAAK,YAAY,IAAI;AAAA,MAAA;AAEpF,QAAAA,EAAG,UAAU,IAAI,2BAA2B;AAE9C,UAAI,KAAK;AACP,mBAAWA,KAAM,MAAM;AAAA,UACrB,KAAK,QAAQ;AAAA,YACX,mBAAmB,KAAK,WAAW,uBAAuB,KAAK,YAAY;AAAA,UAAA;AAAA,QAC7E;AAEA,UAAAA,EAAG,UAAU,IAAI,qBAAqB;AAAA,IAG5C;AAAA,EACF;AAAA,EAEQ,wBAAwB;AAC9B,QAAI,CAAC,KAAK,QAAS;AACnB,eAAWA,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,mBAAmB,CAAC;AAC5E,MAAAA,EAAG,UAAU,OAAO,kBAAkB;AAExC,QAAI,CAAC,KAAK,UAAU,OAAQ;AAC5B,UAAMvS,IAAO,MAAM,KAAK,KAAK,QAAQ,iBAAsC,UAAU,CAAC,GAChFD,IAAS,KAAK,UAAU,UAAA;AAC9B,eAAW6I,KAAS,KAAK,WAAW;AAClC,YAAM4J,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI5J,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D6J,IAAS,KAAK,IAAIzS,EAAK,SAAS,GAAG,KAAK,IAAI4I,EAAM,UAAUA,EAAM,MAAM,CAAC,GACzE8J,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI9J,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D+J,IAAS,KAAK,IAAI5S,EAAO,QAAQ,SAAS,GAAG,KAAK,IAAI6I,EAAM,UAAUA,EAAM,MAAM,CAAC;AACzF,eAASrH,IAAIiR,GAAUjR,KAAKkR,GAAQlR,KAAK,GAAG;AAC1C,cAAMqR,IAAQ5S,EAAKuB,CAAC;AACpB,YAAI,CAACqR,EAAO;AACZ,cAAMtD,IAAKsD,EAAM,cAAc,uBAAuB;AACtD,QAAItD,KAAIA,EAAG,UAAU,IAAI,kBAAkB;AAC3C,cAAMuD,IAAQ,MAAM,KAAKD,EAAM,iBAAuC,IAAI,CAAC;AAC3E,iBAASnS,IAAIiS,GAAUjS,KAAKkS,GAAQlS,KAAK,GAAG;AAC1C,gBAAMoO,IAAOgE,EAAMpS,CAAC;AACpB,UAAIoO,KAAMA,EAAK,UAAU,IAAI,kBAAkB;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY/F,GAAgBzI,GAAqD;AACvF,QAAIyI,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,QAAI,OAAOA,KAAU,UAAU;AAC7B,YAAM2D,IAAM3D;AACZ,UAAI2D,EAAI,SAAS,YAAY,OAAOA,EAAI,SAAU;AAChD,eAAO,EAAE,MAAMA,EAAI,MAAA;AAErB,YAAMqG,IAAUnG,GAAmB7D,CAAK;AACxC,UAAIgK,MAAY,KAAM,QAAO,EAAE,MAAMA,EAAA;AAAA,IACvC;AACA,QAAIzS,EAAI,SAAS;AAEf,aAAO,EAAE,MADK8Q,GAAerI,CAAK,KACV,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS;AAEf,aAAO,EAAE,MADK+Q,GAAatI,CAAK,KACR,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS,QAAQ;AACvB,YAAM0S,IAAOvG,GAAiB1D,CAAK;AACnC,UAAIiK,EAAM,QAAO,EAAE,MAAMA,EAAK,KAAK,IAAI,EAAA;AAAA,IACzC;AACA,QAAI1S,EAAI,SAAS;AACf,aAAIA,EAAI,WAAW,cAAc,CAACA,EAAI,SAC7B,EAAE,MAAMyI,IAAQ,MAAM,IAAA,IAE3B,MAAM,QAAQzI,EAAI,MAAM,KAAKA,EAAI,OAAO,UAAU,IAC7C,EAAE,MAAc,OAARyI,IAAezI,EAAI,OAAO,CAAC,IAAYA,EAAI,OAAO,CAAC,CAAvB,EAAwB,IAE9D,EAAE,MAAMyI,IAAQ,OAAOzI,EAAI,MAAM,IAAI,GAAA;AAE9C,QAAIA,EAAI,SAAS,YAAY,OAAOyI,KAAU,UAAU;AACtD,YAAMkK,IAAMlK,GACNmD,IAAM5L,EAAI;AAEhB,WADc4L,GAAK,UAAU,eACf,cAAc;AAC1B,cAAM+F,IAAOiB,GAAoBD,GAAK,EAAE,QAAQ,cAAc,WAAW/G,GAAK,WAAW,GACnFJ,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAAA;AAAAA,MACjB;AAEA,YAAMqH,IAAiC,CAAA;AACvC,MAAIjH,GAAK,UAAU,WACjBiH,EAAK,wBAAwBjH,EAAI,OACjCiH,EAAK,wBAAwBjH,EAAI,QAEnCiH,EAAK,cAAc,EAAQjH,GAAK;AAChC,YAAM+F,IAAO,KAAK,iBAAiB,mBAAmBkB,CAAI,EAAE,OAAOF,CAAG,GAChEnH,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAA;AAAA,IACjB;AAEA,SAAKxL,EAAI,SAAS,SAASA,EAAI,SAAS,WAAW,OAAOyI,KAAU,UAAU;AAC5E,YAAMkK,IAAMlK,GACNmD,IAAM5L,EAAI,QACV8S,IAAQlH,GAAK,UAAU;AAC7B,UAAIkH,MAAU,YAAYA,MAAU,WAAWA,MAAU,OAAO;AAC9D,cAAMnB,IAAOoB,GAAwBJ,GAAKG,CAAK,GACzCtH,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAAA;AAAAA,MACjB;AAEA,YAAMqH,IAAiC;AAAA,QACrC,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,QACvB,aAAa,EAAQjH,GAAK;AAAA,MAAiB,GAEvC+F,IAAO,KAAK,iBAAiB,mBAAmBkB,CAAI,EAAE,OAAOF,CAAG,GAChEnH,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAA;AAAA,IACjB;AACA,SACGxL,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,gBAC3DyI,aAAiB,QAAQ,OAAOA,KAAU,WAC3C;AACA,YAAMuK,IAAWhT,EAAI,QACf4L,IACJ5L,EAAI,SAAS,SACTiT,GAAkBD,GAAU,MAAM,IAClChT,EAAI,SAAS,SACXiT,GAAkBD,GAAU,MAAM,IAClCC,GAAkBD,GAAU,UAAU;AAC9C,UAAIlR,IAAiB;AAKrB,aAJI2G,aAAiB,OAAM3G,IAAI2G,IAE7B3G,IAAI,KAAK,iBAAiB,aAAa2G,CAAK,GAEzC3G,IACE,EAAE,MAAMoR,GAAepR,GAAG8J,CAAG,EAAA,IADrB,EAAE,MAAM,OAAOnD,CAAK,EAAA;AAAA,IAErC;AACA,WAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAAA,EAC7B;AACF;AAEO,MAAM0K,IAAN,MAAMA,EAAmC;AAAA,EA0C9C,YACE3T,GACQ4T,IAA8B,MAAM,UAC5C;AADQ,SAAA,cAAAA,GAvCV,KAAQ,OAA2B,MACnC,KAAQ,SAAmC,MAC3C,KAAQ,SAAgC,MACxC,KAAQ,eAAsC,MAC9C,KAAQ,UAAiC,MACzC,KAAQ,gBAA0D,MAClE,KAAQ,iBAAgC,MAExC,KAAiB,YAAYhG,IAC7B,KAAiB,eAAeiG,IAChC,KAAiB,aAAa,IAC9B,KAAiB,UAAU,IAC3B,KAAiB,iBAAiBhG,IAClC,KAAQ,cAA6B,MACrC,KAAQ,eAA8B,MACtC,KAAQ,YAA8B,CAAA,GACtC,KAAQ,mBAAmB,IAAI5B,GAAA,GAC/B,KAAQ,uCAAuB,IAAA,GAC/B,KAAQ,QAAQ,GAChB,KAAQ,cAA6B,MACrC,KAAQ,qBAAsD,MAC9D,KAAQ,oBAAmC,MAC3C,KAAQ,kBAAkB,IAC1B,KAAQ,iBAAgC,MACxC,KAAQ,kBAAiC,MACzC,KAAQ,oBAAmC,MAC3C,KAAQ,+CAA+B,IAAA,GACvC,KAAQ,sBAAqC,MAC7C,KAAQ,uBAAkE,MAC1E,KAAQ,cAMG,MAqnBX,KAAQ,cAAc,CAAC6H,MAAmB;AACxC,UAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ;AAChC,YAAMlJ,IAAO,KAAK,OAAO,sBAAA,GACnBmJ,IAAYD,EAAG,UAAUlJ,EAAK,MAC9BoJ,IAAYF,EAAG,UAAUlJ,EAAK,KAC9BtF,IAAIyO,IAAY,KAAK,KAAK,YAC1BxO,IAAIyO;AAEV,UADIzO,KAAK,KAAK,gBACVD,IAAI,KAAK,eAAgB;AAC7B,YAAMpF,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtB6C,IAAYC,EAAgBlO,GAAQoL,CAAI;AAC9C,UAAI2I,IAAU,KAAK,gBACf3T,IAAW;AACf,eAAS0B,IAAI,GAAGA,IAAImM,EAAU,QAAQnM,KAAK,GAAG;AAC5C,cAAMyD,IAAI0I,EAAUnM,CAAC,KAAK;AAC1B,YAAIsD,KAAK2O,KAAW3O,KAAK2O,IAAUxO,GAAG;AACpC,UAAAnF,IAAW0B;AACX;AAAA,QACF;AACA,QAAAiS,KAAWxO;AAAAA,MACb;AACA,UAAInF,IAAW,EAAG;AAClB,YAAME,IAAMN,EAAO,QAAQI,CAAQ;AACnC,UAAI,CAACE,EAAK;AACV,YAAMiF,IAAI0I,EAAU7N,CAAQ,KAAK,KAC3B4T,IAAW,IAEXC,IAAWF,IAAUxO,IAAIyO,IADnB,GAENE,IAAU,KAAK,OAAO,KAAK,eAAeF,KAAY,CAAC;AAG7D,MADE5O,KAAK6O,KAAY7O,KAAK6O,IAAWD,KAAY3O,KAAK6O,KAAW7O,KAAK6O,IAAUF,KAE9E,KAAK,KAAK;AAAA,QACR,IAAI,YAAY,4BAA4B,EAAE,SAAS,IAAM,QAAQ,EAAE,QAAQ1T,EAAI,MAAI,CAAG;AAAA,MAAA;AAAA,IAE9F,GA8LA,KAAQ,oBAAoB,CAACsT,MAAqB;AAEhD,MADA,KAAK,qBAAqB,EAAE,GAAGA,EAAG,SAAS,GAAGA,EAAG,QAAA,GAC7C,MAAK,gBACT,KAAK,cAAc,OAAO,WAAW,MAAM;AACzC,aAAK,cAAc;AACnB,cAAMzU,IAAI,KAAK;AACf,QAAKA,KACL,KAAK,mBAAmBA,EAAE,GAAGA,EAAE,CAAC;AAAA,MAClC,GAAG,EAAE;AAAA,IACP,GAEA,KAAQ,qBAAqB,MAAM;AACjC,MAAK,KAAK,WACV,KAAK,OAAO,MAAM,SAAS,QACvB,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,OAClB,KAAK,kBAAkB,KAAK,qBAC9B,KAAK,iBAAiB,MACtB,KAAK,kBAAkB,MACvB,KAAK,OAAA;AAAA,IAET,GAEA,KAAQ,oBAAoB,CAACyU,MAAqB;AAChD,UAAI,CAAC,KAAK,OAAQ;AAClB,YAAMO,IAAY,KAAK;AAAA,QACrB,IAAI,WAAW,aAAa,EAAE,SAASP,EAAG,SAAS,SAASA,EAAG,QAAA,CAAS;AAAA,MAAA;AAI1E,UAFI,CAACO,KAAaA,EAAU,SAAS,YACjB,KAAK,UAAU,mBAAmBA,EAAU,OAAOA,EAAU,MAAM,EACvE,SAAU;AAC1B,YAAMC,IAAU,GAAGD,EAAU,KAAK,KAAKA,EAAU,MAAM,KAAKA,EAAU,IAAI;AAC1E,MAAIC,MAAY,KAAK,oBACnB,KAAK,kBAAkBA,GACvB,KAAK,OAAA;AAAA,IAET,GAEA,KAAQ,kBAAkB,MAAM;AAC9B,MAAI,KAAK,oBACP,KAAK,kBAAkB,MACvB,KAAK,OAAA;AAAA,IAET,GA73BE,KAAK,YAAYtU;AAAA,EACnB;AAAA,EAEA,MAAM8N,GAAmB;AACvB,SAAK,OAAOA,GACZ,KAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,UAAMyG,IAASZ,EAAe;AAC9B,SAAK,OAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAIY,GAAQ,KAAK,MAAMzG,EAAK,eAAe,GAAG,CAAC,CAAC,GACrF,KAAK,OAAO,SAAS,KAAK,IAAI,GAAG,KAAK,IAAIyG,GAAQ,KAAK,MAAMzG,EAAK,gBAAgB,GAAG,CAAC,CAAC,GACvF,KAAK,OAAO,MAAM,QAAQ,GAAG,KAAK,OAAO,KAAK,MAC9C,KAAK,OAAO,MAAM,SAAS,GAAG,KAAK,OAAO,MAAM,MAChD,KAAK,OAAO,QAAQ,kBAAkB,UACtC,KAAK,OAAO,MAAM,WAAW,UAC7B,KAAK,OAAO,MAAM,MAAM,KACxB,KAAK,OAAO,MAAM,OAAO,KACzB,KAAK,OAAO,MAAM,SAAS,KAC3B,KAAK,OAAO,MAAM,SAAS,QAC3B,KAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB,GAClE,KAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB,GAClE,KAAK,OAAO,iBAAiB,aAAa,KAAK,eAAe,GAC9D,KAAK,OAAO,iBAAiB,gBAAgB,KAAK,kBAAkB,GACpE,KAAK,OAAO,iBAAiB,SAAS,KAAK,WAAW,GACtD,KAAK,SAAS,SAAS,cAAc,KAAK,GAC1C,KAAK,OAAO,MAAM,QAAQ,OACtB,KAAK,WAAS,KAAK,QAAQ,OAAA,GAC3B,KAAK,gBAAc,KAAK,aAAa,OAAA,GACzC,KAAK,eAAe,SAAS,cAAc,KAAK,GAChD,KAAK,aAAa,YAAY,yBAC9B,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAY,mBACzB,KAAK,QAAQ,QAAQ,UAAU,KAC/B,KAAK,aAAa,YAAY,KAAK,OAAO,GAC1CA,EAAK,YAAY,IACjBA,EAAK,MAAM,WAAW,YACtBA,EAAK,YAAY,KAAK,YAAY,GAClCA,EAAK,YAAY,KAAK,MAAM,GAC5BA,EAAK,YAAY,KAAK,MAAM,GAC5B,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,cAAcpN,GAAsBC,GAAuB;AACzD,SAAK,cAAcD,GACnB,KAAK,eAAeC,GACpB,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,aAAayI,GAA0B;AACrC,SAAK,YAAYA,GACjB,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,OAAOoL,GAAuB;AAC5B,QAAI;AAEF,UADA,KAAK,SAAS,GACV,CAAC,KAAK,UAAU,CAAC,KAAK,KAAM;AAChC,YAAM1I,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,UAAI,CAACA,EAAK;AACV,MAAAA,EAAI,OAAO,GAAGX,CAAmB,MAAMD,CAAkB;AACzD,UAAIuJ,IAAW3I,EAAI;AACnB,YAAM4I,IAAY,KAAK,gBAAgB,aAAa,KAAK,iBAAiB,WACpExU,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtBnL,IAAO,KAAK,UAAU,SAAA,GACtBgO,IAAYC,EAAgBlO,GAAQoL,CAAI,GACxC+C,IAAgBnO,EAAO,QAAQ,IAAI,CAACU,MAAM0N,GAAoB1N,CAAC,CAAC,GAChE+T,wBAAgB,IAAA,GAChBC,IAAU1U,EAAO,QAAQ,KAAK,CAACU,MAAM0K,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,QAAQ,GACzEiU,IAAWD,IAAU,KAAK,qBAAqB1U,GAAQoL,GAAM6C,CAAS,IAAI;AAChF,MAAI0G,MAAa,KAAK,sBACpB,KAAK,oBAAoBA,GACzB,KAAK,yBAAyB,MAAA,GAC9B,KAAK,uBAAuB,OAEzBD,KAAS,KAAK,2BAAA,GAEnB,KAAK,kBAAkBzU,GAAMyU,IAAUC,IAAW,MAAMD,CAAO;AAC/D,YAAME,IAAc,KAAK;AACzB,UAAI,CAACA,EAAa;AAElB,YAAMrG,IAAa,KAAK,iBAAiBN,EAAU,OAAO,CAACX,GAAK/H,MAAM+H,KAAO/H,KAAK,IAAI,CAAC,GACjFsP,IAAqBP,GAAO,gBAAgB,KAAK,KAAK,eAAe,MACrEQ,IACJR,GAAO,iBAAiB,KAAK,KAAK,gBAAgB,KAAK,OAAO,UAAU,MACpED,IAASZ,EAAe,mBACxBsB,IAAY,KAAK,IAAI,GAAG,KAAK,IAAIV,GAAQ,KAAK,MAAMQ,CAAkB,CAAC,CAAC,GACxEG,IAAa,KAAK,IAAI,GAAG,KAAK,IAAIX,GAAQ,KAAK,MAAMS,CAAmB,CAAC,CAAC;AAChF,MAAI,KAAK,OAAO,UAAUC,MAAW,KAAK,OAAO,QAAQA,IACrD,KAAK,OAAO,WAAWC,MAAY,KAAK,OAAO,SAASA,IAC5D,KAAK,OAAO,MAAM,QAAQ,GAAGD,CAAS,MACtC,KAAK,OAAO,MAAM,SAAS,GAAGC,CAAU,MAExCpJ,EAAI,OAAO,GAAGX,CAAmB,MAAMD,CAAkB,IACzDuJ,IAAW3I,EAAI,MACf,KAAK,uBAAA;AAEL,YAAMqJ,IAAYX,GAAO,aAAa,KAAK,KAAK,WAC1CY,IAAaZ,GAAO,cAAc,KAAK,KAAK,YAC5Ca,IAAsB,CAACC,MAAuB;AAClD,cAAMlI,IAASkI,IAAa,GACtBC,IAAe,KAAK;AAAA,UACxB;AAAA,UACA,KAAK,IAAIpV,EAAK,SAAS,GAAG2U,EAAY,QAAQ,WAAW1H,CAAM,CAAC;AAAA,QAAA,GAE5DoI,IAAQV,EAAY,QAAQ,IAAIS,CAAY;AAClD,YAAIE,IAAaF,GACbG,IAAc;AAClB,cAAMxD,KAAa,KAAK,QAAQ,UAAU,KAAK,KAAK,YAAY;AAChE,iBAASlQ,IAAIuT,GAAcvT,IAAI7B,EAAK,UAAUuV,IAAcxD,GAAWlQ,KAAK;AAC1E,UAAA0T,KAAeZ,EAAY,QAAQ9S,CAAC,KAAK,KAAK,WAC9CyT,IAAazT,IAAI;AAEnB,eAAO,EAAE,OAAAwT,GAAO,cAAAD,GAAc,YAAAE,EAAAA;AAAAA,MAChC;AAEA,UAAIE,IAAkBb,EAAY,QAAQ,MAAA;AAC1C,YAAMc,IAAiB,KAAK,QAAQ,UAAU,KAAK,KAAK,cAClDC,IAAqB,KAAK,IAAI,GAAGD,IAAiB,KAAK,YAAY;AACzE,UAAIE,IAAsB,KAAK,IAAI,GAAGH,IAAkBE,CAAkB,GACtEE,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAIZ,GAAWW,CAAmB,CAAC,GACvE,EAAE,OAAAN,GAAO,cAAAD,GAAc,YAAAE,EAAA,IAAeJ,EAAoBU,CAAgB;AAE9E,UAAInB,KAAWC,GAAU;AACvB,cAAMmB,IAAkC,CAAA;AACxC,iBAAShU,IAAIuT,GAAcvT,IAAIyT,GAAYzT,KAAK,GAAG;AACjD,gBAAMzB,IAAMJ,EAAK6B,CAAC;AAClB,cAAI,CAACzB,EAAK;AACV,gBAAM6R,IAAU,KAAK,UAAU,cAAc7R,EAAI,EAAE;AACnD,cAAI,KAAK,yBAAyB,IAAIA,EAAI,EAAE,MAAM6R,EAAS;AAC3D,gBAAM6D,IAAQ,KAAK,iBAAiBnK,GAAKvL,GAAKL,GAAQiO,CAAS;AAC/D,UAAA6H,EAAQzV,EAAI,EAAE,IAAI0V,GAClB,KAAK,yBAAyB,IAAI1V,EAAI,IAAI6R,CAAO;AAAA,QACnD;AACA,aAAK,sBAAsB4D,CAAO,GAClCL,IAAkBb,EAAY,QAAQ,MAAA,GACtC,KAAK,UAAU,kBAAkBkB,CAAO,GACxCF,IAAsB,KAAK,IAAI,GAAGH,IAAkBE,CAAkB,GACtEE,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAIZ,GAAWW,CAAmB,CAAC,GACtE,EAAE,OAAAN,GAAO,cAAAD,GAAc,YAAAE,EAAA,IAAeJ,EAAoBU,CAAgB,IACvE,KAAK,wBAAwB,OAAO,KAAKC,CAAO,EAAE,SAAS,MAC7D,KAAK,6BAAA;AAAA,MACT;AAEA,MAAI,KAAK,WACP,KAAK,OAAO,MAAM,SAAS,GAAGF,CAAmB,MACjD,KAAK,OAAO,MAAM,QAAQ,GAAGrH,CAAU;AAEzC,YAAMyH,IAAc,KAAK,iBAAiBd;AAE1C,MAAAtJ,EAAI,UAAU,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAEzDA,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,gBAAgB,KAAK,OAAO,MAAM;AAE1D,UAAIqK,IAAU,KAAK,eAAeX,IAAQO;AAC1C,eAAS/T,IAAIuT,GAAcvT,IAAIyT,GAAYzT,KAAK,GAAG;AACjD,cAAMzB,IAAMJ,EAAK6B,CAAC,GACZoU,IAAOtB,EAAY,QAAQ9S,CAAC,KAAK,KAAK;AAE5C,QAAA8J,EAAI,cAAc,WAClBA,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAGqK,GAAS,KAAK,gBAAgBC,CAAI,GAClDtK,EAAI,WAAW,GAAGqK,GAAS,KAAK,gBAAgBC,CAAI;AACpD,cAAMC,IAAU,KAAK,UAAU,gBAAgB9V,EAAI,EAAE,KAAK;AAC1D,QAAI,KAAK,gBAAgBA,EAAI,OAC3BuL,EAAI,YAAY,yBAChBA,EAAI,SAAS,GAAGqK,GAAS,KAAK,gBAAgBC,CAAI,IAEpDtK,EAAI,YAAY,WAChBA,EAAI,OAAO,QAAQX,CAAmB,MAAMD,CAAkB,IAC9DY,EAAI,YAAY,UAChBA,EAAI,eAAe,UACnBA,EAAI,SAAS,OAAOuK,CAAO,GAAG,KAAK,iBAAiB,GAAGF,IAAUC,IAAO,CAAC,GACzEtK,EAAI,OAAO2I,GACX3I,EAAI,YAAY,QAChBA,EAAI,eAAe,cAEnBA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,OAAO,QAAQ,KAAK;AAAA,UACzB,KAAK,OAAO,SAAS,KAAK;AAAA,QAAA,GAE5BA,EAAI,KAAA,GACJA,EAAI,UAAUoK,GAAa,CAAC;AAC5B,YAAI5Q,IAAI,GACJgR,IAAc;AAClB,iBAAShJ,IAAM,GAAGA,IAAMpN,EAAO,QAAQ,QAAQoN,KAAO,GAAG;AACvD,gBAAM1M,IAAIV,EAAO,QAAQoN,CAAG,GACtB7H,IAAI0I,EAAUb,CAAG,KAAK;AAC5B,cAAI,CAAC1M,GAAG;AACN,YAAA0E,KAAKG;AACL;AAAA,UACF;AACA,gBAAMsL,IAAc,KAAK,UAAU,mBAAmBxQ,EAAI,IAAIK,EAAE,GAAG,GAC7D2V,KAAQxF,EAAY;AAC1B,UAAAjF,EAAI,cAAc;AAClB,gBAAMoE,KAAU,KAAK,UAAU,wBAAwB3P,EAAI,IAAIK,CAAC,GAC1DuP,KAAY,KAAK,UAAU,aAAa5P,EAAI,IAAIK,EAAE,GAAG,GACrD0P,KAAYjC,EAAcf,CAAG,KAAK,CAAA,GAClCiD,KAAWL,GAAQ,QAAQM,GAAWF,IAAWJ,GAAQ,KAAK,IAAII,IAClEkG,IAAcrG,KAAYK,GAAWD,IAAUJ,EAAS,IAAII,IAG5DkG,KADmBvW,EAAO,QAAQ,KAAK,CAACwW,MAAOA,KAAMA,EAAG,SAAS,aAAaA,EAAG,UAAU,KAAK,UAAU,QAAQnW,EAAI,IAAImW,EAAG,GAAG,MAAM,EAAI,IAClH,0BAA2BH,KAAQ,YAAaC,EAAY,mBAAmB;AAC7G,UAAA1K,EAAI,YAAY2K,IAChB3K,EAAI,SAASxG,GAAG6Q,GAAS1Q,GAAG2Q,CAAI,GAChCtK,EAAI,WAAWxG,GAAG6Q,GAAS1Q,GAAG2Q,CAAI;AAClC,gBAAMxF,IAAW,KAAK,UAAU,iBAAiBrQ,EAAI,IAAIK,CAAC,GACpDiQ,KAAeD,EAAS,iBAAiBV,GAAQ,iBAAiB,WAAW,SAC7EY,KAAYD,KAAe,EAAE,MAAM,SAAA,IAAa,KAAK,YAAYD,EAAS,OAAOhQ,CAAC,GAClFqQ,KAAerQ,EAAE,SAAS,YAAYA,EAAE,SAAS,QACjDsQ,KAAcD,KAChBrQ,EAAE,SAAS,WACTuQ,GAAoBP,EAAS,KAAK,IAClCQ,GAAkBR,EAAS,KAAK,IAClC,MACES,KAAcJ,KAChBC,IAAa,UAAUtQ,EAAE,SAAS,WAAW0Q,GAAeV,EAAS,KAAK,IAAIW,GAAaX,EAAS,KAAK,KACzG,IACE+F,KAAe,GAAQ1F,MAAgBC,MAAeG,MAAe,CAACR;AAE5E,cAAIsB,KAAOd,MAAeP,GAAU;AACpC,UAAIlQ,EAAE,SAAS,aAAaA,EAAE,WAG5BuR,KAFYvB,EAAS,UAAU,MAAQA,EAAS,UAAU,UAAUA,EAAS,UAAU,OAAOA,EAAS,UAAU,IAEpG,OAAO;AAEtB,gBAAMkB,KAAQlR,EAAE,OAAO,UAAUA,EAAE,SAAS,WAAW,UAAU;AAKjE,cAHE,KAAK,gBAAgBL,EAAI,MACzB,KAAK,iBAAiB,QACtB,KAAK,iBAAiBK,EAAE,QAExBkL,EAAI,cAAc,WAClBA,EAAI,YAAY,GAChBA,EAAI,WAAWxG,IAAI,GAAG6Q,IAAU,GAAG1Q,IAAI,GAAG2Q,IAAO,CAAC,GAClDtK,EAAI,YAAY,GAEdjB;AAAA,YACE,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK,YAAA;AAAA,UAAY,IAEnB;AACA,kBAAMH,IAAOJ,IACPsM,KAAOtR,IAAIG,IAAIiF,IAAO,GACtBmM,IAAMV,IAAUC,IAAO1L,IAAO;AACpC,YAAAoB,EAAI,YAAY,WAChBA,EAAI,SAAS8K,IAAMC,GAAKnM,GAAMA,CAAI,GAClCoB,EAAI,cAAc,WAClBA,EAAI,WAAW8K,KAAO,KAAKC,IAAM,KAAKnM,IAAO,GAAGA,IAAO,CAAC;AAAA,UAC1D;AAEF,gBAAMoM,KACJH,MAAgB/V,EAAE,SAAS,UAAU,CAAC2V,MAAS,CAACC,EAAY,YACxD,YACA,QACAO,KAAmB,KAAK,YAAA,MAAkB,YAC1CC,KAAuB,GAAQlG,GAAU,SAAS0F,EAAY,aAAaM,KAC3EG,KACJ,CAACF,MAA4BnW,EAAE,WAAYmQ,EAAY,YAAY,CAACwF,MAAS,CAACS,KAC1E,YACA;AACN,UAAAlL,EAAI,YAAY,KAAK,UAAU,WAAWvL,EAAI,IAAIK,EAAE,GAAG,IACnD,YACAkQ,GAAU,QACRA,GAAU,QACVyF,KACE,YACCO,MAAeN,EAAY,aAAaS,MAAwB;AACzE,gBAAMrH,KAAOtE,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,YAAY,IAC/CsW,KAAYtW,EAAE,SAAS,cAAc,CAACA,EAAE,UAAUA,EAAE,WAAW,aAC/DuW,KAAkBvW,EAAE,SAAS,aAAa,GAAQA,EAAE,UAAUA,EAAE,WAAW;AACjF,cAAKsW;AAeH,YAAApL,EAAI,OAAO2I,GACX6B,IAAc;AAAA,eAhBA;AACd,kBAAMc,IAAU,GAAGZ,EAAY,SAAS,MAAM,EAAE,GAAGA,EAAY,OAAO,MAAM,EAAE;AAC9E,gBAAIY,MAAYd,GAAa;AAC3B,oBAAMjK,KAASsI,EAAU,IAAIyC,CAAO;AACpC,kBAAI/K,MAAY,OAAOA;AAAA,mBAClB;AACH,sBAAMgL,IAASb,EAAY,OAAO,SAAS,IAErCnU,KAAI,GADGmU,EAAY,SAAS,YAAY,EAC7B,GAAGa,CAAM,GAAGlM,CAAmB,MAAMD,CAAkB,GAAG,KAAA;AAC3E,gBAAAyJ,EAAU,IAAIyC,GAAS/U,EAAC,GACxByJ,EAAI,OAAOzJ;AAAA,cACb;AACA,cAAAiU,IAAcc;AAAA,YAChB;AAAA,UACF;AAIA,gBAAME,KAAYhS,IAAIiS,IAChBC,KAAYrB,IAAU5D,IACtBkF,KAAY,KAAK,IAAI,GAAGhS,IAAI8R,KAAoB,CAAC,GACjDG,KAAY,KAAK,IAAI,GAAGtB,KAAQ7D,KAAsBC,GAAuB,GAC7EmF,KAAc;AAAA,YAClB,WAAW,EAAQnB,EAAY,aAAeG,MAAgB/V,EAAE,SAAS;AAAA,YACzE,QAAQ,EAAQ4V,EAAY;AAAA,UAAM,GAE9BoB,KACJjB,MAAgB,CAACO,KACb,KAAK;AAAA,YACHpL;AAAA,YACAqG;AAAA,YACAmF;AAAA,YACAE;AAAA,YACAC;AAAA,YACAC;AAAA,YACA9H;AAAA,YACAkC;AAAA,UAAA,IAEF;AACN,cAAI6E,MAAgB/V,EAAE,SAAS,YAAYgX,IAAc;AAGvD,kBAAMhB,IAAO,KAAK,IAAIU,IAAWM,GAAa,IAAI,CAAI,GAChDf,KAAM,KAAK,IAAIW,IAAWI,GAAa,IAAI,CAAI,GAC/CC,KAAQ,KAAK,IAAIP,KAAYG,IAAWG,GAAa,IAAIA,GAAa,QAAQ,CAAI,GAClFE,KAAS,KAAK,IAAIN,KAAYE,IAAWE,GAAa,IAAIA,GAAa,SAAS,CAAI,GACpFG,KAAK,KAAK,IAAI,GAAGF,KAAQjB,CAAI,GAC7BoB,KAAK,KAAK,IAAI,GAAGF,KAASjB,EAAG;AACnC,YAAA/K,EAAI,KAAA;AACJ,kBAAMmM,KAAY,GAAG1X,EAAI,EAAE,KAAKK,EAAE,GAAG,YAC/BsX,KAAU,KAAK,mBAAmBD,IAClCE,KAAW,KAAK,oBAAoBF;AAC1C,YAAI1B,MACFzK,EAAI,YAAY,WAChBA,EAAI,cAAc,aACTqM,MACTrM,EAAI,YAAY,WAChBA,EAAI,cAAc,aACToM,MACTpM,EAAI,YAAY,WAChBA,EAAI,cAAc,cAElBA,EAAI,YAAY,WAChBA,EAAI,cAAc,YAEpBA,EAAI,YAAY,GAChBA,EAAI,UAAA,GACA,OAAOA,EAAI,aAAc,aAC3BA,EAAI,UAAU8K,GAAMC,IAAKkB,IAAIC,IAAI,CAAC,IAElClM,EAAI,KAAK8K,GAAMC,IAAKkB,IAAIC,EAAE,GAE5BlM,EAAI,KAAA,GACJA,EAAI,OAAA,GACJA,EAAI,QAAA;AAAA,UACN;AACA,eAAK;AAAA,YACHA;AAAA,YACAqG;AAAA,YACAmF;AAAA,YACAE;AAAA,YACAC;AAAA,YACAC;AAAA,YACA9H;AAAA,YACAkC;AAAA,YACAoF;AAAA,YACAC;AAAA,YACA,EAAQvW,EAAE;AAAA,YACV+W;AAAA,UAAA;AAEF,gBAAM9F,KAAS,KAAK,UAAU,cAActR,EAAI,IAAIK,EAAE,GAAG;AACzD,UAAIiR,SAA6B/F,GAAKxG,GAAG6Q,GAAS1Q,GAAG2Q,GAAMvE,GAAO,KAAK,GACvEvM,KAAKG;AAAA,QACP;AACA,QAAAqG,EAAI,QAAA,GACJqK,KAAWC;AAAA,MACb;AAGA,MAAAtK,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,YAAY,GACvDA,EAAI,cAAc,WAElBA,EAAI,WAAW,GAAG,GAAG,KAAK,gBAAgB,KAAK,YAAY,GAC3DA,EAAI,YAAY,WAChBA,EAAI,UAAA,GACJA,EAAI,OAAO,GAAG,CAAC,GACfA,EAAI,OAAO,IAAI,CAAC,GAChBA,EAAI,OAAO,GAAG,EAAE,GAChBA,EAAI,UAAA,GACJA,EAAI,KAAA,GACA,KAAK,gBACPA,EAAI,YAAY,yBAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,gBAAgB,KAAK,YAAY,IAG3DA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,KAAK,KAAK,gBAAgB,GAAG,KAAK,OAAO,QAAQ,KAAK,gBAAgB,KAAK,YAAY,GAC3FA,EAAI,KAAA,GACJA,EAAI,UAAUoK,GAAa,CAAC;AAC5B,UAAIkC,IAAU;AACd,eAAS9K,IAAM,GAAGA,IAAMpN,EAAO,QAAQ,QAAQoN,KAAO,GAAG;AACvD,cAAM1M,IAAIV,EAAO,QAAQoN,CAAG,GACtB7H,IAAI0I,EAAUb,CAAG,KAAK;AAC5B,YAAI,CAAC1M,GAAG;AACN,UAAAwX,KAAW3S;AACX;AAAA,QACF;AAEA,QADoB,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB7E,EAAE,QAExEkL,EAAI,YAAY,yBAChBA,EAAI,SAASsM,GAAS,GAAG3S,GAAG,KAAK,YAAY,IAE/CqG,EAAI,cAAc,WAClBA,EAAI,WAAWsM,GAAS,GAAG3S,GAAG,KAAK,YAAY,GAC/CqG,EAAI,YAAY,WAChBA,EAAI,OAAO,QAAQX,CAAmB,MAAMD,CAAkB,IAC9DY,EAAI,SAASlL,EAAE,UAAUA,EAAE,KAAKwX,IAAU,GAAG,KAAK,eAAe,CAAC,GAClEtM,EAAI,OAAO2I;AAEX,cAAM/E,IAAUrE,GAAiBC,GAAM1K,EAAE,GAAG,GACtC+O,IAAYpE,GAAsBD,GAAM1K,EAAE,GAAG,GAC7CsX,IAAU,KAAK,sBAAsB,QAAQ,KAAK,sBAAsBtX,EAAE;AAEhF,YADiB,EAAQ8O,KAAYC,KAAauI,GACpC;AACZ,gBAAMzL,IAAQyL,IAAU,MAAMvI,KAAaD,IAAU,OAAO,MACtD2I,IAAU,IAEVC,KAAKF,IAAU3S,IAAI4S,IADb,GAENE,KAAK,KAAK,OAAO,KAAK,eAAeF,KAAW,CAAC;AACvD,UAAI3I,IACFhD,GAAkBZ,GAAKwM,KAAK,GAAGC,KAAK,GAAGF,IAAU,GAAG5L,GAAOiD,CAAO,IAElElD,GAAeV,GAAKwM,KAAK,GAAGC,KAAK,GAAGF,IAAU,GAAG5L,CAAK;AAAA,QAE1D;AACA,QAAA2L,KAAW3S;AAAA,MACb;AAIA,UAHAqG,EAAI,QAAA,GAGA,KAAK,UAAU,QAAQ;AACzB,QAAAA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,OAAO,QAAQ,KAAK;AAAA,UACzB,KAAK,OAAO,SAAS,KAAK;AAAA,QAAA,GAE5BA,EAAI,KAAA,GACJA,EAAI,cAAc,WAClBA,EAAI,YAAY;AAChB,mBAAW/C,KAAS,KAAK,WAAW;AAClC,gBAAM4J,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI5J,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D6J,IAAS,KAAK,IAAIzS,EAAK,SAAS,GAAG,KAAK,IAAI4I,EAAM,UAAUA,EAAM,MAAM,CAAC,GACzE8J,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI9J,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D+J,IAAS,KAAK;AAAA,YAClB5S,EAAO,QAAQ,SAAS;AAAA,YACxB,KAAK,IAAI6I,EAAM,UAAUA,EAAM,MAAM;AAAA,UAAA,GAEjCyP,IAAO,KAAK,eAAe1D,EAAY,QAAQ,IAAInC,CAAQ,IAAIoD,GAC/DzM,IAASwL,EAAY,QAAQ,IAAIlC,IAAS,CAAC,IAAIkC,EAAY,QAAQ,IAAInC,CAAQ;AACrF,cAAI8F,IAAQ,KAAK;AACjB,mBAAS7X,IAAI,GAAGA,IAAIiS,GAAUjS,KAAK;AACjC,YAAA6X,KAAStK,EAAUvN,CAAC,KAAK;AAE3B,cAAIyI,IAAQ;AACZ,mBAASzI,IAAIiS,GAAUjS,KAAKkS,GAAQlS,KAAK;AACvC,YAAAyI,KAAS8E,EAAUvN,CAAC,KAAK;AAE3B,UAAA6X,KAASrD,GACTtJ,EAAI,SAAS2M,GAAOD,GAAMnP,GAAOC,CAAM,GACvCwC,EAAI,WAAW2M,IAAQ,KAAKD,IAAO,KAAKnP,IAAQ,GAAGC,IAAS,CAAC;AAAA,QAC/D;AACA,QAAAwC,EAAI,QAAA;AAAA,MACN;AAEA,MAAI4I,MACF5I,EAAI,KAAA,GACJA,EAAI,YAAY,yBAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GACxDA,EAAI,QAAA;AAAA,IAER,QAAQ;AAGN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AACR,SAAK,2BAAA,GACL,KAAK,cAAc,MACf,KAAK,WACP,KAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB,GACrE,KAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB,GACrE,KAAK,OAAO,oBAAoB,aAAa,KAAK,eAAe,GACjE,KAAK,OAAO,oBAAoB,gBAAgB,KAAK,kBAAkB,GACvE,KAAK,OAAO,oBAAoB,SAAS,KAAK,WAAW,IAEvD,KAAK,gBACP,OAAO,aAAa,KAAK,WAAW,GACpC,KAAK,cAAc,OAErB,KAAK,qBAAqB,MAC1B8C,EAAiB,KAAK,MAAM,GAC5BA,EAAiB,KAAK,MAAM,GAC5BA,EAAiB,KAAK,YAAY,GAClCA,EAAiB,KAAK,OAAO,GAC7B,KAAK,SAAS,MACd,KAAK,SAAS,MACd,KAAK,eAAe,MACpB,KAAK,UAAU,MACf,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MACtB,KAAK,OAAO;AAAA,EACd;AAAA,EAEQ,kBAAkBzO,GAAqBgM,GAAoByI,GAAkB;AACnF,UAAM8D,IAAW,KAAK;AACtB,QAAIA,KAAYA,EAAS,YAAYvY,KAAQuY,EAAS,QAAQvM,EAAK;AACnE,UAAMwM,IAAU,IAAI,MAAMxY,EAAK,MAAM,GAC/ByY,wBAAgB,IAAA;AACtB,aAAS5W,IAAI,GAAGA,IAAI7B,EAAK,QAAQ6B,KAAK,GAAG;AACvC,YAAMzB,IAAMJ,EAAK6B,CAAC;AAClB,UAAI,CAACzB,EAAK;AACV,MAAAqY,EAAU,IAAIrY,EAAI,IAAIyB,CAAC;AACvB,UAAIyG,IAAI,KAAK;AACb,UAAImM,KAAWzI,GAAK;AAClB,cAAMiG,IAAU,KAAK,UAAU,cAAc7R,EAAI,EAAE,GAC7CsY,IAAkB,KAAK,yBAAyB,IAAItY,EAAI,EAAE,GAC1DuY,IAAe,KAAK,UAAU,aAAavY,EAAI,EAAE;AACvD,QAAIsY,MAAoBzG,KAAW,OAAO0G,KAAiB,aAAUrQ,IAAIqQ;AAAA,MAC3E;AACA,MAAAH,EAAQ3W,CAAC,IAAIyG;AAAA,IACf;AACA,SAAK,cAAc;AAAA,MACjB,KAAA0D;AAAA,MACA,SAAShM;AAAA,MACT,WAAAyY;AAAA,MACA,SAAAD;AAAA,MACA,SAAS5L,GAAY,KAAK4L,CAAO;AAAA,IAAA;AAAA,EAErC;AAAA,EAEQ,sBAAsB3C,GAAiC;AAC7D,UAAMjG,IAAQ,KAAK;AACnB,QAAKA;AACL,iBAAW,CAACrP,GAAOyJ,CAAI,KAAK,OAAO,QAAQ6L,CAAO,GAAG;AACnD,cAAMhU,IAAI+N,EAAM,UAAU,IAAIrP,CAAK;AACnC,YAAIsB,MAAM,OAAW;AACrB,cAAM+W,IAAOhJ,EAAM,QAAQ/N,CAAC,KAAK,KAAK;AACtC,QAAI+W,MAAS5O,MACb4F,EAAM,QAAQ/N,CAAC,IAAImI,GACnB4F,EAAM,QAAQ,IAAI/N,GAAGmI,IAAO4O,CAAI;AAAA,MAClC;AAAA,EACF;AAAA,EAEQ,qBAAqB7Y,GAAgBoL,GAAY6C,GAAqB;AAC5E,UAAM6K,IAAQ9Y,EAAO,QAClB,IAAI,CAACU,MAAQ0K,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,WAAY,MAAM,GAAI,EAC/D,KAAK,EAAE,GACJqY,IAAS9K,EAAU,IAAI,CAAC1I,MAAM,OAAOA,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAC5D,WAAO,GAAGuT,CAAK,IAAIC,CAAM;AAAA,EAC3B;AAAA,EAEQ,6BAA6B;AACnC,IAAI,KAAK,wBAAwB,SAC/B,qBAAqB,KAAK,mBAAmB,GAC7C,KAAK,sBAAsB,OAE7B,KAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,+BAA+B;AACrC,IAAI,KAAK,wBAAwB,SACjC,KAAK,sBAAsB,sBAAsB,MAAM;AACrD,WAAK,sBAAsB,MAC3B,KAAK,wBAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,0BAA0B;AAChC,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAMnN,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA,EAAK;AACV,IAAAA,EAAI,OAAO,GAAGX,CAAmB,MAAMD,CAAkB;AACzD,UAAMhL,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtB6C,IAAYC,EAAgBlO,GAAQoL,CAAI;AAE9C,QAAI,CADYpL,EAAO,QAAQ,KAAK,CAACU,MAAM0K,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,QAAQ,EACjE;AACd,UAAMuL,IAAM,KAAK,qBAAqBjM,GAAQoL,GAAM6C,CAAS;AAC7D,IAAI,KAAK,sBAAsBhC,MAC7B,KAAK,oBAAoBA,GACzB,KAAK,yBAAyB,MAAA,GAC9B,KAAK,uBAAuB;AAE9B,UAAM+M,IAAO,KAAK,wBAAwB,EAAE,KAAA/M,GAAK,WAAW,EAAA;AAC5D,QAAI+M,EAAK,QAAQ/M,EAAK;AAEtB,UAAMhM,IAAO,KAAK,UAAU,SAAA,GACtB6V,IAAkC,CAAA;AACxC,QAAImD,IAAW;AACf,UAAMC,IAAQ,YAAY,IAAA;AAC1B,WAAOF,EAAK,YAAY/Y,EAAK,UAAUgZ,IAAWxF,EAAe,4BAC3D,cAAY,IAAA,IAAQyF,IAAQzF,EAAe,sCAD0C;AAEzF,YAAMpT,IAAMJ,EAAK+Y,EAAK,SAAS;AAE/B,UADAA,EAAK,aAAa,GACd,CAAC3Y,EAAK;AACV,YAAM6R,IAAU,KAAK,UAAU,cAAc7R,EAAI,EAAE;AACnD,UAAI,KAAK,yBAAyB,IAAIA,EAAI,EAAE,MAAM6R,EAAS;AAC3D,YAAM3J,IAAI,KAAK,iBAAiBqD,GAAKvL,GAAKL,GAAQiO,CAAS;AAC3D,MAAA6H,EAAQzV,EAAI,EAAE,IAAIkI,GAClB,KAAK,yBAAyB,IAAIlI,EAAI,IAAI6R,CAAO,GACjD+G,KAAY;AAAA,IACd;AACA,SAAK,uBAAuBD,EAAK,YAAY/Y,EAAK,SAAS+Y,IAAO,MAClE,KAAK,kBAAkB/Y,GAAM,KAAK,mBAAmB,EAAI,GACzD,KAAK,sBAAsB6V,CAAO,GAClC,KAAK,UAAU,kBAAkBA,CAAO,GACpC,KAAK,wBAAsB,KAAK,6BAAA;AAAA,EACtC;AAAA,EAwCA,kBAAkB;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQnH,GAAmB;AACzB,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ,QAAO;AACvC,UAAMjE,IAAO,KAAK,OAAO,sBAAA,GAGnBmJ,IAAYlF,EAAM,UAAUjE,EAAK,MACjCoJ,IAAYnF,EAAM,UAAUjE,EAAK,KACjCtF,IAAIyO,IAAY,KAAK,KAAK,YAC1B7T,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtBnL,IAAO,KAAK,UAAU,SAAA,GACtBkZ,IAAe,KAAK,cACpBlL,IAAYC,EAAgBlO,GAAQoL,CAAI,GACxCsJ,IAAU1U,EAAO,QAAQ,KAAK,CAACU,MAAM0K,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,QAAQ,GACzEuL,IAAMyI,IAAU,KAAK,qBAAqB1U,GAAQoL,GAAM6C,CAAS,IAAI;AAC3E,SAAK,kBAAkBhO,GAAMgM,GAAKyI,CAAO;AACzC,UAAME,IAAc,KAAK;AACzB,QAAI,CAACA,EAAa,QAAO;AACzB,UAAMa,IAAkBb,EAAY,QAAQ,MAAA,GACtCc,IAAiB,KAAK,QAAQ,UAAU,KAAK,KAAK,cAClDC,IAAqB,KAAK,IAAI,GAAGD,IAAiB,KAAK,YAAY,GACnEE,IAAsB,KAAK,IAAI,GAAGH,IAAkBE,CAAkB,GACtEE,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,WAAWD,CAAmB,CAAC;AACvF,QAAI9B,IAAYqF,KAAgBtF,IAAY,KAAK;AAC/C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM,IAAI,QAAQnJ,EAAK,MAAMA,EAAK,KAAK,KAAK,gBAAgByO,CAAY;AAAA,MAAA;AAG5E,QAAIrF,IAAYqF,GAAc;AAE5B,UAAIpF,IAAU,KAAK,gBACf3T,IAAW;AACf,eAAS0B,IAAI,GAAGA,IAAImM,EAAU,QAAQnM,KAAK,GAAG;AAC5C,cAAMyD,IAAI0I,EAAUnM,CAAC,KAAK;AAC1B,YAAIsD,KAAK2O,KAAW3O,KAAK2O,IAAUxO,GAAG;AACpCnF,UAAAA,IAAW0B;AACX;AAAA,QACF;AACAiS,QAAAA,KAAWxO;AAAA,MACb;AACA,UAAInF,KAAY,GAAG;AACjB,cAAME,IAAMN,EAAO,QAAQI,CAAQ,GAC7BmK,IAAW,IAAI;AAAA,UACnBG,EAAK,OAAOqJ,IAAU,KAAK,KAAK;AAAA,UAChCrJ,EAAK;AAAA,UACLuD,EAAU7N,CAAQ,KAAK;AAAA,UACvB+Y;AAAA,QAAA;AAEF,eAAO,EAAE,OAAO,cAAc,QAAQ7Y,EAAI,KAAK,MAAMiK,EAAAA;AAAAA,MACvD;AACA,aAAO;AAAA,IACT;AACA,QAAIsJ,IAAY,KAAK,gBAAgB;AACnC,YAAMxO,IAAIyO,IAAYqF,IAAetD,GAC/B1V,IAAW,KAAK;AAAA,QACpB;AAAA,QACA,KAAK,IAAIF,EAAK,SAAS,GAAG2U,EAAY,QAAQ,WAAWvP,IAAI,CAAC,CAAC;AAAA,MAAA,GAE3D+T,IAAcxE,EAAY,QAAQ,IAAIzU,CAAQ;AACpD,UAAIA,IAAW,KAAKA,KAAYF,EAAK,OAAQ,QAAO;AACpD,YAAMI,IAAMJ,EAAKE,CAAQ,GACnBkZ,IAAQ3O,EAAK,MAAMyO,IAAeC,IAAcvD,GAChDtL,IAAW,IAAI;AAAA,QACnBG,EAAK;AAAA,QACL2O;AAAA,QACA,KAAK;AAAA,QACLzE,EAAY,QAAQzU,CAAQ,KAAK,KAAK;AAAA,MAAA;AAExC,aAAO,EAAE,OAAOE,EAAI,IAAI,QAAQ,MAAM,MAAMkK,EAAAA;AAAAA,IAC9C;AACA,UAAM,IAAIuJ,IAAYqF,IAAetD,GAC/B1V,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIF,EAAK,SAAS,GAAG2U,EAAY,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC,GACvFwE,IAAcxE,EAAY,QAAQ,IAAIzU,CAAQ;AACpD,QAAIA,IAAW,KAAKA,KAAYF,EAAK,OAAQ,QAAO;AACpD,QAAI8T,IAAU,KAAK,gBACf3T,IAAW;AACf,aAAS0B,IAAI,GAAGA,IAAImM,EAAU,QAAQnM,KAAK,GAAG;AAC5C,YAAMyD,IAAI0I,EAAUnM,CAAC,KAAK;AAC1B,UAAIsD,KAAK2O,KAAW3O,KAAK2O,IAAUxO,GAAG;AACpC,QAAAnF,IAAW0B;AACX;AAAA,MACF;AACA,MAAAiS,KAAWxO;AAAA,IACb;AACA,QAAInF,MAAa,GAAI,QAAO;AAC5B,UAAMC,IAAMJ,EAAKE,CAAQ,GACnBG,IAAMN,EAAO,QAAQI,CAAQ,GAC7BkZ,IAASF,GACT7O,IAAW,IAAI;AAAA,MACnBG,EAAK,OAAOqJ,IAAU,KAAK,KAAK;AAAA,MAChCrJ,EAAK,MAAMyO,IAAeG,IAAS,KAAK,KAAK;AAAA,MAC7CrL,EAAU7N,CAAQ,KAAK;AAAA,MACvBwU,EAAY,QAAQzU,CAAQ,KAAK,KAAK;AAAA,IAAA;AAExC,WAAO,EAAE,OAAOE,EAAI,IAAI,QAAQC,EAAI,KAAK,MAAMiK,EAAA;AAAA,EACjD;AAAA,EAEA,cAAcoE,GAAmB;AAC/B,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ,QAAO;AACvC,UAAM4K,IAAM,KAAK,QAAQ5K,CAAK;AAE9B,QADI,CAAC4K,KAAO,CAACA,EAAI,SAAS,CAACA,EAAI,UAC3BA,EAAI,UAAU,aAAaA,EAAI,UAAU,aAAc,QAAO;AAElE,UAAMjZ,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACI,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO6Y,EAAI,MAAM,CAAC;AAC3E,QAAI,CAACjZ,KAAQA,EAAI,SAAS,YAAYA,EAAI,SAAS,OAAS,QAAO;AACnE,UAAMoQ,IAAW,KAAK,UAAU,iBAAiB6I,EAAI,OAAOjZ,CAAG,GACzD0P,IAAU,KAAK,UAAU,wBAAwBuJ,EAAI,OAAOjZ,CAAG;AAErE,QADqBoQ,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,QACjE,QAAO;AACzB,UAAMgB,IACJ1Q,EAAI,SAAS,WACT2Q,GAAoBP,EAAS,KAAK,IAClCQ,GAAkBR,EAAS,KAAK;AACtC,QAAI,CAACM,KAAe,CAACA,EAAY,MAAO,QAAO;AAE/C,UAAMpF,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA,EAAK,QAAO;AACjB,UAAMwE,IAAYhC,GAAoB9N,CAAG,GACnC+P,IAAWL,EAAQ,QAAQM,GAAWF,GAAWJ,EAAQ,KAAK,IAAII,GAClEH,IAAY,KAAK,UAAU,aAAasJ,EAAI,OAAOjZ,EAAI,GAAG,GAC1DgW,IAAcrG,IAAYK,GAAWD,GAAUJ,CAAS,IAAII,GAC5D8G,IAASb,EAAY,OAAO,SAAS,IACrCkD,IAAOlD,EAAY,SAAS,YAAY;AAC9C,IAAA1K,EAAI,KAAA,GACJA,EAAI,OAAO,GAAG4N,CAAI,GAAGrC,CAAM,GAAGlM,CAAmB,MAAMD,CAAkB,GAAG,KAAA,GAC5EY,EAAI,eAAe;AAEnB,UAAM8D,IADO,KAAK,UAAU,QAAA,EACV,WAAWpP,EAAI,GAAG,KAAKA,EAAI,YAAY,IACnDsR,IAAQtR,EAAI,OAAO,SAAS,QAC5B8W,IAAYmC,EAAI,KAAK,OAAOlC,IAC5BC,IAAYiC,EAAI,KAAK,MAAMlH,IAC3BkF,IAAY,KAAK,IAAI,GAAGgC,EAAI,KAAK,QAAQlC,KAAoB,CAAC,GAC9DG,IAAY,KAAK;AAAA,MACrB;AAAA,MACA+B,EAAI,KAAK,UAAUlH,KAAsBC;AAAA,IAAA,GAErCmH,IAAS,KAAK;AAAA,MAClB7N;AAAA,MACAoF,EAAY;AAAA,MACZoG;AAAA,MACAE;AAAA,MACAC;AAAA,MACAC;AAAA,MACA9H;AAAA,MACAkC;AAAA,IAAA;AAGF,QADAhG,EAAI,QAAA,GACA,CAAC6N,EAAQ,QAAO;AACpB,UAAMC,IAAMpZ,EAAI,SAAS,WAAW,IAAI,GAClCoW,IAAO,KAAK,IAAI6C,EAAI,KAAK,MAAME,EAAO,IAAIC,CAAG,GAC7C/C,IAAM,KAAK,IAAI4C,EAAI,KAAK,KAAKE,EAAO,IAAIC,CAAG,GAC3C/B,IAAQ,KAAK,IAAI4B,EAAI,KAAK,OAAOE,EAAO,IAAIA,EAAO,QAAQC,CAAG,GAC9D9B,IAAS,KAAK,IAAI2B,EAAI,KAAK,QAAQE,EAAO,IAAIA,EAAO,SAASC,CAAG;AACvE,WACE/K,EAAM,WAAW+H,KACjB/H,EAAM,WAAWgJ,KACjBhJ,EAAM,WAAWgI,KACjBhI,EAAM,WAAWiJ,IAEV,EAAE,OAAO2B,EAAI,OAAO,QAAQ,OAAOA,EAAI,MAAM,GAAG,MAAMjZ,EAAI,KAAA,IAE5D;AAAA,EACT;AAAA,EAEQ,mBAAmBE,GAAeC,GAAgB;AACxD,QAAI,CAAC,KAAK,UAAU,OAAQ,QAAO;AACnC,UAAMT,IAAS,KAAK,UAAU,UAAA,GACxBG,IAAW,KAAK,UAAU,YAAYK,CAAK,GAC3CJ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAMA,EAAE,QAAQD,CAAM;AACjE,QAAIN,IAAW,KAAKC,IAAW,EAAG,QAAO;AACzC,eAAWyI,KAAS,KAAK,WAAW;AAClC,UAAIA,EAAM,SAAS,QAAS;AAC5B,YAAM4J,IAAW,KAAK,IAAI5J,EAAM,UAAUA,EAAM,MAAM,GAChD6J,IAAS,KAAK,IAAI7J,EAAM,UAAUA,EAAM,MAAM,GAC9C8J,IAAW,KAAK,IAAI9J,EAAM,UAAUA,EAAM,MAAM,GAChD+J,IAAS,KAAK,IAAI/J,EAAM,UAAUA,EAAM,MAAM;AACpD,UAAI1I,KAAYsS,KAAYtS,KAAYuS,KAAUtS,KAAYuS,KAAYvS,KAAYwS;AACpF,eAAO;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAAA,EAgDQ,sBAAsBlI,GAAe;AAE3C,QADI,CAAC,KAAK,WACN,CAAC,KAAK,KAAM;AAChB,UAAMgP,IAAM,GACNC,IAAW,KAAK,KAAK,sBAAA,GACrBC,IAAO,KAAK,KAAK,aACjBC,IAAO,KAAK,KAAK;AACvB,QAAInD,IAAOhM,EAAK,QAAQiP,EAAS,OAAOD,GACpC/C,IAAMjM,EAAK,MAAMiP,EAAS,MAAMD,GAChCI,IAAyB;AAC7B,UAAMC,IAAQ,KAAK,QAAQ,sBAAA;AAC3B,IAAIrD,IAAOqD,EAAM,QAAQH,MACvBlD,IAAO,KAAK,IAAI,GAAGhM,EAAK,OAAOiP,EAAS,OAAOI,EAAM,QAAQL,CAAG,GAChEI,IAAO,SAELnD,IAAMoD,EAAM,SAASF,MAAMlD,IAAM,KAAK,IAAI,GAAGkD,IAAOE,EAAM,SAASL,CAAG,IAC1E,KAAK,QAAQ,MAAM,OAAO,GAAGhD,CAAI,MACjC,KAAK,QAAQ,MAAM,MAAM,GAAGC,CAAG,MAC/B,KAAK,QAAQ,QAAQ,OAAOmD;AAAA,EAC9B;AAAA,EAEQ,yBAAyB;AAE/B,QADI,CAAC,KAAK,WAAW,KAAK,QAAQ,QAAQ,YAAY,OAClD,CAAC,KAAK,iBAAiB,CAAC,KAAK,eAAgB;AACjD,UAAMpP,IAAO,KAAK,YAAY,KAAK,cAAc,OAAO,KAAK,cAAc,MAAM;AACjF,QAAI,CAACA,GAAM;AACT,WAAK,QAAQ,QAAQ,UAAU,KAC/B,KAAK,gBAAgB,MACrB,KAAK,iBAAiB;AACtB;AAAA,IACF;AACA,SAAK,QAAQ,cAAc,KAAK,gBAChC,KAAK,sBAAsBA,CAAI;AAAA,EACjC;AAAA,EAEQ,YAAYlK,GAAeC,GAAgC;AACjE,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ,QAAO;AACvC,UAAMiK,IAAO,KAAK,OAAO,sBAAA,GACnB1K,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtBnL,IAAO,KAAK,UAAU,SAAA,GACtBE,IAAW,KAAK,UAAU,YAAYK,CAAK,GAC3CJ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAMA,EAAE,QAAQD,CAAM;AACjE,QAAIN,IAAW,KAAKC,IAAW,EAAG,QAAO;AACzC,UAAM6N,IAAYC,EAAgBlO,GAAQoL,CAAI,GACxCsJ,IAAU1U,EAAO,QAAQ,KAAK,CAACU,MAAM0K,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,QAAQ,GACzEuL,IAAMyI,IAAU,KAAK,qBAAqB1U,GAAQoL,GAAM6C,CAAS,IAAI;AAC3E,SAAK,kBAAkBhO,GAAMgM,GAAKyI,CAAO;AACzC,UAAME,IAAc,KAAK;AACzB,QAAI,CAACA,EAAa,QAAO;AACzB,UAAMwE,IAAcxE,EAAY,QAAQ,IAAIzU,CAAQ;AACpD,QAAI4T,IAAU,KAAK;AACnB,aAASjS,IAAI,GAAGA,IAAI1B,GAAU0B,KAAK;AACjC,MAAAiS,KAAW9F,EAAUnM,CAAC,KAAK;AAE7B,WAAO,IAAI;AAAA,MACT4I,EAAK,OAAOqJ,IAAU,KAAK,KAAK;AAAA,MAChCrJ,EAAK,MAAM,KAAK,eAAe0O,IAAc,KAAK,KAAK;AAAA,MACvDnL,EAAU7N,CAAQ,KAAK;AAAA,MACvBwU,EAAY,QAAQzU,CAAQ,KAAK,KAAK;AAAA,IAAA;AAAA,EAE1C;AAAA,EAEQ,mBAAmB6Z,GAAiBC,GAAiB;AAC3D,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ;AAChC,QAAI,KAAK,KAAK,QAAQ,wBAAwB,KAAK;AACjD,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAEA;AACE,YAAMvP,IAAO,KAAK,OAAO,sBAAA,GACnBmJ,IAAYmG,IAAUtP,EAAK,MAC3BoJ,IAAYmG,IAAUvP,EAAK,KAC3BtF,IAAIyO,IAAY,KAAK,KAAK,YAC1BxO,IAAIyO,GACJoG,IAAU,KAAK,mBACfC,IAAW,KAAK;AACtB,UAAI/F,IAAyB,MACzBgG,IAAW;AACf,UAAI/U,KAAK,KAAKA,IAAI,KAAK,gBAAgBD,KAAK,KAAK,gBAAgB;AAC/D,cAAMpF,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtB6C,IAAYC,EAAgBlO,GAAQoL,CAAI;AAC9C,YAAI2I,IAAU,KAAK,gBACf3T,IAAW;AACf,iBAAS0B,IAAI,GAAGA,IAAImM,EAAU,QAAQnM,KAAK,GAAG;AAC5C,gBAAMyD,IAAI0I,EAAUnM,CAAC,KAAK;AAC1B,cAAIsD,KAAK2O,KAAW3O,KAAK2O,IAAUxO,GAAG;AACpC,YAAAnF,IAAW0B;AACX;AAAA,UACF;AACA,UAAAiS,KAAWxO;AAAA,QACb;AACA,cAAMjF,IAAMF,KAAY,IAAIJ,EAAO,QAAQI,CAAQ,IAAI;AACvD,YAAIE,GAAK;AACP,UAAA8T,IAAU9T,EAAI;AACd,gBAAMiF,IAAI0I,EAAU7N,CAAQ,KAAK,KAC3B4T,IAAW,IAEXC,IAAWF,IAAUxO,IAAIyO,IADnB,GAENE,IAAU,KAAK,OAAO,KAAK,eAAeF,KAAY,CAAC;AAC7D,UAAAoG,IACEhV,KAAK6O,KAAY7O,KAAK6O,IAAWD,KAAY3O,KAAK6O,KAAW7O,KAAK6O,IAAUF;AAAA,QAChF;AAAA,MACF;AACA,YAAMqG,IACJ,OAAOH,KAAW,EAAE,MAAM,OAAO9F,KAAW,EAAE,KAAK,EAAQ+F,KAAc,EAAQC;AAGnF,UAFA,KAAK,oBAAoBhG,GACzB,KAAK,kBAAkBgG,GACnBhG,MAAY,MAAM;AACpB,aAAK,OAAO,MAAM,SAASgG,IAAW,YAAY,WAC9C,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MAClBC,UAAc,OAAA;AAClB;AAAA,MACF;AACA,MAAIA,UAAc,OAAA;AAAA,IACpB;AAMA,QAAIC,IAAS;AAEb,UAAMf,IAAM,KAAK,QAAQ,IAAI,WAAW,aAAa,EAAE,SAAAS,GAAS,SAAAC,EAAA,CAAS,CAAC;AAC1E,QAAI,CAACV,GAAK;AACR,WAAK,OAAO,MAAM,SAASe,GACvB,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MACtB,KAAK,iBAAiB;AACtB;AAAA,IACF;AACA,QAAIf,EAAI,WAAW,aAAaA,EAAI,WAAW,MAAM;AACnD,WAAK,OAAO,MAAM,SAAS,WACvB,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MACtB,KAAK,iBAAiB;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,YAAA,MAAkB,YAAY;AACrC,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAEA,UAAM5H,IAAS,KAAK,UAAU,cAAc4H,EAAI,OAAOA,EAAI,MAAM;AACjE,QAAI,KAAK,WAAW5H,GAAQ;AAC1B,YAAM4I,IACJ,KAAK,iBACL,KAAK,cAAc,UAAUhB,EAAI,SACjC,KAAK,cAAc,WAAWA,EAAI,QAC9BiB,IAAc,KAAK,mBAAmB7I,EAAO;AACnD,UAAI,CAAC4I,KAAY,CAACC,KAAe,KAAK,QAAQ,QAAQ,YAAY,KAAK;AACrE,aAAK,gBAAgB,EAAE,OAAOjB,EAAI,OAAO,QAAQA,EAAI,OAAA,GACrD,KAAK,iBAAiB5H,EAAO,SAC7B,KAAK,QAAQ,cAAcA,EAAO;AAClC,cAAMjH,IAAO,KAAK,YAAY6O,EAAI,OAAOA,EAAI,MAAM;AACnD,QAAI7O,KACF,KAAK,sBAAsBA,CAAI,GAC/B,KAAK,QAAQ,QAAQ,UAAU,OAE/B,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAEnC;AAAA,IACF,MAAA,CAAW,KAAK,YACd,KAAK,QAAQ,QAAQ,UAAU,KAC/B,KAAK,gBAAgB,MACrB,KAAK,iBAAiB;AAGxB,UAAMyJ,IAAY,KAAK,cAAc,IAAI,WAAW,aAAa,EAAE,SAAA6F,GAAS,SAAAC,EAAA,CAAS,CAAC,GAChFQ,IAAetG,IAAY,GAAGA,EAAU,KAAK,KAAKA,EAAU,MAAM,KAAKA,EAAU,IAAI,KAAK;AAKhG,QAJIsG,MAAiB,KAAK,mBACxB,KAAK,iBAAiBA,GACtB,KAAK,OAAA,IAEHtG,KAEE,CADgB,KAAK,UAAU,mBAAmBA,EAAU,OAAOA,EAAU,MAAM,EACtE,UAAU;AACzB,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAGF,QAAI,CAAC,KAAK,mBAAmBoF,EAAI,OAAOA,EAAI,MAAM,GAAG;AACnD,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAOA,QAAI,EAHF,KAAK,gBAAgBA,EAAI,SACzB,KAAK,iBAAiB,QACtB,KAAK,iBAAiBA,EAAI,SACT;AACjB,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAGA,QACE,KAAK,eACL,KAAK,iBAAiB,QACtB,KAAK,gBAAgB,aACrB,KAAK,iBAAiB,aACtB5O;AAAA,MACE,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,YAAA;AAAA,IAAY,GAEnB;AACA,YAAMJ,IAAW,KAAK,YAAY,KAAK,aAAa,KAAK,YAAY;AACrE,UAAIA,GAAU;AACZ,cAAMmQ,IAAapQ,GAAkBC,GAAUF,EAAuB;AACtE,YAAII,GAAcuP,GAASC,GAASS,CAAU,GAAG;AAC/C,eAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAMpa,IAAM,KAAK,UAAU,UAAA,EAAY,QAAQ,KAAK,CAACI,MAAMA,EAAE,QAAQ6Y,EAAI,MAAM;AAE/E,IADoB,KAAK,UAAU,mBAAmBA,EAAI,OAAOA,EAAI,MAAM,EAC3D,YAAYjZ,GAAK,SAAS,YAAWga,IAAS,YACzDA,IAAS,QACd,KAAK,OAAO,MAAM,SAASA;AAAA,EAC7B;AAAA,EAEQ,iBACN1O,GACAvL,GACAL,GACAiO,GACA;AACA,QAAI+D,IAAY,KAAK;AACrB,UAAM5G,IAAO,KAAK,UAAU,QAAA;AAC5B,aAASgC,IAAM,GAAGA,IAAMpN,EAAO,QAAQ,QAAQoN,KAAO,GAAG;AACvD,YAAM1M,IAAIV,EAAO,QAAQoN,CAAG;AAG5B,UAFI,CAAC1M,KAED,EADS0K,EAAK,WAAW1K,EAAE,GAAG,KAAKA,EAAE,UAC9B;AACX,YAAM6E,KAAK0I,EAAUb,CAAG,KAAK,OAAO,KAAK,SACnCsD,IAAW,KAAK,UAAU,iBAAiBrQ,EAAI,IAAIK,CAAC,GACpDsP,IAAU,KAAK,UAAU,wBAAwB3P,EAAI,IAAIK,CAAC,GAE1DuR,IADevB,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,UACvD,WAAW,KAAK,YAAYU,EAAS,OAAOhQ,CAAC,EAAE,MAErE6H,IADQ,KAAK,UAAUqD,GAAKqG,GAAM1M,CAAC,EACzB,SAAS,KAAK,aAAa,KAAK;AAChD,MAAAyM,IAAY,KAAK,IAAIA,GAAWzJ,CAAC;AAAA,IACnC;AACA,WAAOyJ;AAAA,EACT;AAAA,EAEQ,UAAUpG,GAA+BqG,GAAc9I,GAAe;AAC5E,UAAM8C,IAAM,GAAGL,EAAI,IAAI,IAAIzC,CAAK,IAAI8I,CAAI,IAClC9F,IAAS,KAAK,iBAAiB,IAAIF,CAAG;AAC5C,QAAIE;AAEF,kBAAK,iBAAiB,OAAOF,CAAG,GAChC,KAAK,iBAAiB,IAAIA,GAAKE,CAAM,GAC9BA,EAAO;AAEhB,UAAMwO,IAAW1I,EAAK,MAAM;AAAA,CAAI,GAC1B2I,IAAkB,CAAA;AACxB,eAAWC,KAAQF,GAAU;AAC3B,UAAIG,IAAUD;AACd,aAAOjP,EAAI,YAAYkP,CAAO,EAAE,QAAQ3R,KAAS2R,EAAQ,SAAS,KAAG;AACnE,YAAIC,IAAMD,EAAQ;AAClB,eAAOC,IAAM,KAAKnP,EAAI,YAAYkP,EAAQ,MAAM,GAAGC,CAAG,CAAC,EAAE,QAAQ5R;AAC/D,UAAA4R,KAAO;AAET,QAAAH,EAAM,KAAKE,EAAQ,MAAM,GAAGC,CAAG,CAAC,GAChCD,IAAUA,EAAQ,MAAMC,CAAG;AAAA,MAC7B;AACA,MAAAH,EAAM,KAAKE,CAAO;AAAA,IACpB;AAEA,SADA,KAAK,iBAAiB,IAAI7O,GAAK,EAAE,OAAA2O,GAAO,GACjC,KAAK,iBAAiB,OAAOnH,EAAe,0BAAwB;AACzE,YAAMuH,IAAW,KAAK,iBAAiB,KAAA,EAAO,OAAO;AACrD,UAAI,CAACA,EAAU;AACf,WAAK,iBAAiB,OAAOA,CAAQ;AAAA,IACvC;AACA,WAAOJ;AAAA,EACT;AAAA,EAEQ,YAAYhP,GAA+BqG,GAAc9I,GAAe;AAC9E,QAAIzJ,IAAMuS;AACV,WAAOrG,EAAI,YAAYlM,CAAG,EAAE,QAAQyJ,KAASzJ,EAAI,SAAS;AACxD,MAAAA,IAAM,GAAGA,EAAI,MAAM,GAAG,EAAE,CAAC;AAE3B,WAAOA;AAAA,EACT;AAAA,EAEQ,sBACNkM,GACAqG,GACA9I,GACAuG,GACAtG,GACA;AACA,UAAMqH,IAAMf,IAAO,KAAK,UAAU9D,GAAKqG,GAAM9I,CAAK,IAAI,CAAC,KAAK,YAAYyC,GAAKqG,GAAM9I,CAAK,CAAC,GACnF8R,IAAW,KAAK,IAAI,GAAG,KAAK,MAAM7R,IAAS,KAAK,UAAU,CAAC;AACjE,WAAOqH,EAAI,MAAM,GAAGwK,CAAQ;AAAA,EAC9B;AAAA,EAEQ,kBACNrP,GACAqG,GACA7M,GACAC,GACA8D,GACAC,GACAsG,GACAkC,GACgB;AAChB,UAAMgJ,IAAQ,KAAK,sBAAsBhP,GAAKqG,GAAM9I,GAAOuG,GAAMtG,CAAM;AACvE,QAAI,CAACwR,EAAM,OAAQ,QAAO;AAC1B,QAAIM,IAAO,OAAO,mBACdC,IAAO,OAAO,mBACdC,IAAO,OAAO,mBACdC,IAAO,OAAO;AAClB,aAASjO,IAAM,GAAGA,IAAMwN,EAAM,QAAQxN,KAAO,GAAG;AAC9C,YAAMyN,IAAOD,EAAMxN,CAAG,KAAK,IACrBkO,IAAY1P,EAAI,YAAYiP,CAAI,EAAE;AACxC,UAAIU,IAASnW;AACb,MAAIwM,MAAU,UAAS2J,IAASnW,IAAI+D,IAAQmS,IACnC1J,MAAU,aAAU2J,IAASnW,KAAK+D,IAAQmS,KAAa;AAChE,YAAME,IAAUnW,IAAI,KAAK,aAAa+H,GAChCqO,IAAaD,IAAU,KAAK;AAClC,MAAAN,IAAO,KAAK,IAAIA,GAAMK,CAAM,GAC5BJ,IAAO,KAAK,IAAIA,GAAMI,IAASD,CAAS,GACxCF,IAAO,KAAK,IAAIA,GAAMI,CAAO,GAC7BH,IAAO,KAAK,IAAIA,GAAMI,CAAU;AAAA,IAClC;AACA,WAAI,CAAC,OAAO,SAASP,CAAI,KAAK,CAAC,OAAO,SAASE,CAAI,IAAU,OACtD,IAAI,QAAQF,GAAME,GAAMD,IAAOD,GAAMG,IAAOD,CAAI;AAAA,EACzD;AAAA,EAEQ,aACNxP,GACAqG,GACA7M,GACAC,GACA8D,GACAC,GACAsG,GACAkC,IAAqC,QACrCoF,IAAY,IACZC,IAAkB,IAClByE,IAAkB,IAClBjE,GACA;AACA,IAAA7L,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,KAAKxG,IAAI,GAAGC,IAAI,GAAG8D,IAAQ,GAAGC,IAAS,CAAC,GAC5CwC,EAAI,KAAA;AACJ,UAAM+P,IAAa/P,EAAI;AACvB,IAAIoL,IACE0E,IACF9P,EAAI,OAAO,GAAGV,EAAwB,MAAMF,CAAkB,KAE9DY,EAAI,OAAO,oBAEJqL,MACTrL,EAAI,OAAO,GAAGX,CAAmB,MAAMD,CAAkB;AAE3D,UAAM4P,IAAQ,KAAK,sBAAsBhP,GAAKqG,GAAM9I,GAAOuG,GAAMtG,CAAM,GACjEwS,IAAkBhB,EAAM,SAAS,KAAK,YACtCiB,IAAQxW,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO+D,IAASwS,KAAmB,CAAC,CAAC,GAClEE,IAAa,CAACC,GAAYC,MAAoB;AAClD,YAAMC,IAAWJ,IAAQ,KAAK,aAAaG;AAC3C,UAAIT,IAASnW,GACT8W,IAAO9W;AACX,UAAIwM,MAAU;AACZ,QAAAhG,EAAI,YAAY,SAChBsQ,IAAO9W,IAAI+D,GACXoS,IAASW,IAAOtQ,EAAI,YAAYmQ,CAAE,EAAE,OACpCnQ,EAAI,SAASmQ,GAAIG,GAAMD,CAAQ;AAAA,eACtBrK,MAAU,UAAU;AAC7B,QAAAhG,EAAI,YAAY;AAChB,cAAMuQ,IAAS/W,IAAI+D,IAAQ,GACrB5D,IAAIqG,EAAI,YAAYmQ,CAAE,EAAE;AAC9B,QAAAR,IAASY,IAAS5W,IAAI,GACtB2W,IAAOC,IAAS5W,IAAI,GACpBqG,EAAI,SAASmQ,GAAII,GAAQF,CAAQ;AAAA,MACnC;AACE,QAAArQ,EAAI,YAAY,QAChB2P,IAASnW,GACT8W,IAAO9W,IAAIwG,EAAI,YAAYmQ,CAAE,EAAE,OAC/BnQ,EAAI,SAASmQ,GAAI3W,GAAG6W,CAAQ;AAE9B,UAAIxE,GAAa,aAAaA,GAAa,QAAQ;AACjD,cAAM2E,IAAexQ,EAAI,aACnByQ,IAAkBzQ,EAAI;AAI5B,YAHAA,EAAI,cAAcA,EAAI,WACtBA,EAAI,YAAY,GAChBA,EAAI,UAAA,GACA6L,EAAY,WAAW;AACzB,gBAAM6E,IAAaL,IAAW;AAC9B,UAAArQ,EAAI,OAAO2P,GAAQe,CAAU,GAC7B1Q,EAAI,OAAOsQ,GAAMI,CAAU;AAAA,QAC7B;AACA,YAAI7E,EAAY,QAAQ;AACtB,gBAAM8E,IAAUN,IAAW,KAAK,MAAM,KAAK,aAAa,CAAC,IAAI;AAC7D,UAAArQ,EAAI,OAAO2P,GAAQgB,CAAO,GAC1B3Q,EAAI,OAAOsQ,GAAMK,CAAO;AAAA,QAC1B;AACA,QAAA3Q,EAAI,OAAA,GACJA,EAAI,cAAcwQ,GAClBxQ,EAAI,YAAYyQ;AAAA,MAClB;AAAA,IACF;AACA,aAASjP,IAAM,GAAGA,IAAMwN,EAAM,QAAQxN,KAAO;AAC3C,MAAA0O,EAAWlB,EAAMxN,CAAG,KAAK,IAAIA,IAAM,CAAC;AAEtC,IAAAxB,EAAI,YAAY,QAChBA,EAAI,OAAO+P,GACX/P,EAAI,QAAA;AAAA,EACN;AAAA,EAEQ,YAAY7C,GAAgBzI,GAAqD;AACvF,QAAIyI,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,QAAI,OAAOA,KAAU,UAAU;AAC7B,YAAM2D,IAAM3D;AACZ,UAAI2D,EAAI,SAAS,YAAY,OAAOA,EAAI,SAAU;AAChD,eAAO,EAAE,MAAMA,EAAI,MAAA;AAErB,YAAMqG,IAAUnG,GAAmB7D,CAAK;AACxC,UAAIgK,MAAY,KAAM,QAAO,EAAE,MAAMA,EAAA;AAAA,IACvC;AACA,QAAIzS,EAAI,SAAS;AAEf,aAAO,EAAE,MADK8Q,GAAerI,CAAK,KACV,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS;AAEf,aAAO,EAAE,MADK+Q,GAAatI,CAAK,KACR,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS,QAAQ;AACvB,YAAM0S,IAAOvG,GAAiB1D,CAAK;AACnC,UAAIiK,EAAM,QAAO,EAAE,MAAMA,EAAK,KAAK,IAAI,EAAA;AAAA,IACzC;AACA,QAAI1S,EAAI,SAAS;AACf,aAAIA,EAAI,WAAW,cAAc,CAACA,EAAI,SAC7B,EAAE,MAAMyI,IAAQ,MAAM,IAAA,IAE3B,MAAM,QAAQzI,EAAI,MAAM,KAAKA,EAAI,OAAO,UAAU,IAC7C,EAAE,MAAc,OAARyI,IAAezI,EAAI,OAAO,CAAC,IAAYA,EAAI,OAAO,CAAC,CAAvB,EAAwB,IAE9D,EAAE,MAAMyI,IAAQ,OAAOzI,EAAI,MAAM,IAAI,GAAA;AAE9C,QAAIA,EAAI,SAAS,YAAY,OAAOyI,KAAU,UAAU;AACtD,YAAMkK,IAAMlK,GACNmD,IAAM5L,EAAI;AAEhB,WADc4L,GAAK,UAAU,eACf,cAAc;AAC1B,cAAM+F,IAAOiB,GAAoBD,GAAK,EAAE,QAAQ,cAAc,WAAW/G,GAAK,WAAW,GACnFJ,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAAA;AAAAA,MACjB;AAEA,YAAMqH,IAAiC,CAAA;AACvC,MAAIjH,GAAK,UAAU,WACjBiH,EAAK,wBAAwBjH,EAAI,OACjCiH,EAAK,wBAAwBjH,EAAI,QAEnCiH,EAAK,cAAc,EAAQjH,GAAK;AAChC,YAAM+F,IAAO,KAAK,iBAAiB,mBAAmBkB,CAAI,EAAE,OAAOF,CAAG,GAChEnH,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAA;AAAA,IACjB;AAEA,SAAKxL,EAAI,SAAS,SAASA,EAAI,SAAS,WAAW,OAAOyI,KAAU,UAAU;AAC5E,YAAMkK,IAAMlK,GACNmD,IAAM5L,EAAI,QACV8S,IAAQlH,GAAK,UAAU;AAC7B,UAAIkH,MAAU,YAAYA,MAAU,WAAWA,MAAU,OAAO;AAC9D,cAAMnB,IAAOoB,GAAwBJ,GAAKG,CAAK,GACzCtH,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAAA;AAAAA,MACjB;AAEA,YAAMqH,IAAiC;AAAA,QACrC,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,QACvB,aAAa,EAAQjH,GAAK;AAAA,MAAiB,GAEvC+F,IAAO,KAAK,iBAAiB,mBAAmBkB,CAAI,EAAE,OAAOF,CAAG,GAChEnH,IAAQI,GAAK,eAAe+G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAhB,GAAM,OAAAnG,EAAA;AAAA,IACjB;AACA,SACGxL,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,gBAC3DyI,aAAiB,QAAQ,OAAOA,KAAU,WAC3C;AACA,YAAMuK,IAAWhT,EAAI,QACf4L,IACJ5L,EAAI,SAAS,SACRgT,KAAY,eACbhT,EAAI,SAAS,SACVgT,KAAY,UACZA,KAAY;AACrB,UAAIlR,IAAiB;AAKrB,aAJI2G,aAAiB,OAAM3G,IAAI2G,IAE7B3G,IAAI,KAAK,iBAAiB,aAAa2G,CAAK,GAEzC3G,IACE,EAAE,MAAMoR,GAAepR,GAAG8J,CAAG,EAAA,IADrB,EAAE,MAAM,OAAOnD,CAAK,EAAA;AAAA,IAErC;AACA,WAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAAA,EAC7B;AACF;AAn7CE0K,EAAwB,oBAAoB,MAC5CA,EAAwB,2BAA2B,KACnDA,EAAwB,oCAAoC,GAC5DA,EAAwB,yBAAyB;AAJ5C,IAAM+I,KAAN/I;AC/yBA,MAAMgJ,GAAiB;AAAA,EAgG5B,YACE7O,GACA9C,GACA4R,GACAC,GACAC,GACAC,GACAC,GACQhd,GACRid,GACAC,GACAC,GACQC,GACRC,GACQC,GACAC,GACAC,GACR;AATQ,SAAA,YAAAxd,GAIA,KAAA,iBAAAod,GAEA,KAAA,oBAAAE,GACA,KAAA,SAAAC,GACA,KAAA,SAAAC,GAzGV,KAAQ,YAAkC,MAE1C,KAAQ,4BAA+D,MACvE,KAAQ,kBAAoC,CAAA,GAC5C,KAAQ,UAA6E,MACrF,KAAQ,uBAA8C,MACtD,KAAQ,iBAA0C,MAClD,KAAQ,cAAqC,MAC7C,KAAQ,iBAAgC,MAExC,KAAQ,mBAA0C,MAClD,KAAQ,uBAAiE,MACzE,KAAQ,mBAA+C,CAAA,GACvD,KAAQ,uBAAuB,IAC/B,KAAQ,kBAAkB,GAC1B,KAAQ,cAAsC,MAC9C,KAAQ,sBAAqC,MAC7C,KAAQ,qBAA0C,MAClD,KAAQ,0CAAwD,IAAA,GAChE,KAAQ,0BAAoE,MAE5E,KAAQ,iBAAwC,MAChD,KAAQ,qBAA+D,MACvE,KAAQ,sBAAqC,MAC7C,KAAQ,wBAAwB,GAChC,KAAQ,oBAA4C,MAEpD,KAAQ,uBAAuB,IAC/B,KAAQ,wBAAwB,GAChC,KAAQ,gBAAgB,IACxB,KAAQ,kBAA4D,MACpE,KAAQ,kBAAiE,MACzE,KAAQ,WAAW,IACnB,KAAQ,YAAmF,MAC3F,KAAQ,oBAAqD,MAC7D,KAAQ,YAAY,IACpB,KAAQ,uBAAuB,IAC/B,KAAQ,oBAAoB,IAC5B,KAAQ,eAAe,IACvB,KAAQ,aAA6D,MACrE,KAAQ,kBAAiC,MACzC,KAAQ,mBAAkC,MAC1C,KAAQ,oBAAqD,MAC7D,KAAQ,gBAA+B,MACvC,KAAQ,mBAAmB,IAC3B,KAAQ,aAA8D,MACtE,KAAQ,aAAiC,MACzC,KAAQ,yBAAwC,MAChD,KAAQ,sBAAgF,MACxF,KAAQ,YAAY,IACpB,KAAQ,qBAAqB,GAC7B,KAAiB,8BAA8B,MAAM;AACnD,WAAK,YAAY;AAAA,IACnB,GACA,KAAiB,4BAA4B,MAAM;AACjD,WAAK,YAAY,IACjB,KAAK,qBAAqB,KAAK,IAAA;AAAA,IACjC,GACA,KAAiB,sBAAsB,CAAC1J,MAAoB;AAE1D,MAAIA,GAAI,yBAAyB,eAC3B,KAAK,kBAAkB,SAASA,EAAG,aAAa,KAItD,KAAK,uBAAA;AAAA,IACP,GACA,KAAiB,oBAAoB,OAAOA,MAAsB;AAOhE,UANIA,EAAG,oBACH,CAAC,KAAK,iBACN,KAAK,WACLA,EAAG,eAAe,KAAK,aAGvB,EAFU,OAAO,YAAc,OAAe,OAAO,KAAK,UAAU,QAAQ,IAC1DA,EAAG,UAAUA,EAAG,SAC1B;AACZ,YAAM3H,IAAM2H,EAAG,IAAI,YAAA;AACnB,MAAI3H,MAAQ,OACV2H,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,KACF3H,MAAQ,QACjB2H,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,GACX,KAAK,qBAAA;AAAA,IAET,GA45BA,KAAQ,qBAAqB,MAAM;AACjC,WAAK,iBAAA;AAAA,IACP,GA+WA,KAAQ,oBAAoB,CAACA,MAAqB;AAChD,UAAIA,EAAG,WAAW,EAAG;AACrB,YAAMpB,IAAKoB,EAAG;AAad,UAZIpB,GAAI,QAAQ,kCAAkC,KAC9CA,GAAI,QAAQ,8BAA8B,KAE1CA,GAAI,QAAQ,8BAA8B,KAI1C,KAAK,WAAWoB,EAAG,UAAU,KAAK,QAAQ,SAASA,EAAG,MAAc,KAEpE,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,WAAW,QAC5D,CAAC,KAAK,2BAER,KAAK,aAAc;AACvB,YAAM2F,IAAM,KAAK,QAAQ3F,CAA2B;AAGpD,UAFI,CAAC2F,KACDA,EAAI,UAAU,aAAaA,EAAI,WAAW,aAC1CA,EAAI,WAAW,UAAW;AAG9B,YAAMgE,IAAUtU,GAAoB,KAAK,WAAW,KAAK,eAAe;AACxE,UAAIsU,KAAW,KAAK,YAAY;AAC9B,cAAMvd,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBud,IAAiBD,EAAQ,aACzBE,IAAiBF,EAAQ,UACzBG,IAAYzd,EAAKud,CAAc,GAC/BG,IAAY3d,EAAO,QAAQyd,CAAc;AAC/C,YAAIC,KAAaC,GAAW;AAC1B,gBAAMpT,IACJ,KAAK,oBAAoBmT,EAAU,IAAIC,EAAU,GAAG,GAAG,sBAAA,KACvD,KAAK,sBAAsBD,EAAU,IAAIC,EAAU,GAAG;AACxD,cACEpT,KACAI;AAAA,YACE,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK,WAAW;AAAA,YAChB,KAAK,WAAW;AAAA,YAChB,KAAK;AAAA,UAAA,GAEP;AACA,kBAAM+P,IAAapQ,GAAkBC,GAAUF,EAAuB;AACtE,gBAAII,GAAcmJ,EAAG,SAASA,EAAG,SAAS8G,CAAU,GAAG;AACrD,cAAA9G,EAAG,eAAA,GACH,KAAK,eAAe,IACpB,KAAK,aAAa2J,GAClB,KAAK,kBAAkBA,EAAQ,aAC/B,KAAK,KAAK,QAAQ,sBAAsB,KACpC,KAAK,qBAAqB,SAC5B,KAAK,mBAAmB,KAAK,KAAK,MAAM,UAAU,KACpD,KAAK,KAAK,MAAM,SAAS,aACzB,KAAK,oBAAoB,EAAE,GAAG3J,EAAG,SAAS,GAAGA,EAAG,QAAA,GAChD,KAAK,WAAW,IAChB,KAAK,YAAY,MACjB,KAAK,oBAAoB;AACzB,kBAAI;AACD,gBAAAA,EAAG,QAA2B,oBAAoBA,EAAG,SAAS;AAAA,cACjE,QAAQ;AAAA,cAER;AAEA,mBAAK,kBAAkB;AAAA,gBACrB;AAAA,kBACE,MAAM;AAAA,kBACN,UAAU2J,EAAQ;AAAA,kBAClB,QAAQA,EAAQ;AAAA,kBAChB,UAAUA,EAAQ;AAAA,kBAClB,QAAQA,EAAQ;AAAA,gBAAA;AAAA,cAClB,GAEF,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,gBAAA;AACL;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAMvd,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBE,IAAWoZ,EAAI,UAAU,eAAe,IAAI,KAAK,UAAU,YAAYA,EAAI,KAAK,GAChFnZ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO6Y,EAAI,MAAM,CAAC;AACrF,UAAInZ,IAAW,EAAG;AAElB,UAAImZ,EAAI,UAAU,cAAc;AAE9B,YAAI,CAACtZ,EAAK,OAAQ;AAClB,cAAM4I,IAAwB;AAAA,UAC5B,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ5I,EAAK,SAAS;AAAA,UACtB,UAAUG;AAAA,UACV,QAAQA;AAAA,QAAA;AAEV,aAAK,kBAAkB,CAACyI,CAAK,GAC7B,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,WAAW,IAChB,KAAK,gBAAgB,IACrB,KAAK,YAAY,MACjB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB;AACzB,cAAM+U,IAAY3d,EAAK,CAAC,GAClB4d,IAAY7d,EAAO,QAAQI,CAAQ;AACzC,QAAIwd,KAAaC,MACf,KAAK,aAAa,EAAE,OAAOD,EAAU,IAAI,QAAQC,EAAU,IAAA,GAC3D,KAAK,eAAeD,EAAU,IAAIC,EAAU,GAAG,IAEjD,KAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AAEA,UAAI1d,IAAW,EAAG;AAElB,YAAMgP,IAAyBoK,EAAI,WAAW,OAAO,SAAS;AAC9D,WAAK,WAAW,IAChB,KAAK,oBAAoB,EAAE,GAAG3F,EAAG,SAAS,GAAGA,EAAG,QAAA,GAChD,KAAK,YAAY,IACjB,KAAK,uBAAuB,IAC5B,KAAK,YAAY,EAAE,UAAAzT,GAAU,UAAAC,GAAU,MAAA+O,EAAA,GACvC,KAAK,oBAAoB,IACzB,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MAEvB,KAAK,0BAA0B,MAC/B,KAAK,oBAAoB,EAAE,GAAGyE,EAAG,SAAS,GAAGA,EAAG,QAAA;AAEhD,UAAI;AACD,QAAAA,EAAG,QAA2B,oBAAoBA,EAAG,SAAS;AAAA,MACjE,QAAQ;AAAA,MAER;AACA,WAAK,gBAAA;AAAA,IACP,GAgMA,KAAQ,oBAAoB,CAACA,MAAqB;AAEhD,UADA,KAAK,oBAAoB,EAAE,GAAGA,EAAG,SAAS,GAAGA,EAAG,QAAA,GAC5C,KAAK,gBAAgB,KAAK,YAAY;AACxC,aAAK,8BAA8BA,EAAG,SAASA,EAAG,OAAO;AACzD;AAAA,MACF;AACA,UAAI,CAAC,KAAK,YAAY,CAAC,KAAK,WAAW;AACrC,aAAK,mBAAmBA,CAAE;AAC1B;AAAA,MACF;AACA,UAAI,CAAC,KAAK,aAAa,KAAK,mBAAmB;AAC7C,cAAMkK,IAAKlK,EAAG,UAAU,KAAK,kBAAkB,GACzCmK,IAAKnK,EAAG,UAAU,KAAK,kBAAkB;AAE/C,YAAIkK,IAAKA,IAAKC,IAAKA,IAAK,EAAG;AAC3B,aAAK,YAAY;AAAA,MACnB;AACA,WAAK,0BAA0BnK,EAAG,SAASA,EAAG,OAAO;AAAA,IACvD,GAEA,KAAQ,kBAAkB,CAACA,MAAqB;AAC9C,UAAI,KAAK,gBAAgB,KAAK,YAAY;AACxC,cAAM7I,IAAM,KAAK,YACXiT,IAAc,KAAK,mBAAmBjT,EAAI;AAChD,aAAK,eAAe,IACpB,KAAK,aAAa,MAClB,KAAK,kBAAkB,MACvB,KAAK,KAAK,QAAQ,sBAAsB,IACpC,KAAK,qBAAqB,SAC5B,KAAK,KAAK,MAAM,SAAS,KAAK,kBAC9B,KAAK,mBAAmB,OAE1B,KAAK,eAAA;AACL,YAAI;AACD,UAAA6I,EAAG,QAA2B,wBAAwBA,EAAG,SAAS;AAAA,QACrE,QAAQ;AAAA,QAER;AACA,aAAK,WAAW7I,GAAKiT,CAAW,GAChC,KAAK,oBAAoB;AACzB;AAAA,MACF;AACA,UAAI,CAAC,KAAK,SAAU;AACpB,WAAK,WAAW,IAChB,KAAK,YAAY;AACjB,YAAMC,IAAwB,KAAK;AACnC,WAAK,oBAAoB,MACzB,KAAK,YAAY,IACjB,KAAK,uBAAuB,IAC5B,KAAK,eAAA;AACL,UAAI;AACD,QAAArK,EAAG,QAA2B,wBAAwBA,EAAG,SAAS;AAAA,MACrE,QAAQ;AAAA,MAER;AAEA,UADIqK,WAA4B,oBAAoB,KAChD,KAAK,qBAEH,KAAK,cAAc,KAAK,WAAW,WAAW,MAAM;AACtD,cAAMnD,IAAU,KAAK,UAAU,QAAQ,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM;AACpF,aAAK,oBAAoB,KAAK,sBAAsBA,CAAO,CAAC;AAAA,MAC9D;AAAA,IAEJ,GAoEA,KAAQ,sBAAsB,CAAClH,MAAuB;AACpD,UAAI,CAAC,KAAK,cAAe;AACzB,YAAMsK,IAAU,KAAK,+BAAA;AACrB,MAAKA,MACLtK,EAAG,eAAA,GACHA,EAAG,eAAe,QAAQ,cAAcsK,EAAQ,IAAI,GACpDtK,EAAG,eAAe,QAAQ,6BAA6BsK,EAAQ,IAAI,GACnEtK,EAAG,eAAe,QAAQ,aAAasK,EAAQ,IAAI,GACnD,KAAK,cAAc,UAAUA,EAAQ,SAAS,UAAU,MAAM;AAAA,IAChE,GAEA,KAAQ,qBAAqB,CAACtK,MAAuB;AACnD,UAAI,CAAC,KAAK,cAAe;AACzB,YAAMsK,IAAU,KAAK,+BAAA;AACrB,MAAKA,MACLtK,EAAG,eAAA,GACHA,EAAG,eAAe,QAAQ,cAAcsK,EAAQ,IAAI,GACpDtK,EAAG,eAAe,QAAQ,6BAA6BsK,EAAQ,IAAI,GACnEtK,EAAG,eAAe,QAAQ,aAAasK,EAAQ,IAAI,GACnD,KAAK,qBAAA;AAAA,IACP,GAEA,KAAQ,uBAAuB,CAACtK,MAAuB;AACrD,UAAI,CAAC,KAAK,cAAe;AACzB,MAAAA,EAAG,eAAA;AACH,YAAMuK,IAAOvK,EAAG,eAAe,QAAQ,WAAW,KAAK,IACjDwK,IAAMxK,EAAG,eAAe,QAAQ,2BAA2B,KAAK,IAChE3B,IAAO2B,EAAG,eAAe,QAAQ,YAAY,KAAK,IAClDyK,IAAO,KAAK,mBAAmB,EAAE,MAAAF,GAAM,KAAAC,GAAK,MAAAnM,GAAM;AACxD,MAAKoM,KACL,KAAK,mBAAmBA,CAAI;AAAA,IAC9B,GAEA,KAAQ,kCAAkC,CAACzK,MAA0B;AACnE,UAAI,CAAC,KAAK,cAAe;AACzB,YAAM0K,IAAK,KAAK;AAChB,UAAI,GAACA,KAAMA,EAAG,WAAW,OAEzB;AAAA,YAAI,KAAK,eAAeA,EAAG,OAAOA,EAAG,MAAM,GAAG;AAI5C,UAAA1K,GAAI,iBAAA,GACJA,GAAI,kBAAA;AACJ,gBAAMkH,IAAU,KAAK,UAAU,QAAQwD,EAAG,OAAOA,EAAG,MAAM,GACpDC,IAAc,KAAK,sBAAsBzD,CAAO;AACtD,eAAK,uBAAA,GACL,KAAK,oBAAoByD,CAAW;AACpC;AAAA,QACF;AAEA,aAAK,gBAAgB,IAErB,KAAK,uBAAA;AAAA;AAAA,IACP,GAEA,KAAQ,6BAA6B,CAAC3K,MAAmB;AACvD,UAAI,CAAC,KAAK,cAAe;AACzB,YAAM0K,IAAK,KAAK;AAChB,UAAI,GAACA,KAAMA,EAAG,WAAW,SACpB,KAAK,eAAeA,EAAG,OAAOA,EAAG,MAAM,GAG5C;AAAA,QAAA1K,EAAG,eAAA;AACH,YAAI;AACF,gBAAMkH,IAAU,KAAK,UAAU,QAAQwD,EAAG,OAAOA,EAAG,MAAM,GACpDC,IAAc,KAAK,sBAAsBzD,CAAO,GAChDpJ,IAAQ,KAAK,qBAAA;AACnB,UAAAA,EAAM,QAAQ6M,GACd7M,EAAM,OAAA;AAAA,QACR,QAAQ;AAAA,QAER;AAAA;AAAA,IACF,GA6DA,KAAQ,yBAAyB,OAAOkC,MAAsB;AAE5D,UADI,CAAC,KAAK,cACNA,EAAG,eAAe,KAAK,UAAW;AAGtC,UAAI,CAAC,KAAK,iBAAiB,KAAK,SAAS;AACvC,aAAK,UAAUA,GAAI,SAAS,cAAc,KAAK,CAAC;AAChD;AAAA,MACF;AAMA,UAHI,CAAC,KAAK,iBAIRA,EAAG,QAAQ,WACXA,EAAG,QAAQ,aACXA,EAAG,QAAQ,SACXA,EAAG,QAAQ,UACXA,EAAG,QAAQ,cACXA,EAAG,QAAQ,aACXA,EAAG,QAAQ;AAEX;AAGF,YAAM4K,IAAQ,OAAO,YAAc,OAAe,OAAO,KAAK,UAAU,QAAQ;AAEhF,UADcA,IAAQ5K,EAAG,UAAUA,EAAG,SAC3B;AACT,cAAM3H,IAAM2H,EAAG,IAAI,YAAA;AACnB,YAAI3H,MAAQ,KAAK;AACf,UAAA2H,EAAG,eAAA,GACC4K,KAAS5K,EAAG,WAAU,KAAK,OAAA,SACrB,OAAA,GACV,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAI3H,MAAQ,KAAK;AACf,UAAA2H,EAAG,eAAA,GACH,KAAK,OAAA,GACL,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAI3H,MAAQ,KAAK;AACf,UAAA2H,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,GACX,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAI3H,MAAQ,KAAK;AACf,UAAA2H,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,GACX,KAAK,qBAAA,GACL,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAI3H,MAAQ,KAAK;AAEf,eAAK,kBAAkB;AACvB;AAAA,QACF;AAAA,MACF;AAEA,UAAI2H,EAAG,QAAQ,OAAO,KAAK,WAAW,WAAW,MAAM;AACrD,cAAMtT,IAAM,KAAK,WAAW,KAAK,WAAW,MAAM;AAClD,YAAIA,GAAK,SAAS,YAAYA,GAAK,SAAS,QAAQ;AAClD,UAAAsT,EAAG,eAAA,GACH,KAAK,kBAAkB,KAAK,WAAW,OAAO,KAAK,WAAW,QAAQtT,EAAI,IAAI,GAC9E,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAIA,GAAK,SAAS,WAAW;AAC3B,UAAAsT,EAAG,eAAA,GACH,KAAK,cAAc,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GAChE,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,aAAK,kBAAkB;AACvB;AAAA,MACF;AAEA,YAAM6K,IAAQ7K,EAAG,QAAQ,OACnB8K,IAAU9K,EAAG,QAAQ,SACrB+K,IACJ/K,EAAG,QAAQ,eACXA,EAAG,QAAQ,gBACXA,EAAG,QAAQ,aACXA,EAAG,QAAQ;AACb,UAAI6K,KAASC,KAAWC,GAAS;AAG/B,YAFA/K,EAAG,eAAA,GACH,KAAK,uBAAA,GACD6K,GAAO;AACT,eAAK,eAAe,GAAG7K,EAAG,WAAW,KAAK,GAAG,EAAK;AAClD;AAAA,QACF;AACA,YAAI8K,GAAS;AACX,eAAK,eAAe9K,EAAG,WAAW,KAAK,GAAG,GAAG,EAAK;AAClD;AAAA,QACF;AACA,cAAMgL,IAAShL,EAAG;AAClB,QAAIA,EAAG,QAAQ,mBAAkB,eAAe,GAAG,IAAIgL,CAAM,IACpDhL,EAAG,QAAQ,oBAAmB,eAAe,GAAG,GAAGgL,CAAM,IACzDhL,EAAG,QAAQ,iBAAgB,eAAe,IAAI,GAAGgL,CAAM,IACvDhL,EAAG,QAAQ,oBAAkB,eAAe,GAAG,GAAGgL,CAAM;AACjE;AAAA,MACF;AAEA,UACE,KAAK,WAAW,WAAW,QAC3B,KAAK,eAAe,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GACjE;AACA,QAAAhL,EAAG,eAAA,GACH,KAAK,kBAAkB;AACvB;AAAA,MACF;AAEA,WAAK,gBAAgB,IACrB,KAAK,kBAAkB,MAGvB,KAAK,uBAAA;AAAA,IACP,GA+ZA,KAAQ,cAAc,CAACA,MAAmB;AACxC,YAAMpB,IAAKoB,EAAG;AAQd,UAPIA,EAAG,WAAW,KAIdpB,GAAI,QAAQ,8BAA8B,KAG1CA,GAAI,QAAQ,kCAAkC;AAChD;AAEF,UAAI,KAAK,mBAAmB;AAC1B,aAAK,oBAAoB;AACzB;AAAA,MACF;AAIA,UAHI,KAAK,WAAWoB,EAAG,UAAU,KAAK,QAAQ,SAASA,EAAG,MAAc,KAGpE,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,WAAW,QAC5D,CAAC,KAAK;AAAyB;AAErC,YAAM2F,IAAM,KAAK,oBAAoB3F,EAAG,SAASA,EAAG,SAASA,EAAG,MAAM;AAGtE,UADoBA,EAAG,QAA+B,QAAQ,4BAA4B,KACxE2F,GAAK;AACrB,YAAIA,EAAI,WAAW,KAAM;AACzB,cAAMjZ,IAAM,KAAK,WAAWiZ,EAAI,MAAM;AACtC,YAAIjZ,KAAOA,EAAI,SAAS,aAAaA,EAAI,QAAQ;AAC/C,eAAK,cAAciZ,EAAI,OAAOA,EAAI,MAAM,GACxC3F,EAAG,eAAA;AACH;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC2F,EAAK;AACV,YAAMpF,IAAY,KAAK,YAAY,KAAK,UAAUP,CAAE,IAAI;AACxD,UAAIO;AAGF,YAAIA,EAAU,SAAS;AAErB,cADgB,KAAK,eAAeA,EAAU,OAAOA,EAAU,QAAQA,EAAU,QAAQ,GAC5E;AACX,YAAAP,EAAG,eAAA;AACH;AAAA,UACF;AAAA,mBAEkB,KAAK,kBAAkBO,EAAU,OAAOA,EAAU,QAAQA,EAAU,IAAI,GAC3E;AACb,UAAAP,EAAG,eAAA;AACH;AAAA,QACF;AAAA;AAIJ,YAAMiL,IACJ,KAAK,iBACL,CAACjL,EAAG,YACJ,CAACA,EAAG,WACJ,CAACA,EAAG,WACJ,KAAK,YAAY,UAAU2F,EAAI,SAC/B,OAAO,KAAK,YAAY,MAAM,MAAM,OAAOA,EAAI,MAAM;AACvD,UAAIA,EAAI,UAAU,aAAaA,EAAI,WAAW,WAAW;AACvD,cAAMvZ,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA;AAC5B,aAAK,cAAc,EAAK,GACpBA,EAAK,UAAUD,EAAO,QAAQ,UAChC,KAAK,kBAAkB;AAAA,UACrB;AAAA,YACE,MAAM;AAAA,YACN,UAAU;AAAA,YACV,QAAQC,EAAK,SAAS;AAAA,YACtB,UAAU;AAAA,YACV,QAAQD,EAAO,QAAQ,SAAS;AAAA,UAAA;AAAA,QAClC,GAEF,KAAK,aAAa,EAAE,OAAO,WAAW,QAAQ,UAAA,GAC9C,KAAK,eAAe,WAAW,SAAS,GACxC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACL,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE,MAE3B,KAAK,aAAa,MAClB,KAAK,eAAe,WAAW,SAAS,GACxC,KAAK,kBAAkB;AAEzB;AAAA,MACF;AAEA,UADA,KAAK,YAAYuZ,EAAI,KAAK,GACtBA,EAAI,UAAU,cAAc;AAC9B,cAAMvZ,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBG,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO6Y,EAAI,MAAM,CAAC;AACrF,QAAItZ,EAAK,UAAUG,KAAY,MAC7B,KAAK,kBAAkB;AAAA,UACrB;AAAA,YACE,MAAM;AAAA,YACN,UAAU;AAAA,YACV,QAAQH,EAAK,SAAS;AAAA,YACtB,UAAUG;AAAA,YACV,QAAQA;AAAA,UAAA;AAAA,QACV,GAEF,KAAK,aAAa,EAAE,OAAOH,EAAK,CAAC,EAAE,IAAI,QAAQsZ,EAAI,OAAA,GACnD,KAAK,eAAe,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GACjE,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACL,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAE7B;AAAA,MACF;AAEA,UADA,KAAK,sBAAsB3F,GAAI2F,CAAG,GAC9BA,EAAI,WAAW,QAAQA,EAAI,WAAW,WAAW;AACnD,aAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AACA,UAAIA,EAAI,UAAU,cAAc;AAC9B,aAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AACA,UAAI,KAAK,eAAeA,EAAI,OAAOA,EAAI,MAAM,GAAG;AAC9C,aAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK;AACxB,cAAMuB,IAAU,KAAK,UAAU,QAAQvB,EAAI,OAAOA,EAAI,MAAM;AAC5D,aAAK,oBAAoB,KAAK,sBAAsBuB,CAAO,CAAC;AAC5D;AAAA,MACF;AAGA,UAFY,KAAK,WAAWvB,EAAI,MAAM,GACf,SAAS,WACjB;AACb,cAAMuF,IACJ,KAAK,iBAAiB,UAAUvF,EAAI,SACpC,OAAO,KAAK,iBAAiB,MAAM,MAAM,OAAOA,EAAI,MAAM;AAM5D,YALA,KAAK,kBAAkB,EAAE,OAAOA,EAAI,OAAO,QAAQA,EAAI,OAAA,GACvD,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK,GACxB,KAAK,uBAAA,GACDuF,GAAe;AACjB,eAAK,cAAcvF,EAAI,OAAOA,EAAI,MAAM,GAExC,KAAK,oBAAoB,EAAE;AAC3B;AAAA,QACF;AAEA,aAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AACA,WAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK;AACxB,YAAMuB,IAAU,KAAK,UAAU,QAAQvB,EAAI,OAAOA,EAAI,MAAM,GACtDgF,IAAc,KAAK,sBAAsBzD,CAAO;AAGtD,WAAK,oBAAoByD,CAAW,GAEhCM,MACF,KAAK,gBAAgB,IAErB,KAAK,uBAAA;AAAA,IAET,GAsHA,KAAQ,oBAAoB,CAACjL,MAAmB;AAC9C,YAAM1G,IAAS0G,EAAG;AAClB,UAAIA,EAAG,SAAS;AACd,QAAAA,EAAG,eAAA;AACH;AAAA,MACF;AACA,UAAI,CAAC1G,KAAU,CAAC,KAAK,KAAK,SAASA,CAAM,EAAG;AAC5C,MAAA0G,EAAG,eAAA,GACHA,EAAG,gBAAA;AACH,YAAM2F,IAAM,KAAK,QAAQ3F,CAAE,GACrBpT,IAAQ+Y,GAAK,SAAS,MACtB9Y,IAAS8Y,GAAK,UAAU;AAC9B,WAAK,cAAc/Y,GAAOC,GAAQmT,EAAG,SAASA,EAAG,OAAO;AAAA,IAC1D,GA3oFE,KAAK,OAAOhG,GACZ,KAAK,WAAW9C,GAChB,KAAK,SAAS4R,GACd,KAAK,cAAcC,GACnB,KAAK,SAASC,GACd,KAAK,UAAUC,GACf,KAAK,YAAYC,GACjB,KAAK,gBAAgBC,GACrB,KAAK,iBAAiBC,GACtB,KAAK,eAAeC,GACpB,KAAK,gBAAgBE,GACrB,KAAK,KAAA;AAAA,EACP;AAAA,EAEA,YAAYvc,GAAgB;AAC1B,SAAK,WAAWA;AAAA,EAClB;AAAA,EAEA,uBAAuB;AACrB,UAAMZ,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA;AAC5B,QAAI,CAACA,EAAK,UAAU,CAACD,EAAO,QAAQ,QAAQ;AAC1C,WAAK,kBAAkB,CAAA,GACvB,KAAK,aAAa,MAClB,KAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAI,GACvB,KAAK,eAAe,MAAM,IAAI,GAC9B,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA;AACL;AAAA,IACF;AAEA,UAAM+e,IAAS9e,EAAK,SAAS,GACvB+e,IAAShf,EAAO,QAAQ,SAAS,GAEjC4K,IAAc,KAAK,YAAY,SAAS,MACxCC,IAAe,KAAK,YAAY,UAAU,MAC1CoU,IAAiBrU,IAAc,KAAK,UAAU,YAAYA,CAAW,IAAI,IACzEsU,IACJrU,MAAiB,OACb7K,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOmK,CAAY,CAAC,IACtE;AAGN,QAAIoU,KAAkB,KAAKC,KAAkB,GAAG;AAC9C,UAAI7E,IAAU;AACd,UAAI,CAAC,KAAK,gBAAgB;AACxB,aAAK,kBAAkB;AAAA,UACrB;AAAA,YACE,MAAM;AAAA,YACN,UAAU4E;AAAA,YACV,QAAQA;AAAA,YACR,UAAUC;AAAA,YACV,QAAQA;AAAA,UAAA;AAAA,QACV,GAEF7E,IAAU;AAAA,WACL;AACL,cAAM8E,IAA+B,KAAK,gBAAgB,IAAI,CAAC3d,MAAM;AACnE,gBAAM4d,IAAQ,CAAC/d,GAAWge,MAAgB,KAAK,IAAI,GAAG,KAAK,IAAIA,GAAKhe,CAAC,CAAC,GAChE4I,IAAuB;AAAA,YAC3B,GAAGzI;AAAA,YACH,UAAU4d,EAAM5d,EAAE,UAAUud,CAAM;AAAA,YAClC,QAAQK,EAAM5d,EAAE,QAAQud,CAAM;AAAA,YAC9B,UAAUK,EAAM5d,EAAE,UAAUwd,CAAM;AAAA,YAClC,QAAQI,EAAM5d,EAAE,QAAQwd,CAAM;AAAA,UAAA;AAEhC,kBACE/U,EAAK,aAAazI,EAAE,YACpByI,EAAK,WAAWzI,EAAE,UAClByI,EAAK,aAAazI,EAAE,YACpByI,EAAK,WAAWzI,EAAE,YAElB6Y,IAAU,KAELpQ;AAAA,QACT,CAAC;AACD,aAAK,kBAAkBkV;AAAA,MACzB;AACA,MAAI9E,KAAS,KAAK,kBAAkB,KAAK,eAAe,GACxD,KAAK,qBAAA;AACL;AAAA,IACF;AAGA,UAAMiF,IAAgBzU,KAAgB7K,EAAO,QAAQ,CAAC,GAAG,OAAO;AAChE,QAAII,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO4e,CAAa,CAAC;AACtF,IAAIlf,IAAW,MAAGA,IAAW;AAC7B,UAAMK,IAAST,EAAO,QAAQI,CAAQ,GAAG,OAAO,IAE1Cmf,IAAY3U,IAAc,KAAK,UAAU,gBAAgBA,CAAW,IAAI,GACxE4U,IAAcvf,EAAKA,EAAK,SAAS,CAAC,KAAKA,EAAK,CAAC,KAAK,MAClDwf,IACJxf,EAAK,KAAK,CAACuB,MAAM,KAAK,UAAU,gBAAgBA,EAAE,EAAE,KAAK+d,CAAS,KAAKC;AACzE,QAAI,CAACC,EAAS;AACd,UAAMjf,IAAQif,EAAQ,IAChBtf,IAAW,KAAK,UAAU,YAAYK,CAAK;AAEjD,SAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK,GACxB,KAAK,kBAAkB;AAAA,MACrB;AAAA,QACE,MAAM;AAAA,QACN,UAAUL;AAAA,QACV,QAAQA;AAAA,QACR,UAAUC;AAAA,QACV,QAAQA;AAAA,MAAA;AAAA,IACV,GAEF,KAAK,aAAa,EAAE,OAAAI,GAAO,QAAAC,EAAA,GAC3B,KAAK,eAAeD,GAAOC,CAAM,GACjC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,kBAAkBD,GAAOC,CAAM;AACpC,UAAMqa,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM;AACpD,SAAK,oBAAoB,KAAK,sBAAsBqa,CAAO,CAAC,GAC5D,KAAK,qBAAA;AAAA,EACP;AAAA,EAEA,eAAeta,GAAeC,GAAgB;AAC5C,UAAMT,IAAS,KAAK,UAAU,UAAA,GACxBG,IAAW,KAAK,UAAU,YAAYK,CAAK,GAC3CJ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOD,CAAM,CAAC;AACjF,QAAIN,IAAW,KAAKC,IAAW,EAAG;AAElC,SAAK,0BAA0B,MAC/B,KAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK;AACxB,UAAMsf,IAA4B;AAAA,MAChC,MAAM;AAAA,MACN,UAAUvf;AAAA,MACV,QAAQA;AAAA,MACR,UAAUC;AAAA,MACV,QAAQA;AAAA,IAAA;AAEV,SAAK,kBAAkB,CAACsf,CAAS,GACjC,KAAK,aAAa,EAAE,OAAAlf,GAAO,QAAAC,EAAA,GAC3B,KAAK,eAAeD,GAAOC,CAAM,GACjC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,kBAAkBD,GAAOC,CAAM;AACpC,UAAMqa,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM;AACpD,SAAK,oBAAoB,KAAK,sBAAsBqa,CAAO,CAAC,GAC5D,KAAK,qBAAA;AAAA,EACP;AAAA,EAEA,gBAAgB;AACd,SAAK,cAAc,EAAI;AAAA,EACzB;AAAA,EAEA,UAAU;AACR,SAAK,KAAK,oBAAoB,SAAS,KAAK,WAAW,GACvD,KAAK,KAAK,oBAAoB,eAAe,KAAK,iBAAiB,GACnE,KAAK,KAAK,oBAAoB,eAAe,KAAK,iBAAiB,GACnE,KAAK,KAAK,oBAAoB,aAAa,KAAK,eAAe,GAC/D,KAAK,KAAK,oBAAoB,iBAAiB,KAAK,eAAe,GACnE,KAAK,KAAK,oBAAoB,gBAAgB,KAAK,kBAAkB,GACrE,KAAK,KAAK,oBAAoB,WAAW,KAAK,iBAAiB,GAC3D,KAAK,6BACP,SAAS,oBAAoB,eAAe,KAAK,2BAA2B,EAAI,GAElF,KAAK,cAAc,EAAI,GACvB,KAAK,uBAAA,GACL,KAAK,kBAAA,GACLpM,EAAiB,KAAK,gBAAgB,GACtC,KAAK,mBAAmB,MACxB,KAAK,iBAAA,GACL,KAAK,qBAAA,GACL,KAAK,eAAA;AAAA,EACP;AAAA,EAEA,SAASuG,GAAmBC,GAAoB;AAI9C,SAAK,kBAAA,GACL,KAAK,4BAAA,GACL,KAAK,8BAAA;AAAA,EACP;AAAA,EAEQ,OAAO;AACb,SAAK,KAAK,iBAAiB,SAAS,KAAK,WAAW,GACpD,KAAK,KAAK,iBAAiB,eAAe,KAAK,iBAAiB,GAChE,KAAK,KAAK,iBAAiB,eAAe,KAAK,iBAAiB,GAChE,KAAK,KAAK,iBAAiB,aAAa,KAAK,eAAe,GAC5D,KAAK,KAAK,iBAAiB,iBAAiB,KAAK,eAAe,GAChE,KAAK,KAAK,iBAAiB,gBAAgB,KAAK,kBAAkB,GAClE,KAAK,KAAK,iBAAiB,WAAW,KAAK,iBAAiB,GAC5D,KAAK,4BAA4B,CAACtB,MAAmB,KAAK,kBAAkBA,CAAE,GAC9E,SAAS,iBAAiB,eAAe,KAAK,2BAA2B,EAAE,SAAS,IAAM;AAAA,EAC5F;AAAA,EAEQ,uBAAuB;AAC7B,UAAM/I,IAAe,KAAK,YAAY,UAAU,MAC1CD,IAAc,KAAK,YAAY,SAAS;AAC9C,SAAK,KAAK,QAAQ,oBAAoBD;AAAA,MACpC,KAAK;AAAA,MACL,KAAK;AAAA,MACLC;AAAA,MACAC;AAAA,MACA,KAAK;AAAA,IAAA,IAEH,MACA;AAAA,EACN;AAAA,EAEQ,WAAWpK,GAAgB;AAEjC,WADe,KAAK,UAAU,UAAA,EAChB,QAAQ,KAAK,CAACC,MAAMA,EAAE,QAAQD,CAAM;AAAA,EACpD;AAAA,EAEQ,KAAKY,GAAW;AACtB,WAAO,OAAOA,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,EAClC;AAAA,EAEQ,wBAAwBe,GAAS;AACvC,WAAO,GAAGA,EAAE,YAAA,CAAa,IAAI,KAAK,KAAKA,EAAE,SAAA,IAAa,CAAC,CAAC,IAAI,KAAK,KAAKA,EAAE,QAAA,CAAS,CAAC;AAAA,EACpF;AAAA,EAEQ,wBAAwBA,GAAS;AACvC,WAAO,GAAG,KAAK,KAAKA,EAAE,SAAA,CAAU,CAAC,IAAI,KAAK,KAAKA,EAAE,WAAA,CAAY,CAAC;AAAA,EAChE;AAAA,EAEQ,4BAA4BA,GAAS;AAC3C,WAAO,GAAG,KAAK,wBAAwBA,CAAC,CAAC,IAAI,KAAK,wBAAwBA,CAAC,CAAC;AAAA,EAC9E;AAAA,EAEQ,8BAA8Bud,GAAuCC,GAAiB;AAC5F,UAAM7W,IAAQ6W,EAAQ,KAAA;AACtB,QAAI,CAAC7W,EAAO,QAAO;AAEnB,QAAI4W,MAAY,QAAQ;AACtB,YAAMzZ,IAAI6C,EAAM,MAAM,sBAAsB;AAC5C,UAAI7C,EAAG,QAAOA,EAAE,CAAC,KAAK;AACtB,YAAM9D,IAAI,IAAI,KAAK2G,CAAK;AACxB,aAAK,OAAO,MAAM3G,EAAE,QAAA,CAAS,IACtB,KADgC,KAAK,wBAAwBA,CAAC;AAAA,IAEvE;AAEA,QAAIud,MAAY,QAAQ;AACtB,YAAMzZ,IAAI6C,EAAM,MAAM,0BAA0B;AAChD,UAAI7C,EAAG,QAAOA,EAAE,CAAC,KAAK;AACtB,YAAM9D,IAAI,IAAI,KAAK2G,CAAK;AACxB,aAAK,OAAO,MAAM3G,EAAE,QAAA,CAAS,IACtB,KADgC,KAAK,wBAAwBA,CAAC;AAAA,IAEvE;AAGA,QAAI,KAAK,KAAK2G,CAAK,KAAK,iCAAiC,KAAKA,CAAK;AACjE,aAAOA,EAAM,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE;AAE5C,QACE,gDAAgD,KAAKA,CAAK,KAC1D,CAAC,mBAAmB,KAAKA,CAAK;AAE9B,aAAOA,EAAM,MAAM,GAAG,EAAE;AAE1B,UAAM3G,IAAI,IAAI,KAAK2G,CAAK;AACxB,WAAK,OAAO,MAAM3G,EAAE,QAAA,CAAS,IACtB,KADgC,KAAK,4BAA4BA,CAAC;AAAA,EAE3E;AAAA,EAEQ,kBAAkB;AACxB,QAAI,KAAK,YAAa,QAAO,KAAK;AAGlC,IADiB,OAAO,iBAAiB,KAAK,IAAI,EACrC,aAAa,aACxB,KAAK,KAAK,MAAM,WAAW;AAE7B,UAAMyd,IAAQ,SAAS,cAAc,KAAK;AAC1C,WAAAA,EAAM,YAAY,iBAClBA,EAAM,QAAQ,mBAAmB,KACjCA,EAAM,MAAM,WAAW,YACvBA,EAAM,MAAM,OAAO,KACnBA,EAAM,MAAM,MAAM,KAClBA,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,UAAU,QAEtBA,EAAM,MAAM,SAAS,KACrB,KAAK,KAAK,YAAYA,CAAK,GAC3B,KAAK,cAAcA,GACZA;AAAA,EACT;AAAA,EAEQ,oBAAoB;AAK1B,IAJI,KAAK,mBACP,OAAO,aAAa,KAAK,cAAc,GACvC,KAAK,iBAAiB,OAEnB,KAAK,gBACV,KAAK,YAAY,MAAM,UAAU,QACjCnR,EAAiB,KAAK,WAAW,GACjC,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,CAAC,KAAK,YAAa;AACvB,UAAMnJ,IAAI,KAAK,YAAY,eAAe,GACpCgD,IAAI,KAAK,YAAY,gBAAgB,GACrCuX,IAAQ,IACRC,IAAU,KAAK,IAAI,GAAG,KAAK,KAAK,aAAa,KAAK,KAAK,cAAcxa,IAAIua,CAAK,GAC9EE,IAAS,KAAK,IAAI,GAAG,KAAK,KAAK,YAAY,KAAK,KAAK,eAAezX,IAAIuX,CAAK,GAC7EG,IAAU,KAAK,IAAI,GAAG,KAAK,KAAK,aAAaH,CAAK,GAClDI,IAAS,KAAK,IAAI,GAAG,KAAK,KAAK,YAAYJ,CAAK,GAChDnG,IAAW,KAAK,KAAK,sBAAA,GACrBjP,IAAO,KAAK,kBAAA;AAClB,QAAIA,GAAM;AACR,YAAMyV,IAAgBzV,EAAK,QAAQiP,EAAS,OAAO,KAAK,KAAK,aAAapU,IAAI,GACxE6a,IAAe1V,EAAK,MAAMiP,EAAS,MAAM,KAAK,KAAK,YAAYpR,IAAI,GACnEmO,IAAO,KAAK,IAAIqJ,GAAS,KAAK,IAAIE,GAASE,CAAa,CAAC,GACzDxJ,IAAM,KAAK,IAAIqJ,GAAQ,KAAK,IAAIE,GAAQE,CAAY,CAAC;AAC3D,WAAK,YAAY,MAAM,OAAO,GAAG1J,CAAI,MACrC,KAAK,YAAY,MAAM,MAAM,GAAGC,CAAG;AACnC;AAAA,IACF;AACA,SAAK,YAAY,MAAM,OAAO,GAAGoJ,CAAO,MACxC,KAAK,YAAY,MAAM,MAAM,GAAGC,CAAM;AAAA,EACxC;AAAA,EAEQ,cAAcK,GAAiBC,IAA4B,QAAQC,IAAa,MAAM;AAC5F,UAAMV,IAAQ,KAAK,gBAAA;AACnB,IAAAA,EAAM,cAAcQ,GACpBR,EAAM,QAAQ,UAAUS,GACxBT,EAAM,MAAM,UAAU,SACtB,KAAK,kBAAA,GACD,KAAK,mBACP,OAAO,aAAa,KAAK,cAAc,GACvC,KAAK,iBAAiB,OAExB,KAAK,iBAAiB,OAAO,WAAW,MAAM;AAC5C,MAAAA,EAAM,MAAM,UAAU;AAAA,IACxB,GAAGU,CAAU;AAAA,EACf;AAAA,EAEQ,qBAAqB;AAC3B,QAAI,KAAK,eAAgB,QAAO,KAAK;AAGrC,IADiB,OAAO,iBAAiB,KAAK,IAAI,EACrC,aAAa,aACxB,KAAK,KAAK,MAAM,WAAW;AAE7B,UAAMC,IAAM,SAAS,cAAc,KAAK;AACxC,WAAAA,EAAI,YAAY,mBAChBA,EAAI,QAAQ,UAAU,KACtBA,EAAI,MAAM,WAAW,YACrBA,EAAI,MAAM,OAAO,KACjBA,EAAI,MAAM,MAAM,KAChBA,EAAI,MAAM,gBAAgB,QAC1BA,EAAI,MAAM,SAAS,QACnB,KAAK,KAAK,YAAYA,CAAG,GACzB,KAAK,iBAAiBA,GACfA;AAAA,EACT;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,mBAAmB,MAAA,GACxB,KAAK,oBAAoB,MACzB,KAAK,yBAAyB,GAC9B,KAAK,qBAAqB,MAC1B,KAAK,sBAAsB,MAC3B9R,EAAiB,KAAK,cAAc,GACpC,KAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,mBAAmB;AACzB,IAAI,KAAK,mBAAgB,KAAK,eAAe,QAAQ,UAAU,MAC/D,KAAK,qBAAqB,MAC1B,KAAK,sBAAsB,MAC3B,KAAK,mBAAmB,MAAA,GACxB,KAAK,oBAAoB,MACzB,KAAK,yBAAyB;AAAA,EAChC;AAAA,EAEQ,YAAYlO,GAAeC,GAAgC;AACjE,UAAMqO,IAAO,KAAK,oBAAoBtO,GAAOC,CAAM;AACnD,WAAIqO,IAAaA,EAAK,sBAAA,IACf,KAAK,sBAAsBtO,GAAOC,CAAM;AAAA,EACjD;AAAA,EAEQ,sBAAsBiK,GAAe;AAC3C,UAAM8V,IAAM,KAAK;AACjB,QAAI,CAACA,EAAK;AACV,UAAM9G,IAAM,GACNC,IAAW,KAAK,KAAK,sBAAA,GACrBC,IAAO,KAAK,KAAK,aACjBC,IAAO,KAAK,KAAK;AACvB,QAAInD,IAAOhM,EAAK,QAAQiP,EAAS,OAAOD,GACpC/C,IAAMjM,EAAK,MAAMiP,EAAS,MAAMD,GAChCI,IAAyB;AAC7B,UAAMC,IAAQyG,EAAI,sBAAA;AAClB,IAAI9J,IAAOqD,EAAM,QAAQH,MACvBlD,IAAO,KAAK,IAAI,GAAGhM,EAAK,OAAOiP,EAAS,OAAOI,EAAM,QAAQL,CAAG,GAChEI,IAAO,SAELnD,IAAMoD,EAAM,SAASF,MAAMlD,IAAM,KAAK,IAAI,GAAGkD,IAAOE,EAAM,SAASL,CAAG,IAC1E8G,EAAI,MAAM,OAAO,GAAG9J,CAAI,MACxB8J,EAAI,MAAM,MAAM,GAAG7J,CAAG,MACtB6J,EAAI,QAAQ,OAAO1G;AAAA,EACrB;AAAA,EAEQ,8BAA8B;AACpC,UAAM0G,IAAM,KAAK;AAEjB,QADI,CAACA,KAAOA,EAAI,QAAQ,YAAY,OAChC,CAAC,KAAK,sBAAsB,CAAC,KAAK,oBAAqB;AAC3D,UAAM9V,IAAO,KAAK,YAAY,KAAK,mBAAmB,OAAO,KAAK,mBAAmB,MAAM;AAC3F,QAAI,CAACA,GAAM;AACT,WAAK,iBAAA;AACL;AAAA,IACF;AACA,IAAA8V,EAAI,cAAc,KAAK,qBACvB,KAAK,sBAAsB9V,CAAI;AAAA,EACjC;AAAA,EAEQ,mBAAmBkJ,GAAkB;AAC3C,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAA;AACL;AAAA,IACF;AACA,UAAM2F,IAAM,KAAK,QAAQ3F,CAA2B;AACpD,QAAI,CAAC2F,KAAOA,EAAI,WAAW,QAAQA,EAAI,WAAW,aAAaA,EAAI,UAAU,cAAc;AACzF,WAAK,iBAAA;AACL;AAAA,IACF;AACA,UAAM9Y,IAAS,OAAO8Y,EAAI,MAAM,GAC1B/Y,IAAQ+Y,EAAI;AAGlB,QADe,KAAK,UAAU,cAAc/Y,GAAOC,CAAM,GAC7C;AACV,WAAK,iBAAA;AACL;AAAA,IACF;AAEA,UAAMggB,IADM,KAAK,WAAWhgB,CAAM,GACb,SAAS;AAC9B,QAAI,CAACggB,GAAS;AACZ,WAAK,iBAAA;AACL;AAAA,IACF;AAIA,QADE,KAAK,oBAAoB,UAAUjgB,KAAS,KAAK,oBAAoB,WAAWC,KAChE,KAAK,qBAAqB;AAC1C,YAAM+f,IAAM,KAAK,mBAAA;AACjB,MAAAA,EAAI,cAAc,KAAK,qBACvB,KAAK,sBAAsBjH,EAAI,IAAI,GACnCiH,EAAI,QAAQ,UAAU;AACtB;AAAA,IACF;AAEA,SAAK,mBAAmB,MAAA;AACxB,UAAME,IAAa,IAAI,gBAAA;AACvB,SAAK,oBAAoBA;AACzB,UAAMC,IAAa,KAAK,yBAAyB;AACjD,SAAK,qBAAqB,EAAE,OAAAngB,GAAO,QAAAC,EAAA,GACnC,KAAK,sBAAsB;AAC3B,UAAMsI,IAAQ,KAAK,UAAU,QAAQvI,GAAOC,CAAM,GAE5CmgB,IAAY,CAAC3O,MAAwB;AAEzC,UADI0O,MAAc,KAAK,yBACnBD,EAAW,OAAO,QAAS;AAC/B,UAAI,CAACzO,GAAM;AACT,aAAK,iBAAA;AACL;AAAA,MACF;AACA,YAAMuO,IAAM,KAAK,mBAAA;AACjB,WAAK,sBAAsBvO,GAC3BuO,EAAI,cAAcvO,GAClB,KAAK,sBAAsBsH,EAAI,IAAI,GACnCiH,EAAI,QAAQ,UAAU;AAAA,IACxB;AAEA,QAAI;AACF,YAAMzT,IAAM0T,EAAQ,EAAE,OAAAjgB,GAAO,QAAAC,GAAQ,OAAAsI,GAAO,QAAQ2X,EAAW,QAAQ;AACvE,MAAI3T,KAAO,OAAQA,EAAyB,QAAS,aAC7CA,EAA+B,KAAK6T,CAAS,EAAE,MAAM,CAACC,MAAQ;AAClE,QAAIF,MAAc,KAAK,0BACnBD,EAAW,OAAO,YAEtB,KAAK,iBAAA,GACL,KAAK,cAAc,kBAAkB,SAAS,IAAI;AAAA,MACpD,CAAC,IAEDE,EAAU7T,CAAoB;AAAA,IAElC,QAAc;AAEZ,WAAK,iBAAA,GACL,KAAK,cAAc,kBAAkB,SAAS,IAAI;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,KAAK;AACP,aAAO,KAAK;AAGd,IADiB,OAAO,iBAAiB,KAAK,IAAI,EACrC,aAAa,aACxB,KAAK,KAAK,MAAM,WAAW;AAE7B,UAAMyF,IAAK,SAAS,cAAc,KAAK;AACvC,WAAAA,EAAG,YAAY,2BACfA,EAAG,QAAQ,UAAU,KACrBA,EAAG,MAAM,WAAW,YACpBA,EAAG,MAAM,OAAO,KAChBA,EAAG,MAAM,MAAM,KACfA,EAAG,MAAM,SAAS,QAClBA,EAAG,MAAM,UAAU,QACnBA,EAAG,MAAM,gBAAgB,QACzB,KAAK,KAAK,YAAYA,CAAE,GACxB,KAAK,mBAAmBA,GACjBA;AAAA,EACT;AAAA,EAEQ,qBAAqB;AAC3B,UAAMA,IAAK,KAAK;AAChB,IAAKA,MACLA,EAAG,QAAQ,UAAU,KACrBA,EAAG,MAAM,UAAU,QACnBA,EAAG,gBAAA,GACH,KAAK,mBAAmB,CAAA,GACxB,KAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,gCAAgC;AACtC,UAAMA,IAAK,KAAK;AAChB,QAAI,CAACA,KAAMA,EAAG,QAAQ,YAAY,IAAK;AACvC,UAAMtF,IAAS,KAAK;AACpB,QAAI,CAACA,GAAQ;AACX,WAAK,mBAAA;AACL;AAAA,IACF;AACA,UAAMxC,IAAO,KAAK,YAAYwC,EAAO,OAAOA,EAAO,MAAM;AACzD,QAAI,CAACxC,GAAM;AACT,WAAK,mBAAA;AACL;AAAA,IACF;AACA,UAAMiP,IAAW,KAAK,KAAK,sBAAA;AAC3B,IAAAnH,EAAG,MAAM,OAAO,GAAG9H,EAAK,OAAOiP,EAAS,IAAI,MAC5CnH,EAAG,MAAM,MAAM,GAAG9H,EAAK,SAASiP,EAAS,MAAM,CAAC,MAChDnH,EAAG,MAAM,WAAW,GAAG,KAAK,IAAI,KAAK9H,EAAK,KAAK,CAAC;AAAA,EAClD;AAAA,EAEQ,uBAAuB;AAC7B,UAAM8H,IAAK,KAAK,qBAAA,GACVsO,IAAQ,KAAK;AACnB,QAAI,CAACA,EAAM,UAAU,CAAC,KAAK,sBAAsB;AAC/C,WAAK,mBAAA;AACL;AAAA,IACF;AACA,IAAAtO,EAAG,gBAAA,GACHsO,EAAM,QAAQ,CAACpgB,GAAGmP,MAAU;AAC1B,YAAMD,IAAM,SAAS,cAAc,QAAQ;AAC3C,MAAAA,EAAI,OAAO,UACXA,EAAI,YAAY,yBAChBA,EAAI,QAAQ,QAAQ,OAAOC,CAAK,GAChCD,EAAI,QAAQ,SAASC,MAAU,KAAK,uBAAuB,MAAM;AAEjE,YAAMkR,IAAergB,EAAE,WAAW,GAAGA,EAAE,KAAK,cAAcA,EAAE;AAC5D,MAAAkP,EAAI,cAAcmR,GAClBnR,EAAI,MAAM,gBAAgB,QAC1BA,EAAI,iBAAiB,SAAS,CAACgE,MAAO;AACpC,QAAAA,EAAG,eAAA,GACHA,EAAG,gBAAA,GACH,KAAK,sBAAsB/D,CAAK;AAAA,MAClC,CAAC,GACD2C,EAAG,YAAY5C,CAAG;AAAA,IACpB,CAAC,GACD4C,EAAG,QAAQ,UAAU,KACrBA,EAAG,MAAM,UAAU,SACnBA,EAAG,MAAM,SAAS,QAClBA,EAAG,MAAM,gBAAgB,QACzB,KAAK,8BAAA;AAAA,EACP;AAAA,EAEQ,sBAAsB3C,GAAe;AAC3C,UAAM3C,IAAS,KAAK;AACpB,QAAI,CAACA;AACH;AAEF,UAAM5M,IAAM,KAAK,WAAW4M,EAAO,MAAM,GACnC8T,IAAO1gB,GAAK,MAAM;AACxB,QAAI,CAAC0gB;AACH;AAEF,UAAMC,IAAY,KAAK,iBAAiBpR,CAAK;AAC7C,QAAI,CAACoR;AACH;AAGF,UAAMC,IAAoB,EAAE,OAAOD,EAAU,OAAO,OAAOA,EAAU,OAAO,MAAMA,EAAU,KAAA,GACtFE,IAASH,EAAK,gBAChBA,EAAK,cAAcE,CAAiB,IACpC5gB,GAAK,SAAS,YACZ,EAAE,OAAO4gB,EAAkB,OAAO,OAAOA,EAAkB,MAAA,IAC3D,EAAE,MAAM,UAAU,OAAOA,EAAkB,OAAO,OAAOA,EAAkB,OAAO,MAAMA,EAAkB,KAAA;AAEhH,IAAIF,EAAK,iBAAiB,MACxB,KAAK,oBAAoB,IAAI9T,EAAO,QAAQgU,CAAiB,GAG/D,KAAK,0BAA0B,EAAE,OAAOhU,EAAO,OAAO,QAAQA,EAAO,OAAA,GAErE,KAAK,mBAAA,GAEL,KAAK,cAAc,EAAK,GAExB,KAAK,WAAWA,EAAO,OAAOA,EAAO,QAAQiU,CAAM,GAEnD,KAAK,OAAOjU,EAAO,KAAK,GAExB,sBAAsB,MAAM;AAE1B,MAAI,KAAK,YAAY,UAAUA,EAAO,SAAS,KAAK,YAAY,WAAWA,EAAO,UAEhF,KAAK,oBAAoBgU,EAAkB,KAAK;AAAA,IAGpD,CAAC;AAAA,EACH;AAAA,EAEQ,kBACN1gB,GACAC,GACAiR,GACA;AACA,SAAK,qBAAA;AAEL,UAAMsP,IADM,KAAK,WAAWvgB,CAAM,GAChB,MAAM;AAIxB,QAHI,CAACugB,KAGD,EAAEtP,aAAiB,oBAAoBA,aAAiB;AAC1D;AAOF,QAJA,KAAK,uBAAuB,EAAE,OAAAlR,GAAO,QAAAC,EAAA,GAIjCiR,MAAU,KAAK,kBAAkB,CAAC,KAAK,eAAe;AACxD,MAAAA,EAAM,WAAW,IACjBA,EAAM,YAAY;AAElB,YAAMhH,IAAO,KAAK,YAAYlK,GAAOC,CAAM;AAC3C,UAAIiK,GAAM;AACR,cAAMiP,IAAW,KAAK,KAAK,sBAAA;AAC3B,QAAAjI,EAAM,MAAM,YAAY,QACxBA,EAAM,MAAM,OAAO,GAAGhH,EAAK,OAAOiP,EAAS,IAAI,MAC/CjI,EAAM,MAAM,MAAM,GAAGhH,EAAK,MAAMiP,EAAS,GAAG,MAC5CjI,EAAM,MAAM,QAAQ,GAAGhH,EAAK,KAAK,MACjCgH,EAAM,MAAM,SAAS,GAAGhH,EAAK,MAAM,MACnCgH,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,MAAM,UAAU,WACtBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,WAAW,QACvBA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,YAAY,cACxBA,EAAM,MAAM,SAAS,OAEpBA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,mBAAmB;AAAA,MAC1C;AAAA,IACF;AAGA,QAAIsP,EAAK,iBAAiB,IAAO;AAC/B,YAAMI,IAAe,KAAK,UAAU,QAAQ5gB,GAAOC,CAAM;AACzD,UAAI,OAAO2gB,KAAiB,YAAYA,MAAiB,MAAM;AAC7D,cAAM1U,IAAM0U;AACZ,QAAI,OAAO1U,EAAI,SAAU,YAAY,WAAWA,KAAO,CAACA,EAAI,QAE1D,KAAK,oBAAoB,IAAIjM,GAAQ;AAAA,UACnC,OAAOiM,EAAI;AAAA,UACX,OAAOA,EAAI;AAAA,QAAA,CACZ;AAAA,MAEL;AAAA,IACF;AAEA,QAAI2U,IAA4B;AAChC,UAAMC,IAAaN,EAAK,cAAc,KAEhCO,IAAW,CAACC,MAAuC;AACvD,YAAMC,IAAY,OAAOD,KAAqB,YAAYA,IAAmB,IACvEE,IAAQhQ,EAAM;AACpB,MAAI,KAAK,wBACP,OAAO,aAAa,KAAK,mBAAmB,GAC5C,KAAK,sBAAsB,OAE7B,KAAK,aAAa,MAAA,GAClB,KAAK,cAAc,MACnB,KAAK,mBAAmB;AAExB,YAAMiP,IAAY,KAAK,iBACjBgB,IAAqBN,GAErBO,IAAe,MAAM;AACzB,aAAK,sBAAsB;AAC3B,cAAMlB,IAAa,IAAI,gBAAA;AACvB,aAAK,cAAcA,GACdM,EACF,gBAAgB,EAAE,OAAAU,GAAO,OAAAlhB,GAAO,QAAAC,GAAQ,QAAQigB,EAAW,OAAA,CAAQ,EACnE,KAAK,CAACmB,MAAe;AAGpB,cAFIlB,MAAc,KAAK,mBACnBD,EAAW,OAAO,WAClB,CAAC,KAAK,cAAc,KAAK,WAAW,UAAUlgB,KAAS,KAAK,WAAW,WAAWC;AACpF;AAGF,cAAIqhB,IAAkB,MAAM,KAAKD,CAAU;AAC3C,cAAIb,EAAK,iBAAiB,IAAO;AAC/B,kBAAMe,IAAkB,KAAK,oBAAoB,IAAIthB,CAAM;AAC3D,gBAAIshB,GAAiB;AAEnB,cAAAD,IAAkBA,EAAgB,OAAO,CAAAphB,MAAK,EAAEA,EAAE,UAAUqhB,EAAgB,SAASrhB,EAAE,UAAUqhB,EAAgB,MAAM;AAEvH,oBAAMC,IAAkB,EAAE,GAAGD,GAAiB,UAAU,GAAA;AACxD,cAAAD,EAAgB,QAAQE,CAAe;AAAA,YACzC;AAAA,UACF;AAEA,UAAAX,IAA4BS,EAAgB;AAG5C,gBAAMG,IAAsBH,EAAgB,OAAO,CAAAphB,MAAK,CAACA,EAAE,QAAQ;AACnE,cAAI,CAACsgB,EAAK,kBAAkBW,IAAqB,KAAKM,EAAoB,WAAW,GAAG;AACtF,kBAAMC,IAAkBJ,EAAgB,QAAQG,EAAoB,CAAC,CAAC;AACtE,iBAAK,mBAAmBH,GACxB,KAAK,uBAAuBI,GAC5B,KAAK,sBAAsBA,CAAe;AAC1C;AAAA,UACF;AACA,eAAK,mBAAmBJ,GACxB,KAAK,uBAAuBA,EAAgB,SAAS,IAAI,IACzD,KAAK,qBAAA;AAAA,QACP,CAAC,EACA,MAAM,CAACjB,MAAQ;AACd,UAAIF,MAAc,KAAK,oBACnBD,EAAW,OAAO,YAEtB,KAAK,mBAAA,GACL,KAAK,cAAc,iBAAiB,SAAS,IAAI;AAAA,QACnD,CAAC;AAAA,MACL;AAEA,MAAIe,IACFG,EAAA,IAEA,KAAK,sBAAsB,OAAO,WAAWA,GAAcN,CAAU;AAAA,IAEzE;AAEA,IAAA5P,EAAM,iBAAiB,SAAS6P,CAAQ,GACxC,KAAK,qBAAqB,MAAM7P,EAAM,oBAAoB,SAAS6P,CAAQ,GAE3EA,EAAS,EAAI;AAAA,EACf;AAAA,EAEQ,uBAAuB;AAa7B,QAZI,KAAK,wBACP,OAAO,aAAa,KAAK,mBAAmB,GAC5C,KAAK,sBAAsB,OAE7B,KAAK,aAAa,MAAA,GAClB,KAAK,cAAc,MACnB,KAAK,mBAAmB,GACxB,KAAK,qBAAA,GACL,KAAK,qBAAqB,MAC1B,KAAK,uBAAuB,MAC5B,KAAK,mBAAA,GAED,KAAK,gBAAgB;AACvB,YAAM7P,IAAQ,KAAK;AACnB,MAAAA,EAAM,WAAW,IACjBA,EAAM,YAAY,QAClBA,EAAM,MAAM,YAAY,0BACxBA,EAAM,MAAM,QAAQ,OACpBA,EAAM,MAAM,SAAS,OACrBA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,aAAa;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,oBAAoBvQ,GAA2B;AACrD,UAAMqR,IAAK,KAAK;AAEhB,QADI,CAACA,KAAMA,EAAG,QAAQ,YAAY,OAC9B,CAAC,KAAK,iBAAiB,OAAQ,QAAO;AAC1C,QAAIrR,EAAE,QAAQ;AACZ,aAAAA,EAAE,eAAA,GACF,KAAK,uBAAuB,KAAK;AAAA,QAC/B,KAAK,iBAAiB,SAAS;AAAA,QAC/B,KAAK,IAAI,GAAG,KAAK,uBAAuB,CAAC;AAAA,MAAA,GAE3C,KAAK,qBAAA,GACE;AAET,QAAIA,EAAE,QAAQ;AACZ,aAAAA,EAAE,eAAA,GACF,KAAK,uBAAuB,KAAK,IAAI,GAAG,KAAK,uBAAuB,CAAC,GACrE,KAAK,qBAAA,GACE;AAET,QAAIA,EAAE,QAAQ,SAAS;AACrB,YAAM+L,IAAS,KAAK;AAKpB,WAJYA,IAAS,KAAK,WAAWA,EAAO,MAAM,IAAI,OACpC,MAAM,QAGd,gBAAgB;AACxB,QAAA/L,EAAE,eAAA;AACF,cAAMghB,IAAU,KAAK,kBAAkB,KAAK;AAC5C,YAAIA,KAAWjV,GAAQ;AACrB,gBAAMkV,IAAWD,EAAQ;AACzB,eAAK,mBAAA,GACL,KAAK,cAAc,EAAK,GACxB,KAAK,WAAWjV,EAAO,OAAOA,EAAO,QAAQkV,CAAQ,GACrD,KAAK,OAAOlV,EAAO,KAAK,GACxB,sBAAsB,MAAM;AAC1B,YAAI,KAAK,YAAY,UAAUA,EAAO,SAAS,KAAK,YAAY,WAAWA,EAAO,UAChF,KAAK,oBAAoBkV,CAAQ;AAAA,UAErC,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAGA,UAAI,KAAK,wBAAwB;AAC/B,eAAAjhB,EAAE,eAAA,GACF,KAAK,sBAAsB,KAAK,oBAAoB,GAC7C;AAAA,IAEX;AACA,WAAIA,EAAE,QAAQ,YACZA,EAAE,eAAA,GACF,KAAK,mBAAA,GACE,MAEF;AAAA,EACT;AAAA,EAEQ,uBAAuBX,GAAeC,GAAyB;AAErE,UAAM4hB,IADM,KAAK,WAAW5hB,CAAM,GAChB,MAAM,gBAAgB;AACxC,QAAI,CAAC4hB,EAAM,QAAO;AAIlB,QAHI,KAAK,aAAa,cAClB,KAAK,eAAe7hB,GAAOC,CAAM,KAEjC,KAAK,qBAAsB,QAAO;AAEtC,UAAMkgB,IAAa,KAAK,yBAAyB;AACjD,SAAK,uBAAuB;AAC5B,UAAMS,IAAe,KAAK,UAAU,QAAQ5gB,GAAOC,CAAM;AAGzD,SAAK,gBAAgB;AACrB,QAAI;AACF,YAAM8d,IAAc,KAAK,sBAAsB6C,CAAY;AAC3D,WAAK,oBAAoB7C,CAAW;AAAA,IACtC,QAAQ;AAAA,IAER;AAEA,WAAK8D,EAAK,EAAE,OAAA7hB,GAAO,QAAAC,GAAQ,cAAA2gB,GAAc,EACtC,KAAK,CAACrU,MAAQ;AACb,UAAI4T,MAAc,KAAK,0BACvB,KAAK,uBAAuB,IACxB,GAAC,KAAK,cAAc,KAAK,WAAW,UAAUngB,KAAS,KAAK,WAAW,WAAWC,KAEtF;AAAA,YAAIsM,EAAI,SAAS,UAAU;AACzB,eAAK,WAAWvM,GAAOC,GAAQsM,EAAI,KAAK;AACxC,gBAAMuV,IAAW,KAAK,sBAAsBvV,EAAI,KAAK;AACrD,eAAK,oBAAoBuV,CAAQ;AAAA,QACnC;AACA,YAAIvV,EAAI,SAAS;AACf,cAAI;AACF,kBAAMuV,IAAW,KAAK,sBAAsBlB,CAAY;AACxD,iBAAK,oBAAoBkB,CAAQ;AAAA,UACnC,QAAQ;AAAA,UAER;AAAA;AAAA,IAEJ,CAAC,EACA,MAAM,CAACzB,MAAQ;AACd,MAAIF,MAAc,KAAK,0BACvB,KAAK,uBAAuB,IAE5B,KAAK,cAAc,0BAA0B,SAAS,IAAI;AAAA,IAC5D,CAAC,GAEI;AAAA,EACT;AAAA,EAMQ,uBAAuB;AAC7B,QAAI,KAAK,eAAgB,QAAO,KAAK;AACrC,UAAMjP,IAAQ,SAAS,cAAc,OAAO;AAC5C,WAAAA,EAAM,OAAO,QAGbA,EAAM,WAAW,IAEjBA,EAAM,YAAY,QAClBA,EAAM,eAAe,OACrBA,EAAM,aAAa,IACnBA,EAAM,MAAM,WAAW,YACvBA,EAAM,MAAM,OAAO,KACnBA,EAAM,MAAM,MAAM,KAElBA,EAAM,MAAM,YAAY,0BACxBA,EAAM,MAAM,QAAQ,OACpBA,EAAM,MAAM,SAAS,OACrBA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,iBAAiB,WAAW,CAAC,MAAM;AACvC,WAAK,uBAAuB,CAAC;AAAA,IAC/B,CAAC,GACDA,EAAM,iBAAiB,eAAe,CAAC,MAAM;AAC3C,WAAK,2BAA2B,CAAC;AAAA,IACnC,CAAC,GACDA,EAAM,iBAAiB,SAAS,CAAC,MAAM;AAAA,IACvC,CAAC,GACDA,EAAM,iBAAiB,UAAU,CAAC,MAAM;AAAA,IACxC,CAAC,GACDA,EAAM,iBAAiB,oBAAoB,KAAK,+BAA+B,GAC/EA,EAAM,iBAAiB,QAAQ,KAAK,mBAAmB,GACvDA,EAAM,iBAAiB,OAAO,KAAK,kBAAkB,GACrDA,EAAM,iBAAiB,SAAS,KAAK,oBAAoB,GACzDA,EAAM,iBAAiB,QAAQ,CAAC,MAAM;AACpC,WAAK,oBAAoB,CAAC;AAAA,IAC5B,CAAC,GACDA,EAAM,iBAAiB,SAAS,CAAC,MAAM;AAAA,IACvC,CAAC,GAED,KAAK,KAAK,YAAYA,CAAK,GAC3B,KAAK,iBAAiBA,GACfA;AAAA,EACT;AAAA,EAEQ,oBAAoB6Q,GAA2B;AACrD,UAAM7Q,IAAQ,KAAK,qBAAA;AACnB,IAAAA,EAAM,QAAQ6Q,GACd,KAAK,gBAAgB,IACrB7Q,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM,GACnCA,EAAM,OAAA,GAIF,KAAK,cAAc,KAAK,WAAW,WACb,KAAK,2BAC3B,KAAK,wBAAwB,UAAU,KAAK,WAAW,SACvD,KAAK,wBAAwB,WAAW,KAAK,WAAW,UAG5C,KAAK,WAAW,KAAK,WAAW,MAAM,GACzC,MAAM,UACb,KAAK,kBAAkB,KAAK,WAAW,OAAO,KAAK,WAAW,QAAQA,CAAK;AAAA,EAInF;AAAA,EAEQ,uBAAuB1F,GAG5B;AACD,QAAI,CAAC,KAAK,WAAY;AACtB,UAAM,EAAE,OAAAxL,GAAO,QAAAC,EAAA,IAAW,KAAK;AAG/B,QAFIA,MAAW,QAEX,KAAK,uBAAuBD,GAAOC,CAAM;AAC3C;AAIF,UAAMH,IAAM,KAAK,WAAWG,CAAM,GAC5B+hB,IAAuBliB,KAAO,KAAK,uBAAuBA,CAAG;AAEnE,QAAI,KAAK,kBAAkBkiB,GAAsB;AAE/C,YAAM9Q,IAAQ,KAAK;AACnB,MAAAA,EAAM,WAAW,IACjBA,EAAM,YAAY;AAGlB,YAAMhH,IAAO,KAAK,YAAYlK,GAAOC,CAAM;AAC3C,UAAIiK,GAAM;AACR,cAAMiP,IAAW,KAAK,KAAK,sBAAA;AAC3B,QAAAjI,EAAM,MAAM,YAAY,QACxBA,EAAM,MAAM,OAAO,GAAGhH,EAAK,OAAOiP,EAAS,IAAI,MAC/CjI,EAAM,MAAM,MAAM,GAAGhH,EAAK,MAAMiP,EAAS,GAAG,MAC5CjI,EAAM,MAAM,QAAQ,GAAGhH,EAAK,KAAK,MACjCgH,EAAM,MAAM,SAAS,GAAGhH,EAAK,MAAM,MACnCgH,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,MAAM,UAAU,WACtBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,WAAW,QACvBA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,YAAY,cACxBA,EAAM,MAAM,SAAS,OAEpBA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,mBAAmB;AAAA,MAC1C;AAGA,UAAI1F,GAAS,yBAAyB;AACpC,QAAA0F,EAAM,QAAQ1F,EAAQ;AAAA,WACjB;AACL,cAAM8O,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM;AACpD,QAAAiR,EAAM,QAAQ,KAAK,oBAAoBjR,GAAQqa,CAAO;AAAA,MACxD;AAYA,UATA,KAAK,UAAUpJ,GACf,KAAK,sBAAsB,EAAE,OAAAlR,GAAO,QAAAC,GAAQ,OAAO,KAAK,UAAU,QAAQD,GAAOC,CAAM,EAAA,GAGnFH,GAAK,MAAM,UACb,KAAK,kBAAkBE,GAAOC,GAAQiR,CAAK,GAG7CA,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM,GAC/B1F,GAAS,kBAAkB;AAC7B,cAAMyW,IAAM/Q,EAAM,MAAM;AACxB,QAAAA,EAAM,kBAAkB+Q,GAAKA,CAAG;AAAA,MAClC;AACA;AAAA,IACF;AAGA,UAAM3T,IAAO,KAAK,oBAAoBtO,GAAOC,CAAM;AACnD,QAAIqO,GAAM;AACR,WAAK,oBAAoBA,GAAMtO,GAAOC,GAAQuL,CAAO;AACrD;AAAA,IACF;AACA,UAAMtB,IAAO,KAAK,sBAAsBlK,GAAOC,CAAM;AACrD,IAAIiK,KACF,KAAK,iBAAiBA,GAAMlK,GAAOC,GAAQuL,CAAO;AAAA,EAEtD;AAAA,EAEQ,uBAAuB1L,GAA8C;AAO3E,WAJIA,EAAI,SAAS,YAAYA,EAAI,SAAS,aAItCA,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS;AAAA,EAMlE;AAAA,EAEQ,mBAAmByI,GAAe;AACxC,WAAO,IAAI,OAAOA,CAAK;AAAA,EACzB;AAAA,EAEQ,oBAAoBvI,GAAeC,GAAuB;AAChE,QAAIA,MAAW,KAAM,QAAO;AAC5B,UAAMwL,IAAM,OAAOxL,CAAM,GACnBiiB,IAAW,KAAK,mBAAmBliB,CAAK,GACxCmiB,IAAS,KAAK,mBAAmB1W,CAAG;AAC1C,WACE,KAAK,KAAK;AAAA,MACR,mBAAmByW,CAAQ,uBAAuBC,CAAM;AAAA,IAAA,KACrD;AAAA,EAET;AAAA,EAEQ,sBAAsBniB,GAAeC,GAAuB;AAClE,QAAIA,MAAW,KAAM,QAAO;AAC5B,UAAMmiB,IAAM,KAAK,4BAA4BpiB,GAAOC,CAAM;AAC1D,QAAI,CAACmiB,EAAK,QAAO;AACjB,UAAMjJ,IAAW,KAAK,KAAK,sBAAA;AAC3B,WAAO,IAAI;AAAA,MACTA,EAAS,OAAOiJ,EAAI,OAAO,KAAK,KAAK;AAAA,MACrCjJ,EAAS,MAAMiJ,EAAI,MAAM,KAAK,KAAK;AAAA,MACnCA,EAAI;AAAA,MACJA,EAAI;AAAA,IAAA;AAAA,EAER;AAAA,EAEQ,4BAA4BpiB,GAAeC,GAAgB;AAIjE,WAHe,KAAK,KAAK;AAAA,MACvB;AAAA,IAAA,IAGK,KAAK,qBAAqBD,GAAOC,CAAM,IAD1B;AAAA,EAEtB;AAAA,EAEQ,qBAAqBD,GAAeC,GAAgB;AAC1D,UAAMT,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA,GACtBnL,IAAO,KAAK,UAAU,SAAA,GACtBE,IAAWF,EAAK,UAAU,CAACuB,MAAMA,EAAE,OAAOhB,CAAK,GAC/CJ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOD,CAAM,CAAC;AACjF,QAAIN,IAAW,KAAKC,IAAW,EAAG,QAAO;AAEzC,UAAM+Y,IAAexF,IACfkP,IAAiBlV,IACjBmV,IAAmBpV,IACnBO,IAAYC,EAAgBlO,GAAQoL,CAAI;AAE9C,QAAIsL,IAAOmM;AACX,aAAS/gB,IAAI,GAAGA,IAAI1B,GAAU0B,KAAK,EAAG,CAAA4U,KAAQzI,EAAUnM,CAAC,KAAK;AAE9D,QAAI6U,IAAMwC;AACV,aAASrX,IAAI,GAAGA,IAAI3B,GAAU2B,KAAK,GAAG;AACpC,YAAMzB,IAAMJ,EAAK6B,CAAC;AAClB,UAAI,CAACzB,EAAK,QAAO;AACjB,YAAMkI,IAAI,KAAK,UAAU,aAAalI,EAAI,EAAE,KAAKyiB;AACjD,MAAAnM,KAAOpO;AAAA,IACT;AACA,UAAMa,IAAS,KAAK,UAAU,aAAa5I,CAAK,KAAKsiB,GAC/C3Z,IAAQ8E,EAAU7N,CAAQ,KAAK;AACrC,WAAO,EAAE,MAAAsW,GAAM,KAAAC,GAAK,OAAAxN,GAAO,QAAAC,GAAQ,UAAAjJ,GAAU,UAAAC,EAAA;AAAA,EAC/C;AAAA,EAEQ,oBAAoB;AAC1B,UAAM2iB,IAAS,KAAK;AACpB,QAAI,CAACA,EAAQ,QAAO;AACpB,UAAMpJ,IAAW,KAAK,KAAK,sBAAA,GACrB3Z,IAAS,KAAK,UAAU,UAAA,GACxBoL,IAAO,KAAK,UAAU,QAAA;AAC5B,QAAI2X,EAAO,UAAU,aAAaA,EAAO,WAAW;AAClD,aAAO,IAAI,QAAQpJ,EAAS,MAAMA,EAAS,KAAKhM,IAAqBgG,EAAgB;AAEvF,QAAIoP,EAAO,UAAU,gBAAgBA,EAAO,WAAW,MAAM;AAC3D,YAAM9W,IAAM,KAAK,mBAAmB,OAAO8W,EAAO,MAAM,CAAC,GACnDC,IAAW,KAAK,KAAK,cAA2B,oBAAoB/W,CAAG,IAAI;AACjF,UAAI+W,EAAU,QAAOA,EAAS,sBAAA;AAC9B,YAAM5iB,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOqiB,EAAO,MAAM,CAAC;AACxF,UAAI3iB,KAAY,GAAG;AACjB,cAAM6N,IAAYC,EAAgBlO,GAAQoL,CAAI;AAC9C,YAAIhG,IAAIuI;AACR,iBAAS7L,IAAI,GAAGA,IAAI1B,GAAU0B,KAAK,EAAG,CAAAsD,KAAK6I,EAAUnM,CAAC,KAAK;AAC3D,cAAMqH,IAAQ8E,EAAU7N,CAAQ,KAAK;AACrC,eAAO,IAAI;AAAA,UACTuZ,EAAS,OAAOvU,IAAI,KAAK,KAAK;AAAA,UAC9BuU,EAAS;AAAA,UACTxQ;AAAA,UACAwK;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AACA,QAAIoP,EAAO,WAAW,MAAM;AAC1B,YAAM5iB,IAAW,KAAK,UAAU,YAAY4iB,EAAO,KAAK;AACxD,UAAI5iB,KAAY,GAAG;AACjB,YAAIkF,IAAIsO;AACR,cAAM1T,IAAO,KAAK,UAAU,SAAA;AAC5B,iBAAS6B,IAAI,GAAGA,IAAI3B,GAAU2B,KAAK,GAAG;AACpC,gBAAMzB,IAAMJ,EAAK6B,CAAC;AAClB,cAAI,CAACzB,EAAK;AACV,UAAAgF,KAAK,KAAK,UAAU,aAAahF,EAAI,EAAE,KAAKqN;AAAA,QAC9C;AACA,cAAMtE,IAAS,KAAK,UAAU,aAAa2Z,EAAO,KAAK,KAAKrV;AAC5D,eAAO,IAAI;AAAA,UACTiM,EAAS;AAAA,UACTA,EAAS,MAAMtU,IAAI,KAAK,KAAK;AAAA,UAC7BsI;AAAA,UACAvE;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AACA,QAAI2Z,EAAO,WAAW,KAAM,QAAO;AACnC,UAAME,IAAS,KAAK,oBAAoBF,EAAO,OAAOA,EAAO,MAAM;AACnE,WAAIE,IAAeA,EAAO,sBAAA,IACnB,KAAK,sBAAsBF,EAAO,OAAOA,EAAO,MAAM;AAAA,EAC/D;AAAA,EAEQ,kBAAkBviB,GAAeC,GAAgB;AACvD,UAAMyiB,IAAW,KAAK,oBAAoB1iB,GAAOC,CAAM;AACvD,QAAIyiB,GAAU;AACZ,MAAI,OAAQA,EAAyB,kBAAmB,cACrDA,EAAyB,eAAe,EAAE,OAAO,WAAW,QAAQ,WAAW;AAElF;AAAA,IACF;AACA,UAAMC,IAAU,KAAK,qBAAqB3iB,GAAOC,CAAM;AACvD,QAAI,CAAC0iB,EAAS;AACd,UAAMC,IAASD,EAAQ,MACjBE,IAAOF,EAAQ,OAAOA,EAAQ,OAC9BG,IAASH,EAAQ,KACjBI,IAAOJ,EAAQ,MAAMA,EAAQ,QAE7BK,IAAU,KAAK,KAAK,YACpBC,IAAW,KAAK,KAAK,aAAa,KAAK,KAAK,aAC5CC,IAAS,KAAK,KAAK,WACnBC,IAAY,KAAK,KAAK,YAAY,KAAK,KAAK;AAElD,IAAIP,IAASI,IAAS,KAAK,KAAK,aAAa,KAAK,IAAI,GAAGJ,CAAM,IACtDC,IAAOI,MAAU,KAAK,KAAK,aAAa,KAAK,IAAI,GAAGJ,IAAO,KAAK,KAAK,WAAW,IAErFC,IAASI,IAAQ,KAAK,KAAK,YAAY,KAAK,IAAI,GAAGJ,CAAM,IACpDC,IAAOI,MAAW,KAAK,KAAK,YAAY,KAAK,IAAI,GAAGJ,IAAO,KAAK,KAAK,YAAY;AAAA,EAC5F;AAAA,EAEQ,eAAeK,GAAkBC,GAAkBC,IAAkB,IAAO;AAClF,UAAM9jB,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA;AAC5B,QAAI,CAACA,EAAK,UAAU,CAACD,EAAO,QAAQ,OAAQ;AAC5C,UAAM,EAAE,UAAAG,GAAU,UAAAC,MAAa,KAAK,iBAAA;AAEpC,SAAK,0BAA0B,MAC1B0jB,MAAiB,KAAK,kBAAkB;AAC7C,UAAMC,IACJD,KAAmB,KAAK,kBACpB,KAAK,kBACLA,IACE,EAAE,UAAA3jB,GAAU,UAAAC,EAAA,IACZ;AACR,IAAI0jB,KAAmB,CAAC,KAAK,yBAAsB,kBAAkB,EAAE,UAAA3jB,GAAU,UAAAC,EAAA;AACjF,UAAM4jB,IAAe,KAAK,IAAI,GAAG,KAAK,IAAI/jB,EAAK,SAAS,GAAGE,IAAWyjB,CAAQ,CAAC,GACzEK,IAAe,KAAK,IAAI,GAAG,KAAK,IAAIjkB,EAAO,QAAQ,SAAS,GAAGI,IAAWyjB,CAAQ,CAAC;AACzF;AACE,YAAMxjB,IAAMJ,EAAK+jB,CAAY;AAC7B,UAAI,CAAC3jB,EAAK;AACV,YAAMC,IAAMN,EAAO,QAAQikB,CAAY;AACvC,UAAI,CAAC3jB,EAAK;AACV,YAAME,IAAQH,EAAI,IACZI,IAASH,EAAI,KAEbof,IAA4BqE,IAC9B;AAAA,QACE,MAAM;AAAA,QACN,UAAUA,EAAO;AAAA,QACjB,QAAQC;AAAA,QACR,UAAUD,EAAO;AAAA,QACjB,QAAQE;AAAA,MAAA,IAEV;AAAA,QACE,MAAM;AAAA,QACN,UAAUD;AAAA,QACV,QAAQA;AAAA,QACR,UAAUC;AAAA,QACV,QAAQA;AAAA,MAAA;AAEd,WAAK,kBAAkB,CAACvE,CAAS,GACjC,KAAK,aAAa,EAAE,OAAAlf,GAAO,QAAAC,EAAA,GAC3B,KAAK,eAAeD,GAAOC,CAAM,GACjC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,kBAAkBD,GAAOC,CAAM;AAEpC,YAAMqa,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM,GAC9C8d,IAAc,KAAK,sBAAsBzD,CAAO;AACtD,WAAK,oBAAoByD,CAAW,GACpC,KAAK,qBAAA;AACL;AAAA,IACF;AAAA,EACF;AAAA,EA2IQ,oBACNvE,GACAC,GACAiK,GACA;AAEA,QAAI1R,IAAK,SAAS,iBAAiBwH,GAASC,CAAO;AAInD,QAHI,CAACzH,KAAM0R,aAA0B,gBACnC1R,IAAK0R,IAEH1R,KAAM,KAAK,KAAK,SAASA,CAAE,GAAG;AAChC,YAAM5D,IAAS4D,EAAG,QAAqB,mBAAmB;AAC1D,UAAI5D;AACF,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAASA;AAAA,UACT,MAAMA,EAAO,sBAAA;AAAA,QAAsB;AAGvC,YAAMC,IAAY2D,EAAG,QAAqB,4CAA4C;AACtF,UAAI3D,GAAW;AACb,cAAMxO,IAAMwO,EAAU,QAAqB,iBAAiB;AAC5D,YAAIxO;AACF,iBAAO;AAAA,YACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,YAC5B,QAAQ;AAAA,YACR,SAASwO;AAAA,YACT,MAAMA,EAAU,sBAAA;AAAA,UAAsB;AAAA,MAG5C;AACA,YAAMsV,IAAY3R,EAAG,QAAqB,kBAAkB;AAC5D,UAAI2R;AACF,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQA,EAAU,QAAQ,UAAU;AAAA,UACpC,SAASA;AAAA,UACT,MAAMA,EAAU,sBAAA;AAAA,QAAsB;AAG1C,YAAMrV,IAAO0D,EAAG,QAAqB,kBAAkB,GACjDnS,IAAMyO,GAAM,QAAqB,iBAAiB;AACxD,UAAIA,KAAQzO;AACV,eAAO;AAAA,UACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,UAC5B,QAAQyO,EAAK,QAAQ,UAAU;AAAA,UAC/B,SAASA;AAAA,UACT,MAAMA,EAAK,sBAAA;AAAA,QAAsB;AAAA,IAGvC;AAEA,UAAM5B,IAASgX,aAA0B,cAAcA,IAAiB;AACxE,WAAO,KAAK,QAAQ,EAAE,SAAAlK,GAAS,SAAAC,GAAS,QAAA/M,GAAiC;AAAA,EAC3E;AAAA,EAEQ,0BAA0B8M,GAAiBC,GAAiB;AAClE,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,UAAW;AACvC,UAAMV,IAAM,KAAK,oBAAoBS,GAASC,CAAO;AAErD,QADI,CAACV,KAEHA,EAAI,WAAW,aACd,KAAK,UAAU,SAAS,WAAWA,EAAI,WAAW;AAEnD;AAEF,UAAMvZ,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB+d,IAAc,KAAK,UAAU,YAAYzE,EAAI,KAAK;AACxD,QAAIyE,IAAc,EAAG;AACrB,UAAMoG,IACJ,KAAK,UAAU,SAAS,SACpBpkB,EAAO,QAAQ,SAAS,IACxBA,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO6Y,EAAI,MAAM,CAAC;AAC1E,QAAI6K,IAAc,EAAG;AAErB,UAAM3R,IAAW,KAAK,UAAU,UAC1BE,IAAW,KAAK,UAAU,SAAS,SAAS,IAAI,KAAK,UAAU,UAC/DC,IAAS,KAAK,UAAU,SAAS,SAAS5S,EAAO,QAAQ,SAAS,IAAIokB;AAC5E,KAAIpG,MAAgBvL,KAAYG,MAAWD,OACzC,KAAK,uBAAuB;AAE9B,UAAM+M,IAA4B;AAAA,MAChC,MAAM,KAAK,UAAU;AAAA,MACrB,UAAAjN;AAAA,MACA,QAAQuL;AAAA,MACR,UAAArL;AAAA,MACA,QAAAC;AAAA,IAAA;AAEF,SAAK,kBAAkB,CAAC8M,CAAS;AACjC,UAAM9U,IAAc3K,EAAK+d,CAAW,GAAG,MAAMzE,EAAI,OAC3C1O,IACJ,KAAK,UAAU,SAAS,SACnB7K,EAAO,QAAQ,CAAC,GAAG,OAAOuZ,EAAI,SAC9BvZ,EAAO,QAAQokB,CAAW,GAAG,OAAO7K,EAAI;AAC/C,SAAK,aAAa,EAAE,OAAO3O,GAAa,QAAQC,EAAA,GAChD,KAAK,eAAeD,GAAaC,CAAY,GAC7C,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA;AAAA,EACP;AAAA,EAEQ,8BAA8BmP,GAAiBC,GAAiB;AACtE,QAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,WAAY;AAC5C,UAAMV,IAAM,KAAK,oBAAoBS,GAASC,CAAO;AAErD,QADI,CAACV,KACDA,EAAI,WAAW,aAAaA,EAAI,WAAW,KAAM;AACrD,UAAMvZ,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB+d,IAAc,KAAK,UAAU,YAAYzE,EAAI,KAAK;AAGxD,QAFIyE,IAAc,KACDhe,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO6Y,EAAI,MAAM,CAAC,MACpE,KAAK,WAAW,SAAU;AAG3C,UAAM8K,IAAU,KAAK,IAAI,KAAK,WAAW,aAAarG,CAAW;AACjE,QAAI,KAAK,oBAAoBqG,GAAS;AACpC,WAAK,kBAAkBA;AACvB,YAAMzZ,IAAc3K,EAAKokB,CAAO,GAAG,MAAM9K,EAAI,OACvCjZ,IAAMN,EAAO,QAAQ,KAAK,WAAW,QAAQ;AACnD,UAAI,CAACM,EAAK;AACV,YAAMG,IAASH,EAAI;AACnB,WAAK,aAAa,EAAE,OAAOsK,GAAa,QAAAnK,EAAA,GACxC,KAAK,eAAemK,GAAanK,CAAM,GACvC,KAAK,kBAAkB;AAAA,QACrB;AAAA,UACE,MAAM;AAAA,UACN,UAAU,KAAK,WAAW;AAAA,UAC1B,QAAQ4jB;AAAA,UACR,UAAU,KAAK,WAAW;AAAA,UAC1B,QAAQ,KAAK,WAAW;AAAA,QAAA;AAAA,MAC1B,GAEF,KAAK,kBAAkB,KAAK,eAAe;AAAA,IAC7C;AACA,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEQ,uBAAuBrK,GAAiBC,GAAiB;AAC/D,UAAMvP,IAAO,KAAK,KAAK,sBAAA,GACjB4Z,IAAY,IACZC,IAAU;AAChB,QAAIzG,IAAK,GACLC,IAAK;AACT,WAAI/D,IAAUtP,EAAK,OAAO4Z,IACxBxG,IAAK,CAAC,KAAK,MAAOpT,EAAK,OAAO4Z,IAAYtK,KAAWsK,IAAaC,CAAO,IAChEvK,IAAUtP,EAAK,QAAQ4Z,MAChCxG,IAAK,KAAK,MAAO9D,KAAWtP,EAAK,QAAQ4Z,MAAcA,IAAaC,CAAO,IAEzEtK,IAAUvP,EAAK,MAAM4Z,IACvBvG,IAAK,CAAC,KAAK,MAAOrT,EAAK,MAAM4Z,IAAYrK,KAAWqK,IAAaC,CAAO,IAC/DtK,IAAUvP,EAAK,SAAS4Z,MACjCvG,IAAK,KAAK,MAAO9D,KAAWvP,EAAK,SAAS4Z,MAAcA,IAAaC,CAAO,IAEvE,EAAE,IAAAzG,GAAI,IAAAC,EAAA;AAAA,EACf;AAAA,EAEQ,kBAAkB;AACxB,QAAI,KAAK,iBAAkB;AAC3B,SAAK,mBAAmB;AACxB,UAAMyG,IAAO,MAAM;AACjB,UAAI,CAAC,KAAK,iBAAkB;AAC5B,YAAMrlB,IAAI,KAAK;AACf,UAAI,CAACA,KAAM,CAAC,KAAK,YAAY,CAAC,KAAK,cAAe;AAChD,aAAK,eAAA;AACL;AAAA,MACF;AACA,YAAM,EAAE,IAAA2e,GAAI,IAAAC,EAAA,IAAO,KAAK,uBAAuB5e,EAAE,GAAGA,EAAE,CAAC;AACvD,UAAI2e,MAAO,KAAKC,MAAO,GAAG;AACxB,cAAMhQ,IAAU,KAAK,KAAK,WACpBC,IAAW,KAAK,KAAK;AAC3B,aAAK,KAAK,YAAY,KAAK,IAAI,GAAGD,IAAUgQ,CAAE,GAC9C,KAAK,KAAK,aAAa,KAAK,IAAI,GAAG/P,IAAW8P,CAAE,GAE5C,KAAK,eAAc,KAAK,8BAA8B3e,EAAE,GAAGA,EAAE,CAAC,IAC7D,KAAK,0BAA0BA,EAAE,GAAGA,EAAE,CAAC;AAAA,MAC9C;AACA,WAAK,gBAAgB,OAAO,sBAAsBqlB,CAAI;AAAA,IACxD;AACA,SAAK,gBAAgB,OAAO,sBAAsBA,CAAI;AAAA,EACxD;AAAA,EAEQ,iBAAiB;AACvB,SAAK,mBAAmB,IACpB,KAAK,kBAAkB,SACzB,OAAO,qBAAqB,KAAK,aAAa,GAC9C,KAAK,gBAAgB;AAAA,EAEzB;AAAA,EAmEQ,WAAWlb,GAAiD0U,GAAqB;AACvF,UAAMhe,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBK,IAAMN,EAAO,QAAQsJ,EAAO,QAAQ;AAE1C,QADI,CAAChJ,KACD0d,KAAe1U,EAAO,YAAa;AAEvC,UAAMmb,IAAWpb,GAAoB,KAAK,WAAWC,GAAQ,KAAK,aAAa;AAC/E,QAAI,CAACmb,EAAU;AAEf,UAAMC,IAAY,KAAK,aAAa,UAC9BllB,IAAU,QAAQ,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACzE,aAASgC,IAAI8H,EAAO,cAAc,GAAG9H,KAAKwc,GAAaxc,KAAK,GAAG;AAC7D,YAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,UAAI,CAACnB,EAAK;AACV,UAAI,KAAK,eAAeA,EAAI,IAAIC,EAAI,GAAG,EAAG;AAC1C,YAAMqkB,IAASnjB,IAAI8H,EAAO,aACpBW,IAAOwa,EAASE,CAAM,GACtBzlB,IAAe;AAAA,QACnB,MAAM;AAAA,QACN,OAAOmB,EAAI;AAAA,QACX,QAAQC,EAAI;AAAA,QACZ,MAAA2J;AAAA,QACA,SAAS,EAAE,SAAAzK,EAAA;AAAA,MAAQ;AAErB,WAAK,OAAON,GAAKwlB,CAAS;AAAA,IAC5B;AAGA,UAAMhS,IAASzS,EAAK+d,CAAW;AAC/B,QAAI,CAACtL,EAAQ;AACb,SAAK,kBAAkB;AAAA,MACrB;AAAA,QACE,MAAM;AAAA,QACN,UAAUpJ,EAAO;AAAA,QACjB,QAAQ0U;AAAA,QACR,UAAU1U,EAAO;AAAA,QACjB,QAAQA,EAAO;AAAA,MAAA;AAAA,IACjB,GAEF,KAAK,aAAa,EAAE,OAAOoJ,EAAO,IAAI,QAAQpS,EAAI,IAAA,GAClD,KAAK,eAAeoS,EAAO,IAAIpS,EAAI,GAAG,GACtC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACL,KAAK,kBAAkBoS,EAAO,IAAIpS,EAAI,GAAG;AACzC,UAAMwa,IAAU,KAAK,UAAU,QAAQpI,EAAO,IAAIpS,EAAI,GAAG;AACzD,SAAK,oBAAoB,KAAK,sBAAsBwa,CAAO,CAAC;AAAA,EAC9D;AAAA,EAEQ,yBAAyB;AAC/B,UAAMpJ,IAAQ,KAAK;AACnB,IAAKA,MAGL,KAAK,iBAAiB,MAEtBA,EAAM,oBAAoB,WAAW,KAAK,sBAAsB,GAChEA,EAAM,oBAAoB,eAAe,KAAK,0BAA0B,GACxEA,EAAM,oBAAoB,oBAAoB,KAAK,+BAA+B,GAClFA,EAAM,oBAAoB,QAAQ,KAAK,mBAAmB,GAC1DA,EAAM,oBAAoB,OAAO,KAAK,kBAAkB,GACxDA,EAAM,oBAAoB,SAAS,KAAK,oBAAoB,GAC5DA,EAAM,oBAAoB,QAAQ,KAAK,mBAAmB,GAC1DhD,EAAiBgD,CAAK;AAAA,EACxB;AAAA,EA6EA,MAAa,gBAAgB;AAC3B,UAAMwM,IAAU,KAAK,+BAAA;AACrB,QAAI,CAACA,EAAS;AACd,UAAM,EAAE,MAAAjM,GAAM,MAAAkM,GAAM,WAAAyG,EAAA,IAAc1G,GAE5B2G,IAAsB,YAAY;AACtC,UAAI,OAAO,YAAc,OAAe,CAAC,UAAU,UAAW,QAAO;AACrE,UAAI,OAAO,gBAAkB,OAAe,UAAU,UAAU;AAC9D,YAAI;AACF,gBAAMC,IAAO,IAAI,cAAc;AAAA,YAC7B,cAAc,IAAI,KAAK,CAAC7S,CAAI,GAAG,EAAE,MAAM,cAAc;AAAA,YACrD,aAAa,IAAI,KAAK,CAACkM,CAAI,GAAG,EAAE,MAAM,YAAA,CAAa;AAAA,UAAA,CACpD;AACD,uBAAM,UAAU,UAAU,MAAM,CAAC2G,CAAI,CAAC,GAC/B;AAAA,QACT,QAAQ;AAAA,QAER;AAEF,UAAI,UAAU,UAAU;AACtB,YAAI;AACF,uBAAM,UAAU,UAAU,UAAU7S,CAAI,GACjC;AAAA,QACT,QAAQ;AAAA,QAER;AAEF,aAAO;AAAA,IACT,GAEM8S,IAAuB,MAAM;AACjC,YAAMrT,IAAQ,KAAK,qBAAA,GACbmH,IAAOnH,EAAM;AACnB,MAAAA,EAAM,QAAQO,GACdP,EAAM,OAAA,GACN,SAAS,cAAc,MAAM,GAC7BA,EAAM,QAAQmH;AAAA,IAChB;AAGA,IADe,MAAMgM,EAAA,KACRE,EAAA,GACb,KAAK,cAAc,UAAUH,CAAS,UAAU,MAAM;AAAA,EACxD;AAAA,EAEA,MAAa,qBAAqB;AAChC,QAAI,KAAK,aAAa,cACjB,KAAK,iBACN,SAAO,YAAc,OAAe,CAAC,UAAU,WAAW;AAC9D,UAAI;AACF,cAAM3S,IAAO,MAAM,UAAU,UAAU,SAAA;AACvC,YAAI,CAACA,EAAM;AACX,cAAMoM,IAAO,KAAK,mBAAmB,EAAE,MAAM,IAAI,KAAKpM,GAAM,MAAAA,GAAM;AAClE,YAAI,CAACoM,EAAM;AACX,aAAK,mBAAmBA,CAAI;AAAA,MAC9B,QAAQ;AAAA,MAER;AAAA,EACF;AAAA,EA6HQ,mBAAmB;AACzB,UAAMre,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB+kB,IAAW,EAAE,UAAU,GAAG,UAAU,EAAA,GACpC1G,IAAK,KAAK;AAChB,QAAI,CAACA,EAAI,QAAO0G;AAChB,UAAM7kB,IAAWF,EAAK,UAAU,CAACuB,MAAMA,EAAE,OAAO8c,EAAG,KAAK,GAClDle,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO4d,EAAG,MAAM,CAAC;AACpF,WAAO,EAAE,UAAUne,KAAY,IAAIA,IAAW,GAAG,UAAUC,KAAY,IAAIA,IAAW,EAAA;AAAA,EACxF;AAAA,EAEQ,eAAeyI,GAAuC;AAC5D,WAAO;AAAA,MACL,GAAGA;AAAA,MACH,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,MAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,MAC7C,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,MAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAAA;AAAA,EAEjD;AAAA,EAEQ,eAAsC;AAC5C,UAAM7I,IAAS,KAAK,UAAU,UAAA;AAC9B,QAAI,KAAK,gBAAgB,SAAS,GAAG;AACnC,YAAMilB,IAAQ,KAAK,gBAAgB,CAAC;AACpC,UAAI,CAACA,EAAO,QAAO;AACnB,YAAMC,IAAa,KAAK,eAAeD,CAAK;AAC5C,aAAIC,EAAW,SAAS,SACf;AAAA,QACL,MAAM;AAAA,QACN,UAAUA,EAAW;AAAA,QACrB,QAAQA,EAAW;AAAA,QACnB,UAAUA,EAAW;AAAA,QACrB,QAAQA,EAAW;AAAA,MAAA,IAGhBA;AAAA,IACT;AACA,QAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,UAAM5G,IAAK,KAAK;AAChB,QAAI,CAACA,EAAI,QAAO;AAChB,UAAM6G,IAAS,KAAK,UAAU,YAAY7G,EAAG,KAAK,GAC5C8G,IAASplB,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO4d,EAAG,MAAM,CAAC;AAClF,WAAI6G,IAAS,KAAKC,IAAS,IAAU,OAC9B,EAAE,MAAM,SAAS,UAAUD,GAAQ,QAAQA,GAAQ,UAAUC,GAAQ,QAAQA,EAAA;AAAA,EACtF;AAAA,EAEQ,sBAAsBrc,GAAwB;AACpD,QAAIA,KAAU,KAA6B,QAAO;AAClD,QAAIA,aAAiB,KAAM,QAAOA,EAAM,YAAA;AACxC,QAAI,OAAOA,KAAU,UAAW,QAAOA,IAAQ,SAAS;AACxD,QAAI,OAAOA,KAAU,SAAU,QAAO,OAAOA,CAAK;AAClD,UAAMsc,IAAanU,GAAkBnI,CAAK;AAC1C,QAAIsc,GAAY,KAAM,QAAOA,EAAW;AACxC,UAAMC,IAAerU,GAAoBlI,CAAK;AAC9C,QAAIuc,GAAc,MAAO,QAAOA,EAAa;AAC7C,QAAI,OAAOvc,KAAU,UAAU;AAC7B,YAAM2D,IAAM3D,GACNoG,IAAOzC,EAAI;AACjB,UAAIyC,MAAS,UAAU,OAAOzC,EAAI,SAAU,iBAAiBA,EAAI;AACjE,UAAIyC,MAAS,UAAU,MAAM,QAAQzC,EAAI,MAAM;AAC7C,eAAOA,EAAI,OAAO,OAAO,CAACtH,MAAM,OAAOA,KAAM,QAAQ,EAAE,KAAK,IAAI;AAGlE,UADI+J,MAAS,YAAY,OAAOzC,EAAI,SAAU,YAC1C,OAAOA,EAAI,QAAS,YAAY,OAAOA,EAAI,SAAU,YAAY,WAAWA,EAAK,QAAOA,EAAI;AAAA,IAClG;AACA,WAAO,OAAO3D,CAAK;AAAA,EACrB;AAAA,EAEQ,WAAWkJ,GAAc;AAC/B,WAAOA,EACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEQ,iCAIC;AACP,UAAMjS,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB4I,IAAQ,KAAK,aAAA;AAEnB,QADI,CAACA,KACDA,EAAM,SAAS,QAAS,QAAO;AAEnC,UAAMnJ,IAAgB,CAAA,GAChB6lB,IAAqB,CAAA,GACrBC,IAAa,8CACbvV,IAAY;AAClB,QAAI2U,IAAY;AAChB,aAASpjB,IAAIqH,EAAM,UAAUrH,KAAKqH,EAAM,QAAQrH,KAAK,GAAG;AACtD,YAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,UAAI,CAACnB,EAAK;AACV,YAAMwa,IAAiB,CAAA,GACjB4K,IAAsB,CAAA;AAC5B,eAAS/kB,IAAImI,EAAM,UAAUnI,KAAKmI,EAAM,QAAQnI,KAAK,GAAG;AACtD,cAAMJ,IAAMN,EAAO,QAAQU,CAAC;AAC5B,YAAI,CAACJ,EAAK;AACV,cAAMqF,IAAI,KAAK,UAAU,QAAQtF,EAAI,IAAIC,EAAI,GAAG,GAC1CgB,IAAI,KAAK,sBAAsBqE,CAAC;AACtC,QAAAkV,EAAK,KAAKvZ,CAAC,GACXmkB,EAAU,KAAK,cAAcxV,CAAS,KAAK,KAAK,WAAW3O,CAAC,CAAC,OAAO,GACpEsjB,KAAa;AAAA,MACf;AACA,MAAAllB,EAAI,KAAKmb,EAAK,KAAK,GAAI,CAAC,GACxB0K,EAAS,KAAK,OAAOE,EAAU,KAAK,EAAE,CAAC,OAAO;AAAA,IAChD;AACA,UAAMxT,IAAOvS,EAAI,KAAK;AAAA,CAAM,GACtBye,IAAO,iBAAiBqH,CAAU,YAAYD,EAAS,KAAK,EAAE,CAAC;AACrE,WAAO,EAAE,MAAAtT,GAAM,MAAAkM,GAAM,WAAAyG,EAAA;AAAA,EACvB;AAAA,EAEQ,uBAAuB;AAC7B,UAAM5kB,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB4I,IAAQ,KAAK,aAAA;AACnB,QAAI,CAACA,KAASA,EAAM,SAAS,QAAS;AACtC,UAAM6b,IAAY,KAAK,aAAa,UAC9BllB,IAAU,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACxE,aAASgC,IAAIqH,EAAM,UAAUrH,KAAKqH,EAAM,QAAQrH,KAAK,GAAG;AACtD,YAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,UAAKnB;AACL,iBAASK,IAAImI,EAAM,UAAUnI,KAAKmI,EAAM,QAAQnI,KAAK,GAAG;AACtD,gBAAMJ,IAAMN,EAAO,QAAQU,CAAC;AAE5B,cADI,CAACJ,KACD,KAAK,eAAeD,EAAI,IAAIC,EAAI,GAAG,EAAG;AAC1C,gBAAM2J,IAAO3J,EAAI,SAAS,YAAY,KAAQ,IACxCpB,IAAe;AAAA,YACnB,MAAM;AAAA,YACN,OAAOmB,EAAI;AAAA,YACX,QAAQC,EAAI;AAAA,YACZ,MAAA2J;AAAA,YACA,SAAS,EAAE,SAAAzK,EAAA;AAAA,UAAQ;AAErB,eAAK,OAAON,GAAKwlB,CAAS;AAAA,QAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmBxG,GAElB;AACP,UAAMwH,IAAW,KAAK,eAAexH,EAAQ,IAAI;AACjD,QAAIwH,EAAU,QAAOA;AACrB,UAAMjV,IAAMyN,EAAQ,OAAOA,EAAQ;AACnC,WAAO,KAAK,SAASzN,CAAG;AAAA,EAC1B;AAAA,EAEQ,SAASwB,GAAiC;AAChD,UAAM0T,IAAU1T,EAAK,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC3D,WAAK0T,IACQA,EAAQ,MAAM,SAAS,EACxB,IAAI,CAACnkB,MAAMA,EAAE,MAAM,GAAI,CAAC,IAFf;AAAA,EAGvB;AAAA,EAEQ,eAAe2c,GAAiC;AACtD,QAAI,CAACA,EAAM,QAAO;AAClB,QAAI;AAGF,YAAMyH,IAFS,IAAI,UAAA,EACA,gBAAgBzH,GAAM,WAAW,EAClC,cAAc,OAAO;AACvC,UAAI,CAACyH,EAAO,QAAO;AACnB,YAAMC,IAAM,MAAM,KAAKD,EAAM,iBAAiB,IAAI,CAAC;AACnD,UAAIC,EAAI,WAAW,EAAG,QAAO;AAC7B,YAAMxH,IAAmB,CAAA;AACzB,iBAAWhP,KAAMwW,GAAK;AACpB,cAAM/S,IAAQ,MAAM,KAAKzD,EAAG,iBAAiB,OAAO,CAAC;AACrD,YACEyD,EAAM;AAAA,UACJ,CAACpS,MACEA,EAA2B,UAAU,KAAMA,EAA2B,UAAU;AAAA,QAAA;AAGrF,iBAAO;AAET,QAAA2d,EAAK,KAAKvL,EAAM,IAAI,CAACpS,OAAOA,EAAE,eAAe,IAAI,KAAA,CAAM,CAAC;AAAA,MAC1D;AACA,aAAO2d,EAAK,SAASA,IAAO;AAAA,IAC9B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,gBAAgB5N,GAAahQ,GAAyB;AAC5D,UAAMH,IAAM,KAAK,WAAWG,CAAM;AAClC,QAAI,CAACH,EAAK,QAAOmQ;AACjB,QAAIA,MAAQ,GAAI,QAAO;AACvB,QAAInQ,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,QAAQ;AACtE,YAAM8L,IAAS0Z,GAAiBrV,CAAG;AACnC,UAAI,CAACrE,EAAO,GAAI,QAAOqE;AACvB,YAAMsV,IAAUC,GAAuB5Z,EAAO,OAAO9L,EAAI,IAAI;AAC7D,aAAOylB,EAAQ,KAAKA,EAAQ,QAAQtV;AAAA,IACtC;AACA,QAAInQ,EAAI,SAAS,WAAW;AAC1B,YAAMqF,IAAI8K,EAAI,KAAA,EAAO,YAAA;AACrB,aAAI9K,MAAM,UAAUA,MAAM,OAAOA,MAAM,QAAc,KACjDA,MAAM,WAAWA,MAAM,OAAOA,MAAM,OAAa,KAC9C8K;AAAA,IACT;AACA,WAAOA;AAAA,EACT;AAAA,EAEQ,mBAAmB4N,GAAkB;AAC3C,UAAMre,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB,EAAE,UAAUwS,GAAU,UAAUE,EAAA,IAAa,KAAK,iBAAA,GAClD+R,IAAY,KAAK,aAAa,UAC9BllB,IAAU,SAAS,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1E,aAASgC,IAAI,GAAGA,IAAI6c,EAAK,QAAQ7c,KAAK,GAAG;AACvC,YAAMnB,IAAMJ,EAAKwS,IAAWjR,CAAC;AAC7B,UAAI,CAACnB,EAAK;AACV,YAAMwa,IAAOwD,EAAK7c,CAAC,KAAK,CAAA;AACxB,eAASd,IAAI,GAAGA,IAAIma,EAAK,QAAQna,KAAK,GAAG;AACvC,cAAMJ,IAAMN,EAAO,QAAQ2S,IAAWjS,CAAC;AACvC,YAAI,CAACJ,EAAK;AACV,YAAI,KAAK,eAAeD,EAAI,IAAIC,EAAI,GAAG,EAAG;AAC1C,cAAM2J,IAAO,KAAK,gBAAgB4Q,EAAKna,CAAC,KAAK,IAAIJ,EAAI,GAAG,GAClDpB,IAAe;AAAA,UACnB,MAAM;AAAA,UACN,OAAOmB,EAAI;AAAA,UACX,QAAQC,EAAI;AAAA,UACZ,MAAA2J;AAAA,UACA,SAAS,EAAE,SAAAzK,EAAA;AAAA,QAAQ;AAErB,aAAK,OAAON,GAAKwlB,CAAS;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAajkB,GAAgBmf,GAAiB;AACpD,UAAMtf,IAAM,KAAK,WAAWG,CAAM;AAClC,QAAIH,GAAK,MAAM,QAAQ;AACrB,YAAMoR,IAAQ,SAAS,cAAc,OAAO;AAC5CA,aAAAA,EAAM,OAAO,QACbA,EAAM,QAAQkO,GACdlO,EAAM,eAAe,OACrBA,EAAM,aAAa,IACZ,EAAE,SAASA,GAAO,OAAOkO,EAAA;AAAA,IAClC;AAEA,QADsBtf,GAAK,YAAYsf,EAAQ,SAAS;AAAA,CAAI,GACzC;AACjB,YAAMqG,IAAK,SAAS,cAAc,UAAU;AAC5C,aAAAA,EAAG,QAAQrG,GACXqG,EAAG,MAAM,SAAS,QAClBA,EAAG,MAAM,aAAa,YACtBA,EAAG,MAAM,eAAe,YACxBA,EAAG,MAAM,WAAW,UACpB,KAAK,SAASA,CAAE,GAChBA,EAAG,iBAAiB,SAAS,MAAM,KAAK,SAASA,CAAE,CAAC,GAC7C,EAAE,SAASA,GAAI,OAAOrG,EAAA;AAAA,IAC/B;AACA,QAAItf,GAAK,SAAS,WAAW;AAC3B,YAAMoR,IAAQ,SAAS,cAAc,OAAO;AAC5CA,aAAAA,EAAM,OAAO,YACbA,EAAM,UAAUkO,MAAY,UAAUA,MAAY,OAAOA,MAAY,MAC9D,EAAE,SAASlO,GAAO,OAAOkO,EAAA;AAAA,IAClC;AACA,QAAItf,GAAK,SAAS,YAAYA,GAAK,SAAS,SAASA,GAAK,SAAS,QAAQ;AACzE,YAAMoR,IAAQ,SAAS,cAAc,OAAO;AAC5CA,aAAAA,EAAM,OAAO,QACbA,EAAM,QAAQkO,GACP,EAAE,SAASlO,GAAO,OAAOkO,EAAA;AAAA,IAClC;AACA,QAAItf,GAAK,SAAS,UAAUA,GAAK,SAAS,UAAUA,GAAK,SAAS,YAAY;AAC5E,YAAMoR,IAAQ,SAAS,cAAc,OAAO;AAC5CA,MAAAA,EAAM,OAAOpR,EAAI,SAAS,SAAS,SAASA,EAAI,SAAS,SAAS,SAAS;AAC3E,YAAM4kB,IAAa,KAAK,8BAA8B5kB,EAAI,MAAMsf,CAAO;AACvElO,aAAAA,EAAM,QAAQwT,GACP,EAAE,SAASxT,GAAO,OAAOwT,EAAA;AAAA,IAClC;AACA,QAAI5kB,GAAK,SAAS,UAAUA,GAAK,SAAS,QAAQ;AAChD,YAAM4lB,IAAc5lB,EAAI,MAAM,eAAeA,EAAI,MAAM,aACjD0L,IAAU1L,EAAI,MAAM,WAAWA,EAAI,MAAM,WAAW,CAAA;AAC1D,UAAI4lB,MAAgB,IAAO;AACzB,cAAMC,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAAA,EAAM,QAAQ,IACdA,EAAM,cAAc,IACpBD,EAAO,YAAYC,CAAK;AACxB,mBAAWC,KAAOra,GAAS;AACzB,gBAAMsa,IAAK,SAAS,cAAc,QAAQ;AAC1C,UAAAA,EAAG,QAAQD,GACXC,EAAG,cAAcD,GACbzG,MAAYyG,MAAKC,EAAG,WAAW,KACnCH,EAAO,YAAYG,CAAE;AAAA,QACvB;AACA,eAAO,EAAE,SAASH,GAAQ,OAAOvG,EAAA;AAAA,MACnC;AACA,YAAMlO,IAAQ,SAAS,cAAc,OAAO;AAC5CA,MAAAA,EAAM,OAAO;AACb,YAAM6U,IAAS,oBAAoB,OAAO9lB,CAAM,CAAC;AACjDiR,MAAAA,EAAM,aAAa,QAAQ6U,CAAM,GACjC7U,EAAM,QAAQkO;AACd,UAAI4G,IAAW,SAAS,eAAeD,CAAM;AAC7C,UAAI,CAACC,GAAU;AACb,QAAAA,IAAW,SAAS,cAAc,UAAU,GAC5CA,EAAS,KAAKD;AACd,mBAAWF,KAAOra,GAAS;AACzB,gBAAMsa,IAAK,SAAS,cAAc,QAAQ;AAC1C,UAAAA,EAAG,QAAQD,GACXG,EAAS,YAAYF,CAAE;AAAA,QACzB;AACA,aAAK,KAAK,YAAYE,CAAQ;AAAA,MAChC;AACA,aAAO,EAAE,SAAS9U,GAAO,OAAOkO,GAAS,YAAY2G,EAAA;AAAA,IACvD;AACA,UAAM7U,IAAQ,SAAS,cAAc,OAAO;AAC5C,WAAAA,EAAM,OAAO,QACbA,EAAM,QAAQkO,GACP,EAAE,SAASlO,GAAO,OAAOkO,EAAA;AAAA,EAClC;AAAA,EAEQ,oBAAoBnf,GAAgBqa,GAA0B;AACpE,QAAIA,KAAY,KAA+B,QAAO;AACtD,UAAMxa,IAAM,KAAK,WAAWG,CAAM;AAClC,QAAI,CAACH,EAAK,QAAO,OAAOwa,CAAO;AAE/B,QAAI,OAAOA,KAAY,UAAU;AAC/B,YAAMpO,IAAMoO;AAIZ,UAHIpO,EAAI,SAAS,YAAY,OAAOA,EAAI,SAAU,YAG9C,OAAOA,EAAI,QAAS,YAAY,OAAOA,EAAI,SAAU,YAAY,WAAWA;AAC9E,eAAOA,EAAI;AAAA,IAEf;AAEA,SAAKpM,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,WAAW,OAAOwa,KAAY,UAAU;AACvG,UAAIxa,EAAI,SAAS,UAAU;AACzB,cAAM4L,IAAM5L,EAAI;AAEhB,gBADc4L,GAAK,UAAU,eACf,eACLgH,GAAoB4H,GAAS,EAAE,QAAQ,cAAc,WAAW5O,GAAK,WAAW,IAElFgH,GAAoB4H,GAAS,EAAE,QAAQ,WAAW,OAAO5O,GAAK,OAAO;AAAA,MAC9E;AAGA,YAAMkH,IADM9S,EAAI,QACG,UAAU;AAC7B,aAAI8S,MAAU,YAAYA,MAAU,WAAWA,MAAU,QAChDC,GAAwByH,GAAS1H,CAAK,IAExC,OAAO0H,CAAO;AAAA,IACvB;AAEA,WAAO,OAAOA,CAAO;AAAA,EACvB;AAAA,EAEQ,2BAAyE;AAC/E,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,cAAc,KAAK,WAAW,WAAW;AAClE,aAAO,EAAE,IAAI,IAAM,OAAO,KAAK,SAAS,SAAS,GAAA;AAGnD,UAAMxa,IAAM,KAAK,WAAW,KAAK,WAAW,MAAM;AAClD,QACEA,MACCA,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,WAC7D,KAAK,mBAAmB,kBACxB;AACA,YAAM4kB,IAAauB,GAAsB,KAAK,QAAQ,KAAK;AAC3D,UAAIvB,MAAe,GAAI,QAAO,EAAE,IAAI,IAAM,OAAO,GAAA;AAEjD,YAAM9Y,IAAS0Z,GAAiBZ,CAAU;AAC1C,UAAI,CAAC9Y,EAAO,GAAI,QAAO,EAAE,IAAI,GAAA;AAC7B,YAAM2Z,IAAUC,GAAuB5Z,EAAO,OAAO9L,EAAI,IAAI;AAC7D,aAAKylB,EAAQ,KACN,EAAE,IAAI,IAAM,OAAOA,EAAQ,MAAA,IADV,EAAE,IAAI,GAAA;AAAA,IAEhC;AAEA,WAAO,EAAE,IAAI,IAAM,OAAO,KAAK,kBAAgB;AAAA,EACjD;AAAA,EAEQ,wBAAiC;AACvC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,cAAc,KAAK,WAAW,WAAW,KAAM,QAAO;AACjF,UAAM,EAAE,OAAAvlB,GAAO,QAAAC,EAAA,IAAW,KAAK,YACzBwJ,IAAO,KAAK,yBAAA;AAClB,WAAKA,EAAK,MAIV,KAAK,WAAWzJ,GAAOC,GAAQwJ,EAAK,KAAK,GACzC,KAAK,OAAOzJ,CAAK,GACjB,KAAK,cAAc,EAAK,GACjB,OANL,KAAK,QAAQ,MAAM,EAAE,eAAe,IAAM,GACnC;AAAA,EAMX;AAAA,EAEQ,SAASylB,GAAyB;AACxC,UAAMS,IAAQ,OAAO,iBAAiBT,CAAE;AACxC,QAAIU,IAAa,OAAO,WAAWD,EAAM,UAAU;AACnD,KAAI,CAAC,OAAO,SAASC,CAAU,KAAKA,KAAc,OAAGA,IAAa,KAClEV,EAAG,OAAO;AACV,UAAMrL,IAAQ,KAAK,KAAKqL,EAAG,eAAeU,CAAU;AACpD,IAAAV,EAAG,OAAO,KAAK,IAAI,GAAGrL,CAAK,GAC3BqL,EAAG,MAAM,YAAY,GAAGU,CAAU;AAAA,EACpC;AAAA,EAEQ,2BACN/D,GACAgE,GACA;AACA,UAAMC,IAASxP,IACTyP,IAAWzU,IACX0U,IAAczU;AACpB,IAAAsU,EAAQ,MAAM,OAAO,GAAGhE,EAAI,OAAOiE,CAAM,MACzCD,EAAQ,MAAM,MAAM,GAAGhE,EAAI,MAAMkE,CAAQ,MACzCF,EAAQ,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAGhE,EAAI,QAAQiE,IAAS,CAAC,CAAC,MAC5DD,EAAQ,MAAM,SAAS,GAAG,KAAK,IAAI,GAAGhE,EAAI,UAAUkE,IAAWC,EAAY,CAAC;AAAA,EAC9E;AAAA,EA8KQ,kBAAkBvmB,GAAeC,GAAgB0O,GAAyB;AAChF,UAAM7O,IAAM,KAAK,WAAWG,CAAM;AAIlC,QAHI,CAACH,KACDA,EAAI,SAAS6O,KACG,KAAK,UAAU,mBAAmB3O,GAAOC,CAAM,EACnD,SAAU,QAAO;AACjC,UAAMiQ,IAAW,KAAK,UAAU,iBAAiBlQ,GAAOF,CAAG,GACrD0P,IAAU,KAAK,UAAU,wBAAwBxP,GAAOF,CAAG;AAEjE,QADqBoQ,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,QACjE,QAAO;AACzB,QAAI1P,EAAI,SAAS,UAAU;AACzB,YAAM0Q,IAAcC,GAAoBP,EAAS,KAAK;AACtD,aAAKM,KACL,KAAK,aAAa,EAAE,MAAM,UAAU,OAAAxQ,GAAO,QAAAC,GAAQ,OAAOuQ,GAAa,GAChE,MAFkB;AAAA,IAG3B;AACA,QAAI1Q,EAAI,SAAS,QAAQ;AACvB,YAAM0mB,IAAY9V,GAAkBR,EAAS,KAAK;AAClD,aAAKsW,GAAW,QAChB,KAAK,SAASA,EAAU,MAAMA,EAAU,MAAM,GACvC,MAFsB;AAAA,IAG/B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAexmB,GAAeC,GAAgBwO,GAAkB;AACtE,QAAI,KAAK,eAAezO,GAAOC,CAAM,EAAG,QAAO;AAC/C,UAAMH,IAAM,KAAK,WAAWG,CAAM;AAClC,QAAI,CAACH,KAAOA,EAAI,SAAS,OAAQ,QAAO;AACxC,UAAMwa,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM,GAC9CkM,IAAS,KAAK,mBAAmBmO,CAAO;AAC9C,QAAI,CAACnO,KAAUsC,IAAW,KAAKA,KAAYtC,EAAO,OAAQ,QAAO;AACjE,UAAMsa,IAAata,EAAO,OAAO,CAAC7J,GAAGhB,MAAMA,MAAMmN,CAAQ,GACnDhF,IACJ6Q,KAAW,OAAOA,KAAY,YAAaA,EAAoC,SAAS,SACpF,EAAE,MAAM,QAAQ,QAAQmM,MACxBA,GACA/nB,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAAsB;AAAA,MACA,QAAAC;AAAA,MACA,MAAAwJ;AAAA,IAAA,GAEIya,IAAY,KAAK,aAAa;AACpC,gBAAK,OAAOxlB,GAAKwlB,CAAS,GACnB;AAAA,EACT;AAAA,EAEQ,mBAAmB3b,GAAiC;AAC1D,QAAI,MAAM,QAAQA,CAAK,KAAKA,EAAM,MAAM,CAACpD,MAAM,OAAOA,KAAM,QAAQ;AAClE,aAAOoD;AAET,QAAIA,KAAS,OAAOA,KAAU,UAAU;AACtC,YAAM2D,IAAM3D;AACZ,UAAI2D,EAAI,SAAS,UAAU,MAAM,QAAQA,EAAI,MAAM;AACjD,eAAOA,EAAI,OAAO,OAAO,CAAC/G,MAAmB,OAAOA,KAAM,QAAQ;AAAA,IAEtE;AACA,QAAI,OAAOoD,KAAU,UAAU;AAC7B,YAAM4c,IAAU5c,EAAM,KAAA;AACtB,aAAK4c,IACEA,EAAQ,MAAM,SAAS,EAAE,OAAO,OAAO,IADzB,CAAA;AAAA,IAEvB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAASuB,GAAcha,GAAiB;AAE9C,QADI,OAAO,WAAa,OACpB,CAACga,EAAM;AACX,UAAMC,IAAO,SAAS,cAAc,GAAG;AACvC,IAAAA,EAAK,OAAOD,GACZC,EAAK,SAASja,KAAU,SACxBia,EAAK,MAAM,uBACXA,EAAK,MAAM,UAAU,QACrB,SAAS,KAAK,YAAYA,CAAI,GAC9BA,EAAK,MAAA,GACLA,EAAK,OAAA;AAAA,EACP;AAAA,EAEQ,cAAc3mB,GAAeC,GAAgB;AACnD,UAAMqa,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM,GAC9C2mB,IAActM,MAAY,MAAQA,MAAY,UAAUA,MAAY,OAAOA,MAAY,GACvFxa,IAAM,KAAK,WAAWG,CAAM,GAC5BikB,IAAY,KAAK,aAAa;AACpC,QAAIpkB,KAAOA,EAAI,QAAQ;AAErB,UAAI8mB;AACF;AAEF,YAAM5nB,IAAU,eAAe,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,IAE1E6nB,IAAkB;AAAA,QACtB,EAAE,MAAM,QAAQ,OAAA7mB,GAAO,QAAAC,GAAQ,MAAM,IAAM,SAAS,EAAE,SAAAjB,EAAA,EAAQ;AAAA,MAAE,GAG5DS,IAAO,KAAK,UAAU,SAAA;AAC5B,iBAAWuB,KAAKvB,GAAM;AAEpB,YADI,CAACuB,KACDA,EAAE,OAAOhB,EAAO;AACpB,cAAM8mB,IAAM,KAAK,UAAU,QAAQ9lB,EAAE,IAAIf,CAAM;AAE/C,SADe6mB,MAAQ,MAAQA,MAAQ,UAAUA,MAAQ,OAAOA,MAAQ,MAEtED,EAAK,KAAK,EAAE,MAAM,QAAQ,OAAO7lB,EAAE,IAAI,QAAAf,GAAQ,MAAM,IAAO,SAAS,EAAE,SAAAjB,EAAA,GAAW;AAAA,MAEtF;AACA,iBAAWkB,KAAK2mB,EAAM,MAAK,OAAO3mB,GAAGgkB,CAAS;AAC9C,WAAK,OAAOlkB,CAAK;AACjB;AAAA,IACF;AAGA,UAAMtB,IAAe,EAAE,MAAM,QAAQ,OAAAsB,GAAO,QAAAC,GAAQ,MADvC,CAAC2mB,EACsC;AACpD,SAAK,OAAOloB,GAAKwlB,CAAS,GAC1B,KAAK,OAAOlkB,CAAK;AAAA,EACnB;AAAA,EAiBQ,sBAAsBoT,GAAgB2F,GAA+C;AAC3F,UAAMvZ,IAAS,KAAK,UAAU,UAAA,GACxBmlB,IAAS,KAAK,UAAU,YAAY5L,EAAI,KAAK,GAC7CgO,IAAQhO,EAAI,WAAW,MACvB6L,IAASmC,IAASvnB,EAAO,QAAQ,SAAS,IAAI,IAAI,KAAMA,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO6Y,EAAI,MAAM,CAAC;AAClI,QAAI6L,IAAS,EAAG;AAChB,UAAMoC,IAA8BD,IAChC;AAAA,MACE,MAAM;AAAA,MACN,UAAUpC;AAAA,MACV,QAAQA;AAAA,MACR,UAAU;AAAA,MACV,QAAQnlB,EAAO,QAAQ,SAAS;AAAA,IAAA,IAElC;AAAA,MACE,MAAM;AAAA,MACN,UAAUmlB;AAAA,MACV,QAAQA;AAAA,MACR,UAAU,KAAK,IAAI,GAAGC,CAAM;AAAA,MAC5B,QAAQ,KAAK,IAAI,GAAGA,CAAM;AAAA,IAAA;AAEhC,QAAIjG,IAA+B,CAAA;AACnC,QAAIvL,EAAG,YAAY,KAAK,YAAY;AAClC,YAAM0K,IAAK,KAAK,YACVmJ,IAAY,KAAK,UAAU,YAAYnJ,EAAG,KAAK,GAC/CoJ,IAAY1nB,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO4d,EAAG,MAAM,CAAC;AAgBrF,MAAAa,IAAa,CAfuBoI,IAChC;AAAA,QACE,MAAM;AAAA,QACN,UAAUE;AAAA,QACV,QAAQtC;AAAA,QACR,UAAU;AAAA,QACV,QAAQnlB,EAAO,QAAQ,SAAS;AAAA,MAAA,IAElC;AAAA,QACE,MAAM;AAAA,QACN,UAAUynB;AAAA,QACV,QAAQtC;AAAA,QACR,UAAU,KAAK,IAAI,GAAGuC,CAAS;AAAA,QAC/B,QAAQ,KAAK,IAAI,GAAGtC,CAAM;AAAA,MAAA,CAEP;AAAA,IAC3B,MAAA,CAAWxR,EAAG,WAAWA,EAAG,UAC1BuL,IAAa,CAAC,GAAG,KAAK,iBAAiBqI,CAAW,IAElDrI,IAAa,CAACqI,CAAW;AAE3B,SAAK,kBAAkB,KAAK,YAAYrI,CAAU;AAClD,UAAMwI,IACJH,EAAY,SAAS,SACjB,EAAE,OAAOjO,EAAI,OAAO,QAAQvZ,EAAO,QAAQolB,CAAM,GAAG,OAAO,SAC3D,EAAE,OAAO7L,EAAI,OAAO,QAAQA,EAAI,OAAA;AACtC,SAAK,aAAaoO,GAClB,KAAK,eAAeA,EAAW,OAAOA,EAAW,MAAM,GACvD,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACDH,EAAY,SAAS,WACvB,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAAA,EAE/B;AAAA,EAEQ,YAAYte,GAA0B;AAC5C,UAAMqH,IAA2B,CAAA,GAC3BqX,IAAS,CAAC,GAAG1e,CAAM,EAAE,KAAK,CAAChB,GAAGR,MAC9BQ,EAAE,SAASR,EAAE,OAAaQ,EAAE,SAAS,SAAS,KAAK,IACnDA,EAAE,aAAaR,EAAE,WAAiBQ,EAAE,WAAWR,EAAE,WACjDQ,EAAE,aAAaR,EAAE,WAAiBQ,EAAE,WAAWR,EAAE,WACjDQ,EAAE,WAAWR,EAAE,SAAeQ,EAAE,SAASR,EAAE,SACxCQ,EAAE,SAASR,EAAE,MACrB;AACD,eAAWlG,KAAKomB,GAAQ;AACtB,YAAMnoB,IAAO8Q,EAAO,GAAG,EAAE;AACzB,UAAI,CAAC9Q,GAAM;AACT,QAAA8Q,EAAO,KAAK,EAAE,GAAG/O,GAAG;AACpB;AAAA,MACF;AACA,UAAI/B,EAAK,SAAS+B,EAAE,MAAM;AACxB,QAAA+O,EAAO,KAAK,EAAE,GAAG/O,GAAG;AACpB;AAAA,MACF;AACA,UAAIA,EAAE,SAAS;AAMb,YAJE/B,EAAK,aAAa+B,EAAE,YACpB/B,EAAK,WAAW+B,EAAE,UAClB/B,EAAK,YAAY+B,EAAE,SAAS,KAC5BA,EAAE,YAAY/B,EAAK,SAAS,GAChB;AACZ,UAAAA,EAAK,WAAW,KAAK,IAAIA,EAAK,UAAU+B,EAAE,QAAQ,GAClD/B,EAAK,SAAS,KAAK,IAAIA,EAAK,QAAQ+B,EAAE,MAAM;AAC5C;AAAA,QACF;AAAA,aACK;AACL,cAAMqmB,IAAWpoB,EAAK,aAAa+B,EAAE,YAAY/B,EAAK,WAAW+B,EAAE,QAC7DsmB,IAAWroB,EAAK,aAAa+B,EAAE,YAAY/B,EAAK,WAAW+B,EAAE,QAC7DumB,IAAYtoB,EAAK,YAAY+B,EAAE,SAAS,KAAKA,EAAE,YAAY/B,EAAK,SAAS,GACzEuoB,IAAYvoB,EAAK,YAAY+B,EAAE,SAAS,KAAKA,EAAE,YAAY/B,EAAK,SAAS;AAC/E,YAAIooB,KAAYE,GAAW;AACzB,UAAAtoB,EAAK,WAAW,KAAK,IAAIA,EAAK,UAAU+B,EAAE,QAAQ,GAClD/B,EAAK,SAAS,KAAK,IAAIA,EAAK,QAAQ+B,EAAE,MAAM;AAC5C;AAAA,QACF;AACA,YAAIsmB,KAAYE,GAAW;AACzB,UAAAvoB,EAAK,WAAW,KAAK,IAAIA,EAAK,UAAU+B,EAAE,QAAQ,GAClD/B,EAAK,SAAS,KAAK,IAAIA,EAAK,QAAQ+B,EAAE,MAAM;AAC5C;AAAA,QACF;AAAA,MACF;AACA,MAAA+O,EAAO,KAAK,EAAE,GAAG/O,GAAG;AAAA,IACtB;AACA,WAAO+O;AAAA,EACT;AAAA,EAEQ,oBACNzB,GACAtO,GACAC,GACAuL,GACA;AACA,SAAK,cAAA,GACL,KAAK,aAAa,EAAE,OAAAxL,GAAO,QAAAC,EAAA,GAC3B,KAAK,aAAaqO,GAClB,KAAK,yBAAyBA,EAAK,eAAe;AAClD,UAAMgM,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM;AACpD,SAAK,sBAAsB,EAAE,OAAAD,GAAO,QAAAC,GAAQ,OAAOqa,EAAA;AACnD,UAAMmN,IACJjc,GAAS,wBAAwB,KAAK,oBAAoBvL,GAAQqa,CAAO,GACrE,EAAE,SAAAoN,GAAS,OAAAnf,EAAA,IAAU,KAAK,aAAatI,GAAQwnB,CAAY,GAC3DvW,IAAQwW;AACd,IAAAxW,EAAM,QAAQ3I;AACd,UAAMof,IAAazW,aAAiB,oBAAoBA,EAAM,SAAS;AACvE,IAAAA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,YAAY,cACxBA,EAAM,MAAM,SAAS,KACrBA,EAAM,MAAM,UAAUyW,IAAa,MAAM,WACzCzW,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,eAAe,KAC3BA,EAAM,MAAM,YAAY,QACxBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,UAAU,QACtBA,EAAM,MAAM,WAAW,QACvBA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,aAAa,WAExBA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,qBAAqB,KACzCA,EAAM,MAAc,kBAAkB,QACtCA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,mBAAmB,eACpCA,aAAiB,oBAAoBA,aAAiB,yBACxDA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,UAAU,UAEpByW,MACFzW,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,aAAa;AAE3B,UAAMpR,IAAM,KAAK,WAAWG,CAAM;AAiBlC,QAhBAiR,EAAM,MAAM,YACVpR,GAAK,OAAO,UACXA,GAAK,SAAS,YAAYA,GAAK,SAAS,SAASA,GAAK,SAAS,SAAS,UAAU,SACrFoR,EAAM,iBAAiB,WAAW,CAACvQ,MAAM,KAAK,UAAUA,GAAoB2N,CAAI,CAAC,GACjF4C,EAAM,iBAAiB,SAAS,MAAM;AACpC,OAAIA,aAAiB,oBAAoBA,aAAiB,0BAA2B,OAAA;AAAA,IACvF,CAAC,GACD,KAAK,oBAAoBA,CAAK,GAC9B5C,EAAK,cAAc,IACnBA,EAAK,YAAY4C,CAAK,GAClBA,EAAM,QAAQ,YAAA,MAAkB,cAClC,sBAAsB,MAAM;AAC1B,MAAIA,aAAiB,uBAAqB,KAAK,SAASA,CAAK;AAAA,IAC/D,CAAC,GAEHA,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM,GAEjC1F,GAAS,qBACR0F,aAAiB,oBAAoBA,aAAiB,sBACvD;AACA,YAAM+Q,IAAM/Q,EAAM,MAAM;AACxB,MAAAA,EAAM,kBAAkB+Q,GAAKA,CAAG;AAAA,IAClC;AACA,SAAK,UAAU/Q,GACf,KAAK,kBAAkBlR,GAAOC,GAAQiR,CAAK;AAAA,EAC7C;AAAA,EAEQ,iBACNhH,GACAlK,GACAC,GACAuL,GACA;AACA,SAAK,cAAA,GACL,KAAK,aAAa,EAAE,OAAAxL,GAAO,QAAAC,EAAA;AAE3B,UAAMmiB,IAAM,KAAK,4BAA4BpiB,GAAOC,CAAM;AAC1D,QAAI,CAACmiB,EAAK;AACV,UAAMgE,IAAU,SAAS,cAAc,KAAK;AAC5C,SAAK,aAAaA,GAClB,KAAK,yBAAyB,MAC9BA,EAAQ,MAAM,WAAW,YACzBA,EAAQ,MAAM,UAAU,SACxBA,EAAQ,MAAM,aAAa,WAC3BA,EAAQ,QAAQ,kBAAkB,SAClCA,EAAQ,MAAM,gBAAgB,QAC9BA,EAAQ,MAAM,UAAU,KACxBA,EAAQ,MAAM,SAAS;AACvB,UAAM9L,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM;AACpD,SAAK,sBAAsB,EAAE,OAAAD,GAAO,QAAAC,GAAQ,OAAOqa,EAAA;AACnD,UAAMmN,IACJjc,GAAS,wBAAwB,KAAK,oBAAoBvL,GAAQqa,CAAO,GACrE,EAAE,SAAAoN,GAAS,OAAAnf,EAAA,IAAU,KAAK,aAAatI,GAAQwnB,CAAY,GAC3DvW,IAAQwW;AACd,IAAAxW,EAAM,QAAQ3I;AACd,UAAMof,IAAazW,aAAiB,oBAAoBA,EAAM,SAAS;AACvE,IAAAA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,YAAY,cACxBA,EAAM,MAAM,SAAS,KACrBA,EAAM,MAAM,UAAUyW,IAAa,MAAM,WACzCzW,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,eAAe,KAC3BA,EAAM,MAAM,YAAY,QACxBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,UAAU,QACtBA,EAAM,MAAM,WAAW,QACvBA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,aAAa,WAExBA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,qBAAqB,KACzCA,EAAM,MAAc,kBAAkB,QACtCA,EAAM,MAAc,mBAAmB,QACvCA,EAAM,MAAc,mBAAmB,eACpCA,aAAiB,oBAAoBA,aAAiB,yBACxDA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,UAAU,UAEpByW,MACFzW,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,aAAa;AAE3B,UAAMpR,IAAM,KAAK,WAAWG,CAAM;AAwBlC,QAvBAiR,EAAM,MAAM,YACVpR,GAAK,OAAO,UACXA,GAAK,SAAS,YAAYA,GAAK,SAAS,SAASA,GAAK,SAAS,SAAS,UAAU,SACrFoR,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,iBAAiB,WAAW,CAACvQ,MAAM,KAAK,UAAUA,GAAoBylB,CAAO,CAAC,GACpFlV,EAAM,iBAAiB,oBAAoB,KAAK,2BAA2B,GAC3EA,EAAM,iBAAiB,kBAAkB,KAAK,yBAAyB,GACvEA,EAAM,iBAAiB,SAAS,MAAM;AACpC,OAAIA,aAAiB,oBAAoBA,aAAiB,0BAA2B,OAAA;AAAA,IACvF,CAAC,GACD,KAAK,oBAAoBA,CAAK,GAC9BkV,EAAQ,YAAYlV,CAAK,GAIrBA,EAAM,QAAQ,YAAA,MAAkB,cAClC,sBAAsB,MAAM;AAC1B,MAAIA,aAAiB,uBAAqB,KAAK,SAASA,CAAK;AAAA,IAC/D,CAAC,GAEH,KAAK,KAAK,YAAYkV,CAAO,GAC7B,KAAK,2BAA2BhE,GAAKgE,CAAO,GAC5ClV,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM,GAEjC1F,GAAS,qBACR0F,aAAiB,oBAAoBA,aAAiB,sBACvD;AACA,YAAM+Q,IAAM/Q,EAAM,MAAM;AACxB,MAAAA,EAAM,kBAAkB+Q,GAAKA,CAAG;AAAA,IAClC;AACA,SAAK,UAAU/Q,GACf,KAAK,uBAAuBkV,GAC5B,KAAK,kBAAkBpmB,GAAOC,GAAQiR,CAAK;AAAA,EAC7C;AAAA,EAEQ,UAAUvQ,GAAkB2N,GAAmB;AACrD,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,QAAS;AACvC,UAAMsZ,IAAM,KAAK,IAAA;AAGjB,QAFIjnB,EAAE,eAAe,KAAK,aACtBinB,IAAM,KAAK,qBAAqB,MAChC,KAAK,oBAAoBjnB,CAAC,EAAG;AACjC,UAAM,EAAE,OAAAX,GAAO,QAAAC,EAAA,IAAW,KAAK;AAC/B,QAAIA,MAAW,KAAM;AACrB,UAAM4nB,IAAa,KAAK,QAAQ,QAAQ,kBAAkB,YACpDC,IAAannB,EAAE,QAAQ,WAAWA,EAAE,QACpConB,IAAgB,CAAC3E,GAAkBC,MAAqB;AAC5D,YAAM5Z,IAAO,KAAK,yBAAA;AAClB,MAAKA,EAAK,OACV,KAAK,WAAWzJ,GAAOC,GAAQwJ,EAAK,KAAK,GACzC,KAAK,OAAOzJ,CAAK,GACjB,KAAK,cAAc,EAAK,GACxB,KAAK,eAAeojB,GAAUC,CAAQ;AAAA,IACxC;AAEA,QAAI1iB,EAAE,QAAQ,OAAO;AACnB,MAAAA,EAAE,eAAA,GACFonB,EAAc,GAAGpnB,EAAE,WAAW,KAAK,CAAC;AACpC;AAAA,IACF;AACA,QAAIA,EAAE,QAAQ,SAAS;AACrB,UAAIknB,KAAcC;AAEhB;AAEF,MAAAnnB,EAAE,eAAA,GACFonB,EAAcpnB,EAAE,WAAW,KAAK,GAAG,CAAC;AACpC;AAAA,IACF;AACE,QAAIA,EAAE,QAAQ;AAIZ,UAHAA,EAAE,eAAA,GACF,KAAK,WAAW2N,CAAI,GACpB,KAAK,OAAA,GACD,KAAK,cAAc,KAAK,WAAW,WAAW,MAAM;AACtD,cAAMgM,IAAU,KAAK,UAAU,QAAQ,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GAC9EyD,IAAc,KAAK,sBAAsBzD,CAAO;AACtD,aAAK,oBAAoByD,CAAW;AAAA,MACtC;AAAA,WACSpd,EAAE,QAAQ,eAAe,KAAK,QAAQ,UAAU,OACzDA,EAAE,eAAA,GACF,KAAK,WAAWX,GAAOC,GAAQ,EAAE,GACjC,KAAK,OAAOD,CAAK,GACjB,KAAK,cAAc,EAAK,GACxB,KAAK,eAAe,GAAG,CAAC;AAAA,EAE9B;AAAA,EAEQ,WAAWA,GAAeC,GAAuBsI,GAAgB;AACvE,QAAItI,MAAW,KAAM;AAErB,UAAMykB,IADM,KAAK,WAAWzkB,CAAM,GAE3B,SAAS,YACVsI,KACE,OAAOA,KAAU,YACjB,OAAQA,EAAc,SAAU,YAChC,WAAYA,IACZA,IACA,EAAE,OAAOA,KAAU,OAA8B,KAAK,OAAOA,CAAK,GAAG,OAAOA,KAAS,GAAA,IACvFA,GACA7J,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAAsB;AAAA,MACA,QAAAC;AAAA,MACA,MAAMykB;AAAA,IAAA,GAEFR,IAAY,KAAK,aAAa;AACpC,SAAK,OAAOxlB,GAAKwlB,CAAS;AAAA,EAC5B;AAAA,EAEQ,kBAAkB;AACxB,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,WAAY,QAAO,KAAK,SAAS,SAAS;AACrE,QAAI,KAAK,mBAAmB,kBAAkB;AAC5C,UAAI,KAAK,QAAQ,SAAS;AACxB,eAAO,KAAK,QAAQ;AAEtB,UAAI,KAAK,QAAQ,SAAS,UAAU;AAClC,YAAI,KAAK,QAAQ,UAAU,GAAI,QAAO;AACtC,cAAMtY,IAAS,OAAO,KAAK,QAAQ,KAAK;AACxC,eAAO,OAAO,MAAMA,CAAM,IAAI,KAAKA;AAAA,MACrC;AACA,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,WAAI,KAAK,mBAAmB,oBACnB,KAAK,QAAQ,QAEd,KAAK,QAAgC;AAAA,EAC/C;AAAA,EAEQ,oBAAoB8b,GAAsB;AAShD,IARI,CAAC,KAAK,cAQN,EANFA,aAAmB,mBACfA,EAAQ,SAAS,cACjBA,EAAQ,SAAS,UACjBA,EAAQ,SAAS,UACjBA,EAAQ,SAAS,mBACjBA,aAAmB,sBAEzBA,EAAQ,iBAAiB,UAAU,MAAM;AACvC,YAAM5J,IAAK,KAAK;AAChB,UAAI,CAACA,EAAI;AACT,YAAM,EAAE,OAAA9d,GAAO,QAAAC,EAAA,IAAW6d;AAC1B,UAAI7d,MAAW,KAAM;AACrB,YAAMwJ,IAAO,KAAK,yBAAA;AAClB,MAAKA,EAAK,OACV,KAAK,WAAWzJ,GAAOC,GAAQwJ,EAAK,KAAK,GACzC,KAAK,OAAOzJ,CAAK,GACjB,KAAK,cAAc,EAAK;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEQ,WAAWsO,GAAmB;AACpC,UAAMwP,IAAK,KAAK;AAChB,QAAI,CAACA,KAAMA,EAAG,WAAW,MAAM;AAC7B,WAAK,cAAc,EAAK,GACxBxP,EAAK,KAAA;AACL;AAAA,IACF;AAEA,UAAM,EAAE,OAAAtO,GAAO,QAAAC,EAAA,IAAW6d,GACpBkK,IACJ,KAAK,uBACL,KAAK,oBAAoB,UAAUhoB,KACnC,KAAK,oBAAoB,WAAWC,IAChC,KAAK,oBAAoB,QACzB,KAAK,UAAU,QAAQD,GAAOC,CAAM,GAEpCqa,IAAU,KAAK,UAAU,QAAQta,GAAOC,CAAM,GAC9CgoB,IAAO,CAAC9iB,MAAgBA,KAAgC,IACxD+iB,IAAiBD,EAAKD,CAAI,GAC1BG,IAAoBF,EAAK3N,CAAO;AAItC,QAAI,CAAC,OAAO,GAAG6N,GAAmBD,CAAc,GAAG;AACjD,YAAMxpB,IAAe;AAAA,QACnB,MAAM;AAAA,QACN,OAAAsB;AAAA,QACA,QAAAC;AAAA,QACA,MAAMioB;AAAA,QACN,MAAMC;AAAA,MAAA;AAER,WAAK,OAAOzpB,GAAK,EAAI;AAAA,IACvB;AAEA,SAAK,cAAc,EAAK,GACxB4P,EAAK,KAAA;AAAA,EACP;AAAA,EAEQ,cAAc8Z,IAAc,IAAO;AACzC,SAAK,qBAAA,GAED,KAAK,WAAW,KAAK,YAAY,KAAK,kBACxCla,EAAiB,KAAK,OAAO,GAE/BA,EAAiB,KAAK,oBAAoB,GACtC,KAAK,cAAc,KAAK,2BAA2B,SACrD,KAAK,WAAW,cAAc,KAAK,yBAErC,KAAK,UAAU,MACf,KAAK,uBAAuB,MAC5B,KAAK,aAAa,MAClB,KAAK,yBAAyB,MAC9B,KAAK,sBAAsB,MAC3B,KAAK,YAAY,IACbka,MACF,KAAK,aAAa,MAClB,KAAK,eAAe,MAAM,IAAI,GAC9B,KAAK,iBAAA;AAAA,EAET;AACF;ACpgGO,MAAMC,KAAe,CAC1B7oB,MACyBA;ACvMpB,MAAM8oB,GAA8E;AAAA,EA4FzF,YAAYC,GAAmB;AA1F/B,SAAQ,QAA+B,MACvC,KAAQ,aAAoC,MAC5C,KAAQ,yBAAgD,MAMxD,KAAQ,mBAA4C,MAOpD,KAAQ,gBAAqC,MAC7C,KAAQ,gBAAqC,MAC7C,KAAQ,gBAAsC,MAC9C,KAAQ,QAAuB,MAC/B,KAAQ,cAAqC,MAC7C,KAAQ,mBAAkC,MAC1C,KAAQ,sBAAwE,MAChF,KAAQ,QAA+B,MACvC,KAAQ,aAA4B,MAGpC,KAAQ,UAAU,IAclB,KAAQ,oBAAwC,MAChD,KAAQ,yBAA8C,MACtD,KAAQ,oBAA0D,MAClE,KAAQ,yBAA4D,MACpE,KAAQ,sBAAoD,MAC5D,KAAQ,4BAA2C,MACnD,KAAQ,kBASG,MAEX,KAAQ,0CAA0B,IAAA,GAClC,KAAQ,yCAAyB,IAAA,GACjC,KAAQ,iBAAoC,MAC5C,KAAQ,wBAAkD,MAC1D,KAAQ,aAAgC,MACxC,KAAQ,kBAAoC,CAAA,GAC5C,KAAQ,aAAgC,MACxC,KAAQ,eAA6B,CAAA,GACrC,KAAQ,wCAAwB,IAAA,GAChC,KAAQ,oCAAoB,IAAA,GAyB1B,KAAK,OAAOA,EAAK,MACjB,KAAK,KAAK,UAAU,IAAI,cAAc,GACtC,KAAK,aAAaA,EAAK,SAAS,cAAc,QAC9C,KAAK,WAAWA,EAAK,SAAS,YAAY,UAC1C,KAAK,WAAWA,EAAK,SAAS,YAAY,QAC1C,KAAK,SAASA,EAAK,SAAS,QAC5B,KAAK,OAAOA,EAAK,SAAS,MAC1B,KAAK,gBAAgBA,EAAK,SAAS;AAEnC,UAAMC,IAAcD,EAAK,eAAe,MAClCE,IAAcD,KAAe,CAAA;AACnC,SAAK,aAAaA,KAAgB,MAClC,KAAK,YAAY,IAAIE;AAAA,MACnBD;AAAA,MACAF,EAAK;AAAA,MACLA,EAAK;AAAA,IAAA,GAEP,KAAK,eAAe,IAAI1pB,GAAA,GACxB,KAAK,cAAc,IAAIsB,GAAY,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI,GACxE,KAAK,WAAW,KAAK,eAAe,KAAK,UAAU,GACnD,KAAK,eAAeooB,EAAK,OAAO,GAChC,KAAK,mBAAA,GACA,KAAK,YAAA;AAAA,EACZ;AAAA,EAtFQ,eAAevoB,GAAeC,GAAgB;AACpD,WAAO,KAAK,aAAa,cAAc,KAAK,UAAU,WAAWD,GAAOC,CAAM;AAAA,EAChF;AAAA,EAEQ,aAAaJ,GAAqC;AACxD,WAAI,OAAOA,KAAQ,WACV,KAAK,YAAYA,CAAG,GAAG,MAAM,QAExB,KAAK,UAAU,YAAA,EAAcA,CAAG,KAAK,OACrC,MAAM;AAAA,EACtB;AAAA,EA8BQ,2BAA2B;AACjC,WAAO,KAAK,KAAK,UAAU,SAAS,0BAA0B;AAAA,EAChE;AAAA,EAEQ,WAAWiU,GAAuB;AACxC,QAAI;AACF,WAAK,SAAS,OAAOA,CAAK,GACH,KAAK,aAAa,KAAK,CAACnT,MAAMA,EAAE,UAAU,QAAQ,MAEvE,KAAK,eAAe,KAAK,aAAa,OAAO,CAACA,MAAMA,EAAE,UAAU,QAAQ,GACxE,KAAK,eAAA;AAAA,IAET,SAAS,GAAG;AACV,YAAMkf,IAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,WAAK,eAAe;AAAA,QAClB,GAAG,KAAK,aAAa,OAAO,CAACjb,MAAMA,EAAE,UAAU,QAAQ;AAAA,QACvD,EAAE,OAAO,UAAU,SAAAib,EAAA;AAAA,MAAQ,GAE7B,KAAK,eAAA;AAAA,IACP;AAAA,EACF;AAAA,EA4BA,MAAc,cAAc;AAC1B,QAAI,KAAK,QAAQ;AACf,UAAI;AACF,cAAMT,IAAU,MAAM,KAAK,OAAO,aAAA;AAClC,aAAK,UAAU,QAAQA,EAAQ,IAAI,GAC/BA,EAAQ,UAAQ,KAAK,UAAU,UAAUA,EAAQ,MAAM,GACvDA,EAAQ,QAAM,KAAK,UAAU,QAAQA,EAAQ,IAAI,GACrD,KAAK,OAAOA,EAAQ,QAAQ,KAAK,MACjC,KAAK,YAAY,QAAQ,KAAK,IAAI;AAAA,MACpC,SAASze,GAAG;AAEV,gBAAQ,KAAK,uBAAuBA,CAAC;AAAA,MACvC;AAEF,SAAK,MAAA;AAAA,EACP;AAAA,EAEQ,eAAe6K,GAAuB;AAC5C,UAAMmd,IAAUC,GAAQpd,GAAS,YAAY;AAI7C,QAHImd,GAAS,UACX,KAAK,KAAK,UAAU,IAAI,GAAGA,CAAO,GAEhCnd,GAAS;AACX,iBAAW,CAAC9J,GAAGyD,CAAC,KAAK,OAAO,QAAQqG,EAAQ,YAAY;AAEtD,aAAK,KAAK,MAAM9J,CAAC,IAAIyD,KAAK;AAAA,EAGhC;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,KAAK,UAAU,OAAO,wBAAwB,KAAK,aAAa,UAAU;AAAA,EACjF;AAAA,EAEQ,eAAe/E,GAA4B;AACjD,QAAIA,MAAS,QAAQ;AACnB,YAAMyoB,IAAK,OAAO,YAAc,MAAc,UAAU,YAAY;AAUpE,aANE,4DAA4D,KAAKA,CAAE,KAClE,OAAO,YAAc,OACpB,mBAAmB,aAClB,UAAkC,eAAe,QAAQ;AAAA,QAAK,CAAC3hB,MAC9D,OAAO,KAAKA,EAAE,SAAS,EAAE;AAAA,MAAA,IAG3B,IAAI+F,GAAa,KAAK,SAAS,IAC/B,IAAI+O,GAAe,KAAK,WAAW,MAAM,KAAK,QAAQ;AAAA,IAC5D;AACA,WAAO5b,MAAS,SACZ,IAAI6M,GAAa,KAAK,SAAS,IAC/B,IAAI+O,GAAe,KAAK,WAAW,MAAM,KAAK,QAAQ;AAAA,EAC5D;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,SAAS,KAAK,cAAc,KAAK,MAAM,kBAAkB,KAAK,KAAM;AAC7E,SAAK,KAAK,YAAY;AACtB,UAAM8M,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY;AAClB,UAAMC,IAAW,SAAS,cAAc,KAAK;AAC7C,IAAAA,EAAS,YAAY,oBACrBD,EAAM,YAAYC,CAAQ,GAC1B,KAAK,KAAK,YAAYD,CAAK,GAC3B,KAAK,QAAQA,GACb,KAAK,aAAaC,GAElB,KAAK,wBAAwB,WAAA,GAC7B,KAAK,yBAAyB,IAAI,eAAe,MAAM;AACrD,WAAK,uBAAA;AAAA,IACP,CAAC,GACD,KAAK,uBAAuB,QAAQA,CAAQ;AAAA,EAC9C;AAAA,EAEQ,gBAAgB;AACtB,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AAAA,EAEQ,MAAMC,IAAQ,IAAO;AAC3B,QAAI,KAAK,WAAW,CAACA,EAAO;AAC5B,SAAK,YAAA;AACL,UAAMC,IAAO,KAAK,cAAc,KAAK;AAOrC,QANA,KAAK,SAAS,MAAMA,CAAI,GACxB,KAAK,kBAAA,GACL,KAAK,YAAA,GACL,KAAK,kBAAA,GAEL,KAAK,KAAK,UAAU,OAAO,mBAAmB,CAAC,KAAK,UAAU,GAC1D,CAAC,KAAK,YAAY;AACpB,WAAK,KAAK,QAAQ,UAAU,WAC5B,KAAK,aAAA,GACL,KAAK,iBAAA,GACL,KAAK,eAAA,GACL,KAAK,cAAc,MAAM;AACzB;AAAA,IACF;AACA,SAAK,mBAAmB,IAAIhN;AAAA,MAC1BgN;AAAA,MACA,KAAK;AAAA,MACL,CAACvqB,GAAKwlB,MAAc,KAAK,WAAWxlB,GAAKwlB,CAAS;AAAA,MAClD,CAAClkB,MAAA;AAAU,QAAK,KAAK,YAAY,UAAUA,CAAK;AAAA;AAAA,MAChD,CAACA,MAAA;AAAU,QAAK,KAAK,YAAY,aAAaA,CAAK;AAAA;AAAA,MACnD,CAACoT,MAAO,KAAK,SAAS,QAAQA,CAAE;AAAA,MAChC,KAAK,SAAS,gBAAgB,CAACA,MAAO,KAAK,SAAS,cAAeA,CAAE,IAAI;AAAA,MACzE,KAAK;AAAA,MACL,KAAK;AAAA,MACL,CAACpT,GAAOC,MAAW,KAAK,eAAeD,GAAOC,CAAM;AAAA,MACpD,CAACipB,MAAW,KAAK,WAAWA,CAAM;AAAA,MAClC,CAAClpB,GAAOC,MAAW;AACjB,cAAMyM,IAA4B1M,KAASC,MAAW,OAAO,EAAE,OAAAD,GAAO,QAAAC,MAAW;AACjF,QAAIyM,KAAQ,KAAK,SAAS,cAAcA,EAAO,OAAOA,EAAO,MAAM,GACnE,KAAK,aAAaA,GAClB,KAAK,cAAc,WAAW;AAAA,MAChC;AAAA,MACA,CAAC1M,GAAOmpB,GAASvkB,GAAGC,MAAM,KAAK,gBAAgB7E,GAAO4E,GAAGC,CAAC;AAAA,MAC1D,CAAC6D,MAAW;AACV,aAAK,kBAAkBA,GACvB,KAAK,SAAS,aAAaA,CAAM,GACjC,KAAK,cAAc,WAAW;AAAA,MAChC;AAAA,MACA,MAAM,KAAK,KAAA;AAAA,MACX,MAAM,KAAK,KAAA;AAAA,IAAK,GAElB,KAAK,KAAK,QAAQ,UAAU,SAC5B,KAAK,aAAA,GACL,KAAK,iBAAA,GACD,KAAK,WACP,KAAK,cAAc,KAAK,OAAO,UAAU,CAACyF,MAAU,KAAK,kBAAkBA,CAAK,CAAC,IAEnF,KAAK,eAAA,GACL,KAAK,cAAc,WAAW,GAC9B,KAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU;AACR,SAAK,mBAAA,GACL,KAAK,kBAAkB,QAAA,GACvB,KAAK,SAAS,QAAA,GACd,KAAK,cAAA,GACL,KAAK,eAAA,GACL,KAAK,wBAAwB,WAAA,GAC7B,KAAK,yBAAyB,MAC9B,KAAK,UAAU;AAAA,EACjB;AAAA;AAAA,EAIA,aAAaib,GAA+B;AAC1C,SAAK,KAAK,YAAY,IACtB,KAAK,KAAK,UAAU,IAAI,GAAIR,GAAQQ,CAAU,KAAK,EAAG;AAAA,EACxD;AAAA,EAEA,aAAalD,GAAqC;AAChD,eAAW,CAACxkB,GAAGyD,CAAC,KAAK,OAAO,QAAQ+gB,CAAK;AAEvC,WAAK,KAAK,MAAMxkB,CAAC,IAAIyD,KAAK;AAAA,EAE9B;AAAA,EAEA,QAAQkkB,GAAuB;AAC7B,QAAIA,KAAQ,MAAM;AAEhB,UAAI,KAAK,WAAY;AACrB,WAAK,aAAa,IAClB,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA;AACL;AAAA,IACF;AACA,UAAMC,IAAY,KAAK;AACvB,SAAK,aAAa,IAClB,KAAK,UAAU,QAAQD,CAA8B,GACrD,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA,GAEAC,MACH,KAAK,KAAK,UAAU,OAAO,iBAAiB,GAC5C,KAAK,kBAAkB,QAAA,GACvB,KAAK,mBAAmB,MACxB,KAAK,MAAA;AAAA,EAET;AAAA,EAEA,QAAQ1e,GAAY;AAClB,SAAK,UAAU,QAAQA,CAAI,GAC3B,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA;AAAA,EACP;AAAA;AAAA,EAGA,YAAoB;AAClB,WAAO,KAAK,UAAU,UAAA;AAAA,EACxB;AAAA,EAEA,UAAgB;AACd,WAAO,KAAK,UAAU,QAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAe;AACb,WAAO,KAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAkB;AAChB,WAAO,KAAK,UAAU,YAAA,EAAc,IAAI,CAAC5J,OAAO,EAAE,GAAIA,EAAE,IAAA,EAAuB;AAAA,EACjF;AAAA;AAAA,EAGA,QAAoChB,GAAeC,GAA6B;AAC9E,WAAO,KAAK,UAAU,QAAQD,GAAOC,CAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,YAAYD,GAAuB;AACjC,WAAO,KAAK,UAAU,YAAYA,CAAK;AAAA,EACzC;AAAA,EAEA,eAAeC,GAAwB;AACrC,WAAO,KAAK,UAAU,eAAeA,CAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,YAAYD,GAAmC;AAC7C,UAAM4M,IAAM,KAAK,UAAU,gBAAgB5M,CAAK;AAChD,WAAI4M,IAAM,IAAU,OACb,KAAK,UAAU,YAAA,EAAcA,CAAG,KAAK;AAAA,EAC9C;AAAA,EAEA,WAA0B;AACxB,WAAO,KAAK,UAAU,SAAA;AAAA,EACxB;AAAA,EAEA,aAA4B;AAC1B,WAAO,KAAK,UAAU,YAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO2c,GAAyC;AAC9C,UAAMvpB,IAAQ,KAAK,aAAaupB,CAAY;AAC5C,WAAKvpB,IACE,KAAK,SAASA,CAAK,IADP;AAAA,EAErB;AAAA,EAEQ,SAASA,GAAyB;AACxC,UAAMwpB,IAAQ,KAAK,YAAYxpB,CAAK;AACpC,QAAI,CAACwpB,EAAO,QAAO;AACnB,UAAMhqB,IAAS,KAAK,UAAU,UAAA,GACxBN,IAA+B,EAAE,GAAIsqB,EAAM,IAAA;AACjD,eAAW1pB,KAAON,EAAO;AACvB,MAAAN,EAAIY,EAAI,GAAG,IAAI,KAAK,UAAU,iBAAiBE,GAAOF,CAAG,EAAE;AAE7D,WAAOZ;AAAA,EACT;AAAA;AAAA,EAGA,eAAoB;AAElB,WADa,KAAK,UAAU,YAAA,EAChB,IAAI,CAAC8B,MAAM,KAAK,SAASA,EAAE,EAAE,CAAC,EAAE,OAAO,OAAO;AAAA,EAC5D;AAAA,EAEA,cAA0Cf,GAAmB;AAE3D,UAAMH,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACI,MAAMA,EAAE,QAAQD,CAAM;AACvD,WAAKH,IACQ,KAAK,UAAU,YAAA,EAChB,IAAI,CAACkB,MAAM,KAAK,UAAU,iBAAiBA,EAAE,IAAIlB,CAAG,EAAE,KAAa,IAF9D,CAAA;AAAA,EAGnB;AAAA;AAAA,EAGA,aAAmD;AACjD,WAAI,KAAK,aAAa,+BAAqB,IAAA,IACpC,IAAI,IAAI,KAAK,UAAU,YAAY;AAAA,EAC5C;AAAA,EAEA,mBAA6B;AAC3B,WAAO,CAAC,GAAG,KAAK,WAAA,EAAa,MAAM;AAAA,EACrC;AAAA,EAEA,oBAA6B;AAC3B,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA,EAEA,sBAA8B;AAC5B,UAAM2pB,IAAU,KAAK,WAAA;AACrB,QAAInd,IAAQ;AACZ,eAAWzM,KAAO4pB,EAAQ,OAAA,QAAmB,OAAO,KAAK5pB,CAAG,EAAE;AAC9D,WAAOyM;AAAA,EACT;AAAA,EAEA,eAA2CzM,GAAsBI,GAAoB;AACnF,QAAI,KAAK,aAAa,SAAU,QAAO;AACvC,UAAMD,IAAQ,KAAK,aAAaH,CAAG;AACnC,WAAKG,IACE,KAAK,UAAU,WAAWA,GAAOC,CAAM,IAD3B;AAAA,EAErB;AAAA,EAEA,gBAA4CJ,GAAsBI,GAAmB;AACnF,UAAMD,IAAQ,KAAK,aAAaH,CAAG;AACnC,QAAI,CAACG,EAAO,QAAO;AAEnB,UAAMF,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACI,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOD,CAAM,CAAC;AACvE,QAAI,CAACH,EAAK,QAAO;AACjB,UAAMyM,IAAM,KAAK,UAAU,iBAAiBvM,GAAOF,CAAG;AACtD,QAAIyM,EAAI,aAAc,QAAOA,EAAI;AACjC,UAAMpH,IAAIoH,EAAI;AACd,QAAIzM,EAAI,SAAS;AAEf,aADc8Q,GAAezL,CAAC,MACbA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,QAAIrF,EAAI,SAAS;AAEf,aADc+Q,GAAa1L,CAAC,MACXA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,QAAIA,KAAM,KAAyB,QAAO;AAC1C,QAAIA,aAAa,KAAM,QAAOA,EAAE,YAAA;AAChC,QAAI,OAAOA,KAAM,SAAU,QAAOA;AAClC,QAAI,OAAOA,KAAM,YAAY,OAAOA,KAAM,UAAW,QAAO,OAAOA,CAAC;AACpE,QAAI,OAAOA,KAAM,UAAU;AACzB,YAAMukB,IAAKvkB;AACX,UAAIukB,EAAG,SAAS,UAAU,OAAOA,EAAG,SAAU,iBAAiBA,EAAG;AAClE,UAAIA,EAAG,SAAS,UAAU,MAAM,QAAQA,EAAG,MAAM;AAE/C,eADeA,EAAG,OAAO,OAAO,CAAC9kB,MAAmB,OAAOA,KAAM,QAAQ,EAC3D,KAAK,IAAI;AAAA,IAE3B;AACA,WAAO,OAAOO,CAAC;AAAA,EACjB;AAAA,EAEA,UAAUwkB,GAAYC,GAA2C;AAC/D,QAAIC,IAA0B;AAC9B,QAAI,OAAOD,KAAa,YAAY,OAAO,SAASA,CAAQ;AAC1D,MAAAC,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAMD,CAAQ,GAAG,KAAK,UAAU,eAAA,CAAgB,CAAC;AAAA,aAC7E,OAAOA,KAAa,UAAU;AACvC,YAAME,IAAU,KAAK,UAAU,gBAAgBF,CAAQ;AACvD,MAAIE,KAAW,MAAGD,IAAWC;AAAA,IAC/B;AACA,IAAID,MAAa,SAAMA,IAAW,KAAK,UAAU,eAAA;AACjD,UAAME,IAAQ,KAAK,UAAU,YAAYJ,GAAiCE,CAAQ,GAC5EnrB,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAOqrB;AAAA,MACP,SAAAJ;AAAA,MACA,SAAS,EAAE,OAAOE,EAAA;AAAA,IAAS;AAE7B,gBAAK,aAAa,QAAQnrB,CAAG,GAC7B,KAAK,aAAaqrB,GAAO,KAAK,GAC9B,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA,GACD,KAAK,aAAa,YAAe,KAAK,WAAW,CAACrrB,CAAG,CAAC,GACnDqrB;AAAA,EACT;AAAA,EAEA,UAAUlqB,GAA+B;AACvC,UAAMG,IAAQ,KAAK,aAAaH,CAAG;AACnC,QAAI,CAACG,EAAO,QAAO;AACnB,UAAMgqB,IAAU,KAAK,UAAU,UAAUhqB,CAAK;AAC9C,QAAI,CAACgqB,EAAS,QAAO;AACrB,UAAMtrB,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAOsrB,EAAQ,IAAI;AAAA,MACnB,SAASA,EAAQ,IAAI;AAAA,MACrB,SAAS,EAAE,OAAOA,EAAQ,MAAA;AAAA,IAAM;AAElC,gBAAK,aAAa,QAAQtrB,CAAG,GAC7B,KAAK,aAAasB,GAAO,QAAQ,GACjC,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA,GACD,KAAK,aAAa,YAAe,KAAK,WAAW,CAACtB,CAAG,CAAC,GACnD;AAAA,EACT;AAAA,EAEQ,WAAWA,GAAcwlB,GAAoB;AAEnD,QADI,KAAK,aAAa,cAClB,CAACxlB,EAAI,SAASA,EAAI,WAAW,OAAW;AAC5C,UAAM2Z,IAAO,KAAK,UAAU,QAAQ3Z,EAAI,OAAOA,EAAI,MAAM;AACzD,SAAK,aAAa,QAAQ,EAAE,GAAGA,GAAK,MAAA2Z,GAAM,GAC1C,KAAK,UAAU,QAAQ3Z,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAMwlB,CAAS,GACjE,KAAK,aAAaxlB,EAAI,OAAO,MAAM,GACnC,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM,GACrBwlB,KACG,KAAK,WAAW,CAACxlB,CAAG,CAAC;AAAA,EAE9B;AAAA,EAEA,OAAO;AACL,SAAK,kBAAkB,cAAA;AACvB,UAAMmoB,IAAO,KAAK,aAAa,KAAA;AAC/B,QAAI,GAACA,KAAQ,CAACA,EAAK,SAEnB;AAAA,eAASvlB,IAAIulB,EAAK,SAAS,GAAGvlB,KAAK,GAAGA,KAAK,GAAG;AAC5C,cAAM5C,IAAMmoB,EAAKvlB,CAAC;AAClB,QAAK5C,KACL,KAAK,aAAaA,CAAG;AAAA,MACvB;AACA,WAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM;AAAA;AAAA,EAC3B;AAAA,EAEA,OAAO;AACL,SAAK,kBAAkB,cAAA;AACvB,UAAMmoB,IAAO,KAAK,aAAa,KAAA;AAC/B,QAAI,GAACA,KAAQ,CAACA,EAAK,SACnB;AAAA,iBAAWnoB,KAAOmoB;AAChB,aAAK,aAAanoB,CAAG;AAEvB,WAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM;AAAA;AAAA,EAC3B;AAAA,EAEA,qBAAsC;AACpC,UAAMurB,IAAU,CAACpD,MAA0C;AACzD,YAAMqD,wBAAW,IAAA,GACXC,IAA8B,CAAA;AACpC,iBAAWjqB,KAAK2mB;AACd,QAAIqD,EAAK,IAAIhqB,EAAE,IAAI,MACnBgqB,EAAK,IAAIhqB,EAAE,IAAI,GACfiqB,EAAM,KAAKjqB,EAAE,IAAI;AAEnB,aAAOiqB;AAAA,IACT,GAEMC,IAAW,CAACD,GAA6BE,MACzCF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,SAC9B,QAAQE,CAAY,aAEzBF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,cAC9BE,MAAiB,IAAI,eAAe,eAAeA,CAAY,MAEpEF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,cAC9BE,MAAiB,IAAI,eAAe,eAAeA,CAAY,MAEpEF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,eAC9B,gBAEF,YAAYA,EAAM,KAAK,IAAI,CAAC,KAAKE,CAAY,KAGhDC,IAAU,CAACC,MACfA,EAAO,IAAI,CAACnrB,MAAM;AAChB,YAAM+qB,IAAQF,EAAQ7qB,EAAE,QAAQ,GAC1BirB,IAAejrB,EAAE,SAAS;AAChC,aAAO;AAAA,QACL,SAASA,EAAE;AAAA,QACX,OAAA+qB;AAAA,QACA,cAAAE;AAAA,QACA,OAAOD,EAASD,GAAOE,CAAY;AAAA,MAAA;AAAA,IAEvC,CAAC;AAEH,WAAO;AAAA,MACL,MAAMC,EAAQ,KAAK,aAAa,gBAAgB;AAAA,MAChD,MAAMA,EAAQ,KAAK,aAAa,gBAAgB;AAAA,IAAA;AAAA,EAEpD;AAAA,EAEQ,aAAa5rB,GAAc;AACjC,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SAASA,EAAI,WAAW,WAC9B,KAAK,UAAU,QAAQA,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAM,KAAK,aAAa,QAAQ,GAClF,KAAK,aAAaA,EAAI,OAAO,MAAM;AAErC;AAAA,MACF,KAAK;AACH,QAAIA,EAAI,SAAO,KAAK,UAAU,UAAUA,EAAI,KAAK,GAC7CA,EAAI,SAAO,KAAK,aAAaA,EAAI,OAAO,QAAQ;AACpD;AAAA,MACF,KAAK;AACH,YAAIA,EAAI,SAASA,EAAI,SAAS;AAC5B,gBAAMkO,IAAOlO,EAAI,SAAiD,OAC5D2Q,IAAQ,OAAOzC,KAAQ,WAAWA,IAAM,KAAK,UAAU,eAAA;AAC7D,eAAK,UAAU,YAAYlO,EAAI,SAAS2Q,GAAO3Q,EAAI,KAAK,GACxD,KAAK,aAAaA,EAAI,OAAO,KAAK;AAAA,QACpC;AACA;AAAA,MACF;AACE;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,aAAaA,GAAc;AACjC,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SAASA,EAAI,WAAW,WAC9B,KAAK,UAAU,QAAQA,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAM,KAAK,aAAa,QAAQ,GAClF,KAAK,aAAaA,EAAI,OAAO,MAAM;AAErC;AAAA,MACF,KAAK;AACH,YAAIA,EAAI,SAAS;AACf,gBAAMkO,IAAOlO,EAAI,SAAiD,OAC5D2Q,IAAQ,OAAOzC,KAAQ,WAAWA,IAAM,KAAK,UAAU,eAAA,GACvD4d,IAAW,OAAO9rB,EAAI,SAAU,WAAWA,EAAI,QAAQ;AAC7D,eAAK,UAAU,YAAYA,EAAI,SAAS2Q,GAAOmb,CAAQ,GACnDA,KAAU,KAAK,aAAaA,GAAU,KAAK;AAAA,QACjD;AACA;AAAA,MACF,KAAK;AACH,QAAI9rB,EAAI,UACN,KAAK,UAAU,UAAUA,EAAI,KAAK,GAClC,KAAK,aAAaA,EAAI,OAAO,QAAQ;AAEvC;AAAA,MACF;AACE;AAAA,IAAA;AAAA,EAEN;AAAA,EAIA,MAAM,OAAO+rB,GAA4D;AACvE,UAAMhB,IAAU,KAAK,aAAa,YAAA;AAClC,QAAI,CAACA,EAAQ,OAAQ,QAAO,CAAA;AAC5B,QAAIgB,GAAS;AACX,UAAI;AACF,cAAMA,EAAQ,EAAE,UAAUhB,GAAS,MAAM,KAAK,MAAM,GACpD,KAAK,kBAAA;AAAA,MACP,SAAS9oB,GAAG;AACV,mBAAK,kBAAkBA,CAAC,GAClBA;AAAA,MACR;AACA,aAAO,KAAK,eAAe8oB,CAAO;AAAA,IACpC;AAEA,WADkB,KAAK,eAAeA,GAAS,MAAM,KAAK,WAAWA,CAAO,CAAC;AAAA,EAE/E;AAAA,EAEA,MAAc,WAAWiB,GAAqB;AAC5C,QAAI,KAAK,UAAU,KAAK;AACtB,UAAI;AACF,cAAM,KAAK,OAAO,OAAOA,GAAU,KAAK,IAAI,GAC5C,KAAK,kBAAA;AAAA,MACP,SAAS,GAAG;AAEV,gBAAQ,KAAK,iBAAiB,CAAC,GAC/B,KAAK,kBAAkB,CAAC;AAAA,MAC1B;AAAA,EAEJ;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,eAAe,KAAK,aAAa,OAAO,CAAC/pB,MAAMA,EAAE,UAAU,QAAQ,GACxE,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,kBAAkBgqB,GAAgB;AACxC,UAAMC,IAAMD,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AACjE,SAAK,eAAe;AAAA,MAClB,GAAG,KAAK,aAAa,OAAO,CAAC/lB,MAAMA,EAAE,UAAU,QAAQ;AAAA,MACvD,EAAE,OAAO,UAAU,SAASgmB,EAAA;AAAA,IAAI,GAElC,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,eACNnB,GACAoB,GACmC;AACnC,UAAMC,wBAAc,IAAA;AACpB,eAAWpsB,KAAO+qB;AAChB,MAAI/qB,EAAI,UACN,KAAK,UAAU,aAAaA,EAAI,KAAK,GACrCosB,EAAQ,IAAIpsB,EAAI,KAAK;AAmBzB,YAhBY,YAAY;AACtB,MAAImsB,WAAkBA,EAAA,GACtB,MAAM,KAAK,YAAY,eAAepB,EAAQ,GAAG,EAAE,GAAG,KAAK,GAC3D,KAAK,aAAa,MAAA;AAClB,YAAMsB,IAAsC,CAAA;AAC5C,iBAAW/qB,KAAS8qB,GAAS;AAC3B,aAAK,aAAa9qB,GAAO,MAAM;AAC/B,cAAMgrB,IAAO,KAAK,oBAAoBhrB,CAAK;AAC3C,QAAIgrB,KAAMD,EAAU,KAAKC,CAAI;AAAA,MAC/B;AACA,kBAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM,GAClBD;AAAA,IACT,GACO;AAAA,EACT;AAAA,EAEQ,kBAAkB5c,GAIvB;AACD,eAAWzP,KAAOyP,EAAM;AACtB,WAAK,aAAazP,CAAG;AAEvB,SAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,aAAaA,GAAc;AACjC,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SAASA,EAAI,WAAW,WAC9B,KAAK,UAAU,QAAQA,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAM,EAAI,GAC5D,KAAK,aAAaA,EAAI,OAAO,MAAM;AAErC;AAAA,MACF,KAAK;AACH,YAAIA,EAAI,SAAS;AACf,gBAAME,IAAK,KAAK,UAAU,UAAUF,EAAI,OAAO;AAC/C,UAAIE,KAAI,KAAK,aAAaA,GAAI,KAAK;AAAA,QACrC;AACA;AAAA,MACF,KAAK;AACH,QAAIF,EAAI,UACN,KAAK,UAAU,UAAUA,EAAI,KAAK,GAClC,KAAK,aAAaA,EAAI,OAAO,QAAQ;AAEvC;AAAA,MACF,KAAK;AACH,QAAIA,EAAI,QAAQ,OAAOA,EAAI,QAAS,YAClC,KAAK,UAAU,QAAQA,EAAI,IAAY;AAEzC;AAAA,IAEA;AAAA,EAEN;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,KAAK,aAAa,YAAa;AACnC,SAAK,cAAc;AACnB,UAAMusB,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,YAAY,wBAChBA,EAAI,aAAa,WAAW,QAAQ,GACpCA,EAAI,iBAAiB,eAAe,CAACtqB,MAAMA,EAAE,gBAAgB;AAE7D,UAAMuqB,IADe,KAAK,aAAa,aAEnC,CAAC,EAAE,KAAK,QAAQ,OAAO,OAAA,CAAQ,IAC/B;AAAA,MACE,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,MACtB,EAAE,KAAK,SAAS,OAAO,QAAA;AAAA,MACvB,EAAE,KAAK,WAAW,MAAM,MAAA;AAAA,MACxB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,MACtB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,MACtB,EAAE,KAAK,WAAW,MAAM,MAAA;AAAA,MACxB,EAAE,KAAK,gBAAgB,OAAO,mBAAA;AAAA,MAC9B,EAAE,KAAK,gBAAgB,OAAO,mBAAA;AAAA,MAC9B,EAAE,KAAK,cAAc,OAAO,aAAA;AAAA,IAAa,GAEzCpa,IAAO,SAAS,cAAc,KAAK;AACzC,eAAWqa,KAAOD,GAAS;AACzB,UAAIC,EAAI,SAAS,OAAO;AACtB,cAAMC,IAAK,SAAS,cAAc,IAAI;AACtC,QAAAA,EAAG,YAAY,uBACfta,EAAK,YAAYsa,CAAE;AACnB;AAAA,MACF;AACA,YAAMhc,IAAM,SAAS,cAAc,QAAQ;AAC3C,MAAAA,EAAI,OAAO,UACXA,EAAI,QAAQ,SAAS+b,EAAI,KACzB/b,EAAI,cAAc+b,EAAI,SAAS,IAC/B/b,EAAI,iBAAiB,SAAS,MAAM;AAClC,aAAK,oBAAoB+b,EAAI,GAAG,GAChC,KAAK,iBAAA;AAAA,MACP,CAAC,GACDra,EAAK,YAAY1B,CAAG;AAAA,IACtB;AACA,IAAA6b,EAAI,YAAYna,CAAI,IACnB,KAAK,cAAc,KAAK,MAAM,YAAYma,CAAG,GAC9C,KAAK,cAAcA;AAAA,EACrB;AAAA,EAEQ,gBAAgBjrB,GAAsBwZ,GAAiBC,GAAiB;AAG9E,QAFA,KAAK,kBAAA,GACD,CAAC,KAAK,eACN,CAAC,KAAK,YAAY,gBAEpB,KAAK,cAAc,MACnB,KAAK,kBAAA,GACD,CAAC,KAAK;AAAa;AAEzB,SAAK,mBAAmBzZ;AAExB,eAAWoP,KAAO,MAAM;AAAA,MACtB,KAAK,YAAY,iBAAoC,qBAAqB;AAAA,IAAA,GACzE;AACD,YAAM8Z,IAAS9Z,EAAI,QAAQ;AAC3B,MAAI8Z,MAAW,SAAQ9Z,EAAI,WAAW,CAAC,KAAK,aAAa,QAAA,IAChD8Z,MAAW,WAAQ9Z,EAAI,WAAW,CAAC,KAAK,aAAa,QAAA;AAAA,IAChE;AACA,UAAMic,IAAgB,OAAO,YACvBnW,IAAiB,OAAO,aACxBhL,IAAO,EAAE,OAAO,KAAK,QAAQ,IAAA;AACnC,QAAIgM,IAAOsD,GACPrD,IAAMsD;AACV,IAAIvD,IAAOhM,EAAK,QAAQmhB,MAAenV,IAAO,KAAK,IAAI,GAAGmV,IAAgBnhB,EAAK,QAAQ,CAAC,IACpFiM,IAAMjM,EAAK,SAASgL,MAAgBiB,IAAM,KAAK,IAAI,GAAGjB,IAAiBhL,EAAK,SAAS,CAAC,IAC1F,KAAK,YAAY,MAAM,OAAO,GAAGgM,CAAI,MACrC,KAAK,YAAY,MAAM,MAAM,GAAGC,CAAG,MACnC,KAAK,YAAY,cAAA,GACjB,KAAK,YAAY,cAAA;AAAA,EACnB;AAAA,EAEQ,oBAAoB+S,GAAgB;AAC1C,QAAIA,MAAW,QAAQ;AACrB,MAAK,KAAK,kBAAkB,cAAA;AAC5B;AAAA,IACF;AACA,QAAIA,MAAW,SAAS;AACtB,MAAK,KAAK,kBAAkB,mBAAA;AAC5B;AAAA,IACF;AACA,QAAIA,MAAW,QAAQ;AACrB,WAAK,KAAA;AACL;AAAA,IACF;AACA,QAAIA,MAAW,QAAQ;AACrB,WAAK,KAAA;AACL;AAAA,IACF;AACA,QAAI,CAAC,KAAK,iBAAkB;AAC5B,UAAMtc,IAAM,KAAK,UAAU,gBAAgB,KAAK,gBAAgB,GAC1D0e,IAAc1e,KAAO,IAAIA,IAAM,KAAK,UAAU,eAAA;AACpD,QAAIsc,MAAW,kBAAkBA,MAAW,gBAAgB;AAC1D,YAAMW,IAAWX,MAAW,iBAAiBoC,IAAcA,IAAc,GACnErb,IAAM,KAAK,eAAA,GACX8Z,IAAQ,KAAK,UAAU,YAAY9Z,GAAK4Z,CAAQ;AACtD,WAAK,aAAa,QAAQ;AAAA,QACxB,MAAM;AAAA,QACN,OAAOE;AAAA,QACP,SAAS9Z;AAAA,QACT,SAAS,EAAE,OAAO4Z,EAAA;AAAA,MAAS,CAC5B,GACD,KAAK,aAAaE,GAAO,KAAK,GAC9B,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,UAAU,gBAAgB,MAAM;AACrC;AAAA,IACF;AACA,QAAIb,MAAW,cAAc;AAC3B,YAAMc,IAAU,KAAK,UAAU,UAAU,KAAK,gBAAgB;AAC9D,UAAI,CAACA,EAAS;AACd,WAAK,aAAa,QAAQ;AAAA,QACxB,MAAM;AAAA,QACN,OAAOA,EAAQ,IAAI;AAAA,QACnB,SAASA,EAAQ,IAAI;AAAA,QACrB,SAAS,EAAE,OAAOA,EAAQ,MAAA;AAAA,MAAM,CACjC,GACD,KAAK,aAAaA,EAAQ,IAAI,IAAI,QAAQ,GAC1C,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,UAAU,eAAe,MAAM;AACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAA4B;AAClC,UAAMxqB,IAAS,KAAK,UAAU,UAAA,GACxB0M,IAAiB,CAAA;AACvB,eAAWpM,KAAON,EAAO;AACvB,MAAA0M,EAAI,OAAOpM,EAAI,GAAG,CAAC,IAAI;AAEzB,WAAOoM;AAAA,EACT;AAAA,EAEQ,mBAAmB;AACzB,SAAK,aAAa,cAAA;AAAA,EACpB;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,OAAO,YAAa;AAC7B,SAAK,QAAQ;AACb,UAAMmT,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,iBAClBA,EAAM,aAAa,WAAW,QAAQ,GACtCA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,WAAW,UACtB,KAAK,cAAc,KAAK,MAAM,YAAYA,CAAK,GAChD,KAAK,QAAQA;AAAA,EACf;AAAA,EAEQ,UAAUQ,GAAiBC,IAA4B,QAAQC,IAAa,MAAM;AAExF,IADA,KAAK,YAAA,GACA,KAAK,UACV,KAAK,MAAM,cAAcF,GACzB,KAAK,MAAM,QAAQ,UAAUC,GAC7B,KAAK,MAAM,cAAA,GACX,KAAK,MAAM,cAAA,GACP,KAAK,eACP,OAAO,aAAa,KAAK,UAAU,GACnC,KAAK,aAAa,OAEpB,KAAK,aAAa,OAAO,WAAW,MAAM;AACxC,WAAK,OAAO,cAAA;AAAA,IACd,GAAGC,CAAU;AAAA,EACf;AAAA,EAEQ,eAAe;AACrB,SAAK,gBAAgB,MAAM,KAAK,uBAAA,GAChC,KAAK,gBAAgB,MAAM,KAAK,uBAAA,GAChC,KAAK,gBAAgB,iBAAiB,UAAU,KAAK,eAAe,EAAE,SAAS,IAAM,GACrF,OAAO,iBAAiB,UAAU,KAAK,aAAa,GACpD,KAAK,sBAAsB,CAAC3M,MAAkC;AAC5D,MAAI,KAAK,eAAe,CAAC,KAAK,YAAY,SAASA,EAAG,MAAc,KAClE,KAAK,YAAY,cAAA;AAAA,IAErB,GACA,SAAS,iBAAiB,eAAe,KAAK,qBAAqB,EAAI;AAAA,EAEzE;AAAA,EAEQ,iBAAiB;AACvB,IAAI,KAAK,iBAAe,OAAO,oBAAoB,UAAU,KAAK,aAAa,GAC3E,KAAK,iBAAe,KAAK,cAAA,EAAgB,oBAAoB,UAAU,KAAK,aAAa,GACzF,KAAK,UAAU,SACjB,qBAAqB,KAAK,KAAK,GAC/B,KAAK,QAAQ,OAEX,KAAK,wBACP,SAAS,oBAAoB,eAAe,KAAK,qBAAqB,EAAI,GAC1E,KAAK,sBAAsB,OAEzB,KAAK,gBACP,KAAK,YAAY,cAAA,GACb,KAAK,YAAY,iBAAelF,EAAiB,KAAK,WAAW,GACrE,KAAK,cAAc,OAEjB,KAAK,UACP,KAAK,MAAM,cAAA,GACP,KAAK,MAAM,iBAAeA,EAAiB,KAAK,KAAK,GACzD,KAAK,QAAQ;AAAA,EAEjB;AAAA,EAEA,QAAQxB,GAAqB;AAC3B,SAAK,eAAA,GACL,KAAK,mBAAA,GACL,KAAK,kBAAkB,QAAA,GACvB,KAAK,SAAS,QAAA,GACd,KAAK,OAAOA,GACZ,KAAK,mBAAA,GACL,KAAK,QAAQ,MACb,KAAK,aAAa,MAClB,KAAK,wBAAwB,WAAA,GAC7B,KAAK,yBAAyB,MAC9B,KAAK,WAAW,KAAK,eAAe,KAAK,UAAU,GACnD,KAAK,UAAU,IACf,KAAK,MAAM,EAAI;AAAA,EACjB;AAAA;AAAA,EAGA,gBAA4B;AAC1B,UAAM6e,IAAY,KAAK,oBAAoBte,KAAe,SAAS,UAC7Due,IAAU,KAAK,aAAa,YAAA,GAC5BC,IAAkB,KAAK,aAAa,WAAWD,IAAU,CAAA,GACzDE,IAAsBD,EAAgB,QACtCE,KAAoB,MAAM;AAC9B,YAAMC,wBAAW,IAAA;AACjB,iBAAW1rB,KAAKurB;AACd,QAAIvrB,EAAE,SAAS,WACX,CAACA,EAAE,SAASA,EAAE,WAAW,UAC7B0rB,EAAK,IAAI,GAAG1rB,EAAE,KAAK,KAAK,OAAOA,EAAE,MAAM,CAAC,EAAE;AAE5C,aAAO0rB,EAAK;AAAA,IACd,GAAA,GACMC,IAAiC,KAAK,UAAU,sBAAsB,IAAI,CAAClrB,OAAO;AAAA,MACtF,OAAO;AAAA,MACP,SAASA,EAAE;AAAA,MACX,QAAQ,EAAE,OAAOA,EAAE,OAAO,QAAQA,EAAE,OAAA;AAAA,IAAO,EAC3C,GACImrB,IAAiC,KAAK,UACzC,iBACA,IAAI,CAAClnB,MACCA,EAAE,OACA;AAAA,MACL,OAAOA,EAAE,KAAK;AAAA,MACd,SAASA,EAAE,KAAK;AAAA,MAChB,QAAQ,EAAE,OAAOA,EAAE,OAAO,QAAQA,EAAE,OAAA;AAAA,IAAO,IAJzB,IAMrB,EACA,OAAO,OAAO;AACjB,IAAAknB,EAAiB,KAAK,CAACpkB,GAAGR,MAAM;AAC9B,YAAM6kB,IAAKrkB,EAAE,QAAQ,QAAQ,KAAK,UAAU,YAAYA,EAAE,OAAO,KAAK,IAAI,IACpEskB,IAAK9kB,EAAE,QAAQ,QAAQ,KAAK,UAAU,YAAYA,EAAE,OAAO,KAAK,IAAI;AAC1E,UAAI6kB,MAAOC,EAAI,QAAOD,IAAKC;AAC3B,YAAMlO,IACJpW,EAAE,QAAQ,WAAW,SAAY,KAAK,UAAU,eAAeA,EAAE,OAAO,MAAM,IAAI,IAC9EukB,IACJ/kB,EAAE,QAAQ,WAAW,SAAY,KAAK,UAAU,eAAeA,EAAE,OAAO,MAAM,IAAI;AACpF,aAAI4W,MAAOmO,IAAWnO,IAAKmO,IACvBvkB,EAAE,UAAUR,EAAE,QAAcQ,EAAE,QAAQR,EAAE,QAAQ,KAAK,IAClDQ,EAAE,UAAUR,EAAE,UAAU,KAAKQ,EAAE,UAAUR,EAAE,UAAU,IAAI;AAAA,IAClE,CAAC;AACD,UAAMglB,IAAe;AAAA,MACnB,GAAGL;AAAA,MACH,GAAGC,EAAiB,MAAM,GAAG,GAAG;AAAA,MAChC,GAAG,KAAK;AAAA,IAAA;AAEV,WAAO;AAAA,MACL,WAAW,KAAK,aAAa,YAAYJ,IAAsB;AAAA,MAC/D,qBAAAA;AAAA,MACA,kBAAAC;AAAA,MACA,UAAU,EAAE,SAAS,KAAK,aAAa,WAAW,SAAS,KAAK,aAAa,UAAQ;AAAA,MACrF,YAAYJ;AAAA,MACZ,cAAAW;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,oBAAoBC,GAA8B;AAChD,gBAAK,oBAAoB,IAAIA,CAAQ,GACrCA,EAAS,KAAK,cAAA,GAAiB,IAAI,GAC5B,MAAM,KAAK,oBAAoB,OAAOA,CAAQ;AAAA,EACvD;AAAA,EAEQ,iBAAiB;AACvB,UAAM1iB,IAAO,KAAK,cAAA,GACZ4O,IAAO,KAAK,gBACZ+T,KAAe,MAAM;AAEzB,UADI,CAAC/T,KACDA,EAAK,aAAa,WAAW5O,EAAK,aAAa,OAAQ,QAAO;AAClE,eAASnI,IAAI,GAAGA,IAAImI,EAAK,aAAa,QAAQnI,KAAK,GAAG;AACpD,cAAMoG,IAAI2Q,EAAK,aAAa/W,CAAC,GACvB4F,IAAIuC,EAAK,aAAanI,CAAC;AAG7B,YAFI,CAACoG,KAAK,CAACR,KACPQ,EAAE,UAAUR,EAAE,SACdQ,EAAE,YAAYR,EAAE,QAAS,QAAO;AACpC,cAAMI,IAAKI,EAAE,QACP2kB,IAAKnlB,EAAE;AACb,YAAI,GAACI,KAAM,CAAC+kB,OACR,CAAC/kB,KAAM,CAAC+kB,MACP/kB,EAAG,SAAS,WAAW+kB,EAAG,SAAS,SACpC,OAAO/kB,EAAG,UAAU,EAAE,MAAM,OAAO+kB,EAAG,UAAU,EAAE;AAAG,iBAAO;AAAA,MAClE;AACA,aAAO;AAAA,IACT,GAAA;AAWA,QARE,EAAAhU,KACAA,EAAK,cAAc5O,EAAK,aACxB4O,EAAK,wBAAwB5O,EAAK,uBAClC4O,EAAK,qBAAqB5O,EAAK,oBAC/B4O,EAAK,SAAS,YAAY5O,EAAK,SAAS,WACxC4O,EAAK,SAAS,YAAY5O,EAAK,SAAS,WACxC4O,EAAK,eAAe5O,EAAK,cACzB2iB,IAEF;AAAA,WAAK,iBAAiB3iB;AACtB,iBAAWlI,KAAK,KAAK,oBAAqB,CAAAA,EAAEkI,GAAM4O,CAAI;AAAA;AAAA,EACxD;AAAA;AAAA,EAGA,uBAA0C;AACxC,UAAM3P,IAAS,KAAK,iBACdlJ,IAAS,KAAK,UAAU,UAAA,GACxB+iB,IAAS,KAAK,YACdnY,IAAcmY,GAAQ,SAAS,MAC/BlY,IAAekY,GAAQ,UAAU,MACjC9D,IAAiBrU,IAAc,KAAK,UAAU,YAAYA,CAAW,IAAI,MACzEsU,IACJrU,MAAiB,OACb7K,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOmK,CAAY,CAAC,IACtE,MACAvK,IACJ4e,MAAmB,QAAQA,KAAkB,IAAIlf,EAAO,QAAQkf,CAAc,IAAI,MAE9E4N,IACJliB,KAAetK,IAAM,KAAK,UAAU,iBAAiBsK,GAAatK,CAAG,IAAI,MACrEysB,IACJniB,KAAetK,IAAM,KAAK,UAAU,wBAAwBsK,GAAatK,CAAG,IAAI,MAC5E0sB,IACJF,GAAgB,iBAAiBC,GAAe,iBAAiB,WAAW,SACxEE,IAAiBH,IAAiBA,EAAe,QAAQ,MACzDI,KAAsB,MAAM;AAChC,UAAIF,EAAoB,QAAOA;AAC/B,YAAMrnB,IAAIsnB;AACV,UAAI3sB,GAAK,SAAS;AAEhB,eADc8Q,GAAezL,CAAC,MACbA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,UAAIrF,GAAK,SAAS;AAEhB,eADc+Q,GAAa1L,CAAC,MACXA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,UAAIA,KAAM,KAAyB,QAAO;AAC1C,UAAIA,aAAa,KAAM,QAAOA,EAAE,YAAA;AAChC,UAAI,OAAOA,KAAM,SAAU,QAAOA;AAClC,UAAI,OAAOA,KAAM,YAAY,OAAOA,KAAM,UAAW,QAAO,OAAOA,CAAC;AACpE,UAAI,OAAOA,KAAM,UAAU;AACzB,cAAM+G,IAAM/G,GACNwJ,IAAOzC,EAAI;AACjB,YAAIyC,MAAS,UAAU,OAAOzC,EAAI,SAAU,iBAAiBA,EAAI;AACjE,YAAIyC,MAAS,UAAU,MAAM,QAAQzC,EAAI,MAAM;AAC7C,iBAAOA,EAAI,OAAO,OAAO,CAACtH,MAAM,OAAOA,KAAM,QAAQ,EAAE,KAAK,IAAI;AAAA,MAEpE;AACA,aAAO,OAAOO,CAAC;AAAA,IACjB,GAAA,GACMwnB,IAAkB7sB,GAAK,QAAQ,MAC/B8sB,IACJxiB,KAAeC,MAAiB,OAC5B,KAAK,UAAU,kBAAkBD,GAAaC,CAAY,IAC1D,MAEAwiB,KAAgB,MAAM;AAC1B,UAAI,CAACziB,KAAe,CAACtK;AACnB,eAAO,EAAE,aAAa,CAAA,GAAI,WAAW,CAAA,GAAI,UAAU,GAAC;AAEtD,YAAM,EAAE,aAAAgtB,GAAa,WAAArd,GAAW,UAAAsd,EAAA,IAAaC;AAAA,QAC3C,KAAK;AAAA,QACL5iB;AAAA,QACAtK;AAAA,MAAA;AAEF,aAAO,EAAE,aAAAgtB,GAAa,WAAArd,GAAW,UAAAsd,EAAA;AAAA,IACnC,GAAA;AAEA,WAAO;AAAA,MACL,QAAQ,CAAC,GAAGrkB,CAAM;AAAA,MAClB,gBAAgB+V,MAAmB,QAAQA,KAAkB,IAAIA,IAAiB;AAAA,MAClF,cAAcrU;AAAA,MACd,mBAAmBsU,MAAmB,QAAQA,KAAkB,IAAIA,IAAiB;AAAA,MACrF,iBAAiBrU;AAAA,MACjB,gBAAAoiB;AAAA,MACA,oBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,YAAAC;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,QAAQC;AAAA,IAAA;AAAA,EAEZ;AAAA,EAEA,mBAAmBV,GAA6B;AAC9C,gBAAK,mBAAmB,IAAIA,CAAQ,GACpCA,EAAS,KAAK,wBAAwB,MAAM,WAAW,GAChD,MAAM,KAAK,mBAAmB,OAAOA,CAAQ;AAAA,EACtD;AAAA,EAEQ,WAAWjD,GAAoB;AACrC,SAAK,aAAaA,GAClB,KAAK,cAAc,QAAQ,GAC3B,KAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,cAAc+D,GAA+B;AACnD,UAAMxjB,IAAO,KAAK,qBAAA,GACZ4O,IAAO,KAAK;AAClB,SAAK,wBAAwB5O;AAC7B,eAAWlI,KAAK,KAAK,mBAAoB,CAAAA,EAAEkI,GAAM4O,GAAM4U,CAAM;AAAA,EAC/D;AAAA,EAEQ,oBAAoBjtB,GAA8C;AACxE,UAAML,IAAW,KAAK,UAAU,YAAYK,CAAK;AACjD,QAAIL,IAAW,EAAG,QAAO;AACzB,UAAM0pB,IAAO,KAAK,SAASrpB,CAAK;AAChC,QAAI,CAACqpB,EAAM,QAAO;AAClB,UAAMI,IACJ,KAAK,aAAa,WACb,KAAK,UAAU,WAAA,EAAa,IAAIzpB,CAAK,KAAK,SAC3C,QACAktB,IAAc,KAAK,cAAA,EAAgB,aAAa,OAAO,CAACvsB,MAAMA,EAAE,QAAQ,UAAUX,CAAK;AAC7F,WAAO;AAAA,MACL,OAAAA;AAAA,MACA,UAAAL;AAAA,MACA,MAAA0pB;AAAA,MACA,SAAAI;AAAA,MACA,aAAayD,EAAY,SAASA,IAAc;AAAA,IAAA;AAAA,EAEpD;AAAA,EAEA,kBAAkBf,GAAkC;AAClD,SAAK,kBAAkB,IAAIA,CAAQ;AACnC,UAAM1sB,IAAO,KAAK,UAAU,YAAA;AAC5B,eAAWI,KAAOJ,GAAM;AACtB,YAAMurB,IAAO,KAAK,oBAAoBnrB,EAAI,EAAE;AAC5C,MAAKmrB,MACL,KAAK,cAAc,IAAInrB,EAAI,IAAImrB,CAAI,GACnCmB,EAAStsB,EAAI,IAAImrB,GAAM,MAAM,KAAK;AAAA,IACpC;AACA,WAAO,MAAM,KAAK,kBAAkB,OAAOmB,CAAQ;AAAA,EACrD;AAAA,EAEQ,aAAansB,GAAeitB,GAAyB;AAC3D,UAAM5U,IAAO,KAAK,cAAc,IAAIrY,CAAK,KAAK;AAC9C,QAAIitB,MAAW,UAAU;AACvB,WAAK,cAAc,OAAOjtB,CAAK;AAC/B,iBAAWuB,KAAK,KAAK,qBAAqBvB,GAAO,MAAMqY,GAAM4U,CAAM;AACnE;AAAA,IACF;AACA,UAAMxjB,IAAO,KAAK,oBAAoBzJ,CAAK;AAC3C,QAAKyJ,GACL;AAAA,WAAK,cAAc,IAAIzJ,GAAOyJ,CAAI;AAClC,iBAAWlI,KAAK,KAAK,qBAAqBvB,GAAOyJ,GAAM4O,GAAM4U,CAAM;AAAA;AAAA,EACrE;AAAA;AAAA,EAGA,aAAyCptB,GAAsBI,GAAWwJ,GAAqB;AAC7F,UAAMzJ,IAAQ,OAAOH,KAAQ,WAAWA,IAAM,KAAK,UAAU,SAAA,EAAWA,CAAG,GAAG,IACxEktB,IAAW/sB,IAAQX,GAAmB,KAAK,WAAW,EAAE,OAAAW,GAAO,QAAAC,EAAA,CAAQ,IAAI;AAEjF,QADI,CAAC8sB,KACD,KAAK,eAAeA,EAAS,OAAOA,EAAS,MAAM,EAAG;AAC1D,UAAMzS,IAAU,KAAK,UAAU,QAAQyS,EAAS,OAAOA,EAAS,MAAM,GAChEI,IAAW,OAAO1jB,KAAS,aAAcA,EAA6B6Q,CAAO,IAAI7Q;AACvF,SAAK;AAAA,MACH,EAAE,MAAM,QAAQ,OAAOsjB,EAAS,OAAO,QAAQA,EAAS,QAAQ,MAAMI,EAAA;AAAA,MACtE,KAAK,aAAa;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,oBAAoB1jB,GAAwB;AAC1C,UAAMjK,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB2tB,wBAAa,IAAA;AACnB,eAAWpsB,KAAK,KAAK,iBAAiB;AACpC,UAAIA,EAAE,SAAS,QAAS;AACxB,YAAMqsB,IAAK,KAAK,IAAIrsB,EAAE,UAAUA,EAAE,MAAM,GAClCssB,IAAK,KAAK,IAAItsB,EAAE,UAAUA,EAAE,MAAM,GAClCusB,IAAK,KAAK,IAAIvsB,EAAE,UAAUA,EAAE,MAAM,GAClCwsB,IAAK,KAAK,IAAIxsB,EAAE,UAAUA,EAAE,MAAM;AACxC,eAASrB,IAAW0tB,GAAI1tB,KAAY2tB,GAAI3tB,KAAY,GAAG;AACrD,cAAME,IAAMJ,EAAKE,CAAQ;AACzB,YAAKE;AACL,mBAASD,IAAW2tB,GAAI3tB,KAAY4tB,GAAI5tB,KAAY,GAAG;AACrD,kBAAME,IAAMN,EAAO,QAAQI,CAAQ;AACnC,gBAAI,CAACE,EAAK;AACV,kBAAM2L,IAAM,GAAG5L,EAAI,EAAE,KAAK,OAAOC,EAAI,GAAG,CAAC;AAGzC,gBAFIstB,EAAO,IAAI3hB,CAAG,MAClB2hB,EAAO,IAAI3hB,CAAG,GACV,KAAK,eAAe5L,EAAI,IAAIC,EAAI,GAAG,GAAG;AAC1C,kBAAMwa,IAAU,KAAK,UAAU,QAAQza,EAAI,IAAIC,EAAI,GAAG,GAChDqtB,IAAW,OAAO1jB,KAAS,aAAaA,EAAK6Q,CAAO,IAAI7Q;AAC9D,iBAAK;AAAA,cACH,EAAE,MAAM,QAAQ,OAAO5J,EAAI,IAAI,QAAQC,EAAI,KAAK,MAAMqtB,EAAA;AAAA,cACtD,KAAK,aAAa;AAAA,YAAA;AAAA,UAEtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe5kB,GAAgB;AACrC,QAAIA,MAAU,KAAM,QAAO;AAC3B,QAAIA,MAAU,OAAW,QAAO;AAChC,QAAIA,aAAiB,KAAM,QAAO,QAAQA,EAAM,SAAS;AACzD,QAAI,OAAOA,KAAU,SAAU,QAAO,KAAKA,CAAK;AAChD,QAAI,OAAOA,KAAU,SAAU,QAAO,KAAK,OAAO,MAAMA,CAAK,IAAI,QAAQ,OAAOA,CAAK,CAAC;AACtF,QAAI,OAAOA,KAAU,kBAAkB,KAAKA,IAAQ,MAAM,GAAG;AAC7D,QAAI,OAAOA,KAAU,UAAU;AAC7B,YAAM2D,IAAM3D,GACNoG,IAAOzC,EAAI;AACjB,UAAIyC,MAAS,UAAU,OAAOzC,EAAI,SAAU,SAAU,QAAO,QAAQA,EAAI,KAAK;AAC9E,UAAIyC,MAAS,UAAU,MAAM,QAAQzC,EAAI,MAAM;AAC7C,eAAO,QAAQA,EAAI,OAAO,OAAO,CAACtH,MAAM,OAAOA,KAAM,QAAQ,EAAE,KAAK,GAAG,CAAC;AAAA,IAE5E;AACA,QAAI;AACF,aAAO,QAAQ,KAAK,UAAU2D,CAAK,CAAC;AAAA,IACtC,QAAQ;AACN,aAAO,OAAO,OAAOA,CAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,mBAAmB;AACzB,SAAK,wBAAA,GACL,KAAK,kCAAA,GACL,KAAK,uBAAA;AAAA,EACP;AAAA,EAEQ,yBAAyB;AAC/B,IAAI,KAAK,sBACT,KAAK,oBAAoB,CAAC6K,MAAsB;AAC9C,MAAK,KAAK,8BACNA,EAAG,QAAQ,aACfA,EAAG,eAAA,GACHA,EAAG,gBAAA,GACH,KAAK,oBAAA;AAAA,IACP,GACA,SAAS,iBAAiB,WAAW,KAAK,mBAAmB,EAAI;AAAA,EACnE;AAAA,EAEQ,oCAAoC;AAC1C,QAAI,KAAK,uBAAwB;AACjC,UAAM6V,IAAO,KAAK,cAAc,KAAK;AACrC,SAAK,yBAAyB,CAAC7V,MAAmB;AAEhD,YAAMhE,IADKgE,EAAG,QACE,QAA2B,kCAAkC;AAC7E,UAAI,CAAChE,EAAK;AACV,YAAM3D,IACJ2D,EAAI,QAAQ,iBAAiBA,EAAI,QAAqB,kBAAkB,GAAG,QAAQ;AACrF,MAAK3D,MACL2H,EAAG,eAAA,GACHA,EAAG,gBAAA,GACH,KAAK,oBAAoB3H,CAAG;AAAA,IAC9B,GACAwd,EAAK,iBAAiB,SAAS,KAAK,wBAAwB,EAAI,GAChE,KAAK,sBAAsB,CAAC7V,MAAc;AAGxC,YAAM3H,IAFQ2H,EACO,QACD;AACpB,MAAyB3H,KAAQ,QACjC,KAAK,oBAAoB,OAAOA,CAAG,CAAC;AAAA,IACtC,GACAwd,EAAK,iBAAiB,4BAA4B,KAAK,mBAAmB;AAAA,EAC5E;AAAA,EAEQ,0BAA0B;AAChC,QAAI,KAAK,mBAAmB;AAC1B,UAAI,KAAK,kBAAkB,YAAa;AACxC,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,YAAA;AACL,UAAMH,IAAQ,KAAK,SAAS,KAAK,MAE3B2E,IAAQ,SAAS,cAAc,OAAO;AAC5C,IAAAA,EAAM,YAAY,+BAClBA,EAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAiClB3E,EAAM,YAAY2E,CAAK,GACvB,KAAK,oBAAoBA;AAEzB,UAAMC,IAAWD,EAAM,cAAiC,iCAAiC,GACnFE,IAAWF,EAAM,cAAgC,qCAAqC,GACtFG,IAAaH,EAAM;AAAA,MACvB;AAAA,IAAA,GAEII,IAASJ,EAAM,cAAgC,iCAAiC,GAChFthB,IAASshB,EAAM,cAA2B,4BAA4B,GACtEK,IAASL,EAAM,cAAiC,sCAAsC,GACtFM,IAAUN,EAAM,cAAiC,uCAAuC,GACxFO,IAAWP,EAAM;AAAA,MACrB;AAAA,IAAA,GAEIQ,IAAWR,EAAM;AAAA,MACrB;AAAA,IAAA,GAEIS,IAAaT,EAAM,cAAiC,oCAAoC,GACxFU,IAAcV,EAAM;AAAA,MACxB;AAAA,IAAA,GAEIW,IAAeX,EAAM;AAAA,MACzB;AAAA,IAAA;AAGF,QACE,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAAC1hB,KACD,CAAC2hB,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,GACD;AACA,MAAAlgB,EAAiBuf,CAAK,GACtB,KAAK,oBAAoB;AACzB;AAAA,IACF;AAEA,IAAAC,EAAS,iBAAiB,SAAS,MAAM,KAAK,qBAAqB,GAEnEC,EAAS,iBAAiB,UAAU,MAAM;AACxC,MAAK,KAAK,oBACV,KAAK,gBAAgB,aAAaA,EAAS;AAAA,IAC7C,CAAC,GACDC,EAAW,iBAAiB,UAAU,MAAM;AAC1C,MAAK,KAAK,oBACV,KAAK,gBAAgB,eAAeA,EAAW;AAAA,IACjD,CAAC,GACDC,EAAO,iBAAiB,SAAS,MAAM;AACrC,MAAK,KAAK,oBACV,KAAK,gBAAgB,SAASA,EAAO,OACrC,KAAK,uBAAA;AAAA,IACP,CAAC,GAED1hB,EAAO,iBAAiB,UAAU,CAACxL,MAAM;AACvC,YAAMuQ,IAASvQ,EAAE,QAA+B;AAAA,QAC9C;AAAA,MAAA;AAEF,UAAI,CAACuQ,KAAS,CAAC,KAAK,gBAAiB;AACrC,YAAMxP,IAAIwP,EAAM,QAAQ,SAAS;AACjC,MAAKxP,MACDA,MAAM,eACR,KAAK,gBAAgB,gBAAgBwP,EAAM,UAClCA,EAAM,UACf,KAAK,gBAAgB,SAAS,IAAIxP,CAAC,IAEnC,KAAK,gBAAgB,SAAS,OAAOA,CAAC;AAAA,IAE1C,CAAC,GAEDosB,EAAO,iBAAiB,SAAS,MAAM;AACrC,MAAK,KAAK,oBACV,KAAK,gBAAgB,WAAW,IAAI,IAAI,KAAK,gBAAgB,OAAO,IAAI,CAAC3oB,MAAMA,EAAE,GAAG,CAAC,GACrF,KAAK,gBAAgB,gBAAgB,KAAK,gBAAgB,WAC1D,KAAK,uBAAA;AAAA,IACP,CAAC,GACD4oB,EAAQ,iBAAiB,SAAS,MAAM;AACtC,MAAK,KAAK,oBACV,KAAK,gBAAgB,WAAW,oBAAI,IAAA,GACpC,KAAK,gBAAgB,gBAAgB,IACrC,KAAK,uBAAA;AAAA,IACP,CAAC,GACDC,EAAS,iBAAiB,SAAS,MAAM,KAAK,sBAAsB,GACpEC,EAAS,iBAAiB,SAAS,MAAM,KAAK,gCAAgC,GAC9EC,EAAW,iBAAiB,SAAS,MAAM,KAAK,uBAAuB,KAAK,CAAC,GAC7EC,EAAY,iBAAiB,SAAS,MAAM,KAAK,uBAAuB,MAAM,CAAC,GAC/EC,EAAa,iBAAiB,SAAS,MAAM,KAAK,WAAW,GAE7D,KAAK,yBAAyB,KAAK,UAAU,UAAU,MAAM;AAC3D,MAAK,KAAK,8BACL,KAAK,8BACV,KAAK,qBAAqB,KAAK,yBAAyB,GACxD,KAAK,wBAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoBnuB,GAAgB;AAClC,SAAK,4BAA4BA,GACjC,KAAK,qBAAqBA,CAAM,GAChC,KAAK,KAAK,UAAU,OAAO,4BAA4B,EAAI,GAC3D,KAAK,wBAAA,IAEH,KAAK,mBAAmB,cAAgC,iCAAiC,KACzF,OACK,MAAA;AAAA,EACT;AAAA,EAEA,sBAAsB;AACpB,SAAK,KAAK,UAAU,OAAO,4BAA4B,EAAK,GAC5D,KAAK,4BAA4B,MACjC,KAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,sBAAsBA,GAAgB;AACpC,IAAI,KAAK,6BAA4B,KAAK,oBAAA,IACrC,KAAK,oBAAoBA,CAAM;AAAA,EACtC;AAAA,EAEQ,qBAAqBA,GAAgB;AAC3C,UAAM2K,IAAO,KAAK,UAAU,QAAA,GAEtB9K,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACI,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOD,CAAM,CAAC;AACvE,QAAI,CAACH,GAAK;AACR,WAAK,kBAAkB;AACvB;AAAA,IACF;AACA,UAAMuuB,IACJ,KAAK,mBAAmB,OAAO,KAAK,gBAAgB,MAAM,MAAM,OAAOvuB,EAAI,GAAG,IAC1E,KAAK,gBAAgB,SACrB,IACAwuB,IAAW,KAAK,UAAU,2BAA2BxuB,EAAI,GAAG,GAC5DqM,IAASmiB,EAAS,OAAO,IAAI,CAACnpB,OAAO,EAAE,GAAGA,GAAG,KAAK,KAAK,eAAeA,EAAE,KAAK,IAAI,GACjF6S,KAAYpN,EAAK,WAAW,CAAA,GAAI;AAAA,MACpC,CAACjJ,MACEA,EAAuB,SAAS,YACjC,OAAQA,EAAuB,GAAG,MAAM,OAAO7B,EAAI,GAAG;AAAA,IAAA,GAGpDyuB,wBAAe,IAAA;AACrB,QAAIvW;AACF,iBAAW7S,KAAK6S,EAAS,UAAU,CAAA,KAAa,IAAI,KAAK,eAAe7S,CAAC,CAAC;AAAA;AAE1E,iBAAWA,KAAKgH,EAAQ,CAAAoiB,EAAS,IAAIppB,EAAE,GAAG;AAE5C,UAAMqpB,IAAgBxW,IAAW,EAAQA,EAAS,gBAAiBsW,EAAS,WACtEvjB,IAAOH,EAAK,oBAAoB,OAAO9K,EAAI,GAAG,CAAC;AACrD,SAAK,kBAAkB;AAAA,MACrB,QAAQA,EAAI;AAAA,MACZ,QAAAqM;AAAA,MACA,WAAWmiB,EAAS;AAAA,MACpB,UAAAC;AAAA,MACA,eAAAC;AAAA,MACA,YAAY,EAAQzjB,GAAM;AAAA,MAC1B,cAAc,EAAQA,GAAM;AAAA,MAC5B,QAAQsjB;AAAA,IAAA;AAAA,EAEZ;AAAA,EAEQ,0BAA0B;AAChC,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAMI,IAAQ,KAAK,kBAAkB,cAA2B,2BAA2B,GACrFd,IAAW,KAAK,kBAAkB;AAAA,MACtC;AAAA,IAAA,GAEIC,IAAa,KAAK,kBAAkB;AAAA,MACxC;AAAA,IAAA,GAEIC,IAAS,KAAK,kBAAkB;AAAA,MACpC;AAAA,IAAA;AAEF,QAAI,CAACY,KAAS,CAACd,KAAY,CAACC,KAAc,CAACC,EAAQ;AACnD,UAAMK,IAAa,KAAK,kBAAkB;AAAA,MACxC;AAAA,IAAA,GAEIC,IAAc,KAAK,kBAAkB;AAAA,MACzC;AAAA,IAAA,GAEIO,IAAQ,KAAK;AACnB,QAAI,CAACA,GAAO;AACV,MAAAD,EAAM,cAAc,eACpBd,EAAS,UAAU,IACnBC,EAAW,UAAU,IACrBC,EAAO,QAAQ,IACXK,MAAYA,EAAW,QAAQ,SAAS,MACxCC,MAAaA,EAAY,QAAQ,SAAS,MAC9C,KAAK,uBAAA;AACL;AAAA,IACF;AAGA,UAAMQ,IAFS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACzuB,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOwuB,EAAM,MAAM,CAAC,GAC3D,UAAU,OAAOA,EAAM,MAAM;AAC/C,IAAAD,EAAM,cAAc,gBAAgBE,CAAI,IACxChB,EAAS,UAAUe,EAAM,YACzBd,EAAW,UAAUc,EAAM,cAC3Bb,EAAO,QAAQa,EAAM;AAErB,UAAME,IADO,KAAK,UAAU,QAAA,EACV,OAAO,KAAK,CAAC9tB,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO4tB,EAAM,MAAM,CAAC;AAC3E,IAAIR,MAAYA,EAAW,QAAQ,SAASU,GAAM,QAAQ,QAAQ,MAAM,MACpET,MAAaA,EAAY,QAAQ,SAASS,GAAM,QAAQ,SAAS,MAAM,MAC3E,KAAK,uBAAA;AAAA,EACP;AAAA,EAEQ,yBAAyB;AAC/B,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAMziB,IAAS,KAAK,kBAAkB,cAA2B,4BAA4B;AAC7F,QAAI,CAACA,EAAQ;AACb,IAAAA,EAAO,YAAY;AACnB,UAAMuiB,IAAQ,KAAK;AACnB,QAAI,CAACA,EAAO;AAEZ,UAAMxsB,IAAIwsB,EAAM,OAAO,KAAA,EAAO,YAAA;AAE9B,QADcA,EAAM,OAAO,UAAUA,EAAM,YAAY,IAAI,KAC/C,OAAO,CAACxsB,GAAG;AACrB,YAAM0oB,IAAM,SAAS,cAAc,KAAK;AACxC,MAAAA,EAAI,cAAc,2CAClBze,EAAO,YAAYye,CAAG;AACtB;AAAA,IACF;AAEA,QAAI8D,EAAM,WAAW;AACnB,YAAMvf,IAAQ,SAAS,cAAc,OAAO,GACtC0f,IAAK,SAAS,cAAc,OAAO;AACzC,MAAAA,EAAG,OAAO,YACVA,EAAG,QAAQ,QAAQ,cACnBA,EAAG,UAAUH,EAAM;AACnB,YAAMjd,IAAO,SAAS,cAAc,MAAM;AAC1C,MAAAA,EAAK,cAAc,YACnBtC,EAAM,YAAY0f,CAAE,GACpB1f,EAAM,YAAYsC,CAAI,GACtBtF,EAAO,YAAYgD,CAAK;AAAA,IAC1B;AAEA,UAAM2f,IAAW5sB,IACbwsB,EAAM,OAAO,OAAO,CAACvpB,MAAMA,EAAE,MAAM,cAAc,SAASjD,CAAC,CAAC,IAC5DwsB,EAAM;AACV,eAAWvpB,KAAK2pB,EAAS,MAAM,GAAG,GAAG,GAAG;AACtC,YAAM3f,IAAQ,SAAS,cAAc,OAAO,GACtC0f,IAAK,SAAS,cAAc,OAAO;AACzC,MAAAA,EAAG,OAAO,YACVA,EAAG,QAAQ,QAAQ1pB,EAAE,KACrB0pB,EAAG,UAAUH,EAAM,SAAS,IAAIvpB,EAAE,GAAG;AACrC,YAAMsM,IAAO,SAAS,cAAc,MAAM;AAC1C,MAAAA,EAAK,cAActM,EAAE,OACrBgK,EAAM,YAAY0f,CAAE,GACpB1f,EAAM,YAAYsC,CAAI,GACtBtF,EAAO,YAAYgD,CAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAC7B,UAAMuf,IAAQ,KAAK;AACnB,QAAI,CAACA,EAAO;AACZ,UAAM9jB,IAAO,KAAK,UAAU,QAAA,GACtBmkB,IAAkB,CAAC,GAAInkB,EAAK,WAAW,CAAA,CAAG,EAAE;AAAA,MAChD,CAACjJ,MACC,EACGA,EAAuB,SAAS,YACjC,OAAQA,EAAuB,GAAG,MAAM,OAAO+sB,EAAM,MAAM;AAAA,IAAA,GAO3DM,IAFJN,EAAM,SAAS,SAASA,EAAM,OAAO,UACrCA,EAAM,kBAAkB,EAAQA,EAAM,YAEpCK,IACA;AAAA,MACE,GAAGA;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,KAAKL,EAAM;AAAA,QACX,QAAQA,EAAM,OAAO,OAAO,CAACvpB,MAAMupB,EAAM,SAAS,IAAIvpB,EAAE,GAAG,CAAC,EAAE,IAAI,CAACA,MAAMA,EAAE,KAAK;AAAA,QAChF,eAAeupB,EAAM;AAAA,MAAA;AAAA,IACvB,GAGAO,IAAkB,EAAE,GAAIrkB,EAAK,qBAAqB,CAAA,EAAC;AACzD,IAAI8jB,EAAM,cAAcA,EAAM,eAC5BO,EAAgB,OAAOP,EAAM,MAAM,CAAC,IAAI;AAAA,MACtC,QAAQA,EAAM;AAAA,MACd,UAAUA,EAAM;AAAA,IAAA,IAGlB,OAAOO,EAAgB,OAAOP,EAAM,MAAM,CAAC;AAG7C,UAAMQ,IAAiB;AAAA,MACrB,GAAGtkB;AAAA,MACH,SAASokB,EAAY,SAASA,IAAc;AAAA,MAC5C,mBAAmB,OAAO,KAAKC,CAAe,EAAE,SAASA,IAAkB;AAAA,IAAA;AAE7E,SAAK,QAAQC,CAAQ;AAAA,EACvB;AAAA,EAEQ,iCAAiC;AACvC,UAAMjvB,IAAS,KAAK;AACpB,QAAIA,KAAW,KAA8B;AAC7C,UAAM2K,IAAO,KAAK,UAAU,QAAA,GACtBokB,IAAc,CAAC,GAAIpkB,EAAK,WAAW,CAAA,CAAG,EAAE;AAAA,MAC5C,CAACjJ,MACC,EACGA,EAAuB,SAAS,YACjC,OAAQA,EAAuB,GAAG,MAAM,OAAO1B,CAAM;AAAA,IAAA,GAGrDgvB,IAAkB,EAAE,GAAIrkB,EAAK,qBAAqB,CAAA,EAAC;AACzD,WAAOqkB,EAAgB,OAAOhvB,CAAM,CAAC;AACrC,UAAMivB,IAAiB;AAAA,MACrB,GAAGtkB;AAAA,MACH,SAASokB,EAAY,SAASA,IAAc;AAAA,MAC5C,mBAAmB,OAAO,KAAKC,CAAe,EAAE,SAASA,IAAkB;AAAA,IAAA;AAE7E,SAAK,QAAQC,CAAQ,GACrB,KAAK,qBAAqBjvB,CAAM,GAChC,KAAK,wBAAA;AAAA,EACP;AAAA,EAEQ,uBAAuBiL,GAAqB;AAClD,UAAMjL,IAAS,KAAK;AACpB,QAAIA,KAAW,KAA8B;AAE7C,UAAMivB,IAAiB,EAAE,GADZ,KAAK,UAAU,QAAA,GACM,OAAO,CAAC,EAAE,KAAKjvB,GAAQ,KAAAiL,EAAA,CAAK,EAAA;AAC9D,SAAK,QAAQgkB,CAAQ,GACrB,KAAK,qBAAqBjvB,CAAM,GAChC,KAAK,wBAAA;AAAA,EACP;AAAA,EAEQ,YAAY;AAClB,UAAM2K,IAAO,KAAK,UAAU,QAAA;AAC5B,QAAI,CAACA,EAAK,OAAO,OAAQ;AACzB,UAAMskB,IAAiB,EAAE,GAAGtkB,GAAM,OAAO,OAAA;AACzC,SAAK,QAAQskB,CAAQ,GACjB,KAAK,8BAA8B,SACrC,KAAK,qBAAqB,KAAK,yBAAyB,GACxD,KAAK,wBAAA;AAAA,EAET;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,yBAAA,GACL,KAAK,yBAAyB,MAC1B,KAAK,sBACPhhB,EAAiB,KAAK,iBAAiB,GACvC,KAAK,oBAAoB,OAEvB,KAAK,sBACP,SAAS,oBAAoB,WAAW,KAAK,mBAAmB,EAAI,GACpE,KAAK,oBAAoB,OAEvB,KAAK,4BACN,KAAK,cAAc,KAAK,MAAM;AAAA,MAC7B;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IAAA,GAEF,KAAK,yBAAyB,OAE5B,KAAK,yBACN,KAAK,cAAc,KAAK,MAAM;AAAA,MAC7B;AAAA,MACA,KAAK;AAAA,IAAA,GAEP,KAAK,sBAAsB,OAE7B,KAAK,KAAK,UAAU,OAAO,4BAA4B,EAAK,GAC5D,KAAK,4BAA4B,MACjC,KAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,oBAAoB;AAC1B,UAAM+a,IAAO,KAAK,cAAA;AAClB,SAAK,gBAAgB;AAAA,MACnB,WAAWA,EAAK;AAAA,MAChB,YAAYA,EAAK;AAAA,MACjB,aAAaA,EAAK;AAAA,MAClB,cAAcA,EAAK;AAAA,MACnB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW,YAAY,IAAA;AAAA,IAAI;AAAA,EAE/B;AAAA,EAEQ,yBAAyB;AAC/B,IAAK,KAAK,iBAAe,KAAK,kBAAA;AAC9B,UAAM5Q,IAAO,KAAK,iBAAiB;AAAA,MACjC,WAAW;AAAA,MACX,YAAY;AAAA,MAKZ,WAAW,YAAY,IAAA;AAAA,IAAI,GAEvB4Q,IAAO,KAAK,cAAA,GACZxf,IAAsB;AAAA,MAC1B,WAAWwf,EAAK;AAAA,MAChB,YAAYA,EAAK;AAAA,MACjB,aAAaA,EAAK;AAAA,MAClB,cAAcA,EAAK;AAAA,MACnB,QAAQA,EAAK,aAAa5Q,EAAK;AAAA,MAC/B,QAAQ4Q,EAAK,YAAY5Q,EAAK;AAAA,MAC9B,WAAW,YAAY,IAAA;AAAA,IAAI;AAE7B,SAAK,gBAAgB5O,GACjB,KAAK,UAAU,SACjB,KAAK,QAAQ,sBAAsB,MAAM,KAAK,aAAa;AAAA,EAE/D;AAAA,EAEQ,cAAc;AAEpB,IADA,KAAK,QAAQ,MACR,KAAK,kBACV,KAAK,kBAAkB,SAAS,KAAK,cAAc,WAAW,KAAK,cAAc,UAAU,GAEvF,OAAK,oBAAoBwD,OAC7B,KAAK,WAAW,KAAK,aAAa;AAAA,EACpC;AACF;AAGO,SAASkiB,GACdC,GACA5jB,GACA;AAQA,SAPa,IAAI8c,GAAe;AAAA,IAC9B,MAAM,SAAS,cAAc,KAAK;AAAA,IAClC,aAAa8G,EAAO;AAAA,IACpB,aAAaA,EAAO;AAAA,IACpB,QAAQA,EAAO;AAAA,IACf,SAAA5jB;AAAA,EAAA,CACD;AAEH;AAEO,SAAS6jB,GACd3iB,GACA4iB,GACA;AACA,SAAAA,EAAK,QAAQ5iB,CAAM,GACZ4iB;AACT;"}
|