minerva-design 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +2 -0
- package/dist/charts/engine/data.d.ts +2 -0
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +1 -1
- package/dist/charts/engine/defaults.cjs.map +1 -1
- package/dist/charts/engine/defaults.js +22 -18
- package/dist/charts/engine/defaults.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +532 -493
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/geometry.cjs +1 -1
- package/dist/charts/engine/graph/geometry.cjs.map +1 -1
- package/dist/charts/engine/graph/geometry.d.cts +12 -2
- package/dist/charts/engine/graph/geometry.d.ts +12 -2
- package/dist/charts/engine/graph/geometry.js +35 -31
- package/dist/charts/engine/graph/geometry.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +95 -74
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +1 -1
- package/dist/charts/engine/orderbook/field.cjs.map +1 -1
- package/dist/charts/engine/orderbook/field.d.cts +15 -2
- package/dist/charts/engine/orderbook/field.d.ts +15 -2
- package/dist/charts/engine/orderbook/field.js +21 -9
- package/dist/charts/engine/orderbook/field.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
- package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
- package/dist/charts/engine/orderbook/heatmap.js +576 -453
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +36 -11
- package/dist/charts/engine/orderbook/types.d.ts +36 -11
- package/dist/charts/engine/presets.cjs +1 -1
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +16 -3
- package/dist/charts/engine/presets.d.ts +16 -3
- package/dist/charts/engine/presets.js +42 -32
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +4 -2
- package/dist/charts/engine/scene.d.ts +4 -2
- package/dist/charts/engine/scene.js +185 -107
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/three-d/oit.cjs +119 -34
- package/dist/charts/engine/three-d/oit.cjs.map +1 -1
- package/dist/charts/engine/three-d/oit.d.cts +65 -10
- package/dist/charts/engine/three-d/oit.d.ts +65 -10
- package/dist/charts/engine/three-d/oit.js +119 -34
- package/dist/charts/engine/three-d/oit.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +19 -0
- package/dist/charts/engine/three-d/render-types.d.ts +19 -0
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +14 -6
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +6 -1
- package/dist/charts/engine/three-d/shaders.d.ts +6 -1
- package/dist/charts/engine/three-d/shaders.js +40 -26
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +167 -125
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +169 -140
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +1149 -1023
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +12 -0
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/layout.cjs +2 -0
- package/dist/charts/engine/trading/layout.cjs.map +1 -0
- package/dist/charts/engine/trading/layout.d.cts +37 -0
- package/dist/charts/engine/trading/layout.d.ts +37 -0
- package/dist/charts/engine/trading/layout.js +63 -0
- package/dist/charts/engine/trading/layout.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +24 -7
- package/dist/charts/engine/trading/types.d.ts +24 -7
- package/dist/charts/engine/types.d.cts +21 -8
- package/dist/charts/engine/types.d.ts +21 -8
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +104 -83
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +42 -32
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +185 -107
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/taro/index.js +1263 -1152
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
- package/dist/vue/components/Chart/orderbook.d.ts +7 -0
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/weapp/charts/canvas.js +234 -58
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.cjs","names":["createGraphDom","readTheme","graphLocale","buildModel","parseColor","mix","forceInit","forceKernel","createForceRunner","tidyTreeLayout","computeSizing","layeredLayout","TREE_LEVEL_GAP","arcPositions","circularPositions","longestPath","NodeKind","endDirection","boundaryDistance","trimPath","loopPath","arcPath","quadraticPath","roundCorners","orthogonalPath","splinePath","packColor","GAP","dashPath","luminance","toCss","labelOf","pointAt","pathLength","swatch","fill","distanceToPath","style","themeColorsChanged","watchTheme","watchLocale","resolveLocale","createRenderer","followDefaultRenderer","require_color","require_types","require_locale","require_detect","require_follow","require_theme","require_force","require_circular","require_dag","require_dom","require_geometry","require_labels","require_model","require_sizing","require_tree","require_worker","LAYOUTS","TREE_TYPES","HALO_LIMIT","PARALLEL_BOW","EDGE_INDEX_MIN","TWEEN_MS","VIEW_TWEEN_MS","BOX_FONT_MIN","KEY_ZOOM","BUTTON_ZOOM","wheelFactor","pixels","deltaMode","deltaY","pinch","ease","t","pointBuffer","data","length","ensure","extra","next","x","y","points","i","resolveLayout","layout","layoutSignature","o","createGraphChart","doc","container","win","dom","stage","options","initialOptions","theme","dark","isDark","loc","destroyed","listeners","emit","type","fn","event","listening","reducedMotion","now","model","layoutType","direction","layoutSig","sizing","X","Y","TX","TY","FX","FY","visible","prevVisible","tween","tweenT","tree","dag","circ","runner","forcePending","collapsedIds","hiddenGroups","critical","descendants","paths","pathsDirty","geometryVersion","sceneDirty","items","version","nodeColor","edgeColor","edgeWidth","edgeArrow","edgeDashed","groupColor","criticalColor","edgeLabelWidth","k","tx","ty","viewTween","userMoved","needsFit","fitAnimate","drawnOnce","followLayout","width","height","hover","focusIndex","focusVisible","selection","highlight","highlightKey","renderer","rendererToken","resolveReady","ready","resolve","frameId","interaction","c","isTree","collapsible","animationMs","a","highlightMode","edgeStyle","s","flow","resolveColor","value","fallback","measureCtx","measure","font","text","snapshot","map","stopRunner","collapsedSet","set","id","treeInput","w","h","startForce","follow","fixed","known","node","p","prev","e","j","radius","range","weight","mean","v","edge","alpha","sw","sh","init","f","animate","workerOption","useWorker","sim","emitLayoutEnd","invalidate","wasPending","runLayout","previousType","n","depth","ones","nextVisible","tx2","ty2","d","levelGap","spacing","input","oldVisible","countDescendants","ms","from","refreshCritical","refreshColors","updateAccessibility","renderLegend","counts","order","q","option","nodes","edges","path","ids","bg","palette","g","branch","roots","stack","b","neutral","mode","wOption","eRange","wMin","wMax","arrows","fade","isBox","port","vertical","sign","trimmed","ux","uy","l0","ex","ey","loopAngle","angles","dx","dy","end","best","angle","gap","loopSize","loopOf","box","at","edgePath","arrow","bend","parallel","rise","bow","style","mx","my","tension","cx","cy","rs","rt","as","rm","out","route","pts","along","dir","bottom","left","bus","mid","refreshPaths","straightEnds","len","updateHighlight","sources","edgeHover","key","buildScene","minPx","hl","layers","bucket","color","layer","arrowLen","filledLen","filled","heads","tmp","head","buf","ends","l","line","item","nodeFill","halo","fills","rings","collapsedFill","selRings","avatars","boxBuckets","outlines","radiusPx","showHalo","drawOrder","selected","hovered","hasVisibleChild","solid","crit","border","body","pad","okey","list","scatter","count","buffer","f32","u32","bars","half","late","frame","transform","dpr","animating","target","fitView","approachView","k0","x0","y0","k1","x1","y1","kk","c0x","c0y","c1x","c1y","bw","bh","drawOverlay","positionTooltip","screenX","screenY","ellipsize","max","ctx","lo","hi","textColorOn","family","muted","bgCss","cols","rows","grid","free","c0","c1","r0","r1","mark","r","onScreen","sx","margin","sy","showBoxText","natural","size","avatar","maxWidth","subSize","block","subtitle","titleY","label","sub","initial","collapsed","active","bx","by","label2","priority","drawn","budget","drawLabel","force","strong","dim","raw","tw","place","placement","bx0","by0","bx1","by1","edgeMode","shownEdges","lit","lw","all","below","radial","flip","inner","right","maxLabel","hw","hh","reach","lx","ly","pl","pr","pt","pb","aw","ah","ox","oy","zoomLimits","fit","to","rate","setView","zoomAround","nk","factor","ratio","legendKey","named","show","config","toggle","focused","hidden","toggleGroup","group","setHover","role","labels","keyboard","ia","lines","names","controls","pickGrid","pickCell","maxExtent","pickKey","buildPickGrid","pickNode","wx","px","wy","py","tol","minR","bestD","pickEdge","test","index","edgeIndex","cell","visit","start","stamp","edgeGrid","current","m","segment","segments","span","register","ax","ay","steps","pass","cursor","pickAt","tooltipEnabled","hoverEvent","offsetX","offsetY","hit","sameHit","renderTooltip","tooltipTarget","tip","custom","content","defaultTooltip","ev","th","row","el","name","header","title","fragment","tag","dot","hoverFrame","pendingHover","scheduleHover","drag","setSelection","notify","selectNode","multi","additive","setCollapsed","collapse","kept","pointers","local","pinchInfo","onPointerDown","center","base","onPointerMove","scale","distance","nx","ny","startForceFrom","onPointerUp","was","handleClick","onPointerCancel","onPointerLeave","hintTimer","showHint","mac","onWheel","onDoubleClick","instance","onFocus","onBlur","drawnNodes","setFocus","degree","neighborInDirection","bestScore","vx","vy","across","score","startingNode","first","onKeyDown","onZoomIn","onZoomOut","onFit","resizeObserver","refreshTheme","fontChanged","unwatchTheme","unwatchLocale","initRenderer","token","canvas","kind","exclude","initialState","applySelectedOption","unfollowDefault","replaceData","focusId","dataChanged","previous","sig","changed","opts","nodeId","listener"],"sources":["../../../../../charts/src/engine/graph/chart.ts"],"sourcesContent":["// createGraphChart: relationship networks, dependency DAGs and trees. Nodes\n// and edges are drawn by a GPU backend (WebGPU -> WebGL2 -> WebGL) or by\n// Canvas2D through the shared renderer contract (edges = polylines, nodes =\n// discs and rounded boxes); labels, badges and the focus ring are a 2D\n// canvas above them. Layouts: force (Barnes–Hut, optional worker), layered\n// DAG, tidy / radial / mind map / org trees, circular and arc diagrams.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { resolveLocale, watchLocale } from \"../locale\";\nimport { createRenderer } from \"../renderers/detect\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n GAP,\n SCATTER_STRIDE,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type LineItem,\n type RenderItem,\n type ScatterItem,\n} from \"../renderers/types\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { arcPositions, circularPositions } from \"./circular\";\nimport { layeredLayout, longestPath } from \"./dag\";\nimport { createGraphDom, sizeCanvas, style, swatch } from \"./dom\";\nimport { forceInit, forceKernel } from \"./force\";\nimport {\n arcPath,\n arrowHead,\n boundaryDistance,\n cubicPoints,\n dashPath,\n distanceToPath,\n endDirection,\n filledArrow,\n loopPath,\n orthogonalPath,\n pathLength,\n pointAt,\n quadraticPath,\n roundCorners,\n splinePath,\n trimPath,\n} from \"./geometry\";\nimport { fill, graphLocale, type GraphLocale } from \"./labels\";\nimport { buildModel, lineage, neighborhood, type GraphModel } from \"./model\";\nimport {\n LABEL_FONT_SIZE,\n NodeKind,\n computeSizing,\n labelOf,\n type NodeSizing,\n} from \"./sizing\";\nimport { TREE_LEVEL_GAP, tidyTreeLayout, type TreeType } from \"./tree\";\nimport type {\n GraphCircularLayoutResult,\n GraphDagLayoutResult,\n GraphChartEventMap,\n GraphChartInstance,\n GraphChartOptions,\n GraphDirection,\n GraphEdgeStyle,\n GraphHoverEvent,\n GraphInteractionOptions,\n GraphLayoutType,\n GraphPoint,\n GraphTreeLayoutResult,\n} from \"./types\";\nimport {\n WORKER_THRESHOLD,\n createForceRunner,\n type ForceRunner,\n} from \"./worker\";\n\nconst LAYOUTS: readonly GraphLayoutType[] = [\n \"force\",\n \"dag\",\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n \"circular\",\n \"arc\",\n \"none\",\n];\n\nconst TREE_TYPES = new Set<GraphLayoutType>([\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n]);\n\n/** Node halos are skipped above this number of nodes */\nconst HALO_LIMIT = 5000;\n/** Sideways bow of parallel edges per slot, relative to their length */\nconst PARALLEL_BOW = 0.4;\n/** Edge picking uses a spatial index from this number of edges */\nconst EDGE_INDEX_MIN = 2000;\nconst TWEEN_MS = 450;\nconst VIEW_TWEEN_MS = 320;\n/** Smallest font (px) of the text inside boxes when zoomed out */\nconst BOX_FONT_MIN = 9;\nconst KEY_ZOOM = 1.25;\nconst BUTTON_ZOOM = 1.4;\n\nconst wheelFactor = (deltaY: number, deltaMode: number, pinch: boolean) => {\n const pixels =\n deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const speed = pinch ? 0.01 : 0.0025;\n return Math.exp(Math.max(-1, Math.min(1, pixels * speed)));\n};\n\nconst ease = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n/** Grows a Float32Array of interleaved points */\nconst pointBuffer = () => {\n let data = new Float32Array(1024);\n let length = 0;\n const ensure = (extra: number) => {\n if (length + extra <= data.length) return;\n const next = new Float32Array(Math.max(data.length * 2, length + extra));\n next.set(data.subarray(0, length));\n data = next;\n };\n return {\n push(x: number, y: number) {\n ensure(2);\n data[length++] = x;\n data[length++] = y;\n },\n pushAll(points: readonly number[]) {\n ensure(points.length);\n for (let i = 0; i < points.length; i++) data[length++] = points[i];\n },\n count: () => length / 2,\n points: () => data.subarray(0, length),\n };\n};\n\ntype PointBuffer = ReturnType<typeof pointBuffer>;\n\ninterface Hit {\n type: \"node\" | \"edge\";\n index: number;\n}\n\ninterface Snapshot {\n x: number;\n y: number;\n visible: boolean;\n}\n\nexport const resolveLayout = (\n layout: GraphLayoutType | undefined,\n): GraphLayoutType => (layout && LAYOUTS.includes(layout) ? layout : \"force\");\n\nconst layoutSignature = (o: GraphChartOptions): string =>\n JSON.stringify([\n resolveLayout(o.layout),\n o.direction ?? \"\",\n o.force ?? null,\n o.dag\n ? { ...o.dag, criticalPath: undefined, criticalColor: undefined }\n : null,\n o.tree ?? null,\n o.circular ?? null,\n o.nodeSize ?? null,\n o.nodeShape ?? null,\n o.nodeLabels === false,\n ]);\n\nexport const createGraphChart = (\n container: HTMLElement,\n initialOptions: GraphChartOptions,\n): GraphChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createGraphDom(container);\n const stage = dom.stage;\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let dark = isDark(theme);\n let loc: GraphLocale = graphLocale(options.locale, options.labels);\n let destroyed = false;\n\n const listeners = new Map<\n keyof GraphChartEventMap,\n Set<(e: never) => void>\n >();\n const emit = <K extends keyof GraphChartEventMap>(\n type: K,\n event: GraphChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: GraphChartEventMap[K]) => void)(event));\n };\n const listening = (type: keyof GraphChartEventMap) =>\n !!listeners.get(type)?.size;\n\n const reducedMotion =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n const now = () => win?.performance?.now() ?? Date.now();\n\n // --------------------------------------------------------------- state\n\n let model: GraphModel = buildModel(\n options.nodes ?? [],\n options.edges ?? [],\n options.groups,\n );\n let layoutType: GraphLayoutType = resolveLayout(options.layout);\n let direction: GraphDirection = \"TB\";\n let layoutSig = layoutSignature(options);\n let sizing: NodeSizing;\n let X: Float64Array = new Float64Array(0);\n let Y: Float64Array = new Float64Array(0);\n let TX: Float64Array = new Float64Array(0);\n let TY: Float64Array = new Float64Array(0);\n let FX: Float64Array = new Float64Array(0);\n let FY: Float64Array = new Float64Array(0);\n let visible = new Uint8Array(0);\n let prevVisible: Uint8Array | null = null;\n let tween: { start: number; duration: number } | null = null;\n let tweenT = 1;\n let tree: GraphTreeLayoutResult | null = null;\n let dag: GraphDagLayoutResult | null = null;\n let circ: GraphCircularLayoutResult | null = null;\n let runner: ForceRunner | null = null;\n let forcePending = false;\n const collapsedIds = new Set<string>();\n const hiddenGroups = new Set<string>();\n let critical: { nodes: Uint8Array; edges: Uint8Array } | null = null;\n let descendants = new Int32Array(0);\n let paths: (number[] | null)[] = [];\n let pathsDirty = true;\n /** Changes with the edge geometry (see the edge index) */\n let geometryVersion = 0;\n let sceneDirty = true;\n let items: RenderItem[] = [];\n let version = 0;\n\n // colors\n let nodeColor: Rgba[] = [];\n let edgeColor: Rgba[] = [];\n let edgeWidth = new Float64Array(0);\n let edgeArrow = new Uint8Array(0);\n let edgeDashed = new Uint8Array(0);\n let groupColor: Rgba[] = [];\n let criticalColor: Rgba = [0.94, 0.27, 0.27, 1];\n let edgeLabelWidth = new Float64Array(0);\n\n // view: screen = world * k + t (CSS pixels)\n let k = 1;\n let tx = 0;\n let ty = 0;\n let viewTween: {\n from: [number, number, number];\n to: [number, number, number];\n start: number;\n } | null = null;\n let userMoved = false;\n let needsFit = true;\n /** The next fit animates (layout changes after the first frame) */\n let fitAnimate = false;\n let drawnOnce = false;\n /** The view follows the running force layout (unless the user moved it) */\n let followLayout = false;\n let width = 0;\n let height = 0;\n\n // interaction\n let hover: Hit | null = null;\n let focusIndex = -1;\n let focusVisible = false;\n const selection = new Set<number>();\n let highlight: { nodes: Uint8Array; edges: Uint8Array; accent: Rgba } | null =\n null;\n let highlightKey = \"\";\n\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n let frameId = 0;\n\n // ------------------------------------------------------------ options\n\n const interaction = (): Required<GraphInteractionOptions> | null => {\n const o = options.interaction;\n if (o === false) return null;\n const c = typeof o === \"object\" ? o : {};\n return {\n pan: c.pan ?? true,\n zoom: c.zoom ?? true,\n wheel: c.wheel ?? \"modifier\",\n drag:\n c.drag ??\n (layoutType === \"force\" ||\n layoutType === \"none\" ||\n layoutType === \"circular\"),\n select: c.select ?? true,\n keyboard: c.keyboard ?? true,\n zoomRange: c.zoomRange ?? [0.02, 8],\n };\n };\n\n const isTree = () => TREE_TYPES.has(layoutType);\n const collapsible = () => isTree() && options.tree?.collapsible !== false;\n const animationMs = () => {\n const a = options.animation;\n if (a === false || reducedMotion?.matches) return 0;\n return typeof a === \"number\" && a >= 0 ? a : TWEEN_MS;\n };\n const highlightMode = () =>\n options.highlight ?? (layoutType === \"dag\" ? \"lineage\" : \"neighbors\");\n\n const edgeStyle = (): GraphEdgeStyle => {\n const s = options.edgeStyle;\n const flow = layoutType === \"dag\" || isTree();\n if (s === \"straight\" || s === \"curve\") return s;\n if ((s === \"spline\" || s === \"orthogonal\") && flow) return s;\n if (s) return \"curve\";\n switch (layoutType) {\n case \"dag\":\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n return \"spline\";\n case \"org\":\n return \"orthogonal\";\n case \"circular\":\n case \"arc\":\n return \"curve\";\n default:\n return \"straight\";\n }\n };\n\n const resolveColor = (value: string, fallback: Rgba): Rgba => {\n const c = theme.resolve\n ? theme.resolve(value, fallback)\n : (parseColor(value) ?? fallback);\n return c[3] < 1 ? mix(theme.background, [c[0], c[1], c[2], 1], c[3]) : c;\n };\n\n // ----------------------------------------------------------- measure\n\n const measureCtx = dom.foreground.getContext(\"2d\");\n const measure = (text: string, font: string) => {\n if (!measureCtx) return text.length * 7;\n measureCtx.font = font;\n return measureCtx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- layout\n\n const snapshot = (): Map<string, Snapshot> => {\n const map = new Map<string, Snapshot>();\n if (X.length !== model.n) return map;\n for (let i = 0; i < model.n; i++) {\n if (!Number.isFinite(X[i])) continue;\n map.set(model.nodes[i].id, {\n x: X[i],\n y: Y[i],\n visible: !!visible[i] && !forcePending,\n });\n }\n return map;\n };\n\n const stopRunner = () => {\n runner?.destroy();\n runner = null;\n forcePending = false;\n };\n\n const collapsedSet = () => {\n const set = new Set<number>();\n for (const id of collapsedIds) {\n const i = model.index.get(id);\n if (i !== undefined) set.add(i);\n }\n return set;\n };\n\n const treeInput = (\n type: TreeType,\n w: ArrayLike<number>,\n h: ArrayLike<number>,\n levelGap: number,\n ) => {\n const t = options.tree ?? {};\n return {\n n: model.n,\n source: model.source,\n target: model.target,\n width: w,\n height: h,\n type,\n direction,\n root: t.root !== undefined ? (model.index.get(t.root) ?? -1) : -1,\n levelGap,\n siblingGap:\n t.siblingGap ?? (type === \"org\" ? 20 : type === \"mindmap\" ? 10 : 12),\n collapsed: collapsedSet(),\n compact: t.compact,\n };\n };\n\n const startForce = (prev: Map<string, Snapshot>, follow = true) => {\n followLayout = follow;\n const n = model.n;\n const x = new Float64Array(n).fill(NaN);\n const y = new Float64Array(n).fill(NaN);\n const fixed = new Uint8Array(n);\n let known = 0;\n for (let i = 0; i < n; i++) {\n const node = model.nodes[i];\n const p = prev.get(node.id);\n if (p) {\n x[i] = p.x;\n y[i] = p.y;\n known++;\n } else if (Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n known++;\n }\n if (node.fixed && Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n fixed[i] = 1;\n }\n }\n // new nodes start next to a known neighbor\n if (known && known < n) {\n for (let i = 0; i < n; i++) {\n if (Number.isFinite(x[i])) continue;\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (Number.isFinite(x[j])) {\n x[i] = x[j] + ((i * 7919) % 17) - 8;\n y[i] = y[j] + ((i * 104729) % 17) - 8;\n break;\n }\n }\n }\n }\n const radius = new Float64Array(n);\n for (let i = 0; i < n; i++)\n radius[i] = Math.max(sizing.width[i], sizing.height[i]) / 2;\n const range = model.edgeValueRange;\n const weight = new Float64Array(model.m).fill(1);\n if (range) {\n const mean = (range[0] + range[1]) / 2 || 1;\n model.edges.forEach((edge, e) => {\n const v = edge.value;\n if (Number.isFinite(v) && v! > 0)\n weight[e] = Math.max(0.5, Math.min(2, Math.sqrt(v! / mean)));\n });\n }\n const alpha = known === 0 ? 1 : known === n ? 0.3 : 0.6;\n const sw = stage.clientWidth;\n const sh = stage.clientHeight;\n const init = forceInit(n, model.source, model.target, options.force, {\n x,\n y,\n radius,\n fixed,\n weight,\n alpha,\n aspect: sw > 0 && sh > 0 ? sw / sh : 1,\n });\n const f = options.force ?? {};\n const animate = f.animate !== false;\n const workerOption = f.worker ?? \"auto\";\n const useWorker =\n workerOption === true ||\n (workerOption === \"auto\" && n >= WORKER_THRESHOLD);\n X = x;\n Y = y;\n TX = x;\n TY = y;\n if (!animate && !useWorker) {\n const sim = forceKernel()(init);\n while (sim.tick(50));\n sim.settle();\n emitLayoutEnd();\n return;\n }\n forcePending = !animate;\n runner = createForceRunner(init, {\n worker: useWorker,\n stream: animate,\n now,\n onTick: () => {\n pathsDirty = true;\n invalidate();\n },\n onEnd: () => {\n const wasPending = forcePending;\n forcePending = false;\n pathsDirty = true;\n if (!userMoved && followLayout) {\n needsFit = true;\n // nothing was shown yet: appear fitted, otherwise glide to the fit\n fitAnimate = !wasPending;\n }\n followLayout = false;\n emitLayoutEnd();\n invalidate();\n },\n });\n };\n\n const emitLayoutEnd = () => {\n // after the current call stack (listeners may call the instance)\n void Promise.resolve().then(() => {\n if (!destroyed) emit(\"layoutEnd\", { layout: layoutType });\n });\n };\n\n const runLayout = (prev: Map<string, Snapshot>, animate: boolean) => {\n stopRunner();\n const previousType = layoutType;\n layoutType = resolveLayout(options.layout);\n direction = options.direction ?? (layoutType === \"tree\" ? \"LR\" : \"TB\");\n if (previousType !== layoutType) needsFit = true;\n const n = model.n;\n tree = null;\n dag = null;\n circ = null;\n\n let depth: Int32Array | null = null;\n if (layoutType === \"mindmap\") {\n const ones = new Float64Array(n).fill(1);\n depth = tidyTreeLayout(treeInput(\"mindmap\", ones, ones, 1)).depth;\n }\n sizing = computeSizing(\n model,\n layoutType,\n options,\n depth,\n measure,\n theme.fontFamily,\n );\n const nextVisible = new Uint8Array(n).fill(1);\n let tx2: Float64Array = new Float64Array(n);\n let ty2: Float64Array = new Float64Array(n);\n\n switch (layoutType) {\n case \"dag\": {\n const d = options.dag ?? {};\n dag = layeredLayout({\n n,\n source: model.source,\n target: model.target,\n width: sizing.width,\n height: sizing.height,\n direction,\n layerGap: d.layerGap ?? 56,\n nodeGap: d.nodeGap ?? 24,\n sweeps: d.sweeps ?? 8,\n });\n tx2 = dag.x;\n ty2 = dag.y;\n break;\n }\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n case \"org\": {\n const type = layoutType as TreeType;\n const levelGap =\n options.tree?.levelGap ??\n Math.max(TREE_LEVEL_GAP[type], sizing.levelGap);\n tree = tidyTreeLayout(\n treeInput(type, sizing.layoutWidth, sizing.layoutHeight, levelGap),\n );\n tx2 = tree.x;\n ty2 = tree.y;\n nextVisible.set(tree.visible);\n break;\n }\n case \"circular\":\n case \"arc\": {\n let spacing = 0;\n for (let i = 0; i < n; i++)\n spacing = Math.max(\n spacing,\n sizing.layoutWidth[i] + (layoutType === \"arc\" ? 8 : 10),\n );\n const input = {\n n,\n source: model.source,\n target: model.target,\n group: model.groupOf,\n order: options.circular?.order ?? \"group\",\n spacing: Math.max(layoutType === \"arc\" ? 16 : 18, spacing),\n };\n circ =\n layoutType === \"arc\" ? arcPositions(input) : circularPositions(input);\n tx2 = circ.x;\n ty2 = circ.y;\n break;\n }\n case \"none\": {\n model.nodes.forEach((node, i) => {\n const p = prev.get(node.id);\n tx2[i] = Number.isFinite(node.x) ? node.x! : (p?.x ?? 0);\n ty2[i] = Number.isFinite(node.y) ? node.y! : (p?.y ?? 0);\n });\n break;\n }\n default:\n break;\n }\n\n const oldVisible = new Uint8Array(n);\n for (let i = 0; i < n; i++)\n oldVisible[i] = prev.get(model.nodes[i].id)?.visible ? 1 : 0;\n visible = nextVisible;\n descendants = countDescendants();\n\n if (layoutType === \"force\") {\n startForce(prev);\n tween = null;\n prevVisible = null;\n } else {\n TX = tx2;\n TY = ty2;\n X = new Float64Array(n);\n Y = new Float64Array(n);\n const ms = animate && prev.size ? animationMs() : 0;\n if (ms > 0) {\n FX = new Float64Array(n);\n FY = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const p = prev.get(model.nodes[i].id);\n if (p && p.visible) {\n FX[i] = p.x;\n FY[i] = p.y;\n continue;\n }\n // entering nodes grow out of their closest previously shown ancestor\n let a = tree ? tree.parent[i] : -1;\n let from: Snapshot | undefined;\n while (a >= 0 && !(from = prev.get(model.nodes[a].id))?.visible)\n a = tree!.parent[a];\n FX[i] = from?.visible ? from.x : TX[i];\n FY[i] = from?.visible ? from.y : TY[i];\n }\n X.set(FX);\n Y.set(FY);\n prevVisible = oldVisible;\n tween = { start: now(), duration: ms };\n tweenT = 0;\n } else {\n X.set(TX);\n Y.set(TY);\n tween = null;\n prevVisible = null;\n }\n }\n if (!userMoved) {\n needsFit = true;\n fitAnimate = prev.size > 0 && animate && layoutType !== \"force\";\n }\n refreshCritical();\n refreshColors();\n edgeLabelWidth = new Float64Array(model.m).fill(NaN);\n edgeGrid = null;\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n updateAccessibility();\n renderLegend();\n invalidate();\n if (layoutType !== \"force\") emitLayoutEnd();\n };\n\n const countDescendants = () => {\n const counts = new Int32Array(model.n);\n if (!tree) return counts;\n const order: number[] = [];\n tree.parent.forEach((p, i) => {\n if (p < 0) order.push(i);\n });\n for (let q = 0; q < order.length; q++)\n order.push(...tree.children[order[q]]);\n for (let q = order.length - 1; q >= 0; q--) {\n const v = order[q];\n const p = tree.parent[v];\n if (p >= 0) counts[p] += counts[v] + 1;\n }\n return counts;\n };\n\n const refreshCritical = () => {\n critical = null;\n const option = options.dag?.criticalPath;\n if (!option || layoutType !== \"dag\") return;\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (option === true) {\n const path = longestPath(model.n, model.source, model.target, (i) => {\n const v = model.nodes[i].value;\n return Number.isFinite(v) && v! >= 0 ? v! : 1;\n });\n path.nodes.forEach((i) => (nodes[i] = 1));\n path.edges.forEach((e) => (edges[e] = 1));\n } else {\n const ids = option.map((id) => model.index.get(id) ?? -1);\n ids.forEach((i) => {\n if (i >= 0) nodes[i] = 1;\n });\n for (let e = 0; e < model.m; e++) {\n const s = ids.indexOf(model.source[e]);\n if (s >= 0 && ids[s + 1] === model.target[e]) edges[e] = 1;\n }\n }\n critical = { nodes, edges };\n };\n\n // ------------------------------------------------------------- colors\n\n const refreshColors = () => {\n const bg = theme.background;\n dark = isDark(theme);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n groupColor = model.groups.map((g, i) =>\n g.color\n ? resolveColor(g.color, palette[i % palette.length])\n : palette[i % palette.length],\n );\n criticalColor = resolveColor(\n options.dag?.criticalColor ?? \"var(--danger-color, #ef4444)\",\n [0.94, 0.27, 0.27, 1],\n );\n // mind maps color each branch\n const branch = new Int32Array(model.n).fill(-1);\n if (layoutType === \"mindmap\" && tree) {\n const roots: number[] = [];\n tree.parent.forEach((p, i) => p < 0 && roots.push(i));\n const firstLevel = roots.length\n ? [...tree.children[roots[0]], ...roots.slice(1)]\n : [];\n firstLevel.forEach((c, b) => {\n const stack = [c];\n while (stack.length) {\n const v = stack.pop()!;\n branch[v] = b;\n stack.push(...tree!.children[v]);\n }\n });\n }\n nodeColor = model.nodes.map((node, i) => {\n if (node.color) return resolveColor(node.color, theme.primary);\n const g = model.groupOf[i];\n if (g >= 0) return groupColor[g];\n if (branch[i] >= 0) return palette[(branch[i] + 1) % palette.length];\n return theme.primary;\n });\n const neutral = mix(bg, theme.textMuted, dark ? 0.42 : 0.36);\n const mode = options.edgeColor ?? \"neutral\";\n const wOption = options.edgeWidth;\n const eRange = model.edgeValueRange;\n const [wMin, wMax] = Array.isArray(wOption)\n ? (wOption as readonly [number, number])\n : typeof wOption === \"number\"\n ? [wOption, wOption]\n : eRange && eRange[1] > eRange[0]\n ? [1, 5]\n : [1.25, 1.25];\n edgeColor = [];\n edgeWidth = new Float64Array(model.m);\n edgeArrow = new Uint8Array(model.m);\n edgeDashed = new Uint8Array(model.m);\n const arrows = options.arrows ?? layoutType === \"dag\";\n model.edges.forEach((edge, e) => {\n const s = model.source[e];\n const t = model.target[e];\n let c = neutral;\n if (edge.color) c = resolveColor(edge.color, neutral);\n else if (mode === \"source\") c = mix(bg, nodeColor[s], 0.55);\n else if (mode === \"target\") c = mix(bg, nodeColor[t], 0.55);\n else if (layoutType === \"mindmap\") c = mix(bg, nodeColor[t], 0.7);\n edgeColor.push(c);\n let w = wMin;\n if (Number.isFinite(edge.width) && edge.width! > 0) w = edge.width!;\n else if (eRange && eRange[1] > eRange[0] && Number.isFinite(edge.value))\n w =\n wMin +\n (wMax - wMin) *\n Math.sqrt((edge.value! - eRange[0]) / (eRange[1] - eRange[0]));\n else if (layoutType === \"mindmap\" && tree && wOption === undefined)\n w = Math.max(1.25, 3.4 - tree.depth[t] * 0.75);\n edgeWidth[e] = w;\n edgeArrow[e] = (edge.directed ?? arrows) ? 1 : 0;\n edgeDashed[e] = edge.dashed ? 1 : 0;\n });\n sceneDirty = true;\n };\n\n // --------------------------------------------------------------- paths\n\n const fade = (i: number): number => {\n if (forcePending) return 0;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) return 0;\n const v = visible[i];\n const p = prevVisible ? prevVisible[i] : v;\n if (tween) {\n if (v && p) return 1;\n if (v) return tweenT;\n if (p) return 1 - tweenT;\n return 0;\n }\n return v;\n };\n\n const isBox = (i: number) => sizing.kind[i] !== NodeKind.Circle;\n\n /** Port of a node on the flow axis (sign +1 = outgoing side) */\n const port = (\n i: number,\n vertical: boolean,\n sign: number,\n ): [number, number] =>\n vertical\n ? [X[i], Y[i] + (sign * sizing.height[i]) / 2]\n : [X[i] + (sign * sizing.width[i]) / 2, Y[i]];\n\n const flow = (): { vertical: boolean; sign: number } => {\n const d = layoutType === \"org\" ? \"TB\" : direction;\n return {\n vertical: layoutType !== \"mindmap\" && (d === \"TB\" || d === \"BT\"),\n sign: d === \"BT\" || d === \"RL\" ? -1 : 1,\n };\n };\n\n const trimmed = (\n points: number[],\n s: number,\n t: number,\n arrow: boolean,\n ): number[] => {\n if (points.length < 4) return points;\n const [ux, uy] = [points[2] - points[0], points[3] - points[1]];\n const l0 = Math.hypot(ux, uy) || 1;\n const [ex, ey] = endDirection(points);\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux / l0,\n uy / l0,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ex, ey) +\n (arrow ? 1 : 0);\n return trimPath(points, a, b);\n };\n\n /** Direction of the self-loops of a node: the middle of its widest free angle */\n const loopAngle = (i: number): number => {\n const angles: number[] = [];\n // the label of a circle sits below it: keep that side free too\n if (sizing.kind[i] === NodeKind.Circle && options.nodeLabels !== false)\n angles.push(Math.PI / 2);\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (j === i || fade(j) <= 0) continue;\n const dx = X[j] - X[i];\n const dy = Y[j] - Y[i];\n if (dx * dx + dy * dy > 1e-12) angles.push(Math.atan2(dy, dx));\n }\n if (!angles.length) return -Math.PI / 2;\n angles.sort((a, b) => a - b);\n const end = angles[angles.length - 1];\n let best = angles[0] + Math.PI * 2 - end;\n let angle = end + best / 2;\n for (let k = 1; k < angles.length; k++) {\n const gap = angles[k] - angles[k - 1];\n if (gap > best + 1e-9) {\n best = gap;\n angle = angles[k - 1] + gap / 2;\n }\n }\n return angle;\n };\n\n /** Reach of the self-loops of a node beyond its boundary */\n const loopSize = (i: number) =>\n Math.max(\n 12,\n Math.min(40, Math.min(sizing.width[i], sizing.height[i]) * 0.9),\n );\n\n /** Self-loop of an edge whose ends are the same node */\n const loopOf = (e: number): number[] => {\n const i = model.source[e];\n const angle = loopAngle(i);\n const w = sizing.width[i];\n const h = sizing.height[i];\n const box = isBox(i);\n const at = (a: number) =>\n boundaryDistance(box, w, h, Math.cos(a), Math.sin(a));\n return loopPath(\n X[i],\n Y[i],\n angle,\n at(angle - 0.42),\n at(angle + 0.42) + (edgeArrow[e] ? 1 : 0),\n loopSize(i) * (1 + 0.6 * model.bend[e]),\n );\n };\n\n /** Polyline of a curved edge (straight edges are built on the fly) */\n const edgePath = (e: number, style: GraphEdgeStyle): number[] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const arrow = !!edgeArrow[e];\n if (s === t) return loopOf(e);\n // parallel edges: their own offsets (NaN: a single edge)\n const bend = model.bend[e];\n const parallel = Number.isFinite(bend);\n if (layoutType === \"arc\") {\n // higher and lower arcs, by slot from the lower to the higher index\n const rise = parallel ? 1 + 0.25 * (s < t ? bend : -bend) : 1;\n return trimmed(arcPath(X[s], X[t], Y[s], rise), s, t, arrow);\n }\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const bow = parallel ? bend * PARALLEL_BOW : 0;\n if (style === \"straight\") {\n if (!bow) return null;\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * bow, my + dx * bow, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"circular\" && style === \"curve\") {\n const tension = Math.max(\n 0,\n Math.min(1, options.circular?.tension ?? 0.8),\n );\n const cx = ((X[s] + X[t]) / 2) * (1 - tension) - dy * bow;\n const cy = ((Y[s] + Y[t]) / 2) * (1 - tension) + dx * bow;\n return trimmed(\n quadraticPath(X[s], Y[s], cx, cy, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"radial\" && style === \"spline\") {\n const rs = Math.hypot(X[s], Y[s]);\n const rt = Math.hypot(X[t], Y[t]);\n const as = Math.atan2(Y[s], X[s]);\n const at = Math.atan2(Y[t], X[t]);\n const rm = (rs + rt) / 2;\n const out = [X[s], Y[s]];\n cubicPoints(\n out,\n X[s],\n Y[s],\n rs < 1e-6 ? X[s] : rm * Math.cos(as),\n rs < 1e-6 ? Y[s] : rm * Math.sin(as),\n rm * Math.cos(at),\n rm * Math.sin(at),\n X[t],\n Y[t],\n );\n return trimmed(out, s, t, arrow);\n }\n if (style === \"spline\" || style === \"orthogonal\") {\n const f = flow();\n let sign = f.sign;\n if (layoutType === \"mindmap\") sign = X[t] >= X[s] ? 1 : -1;\n const route = dag && !tween ? dag.routes[e] : null;\n let pts: number[];\n if (route && route.length >= 4) pts = route;\n else {\n const along = f.vertical ? Y[t] - Y[s] : X[t] - X[s];\n const dir =\n layoutType === \"mindmap\" ? sign : along * sign >= 0 ? sign : -sign;\n pts = [...port(s, f.vertical, dir), ...port(t, f.vertical, -dir)];\n }\n if (style === \"orthogonal\") {\n if (layoutType === \"org\" && tree?.stacked[t] && tree.parent[t] === s) {\n // compact column: down from the parent, along a bus on the left\n const bottom = Y[s] + sizing.height[s] / 2;\n const left = X[t] - sizing.width[t] / 2;\n const bus = left - 10;\n const mid = bottom + 14;\n return roundCorners(\n [X[s], bottom, X[s], mid, bus, mid, bus, Y[t], left, Y[t]],\n 6,\n );\n }\n if (layoutType === \"org\" && pts.length === 4) {\n const mid = (pts[1] + pts[3]) / 2;\n return roundCorners(\n [pts[0], pts[1], pts[0], mid, pts[2], mid, pts[2], pts[3]],\n 6,\n );\n }\n return orthogonalPath(pts, f.vertical, 8);\n }\n return splinePath(pts, f.vertical);\n }\n // curve\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n const c = parallel ? bow : 0.18;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * c, my + dx * c, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n };\n\n const refreshPaths = () => {\n const style = edgeStyle();\n paths = new Array(model.m);\n for (let e = 0; e < model.m; e++) {\n paths[e] =\n fade(model.source[e]) > 0 && fade(model.target[e]) > 0\n ? edgePath(e, style)\n : null;\n }\n pathsDirty = false;\n geometryVersion++;\n };\n\n /** Ends of a straight edge, trimmed at the node boundaries */\n const straightEnds = (e: number): [number, number, number, number] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const len = Math.hypot(dx, dy);\n if (len < 1e-9) return null;\n const ux = dx / len;\n const uy = dy / len;\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux,\n uy,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ux, uy) +\n (edgeArrow[e] ? 1 : 0);\n if (a + b >= len) return null;\n return [X[s] + ux * a, Y[s] + uy * a, X[t] - ux * b, Y[t] - uy * b];\n };\n\n // ------------------------------------------------------------ highlight\n\n const updateHighlight = () => {\n const sources =\n hover?.type === \"node\"\n ? [hover.index]\n : focusIndex >= 0\n ? [focusIndex]\n : [...selection];\n const mode = highlightMode();\n const edgeHover = hover?.type === \"edge\" ? hover.index : -1;\n const key = `${mode}|${sources.join(\",\")}|${edgeHover}`;\n if (key === highlightKey) return;\n highlightKey = key;\n sceneDirty = true;\n if ((mode === \"none\" || !sources.length) && edgeHover < 0) {\n highlight = null;\n return;\n }\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (mode !== \"none\") {\n for (const s of sources) {\n if (mode === \"lineage\") lineage(model, s, nodes, edges);\n else neighborhood(model, s, nodes, edges);\n }\n }\n if (edgeHover >= 0) {\n edges[edgeHover] = 1;\n nodes[model.source[edgeHover]] = 1;\n nodes[model.target[edgeHover]] = 1;\n }\n const accent =\n mode === \"lineage\" || sources.length !== 1\n ? theme.primary\n : nodeColor[sources[0]];\n highlight = { nodes, edges, accent: accent ?? theme.primary };\n };\n\n // --------------------------------------------------------------- scene\n\n const buildScene = (): RenderItem[] => {\n version++;\n const bg = theme.background;\n const out: RenderItem[] = [];\n const style = edgeStyle();\n const minPx = model.n > 2000 ? 2 : 3;\n const hl = highlight;\n\n // ----- edges: three layers (dimmed, normal, highlighted)\n const layers = [\n new Map<string, { color: Rgba; width: number; buf: PointBuffer }>(),\n new Map(),\n new Map(),\n ] as Map<string, { color: Rgba; width: number; buf: PointBuffer }>[];\n const bucket = (layer: number, color: Rgba, w: number) => {\n const key = `${packColor(color)}|${Math.round(w * 4)}`;\n let b = layers[layer].get(key);\n if (!b) {\n b = { color, width: w, buf: pointBuffer() };\n layers[layer].set(key, b);\n }\n return b.buf;\n };\n const arrowLen = (w: number) => (6 + w * 1.6) / k;\n const filledLen = (w: number) => (8 + w * 2.2) / k;\n const filled = options.arrowStyle === \"filled\";\n // filled heads: flat area triangles per layer and color, outlined by a\n // thin line (anti-aliased edges on every backend)\n const heads = [new Map(), new Map(), new Map()] as Map<\n number,\n { color: Rgba; points: number[] }\n >[];\n const tmp: number[] = [];\n const head = (\n buf: PointBuffer,\n layer: number,\n color: Rgba,\n w: number,\n x: number,\n y: number,\n ux: number,\n uy: number,\n ) => {\n tmp.length = 0;\n if (!filled) {\n arrowHead(tmp, x, y, ux, uy, arrowLen(w), GAP);\n buf.pushAll(tmp);\n return;\n }\n const key = packColor(color);\n let h = heads[layer].get(key);\n if (!h) {\n h = { color, points: [] };\n heads[layer].set(key, h);\n }\n filledArrow(h.points, tmp, x, y, ux, uy, filledLen(w), GAP);\n bucket(layer, color, Math.min(w, 1)).pushAll(tmp);\n };\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n let color = edgeColor[e];\n let w = edgeWidth[e];\n let layer = 1;\n if (critical?.edges[e]) {\n color = criticalColor;\n w += 1;\n }\n if (hl) {\n if (hl.edges[e]) {\n layer = 2;\n if (!critical?.edges[e]) color = mix(bg, hl.accent, 0.9);\n w += 0.75;\n } else {\n layer = 0;\n color = mix(bg, color, 0.22);\n }\n }\n if (f < 1) color = mix(bg, color, f);\n const buf = bucket(layer, color, w);\n let points: number[] | null = paths[e] ?? null;\n if (!points) {\n if (style !== \"straight\" || layoutType === \"arc\") continue;\n const ends = straightEnds(e);\n if (!ends) continue;\n if (!edgeDashed[e] && !(filled && edgeArrow[e])) {\n buf.push(ends[0], ends[1]);\n buf.push(ends[2], ends[3]);\n buf.push(GAP, GAP);\n if (edgeArrow[e]) {\n const l = Math.hypot(ends[2] - ends[0], ends[3] - ends[1]) || 1;\n head(\n buf,\n layer,\n color,\n w,\n ends[2],\n ends[3],\n (ends[2] - ends[0]) / l,\n (ends[3] - ends[1]) / l,\n );\n }\n continue;\n }\n points = [ends[0], ends[1], ends[2], ends[3]];\n }\n if (points.length < 4) continue;\n let line = points;\n // a filled head covers the end: the line stops at its notch\n if (filled && edgeArrow[e])\n line = trimPath(points.slice(), 0, filledLen(w) * 0.72);\n if (edgeDashed[e]) buf.pushAll(dashPath(line, 5 / k, 4 / k, GAP));\n else {\n buf.pushAll(line);\n buf.push(GAP, GAP);\n }\n if (edgeArrow[e]) {\n const [ux, uy] = endDirection(points);\n head(\n buf,\n layer,\n color,\n w,\n points[points.length - 2],\n points[points.length - 1],\n ux,\n uy,\n );\n }\n }\n layers.forEach((map, layer) => {\n for (const [key, b] of map) {\n if (b.buf.count() < 2) continue;\n const item: LineItem = {\n kind: \"line\",\n key: `edges:${layer}:${key}`,\n version,\n color: b.color,\n points: b.buf.points(),\n count: b.buf.count(),\n width: b.width,\n sorted: false,\n };\n out.push(item);\n }\n for (const [key, h] of heads[layer]) {\n const item: AreaItem = {\n kind: \"area\",\n key: `heads:${layer}:${key}`,\n version,\n color: h.color,\n points: Float32Array.from(h.points),\n count: h.points.length / AREA_STRIDE,\n opacity: 1,\n sorted: false,\n flat: true,\n };\n out.push(item);\n }\n });\n\n // ----- nodes\n const nodeFill = (i: number, f: number): Rgba => {\n let c = nodeColor[i];\n if (hl && !hl.nodes[i]) c = mix(bg, c, 0.2);\n return f < 1 ? mix(bg, c, f) : c;\n };\n const halo: number[] = [];\n const fills: number[] = [];\n const rings: number[] = [];\n const collapsedFill: number[] = [];\n const selRings: number[] = [];\n const avatars: number[] = [];\n const boxBuckets = new Map<\n string,\n { half: number; inset: number; border: number[]; fill: number[] }\n >();\n const outlines = new Map<string, number[]>();\n const radiusPx =\n layoutType === \"mindmap\"\n ? 999\n : Math.max(\n 1,\n Math.min(\n layoutType === \"org\" ? 10 : 8,\n (layoutType === \"org\" ? 10 : 7) * k,\n ),\n );\n const showHalo = model.n <= HALO_LIMIT;\n for (const i of drawOrder()) {\n const f = fade(i);\n if (f <= 0) continue;\n const x = X[i];\n const y = Y[i];\n const color = nodeFill(i, f);\n const selected = selection.has(i);\n const hovered = hover?.type === \"node\" && hover.index === i;\n if (sizing.kind[i] === NodeKind.Circle) {\n const d = Math.max(minPx, sizing.width[i] * k);\n if (showHalo) halo.push(x, y, d + 3, packColor(bg));\n const isCollapsed =\n collapsible() && tree && descendants[i] > 0 && !hasVisibleChild(i);\n if (isCollapsed) {\n collapsedFill.push(x, y, d, packColor(color));\n } else fills.push(x, y, d, packColor(color));\n if (selected) selRings.push(x, y, d + 7, packColor(theme.primary));\n else if (hovered)\n rings.push(x, y, d + 6, packColor(mix(bg, nodeColor[i], 0.7)));\n continue;\n }\n // boxes\n const w = sizing.width[i];\n const h = sizing.height[i];\n const solid = sizing.kind[i] === NodeKind.Solid;\n const crit = !!critical?.nodes[i];\n let border = solid ? color : mix(bg, color, crit ? 1 : dark ? 0.62 : 0.5);\n let body = solid ? color : mix(bg, color, dark ? 0.2 : 0.09);\n if (crit) border = mix(bg, criticalColor, f);\n if (hl && !hl.nodes[i]) {\n body = mix(bg, body, 0.5);\n if (!solid) border = mix(bg, border, 0.4);\n }\n const key = `${Math.round(w * 2) / 2}|${crit ? 2 : 1.25}`;\n let b = boxBuckets.get(key);\n if (!b) {\n b = { half: w / 2, inset: crit ? 2 : 1.25, border: [], fill: [] };\n boxBuckets.set(key, b);\n }\n b.border.push(x, y - h / 2, y + h / 2, packColor(border));\n b.fill.push(x, y - h / 2, y + h / 2, packColor(body));\n if (selected || hovered) {\n const pad = (selected ? 3 : 2.5) / k;\n const okey = `${Math.round((w / 2 + pad) * 64)}`;\n let list = outlines.get(okey);\n if (!list) outlines.set(okey, (list = []));\n list.push(\n w / 2 + pad,\n x,\n y - h / 2 - pad,\n y + h / 2 + pad,\n packColor(selected ? theme.primary : mix(bg, nodeColor[i], 0.55)),\n );\n }\n if (sizing.kind[i] === NodeKind.Card && w * k >= 96) {\n avatars.push(\n x - w / 2 + 26,\n y,\n Math.min(32, h - 16) * k,\n packColor(color),\n );\n }\n }\n const scatter = (\n key: string,\n data: number[],\n opacity: number,\n stroke: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: ScatterItem = {\n kind: \"scatter\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n opacity,\n stroke,\n };\n out.push(item);\n };\n const bars = (\n key: string,\n data: number[],\n half: number,\n inset: number,\n radius: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * BAR_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: BarItem = {\n kind: \"bar\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n halfWidth: half,\n radius,\n inset,\n minHalf: 0,\n sorted: false,\n };\n out.push(item);\n };\n scatter(\"halo\", halo, 1, 0);\n scatter(\"nodes\", fills, 1, 0);\n scatter(\"collapsed\", collapsedFill, 0.28, 2);\n scatter(\"hover-rings\", rings, 0, 2);\n scatter(\"selection\", selRings, 0, 2.25);\n for (const [key, list] of outlines) {\n const data: number[] = [];\n for (let j = 0; j < list.length; j += 5)\n data.push(list[j + 1], list[j + 2], list[j + 3], list[j + 4]);\n bars(\n `outline:${key}`,\n data,\n list[0],\n 0,\n radiusPx === 999 ? 999 : radiusPx + 3,\n );\n }\n for (const [key, b] of boxBuckets) {\n bars(`border:${key}`, b.border, b.half, 0, radiusPx);\n bars(\n `fill:${key}`,\n b.fill,\n b.half,\n b.inset,\n radiusPx === 999 ? 999 : Math.max(0, radiusPx - 1),\n );\n }\n scatter(\"avatars\", avatars, 1, 0);\n return out;\n };\n\n /** Hovered / selected nodes last (on top) */\n const drawOrder = (): number[] => {\n const order: number[] = [];\n const late: number[] = [];\n for (let i = 0; i < model.n; i++) {\n if (\n selection.has(i) ||\n (hover?.type === \"node\" && hover.index === i) ||\n i === focusIndex\n )\n late.push(i);\n else order.push(i);\n }\n return order.concat(late);\n };\n\n const hasVisibleChild = (i: number) =>\n !!tree && tree.children[i].some((c) => visible[c]);\n\n // -------------------------------------------------------------- frame\n\n function invalidate() {\n if (destroyed || frameId || !win) return;\n frameId = win.requestAnimationFrame(frame);\n }\n\n const transform = () => ({\n xScale: (2 * k) / width,\n xOffset: (2 * tx) / width - 1,\n yScale: (-2 * k) / height,\n yOffset: 1 - (2 * ty) / height,\n });\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const w = stage.clientWidth;\n const h = stage.clientHeight;\n if (w <= 0 || h <= 0) return;\n if (w !== width || h !== height) {\n width = w;\n height = h;\n if (!userMoved) needsFit = true;\n sceneDirty = true;\n }\n const dpr = win?.devicePixelRatio || 1;\n let animating = false;\n\n let follow = false;\n if (runner?.running()) {\n runner.step(8);\n pathsDirty = true;\n animating = runner.running() && !runner.threaded();\n follow = runner.running() && followLayout && !userMoved && !forcePending;\n }\n if (tween) {\n const t = Math.min(\n 1,\n (now() - tween.start) / Math.max(1, tween.duration),\n );\n tweenT = ease(t);\n for (let i = 0; i < model.n; i++) {\n X[i] = FX[i] + (TX[i] - FX[i]) * tweenT;\n Y[i] = FY[i] + (TY[i] - FY[i]) * tweenT;\n }\n if (t >= 1) {\n tween = null;\n prevVisible = null;\n tweenT = 1;\n }\n pathsDirty = true;\n animating = true;\n }\n if (needsFit) {\n needsFit = false;\n const target = fitView();\n if (target && fitAnimate && drawnOnce && !reducedMotion?.matches) {\n viewTween = { from: [k, tx, ty], to: target, start: now() };\n } else if (target) [k, tx, ty] = target;\n fitAnimate = false;\n sceneDirty = true;\n } else if (follow) {\n // glide toward the fit of the expanding layout (the final fit animates\n // once it has settled)\n const target = fitView();\n if (target) {\n viewTween = null;\n if (!drawnOnce || reducedMotion?.matches) [k, tx, ty] = target;\n else if (approachView(target, 0.25)) animating = true;\n sceneDirty = true;\n }\n }\n if (viewTween) {\n const t = Math.min(1, (now() - viewTween.start) / VIEW_TWEEN_MS);\n const e = ease(t);\n const [k0, x0, y0] = viewTween.from;\n const [k1, x1, y1] = viewTween.to;\n const kk = k0 * Math.pow(k1 / k0, e);\n // keep the zoom geometric and the screen center consistent\n const c0x = (width / 2 - x0) / k0;\n const c0y = (height / 2 - y0) / k0;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const cx = c0x + (c1x - c0x) * e;\n const cy = c0y + (c1y - c0y) * e;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n if (t >= 1) {\n [k, tx, ty] = viewTween.to;\n viewTween = null;\n }\n sceneDirty = true;\n animating = true;\n }\n if (pathsDirty) {\n refreshPaths();\n sceneDirty = true;\n }\n updateHighlight();\n if (renderer) {\n if (sceneDirty) {\n items = forcePending ? [] : buildScene();\n sceneDirty = false;\n }\n const bw = Math.max(1, Math.round(w * dpr));\n const bh = Math.max(1, Math.round(h * dpr));\n if (renderer.canvas.width !== bw || renderer.canvas.height !== bh)\n renderer.resize(bw, bh);\n renderer.canvas.style.width = `${w}px`;\n renderer.canvas.style.height = `${h}px`;\n renderer.render(items, {\n transform: transform(),\n width: bw,\n height: bh,\n dpr,\n });\n drawnOnce = true;\n }\n sizeCanvas(dom.foreground, w, h, dpr);\n drawOverlay(dpr);\n if (hover) positionTooltip();\n if (animating) invalidate();\n }\n\n // ------------------------------------------------------------ overlay\n\n const screenX = (i: number) => X[i] * k + tx;\n const screenY = (i: number) => Y[i] * k + ty;\n\n const ellipsize = (\n ctx: CanvasRenderingContext2D,\n text: string,\n max: number,\n ) => {\n if (max <= 8) return \"\";\n if (ctx.measureText(text).width <= max) return text;\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (ctx.measureText(`${text.slice(0, mid)}…`).width <= max) lo = mid;\n else hi = mid - 1;\n }\n return lo ? `${text.slice(0, lo)}…` : \"\";\n };\n\n const textColorOn = (c: Rgba): string =>\n luminance(c) > 0.6 ? \"#111827\" : \"#ffffff\";\n\n const drawOverlay = (dpr: number) => {\n const ctx = dom.foreground.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (forcePending || !model.n) return;\n const family = theme.fontFamily;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const hl = highlight;\n const cell = 8;\n const cols = Math.ceil(width / cell) + 1;\n const rows = Math.ceil(height / cell) + 1;\n const grid = new Uint8Array(cols * rows);\n const free = (\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n mark: boolean,\n ) => {\n const c0 = Math.max(0, Math.floor(x0 / cell));\n const c1 = Math.min(cols - 1, Math.floor(x1 / cell));\n const r0 = Math.max(0, Math.floor(y0 / cell));\n const r1 = Math.min(rows - 1, Math.floor(y1 / cell));\n if (c0 > c1 || r0 > r1) return false;\n if (!mark) {\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) if (grid[r * cols + c]) return false;\n return true;\n }\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) grid[r * cols + c] = 1;\n return true;\n };\n const onScreen = (sx: number, sy: number, margin: number) =>\n sx > -margin &&\n sy > -margin &&\n sx < width + margin &&\n sy < height + margin;\n\n // ----- text inside boxes: a readable minimum size, shortened with an\n // ellipsis; hidden only when the box cannot hold any text\n const showBoxText = options.nodeLabels !== false;\n for (let i = 0; i < model.n; i++) {\n if (sizing.kind[i] === NodeKind.Circle) continue;\n const f = fade(i);\n if (f <= 0) continue;\n const sx = screenX(i);\n const sy = screenY(i);\n const bw = sizing.width[i] * k;\n const bh = sizing.height[i] * k;\n if (!onScreen(sx, sy, Math.max(bw, bh))) continue;\n free(sx - bw / 2, sy - bh / 2, sx + bw / 2, sy + bh / 2, true);\n const natural = sizing.font[i] * k;\n const size = Math.max(BOX_FONT_MIN, natural);\n const node = model.nodes[i];\n const dim = hl && !hl.nodes[i];\n ctx.globalAlpha = f * (dim ? 0.45 : 1);\n const solid = sizing.kind[i] === NodeKind.Solid;\n const card = sizing.kind[i] === NodeKind.Card;\n const avatar = card && bw >= 96;\n if (showBoxText && bh >= size + 1) {\n const left = avatar ? sx - bw / 2 + 48 * k : sx;\n const maxWidth = avatar ? bw - 56 * k : bw - Math.max(4, 12 * k);\n ctx.textAlign = avatar ? \"left\" : \"center\";\n ctx.textBaseline = \"middle\";\n // the subtitle needs room for both lines\n const subSize = Math.max(BOX_FONT_MIN - 0.5, natural * 0.88);\n const gap = Math.max(2, natural * 0.6);\n const block = size + gap + subSize;\n const subtitle = node.subtitle && block <= bh - 4 ? node.subtitle : \"\";\n const titleY = subtitle ? sy - block / 2 + size / 2 : sy;\n ctx.font = `${sizing.weight[i]} ${size}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : text;\n const label = ellipsize(ctx, labelOf(model, i), maxWidth);\n if (label) ctx.fillText(label, left, titleY);\n if (subtitle && label) {\n ctx.font = `${subSize}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : muted;\n const sub = ellipsize(ctx, subtitle, maxWidth);\n if (sub) ctx.fillText(sub, left, sy + block / 2 - subSize / 2);\n }\n }\n if (avatar) {\n const initial = Array.from(labelOf(model, i).trim())[0] ?? \"\";\n ctx.textAlign = \"center\";\n ctx.font = `600 ${Math.max(8, 13 * k)}px ${family}`;\n ctx.fillStyle = textColorOn(nodeColor[i]);\n ctx.fillText(initial.toUpperCase(), sx - bw / 2 + 26 * k, sy);\n }\n // collapse badge of boxes\n if (collapsible() && tree && tree.children[i].length) {\n const collapsed = !hasVisibleChild(i);\n const active =\n (hover?.type === \"node\" && hover.index === i) || focusIndex === i;\n if (collapsed || active) {\n const vertical = layoutType === \"org\";\n const out =\n layoutType === \"mindmap\" ? (tree.side[i] < 0 ? -1 : 1) : 1;\n const bx = vertical ? sx : sx + out * (bw / 2 + 9);\n const by = vertical ? sy + bh / 2 + 9 : sy;\n const label2 = collapsed ? String(descendants[i]) : \"−\";\n ctx.font = `600 10px ${family}`;\n const r = Math.max(8, ctx.measureText(label2).width / 2 + 5);\n ctx.globalAlpha = f;\n ctx.beginPath();\n ctx.fillStyle = bgCss;\n ctx.strokeStyle = toCss(mix(theme.background, nodeColor[i], 0.75));\n ctx.lineWidth = 1.25;\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(bx - r, by - 8, r * 2, 16, 8);\n else ctx.rect(bx - r, by - 8, r * 2, 16);\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = text;\n ctx.textAlign = \"center\";\n ctx.fillText(label2, bx, by + 0.5);\n }\n }\n }\n ctx.globalAlpha = 1;\n\n // ----- labels of circles\n const mode = options.nodeLabels ?? \"auto\";\n const priority = (i: number) =>\n selection.has(i) ||\n i === focusIndex ||\n (hover?.type === \"node\" && hover.index === i) ||\n (!!hl && !!hl.nodes[i]);\n const drawn = new Uint8Array(model.n);\n let budget = 700;\n const drawLabel = (i: number, force: boolean) => {\n if (drawn[i] || sizing.kind[i] !== NodeKind.Circle || mode === false)\n return;\n const f = fade(i);\n if (f <= 0) return;\n const sx = screenX(i);\n const sy = screenY(i);\n if (!onScreen(sx, sy, 160)) return;\n const r = Math.max(model.n > 2000 ? 1 : 1.5, (sizing.width[i] * k) / 2);\n // tiny nodes of networks lose their label first (other layouts rely on the collisions)\n const network = layoutType === \"force\" || layoutType === \"none\";\n if (!force && mode === \"auto\" && network && r * 2 < 5) return;\n const strong = priority(i);\n const dim = hl && !hl.nodes[i];\n const raw = labelOf(model, i);\n const tw = Math.min(180, sizing.labelWidth[i] * (strong ? 1.06 : 1));\n const place = placement(i, sx, sy, r);\n // collision box: the whole label, or its start for rotated labels\n let bx0: number;\n let by0: number;\n let bx1: number;\n let by1: number;\n if (place.angle !== 0) {\n const cx =\n place.x + Math.cos(place.angle) * (place.align === \"left\" ? 7 : -7);\n const cy =\n place.y + Math.sin(place.angle) * (place.align === \"left\" ? 7 : -7);\n bx0 = cx - 6;\n bx1 = cx + 6;\n by0 = cy - 6;\n by1 = cy + 6;\n } else {\n bx0 =\n place.align === \"left\"\n ? place.x\n : place.align === \"right\"\n ? place.x - tw\n : place.x - tw / 2;\n bx1 = bx0 + tw;\n by0 =\n place.baseline === \"top\"\n ? place.y\n : place.baseline === \"bottom\"\n ? place.y - 14\n : place.y - 7;\n by1 = by0 + 14;\n }\n if (!force && !free(bx0 - 2, by0, bx1 + 2, by1, false)) return;\n free(bx0 - 2, by0, bx1 + 2, by1, true);\n drawn[i] = 1;\n budget--;\n ctx.save();\n ctx.globalAlpha = f * (dim ? 0.35 : 1);\n ctx.font = `${strong ? 600 : 400} ${LABEL_FONT_SIZE}px ${family}`;\n ctx.textAlign = place.align;\n ctx.textBaseline = place.baseline;\n ctx.translate(place.x, place.y);\n if (place.angle) ctx.rotate(place.angle);\n const label = sizing.labelWidth[i] > 180 ? ellipsize(ctx, raw, 180) : raw;\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3;\n ctx.strokeStyle = bgCss;\n ctx.strokeText(label, 0, 0);\n ctx.fillStyle = strong ? text : dim ? muted : text;\n ctx.fillText(label, 0, 0);\n ctx.restore();\n };\n for (let i = 0; i < model.n; i++) if (priority(i)) drawLabel(i, true);\n\n // ----- edge labels\n const edgeMode = options.edgeLabels ?? \"auto\";\n if (edgeMode !== false) {\n ctx.font = `11px ${family}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n let shownEdges = 0;\n for (let e = 0; e < model.m && shownEdges < 400; e++) {\n const label = model.edges[e].label;\n if (!label) continue;\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n const lit = !!hl?.edges[e];\n if (edgeMode === \"hover\" && !lit) continue;\n if (edgeMode === \"auto\" && !lit && (k < 0.75 || (hl && !lit))) continue;\n let mx: number;\n let my: number;\n const path = paths[e];\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0] * k + tx;\n my = p[1] * k + ty;\n if (s === t) {\n // beyond the far end of a loop (the pill would hide it)\n const dx = mx - (X[s] * k + tx);\n const dy = my - (Y[s] * k + ty);\n const l = Math.hypot(dx, dy) || 1;\n mx += (dx / l) * 10;\n my += (dy / l) * 10;\n }\n } else {\n mx = ((X[s] + X[t]) / 2) * k + tx;\n my = ((Y[s] + Y[t]) / 2) * k + ty;\n }\n if (!onScreen(mx, my, 40)) continue;\n if (Number.isNaN(edgeLabelWidth[e]))\n edgeLabelWidth[e] = ctx.measureText(label).width;\n const lw = edgeLabelWidth[e] + 10;\n if (!lit && !free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, false))\n continue;\n free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, true);\n shownEdges++;\n ctx.globalAlpha = f;\n ctx.fillStyle = bgCss;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(mx - lw / 2, my - 8, lw, 16, 8);\n else ctx.rect(mx - lw / 2, my - 8, lw, 16);\n ctx.fill();\n if (lit) {\n ctx.strokeStyle = toCss(\n mix(theme.background, highlight?.accent ?? theme.primary, 0.6),\n );\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n ctx.fillStyle = lit ? text : muted;\n ctx.fillText(label, mx, my + 0.5);\n }\n ctx.globalAlpha = 1;\n }\n\n // ----- other labels, most important first\n if (mode !== false) {\n const all = mode === true;\n for (let r = 0; r < model.rank.length && budget > 0; r++) {\n const i = model.rank[r];\n drawLabel(i, false);\n if (!all && r > 4000) break;\n }\n }\n\n // ----- keyboard focus ring\n if (focusVisible && focusIndex >= 0 && fade(focusIndex) > 0) {\n const sx = screenX(focusIndex);\n const sy = screenY(focusIndex);\n ctx.save();\n ctx.strokeStyle = toCss(theme.primary);\n ctx.lineWidth = 2;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (sizing.kind[focusIndex] === NodeKind.Circle) {\n const r = Math.max(3, (sizing.width[focusIndex] * k) / 2) + 6;\n ctx.arc(sx, sy, r, 0, Math.PI * 2);\n } else {\n const bw = sizing.width[focusIndex] * k + 10;\n const bh = sizing.height[focusIndex] * k + 10;\n ctx.rect(sx - bw / 2, sy - bh / 2, bw, bh);\n }\n ctx.stroke();\n ctx.restore();\n }\n };\n\n /** Where the label of a circle goes */\n const placement = (\n i: number,\n sx: number,\n sy: number,\n r: number,\n ): {\n x: number;\n y: number;\n align: CanvasTextAlign;\n baseline: CanvasTextBaseline;\n angle: number;\n } => {\n const below = {\n x: sx,\n y: sy + r + 3,\n align: \"center\" as const,\n baseline: \"top\" as const,\n angle: 0,\n };\n const radial = (a: number) => {\n const flip = Math.cos(a) < 0;\n return {\n x: sx + Math.cos(a) * (r + 4),\n y: sy + Math.sin(a) * (r + 4),\n align: (flip ? \"right\" : \"left\") as CanvasTextAlign,\n baseline: \"middle\" as const,\n angle: flip ? a + Math.PI : a,\n };\n };\n switch (layoutType) {\n case \"tree\": {\n const inner = hasVisibleChild(i);\n if (direction === \"LR\" || direction === \"RL\") {\n const right = (direction === \"LR\") !== inner;\n return {\n x: sx + (right ? r + 5 : -r - 5),\n y: sy,\n align: right ? \"left\" : \"right\",\n baseline: \"middle\",\n angle: 0,\n };\n }\n if (direction === \"BT\")\n return {\n x: sx,\n y: sy - r - 3,\n align: \"center\",\n baseline: \"bottom\",\n angle: 0,\n };\n return below;\n }\n case \"radial\":\n // inner nodes: horizontal label below (their children fan out around them)\n if (\n tree &&\n (hasVisibleChild(i) ||\n (tree.depth[i] === 0 && Math.hypot(X[i], Y[i]) < 1e-6))\n )\n return below;\n return radial(tree ? tree.side[i] : 0);\n case \"circular\":\n return radial(circ ? circ.angle[i] : 0);\n case \"arc\":\n return {\n x: sx,\n y: sy + r + 4,\n align: \"left\",\n baseline: \"middle\",\n angle: Math.PI / 2,\n };\n default:\n return below;\n }\n };\n\n // ----------------------------------------------------------------- fit\n\n const fitView = (): [number, number, number] | null => {\n if (width <= 0 || height <= 0) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let maxLabel = 0;\n for (let i = 0; i < model.n; i++) {\n if (!visible[i] || !Number.isFinite(TX[i])) continue;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) continue;\n const hw = sizing.width[i] / 2;\n const hh = sizing.height[i] / 2;\n x0 = Math.min(x0, TX[i] - hw);\n x1 = Math.max(x1, TX[i] + hw);\n y0 = Math.min(y0, TY[i] - hh);\n y1 = Math.max(y1, TY[i] + hh);\n if (sizing.kind[i] === NodeKind.Circle)\n maxLabel = Math.max(maxLabel, sizing.labelWidth[i]);\n }\n if (!(x0 <= x1)) return null;\n // arcs rise above the line by half their span\n if (layoutType === \"arc\") {\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n if (!visible[s] || !visible[t]) continue;\n const b = model.bend[e];\n const rise = s !== t && Number.isFinite(b) ? 1 + 0.25 * Math.abs(b) : 1;\n y0 = Math.min(y0, TY[s] - (Math.abs(TX[t] - TX[s]) / 2) * rise);\n }\n }\n // self-loops stick out of their node\n if (model.hasLoops) {\n for (let e = 0; e < model.m; e++) {\n const i = model.source[e];\n if (i !== model.target[e] || !visible[i]) continue;\n const a = loopAngle(i);\n const size = loopSize(i);\n const reach =\n Math.max(sizing.width[i], sizing.height[i]) / 2 +\n size * (1 + 0.6 * model.bend[e]);\n const lx = TX[i] + Math.cos(a) * reach;\n const ly = TY[i] + Math.sin(a) * reach;\n x0 = Math.min(x0, lx - size / 2);\n x1 = Math.max(x1, lx + size / 2);\n y0 = Math.min(y0, ly - size / 2);\n y1 = Math.max(y1, ly + size / 2);\n }\n }\n const pad = options.fitPadding ?? 24;\n let [pl, pr, pt, pb] = [pad, pad, pad, pad];\n const label =\n options.nodeLabels === false ? 0 : Math.min(140, maxLabel) + 8;\n const circles = sizing.kind.some((c) => c === NodeKind.Circle);\n if (circles && label > 8) {\n if (layoutType === \"tree\" && (direction === \"LR\" || direction === \"RL\")) {\n // leaves are labeled outside, inner nodes (the roots first) inside\n let inner = 0;\n for (let i = 0; i < model.n; i++) {\n if (tree && tree.parent[i] < 0 && visible[i] && hasVisibleChild(i))\n inner = Math.max(inner, Math.min(140, sizing.labelWidth[i]) + 8);\n }\n if (direction === \"LR\") {\n pr += label;\n pl += inner;\n } else {\n pl += label;\n pr += inner;\n }\n } else if (layoutType === \"radial\" || layoutType === \"circular\") {\n pl += label;\n pr += label;\n pt += label * 0.6;\n pb += label * 0.6;\n } else if (layoutType === \"arc\") pb += label;\n else pb += 16;\n }\n if (layoutType === \"org\" || layoutType === \"mindmap\") pb += 10;\n const aw = Math.max(10, width - pl - pr);\n const ah = Math.max(10, height - pt - pb);\n const bw = Math.max(1e-6, x1 - x0);\n const bh = Math.max(1e-6, y1 - y0);\n const range = interaction()?.zoomRange ?? [0.02, 8];\n let kk = Math.min(aw / bw, ah / bh, 1.6, range[1]);\n kk = Math.max(kk, 1e-4);\n const ox = pl + (aw - bw * kk) / 2 - x0 * kk;\n const oy = pt + (ah - bh * kk) / 2 - y0 * kk;\n return [kk, ox, oy];\n };\n\n const zoomLimits = (): [number, number] => {\n const range = interaction()?.zoomRange ?? [0.02, 8];\n const fit = fitView();\n return [Math.min(range[0], fit ? fit[0] * 0.5 : range[0]), range[1]];\n };\n\n /**\n * Moves the view a `rate` of the way to `to` (geometric zoom, consistent\n * center); `true` while it has not arrived yet\n */\n const approachView = (to: [number, number, number], rate: number) => {\n const [k1, x1, y1] = to;\n const c0x = (width / 2 - tx) / k;\n const c0y = (height / 2 - ty) / k;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const far =\n Math.abs(Math.log(k1 / k)) > 0.002 ||\n Math.hypot(c1x - c0x, c1y - c0y) * k1 > 0.5;\n if (!far) {\n [k, tx, ty] = to;\n return false;\n }\n const kk = k * Math.pow(k1 / k, rate);\n const cx = c0x + (c1x - c0x) * rate;\n const cy = c0y + (c1y - c0y) * rate;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n return true;\n };\n\n const setView = (next: [number, number, number], animate: boolean) => {\n viewTween = null;\n if (animate && !reducedMotion?.matches && width > 0) {\n viewTween = { from: [k, tx, ty], to: next, start: now() };\n } else {\n [k, tx, ty] = next;\n }\n sceneDirty = true;\n invalidate();\n };\n\n const zoomAround = (\n factor: number,\n cx: number,\n cy: number,\n animate = false,\n ) => {\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, k * factor));\n const ratio = nk / k;\n setView([nk, cx - (cx - tx) * ratio, cy - (cy - ty) * ratio], animate);\n userMoved = true;\n };\n\n // ------------------------------------------------------------- legend\n\n let legendKey = \"\";\n const renderLegend = () => {\n const o = options.legend;\n const named = model.groups.filter((g) => g.count > 0);\n const show = o === undefined ? named.length > 1 : !!o && named.length > 0;\n const config = typeof o === \"object\" ? o : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n let key = `${show}|${bottom}|${toggle}`;\n if (show) {\n for (const g of named) {\n const i = model.groups.indexOf(g);\n key += `\\n${g.id}\\u0001${g.name}\\u0001${toCss(groupColor[i] ?? theme.primary)}\\u0001${hiddenGroups.has(g.id)}`;\n }\n }\n if (key === legendKey) return;\n legendKey = key;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n for (const g of named) {\n const i = model.groups.indexOf(g);\n const hidden = hiddenGroups.has(g.id);\n const item = doc.createElement(toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!hidden));\n item.addEventListener(\"click\", () => toggleGroup(g.id));\n }\n style(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: hidden ? \"0.45\" : \"1\",\n textDecoration: hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(doc, toCss(groupColor[i] ?? theme.primary)),\n doc.createTextNode(g.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const toggleGroup = (id: string) => {\n const g = model.groups.find((group) => group.id === id);\n if (!g) return;\n const hidden = !hiddenGroups.has(id);\n if (hidden) hiddenGroups.add(id);\n else hiddenGroups.delete(id);\n dom.live.textContent = fill(hidden ? loc.labels.hidden : loc.labels.shown, {\n name: g.name,\n });\n // hidden nodes leave the selection and the focus\n for (const i of [...selection])\n if (\n fade(i) <= 0 &&\n model.groupOf[i] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[i]].id)\n )\n selection.delete(i);\n if (\n focusIndex >= 0 &&\n model.groupOf[focusIndex] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[focusIndex]].id)\n )\n focusIndex = -1;\n if (hover) setHover(null);\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n renderLegend();\n invalidate();\n emit(\"groupToggle\", { group: id, hidden });\n };\n\n // ------------------------------------------------------ accessibility\n\n const updateAccessibility = () => {\n const { labels, count } = loc;\n const role =\n layoutType === \"dag\" ? labels.dag : isTree() ? labels.tree : labels.chart;\n stage.setAttribute(\"aria-roledescription\", role);\n stage.setAttribute(\"aria-label\", options.ariaLabel ?? role);\n const keyboard = interaction()?.keyboard;\n if (keyboard) stage.tabIndex = 0;\n else stage.removeAttribute(\"tabindex\");\n const ia = interaction();\n stage.style.cursor = ia?.pan ? \"grab\" : \"default\";\n const lines = [\n fill(labels.summary, { nodes: count(model.n), edges: count(model.m) }),\n ];\n const names = model.groups.filter((g) => g.count > 0).map((g) => g.name);\n if (names.length)\n lines.push(\n fill(labels.groupsSummary, {\n groups: names.join(labels.listSeparator),\n }),\n );\n if (keyboard) lines.push(labels.keyboardHelp);\n dom.summary.textContent = lines.join(\" \");\n const controls = options.controls !== false && !!ia?.zoom;\n dom.controls.style.display = controls ? \"flex\" : \"none\";\n dom.zoomIn.setAttribute(\"aria-label\", labels.zoomIn);\n dom.zoomIn.title = labels.zoomIn;\n dom.zoomOut.setAttribute(\"aria-label\", labels.zoomOut);\n dom.zoomOut.title = labels.zoomOut;\n dom.fit.setAttribute(\"aria-label\", labels.fit);\n dom.fit.title = labels.fit;\n };\n\n // ------------------------------------------------------------- picking\n\n let pickGrid: Map<number, number[]> | null = null;\n let pickCell = 32;\n let maxExtent = 0;\n const pickKey = (cx: number, cy: number) =>\n (cx + 2097152) * 4194304 + (cy + 2097152);\n\n const buildPickGrid = () => {\n maxExtent = 0;\n for (let i = 0; i < model.n; i++)\n maxExtent = Math.max(maxExtent, sizing.width[i], sizing.height[i]);\n pickCell = Math.max(16, maxExtent);\n const grid = new Map<number, number[]>();\n for (let i = 0; i < model.n; i++) {\n if (fade(i) <= 0) continue;\n const key = pickKey(\n Math.floor(X[i] / pickCell),\n Math.floor(Y[i] / pickCell),\n );\n let list = grid.get(key);\n if (!list) grid.set(key, (list = []));\n list.push(i);\n }\n pickGrid = grid;\n };\n\n const pickNode = (px: number, py: number): number => {\n if (forcePending || !model.n) return -1;\n buildPickGrid();\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 3 / k;\n const minR = (model.n > 2000 ? 1 : 1.5) / k;\n const reach = Math.ceil((maxExtent / 2 + tol + minR) / pickCell);\n const cx = Math.floor(wx / pickCell);\n const cy = Math.floor(wy / pickCell);\n let best = -1;\n let bestD = Infinity;\n for (let oy = -reach; oy <= reach; oy++) {\n for (let ox = -reach; ox <= reach; ox++) {\n const list = pickGrid!.get(pickKey(cx + ox, cy + oy));\n if (!list) continue;\n for (const i of list) {\n const dx = wx - X[i];\n const dy = wy - Y[i];\n if (sizing.kind[i] === NodeKind.Circle) {\n const r = Math.max(sizing.width[i] / 2, minR) + tol;\n const d = dx * dx + dy * dy;\n if (d <= r * r && d <= bestD) {\n best = i;\n bestD = d;\n }\n } else if (\n Math.abs(dx) <= sizing.width[i] / 2 + tol &&\n Math.abs(dy) <= sizing.height[i] / 2 + tol\n ) {\n const d = dx * dx + dy * dy;\n if (d <= bestD) {\n best = i;\n bestD = d;\n }\n }\n }\n }\n }\n return best;\n };\n\n const pickEdge = (px: number, py: number): number => {\n if (forcePending) return -1;\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 4 / k;\n let best = -1;\n let bestD = tol * tol;\n const test = (e: number) => {\n if (Math.min(fade(model.source[e]), fade(model.target[e])) <= 0) return;\n let points: readonly number[] | null = paths[e] ?? null;\n if (!points) {\n const ends = straightEnds(e);\n if (!ends) return;\n points = ends;\n }\n const d = distanceToPath(points, wx, wy);\n if (d <= bestD) {\n best = e;\n bestD = d;\n }\n };\n if (model.m < EDGE_INDEX_MIN) {\n for (let e = 0; e < model.m; e++) test(e);\n return best;\n }\n const index = edgeIndex();\n if (!index) return -1;\n // candidates from the buckets around the pointer, exact distances\n const { cell, x0, y0, cols, rows, start, items, stamp } = index;\n const c0 = Math.max(0, Math.floor((wx - tol - x0) / cell));\n const c1 = Math.min(cols - 1, Math.floor((wx + tol - x0) / cell));\n const r0 = Math.max(0, Math.floor((wy - tol - y0) / cell));\n const r1 = Math.min(rows - 1, Math.floor((wy + tol - y0) / cell));\n const visit = ++index.visit;\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const b = r * cols + c;\n for (let q = start[b]; q < start[b + 1]; q++) {\n const e = items[q];\n if (stamp[e] === visit) continue;\n stamp[e] = visit;\n test(e);\n }\n }\n }\n return best;\n };\n\n // ---- spatial index of the edges (large graphs): every segment is\n // registered in the grid cells it crosses (CSR typed arrays)\n interface EdgeIndex {\n cell: number;\n x0: number;\n y0: number;\n cols: number;\n rows: number;\n start: Int32Array;\n items: Int32Array;\n stamp: Int32Array;\n visit: number;\n geometry: number;\n built: number;\n }\n let edgeGrid: EdgeIndex | null = null;\n\n const edgeIndex = (): EdgeIndex | null => {\n const current = edgeGrid;\n if (current && current.geometry === geometryVersion) return current;\n // a layout still moving: the last index stays good enough for the\n // candidates for a moment (the distances are always exact)\n if (current && runner?.running() && now() - current.built < 250)\n return current;\n const m = model.m;\n const segment = (e: number): readonly number[] | null =>\n Math.min(fade(model.source[e]), fade(model.target[e])) <= 0\n ? null\n : (paths[e] ?? straightEnds(e));\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let length = 0;\n let segments = 0;\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 0; i < p.length; i += 2) {\n x0 = Math.min(x0, p[i]);\n x1 = Math.max(x1, p[i]);\n y0 = Math.min(y0, p[i + 1]);\n y1 = Math.max(y1, p[i + 1]);\n if (i) length += Math.hypot(p[i] - p[i - 2], p[i + 1] - p[i - 1]);\n }\n segments += p.length / 2 - 1;\n }\n if (!(x0 <= x1 && y0 <= y1)) return null;\n // about two cells per segment on average, at most 512 x 512 cells\n const span = Math.max(x1 - x0, y1 - y0, 1e-6);\n const cell = Math.max(\n span / 512,\n (length / Math.max(1, segments)) * 0.5,\n 1e-6,\n );\n const cols = Math.min(512, Math.floor((x1 - x0) / cell) + 1);\n const rows = Math.min(512, Math.floor((y1 - y0) / cell) + 1);\n const counts = new Int32Array(cols * rows + 1);\n const register = (pass: (b: number, e: number) => void) => {\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 2; i < p.length; i += 2) {\n // long segments are walked in steps of one cell\n const ax = p[i - 2];\n const ay = p[i - 1];\n const steps = Math.max(\n 1,\n Math.ceil(Math.hypot(p[i] - ax, p[i + 1] - ay) / cell),\n );\n let prev = -1;\n for (let s = 0; s < steps; s++) {\n const bx0 = ax + ((p[i] - ax) * s) / steps;\n const by0 = ay + ((p[i + 1] - ay) * s) / steps;\n const bx1 = ax + ((p[i] - ax) * (s + 1)) / steps;\n const by1 = ay + ((p[i + 1] - ay) * (s + 1)) / steps;\n const c0 = Math.floor((Math.min(bx0, bx1) - x0) / cell);\n const c1 = Math.floor((Math.max(bx0, bx1) - x0) / cell);\n const r0 = Math.floor((Math.min(by0, by1) - y0) / cell);\n const r1 = Math.floor((Math.max(by0, by1) - y0) / cell);\n for (let r = Math.max(0, r0); r <= Math.min(rows - 1, r1); r++) {\n for (let c = Math.max(0, c0); c <= Math.min(cols - 1, c1); c++) {\n const b = r * cols + c;\n // consecutive pieces mostly share their cell\n if (b === prev) continue;\n prev = b;\n pass(b, e);\n }\n }\n }\n }\n }\n };\n register((b) => counts[b + 1]++);\n for (let b = 0; b < cols * rows; b++) counts[b + 1] += counts[b];\n const items = new Int32Array(counts[cols * rows]);\n const cursor = counts.slice(0, cols * rows);\n register((b, e) => {\n items[cursor[b]++] = e;\n });\n edgeGrid = {\n cell,\n x0,\n y0,\n cols,\n rows,\n start: counts,\n items,\n stamp: new Int32Array(m),\n visit: 0,\n geometry: geometryVersion,\n built: now(),\n };\n return edgeGrid;\n };\n\n const pickAt = (px: number, py: number): Hit | null => {\n const i = pickNode(px, py);\n if (i >= 0) return { type: \"node\", index: i };\n const wantsEdges =\n tooltipEnabled() || listening(\"hover\") || listening(\"click\");\n const e = wantsEdges ? pickEdge(px, py) : -1;\n return e >= 0 ? { type: \"edge\", index: e } : null;\n };\n\n // -------------------------------------------------------------- events\n\n const tooltipEnabled = () => options.tooltip !== false;\n\n const hoverEvent = (hit: Hit): GraphHoverEvent => {\n const offsetX = stage.offsetLeft;\n const offsetY = stage.offsetTop;\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n const g = model.groupOf[i];\n return {\n type: \"node\",\n id: node.id,\n node,\n index: model.nodeInput[i],\n group: g >= 0 ? model.groups[g].id : undefined,\n color: toCss(nodeColor[i]),\n degree: model.inDegree[i] + model.outDegree[i],\n clientX: screenX(i) + offsetX,\n clientY: screenY(i) + offsetY,\n };\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const path = paths[e];\n let mx = (X[s] + X[t]) / 2;\n let my = (Y[s] + Y[t]) / 2;\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0];\n my = p[1];\n }\n return {\n type: \"edge\",\n id: `${edge.source}→${edge.target}`,\n edge,\n index: model.edgeInput[e],\n color: toCss(edgeColor[e]),\n clientX: mx * k + tx + offsetX,\n clientY: my * k + ty + offsetY,\n };\n };\n\n const sameHit = (a: Hit | null, b: Hit | null) =>\n a === b || (!!a && !!b && a.type === b.type && a.index === b.index);\n\n const setHover = (hit: Hit | null) => {\n if (sameHit(hit, hover)) {\n if (hit) positionTooltip();\n return;\n }\n hover = hit;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n emit(\"hover\", hit ? hoverEvent(hit) : null);\n };\n\n const tooltipTarget = (): Hit | null =>\n hover ??\n (focusVisible && focusIndex >= 0\n ? { type: \"node\", index: focusIndex }\n : null);\n\n const renderTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || !tooltipEnabled()) {\n tip.style.display = \"none\";\n return;\n }\n const event = hoverEvent(hit);\n const custom =\n typeof options.tooltip === \"object\" ? options.tooltip.render : undefined;\n const content = custom ? custom(event) : defaultTooltip(hit);\n if (content === null) {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n positionTooltip();\n };\n\n const positionTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || tip.style.display === \"none\") return;\n let ax: number;\n let ay: number;\n let gap = 14;\n if (hit.type === \"node\") {\n ax = screenX(hit.index);\n ay = screenY(hit.index);\n gap += (Math.max(sizing.width[hit.index], 0) * k) / 2;\n } else {\n const ev = hoverEvent(hit);\n ax = ev.clientX - stage.offsetLeft;\n ay = ev.clientY - stage.offsetTop;\n }\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let x = ax + gap;\n if (x + tw > width - 4) x = ax - gap - tw;\n x = Math.max(4, Math.min(width - tw - 4, x));\n const y = Math.max(4, Math.min(height - th - 4, ay - th / 2));\n tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;\n };\n\n const row = (name: string, value: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n });\n const n = style(doc.createElement(\"span\"), {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = name;\n const v = style(doc.createElement(\"span\"), {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = value;\n el.append(n, v);\n return el;\n };\n\n const header = (color: string, title: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"2px\",\n color: \"var(--text-color, #1f2937)\",\n });\n el.append(swatch(doc, color), doc.createTextNode(title));\n return el;\n };\n\n const defaultTooltip = (hit: Hit): Node => {\n const { labels } = loc;\n const fragment = doc.createDocumentFragment();\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n fragment.append(header(toCss(nodeColor[i]), labelOf(model, i)));\n if (node.subtitle) {\n const sub = style(doc.createElement(\"div\"), {\n color: \"var(--text-secondary-color, #6b7280)\",\n marginBottom: \"2px\",\n });\n sub.textContent = node.subtitle;\n fragment.append(sub);\n }\n const g = model.groupOf[i];\n if (g >= 0) fragment.append(row(labels.group, model.groups[g].name));\n if (Number.isFinite(node.value))\n fragment.append(row(labels.value, loc.value(node.value!)));\n const directed =\n layoutType === \"dag\" ||\n options.arrows ||\n model.edges.some((e) => e.directed);\n if (directed && !isTree()) {\n fragment.append(row(labels.incoming, loc.count(model.inDegree[i])));\n fragment.append(row(labels.outgoing, loc.count(model.outDegree[i])));\n } else if (!isTree()) {\n fragment.append(\n row(labels.degree, loc.count(model.inDegree[i] + model.outDegree[i])),\n );\n }\n if (isTree() && descendants[i] > 0 && !hasVisibleChild(i))\n fragment.append(row(labels.hiddenChildren, loc.count(descendants[i])));\n if (critical?.nodes[i]) {\n // a badge: full subtle border, tinted fill and a colored dot\n const color = toCss(criticalColor);\n const tag = style(doc.createElement(\"div\"), {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n marginTop: \"4px\",\n padding: \"0 8px\",\n borderRadius: \"999px\",\n border: `1px solid color-mix(in srgb, ${color} 35%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n lineHeight: \"18px\",\n });\n tag.className = \"minerva-chart-badge\";\n const dot = swatch(doc, color);\n style(dot, { width: \"7px\", height: \"7px\" });\n tag.append(dot, doc.createTextNode(labels.critical));\n fragment.append(tag);\n }\n return fragment;\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const arrow = edgeArrow[e] ? \" → \" : \" — \";\n fragment.append(\n header(\n toCss(edgeColor[e]),\n `${labelOf(model, s)}${arrow}${labelOf(model, t)}`,\n ),\n );\n if (edge.label) {\n const el = doc.createElement(\"div\");\n el.textContent = edge.label;\n fragment.append(el);\n }\n if (Number.isFinite(edge.value))\n fragment.append(row(labels.value, loc.value(edge.value!)));\n return fragment;\n };\n\n let hoverFrame = 0;\n let pendingHover: { x: number; y: number } | null = null;\n const scheduleHover = (x: number, y: number) => {\n pendingHover = { x, y };\n if (hoverFrame || !win) return;\n hoverFrame = win.requestAnimationFrame(() => {\n hoverFrame = 0;\n const p = pendingHover;\n pendingHover = null;\n if (!p || destroyed || drag) return;\n const hit = pickAt(p.x, p.y);\n setHover(hit);\n stage.style.cursor =\n hit?.type === \"node\"\n ? \"pointer\"\n : interaction()?.pan\n ? \"grab\"\n : \"default\";\n });\n };\n\n // --------------------------------------------------------- selection\n\n const setSelection = (next: Set<number>, notify: boolean) => {\n const same =\n next.size === selection.size && [...next].every((i) => selection.has(i));\n if (same) return;\n selection.clear();\n next.forEach((i) => selection.add(i));\n sceneDirty = true;\n invalidate();\n dom.live.textContent = selection.size\n ? fill(loc.labels.selected, { count: loc.count(selection.size) })\n : loc.labels.selectionCleared;\n if (notify)\n emit(\"select\", { ids: [...selection].map((i) => model.nodes[i].id) });\n };\n\n const selectNode = (i: number, additive: boolean) => {\n const ia = interaction();\n if (!ia?.select) return;\n const multi = ia.select === \"multiple\" || additive;\n const next = new Set(multi ? selection : []);\n if (multi && next.has(i)) next.delete(i);\n else next.add(i);\n setSelection(next, true);\n };\n\n // ------------------------------------------------------ collapse\n\n const setCollapsed = (i: number, collapse: boolean, notify: boolean) => {\n if (!tree || !tree.children[i]?.length) return false;\n const id = model.nodes[i].id;\n if (collapse === collapsedIds.has(id)) return false;\n if (collapse) collapsedIds.add(id);\n else collapsedIds.delete(id);\n const prev = snapshot();\n runLayout(prev, true);\n // hidden nodes leave the selection\n const kept = new Set([...selection].filter((j) => visible[j]));\n if (kept.size !== selection.size) setSelection(kept, true);\n if (focusIndex >= 0 && !visible[focusIndex]) focusIndex = i;\n dom.live.textContent = collapse\n ? fill(loc.labels.collapsed, {\n name: labelOf(model, i),\n count: loc.count(descendants[i]),\n })\n : fill(loc.labels.expanded, { name: labelOf(model, i) });\n if (notify) emit(\"toggle\", { id, collapsed: collapse });\n return true;\n };\n\n // -------------------------------------------------------- interaction\n\n interface DragState {\n mode: \"node\" | \"pan\" | \"pinch\";\n index: number;\n origin: { x: number; y: number };\n view: [number, number, number];\n offset: [number, number];\n distance: number;\n moved: boolean;\n button: number;\n }\n let drag: DragState | null = null;\n const pointers = new Map<number, { x: number; y: number }>();\n\n const local = (e: { clientX: number; clientY: number }) => {\n const r = stage.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n const pinchInfo = () => {\n const pts = [...pointers.values()];\n const a = pts[0] ?? { x: 0, y: 0 };\n const b = pts[1] ?? a;\n return {\n distance: Math.hypot(a.x - b.x, a.y - b.y),\n center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n };\n };\n\n const onPointerDown = (e: PointerEvent) => {\n const ia = interaction();\n if (!ia) return;\n if ((e.target as Element | null)?.closest?.(\"button\")) return;\n const p = local(e);\n pointers.set(e.pointerId, p);\n stage.setPointerCapture?.(e.pointerId);\n viewTween = null;\n if (pointers.size === 2 && (ia.zoom || ia.pan)) {\n const { distance, center } = pinchInfo();\n drag = {\n mode: \"pinch\",\n index: -1,\n origin: center,\n view: [k, tx, ty],\n offset: [0, 0],\n distance,\n moved: true,\n button: 0,\n };\n return;\n }\n if (pointers.size > 1) return;\n const i = e.button === 0 ? pickNode(p.x, p.y) : -1;\n const base = {\n origin: p,\n view: [k, tx, ty] as [number, number, number],\n distance: 0,\n moved: false,\n button: e.button,\n };\n if (i >= 0 && ia.drag) {\n drag = {\n ...base,\n mode: \"node\",\n index: i,\n offset: [(p.x - tx) / k - X[i], (p.y - ty) / k - Y[i]],\n };\n } else {\n drag = { ...base, mode: \"pan\", index: i, offset: [0, 0] };\n }\n if (e.button === 1) e.preventDefault();\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const p = local(e);\n if (pointers.has(e.pointerId)) pointers.set(e.pointerId, p);\n if (!drag) {\n if (e.pointerType === \"touch\" && pointers.size) return;\n scheduleHover(p.x, p.y);\n return;\n }\n const ia = interaction();\n if (!ia) return;\n if (drag.mode === \"pinch\") {\n const { distance, center } = pinchInfo();\n const [k0, x0, y0] = drag.view;\n const [lo, hi] = zoomLimits();\n const scale = ia.zoom && drag.distance > 0 ? distance / drag.distance : 1;\n const nk = Math.max(lo, Math.min(hi, k0 * scale));\n const ratio = nk / k0;\n const ox = drag.origin.x;\n const oy = drag.origin.y;\n const nx = ia.pan ? center.x : ox;\n const ny = ia.pan ? center.y : oy;\n k = nk;\n tx = nx - (ox - x0) * ratio;\n ty = ny - (oy - y0) * ratio;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n return;\n }\n const dx = p.x - drag.origin.x;\n const dy = p.y - drag.origin.y;\n if (!drag.moved && Math.hypot(dx, dy) < 3) return;\n if (!drag.moved) {\n drag.moved = true;\n if (hover) setHover(null);\n stage.style.cursor = drag.mode === \"node\" ? \"grabbing\" : \"grabbing\";\n }\n if (drag.mode === \"node\") {\n const i = drag.index;\n // the node stays under the pointer: stop following the layout\n followLayout = false;\n const wx = (p.x - tx) / k - drag.offset[0];\n const wy = (p.y - ty) / k - drag.offset[1];\n if (runner) runner.drag(i, wx, wy);\n else if (layoutType === \"force\") {\n // the simulation has finished: warm it up again from the current positions\n const prev = snapshot();\n startForceFrom(prev);\n (runner as ForceRunner | null)?.drag(i, wx, wy);\n }\n X[i] = TX[i] = wx;\n Y[i] = TY[i] = wy;\n pathsDirty = true;\n invalidate();\n return;\n }\n if (!ia.pan) return;\n const [k0, x0, y0] = drag.view;\n k = k0;\n tx = x0 + dx;\n ty = y0 + dy;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n };\n\n const startForceFrom = (prev: Map<string, Snapshot>) => {\n stopRunner();\n // a drag warms the layout up again: the view stays where it is\n startForce(prev, false);\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const was = drag;\n pointers.delete(e.pointerId);\n if (stage.hasPointerCapture?.(e.pointerId))\n stage.releasePointerCapture(e.pointerId);\n if (pointers.size) {\n if (was?.mode === \"pinch\") drag = null;\n return;\n }\n drag = null;\n stage.style.cursor = interaction()?.pan ? \"grab\" : \"default\";\n if (!was) return;\n if (was.mode === \"node\" && was.moved) {\n runner?.release(was.index, !!model.nodes[was.index].fixed);\n return;\n }\n if (was.moved || was.button !== 0) return;\n const p = local(e);\n const hit = pickAt(p.x, p.y);\n handleClick(hit, e.ctrlKey || e.metaKey || e.shiftKey);\n };\n\n const handleClick = (hit: Hit | null, additive: boolean) => {\n if (!hit) {\n if (selection.size && interaction()?.select)\n setSelection(new Set(), true);\n return;\n }\n const event = hoverEvent(hit);\n emit(\"click\", event);\n if (hit.type !== \"node\") return;\n const i = hit.index;\n if (collapsible() && tree?.children[i]?.length)\n setCollapsed(i, hasVisibleChild(i), true);\n selectNode(i, additive);\n };\n\n const onPointerCancel = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (!pointers.size) {\n if (drag?.mode === \"node\")\n runner?.release(drag.index, !!model.nodes[drag.index].fixed);\n drag = null;\n }\n };\n\n const onPointerLeave = () => {\n pendingHover = null;\n if (!drag && hover) setHover(null);\n };\n\n let hintTimer: ReturnType<typeof setTimeout> | 0 = 0;\n const showHint = () => {\n const mac = /Mac|iPhone|iPad/.test(win?.navigator?.platform ?? \"\");\n dom.hint.textContent = fill(loc.labels.zoomHint, {\n key: mac ? \"⌘\" : \"Ctrl\",\n });\n dom.hint.style.opacity = \"1\";\n if (hintTimer) clearTimeout(hintTimer);\n hintTimer = setTimeout(() => {\n hintTimer = 0;\n dom.hint.style.opacity = \"0\";\n }, 1200);\n };\n\n const onWheel = (e: WheelEvent) => {\n const ia = interaction();\n if (!ia?.zoom) return;\n const pinch = e.ctrlKey && !e.metaKey;\n if (ia.wheel === \"modifier\" && !e.ctrlKey && !e.metaKey) {\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) showHint();\n return;\n }\n e.preventDefault();\n const p = local(e);\n viewTween = null;\n zoomAround(1 / wheelFactor(e.deltaY, e.deltaMode, pinch), p.x, p.y);\n if (hover) setHover(null);\n };\n\n const onDoubleClick = (e: MouseEvent) => {\n if (!interaction()) return;\n const p = local(e);\n if (pickNode(p.x, p.y) >= 0) return;\n e.preventDefault();\n instance.fit(true);\n };\n\n const onFocus = () => {\n let keyboard: boolean;\n try {\n keyboard = stage.matches(\":focus-visible\");\n } catch {\n keyboard = true;\n }\n focusVisible = keyboard;\n if (keyboard)\n stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n stage.style.boxShadow = \"\";\n focusVisible = false;\n if (focusIndex >= 0) {\n focusIndex = -1;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n }\n };\n\n const drawnNodes = () => {\n const list: number[] = [];\n for (let i = 0; i < model.n; i++)\n if (fade(i) > 0 && !(tween && !visible[i])) list.push(i);\n return list;\n };\n\n const setFocus = (i: number) => {\n if (i === focusIndex) return;\n focusIndex = i;\n focusVisible = true;\n sceneDirty = true;\n // keep it in view\n const sx = screenX(i);\n const sy = screenY(i);\n const margin = 40;\n if (\n sx < margin ||\n sy < margin ||\n sx > width - margin ||\n sy > height - margin\n ) {\n setView([k, tx + width / 2 - sx, ty + height / 2 - sy], true);\n }\n const g = model.groupOf[i];\n const degree = model.inDegree[i] + model.outDegree[i];\n dom.live.textContent =\n g >= 0\n ? fill(loc.labels.nodeFocusGroup, {\n name: labelOf(model, i),\n group: model.groups[g].name,\n degree: loc.count(degree),\n })\n : fill(loc.labels.nodeFocus, {\n name: labelOf(model, i),\n degree: loc.count(degree),\n });\n renderTooltip();\n invalidate();\n emit(\"hover\", hoverEvent({ type: \"node\", index: i }));\n };\n\n /** Closest node in a direction (screen space) */\n const neighborInDirection = (\n from: number,\n dx: number,\n dy: number,\n ): number => {\n const sx = screenX(from);\n const sy = screenY(from);\n let best = -1;\n let bestScore = Infinity;\n for (const i of drawnNodes()) {\n if (i === from) continue;\n const vx = screenX(i) - sx;\n const vy = screenY(i) - sy;\n const along = vx * dx + vy * dy;\n if (along <= 0.5) continue;\n const across = Math.abs(vx * dy - vy * dx);\n if (across > along * 2.5) continue;\n const score = along + across * 2;\n if (score < bestScore) {\n bestScore = score;\n best = i;\n }\n }\n return best;\n };\n\n const startingNode = () => {\n const first = [...selection].find((i) => fade(i) > 0);\n if (first !== undefined) return first;\n for (const i of model.rank) if (fade(i) > 0) return i;\n return -1;\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const ia = interaction();\n if (!ia?.keyboard) return;\n const dirs: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const dir = dirs[e.key];\n if (dir) {\n e.preventDefault();\n if (focusIndex < 0 || fade(focusIndex) <= 0) {\n const start = startingNode();\n if (start >= 0) setFocus(start);\n return;\n }\n const next = neighborInDirection(focusIndex, dir[0], dir[1]);\n if (next >= 0) setFocus(next);\n return;\n }\n switch (e.key) {\n case \"Enter\":\n case \" \":\n if (focusIndex < 0) return;\n e.preventDefault();\n if (\n e.key === \"Enter\" &&\n collapsible() &&\n tree?.children[focusIndex]?.length\n )\n setCollapsed(focusIndex, hasVisibleChild(focusIndex), true);\n emit(\"click\", hoverEvent({ type: \"node\", index: focusIndex }));\n selectNode(focusIndex, e.ctrlKey || e.metaKey || e.key === \" \");\n return;\n case \"+\":\n case \"=\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"-\":\n case \"_\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(1 / KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"0\":\n case \"Home\":\n e.preventDefault();\n instance.fit(true);\n return;\n case \"Escape\": {\n const had = focusIndex >= 0 || selection.size > 0 || !!hover;\n if (!had) return;\n e.preventDefault();\n focusIndex = -1;\n if (hover) setHover(null);\n setSelection(new Set(), true);\n renderTooltip();\n sceneDirty = true;\n invalidate();\n return;\n }\n default:\n }\n };\n\n const onZoomIn = () => zoomAround(BUTTON_ZOOM, width / 2, height / 2, true);\n const onZoomOut = () =>\n zoomAround(1 / BUTTON_ZOOM, width / 2, height / 2, true);\n const onFit = () => instance.fit(true);\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n dom.zoomIn.addEventListener(\"click\", onZoomIn);\n dom.zoomOut.addEventListener(\"click\", onZoomOut);\n dom.fit.addEventListener(\"click\", onFit);\n\n // ----------------------------------------------------------- watchers\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(dom.root, options.palette);\n const fontChanged = next.fontFamily !== theme.fontFamily;\n if (!themeColorsChanged(theme, next) && !fontChanged) return;\n theme = next;\n if (fontChanged) {\n runLayout(snapshot(), false);\n return;\n }\n refreshColors();\n legendKey = \"\";\n renderLegend();\n highlightKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n const unwatchLocale = watchLocale(() => {\n if (destroyed || resolveLocale(options.locale) === loc.locale) return;\n loc = graphLocale(options.locale, options.labels);\n updateAccessibility();\n if (hover || focusIndex >= 0) renderTooltip();\n });\n\n // ----------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n canvas.className = \"minerva-chart-data\";\n return canvas;\n },\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n sceneDirty = true;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n stage.insertBefore(next.canvas, dom.foreground);\n emit(\"renderer\", next.kind);\n } else {\n delete dom.root.dataset.renderer;\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ---------------------------------------------------------- startup\n\n const initialState = (o: GraphChartOptions) => {\n collapsedIds.clear();\n for (const node of o.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n hiddenGroups.clear();\n for (const g of o.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n };\n\n const applySelectedOption = () => {\n if (!options.selected) return;\n const next = new Set<number>();\n for (const id of options.selected) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n selection.clear();\n next.forEach((i) => selection.add(i));\n highlightKey = \"\";\n sceneDirty = true;\n };\n\n initialState(options);\n runLayout(new Map(), false);\n applySelectedOption();\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ---------------------------------------------------------------- api\n\n const replaceData = (next: GraphChartOptions, dataChanged: boolean) => {\n const prev = snapshot();\n const ids = [...selection].map((i) => model.nodes[i].id);\n const focusId = focusIndex >= 0 ? model.nodes[focusIndex].id : null;\n if (dataChanged) {\n // collapsed / hidden flags of the new data\n for (const node of next.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n model = buildModel(next.nodes ?? [], next.edges ?? [], next.groups);\n for (const g of next.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n selection.clear();\n for (const id of ids) {\n const i = model.index.get(id);\n if (i !== undefined) selection.add(i);\n }\n focusIndex = focusId !== null ? (model.index.get(focusId) ?? -1) : -1;\n hover = null;\n dom.tooltip.style.display = \"none\";\n }\n runLayout(prev, true);\n };\n\n const instance: GraphChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join()) {\n theme = readTheme(dom.root, next.palette);\n }\n if (next.locale !== previous.locale || next.labels !== previous.labels) {\n loc = graphLocale(next.locale, next.labels);\n }\n const dataChanged =\n next.nodes !== previous.nodes ||\n next.edges !== previous.edges ||\n next.groups !== previous.groups;\n const sig = layoutSignature(next);\n if (dataChanged || sig !== layoutSig) {\n layoutSig = sig;\n replaceData(next, dataChanged);\n } else {\n refreshCritical();\n refreshColors();\n pathsDirty = true;\n highlightKey = \"\";\n legendKey = \"\";\n renderLegend();\n updateAccessibility();\n invalidate();\n }\n if (\n (next.selected ?? []).join(\"\\u0001\") !==\n (previous.selected ?? []).join(\"\\u0001\")\n )\n applySelectedOption();\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setData(data) {\n if (destroyed) return;\n instance.setOptions({\n ...options,\n nodes: data.nodes,\n edges: data.edges,\n groups: data.groups ?? options.groups,\n });\n },\n fit(animate = true) {\n if (destroyed) return;\n userMoved = false;\n // keep the view fitted while the layout still moves\n if (runner?.running()) followLayout = true;\n const target = fitView();\n if (target) setView(target, animate);\n else needsFit = true;\n invalidate();\n },\n focusNode(id, opts = {}) {\n if (destroyed) return;\n let i = model.index.get(id);\n if (i === undefined) return;\n // expand the collapsed ancestors first\n if (tree && !visible[i]) {\n let changed = false;\n for (let a = tree.parent[i]; a >= 0; a = tree.parent[a]) {\n if (collapsedIds.delete(model.nodes[a].id)) changed = true;\n }\n if (changed) runLayout(snapshot(), opts.animate !== false);\n i = model.index.get(id)!;\n }\n const kk = opts.zoom ?? Math.max(k, 1);\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, kk));\n userMoved = true;\n const w = width || stage.clientWidth;\n const h = height || stage.clientHeight;\n setView(\n [nk, w / 2 - TX[i] * nk, h / 2 - TY[i] * nk],\n opts.animate !== false,\n );\n focusIndex = i;\n highlightKey = \"\";\n sceneDirty = true;\n invalidate();\n },\n select(ids) {\n if (destroyed) return;\n const list = ids === null ? [] : typeof ids === \"string\" ? [ids] : ids;\n const next = new Set<number>();\n for (const id of list) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n setSelection(next, true);\n },\n getSelection: () => [...selection].map((i) => model.nodes[i].id),\n expand(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!collapsedIds.size) return;\n const ids = [...collapsedIds];\n collapsedIds.clear();\n runLayout(snapshot(), true);\n for (const c of ids) {\n if (model.index.has(c)) emit(\"toggle\", { id: c, collapsed: false });\n }\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, false, true);\n else collapsedIds.delete(id);\n },\n collapse(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!tree) return;\n const changed: string[] = [];\n tree.children.forEach((list, i) => {\n const nodeId = model.nodes[i].id;\n if (\n list.length &&\n tree!.parent[i] >= 0 &&\n !collapsedIds.has(nodeId)\n ) {\n collapsedIds.add(nodeId);\n changed.push(nodeId);\n }\n });\n if (!changed.length) return;\n runLayout(snapshot(), true);\n for (const c of changed) emit(\"toggle\", { id: c, collapsed: true });\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, true, true);\n },\n toggle(id) {\n const i = model.index.get(id);\n if (i === undefined || destroyed) return;\n setCollapsed(i, hasVisibleChild(i), true);\n },\n getPositions() {\n const out: Record<string, GraphPoint> = {};\n for (let i = 0; i < model.n; i++) {\n out[model.nodes[i].id] = { x: TX[i], y: TY[i] };\n }\n return out;\n },\n relayout() {\n if (destroyed) return;\n runLayout(layoutType === \"force\" ? new Map() : snapshot(), true);\n },\n resize() {\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(listener as (e: never) => void);\n return () => {\n set.delete(listener as (e: never) => void);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n rendererToken++;\n if (frameId) win?.cancelAnimationFrame(frameId);\n if (hoverFrame) win?.cancelAnimationFrame(hoverFrame);\n if (hintTimer) clearTimeout(hintTimer);\n frameId = 0;\n hoverFrame = 0;\n stopRunner();\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n unwatchLocale();\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"wheel\", onWheel);\n stage.removeEventListener(\"dblclick\", onDoubleClick);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n dom.zoomIn.removeEventListener(\"click\", onZoomIn);\n dom.zoomOut.removeEventListener(\"click\", onZoomOut);\n dom.fit.removeEventListener(\"click\", onFit);\n renderer?.destroy();\n renderer = null;\n listeners.clear();\n resolveReady(null);\n dom.root.remove();\n },\n };\n return instance;\n};\n\nfunction isDark(theme: ChartTheme): boolean {\n return luminance(theme.background) < 0.4 || luminance(theme.text) > 0.6;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart.cjs","names":["createGraphDom","readTheme","graphLocale","buildModel","parseColor","mix","forceInit","forceKernel","createForceRunner","tidyTreeLayout","computeSizing","layeredLayout","TREE_LEVEL_GAP","arcPositions","circularPositions","longestPath","NodeKind","endDirection","boundaryDistance","trimPath","boxLoopPath","loopPath","arcPath","quadraticPath","roundCorners","orthogonalPath","splinePath","packColor","GAP","dashPath","luminance","toCss","labelOf","pointAt","pathLength","swatch","fill","distanceToPath","style","themeColorsChanged","watchTheme","watchLocale","resolveLocale","createRenderer","followDefaultRenderer","require_color","require_types","require_locale","require_detect","require_follow","require_theme","require_force","require_circular","require_dag","require_dom","require_geometry","require_labels","require_model","require_sizing","require_tree","require_worker","LAYOUTS","TREE_TYPES","HALO_LIMIT","PARALLEL_BOW","PORT_GAP","LANE_GAP","WAYPOINT_GAP","LENS_GAP","LOOP_SCAN_MAX","EDGE_INDEX_MIN","TWEEN_MS","VIEW_TWEEN_MS","BOX_FONT_MIN","KEY_ZOOM","BUTTON_ZOOM","wheelFactor","pixels","deltaMode","deltaY","pinch","ease","t","pointBuffer","data","length","ensure","extra","next","x","y","points","i","resolveLayout","layout","layoutSignature","o","createGraphChart","doc","container","win","dom","stage","options","initialOptions","theme","dark","isDark","loc","destroyed","listeners","emit","type","fn","event","listening","reducedMotion","now","model","layoutType","direction","layoutSig","sizing","X","Y","TX","TY","FX","FY","visible","prevVisible","tween","tweenT","tree","dag","circ","runner","forcePending","collapsedIds","hiddenGroups","critical","descendants","paths","pathsDirty","geometryVersion","sceneDirty","items","version","nodeColor","edgeColor","edgeWidth","edgeArrow","edgeDashed","groupColor","criticalColor","edgeLabelWidth","k","tx","ty","viewTween","userMoved","needsFit","fitAnimate","drawnOnce","followLayout","width","height","hover","focusIndex","focusVisible","selection","highlight","highlightKey","renderer","rendererToken","resolveReady","ready","resolve","frameId","interaction","c","isTree","collapsible","animationMs","a","highlightMode","edgeStyle","s","flow","resolveColor","value","fallback","measureCtx","measure","font","text","snapshot","map","stopRunner","collapsedSet","set","id","treeInput","w","h","startForce","follow","fixed","known","node","p","prev","e","j","radius","range","weight","mean","v","edge","alpha","sw","sh","init","f","animate","workerOption","useWorker","sim","emitLayoutEnd","invalidate","wasPending","runLayout","previousType","n","depth","ones","nextVisible","tx2","ty2","d","levelGap","spacing","input","oldVisible","countDescendants","ms","from","refreshCritical","refreshColors","updateAccessibility","renderLegend","counts","order","q","option","nodes","edges","path","ids","bg","palette","g","branch","roots","stack","b","neutral","mode","wOption","eRange","wMin","wMax","arrows","fade","isBox","port","vertical","sign","trimmed","ux","uy","l0","ex","ey","loopAngle","angles","dx","dy","end","best","angle","gap","loopSize","roomTowards","horizontal","ax","extent","across","room","check","px","py","ay","side","along","route","loopPlacement","base","sides","labelBelow","outer","loopOf","size","reach","at","portShift","slot","fanOut","out","pts","last","r","lens","mid","edgePath","arrow","bend","parallel","rise","bow","style","mx","my","tension","cx","cy","rs","rt","as","rm","dir","bottom","left","sx","bus","refreshPaths","straightEnds","len","updateHighlight","sources","edgeHover","key","buildScene","minPx","hl","layers","bucket","color","layer","arrowLen","filledLen","filled","heads","tmp","head","buf","ends","l","line","item","nodeFill","halo","fills","rings","collapsedFill","selRings","avatars","boxBuckets","outlines","radiusPx","showHalo","drawOrder","selected","hovered","hasVisibleChild","solid","crit","border","body","pad","okey","list","scatter","count","buffer","f32","u32","bars","half","late","frame","transform","dpr","animating","target","fitView","approachView","k0","x0","y0","k1","x1","y1","kk","c0x","c0y","c1x","c1y","bw","bh","drawOverlay","positionTooltip","screenX","screenY","ellipsize","max","ctx","lo","hi","textColorOn","family","muted","bgCss","cols","rows","grid","free","c0","c1","r0","r1","mark","onScreen","margin","sy","showBoxText","natural","avatar","maxWidth","subSize","block","subtitle","titleY","label","sub","initial","collapsed","active","bx","by","label2","priority","drawn","budget","drawLabel","force","strong","dim","raw","tw","place","placement","bx0","by0","bx1","by1","edgeMode","shownEdges","lit","lw","all","below","radial","flip","inner","right","maxLabel","hw","hh","lx","ly","pl","pr","pt","pb","aw","ah","ox","oy","zoomLimits","fit","to","rate","setView","zoomAround","nk","factor","ratio","legendKey","named","show","config","toggle","focused","hidden","toggleGroup","group","setHover","role","labels","keyboard","ia","lines","names","controls","pickGrid","pickCell","maxExtent","pickKey","buildPickGrid","pickNode","wx","wy","tol","minR","bestD","pickEdge","test","index","edgeIndex","cell","visit","start","stamp","edgeGrid","current","m","segment","segments","span","register","steps","pass","cursor","pickAt","tooltipEnabled","hoverEvent","offsetX","offsetY","hit","sameHit","renderTooltip","tooltipTarget","tip","custom","content","defaultTooltip","ev","th","row","el","name","header","title","fragment","tag","dot","hoverFrame","pendingHover","scheduleHover","drag","setSelection","notify","selectNode","multi","additive","setCollapsed","collapse","kept","pointers","local","pinchInfo","onPointerDown","center","onPointerMove","scale","distance","nx","ny","startForceFrom","onPointerUp","was","handleClick","onPointerCancel","onPointerLeave","hintTimer","showHint","mac","onWheel","onDoubleClick","instance","onFocus","onBlur","drawnNodes","setFocus","degree","neighborInDirection","bestScore","vx","vy","score","startingNode","first","onKeyDown","onZoomIn","onZoomOut","onFit","resizeObserver","refreshTheme","fontChanged","unwatchTheme","unwatchLocale","initRenderer","token","canvas","kind","exclude","initialState","applySelectedOption","unfollowDefault","replaceData","focusId","dataChanged","previous","sig","changed","opts","nodeId","listener"],"sources":["../../../../../charts/src/engine/graph/chart.ts"],"sourcesContent":["// createGraphChart: relationship networks, dependency DAGs and trees. Nodes\n// and edges are drawn by a GPU backend (WebGPU -> WebGL2 -> WebGL) or by\n// Canvas2D through the shared renderer contract (edges = polylines, nodes =\n// discs and rounded boxes); labels, badges and the focus ring are a 2D\n// canvas above them. Layouts: force (Barnes–Hut, optional worker), layered\n// DAG, tidy / radial / mind map / org trees, circular and arc diagrams.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { resolveLocale, watchLocale } from \"../locale\";\nimport { createRenderer } from \"../renderers/detect\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n GAP,\n SCATTER_STRIDE,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type LineItem,\n type RenderItem,\n type ScatterItem,\n} from \"../renderers/types\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { arcPositions, circularPositions } from \"./circular\";\nimport { layeredLayout, longestPath } from \"./dag\";\nimport { createGraphDom, sizeCanvas, style, swatch } from \"./dom\";\nimport { forceInit, forceKernel } from \"./force\";\nimport {\n arcPath,\n arrowHead,\n boundaryDistance,\n cubicPoints,\n dashPath,\n distanceToPath,\n endDirection,\n filledArrow,\n loopPath,\n boxLoopPath,\n orthogonalPath,\n pathLength,\n pointAt,\n quadraticPath,\n roundCorners,\n splinePath,\n trimPath,\n} from \"./geometry\";\nimport { fill, graphLocale, type GraphLocale } from \"./labels\";\nimport { buildModel, lineage, neighborhood, type GraphModel } from \"./model\";\nimport {\n LABEL_FONT_SIZE,\n NodeKind,\n computeSizing,\n labelOf,\n type NodeSizing,\n} from \"./sizing\";\nimport { TREE_LEVEL_GAP, tidyTreeLayout, type TreeType } from \"./tree\";\nimport type {\n GraphCircularLayoutResult,\n GraphDagLayoutResult,\n GraphChartEventMap,\n GraphChartInstance,\n GraphChartOptions,\n GraphDirection,\n GraphEdgeStyle,\n GraphHoverEvent,\n GraphInteractionOptions,\n GraphLayoutType,\n GraphPoint,\n GraphTreeLayoutResult,\n} from \"./types\";\nimport {\n WORKER_THRESHOLD,\n createForceRunner,\n type ForceRunner,\n} from \"./worker\";\n\nconst LAYOUTS: readonly GraphLayoutType[] = [\n \"force\",\n \"dag\",\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n \"circular\",\n \"arc\",\n \"none\",\n];\n\nconst TREE_TYPES = new Set<GraphLayoutType>([\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n]);\n\n/** Node halos are skipped above this number of nodes */\nconst HALO_LIMIT = 5000;\n/** Sideways bow of parallel edges per slot, relative to their length */\nconst PARALLEL_BOW = 0.4;\n/** Flow routes (spline / orthogonal) of parallel edges: max port spacing on a node side, lane spacing of their crossing segments and waypoints, and sideways bulge of a direct spline, per slot */\nconst PORT_GAP = 8;\nconst LANE_GAP = 10;\nconst WAYPOINT_GAP = 14;\nconst LENS_GAP = 24;\n/** Self-loops of flow layouts avoid their neighbors up to this many nodes */\nconst LOOP_SCAN_MAX = 4000;\n/** Edge picking uses a spatial index from this number of edges */\nconst EDGE_INDEX_MIN = 2000;\nconst TWEEN_MS = 450;\nconst VIEW_TWEEN_MS = 320;\n/** Smallest font (px) of the text inside boxes when zoomed out */\nconst BOX_FONT_MIN = 9;\nconst KEY_ZOOM = 1.25;\nconst BUTTON_ZOOM = 1.4;\n\nconst wheelFactor = (deltaY: number, deltaMode: number, pinch: boolean) => {\n const pixels =\n deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const speed = pinch ? 0.01 : 0.0025;\n return Math.exp(Math.max(-1, Math.min(1, pixels * speed)));\n};\n\nconst ease = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n/** Grows a Float32Array of interleaved points */\nconst pointBuffer = () => {\n let data = new Float32Array(1024);\n let length = 0;\n const ensure = (extra: number) => {\n if (length + extra <= data.length) return;\n const next = new Float32Array(Math.max(data.length * 2, length + extra));\n next.set(data.subarray(0, length));\n data = next;\n };\n return {\n push(x: number, y: number) {\n ensure(2);\n data[length++] = x;\n data[length++] = y;\n },\n pushAll(points: readonly number[]) {\n ensure(points.length);\n for (let i = 0; i < points.length; i++) data[length++] = points[i];\n },\n count: () => length / 2,\n points: () => data.subarray(0, length),\n };\n};\n\ntype PointBuffer = ReturnType<typeof pointBuffer>;\n\ninterface Hit {\n type: \"node\" | \"edge\";\n index: number;\n}\n\ninterface Snapshot {\n x: number;\n y: number;\n visible: boolean;\n}\n\nexport const resolveLayout = (\n layout: GraphLayoutType | undefined,\n): GraphLayoutType => (layout && LAYOUTS.includes(layout) ? layout : \"force\");\n\nconst layoutSignature = (o: GraphChartOptions): string =>\n JSON.stringify([\n resolveLayout(o.layout),\n o.direction ?? \"\",\n o.force ?? null,\n o.dag\n ? { ...o.dag, criticalPath: undefined, criticalColor: undefined }\n : null,\n o.tree ?? null,\n o.circular ?? null,\n o.nodeSize ?? null,\n o.nodeShape ?? null,\n o.nodeLabels === false,\n ]);\n\nexport const createGraphChart = (\n container: HTMLElement,\n initialOptions: GraphChartOptions,\n): GraphChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createGraphDom(container);\n const stage = dom.stage;\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let dark = isDark(theme);\n let loc: GraphLocale = graphLocale(options.locale, options.labels);\n let destroyed = false;\n\n const listeners = new Map<\n keyof GraphChartEventMap,\n Set<(e: never) => void>\n >();\n const emit = <K extends keyof GraphChartEventMap>(\n type: K,\n event: GraphChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: GraphChartEventMap[K]) => void)(event));\n };\n const listening = (type: keyof GraphChartEventMap) =>\n !!listeners.get(type)?.size;\n\n const reducedMotion =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n const now = () => win?.performance?.now() ?? Date.now();\n\n // --------------------------------------------------------------- state\n\n let model: GraphModel = buildModel(\n options.nodes ?? [],\n options.edges ?? [],\n options.groups,\n );\n let layoutType: GraphLayoutType = resolveLayout(options.layout);\n let direction: GraphDirection = \"TB\";\n let layoutSig = layoutSignature(options);\n let sizing: NodeSizing;\n let X: Float64Array = new Float64Array(0);\n let Y: Float64Array = new Float64Array(0);\n let TX: Float64Array = new Float64Array(0);\n let TY: Float64Array = new Float64Array(0);\n let FX: Float64Array = new Float64Array(0);\n let FY: Float64Array = new Float64Array(0);\n let visible = new Uint8Array(0);\n let prevVisible: Uint8Array | null = null;\n let tween: { start: number; duration: number } | null = null;\n let tweenT = 1;\n let tree: GraphTreeLayoutResult | null = null;\n let dag: GraphDagLayoutResult | null = null;\n let circ: GraphCircularLayoutResult | null = null;\n let runner: ForceRunner | null = null;\n let forcePending = false;\n const collapsedIds = new Set<string>();\n const hiddenGroups = new Set<string>();\n let critical: { nodes: Uint8Array; edges: Uint8Array } | null = null;\n let descendants = new Int32Array(0);\n let paths: (number[] | null)[] = [];\n let pathsDirty = true;\n /** Changes with the edge geometry (see the edge index) */\n let geometryVersion = 0;\n let sceneDirty = true;\n let items: RenderItem[] = [];\n let version = 0;\n\n // colors\n let nodeColor: Rgba[] = [];\n let edgeColor: Rgba[] = [];\n let edgeWidth = new Float64Array(0);\n let edgeArrow = new Uint8Array(0);\n let edgeDashed = new Uint8Array(0);\n let groupColor: Rgba[] = [];\n let criticalColor: Rgba = [0.94, 0.27, 0.27, 1];\n let edgeLabelWidth = new Float64Array(0);\n\n // view: screen = world * k + t (CSS pixels)\n let k = 1;\n let tx = 0;\n let ty = 0;\n let viewTween: {\n from: [number, number, number];\n to: [number, number, number];\n start: number;\n } | null = null;\n let userMoved = false;\n let needsFit = true;\n /** The next fit animates (layout changes after the first frame) */\n let fitAnimate = false;\n let drawnOnce = false;\n /** The view follows the running force layout (unless the user moved it) */\n let followLayout = false;\n let width = 0;\n let height = 0;\n\n // interaction\n let hover: Hit | null = null;\n let focusIndex = -1;\n let focusVisible = false;\n const selection = new Set<number>();\n let highlight: { nodes: Uint8Array; edges: Uint8Array; accent: Rgba } | null =\n null;\n let highlightKey = \"\";\n\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n let frameId = 0;\n\n // ------------------------------------------------------------ options\n\n const interaction = (): Required<GraphInteractionOptions> | null => {\n const o = options.interaction;\n if (o === false) return null;\n const c = typeof o === \"object\" ? o : {};\n return {\n pan: c.pan ?? true,\n zoom: c.zoom ?? true,\n wheel: c.wheel ?? \"modifier\",\n drag:\n c.drag ??\n (layoutType === \"force\" ||\n layoutType === \"none\" ||\n layoutType === \"circular\"),\n select: c.select ?? true,\n keyboard: c.keyboard ?? true,\n zoomRange: c.zoomRange ?? [0.02, 8],\n };\n };\n\n const isTree = () => TREE_TYPES.has(layoutType);\n const collapsible = () => isTree() && options.tree?.collapsible !== false;\n const animationMs = () => {\n const a = options.animation;\n if (a === false || reducedMotion?.matches) return 0;\n return typeof a === \"number\" && a >= 0 ? a : TWEEN_MS;\n };\n const highlightMode = () =>\n options.highlight ?? (layoutType === \"dag\" ? \"lineage\" : \"neighbors\");\n\n const edgeStyle = (): GraphEdgeStyle => {\n const s = options.edgeStyle;\n const flow = layoutType === \"dag\" || isTree();\n if (s === \"straight\" || s === \"curve\") return s;\n if ((s === \"spline\" || s === \"orthogonal\") && flow) return s;\n if (s) return \"curve\";\n switch (layoutType) {\n case \"dag\":\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n return \"spline\";\n case \"org\":\n return \"orthogonal\";\n case \"circular\":\n case \"arc\":\n return \"curve\";\n default:\n return \"straight\";\n }\n };\n\n const resolveColor = (value: string, fallback: Rgba): Rgba => {\n const c = theme.resolve\n ? theme.resolve(value, fallback)\n : (parseColor(value) ?? fallback);\n return c[3] < 1 ? mix(theme.background, [c[0], c[1], c[2], 1], c[3]) : c;\n };\n\n // ----------------------------------------------------------- measure\n\n const measureCtx = dom.foreground.getContext(\"2d\");\n const measure = (text: string, font: string) => {\n if (!measureCtx) return text.length * 7;\n measureCtx.font = font;\n return measureCtx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- layout\n\n const snapshot = (): Map<string, Snapshot> => {\n const map = new Map<string, Snapshot>();\n if (X.length !== model.n) return map;\n for (let i = 0; i < model.n; i++) {\n if (!Number.isFinite(X[i])) continue;\n map.set(model.nodes[i].id, {\n x: X[i],\n y: Y[i],\n visible: !!visible[i] && !forcePending,\n });\n }\n return map;\n };\n\n const stopRunner = () => {\n runner?.destroy();\n runner = null;\n forcePending = false;\n };\n\n const collapsedSet = () => {\n const set = new Set<number>();\n for (const id of collapsedIds) {\n const i = model.index.get(id);\n if (i !== undefined) set.add(i);\n }\n return set;\n };\n\n const treeInput = (\n type: TreeType,\n w: ArrayLike<number>,\n h: ArrayLike<number>,\n levelGap: number,\n ) => {\n const t = options.tree ?? {};\n return {\n n: model.n,\n source: model.source,\n target: model.target,\n width: w,\n height: h,\n type,\n direction,\n root: t.root !== undefined ? (model.index.get(t.root) ?? -1) : -1,\n levelGap,\n siblingGap:\n t.siblingGap ?? (type === \"org\" ? 20 : type === \"mindmap\" ? 10 : 12),\n collapsed: collapsedSet(),\n compact: t.compact,\n };\n };\n\n const startForce = (prev: Map<string, Snapshot>, follow = true) => {\n followLayout = follow;\n const n = model.n;\n const x = new Float64Array(n).fill(NaN);\n const y = new Float64Array(n).fill(NaN);\n const fixed = new Uint8Array(n);\n let known = 0;\n for (let i = 0; i < n; i++) {\n const node = model.nodes[i];\n const p = prev.get(node.id);\n if (p) {\n x[i] = p.x;\n y[i] = p.y;\n known++;\n } else if (Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n known++;\n }\n if (node.fixed && Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n fixed[i] = 1;\n }\n }\n // new nodes start next to a known neighbor\n if (known && known < n) {\n for (let i = 0; i < n; i++) {\n if (Number.isFinite(x[i])) continue;\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (Number.isFinite(x[j])) {\n x[i] = x[j] + ((i * 7919) % 17) - 8;\n y[i] = y[j] + ((i * 104729) % 17) - 8;\n break;\n }\n }\n }\n }\n const radius = new Float64Array(n);\n for (let i = 0; i < n; i++)\n radius[i] = Math.max(sizing.width[i], sizing.height[i]) / 2;\n const range = model.edgeValueRange;\n const weight = new Float64Array(model.m).fill(1);\n if (range) {\n const mean = (range[0] + range[1]) / 2 || 1;\n model.edges.forEach((edge, e) => {\n const v = edge.value;\n if (Number.isFinite(v) && v! > 0)\n weight[e] = Math.max(0.5, Math.min(2, Math.sqrt(v! / mean)));\n });\n }\n const alpha = known === 0 ? 1 : known === n ? 0.3 : 0.6;\n const sw = stage.clientWidth;\n const sh = stage.clientHeight;\n const init = forceInit(n, model.source, model.target, options.force, {\n x,\n y,\n radius,\n fixed,\n weight,\n alpha,\n aspect: sw > 0 && sh > 0 ? sw / sh : 1,\n });\n const f = options.force ?? {};\n const animate = f.animate !== false;\n const workerOption = f.worker ?? \"auto\";\n const useWorker =\n workerOption === true ||\n (workerOption === \"auto\" && n >= WORKER_THRESHOLD);\n X = x;\n Y = y;\n TX = x;\n TY = y;\n if (!animate && !useWorker) {\n const sim = forceKernel()(init);\n while (sim.tick(50));\n sim.settle();\n emitLayoutEnd();\n return;\n }\n forcePending = !animate;\n runner = createForceRunner(init, {\n worker: useWorker,\n stream: animate,\n now,\n onTick: () => {\n pathsDirty = true;\n invalidate();\n },\n onEnd: () => {\n const wasPending = forcePending;\n forcePending = false;\n pathsDirty = true;\n if (!userMoved && followLayout) {\n needsFit = true;\n // nothing was shown yet: appear fitted, otherwise glide to the fit\n fitAnimate = !wasPending;\n }\n followLayout = false;\n emitLayoutEnd();\n invalidate();\n },\n });\n };\n\n const emitLayoutEnd = () => {\n // after the current call stack (listeners may call the instance)\n void Promise.resolve().then(() => {\n if (!destroyed) emit(\"layoutEnd\", { layout: layoutType });\n });\n };\n\n const runLayout = (prev: Map<string, Snapshot>, animate: boolean) => {\n stopRunner();\n const previousType = layoutType;\n layoutType = resolveLayout(options.layout);\n direction = options.direction ?? (layoutType === \"tree\" ? \"LR\" : \"TB\");\n if (previousType !== layoutType) needsFit = true;\n const n = model.n;\n tree = null;\n dag = null;\n circ = null;\n\n let depth: Int32Array | null = null;\n if (layoutType === \"mindmap\") {\n const ones = new Float64Array(n).fill(1);\n depth = tidyTreeLayout(treeInput(\"mindmap\", ones, ones, 1)).depth;\n }\n sizing = computeSizing(\n model,\n layoutType,\n options,\n depth,\n measure,\n theme.fontFamily,\n );\n const nextVisible = new Uint8Array(n).fill(1);\n let tx2: Float64Array = new Float64Array(n);\n let ty2: Float64Array = new Float64Array(n);\n\n switch (layoutType) {\n case \"dag\": {\n const d = options.dag ?? {};\n dag = layeredLayout({\n n,\n source: model.source,\n target: model.target,\n width: sizing.width,\n height: sizing.height,\n direction,\n layerGap: d.layerGap ?? 56,\n nodeGap: d.nodeGap ?? 24,\n sweeps: d.sweeps ?? 8,\n });\n tx2 = dag.x;\n ty2 = dag.y;\n break;\n }\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n case \"org\": {\n const type = layoutType as TreeType;\n const levelGap =\n options.tree?.levelGap ??\n Math.max(TREE_LEVEL_GAP[type], sizing.levelGap);\n tree = tidyTreeLayout(\n treeInput(type, sizing.layoutWidth, sizing.layoutHeight, levelGap),\n );\n tx2 = tree.x;\n ty2 = tree.y;\n nextVisible.set(tree.visible);\n break;\n }\n case \"circular\":\n case \"arc\": {\n let spacing = 0;\n for (let i = 0; i < n; i++)\n spacing = Math.max(\n spacing,\n sizing.layoutWidth[i] + (layoutType === \"arc\" ? 8 : 10),\n );\n const input = {\n n,\n source: model.source,\n target: model.target,\n group: model.groupOf,\n order: options.circular?.order ?? \"group\",\n spacing: Math.max(layoutType === \"arc\" ? 16 : 18, spacing),\n };\n circ =\n layoutType === \"arc\" ? arcPositions(input) : circularPositions(input);\n tx2 = circ.x;\n ty2 = circ.y;\n break;\n }\n case \"none\": {\n model.nodes.forEach((node, i) => {\n const p = prev.get(node.id);\n tx2[i] = Number.isFinite(node.x) ? node.x! : (p?.x ?? 0);\n ty2[i] = Number.isFinite(node.y) ? node.y! : (p?.y ?? 0);\n });\n break;\n }\n default:\n break;\n }\n\n const oldVisible = new Uint8Array(n);\n for (let i = 0; i < n; i++)\n oldVisible[i] = prev.get(model.nodes[i].id)?.visible ? 1 : 0;\n visible = nextVisible;\n descendants = countDescendants();\n\n if (layoutType === \"force\") {\n startForce(prev);\n tween = null;\n prevVisible = null;\n } else {\n TX = tx2;\n TY = ty2;\n X = new Float64Array(n);\n Y = new Float64Array(n);\n const ms = animate && prev.size ? animationMs() : 0;\n if (ms > 0) {\n FX = new Float64Array(n);\n FY = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const p = prev.get(model.nodes[i].id);\n if (p && p.visible) {\n FX[i] = p.x;\n FY[i] = p.y;\n continue;\n }\n // entering nodes grow out of their closest previously shown ancestor\n let a = tree ? tree.parent[i] : -1;\n let from: Snapshot | undefined;\n while (a >= 0 && !(from = prev.get(model.nodes[a].id))?.visible)\n a = tree!.parent[a];\n FX[i] = from?.visible ? from.x : TX[i];\n FY[i] = from?.visible ? from.y : TY[i];\n }\n X.set(FX);\n Y.set(FY);\n prevVisible = oldVisible;\n tween = { start: now(), duration: ms };\n tweenT = 0;\n } else {\n X.set(TX);\n Y.set(TY);\n tween = null;\n prevVisible = null;\n }\n }\n if (!userMoved) {\n needsFit = true;\n fitAnimate = prev.size > 0 && animate && layoutType !== \"force\";\n }\n refreshCritical();\n refreshColors();\n edgeLabelWidth = new Float64Array(model.m).fill(NaN);\n edgeGrid = null;\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n updateAccessibility();\n renderLegend();\n invalidate();\n if (layoutType !== \"force\") emitLayoutEnd();\n };\n\n const countDescendants = () => {\n const counts = new Int32Array(model.n);\n if (!tree) return counts;\n const order: number[] = [];\n tree.parent.forEach((p, i) => {\n if (p < 0) order.push(i);\n });\n for (let q = 0; q < order.length; q++)\n order.push(...tree.children[order[q]]);\n for (let q = order.length - 1; q >= 0; q--) {\n const v = order[q];\n const p = tree.parent[v];\n if (p >= 0) counts[p] += counts[v] + 1;\n }\n return counts;\n };\n\n const refreshCritical = () => {\n critical = null;\n const option = options.dag?.criticalPath;\n if (!option || layoutType !== \"dag\") return;\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (option === true) {\n const path = longestPath(model.n, model.source, model.target, (i) => {\n const v = model.nodes[i].value;\n return Number.isFinite(v) && v! >= 0 ? v! : 1;\n });\n path.nodes.forEach((i) => (nodes[i] = 1));\n path.edges.forEach((e) => (edges[e] = 1));\n } else {\n const ids = option.map((id) => model.index.get(id) ?? -1);\n ids.forEach((i) => {\n if (i >= 0) nodes[i] = 1;\n });\n for (let e = 0; e < model.m; e++) {\n const s = ids.indexOf(model.source[e]);\n if (s >= 0 && ids[s + 1] === model.target[e]) edges[e] = 1;\n }\n }\n critical = { nodes, edges };\n };\n\n // ------------------------------------------------------------- colors\n\n const refreshColors = () => {\n const bg = theme.background;\n dark = isDark(theme);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n groupColor = model.groups.map((g, i) =>\n g.color\n ? resolveColor(g.color, palette[i % palette.length])\n : palette[i % palette.length],\n );\n criticalColor = resolveColor(\n options.dag?.criticalColor ?? \"var(--danger-color, #ef4444)\",\n [0.94, 0.27, 0.27, 1],\n );\n // mind maps color each branch\n const branch = new Int32Array(model.n).fill(-1);\n if (layoutType === \"mindmap\" && tree) {\n const roots: number[] = [];\n tree.parent.forEach((p, i) => p < 0 && roots.push(i));\n const firstLevel = roots.length\n ? [...tree.children[roots[0]], ...roots.slice(1)]\n : [];\n firstLevel.forEach((c, b) => {\n const stack = [c];\n while (stack.length) {\n const v = stack.pop()!;\n branch[v] = b;\n stack.push(...tree!.children[v]);\n }\n });\n }\n nodeColor = model.nodes.map((node, i) => {\n if (node.color) return resolveColor(node.color, theme.primary);\n const g = model.groupOf[i];\n if (g >= 0) return groupColor[g];\n if (branch[i] >= 0) return palette[(branch[i] + 1) % palette.length];\n return theme.primary;\n });\n const neutral = mix(bg, theme.textMuted, dark ? 0.42 : 0.36);\n const mode = options.edgeColor ?? \"neutral\";\n const wOption = options.edgeWidth;\n const eRange = model.edgeValueRange;\n const [wMin, wMax] = Array.isArray(wOption)\n ? (wOption as readonly [number, number])\n : typeof wOption === \"number\"\n ? [wOption, wOption]\n : eRange && eRange[1] > eRange[0]\n ? [1, 5]\n : [1.25, 1.25];\n edgeColor = [];\n edgeWidth = new Float64Array(model.m);\n edgeArrow = new Uint8Array(model.m);\n edgeDashed = new Uint8Array(model.m);\n const arrows = options.arrows ?? layoutType === \"dag\";\n model.edges.forEach((edge, e) => {\n const s = model.source[e];\n const t = model.target[e];\n let c = neutral;\n if (edge.color) c = resolveColor(edge.color, neutral);\n else if (mode === \"source\") c = mix(bg, nodeColor[s], 0.55);\n else if (mode === \"target\") c = mix(bg, nodeColor[t], 0.55);\n else if (layoutType === \"mindmap\") c = mix(bg, nodeColor[t], 0.7);\n edgeColor.push(c);\n let w = wMin;\n if (Number.isFinite(edge.width) && edge.width! > 0) w = edge.width!;\n else if (eRange && eRange[1] > eRange[0] && Number.isFinite(edge.value))\n w =\n wMin +\n (wMax - wMin) *\n Math.sqrt((edge.value! - eRange[0]) / (eRange[1] - eRange[0]));\n else if (layoutType === \"mindmap\" && tree && wOption === undefined)\n w = Math.max(1.25, 3.4 - tree.depth[t] * 0.75);\n edgeWidth[e] = w;\n edgeArrow[e] = (edge.directed ?? arrows) ? 1 : 0;\n edgeDashed[e] = edge.dashed ? 1 : 0;\n });\n sceneDirty = true;\n };\n\n // --------------------------------------------------------------- paths\n\n const fade = (i: number): number => {\n if (forcePending) return 0;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) return 0;\n const v = visible[i];\n const p = prevVisible ? prevVisible[i] : v;\n if (tween) {\n if (v && p) return 1;\n if (v) return tweenT;\n if (p) return 1 - tweenT;\n return 0;\n }\n return v;\n };\n\n const isBox = (i: number) => sizing.kind[i] !== NodeKind.Circle;\n\n /** Port of a node on the flow axis (sign +1 = outgoing side) */\n const port = (\n i: number,\n vertical: boolean,\n sign: number,\n ): [number, number] =>\n vertical\n ? [X[i], Y[i] + (sign * sizing.height[i]) / 2]\n : [X[i] + (sign * sizing.width[i]) / 2, Y[i]];\n\n const flow = (): { vertical: boolean; sign: number } => {\n const d = layoutType === \"org\" ? \"TB\" : direction;\n return {\n vertical: layoutType !== \"mindmap\" && (d === \"TB\" || d === \"BT\"),\n sign: d === \"BT\" || d === \"RL\" ? -1 : 1,\n };\n };\n\n const trimmed = (\n points: number[],\n s: number,\n t: number,\n arrow: boolean,\n ): number[] => {\n if (points.length < 4) return points;\n const [ux, uy] = [points[2] - points[0], points[3] - points[1]];\n const l0 = Math.hypot(ux, uy) || 1;\n const [ex, ey] = endDirection(points);\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux / l0,\n uy / l0,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ex, ey) +\n (arrow ? 1 : 0);\n return trimPath(points, a, b);\n };\n\n /** Direction of the self-loops of a node: the middle of its widest free angle */\n const loopAngle = (i: number): number => {\n const angles: number[] = [];\n // the label of a circle sits below it: keep that side free too\n if (sizing.kind[i] === NodeKind.Circle && options.nodeLabels !== false)\n angles.push(Math.PI / 2);\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (j === i || fade(j) <= 0) continue;\n const dx = X[j] - X[i];\n const dy = Y[j] - Y[i];\n if (dx * dx + dy * dy > 1e-12) angles.push(Math.atan2(dy, dx));\n }\n if (!angles.length) return -Math.PI / 2;\n angles.sort((a, b) => a - b);\n const end = angles[angles.length - 1];\n let best = angles[0] + Math.PI * 2 - end;\n let angle = end + best / 2;\n for (let k = 1; k < angles.length; k++) {\n const gap = angles[k] - angles[k - 1];\n if (gap > best + 1e-9) {\n best = gap;\n angle = angles[k - 1] + gap / 2;\n }\n }\n return angle;\n };\n\n /** Reach of the self-loops of a node beyond its boundary */\n const loopSize = (i: number) =>\n Math.max(\n 12,\n Math.min(40, Math.min(sizing.width[i], sizing.height[i]) * 0.9),\n );\n\n /** Free room from the side of node i towards an axis direction (a side of a flow layout) */\n const roomTowards = (i: number, ax: number, ay: number): number => {\n const horizontal = Math.abs(ax) > 0.5;\n const extent = (j: number) =>\n horizontal ? sizing.width[j] / 2 : sizing.height[j] / 2;\n const across = (j: number) =>\n horizontal ? sizing.height[j] / 2 : sizing.width[j] / 2;\n let room = Infinity;\n const check = (px: number, py: number, along: number, side: number) => {\n const dx = px - X[i];\n const dy = py - Y[i];\n const d = dx * ax + dy * ay;\n if (d <= 0 || Math.abs(dx * ay - dy * ax) >= across(i) + side + 4) return;\n room = Math.min(room, d - extent(i) - along);\n };\n for (let j = 0; j < model.n; j++) {\n if (j !== i && fade(j) > 0) check(X[j], Y[j], extent(j), across(j));\n }\n // long DAG edges pass their dummy waypoints\n if (dag && !tween) {\n for (const route of dag.routes) {\n for (let k = 2; k < route.length - 2; k += 2)\n check(route[k], route[k + 1], 0, 0);\n }\n }\n return room;\n };\n\n /**\n * Direction and size of the self-loops of a node: flow layouts put them on\n * a side across the flow (routes come in and leave along it), the one with\n * more room, sized to fit; other layouts use the widest free angle\n */\n const loopPlacement = (i: number): [number, number] => {\n const base = loopSize(i);\n if (layoutType !== \"dag\" && (!isTree() || layoutType === \"radial\"))\n return [loopAngle(i), base];\n const { vertical } = flow();\n // org columns hang from a bus on their left\n const sides =\n layoutType === \"org\" && tree?.stacked[i]\n ? [0]\n : vertical\n ? [0, Math.PI]\n : [-Math.PI / 2, Math.PI / 2];\n const labelBelow =\n sizing.kind[i] === NodeKind.Circle && options.nodeLabels !== false;\n let angle = sides[0];\n let room = -Infinity;\n for (const a of sides) {\n let r =\n model.n > LOOP_SCAN_MAX\n ? Infinity\n : roomTowards(i, Math.round(Math.cos(a)), Math.round(Math.sin(a)));\n if (a > 0 && !vertical && labelBelow) r -= 18;\n if (r > room) {\n room = r;\n angle = a;\n }\n }\n let outer = 0;\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n if (model.source[e] === model.target[e])\n outer = Math.max(outer, model.bend[e]);\n }\n return [angle, Math.min(base, Math.max(8, (room - 6) / (1 + 0.6 * outer)))];\n };\n\n /** Self-loop of an edge whose ends are the same node */\n const loopOf = (e: number): number[] => {\n const i = model.source[e];\n const [angle, size] = loopPlacement(i);\n const w = sizing.width[i];\n const h = sizing.height[i];\n const reach = size * (1 + 0.6 * model.bend[e]);\n const gap = edgeArrow[e] ? 1 : 0;\n if (isBox(i)) {\n // anchored on a side (wide cards would hide a center-based teardrop)\n return boxLoopPath(\n X[i],\n Y[i],\n w,\n h,\n angle,\n reach,\n Math.max(10, size * 0.8) * (1 + 0.35 * model.bend[e]),\n gap,\n );\n }\n const at = (a: number) =>\n boundaryDistance(false, w, h, Math.cos(a), Math.sin(a));\n return loopPath(\n X[i],\n Y[i],\n angle,\n at(angle - 0.42),\n at(angle + 0.42) + gap,\n reach,\n );\n };\n\n /** Port offset along a node side of `side` units, for a parallel slot */\n const portShift = (side: number, slot: number) =>\n slot * Math.min(PORT_GAP, side / (2 * Math.abs(slot) + 2));\n\n /**\n * Fans a flow route (waypoints from the source to the target boundary) out\n * for a parallel slot: the ends move along the node sides (separate ports),\n * the inner waypoints sideways (separate lanes); a direct spline gets a\n * bulging middle waypoint. The slot counts towards + x (vertical flows) or\n * + y, the same for both directions, so opposite edges get other sides\n */\n const fanOut = (\n pts: readonly number[],\n s: number,\n t: number,\n vertical: boolean,\n slot: number,\n lens: boolean,\n ): number[] => {\n const out = pts.slice();\n const last = out.length - 2;\n const b = vertical ? 0 : 1;\n const end = (k: number, i: number) => {\n const side = vertical ? sizing.width[i] : sizing.height[i];\n const o = portShift(side, slot);\n out[k + b] += o;\n if (!isBox(i)) {\n // stay on the circle\n const c = vertical ? Y[i] : X[i];\n const d = 1 - b;\n const r = side / 2;\n out[k + d] =\n c +\n (out[k + d] >= c ? 1 : -1) * Math.sqrt(Math.max(0, r * r - o * o));\n }\n };\n for (let k = 2; k < last; k += 2) out[k + b] += slot * WAYPOINT_GAP;\n end(0, s);\n end(last, t);\n if (lens && out.length === 4) {\n const mid = [(out[0] + out[2]) / 2, (out[1] + out[3]) / 2];\n mid[b] = (pts[b] + pts[2 + b]) / 2 + slot * LENS_GAP;\n out.splice(2, 0, mid[0], mid[1]);\n }\n return out;\n };\n\n /** Polyline of a curved edge (straight edges are built on the fly) */\n const edgePath = (e: number, style: GraphEdgeStyle): number[] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const arrow = !!edgeArrow[e];\n if (s === t) return loopOf(e);\n // parallel edges: their own offsets (NaN: a single edge)\n const bend = model.bend[e];\n const parallel = Number.isFinite(bend);\n if (layoutType === \"arc\") {\n // higher and lower arcs, by slot from the lower to the higher index\n const rise = parallel ? 1 + 0.25 * (s < t ? bend : -bend) : 1;\n return trimmed(arcPath(X[s], X[t], Y[s], rise), s, t, arrow);\n }\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const bow = parallel ? bend * PARALLEL_BOW : 0;\n if (style === \"straight\") {\n if (!bow) return null;\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * bow, my + dx * bow, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"circular\" && style === \"curve\") {\n const tension = Math.max(\n 0,\n Math.min(1, options.circular?.tension ?? 0.8),\n );\n const cx = ((X[s] + X[t]) / 2) * (1 - tension) - dy * bow;\n const cy = ((Y[s] + Y[t]) / 2) * (1 - tension) + dx * bow;\n return trimmed(\n quadraticPath(X[s], Y[s], cx, cy, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"radial\" && style === \"spline\") {\n const rs = Math.hypot(X[s], Y[s]);\n const rt = Math.hypot(X[t], Y[t]);\n const as = Math.atan2(Y[s], X[s]);\n const at = Math.atan2(Y[t], X[t]);\n const rm = (rs + rt) / 2;\n const out = [X[s], Y[s]];\n cubicPoints(\n out,\n X[s],\n Y[s],\n rs < 1e-6 ? X[s] : rm * Math.cos(as),\n rs < 1e-6 ? Y[s] : rm * Math.sin(as),\n rm * Math.cos(at),\n rm * Math.sin(at),\n X[t],\n Y[t],\n );\n return trimmed(out, s, t, arrow);\n }\n if (style === \"spline\" || style === \"orthogonal\") {\n const f = flow();\n let sign = f.sign;\n if (layoutType === \"mindmap\") sign = X[t] >= X[s] ? 1 : -1;\n const route = dag && !tween ? dag.routes[e] : null;\n let pts: number[];\n if (route && route.length >= 4) pts = route;\n else {\n const along = f.vertical ? Y[t] - Y[s] : X[t] - X[s];\n const dir =\n layoutType === \"mindmap\" ? sign : along * sign >= 0 ? sign : -sign;\n pts = [...port(s, f.vertical, dir), ...port(t, f.vertical, -dir)];\n }\n // parallel edges (either direction): own ports, lanes and bulges\n const slot = parallel ? (s < t ? bend : -bend) : 0;\n if (slot) pts = fanOut(pts, s, t, f.vertical, slot, style === \"spline\");\n if (style === \"orthogonal\") {\n if (layoutType === \"org\" && tree?.stacked[t] && tree.parent[t] === s) {\n // compact column: down from the parent, along a bus on the left\n // (parallel edges nest: the right port turns lower, keeps the inner bus and enters higher)\n const bottom = Y[s] + sizing.height[s] / 2;\n const left = X[t] - sizing.width[t] / 2;\n const sx = X[s] + portShift(sizing.width[s], slot);\n const ty = Y[t] - portShift(sizing.height[t], slot);\n const bus = left - 10 + slot * 3;\n const mid = bottom + 14 + slot * 4;\n return roundCorners(\n [sx, bottom, sx, mid, bus, mid, bus, ty, left, ty],\n 6,\n );\n }\n if (layoutType === \"org\" && pts.length === 4 && !slot) {\n const mid = (pts[1] + pts[3]) / 2;\n return roundCorners(\n [pts[0], pts[1], pts[0], mid, pts[2], mid, pts[2], pts[3]],\n 6,\n );\n }\n return orthogonalPath(\n pts,\n f.vertical,\n layoutType === \"org\" ? 6 : 8,\n slot * LANE_GAP,\n );\n }\n return splinePath(pts, f.vertical);\n }\n // curve\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n const c = parallel ? bow : 0.18;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * c, my + dx * c, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n };\n\n const refreshPaths = () => {\n const style = edgeStyle();\n paths = new Array(model.m);\n for (let e = 0; e < model.m; e++) {\n paths[e] =\n fade(model.source[e]) > 0 && fade(model.target[e]) > 0\n ? edgePath(e, style)\n : null;\n }\n pathsDirty = false;\n geometryVersion++;\n };\n\n /** Ends of a straight edge, trimmed at the node boundaries */\n const straightEnds = (e: number): [number, number, number, number] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const len = Math.hypot(dx, dy);\n if (len < 1e-9) return null;\n const ux = dx / len;\n const uy = dy / len;\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux,\n uy,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ux, uy) +\n (edgeArrow[e] ? 1 : 0);\n if (a + b >= len) return null;\n return [X[s] + ux * a, Y[s] + uy * a, X[t] - ux * b, Y[t] - uy * b];\n };\n\n // ------------------------------------------------------------ highlight\n\n const updateHighlight = () => {\n const sources =\n hover?.type === \"node\"\n ? [hover.index]\n : focusIndex >= 0\n ? [focusIndex]\n : [...selection];\n const mode = highlightMode();\n const edgeHover = hover?.type === \"edge\" ? hover.index : -1;\n const key = `${mode}|${sources.join(\",\")}|${edgeHover}`;\n if (key === highlightKey) return;\n highlightKey = key;\n sceneDirty = true;\n if ((mode === \"none\" || !sources.length) && edgeHover < 0) {\n highlight = null;\n return;\n }\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (mode !== \"none\") {\n for (const s of sources) {\n if (mode === \"lineage\") lineage(model, s, nodes, edges);\n else neighborhood(model, s, nodes, edges);\n }\n }\n if (edgeHover >= 0) {\n edges[edgeHover] = 1;\n nodes[model.source[edgeHover]] = 1;\n nodes[model.target[edgeHover]] = 1;\n }\n const accent =\n mode === \"lineage\" || sources.length !== 1\n ? theme.primary\n : nodeColor[sources[0]];\n highlight = { nodes, edges, accent: accent ?? theme.primary };\n };\n\n // --------------------------------------------------------------- scene\n\n const buildScene = (): RenderItem[] => {\n version++;\n const bg = theme.background;\n const out: RenderItem[] = [];\n const style = edgeStyle();\n const minPx = model.n > 2000 ? 2 : 3;\n const hl = highlight;\n\n // ----- edges: three layers (dimmed, normal, highlighted)\n const layers = [\n new Map<string, { color: Rgba; width: number; buf: PointBuffer }>(),\n new Map(),\n new Map(),\n ] as Map<string, { color: Rgba; width: number; buf: PointBuffer }>[];\n const bucket = (layer: number, color: Rgba, w: number) => {\n const key = `${packColor(color)}|${Math.round(w * 4)}`;\n let b = layers[layer].get(key);\n if (!b) {\n b = { color, width: w, buf: pointBuffer() };\n layers[layer].set(key, b);\n }\n return b.buf;\n };\n const arrowLen = (w: number) => (6 + w * 1.6) / k;\n const filledLen = (w: number) => (8 + w * 2.2) / k;\n const filled = options.arrowStyle === \"filled\";\n // filled heads: flat area triangles per layer and color, outlined by a\n // thin line (anti-aliased edges on every backend)\n const heads = [new Map(), new Map(), new Map()] as Map<\n number,\n { color: Rgba; points: number[] }\n >[];\n const tmp: number[] = [];\n const head = (\n buf: PointBuffer,\n layer: number,\n color: Rgba,\n w: number,\n x: number,\n y: number,\n ux: number,\n uy: number,\n ) => {\n tmp.length = 0;\n if (!filled) {\n arrowHead(tmp, x, y, ux, uy, arrowLen(w), GAP);\n buf.pushAll(tmp);\n return;\n }\n const key = packColor(color);\n let h = heads[layer].get(key);\n if (!h) {\n h = { color, points: [] };\n heads[layer].set(key, h);\n }\n filledArrow(h.points, tmp, x, y, ux, uy, filledLen(w), GAP);\n bucket(layer, color, Math.min(w, 1)).pushAll(tmp);\n };\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n let color = edgeColor[e];\n let w = edgeWidth[e];\n let layer = 1;\n if (critical?.edges[e]) {\n color = criticalColor;\n w += 1;\n }\n if (hl) {\n if (hl.edges[e]) {\n layer = 2;\n if (!critical?.edges[e]) color = mix(bg, hl.accent, 0.9);\n w += 0.75;\n } else {\n layer = 0;\n color = mix(bg, color, 0.22);\n }\n }\n if (f < 1) color = mix(bg, color, f);\n const buf = bucket(layer, color, w);\n let points: number[] | null = paths[e] ?? null;\n if (!points) {\n if (style !== \"straight\" || layoutType === \"arc\") continue;\n const ends = straightEnds(e);\n if (!ends) continue;\n if (!edgeDashed[e] && !(filled && edgeArrow[e])) {\n buf.push(ends[0], ends[1]);\n buf.push(ends[2], ends[3]);\n buf.push(GAP, GAP);\n if (edgeArrow[e]) {\n const l = Math.hypot(ends[2] - ends[0], ends[3] - ends[1]) || 1;\n head(\n buf,\n layer,\n color,\n w,\n ends[2],\n ends[3],\n (ends[2] - ends[0]) / l,\n (ends[3] - ends[1]) / l,\n );\n }\n continue;\n }\n points = [ends[0], ends[1], ends[2], ends[3]];\n }\n if (points.length < 4) continue;\n let line = points;\n // a filled head covers the end: the line stops at its notch\n if (filled && edgeArrow[e])\n line = trimPath(points.slice(), 0, filledLen(w) * 0.72);\n if (edgeDashed[e]) buf.pushAll(dashPath(line, 5 / k, 4 / k, GAP));\n else {\n buf.pushAll(line);\n buf.push(GAP, GAP);\n }\n if (edgeArrow[e]) {\n const [ux, uy] = endDirection(points);\n head(\n buf,\n layer,\n color,\n w,\n points[points.length - 2],\n points[points.length - 1],\n ux,\n uy,\n );\n }\n }\n layers.forEach((map, layer) => {\n for (const [key, b] of map) {\n if (b.buf.count() < 2) continue;\n const item: LineItem = {\n kind: \"line\",\n key: `edges:${layer}:${key}`,\n version,\n color: b.color,\n points: b.buf.points(),\n count: b.buf.count(),\n width: b.width,\n sorted: false,\n };\n out.push(item);\n }\n for (const [key, h] of heads[layer]) {\n const item: AreaItem = {\n kind: \"area\",\n key: `heads:${layer}:${key}`,\n version,\n color: h.color,\n points: Float32Array.from(h.points),\n count: h.points.length / AREA_STRIDE,\n opacity: 1,\n sorted: false,\n flat: true,\n };\n out.push(item);\n }\n });\n\n // ----- nodes\n const nodeFill = (i: number, f: number): Rgba => {\n let c = nodeColor[i];\n if (hl && !hl.nodes[i]) c = mix(bg, c, 0.2);\n return f < 1 ? mix(bg, c, f) : c;\n };\n const halo: number[] = [];\n const fills: number[] = [];\n const rings: number[] = [];\n const collapsedFill: number[] = [];\n const selRings: number[] = [];\n const avatars: number[] = [];\n const boxBuckets = new Map<\n string,\n { half: number; inset: number; border: number[]; fill: number[] }\n >();\n const outlines = new Map<string, number[]>();\n const radiusPx =\n layoutType === \"mindmap\"\n ? 999\n : Math.max(\n 1,\n Math.min(\n layoutType === \"org\" ? 10 : 8,\n (layoutType === \"org\" ? 10 : 7) * k,\n ),\n );\n const showHalo = model.n <= HALO_LIMIT;\n for (const i of drawOrder()) {\n const f = fade(i);\n if (f <= 0) continue;\n const x = X[i];\n const y = Y[i];\n const color = nodeFill(i, f);\n const selected = selection.has(i);\n const hovered = hover?.type === \"node\" && hover.index === i;\n if (sizing.kind[i] === NodeKind.Circle) {\n const d = Math.max(minPx, sizing.width[i] * k);\n if (showHalo) halo.push(x, y, d + 3, packColor(bg));\n const isCollapsed =\n collapsible() && tree && descendants[i] > 0 && !hasVisibleChild(i);\n if (isCollapsed) {\n collapsedFill.push(x, y, d, packColor(color));\n } else fills.push(x, y, d, packColor(color));\n if (selected) selRings.push(x, y, d + 7, packColor(theme.primary));\n else if (hovered)\n rings.push(x, y, d + 6, packColor(mix(bg, nodeColor[i], 0.7)));\n continue;\n }\n // boxes\n const w = sizing.width[i];\n const h = sizing.height[i];\n const solid = sizing.kind[i] === NodeKind.Solid;\n const crit = !!critical?.nodes[i];\n let border = solid ? color : mix(bg, color, crit ? 1 : dark ? 0.62 : 0.5);\n let body = solid ? color : mix(bg, color, dark ? 0.2 : 0.09);\n if (crit) border = mix(bg, criticalColor, f);\n if (hl && !hl.nodes[i]) {\n body = mix(bg, body, 0.5);\n if (!solid) border = mix(bg, border, 0.4);\n }\n const key = `${Math.round(w * 2) / 2}|${crit ? 2 : 1.25}`;\n let b = boxBuckets.get(key);\n if (!b) {\n b = { half: w / 2, inset: crit ? 2 : 1.25, border: [], fill: [] };\n boxBuckets.set(key, b);\n }\n b.border.push(x, y - h / 2, y + h / 2, packColor(border));\n b.fill.push(x, y - h / 2, y + h / 2, packColor(body));\n if (selected || hovered) {\n const pad = (selected ? 3 : 2.5) / k;\n const okey = `${Math.round((w / 2 + pad) * 64)}`;\n let list = outlines.get(okey);\n if (!list) outlines.set(okey, (list = []));\n list.push(\n w / 2 + pad,\n x,\n y - h / 2 - pad,\n y + h / 2 + pad,\n packColor(selected ? theme.primary : mix(bg, nodeColor[i], 0.55)),\n );\n }\n if (sizing.kind[i] === NodeKind.Card && w * k >= 96) {\n avatars.push(\n x - w / 2 + 26,\n y,\n Math.min(32, h - 16) * k,\n packColor(color),\n );\n }\n }\n const scatter = (\n key: string,\n data: number[],\n opacity: number,\n stroke: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: ScatterItem = {\n kind: \"scatter\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n opacity,\n stroke,\n };\n out.push(item);\n };\n const bars = (\n key: string,\n data: number[],\n half: number,\n inset: number,\n radius: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * BAR_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: BarItem = {\n kind: \"bar\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n halfWidth: half,\n radius,\n inset,\n minHalf: 0,\n sorted: false,\n };\n out.push(item);\n };\n scatter(\"halo\", halo, 1, 0);\n scatter(\"nodes\", fills, 1, 0);\n scatter(\"collapsed\", collapsedFill, 0.28, 2);\n scatter(\"hover-rings\", rings, 0, 2);\n scatter(\"selection\", selRings, 0, 2.25);\n for (const [key, list] of outlines) {\n const data: number[] = [];\n for (let j = 0; j < list.length; j += 5)\n data.push(list[j + 1], list[j + 2], list[j + 3], list[j + 4]);\n bars(\n `outline:${key}`,\n data,\n list[0],\n 0,\n radiusPx === 999 ? 999 : radiusPx + 3,\n );\n }\n for (const [key, b] of boxBuckets) {\n bars(`border:${key}`, b.border, b.half, 0, radiusPx);\n bars(\n `fill:${key}`,\n b.fill,\n b.half,\n b.inset,\n radiusPx === 999 ? 999 : Math.max(0, radiusPx - 1),\n );\n }\n scatter(\"avatars\", avatars, 1, 0);\n return out;\n };\n\n /** Hovered / selected nodes last (on top) */\n const drawOrder = (): number[] => {\n const order: number[] = [];\n const late: number[] = [];\n for (let i = 0; i < model.n; i++) {\n if (\n selection.has(i) ||\n (hover?.type === \"node\" && hover.index === i) ||\n i === focusIndex\n )\n late.push(i);\n else order.push(i);\n }\n return order.concat(late);\n };\n\n const hasVisibleChild = (i: number) =>\n !!tree && tree.children[i].some((c) => visible[c]);\n\n // -------------------------------------------------------------- frame\n\n function invalidate() {\n if (destroyed || frameId || !win) return;\n frameId = win.requestAnimationFrame(frame);\n }\n\n const transform = () => ({\n xScale: (2 * k) / width,\n xOffset: (2 * tx) / width - 1,\n yScale: (-2 * k) / height,\n yOffset: 1 - (2 * ty) / height,\n });\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const w = stage.clientWidth;\n const h = stage.clientHeight;\n if (w <= 0 || h <= 0) return;\n if (w !== width || h !== height) {\n width = w;\n height = h;\n if (!userMoved) needsFit = true;\n sceneDirty = true;\n }\n const dpr = win?.devicePixelRatio || 1;\n let animating = false;\n\n let follow = false;\n if (runner?.running()) {\n runner.step(8);\n pathsDirty = true;\n animating = runner.running() && !runner.threaded();\n follow = runner.running() && followLayout && !userMoved && !forcePending;\n }\n if (tween) {\n const t = Math.min(\n 1,\n (now() - tween.start) / Math.max(1, tween.duration),\n );\n tweenT = ease(t);\n for (let i = 0; i < model.n; i++) {\n X[i] = FX[i] + (TX[i] - FX[i]) * tweenT;\n Y[i] = FY[i] + (TY[i] - FY[i]) * tweenT;\n }\n if (t >= 1) {\n tween = null;\n prevVisible = null;\n tweenT = 1;\n }\n pathsDirty = true;\n animating = true;\n }\n if (needsFit) {\n needsFit = false;\n const target = fitView();\n if (target && fitAnimate && drawnOnce && !reducedMotion?.matches) {\n viewTween = { from: [k, tx, ty], to: target, start: now() };\n } else if (target) [k, tx, ty] = target;\n fitAnimate = false;\n sceneDirty = true;\n } else if (follow) {\n // glide toward the fit of the expanding layout (the final fit animates\n // once it has settled)\n const target = fitView();\n if (target) {\n viewTween = null;\n if (!drawnOnce || reducedMotion?.matches) [k, tx, ty] = target;\n else if (approachView(target, 0.25)) animating = true;\n sceneDirty = true;\n }\n }\n if (viewTween) {\n const t = Math.min(1, (now() - viewTween.start) / VIEW_TWEEN_MS);\n const e = ease(t);\n const [k0, x0, y0] = viewTween.from;\n const [k1, x1, y1] = viewTween.to;\n const kk = k0 * Math.pow(k1 / k0, e);\n // keep the zoom geometric and the screen center consistent\n const c0x = (width / 2 - x0) / k0;\n const c0y = (height / 2 - y0) / k0;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const cx = c0x + (c1x - c0x) * e;\n const cy = c0y + (c1y - c0y) * e;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n if (t >= 1) {\n [k, tx, ty] = viewTween.to;\n viewTween = null;\n }\n sceneDirty = true;\n animating = true;\n }\n if (pathsDirty) {\n refreshPaths();\n sceneDirty = true;\n }\n updateHighlight();\n if (renderer) {\n if (sceneDirty) {\n items = forcePending ? [] : buildScene();\n sceneDirty = false;\n }\n const bw = Math.max(1, Math.round(w * dpr));\n const bh = Math.max(1, Math.round(h * dpr));\n if (renderer.canvas.width !== bw || renderer.canvas.height !== bh)\n renderer.resize(bw, bh);\n renderer.canvas.style.width = `${w}px`;\n renderer.canvas.style.height = `${h}px`;\n renderer.render(items, {\n transform: transform(),\n width: bw,\n height: bh,\n dpr,\n });\n drawnOnce = true;\n }\n sizeCanvas(dom.foreground, w, h, dpr);\n drawOverlay(dpr);\n if (hover) positionTooltip();\n if (animating) invalidate();\n }\n\n // ------------------------------------------------------------ overlay\n\n const screenX = (i: number) => X[i] * k + tx;\n const screenY = (i: number) => Y[i] * k + ty;\n\n const ellipsize = (\n ctx: CanvasRenderingContext2D,\n text: string,\n max: number,\n ) => {\n if (max <= 8) return \"\";\n if (ctx.measureText(text).width <= max) return text;\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (ctx.measureText(`${text.slice(0, mid)}…`).width <= max) lo = mid;\n else hi = mid - 1;\n }\n return lo ? `${text.slice(0, lo)}…` : \"\";\n };\n\n const textColorOn = (c: Rgba): string =>\n luminance(c) > 0.6 ? \"#111827\" : \"#ffffff\";\n\n const drawOverlay = (dpr: number) => {\n const ctx = dom.foreground.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (forcePending || !model.n) return;\n const family = theme.fontFamily;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const hl = highlight;\n const cell = 8;\n const cols = Math.ceil(width / cell) + 1;\n const rows = Math.ceil(height / cell) + 1;\n const grid = new Uint8Array(cols * rows);\n const free = (\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n mark: boolean,\n ) => {\n const c0 = Math.max(0, Math.floor(x0 / cell));\n const c1 = Math.min(cols - 1, Math.floor(x1 / cell));\n const r0 = Math.max(0, Math.floor(y0 / cell));\n const r1 = Math.min(rows - 1, Math.floor(y1 / cell));\n if (c0 > c1 || r0 > r1) return false;\n if (!mark) {\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) if (grid[r * cols + c]) return false;\n return true;\n }\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) grid[r * cols + c] = 1;\n return true;\n };\n const onScreen = (sx: number, sy: number, margin: number) =>\n sx > -margin &&\n sy > -margin &&\n sx < width + margin &&\n sy < height + margin;\n\n // ----- text inside boxes: a readable minimum size, shortened with an\n // ellipsis; hidden only when the box cannot hold any text\n const showBoxText = options.nodeLabels !== false;\n for (let i = 0; i < model.n; i++) {\n if (sizing.kind[i] === NodeKind.Circle) continue;\n const f = fade(i);\n if (f <= 0) continue;\n const sx = screenX(i);\n const sy = screenY(i);\n const bw = sizing.width[i] * k;\n const bh = sizing.height[i] * k;\n if (!onScreen(sx, sy, Math.max(bw, bh))) continue;\n free(sx - bw / 2, sy - bh / 2, sx + bw / 2, sy + bh / 2, true);\n const natural = sizing.font[i] * k;\n const size = Math.max(BOX_FONT_MIN, natural);\n const node = model.nodes[i];\n const dim = hl && !hl.nodes[i];\n ctx.globalAlpha = f * (dim ? 0.45 : 1);\n const solid = sizing.kind[i] === NodeKind.Solid;\n const card = sizing.kind[i] === NodeKind.Card;\n const avatar = card && bw >= 96;\n if (showBoxText && bh >= size + 1) {\n const left = avatar ? sx - bw / 2 + 48 * k : sx;\n const maxWidth = avatar ? bw - 56 * k : bw - Math.max(4, 12 * k);\n ctx.textAlign = avatar ? \"left\" : \"center\";\n ctx.textBaseline = \"middle\";\n // the subtitle needs room for both lines\n const subSize = Math.max(BOX_FONT_MIN - 0.5, natural * 0.88);\n const gap = Math.max(2, natural * 0.6);\n const block = size + gap + subSize;\n const subtitle = node.subtitle && block <= bh - 4 ? node.subtitle : \"\";\n const titleY = subtitle ? sy - block / 2 + size / 2 : sy;\n ctx.font = `${sizing.weight[i]} ${size}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : text;\n const label = ellipsize(ctx, labelOf(model, i), maxWidth);\n if (label) ctx.fillText(label, left, titleY);\n if (subtitle && label) {\n ctx.font = `${subSize}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : muted;\n const sub = ellipsize(ctx, subtitle, maxWidth);\n if (sub) ctx.fillText(sub, left, sy + block / 2 - subSize / 2);\n }\n }\n if (avatar) {\n const initial = Array.from(labelOf(model, i).trim())[0] ?? \"\";\n ctx.textAlign = \"center\";\n ctx.font = `600 ${Math.max(8, 13 * k)}px ${family}`;\n ctx.fillStyle = textColorOn(nodeColor[i]);\n ctx.fillText(initial.toUpperCase(), sx - bw / 2 + 26 * k, sy);\n }\n // collapse badge of boxes\n if (collapsible() && tree && tree.children[i].length) {\n const collapsed = !hasVisibleChild(i);\n const active =\n (hover?.type === \"node\" && hover.index === i) || focusIndex === i;\n if (collapsed || active) {\n const vertical = layoutType === \"org\";\n const out =\n layoutType === \"mindmap\" ? (tree.side[i] < 0 ? -1 : 1) : 1;\n const bx = vertical ? sx : sx + out * (bw / 2 + 9);\n const by = vertical ? sy + bh / 2 + 9 : sy;\n const label2 = collapsed ? String(descendants[i]) : \"−\";\n ctx.font = `600 10px ${family}`;\n const r = Math.max(8, ctx.measureText(label2).width / 2 + 5);\n ctx.globalAlpha = f;\n ctx.beginPath();\n ctx.fillStyle = bgCss;\n ctx.strokeStyle = toCss(mix(theme.background, nodeColor[i], 0.75));\n ctx.lineWidth = 1.25;\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(bx - r, by - 8, r * 2, 16, 8);\n else ctx.rect(bx - r, by - 8, r * 2, 16);\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = text;\n ctx.textAlign = \"center\";\n ctx.fillText(label2, bx, by + 0.5);\n }\n }\n }\n ctx.globalAlpha = 1;\n\n // ----- labels of circles\n const mode = options.nodeLabels ?? \"auto\";\n const priority = (i: number) =>\n selection.has(i) ||\n i === focusIndex ||\n (hover?.type === \"node\" && hover.index === i) ||\n (!!hl && !!hl.nodes[i]);\n const drawn = new Uint8Array(model.n);\n let budget = 700;\n const drawLabel = (i: number, force: boolean) => {\n if (drawn[i] || sizing.kind[i] !== NodeKind.Circle || mode === false)\n return;\n const f = fade(i);\n if (f <= 0) return;\n const sx = screenX(i);\n const sy = screenY(i);\n if (!onScreen(sx, sy, 160)) return;\n const r = Math.max(model.n > 2000 ? 1 : 1.5, (sizing.width[i] * k) / 2);\n // tiny nodes of networks lose their label first (other layouts rely on the collisions)\n const network = layoutType === \"force\" || layoutType === \"none\";\n if (!force && mode === \"auto\" && network && r * 2 < 5) return;\n const strong = priority(i);\n const dim = hl && !hl.nodes[i];\n const raw = labelOf(model, i);\n const tw = Math.min(180, sizing.labelWidth[i] * (strong ? 1.06 : 1));\n const place = placement(i, sx, sy, r);\n // collision box: the whole label, or its start for rotated labels\n let bx0: number;\n let by0: number;\n let bx1: number;\n let by1: number;\n if (place.angle !== 0) {\n const cx =\n place.x + Math.cos(place.angle) * (place.align === \"left\" ? 7 : -7);\n const cy =\n place.y + Math.sin(place.angle) * (place.align === \"left\" ? 7 : -7);\n bx0 = cx - 6;\n bx1 = cx + 6;\n by0 = cy - 6;\n by1 = cy + 6;\n } else {\n bx0 =\n place.align === \"left\"\n ? place.x\n : place.align === \"right\"\n ? place.x - tw\n : place.x - tw / 2;\n bx1 = bx0 + tw;\n by0 =\n place.baseline === \"top\"\n ? place.y\n : place.baseline === \"bottom\"\n ? place.y - 14\n : place.y - 7;\n by1 = by0 + 14;\n }\n if (!force && !free(bx0 - 2, by0, bx1 + 2, by1, false)) return;\n free(bx0 - 2, by0, bx1 + 2, by1, true);\n drawn[i] = 1;\n budget--;\n ctx.save();\n ctx.globalAlpha = f * (dim ? 0.35 : 1);\n ctx.font = `${strong ? 600 : 400} ${LABEL_FONT_SIZE}px ${family}`;\n ctx.textAlign = place.align;\n ctx.textBaseline = place.baseline;\n ctx.translate(place.x, place.y);\n if (place.angle) ctx.rotate(place.angle);\n const label = sizing.labelWidth[i] > 180 ? ellipsize(ctx, raw, 180) : raw;\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3;\n ctx.strokeStyle = bgCss;\n ctx.strokeText(label, 0, 0);\n ctx.fillStyle = strong ? text : dim ? muted : text;\n ctx.fillText(label, 0, 0);\n ctx.restore();\n };\n for (let i = 0; i < model.n; i++) if (priority(i)) drawLabel(i, true);\n\n // ----- edge labels\n const edgeMode = options.edgeLabels ?? \"auto\";\n if (edgeMode !== false) {\n ctx.font = `11px ${family}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n let shownEdges = 0;\n for (let e = 0; e < model.m && shownEdges < 400; e++) {\n const label = model.edges[e].label;\n if (!label) continue;\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n const lit = !!hl?.edges[e];\n if (edgeMode === \"hover\" && !lit) continue;\n if (edgeMode === \"auto\" && !lit && (k < 0.75 || (hl && !lit))) continue;\n let mx: number;\n let my: number;\n const path = paths[e];\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0] * k + tx;\n my = p[1] * k + ty;\n if (s === t) {\n // beyond the far end of a loop (the pill would hide it)\n const dx = mx - (X[s] * k + tx);\n const dy = my - (Y[s] * k + ty);\n const l = Math.hypot(dx, dy) || 1;\n mx += (dx / l) * 10;\n my += (dy / l) * 10;\n }\n } else {\n mx = ((X[s] + X[t]) / 2) * k + tx;\n my = ((Y[s] + Y[t]) / 2) * k + ty;\n }\n if (!onScreen(mx, my, 40)) continue;\n if (Number.isNaN(edgeLabelWidth[e]))\n edgeLabelWidth[e] = ctx.measureText(label).width;\n const lw = edgeLabelWidth[e] + 10;\n if (!lit && !free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, false))\n continue;\n free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, true);\n shownEdges++;\n ctx.globalAlpha = f;\n ctx.fillStyle = bgCss;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(mx - lw / 2, my - 8, lw, 16, 8);\n else ctx.rect(mx - lw / 2, my - 8, lw, 16);\n ctx.fill();\n if (lit) {\n ctx.strokeStyle = toCss(\n mix(theme.background, highlight?.accent ?? theme.primary, 0.6),\n );\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n ctx.fillStyle = lit ? text : muted;\n ctx.fillText(label, mx, my + 0.5);\n }\n ctx.globalAlpha = 1;\n }\n\n // ----- other labels, most important first\n if (mode !== false) {\n const all = mode === true;\n for (let r = 0; r < model.rank.length && budget > 0; r++) {\n const i = model.rank[r];\n drawLabel(i, false);\n if (!all && r > 4000) break;\n }\n }\n\n // ----- keyboard focus ring\n if (focusVisible && focusIndex >= 0 && fade(focusIndex) > 0) {\n const sx = screenX(focusIndex);\n const sy = screenY(focusIndex);\n ctx.save();\n ctx.strokeStyle = toCss(theme.primary);\n ctx.lineWidth = 2;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (sizing.kind[focusIndex] === NodeKind.Circle) {\n const r = Math.max(3, (sizing.width[focusIndex] * k) / 2) + 6;\n ctx.arc(sx, sy, r, 0, Math.PI * 2);\n } else {\n const bw = sizing.width[focusIndex] * k + 10;\n const bh = sizing.height[focusIndex] * k + 10;\n ctx.rect(sx - bw / 2, sy - bh / 2, bw, bh);\n }\n ctx.stroke();\n ctx.restore();\n }\n };\n\n /** Where the label of a circle goes */\n const placement = (\n i: number,\n sx: number,\n sy: number,\n r: number,\n ): {\n x: number;\n y: number;\n align: CanvasTextAlign;\n baseline: CanvasTextBaseline;\n angle: number;\n } => {\n const below = {\n x: sx,\n y: sy + r + 3,\n align: \"center\" as const,\n baseline: \"top\" as const,\n angle: 0,\n };\n const radial = (a: number) => {\n const flip = Math.cos(a) < 0;\n return {\n x: sx + Math.cos(a) * (r + 4),\n y: sy + Math.sin(a) * (r + 4),\n align: (flip ? \"right\" : \"left\") as CanvasTextAlign,\n baseline: \"middle\" as const,\n angle: flip ? a + Math.PI : a,\n };\n };\n switch (layoutType) {\n case \"tree\": {\n const inner = hasVisibleChild(i);\n if (direction === \"LR\" || direction === \"RL\") {\n const right = (direction === \"LR\") !== inner;\n return {\n x: sx + (right ? r + 5 : -r - 5),\n y: sy,\n align: right ? \"left\" : \"right\",\n baseline: \"middle\",\n angle: 0,\n };\n }\n if (direction === \"BT\")\n return {\n x: sx,\n y: sy - r - 3,\n align: \"center\",\n baseline: \"bottom\",\n angle: 0,\n };\n return below;\n }\n case \"radial\":\n // inner nodes: horizontal label below (their children fan out around them)\n if (\n tree &&\n (hasVisibleChild(i) ||\n (tree.depth[i] === 0 && Math.hypot(X[i], Y[i]) < 1e-6))\n )\n return below;\n return radial(tree ? tree.side[i] : 0);\n case \"circular\":\n return radial(circ ? circ.angle[i] : 0);\n case \"arc\":\n return {\n x: sx,\n y: sy + r + 4,\n align: \"left\",\n baseline: \"middle\",\n angle: Math.PI / 2,\n };\n default:\n return below;\n }\n };\n\n // ----------------------------------------------------------------- fit\n\n const fitView = (): [number, number, number] | null => {\n if (width <= 0 || height <= 0) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let maxLabel = 0;\n for (let i = 0; i < model.n; i++) {\n if (!visible[i] || !Number.isFinite(TX[i])) continue;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) continue;\n const hw = sizing.width[i] / 2;\n const hh = sizing.height[i] / 2;\n x0 = Math.min(x0, TX[i] - hw);\n x1 = Math.max(x1, TX[i] + hw);\n y0 = Math.min(y0, TY[i] - hh);\n y1 = Math.max(y1, TY[i] + hh);\n if (sizing.kind[i] === NodeKind.Circle)\n maxLabel = Math.max(maxLabel, sizing.labelWidth[i]);\n }\n if (!(x0 <= x1)) return null;\n // arcs rise above the line by half their span\n if (layoutType === \"arc\") {\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n if (!visible[s] || !visible[t]) continue;\n const b = model.bend[e];\n const rise = s !== t && Number.isFinite(b) ? 1 + 0.25 * Math.abs(b) : 1;\n y0 = Math.min(y0, TY[s] - (Math.abs(TX[t] - TX[s]) / 2) * rise);\n }\n }\n // self-loops stick out of their node\n if (model.hasLoops) {\n for (let e = 0; e < model.m; e++) {\n const i = model.source[e];\n if (i !== model.target[e] || !visible[i]) continue;\n const [a, size] = loopPlacement(i);\n const reach =\n Math.max(sizing.width[i], sizing.height[i]) / 2 +\n size * (1 + 0.6 * model.bend[e]);\n const lx = TX[i] + Math.cos(a) * reach;\n const ly = TY[i] + Math.sin(a) * reach;\n x0 = Math.min(x0, lx - size / 2);\n x1 = Math.max(x1, lx + size / 2);\n y0 = Math.min(y0, ly - size / 2);\n y1 = Math.max(y1, ly + size / 2);\n }\n }\n const pad = options.fitPadding ?? 24;\n let [pl, pr, pt, pb] = [pad, pad, pad, pad];\n const label =\n options.nodeLabels === false ? 0 : Math.min(140, maxLabel) + 8;\n const circles = sizing.kind.some((c) => c === NodeKind.Circle);\n if (circles && label > 8) {\n if (layoutType === \"tree\" && (direction === \"LR\" || direction === \"RL\")) {\n // leaves are labeled outside, inner nodes (the roots first) inside\n let inner = 0;\n for (let i = 0; i < model.n; i++) {\n if (tree && tree.parent[i] < 0 && visible[i] && hasVisibleChild(i))\n inner = Math.max(inner, Math.min(140, sizing.labelWidth[i]) + 8);\n }\n if (direction === \"LR\") {\n pr += label;\n pl += inner;\n } else {\n pl += label;\n pr += inner;\n }\n } else if (layoutType === \"radial\" || layoutType === \"circular\") {\n pl += label;\n pr += label;\n pt += label * 0.6;\n pb += label * 0.6;\n } else if (layoutType === \"arc\") pb += label;\n else pb += 16;\n }\n if (layoutType === \"org\" || layoutType === \"mindmap\") pb += 10;\n const aw = Math.max(10, width - pl - pr);\n const ah = Math.max(10, height - pt - pb);\n const bw = Math.max(1e-6, x1 - x0);\n const bh = Math.max(1e-6, y1 - y0);\n const range = interaction()?.zoomRange ?? [0.02, 8];\n let kk = Math.min(aw / bw, ah / bh, 1.6, range[1]);\n kk = Math.max(kk, 1e-4);\n const ox = pl + (aw - bw * kk) / 2 - x0 * kk;\n const oy = pt + (ah - bh * kk) / 2 - y0 * kk;\n return [kk, ox, oy];\n };\n\n const zoomLimits = (): [number, number] => {\n const range = interaction()?.zoomRange ?? [0.02, 8];\n const fit = fitView();\n return [Math.min(range[0], fit ? fit[0] * 0.5 : range[0]), range[1]];\n };\n\n /**\n * Moves the view a `rate` of the way to `to` (geometric zoom, consistent\n * center); `true` while it has not arrived yet\n */\n const approachView = (to: [number, number, number], rate: number) => {\n const [k1, x1, y1] = to;\n const c0x = (width / 2 - tx) / k;\n const c0y = (height / 2 - ty) / k;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const far =\n Math.abs(Math.log(k1 / k)) > 0.002 ||\n Math.hypot(c1x - c0x, c1y - c0y) * k1 > 0.5;\n if (!far) {\n [k, tx, ty] = to;\n return false;\n }\n const kk = k * Math.pow(k1 / k, rate);\n const cx = c0x + (c1x - c0x) * rate;\n const cy = c0y + (c1y - c0y) * rate;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n return true;\n };\n\n const setView = (next: [number, number, number], animate: boolean) => {\n viewTween = null;\n if (animate && !reducedMotion?.matches && width > 0) {\n viewTween = { from: [k, tx, ty], to: next, start: now() };\n } else {\n [k, tx, ty] = next;\n }\n sceneDirty = true;\n invalidate();\n };\n\n const zoomAround = (\n factor: number,\n cx: number,\n cy: number,\n animate = false,\n ) => {\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, k * factor));\n const ratio = nk / k;\n setView([nk, cx - (cx - tx) * ratio, cy - (cy - ty) * ratio], animate);\n userMoved = true;\n };\n\n // ------------------------------------------------------------- legend\n\n let legendKey = \"\";\n const renderLegend = () => {\n const o = options.legend;\n const named = model.groups.filter((g) => g.count > 0);\n const show = o === undefined ? named.length > 1 : !!o && named.length > 0;\n const config = typeof o === \"object\" ? o : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n let key = `${show}|${bottom}|${toggle}`;\n if (show) {\n for (const g of named) {\n const i = model.groups.indexOf(g);\n key += `\\n${g.id}\\u0001${g.name}\\u0001${toCss(groupColor[i] ?? theme.primary)}\\u0001${hiddenGroups.has(g.id)}`;\n }\n }\n if (key === legendKey) return;\n legendKey = key;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n for (const g of named) {\n const i = model.groups.indexOf(g);\n const hidden = hiddenGroups.has(g.id);\n const item = doc.createElement(toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!hidden));\n item.addEventListener(\"click\", () => toggleGroup(g.id));\n }\n style(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: hidden ? \"0.45\" : \"1\",\n textDecoration: hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(doc, toCss(groupColor[i] ?? theme.primary)),\n doc.createTextNode(g.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const toggleGroup = (id: string) => {\n const g = model.groups.find((group) => group.id === id);\n if (!g) return;\n const hidden = !hiddenGroups.has(id);\n if (hidden) hiddenGroups.add(id);\n else hiddenGroups.delete(id);\n dom.live.textContent = fill(hidden ? loc.labels.hidden : loc.labels.shown, {\n name: g.name,\n });\n // hidden nodes leave the selection and the focus\n for (const i of [...selection])\n if (\n fade(i) <= 0 &&\n model.groupOf[i] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[i]].id)\n )\n selection.delete(i);\n if (\n focusIndex >= 0 &&\n model.groupOf[focusIndex] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[focusIndex]].id)\n )\n focusIndex = -1;\n if (hover) setHover(null);\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n renderLegend();\n invalidate();\n emit(\"groupToggle\", { group: id, hidden });\n };\n\n // ------------------------------------------------------ accessibility\n\n const updateAccessibility = () => {\n const { labels, count } = loc;\n const role =\n layoutType === \"dag\" ? labels.dag : isTree() ? labels.tree : labels.chart;\n stage.setAttribute(\"aria-roledescription\", role);\n stage.setAttribute(\"aria-label\", options.ariaLabel ?? role);\n const keyboard = interaction()?.keyboard;\n if (keyboard) stage.tabIndex = 0;\n else stage.removeAttribute(\"tabindex\");\n const ia = interaction();\n stage.style.cursor = ia?.pan ? \"grab\" : \"default\";\n const lines = [\n fill(labels.summary, { nodes: count(model.n), edges: count(model.m) }),\n ];\n const names = model.groups.filter((g) => g.count > 0).map((g) => g.name);\n if (names.length)\n lines.push(\n fill(labels.groupsSummary, {\n groups: names.join(labels.listSeparator),\n }),\n );\n if (keyboard) lines.push(labels.keyboardHelp);\n dom.summary.textContent = lines.join(\" \");\n const controls = options.controls !== false && !!ia?.zoom;\n dom.controls.style.display = controls ? \"flex\" : \"none\";\n dom.zoomIn.setAttribute(\"aria-label\", labels.zoomIn);\n dom.zoomIn.title = labels.zoomIn;\n dom.zoomOut.setAttribute(\"aria-label\", labels.zoomOut);\n dom.zoomOut.title = labels.zoomOut;\n dom.fit.setAttribute(\"aria-label\", labels.fit);\n dom.fit.title = labels.fit;\n };\n\n // ------------------------------------------------------------- picking\n\n let pickGrid: Map<number, number[]> | null = null;\n let pickCell = 32;\n let maxExtent = 0;\n const pickKey = (cx: number, cy: number) =>\n (cx + 2097152) * 4194304 + (cy + 2097152);\n\n const buildPickGrid = () => {\n maxExtent = 0;\n for (let i = 0; i < model.n; i++)\n maxExtent = Math.max(maxExtent, sizing.width[i], sizing.height[i]);\n pickCell = Math.max(16, maxExtent);\n const grid = new Map<number, number[]>();\n for (let i = 0; i < model.n; i++) {\n if (fade(i) <= 0) continue;\n const key = pickKey(\n Math.floor(X[i] / pickCell),\n Math.floor(Y[i] / pickCell),\n );\n let list = grid.get(key);\n if (!list) grid.set(key, (list = []));\n list.push(i);\n }\n pickGrid = grid;\n };\n\n const pickNode = (px: number, py: number): number => {\n if (forcePending || !model.n) return -1;\n buildPickGrid();\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 3 / k;\n const minR = (model.n > 2000 ? 1 : 1.5) / k;\n const reach = Math.ceil((maxExtent / 2 + tol + minR) / pickCell);\n const cx = Math.floor(wx / pickCell);\n const cy = Math.floor(wy / pickCell);\n let best = -1;\n let bestD = Infinity;\n for (let oy = -reach; oy <= reach; oy++) {\n for (let ox = -reach; ox <= reach; ox++) {\n const list = pickGrid!.get(pickKey(cx + ox, cy + oy));\n if (!list) continue;\n for (const i of list) {\n const dx = wx - X[i];\n const dy = wy - Y[i];\n if (sizing.kind[i] === NodeKind.Circle) {\n const r = Math.max(sizing.width[i] / 2, minR) + tol;\n const d = dx * dx + dy * dy;\n if (d <= r * r && d <= bestD) {\n best = i;\n bestD = d;\n }\n } else if (\n Math.abs(dx) <= sizing.width[i] / 2 + tol &&\n Math.abs(dy) <= sizing.height[i] / 2 + tol\n ) {\n const d = dx * dx + dy * dy;\n if (d <= bestD) {\n best = i;\n bestD = d;\n }\n }\n }\n }\n }\n return best;\n };\n\n const pickEdge = (px: number, py: number): number => {\n if (forcePending) return -1;\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 4 / k;\n let best = -1;\n let bestD = tol * tol;\n const test = (e: number) => {\n if (Math.min(fade(model.source[e]), fade(model.target[e])) <= 0) return;\n let points: readonly number[] | null = paths[e] ?? null;\n if (!points) {\n const ends = straightEnds(e);\n if (!ends) return;\n points = ends;\n }\n const d = distanceToPath(points, wx, wy);\n if (d <= bestD) {\n best = e;\n bestD = d;\n }\n };\n if (model.m < EDGE_INDEX_MIN) {\n for (let e = 0; e < model.m; e++) test(e);\n return best;\n }\n const index = edgeIndex();\n if (!index) return -1;\n // candidates from the buckets around the pointer, exact distances\n const { cell, x0, y0, cols, rows, start, items, stamp } = index;\n const c0 = Math.max(0, Math.floor((wx - tol - x0) / cell));\n const c1 = Math.min(cols - 1, Math.floor((wx + tol - x0) / cell));\n const r0 = Math.max(0, Math.floor((wy - tol - y0) / cell));\n const r1 = Math.min(rows - 1, Math.floor((wy + tol - y0) / cell));\n const visit = ++index.visit;\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const b = r * cols + c;\n for (let q = start[b]; q < start[b + 1]; q++) {\n const e = items[q];\n if (stamp[e] === visit) continue;\n stamp[e] = visit;\n test(e);\n }\n }\n }\n return best;\n };\n\n // ---- spatial index of the edges (large graphs): every segment is\n // registered in the grid cells it crosses (CSR typed arrays)\n interface EdgeIndex {\n cell: number;\n x0: number;\n y0: number;\n cols: number;\n rows: number;\n start: Int32Array;\n items: Int32Array;\n stamp: Int32Array;\n visit: number;\n geometry: number;\n built: number;\n }\n let edgeGrid: EdgeIndex | null = null;\n\n const edgeIndex = (): EdgeIndex | null => {\n const current = edgeGrid;\n if (current && current.geometry === geometryVersion) return current;\n // a layout still moving: the last index stays good enough for the\n // candidates for a moment (the distances are always exact)\n if (current && runner?.running() && now() - current.built < 250)\n return current;\n const m = model.m;\n const segment = (e: number): readonly number[] | null =>\n Math.min(fade(model.source[e]), fade(model.target[e])) <= 0\n ? null\n : (paths[e] ?? straightEnds(e));\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let length = 0;\n let segments = 0;\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 0; i < p.length; i += 2) {\n x0 = Math.min(x0, p[i]);\n x1 = Math.max(x1, p[i]);\n y0 = Math.min(y0, p[i + 1]);\n y1 = Math.max(y1, p[i + 1]);\n if (i) length += Math.hypot(p[i] - p[i - 2], p[i + 1] - p[i - 1]);\n }\n segments += p.length / 2 - 1;\n }\n if (!(x0 <= x1 && y0 <= y1)) return null;\n // about two cells per segment on average, at most 512 x 512 cells\n const span = Math.max(x1 - x0, y1 - y0, 1e-6);\n const cell = Math.max(\n span / 512,\n (length / Math.max(1, segments)) * 0.5,\n 1e-6,\n );\n const cols = Math.min(512, Math.floor((x1 - x0) / cell) + 1);\n const rows = Math.min(512, Math.floor((y1 - y0) / cell) + 1);\n const counts = new Int32Array(cols * rows + 1);\n const register = (pass: (b: number, e: number) => void) => {\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 2; i < p.length; i += 2) {\n // long segments are walked in steps of one cell\n const ax = p[i - 2];\n const ay = p[i - 1];\n const steps = Math.max(\n 1,\n Math.ceil(Math.hypot(p[i] - ax, p[i + 1] - ay) / cell),\n );\n let prev = -1;\n for (let s = 0; s < steps; s++) {\n const bx0 = ax + ((p[i] - ax) * s) / steps;\n const by0 = ay + ((p[i + 1] - ay) * s) / steps;\n const bx1 = ax + ((p[i] - ax) * (s + 1)) / steps;\n const by1 = ay + ((p[i + 1] - ay) * (s + 1)) / steps;\n const c0 = Math.floor((Math.min(bx0, bx1) - x0) / cell);\n const c1 = Math.floor((Math.max(bx0, bx1) - x0) / cell);\n const r0 = Math.floor((Math.min(by0, by1) - y0) / cell);\n const r1 = Math.floor((Math.max(by0, by1) - y0) / cell);\n for (let r = Math.max(0, r0); r <= Math.min(rows - 1, r1); r++) {\n for (let c = Math.max(0, c0); c <= Math.min(cols - 1, c1); c++) {\n const b = r * cols + c;\n // consecutive pieces mostly share their cell\n if (b === prev) continue;\n prev = b;\n pass(b, e);\n }\n }\n }\n }\n }\n };\n register((b) => counts[b + 1]++);\n for (let b = 0; b < cols * rows; b++) counts[b + 1] += counts[b];\n const items = new Int32Array(counts[cols * rows]);\n const cursor = counts.slice(0, cols * rows);\n register((b, e) => {\n items[cursor[b]++] = e;\n });\n edgeGrid = {\n cell,\n x0,\n y0,\n cols,\n rows,\n start: counts,\n items,\n stamp: new Int32Array(m),\n visit: 0,\n geometry: geometryVersion,\n built: now(),\n };\n return edgeGrid;\n };\n\n const pickAt = (px: number, py: number): Hit | null => {\n const i = pickNode(px, py);\n if (i >= 0) return { type: \"node\", index: i };\n const wantsEdges =\n tooltipEnabled() || listening(\"hover\") || listening(\"click\");\n const e = wantsEdges ? pickEdge(px, py) : -1;\n return e >= 0 ? { type: \"edge\", index: e } : null;\n };\n\n // -------------------------------------------------------------- events\n\n const tooltipEnabled = () => options.tooltip !== false;\n\n const hoverEvent = (hit: Hit): GraphHoverEvent => {\n const offsetX = stage.offsetLeft;\n const offsetY = stage.offsetTop;\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n const g = model.groupOf[i];\n return {\n type: \"node\",\n id: node.id,\n node,\n index: model.nodeInput[i],\n group: g >= 0 ? model.groups[g].id : undefined,\n color: toCss(nodeColor[i]),\n degree: model.inDegree[i] + model.outDegree[i],\n clientX: screenX(i) + offsetX,\n clientY: screenY(i) + offsetY,\n };\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const path = paths[e];\n let mx = (X[s] + X[t]) / 2;\n let my = (Y[s] + Y[t]) / 2;\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0];\n my = p[1];\n }\n return {\n type: \"edge\",\n id: `${edge.source}→${edge.target}`,\n edge,\n index: model.edgeInput[e],\n color: toCss(edgeColor[e]),\n clientX: mx * k + tx + offsetX,\n clientY: my * k + ty + offsetY,\n };\n };\n\n const sameHit = (a: Hit | null, b: Hit | null) =>\n a === b || (!!a && !!b && a.type === b.type && a.index === b.index);\n\n const setHover = (hit: Hit | null) => {\n if (sameHit(hit, hover)) {\n if (hit) positionTooltip();\n return;\n }\n hover = hit;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n emit(\"hover\", hit ? hoverEvent(hit) : null);\n };\n\n const tooltipTarget = (): Hit | null =>\n hover ??\n (focusVisible && focusIndex >= 0\n ? { type: \"node\", index: focusIndex }\n : null);\n\n const renderTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || !tooltipEnabled()) {\n tip.style.display = \"none\";\n return;\n }\n const event = hoverEvent(hit);\n const custom =\n typeof options.tooltip === \"object\" ? options.tooltip.render : undefined;\n const content = custom ? custom(event) : defaultTooltip(hit);\n if (content === null) {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n positionTooltip();\n };\n\n const positionTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || tip.style.display === \"none\") return;\n let ax: number;\n let ay: number;\n let gap = 14;\n if (hit.type === \"node\") {\n ax = screenX(hit.index);\n ay = screenY(hit.index);\n gap += (Math.max(sizing.width[hit.index], 0) * k) / 2;\n } else {\n const ev = hoverEvent(hit);\n ax = ev.clientX - stage.offsetLeft;\n ay = ev.clientY - stage.offsetTop;\n }\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let x = ax + gap;\n if (x + tw > width - 4) x = ax - gap - tw;\n x = Math.max(4, Math.min(width - tw - 4, x));\n const y = Math.max(4, Math.min(height - th - 4, ay - th / 2));\n tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;\n };\n\n const row = (name: string, value: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n });\n const n = style(doc.createElement(\"span\"), {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = name;\n const v = style(doc.createElement(\"span\"), {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = value;\n el.append(n, v);\n return el;\n };\n\n const header = (color: string, title: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"2px\",\n color: \"var(--text-color, #1f2937)\",\n });\n el.append(swatch(doc, color), doc.createTextNode(title));\n return el;\n };\n\n const defaultTooltip = (hit: Hit): Node => {\n const { labels } = loc;\n const fragment = doc.createDocumentFragment();\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n fragment.append(header(toCss(nodeColor[i]), labelOf(model, i)));\n if (node.subtitle) {\n const sub = style(doc.createElement(\"div\"), {\n color: \"var(--text-secondary-color, #6b7280)\",\n marginBottom: \"2px\",\n });\n sub.textContent = node.subtitle;\n fragment.append(sub);\n }\n const g = model.groupOf[i];\n if (g >= 0) fragment.append(row(labels.group, model.groups[g].name));\n if (Number.isFinite(node.value))\n fragment.append(row(labels.value, loc.value(node.value!)));\n const directed =\n layoutType === \"dag\" ||\n options.arrows ||\n model.edges.some((e) => e.directed);\n if (directed && !isTree()) {\n fragment.append(row(labels.incoming, loc.count(model.inDegree[i])));\n fragment.append(row(labels.outgoing, loc.count(model.outDegree[i])));\n } else if (!isTree()) {\n fragment.append(\n row(labels.degree, loc.count(model.inDegree[i] + model.outDegree[i])),\n );\n }\n if (isTree() && descendants[i] > 0 && !hasVisibleChild(i))\n fragment.append(row(labels.hiddenChildren, loc.count(descendants[i])));\n if (critical?.nodes[i]) {\n // a badge: full subtle border, tinted fill and a colored dot\n const color = toCss(criticalColor);\n const tag = style(doc.createElement(\"div\"), {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n marginTop: \"4px\",\n padding: \"0 8px\",\n borderRadius: \"999px\",\n border: `1px solid color-mix(in srgb, ${color} 35%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n lineHeight: \"18px\",\n });\n tag.className = \"minerva-chart-badge\";\n const dot = swatch(doc, color);\n style(dot, { width: \"7px\", height: \"7px\" });\n tag.append(dot, doc.createTextNode(labels.critical));\n fragment.append(tag);\n }\n return fragment;\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const arrow = edgeArrow[e] ? \" → \" : \" — \";\n fragment.append(\n header(\n toCss(edgeColor[e]),\n `${labelOf(model, s)}${arrow}${labelOf(model, t)}`,\n ),\n );\n if (edge.label) {\n const el = doc.createElement(\"div\");\n el.textContent = edge.label;\n fragment.append(el);\n }\n if (Number.isFinite(edge.value))\n fragment.append(row(labels.value, loc.value(edge.value!)));\n return fragment;\n };\n\n let hoverFrame = 0;\n let pendingHover: { x: number; y: number } | null = null;\n const scheduleHover = (x: number, y: number) => {\n pendingHover = { x, y };\n if (hoverFrame || !win) return;\n hoverFrame = win.requestAnimationFrame(() => {\n hoverFrame = 0;\n const p = pendingHover;\n pendingHover = null;\n if (!p || destroyed || drag) return;\n const hit = pickAt(p.x, p.y);\n setHover(hit);\n stage.style.cursor =\n hit?.type === \"node\"\n ? \"pointer\"\n : interaction()?.pan\n ? \"grab\"\n : \"default\";\n });\n };\n\n // --------------------------------------------------------- selection\n\n const setSelection = (next: Set<number>, notify: boolean) => {\n const same =\n next.size === selection.size && [...next].every((i) => selection.has(i));\n if (same) return;\n selection.clear();\n next.forEach((i) => selection.add(i));\n sceneDirty = true;\n invalidate();\n dom.live.textContent = selection.size\n ? fill(loc.labels.selected, { count: loc.count(selection.size) })\n : loc.labels.selectionCleared;\n if (notify)\n emit(\"select\", { ids: [...selection].map((i) => model.nodes[i].id) });\n };\n\n const selectNode = (i: number, additive: boolean) => {\n const ia = interaction();\n if (!ia?.select) return;\n const multi = ia.select === \"multiple\" || additive;\n const next = new Set(multi ? selection : []);\n if (multi && next.has(i)) next.delete(i);\n else next.add(i);\n setSelection(next, true);\n };\n\n // ------------------------------------------------------ collapse\n\n const setCollapsed = (i: number, collapse: boolean, notify: boolean) => {\n if (!tree || !tree.children[i]?.length) return false;\n const id = model.nodes[i].id;\n if (collapse === collapsedIds.has(id)) return false;\n if (collapse) collapsedIds.add(id);\n else collapsedIds.delete(id);\n const prev = snapshot();\n runLayout(prev, true);\n // hidden nodes leave the selection\n const kept = new Set([...selection].filter((j) => visible[j]));\n if (kept.size !== selection.size) setSelection(kept, true);\n if (focusIndex >= 0 && !visible[focusIndex]) focusIndex = i;\n dom.live.textContent = collapse\n ? fill(loc.labels.collapsed, {\n name: labelOf(model, i),\n count: loc.count(descendants[i]),\n })\n : fill(loc.labels.expanded, { name: labelOf(model, i) });\n if (notify) emit(\"toggle\", { id, collapsed: collapse });\n return true;\n };\n\n // -------------------------------------------------------- interaction\n\n interface DragState {\n mode: \"node\" | \"pan\" | \"pinch\";\n index: number;\n origin: { x: number; y: number };\n view: [number, number, number];\n offset: [number, number];\n distance: number;\n moved: boolean;\n button: number;\n }\n let drag: DragState | null = null;\n const pointers = new Map<number, { x: number; y: number }>();\n\n const local = (e: { clientX: number; clientY: number }) => {\n const r = stage.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n const pinchInfo = () => {\n const pts = [...pointers.values()];\n const a = pts[0] ?? { x: 0, y: 0 };\n const b = pts[1] ?? a;\n return {\n distance: Math.hypot(a.x - b.x, a.y - b.y),\n center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n };\n };\n\n const onPointerDown = (e: PointerEvent) => {\n const ia = interaction();\n if (!ia) return;\n if ((e.target as Element | null)?.closest?.(\"button\")) return;\n const p = local(e);\n pointers.set(e.pointerId, p);\n stage.setPointerCapture?.(e.pointerId);\n viewTween = null;\n if (pointers.size === 2 && (ia.zoom || ia.pan)) {\n const { distance, center } = pinchInfo();\n drag = {\n mode: \"pinch\",\n index: -1,\n origin: center,\n view: [k, tx, ty],\n offset: [0, 0],\n distance,\n moved: true,\n button: 0,\n };\n return;\n }\n if (pointers.size > 1) return;\n const i = e.button === 0 ? pickNode(p.x, p.y) : -1;\n const base = {\n origin: p,\n view: [k, tx, ty] as [number, number, number],\n distance: 0,\n moved: false,\n button: e.button,\n };\n if (i >= 0 && ia.drag) {\n drag = {\n ...base,\n mode: \"node\",\n index: i,\n offset: [(p.x - tx) / k - X[i], (p.y - ty) / k - Y[i]],\n };\n } else {\n drag = { ...base, mode: \"pan\", index: i, offset: [0, 0] };\n }\n if (e.button === 1) e.preventDefault();\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const p = local(e);\n if (pointers.has(e.pointerId)) pointers.set(e.pointerId, p);\n if (!drag) {\n if (e.pointerType === \"touch\" && pointers.size) return;\n scheduleHover(p.x, p.y);\n return;\n }\n const ia = interaction();\n if (!ia) return;\n if (drag.mode === \"pinch\") {\n const { distance, center } = pinchInfo();\n const [k0, x0, y0] = drag.view;\n const [lo, hi] = zoomLimits();\n const scale = ia.zoom && drag.distance > 0 ? distance / drag.distance : 1;\n const nk = Math.max(lo, Math.min(hi, k0 * scale));\n const ratio = nk / k0;\n const ox = drag.origin.x;\n const oy = drag.origin.y;\n const nx = ia.pan ? center.x : ox;\n const ny = ia.pan ? center.y : oy;\n k = nk;\n tx = nx - (ox - x0) * ratio;\n ty = ny - (oy - y0) * ratio;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n return;\n }\n const dx = p.x - drag.origin.x;\n const dy = p.y - drag.origin.y;\n if (!drag.moved && Math.hypot(dx, dy) < 3) return;\n if (!drag.moved) {\n drag.moved = true;\n if (hover) setHover(null);\n stage.style.cursor = drag.mode === \"node\" ? \"grabbing\" : \"grabbing\";\n }\n if (drag.mode === \"node\") {\n const i = drag.index;\n // the node stays under the pointer: stop following the layout\n followLayout = false;\n const wx = (p.x - tx) / k - drag.offset[0];\n const wy = (p.y - ty) / k - drag.offset[1];\n if (runner) runner.drag(i, wx, wy);\n else if (layoutType === \"force\") {\n // the simulation has finished: warm it up again from the current positions\n const prev = snapshot();\n startForceFrom(prev);\n (runner as ForceRunner | null)?.drag(i, wx, wy);\n }\n X[i] = TX[i] = wx;\n Y[i] = TY[i] = wy;\n pathsDirty = true;\n invalidate();\n return;\n }\n if (!ia.pan) return;\n const [k0, x0, y0] = drag.view;\n k = k0;\n tx = x0 + dx;\n ty = y0 + dy;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n };\n\n const startForceFrom = (prev: Map<string, Snapshot>) => {\n stopRunner();\n // a drag warms the layout up again: the view stays where it is\n startForce(prev, false);\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const was = drag;\n pointers.delete(e.pointerId);\n if (stage.hasPointerCapture?.(e.pointerId))\n stage.releasePointerCapture(e.pointerId);\n if (pointers.size) {\n if (was?.mode === \"pinch\") drag = null;\n return;\n }\n drag = null;\n stage.style.cursor = interaction()?.pan ? \"grab\" : \"default\";\n if (!was) return;\n if (was.mode === \"node\" && was.moved) {\n runner?.release(was.index, !!model.nodes[was.index].fixed);\n return;\n }\n if (was.moved || was.button !== 0) return;\n const p = local(e);\n const hit = pickAt(p.x, p.y);\n handleClick(hit, e.ctrlKey || e.metaKey || e.shiftKey);\n };\n\n const handleClick = (hit: Hit | null, additive: boolean) => {\n if (!hit) {\n if (selection.size && interaction()?.select)\n setSelection(new Set(), true);\n return;\n }\n const event = hoverEvent(hit);\n emit(\"click\", event);\n if (hit.type !== \"node\") return;\n const i = hit.index;\n if (collapsible() && tree?.children[i]?.length)\n setCollapsed(i, hasVisibleChild(i), true);\n selectNode(i, additive);\n };\n\n const onPointerCancel = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (!pointers.size) {\n if (drag?.mode === \"node\")\n runner?.release(drag.index, !!model.nodes[drag.index].fixed);\n drag = null;\n }\n };\n\n const onPointerLeave = () => {\n pendingHover = null;\n if (!drag && hover) setHover(null);\n };\n\n let hintTimer: ReturnType<typeof setTimeout> | 0 = 0;\n const showHint = () => {\n const mac = /Mac|iPhone|iPad/.test(win?.navigator?.platform ?? \"\");\n dom.hint.textContent = fill(loc.labels.zoomHint, {\n key: mac ? \"⌘\" : \"Ctrl\",\n });\n dom.hint.style.opacity = \"1\";\n if (hintTimer) clearTimeout(hintTimer);\n hintTimer = setTimeout(() => {\n hintTimer = 0;\n dom.hint.style.opacity = \"0\";\n }, 1200);\n };\n\n const onWheel = (e: WheelEvent) => {\n const ia = interaction();\n if (!ia?.zoom) return;\n const pinch = e.ctrlKey && !e.metaKey;\n if (ia.wheel === \"modifier\" && !e.ctrlKey && !e.metaKey) {\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) showHint();\n return;\n }\n e.preventDefault();\n const p = local(e);\n viewTween = null;\n zoomAround(1 / wheelFactor(e.deltaY, e.deltaMode, pinch), p.x, p.y);\n if (hover) setHover(null);\n };\n\n const onDoubleClick = (e: MouseEvent) => {\n if (!interaction()) return;\n const p = local(e);\n if (pickNode(p.x, p.y) >= 0) return;\n e.preventDefault();\n instance.fit(true);\n };\n\n const onFocus = () => {\n let keyboard: boolean;\n try {\n keyboard = stage.matches(\":focus-visible\");\n } catch {\n keyboard = true;\n }\n focusVisible = keyboard;\n if (keyboard)\n stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n stage.style.boxShadow = \"\";\n focusVisible = false;\n if (focusIndex >= 0) {\n focusIndex = -1;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n }\n };\n\n const drawnNodes = () => {\n const list: number[] = [];\n for (let i = 0; i < model.n; i++)\n if (fade(i) > 0 && !(tween && !visible[i])) list.push(i);\n return list;\n };\n\n const setFocus = (i: number) => {\n if (i === focusIndex) return;\n focusIndex = i;\n focusVisible = true;\n sceneDirty = true;\n // keep it in view\n const sx = screenX(i);\n const sy = screenY(i);\n const margin = 40;\n if (\n sx < margin ||\n sy < margin ||\n sx > width - margin ||\n sy > height - margin\n ) {\n setView([k, tx + width / 2 - sx, ty + height / 2 - sy], true);\n }\n const g = model.groupOf[i];\n const degree = model.inDegree[i] + model.outDegree[i];\n dom.live.textContent =\n g >= 0\n ? fill(loc.labels.nodeFocusGroup, {\n name: labelOf(model, i),\n group: model.groups[g].name,\n degree: loc.count(degree),\n })\n : fill(loc.labels.nodeFocus, {\n name: labelOf(model, i),\n degree: loc.count(degree),\n });\n renderTooltip();\n invalidate();\n emit(\"hover\", hoverEvent({ type: \"node\", index: i }));\n };\n\n /** Closest node in a direction (screen space) */\n const neighborInDirection = (\n from: number,\n dx: number,\n dy: number,\n ): number => {\n const sx = screenX(from);\n const sy = screenY(from);\n let best = -1;\n let bestScore = Infinity;\n for (const i of drawnNodes()) {\n if (i === from) continue;\n const vx = screenX(i) - sx;\n const vy = screenY(i) - sy;\n const along = vx * dx + vy * dy;\n if (along <= 0.5) continue;\n const across = Math.abs(vx * dy - vy * dx);\n if (across > along * 2.5) continue;\n const score = along + across * 2;\n if (score < bestScore) {\n bestScore = score;\n best = i;\n }\n }\n return best;\n };\n\n const startingNode = () => {\n const first = [...selection].find((i) => fade(i) > 0);\n if (first !== undefined) return first;\n for (const i of model.rank) if (fade(i) > 0) return i;\n return -1;\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const ia = interaction();\n if (!ia?.keyboard) return;\n const dirs: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const dir = dirs[e.key];\n if (dir) {\n e.preventDefault();\n if (focusIndex < 0 || fade(focusIndex) <= 0) {\n const start = startingNode();\n if (start >= 0) setFocus(start);\n return;\n }\n const next = neighborInDirection(focusIndex, dir[0], dir[1]);\n if (next >= 0) setFocus(next);\n return;\n }\n switch (e.key) {\n case \"Enter\":\n case \" \":\n if (focusIndex < 0) return;\n e.preventDefault();\n if (\n e.key === \"Enter\" &&\n collapsible() &&\n tree?.children[focusIndex]?.length\n )\n setCollapsed(focusIndex, hasVisibleChild(focusIndex), true);\n emit(\"click\", hoverEvent({ type: \"node\", index: focusIndex }));\n selectNode(focusIndex, e.ctrlKey || e.metaKey || e.key === \" \");\n return;\n case \"+\":\n case \"=\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"-\":\n case \"_\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(1 / KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"0\":\n case \"Home\":\n e.preventDefault();\n instance.fit(true);\n return;\n case \"Escape\": {\n const had = focusIndex >= 0 || selection.size > 0 || !!hover;\n if (!had) return;\n e.preventDefault();\n focusIndex = -1;\n if (hover) setHover(null);\n setSelection(new Set(), true);\n renderTooltip();\n sceneDirty = true;\n invalidate();\n return;\n }\n default:\n }\n };\n\n const onZoomIn = () => zoomAround(BUTTON_ZOOM, width / 2, height / 2, true);\n const onZoomOut = () =>\n zoomAround(1 / BUTTON_ZOOM, width / 2, height / 2, true);\n const onFit = () => instance.fit(true);\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n dom.zoomIn.addEventListener(\"click\", onZoomIn);\n dom.zoomOut.addEventListener(\"click\", onZoomOut);\n dom.fit.addEventListener(\"click\", onFit);\n\n // ----------------------------------------------------------- watchers\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(dom.root, options.palette);\n const fontChanged = next.fontFamily !== theme.fontFamily;\n if (!themeColorsChanged(theme, next) && !fontChanged) return;\n theme = next;\n if (fontChanged) {\n runLayout(snapshot(), false);\n return;\n }\n refreshColors();\n legendKey = \"\";\n renderLegend();\n highlightKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n const unwatchLocale = watchLocale(() => {\n if (destroyed || resolveLocale(options.locale) === loc.locale) return;\n loc = graphLocale(options.locale, options.labels);\n updateAccessibility();\n if (hover || focusIndex >= 0) renderTooltip();\n });\n\n // ----------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n canvas.className = \"minerva-chart-data\";\n return canvas;\n },\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n sceneDirty = true;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n stage.insertBefore(next.canvas, dom.foreground);\n emit(\"renderer\", next.kind);\n } else {\n delete dom.root.dataset.renderer;\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ---------------------------------------------------------- startup\n\n const initialState = (o: GraphChartOptions) => {\n collapsedIds.clear();\n for (const node of o.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n hiddenGroups.clear();\n for (const g of o.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n };\n\n const applySelectedOption = () => {\n if (!options.selected) return;\n const next = new Set<number>();\n for (const id of options.selected) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n selection.clear();\n next.forEach((i) => selection.add(i));\n highlightKey = \"\";\n sceneDirty = true;\n };\n\n initialState(options);\n runLayout(new Map(), false);\n applySelectedOption();\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ---------------------------------------------------------------- api\n\n const replaceData = (next: GraphChartOptions, dataChanged: boolean) => {\n const prev = snapshot();\n const ids = [...selection].map((i) => model.nodes[i].id);\n const focusId = focusIndex >= 0 ? model.nodes[focusIndex].id : null;\n if (dataChanged) {\n // collapsed / hidden flags of the new data\n for (const node of next.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n model = buildModel(next.nodes ?? [], next.edges ?? [], next.groups);\n for (const g of next.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n selection.clear();\n for (const id of ids) {\n const i = model.index.get(id);\n if (i !== undefined) selection.add(i);\n }\n focusIndex = focusId !== null ? (model.index.get(focusId) ?? -1) : -1;\n hover = null;\n dom.tooltip.style.display = \"none\";\n }\n runLayout(prev, true);\n };\n\n const instance: GraphChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join()) {\n theme = readTheme(dom.root, next.palette);\n }\n if (next.locale !== previous.locale || next.labels !== previous.labels) {\n loc = graphLocale(next.locale, next.labels);\n }\n const dataChanged =\n next.nodes !== previous.nodes ||\n next.edges !== previous.edges ||\n next.groups !== previous.groups;\n const sig = layoutSignature(next);\n if (dataChanged || sig !== layoutSig) {\n layoutSig = sig;\n replaceData(next, dataChanged);\n } else {\n refreshCritical();\n refreshColors();\n pathsDirty = true;\n highlightKey = \"\";\n legendKey = \"\";\n renderLegend();\n updateAccessibility();\n invalidate();\n }\n if (\n (next.selected ?? []).join(\"\\u0001\") !==\n (previous.selected ?? []).join(\"\\u0001\")\n )\n applySelectedOption();\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setData(data) {\n if (destroyed) return;\n instance.setOptions({\n ...options,\n nodes: data.nodes,\n edges: data.edges,\n groups: data.groups ?? options.groups,\n });\n },\n fit(animate = true) {\n if (destroyed) return;\n userMoved = false;\n // keep the view fitted while the layout still moves\n if (runner?.running()) followLayout = true;\n const target = fitView();\n if (target) setView(target, animate);\n else needsFit = true;\n invalidate();\n },\n focusNode(id, opts = {}) {\n if (destroyed) return;\n let i = model.index.get(id);\n if (i === undefined) return;\n // expand the collapsed ancestors first\n if (tree && !visible[i]) {\n let changed = false;\n for (let a = tree.parent[i]; a >= 0; a = tree.parent[a]) {\n if (collapsedIds.delete(model.nodes[a].id)) changed = true;\n }\n if (changed) runLayout(snapshot(), opts.animate !== false);\n i = model.index.get(id)!;\n }\n const kk = opts.zoom ?? Math.max(k, 1);\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, kk));\n userMoved = true;\n const w = width || stage.clientWidth;\n const h = height || stage.clientHeight;\n setView(\n [nk, w / 2 - TX[i] * nk, h / 2 - TY[i] * nk],\n opts.animate !== false,\n );\n focusIndex = i;\n highlightKey = \"\";\n sceneDirty = true;\n invalidate();\n },\n select(ids) {\n if (destroyed) return;\n const list = ids === null ? [] : typeof ids === \"string\" ? [ids] : ids;\n const next = new Set<number>();\n for (const id of list) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n setSelection(next, true);\n },\n getSelection: () => [...selection].map((i) => model.nodes[i].id),\n expand(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!collapsedIds.size) return;\n const ids = [...collapsedIds];\n collapsedIds.clear();\n runLayout(snapshot(), true);\n for (const c of ids) {\n if (model.index.has(c)) emit(\"toggle\", { id: c, collapsed: false });\n }\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, false, true);\n else collapsedIds.delete(id);\n },\n collapse(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!tree) return;\n const changed: string[] = [];\n tree.children.forEach((list, i) => {\n const nodeId = model.nodes[i].id;\n if (\n list.length &&\n tree!.parent[i] >= 0 &&\n !collapsedIds.has(nodeId)\n ) {\n collapsedIds.add(nodeId);\n changed.push(nodeId);\n }\n });\n if (!changed.length) return;\n runLayout(snapshot(), true);\n for (const c of changed) emit(\"toggle\", { id: c, collapsed: true });\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, true, true);\n },\n toggle(id) {\n const i = model.index.get(id);\n if (i === undefined || destroyed) return;\n setCollapsed(i, hasVisibleChild(i), true);\n },\n getPositions() {\n const out: Record<string, GraphPoint> = {};\n for (let i = 0; i < model.n; i++) {\n out[model.nodes[i].id] = { x: TX[i], y: TY[i] };\n }\n return out;\n },\n relayout() {\n if (destroyed) return;\n runLayout(layoutType === \"force\" ? new Map() : snapshot(), true);\n },\n resize() {\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(listener as (e: never) => void);\n return () => {\n set.delete(listener as (e: never) => void);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n rendererToken++;\n if (frameId) win?.cancelAnimationFrame(frameId);\n if (hoverFrame) win?.cancelAnimationFrame(hoverFrame);\n if (hintTimer) clearTimeout(hintTimer);\n frameId = 0;\n hoverFrame = 0;\n stopRunner();\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n unwatchLocale();\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"wheel\", onWheel);\n stage.removeEventListener(\"dblclick\", onDoubleClick);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n dom.zoomIn.removeEventListener(\"click\", onZoomIn);\n dom.zoomOut.removeEventListener(\"click\", onZoomOut);\n dom.fit.removeEventListener(\"click\", onFit);\n renderer?.destroy();\n renderer = null;\n listeners.clear();\n resolveReady(null);\n dom.root.remove();\n },\n };\n return instance;\n};\n\nfunction isDark(theme: ChartTheme): boolean {\n return luminance(theme.background) < 0.4 || luminance(theme.text) > 0.6;\n}\n"],"mappings":"icA0FA,IAAM6D,EAAsC,CAC1C,QACA,MACA,OACA,SACA,UACA,MACA,WACA,MACA,MACF,EAEMC,EAAa,IAAI,IAAqB,CAC1C,OACA,SACA,UACA,KACF,CAAC,EAGKC,EAAa,IAEbC,EAAe,GAEfC,GAAW,EACXC,EAAW,GACXC,GAAe,GACfC,EAAW,GAEXC,GAAgB,IAEhBC,GAAiB,IACjBC,GAAW,IACXC,GAAgB,IAEhBC,GAAe,EACfC,GAAW,KACXC,GAAc,IAEdC,IAAe,EAAgB,EAAmB,IAAmB,CACzE,IAAMC,EACJC,IAAc,EAAIC,EAAS,GAAKD,IAAc,EAAIC,EAAS,IAAMA,EAEnE,OAAO,KAAK,IAAI,KAAK,IAAI,GAAI,KAAK,IAAI,EAAGF,GAD3BG,EAAQ,IAAO,MAC0B,CAAC,CAAC,CAC3D,EAEMC,GAAQ,GACZC,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAI,GAAa,GAAKA,EAAI,IAAG,EAAK,EAGpDC,OAAoB,CACxB,IAAIC,EAAO,IAAI,aAAa,IAAI,EAC5BC,EAAS,EACPC,EAAU,GAAkB,CAChC,GAAID,EAASE,GAASH,EAAK,OAAQ,OACnC,IAAMI,EAAO,IAAI,aAAa,KAAK,IAAIJ,EAAK,OAAS,EAAGC,EAASE,CAAK,CAAC,EACvEC,EAAK,IAAIJ,EAAK,SAAS,EAAGC,CAAM,CAAC,EACjC,EAAOG,CACT,EACA,MAAO,CACL,KAAK,EAAW,EAAW,CACzBF,EAAO,CAAC,EACR,EAAK,KAAYG,EACjB,EAAK,KAAYC,CACnB,EACA,QAAQ,EAA2B,CACjCJ,EAAOK,EAAO,MAAM,EACpB,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAO,OAAQ,IAAK,EAAK,KAAYA,EAAOC,EAClE,EACA,UAAaP,EAAS,EACtB,WAAcD,EAAK,SAAS,EAAGC,CAAM,CACvC,CACF,EAeaQ,GACX,GACqBC,GAAUjC,EAAQ,SAASiC,CAAM,EAAIA,EAAS,QAE/DC,GAAmB,GACvB,KAAK,UAAU,CACbF,GAAcG,EAAE,MAAM,EACtBA,EAAE,WAAa,GACfA,EAAE,OAAS,KACXA,EAAE,IACE,CAAE,GAAGA,EAAE,IAAK,aAAc,IAAA,GAAW,cAAe,IAAA,EAAU,EAC9D,KACJA,EAAE,MAAQ,KACVA,EAAE,UAAY,KACdA,EAAE,UAAY,KACdA,EAAE,WAAa,KACfA,EAAE,aAAe,EACnB,CAAC,EAEUC,IACX,EACA,KACuB,CACvB,IAAMC,EAAMC,EAAU,cAChBC,GAAMF,EAAI,YACVG,EAAMrG,EAAAA,eAAemG,CAAS,EAC9BG,EAAQD,EAAI,MACdE,EAAUC,GACVC,EAAoBxG,EAAAA,UAAUoG,EAAI,KAAME,EAAQ,OAAO,EACvDG,GAAOC,GAAOF,CAAK,EACnBG,EAAmB1G,EAAAA,YAAYqG,EAAQ,OAAQA,EAAQ,MAAM,EAC7DM,EAAY,GAEVC,GAAY,IAAI,IAIhBC,IACJ,EACA,IACG,CACHD,GACG,IAAIE,CAAI,CAAC,EACR,QAAS,GAAQC,EAA0CC,CAAK,CAAC,CACvE,EACMC,GAAa,GACjB,CAAC,CAACL,GAAU,IAAIE,CAAI,CAAC,EAAE,KAEnBI,GACJ,OAAOhB,IAAK,YAAe,WACvBA,GAAI,WAAW,kCAAkC,EACjD,KACAiB,OAAYjB,IAAK,aAAa,IAAI,GAAK,KAAK,IAAI,EAIlDkB,EAAoBnH,EAAAA,WACtBoG,EAAQ,OAAS,CAAC,EAClBA,EAAQ,OAAS,CAAC,EAClBA,EAAQ,MACV,EACIgB,EAA8B1B,GAAcU,EAAQ,MAAM,EAC1DiB,GAA4B,KAC5BC,GAAY1B,GAAgBQ,CAAO,EACnCmB,EACAC,EAAkB,IAAI,aACtBC,EAAkB,IAAI,aACtBC,EAAmB,IAAI,aACvBC,GAAmB,IAAI,aACvBC,GAAmB,IAAI,aACvBC,GAAmB,IAAI,aACvBC,EAAU,IAAI,WACdC,GAAiC,KACjCC,GAAoD,KACpDC,GAAS,EACTC,EAAqC,KACrCC,GAAmC,KACnCC,GAAyC,KACzCC,EAA6B,KAC7BC,GAAe,GACbC,EAAe,IAAI,IACnBC,GAAe,IAAI,IACrBC,GAA4D,KAC5DC,GAAc,IAAI,WAClBC,GAA6B,CAAC,EAC9BC,GAAa,GAEbC,GAAkB,EAClBC,EAAa,GACbC,GAAsB,CAAC,EACvBC,GAAU,EAGVC,EAAoB,CAAC,EACrBC,GAAoB,CAAC,EACrBC,GAAY,IAAI,aAChBC,GAAY,IAAI,WAChBC,GAAa,IAAI,WACjBC,GAAqB,CAAC,EACtBC,GAAsB,CAAC,IAAM,IAAM,IAAM,CAAC,EAC1CC,GAAiB,IAAI,aAGrBC,EAAI,EACJC,EAAK,EACLC,EAAK,EACLC,GAIO,KACPC,GAAY,GACZC,GAAW,GAEXC,GAAa,GACbC,GAAY,GAEZC,GAAe,GACfC,EAAQ,EACRC,EAAS,EAGTC,EAAoB,KACpBC,EAAa,GACbC,GAAe,GACbC,EAAY,IAAI,IAClBC,GACF,KACEC,GAAe,GAEfC,EAAiC,KACjCC,GAAgB,EAChBC,OAA+D,CAAC,EAC9DC,GAAQ,IAAI,QAAmC,GAAY,CAC/D,GAAeC,CACjB,CAAC,EACGC,GAAU,EAIRC,MAA8D,CAClE,IAAMnF,EAAIO,EAAQ,YAClB,GAAIP,IAAM,GAAO,OAAO,KACxB,IAAMoF,EAAI,OAAOpF,GAAM,SAAWA,EAAI,CAAC,EACvC,MAAO,CACL,IAAKoF,EAAE,KAAO,GACd,KAAMA,EAAE,MAAQ,GAChB,MAAOA,EAAE,OAAS,WAClB,KACEA,EAAE,OACD7D,IAAe,SACdA,IAAe,QACfA,IAAe,YACnB,OAAQ6D,EAAE,QAAU,GACpB,SAAUA,EAAE,UAAY,GACxB,UAAWA,EAAE,WAAa,CAAC,IAAM,CAAC,CACpC,CACF,EAEMC,OAAevH,EAAW,IAAIyD,CAAU,EACxC+D,OAAoBD,GAAO,GAAK9E,EAAQ,MAAM,cAAgB,GAC9DgF,OAAoB,CACxB,IAAMC,EAAIjF,EAAQ,UAElB,OADIiF,IAAM,IAASpE,IAAe,QAAgB,EAC3C,OAAOoE,GAAM,UAAYA,GAAK,EAAIA,EAAIjH,EAC/C,EACMkH,OACJlF,EAAQ,YAAcgB,IAAe,MAAQ,UAAY,aAErDmE,OAAkC,CACtC,IAAMC,EAAIpF,EAAQ,UACZqF,EAAOrE,IAAe,OAAS8D,GAAO,EAE5C,GADIM,IAAM,YAAcA,IAAM,UACzBA,IAAM,UAAYA,IAAM,eAAiBC,EAAM,OAAOD,EAC3D,GAAIA,EAAG,MAAO,QACd,OAAQpE,EAAR,CACE,IAAK,MACL,IAAK,OACL,IAAK,SACL,IAAK,UACH,MAAO,SACT,IAAK,MACH,MAAO,aACT,IAAK,WACL,IAAK,MACH,MAAO,QACT,QACE,MAAO,UACX,CACF,EAEMsE,IAAgB,EAAe,IAAyB,CAC5D,IAAMT,EAAI3E,EAAM,QACZA,EAAM,QAAQqF,EAAOC,CAAQ,EAC5B3L,EAAAA,WAAW0L,CAAK,GAAKC,EAC1B,OAAOX,EAAE,GAAK,EAAI/K,EAAAA,IAAIoG,EAAM,WAAY,CAAC2E,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAI,CAAC,EAAGA,EAAE,EAAE,EAAIA,CACzE,EAIMY,GAAa3F,EAAI,WAAW,WAAW,IAAI,EAC3C4F,IAAW,EAAc,IACxBD,IACL,GAAW,KAAOE,EACXF,GAAW,YAAYG,CAAI,CAAC,CAAC,OAFZA,EAAK,OAAS,EAOlCC,OAAwC,CAC5C,IAAMC,EAAM,IAAI,IAChB,GAAI1E,EAAE,SAAWL,EAAM,EAAG,OAAO+E,EACjC,IAAK,IAAIzG,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IACtB,OAAO,SAASK,EAAE/B,EAAE,GACzByG,EAAI,IAAI/E,EAAM,MAAM1B,EAAE,CAAC,GAAI,CACzB,EAAG+B,EAAE/B,GACL,EAAGgC,EAAEhC,GACL,QAAS,CAAC,CAACqC,EAAQrC,IAAM,CAAC6C,EAC5B,CAAC,EAEH,OAAO4D,CACT,EAEMC,OAAmB,CACvB9D,GAAQ,QAAQ,EAChB,EAAS,KACT,GAAe,EACjB,EAEM+D,OAAqB,CACzB,IAAMC,EAAM,IAAI,IAChB,IAAK,IAAMC,KAAM/D,EAAc,CAC7B,IAAM9C,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EACxB7G,IAAM,IAAA,IAAW4G,EAAI,IAAI5G,CAAC,CAChC,CACA,OAAO4G,CACT,EAEME,IACJ,EACA,EACA,EACA,IACG,CACH,IAAMxH,EAAIqB,EAAQ,MAAQ,CAAC,EAC3B,MAAO,CACL,EAAGe,EAAM,EACT,OAAQA,EAAM,OACd,OAAQA,EAAM,OACd,MAAOqF,EACP,OAAQC,EACR,OACA,aACA,KAAM1H,EAAE,OAAS,IAAA,GAA8C,GAAjCoC,EAAM,MAAM,IAAIpC,EAAE,IAAI,GAAK,GACzD,WACA,WACEA,EAAE,aAAe8B,IAAS,MAAQ,GAAKA,IAAS,UAAY,GAAK,IACnE,UAAWuF,GAAa,EACxB,QAASrH,EAAE,OACb,CACF,EAEM2H,IAAc,EAA6B,EAAS,KAAS,CACjE,GAAeC,EACf,IAAM,EAAIxF,EAAM,EACV7B,EAAI,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,GAAG,EAChCC,EAAI,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,GAAG,EAChCqH,EAAQ,IAAI,WAAW,CAAC,EAC1BC,EAAQ,EACZ,IAAK,IAAIpH,EAAI,EAAGA,EAAI,EAAG,IAAK,CAC1B,IAAMqH,EAAO3F,EAAM,MAAM1B,GACnBsH,EAAIC,EAAK,IAAIF,EAAK,EAAE,EACtBC,GACF,EAAEtH,GAAKsH,EAAE,EACT,EAAEtH,GAAKsH,EAAE,EACT,KACS,OAAO,SAASD,EAAK,CAAC,GAAK,OAAO,SAASA,EAAK,CAAC,IAC1D,EAAErH,GAAKqH,EAAK,EACZ,EAAErH,GAAKqH,EAAK,EACZ,KAEEA,EAAK,OAAS,OAAO,SAASA,EAAK,CAAC,GAAK,OAAO,SAASA,EAAK,CAAC,IACjE,EAAErH,GAAKqH,EAAK,EACZ,EAAErH,GAAKqH,EAAK,EACZ,EAAMrH,GAAK,EAEf,CAEA,GAAIoH,GAASA,EAAQ,EACnB,KAAK,IAAIpH,EAAI,EAAGA,EAAI,EAAG,IACrB,GAAI,QAAO,SAASH,EAAEG,EAAE,EACxB,IAAK,IAAI4F,EAAIlE,EAAM,SAAS1B,GAAI4F,EAAIlE,EAAM,SAAS1B,EAAI,GAAI,IAAK,CAC9D,IAAMwH,EAAI9F,EAAM,QAAQkE,GAClB6B,EAAI/F,EAAM,OAAO8F,KAAOxH,EAAI0B,EAAM,OAAO8F,GAAK9F,EAAM,OAAO8F,GACjE,GAAI,OAAO,SAAS3H,EAAE4H,EAAE,EAAG,CACzB,EAAEzH,GAAKH,EAAE4H,GAAOzH,EAAI,KAAQ,GAAM,EAClC,EAAEA,GAAKF,EAAE2H,GAAOzH,EAAI,OAAU,GAAM,EACpC,KACF,CACF,CACF,CAEF,IAAM0H,EAAS,IAAI,aAAa,CAAC,EACjC,IAAK,IAAI1H,EAAI,EAAGA,EAAI,EAAG,IACrB,EAAOA,GAAK,KAAK,IAAI8B,EAAO,MAAM9B,GAAI8B,EAAO,OAAO9B,EAAE,EAAI,EAC5D,IAAM2H,EAAQjG,EAAM,eACdkG,EAAS,IAAI,aAAalG,EAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAC/C,GAAIiG,EAAO,CACT,IAAME,GAAQF,EAAM,GAAKA,EAAM,IAAM,GAAK,EAC1CjG,EAAM,MAAM,SAAS,EAAM,IAAM,CAC/B,IAAMoG,EAAIC,EAAK,MACX,OAAO,SAASD,CAAC,GAAKA,EAAK,IAC7B,EAAON,GAAK,KAAK,IAAI,GAAK,KAAK,IAAI,EAAG,KAAK,KAAKM,EAAKD,CAAI,CAAC,CAAC,EAC/D,CAAC,CACH,CACA,IAAMG,EAAQZ,IAAU,EAAI,EAAIA,IAAU,EAAI,GAAM,GAC9Ca,EAAKvH,EAAM,YACXwH,EAAKxH,EAAM,aACXyH,EAAOzN,EAAAA,UAAU,EAAGgH,EAAM,OAAQA,EAAM,OAAQf,EAAQ,MAAO,CACnE,IACA,IACA,SACA,QACA,SACA,QACA,OAAQsH,EAAK,GAAKC,EAAK,EAAID,EAAKC,EAAK,CACvC,CAAC,EACKE,EAAIzH,EAAQ,OAAS,CAAC,EACtB0H,EAAUD,EAAE,UAAY,GACxBE,EAAeF,EAAE,QAAU,OAC3BG,EACJD,IAAiB,IAChBA,IAAiB,QAAU,GAAA,IAK9B,GAJA,EAAIzI,EACJ,EAAIC,EACJ,EAAKD,EACL,GAAKC,EACD,CAACuI,GAAW,CAACE,EAAW,CAC1B,IAAMC,EAAM7N,EAAAA,YAAY,CAAC,CAACwN,CAAI,EAC9B,KAAOK,EAAI,KAAK,EAAE,IAClBA,EAAI,OAAO,EACXC,GAAc,EACd,MACF,CACA,GAAe,CAACJ,EAChB,EAASzN,EAAAA,kBAAkBuN,EAAM,CAC/B,OAAQI,EACR,OAAQF,EACR,OACA,WAAc,CACZ,GAAa,GACbK,EAAW,CACb,EACA,UAAa,CACX,IAAMC,EAAa9F,GACnB,GAAe,GACf,GAAa,GACT,CAACuB,IAAaI,KAChB,GAAW,GAEX,GAAa,CAACmE,GAEhB,GAAe,GACfF,GAAc,EACdC,EAAW,CACb,CACF,CAAC,CACH,EAEMD,OAAsB,CAE1B,QAAa,QAAQ,CAAC,CAAC,SAAW,CAC3BxH,GAAWE,GAAK,YAAa,CAAE,OAAQQ,CAAW,CAAC,CAC1D,CAAC,CACH,EAEMiH,IAAa,EAA6B,IAAqB,CACnElC,GAAW,EACX,IAAMmC,EAAelH,EACrB,EAAa1B,GAAcU,EAAQ,MAAM,EACzC,GAAYA,EAAQ,YAAcgB,IAAe,OAAS,KAAO,MAC7DkH,IAAiBlH,IAAY,GAAW,IAC5C,IAAMmH,EAAIpH,EAAM,EAChB,EAAO,KACP,GAAM,KACN,GAAO,KAEP,IAAIqH,EAA2B,KAC/B,GAAIpH,IAAe,UAAW,CAC5B,IAAMqH,EAAO,IAAI,aAAaF,CAAC,CAAC,CAAC,KAAK,CAAC,EACvC,EAAQjO,EAAAA,eAAeiM,GAAU,UAAWkC,EAAMA,EAAM,CAAC,CAAC,CAAC,CAAC,KAC9D,CACA,EAASlO,EAAAA,cACP4G,EACAC,EACAhB,EACAoI,EACA1C,GACAxF,EAAM,UACR,EACA,IAAMoI,EAAc,IAAI,WAAWH,CAAC,CAAC,CAAC,KAAK,CAAC,EACxCI,EAAoB,IAAI,aAAaJ,CAAC,EACtCK,EAAoB,IAAI,aAAaL,CAAC,EAE1C,OAAQnH,EAAR,CACE,IAAK,MAAO,CACV,IAAMyH,EAAIzI,EAAQ,KAAO,CAAC,EAC1B,GAAM5F,EAAAA,cAAc,CAClB,IACA,OAAQ2G,EAAM,OACd,OAAQA,EAAM,OACd,MAAOI,EAAO,MACd,OAAQA,EAAO,OACf,aACA,SAAUsH,EAAE,UAAY,GACxB,QAASA,EAAE,SAAW,GACtB,OAAQA,EAAE,QAAU,CACtB,CAAC,EACD,EAAM1G,GAAI,EACV,EAAMA,GAAI,EACV,KACF,CACA,IAAK,OACL,IAAK,SACL,IAAK,UACL,IAAK,MAAO,CACV,IAAMtB,EAAOO,EACP0H,EACJ1I,EAAQ,MAAM,UACd,KAAK,IAAI3F,EAAAA,eAAeoG,GAAOU,EAAO,QAAQ,EAChD,EAAOjH,EAAAA,eACLiM,GAAU1F,EAAMU,EAAO,YAAaA,EAAO,aAAcuH,CAAQ,CACnE,EACA,EAAM5G,EAAK,EACX,EAAMA,EAAK,EACXwG,EAAY,IAAIxG,EAAK,OAAO,EAC5B,KACF,CACA,IAAK,WACL,IAAK,MAAO,CACV,IAAI6G,EAAU,EACd,IAAK,IAAItJ,EAAI,EAAGA,EAAI8I,EAAG,IACrB,EAAU,KAAK,IACbQ,EACAxH,EAAO,YAAY9B,IAAM2B,IAAe,MAAQ,EAAI,GACtD,EACF,IAAM4H,EAAQ,CACZ,IACA,OAAQ7H,EAAM,OACd,OAAQA,EAAM,OACd,MAAOA,EAAM,QACb,MAAOf,EAAQ,UAAU,OAAS,QAClC,QAAS,KAAK,IAAIgB,IAAe,MAAQ,GAAK,GAAI2H,CAAO,CAC3D,EACA,GACE3H,IAAe,MAAQ1G,EAAAA,aAAasO,CAAK,EAAIrO,EAAAA,kBAAkBqO,CAAK,EACtE,EAAM5G,GAAK,EACX,EAAMA,GAAK,EACX,KACF,CACA,IAAK,OACHjB,EAAM,MAAM,SAAS,EAAM,IAAM,CAC/B,IAAM4F,EAAIC,EAAK,IAAIF,EAAK,EAAE,EAC1B,EAAIrH,GAAK,OAAO,SAASqH,EAAK,CAAC,EAAIA,EAAK,EAAMC,GAAG,GAAK,EACtD,EAAItH,GAAK,OAAO,SAASqH,EAAK,CAAC,EAAIA,EAAK,EAAMC,GAAG,GAAK,CACxD,CAAC,CAKL,CAEA,IAAMkC,EAAa,IAAI,WAAWV,CAAC,EACnC,IAAK,IAAI9I,EAAI,EAAGA,EAAI8I,EAAG,IACrB,EAAW9I,GAAK,KAAK,IAAI0B,EAAM,MAAM1B,EAAE,CAAC,EAAE,CAAC,EAAE,QAI/C,GAHA,EAAUiJ,EACV,GAAcQ,GAAiB,EAE3B9H,IAAe,QACjBsF,GAAWM,CAAI,EACf,GAAQ,KACR,GAAc,SACT,CACL,EAAK2B,EACL,GAAKC,EACL,EAAI,IAAI,aAAaL,CAAC,EACtB,EAAI,IAAI,aAAaA,CAAC,EACtB,IAAMY,EAAKrB,GAAWd,EAAK,KAAO5B,GAAY,EAAI,EAClD,GAAI+D,EAAK,EAAG,CACV,GAAK,IAAI,aAAaZ,CAAC,EACvB,GAAK,IAAI,aAAaA,CAAC,EACvB,IAAK,IAAI9I,EAAI,EAAGA,EAAI8I,EAAG,IAAK,CAC1B,IAAMxB,EAAIC,EAAK,IAAI7F,EAAM,MAAM1B,EAAE,CAAC,EAAE,EACpC,GAAIsH,GAAKA,EAAE,QAAS,CAClB,GAAGtH,GAAKsH,EAAE,EACV,GAAGtH,GAAKsH,EAAE,EACV,QACF,CAEA,IAAI1B,EAAInD,EAAOA,EAAK,OAAOzC,GAAK,GAC5B2J,EACJ,KAAO/D,GAAK,GAAK,EAAE,EAAO2B,EAAK,IAAI7F,EAAM,MAAMkE,EAAE,CAAC,EAAE,EAAA,EAAI,SACtD,EAAInD,EAAM,OAAOmD,GACnB,GAAG5F,GAAK2J,GAAM,QAAUA,EAAK,EAAI1H,EAAGjC,GACpC,GAAGA,GAAK2J,GAAM,QAAUA,EAAK,EAAIzH,GAAGlC,EACtC,CACA+B,EAAE,IAAII,EAAE,EACRH,EAAE,IAAII,EAAE,EACR,GAAcoH,EACd,GAAQ,CAAE,MAAO/H,GAAI,EAAG,SAAUiI,CAAG,EACrC,GAAS,CACX,MACE3H,EAAE,IAAIE,CAAE,EACRD,EAAE,IAAIE,EAAE,EACR,GAAQ,KACR,GAAc,IAElB,CACKkC,KACH,GAAW,GACX,GAAamD,EAAK,KAAO,GAAKc,GAAW1G,IAAe,SAE1DiI,GAAgB,EAChBC,GAAc,EACd,GAAiB,IAAI,aAAanI,EAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EACnD,GAAW,KACX,GAAa,GACb,EAAa,GACb,GAAe,GACfoI,GAAoB,EACpBC,GAAa,EACbrB,EAAW,EACP/G,IAAe,SAAS8G,GAAc,CAC5C,EAEMgB,OAAyB,CAC7B,IAAMO,EAAS,IAAI,WAAWtI,EAAM,CAAC,EACrC,GAAI,CAACe,EAAM,OAAOuH,EAClB,IAAMC,EAAkB,CAAC,EACzBxH,EAAK,OAAO,SAAS,EAAG,IAAM,CACxB6E,EAAI,GAAG2C,EAAM,KAAKjK,CAAC,CACzB,CAAC,EACD,IAAK,IAAIkK,EAAI,EAAGA,EAAID,EAAM,OAAQ,IAChCA,EAAM,KAAK,GAAGxH,EAAK,SAASwH,EAAMC,GAAG,EACvC,IAAK,IAAIA,EAAID,EAAM,OAAS,EAAGC,GAAK,EAAG,IAAK,CAC1C,IAAMpC,EAAImC,EAAMC,GACV5C,EAAI7E,EAAK,OAAOqF,GAClBR,GAAK,IAAG,EAAOA,IAAM0C,EAAOlC,GAAK,EACvC,CACA,OAAOkC,CACT,EAEMJ,OAAwB,CAC5B,GAAW,KACX,IAAMO,EAASxJ,EAAQ,KAAK,aAC5B,GAAI,CAACwJ,GAAUxI,IAAe,MAAO,OACrC,IAAMyI,EAAQ,IAAI,WAAW1I,EAAM,CAAC,EAC9B2I,EAAQ,IAAI,WAAW3I,EAAM,CAAC,EACpC,GAAIyI,IAAW,GAAM,CACnB,IAAMG,EAAOnP,EAAAA,YAAYuG,EAAM,EAAGA,EAAM,OAAQA,EAAM,OAAS,GAAM,CACnE,IAAMoG,EAAIpG,EAAM,MAAM1B,EAAE,CAAC,MACzB,OAAO,OAAO,SAAS8H,CAAC,GAAKA,GAAM,EAAIA,EAAK,CAC9C,CAAC,EACDwC,EAAK,MAAM,QAAS,GAAO,EAAMtK,GAAK,CAAE,EACxCsK,EAAK,MAAM,QAAS,GAAO,EAAM,GAAK,CAAE,CAC1C,KAAO,CACL,IAAMC,EAAMJ,EAAO,IAAK,GAAOzI,EAAM,MAAM,IAAImF,CAAE,GAAK,EAAE,EACxD0D,EAAI,QAAS,GAAM,CACbvK,GAAK,IAAG,EAAMA,GAAK,EACzB,CAAC,EACD,IAAK,IAAI,EAAI,EAAG,EAAI0B,EAAM,EAAG,IAAK,CAChC,IAAMqE,EAAIwE,EAAI,QAAQ7I,EAAM,OAAO,EAAE,EACjCqE,GAAK,GAAKwE,EAAIxE,EAAI,KAAOrE,EAAM,OAAO,KAAI,EAAM,GAAK,EAC3D,CACF,CACA,GAAW,CAAE,QAAO,OAAM,CAC5B,EAIMmI,OAAsB,CAC1B,IAAMW,EAAK3J,EAAM,WACjB,GAAOE,GAAOF,CAAK,EACnB,IAAM4J,EAAU5J,EAAM,QAAQ,OAASA,EAAM,QAAU,CAACA,EAAM,OAAO,EACrE,GAAaa,EAAM,OAAO,KAAK,EAAG,IAChCgJ,EAAE,MACEzE,GAAayE,EAAE,MAAOD,EAAQzK,EAAIyK,EAAQ,OAAO,EACjDA,EAAQzK,EAAIyK,EAAQ,OAC1B,EACA,GAAgBxE,GACdtF,EAAQ,KAAK,eAAiB,+BAC9B,CAAC,IAAM,IAAM,IAAM,CAAC,CACtB,EAEA,IAAMgK,EAAS,IAAI,WAAWjJ,EAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAC9C,GAAIC,IAAe,WAAac,EAAM,CACpC,IAAMmI,EAAkB,CAAC,EACzBnI,EAAK,OAAO,SAAS,EAAG,IAAM6E,EAAI,GAAKsD,EAAM,KAAK5K,CAAC,CAAC,GACjC4K,EAAM,OACrB,CAAC,GAAGnI,EAAK,SAASmI,EAAM,IAAK,GAAGA,EAAM,MAAM,CAAC,CAAC,EAC9C,CAAC,EAAA,CACM,SAAS,EAAG,IAAM,CAC3B,IAAMC,EAAQ,CAACrF,CAAC,EAChB,KAAOqF,EAAM,QAAQ,CACnB,IAAM/C,EAAI+C,EAAM,IAAI,EACpB,EAAO/C,GAAKgD,EACZD,EAAM,KAAK,GAAGpI,EAAM,SAASqF,EAAE,CACjC,CACF,CAAC,CACH,CACA,EAAYpG,EAAM,MAAM,KAAK,EAAM,IAAM,CACvC,GAAI2F,EAAK,MAAO,OAAOpB,GAAaoB,EAAK,MAAOxG,EAAM,OAAO,EAC7D,IAAM6J,EAAIhJ,EAAM,QAAQ1B,GAGxB,OAFI0K,GAAK,EAAU7G,GAAW6G,GAC1BC,EAAO3K,IAAM,EAAUyK,GAASE,EAAO3K,GAAK,GAAKyK,EAAQ,QACtD5J,EAAM,OACf,CAAC,EACD,IAAMkK,EAAUtQ,EAAAA,IAAI+P,EAAI3J,EAAM,UAAWC,GAAO,IAAO,GAAI,EACrDkK,EAAOrK,EAAQ,WAAa,UAC5BsK,EAAUtK,EAAQ,UAClBuK,EAASxJ,EAAM,eACf,CAACyJ,EAAMC,GAAQ,MAAM,QAAQH,CAAO,EACrCA,EACD,OAAOA,GAAY,SACjB,CAACA,EAASA,CAAO,EACjBC,GAAUA,EAAO,GAAKA,EAAO,GAC3B,CAAC,EAAG,CAAC,EACL,CAAC,KAAM,IAAI,EACnB,GAAY,CAAC,EACb,GAAY,IAAI,aAAaxJ,EAAM,CAAC,EACpC,GAAY,IAAI,WAAWA,EAAM,CAAC,EAClC,GAAa,IAAI,WAAWA,EAAM,CAAC,EACnC,IAAM2J,EAAS1K,EAAQ,QAAUgB,IAAe,MAChDD,EAAM,MAAM,SAAS,EAAM,IAAM,CAC/B,IAAMqE,EAAIrE,EAAM,OAAO8F,GACjBlI,EAAIoC,EAAM,OAAO8F,GACnBhC,EAAIuF,EACJhD,EAAK,MAAO,EAAI9B,GAAa8B,EAAK,MAAOgD,CAAO,EAC3CC,IAAS,SAAU,EAAIvQ,EAAAA,IAAI+P,EAAIhH,EAAUuC,GAAI,GAAI,EACjDiF,IAAS,SAAU,EAAIvQ,EAAAA,IAAI+P,EAAIhH,EAAUlE,GAAI,GAAI,EACjDqC,IAAe,YAAW,EAAIlH,EAAAA,IAAI+P,EAAIhH,EAAUlE,GAAI,EAAG,GAChEmE,GAAU,KAAK+B,CAAC,EAChB,IAAIuB,EAAIoE,EACJ,OAAO,SAASpD,EAAK,KAAK,GAAKA,EAAK,MAAS,EAAG,EAAIA,EAAK,MACpDmD,GAAUA,EAAO,GAAKA,EAAO,IAAM,OAAO,SAASnD,EAAK,KAAK,EACpE,EACEoD,GACCC,EAAOD,GACN,KAAK,MAAMpD,EAAK,MAASmD,EAAO,KAAOA,EAAO,GAAKA,EAAO,GAAG,EAC1DvJ,IAAe,WAAac,GAAQwI,IAAY,IAAA,KACvD,EAAI,KAAK,IAAI,KAAM,IAAMxI,EAAK,MAAMnD,GAAK,GAAI,GAC/C,GAAUkI,GAAKT,EACf,GAAUS,GAAMO,EAAK,UAAYsD,EAAU,EAAI,EAC/C,GAAW7D,GAAK,KAAK,MACvB,CAAC,EACD,EAAa,EACf,EAIM8D,EAAQ,GAAsB,CAClC,GAAIzI,GAAc,MAAO,GACzB,IAAM6H,EAAIhJ,EAAM,QAAQ1B,GACxB,GAAI0K,GAAK,GAAK3H,GAAa,IAAIrB,EAAM,OAAOgJ,EAAE,CAAC,EAAE,EAAG,MAAO,GAC3D,IAAM5C,EAAIzF,EAAQrC,GACZsH,EAAIhF,GAAcA,GAAYtC,GAAK8H,EAOzC,OANIvF,GACEuF,GAAKR,EAAU,EACfQ,EAAUtF,GACV8E,EAAU,EAAI9E,GACX,EAEFsF,CACT,EAEMyD,GAAS,GAAczJ,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,OAGnDoQ,IACJ,EACA,EACA,IAEAC,EACI,CAAC1J,EAAE/B,GAAIgC,EAAEhC,GAAM0L,EAAO5J,EAAO,OAAO9B,GAAM,CAAC,EAC3C,CAAC+B,EAAE/B,GAAM0L,EAAO5J,EAAO,MAAM9B,GAAM,EAAGgC,EAAEhC,EAAE,EAE1CgG,OAAkD,CACtD,IAAMoD,EAAIzH,IAAe,MAAQ,KAAOC,GACxC,MAAO,CACL,SAAUD,IAAe,YAAcyH,IAAM,MAAQA,IAAM,MAC3D,KAAMA,IAAM,MAAQA,IAAM,KAAO,GAAK,CACxC,CACF,EAEMuC,IACJ,EACA,EACA,EACA,IACa,CACb,GAAI5L,EAAO,OAAS,EAAG,OAAOA,EAC9B,GAAM,CAAC6L,EAAIC,GAAM,CAAC9L,EAAO,GAAKA,EAAO,GAAIA,EAAO,GAAKA,EAAO,EAAE,EACxD+L,EAAK,KAAK,MAAMF,EAAIC,CAAE,GAAK,EAC3B,CAACE,EAAIC,GAAM3Q,EAAAA,aAAa0E,CAAM,EAC9B6F,EAAItK,EAAAA,iBACRiQ,GAAMxF,CAAC,EACPjE,EAAO,MAAMiE,GACbjE,EAAO,OAAOiE,GACd6F,EAAKE,EACLD,EAAKC,CACP,EACMhB,EACJxP,EAAAA,iBAAiBiQ,GAAMjM,CAAC,EAAGwC,EAAO,MAAMxC,GAAIwC,EAAO,OAAOxC,GAAIyM,EAAIC,CAAE,GACnE,KACH,OAAOzQ,EAAAA,SAASwE,EAAQ6F,EAAGkF,CAAC,CAC9B,EAGMmB,GAAa,GAAsB,CACvC,IAAMC,EAAmB,CAAC,EAEtBpK,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,QAAUuF,EAAQ,aAAe,IAC/DuL,EAAO,KAAK,KAAK,GAAK,CAAC,EACzB,IAAK,IAAItG,EAAIlE,EAAM,SAAS1B,GAAI4F,EAAIlE,EAAM,SAAS1B,EAAI,GAAI,IAAK,CAC9D,IAAMwH,EAAI9F,EAAM,QAAQkE,GAClB6B,EAAI/F,EAAM,OAAO8F,KAAOxH,EAAI0B,EAAM,OAAO8F,GAAK9F,EAAM,OAAO8F,GACjE,GAAIC,IAAMzH,GAAKsL,EAAK7D,CAAC,GAAK,EAAG,SAC7B,IAAM0E,EAAKpK,EAAE0F,GAAK1F,EAAE/B,GACdoM,EAAKpK,EAAEyF,GAAKzF,EAAEhC,GAChBmM,EAAKA,EAAKC,EAAKA,EAAK,OAAOF,EAAO,KAAK,KAAK,MAAME,EAAID,CAAE,CAAC,CAC/D,CACA,GAAI,CAACD,EAAO,OAAQ,MAAO,CAAC,KAAK,GAAK,EACtCA,EAAO,MAAM,EAAG,IAAMtG,EAAIkF,CAAC,EAC3B,IAAMuB,EAAMH,EAAOA,EAAO,OAAS,GAC/BI,EAAOJ,EAAO,GAAK,KAAK,GAAK,EAAIG,EACjCE,EAAQF,EAAMC,EAAO,EACzB,IAAK,IAAItI,EAAI,EAAGA,EAAIkI,EAAO,OAAQ,IAAK,CACtC,IAAMM,EAAMN,EAAOlI,GAAKkI,EAAOlI,EAAI,GAC/BwI,EAAMF,EAAO,OACf,EAAOE,EACP,EAAQN,EAAOlI,EAAI,GAAKwI,EAAM,EAElC,CACA,OAAOD,CACT,EAGME,GAAY,GAChB,KAAK,IACH,GACA,KAAK,IAAI,GAAI,KAAK,IAAI3K,EAAO,MAAM9B,GAAI8B,EAAO,OAAO9B,EAAE,EAAI,EAAG,CAChE,EAGI0M,IAAe,EAAW,EAAY,IAAuB,CACjE,IAAMC,EAAa,KAAK,IAAIC,CAAE,EAAI,GAC5BC,EAAU,GACdF,EAAa7K,EAAO,MAAM2F,GAAK,EAAI3F,EAAO,OAAO2F,GAAK,EAClDqF,EAAU,GACdH,EAAa7K,EAAO,OAAO2F,GAAK,EAAI3F,EAAO,MAAM2F,GAAK,EACpDsF,EAAO,IACLC,GAAS,EAAY,EAAY,EAAe,IAAiB,CACrE,IAAMb,EAAKc,EAAKlL,EAAE/B,GACZoM,EAAKc,EAAKlL,EAAEhC,GACZoJ,EAAI+C,EAAKS,EAAKR,EAAKe,EACrB/D,GAAK,GAAK,KAAK,IAAI+C,EAAKgB,EAAKf,EAAKQ,CAAE,GAAKE,EAAO9M,CAAC,EAAIoN,EAAO,IAChE,EAAO,KAAK,IAAIL,EAAM3D,EAAIyD,EAAO7M,CAAC,EAAIqN,CAAK,EAC7C,EACA,IAAK,IAAI5F,EAAI,EAAGA,EAAI/F,EAAM,EAAG,IACvB+F,IAAMzH,GAAKsL,EAAK7D,CAAC,EAAI,GAAGuF,EAAMjL,EAAE0F,GAAIzF,EAAEyF,GAAIoF,EAAOpF,CAAC,EAAGqF,EAAOrF,CAAC,CAAC,EAGpE,GAAI/E,IAAO,CAACH,GACV,IAAK,IAAM+K,KAAS5K,GAAI,OACtB,IAAK,IAAIsB,EAAI,EAAGA,EAAIsJ,EAAM,OAAS,EAAG,GAAK,EACzCN,EAAMM,EAAMtJ,GAAIsJ,EAAMtJ,EAAI,GAAI,EAAG,CAAC,EAGxC,OAAO+I,CACT,EAOMQ,GAAiB,GAAgC,CACrD,IAAMC,EAAOf,GAASzM,CAAC,EACvB,GAAI2B,IAAe,QAAU,CAAC8D,GAAO,GAAK9D,IAAe,UACvD,MAAO,CAACsK,GAAUjM,CAAC,EAAGwN,CAAI,EAC5B,GAAM,CAAE,YAAaxH,GAAK,EAEpByH,EACJ9L,IAAe,OAASc,GAAM,QAAQzC,GAClC,CAAC,CAAC,EACFyL,EACE,CAAC,EAAG,KAAK,EAAE,EACX,CAAC,CAAC,KAAK,GAAK,EAAG,KAAK,GAAK,CAAC,EAC5BiC,EACJ5L,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,QAAUuF,EAAQ,aAAe,GAC3D4L,EAAQkB,EAAM,GACdV,EAAO,KACX,IAAK,IAAMnH,KAAK6H,EAAO,CACrB,IAAI,EACF/L,EAAM,EAAIjD,GACN,IACAiO,GAAY1M,EAAG,KAAK,MAAM,KAAK,IAAI4F,CAAC,CAAC,EAAG,KAAK,MAAM,KAAK,IAAIA,CAAC,CAAC,CAAC,EACjEA,EAAI,GAAK,CAAC6F,GAAYiC,IAAY,GAAK,IACvC,EAAIX,IACN,EAAO,EACP,EAAQnH,EAEZ,CACA,IAAI+H,EAAQ,EACZ,IAAK,IAAI/H,EAAIlE,EAAM,SAAS1B,GAAI4F,EAAIlE,EAAM,SAAS1B,EAAI,GAAI,IAAK,CAC9D,IAAM,EAAI0B,EAAM,QAAQkE,GACpBlE,EAAM,OAAO,KAAOA,EAAM,OAAO,KACnC,EAAQ,KAAK,IAAIiM,EAAOjM,EAAM,KAAK,EAAE,EACzC,CACA,MAAO,CAAC6K,EAAO,KAAK,IAAIiB,EAAM,KAAK,IAAI,GAAIT,EAAO,IAAM,EAAI,GAAMY,EAAM,CAAC,CAAC,CAC5E,EAGMC,GAAU,GAAwB,CACtC,IAAM5N,EAAI0B,EAAM,OAAO,GACjB,CAAC6K,EAAOsB,GAAQN,GAAcvN,CAAC,EAC/B+G,EAAIjF,EAAO,MAAM9B,GACjBgH,EAAIlF,EAAO,OAAO9B,GAClB8N,EAAQD,GAAQ,EAAI,GAAMnM,EAAM,KAAK,IACrC8K,EAAM,MAAU,GACtB,GAAIjB,GAAMvL,CAAC,EAET,OAAOxE,EAAAA,YACLuG,EAAE/B,GACFgC,EAAEhC,GACF+G,EACAC,EACAuF,EACAuB,EACA,KAAK,IAAI,GAAID,EAAO,EAAG,GAAK,EAAI,IAAOnM,EAAM,KAAK,IAClD8K,CACF,EAEF,IAAMuB,EAAM,GACVzS,EAAAA,iBAAiB,GAAOyL,EAAGC,EAAG,KAAK,IAAIpB,CAAC,EAAG,KAAK,IAAIA,CAAC,CAAC,EACxD,OAAOnK,EAAAA,SACLsG,EAAE/B,GACFgC,EAAEhC,GACFuM,EACAwB,EAAGxB,EAAQ,GAAI,EACfwB,EAAGxB,EAAQ,GAAI,EAAIC,EACnBsB,CACF,CACF,EAGME,IAAa,EAAc,IAC/BC,EAAO,KAAK,IAAI5P,GAAU+O,GAAQ,EAAI,KAAK,IAAIa,CAAI,EAAI,EAAE,EASrDC,IACJ,EACA,EACA,EACA,EACA,EACA,IACa,CACb,IAAMC,EAAMC,EAAI,MAAM,EAChBC,EAAOF,EAAI,OAAS,EACpBrD,EAAI,IACJuB,GAAO,EAAW,IAAc,CACpC,IAAMe,EAAO3B,EAAW3J,EAAO,MAAM9B,GAAK8B,EAAO,OAAO9B,GAClDI,EAAI4N,GAAUZ,EAAMa,CAAI,EAE9B,GADA,EAAIjK,EAAI8G,IAAM1K,EACV,CAACmL,GAAMvL,CAAC,EAAG,CAEb,IAAMwF,EAAIiG,EAAWzJ,EAAEhC,GAAK+B,EAAE/B,GACxBoJ,EAAI,EAAI0B,EACRwD,EAAIlB,EAAO,EACjB,EAAIpJ,EAAIoF,GACN5D,GACC2I,EAAInK,EAAIoF,IAAM5D,EAAI,EAAI,IAAM,KAAK,KAAK,KAAK,IAAI,EAAG8I,EAAIA,EAAIlO,EAAIA,CAAC,CAAC,CACrE,CACF,EACA,IAAK,IAAI4D,EAAI,EAAGA,EAAIqK,EAAM,GAAK,EAAG,EAAIrK,EAAI8G,IAAMmD,EAAO1P,GAGvD,GAFA8N,EAAI,EAAGtG,CAAC,EACRsG,EAAIgC,EAAM/O,CAAC,EACPiP,GAAQJ,EAAI,SAAW,EAAG,CAC5B,IAAMK,EAAM,EAAEL,EAAI,GAAKA,EAAI,IAAM,GAAIA,EAAI,GAAKA,EAAI,IAAM,CAAC,EACzD,EAAIrD,IAAMsD,EAAItD,GAAKsD,EAAI,EAAItD,IAAM,EAAImD,EAAOzP,EAC5C2P,EAAI,OAAO,EAAG,EAAGK,EAAI,GAAIA,EAAI,EAAE,CACjC,CACA,OAAOL,CACT,EAGMM,IAAY,EAAW,IAA2C,CACtE,IAAM1I,EAAIrE,EAAM,OAAO,GACjBpC,EAAIoC,EAAM,OAAO,GACjBgN,EAAQ,CAAC,CAAC/K,GAAU,GAC1B,GAAIoC,IAAMzG,EAAG,OAAOsO,GAAO,CAAC,EAE5B,IAAMe,EAAOjN,EAAM,KAAK,GAClBkN,EAAW,OAAO,SAASD,CAAI,EACrC,GAAIhN,IAAe,MAAO,CAExB,IAAMkN,EAAOD,EAAW,EAAI,KAAQ7I,EAAIzG,EAAIqP,EAAO,CAACA,GAAQ,EAC5D,OAAOhD,GAAQjQ,EAAAA,QAAQqG,EAAEgE,GAAIhE,EAAEzC,GAAI0C,EAAE+D,GAAI8I,CAAI,EAAG9I,EAAGzG,EAAGoP,CAAK,CAC7D,CACA,IAAMvC,EAAKpK,EAAEzC,GAAKyC,EAAEgE,GACdqG,EAAKpK,EAAE1C,GAAK0C,EAAE+D,GACd+I,EAAMF,EAAWD,EAAOvQ,EAAe,EAC7C,GAAI2Q,IAAU,WAAY,CACxB,GAAI,CAACD,EAAK,OAAO,KACjB,IAAME,GAAMjN,EAAEgE,GAAKhE,EAAEzC,IAAM,EACrB2P,GAAMjN,EAAE+D,GAAK/D,EAAE1C,IAAM,EAC3B,OAAOqM,GACLhQ,EAAAA,cAAcoG,EAAEgE,GAAI/D,EAAE+D,GAAIiJ,EAAK5C,EAAK0C,EAAKG,EAAK9C,EAAK2C,EAAK/M,EAAEzC,GAAI0C,EAAE1C,EAAE,EAClEyG,EACAzG,EACAoP,CACF,CACF,CACA,GAAI/M,IAAe,YAAcoN,IAAU,QAAS,CAClD,IAAMG,EAAU,KAAK,IACnB,EACA,KAAK,IAAI,EAAGvO,EAAQ,UAAU,SAAW,EAAG,CAC9C,EACMwO,GAAOpN,EAAEgE,GAAKhE,EAAEzC,IAAM,GAAM,EAAI4P,GAAW9C,EAAK0C,EAChDM,GAAOpN,EAAE+D,GAAK/D,EAAE1C,IAAM,GAAM,EAAI4P,GAAW/C,EAAK2C,EACtD,OAAOnD,GACLhQ,EAAAA,cAAcoG,EAAEgE,GAAI/D,EAAE+D,GAAIoJ,EAAIC,EAAIrN,EAAEzC,GAAI0C,EAAE1C,EAAE,EAC5CyG,EACAzG,EACAoP,CACF,CACF,CACA,GAAI/M,IAAe,UAAYoN,IAAU,SAAU,CACjD,IAAMM,EAAK,KAAK,MAAMtN,EAAEgE,GAAI/D,EAAE+D,EAAE,EAC1BuJ,EAAK,KAAK,MAAMvN,EAAEzC,GAAI0C,EAAE1C,EAAE,EAC1BiQ,EAAK,KAAK,MAAMvN,EAAE+D,GAAIhE,EAAEgE,EAAE,EAC1BgI,EAAK,KAAK,MAAM/L,EAAE1C,GAAIyC,EAAEzC,EAAE,EAC1BkQ,GAAMH,EAAKC,GAAM,EACjBnB,EAAM,CAACpM,EAAEgE,GAAI/D,EAAE+D,EAAE,EAYvB,OAXApI,EAAA,YACEwQ,EACApM,EAAEgE,GACF/D,EAAE+D,GACFsJ,EAAK,KAAOtN,EAAEgE,GAAKyJ,EAAK,KAAK,IAAID,CAAE,EACnCF,EAAK,KAAOrN,EAAE+D,GAAKyJ,EAAK,KAAK,IAAID,CAAE,EACnCC,EAAK,KAAK,IAAIzB,CAAE,EAChByB,EAAK,KAAK,IAAIzB,CAAE,EAChBhM,EAAEzC,GACF0C,EAAE1C,EACJ,EACOqM,GAAQwC,EAAKpI,EAAGzG,EAAGoP,CAAK,CACjC,CACA,GAAIK,IAAU,UAAYA,IAAU,aAAc,CAChD,IAAM3G,EAAIpC,GAAK,EACX0F,EAAOtD,EAAE,KACTzG,IAAe,YAAW,EAAOI,EAAEzC,IAAMyC,EAAEgE,GAAK,EAAI,IACxD,IAAMuH,EAAQ5K,IAAO,CAACH,GAAQG,GAAI,OAAO,GAAK,KAC1C0L,EACJ,GAAId,GAASA,EAAM,QAAU,EAAG,EAAMA,MACjC,CACH,IAAMD,EAAQjF,EAAE,SAAWpG,EAAE1C,GAAK0C,EAAE+D,GAAKhE,EAAEzC,GAAKyC,EAAEgE,GAC5C0J,EACJ9N,IAAe,WAAmB0L,EAAQ3B,GAAQ,EAAvBA,EAAkC,CAACA,EAChE,EAAM,CAAC,GAAGF,GAAKzF,EAAGqC,EAAE,SAAUqH,CAAG,EAAG,GAAGjE,GAAKlM,EAAG8I,EAAE,SAAU,CAACqH,CAAG,CAAC,CAClE,CAEA,IAAMxB,EAAOW,EAAY7I,EAAIzG,EAAIqP,EAAO,CAACA,EAAQ,EAEjD,GADIV,IAAM,EAAMC,GAAOE,EAAKrI,EAAGzG,EAAG8I,EAAE,SAAU6F,EAAMc,IAAU,QAAQ,GAClEA,IAAU,aAAc,CAC1B,GAAIpN,IAAe,OAASc,GAAM,QAAQnD,IAAMmD,EAAK,OAAOnD,KAAOyG,EAAG,CAGpE,IAAM2J,EAAS1N,EAAE+D,GAAKjE,EAAO,OAAOiE,GAAK,EACnC4J,EAAO5N,EAAEzC,GAAKwC,EAAO,MAAMxC,GAAK,EAChCsQ,EAAK7N,EAAEgE,GAAKiI,GAAUlM,EAAO,MAAMiE,GAAIkI,CAAI,EAC3C/J,EAAKlC,EAAE1C,GAAK0O,GAAUlM,EAAO,OAAOxC,GAAI2O,CAAI,EAC5C4B,EAAMF,EAAO,GAAK1B,EAAO,EACzBO,EAAMkB,EAAS,GAAKzB,EAAO,EACjC,OAAOrS,EAAAA,aACL,CAACgU,EAAIF,EAAQE,EAAIpB,EAAKqB,EAAKrB,EAAKqB,EAAK3L,EAAIyL,EAAMzL,CAAE,EACjD,CACF,CACF,CACA,GAAIvC,IAAe,OAASyM,EAAI,SAAW,GAAK,CAACH,EAAM,CACrD,IAAMO,GAAOJ,EAAI,GAAKA,EAAI,IAAM,EAChC,OAAOxS,EAAAA,aACL,CAACwS,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAII,EAAKJ,EAAI,GAAII,EAAKJ,EAAI,GAAIA,EAAI,EAAE,EACzD,CACF,CACF,CACA,OAAOvS,EAAAA,eACLuS,EACAhG,EAAE,SACFzG,IAAe,MAAQ,EAAI,EAC3BsM,EAAO3P,CACT,CACF,CACA,OAAOxC,EAAAA,WAAWsS,EAAKhG,EAAE,QAAQ,CACnC,CAEA,IAAM4G,GAAMjN,EAAEgE,GAAKhE,EAAEzC,IAAM,EACrB2P,GAAMjN,EAAE+D,GAAK/D,EAAE1C,IAAM,EACrBkG,EAAIoJ,EAAWE,EAAM,IAC3B,OAAOnD,GACLhQ,EAAAA,cAAcoG,EAAEgE,GAAI/D,EAAE+D,GAAIiJ,EAAK5C,EAAK5G,EAAGyJ,EAAK9C,EAAK3G,EAAGzD,EAAEzC,GAAI0C,EAAE1C,EAAE,EAC9DyG,EACAzG,EACAoP,CACF,CACF,EAEMoB,OAAqB,CACzB,IAAMf,EAAQjJ,GAAU,EACxB,GAAY,MAAMpE,EAAM,CAAC,EACzB,IAAK,IAAI8F,EAAI,EAAGA,EAAI9F,EAAM,EAAG,IAC3B,GAAM8F,GACJ8D,EAAK5J,EAAM,OAAO8F,EAAE,EAAI,GAAK8D,EAAK5J,EAAM,OAAO8F,EAAE,EAAI,EACjDiH,GAASjH,EAAGuH,CAAK,EACjB,KAER,GAAa,GACb,IACF,EAGMgB,GAAgB,GAAuD,CAC3E,IAAMhK,EAAIrE,EAAM,OAAO,GACjBpC,EAAIoC,EAAM,OAAO,GACjByK,EAAKpK,EAAEzC,GAAKyC,EAAEgE,GACdqG,EAAKpK,EAAE1C,GAAK0C,EAAE+D,GACdiK,EAAM,KAAK,MAAM7D,EAAIC,CAAE,EAC7B,GAAI4D,EAAM,KAAM,OAAO,KACvB,IAAMpE,EAAKO,EAAK6D,EACVnE,EAAKO,EAAK4D,EACVpK,EAAItK,EAAAA,iBACRiQ,GAAMxF,CAAC,EACPjE,EAAO,MAAMiE,GACbjE,EAAO,OAAOiE,GACd6F,EACAC,CACF,EACMf,EACJxP,EAAAA,iBAAiBiQ,GAAMjM,CAAC,EAAGwC,EAAO,MAAMxC,GAAIwC,EAAO,OAAOxC,GAAIsM,EAAIC,CAAE,GACnE,MAAU,GAEb,OADIjG,EAAIkF,GAAKkF,EAAY,KAClB,CAACjO,EAAEgE,GAAK6F,EAAKhG,EAAG5D,EAAE+D,GAAK8F,EAAKjG,EAAG7D,EAAEzC,GAAKsM,EAAKd,EAAG9I,EAAE1C,GAAKuM,EAAKf,CAAC,CACpE,EAIMmF,OAAwB,CAC5B,IAAMC,EACJvL,GAAO,OAAS,OACZ,CAACA,EAAM,KAAK,EACZC,GAAc,EACZ,CAACA,CAAU,EACX,CAAC,GAAGE,CAAS,EACfkG,EAAOnF,GAAc,EACrBsK,EAAYxL,GAAO,OAAS,OAASA,EAAM,MAAQ,GACnDyL,EAAM,GAAGpF,EAAK,GAAGkF,EAAQ,KAAK,GAAG,EAAE,GAAGC,IAC5C,GAAIC,IAAQpL,GAAc,OAG1B,GAFA,GAAeoL,EACf,EAAa,IACRpF,IAAS,QAAU,CAACkF,EAAQ,SAAWC,EAAY,EAAG,CACzD,GAAY,KACZ,MACF,CACA,IAAM/F,EAAQ,IAAI,WAAW1I,EAAM,CAAC,EAC9B2I,EAAQ,IAAI,WAAW3I,EAAM,CAAC,EACpC,GAAIsJ,IAAS,OACX,IAAK,IAAMjF,KAAKmK,EACVlF,IAAS,UAAWnN,EAAA,QAAQ6D,EAAOqE,EAAGqE,EAAOC,CAAK,EACjDxM,EAAA,aAAa6D,EAAOqE,EAAGqE,EAAOC,CAAK,EAGxC8F,GAAa,IACf,EAAMA,GAAa,EACnB,EAAMzO,EAAM,OAAOyO,IAAc,EACjC,EAAMzO,EAAM,OAAOyO,IAAc,GAMnC,GAAY,CAAE,QAAO,QAAO,QAH1BnF,IAAS,WAAakF,EAAQ,SAAW,EACrCrP,EAAM,QACN2C,EAAU0M,EAAQ,MACsBrP,EAAM,OAAQ,CAC9D,EAIMwP,OAAiC,CACrC,KACA,IAAM7F,EAAK3J,EAAM,WACXsN,EAAoB,CAAC,EACrBY,EAAQjJ,GAAU,EAClBwK,EAAQ5O,EAAM,EAAI,IAAO,EAAI,EAC7B6O,EAAKxL,GAGLyL,EAAS,CACb,IAAI,IACJ,IAAI,IACJ,IAAI,GACN,EACMC,GAAU,EAAe,EAAa,IAAc,CACxD,IAAML,EAAM,GAAGrU,EAAAA,UAAU2U,CAAK,EAAE,GAAG,KAAK,MAAM3J,EAAI,CAAC,IAC/C+D,EAAI0F,EAAOG,EAAM,CAAC,IAAIP,CAAG,EAK7B,OAJKtF,IACH,EAAI,CAAE,QAAO,MAAO/D,EAAG,IAAKxH,GAAY,CAAE,EAC1CiR,EAAOG,EAAM,CAAC,IAAIP,EAAKtF,CAAC,GAEnBA,EAAE,GACX,EACM8F,EAAY,IAAe,EAAI7J,EAAI,KAAO/C,EAC1C6M,EAAa,IAAe,EAAI9J,EAAI,KAAO/C,EAC3C8M,EAASnQ,EAAQ,aAAe,SAGhCoQ,EAAQ,CAAC,IAAI,IAAO,IAAI,IAAO,IAAI,GAAK,EAIxCC,EAAgB,CAAC,EACjBC,GACJ,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACG,CAEH,GADA,EAAI,OAAS,EACT,CAACH,EAAQ,CACXnT,EAAA,UAAUqT,EAAKnR,EAAGC,EAAG8L,EAAIC,EAAI+E,EAAS7J,CAAC,EAAG/K,EAAAA,GAAG,EAC7CkV,EAAI,QAAQF,CAAG,EACf,MACF,CACA,IAAMZ,EAAMrU,EAAAA,UAAU2U,CAAK,EACvB1J,EAAI+J,EAAMJ,EAAM,CAAC,IAAIP,CAAG,EACvBpJ,IACH,EAAI,CAAE,QAAO,OAAQ,CAAC,CAAE,EACxB+J,EAAMJ,EAAM,CAAC,IAAIP,EAAKpJ,CAAC,GAEzBrJ,EAAA,YAAYqJ,EAAE,OAAQgK,EAAKnR,EAAGC,EAAG8L,EAAIC,EAAIgF,EAAU9J,CAAC,EAAG/K,EAAAA,GAAG,EAC1DyU,EAAOE,EAAOD,EAAO,KAAK,IAAI3J,EAAG,CAAC,CAAC,CAAC,CAAC,QAAQiK,CAAG,CAClD,EACA,IAAK,IAAIxJ,EAAI,EAAGA,EAAI9F,EAAM,EAAG,IAAK,CAChC,IAAMqE,EAAIrE,EAAM,OAAO8F,GACjBlI,EAAIoC,EAAM,OAAO8F,GACjBY,EAAI,KAAK,IAAIkD,EAAKvF,CAAC,EAAGuF,EAAKhM,CAAC,CAAC,EACnC,GAAI8I,GAAK,EAAG,SACZ,IAAIsI,EAAQjN,GAAU+D,GAClBT,EAAIrD,GAAU8D,GACdmJ,EAAQ,EACR3N,IAAU,MAAMwE,KAClB,EAAQ1D,GACR,GAAK,GAEHyM,IACEA,EAAG,MAAM/I,IACX,EAAQ,EACHxE,IAAU,MAAMwE,KAAI,EAAQ/M,EAAAA,IAAI+P,EAAI+F,EAAG,OAAQ,EAAG,GACvD,GAAK,MAEL,EAAQ,EACR,EAAQ9V,EAAAA,IAAI+P,EAAIkG,EAAO,GAAI,IAG3BtI,EAAI,IAAG,EAAQ3N,EAAAA,IAAI+P,EAAIkG,EAAOtI,CAAC,GACnC,IAAM8I,EAAMT,EAAOE,EAAOD,EAAO3J,CAAC,EAC9BhH,EAA0BmD,GAAMsE,IAAM,KAC1C,GAAI,CAACzH,EAAQ,CACX,GAAIgP,IAAU,YAAcpN,IAAe,MAAO,SAClD,IAAMwP,EAAOpB,GAAavI,CAAC,EAC3B,GAAI,CAAC2J,EAAM,SACX,GAAI,CAACvN,GAAW4D,IAAM,EAAEsJ,GAAUnN,GAAU6D,IAAK,CAI/C,GAHA0J,EAAI,KAAKC,EAAK,GAAIA,EAAK,EAAE,EACzBD,EAAI,KAAKC,EAAK,GAAIA,EAAK,EAAE,EACzBD,EAAI,KAAKlV,EAAAA,IAAKA,EAAAA,GAAG,EACb2H,GAAU6D,GAAI,CAChB,IAAM4J,EAAI,KAAK,MAAMD,EAAK,GAAKA,EAAK,GAAIA,EAAK,GAAKA,EAAK,EAAE,GAAK,EAC9DF,EACEC,EACAP,EACAD,EACA3J,EACAoK,EAAK,GACLA,EAAK,IACJA,EAAK,GAAKA,EAAK,IAAMC,GACrBD,EAAK,GAAKA,EAAK,IAAMC,CACxB,CACF,CACA,QACF,CACA,EAAS,CAACD,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,EAAE,CAC9C,CACA,GAAIpR,EAAO,OAAS,EAAG,SACvB,IAAIsR,EAAOtR,EASX,GAPI+Q,GAAUnN,GAAU6D,KACtB,EAAOjM,EAAAA,SAASwE,EAAO,MAAM,EAAG,EAAG8Q,EAAU9J,CAAC,EAAI,GAAI,GACpDnD,GAAW4D,GAAI0J,EAAI,QAAQjV,EAAAA,SAASoV,EAAM,EAAIrN,EAAG,EAAIA,EAAGhI,EAAAA,GAAG,CAAC,GAE9DkV,EAAI,QAAQG,CAAI,EAChBH,EAAI,KAAKlV,EAAAA,IAAKA,EAAAA,GAAG,GAEf2H,GAAU6D,GAAI,CAChB,GAAM,CAACoE,EAAIC,GAAMxQ,EAAAA,aAAa0E,CAAM,EACpCkR,EACEC,EACAP,EACAD,EACA3J,EACAhH,EAAOA,EAAO,OAAS,GACvBA,EAAOA,EAAO,OAAS,GACvB6L,EACAC,CACF,CACF,CACF,CACA2E,EAAO,SAAS,EAAK,IAAU,CAC7B,IAAK,GAAM,CAACJ,EAAKtF,KAAMrE,EAAK,CAC1B,GAAIqE,EAAE,IAAI,MAAM,EAAI,EAAG,SACvB,IAAMwG,EAAiB,CACrB,KAAM,OACN,IAAK,SAASX,EAAM,GAAGP,IACvB,WACA,MAAOtF,EAAE,MACT,OAAQA,EAAE,IAAI,OAAO,EACrB,MAAOA,EAAE,IAAI,MAAM,EACnB,MAAOA,EAAE,MACT,OAAQ,EACV,EACAqD,EAAI,KAAKmD,CAAI,CACf,CACA,IAAK,GAAM,CAAClB,EAAKpJ,KAAM+J,EAAMJ,GAAQ,CACnC,IAAMW,EAAiB,CACrB,KAAM,OACN,IAAK,SAASX,EAAM,GAAGP,IACvB,WACA,MAAOpJ,EAAE,MACT,OAAQ,aAAa,KAAKA,EAAE,MAAM,EAClC,MAAOA,EAAE,OAAO,OAAA,EAChB,QAAS,EACT,OAAQ,GACR,KAAM,EACR,EACAmH,EAAI,KAAKmD,CAAI,CACf,CACF,CAAC,EAGD,IAAMC,GAAY,EAAW,IAAoB,CAC/C,IAAI/L,EAAIhC,EAAUxD,GAElB,OADIuQ,GAAM,CAACA,EAAG,MAAMvQ,KAAI,EAAIvF,EAAAA,IAAI+P,EAAIhF,EAAG,EAAG,GACnC4C,EAAI,EAAI3N,EAAAA,IAAI+P,EAAIhF,EAAG4C,CAAC,EAAI5C,CACjC,EACMgM,EAAiB,CAAC,EAClBC,GAAkB,CAAC,EACnBC,EAAkB,CAAC,EACnBC,GAA0B,CAAC,EAC3BC,EAAqB,CAAC,EACtBC,GAAoB,CAAC,EACrBC,GAAa,IAAI,IAIjBC,GAAW,IAAI,IACfC,GACJrQ,IAAe,UACX,IACA,KAAK,IACH,EACA,KAAK,IACHA,IAAe,MAAQ,GAAK,GAC3BA,IAAe,MAAQ,GAAK,GAAKqC,CACpC,CACF,EACAiO,GAAWvQ,EAAM,GAAKvD,EAC5B,IAAK,IAAM6B,KAAKkS,GAAU,EAAG,CAC3B,IAAM9J,EAAIkD,EAAKtL,CAAC,EAChB,GAAIoI,GAAK,EAAG,SACZ,IAAMvI,EAAIkC,EAAE/B,GACNF,EAAIkC,EAAEhC,GACN0Q,EAAQa,EAASvR,EAAGoI,CAAC,EACrB+J,EAAWrN,EAAU,IAAI9E,CAAC,EAC1BoS,EAAUzN,GAAO,OAAS,QAAUA,EAAM,QAAU3E,EAC1D,GAAI8B,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,OAAQ,CACtC,IAAMgO,EAAI,KAAK,IAAIkH,EAAOxO,EAAO,MAAM9B,GAAKgE,CAAC,EACzCiO,IAAUT,EAAK,KAAK3R,EAAGC,EAAGsJ,EAAI,EAAGrN,EAAAA,UAAUyO,CAAE,CAAC,EAEhD9E,GAAY,GAAKjD,GAAQQ,GAAYjD,GAAK,GAAK,CAACqS,GAAgBrS,CAAC,EAEjE2R,GAAc,KAAK9R,EAAGC,EAAGsJ,EAAGrN,EAAAA,UAAU2U,CAAK,CAAC,EACvCe,GAAM,KAAK5R,EAAGC,EAAGsJ,EAAGrN,EAAAA,UAAU2U,CAAK,CAAC,EACvCyB,EAAUP,EAAS,KAAK/R,EAAGC,EAAGsJ,EAAI,EAAGrN,EAAAA,UAAU8E,EAAM,OAAO,CAAC,EACxDuR,GACPV,EAAM,KAAK7R,EAAGC,EAAGsJ,EAAI,EAAGrN,EAAAA,UAAUtB,EAAAA,IAAI+P,EAAIhH,EAAUxD,GAAI,EAAG,CAAC,CAAC,EAC/D,QACF,CAEA,IAAM+G,EAAIjF,EAAO,MAAM9B,GACjBgH,EAAIlF,EAAO,OAAO9B,GAClBsS,EAAQxQ,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,MACpCmX,EAAO,CAAC,CAACvP,IAAU,MAAMhD,GAC3BwS,EAASF,EAAQ5B,EAAQjW,EAAAA,IAAI+P,EAAIkG,EAAO6B,EAAO,EAAIzR,GAAO,IAAO,EAAG,EACpE2R,EAAOH,EAAQ5B,EAAQjW,EAAAA,IAAI+P,EAAIkG,EAAO5P,GAAO,GAAM,GAAI,EACvDyR,IAAM,EAAS9X,EAAAA,IAAI+P,EAAI1G,GAAesE,CAAC,GACvCmI,GAAM,CAACA,EAAG,MAAMvQ,KAClB,EAAOvF,EAAAA,IAAI+P,EAAIiI,EAAM,EAAG,EACnBH,IAAO,EAAS7X,EAAAA,IAAI+P,EAAIgI,EAAQ,EAAG,IAE1C,IAAMpC,GAAM,GAAG,KAAK,MAAMrJ,EAAI,CAAC,EAAI,EAAE,GAAGwL,EAAO,EAAI,OAC/CzH,GAAIgH,GAAW,IAAI1B,EAAG,EAO1B,GANKtF,KACH,GAAI,CAAE,KAAM/D,EAAI,EAAG,MAAOwL,EAAO,EAAI,KAAM,OAAQ,CAAC,EAAG,KAAM,CAAC,CAAE,EAChET,GAAW,IAAI1B,GAAKtF,EAAC,GAEvBA,GAAE,OAAO,KAAKjL,EAAGC,EAAIkH,EAAI,EAAGlH,EAAIkH,EAAI,EAAGjL,EAAAA,UAAUyW,CAAM,CAAC,EACxD1H,GAAE,KAAK,KAAKjL,EAAGC,EAAIkH,EAAI,EAAGlH,EAAIkH,EAAI,EAAGjL,EAAAA,UAAU0W,CAAI,CAAC,EAChDN,GAAYC,EAAS,CACvB,IAAMM,GAAOP,EAAW,EAAI,KAAOnO,EAC7B2O,EAAO,GAAG,KAAK,OAAO5L,EAAI,EAAI2L,GAAO,EAAE,IACzCE,EAAOb,GAAS,IAAIY,CAAI,EACvBC,GAAMb,GAAS,IAAIY,EAAO,EAAO,CAAC,CAAE,EACzCC,EAAK,KACH7L,EAAI,EAAI2L,EACR7S,EACAC,EAAIkH,EAAI,EAAI0L,EACZ5S,EAAIkH,EAAI,EAAI0L,EACZ3W,EAAAA,UAAUoW,EAAWtR,EAAM,QAAUpG,EAAAA,IAAI+P,EAAIhH,EAAUxD,GAAI,GAAI,CAAC,CAClE,CACF,CACI8B,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,MAAQ2L,EAAI/C,GAAK,IAC/C6N,GAAQ,KACNhS,EAAIkH,EAAI,EAAI,GACZjH,EACA,KAAK,IAAI,GAAIkH,EAAI,EAAE,EAAIhD,EACvBjI,EAAAA,UAAU2U,CAAK,CACjB,CAEJ,CACA,IAAMmC,IACJ,EACA,EACA,EACA,IACG,CACH,GAAI,CAACrT,EAAK,OAAQ,OAClB,IAAMsT,EAAQtT,EAAK,OAAS,EACtBuT,EAAS,IAAI,YAAYD,EAAA,EAAsB,EAC/CE,EAAM,IAAI,aAAaD,CAAM,EAC7BE,EAAM,IAAI,YAAYF,CAAM,EAClC,IAAK,IAAItL,EAAI,EAAGA,EAAIqL,EAAO,IACzB,EAAIrL,EAAI,GAAKjI,EAAKiI,EAAI,GACtB,EAAIA,EAAI,EAAI,GAAKjI,EAAKiI,EAAI,EAAI,GAC9B,EAAIA,EAAI,EAAI,GAAKjI,EAAKiI,EAAI,EAAI,GAC9B,EAAIA,EAAI,EAAI,GAAKjI,EAAKiI,EAAI,EAAI,GAEhC,IAAM6J,EAAoB,CACxB,KAAM,UACN,MACA,WACA,MAAOzQ,EAAM,QACb,UAAWkS,EACX,QACA,UACA,QACF,EACA5E,EAAI,KAAKmD,CAAI,CACf,EACM4B,IACJ,EACA,EACA,EACA,EACA,IACG,CACH,GAAI,CAAC1T,EAAK,OAAQ,OAClB,IAAMsT,EAAQtT,EAAK,OAAS,EACtBuT,EAAS,IAAI,YAAYD,EAAA,EAAkB,EAC3CE,EAAM,IAAI,aAAaD,CAAM,EAC7BE,EAAM,IAAI,YAAYF,CAAM,EAClC,IAAK,IAAItL,EAAI,EAAGA,EAAIqL,EAAO,IACzB,EAAIrL,EAAI,GAAKjI,EAAKiI,EAAI,GACtB,EAAIA,EAAI,EAAI,GAAKjI,EAAKiI,EAAI,EAAI,GAC9B,EAAIA,EAAI,EAAI,GAAKjI,EAAKiI,EAAI,EAAI,GAC9B,EAAIA,EAAI,EAAI,GAAKjI,EAAKiI,EAAI,EAAI,GAEhC,IAAM6J,EAAgB,CACpB,KAAM,MACN,MACA,WACA,MAAOzQ,EAAM,QACb,UAAWkS,EACX,QACA,UAAWI,EACX,SACA,QACA,QAAS,EACT,OAAQ,EACV,EACAhF,EAAI,KAAKmD,CAAI,CACf,EACAuB,GAAQ,OAAQrB,EAAM,EAAG,CAAC,EAC1BqB,GAAQ,QAASpB,GAAO,EAAG,CAAC,EAC5BoB,GAAQ,YAAalB,GAAe,IAAM,CAAC,EAC3CkB,GAAQ,cAAenB,EAAO,EAAG,CAAC,EAClCmB,GAAQ,YAAajB,EAAU,EAAG,IAAI,EACtC,IAAK,GAAM,CAACxB,EAAKwC,KAASb,GAAU,CAClC,IAAMvS,EAAiB,CAAC,EACxB,IAAK,IAAIiI,EAAI,EAAGA,EAAImL,EAAK,OAAQ,GAAK,EACpCpT,EAAK,KAAKoT,EAAKnL,EAAI,GAAImL,EAAKnL,EAAI,GAAImL,EAAKnL,EAAI,GAAImL,EAAKnL,EAAI,EAAE,EAC9DyL,GACE,WAAW9C,IACX5Q,EACAoT,EAAK,GACL,EACAZ,KAAa,IAAM,IAAMA,GAAW,CACtC,CACF,CACA,IAAK,GAAM,CAAC5B,EAAKtF,KAAMgH,GACrBoB,GAAK,UAAU9C,IAAOtF,EAAE,OAAQA,EAAE,KAAM,EAAGkH,EAAQ,EACnDkB,GACE,QAAQ9C,IACRtF,EAAE,KACFA,EAAE,KACFA,EAAE,MACFkH,KAAa,IAAM,IAAM,KAAK,IAAI,EAAGA,GAAW,CAAC,CACnD,EAGF,OADAa,GAAQ,UAAWhB,GAAS,EAAG,CAAC,EACzB1D,CACT,EAGM+D,OAA4B,CAChC,IAAMjI,EAAkB,CAAC,EACnBmJ,EAAiB,CAAC,EACxB,IAAK,IAAIpT,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAEzBoD,EAAU,IAAI9E,CAAC,GACd2E,GAAO,OAAS,QAAUA,EAAM,QAAU3E,GAC3CA,IAAM4E,EAENwO,EAAK,KAAKpT,CAAC,EACRiK,EAAM,KAAKjK,CAAC,EAEnB,OAAOiK,EAAM,OAAOmJ,CAAI,CAC1B,EAEMf,GAAmB,GACvB,CAAC,CAAC5P,GAAQA,EAAK,SAASzC,EAAE,CAAC,KAAM,GAAMqC,EAAQmD,EAAE,EAInD,SAASkD,GAAa,CAChBzH,GAAaqE,IAAW,CAAC9E,KAC7B,GAAUA,GAAI,sBAAsB6S,EAAK,EAC3C,CAEA,IAAMC,QAAmB,CACvB,OAAS,EAAItP,EAAKS,EAClB,QAAU,EAAIR,EAAMQ,EAAQ,EAC5B,OAAS,GAAKT,EAAKU,EACnB,QAAS,EAAK,EAAIR,EAAMQ,CAC1B,GAEA,SAAS2O,IAAQ,CAEf,GADA,GAAU,EACNpS,EAAW,OACf,IAAM8F,EAAIrG,EAAM,YACVsG,EAAItG,EAAM,aAChB,GAAIqG,GAAK,GAAKC,GAAK,EAAG,QAClBD,IAAMtC,GAASuC,IAAMtC,KACvB,EAAQqC,EACR,EAASC,EACJ5C,KAAW,GAAW,IAC3B,EAAa,IAEf,IAAMmP,EAAM/S,IAAK,kBAAoB,EACjCgT,EAAY,GAEZtM,EAAS,GAOb,GANItE,GAAQ,QAAQ,IAClBA,EAAO,KAAK,CAAC,EACb,GAAa,GACb,EAAYA,EAAO,QAAQ,GAAK,CAACA,EAAO,SAAS,EACjD,EAASA,EAAO,QAAQ,GAAK4B,IAAgB,CAACJ,IAAa,CAACvB,IAE1DN,GAAO,CACT,IAAMjD,EAAI,KAAK,IACb,GACCmC,GAAI,EAAIc,GAAM,OAAS,KAAK,IAAI,EAAGA,GAAM,QAAQ,CACpD,EACA,GAASlD,GAAKC,CAAC,EACf,IAAK,IAAIU,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAC3B,EAAE1B,GAAKmC,GAAGnC,IAAMiC,EAAGjC,GAAKmC,GAAGnC,IAAMwC,GACjC,EAAExC,GAAKoC,GAAGpC,IAAMkC,GAAGlC,GAAKoC,GAAGpC,IAAMwC,GAE/BlD,GAAK,IACP,GAAQ,KACR,GAAc,KACd,GAAS,GAEX,GAAa,GACb,EAAY,EACd,CACA,GAAI+E,GAAU,CACZ,GAAW,GACX,IAAMoP,EAASC,GAAQ,EACnBD,GAAUnP,IAAcC,IAAa,CAAC/C,IAAe,QACvD,GAAY,CAAE,KAAM,CAACwC,EAAGC,EAAIC,CAAE,EAAG,GAAIuP,EAAQ,MAAOhS,GAAI,CAAE,EACjDgS,IAAQ,CAACzP,EAAGC,EAAIC,GAAMuP,GACjC,GAAa,GACb,EAAa,EACf,MAAO,GAAIvM,EAAQ,CAGjB,IAAMuM,EAASC,GAAQ,EACnBD,IACF,GAAY,KACR,CAAClP,IAAa/C,IAAe,QAAS,CAACwC,EAAGC,EAAIC,GAAMuP,EAC/CE,GAAaF,EAAQ,GAAI,IAAG,EAAY,IACjD,EAAa,GAEjB,CACA,GAAItP,GAAW,CACb,IAAM7E,EAAI,KAAK,IAAI,GAAImC,GAAI,EAAI0C,GAAU,OAASvF,EAAa,EACzD4I,EAAInI,GAAKC,CAAC,EACV,CAACsU,EAAIC,EAAIC,GAAM3P,GAAU,KACzB,CAAC4P,EAAIC,EAAIC,GAAM9P,GAAU,GACzB+P,EAAKN,GAAcG,EAAKH,KAAIpM,EAE5B2M,GAAO1P,EAAQ,EAAIoP,GAAMD,EACzBQ,GAAO1P,EAAS,EAAIoP,GAAMF,EAC1BS,GAAO5P,EAAQ,EAAIuP,GAAMD,EACzBO,GAAO5P,EAAS,EAAIuP,GAAMF,EAC1B5E,EAAKgF,GAAOE,EAAMF,GAAO3M,EACzB4H,EAAKgF,GAAOE,EAAMF,GAAO5M,EAC/B,EAAI0M,EACJ,EAAKzP,EAAQ,EAAI0K,EAAK+E,EACtB,EAAKxP,EAAS,EAAI0K,EAAK8E,EACnB5U,GAAK,IACP,CAAC0E,EAAGC,EAAIC,GAAMC,GAAU,GACxB,GAAY,MAEd,EAAa,GACb,EAAY,EACd,CAMA,GALIhB,KACF2M,GAAa,EACb,EAAa,IAEfG,GAAgB,EACZhL,EAAU,CACR5B,IACF,GAAQR,GAAe,CAAC,EAAIwN,GAAW,EACvC,EAAa,IAEf,IAAMkE,EAAK,KAAK,IAAI,EAAG,KAAK,MAAMxN,EAAIwM,CAAG,CAAC,EACpCiB,EAAK,KAAK,IAAI,EAAG,KAAK,MAAMxN,EAAIuM,CAAG,CAAC,GACtCtO,EAAS,OAAO,QAAUsP,GAAMtP,EAAS,OAAO,SAAWuP,IAC7DvP,EAAS,OAAOsP,EAAIC,CAAE,EACxB,EAAS,OAAO,MAAM,MAAQ,GAAGzN,EAAE,IACnC,EAAS,OAAO,MAAM,OAAS,GAAGC,EAAE,IACpC/B,EAAS,OAAO3B,GAAO,CACrB,UAAWgQ,GAAU,EACrB,MAAOiB,EACP,OAAQC,EACR,KACF,CAAC,EACD,GAAY,EACd,CACA9W,EAAA,WAAW+C,EAAI,WAAYsG,EAAGC,EAAGuM,CAAG,EACpCkB,GAAYlB,CAAG,EACX5O,GAAO+P,GAAgB,EACvBlB,GAAW9K,EAAW,CAC5B,CAIA,IAAMiM,GAAW,GAAc5S,EAAE/B,GAAKgE,EAAIC,EACpC2Q,GAAW,GAAc5S,EAAEhC,GAAKgE,EAAIE,EAEpC2Q,IACJ,EACA,EACA,IACG,CACH,GAAIC,GAAO,EAAG,MAAO,GACrB,GAAIC,EAAI,YAAYxO,CAAI,CAAC,CAAC,OAASuO,EAAK,OAAOvO,EAC/C,IAAIyO,EAAK,EACLC,EAAK1O,EAAK,OACd,KAAOyO,EAAKC,GAAI,CACd,IAAMzG,EAAOwG,EAAKC,EAAK,GAAM,EACzBF,EAAI,YAAY,GAAGxO,EAAK,MAAM,EAAGiI,CAAG,EAAE,EAAE,CAAC,CAAC,OAASsG,EAAK,EAAKtG,EAC5D,EAAKA,EAAM,CAClB,CACA,OAAOwG,EAAK,GAAGzO,EAAK,MAAM,EAAGyO,CAAE,EAAE,GAAK,EACxC,EAEME,GAAe,GACnBhZ,EAAAA,UAAUsJ,CAAC,EAAI,GAAM,UAAY,UAE7BiP,GAAe,GAAgB,CACnC,IAAMM,EAAMtU,EAAI,WAAW,WAAW,IAAI,EAI1C,GAHI,CAACsU,IACLA,EAAI,aAAaxB,EAAK,EAAG,EAAGA,EAAK,EAAG,CAAC,EACrCwB,EAAI,UAAU,EAAG,EAAGtQ,EAAOC,CAAM,EAC7B7B,IAAgB,CAACnB,EAAM,GAAG,OAC9B,IAAMyT,EAAStU,EAAM,WACf0F,EAAOpK,EAAAA,MAAM0E,EAAM,IAAI,EACvBuU,EAAQjZ,EAAAA,MAAM0E,EAAM,SAAS,EAC7BwU,EAAQlZ,EAAAA,MAAM0E,EAAM,UAAU,EAC9B0P,EAAKxL,GAELuQ,EAAO,KAAK,KAAK7Q,EAAQ,CAAI,EAAI,EACjC8Q,EAAO,KAAK,KAAK7Q,EAAS,CAAI,EAAI,EAClC8Q,EAAO,IAAI,WAAWF,EAAOC,CAAI,EACjCE,GACJ,EACA,EACA,EACA,EACA,IACG,CACH,IAAMC,EAAK,KAAK,IAAI,EAAG,KAAK,MAAM7B,EAAK,CAAI,CAAC,EACtC8B,EAAK,KAAK,IAAIL,EAAO,EAAG,KAAK,MAAMtB,EAAK,CAAI,CAAC,EAC7C4B,EAAK,KAAK,IAAI,EAAG,KAAK,MAAM9B,EAAK,CAAI,CAAC,EACtC+B,EAAK,KAAK,IAAIN,EAAO,EAAG,KAAK,MAAMtB,EAAK,CAAI,CAAC,EACnD,GAAIyB,EAAKC,GAAMC,EAAKC,EAAI,MAAO,GAC/B,GAAI,CAACC,EAAM,CACT,IAAK,IAAIxH,EAAIsH,EAAItH,GAAKuH,EAAI,IACxB,IAAK,IAAIrQ,EAAIkQ,EAAIlQ,GAAKmQ,EAAI,IAAK,GAAIH,EAAKlH,EAAIgH,EAAO9P,GAAI,MAAO,GAChE,MAAO,EACT,CACA,IAAK,IAAI8I,EAAIsH,EAAItH,GAAKuH,EAAI,IACxB,IAAK,IAAIrQ,EAAIkQ,EAAIlQ,GAAKmQ,EAAI,IAAK,EAAKrH,EAAIgH,EAAO9P,GAAK,EACtD,MAAO,EACT,EACMuQ,GAAY,EAAY,EAAY,IACxCnG,EAAK,CAACoG,GACNC,EAAK,CAACD,GACNpG,EAAKnL,EAAQuR,GACbC,EAAKvR,EAASsR,EAIVE,EAAcvV,EAAQ,aAAe,GAC3C,IAAK,IAAIX,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAAK,CAChC,GAAII,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,OAAQ,SACxC,IAAMgN,EAAIkD,EAAKtL,CAAC,EAChB,GAAIoI,GAAK,EAAG,SACZ,IAAMwH,EAAK+E,GAAQ3U,CAAC,EACdiW,EAAKrB,GAAQ5U,CAAC,EACduU,EAAKzS,EAAO,MAAM9B,GAAKgE,EACvBwQ,EAAK1S,EAAO,OAAO9B,GAAKgE,EAC9B,GAAI,CAAC+R,EAASnG,EAAIqG,EAAI,KAAK,IAAI1B,EAAIC,CAAE,CAAC,EAAG,SACzCiB,EAAK7F,EAAK2E,EAAK,EAAG0B,EAAKzB,EAAK,EAAG5E,EAAK2E,EAAK,EAAG0B,EAAKzB,EAAK,EAAG,EAAI,EAC7D,IAAM2B,EAAUrU,EAAO,KAAK9B,GAAKgE,EAC3B6J,EAAO,KAAK,IAAIhP,GAAcsX,CAAO,EACrC9O,EAAO3F,EAAM,MAAM1B,GAEzB,EAAI,YAAcoI,GADNmI,GAAM,CAACA,EAAG,MAAMvQ,GACC,IAAO,GACpC,IAAMsS,GAAQxQ,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,MAEpCgb,EADOtU,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,MAClBmZ,GAAM,GAC7B,GAAI2B,GAAe1B,GAAM3G,EAAO,EAAG,CACjC,IAAM8B,EAAOyG,EAASxG,EAAK2E,EAAK,EAAI,GAAKvQ,EAAI4L,EACvCyG,EAAWD,EAAS7B,EAAK,GAAKvQ,EAAIuQ,EAAK,KAAK,IAAI,EAAG,GAAKvQ,CAAC,EAC/D,EAAI,UAAYoS,EAAS,OAAS,SAClC,EAAI,aAAe,SAEnB,IAAME,EAAU,KAAK,IAAI,IAAoBH,EAAU,GAAI,EAErDI,EAAQ1I,EADF,KAAK,IAAI,EAAGsI,EAAU,EACb,EAAMG,EACrBE,EAAWnP,EAAK,UAAYkP,GAAS/B,EAAK,EAAInN,EAAK,SAAW,GAC9DoP,EAASD,EAAWP,EAAKM,EAAQ,EAAI1I,EAAO,EAAIoI,EACtD,EAAI,KAAO,GAAGnU,EAAO,OAAO9B,GAAG,GAAG6N,EAAK,KAAKsH,IAC5C,EAAI,UAAY7C,GAAQ4C,GAAY1R,EAAUxD,EAAE,EAAIuG,EACpD,IAAMmQ,EAAQ7B,GAAUE,EAAK3Y,EAAAA,QAAQsF,EAAO1B,CAAC,EAAGqW,CAAQ,EAExD,GADIK,GAAO3B,EAAI,SAAS2B,EAAO/G,EAAM8G,CAAM,EACvCD,GAAYE,EAAO,CACrB,EAAI,KAAO,GAAGJ,EAAQ,KAAKnB,IAC3B,EAAI,UAAY7C,GAAQ4C,GAAY1R,EAAUxD,EAAE,EAAIoV,EACpD,IAAMuB,EAAM9B,GAAUE,EAAKyB,EAAUH,CAAQ,EACzCM,GAAK5B,EAAI,SAAS4B,EAAKhH,EAAMsG,EAAKM,EAAQ,EAAID,EAAU,CAAC,CAC/D,CACF,CACA,GAAIF,EAAQ,CACV,IAAMQ,EAAU,MAAM,KAAKxa,EAAAA,QAAQsF,EAAO1B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAM,GAC3D,EAAI,UAAY,SAChB,EAAI,KAAO,OAAO,KAAK,IAAI,EAAG,GAAKgE,CAAC,EAAE,KAAKmR,IAC3C,EAAI,UAAYD,GAAY1R,EAAUxD,EAAE,EACxC+U,EAAI,SAAS6B,EAAQ,YAAY,EAAGhH,EAAK2E,EAAK,EAAI,GAAKvQ,EAAGiS,CAAE,CAC9D,CAEA,GAAIvQ,GAAY,GAAKjD,GAAQA,EAAK,SAASzC,EAAE,CAAC,OAAQ,CACpD,IAAM6W,EAAY,CAACxE,GAAgBrS,CAAC,EAC9B8W,EACHnS,GAAO,OAAS,QAAUA,EAAM,QAAU3E,GAAM4E,IAAe5E,EAClE,GAAI6W,GAAaC,EAAQ,CACvB,IAAMrL,EAAW9J,IAAe,MAC1BwM,EACJxM,IAAe,WAAac,EAAK,KAAKzC,GAAK,EAAI,GAAK,EAChD+W,EAAKtL,EAAWmE,EAAKA,EAAKzB,GAAOoG,EAAK,EAAI,GAC1CyC,EAAKvL,EAAWwK,EAAKzB,EAAK,EAAI,EAAIyB,EAClCgB,EAASJ,EAAY,OAAO5T,GAAYjD,EAAE,EAAI,IACpD,EAAI,KAAO,YAAYmV,IACvB,IAAM7G,EAAI,KAAK,IAAI,EAAGyG,EAAI,YAAYkC,CAAM,CAAC,CAAC,MAAQ,EAAI,CAAC,EAC3D,EAAI,YAAc7O,EAClB2M,EAAI,UAAU,EACd,EAAI,UAAYM,EAChB,EAAI,YAAclZ,EAAAA,MAAM1B,EAAAA,IAAIoG,EAAM,WAAY2C,EAAUxD,GAAI,GAAI,CAAC,EACjE,EAAI,UAAY,KACZ,OAAO+U,EAAI,WAAc,WAC3BA,EAAI,UAAUgC,EAAKzI,EAAG0I,EAAK,EAAG1I,EAAI,EAAG,GAAI,CAAC,EACvCyG,EAAI,KAAKgC,EAAKzI,EAAG0I,EAAK,EAAG1I,EAAI,EAAG,EAAE,EACvCyG,EAAI,KAAK,EACTA,EAAI,OAAO,EACX,EAAI,UAAYxO,EAChB,EAAI,UAAY,SAChBwO,EAAI,SAASkC,EAAQF,EAAIC,EAAK,EAAG,CACnC,CACF,CACF,CACA,EAAI,YAAc,EAGlB,IAAMhM,EAAOrK,EAAQ,YAAc,OAC7BuW,EAAY,GAChBpS,EAAU,IAAI9E,CAAC,GACfA,IAAM4E,GACLD,GAAO,OAAS,QAAUA,EAAM,QAAU3E,GAC1C,CAAC,CAACuQ,GAAM,CAAC,CAACA,EAAG,MAAMvQ,GAChBmX,EAAQ,IAAI,WAAWzV,EAAM,CAAC,EAChC0V,EAAS,IACPC,IAAa,EAAW,IAAmB,CAC/C,GAAIF,EAAMnX,IAAM8B,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,QAAU4P,IAAS,GAC7D,OACF,IAAM5C,EAAIkD,EAAKtL,CAAC,EAChB,GAAIoI,GAAK,EAAG,OACZ,IAAMwH,EAAK+E,GAAQ3U,CAAC,EACdiW,EAAKrB,GAAQ5U,CAAC,EACpB,GAAI,CAAC+V,EAASnG,EAAIqG,EAAI,GAAG,EAAG,OAC5B,IAAM3H,EAAI,KAAK,IAAI5M,EAAM,EAAI,IAAO,EAAI,IAAMI,EAAO,MAAM9B,GAAKgE,EAAK,CAAC,EAGtE,GAAI,CAACsT,GAAStM,IAAS,SADPrJ,IAAe,SAAWA,IAAe,SACb2M,EAAI,EAAI,EAAG,OACvD,IAAMiJ,EAASL,EAASlX,CAAC,EACnBwX,GAAMjH,GAAM,CAACA,EAAG,MAAMvQ,GACtByX,EAAMrb,EAAAA,QAAQsF,EAAO1B,CAAC,EACtB0X,GAAK,KAAK,IAAI,IAAK5V,EAAO,WAAW9B,IAAMuX,EAAS,KAAO,EAAE,EAC7DI,EAAQC,GAAU5X,EAAG4P,EAAIqG,EAAI3H,CAAC,EAEhCuJ,GACAC,GACAC,GACAC,GACJ,GAAIL,EAAM,QAAU,EAAG,CACrB,IAAMxI,EACJwI,EAAM,EAAI,KAAK,IAAIA,EAAM,KAAK,GAAKA,EAAM,QAAU,OAAS,EAAI,IAC5DvI,EACJuI,EAAM,EAAI,KAAK,IAAIA,EAAM,KAAK,GAAKA,EAAM,QAAU,OAAS,EAAI,IAClE,GAAMxI,EAAK,EACX,GAAMA,EAAK,EACX,GAAMC,EAAK,EACX,GAAMA,EAAK,CACb,KACE,IACEuI,EAAM,QAAU,OACZA,EAAM,EACNA,EAAM,QAAU,QACdA,EAAM,EAAID,GACVC,EAAM,EAAID,GAAK,EACvB,GAAMG,GAAMH,GACZ,GACEC,EAAM,WAAa,MACfA,EAAM,EACNA,EAAM,WAAa,SACjBA,EAAM,EAAI,GACVA,EAAM,EAAI,EAClB,GAAMG,GAAM,GAEd,GAAI,CAACR,GAAS,CAAC7B,EAAKoC,GAAM,EAAGC,GAAKC,GAAM,EAAGC,GAAK,EAAK,EAAG,OACxDvC,EAAKoC,GAAM,EAAGC,GAAKC,GAAM,EAAGC,GAAK,EAAI,EACrC,EAAMhY,GAAK,EACX,IACA+U,EAAI,KAAK,EACT,EAAI,YAAc3M,GAAKoP,GAAM,IAAO,GACpC,EAAI,KAAO,GAAGD,EAAS,IAAM,IAAI,QAAwBpC,IACzD,EAAI,UAAYwC,EAAM,MACtB,EAAI,aAAeA,EAAM,SACzB5C,EAAI,UAAU4C,EAAM,EAAGA,EAAM,CAAC,EAC1BA,EAAM,OAAO5C,EAAI,OAAO4C,EAAM,KAAK,EACvC,IAAMjB,GAAQ5U,EAAO,WAAW9B,GAAK,IAAM6U,GAAUE,EAAK0C,EAAK,GAAG,EAAIA,EACtE,EAAI,SAAW,QACf,EAAI,UAAY,EAChB,EAAI,YAAcpC,EAClBN,EAAI,WAAW2B,GAAO,EAAG,CAAC,EAC1B,EAAI,UAAYa,EAAShR,EAAOiR,GAAMpC,EAAQ7O,EAC9CwO,EAAI,SAAS2B,GAAO,EAAG,CAAC,EACxB3B,EAAI,QAAQ,CACd,EACA,IAAK,IAAI/U,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAASwV,EAASlX,CAAC,GAAGqX,GAAUrX,EAAG,EAAI,EAGpE,IAAMiY,EAAWtX,EAAQ,YAAc,OACvC,GAAIsX,IAAa,GAAO,CACtB,EAAI,KAAO,QAAQ9C,IACnB,EAAI,UAAY,SAChB,EAAI,aAAe,SACnB,IAAI+C,EAAa,EACjB,IAAK,IAAI1Q,EAAI,EAAGA,EAAI9F,EAAM,GAAKwW,EAAa,IAAK,IAAK,CACpD,IAAMxB,EAAQhV,EAAM,MAAM8F,EAAE,CAAC,MAC7B,GAAI,CAACkP,EAAO,SACZ,IAAM3Q,EAAIrE,EAAM,OAAO8F,GACjBlI,EAAIoC,EAAM,OAAO8F,GACjBY,EAAI,KAAK,IAAIkD,EAAKvF,CAAC,EAAGuF,EAAKhM,CAAC,CAAC,EACnC,GAAI8I,GAAK,EAAG,SACZ,IAAM+P,EAAM,CAAC,CAAC5H,GAAI,MAAM/I,GAExB,GADIyQ,IAAa,SAAW,CAACE,GACzBF,IAAa,QAAU,CAACE,IAAQnU,EAAI,KAASuM,GAAM,CAAC4H,GAAO,SAC/D,IAAInJ,EACAC,EACE3E,EAAOpH,GAAMsE,GACnB,GAAI8C,EAAM,CACR,IAAMhD,EAAIjL,EAAAA,QAAQiO,EAAMhO,EAAAA,WAAWgO,CAAI,EAAI,CAAC,EAG5C,GAFA,EAAKhD,EAAE,GAAKtD,EAAIC,EAChB,EAAKqD,EAAE,GAAKtD,EAAIE,EACZ6B,IAAMzG,EAAG,CAEX,IAAM6M,EAAK6C,GAAMjN,EAAEgE,GAAK/B,EAAIC,GACtBmI,EAAK6C,GAAMjN,EAAE+D,GAAK/B,EAAIE,GACtBkN,EAAI,KAAK,MAAMjF,EAAIC,CAAE,GAAK,EAChC,GAAOD,EAAKiF,EAAK,GACjB,GAAOhF,EAAKgF,EAAK,EACnB,CACF,KACE,IAAOrP,EAAEgE,GAAKhE,EAAEzC,IAAM,EAAK0E,EAAIC,EAC/B,GAAOjC,EAAE+D,GAAK/D,EAAE1C,IAAM,EAAK0E,EAAIE,EAEjC,GAAI,CAAC6R,EAAS/G,EAAIC,EAAI,EAAE,EAAG,SACvB,OAAO,MAAMlL,GAAeyD,EAAE,IAChC,GAAeA,GAAKuN,EAAI,YAAY2B,CAAK,CAAC,CAAC,OAC7C,IAAM0B,EAAKrU,GAAeyD,GAAK,IAC1B2Q,GAAQ1C,EAAKzG,EAAKoJ,EAAK,EAAGnJ,EAAK,EAAGD,EAAKoJ,EAAK,EAAGnJ,EAAK,EAAG,EAAK,KAEjEwG,EAAKzG,EAAKoJ,EAAK,EAAGnJ,EAAK,EAAGD,EAAKoJ,EAAK,EAAGnJ,EAAK,EAAG,EAAI,EACnD,IACA,EAAI,YAAc7G,EAClB,EAAI,UAAYiN,EAChBN,EAAI,UAAU,EACV,OAAOA,EAAI,WAAc,WAC3BA,EAAI,UAAU/F,EAAKoJ,EAAK,EAAGnJ,EAAK,EAAGmJ,EAAI,GAAI,CAAC,EACzCrD,EAAI,KAAK/F,EAAKoJ,EAAK,EAAGnJ,EAAK,EAAGmJ,EAAI,EAAE,EACzCrD,EAAI,KAAK,EACLoD,IACF,EAAI,YAAchc,EAAAA,MAChB1B,EAAAA,IAAIoG,EAAM,WAAYkE,IAAW,QAAUlE,EAAM,QAAS,EAAG,CAC/D,EACA,EAAI,UAAY,EAChBkU,EAAI,OAAO,GAEb,EAAI,UAAYoD,EAAM5R,EAAO6O,EAC7BL,EAAI,SAAS2B,EAAO1H,EAAIC,EAAK,EAAG,EAClC,CACA,EAAI,YAAc,CACpB,CAGA,GAAIjE,IAAS,GAAO,CAClB,IAAMqN,EAAMrN,IAAS,GACrB,IAAK,IAAIsD,EAAI,EAAGA,EAAI5M,EAAM,KAAK,QAAU0V,EAAS,EAAG,IAAK,CACxD,IAAMpX,EAAI0B,EAAM,KAAK4M,GAErB,GADA+I,GAAUrX,EAAG,EAAK,EACd,CAACqY,GAAO/J,EAAI,IAAM,KACxB,CACF,CAGA,GAAIzJ,IAAgBD,GAAc,GAAK0G,EAAK1G,CAAU,EAAI,EAAG,CAC3D,IAAMgL,EAAK+E,GAAQ/P,CAAU,EACvBqR,EAAKrB,GAAQhQ,CAAU,EAM7B,GALAmQ,EAAI,KAAK,EACT,EAAI,YAAc5Y,EAAAA,MAAM0E,EAAM,OAAO,EACrC,EAAI,UAAY,EAChBkU,EAAI,YAAY,CAAC,EAAG,CAAC,CAAC,EACtBA,EAAI,UAAU,EACVjT,EAAO,KAAK8C,KAAgBxJ,EAAAA,SAAS,OAAQ,CAC/C,IAAMkT,EAAI,KAAK,IAAI,EAAIxM,EAAO,MAAM8C,GAAcZ,EAAK,CAAC,EAAI,EAC5D+Q,EAAI,IAAInF,EAAIqG,EAAI3H,EAAG,EAAG,KAAK,GAAK,CAAC,CACnC,KAAO,CACL,IAAMiG,EAAKzS,EAAO,MAAM8C,GAAcZ,EAAI,GACpCwQ,EAAK1S,EAAO,OAAO8C,GAAcZ,EAAI,GAC3C+Q,EAAI,KAAKnF,EAAK2E,EAAK,EAAG0B,EAAKzB,EAAK,EAAGD,EAAIC,CAAE,CAC3C,CACAO,EAAI,OAAO,EACXA,EAAI,QAAQ,CACd,CACF,EAGM6C,IACJ,EACA,EACA,EACA,IAOG,CACH,IAAMU,EAAQ,CACZ,EAAG1I,EACH,EAAGqG,EAAK,EAAI,EACZ,MAAO,SACP,SAAU,MACV,MAAO,CACT,EACMsC,EAAU,GAAc,CAC5B,IAAMC,EAAO,KAAK,IAAI5S,CAAC,EAAI,EAC3B,MAAO,CACL,EAAGgK,EAAK,KAAK,IAAIhK,CAAC,GAAK,EAAI,GAC3B,EAAGqQ,EAAK,KAAK,IAAIrQ,CAAC,GAAK,EAAI,GAC3B,MAAQ4S,EAAO,QAAU,OACzB,SAAU,SACV,MAAOA,EAAO5S,EAAI,KAAK,GAAKA,CAC9B,CACF,EACA,OAAQjE,EAAR,CACE,IAAK,OAAQ,CACX,IAAM8W,EAAQpG,GAAgBrS,CAAC,EAC/B,GAAI4B,KAAc,MAAQA,KAAc,KAAM,CAC5C,IAAM8W,EAAS9W,KAAc,OAAU6W,EACvC,MAAO,CACL,EAAG7I,GAAM8I,EAAQ,EAAI,EAAI,CAAC,EAAI,GAC9B,EAAGzC,EACH,MAAOyC,EAAQ,OAAS,QACxB,SAAU,SACV,MAAO,CACT,CACF,CASA,OARI9W,KAAc,KACT,CACL,EAAGgO,EACH,EAAGqG,EAAK,EAAI,EACZ,MAAO,SACP,SAAU,SACV,MAAO,CACT,EACKqC,CACT,CACA,IAAK,SAQH,OALE7V,IACC4P,GAAgBrS,CAAC,GACfyC,EAAK,MAAMzC,KAAO,GAAK,KAAK,MAAM+B,EAAE/B,GAAIgC,EAAEhC,EAAE,EAAI,MAE5CsY,EACFC,EAAO9V,EAAOA,EAAK,KAAKzC,GAAK,CAAC,EACvC,IAAK,WACH,OAAOuY,EAAO5V,GAAOA,GAAK,MAAM3C,GAAK,CAAC,EACxC,IAAK,MACH,MAAO,CACL,EAAG4P,EACH,EAAGqG,EAAK,EAAI,EACZ,MAAO,OACP,SAAU,SACV,MAAO,KAAK,GAAK,CACnB,EACF,QACE,OAAOqC,CACX,CACF,EAIM5E,OAAiD,CACrD,GAAIjP,GAAS,GAAKC,GAAU,EAAG,OAAO,KACtC,IAAImP,EAAK,IACLC,EAAK,IACLE,EAAK,KACLC,EAAK,KACL0E,EAAW,EACf,IAAK,IAAI3Y,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAAK,CAChC,GAAI,CAACW,EAAQrC,IAAM,CAAC,OAAO,SAASiC,EAAGjC,EAAE,EAAG,SAC5C,IAAM0K,EAAIhJ,EAAM,QAAQ1B,GACxB,GAAI0K,GAAK,GAAK3H,GAAa,IAAIrB,EAAM,OAAOgJ,EAAE,CAAC,EAAE,EAAG,SACpD,IAAMkO,EAAK9W,EAAO,MAAM9B,GAAK,EACvB6Y,EAAK/W,EAAO,OAAO9B,GAAK,EAC9B,EAAK,KAAK,IAAI6T,EAAI5R,EAAGjC,GAAK4Y,CAAE,EAC5B,EAAK,KAAK,IAAI5E,EAAI/R,EAAGjC,GAAK4Y,CAAE,EAC5B,EAAK,KAAK,IAAI9E,EAAI5R,GAAGlC,GAAK6Y,CAAE,EAC5B,EAAK,KAAK,IAAI5E,EAAI/R,GAAGlC,GAAK6Y,CAAE,EACxB/W,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,SAC9B,EAAW,KAAK,IAAIud,EAAU7W,EAAO,WAAW9B,EAAE,EACtD,CACA,GAAI,EAAE6T,GAAMG,GAAK,OAAO,KAExB,GAAIrS,IAAe,MACjB,IAAK,IAAI,EAAI,EAAG,EAAID,EAAM,EAAG,IAAK,CAChC,IAAMqE,EAAIrE,EAAM,OAAO,GACjBpC,EAAIoC,EAAM,OAAO,GACvB,GAAI,CAACW,EAAQ0D,IAAM,CAAC1D,EAAQ/C,GAAI,SAChC,IAAMwL,EAAIpJ,EAAM,KAAK,GACfmN,EAAO9I,IAAMzG,GAAK,OAAO,SAASwL,CAAC,EAAI,EAAI,IAAO,KAAK,IAAIA,CAAC,EAAI,EACtE,EAAK,KAAK,IAAIgJ,EAAI5R,GAAG6D,GAAM,KAAK,IAAI9D,EAAG3C,GAAK2C,EAAG8D,EAAE,EAAI,EAAK8I,CAAI,CAChE,CAGF,GAAInN,EAAM,SACR,IAAK,IAAI8F,EAAI,EAAGA,EAAI9F,EAAM,EAAG,IAAK,CAChC,IAAM1B,EAAI0B,EAAM,OAAO8F,GACvB,GAAIxH,IAAM0B,EAAM,OAAO8F,IAAM,CAACnF,EAAQrC,GAAI,SAC1C,GAAM,CAAC4F,EAAGiI,GAAQN,GAAcvN,CAAC,EAC3B8N,EACJ,KAAK,IAAIhM,EAAO,MAAM9B,GAAI8B,EAAO,OAAO9B,EAAE,EAAI,EAC9C6N,GAAQ,EAAI,GAAMnM,EAAM,KAAK8F,IACzBsR,EAAK7W,EAAGjC,GAAK,KAAK,IAAI4F,CAAC,EAAIkI,EAC3BiL,EAAK7W,GAAGlC,GAAK,KAAK,IAAI4F,CAAC,EAAIkI,EACjC,EAAK,KAAK,IAAI+F,EAAIiF,EAAKjL,EAAO,CAAC,EAC/B,EAAK,KAAK,IAAImG,EAAI8E,EAAKjL,EAAO,CAAC,EAC/B,EAAK,KAAK,IAAIiG,EAAIiF,EAAKlL,EAAO,CAAC,EAC/B,EAAK,KAAK,IAAIoG,EAAI8E,EAAKlL,EAAO,CAAC,CACjC,CAEF,IAAM6E,EAAM/R,EAAQ,YAAc,GAC9B,CAACqY,EAAIC,EAAIC,EAAIC,GAAM,CAACzG,EAAKA,EAAKA,EAAKA,CAAG,EACpCgE,EACJ/V,EAAQ,aAAe,GAAQ,EAAI,KAAK,IAAI,IAAKgY,CAAQ,EAAI,EAE/D,GADgB7W,EAAO,KAAK,KAAM,GAAM0D,IAAMpK,EAAAA,SAAS,MACnD,GAAWsb,EAAQ,EAAG,CACxB,GAAI/U,IAAe,SAAWC,KAAc,MAAQA,KAAc,MAAO,CAEvE,IAAI6W,EAAQ,EACZ,IAAK,IAAIzY,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IACvBe,GAAQA,EAAK,OAAOzC,GAAK,GAAKqC,EAAQrC,IAAMqS,GAAgBrS,CAAC,IAC/D,EAAQ,KAAK,IAAIyY,EAAO,KAAK,IAAI,IAAK3W,EAAO,WAAW9B,EAAE,EAAI,CAAC,GAE/D4B,KAAc,MAChB,GAAM8U,EACN,GAAM+B,IAEN,GAAM/B,EACN,GAAM+B,EAEV,MAAW9W,IAAe,UAAYA,IAAe,YACnD,GAAM+U,EACN,GAAMA,EACN,GAAMA,EAAQ,GACd,GAAMA,EAAQ,IACT,AACFyC,GADMxX,IAAe,MAAa+U,EAC5B,EACb,EACI/U,IAAe,OAASA,IAAe,aAAW,GAAM,IAC5D,IAAMyX,EAAK,KAAK,IAAI,GAAI3U,EAAQuU,EAAKC,CAAE,EACjCI,EAAK,KAAK,IAAI,GAAI3U,EAASwU,EAAKC,CAAE,EAClC5E,EAAK,KAAK,IAAI,KAAMP,EAAKH,CAAE,EAC3BW,EAAK,KAAK,IAAI,KAAMP,EAAKH,CAAE,EAC3BnM,EAAQpC,EAAY,CAAC,EAAE,WAAa,CAAC,IAAM,CAAC,EAC9C2O,EAAK,KAAK,IAAIkF,EAAK7E,EAAI8E,EAAK7E,EAAI,IAAK7M,EAAM,EAAE,EACjD,EAAK,KAAK,IAAIuM,EAAI,IAAI,EACtB,IAAMoF,EAAKN,GAAMI,EAAK7E,EAAKL,GAAM,EAAIL,EAAKK,EACpCqF,EAAKL,GAAMG,EAAK7E,EAAKN,GAAM,EAAIJ,EAAKI,EAC1C,MAAO,CAACA,EAAIoF,EAAIC,CAAE,CACpB,EAEMC,OAAqC,CACzC,IAAM7R,EAAQpC,EAAY,CAAC,EAAE,WAAa,CAAC,IAAM,CAAC,EAC5CkU,EAAM/F,GAAQ,EACpB,MAAO,CAAC,KAAK,IAAI/L,EAAM,GAAI8R,EAAMA,EAAI,GAAK,GAAM9R,EAAM,EAAE,EAAGA,EAAM,EAAE,CACrE,EAMMgM,IAAgB,EAA8B,IAAiB,CACnE,GAAM,CAACI,EAAIC,EAAIC,GAAMyF,EACfvF,GAAO1P,EAAQ,EAAIR,GAAMD,EACzBoQ,GAAO1P,EAAS,EAAIR,GAAMF,EAC1BqQ,GAAO5P,EAAQ,EAAIuP,GAAMD,EACzBO,GAAO5P,EAAS,EAAIuP,GAAMF,EAIhC,GAAI,EAFF,KAAK,IAAI,KAAK,IAAIA,EAAK/P,CAAC,CAAC,EAAI,MAC7B,KAAK,MAAMqQ,EAAMF,EAAKG,EAAMF,CAAG,EAAIL,EAAK,IAGxC,MADA,CAAC/P,EAAGC,EAAIC,GAAMwV,EACP,GAET,IAAMxF,EAAKlQ,GAAa+P,EAAK/P,KAAG2V,EAC1BxK,EAAKgF,GAAOE,EAAMF,GAAOwF,EACzBvK,EAAKgF,GAAOE,EAAMF,GAAOuF,EAI/B,MAHA,GAAIzF,EACJ,EAAKzP,EAAQ,EAAI0K,EAAK+E,EACtB,EAAKxP,EAAS,EAAI0K,EAAK8E,EAChB,EACT,EAEM0F,IAAW,EAAgC,IAAqB,CACpE,GAAY,KACRvR,GAAW,CAAC7G,IAAe,SAAWiD,EAAQ,EAChD,GAAY,CAAE,KAAM,CAACT,EAAGC,EAAIC,CAAE,EAAG,GAAItE,EAAM,MAAO6B,GAAI,CAAE,EAExD,CAACuC,EAAGC,EAAIC,GAAMtE,EAEhB,EAAa,GACb8I,EAAW,CACb,EAEMmR,IACJ,EACA,EACA,EACA,EAAU,KACP,CACH,GAAM,CAAC7E,EAAIC,GAAMuE,GAAW,EACtBM,EAAK,KAAK,IAAI9E,EAAI,KAAK,IAAIC,EAAIjR,EAAI+V,CAAM,CAAC,EAC1CC,EAAQF,EAAK9V,EACnB4V,GAAQ,CAACE,EAAI3K,GAAMA,EAAKlL,GAAM+V,EAAO5K,GAAMA,EAAKlL,GAAM8V,CAAK,EAAG3R,CAAO,EACrE,GAAY,EACd,EAII4R,GAAY,GACVlQ,OAAqB,CACzB,IAAM3J,EAAIO,EAAQ,OACZuZ,EAAQxY,EAAM,OAAO,OAAQ,GAAMgJ,EAAE,MAAQ,CAAC,EAC9CyP,EAAO/Z,IAAM,IAAA,GAAY8Z,EAAM,OAAS,EAAI,CAAC,CAAC9Z,GAAK8Z,EAAM,OAAS,EAClEE,EAAS,OAAOha,GAAM,SAAWA,EAAI,CAAC,EACtCia,EAASD,EAAO,QAAU,GAC1B1K,EAAS0K,EAAO,WAAa,SAC/BhK,EAAM,GAAG+J,EAAK,GAAGzK,EAAO,GAAG2K,IAC/B,GAAIF,EACF,IAAK,IAAMzP,KAAKwP,EAAO,CACrB,IAAMla,EAAI0B,EAAM,OAAO,QAAQgJ,CAAC,EAChC,GAAO,KAAKA,EAAE,GAAG,QAAQA,EAAE,KAAK,QAAQvO,EAAAA,MAAM0H,GAAW7D,IAAMa,EAAM,OAAO,EAAE,QAAQkC,GAAa,IAAI2H,EAAE,EAAE,GAC7G,CAEF,GAAI0F,IAAQ6J,GAAW,OACvB,GAAY7J,EACZ,IAAMkK,EAAU,CAAC,GAAG7Z,EAAI,OAAO,QAAQ,CAAC,CAAC,QACvCH,EAAI,aACN,EAGA,GAFAG,EAAI,OAAO,gBAAgB,EAC3B,EAAI,OAAO,MAAM,QAAU0Z,EAAO,OAAS,OACtCA,EAEL,CADA,EAAI,OAAO,MAAM,MAAQzK,EAAS,IAAM,IACxC,EAAI,OAAO,MAAM,QAAUA,EAAS,YAAc,YAClD,IAAK,IAAMhF,KAAKwP,EAAO,CACrB,IAAMla,EAAI0B,EAAM,OAAO,QAAQgJ,CAAC,EAC1B6P,EAASxX,GAAa,IAAI2H,EAAE,EAAE,EAC9B4G,EAAOhR,EAAI,cAAc+Z,EAAS,SAAW,MAAM,EACrD/I,aAAgB,oBAClB,EAAK,KAAO,SACZA,EAAK,aAAa,eAAgB,OAAO,CAACiJ,CAAM,CAAC,EACjDjJ,EAAK,iBAAiB,YAAekJ,GAAY9P,EAAE,EAAE,CAAC,GAExDhN,EAAA,MAAM4T,EAAM,CACV,QAAS,cACT,WAAY,SACZ,IAAK,MACL,QAAS,UACT,OAAQ,IACR,OAAQ,IACR,aAAc,MACd,WAAY,OACZ,KAAM,UACN,MAAO,uCACP,OAAQ+I,EAAS,UAAY,UAC7B,QAASE,EAAS,OAAS,IAC3B,eAAgBA,EAAS,eAAiB,MAC5C,CAAC,EACDjJ,EAAK,OACH/U,EAAAA,OAAO+D,EAAKnE,EAAAA,MAAM0H,GAAW7D,IAAMa,EAAM,OAAO,CAAC,EACjDP,EAAI,eAAeoK,EAAE,IAAI,CAC3B,EACAjK,EAAI,OAAO,YAAY6Q,CAAI,CAC7B,CACIgJ,GAAW,GACb7Z,EAAK,OAAO,SAAS6Z,EAAQ,EAA8B,MAAM,CAhCjB,CAiCpD,EAEME,GAAe,GAAe,CAClC,IAAM9P,EAAIhJ,EAAM,OAAO,KAAM,GAAU+Y,EAAM,KAAO5T,CAAE,EACtD,GAAI,CAAC6D,EAAG,OACR,IAAM6P,EAAS,CAACxX,GAAa,IAAI8D,CAAE,EAC/B0T,EAAQxX,GAAa,IAAI8D,CAAE,EAC1B9D,GAAa,OAAO8D,CAAE,EAC3B,EAAI,KAAK,YAAcrK,EAAAA,KAAK+d,EAASvZ,EAAI,OAAO,OAASA,EAAI,OAAO,MAAO,CACzE,KAAM0J,EAAE,IACV,CAAC,EAED,IAAK,IAAM1K,IAAK,CAAC,GAAG8E,CAAS,EAEzBwG,EAAKtL,CAAC,GAAK,GACX0B,EAAM,QAAQ1B,IAAM,GACpB+C,GAAa,IAAIrB,EAAM,OAAOA,EAAM,QAAQ1B,GAAG,CAAC,EAAE,GAElD8E,EAAU,OAAO9E,CAAC,EAEpB4E,GAAc,GACdlD,EAAM,QAAQkD,IAAe,GAC7B7B,GAAa,IAAIrB,EAAM,OAAOA,EAAM,QAAQkD,GAAY,CAAC,EAAE,IAE3D,EAAa,IACXD,GAAO+V,GAAS,IAAI,EACxB,GAAa,GACb,EAAa,GACb,GAAe,GACf3Q,GAAa,EACbrB,EAAW,EACXvH,GAAK,cAAe,CAAE,MAAO0F,EAAI,QAAO,CAAC,CAC3C,EAIMiD,OAA4B,CAChC,GAAM,CAAE,SAAQ,SAAU9I,EACpB2Z,EACJhZ,IAAe,MAAQiZ,EAAO,IAAMnV,GAAO,EAAImV,EAAO,KAAOA,EAAO,MACtEla,EAAM,aAAa,uBAAwBia,CAAI,EAC/Cja,EAAM,aAAa,aAAcC,EAAQ,WAAaga,CAAI,EAC1D,IAAME,EAAWtV,EAAY,CAAC,EAAE,SAC5BsV,EAAU,EAAM,SAAW,EAC1Bna,EAAM,gBAAgB,UAAU,EACrC,IAAMoa,EAAKvV,EAAY,EACvB,EAAM,MAAM,OAASuV,GAAI,IAAM,OAAS,UACxC,IAAMC,EAAQ,CACZve,EAAAA,KAAKoe,EAAO,QAAS,CAAE,MAAO9H,EAAMpR,EAAM,CAAC,EAAG,MAAOoR,EAAMpR,EAAM,CAAC,CAAE,CAAC,CACvE,EACMsZ,EAAQtZ,EAAM,OAAO,OAAQ,GAAMgJ,EAAE,MAAQ,CAAC,CAAC,CAAC,IAAK,GAAMA,EAAE,IAAI,EACnEsQ,EAAM,QACRD,EAAM,KACJve,EAAAA,KAAKoe,EAAO,cAAe,CACzB,OAAQI,EAAM,KAAKJ,EAAO,aAAa,CACzC,CAAC,CACH,EACEC,GAAUE,EAAM,KAAKH,EAAO,YAAY,EAC5C,EAAI,QAAQ,YAAcG,EAAM,KAAK,GAAG,EACxC,IAAME,EAAWta,EAAQ,WAAa,IAAS,CAAC,CAACma,GAAI,KACrD,EAAI,SAAS,MAAM,QAAUG,EAAW,OAAS,OACjDxa,EAAI,OAAO,aAAa,aAAcma,EAAO,MAAM,EACnD,EAAI,OAAO,MAAQA,EAAO,OAC1Bna,EAAI,QAAQ,aAAa,aAAcma,EAAO,OAAO,EACrD,EAAI,QAAQ,MAAQA,EAAO,QAC3Bna,EAAI,IAAI,aAAa,aAAcma,EAAO,GAAG,EAC7C,EAAI,IAAI,MAAQA,EAAO,GACzB,EAIIM,GAAyC,KACzCC,GAAW,GACXC,GAAY,EACVC,IAAW,EAAY,KAC1BlM,EAAK,SAAW,SAAWC,EAAK,SAE7BkM,OAAsB,CAC1B,GAAY,EACZ,IAAK,IAAItb,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAC3B,GAAY,KAAK,IAAI0Z,GAAWtZ,EAAO,MAAM9B,GAAI8B,EAAO,OAAO9B,EAAE,EACnE,GAAW,KAAK,IAAI,GAAIob,EAAS,EACjC,IAAM5F,EAAO,IAAI,IACjB,IAAK,IAAIxV,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAAK,CAChC,GAAI4J,EAAKtL,CAAC,GAAK,EAAG,SAClB,IAAMoQ,EAAMiL,GACV,KAAK,MAAMtZ,EAAE/B,GAAKmb,EAAQ,EAC1B,KAAK,MAAMnZ,EAAEhC,GAAKmb,EAAQ,CAC5B,EACIvI,EAAO4C,EAAK,IAAIpF,CAAG,EAClBwC,GAAM4C,EAAK,IAAIpF,EAAM,EAAO,CAAC,CAAE,EACpCwC,EAAK,KAAK5S,CAAC,CACb,CACA,GAAWwV,CACb,EAEM+F,IAAY,EAAY,IAAuB,CACnD,GAAI1Y,IAAgB,CAACnB,EAAM,EAAG,MAAO,GACrC4Z,GAAc,EACd,IAAME,GAAMvO,EAAKhJ,GAAMD,EACjByX,GAAMvO,EAAKhJ,GAAMF,EACjB0X,EAAM,EAAI1X,EACV2X,GAAQja,EAAM,EAAI,IAAO,EAAI,KAAOsC,EACpC8J,EAAQ,KAAK,MAAMsN,GAAY,EAAIM,EAAMC,GAAQR,EAAQ,EACzDhM,EAAK,KAAK,MAAMqM,EAAKL,EAAQ,EAC7B/L,EAAK,KAAK,MAAMqM,EAAKN,EAAQ,EAC/B7O,EAAO,GACPsP,EAAQ,IACZ,IAAK,IAAIrC,EAAK,CAACzL,EAAOyL,GAAMzL,EAAO,IACjC,IAAK,IAAIwL,EAAK,CAACxL,EAAOwL,GAAMxL,EAAO,IAAM,CACvC,IAAM8E,EAAOsI,GAAU,IAAIG,GAAQlM,EAAKmK,EAAIlK,EAAKmK,CAAE,CAAC,EACpD,GAAK3G,EACL,IAAK,IAAM5S,KAAK4S,EAAM,CACpB,IAAMzG,EAAKqP,EAAKzZ,EAAE/B,GACZoM,EAAKqP,EAAKzZ,EAAEhC,GAClB,GAAI8B,EAAO,KAAK9B,KAAO5E,EAAAA,SAAS,OAAQ,CACtC,IAAMkT,EAAI,KAAK,IAAIxM,EAAO,MAAM9B,GAAK,EAAG2b,CAAI,EAAID,EAC1CtS,EAAI+C,EAAKA,EAAKC,EAAKA,EACrBhD,GAAKkF,EAAIA,GAAKlF,GAAKwS,IACrB,EAAO5b,EACP,EAAQoJ,EAEZ,MAAO,GACL,KAAK,IAAI+C,CAAE,GAAKrK,EAAO,MAAM9B,GAAK,EAAI0b,GACtC,KAAK,IAAItP,CAAE,GAAKtK,EAAO,OAAO9B,GAAK,EAAI0b,EACvC,CACA,IAAMtS,EAAI+C,EAAKA,EAAKC,EAAKA,EACrBhD,GAAKwS,IACP,EAAO5b,EACP,EAAQoJ,EAEZ,CACF,CACF,CAEF,OAAOkD,CACT,EAEMuP,IAAY,EAAY,IAAuB,CACnD,GAAIhZ,GAAc,MAAO,GACzB,IAAM2Y,GAAMvO,EAAKhJ,GAAMD,EACjByX,GAAMvO,EAAKhJ,GAAMF,EACjB0X,EAAM,EAAI1X,EACZsI,EAAO,GACPsP,EAAQF,EAAMA,EACZI,EAAQ,GAAc,CAC1B,GAAI,KAAK,IAAIxQ,EAAK5J,EAAM,OAAO,EAAE,EAAG4J,EAAK5J,EAAM,OAAO,EAAE,CAAC,GAAK,EAAG,OACjE,IAAI3B,EAAmCmD,GAAM,IAAM,KACnD,GAAI,CAACnD,EAAQ,CACX,IAAMoR,EAAOpB,GAAa,CAAC,EAC3B,GAAI,CAACoB,EAAM,OACX,EAASA,CACX,CACA,IAAM/H,EAAI3M,EAAAA,eAAesD,EAAQyb,EAAIC,CAAE,EACnCrS,GAAKwS,IACP,EAAO,EACP,EAAQxS,EAEZ,EACA,GAAI1H,EAAM,EAAIhD,GAAgB,CAC5B,IAAK,IAAI,EAAI,EAAG,EAAIgD,EAAM,EAAG,IAAKoa,EAAK,CAAC,EACxC,OAAOxP,CACT,CACA,IAAMyP,EAAQC,GAAU,EACxB,GAAI,CAACD,EAAO,MAAO,GAEnB,GAAM,CAAE,OAAM,KAAI,KAAI,OAAM,OAAM,QAAO,QAAO,SAAUA,EACpDrG,EAAK,KAAK,IAAI,EAAG,KAAK,OAAO8F,EAAKE,EAAM7H,GAAMoI,CAAI,CAAC,EACnDtG,EAAK,KAAK,IAAIL,EAAO,EAAG,KAAK,OAAOkG,EAAKE,EAAM7H,GAAMoI,CAAI,CAAC,EAC1DrG,GAAK,KAAK,IAAI,EAAG,KAAK,OAAO6F,EAAKC,EAAM5H,GAAMmI,CAAI,CAAC,EACnDpG,EAAK,KAAK,IAAIN,EAAO,EAAG,KAAK,OAAOkG,EAAKC,EAAM5H,GAAMmI,CAAI,CAAC,EAC1DC,GAAQ,EAAEH,EAAM,MACtB,IAAK,IAAIzN,EAAIsH,GAAItH,GAAKuH,EAAI,IACxB,IAAK,IAAIrQ,EAAIkQ,EAAIlQ,GAAKmQ,EAAI,IAAK,CAC7B,IAAM7K,EAAIwD,EAAIgH,EAAO9P,EACrB,IAAK,IAAI0E,EAAIiS,EAAMrR,GAAIZ,EAAIiS,EAAMrR,EAAI,GAAI,IAAK,CAC5C,IAAMtD,EAAIlE,EAAM4G,GACZkS,EAAM5U,KAAO0U,KACjB,EAAM1U,GAAK0U,GACXJ,EAAKtU,CAAC,EACR,CACF,CAEF,OAAO8E,CACT,EAiBI+P,GAA6B,KAE3BL,OAAoC,CACxC,IAAMM,EAAUD,GAIhB,GAHIC,GAAWA,EAAQ,WAAalZ,IAGhCkZ,GAAW1Z,GAAQ,QAAQ,GAAKnB,GAAI,EAAI6a,EAAQ,MAAQ,IAC1D,OAAOA,EACT,IAAMC,EAAI7a,EAAM,EACV8a,EAAW,GACf,KAAK,IAAIlR,EAAK5J,EAAM,OAAO,EAAE,EAAG4J,EAAK5J,EAAM,OAAO,EAAE,CAAC,GAAK,EACtD,KACCwB,GAAM,IAAM6M,GAAa,CAAC,EAC7B8D,EAAK,IACLC,EAAK,IACLE,EAAK,KACLC,EAAK,KACLxU,EAAS,EACTgd,EAAW,EACf,IAAK,IAAI,EAAI,EAAG,EAAIF,EAAG,IAAK,CAC1B,IAAMjV,EAAIkV,EAAQ,CAAC,EACnB,GAAKlV,EACL,KAAK,IAAItH,EAAI,EAAGA,EAAIsH,EAAE,OAAQ,GAAK,EACjC,EAAK,KAAK,IAAIuM,EAAIvM,EAAEtH,EAAE,EACtB,EAAK,KAAK,IAAIgU,EAAI1M,EAAEtH,EAAE,EACtB,EAAK,KAAK,IAAI8T,EAAIxM,EAAEtH,EAAI,EAAE,EAC1B,EAAK,KAAK,IAAIiU,EAAI3M,EAAEtH,EAAI,EAAE,EACtBA,IAAG,GAAU,KAAK,MAAMsH,EAAEtH,GAAKsH,EAAEtH,EAAI,GAAIsH,EAAEtH,EAAI,GAAKsH,EAAEtH,EAAI,EAAE,GAElE,GAAYsH,EAAE,OAAS,EAAI,CAD3B,CAEF,CACA,GAAI,EAAEuM,GAAMG,GAAMF,GAAMG,GAAK,OAAO,KAEpC,IAAMyI,EAAO,KAAK,IAAI1I,EAAKH,EAAII,EAAKH,EAAI,IAAI,EACtCmI,EAAO,KAAK,IAChBS,EAAO,IACNjd,EAAS,KAAK,IAAI,EAAGgd,CAAQ,EAAK,GACnC,IACF,EACMnH,EAAO,KAAK,IAAI,IAAK,KAAK,OAAOtB,EAAKH,GAAMoI,CAAI,EAAI,CAAC,EACrD1G,EAAO,KAAK,IAAI,IAAK,KAAK,OAAOtB,EAAKH,GAAMmI,CAAI,EAAI,CAAC,EACrDjS,EAAS,IAAI,WAAWsL,EAAOC,EAAO,CAAC,EACvCoH,EAAY,GAAyC,CACzD,IAAK,IAAInV,EAAI,EAAGA,EAAI+U,EAAG,IAAK,CAC1B,IAAMjV,EAAIkV,EAAQhV,CAAC,EACnB,GAAKF,EACL,IAAK,IAAItH,EAAI,EAAGA,EAAIsH,EAAE,OAAQ,GAAK,EAAG,CAEpC,IAAMsF,EAAKtF,EAAEtH,EAAI,GACXmN,EAAK7F,EAAEtH,EAAI,GACX4c,EAAQ,KAAK,IACjB,EACA,KAAK,KAAK,KAAK,MAAMtV,EAAEtH,GAAK4M,EAAItF,EAAEtH,EAAI,GAAKmN,CAAE,EAAI8O,CAAI,CACvD,EACI1U,EAAO,GACX,IAAK,IAAIxB,EAAI,EAAGA,EAAI6W,EAAO,IAAK,CAC9B,IAAM/E,EAAMjL,GAAOtF,EAAEtH,GAAK4M,GAAM7G,EAAK6W,EAC/B9E,EAAM3K,GAAO7F,EAAEtH,EAAI,GAAKmN,GAAMpH,EAAK6W,EACnC7E,EAAMnL,GAAOtF,EAAEtH,GAAK4M,IAAO7G,EAAI,GAAM6W,EACrC5E,EAAM7K,GAAO7F,EAAEtH,EAAI,GAAKmN,IAAOpH,EAAI,GAAM6W,EACzClH,EAAK,KAAK,OAAO,KAAK,IAAImC,EAAKE,CAAG,EAAIlE,GAAMoI,CAAI,EAChDtG,EAAK,KAAK,OAAO,KAAK,IAAIkC,EAAKE,CAAG,EAAIlE,GAAMoI,CAAI,EAChDrG,GAAK,KAAK,OAAO,KAAK,IAAIkC,EAAKE,CAAG,EAAIlE,GAAMmI,CAAI,EAChDpG,EAAK,KAAK,OAAO,KAAK,IAAIiC,EAAKE,CAAG,EAAIlE,GAAMmI,CAAI,EACtD,IAAK,IAAI3N,EAAI,KAAK,IAAI,EAAGsH,EAAE,EAAGtH,GAAK,KAAK,IAAIiH,EAAO,EAAGM,CAAE,EAAG,IACzD,IAAK,IAAIrQ,EAAI,KAAK,IAAI,EAAGkQ,CAAE,EAAGlQ,GAAK,KAAK,IAAI8P,EAAO,EAAGK,CAAE,EAAG,IAAK,CAC9D,IAAM7K,EAAIwD,EAAIgH,EAAO9P,EAEjBsF,IAAMvD,IACV,EAAOuD,EACP+R,EAAK/R,EAAGtD,CAAC,EACX,CAEJ,CACF,CACF,CACF,EACAmV,EAAU,GAAM,EAAO7R,EAAI,EAAE,EAAE,EAC/B,IAAK,IAAIA,EAAI,EAAGA,EAAIwK,EAAOC,EAAM,IAAK,EAAOzK,EAAI,IAAMd,EAAOc,GAC9D,IAAMxH,EAAQ,IAAI,WAAW0G,EAAOsL,EAAOC,EAAK,EAC1CuH,EAAS9S,EAAO,MAAM,EAAGsL,EAAOC,CAAI,EAiB1C,OAhBAoH,GAAU,EAAG,IAAM,CACjB,EAAM,EAAO7R,EAAE,IAAMtD,CACvB,CAAC,EACD,GAAW,CACT,OACA,KACA,KACA,OACA,OACA,MAAOwC,EACP,QACA,MAAO,IAAI,WAAWuS,CAAC,EACvB,MAAO,EACP,SAAUnZ,GACV,MAAO3B,GAAI,CACb,EACO4a,EACT,EAEMU,IAAU,EAAY,IAA2B,CACrD,IAAM/c,EAAIub,GAAStO,EAAIC,CAAE,EACzB,GAAIlN,GAAK,EAAG,MAAO,CAAE,KAAM,OAAQ,MAAOA,CAAE,EAG5C,IAAMwH,EADJwV,GAAe,GAAKzb,GAAU,OAAO,GAAKA,GAAU,OAAO,EACtCsa,GAAS5O,EAAIC,CAAE,EAAI,GAC1C,OAAO1F,GAAK,EAAI,CAAE,KAAM,OAAQ,MAAOA,CAAE,EAAI,IAC/C,EAIMwV,OAAuBrc,EAAQ,UAAY,GAE3Csc,GAAc,GAA8B,CAChD,IAAMC,EAAUxc,EAAM,WAChByc,EAAUzc,EAAM,UACtB,GAAI0c,EAAI,OAAS,OAAQ,CACvB,IAAM,EAAIA,EAAI,MACR/V,EAAO3F,EAAM,MAAM,GACnBgJ,EAAIhJ,EAAM,QAAQ,GACxB,MAAO,CACL,KAAM,OACN,GAAI2F,EAAK,GACT,OACA,MAAO3F,EAAM,UAAU,GACvB,MAAOgJ,GAAK,EAAIhJ,EAAM,OAAOgJ,EAAE,CAAC,GAAK,IAAA,GACrC,MAAOvO,EAAAA,MAAMqH,EAAU,EAAE,EACzB,OAAQ9B,EAAM,SAAS,GAAKA,EAAM,UAAU,GAC5C,QAASiT,GAAQ,CAAC,EAAIuI,EACtB,QAAStI,GAAQ,CAAC,EAAIuI,CACxB,CACF,CACA,IAAM3V,EAAI4V,EAAI,MACRrV,EAAOrG,EAAM,MAAM8F,GACnBzB,EAAIrE,EAAM,OAAO8F,GACjBlI,EAAIoC,EAAM,OAAO8F,GACjB8C,EAAOpH,GAAMsE,GACfwH,GAAMjN,EAAEgE,GAAKhE,EAAEzC,IAAM,EACrB2P,GAAMjN,EAAE+D,GAAK/D,EAAE1C,IAAM,EACzB,GAAIgL,EAAM,CACR,IAAMhD,EAAIjL,EAAAA,QAAQiO,EAAMhO,EAAAA,WAAWgO,CAAI,EAAI,CAAC,EAC5C,EAAKhD,EAAE,GACP,EAAKA,EAAE,EACT,CACA,MAAO,CACL,KAAM,OACN,GAAI,GAAGS,EAAK,OAAO,GAAGA,EAAK,SAC3B,OACA,MAAOrG,EAAM,UAAU8F,GACvB,MAAOrL,EAAAA,MAAMsH,GAAU+D,EAAE,EACzB,QAASwH,EAAKhL,EAAIC,EAAKiZ,EACvB,QAASjO,EAAKjL,EAAIE,EAAKiZ,CACzB,CACF,EAEME,IAAW,EAAe,IAC9BzX,IAAMkF,GAAM,CAAC,CAAClF,GAAK,CAAC,CAACkF,GAAKlF,EAAE,OAASkF,EAAE,MAAQlF,EAAE,QAAUkF,EAAE,MAEzD4P,GAAY,GAAoB,CACpC,GAAI2C,GAAQD,EAAKzY,CAAK,EAAG,CACnByY,GAAK1I,GAAgB,EACzB,MACF,CACA,EAAQ0I,EACRE,GAAc,EACd,EAAa,GACb5U,EAAW,EACXvH,GAAK,QAASic,EAAMH,GAAWG,CAAG,EAAI,IAAI,CAC5C,EAEMG,OACJ5Y,IACCE,IAAgBD,GAAc,EAC3B,CAAE,KAAM,OAAQ,MAAOA,CAAW,EAClC,MAEA0Y,OAAsB,CAC1B,IAAME,EAAM/c,EAAI,QACV2c,EAAMG,GAAc,EAC1B,GAAI,CAACH,GAAO,CAACJ,GAAe,EAAG,CAC7B,EAAI,MAAM,QAAU,OACpB,MACF,CACA,IAAM1b,EAAQ2b,GAAWG,CAAG,EACtBK,EACJ,OAAO9c,EAAQ,SAAY,SAAWA,EAAQ,QAAQ,OAAS,IAAA,GAC3D+c,EAAUD,EAASA,EAAOnc,CAAK,EAAIqc,GAAeP,CAAG,EAC3D,GAAIM,IAAY,KAAM,CACpB,EAAI,MAAM,QAAU,OACpB,MACF,CACI,OAAOA,GAAY,SAAU,EAAI,YAAcA,EAC9CF,EAAI,gBAAgBE,CAAO,EAChC,EAAI,MAAM,QAAU,QACpBhJ,GAAgB,CAClB,EAEMA,OAAwB,CAC5B,IAAM8I,EAAM/c,EAAI,QACV2c,EAAMG,GAAc,EAC1B,GAAI,CAACH,GAAOI,EAAI,MAAM,UAAY,OAAQ,OAC1C,IAAI5Q,EACAO,EACAX,EAAM,GACV,GAAI4Q,EAAI,OAAS,OACf,EAAKzI,GAAQyI,EAAI,KAAK,EACtB,EAAKxI,GAAQwI,EAAI,KAAK,EACtB,GAAQ,KAAK,IAAItb,EAAO,MAAMsb,EAAI,OAAQ,CAAC,EAAIpZ,EAAK,MAC/C,CACL,IAAM4Z,EAAKX,GAAWG,CAAG,EACzB,EAAKQ,EAAG,QAAUld,EAAM,WACxB,EAAKkd,EAAG,QAAUld,EAAM,SAC1B,CACA,IAAMgX,EAAK8F,EAAI,YACTK,EAAKL,EAAI,aACX3d,EAAI+M,EAAKJ,EACT3M,EAAI6X,EAAKjT,EAAQ,IAAG,EAAImI,EAAKJ,EAAMkL,GACvC,EAAI,KAAK,IAAI,EAAG,KAAK,IAAIjT,EAAQiT,EAAK,EAAG7X,CAAC,CAAC,EAC3C,IAAMC,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI4E,EAASmZ,EAAK,EAAG1Q,EAAK0Q,EAAK,CAAC,CAAC,EAC5D,EAAI,MAAM,UAAY,aAAa,KAAK,MAAMhe,CAAC,EAAE,MAAM,KAAK,MAAMC,CAAC,EAAE,IACvE,EAEMge,IAAO,EAAc,IAAkB,CAC3C,IAAMC,EAAKrhB,EAAAA,MAAM4D,EAAI,cAAc,KAAK,EAAG,CACzC,QAAS,OACT,WAAY,SACZ,IAAK,KACP,CAAC,EACKwI,EAAIpM,EAAAA,MAAM4D,EAAI,cAAc,MAAM,EAAG,CACzC,KAAM,WACN,MAAO,sCACT,CAAC,EACD,EAAE,YAAc0d,EAChB,IAAMlW,EAAIpL,EAAAA,MAAM4D,EAAI,cAAc,MAAM,EAAG,CACzC,WAAY,MACZ,mBAAoB,eACpB,WAAY,MACd,CAAC,EAGD,MAFA,GAAE,YAAc4F,EAChB6X,EAAG,OAAOjV,EAAGhB,CAAC,EACPiW,CACT,EAEME,IAAU,EAAe,IAAkB,CAC/C,IAAMF,EAAKrhB,EAAAA,MAAM4D,EAAI,cAAc,KAAK,EAAG,CACzC,QAAS,OACT,WAAY,SACZ,IAAK,MACL,WAAY,MACZ,aAAc,MACd,MAAO,4BACT,CAAC,EAED,OADAyd,EAAG,OAAOxhB,EAAAA,OAAO+D,EAAKoQ,CAAK,EAAGpQ,EAAI,eAAe4d,CAAK,CAAC,EAChDH,CACT,EAEMJ,GAAkB,GAAmB,CACzC,GAAM,CAAE,UAAW3c,EACbmd,EAAW7d,EAAI,uBAAuB,EAC5C,GAAI8c,EAAI,OAAS,OAAQ,CACvB,IAAM,EAAIA,EAAI,MACR/V,EAAO3F,EAAM,MAAM,GAEzB,GADAyc,EAAS,OAAOF,GAAO9hB,EAAAA,MAAMqH,EAAU,EAAE,EAAGpH,EAAAA,QAAQsF,EAAO,CAAC,CAAC,CAAC,EAC1D2F,EAAK,SAAU,CACjB,IAAMsP,EAAMja,EAAAA,MAAM4D,EAAI,cAAc,KAAK,EAAG,CAC1C,MAAO,uCACP,aAAc,KAChB,CAAC,EACD,EAAI,YAAc+G,EAAK,SACvB8W,EAAS,OAAOxH,CAAG,CACrB,CACA,IAAMjM,EAAIhJ,EAAM,QAAQ,GAkBxB,GAjBIgJ,GAAK,GAAGyT,EAAS,OAAOL,GAAIlD,EAAO,MAAOlZ,EAAM,OAAOgJ,EAAE,CAAC,IAAI,CAAC,EAC/D,OAAO,SAASrD,EAAK,KAAK,GAC5B8W,EAAS,OAAOL,GAAIlD,EAAO,MAAO5Z,EAAI,MAAMqG,EAAK,KAAM,CAAC,CAAC,GAEzD1F,IAAe,OACfhB,EAAQ,QACRe,EAAM,MAAM,KAAM,GAAM,EAAE,QAAQ,IACpB,CAAC+D,GAAO,GACtB0Y,EAAS,OAAOL,GAAIlD,EAAO,SAAU5Z,EAAI,MAAMU,EAAM,SAAS,EAAE,CAAC,CAAC,EAClEyc,EAAS,OAAOL,GAAIlD,EAAO,SAAU5Z,EAAI,MAAMU,EAAM,UAAU,EAAE,CAAC,CAAC,GACzD+D,GAAO,GACjB0Y,EAAS,OACPL,GAAIlD,EAAO,OAAQ5Z,EAAI,MAAMU,EAAM,SAAS,GAAKA,EAAM,UAAU,EAAE,CAAC,CACtE,EAEE+D,GAAO,GAAKxC,GAAY,GAAK,GAAK,CAACoP,GAAgB,CAAC,GACtD8L,EAAS,OAAOL,GAAIlD,EAAO,eAAgB5Z,EAAI,MAAMiC,GAAY,EAAE,CAAC,CAAC,EACnED,IAAU,MAAM,GAAI,CAEtB,IAAM0N,EAAQvU,EAAAA,MAAM2H,EAAa,EAC3Bsa,EAAM1hB,EAAAA,MAAM4D,EAAI,cAAc,KAAK,EAAG,CAC1C,QAAS,cACT,WAAY,SACZ,IAAK,MACL,UAAW,MACX,QAAS,QACT,aAAc,QACd,OAAQ,gCAAgCoQ,EAAM,oBAC9C,WAAY,sBAAsBA,EAAM,oBACxC,MAAO,6BACP,WAAY,MACZ,WAAY,MACd,CAAC,EACD,EAAI,UAAY,sBAChB,IAAM2N,EAAM9hB,EAAAA,OAAO+D,EAAKoQ,CAAK,EAC7BhT,EAAA,MAAM2gB,EAAK,CAAE,MAAO,MAAO,OAAQ,KAAM,CAAC,EAC1CD,EAAI,OAAOC,EAAK/d,EAAI,eAAesa,EAAO,QAAQ,CAAC,EACnDuD,EAAS,OAAOC,CAAG,CACrB,CACA,OAAOD,CACT,CACA,IAAM3W,EAAI4V,EAAI,MACRrV,EAAOrG,EAAM,MAAM8F,GACnBzB,EAAIrE,EAAM,OAAO8F,GACjBlI,EAAIoC,EAAM,OAAO8F,GACjBkH,EAAQ/K,GAAU6D,GAAK,MAAQ,MAOrC,GANA2W,EAAS,OACPF,GACE9hB,EAAAA,MAAMsH,GAAU+D,EAAE,EAClB,GAAGpL,EAAAA,QAAQsF,EAAOqE,CAAC,IAAI2I,IAAQtS,EAAAA,QAAQsF,EAAOpC,CAAC,GACjD,CACF,EACIyI,EAAK,MAAO,CACd,IAAMgW,EAAKzd,EAAI,cAAc,KAAK,EAClC,EAAG,YAAcyH,EAAK,MACtBoW,EAAS,OAAOJ,CAAE,CACpB,CAGA,OAFI,OAAO,SAAShW,EAAK,KAAK,GAC5BoW,EAAS,OAAOL,GAAIlD,EAAO,MAAO5Z,EAAI,MAAM+G,EAAK,KAAM,CAAC,CAAC,EACpDoW,CACT,EAEIG,GAAa,EACbC,GAAgD,KAC9CC,IAAiB,EAAW,IAAc,CAC9C,GAAe,CAAE,IAAG,GAAE,EAClB,KAAehe,KACnB,GAAaA,GAAI,0BAA4B,CAC3C,GAAa,EACb,IAAM8G,EAAIiX,GAEV,GADA,GAAe,KACX,CAACjX,GAAKrG,GAAawd,EAAM,OAC7B,IAAMrB,EAAML,GAAOzV,EAAE,EAAGA,EAAE,CAAC,EAC3BoT,GAAS0C,CAAG,EACZ,EAAM,MAAM,OACVA,GAAK,OAAS,OACV,UACA7X,EAAY,CAAC,EAAE,IACb,OACA,SACV,CAAC,EACH,EAIMmZ,IAAgB,EAAmB,IAAoB,CAEzD9e,EAAK,OAASkF,EAAU,MAAQ,CAAC,GAAGlF,CAAI,CAAC,CAAC,MAAO,GAAMkF,EAAU,IAAI9E,CAAC,CAAC,IAEzE8E,EAAU,MAAM,EAChBlF,EAAK,QAAS,GAAMkF,EAAU,IAAI9E,CAAC,CAAC,EACpC,EAAa,GACb0I,EAAW,EACX,EAAI,KAAK,YAAc5D,EAAU,KAC7BtI,EAAAA,KAAKwE,EAAI,OAAO,SAAU,CAAE,MAAOA,EAAI,MAAM8D,EAAU,IAAI,CAAE,CAAC,EAC9D9D,EAAI,OAAO,iBACX2d,GACFxd,GAAK,SAAU,CAAE,IAAK,CAAC,GAAG2D,CAAS,CAAC,CAAC,IAAK,GAAMpD,EAAM,MAAM1B,EAAE,CAAC,EAAE,CAAE,CAAC,EACxE,EAEM4e,IAAc,EAAW,IAAsB,CACnD,IAAM9D,EAAKvV,EAAY,EACvB,GAAI,CAACuV,GAAI,OAAQ,OACjB,IAAM+D,EAAQ/D,EAAG,SAAW,YAAcgE,EACpClf,EAAO,IAAI,IAAIif,EAAQ/Z,EAAY,CAAC,CAAC,EACvC+Z,GAASjf,EAAK,IAAII,CAAC,EAAGJ,EAAK,OAAOI,CAAC,EAClCJ,EAAK,IAAII,CAAC,EACf0e,GAAa9e,EAAM,EAAI,CACzB,EAIMmf,IAAgB,EAAW,EAAmB,IAAoB,CACtE,GAAI,CAACtc,GAAQ,CAACA,EAAK,SAASzC,EAAE,EAAE,OAAQ,MAAO,GAC/C,IAAM6G,EAAKnF,EAAM,MAAM1B,EAAE,CAAC,GAC1B,GAAIgf,IAAalc,EAAa,IAAI+D,CAAE,EAAG,MAAO,GAC1CmY,EAAUlc,EAAa,IAAI+D,CAAE,EAC5B/D,EAAa,OAAO+D,CAAE,EAC3B,IAAMU,EAAOf,GAAS,EACtBoC,GAAUrB,EAAM,EAAI,EAEpB,IAAM0X,EAAO,IAAI,IAAI,CAAC,GAAGna,CAAS,CAAC,CAAC,OAAQ,GAAMzC,EAAQoF,EAAE,CAAC,EAU7D,OATIwX,EAAK,OAASna,EAAU,MAAM4Z,GAAaO,EAAM,EAAI,EACrDra,GAAc,GAAK,CAACvC,EAAQuC,KAAa,EAAa5E,GAC1D,EAAI,KAAK,YAAcgf,EACnBxiB,EAAAA,KAAKwE,EAAI,OAAO,UAAW,CACzB,KAAM5E,EAAAA,QAAQsF,EAAO1B,CAAC,EACtB,MAAOgB,EAAI,MAAMiC,GAAYjD,EAAE,CACjC,CAAC,EACDxD,EAAAA,KAAKwE,EAAI,OAAO,SAAU,CAAE,KAAM5E,EAAAA,QAAQsF,EAAO1B,CAAC,CAAE,CAAC,EACrD2e,GAAQxd,GAAK,SAAU,CAAE,KAAI,UAAW6d,CAAS,CAAC,EAC/C,EACT,EAcIP,EAAyB,KACvBS,GAAW,IAAI,IAEfC,GAAS,GAA4C,CACzD,IAAM7Q,EAAI5N,EAAM,sBAAsB,EACtC,MAAO,CAAE,EAAG,EAAE,QAAU4N,EAAE,KAAM,EAAG,EAAE,QAAUA,EAAE,GAAI,CACvD,EAEM8Q,OAAkB,CACtB,IAAMhR,EAAM,CAAC,GAAG8Q,GAAS,OAAO,CAAC,EAC3BtZ,EAAIwI,EAAI,IAAM,CAAE,EAAG,EAAG,EAAG,CAAE,EAC3BtD,EAAIsD,EAAI,IAAMxI,EACpB,MAAO,CACL,SAAU,KAAK,MAAMA,EAAE,EAAIkF,EAAE,EAAGlF,EAAE,EAAIkF,EAAE,CAAC,EACzC,OAAQ,CAAE,GAAIlF,EAAE,EAAIkF,EAAE,GAAK,EAAG,GAAIlF,EAAE,EAAIkF,EAAE,GAAK,CAAE,CACnD,CACF,EAEMuU,GAAiB,GAAoB,CACzC,IAAMvE,EAAKvV,EAAY,EAEvB,GADI,CAACuV,GACA,EAAE,QAA2B,UAAU,QAAQ,EAAG,OACvD,IAAMxT,EAAI6X,GAAM,CAAC,EAIjB,GAHAD,GAAS,IAAI,EAAE,UAAW5X,CAAC,EAC3B5G,EAAM,oBAAoB,EAAE,SAAS,EACrC,GAAY,KACRwe,GAAS,OAAS,IAAMpE,EAAG,MAAQA,EAAG,KAAM,CAC9C,GAAM,CAAE,WAAU,UAAWsE,GAAU,EACvC,EAAO,CACL,KAAM,QACN,MAAO,GACP,OAAQE,EACR,KAAM,CAACtb,EAAGC,EAAIC,CAAE,EAChB,OAAQ,CAAC,EAAG,CAAC,EACb,WACA,MAAO,GACP,OAAQ,CACV,EACA,MACF,CACA,GAAIgb,GAAS,KAAO,EAAG,OACvB,IAAMlf,EAAI,EAAE,SAAW,EAAIub,GAASjU,EAAE,EAAGA,EAAE,CAAC,EAAI,GAC1CkG,EAAO,CACX,OAAQlG,EACR,KAAM,CAACtD,EAAGC,EAAIC,CAAE,EAChB,SAAU,EACV,MAAO,GACP,OAAQ,EAAE,MACZ,EACA,AAQEua,EAREze,GAAK,GAAK8a,EAAG,KACR,CACL,GAAGtN,EACH,KAAM,OACN,MAAOxN,EACP,OAAQ,EAAEsH,EAAE,EAAIrD,GAAMD,EAAIjC,EAAE/B,IAAKsH,EAAE,EAAIpD,GAAMF,EAAIhC,EAAEhC,EAAE,CACvD,EAEO,CAAE,GAAGwN,EAAM,KAAM,MAAO,MAAOxN,EAAG,OAAQ,CAAC,EAAG,CAAC,CAAE,EAEtD,EAAE,SAAW,GAAG,EAAE,eAAe,CACvC,EAEMuf,GAAiB,GAAoB,CACzC,IAAMjY,EAAI6X,GAAM,CAAC,EAEjB,GADID,GAAS,IAAI,EAAE,SAAS,GAAGA,GAAS,IAAI,EAAE,UAAW5X,CAAC,EACtD,CAACmX,EAAM,CACT,GAAI,EAAE,cAAgB,SAAWS,GAAS,KAAM,OAChDV,GAAclX,EAAE,EAAGA,EAAE,CAAC,EACtB,MACF,CACA,IAAMwT,EAAKvV,EAAY,EACvB,GAAI,CAACuV,EAAI,OACT,GAAI2D,EAAK,OAAS,QAAS,CACzB,GAAM,CAAE,WAAU,UAAWW,GAAU,EACjC,CAACxL,EAAIC,EAAIC,GAAM2K,EAAK,KACpB,CAACzJ,EAAIC,GAAMuE,GAAW,EACtBgG,EAAQ1E,EAAG,MAAQ2D,EAAK,SAAW,EAAIgB,EAAWhB,EAAK,SAAW,EAClE3E,EAAK,KAAK,IAAI9E,EAAI,KAAK,IAAIC,EAAIrB,EAAK4L,CAAK,CAAC,EAC1CxF,EAAQF,EAAKlG,EACb0F,EAAKmF,EAAK,OAAO,EACjBlF,EAAKkF,EAAK,OAAO,EACjBiB,EAAK5E,EAAG,IAAMwE,EAAO,EAAIhG,EACzBqG,EAAK7E,EAAG,IAAMwE,EAAO,EAAI/F,EAC/B,EAAIO,EACJ,EAAK4F,GAAMpG,EAAKzF,GAAMmG,EACtB,EAAK2F,GAAMpG,EAAKzF,GAAMkG,EACtB,GAAY,GACZ,EAAa,GACbtR,EAAW,EACX,MACF,CACA,IAAMyD,EAAK7E,EAAE,EAAImX,EAAK,OAAO,EACvBrS,EAAK9E,EAAE,EAAImX,EAAK,OAAO,EAC7B,GAAI,CAACA,EAAK,OAAS,KAAK,MAAMtS,EAAIC,CAAE,EAAI,EAAG,OAM3C,GALKqS,EAAK,QACR,EAAK,MAAQ,GACT9Z,GAAO+V,GAAS,IAAI,EACxB,EAAM,MAAM,QAAS+D,EAAK,KAAkB,aAE1CA,EAAK,OAAS,OAAQ,CACxB,IAAMze,EAAIye,EAAK,MAEf,GAAe,GACf,IAAMjD,GAAMlU,EAAE,EAAIrD,GAAMD,EAAIya,EAAK,OAAO,GAClChD,GAAMnU,EAAE,EAAIpD,GAAMF,EAAIya,EAAK,OAAO,GACxC,GAAI7b,EAAQA,EAAO,KAAK5C,EAAGwb,EAAIC,CAAE,OAC5B,GAAI9Z,IAAe,QAAS,CAE/B,IAAM4F,EAAOf,GAAS,EACtBoZ,GAAerY,CAAI,EACnB3E,GAAgC,KAAK5C,EAAGwb,EAAIC,CAAE,CAChD,CACA,EAAEzb,GAAK,EAAGA,GAAKwb,EACf,EAAExb,GAAK,GAAGA,GAAKyb,EACf,GAAa,GACb/S,EAAW,EACX,MACF,CACA,GAAI,CAACoS,EAAG,IAAK,OACb,GAAM,CAAClH,EAAIC,EAAIC,GAAM2K,EAAK,KAC1B,EAAI7K,EACJ,EAAKC,EAAK1H,EACV,EAAK2H,EAAK1H,EACV,GAAY,GACZ,EAAa,GACb1D,EAAW,CACb,EAEMkX,GAAkB,GAAgC,CACtDlZ,GAAW,EAEXO,GAAWM,EAAM,EAAK,CACxB,EAEMsY,GAAe,GAAoB,CACvC,IAAMC,EAAMrB,EAIZ,GAHAS,GAAS,OAAO,EAAE,SAAS,EACvBxe,EAAM,oBAAoB,EAAE,SAAS,GACvCA,EAAM,sBAAsB,EAAE,SAAS,EACrCwe,GAAS,KAAM,CACbY,GAAK,OAAS,UAAS,EAAO,MAClC,MACF,CAGA,GAFA,EAAO,KACP,EAAM,MAAM,OAASva,EAAY,CAAC,EAAE,IAAM,OAAS,UAC/C,CAACua,EAAK,OACV,GAAIA,EAAI,OAAS,QAAUA,EAAI,MAAO,CACpCld,GAAQ,QAAQkd,EAAI,MAAO,CAAC,CAACpe,EAAM,MAAMoe,EAAI,MAAM,CAAC,KAAK,EACzD,MACF,CACA,GAAIA,EAAI,OAASA,EAAI,SAAW,EAAG,OACnC,IAAMxY,EAAI6X,GAAM,CAAC,EACX/B,EAAML,GAAOzV,EAAE,EAAGA,EAAE,CAAC,EAC3ByY,GAAY3C,EAAK,EAAE,SAAW,EAAE,SAAW,EAAE,QAAQ,CACvD,EAEM2C,IAAe,EAAiB,IAAsB,CAC1D,GAAI,CAAC3C,EAAK,CACJtY,EAAU,MAAQS,EAAY,CAAC,EAAE,QACnCmZ,GAAa,IAAI,IAAO,EAAI,EAC9B,MACF,CACA,IAAMpd,EAAQ2b,GAAWG,CAAG,EAE5B,GADAjc,GAAK,QAASG,CAAK,EACf8b,EAAI,OAAS,OAAQ,OACzB,IAAMpd,EAAIod,EAAI,MACV1X,GAAY,GAAKjD,GAAM,SAASzC,EAAE,EAAE,QACtC+e,GAAa/e,EAAGqS,GAAgBrS,CAAC,EAAG,EAAI,EAC1C4e,GAAW5e,EAAG8e,CAAQ,CACxB,EAEMkB,GAAmB,GAAoB,CAC3Cd,GAAS,OAAO,EAAE,SAAS,EACtBA,GAAS,OACRT,GAAM,OAAS,QACjB7b,GAAQ,QAAQ6b,EAAK,MAAO,CAAC,CAAC/c,EAAM,MAAM+c,EAAK,MAAM,CAAC,KAAK,EAC7D,EAAO,KAEX,EAEMwB,OAAuB,CAC3B,GAAe,KACX,CAACxB,GAAQ9Z,GAAO+V,GAAS,IAAI,CACnC,EAEIwF,GAA+C,EAC7CC,OAAiB,CACrB,IAAMC,EAAM,kBAAkB,KAAK5f,IAAK,WAAW,UAAY,EAAE,EACjE,EAAI,KAAK,YAAchE,EAAAA,KAAKwE,EAAI,OAAO,SAAU,CAC/C,IAAKof,EAAM,IAAM,MACnB,CAAC,EACD,EAAI,KAAK,MAAM,QAAU,IACrBF,IAAW,aAAaA,EAAS,EACrC,GAAY,eAAiB,CAC3B,GAAY,EACZ,EAAI,KAAK,MAAM,QAAU,GAC3B,EAAG,IAAI,CACT,EAEMG,GAAW,GAAkB,CACjC,IAAMvF,EAAKvV,EAAY,EACvB,GAAI,CAACuV,GAAI,KAAM,OACf,IAAM1b,EAAQ,EAAE,SAAW,CAAC,EAAE,QAC9B,GAAI0b,EAAG,QAAU,YAAc,CAAC,EAAE,SAAW,CAAC,EAAE,QAAS,CACnD,KAAK,IAAI,EAAE,MAAM,EAAI,KAAK,IAAI,EAAE,MAAM,GAAGqF,GAAS,EACtD,MACF,CACA,EAAE,eAAe,EACjB,IAAM7Y,EAAI6X,GAAM,CAAC,EACjB,GAAY,KACZtF,GAAW,EAAI7a,GAAY,EAAE,OAAQ,EAAE,UAAWI,CAAK,EAAGkI,EAAE,EAAGA,EAAE,CAAC,EAC9D3C,GAAO+V,GAAS,IAAI,CAC1B,EAEM4F,GAAiB,GAAkB,CACvC,GAAI,CAAC/a,EAAY,EAAG,OACpB,IAAM+B,EAAI6X,GAAM,CAAC,EACb5D,GAASjU,EAAE,EAAGA,EAAE,CAAC,GAAK,IAC1B,EAAE,eAAe,EACjBiZ,GAAS,IAAI,EAAI,EACnB,EAEMC,OAAgB,CACpB,IAAI3F,EACJ,GAAI,CACF,EAAWna,EAAM,QAAQ,gBAAgB,CAC3C,MAAQ,CACN,EAAW,EACb,CACA,GAAema,EACXA,IACF,EAAM,MAAM,UAAY,0CAC5B,EAEM4F,OAAe,CACnB,EAAM,MAAM,UAAY,GACxB,GAAe,GACX7b,GAAc,IAChB,EAAa,GACb0Y,GAAc,EACd,EAAa,GACb5U,EAAW,EAEf,EAEMgY,OAAmB,CACvB,IAAM9N,EAAiB,CAAC,EACxB,IAAK,IAAI5S,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IACvB4J,EAAKtL,CAAC,EAAI,IAAO,KAAUqC,EAAQrC,KAAK4S,EAAK,KAAK5S,CAAC,EACzD,OAAO4S,CACT,EAEM+N,GAAY,GAAc,CAC9B,GAAI3gB,IAAM4E,EAAY,OACtB,EAAa5E,EACb,GAAe,GACf,EAAa,GAEb,IAAM4P,EAAK+E,GAAQ3U,CAAC,EACdiW,EAAKrB,GAAQ5U,CAAC,GAGlB4P,EAAK,IACLqG,EAAK,IACLrG,EAAKnL,EAAQ,IACbwR,EAAKvR,EAAS,KAEdkV,GAAQ,CAAC5V,EAAGC,EAAKQ,EAAQ,EAAImL,EAAI1L,EAAKQ,EAAS,EAAIuR,CAAE,EAAG,EAAI,EAE9D,IAAMvL,EAAIhJ,EAAM,QAAQ1B,GAClB4gB,EAASlf,EAAM,SAAS1B,GAAK0B,EAAM,UAAU1B,GACnD,EAAI,KAAK,YACP0K,GAAK,EACDlO,EAAAA,KAAKwE,EAAI,OAAO,eAAgB,CAC9B,KAAM5E,EAAAA,QAAQsF,EAAO1B,CAAC,EACtB,MAAO0B,EAAM,OAAOgJ,EAAE,CAAC,KACvB,OAAQ1J,EAAI,MAAM4f,CAAM,CAC1B,CAAC,EACDpkB,EAAAA,KAAKwE,EAAI,OAAO,UAAW,CACzB,KAAM5E,EAAAA,QAAQsF,EAAO1B,CAAC,EACtB,OAAQgB,EAAI,MAAM4f,CAAM,CAC1B,CAAC,EACPtD,GAAc,EACd5U,EAAW,EACXvH,GAAK,QAAS8b,GAAW,CAAE,KAAM,OAAQ,MAAOjd,CAAE,CAAC,CAAC,CACtD,EAGM6gB,IACJ,EACA,EACA,IACW,CACX,IAAMjR,EAAK+E,GAAQhL,CAAI,EACjBsM,EAAKrB,GAAQjL,CAAI,EACnB2C,EAAO,GACPwU,EAAY,IAChB,IAAK,IAAM9gB,KAAK0gB,GAAW,EAAG,CAC5B,GAAI1gB,IAAM2J,EAAM,SAChB,IAAMoX,EAAKpM,GAAQ3U,CAAC,EAAI4P,EAClBoR,EAAKpM,GAAQ5U,CAAC,EAAIiW,EAClB5I,EAAQ0T,EAAK5U,EAAK6U,EAAK5U,EAC7B,GAAIiB,GAAS,GAAK,SAClB,IAAMP,EAAS,KAAK,IAAIiU,EAAK3U,EAAK4U,EAAK7U,CAAE,EACzC,GAAIW,EAASO,EAAQ,IAAK,SAC1B,IAAM4T,EAAQ5T,EAAQP,EAAS,EAC3BmU,EAAQH,IACV,EAAYG,EACZ,EAAOjhB,EAEX,CACA,OAAOsM,CACT,EAEM4U,OAAqB,CACzB,IAAMC,EAAQ,CAAC,GAAGrc,CAAS,CAAC,CAAC,KAAM,GAAMwG,EAAKtL,CAAC,EAAI,CAAC,EACpD,GAAImhB,IAAU,IAAA,GAAW,OAAOA,EAChC,IAAK,IAAMnhB,KAAK0B,EAAM,KAAM,GAAI4J,EAAKtL,CAAC,EAAI,EAAG,OAAOA,EACpD,MAAO,EACT,EAEMohB,GAAa,GAAqB,CACtC,IAAMtG,EAAKvV,EAAY,EACvB,GAAI,CAACuV,GAAI,SAAU,OAOnB,IAAMrL,EAAM,CALV,UAAW,CAAC,GAAI,CAAC,EACjB,WAAY,CAAC,EAAG,CAAC,EACjB,QAAS,CAAC,EAAG,EAAE,EACf,UAAW,CAAC,EAAG,CAAC,CAEN,EAAK,EAAE,KACnB,GAAIA,EAAK,CAEP,GADA,EAAE,eAAe,EACb7K,EAAa,GAAK0G,EAAK1G,CAAU,GAAK,EAAG,CAC3C,IAAMuX,EAAQ+E,GAAa,EACvB/E,GAAS,GAAGwE,GAASxE,CAAK,EAC9B,MACF,CACA,IAAMvc,EAAOihB,GAAoBjc,EAAY6K,EAAI,GAAIA,EAAI,EAAE,EACvD7P,GAAQ,GAAG+gB,GAAS/gB,CAAI,EAC5B,MACF,CACA,OAAQ,EAAE,IAAV,CACE,IAAK,QACL,IAAK,IACH,GAAIgF,EAAa,EAAG,OACpB,EAAE,eAAe,EAEf,EAAE,MAAQ,SACVc,GAAY,GACZjD,GAAM,SAASmC,EAAW,EAAE,QAE5Bma,GAAana,EAAYyN,GAAgBzN,CAAU,EAAG,EAAI,EAC5DzD,GAAK,QAAS8b,GAAW,CAAE,KAAM,OAAQ,MAAOrY,CAAW,CAAC,CAAC,EAC7Dga,GAAWha,EAAY,EAAE,SAAW,EAAE,SAAW,EAAE,MAAQ,GAAG,EAC9D,OACF,IAAK,IACL,IAAK,IACH,GAAI,CAACkW,EAAG,KAAM,OACd,EAAE,eAAe,EACjBjB,GAAW/a,GAAU2F,EAAQ,EAAGC,EAAS,EAAG,EAAI,EAChD,OACF,IAAK,IACL,IAAK,IACH,GAAI,CAACoW,EAAG,KAAM,OACd,EAAE,eAAe,EACjBjB,GAAW,EAAI/a,GAAU2F,EAAQ,EAAGC,EAAS,EAAG,EAAI,EACpD,OACF,IAAK,IACL,IAAK,OACH,EAAE,eAAe,EACjB6b,GAAS,IAAI,EAAI,EACjB,OACF,IAAK,SAEH,GAAI,EADQ3b,GAAc,GAAKE,EAAU,KAAO,GAAOH,GAC7C,OACV,EAAE,eAAe,EACjB,EAAa,GACTA,GAAO+V,GAAS,IAAI,EACxBgE,GAAa,IAAI,IAAO,EAAI,EAC5BpB,GAAc,EACd,EAAa,GACb5U,EAAW,EACX,MAGJ,CACF,EAEM2Y,OAAiBxH,GAAW9a,GAAa0F,EAAQ,EAAGC,EAAS,EAAG,EAAI,EACpE4c,OACJzH,GAAW,EAAI9a,GAAa0F,EAAQ,EAAGC,EAAS,EAAG,EAAI,EACnD6c,OAAchB,GAAS,IAAI,EAAI,EAErC7f,EAAM,iBAAiB,cAAe2e,EAAa,EACnD3e,EAAM,iBAAiB,cAAe6e,EAAa,EACnD7e,EAAM,iBAAiB,YAAamf,EAAW,EAC/Cnf,EAAM,iBAAiB,gBAAiBsf,EAAe,EACvDtf,EAAM,iBAAiB,eAAgBuf,EAAc,EACrDvf,EAAM,iBAAiB,QAAS2f,GAAS,CAAE,QAAS,EAAM,CAAC,EAC3D3f,EAAM,iBAAiB,WAAY4f,EAAa,EAChD5f,EAAM,iBAAiB,UAAW0gB,EAAS,EAC3C1gB,EAAM,iBAAiB,QAAS8f,EAAO,EACvC9f,EAAM,iBAAiB,OAAQ+f,EAAM,EACrChgB,EAAI,OAAO,iBAAiB,QAAS4gB,EAAQ,EAC7C5gB,EAAI,QAAQ,iBAAiB,QAAS6gB,EAAS,EAC/C7gB,EAAI,IAAI,iBAAiB,QAAS8gB,EAAK,EAIvC,IAAMC,GACJ,OAAO,gBAAmB,WACtB,IAAI,mBAAqB9Y,EAAW,CAAC,EACrC,KACN8Y,IAAgB,QAAQ9gB,CAAK,EAE7B,IAAM+gB,OAAqB,CACzB,GAAIxgB,EAAW,OACf,IAAMrB,EAAOvF,EAAAA,UAAUoG,EAAI,KAAME,EAAQ,OAAO,EAC1C+gB,EAAc9hB,EAAK,aAAeiB,EAAM,WAC9C,GAAKlE,EAAAA,mBAAmBkE,EAAOjB,CAAI,GAAM8hB,EAEzC,IADA,EAAQ9hB,EACJ8hB,EAAa,CACf9Y,GAAUpC,GAAS,EAAG,EAAK,EAC3B,MACF,CACAqD,GAAc,EACd,GAAY,GACZE,GAAa,EACb,GAAe,GACfrB,EAAW,CALX,CAMF,EACMiZ,GAAe/kB,EAAAA,WAAW6kB,EAAY,EAEtCG,GAAgB/kB,EAAAA,gBAAkB,CAClCoE,GAAanE,EAAAA,cAAc6D,EAAQ,MAAM,IAAMK,EAAI,SACvD,EAAM1G,EAAAA,YAAYqG,EAAQ,OAAQA,EAAQ,MAAM,EAChDmJ,GAAoB,GAChBnF,GAASC,GAAc,IAAG0Y,GAAc,EAC9C,CAAC,EAIKuE,GAAe,MAAO,EAAkC,IAAI,MAAU,CAC1E,IAAMC,EAAQ,EAAE5c,GACVtF,EAAO,MAAM7C,EAAAA,eACjB4D,EAAQ,UAAY,WACd,CACJ,IAAMohB,EAASrlB,EAAAA,MAAM4D,EAAI,cAAc,QAAQ,EAAG,CAChD,SAAU,WACV,KAAM,IACN,IAAK,IACL,cAAe,MACjB,CAAC,EAGD,OAFAyhB,EAAO,aAAa,cAAe,MAAM,EACzC,EAAO,UAAY,qBACZA,CACT,EACC,GAAS,CACJ9gB,GAAagE,GAAU,OAAS+c,IACpC/c,EAAS,QAAQ,EACjBA,EAAS,OAAO,OAAO,EACvB,EAAW,KACX4c,GAAkB,IAAI,IAAI,CAAC,GAAGI,EAASD,CAAI,CAAC,CAAC,EAC/C,EACAC,CACF,EACA,GAAIhhB,GAAa6gB,IAAU5c,GAAe,CACxCtF,GAAM,QAAQ,EACd,MACF,CACIqF,IACFA,EAAS,QAAQ,EACjBA,EAAS,OAAO,OAAO,GAEzB,EAAWrF,EACX,EAAa,GACTA,GACF,EAAI,KAAK,QAAQ,SAAWA,EAAK,KACjCc,EAAM,aAAad,EAAK,OAAQa,EAAI,UAAU,EAC9CU,GAAK,WAAYvB,EAAK,IAAI,GAE1B,OAAOa,EAAI,KAAK,QAAQ,SAE1B0E,GAAavF,GAAM,MAAQ,IAAI,EAC/B8I,EAAW,CACb,EAIMwZ,GAAgB,GAAyB,CAC7Cpf,EAAa,MAAM,EACnB,IAAK,IAAMuE,KAAQjH,EAAE,OAAS,CAAC,EACzBiH,GAAM,WAAWvE,EAAa,IAAIuE,EAAK,EAAE,EAC/CtE,GAAa,MAAM,EACnB,IAAK,IAAM2H,KAAKtK,EAAE,QAAU,CAAC,EAAOsK,GAAG,QAAQ3H,GAAa,IAAI2H,EAAE,EAAE,CACtE,EAEMyX,OAA4B,CAChC,GAAI,CAACxhB,EAAQ,SAAU,OACvB,IAAMf,EAAO,IAAI,IACjB,IAAK,IAAMiH,KAAMlG,EAAQ,SAAU,CACjC,IAAMX,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EACxB7G,IAAM,IAAA,IAAWJ,EAAK,IAAII,CAAC,CACjC,CACA8E,EAAU,MAAM,EAChBlF,EAAK,QAAS,GAAMkF,EAAU,IAAI9E,CAAC,CAAC,EACpC,GAAe,GACf,EAAa,EACf,EAEAkiB,GAAavhB,CAAO,EACpBiI,GAAU,IAAI,IAAO,EAAK,EAC1BuZ,GAAoB,EACpBN,GAAkB,EAClB,IAAMO,GAAkBplB,EAAAA,0BAChB2D,EAAQ,aACR,KAAKkhB,GAAa,CAC1B,EAIMQ,IAAe,EAAyB,IAAyB,CACrE,IAAM9a,EAAOf,GAAS,EAChB+D,EAAM,CAAC,GAAGzF,CAAS,CAAC,CAAC,IAAK,GAAMpD,EAAM,MAAM1B,EAAE,CAAC,EAAE,EACjDsiB,EAAU1d,GAAc,EAAIlD,EAAM,MAAMkD,EAAW,CAAC,GAAK,KAC/D,GAAI2d,EAAa,CAEf,IAAK,IAAMlb,KAAQzH,EAAK,OAAS,CAAC,EAC5ByH,GAAM,WAAWvE,EAAa,IAAIuE,EAAK,EAAE,EAC/C,EAAQ9M,EAAAA,WAAWqF,EAAK,OAAS,CAAC,EAAGA,EAAK,OAAS,CAAC,EAAGA,EAAK,MAAM,EAClE,IAAK,IAAM8K,KAAK9K,EAAK,QAAU,CAAC,EAAO8K,GAAG,QAAQ3H,GAAa,IAAI2H,EAAE,EAAE,EACvE5F,EAAU,MAAM,EAChB,IAAK,IAAM+B,KAAM0D,EAAK,CACpB,IAAMvK,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EACxB7G,IAAM,IAAA,IAAW8E,EAAU,IAAI9E,CAAC,CACtC,CACA,EAAasiB,IAAY,KAA0C,GAAlC5gB,EAAM,MAAM,IAAI4gB,CAAO,GAAK,GAC7D,EAAQ,KACR,EAAI,QAAQ,MAAM,QAAU,MAC9B,CACA1Z,GAAUrB,EAAM,EAAI,CACtB,EAEMgZ,GAA+B,CACnC,WAAW,EAAM,CACf,GAAItf,EAAW,OACf,IAAMuhB,EAAW7hB,EACjB,EAAUf,GACLA,EAAK,SAAW,CAAC,EAAA,CAAG,KAAK,KAAO4iB,EAAS,SAAW,CAAC,EAAA,CAAG,KAAK,IAChE,EAAQnoB,EAAAA,UAAUoG,EAAI,KAAMb,EAAK,OAAO,IAEtCA,EAAK,SAAW4iB,EAAS,QAAU5iB,EAAK,SAAW4iB,EAAS,UAC9D,EAAMloB,EAAAA,YAAYsF,EAAK,OAAQA,EAAK,MAAM,GAE5C,IAAM2iB,EACJ3iB,EAAK,QAAU4iB,EAAS,OACxB5iB,EAAK,QAAU4iB,EAAS,OACxB5iB,EAAK,SAAW4iB,EAAS,OACrBC,EAAMtiB,GAAgBP,CAAI,EAC5B2iB,GAAeE,IAAQ5gB,IACzB,GAAY4gB,EACZJ,GAAYziB,EAAM2iB,CAAW,IAE7B3Y,GAAgB,EAChBC,GAAc,EACd,GAAa,GACb,GAAe,GACf,GAAY,GACZE,GAAa,EACbD,GAAoB,EACpBpB,EAAW,IAGV9I,EAAK,UAAY,CAAC,EAAA,CAAG,KAAK,GAAQ,KAClC4iB,EAAS,UAAY,CAAC,EAAA,CAAG,KAAK,GAAQ,GAEvCL,GAAoB,GACjBviB,EAAK,UAAY,WAAa4iB,EAAS,UAAY,SACtDX,GAAkB,CACtB,EACA,QAAQ,EAAM,CACR5gB,GACJsf,GAAS,WAAW,CAClB,GAAG5f,EACH,MAAOnB,EAAK,MACZ,MAAOA,EAAK,MACZ,OAAQA,EAAK,QAAUmB,EAAQ,MACjC,CAAC,CACH,EACA,IAAI,EAAU,GAAM,CAClB,GAAIM,EAAW,OACf,GAAY,GAER2B,GAAQ,QAAQ,IAAG,GAAe,IACtC,IAAM6Q,EAASC,GAAQ,EACnBD,EAAQmG,GAAQnG,EAAQpL,CAAO,EAC9B,GAAW,GAChBK,EAAW,CACb,EACA,UAAU,EAAI,EAAO,CAAC,EAAG,CACvB,GAAIzH,EAAW,OACf,IAAIjB,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EAC1B,GAAI7G,IAAM,IAAA,GAAW,OAErB,GAAIyC,GAAQ,CAACJ,EAAQrC,GAAI,CACvB,IAAI0iB,EAAU,GACd,IAAK,IAAI9c,EAAInD,EAAK,OAAOzC,GAAI4F,GAAK,EAAG,EAAInD,EAAK,OAAOmD,GAC/C9C,EAAa,OAAOpB,EAAM,MAAMkE,EAAE,CAAC,EAAE,IAAG,EAAU,IAEpD8c,GAAS9Z,GAAUpC,GAAS,EAAGmc,EAAK,UAAY,EAAK,EACzD,EAAIjhB,EAAM,MAAM,IAAImF,CAAE,CACxB,CACA,IAAMqN,EAAKyO,EAAK,MAAQ,KAAK,IAAI3e,EAAG,CAAC,EAC/B,CAACgR,EAAIC,GAAMuE,GAAW,EACtBM,EAAK,KAAK,IAAI9E,EAAI,KAAK,IAAIC,EAAIf,CAAE,CAAC,EACxC,GAAY,GACZ,IAAMnN,EAAItC,GAAS/D,EAAM,YACnBsG,EAAItC,GAAUhE,EAAM,aAC1BkZ,GACE,CAACE,EAAI/S,EAAI,EAAI9E,EAAGjC,GAAK8Z,EAAI9S,EAAI,EAAI9E,GAAGlC,GAAK8Z,CAAE,EAC3C6I,EAAK,UAAY,EACnB,EACA,EAAa3iB,EACb,GAAe,GACf,EAAa,GACb0I,EAAW,CACb,EACA,OAAO,EAAK,CACV,GAAIzH,EAAW,OACf,IAAM2R,EAAOrI,IAAQ,KAAO,CAAC,EAAI,OAAOA,GAAQ,SAAW,CAACA,CAAG,EAAIA,EAC7D3K,EAAO,IAAI,IACjB,IAAK,IAAMiH,KAAM+L,EAAM,CACrB,IAAM5S,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EACxB7G,IAAM,IAAA,IAAWJ,EAAK,IAAII,CAAC,CACjC,CACA0e,GAAa9e,EAAM,EAAI,CACzB,EACA,iBAAoB,CAAC,GAAGkF,CAAS,CAAC,CAAC,IAAK,GAAMpD,EAAM,MAAM1B,EAAE,CAAC,EAAE,EAC/D,OAAO,EAAI,CACT,GAAIiB,EAAW,OACf,GAAI4F,IAAO,IAAA,GAAW,CACpB,GAAI,CAAC/D,EAAa,KAAM,OACxB,IAAMyH,EAAM,CAAC,GAAGzH,CAAY,EAC5BA,EAAa,MAAM,EACnB8F,GAAUpC,GAAS,EAAG,EAAI,EAC1B,IAAK,IAAMhB,KAAK+E,EACV7I,EAAM,MAAM,IAAI8D,CAAC,GAAGrE,GAAK,SAAU,CAAE,GAAIqE,EAAG,UAAW,EAAM,CAAC,EAEpE,MACF,CACA,IAAMxF,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EACxB7G,IAAM,IAAA,GACL8C,EAAa,OAAO+D,CAAE,EADNkY,GAAa/e,EAAG,GAAO,EAAI,CAElD,EACA,SAAS,EAAI,CACX,GAAIiB,EAAW,OACf,GAAI4F,IAAO,IAAA,GAAW,CACpB,GAAI,CAACpE,EAAM,OACX,IAAMigB,EAAoB,CAAC,EAY3B,GAXAjgB,EAAK,SAAS,SAAS,EAAM,IAAM,CACjC,IAAMmgB,EAASlhB,EAAM,MAAM1B,EAAE,CAAC,GAE5B4S,EAAK,QACLnQ,EAAM,OAAOzC,IAAM,GACnB,CAAC8C,EAAa,IAAI8f,CAAM,IAExB9f,EAAa,IAAI8f,CAAM,EACvBF,EAAQ,KAAKE,CAAM,EAEvB,CAAC,EACG,CAACF,EAAQ,OAAQ,OACrB9Z,GAAUpC,GAAS,EAAG,EAAI,EAC1B,IAAK,IAAMhB,KAAKkd,EAASvhB,GAAK,SAAU,CAAE,GAAIqE,EAAG,UAAW,EAAK,CAAC,EAClE,MACF,CACA,IAAMxF,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EACxB7G,IAAM,IAAA,IAAW+e,GAAa/e,EAAG,GAAM,EAAI,CACjD,EACA,OAAO,EAAI,CACT,IAAMA,EAAI0B,EAAM,MAAM,IAAImF,CAAE,EACxB7G,IAAM,IAAA,IAAaiB,GACvB8d,GAAa/e,EAAGqS,GAAgBrS,CAAC,EAAG,EAAI,CAC1C,EACA,cAAe,CACb,IAAMmO,EAAkC,CAAC,EACzC,IAAK,IAAInO,EAAI,EAAGA,EAAI0B,EAAM,EAAG,IAC3B,EAAIA,EAAM,MAAM1B,EAAE,CAAC,IAAM,CAAE,EAAGiC,EAAGjC,GAAI,EAAGkC,GAAGlC,EAAG,EAEhD,OAAOmO,CACT,EACA,UAAW,CACLlN,GACJ2H,GAAUjH,IAAe,QAAU,IAAI,IAAQ6E,GAAS,EAAG,EAAI,CACjE,EACA,QAAS,CACPkC,EAAW,CACb,EACA,gBAAmBzD,GAAU,MAAQ,KACrC,SACA,gBACA,GAAG,EAAM,EAAU,CACjB,IAAI2B,EAAM1F,GAAU,IAAIE,CAAI,EAM5B,OALKwF,IACH,EAAM,IAAI,IACV1F,GAAU,IAAIE,EAAMwF,CAAG,GAEzBA,EAAI,IAAIic,CAA8B,MACzB,CACXjc,EAAI,OAAOic,CAA8B,CAC3C,CACF,EACA,SAAU,CACJ5hB,IACJ,EAAY,GACZ,KACIqE,IAAS9E,IAAK,qBAAqB8E,EAAO,EAC1CgZ,IAAY9d,IAAK,qBAAqB8d,EAAU,EAChD4B,IAAW,aAAaA,EAAS,EACrC,GAAU,EACV,GAAa,EACbxZ,GAAW,EACX8a,IAAgB,WAAW,EAC3BY,GAAgB,EAChBT,GAAa,EACbC,GAAc,EACdlhB,EAAM,oBAAoB,cAAe2e,EAAa,EACtD3e,EAAM,oBAAoB,cAAe6e,EAAa,EACtD7e,EAAM,oBAAoB,YAAamf,EAAW,EAClDnf,EAAM,oBAAoB,gBAAiBsf,EAAe,EAC1Dtf,EAAM,oBAAoB,eAAgBuf,EAAc,EACxDvf,EAAM,oBAAoB,QAAS2f,EAAO,EAC1C3f,EAAM,oBAAoB,WAAY4f,EAAa,EACnD5f,EAAM,oBAAoB,UAAW0gB,EAAS,EAC9C1gB,EAAM,oBAAoB,QAAS8f,EAAO,EAC1C9f,EAAM,oBAAoB,OAAQ+f,EAAM,EACxChgB,EAAI,OAAO,oBAAoB,QAAS4gB,EAAQ,EAChD5gB,EAAI,QAAQ,oBAAoB,QAAS6gB,EAAS,EAClD7gB,EAAI,IAAI,oBAAoB,QAAS8gB,EAAK,EAC1Ctc,GAAU,QAAQ,EAClB,EAAW,KACX/D,GAAU,MAAM,EAChBiE,GAAa,IAAI,EACjB1E,EAAI,KAAK,OAAO,EAClB,CACF,EACA,OAAO8f,EACT,EAEA,SAASxf,GAAO,EAA4B,CAC1C,OAAO7E,EAAAA,UAAU2E,EAAM,UAAU,EAAI,IAAO3E,EAAAA,UAAU2E,EAAM,IAAI,EAAI,EACtE"}
|