lineadraw 0.9.0 → 0.10.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/README.md +137 -14
- package/dist/{chunk-BQCSFVAF.js → chunk-YYJAXJOY.js} +4037 -1180
- package/dist/chunk-YYJAXJOY.js.map +1 -0
- package/dist/{exportDxf-T2RTSTH5.js → exportDxf-C4CLQCC3.js} +2 -2
- package/dist/sdk.d.ts +259 -42
- package/dist/sdk.js +127 -66
- package/dist/sdk.js.map +1 -1
- package/lineadraw.d.ts +505 -37
- package/package.json +2 -2
- package/templates/README.md +6 -4
- package/dist/chunk-BQCSFVAF.js.map +0 -1
- /package/dist/{exportDxf-T2RTSTH5.js.map → exportDxf-C4CLQCC3.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/model/hatchPatterns.ts","../../core/src/model/common.ts","../../core/src/paint/sink.ts","../../core/src/model/builtinPat.ts","../../core/src/export/dxf/exportDxf.ts","../../core/src/model/objects.ts","../../core/src/model/fonts.ts","../../core/src/model/blockInputs.ts","../../core/src/model/lineTypes.ts","../../core/src/model/builtinLin.ts","../../core/src/geometry/vec2.ts","../../core/src/extensions/paramLists.ts","../../core/src/model/blockDefinition.ts","../../core/src/geometry/line.ts","../../core/src/transform.ts","../../core/src/extensions/inputTable.ts","../../core/src/extensions/evalBlock.ts","../../core/src/extensions/blockDtos.ts","../../core/src/extensions/jsLiteral.ts","../../core/src/model/assets.ts","../../core/src/model/migrations.ts","../../core/src/extensions/blockHandles.ts","../../core/src/extensions/scriptHelpers.ts","../../core/src/extensions/scriptBooleans.ts","../../../node_modules/splaytree/src/node.ts","../../../node_modules/splaytree/src/index.ts","../../../node_modules/robust-predicates/esm/util.js","../../../node_modules/robust-predicates/esm/orient2d.js","../../../node_modules/robust-predicates/esm/orient3d.js","../../../node_modules/robust-predicates/esm/incircle.js","../../../node_modules/robust-predicates/esm/insphere.js","../../../node_modules/polygon-clipping/dist/polygon-clipping.esm.js","../../core/src/extensions/scriptRuntime.ts","../../core/src/model/objectLookup.ts","../../core/src/paint/textMetrics.ts","../../core/src/paint/richText.ts","../../core/src/paint/advanceTables.ts","../../core/src/paint/textMeasurer.ts","../../core/src/paint/dimensionGeometry.ts","../../core/src/paint/textGeometry.ts","../../core/src/paint/tableLayout.ts","../../core/src/export/dxf/aci.ts","../../core/src/export/dxf/codecs.ts","../../core/src/export/dxf/dxfExtras.ts","../../core/src/export/dxf/hatchPattern.ts"],"sourcesContent":["// Named hatch patterns — the AutoCAD .pat line-family model (Tier 2 of\n// docs/hatch-patterns.md). A pattern is N families of parallel, optionally\n// dashed lines. Painting iterates the families and clips each to the boundary\n// loops (computeHatchFamily, ../paint/sink); DXF export maps the curated names\n// 1:1 onto the standard predefined HATCH patterns.\n\nimport { z } from \"zod\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { Vec2Schema } from \"./common\";\nimport { computeHatchFamily } from \"../paint/sink\";\nimport { BUILTIN_PAT } from \"./builtinPat\";\n\n/**\n * One family of parallel lines, in the pattern's own frame (before the fill's\n * rotation/scale). Mirrors an acad .pat definition line\n * `angle, x-origin, y-origin, delta-x, delta-y [, dash…]`:\n * - `angle` radians CCW,\n * - `origin` base point (mm),\n * - `deltaX` shift ALONG the line between successive lines — only affects dash\n * phase, ignored for solid families,\n * - `deltaY` PERPENDICULAR spacing between successive lines (mm, > 0),\n * - `dashesMm` dash cycle along the line: >0 pen-down, <0 gap, 0 dot; omitted\n * means a solid line.\n */\nexport interface PatternLine {\n angle: number;\n origin: Vec2;\n deltaX: number;\n deltaY: number;\n dashesMm?: number[];\n}\n\nexport interface HatchPattern {\n name: string;\n /** Human description from the .pat header (for UI/tooltip). */\n description?: string;\n lines: PatternLine[];\n}\n\n/**\n * Parse acad .pat text into patterns. `unitScale` converts the file's length\n * units to world mm: inch-based .pat files need 25.4 (the default) while the\n * ISO-scaled builtin.pat is already mm (pass 1). Either way ANSI31 lands\n * at the 3.175 mm / scale-1 spacing the DXF layer assumes (ANSI31_BASE_SPACING).\n * Comment (`;`) and blank lines are skipped.\n */\nexport const parsePatternDefinitions = (\n text: string,\n unitScale = 25.4,\n): HatchPattern[] => {\n const DEG2RAD = Math.PI / 180;\n const patterns: HatchPattern[] = [];\n let current: HatchPattern | null = null;\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith(\";\")) continue;\n if (line.startsWith(\"*\")) {\n const [name, ...desc] = line.slice(1).split(\",\");\n current = { name: name.trim(), lines: [] };\n const d = desc.join(\",\").trim();\n if (d) current.description = d;\n patterns.push(current);\n continue;\n }\n if (!current) continue;\n const n = line.split(\",\").map((s) => Number(s.trim()));\n if (n.length < 5 || n.some((v) => Number.isNaN(v))) continue;\n const [angle, x, y, dx, dy, ...dashes] = n;\n current.lines.push({\n angle: angle * DEG2RAD,\n origin: { x: x * unitScale, y: y * unitScale },\n deltaX: dx * unitScale,\n deltaY: dy * unitScale,\n dashesMm: dashes.length ? dashes.map((v) => v * unitScale) : undefined,\n });\n }\n return patterns.filter((p) => p.lines.length > 0);\n};\n\n// Built-in library = the embedded catalogue (builtin.pat, lengths already in\n// mm). Names match the standard DXF predefined patterns, so DXF export/import\n// is a direct name mapping. `SOLID` is filtered defensively — a solid fill is\n// its own `fill.kind`, not a line-family pattern.\nconst BUILT_IN_PATTERNS: HatchPattern[] = parsePatternDefinitions(\n BUILTIN_PAT,\n 1,\n).filter((p) => p.name.toUpperCase() !== \"SOLID\");\n\n// Normalize for lookup: uppercase and fold the punctuation that drifts between\n// the .pat names, the DXF predefined enum, and AutoCAD output (hyphens, dots,\n// and spaces all become `_`), so `AR-CONC`, `AR_CONC`, and `ar conc` resolve to\n// the same pattern. The .pat names are collision-free under this fold.\nconst normalizeName = (name: string): string =>\n name\n .trim()\n .toUpperCase()\n .replace(/[\\s.-]+/g, \"_\");\n\nconst BUILT_IN_BY_NAME = new Map(\n BUILT_IN_PATTERNS.map((p) => [normalizeName(p.name), p]),\n);\n\n/** Ordered built-in pattern names (drives the property-panel dropdown). */\nexport const HATCH_PATTERN_NAMES: string[] = BUILT_IN_PATTERNS.map(\n (p) => p.name,\n);\n\n/** Default pattern name for a new pattern fill. */\nexport const DEFAULT_HATCH_PATTERN = \"ANSI31\";\n\n/** Resolve a fill pattern name to its definition (case- and punctuation-insensitive). */\nexport const getHatchPattern = (name: string): HatchPattern | undefined =>\n BUILT_IN_BY_NAME.get(normalizeName(name));\n\n/**\n * AutoCAD MaxHatch-style ceiling: a hatch whose pattern would emit more\n * segments than this paints as a translucent solid instead (paintHatch).\n * Denser than this is sub-pixel/sub-print-resolution anyway — it reads as\n * tone, and generating millions of segments stalls rendering and export.\n */\nexport const MAX_HATCH_SEGMENTS = 100_000;\n\n/**\n * Cheap upper bound on the segment count computePatternGeometry would emit,\n * from the rings' bounding-box diagonal (no generation, no clipping). Used\n * to decide the solid fallback BEFORE paying for the real geometry.\n */\nexport const estimatePatternSegments = (\n rings: Vec2[][],\n pattern: HatchPattern,\n scale: number,\n): number => {\n if (scale <= 0) return 0;\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const ring of rings)\n for (const p of ring) {\n if (p.x < minX) minX = p.x;\n if (p.x > maxX) maxX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.y > maxY) maxY = p.y;\n }\n if (minX > maxX) return 0;\n const diag = Math.hypot(maxX - minX, maxY - minY);\n let count = 0;\n for (const fam of pattern.lines) {\n const perp = Math.abs(fam.deltaY) * scale;\n if (perp <= 1e-9) continue;\n const lines = diag / perp + 1;\n const period =\n (fam.dashesMm?.reduce((a, b) => a + Math.abs(b), 0) ?? 0) * scale;\n const perLine = period > 1e-9 ? diag / period + 1 : 1;\n count += lines * perLine;\n }\n return count;\n};\n\n/**\n * Every clipped (and dashed) segment for a pattern fill: iterate the families,\n * fold the fill's rotation + world-mm scale into each, and clip via\n * computeHatchFamily. Pure geometry — canvas, PDF, and SVG stroke the same\n * segments.\n */\nexport const computePatternGeometry = (\n rings: Vec2[][],\n pattern: HatchPattern,\n angle: number,\n scale: number,\n /** World anchor of the pattern frame (default: the drawing origin). */\n origin: Vec2 = { x: 0, y: 0 },\n): { a: Vec2; b: Vec2 }[] => {\n const out: { a: Vec2; b: Vec2 }[] = [];\n if (scale <= 0) return out;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n for (const fam of pattern.lines) {\n if (Math.abs(fam.deltaY) * scale <= 1e-9) continue;\n // Map the family's pattern-space origin into world: scale, then rotate by\n // the fill angle (deltas rotate with `angle + fam.angle` inside the family).\n const ox = fam.origin.x * scale;\n const oy = fam.origin.y * scale;\n // No spread: a large boundary with fine spacing yields 100k+ segments,\n // and push(...segs) overflows the call stack (one argument per segment).\n const segs = computeHatchFamily(rings, {\n angle: angle + fam.angle,\n origin: { x: ox * c - oy * s + origin.x, y: ox * s + oy * c + origin.y },\n deltaAlong: fam.deltaX * scale,\n deltaPerp: fam.deltaY * scale,\n dashesMm: fam.dashesMm?.map((d) => d * scale),\n });\n for (const seg of segs) out.push(seg);\n }\n return out;\n};\n\n// ---- document-defined hatch patterns ----------------------------------------\n//\n// A document may carry its own named patterns (`document.hatchPatterns`):\n// the definition lines a DXF HATCH embeds for a non-predefined pattern, or a\n// user-imported .pat. Same shape as the catalogue's HatchPattern (mm);\n// fills keep referencing by NAME. Resolution: document first (shadows a\n// catalogue name), then the built-in catalogue.\n\nexport const PatternLineSchema = z.object({\n /** Radians CCW, in the pattern's own frame. */\n angle: z.number(),\n /** Base point, mm. */\n origin: Vec2Schema,\n /** Shift ALONG the line between successive lines (dash phase), mm. */\n deltaX: z.number(),\n /** Perpendicular spacing between successive lines, mm. */\n deltaY: z.number().positive(),\n /** Dash cycle along the line: >0 dash, <0 gap, 0 dot; absent = solid. */\n dashesMm: z.array(z.number()).optional(),\n});\n\nexport const HatchPatternSchema = z.object({\n /** Stored on fills as `fill.name`; case-insensitive, unique per document. */\n name: z.string().min(1),\n description: z.string().optional(),\n lines: z.array(PatternLineSchema).min(1),\n});\nexport type DocumentHatchPattern = z.infer<typeof HatchPatternSchema>;\n\n/** The key two pattern names compare by (case- and separator-insensitive). */\nexport const hatchPatternKey = (name: string): string => normalizeName(name);\n\n/** Name → pattern: the document's own patterns first, then the built-in\n * catalogue; undefined = unknown (the fill paints as a single line family). */\nexport const resolveHatchPattern = (\n name: string | undefined,\n hatchPatterns?: readonly DocumentHatchPattern[],\n): HatchPattern | undefined => {\n if (!name) return undefined;\n if (hatchPatterns && hatchPatterns.length > 0) {\n const key = normalizeName(name);\n const own = hatchPatterns.find((p) => normalizeName(p.name) === key);\n if (own) return own;\n }\n return getHatchPattern(name);\n};\n\n/** Hatches (every space) whose pattern fill is `name`. */\nexport const hatchPatternUsers = (\n doc: {\n objects: readonly {\n type: string;\n fill?: { kind: string; name?: string };\n }[];\n layouts: readonly {\n objects: readonly {\n type: string;\n fill?: { kind: string; name?: string };\n }[];\n }[];\n },\n name: string,\n): number => {\n const key = normalizeName(name);\n const uses = (o: { type: string; fill?: { kind: string; name?: string } }) =>\n o.type === \"hatch\" &&\n o.fill?.kind === \"pattern\" &&\n o.fill.name !== undefined &&\n normalizeName(o.fill.name) === key;\n let n = doc.objects.filter(uses).length;\n for (const l of doc.layouts) n += l.objects.filter(uses).length;\n return n;\n};\n\n/** `.pat` text (mm) for document patterns: `*NAME,description` then one\n * `angle°, x, y, dx, dy[, dashes…]` line per family. */\nexport const formatPatDefinitions = (\n patterns: readonly DocumentHatchPattern[],\n): string =>\n patterns\n .map(\n (p) =>\n `*${p.name},${p.description ?? \"\"}\\n` +\n p.lines\n .map((l) =>\n [\n (l.angle * 180) / Math.PI,\n l.origin.x,\n l.origin.y,\n l.deltaX,\n l.deltaY,\n ...(l.dashesMm ?? []),\n ]\n .map((v) => +v.toFixed(6))\n .join(\",\"),\n )\n .join(\"\\n\") +\n \"\\n\",\n )\n .join(\"\");\n","import { z } from \"zod\";\n\n/**\n * World units are millimeters, Y-up. Angles in radians, CCW.\n * Accepts [x, y] as input for script ergonomics (block scripts); always\n * parses to {x, y}.\n */\nexport const Vec2Schema = z.preprocess(\n (v) => (Array.isArray(v) && v.length >= 2 ? { x: v[0], y: v[1] } : v),\n z.object({ x: z.number(), y: z.number() }),\n);\nexport type Vec2 = z.infer<typeof Vec2Schema>;\n\n/** Hex color like #rrggbb. */\nexport const ColorSchema = z.string().regex(/^#[0-9a-fA-F]{6}$/);\n\n/**\n * Properties shared by every model object.\n * color/lineWidth/lineType undefined = inherit from the layer (\"byLayer\").\n * lineWidth is a paper-space lineweight in mm (CAD convention).\n */\nexport const ObjectBaseSchema = z.object({\n id: z.string(),\n layerId: z.string(),\n color: ColorSchema.optional(),\n lineType: z.string().optional(),\n /** Extra dash-pattern multiplier on top of the width-proportional scale\n * (CAD CELTSCALE). Dash patterns are defined per 1 mm of line width and\n * scale by the resolved lineweight; this multiplies that. undefined = 1. */\n lineTypeScale: z.number().positive().optional(),\n lineWidth: z.number().positive().optional(),\n /** Paint opacity 0..1 across canvas/SVG/PDF. undefined = opaque. */\n opacity: z.number().min(0).max(1).optional(),\n});\nexport type ObjectBase = z.infer<typeof ObjectBaseSchema>;\n","// GeometrySink — the abstract drawing surface every object painter targets.\n// Painters are written ONCE against this interface and retargeted to:\n// - CanvasSink (screen rendering, src/canvas/canvasSink.ts)\n// - PdfSink (vector PDF export, Phase 4)\n// - DXF entity writers (dimension/leader explosion, Phase 5)\n\nimport type { Vec2 } from \"../geometry/vec2\";\n\nexport interface StrokeStyle {\n color: string;\n /**\n * Lineweight in OUTPUT units (paper mm). Never scaled by the world\n * transform — each sink decides how to realize it (canvas clamps to a\n * screen-px range, PDF uses it verbatim).\n */\n widthMm: number;\n dashMm?: number[];\n /** Paint opacity 0..1 (undefined = opaque). */\n opacity?: number;\n}\n\nexport interface FillStyle {\n color: string;\n /** Paint opacity 0..1 (undefined = opaque). */\n opacity?: number;\n /** Gradient fill (undefined = flat fill), in world/sheet coordinates —\n * the same space as the path. linear: `color` at `from` → `color2` at\n * `to`. radial: `color` at `from` (the center) → `color2` at radius\n * |to − from|. */\n gradient?: {\n shape: \"linear\" | \"radial\";\n from: Vec2;\n to: Vec2;\n color2: string;\n };\n}\n\nexport interface TextSpec {\n text: string;\n anchor: Vec2;\n /** Cap height in current drawing units (world mm before transforms). */\n heightMm: number;\n /** Radians CCW. */\n rotation: number;\n hAlign: \"left\" | \"center\" | \"right\";\n vAlign: \"bottom\" | \"center\" | \"top\";\n color: string;\n /** Font id (model/fonts.ts); absent = default font. */\n font?: string;\n /** Horizontal glyph scale (AutoCAD width factor); absent = 1. */\n widthFactor?: number;\n /** Paint opacity 0..1 (undefined = opaque). */\n opacity?: number;\n}\n\n/** A placed raster image (PNG/JPEG data URL). */\nexport interface ImageSpec {\n /** data: URL with the encoded pixels. */\n data: string;\n /** Bottom-left corner in current drawing units (world/sheet mm). */\n origin: Vec2;\n widthMm: number;\n heightMm: number;\n /** Radians CCW about `origin`. */\n rotation: number;\n /** 0..1. */\n opacity: number;\n}\n\n/** Affine transform [a, b, c, d, e, f]: x' = a·x + c·y + e, y' = b·x + d·y + f. */\nexport type Mat2x3 = [number, number, number, number, number, number];\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface GeometrySink {\n beginPath(): void;\n moveTo(p: Vec2): void;\n lineTo(p: Vec2): void;\n bezierTo(c1: Vec2, c2: Vec2, end: Vec2): void;\n /** Circular arc from startAngle to endAngle; ccw = increasing angle (world CCW). */\n arc(\n center: Vec2,\n r: number,\n startAngle: number,\n endAngle: number,\n ccw: boolean,\n ): void;\n ellipse(\n center: Vec2,\n rx: number,\n ry: number,\n rotation: number,\n startAngle: number,\n endAngle: number,\n ): void;\n closePath(): void;\n stroke(s: StrokeStyle): void;\n fill(f: FillStyle): void;\n text(t: TextSpec): void;\n /** Draw a raster image (decoding is the sink's concern). */\n image(i: ImageSpec): void;\n /** Advance width; implementations must honor font + widthFactor. */\n measureText(\n text: string,\n heightMm: number,\n font?: string,\n widthFactor?: number,\n ): { width: number };\n pushTransform(m: Mat2x3): void;\n popTransform(): void;\n pushClipRect(r: Rect): void;\n popClip(): void;\n /**\n * Optional structure hooks bracketing ONE model object's output. Sinks\n * with structured output (SVG) group + annotate the elements; raster/PDF\n * sinks omit them. Paint loops call them via optional chaining.\n */\n beginObject?(id: string, layer?: string): void;\n endObject?(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix helpers\n// ---------------------------------------------------------------------------\n\nexport const matIdentity: Mat2x3 = [1, 0, 0, 1, 0, 0];\n\nexport const matMultiply = (m: Mat2x3, n: Mat2x3): Mat2x3 => [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n];\n\nexport const matApply = (m: Mat2x3, p: Vec2): Vec2 => ({\n x: m[0] * p.x + m[2] * p.y + m[4],\n y: m[1] * p.x + m[3] * p.y + m[5],\n});\n\n// ---------------------------------------------------------------------------\n// Curve → bezier decomposition (used by non-canvas sinks)\n// ---------------------------------------------------------------------------\n\nexport interface CubicBezier {\n start: Vec2;\n c1: Vec2;\n c2: Vec2;\n end: Vec2;\n}\n\n/**\n * Signed sweep from startAngle to endAngle in the requested direction —\n * positive for ccw (increasing angle), negative for cw. Angles come from\n * atan2 ∈ (−π, π], so a raw `end − start` flips arcs that cross the ±π seam;\n * this normalizes into (0, 2π] / [−2π, 0), treating equal angles as a full\n * circle.\n */\nexport const signedArcSweep = (\n startAngle: number,\n endAngle: number,\n ccw: boolean,\n): number => {\n const TAU = Math.PI * 2;\n let sweep = ccw\n ? (((endAngle - startAngle) % TAU) + TAU) % TAU\n : -((((startAngle - endAngle) % TAU) + TAU) % TAU);\n if (sweep === 0) sweep = ccw ? TAU : -TAU;\n return sweep;\n};\n\n/**\n * Decompose a circular arc (CCW from startAngle over `sweep` > 0) into cubic\n * beziers with ≤90° segments (standard k = 4/3·tan(θ/4) approximation).\n */\nexport const arcToBeziers = (\n center: Vec2,\n r: number,\n startAngle: number,\n sweep: number,\n): CubicBezier[] => {\n const n = Math.max(1, Math.ceil(Math.abs(sweep) / (Math.PI / 2)));\n const step = sweep / n;\n const k = (4 / 3) * Math.tan(step / 4);\n const result: CubicBezier[] = [];\n for (let i = 0; i < n; i++) {\n const a0 = startAngle + step * i;\n const a1 = a0 + step;\n const p0 = {\n x: center.x + r * Math.cos(a0),\n y: center.y + r * Math.sin(a0),\n };\n const p1 = {\n x: center.x + r * Math.cos(a1),\n y: center.y + r * Math.sin(a1),\n };\n result.push({\n start: p0,\n c1: { x: p0.x - r * k * Math.sin(a0), y: p0.y + r * k * Math.cos(a0) },\n c2: { x: p1.x + r * k * Math.sin(a1), y: p1.y - r * k * Math.cos(a1) },\n end: p1,\n });\n }\n return result;\n};\n\n// ---------------------------------------------------------------------------\n// Hatch pattern generation (shared by canvas, PDF, and DXF outputs)\n// ---------------------------------------------------------------------------\n\n/** v-extent (perpendicular range) of the rings, or null if empty. */\nconst vExtent = (\n rings: Vec2[][],\n v: Vec2,\n): { min: number; max: number } | null => {\n let min = Infinity;\n let max = -Infinity;\n for (const ring of rings) {\n for (const p of ring) {\n const dv = p.x * v.x + p.y * v.y;\n if (dv < min) min = dv;\n if (dv > max) max = dv;\n }\n }\n return Number.isFinite(min) ? { min, max } : null;\n};\n\n/**\n * u-coordinates (sorted) where the scanline at perpendicular offset `off`\n * crosses the ring edges. Consecutive pairs bound the even-odd interior.\n */\nconst scanlineCrossings = (\n rings: Vec2[][],\n u: Vec2,\n v: Vec2,\n off: number,\n): number[] => {\n const crossings: number[] = [];\n for (const ring of rings) {\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const a = ring[j];\n const b = ring[i];\n const va = a.x * v.x + a.y * v.y;\n const vb = b.x * v.x + b.y * v.y;\n // Half-open interval avoids double-counting shared vertices.\n if (va < off === vb < off) continue;\n const t = (off - va) / (vb - va);\n const px = a.x + (b.x - a.x) * t;\n const py = a.y + (b.y - a.y) * t;\n crossings.push(px * u.x + py * u.y);\n }\n }\n crossings.sort((x, y) => x - y);\n return crossings;\n};\n\n/**\n * Parallel pattern lines at `angle` spaced `spacing` apart (anchored at the\n * world origin), clipped to the even-odd interior of the tessellated rings.\n * Pure geometry — every output target strokes the same segments. This is the\n * simple single-family \"lines\" fill; pattern fills use computeHatchFamily.\n */\nexport const computeHatchLines = (\n rings: Vec2[][],\n angle: number,\n spacing: number,\n): { a: Vec2; b: Vec2 }[] =>\n spacing <= 0\n ? []\n : computeHatchFamily(rings, {\n angle,\n origin: { x: 0, y: 0 },\n deltaAlong: 0,\n deltaPerp: spacing,\n });\n\nexport interface HatchLineFamily {\n /** Line direction, radians CCW (the fill's rotation already folded in). */\n angle: number;\n /**\n * Anchor point of the family in world coords (the .pat origin, with the\n * fill's rotation + scale already folded in). Its perpendicular component\n * phases the parallel lines; its along-line component phases the dashes.\n */\n origin: Vec2;\n /**\n * Signed shift ALONG the line between successive lines (the .pat delta-x,\n * scaled). Only shifts dash phase per line — no effect on solid families.\n */\n deltaAlong: number;\n /**\n * Signed PERPENDICULAR step between successive lines (the .pat delta-y,\n * scaled). Must be non-zero.\n */\n deltaPerp: number;\n /**\n * Along-line dash cycle, world mm: >0 pen-down, <0 gap, 0 dot. Solid line\n * when omitted/empty. Already scaled by the caller.\n */\n dashesMm?: number[];\n}\n\n/** A tiny mark stroked for a zero-length (dot) dash so it stays visible. */\nconst DOT_LENGTH_MM = 0.35;\n\n/**\n * Split a solid segment (a→b, in the +`u` direction) into its drawn dash\n * sub-segments. The dash cycle's phase-zero sits at along-coordinate `along0`\n * (the family line's anchor), so dashes stay in register line-to-line.\n */\nconst splitByDashes = (\n a: Vec2,\n b: Vec2,\n u: Vec2,\n dashes: number[],\n along0: number,\n out: { a: Vec2; b: Vec2 }[],\n): void => {\n const len = (b.x - a.x) * u.x + (b.y - a.y) * u.y;\n if (len <= 1e-9) return;\n const cycle = dashes.reduce((s, d) => s + Math.abs(d), 0);\n if (cycle <= 1e-9) {\n out.push({ a, b });\n return;\n }\n const pt = (d: number): Vec2 => ({ x: a.x + u.x * d, y: a.y + u.y * d });\n // Phase of `a` within the cycle, measured from the family anchor `along0`.\n const base = a.x * u.x + a.y * u.y - along0;\n let phase = ((base % cycle) + cycle) % cycle;\n let idx = 0;\n for (; idx < dashes.length; idx++) {\n const w = Math.abs(dashes[idx]);\n if (phase < w || w <= 1e-9) break;\n phase -= w;\n }\n if (idx >= dashes.length) {\n idx = 0;\n phase = 0;\n }\n let remaining = Math.max(0, Math.abs(dashes[idx]) - phase);\n let pos = 0;\n let guard = 0;\n while (pos < len - 1e-9 && guard++ < 100000) {\n const w = Math.abs(dashes[idx]);\n const draw = dashes[idx] >= 0;\n if (w <= 1e-9) {\n // Dot: emit a short mark centered on `pos`, then advance to the next\n // element (the following gap) without consuming length.\n if (draw) {\n const s0 = Math.max(0, pos - DOT_LENGTH_MM / 2);\n const s1 = Math.min(len, pos + DOT_LENGTH_MM / 2);\n if (s1 > s0) out.push({ a: pt(s0), b: pt(s1) });\n }\n idx = (idx + 1) % dashes.length;\n remaining = Math.abs(dashes[idx]);\n continue;\n }\n const step = Math.min(remaining, len - pos);\n if (draw) out.push({ a: pt(pos), b: pt(pos + step) });\n pos += step;\n remaining -= step;\n if (remaining <= 1e-9) {\n idx = (idx + 1) % dashes.length;\n remaining = Math.abs(dashes[idx]);\n }\n }\n};\n\n/**\n * One family of a hatch pattern: parallel (optionally dashed) lines stepped by\n * `(deltaAlong, deltaPerp)` from `origin`, clipped to the even-odd interior of\n * the rings. Unlike computeHatchLines this honors the family origin (line\n * phase) and delta-x (per-line dash phase), which is what makes multi-family\n * patterns (ANSI32's paired lines, brick/earth offsets) render correctly.\n */\nexport const computeHatchFamily = (\n rings: Vec2[][],\n family: HatchLineFamily,\n): { a: Vec2; b: Vec2 }[] => {\n const { deltaPerp } = family;\n if (rings.length === 0 || Math.abs(deltaPerp) <= 1e-9) return [];\n const u = { x: Math.cos(family.angle), y: Math.sin(family.angle) };\n const v = { x: -u.y, y: u.x };\n const ext = vExtent(rings, v);\n if (!ext) return [];\n\n const oV = family.origin.x * v.x + family.origin.y * v.y;\n const oU = family.origin.x * u.x + family.origin.y * u.y;\n // Contiguous integer line indices whose perpendicular offset (oV + i·dPerp)\n // lands in [min, max] — the min/max form handles either sign of deltaPerp.\n const iA = (ext.min - oV) / deltaPerp;\n const iB = (ext.max - oV) / deltaPerp;\n const iLo = Math.ceil(Math.min(iA, iB));\n const iHi = Math.floor(Math.max(iA, iB));\n const dashes =\n family.dashesMm && family.dashesMm.length ? family.dashesMm : null;\n\n const out: { a: Vec2; b: Vec2 }[] = [];\n for (let i = iLo; i <= iHi; i++) {\n const off = oV + i * deltaPerp;\n const along0 = oU + i * family.deltaAlong; // dash-phase anchor for this line\n const crossings = scanlineCrossings(rings, u, v, off);\n for (let k = 0; k + 1 < crossings.length; k += 2) {\n const c0 = crossings[k];\n const c1 = crossings[k + 1];\n if (c1 - c0 < 1e-9) continue;\n const a = { x: u.x * c0 + v.x * off, y: u.y * c0 + v.y * off };\n const b = { x: u.x * c1 + v.x * off, y: u.y * c1 + v.y * off };\n if (dashes) splitByDashes(a, b, u, dashes, along0, out);\n else out.push({ a, b });\n }\n }\n return out;\n};\n\n/** Same decomposition for an elliptical arc (rx/ry with axis rotation). */\nexport const ellipseArcToBeziers = (\n center: Vec2,\n rx: number,\n ry: number,\n rotation: number,\n startAngle: number,\n sweep: number,\n): CubicBezier[] => {\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n const map = (p: Vec2): Vec2 => ({\n x: center.x + p.x * cosR - p.y * sinR,\n y: center.y + p.x * sinR + p.y * cosR,\n });\n return arcToBeziers({ x: 0, y: 0 }, 1, startAngle, sweep).map((b) => ({\n start: map({ x: b.start.x * rx, y: b.start.y * ry }),\n c1: map({ x: b.c1.x * rx, y: b.c1.y * ry }),\n c2: map({ x: b.c2.x * rx, y: b.c2.y * ry }),\n end: map({ x: b.end.x * rx, y: b.end.y * ry }),\n }));\n};\n","// GENERATED — do not edit. Mirror of builtin.pat (the built-in hatch\n// pattern library, lengths in mm). Regenerate with:\n// npm run gen:patterns -w @lineadraw/core\n\nexport const BUILTIN_PAT = `;; Linea built-in hatch pattern library.\n;;\n;; Format: .pat syntax - a \\`*NAME,description\\` header followed by one line\n;; family per row: \\`angle, x-origin, y-origin, delta-x, delta-y [, dash...]\\`\n;; (angle in degrees CCW; delta-x shifts successive lines along their own\n;; direction - dash phase - and delta-y is the perpendicular spacing;\n;; dashes: >0 pen-down, <0 gap, 0 dot). All lengths are millimeters (ISO\n;; scaling).\n;;\n;; The pattern geometry is functional interchange data, kept name- and\n;; value-compatible with the predefined DXF HATCH patterns other CAD\n;; applications resolve - ANSI/ISO/JIS/GOST section conventions plus common\n;; architectural textures. Descriptions and organization are Linea's\n;; own. There is no SOLID entry: solid fill is its own fill kind, not a\n;; line-family pattern.\n;;\n;; After editing, regenerate the embedded TS mirror:\n;; npm run gen:patterns -w @lineadraw/core\n;;\n\n;; Material and texture patterns.\n\n*ANGLE,Steel angle framing\n0, 0, 0, 0, 6.985, 5.08, -1.905\n90, 0, 0, 0, 6.985, 5.08, -1.905\n*ANSI31,Cast iron; general section (ANSI)\n45, 0, 0, 0, 3.175\n*ANSI32,Steel (ANSI)\n45, 0, 0, 0, 9.525\n45, 4.49013, 0, 0, 9.525\n*ANSI33,Bronze, brass, copper (ANSI)\n45, 0, 0, 0, 6.35\n45, 4.49013, 0, 0, 6.35, 3.175, -1.5875\n*ANSI34,Plastic, rubber (ANSI)\n45, 0, 0, 0, 19.05\n45, 4.49013, 0, 0, 19.05\n45, 8.98026, 0, 0, 19.05\n45, 13.4704, 0, 0, 19.05\n*ANSI35,Fire brick, refractory (ANSI)\n45, 0, 0, 0, 6.35\n45, 4.49013, 0, 0, 6.35, 7.9375, -1.5875, 0, -1.5875\n*ANSI36,Marble, slate, glass (ANSI)\n45, 0, 0, 5.55625, 3.175, 7.9375, -1.5875, 0, -1.5875\n*ANSI37,Lead, zinc, insulation (ANSI)\n45, 0, 0, 0, 3.175\n135, 0, 0, 0, 3.175\n*ANSI38,Aluminum (ANSI)\n45, 0, 0, 0, 3.175\n135, 0, 0, 6.35, 3.175, 7.9375, -4.7625\n*AR-B816,Block wall 8x16, running bond\n0, 0, 0, 0, 203.2\n90, 0, 0, 203.2, 203.2, 203.2, -203.2\n*AR-B816C,Block wall 8x16 with mortar joints\n0, 0, 0, 203.2, 203.2, 396.875, -9.525\n0, -203.2, 9.525, 203.2, 203.2, 396.875, -9.525\n90, 0, 0, 203.2, 203.2, -212.725, 193.675\n90, -9.525, 0, 203.2, 203.2, -212.725, 193.675\n*AR-B88,Block wall 8x8, running bond\n0, 0, 0, 0, 203.2\n90, 0, 0, 203.2, 101.6, 203.2, -203.2\n*AR-BRELM,Brick wall, English bond, mortar joints\n0, 0, 0, 0, 135.484, 193.675, -9.525\n0, 0, 57.15, 0, 135.484, 193.675, -9.525\n0, 50.8, 67.7418, 0, 135.484, 92.075, -9.525\n0, 50.8, 124.892, 0, 135.484, 92.075, -9.525\n90, 0, 0, 0, 203.2, 57.15, -78.334\n90, -9.525, 0, 0, 203.2, 57.15, -78.334\n90, 50.8, 67.7418, 0, 101.6, 57.15, -78.334\n90, 41.275, 67.7418, 0, 101.6, 57.15, -78.334\n*AR-BRSTD,Brick wall, running bond\n0, 0, 0, 0, 67.7418\n90, 0, 0, 67.7418, 101.6, 67.7418, -67.7418\n*AR-CONC,Concrete, random aggregate\n50, 0, 0, 104.896, -149.807, 19.05, -209.55\n355, 0, 0, -51.76101082,187.25814969, 15.24, -167.64058417\n100.4514447,15.182007,-1.3282535,145.5569059,-176.270089,16.1900088,-178.0902446\n46.1842, 0, 50.8, 157.343, -224.71, 28.575, -314.325\n96.63555761,22.5899,47.2965,218.33577212,-264.40480444,24.28502314,-267.13560816\n351.18415117,0,50.8,196.67912063,280.88740361,22.85996707,-251.45973192\n21, 25.4, 38.1, 104.89565868, -149.80652586, 19.05, -209.55\n326, 25.4, 38.1, -51.7604, 187.258, 15.24, -167.64\n71.451445,38.0345326,29.5779001,145.5567546,-176.2700748,16.1900088,-178.0899376\n37.5, 0, 0, 53.9242, 65.2018, 0, -165.608, 0, -170.18, 0, -168.275\n7.5, 0, 0, 79.3242, 90.6018, 0, -97.028, 0, -161.798, 0, -64.135\n-32.5, -56.642, 0, 117.434, 68.0212, 0, -63.5, 0, -198.12, 0, -262.89\n-42.5, -82.042, 0, 92.0344, 118.821, 0, -82.55, 0, -131.572, 0, -186.69\n*AR-HBONE,Brick paving, herringbone at 45 deg\n45, 0, 0, 101.6, 101.6, 304.8, -101.6\n135, 71.842, 71.842, 101.6, -101.6, 304.8, -101.6\n*AR-PARQ1,Parquet flooring, basket weave\n90, 0, 0, 304.8, 304.8, 304.8, -304.8\n90, 50.8, 0, 304.8, 304.8, 304.8, -304.8\n90, 101.6, 0, 304.8, 304.8, 304.8, -304.8\n90, 152.4, 0, 304.8, 304.8, 304.8, -304.8\n90, 203.2, 0, 304.8, 304.8, 304.8, -304.8\n90, 254, 0, 304.8, 304.8, 304.8, -304.8\n90, 304.8, 0, 304.8, 304.8, 304.8, -304.8\n0, 0, 304.8, 304.8, -304.8, 304.8, -304.8\n0, 0, 355.6, 304.8, -304.8, 304.8, -304.8\n0, 0, 406.4, 304.8, -304.8, 304.8, -304.8\n0, 0, 457.2, 304.8, -304.8, 304.8, -304.8\n0, 0, 508, 304.8, -304.8, 304.8, -304.8\n0, 0, 558.8, 304.8, -304.8, 304.8, -304.8\n0, 0, 609.6, 304.8, -304.8, 304.8, -304.8\n*AR-RROOF,Roof shingles\n0, 0, 0, 55.88, 25.4, 381, -50.8, 127, -25.4\n0, 33.782, 12.7, -25.4, 33.782, 76.2, -8.382, 152.4, -19.05\n0, 12.7, 21.59, 132.08, 17.018, 203.2, -35.56, 101.6, -25.4\n*AR-RSHKE,Roof wood shakes\n0, 0, 0, 647.7, 304.8, 152.4, -127, 177.8, -76.2, 228.6, -101.6\n0, 152.4, 12.7, 647.7, 304.8, 127, -482.6, 101.6, -152.4\n0, 457.2, -19.05, 647.7, 304.8, 76.2, -787.4\n90, 0, 0, 304.8, 215.9, 292.1, -927.1\n90, 152.4, 0, 304.8, 215.9, 285.75, -933.45\n90, 279.4, 0, 304.8, 215.9, 266.7, -952.5\n90, 457.2, -19.05, 304.8, 215.9, 292.1, -927.1\n90, 533.4, -19.05, 304.8, 215.9, 292.1, -927.1\n90, 762, 0, 304.8, 215.9, 279.4, -939.8\n*AR-SAND,Sand stipple\n37.5, 0, 0, 28.5242, 39.8018, 0, -38.608, 0, -43.18, 0, -41.275\n7.5, 0, 0, 53.9242, 65.2018, 0, -20.828, 0, -34.798, 0, -13.335\n-32.5, -31.242, 0, 66.6344, 42.6212, 0, -12.7, 0, -45.72, 0, -59.69\n-42.5, -31.242, 0, 41.2344, 68.0212, 0, -6.35, 0, -29.972, 0, -34.29\n*BOX,Interlocking box weave\n90, 0, 0, 0, 25.4\n90, 6.35, 0, 0, 25.4\n0, 0, 0, 0, 25.4, -6.35, 6.35\n0, 0, 6.35, 0, 25.4, -6.35, 6.35\n0, 0, 12.7, 0, 25.4, 6.35, -6.35\n0, 0, 19.05, 0, 25.4, 6.35, -6.35\n90, 12.7, 0, 0, 25.4, 6.35, -6.35\n90, 19.05, 0, 0, 25.4, 6.35, -6.35\n*BRASS,Brass\n0, 0, 0, 0, 6.35\n0, 0, 3.175, 0, 6.35, 3.175, -1.5875\n*BRICK,Brick coursing\n0, 0, 0, 0, 6.35\n90, 0, 0, 0, 12.7, 6.35, -6.35\n90, 6.35, 0, 0, 12.7, -6.35, 6.35\n*BRSTONE,Brick and stone mix\n0, 0, 0, 0, 8.382\n90, 22.86, 0, 8.382, 12.7, 8.382, -8.382\n90, 20.32, 0, 8.382, 12.7, 8.382, -8.382\n0, 22.86, 1.397, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 2.794, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 4.191, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 5.588, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 6.985, 12.7, 8.382, -22.86, 2.54\n*CLAY,Clay\n0, 0, 0, 0, 4.7625\n0, 0, 0.79375, 0, 4.7625\n0, 0, 1.5875, 0, 4.7625\n0, 0, 3.175, 0, 4.7625, 4.7625, -3.175\n*CORK,Cork\n0, 0, 0, 0, 3.175\n135, 1.5875, -1.5875, 0, 8.98026, 4.49013, -4.49013\n135, 2.38125, -1.5875, 0, 8.98026, 4.49013, -4.49013\n135, 3.175, -1.5875, 0, 8.98026, 4.49013, -4.49013\n*CROSS,Cross tiling\n0, 0, 0, 6.35, 6.35, 3.175, -9.525\n90, 1.5875, -1.5875, 6.35, 6.35, 3.175, -9.525\n*DASH,Staggered dashes\n0, 0, 0, 3.175, 3.175, 3.175, -3.175\n*DOLMIT,Layered rock (dolomite)\n0, 0, 0, 0, 6.35\n45, 0, 0, 0, 17.9605,8.98025612106915355989072339,-17.9605122421383071197814467\n*DOTS,Dot screen\n0, 0, 0, 0.79375, 1.5875, 0, -1.5875\n*EARTH,Earth (section)\n0, 0, 0, 6.35, 6.35, 6.35, -6.35\n0, 0, 2.38125, 6.35, 6.35, 6.35, -6.35\n0, 0, 4.7625, 6.35, 6.35, 6.35, -6.35\n90, 0.79375, 5.55625, 6.35, 6.35, 6.35, -6.35\n90, 3.175, 5.55625, 6.35, 6.35, 6.35, -6.35\n90, 5.55625, 5.55625, 6.35, 6.35, 6.35, -6.35\n*ESCHER,Isometric cube tiling\n60, 0, 0, -15.24, 26.3964542936, 27.94, -2.54\n180, 0, 0, -15.24, 26.3964542936, 27.94, -2.54\n300, 0, 0, 15.24, 26.3964542936, 27.94, -2.54\n60, 2.54, 0, -15.24, 26.3964542936, 5.08, -25.4\n300, 2.54, 0, 15.24, 26.3964542936, 5.08, -25.4\n60, -1.27, 2.199704516, -15.24, 26.3964542936, 5.08, -25.4\n180, -1.27, 2.199704516, -15.24, 26.3964542936, 5.08, -25.4\n300, -1.27, -2.199704516, 15.24, 26.3964542936, 5.08, -25.4\n180, -1.27, -2.199704516, -15.24, 26.3964542936, 5.08, -25.4\n60, -10.16, 0, -15.24, 26.3964542936, 5.08, -25.4\n300, -10.16, 0, 15.24, 26.3964542936, 5.08, -25.4\n60, 5.08, -8.7988180894, -15.24, 26.3964542936, 5.08, -25.4\n180, 5.08, -8.7988180894, -15.24, 26.3964542936, 5.08, -25.4\n300, 5.08, 8.7988180894, 15.24, 26.3964542936, 5.08, -25.4\n180, 5.08, 8.7988180894, -15.24, 26.3964542936, 5.08, -25.4\n0, 5.08, 4.3994090574, -15.24, 26.3964542936, 17.78, -12.7\n0, 5.08, -4.3994090574, -15.24, 26.3964542936, 17.78, -12.7\n120, 1.27, 6.5991135734, 15.24, 26.3964542936, 17.78, -12.7\n120, -6.35, 2.199704516, 15.24, 26.3964542936, 17.78, -12.7\n240, -6.35, -2.199704516, 15.24, 26.3964542936, 17.78, -12.7\n240, 1.27, -6.5991135734, 15.24, 26.3964542936, 17.78, -12.7\n*FLEX,Flexible material\n0, 0, 0, 0, 6.35, 6.35, -6.35\n45,6.35,0,4.490128053,4.490128053,1.5875,-5.8052561314,1.5875,-8.9802561314\n*GOST_GLASS,Glass (GOST)\n45, 0, 0, 6, -6, 5, -7\n45, 2.121320, 0, 6, -6, 2, -10\n45, 0, 2.121320, 6, -6, 2, -10\n*GOST_GROUND,Ground (GOST)\n45, 0, 0, 10, -10, 20\n45, 3, 0, 10, -10, 20\n45, 6, 0, 10, -10, 20\n*GOST_WOOD,Wood (GOST)\n90, 0, 0, 0, -6, 10, -2\n90, 2, -2, 0, -6, 6, -1.5, 3, -1.5\n90, 4, -5, 0, -6, 10, -2\n*GRASS,Grass\n90, 0, 0, 17.96051224, 17.96051224, 4.7625, -31.15852448\n45, 0, 0, 0, 25.4, 4.7625, -20.6375\n135, 0, 0, 0, 25.4, 4.7625, -20.6375\n*GRATE,Grating\n0, 0, 0, 0, 0.79375\n90, 0, 0, 0, 3.175\n*GRAVEL,Gravel, random cobbles\n228.0127875,18.288,25.4,305.85067529778,1.88796713245,3.4172144,-338.30483639565\n184.969741,16.002,22.86,-305.8545235377,1.10019612724,5.8640472,-580.54048893524\n132.5104471,10.16,22.352,-377.59492241548,1.56030959675,4.1348152,-409.347227941\n267.273689,.254,16.002,-508.63316875916,1.20815479432,5.3400452,-528.66437425738\n292.83365418,0.0,10.668,-330.19770134945,1.23208097566,5.236337,-518.39807745344\n357.273689,2.032,5.842,-508.63316875916,1.20815479432,5.3400452,-528.66437425738\n37.69424047,7.366,5.588,-416.58997273292,.91357450169,7.0619366,-699.13115314247\n72.25532837,12.954,9.906,586.40373773403,.96766293399,6.6671952,-660.05256601905\n121.42956562,14.986,16.256,387.71230339293,1.2040754753,5.35813,-530.45545698712\n175.2363583,12.192,20.828,-280.5442400419,2.10935518695,6.1171328,-299.7393695\n222.3974378,6.096,21.336,413.48123885686,.81554484621,7.9107792,-783.16772512177\n138.81407483,25.4,15.748,234.164238558,2.38943100688,2.7000454,-267.30565824344\n171.4692344,23.368,17.526,-334.082478726,1.25594916784,5.1368198,-508.5463899704\n225.00000,18.288,18.288,17.96051224214,17.96051224214,3.5920934,-32.32893108428\n203.19859051,16.51,21.336,-136.74251918,3.33518339548,1.9344132,-191.50622368894\n291.80140949,14.732,20.574,-80.18324702488,4.71666158921,2.7356562,-134.0475299\n30.96375653,15.748,18.034,91.47734531502,4.35606406258,4.4431966,-143.6629815291\n161.56505118,19.558,20.32,-56.2252967978,8.03218525675,3.2128714,-77.10898116828\n16.389540334,0.0,20.574,265.17991128726,1.43340492604,4.50088,-445.58826672539\n70.34617594,4.318,21.844,-297.29446803469,1.70858889651,3.7759894,-373.822156782\n293.19859051,19.558,25.4,-136.7425191801,3.33518339548,3.868801,-189.57183588894\n343.61045967,21.082,21.844,-265.17991128725,1.433404926,4.50088,-445.5882667254\n339.44395478,0.0,4.826,-136.75087638398,2.97284513779,4.340352,-212.67734313106\n294.7751406,4.064,3.302,-306.90424056705,1.77401295215,3.6367212,-360.0359338072\n66.80140949,19.812,0.0,136.74251918012,3.33518339452,3.868801,-189.57183588894\n17.35402464,21.336,3.556,-345.47402804977,1.51523696536,4.2578274,-421.523759802\n69.44395478,7.366,0.0,-136.75087638396,2.97284513874,2.170176,-214.84751913106\n101.309932474,18.288,0.0,104.60834648271,4.98134983255,1.295146,-128.21994964526\n165.963756532,18.034,1.27,-80.085263387,6.16040487582,5.236337,-99.49054589069\n186.00900596,12.954,2.54,-255.26337856879,1.32949676118,4.85267,-480.41364863337\n303.69006753,15.748,15.748,-56.35753993648,7.0446924921,3.6632388,-87.9177635968\n353.15722659,17.78,12.7,434.77679606606,1.0087628707,6.3955676,-633.16009065031\n60.9453959,24.13,11.938,-204.76648550216,2.46706609031,2.6150824,-258.8939231811\n90.0000000,25.4,14.224,25.4,25.4,1.524,-23.876\n120.25643716,12.446,3.302,-204.77318477297,1.8283320086,3.5286696,-349.339407732\n48.01278750,10.668,6.35,305.85067529778,1.88796713138,6.8344288,-334.88762199565\n0.000000000,15.24,11.43,25.4,25.4,6.604,-18.796\n325.3048465,21.844,11.43,310.04235091354,-1.6064370526,4.0160956,-397.5931672414\n254.0546041,25.146,9.144,104.6687497289,3.48895832444,3.6982908,-181.21650038772\n207.64597536,24.13,5.588,545.36007557253,1.07143433066,6.021451,-596.12464422938\n175.42607874,18.796,2.794,331.1739336186,1.01276432357,6.3702946,-630.6584645624\n*HEX,Hexagonal mesh\n0, 0, 0, 0, 5.4992613154, 3.175, -6.35\n120, 0, 0, 0, 5.4992613154, 3.175, -6.35\n60, 3.175, 0, 0, 5.4992613154, 3.175, -6.35\n*HONEY,Honeycomb\n0, 0, 0, 4.7625, 2.749630645, 3.175, -6.35\n120, 0, 0, 4.7625, 2.749630645, 3.175, -6.35\n60, 0, 0, 4.7625, 2.749630645, -6.35, 3.175\n*HOUND,Houndstooth\n0, 0, 0, 6.35, 1.5875, 25.4, -12.7\n90, 0, 0, -6.35, 1.5875, 25.4, -12.7\n*INSUL,Insulation batt\n0, 0, 0, 0, 9.525\n0, 0, 3.175, 0, 9.525, 3.175, -3.175\n0, 0, 6.35, 0, 9.525, 3.175, -3.175\n*LINE,Horizontal lines\n0, 0, 0, 0, 3.175\n*MUDST,Mud / sand (geological)\n0, 0, 0, 12.7, 6.35, 6.35, -6.35, 0, -6.35, 0, -6.35\n*NET,Square grid\n0, 0, 0, 0, 3.175\n90, 0, 0, 0, 3.175\n*NET3,Triangular grid\n0, 0, 0, 0, 3.175\n60, 0, 0, 0, 3.175\n120, 0, 0, 0, 3.175\n*PLAST,Plastic\n0, 0, 0, 0, 6.35\n0, 0, 0.79375, 0, 6.35\n0, 0, 1.5875, 0, 6.35\n*PLASTI,Plastic, dense\n0, 0, 0, 0, 6.35\n0, 0, 0.79375, 0, 6.35\n0, 0, 1.5875, 0, 6.35\n0, 0, 3.96875, 0, 6.35\n*SACNCR,Concrete, dotted diagonal\n45, 0, 0, 0, 2.38125\n45, 1.6838, 0, 0, 2.38125, 0, -2.38125\n*SQUARE,Dashed square lattice\n0, 0, 0, 0, 3.175, 3.175, -3.175\n90, 0, 0, 0, 3.175, 3.175, -3.175\n*STARS,Six-pointed star lattice\n0, 0, 0, 0, 5.4992613154, 3.175, -3.175\n60, 0, 0, 0, 5.4992613154, 3.175, -3.175\n120, 1.5875, 2.7496306704, 0, 5.4992613154, 3.175, -3.175\n*STEEL,Steel, paired lines\n45, 0, 0, 0, 3.175\n45, 0, 1.5875, 0, 3.175\n*SWAMP,Swamp / marsh\n0, 0, 0, 12.7, 21.9970452362, 3.175, -22.225\n90, 1.5875, 0, 21.9970452362, 12.7, 1.5875, -42.4065904724\n90, 1.984375, 0, 21.9970452362, 12.7, 1.27, -42.7240904724\n90, 1.190625, 0, 21.9970452362, 12.7, 1.27, -42.7240904724\n60, 2.38125, 0, 12.7, 21.9970452362, 1.016, -24.384\n120, 0.79375, 0, 12.7, 21.9970452362, 1.016, -24.384\n*TRANS,Heat-transfer surface\n0, 0, 0, 0, 6.35\n0, 0, 3.175, 0, 6.35, 3.175, -3.175\n*TRIANG,Triangle tiling\n60, 0, 0, 4.7625, 8.2488919604, 4.7625, -4.7625\n120, 0, 0, 4.7625, 8.2488919604, 4.7625, -4.7625\n0, -2.38125, 4.1244459802, 4.7625, 8.2488919604, 4.7625, -4.7625\n*ZIGZAG,Stair-step zigzag\n0, 0, 0, 3.175, 3.175, 3.175, -3.175\n90, 3.175, 0, 3.175, 3.175, 3.175, -3.175\n\n;; Hatch companions to the ISO 128 line types (1 mm pen base).\n\n*ACAD_ISO02W100,ISO dashed\n0, 0,0, 0,5, 12,-3\n*ACAD_ISO03W100,ISO dashed, wide gaps\n0, 0,0, 0,5, 12,-18\n*ACAD_ISO04W100,ISO long-dash dot\n0, 0,0, 0,5, 24,-3,.5,-3\n*ACAD_ISO05W100,ISO long-dash double-dot\n0, 0,0, 0,5, 24,-3,.5,-3,.5,-3\n*ACAD_ISO06W100,ISO long-dash triple-dot\n0, 0,0, 0,5, 24,-3,.5,-3,.5,-6.5\n0, 0,0, 0,5, -34,.5,-3\n*ACAD_ISO07W100,ISO dotted\n0, 0,0, 0,5, .5,-3\n*ACAD_ISO08W100,ISO long-dash short-dash\n0, 0,0, 0,5, 24,-3,6,-3\n*ACAD_ISO09W100,ISO long-dash double short-dash\n0, 0,0, 0,5, 24,-3,6,-3,6,-3\n*ACAD_ISO10W100,ISO dash dot\n0, 0,0, 0,5, 12,-3,.5,-3\n*ACAD_ISO11W100,ISO double-dash dot\n0, 0,0, 0,5, 12,-3,12,-3,.5,-3\n*ACAD_ISO12W100,ISO dash double-dot\n0, 0,0, 0,5, 12,-3,.5,-3,.5,-3\n*ACAD_ISO13W100,ISO double-dash double-dot\n0, 0,0, 0,5, 12,-3,12,-3,.5,-6.5\n0, 0,0, 0,5, -33.5,.5,-3\n*ACAD_ISO14W100,ISO dash triple-dot\n0, 0,0, 0,5, 12,-3,.5,-3,.5,-6.5\n0, 0,0, 0,5, -22,.5,-3\n*ACAD_ISO15W100,ISO double-dash triple-dot\n0, 0,0, 0,5, 12,-3,12,-3,.5,-10\n0, 0,0, 0,5, -33.5,.5,-3,.5,-3\n\n;; JIS A 0150 section patterns.\n\n*JIS_LC_20,Lightweight concrete, 20 mm (JIS)\n45,0,0,0,20\n45,.4,0,0,20\n*JIS_LC_20A,Lightweight concrete, 20 mm wide (JIS)\n45,0,0,0,20\n45,1,0,0,20\n*JIS_LC_8,Lightweight concrete, 8 mm (JIS)\n45,0,0,0,7.8\n45,.4,0,0,7.8\n*JIS_LC_8A,Lightweight concrete, 8 mm wide (JIS)\n45,0,0,0,7.8\n45,1,0,0,7.8\n*JIS_RC_10,Reinforced concrete, 10 mm (JIS)\n45,0,0,0,10\n45,.725,0,0,10\n45,1.45,0,0,10\n*JIS_RC_15,Reinforced concrete, 15 mm (JIS)\n45,0,0,0,15\n45,.725,0,0,15\n45,1.45,0,0,15\n*JIS_RC_18,Reinforced concrete, 18 mm (JIS)\n45,0,0,0,18\n45,1,0,0,18\n45,2,0,0,18\n*JIS_RC_30,Reinforced concrete, 30 mm (JIS)\n45,0,0,0,30\n45,1,0,0,30\n45,2,0,0,30\n*JIS_STN_1E,Stone, 1 mm (JIS)\n45, 0, 0, 0, 1\n45, .705, 0, 0,1, 1, -.5\n*JIS_STN_2.5,Stone, 2.5 mm (JIS)\n45, 0, 0, 0, 2.5\n45, 1.765, 0, 0,2.5, 1.2, -.5\n*JIS_WOOD,Wood (JIS)\n45,0,0,0,.70710678\n`;\n","// Document → DXF (AC1021-era entities, mm units). Model space, every paper\n// layout (as *Paper_Space blocks + LAYOUT objects), and viewports (VIEWPORT\n// entities) are written. Hatches, leaders, and dimensions go out as native\n// entities; dimensions also carry a geometry block (exploded via the exact\n// painter geometry) so CAD apps that don't regenerate still show them.\n\nimport {\n hatchPatternKey,\n resolveHatchPattern,\n type DocumentHatchPattern,\n} from \"../../model/hatchPatterns\";\nimport {\n DxfWriter,\n Units,\n LayerFlags,\n LWPolylineFlags,\n MTextAttachmentPoint,\n TextHorizontalAlignment,\n TextVerticalAlignment,\n HatchBoundaryPaths,\n HatchPolylineBoundary,\n HatchPredefinedPatterns,\n pattern,\n type DxfBlock,\n type DxfLayer,\n type Dxfier,\n} from \"@tarikjabiri/dxf\";\nimport type { LineaDocument } from \"../../model/document\";\nimport type {\n DimStyle,\n ModelObject,\n Table,\n Text,\n TextSpan,\n Viewport,\n} from \"../../model/objects\";\nimport {\n dimFontFace,\n DIM_DEFAULT_CONTENT,\n DIM_VALUE_TOKEN,\n dimStyleFor as dimStyleForObj,\n resolveTextStyle,\n textStyleFor as textStyleForObj,\n} from \"../../model/objects\";\nimport {\n LINE_TYPE_DEFS,\n resolveLineType,\n type LineType,\n} from \"../../model/lineTypes\";\nimport type { Vec2 } from \"../../geometry/vec2\";\nimport { add, fromAngle, norm, perp, scale, sub } from \"../../geometry/vec2\";\nimport { getEvaluatedWorldChildren } from \"../../extensions/evalBlock\";\nimport { documentObjectResolver } from \"../../model/objectLookup\";\nimport {\n dimensionGeometry,\n dimensionLabelFrames,\n formatDimValue,\n linearAxis,\n} from \"../../paint/dimensionGeometry\";\nimport {\n boundMeasurer,\n textBlock,\n type TextMeasurer,\n} from \"../../paint/textMetrics\";\nimport {\n fontFace,\n fontTypeface,\n parseFontFace,\n resolveFont,\n} from \"../../model/fonts\";\nimport { tableCellFrame, tableLayout } from \"../../paint/tableLayout\";\nimport { rotateObject, translateObject } from \"../../transform\";\nimport { textFrameGeometry } from \"../../paint/textGeometry\";\nimport { hexToTrueColor, nearestAci } from \"./aci\";\nimport { encodeMtext, encodeRichMtext, mmToLineWeight } from \"./codecs\";\nimport {\n AcadTableEntity,\n ViewportEntity,\n LayoutObject,\n MultiLeaderEntity,\n MLeaderStyleObject,\n TableStyleObject,\n classesSection,\n type AcadTableCellArgs,\n} from \"./dxfExtras\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nimport { ANSI31_BASE_ANGLE_DEG, ANSI31_BASE_SPACING } from \"./hatchPattern\";\n\n/** DXF layer names must avoid a set of reserved characters. */\nconst sanitizeLayerName = (name: string): string =>\n name.replace(/[<>/\\\\\":;?*|=,`]/g, \"_\").trim() || \"0\";\n\nconst v3 = (p: Vec2) => ({ x: p.x, y: p.y, z: 0 });\n/** BLOCK group-70 bit: an external reference (the path rides in group 1). */\nconst XREF_BLOCK_FLAG = 4;\n\nconst H_ALIGN: Record<Text[\"hAlign\"], TextHorizontalAlignment> = {\n left: TextHorizontalAlignment.Left,\n center: TextHorizontalAlignment.Center,\n right: TextHorizontalAlignment.Right,\n};\n\n/** MTEXT attachment point 1–9 (TL TC TR / ML MC MR / BL BC BR). */\nconst mtextAttachment = (\n hAlign: Text[\"hAlign\"],\n vAlign: Text[\"vAlign\"],\n): MTextAttachmentPoint => {\n const row = vAlign === \"top\" ? 0 : vAlign === \"center\" ? 3 : 6;\n const col = hAlign === \"left\" ? 1 : hAlign === \"center\" ? 2 : 3;\n return (row + col) as MTextAttachmentPoint;\n};\n\n/** LTYPE name a line type exports as (undefined = solid/continuous/unknown).\n * Document-defined line types resolve ahead of the catalogue. */\nconst dxfLineTypeName = (\n lineType: string | undefined,\n lineTypes?: readonly LineType[],\n): string | undefined => {\n if (!lineType) return undefined;\n const p = resolveLineType(lineType, lineTypes);\n if (!p || p.dashesMm.length === 0) return undefined;\n return p.dxfName ?? p.name.toUpperCase();\n};\n\n/** A STYLE table record we wrote: its name, handle, and the font FACE it\n * carries (the xdata typeface/flags derive from the face). */\ninterface StyleRecord {\n name: string;\n handle: string;\n face: string;\n}\n\ninterface ExportContext {\n doc: LineaDocument;\n /** Text width measurement (canvas-backed in the editor, font-metric in Node). */\n measure: TextMeasurer;\n writer: DxfWriter;\n layerNames: Map<string, string>;\n layerRecords: Map<string, DxfLayer>;\n skipped: Map<string, number>;\n exported: number;\n dimBlockCount: number;\n /** Write leaders as plain geometry instead of MULTILEADER objects (see\n * DxfExportOptions). */\n explodeLeaders: boolean;\n /** Write tables as rules + texts instead of ACAD_TABLE (see options). */\n explodeTables: boolean;\n /** The TABLESTYLE every ACAD_TABLE references. */\n tableStyleHandle: string;\n /** Anonymous `*T<n>` table blocks written so far. */\n tableBlockCount: number;\n /** Handles for MULTILEADER references. */\n mleaderStyleHandle: string;\n textStyleHandle: string;\n lineTypeHandle: string;\n /** STYLE records: the document's text styles under `doc:<id>` (written\n * by their own names), plus lazily created per-face fallbacks under the\n * face string (`LINEA_<FONT>[_B][_I]`) for texts whose effective face\n * differs from their style's. */\n textStyles: Map<string, StyleRecord>;\n /** Taken STYLE names (upper-cased) — DXF table names are case-insensitive. */\n styleNames: Set<string>;\n /** DIMSTYLE record name per document dim style id. */\n dimStyleRecords: Map<string, string>;\n dimStyleNames: Set<string>;\n /** Per-override DIMSTYLE records (`<style>_n`), keyed by base + values. */\n dimStyles: Map<string, string>;\n dimOverrideCounts: Map<string, number>;\n /** Pattern-frame anchors of written hatches, by entity handle — baked into\n * the definition lines' 43/44 after stringify (injectHatchPatternLines). */\n hatchOrigins: Map<string, Vec2>;\n /** XREF block names by referenced path (one block per linked file). */\n xrefBlocks: Map<string, string>;\n /** Definition ids of the block instances being baked, outermost first —\n * a nested instance of one of them is a cycle (skipped, not recursed). */\n blockChain: string[];\n}\n\nexport interface DxfExportResult {\n content: string;\n exported: number;\n skipped: Map<string, number>;\n}\n\n/**\n * @tarikjabiri/dxf has no lineweight slot — it hard-codes `370 0` (hairline)\n * on every LAYER record and writes none on entities. Patch the tag emission\n * of one record/entity: overwrite an existing 370, else insert it before the\n * entity's own subclass marker (the second group 100, where AutoCAD puts it).\n */\nconst setLineWeight = (\n target: { dxfy(dx: Dxfier): void },\n weight: number,\n): void => {\n const emit = target.dxfy.bind(target);\n target.dxfy = (dx) => {\n const start = dx.lines.length;\n emit(dx);\n const lines = dx.lines;\n for (let i = start; i < lines.length; i += 2)\n if (lines[i] === 370) {\n lines[i + 1] = weight;\n return;\n }\n let markers = 0;\n for (let i = start; i < lines.length; i += 2)\n if (lines[i] === 100 && ++markers === 2) {\n lines.splice(i, 0, 370, weight);\n return;\n }\n lines.push(370, weight);\n };\n};\n\nconst optionsFor = (obj: ModelObject, ctx: ExportContext) => {\n // We render dashes width-proportionally (pattern × resolved lineweight ×\n // CELTSCALE); DXF consumers render pattern × group 48. Fold the width in\n // so AutoCAD shows the same dash lengths the user saw (import divides it\n // back out — round-trips are exact). Emitted only when the effective line\n // type actually dashes — continuous entities don't need the noise.\n const layer = ctx.doc.layers.find((l) => l.id === obj.layerId);\n const dashed =\n (resolveLineType(obj.lineType ?? layer?.lineType ?? \"\", ctx.doc.lineTypes)\n ?.dashesMm.length ?? 0) > 0;\n const lineTypeScale =\n (obj.lineTypeScale ?? 1) * (obj.lineWidth ?? layer?.lineWidth ?? 0.25);\n const trueColor = obj.color ? hexToTrueColor(obj.color) : null;\n return {\n layerName: ctx.layerNames.get(obj.layerId) ?? \"0\",\n // Both color forms: nearest ACI (62) for legacy viewers, exact true\n // color (420) which wins wherever it is supported.\n ...(obj.color ? { colorNumber: nearestAci(obj.color) } : {}),\n ...(trueColor !== null ? { trueColor: String(trueColor) } : {}),\n ...(dxfLineTypeName(obj.lineType, ctx.doc.lineTypes)\n ? { lineType: dxfLineTypeName(obj.lineType, ctx.doc.lineTypes) }\n : {}),\n ...(dashed && lineTypeScale !== 1 ? { lineTypeScale } : {}),\n };\n};\n\n/** Arrowhead geometry mirroring paintArrowhead's styles. */\nconst addArrowhead = (\n space: DxfBlock,\n tip: Vec2,\n toward: Vec2,\n size: number,\n type: DimStyle[\"arrowType\"],\n opts: object,\n) => {\n if (type === \"none\") return;\n const dir = norm(sub(toward, tip));\n if (dir.x === 0 && dir.y === 0) return;\n switch (type) {\n case \"filled\": {\n const base = add(tip, scale(dir, size));\n const half = scale(perp(dir), size / 3);\n space.addLWPolyline(\n [\n { point: v3(tip) },\n { point: v3(add(base, half)) },\n { point: v3(sub(base, half)) },\n ],\n { flags: LWPolylineFlags.Closed, ...opts },\n );\n break;\n }\n case \"open\": {\n const base = add(tip, scale(dir, size));\n const half = scale(perp(dir), size / 3);\n space.addLWPolyline(\n [\n { point: v3(add(base, half)) },\n { point: v3(tip) },\n { point: v3(sub(base, half)) },\n ],\n opts,\n );\n break;\n }\n case \"tick\": {\n const diag = scale(norm(add(dir, perp(dir))), size / 2);\n space.addLine(v3(sub(tip, diag)), v3(add(tip, diag)), opts);\n break;\n }\n case \"dot\":\n space.addCircle(v3(tip), size / 4, opts);\n break;\n }\n};\n\n/** A table name nobody else holds: `name`, else `name_2`, `name_3`, … */\nconst uniqueTableName = (taken: Set<string>, base: string): string => {\n let name = base;\n for (let i = 2; taken.has(name.toUpperCase()); i++) name = `${base}_${i}`;\n taken.add(name.toUpperCase());\n return name;\n};\n\n/** The font FACE a face string resolves to for writing: a bundled font's id\n * or — a font id outside the bundle, kept from a DXF import — its own name,\n * so it round-trips instead of becoming the default. */\nconst writableFace = (\n font: string | undefined,\n): { face: string; fontFile: string; fontId: string; foreign: boolean } => {\n const def = resolveFont(font);\n const { font: bare, bold, italic } = parseFontFace(font);\n const foreign = bare !== undefined && bare !== \"\" && bare !== def.id;\n const fontId = foreign ? bare : def.id;\n return {\n face: fontFace(fontId, bold, italic)!,\n fontFile: foreign ? `${fontId}.ttf` : def.dxfFontFile,\n fontId,\n foreign,\n };\n};\n\n/** Write (or, for the writer's predefined \"Standard\", adopt) one STYLE\n * record. Fonts are exported as TTF references by file name — never\n * embedded, like AutoCAD; bold/italic ride as the ACAD xdata flags\n * (injectStyleTypefaces), so the receiving CAD picks its own face. */\nconst addStyleRecord = (\n ctx: ExportContext,\n key: string,\n name: string,\n font: string | undefined,\n widthFactor = 1,\n fixedHeight = 0,\n): StyleRecord => {\n const { face, fontFile } = writableFace(font);\n const table = ctx.writer.document.tables.styleTable;\n const predefined =\n name.toUpperCase() === \"STANDARD\" && !ctx.styleNames.has(\"STANDARD\")\n ? table.records.find((r) => r.name.toUpperCase() === \"STANDARD\")\n : undefined;\n const style =\n predefined ?? table.addStyle(uniqueTableName(ctx.styleNames, name));\n if (predefined) ctx.styleNames.add(\"STANDARD\");\n style.fontFileName = fontFile;\n style.widthFactor = widthFactor;\n // A document style's height is the height its texts get — AutoCAD's\n // fixed height (40); 0 for the per-face fallbacks (asked per text).\n style.fixedTextHeight = fixedHeight;\n const rec = { name: style.name, handle: style.handle, face };\n ctx.textStyles.set(key, rec);\n return rec;\n};\n\n/** The document's text styles, each as a STYLE record under its own name —\n * a DXF → Linea → DXF trip keeps \"ISO-25\" and \"Notes\" in the receiving\n * CAD's style manager. Written up front, used or not, like AutoCAD does. */\nconst createDocTextStyles = (ctx: ExportContext): void => {\n for (const s of ctx.doc.textStyles)\n addStyleRecord(\n ctx,\n `doc:${s.id}`,\n sanitizeLayerName(s.name),\n fontFace(s.font, s.bold, s.italic),\n s.widthFactor,\n s.textHeight,\n );\n};\n\n/** The STYLE record a DIMSTYLE's DIMTXSTY points at: a document text style\n * with the same face AND width factor when there is one, else a per-face\n * fallback — with a `_W<pct>` variant when the width factor is not 1, since\n * a dimension has no entity-level 41 to carry it. */\nconst dimTextStyleFor = (\n ctx: ExportContext,\n face: string | undefined,\n widthFactor: number,\n): StyleRecord => {\n const want = writableFace(face).face;\n const own = ctx.doc.textStyles.find(\n (s) =>\n writableFace(fontFace(s.font, s.bold, s.italic)).face === want &&\n Math.abs(s.widthFactor - widthFactor) < 1e-9,\n );\n const ownRec = own && ctx.textStyles.get(`doc:${own.id}`);\n if (ownRec) return ownRec;\n if (Math.abs(widthFactor - 1) < 1e-9) return textStyleFor(ctx, face);\n const key = `${want}|w${widthFactor}`;\n return (\n ctx.textStyles.get(key) ??\n addStyleRecord(\n ctx,\n key,\n `${textStyleFor(ctx, face).name}_W${Math.round(widthFactor * 100)}`,\n face,\n widthFactor,\n )\n );\n};\n\n/** Per-face fallback record (`LINEA_<FONT>[_B][_I]`), created on first use,\n * for text whose effective face is not its document style's. */\nconst textStyleFor = (\n ctx: ExportContext,\n font: string | undefined,\n): StyleRecord => {\n const { face, fontId, foreign } = writableFace(font);\n const { bold, italic } = parseFontFace(face);\n const suffix = (bold ? \"B\" : \"\") + (italic ? \"I\" : \"\");\n return (\n ctx.textStyles.get(face) ??\n addStyleRecord(\n ctx,\n face,\n `LINEA_${(foreign ? fontId.replace(/[^A-Za-z0-9_-]/g, \"_\") : fontId).toUpperCase()}${suffix ? `_${suffix}` : \"\"}`,\n face,\n )\n );\n};\n\n/** The STYLE record a text is written with: its document style's own\n * record when the text renders in that style's face, else the per-face\n * fallback (the entity's own 41 / `\\W` carries the width factor). */\nconst textRecordFor = (\n ctx: ExportContext,\n obj: Text,\n face: string | undefined,\n): StyleRecord => {\n const base = textStyleForObj(obj, ctx.doc.textStyles);\n const own = ctx.textStyles.get(`doc:${base.id}`);\n return own &&\n writableFace(fontFace(base.font, base.bold, base.italic)).face ===\n writableFace(face).face\n ? own\n : textStyleFor(ctx, face);\n};\n\ninterface TextFontOpts {\n styleName?: string;\n font?: string;\n widthFactor?: number;\n /** Character formatting (forces MTEXT inline codes). */\n spans?: readonly TextSpan[];\n}\n\nconst addTextLines = (\n space: DxfBlock,\n content: string,\n position: Vec2,\n height: number,\n rotation: number,\n hAlign: Text[\"hAlign\"],\n vAlign: Text[\"vAlign\"],\n opts: object,\n measure: TextMeasurer,\n /** MTEXT reference rectangle width (mm); forces an MTEXT with word-wrap. */\n mtextWidth?: number,\n fontOpts: TextFontOpts = {},\n) => {\n const { styleName, font, widthFactor = 1, spans } = fontOpts;\n // Wrap decisions must use the font the receiving CAD will render with.\n const m = boundMeasurer(measure, font, widthFactor);\n const block = textBlock(content, height, m, mtextWidth);\n if (\n block.lines.length > 1 ||\n (mtextWidth !== undefined && mtextWidth > 0) ||\n content.includes(\"\\t\") ||\n !!spans?.length\n ) {\n // Multi-line, width-constrained, TABBED or FORMATTED content stays ONE\n // entity: MTEXT with \\P line breaks / ^I tabs, inline formatting codes\n // and (when set) a reference rectangle width (group 41). (TEXT has no\n // tab semantics at all.) Width factor has no MTEXT group code — it\n // rides as an inline \\W code.\n const value =\n (widthFactor !== 1 ? `\\\\W${widthFactor};` : \"\") +\n (spans?.length\n ? encodeRichMtext(content, spans, font)\n : encodeMtext(content));\n const mtext = space.addMText(v3(position), height, value, {\n rotation: rotation * RAD2DEG,\n attachmentPoint: mtextAttachment(hAlign, vAlign),\n ...(mtextWidth !== undefined && mtextWidth > 0\n ? { width: mtextWidth }\n : {}),\n ...opts,\n });\n if (styleName) mtext.textStyle = styleName;\n return;\n }\n const down = scale(perp(fromAngle(rotation)), -1);\n block.lines.forEach((raw, i) => {\n // A raw CR (a \\r\\n line ending's) would end the DXF value early.\n const line = raw.replace(/\\r/g, \"\");\n if (!line) return;\n const anchor = add(position, scale(down, i * block.lineHeight));\n const text = space.addText(v3(anchor), height, line, {\n rotation: rotation * RAD2DEG,\n horizontalAlignment: H_ALIGN[hAlign],\n verticalAlignment:\n vAlign === \"center\"\n ? TextVerticalAlignment.Middle\n : vAlign === \"top\"\n ? TextVerticalAlignment.Top\n : TextVerticalAlignment.BaseLine,\n // DXF quirk: aligned text positions via the second alignment point.\n secondAlignmentPoint: v3(anchor),\n ...(widthFactor !== 1 ? { relativeXScaleFactor: widthFactor } : {}),\n ...opts,\n });\n if (styleName) text.textStyle = styleName;\n });\n};\n\n/**\n * Built-in pattern name → DXF predefined pattern. They share names; the enum\n * keys use underscores where the .pat uses hyphens (AR-CONC → AR_CONC). Any\n * name the writer doesn't know falls back to ANSI31.\n */\n/** The document's own pattern of this name, if any (shadows the catalogue). */\nconst documentPattern = (\n ctx: ExportContext,\n name: string,\n): DocumentHatchPattern | undefined =>\n ctx.doc.hatchPatterns.find(\n (p) => hatchPatternKey(p.name) === hatchPatternKey(name),\n );\n\n/**\n * Every pattern HATCH gets its REAL definition lines, baked the way AutoCAD\n * stores them (rotated by the hatch's 52, scaled by its 41): `78 n` then per\n * line 53 angle / 43 44 origin / 45 46 offset / 79 n / 49 dashes, after the\n * record's 77. The writer only knows its own predefined names and writes a\n * generic stand-in definition for them — and readers DRAW the stored lines\n * (AutoCAD, BricsCAD, the DWG transcoder), so without this a TRIANG or\n * GRAVEL shows as two plain line families. A catalogue pattern also gets its\n * real name back (the writer's enum spells AR-SAND \"AR_SAND\", which a reader\n * looking the name up in acad.pat would not find); a document pattern goes\n * out as custom (76 = 2). Spliced into the writer's text like\n * injectStyleTypefaces.\n */\nconst injectHatchPatternLines = (\n content: string,\n ctx: ExportContext,\n): string => {\n if (!content.includes(\"\\n0\\nHATCH\\n\")) return content;\n const out: string[] = [];\n let pos = 0;\n for (;;) {\n const start = content.indexOf(\"\\n0\\nHATCH\\n\", pos);\n if (start === -1) break;\n // The record runs to the next entity / section marker: a `0` group whose\n // value is a NAME (a group VALUE of 0, like `70\\n0`, is not one).\n const rest = content.slice(start + 8);\n const m = /\\n0\\n(?=[A-Z][A-Z0-9_]*\\n)/.exec(rest);\n const end = m ? start + 8 + m.index : content.length;\n let record = content.slice(start, end);\n const handle = /\\n5\\n([0-9A-Fa-f]+)\\n/.exec(record)?.[1];\n // Pattern groups are read from the AcDbHatch body only: the entity's\n // handle (`5\\n41`) would otherwise pass for a `41` scale group.\n const bodyAt = record.indexOf(\"\\nAcDbHatch\\n\");\n const body = bodyAt === -1 ? record : record.slice(bodyAt);\n const name = /\\n2\\n([^\\n]*)\\n/.exec(body)?.[1];\n const anchor = handle ? ctx.hatchOrigins.get(handle) : undefined;\n // A document pattern shadows the catalogue's of the same name; SOLID\n // (no lines) is neither.\n const own = name ? documentPattern(ctx, name) : undefined;\n const pat = own ?? (name ? resolveHatchPattern(name, []) : undefined);\n const m77 = pat ? /\\n77\\n[^\\n]*\\n/.exec(body) : null;\n if (pat && m77 && bodyAt !== -1) {\n const angle =\n (Number(/\\n52\\n([^\\n]*)\\n/.exec(body)?.[1] ?? 0) * Math.PI) / 180;\n const scale = Number(/\\n41\\n([^\\n]*)\\n/.exec(body)?.[1] ?? 1) || 1;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const bake = (x: number, y: number) => [\n (cos * x - sin * y) * scale,\n (sin * x + cos * y) * scale,\n ];\n const lines = pat.lines\n .map((l) => {\n const [bx, by] = bake(l.origin.x, l.origin.y);\n const ox = bx + (anchor?.x ?? 0);\n const oy = by + (anchor?.y ?? 0);\n // 45/46: the step between lines, as a vector in the hatch frame\n // — our deltaX/deltaY are along / across the LINE, so rotate by\n // the line's own angle too (the baked angle = l.angle + 52).\n const bakedAngle = l.angle + angle;\n const dx =\n (Math.cos(bakedAngle) * l.deltaX -\n Math.sin(bakedAngle) * l.deltaY) *\n scale;\n const dy =\n (Math.sin(bakedAngle) * l.deltaX +\n Math.cos(bakedAngle) * l.deltaY) *\n scale;\n const dashes = l.dashesMm ?? [];\n return (\n `53\\n${((l.angle * 180) / Math.PI + (angle * 180) / Math.PI).toFixed(6)}\\n` +\n `43\\n${ox.toFixed(6)}\\n44\\n${oy.toFixed(6)}\\n45\\n${dx.toFixed(6)}\\n46\\n${dy.toFixed(6)}\\n` +\n `79\\n${dashes.length}\\n` +\n dashes.map((d) => `49\\n${(d * scale).toFixed(6)}\\n`).join(\"\")\n );\n })\n .join(\"\");\n // Replace the writer's own definition block (a predefined pattern\n // comes with one generic line) or, absent one, insert after 77.\n const at = bodyAt + m77.index + m77[0].length;\n const tail = record.slice(at);\n const writerBlock = tail.startsWith(\"78\\n\")\n ? (() => {\n const stop = /\\n(?:47|98)\\n/.exec(tail);\n return stop ? stop.index + 1 : tail.length;\n })()\n : 0;\n record =\n record.slice(0, at) +\n `78\\n${pat.lines.length}\\n` +\n lines +\n tail.slice(writerBlock);\n if (own) record = record.replace(/\\n76\\n1\\n/, \"\\n76\\n2\\n\");\n // The catalogue's own spelling (AR-SAND, not the writer's AR_SAND):\n // the first 2 group of the AcDbHatch body is the pattern name.\n else if (name && name !== pat.name.toUpperCase()) {\n const nameAt = record.indexOf(`\\n2\\n${name}\\n`, bodyAt);\n if (nameAt !== -1)\n record =\n record.slice(0, nameAt) +\n `\\n2\\n${pat.name.toUpperCase()}\\n` +\n record.slice(nameAt + name.length + 4);\n }\n }\n out.push(content.slice(pos, start), record);\n pos = end;\n }\n out.push(content.slice(pos));\n return out.join(\"\");\n};\n\nconst dxfPatternName = (name: string): HatchPredefinedPatterns => {\n const key = name\n .toUpperCase()\n .replace(/-/g, \"_\")\n .replace(/\\./g, \"_\") as keyof typeof HatchPredefinedPatterns;\n return HatchPredefinedPatterns[key] ?? HatchPredefinedPatterns.ANSI31;\n};\n\nconst writeHatch = (\n space: DxfBlock,\n obj: ModelObject,\n opts: object,\n ctx: ExportContext,\n) => {\n if (obj.type !== \"hatch\") return;\n // Gradient exports as a SOLID in the gradient's own start color (the\n // entity color would otherwise be the object/layer color, which a\n // gradient fill never shows).\n if (obj.fill.kind === \"gradient\") {\n opts = {\n ...opts,\n colorNumber: nearestAci(obj.fill.color1),\n trueColor: String(hexToTrueColor(obj.fill.color1)),\n };\n }\n const boundary = new HatchBoundaryPaths();\n for (const loop of obj.loops) {\n boundary.addPolylineBoundary(\n new HatchPolylineBoundary(\n loop.points.map((v) => ({ x: v.x, y: v.y, bulge: v.bulge })),\n ),\n );\n }\n const fill =\n // Gradient exports as SOLID in the start color — DXF gradient data\n // (codes 450+) is beyond dxf-writer, and a solid keeps the region and\n // its boundary intact in the receiving CAD.\n obj.fill.kind === \"solid\" || obj.fill.kind === \"gradient\"\n ? pattern({ name: HatchPredefinedPatterns.SOLID })\n : obj.fill.kind === \"pattern\"\n ? // The curated library names are the standard predefined patterns, so\n // this is a direct mapping; fill.angle/scale ARE the DXF rotation\n // (code 52) and scale (code 41). A DOCUMENT pattern goes out under\n // its own name; its definition lines are spliced in afterwards\n // (injectHatchPatternLines — the writer has no custom patterns).\n pattern({\n name: (documentPattern(ctx, obj.fill.name)\n ? obj.fill.name.toUpperCase()\n : dxfPatternName(obj.fill.name)) as HatchPredefinedPatterns,\n angle: obj.fill.angle * RAD2DEG,\n scale: obj.fill.scale * obj.scale,\n })\n : pattern({\n name: HatchPredefinedPatterns.ANSI31,\n angle: obj.fill.angle * RAD2DEG - ANSI31_BASE_ANGLE_DEG,\n // obj.scale is baked into the pattern scale (like text height).\n scale: (obj.fill.spacing * obj.scale) / ANSI31_BASE_SPACING,\n });\n const written = space.addHatch(boundary, fill, opts);\n if (obj.fill.kind === \"pattern\" && obj.fill.origin)\n ctx.hatchOrigins.set(written.handle, obj.fill.origin);\n};\n\n/** The painter's exact dimension output as plain entities (block content or,\n * for the explode path, straight into the target space). */\nconst writeDimensionGeometry = (\n target: DxfBlock,\n geom: NonNullable<ReturnType<typeof dimensionGeometry>>,\n opts: object,\n ctx: ExportContext,\n): void => {\n for (const seg of [...geom.extensionLines, ...geom.dimLines, ...geom.leaders])\n target.addLine(v3(seg.a), v3(seg.b), opts);\n if (geom.dimArc)\n target.addArc(\n v3(geom.dimArc.center),\n geom.dimArc.radius,\n geom.dimArc.startAngle * RAD2DEG,\n geom.dimArc.endAngle * RAD2DEG,\n opts,\n );\n for (const arrow of geom.arrows)\n addArrowhead(\n target,\n arrow.tip,\n arrow.toward,\n arrow.size,\n geom.arrowType,\n opts,\n );\n for (const text of geom.labels)\n addTextLines(\n target,\n text.content,\n text.anchor,\n text.height,\n text.rotation,\n \"center\",\n \"center\",\n opts,\n ctx.measure,\n undefined,\n {\n styleName: textStyleFor(ctx, text.font).name,\n font: text.font,\n widthFactor: text.widthFactor,\n spans: text.spans,\n },\n );\n};\n\n/** Write (or adopt the predefined \"Standard\") DIMSTYLE record mirroring a\n * resolved dim style — base values UNSCALED; the object's scale rides as\n * DIMSCALE, exactly AutoCAD's semantics. */\nconst addDimStyleRecord = (\n ctx: ExportContext,\n name: string,\n style: DimStyle & { scale?: number },\n): string => {\n const table = ctx.writer.document.tables.dimStyleTable;\n const predefined =\n name.toUpperCase() === \"STANDARD\" && !ctx.dimStyleNames.has(\"STANDARD\")\n ? table.records.find((r) => r.name.toUpperCase() === \"STANDARD\")\n : undefined;\n const rec =\n predefined ??\n ctx.writer.addDimStyle(uniqueTableName(ctx.dimStyleNames, name));\n if (predefined) ctx.dimStyleNames.add(\"STANDARD\");\n const scale = style.scale ?? 1;\n rec.DIMASZ = style.arrowSize;\n rec.DIMEXO = style.extensionOffset;\n rec.DIMEXE = style.extensionOvershoot;\n rec.DIMTXT = style.textHeight;\n rec.DIMGAP = style.textOffset;\n rec.DIMDEC = style.precision;\n if (scale !== 1) rec.DIMSCALE = scale;\n if (style.arrowType !== \"filled\") rec.DIMBLK = DIMBLK_NAMES[style.arrowType];\n rec.DIMTXSTY = dimTextStyleFor(\n ctx,\n dimFontFace(style),\n style.widthFactor,\n ).handle;\n return rec.name;\n};\n\n/** The document's dimension styles, each as a DIMSTYLE record under its\n * own name. */\nconst createDocDimStyles = (ctx: ExportContext): void => {\n for (const s of ctx.doc.dimStyles)\n ctx.dimStyleRecords.set(\n s.id,\n addDimStyleRecord(ctx, sanitizeLayerName(s.name), s),\n );\n};\n\n/** Per-object DIMSTYLE (`<style>_n`) for a dimension with overrides or an\n * annotation scale, cached by value so identical ones share a record. */\nconst dimOverrideStyleFor = (\n ctx: ExportContext,\n base: DimStyle,\n style: DimStyle & { scale?: number },\n): string => {\n const baseName =\n ctx.dimStyleRecords.get(base.id) ??\n ctx.dimStyleRecords.values().next().value ??\n \"Standard\";\n const key = JSON.stringify([\n baseName,\n style.arrowSize,\n style.arrowType,\n style.extensionOffset,\n style.extensionOvershoot,\n style.textHeight,\n style.textOffset,\n style.precision,\n dimFontFace(style),\n style.scale ?? 1,\n ]);\n const cached = ctx.dimStyles.get(key);\n if (cached) return cached;\n const n = (ctx.dimOverrideCounts.get(baseName) ?? 0) + 1;\n ctx.dimOverrideCounts.set(baseName, n);\n const name = addDimStyleRecord(ctx, `${baseName}_${n}`, style);\n ctx.dimStyles.set(key, name);\n return name;\n};\n\n// Standard arrowhead block names (\"\" = ClosedFilled, the default).\nconst DIMBLK_NAMES: Record<DimStyle[\"arrowType\"], string> = {\n filled: \"\",\n open: \"_OPEN\",\n tick: \"_ARCHTICK\",\n dot: \"_DOT\",\n none: \"_NONE\",\n};\n\nconst writeDimension = (\n space: DxfBlock,\n obj: ModelObject,\n opts: object,\n ctx: ExportContext,\n): boolean => {\n if (obj.type !== \"dimension\") return false;\n\n // Chained linear dimensions have no DXF counterpart — AutoCAD models\n // chains as one DIMENSION per measured pair; emit the same.\n if (obj.kind === \"linear\" && obj.points.length > 2) {\n let any = false;\n for (let i = 0; i + 1 < obj.points.length; i++) {\n const pair = { ...obj, points: obj.points.slice(i, i + 2) };\n any = writeDimension(space, pair, opts, ctx) || any;\n }\n return any;\n }\n\n const geom = dimensionGeometry(obj, ctx.doc.dimStyles);\n if (!geom) return false;\n\n // Geometry block: the painter's exact output, so CAD apps that don't\n // regenerate dimensions still display what the user saw.\n const blockName = `LINEA_DIM_${ctx.dimBlockCount++}`;\n const block = ctx.writer.addBlock(blockName);\n writeDimensionGeometry(block, geom, opts, ctx);\n\n // Style: the referenced document style's own record, or — with overrides\n // or an annotation scale — a per-object `<style>_n` record, so a\n // regenerating CAD reproduces the object's scale/precision/arrows too\n // (the annotation scale rides as DIMSCALE).\n const baseStyle = dimStyleForObj(obj, ctx.doc.dimStyles);\n const hasOverride =\n obj.styleOverride !== undefined &&\n Object.values(obj.styleOverride).some((v) => v !== undefined);\n const styleName =\n hasOverride || obj.scale !== 1\n ? dimOverrideStyleFor(ctx, baseStyle, {\n ...baseStyle,\n ...obj.styleOverride,\n scale: obj.scale,\n })\n : (ctx.dimStyleRecords.get(baseStyle.id) ??\n dimOverrideStyleFor(ctx, baseStyle, baseStyle));\n\n // Text (code 1): a label template becomes AutoCAD's `<>` for the live\n // measurement — on radial/diameter dims `<>` carries the R/Ø prefix, so\n // the kind's default template maps to it and a bare {value} has no live\n // form there (the number goes in). No content = the CAD computes.\n const content = obj.labels[0]?.content;\n const precision = {\n ...dimStyleForObj(obj, ctx.doc.dimStyles),\n ...obj.styleOverride,\n }.precision;\n const text =\n content === undefined\n ? undefined\n : content\n .split(DIM_DEFAULT_CONTENT[obj.kind])\n .join(\"<>\")\n .split(DIM_VALUE_TOKEN)\n .join(\n obj.kind === \"radial\" || obj.kind === \"diameter\"\n ? formatDimValue(geom.value, precision)\n : \"<>\",\n );\n const dimOpts = {\n blockName,\n ...(text === undefined ? {} : { text }),\n styleName,\n // Text middle point (group 11) — without it a regenerating CAD places\n // the value at the style default instead of where the user saw it.\n ...(geom.labels[0] ? { middlePoint: v3(geom.labels[0].anchor) } : {}),\n ...opts,\n };\n switch (obj.kind) {\n case \"angular\": {\n const [vertex, a, b] = obj.points;\n const [frame] = dimensionLabelFrames(obj);\n space.addAngularPointsDim(v3(vertex), v3(a), v3(b), {\n ...dimOpts,\n // A point on the arc (its middle): the radius and which arc.\n definitionPoint: v3(frame.toWorld((frame.s0 + frame.s1) / 2, 0)),\n });\n break;\n }\n case \"radial\": {\n // DXF radial: definition point (10) = center, 15 = point on the curve.\n const [center, p] = obj.points;\n space.addRadialDim(v3(p), v3(center), dimOpts);\n break;\n }\n case \"diameter\": {\n const [p1, p2] = obj.points;\n space.addDiameterDim(v3(p1), v3(p2), dimOpts);\n break;\n }\n case \"linear\": {\n // A locked measuring axis → a DXF ROTATED dim (code 50); unset →\n // ALIGNED. Code 10 is any point on the dimension line.\n const [p1, p2] = obj.points;\n const { u } = linearAxis(obj);\n space.addLinearDim(v3(p1), v3(p2), {\n ...dimOpts,\n definitionPoint: v3(geom.dimLines[0].b),\n angle: Math.atan2(u.y, u.x) * RAD2DEG,\n });\n break;\n }\n }\n return true;\n};\n\n/** A cell's text as ACAD_TABLE stores it: MTEXT with the cell's face,\n * height and width factor inline — `{\\fArial|b1|i0|c0|p34;\\H3.5;…}`, the\n * form AutoCAD writes (the importer reads the height back from \\H). */\nconst tableCellMtext = (text: Text, ctx: ExportContext): string => {\n if (text.content.trim() === \"\") return \"\";\n const eff = resolveTextStyle(text, ctx.doc.textStyles);\n const face = fontFace(eff.font, eff.bold, eff.italic);\n const { font, bold, italic } = parseFontFace(face);\n const height = eff.textHeight * text.scale;\n const body = text.spans?.length\n ? encodeRichMtext(text.content, text.spans, face)\n : encodeMtext(text.content);\n return (\n `{\\\\f${fontTypeface(resolveFont(font))}|b${bold ? 1 : 0}|i${italic ? 1 : 0}|c0|p34;` +\n `\\\\H${+height.toFixed(6)};` +\n (eff.widthFactor !== 1 ? `\\\\W${eff.widthFactor};` : \"\") +\n `${body}}`\n );\n};\n\n/** Model alignment → MTEXT / table attachment point 1–9. */\nconst attachmentOf = (\n hAlign: Text[\"hAlign\"],\n vAlign: Text[\"vAlign\"],\n): number =>\n (vAlign === \"top\" ? 0 : vAlign === \"center\" ? 3 : 6) +\n (hAlign === \"left\" ? 1 : hAlign === \"center\" ? 2 : 3);\n\n/**\n * A table as a native ACAD_TABLE: the grid (the laid-out row heights — rows\n * grown to fit their text — and column widths), every cell's text and merge\n * extent, over an anonymous `*T<n>` block of the drawn table (rules + texts\n * in the table's own frame) for readers that don't regenerate tables.\n */\nconst writeNativeTable = (\n space: DxfBlock,\n obj: Table,\n ctx: ExportContext,\n): void => {\n const layout = tableLayout(obj, ctx.doc.textStyles);\n const name = `*T${++ctx.tableBlockCount}`;\n // The writer strips \"*\" from block names unless told not to.\n const block = ctx.writer.document.blocks.addBlock(\n name,\n ctx.writer.document.objects,\n false,\n );\n block.flags = 1 as typeof block.flags; // anonymous\n const before = ctx.exported;\n const origin = { x: 0, y: 0 };\n for (const child of layout.children)\n writeObject(\n block,\n rotateObject(\n translateObject(child, { x: -obj.position.x, y: -obj.position.y }),\n origin,\n -obj.rotation,\n ),\n ctx,\n );\n ctx.exported = before;\n const blockRecordHandle =\n ctx.writer.document.tables.blockRecordTable.records.find(\n (r) => r.name === name,\n )?.handle ?? \"0\";\n\n const rows = obj.rows.length;\n const cols = obj.columns.length;\n const anchorAt = new Map(\n layout.anchors.map((a) => [`${a.row}:${a.col}`, a] as const),\n );\n const cells: AcadTableCellArgs[] = [];\n for (let r = 0; r < rows; r++)\n for (let c = 0; c < cols; c++) {\n const a = anchorAt.get(`${r}:${c}`);\n if (!a) {\n cells.push({ text: \"\", cols: 1, rows: 1, merged: true, alignment: 1 });\n continue;\n }\n const { text } = tableCellFrame(obj, ctx.doc.textStyles, r, c);\n cells.push({\n text: tableCellMtext(text, ctx),\n cols: a.cols,\n rows: a.rows,\n merged: false,\n alignment: attachmentOf(text.hAlign, text.vAlign),\n });\n }\n const diffs = (xs: number[]) => xs.slice(1).map((x, i) => x - xs[i]);\n const entity = new AcadTableEntity({\n blockName: name,\n blockRecordHandle,\n tableStyleHandle: ctx.tableStyleHandle,\n position: obj.position,\n direction: { x: Math.cos(obj.rotation), y: Math.sin(obj.rotation) },\n rowHeights: diffs(layout.rowY),\n colWidths: diffs(layout.colX),\n cells,\n });\n entity.layerName = ctx.layerNames.get(obj.layerId) ?? \"0\";\n if (obj.color) {\n entity.colorNumber = nearestAci(obj.color);\n const tc = hexToTrueColor(obj.color);\n if (tc !== null) entity.trueColor = String(tc);\n }\n space.addEntity(entity);\n};\n\nconst writeObject = (\n space: DxfBlock,\n obj: ModelObject,\n ctx: ExportContext,\n): void => {\n const before = space.entities.length;\n writeObjectEntities(space, obj, ctx);\n // An explicit lineweight is written as 370 on everything the object\n // became; byLayer stays inherited (the LAYER record carries its 370).\n if (obj.lineWidth !== undefined)\n for (const entity of space.entities.slice(before))\n setLineWeight(entity, mmToLineWeight(obj.lineWidth));\n};\n\nconst writeObjectEntities = (\n space: DxfBlock,\n obj: ModelObject,\n ctx: ExportContext,\n): void => {\n const opts = optionsFor(obj, ctx);\n switch (obj.type) {\n case \"line\":\n space.addLine(v3(obj.a), v3(obj.b), opts);\n break;\n case \"point\":\n space.addPoint(obj.p.x, obj.p.y, 0, opts);\n break;\n case \"polyline\":\n space.addLWPolyline(\n obj.points.map((v) => ({\n point: { x: v.x, y: v.y },\n bulge: v.bulge,\n })),\n {\n flags: obj.closed ? LWPolylineFlags.Closed : LWPolylineFlags.None,\n ...opts,\n },\n );\n break;\n case \"circle\":\n space.addCircle(v3(obj.center), obj.radius, opts);\n break;\n case \"arc\":\n space.addArc(\n v3(obj.center),\n obj.radius,\n obj.startAngle * RAD2DEG,\n obj.endAngle * RAD2DEG,\n opts,\n );\n break;\n case \"ellipse\":\n space.addEllipse(\n v3(obj.center),\n v3(obj.majorAxis), // relative to center, per DXF\n obj.ratio,\n obj.startAngle,\n obj.endAngle,\n opts,\n );\n break;\n case \"hatch\":\n writeHatch(space, obj, opts, ctx);\n break;\n case \"text\": {\n // Effective style (document style + overrides) — the font is baked\n // into the STYLE reference so receiving CADs render the same.\n const eff = resolveTextStyle(obj, ctx.doc.textStyles);\n const { arrowSize, arrowType } = eff;\n const face = fontFace(eff.font, eff.bold, eff.italic);\n // DXF has no text frame: write it as the same companion geometry the\n // painters stroke (rectangle/slot/underline → LWPOLYLINE with bulges)\n // — for plain notes and leader notes alike.\n for (const part of textFrameGeometry(\n obj,\n ctx.measure,\n ctx.doc.textStyles,\n ))\n space.addLWPolyline(\n part.points.map((v) => ({\n point: { x: v.x, y: v.y },\n bulge: v.bulge,\n })),\n {\n flags: part.closed ? LWPolylineFlags.Closed : LWPolylineFlags.None,\n ...opts,\n },\n );\n if (obj.leaderLines.length > 0 && ctx.explodeLeaders) {\n // Explode path (DWG transcode): leader lines + arrowheads as plain\n // geometry; the note itself falls through to the TEXT/MTEXT write.\n for (const line of obj.leaderLines) {\n space.addLWPolyline(\n line.map((v) => ({ point: { x: v.x, y: v.y } })),\n opts,\n );\n addArrowhead(\n space,\n line[0],\n line[1],\n arrowSize * obj.scale,\n arrowType,\n opts,\n );\n }\n } else if (obj.leaderLines.length > 0) {\n // One MULTILEADER carries the leader lines + the note text. Line\n // vertices stop before the shared junction (the LEADER node's\n // \"last point\"); the junction→text gap doubles as the dogleg, and\n // the object's scale maps to MLEADER's overall scale.\n const first = obj.leaderLines[0];\n const junction = first[first.length - 1];\n const toText = {\n x: obj.position.x - junction.x,\n y: obj.position.y - junction.y,\n };\n const gap = Math.max(Math.hypot(toText.x, toText.y), 1e-6);\n const lines = obj.leaderLines.map((line) => {\n const last = line[line.length - 1];\n const joins =\n Math.hypot(last.x - junction.x, last.y - junction.y) < 1e-9;\n return joins && line.length > 1 ? line.slice(0, -1) : line;\n });\n const entity = new MultiLeaderEntity({\n lines,\n junction,\n doglegDirection: { x: toText.x / gap, y: toText.y / gap },\n doglegLength: gap,\n content: obj.spans?.length\n ? encodeRichMtext(obj.content, obj.spans, face)\n : encodeMtext(obj.content),\n textHeight: eff.textHeight,\n arrowSize,\n overallScale: obj.scale,\n textLocation: obj.position,\n // Model alignment → MTEXT-style attachment point (1–9).\n attachment:\n 1 +\n 3 * [\"top\", \"center\", \"bottom\"].indexOf(obj.vAlign) +\n [\"left\", \"center\", \"right\"].indexOf(obj.hAlign),\n styleHandle: ctx.mleaderStyleHandle,\n textStyleHandle: textRecordFor(ctx, obj, face).handle,\n lineTypeHandle: ctx.lineTypeHandle,\n });\n entity.layerName = ctx.layerNames.get(obj.layerId) ?? \"0\";\n if (obj.color) {\n entity.colorNumber = nearestAci(obj.color);\n const tc = hexToTrueColor(obj.color);\n if (tc !== null) entity.trueColor = String(tc);\n }\n space.addEntity(entity);\n break;\n }\n // Model alignment is the DXF justification (which edge sits on the\n // point). TEXT has no scale concept, so the effective height is baked\n // in.\n addTextLines(\n space,\n obj.content,\n obj.position,\n eff.textHeight * obj.scale,\n obj.rotation,\n obj.hAlign,\n obj.vAlign,\n opts,\n ctx.measure,\n obj.width === undefined ? undefined : obj.width * obj.scale,\n {\n styleName: textRecordFor(ctx, obj, face).name,\n font: face,\n widthFactor: eff.widthFactor,\n spans: obj.spans,\n },\n );\n break;\n }\n case \"dimension\":\n if (!writeDimension(space, obj, opts, ctx)) {\n skip(ctx, \"dimension\");\n return;\n }\n break;\n case \"block\": {\n // Parametric instances have per-instance geometry — bake the\n // evaluated world children as plain entities. A NESTED instance (a\n // block drawing another block) bakes the same way, at its world\n // placement; one that would re-enter a definition being baked is a\n // cycle.\n if (ctx.blockChain.includes(obj.definitionId)) {\n skip(ctx, \"block\");\n return;\n }\n const children = getEvaluatedWorldChildren(\n obj,\n ctx.doc.blockDefinitions,\n documentObjectResolver(ctx.doc),\n ctx.doc,\n );\n if (children.length === 0) {\n skip(ctx, \"block\");\n return;\n }\n const before = ctx.exported;\n ctx.blockChain.push(obj.definitionId);\n try {\n for (const child of children) {\n if (child.type === \"viewport\") continue;\n writeObject(space, child, ctx);\n }\n } finally {\n ctx.blockChain.pop();\n }\n ctx.exported = before; // children count as one instance, not N entities\n break;\n }\n case \"table\": {\n // Native: an ACAD_TABLE (grid + cells) over a `*T` block of the drawn\n // table. Exploded (the option): baked like a block instance — the\n // rules as LINEs, each cell as its TEXT/MTEXT.\n if (!ctx.explodeTables) {\n writeNativeTable(space, obj, ctx);\n break;\n }\n const before = ctx.exported;\n for (const child of tableLayout(obj, ctx.doc.textStyles).children)\n writeObject(space, child, ctx);\n ctx.exported = before;\n break;\n }\n case \"viewport\":\n // Handled by the layout writer; a viewport in model space is invalid.\n skip(ctx, \"viewport\");\n return;\n case \"reference\": {\n // DXF/DWG links become real XREFs (an xref BLOCK carrying the path +\n // an INSERT with the placement), so CAD apps resolve the same file.\n // Other formats (.linea, PDF, images) have no DXF xref, and DXF can't\n // embed a file — skipped, as are switched-off references. ponytail: a clip isn't written\n // (XCLIP's SPATIAL_FILTER) — the xref arrives unclipped.\n if (\n obj.hidden ||\n (obj.format !== \"dxf\" && obj.format !== \"dwg\") ||\n obj.source.kind !== \"path\"\n ) {\n skip(ctx, \"reference\");\n return;\n }\n const path = obj.source.path;\n let blockName = ctx.xrefBlocks.get(path);\n if (!blockName) {\n blockName = `${sanitizeLayerName(obj.name)}${ctx.xrefBlocks.size > 0 ? `_${ctx.xrefBlocks.size}` : \"\"}`;\n const block = ctx.writer.addBlock(blockName);\n block.flags = XREF_BLOCK_FLAG as typeof block.flags;\n block.xrefPathName = path;\n ctx.xrefBlocks.set(path, blockName);\n }\n space.addInsert(blockName, v3(obj.position), {\n ...opts,\n scaleFactor: {\n x: obj.mirrored ? -obj.scale : obj.scale,\n y: obj.scale,\n z: obj.scale,\n },\n rotationAngle: (obj.rotation * 180) / Math.PI,\n });\n break;\n }\n case \"comment\":\n // Review annotation, not drawing content — no DXF mapping.\n skip(ctx, \"comment\");\n return;\n default:\n skip(ctx, (obj as ModelObject).type);\n return;\n }\n ctx.exported++;\n};\n\nconst skip = (ctx: ExportContext, type: string) =>\n ctx.skipped.set(type, (ctx.skipped.get(type) ?? 0) + 1);\n\nconst writeViewport = (\n space: DxfBlock,\n vp: Viewport,\n id: number,\n ctx: ExportContext,\n): void => {\n space.addEntity(\n new ViewportEntity({\n center: { x: vp.rect.x + vp.rect.w / 2, y: vp.rect.y + vp.rect.h / 2 },\n width: vp.rect.w,\n height: vp.rect.h,\n viewCenter: vp.modelCenter,\n // scale = the 1:N denominator (model mm per paper mm) → visible model\n // height.\n viewHeight: vp.rect.h * vp.scale,\n id,\n status: id,\n locked: vp.locked,\n frozenLayerHandles: vp.hiddenLayerIds\n .map((layerId) => ctx.layerRecords.get(layerId)?.handle)\n .filter((h): h is string => h !== undefined),\n }),\n );\n ctx.exported++;\n};\n\nexport interface DxfExportOptions {\n /**\n * Write leaders as plain geometry instead of MULTILEADER objects. Used by\n * the DWG path: acadrust's MULTILEADER DWG output is unproven in real\n * CADs (reported invisible) — exploded geometry always displays.\n */\n explodeLeaders?: boolean;\n /** Write tables as plain rules + texts instead of native ACAD_TABLE\n * entities. Used by the DWG path: acadrust's ACAD_TABLE DWG output\n * (from the legacy payload, no TABLECONTENT) makes AutoCAD ask for a\n * recover and hang in it — exploded geometry always opens. */\n explodeTables?: boolean;\n}\n\n/** The DXF the DWG transcode starts from: everything the transcoder's DWG\n * output can't be trusted with in AutoCAD goes out as plain geometry. One\n * constant for every DWG path (editor, SDK). */\nexport const DWG_DXF_OPTIONS: DxfExportOptions = {\n explodeLeaders: true,\n explodeTables: true,\n};\n\n/**\n * Document → DXF text. Pure and headless: `measure` supplies text-width\n * measurement (canvas-backed in the editor, font-metric in Node). The editor\n * wraps this with the store read + file download + toast.\n */\nexport const buildDxf = (\n doc: LineaDocument,\n measure: TextMeasurer,\n options: DxfExportOptions = {},\n): DxfExportResult => {\n const writer = new DxfWriter();\n writer.setUnits(Units.Millimeters);\n\n // Linetype table (Continuous/ByLayer/ByBlock are predefined by the writer).\n // Emit the whole dashed catalogue — hidden scale variants included — so any\n // referenced LTYPE is defined; the signed dash sequence IS the DXF element\n // form (>0 dash, <0 gap, 0 dot).\n const emittedLtypes = new Set<string>();\n // The document's own line types first (they shadow catalogue names).\n for (const t of doc.lineTypes) {\n if (t.dashesMm.length === 0) continue;\n const dxfName = t.name.toUpperCase();\n if (emittedLtypes.has(dxfName)) continue;\n emittedLtypes.add(dxfName);\n const descriptive = (t.description ?? t.name)\n .replace(/[^\\x20-\\x7e]/g, \"\")\n .slice(0, 47);\n writer.addLType(dxfName, descriptive, t.dashesMm);\n }\n for (const p of LINE_TYPE_DEFS) {\n if (p.dashesMm.length === 0) continue;\n const dxfName = p.dxfName ?? p.name.toUpperCase();\n if (emittedLtypes.has(dxfName)) continue;\n emittedLtypes.add(dxfName);\n const descriptive = p.label.replace(/[^\\x20-\\x7e]/g, \"\").slice(0, 47);\n writer.addLType(dxfName, descriptive, p.dashesMm);\n }\n\n // Layers (nearest ACI + exact true color; visibility/locking as flags).\n const layerNames = new Map<string, string>();\n const layerRecords = new Map<string, DxfLayer>();\n // DXF layer names are unique case-insensitively; two Linea layers can\n // collide after sanitizing (\"A/B\" and \"A_B\") or in older documents that\n // already had duplicates — suffix the later ones instead of writing two\n // LAYER records with one name. \"0\" stays the shared default layer.\n const taken = new Set<string>([\"0\"]);\n for (const layer of doc.layers) {\n let name = sanitizeLayerName(layer.name);\n if (name !== \"0\") {\n const base = name;\n for (let i = 2; taken.has(name.toUpperCase()); i++) name = `${base}_${i}`;\n taken.add(name.toUpperCase());\n }\n layerNames.set(layer.id, name);\n if (name === \"0\") {\n const zero = writer.layer(\"0\");\n if (zero) {\n setLineWeight(zero, mmToLineWeight(layer.lineWidth));\n layerRecords.set(layer.id, zero);\n }\n continue;\n }\n const flags =\n (layer.visible ? 0 : LayerFlags.Frozen) |\n (layer.locked ? LayerFlags.Locked : 0);\n const record = writer.addLayer(\n name,\n nearestAci(layer.color),\n dxfLineTypeName(layer.lineType, doc.lineTypes) ?? \"Continuous\",\n flags || undefined,\n );\n const tc = hexToTrueColor(layer.color);\n if (tc !== null) record.trueColor = tc;\n setLineWeight(record, mmToLineWeight(layer.lineWidth));\n layerRecords.set(layer.id, record);\n }\n\n // MULTILEADER plumbing: leaders export as MULTILEADER, which references\n // an MLEADERSTYLE through the ACAD_MLEADERSTYLE dictionary.\n const textStyleHandle =\n writer.document.tables.styleTable.records.find((r) => r.name === \"Standard\")\n ?.handle ?? \"0\";\n const lineTypeHandle =\n writer.document.tables.ltypeTable.records.find((r) => r.name === \"ByBlock\")\n ?.handle ?? \"0\";\n const mleaderDict = writer.document.objects.addDictionary();\n writer.document.objects.addEntryToRoot(\n \"ACAD_MLEADERSTYLE\",\n mleaderDict.handle,\n );\n const mleaderStyle = writer.document.objects.addObject(\n new MLeaderStyleObject({\n name: \"Standard\",\n textStyleHandle,\n arrowSize: doc.dimStyles[0].arrowSize,\n textHeight: doc.dimStyles[0].textHeight,\n dictionaryHandle: mleaderDict.handle,\n }),\n );\n mleaderStyle.ownerObjecthandle = mleaderDict.handle;\n mleaderDict.addEntryObject(\"Standard\", mleaderStyle.handle);\n\n // ACAD_TABLE plumbing: tables reference a TABLESTYLE through the\n // ACAD_TABLESTYLE dictionary (their cells carry their own formatting).\n const tableStyleDict = writer.document.objects.addDictionary();\n writer.document.objects.addEntryToRoot(\n \"ACAD_TABLESTYLE\",\n tableStyleDict.handle,\n );\n const tableStyle = writer.document.objects.addObject(\n new TableStyleObject({\n name: \"Standard\",\n textStyleName: \"Standard\",\n textHeight: doc.textStyles[0]?.textHeight ?? 2.5,\n margin: 1.5,\n dictionaryHandle: tableStyleDict.handle,\n }),\n );\n tableStyle.ownerObjecthandle = tableStyleDict.handle;\n tableStyleDict.addEntryObject(\"Standard\", tableStyle.handle);\n\n const ctx: ExportContext = {\n doc,\n measure,\n writer,\n layerNames,\n layerRecords,\n skipped: new Map(),\n exported: 0,\n dimBlockCount: 0,\n xrefBlocks: new Map(),\n blockChain: [],\n explodeLeaders: options.explodeLeaders ?? false,\n explodeTables: options.explodeTables ?? false,\n tableStyleHandle: tableStyle.handle,\n tableBlockCount: 0,\n mleaderStyleHandle: mleaderStyle.handle,\n textStyleHandle,\n lineTypeHandle,\n textStyles: new Map(),\n styleNames: new Set(),\n dimStyleRecords: new Map(),\n dimStyleNames: new Set(),\n dimStyles: new Map(),\n dimOverrideCounts: new Map(),\n hatchOrigins: new Map(),\n };\n\n // The document's named text and dimension styles, as their own records.\n createDocTextStyles(ctx);\n createDocDimStyles(ctx);\n\n // Model space.\n for (const obj of doc.objects)\n writeObject(writer.document.blocks.modelSpace, obj, ctx);\n\n // Paper layouts: the first uses the predefined *Paper_Space block, the\n // rest get their own; each gets a LAYOUT object so tabs survive.\n const layoutRecords: {\n name: string;\n blockRecordHandle: string;\n width: number;\n height: number;\n }[] = [];\n doc.layouts.forEach((layout, i) => {\n const space =\n i === 0 ? writer.document.blocks.paperSpace : writer.addPaperSpace();\n const record = writer.document.tables.blockRecordTable.records.find(\n (r) => r.name === space.name,\n );\n\n // The layout's own paper view is viewport id 1; real ones follow.\n writeViewport(\n space,\n {\n type: \"viewport\",\n id: \"paper\",\n layerId: \"\",\n rect: { x: 0, y: 0, w: layout.sheet.width, h: layout.sheet.height },\n modelCenter: { x: 0, y: 0 },\n scale: 1,\n locked: false,\n hiddenLayerIds: [],\n },\n 1,\n ctx,\n );\n ctx.exported--; // the paper view is bookkeeping, not user content\n\n let viewportId = 2;\n for (const obj of layout.objects) {\n if (obj.type === \"viewport\") writeViewport(space, obj, viewportId++, ctx);\n else writeObject(space, obj, ctx);\n }\n\n if (record) {\n layoutRecords.push({\n name: layout.name,\n blockRecordHandle: record.handle,\n width: layout.sheet.width,\n height: layout.sheet.height,\n });\n }\n });\n\n // LAYOUT objects (+ the mandatory Model entry) in an ACAD_LAYOUT dictionary.\n const objects = writer.document.objects;\n const layoutDict = objects.addDictionary();\n objects.addEntryToRoot(\"ACAD_LAYOUT\", layoutDict.handle);\n const modelRecord = writer.document.tables.blockRecordTable.records.find(\n (r) => r.name === \"*Model_Space\",\n );\n const entries = [\n {\n name: \"Model\",\n tabOrder: 0,\n width: 210,\n height: 297,\n blockRecordHandle: modelRecord?.handle ?? \"0\",\n },\n ...layoutRecords.map((l, i) => ({ ...l, tabOrder: i + 1 })),\n ];\n for (const entry of entries) {\n const layoutObj = objects.addObject(\n new LayoutObject({\n name: entry.name,\n tabOrder: entry.tabOrder,\n paperWidth: entry.width,\n paperHeight: entry.height,\n blockRecordHandle: entry.blockRecordHandle,\n }),\n );\n layoutObj.ownerObjecthandle = layoutDict.handle;\n layoutDict.addEntryObject(entry.name, layoutObj.handle);\n // Back-pointer: BLOCK_RECORD → its LAYOUT (group 340).\n const record = writer.document.tables.blockRecordTable.records.find(\n (r) => r.handle === entry.blockRecordHandle,\n );\n if (record) record.layoutObject = layoutObj.handle;\n }\n\n const content = injectHatchPatternLines(\n injectStyleTypefaces(writer.stringify(), ctx.textStyles),\n ctx,\n );\n return {\n // The writer's CLASSES section is always empty: declare the non-fixed\n // types this file uses (AutoCAD expects them declared).\n content: content.replace(\n \"\\n0\\nSECTION\\n2\\nCLASSES\\n0\\nENDSEC\\n\",\n `\\n0\\nSECTION\\n2\\nCLASSES\\n${classesSection(content)}0\\nENDSEC\\n`,\n ),\n exported: ctx.exported,\n skipped: ctx.skipped,\n };\n};\n\n/**\n * STYLE records carry the font as a FILE name (group 3), but CAD apps\n * resolve installed TrueType fonts by FAMILY through the standard ACAD\n * xdata (1001 \"ACAD\" / 1000 typeface / 1071 flags) — the same convention\n * AutoCAD writes. Without it, a receiver warns about every style whose\n * literal file name it cannot find, even with the font family installed.\n * The writer library has no xdata on table records, so the groups are\n * spliced into the emitted text at the end of each of our STYLE records.\n */\nconst injectStyleTypefaces = (\n content: string,\n textStyles: Map<string, StyleRecord>,\n): string => {\n let out = content;\n for (const rec of textStyles.values()) {\n const fontId = rec.face;\n const { font: bare } = parseFontFace(fontId);\n const def = resolveFont(fontId);\n const typeface =\n bare !== undefined && bare !== def.id ? bare : fontTypeface(def);\n // AutoCAD's packed font flags: italic 0x1000000, bold 0x2000000.\n const { bold, italic } = parseFontFace(fontId);\n const flags = (italic ? 0x1000000 : 0) | (bold ? 0x2000000 : 0);\n // Subclass marker anchors the search to a STYLE record (a user layer\n // could share the name).\n const marker = `\\nAcDbTextStyleTableRecord\\n2\\n${rec.name}\\n`;\n const at = out.indexOf(marker);\n if (at === -1) continue;\n // xdata must close the record — the record runs to the next STYLE or\n // the table's ENDTAB (a bare \"\\n0\\n\" also matches group-70 VALUES).\n const from = at + marker.length;\n const recordEnd = Math.min(\n ...[\"\\n0\\nSTYLE\", \"\\n0\\nENDTAB\"]\n .map((m) => out.indexOf(m, from))\n .filter((i) => i !== -1),\n );\n if (!Number.isFinite(recordEnd)) continue;\n out =\n out.slice(0, recordEnd) +\n `\\n1001\\nACAD\\n1000\\n${typeface}\\n1071\\n${flags}` +\n out.slice(recordEnd);\n }\n return out;\n};\n","import { z } from \"zod\";\nimport {\n ColorSchema,\n ObjectBaseSchema,\n Vec2Schema,\n type ObjectBase,\n} from \"./common\";\nimport { fontFace } from \"./fonts\";\nimport { inputPoints, StoredInputsSchema } from \"./blockInputs\";\n\n// Geometry is deliberately DXF-shaped so export/import stays a direct mapping.\n\n/**\n * DXF POINT. Paints as a round dot whose DIAMETER is the resolved lineWidth\n * (byLayer or override) — realized like a lineweight, so it stays paper-mm\n * through viewport transforms and clamps like a hairline on screen.\n */\nexport const PointSchema = ObjectBaseSchema.extend({\n type: z.literal(\"point\"),\n p: Vec2Schema,\n});\nexport type Point = z.infer<typeof PointSchema>;\n\nexport const LineSchema = ObjectBaseSchema.extend({\n type: z.literal(\"line\"),\n a: Vec2Schema,\n b: Vec2Schema,\n});\nexport type Line = z.infer<typeof LineSchema>;\n\n/**\n * bulge = tan(sweep/4); 0 = straight segment, >0 CCW arc to the next vertex\n * (DXF LWPOLYLINE). Accepts [x, y, bulge?] as input (block scripts).\n */\nexport const PolylineVertexSchema = z.preprocess(\n (v) =>\n Array.isArray(v) && v.length >= 2\n ? { x: v[0], y: v[1], bulge: v[2] ?? 0 }\n : v,\n z.object({ x: z.number(), y: z.number(), bulge: z.number().default(0) }),\n);\nexport type PolylineVertex = z.infer<typeof PolylineVertexSchema>;\n\n// Note: there is no separate rectangle object — the Rectangle tool emits a\n// closed 4-vertex polyline (same as AutoCAD RECTANG).\nexport const PolylineSchema = ObjectBaseSchema.extend({\n type: z.literal(\"polyline\"),\n points: z.array(PolylineVertexSchema).min(2),\n closed: z.boolean().default(false),\n});\nexport type Polyline = z.infer<typeof PolylineSchema>;\n\nexport const CircleSchema = ObjectBaseSchema.extend({\n type: z.literal(\"circle\"),\n center: Vec2Schema,\n radius: z.number().positive(),\n});\nexport type Circle = z.infer<typeof CircleSchema>;\n\n/** Runs CCW from startAngle to endAngle (DXF ARC convention). */\nexport const ArcSchema = ObjectBaseSchema.extend({\n type: z.literal(\"arc\"),\n center: Vec2Schema,\n radius: z.number().positive(),\n startAngle: z.number(),\n endAngle: z.number(),\n});\nexport type Arc = z.infer<typeof ArcSchema>;\n\n/** DXF ELLIPSE form: majorAxis is the endpoint vector from center; ratio = minor/major in (0,1]. */\nexport const EllipseSchema = ObjectBaseSchema.extend({\n type: z.literal(\"ellipse\"),\n center: Vec2Schema,\n majorAxis: Vec2Schema,\n ratio: z.number().gt(0).max(1),\n startAngle: z.number().default(0),\n endAngle: z.number().default(Math.PI * 2),\n});\nexport type Ellipse = z.infer<typeof EllipseSchema>;\n\nexport const HatchLoopSchema = z.object({\n points: z.array(PolylineVertexSchema).min(3),\n});\nexport type HatchLoop = z.infer<typeof HatchLoopSchema>;\n\nexport const HatchFillSchema = z.discriminatedUnion(\"kind\", [\n z.object({ kind: z.literal(\"solid\") }),\n z.object({\n kind: z.literal(\"pattern\"),\n name: z.string(),\n angle: z.number(),\n scale: z.number().positive(),\n /** Where the pattern frame is anchored, world mm (absent = the drawing\n * origin, like a hatch drawn here). Set by import for hatches that came\n * out of blocks — AutoCAD anchors a block's hatch to the block, so the\n * pattern phase follows the insertion — and carried by the transforms. */\n origin: Vec2Schema.optional(),\n }),\n z.object({\n kind: z.literal(\"lines\"),\n angle: z.number(),\n spacing: z.number().positive(),\n }),\n z.object({\n kind: z.literal(\"gradient\"),\n /** linear = color1→color2 along `angle`; radial = color1 at the\n * boundary's center fading to color2 at its edge. */\n shape: z.enum([\"linear\", \"radial\"]).default(\"linear\"),\n color1: z.string().default(\"#808080\"),\n color2: z.string().default(\"#2d2d2d\"),\n /** Direction, radians CCW: 0 = color1 on the left (linear only). */\n angle: z.number().default(0),\n }),\n]);\n\n/** Owns copied boundary geometry (non-associative). loops[0] outer, rest holes (even-odd). */\nexport const HatchSchema = ObjectBaseSchema.extend({\n type: z.literal(\"hatch\"),\n loops: z.array(HatchLoopSchema).min(1),\n fill: HatchFillSchema.default({\n kind: \"lines\",\n angle: Math.PI / 4,\n spacing: 5,\n }),\n /** Pattern spacing multiplier (same idea as DimStyle.scale). */\n scale: z.number().positive().default(1),\n});\nexport type Hatch = z.infer<typeof HatchSchema>;\n\n/** Arrowhead style (maps to the standard DXF DIMBLK arrowhead blocks). */\nconst ArrowTypeSchema = z.enum([\"filled\", \"open\", \"tick\", \"dot\", \"none\"]);\nexport type ArrowType = z.infer<typeof ArrowTypeSchema>;\n\n/**\n * A named document text style: everything a TEXT object inherits unless its\n * own `styleOverride` sets a key (same model as DimStyle for dimensions).\n * Documents carry an ARRAY of these; objects reference one by `styleId`\n * (absent/dangling = the first style). Font names are stored, never font\n * data — unknown names render in the default and round-trip.\n */\nexport const TextStyleSchema = z.object({\n id: z.string().default(() => crypto.randomUUID()),\n name: z.string().default(\"Standard\"),\n /** Font id (model/fonts.ts). */\n font: z.string().default(\"arial\"),\n /** AutoCAD-style width factor: horizontal glyph scale. */\n widthFactor: z.number().positive().default(1),\n /** Bold / italic face (bundled outlines where the font has them, else\n * synthesized — model/fonts.ts `fontFace`). Absent = regular. */\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n /** Cap height in mm (world), before the object's `scale`. */\n textHeight: z.number().positive().default(2.5),\n /** Leader arrowhead style. */\n arrowType: ArrowTypeSchema.default(\"filled\"),\n /** Leader arrowhead size (mm), before the object's `scale`. */\n arrowSize: z.number().positive().default(2.5),\n});\nexport type TextStyle = z.infer<typeof TextStyleSchema>;\n\n/** The historic hard-coded fallbacks — documents that predate the field\n * default to this and render identically. */\nexport const DEFAULT_TEXT_STYLE: TextStyle = {\n id: \"standard\",\n name: \"Standard\",\n font: \"arial\",\n widthFactor: 1,\n textHeight: 2.5,\n arrowType: \"filled\",\n arrowSize: 2.5,\n};\n\n/**\n * Per-text style override: keys the user actually set, nothing else (same\n * discipline as DimStyleOverrideSchema — NOT .partial(), which would bake\n * defaults in and freeze the object against document-style edits).\n * Keep in sync with TextStyleSchema.\n */\nexport const TextStyleOverrideSchema = z.object({\n font: z.string().optional(),\n widthFactor: z.number().positive().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().optional(),\n arrowType: ArrowTypeSchema.optional(),\n arrowSize: z.number().positive().optional(),\n});\n\n/** The text style an object references: by `styleId`, else the document's\n * first (absent/dangling ids degrade gracefully). */\nexport const textStyleFor = (\n obj: Pick<Text, \"styleId\">,\n styles: readonly TextStyle[],\n): TextStyle =>\n styles.find((s) => s.id === obj.styleId) ?? styles[0] ?? DEFAULT_TEXT_STYLE;\n\n/** Referenced document style + the text's overrides. */\nexport const resolveTextStyle = (\n obj: Pick<Text, \"styleId\" | \"styleOverride\">,\n styles: readonly TextStyle[],\n): TextStyle => ({ ...textStyleFor(obj, styles), ...obj.styleOverride });\n\n/** A text's effective font FACE (font id + bold/italic, as one face string\n * — model/fonts.ts) and widthFactor (override, else its style's). */\nexport const effectiveTextFont = (\n obj: Pick<Text, \"styleId\" | \"styleOverride\">,\n styles: readonly TextStyle[],\n): { font: string; widthFactor: number } => {\n const base = textStyleFor(obj, styles);\n const o = obj.styleOverride;\n return {\n font: fontFace(\n o?.font ?? base.font,\n o?.bold ?? base.bold,\n o?.italic ?? base.italic,\n )!,\n widthFactor: o?.widthFactor ?? base.widthFactor,\n };\n};\n\n/**\n * Character formatting over a range of a text's `content` (docs/rich-text.md\n * §4). Offsets are JS string indices, end exclusive. Absent attributes\n * inherit the text's resolved style; `height` is a ratio of its cap height.\n * Stored normalized (richText.ts `normalizeSpans`): sorted, non-overlapping,\n * non-empty, adjacent equal spans merged.\n */\nexport const TextSpanSchema = z.object({\n start: z.number().int().min(0),\n end: z.number().int().min(0),\n /** Font id (model/fonts.ts). */\n font: z.string().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: z.boolean().optional(),\n /** Literal colour; absent = the text's own (possibly ByLayer) colour. */\n color: ColorSchema.optional(),\n /** × the text's cap height. */\n height: z.number().positive().optional(),\n script: z.enum([\"sub\", \"super\"]).optional(),\n});\nexport type TextSpan = z.infer<typeof TextSpanSchema>;\n\n/**\n * Text, optionally annotated with leader lines (MLEADER-style — the old\n * standalone \"leader\" type merged in at document v6). Each leader line is a\n * polyline with its arrowhead at [0]; by convention lines join at the first\n * line's last point (the junction), near the text.\n */\nexport const TextSchema = ObjectBaseSchema.extend({\n type: z.literal(\"text\"),\n position: Vec2Schema,\n content: z.string(),\n /** Character formatting over `content`; absent = all plain. Replacing\n * `content` without new spans drops them (offsets would be stale). */\n spans: z.array(TextSpanSchema).optional(),\n /** Arrow polylines pointing at this text (arrowhead at [0]). */\n leaderLines: z.array(z.array(Vec2Schema).min(2)).default([]),\n /**\n * Max text box width in mm (before `scale`) — the word-wrap boundary and the\n * frame width. Undefined = no wrapping (lines break only on explicit\n * newlines). Maps to the DXF MTEXT reference rectangle width.\n */\n width: z.number().positive().optional(),\n hAlign: z.enum([\"left\", \"center\", \"right\"]).default(\"center\"),\n vAlign: z.enum([\"bottom\", \"center\", \"top\"]).default(\"center\"),\n /** Border drawn around the text: a rectangle, a circle, a slot (rounded\n * ends), a line under the text or under its first line. */\n frame: z\n .enum([\"none\", \"rectangle\", \"circle\", \"slot\", \"bottom\", \"firstLine\"])\n .optional(),\n /** The document text style this text follows (absent/dangling = the\n * document's first style). */\n styleId: z.string().optional(),\n /** Style keys the user set on THIS text (font, height, arrows, …);\n * absent = inherit the referenced style. */\n styleOverride: TextStyleOverrideSchema.optional(),\n rotation: z.number().default(0),\n /** Size multiplier for height + arrow size (same idea as\n * Dimension.scale). */\n scale: z.number().positive().default(1),\n});\nexport type Text = z.infer<typeof TextSchema>;\n\nexport const DimensionKindSchema = z.enum([\n \"linear\",\n \"angular\",\n \"radial\",\n \"diameter\",\n]);\n\n/** A named document dimension style; documents carry an ARRAY of these and\n * dimensions reference one by `styleId` (absent/dangling = the first). */\nexport const DimStyleSchema = z.object({\n id: z.string().default(() => crypto.randomUUID()),\n name: z.string().default(\"Standard\"),\n /** Font id for dimension text (model/fonts.ts). */\n font: z.string().default(\"arial\"),\n /** Horizontal glyph scale for dimension text. */\n widthFactor: z.number().positive().default(1),\n /** Bold / italic dimension text (same faces as TextStyle). */\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().default(2.5),\n /** Dimension line → text center distance (mm, × scale; DXF DIMGAP-ish). */\n textOffset: z.number().default(1.8),\n arrowType: ArrowTypeSchema.default(\"tick\"),\n arrowSize: z.number().positive().default(2.5),\n /** \"long\" runs each extension line from the measured point to the\n * dimension line; \"short\" draws only a 2×overshoot tick across it. */\n extensionType: z.enum([\"long\", \"short\"]).default(\"long\"),\n extensionOffset: z.number().default(1),\n extensionOvershoot: z.number().default(1.25),\n /** Decimal places for the measurement text. */\n precision: z.number().int().min(0).max(6).default(1),\n});\nexport type DimStyle = z.infer<typeof DimStyleSchema>;\n\nexport const DEFAULT_DIM_STYLE: DimStyle = {\n id: \"standard\",\n name: \"Standard\",\n font: \"arial\",\n widthFactor: 1,\n textHeight: 2.5,\n textOffset: 1.8,\n arrowType: \"tick\",\n arrowSize: 2.5,\n extensionType: \"long\",\n extensionOffset: 1,\n extensionOvershoot: 1,\n precision: 1,\n};\n\n/**\n * Per-object style override: keys the user actually set, nothing else.\n * NOT DimStyleSchema.partial() — zod's partial() still applies field\n * defaults, which would bake EVERY style value into the override and freeze\n * the object against document-style edits. Keep in sync with DimStyleSchema.\n */\n// Deliberately LENIENT (unknown keys strip, zod default): a strict schema\n// would refuse to open documents saved by a newer Linea whose override\n// gained a key — forward compatibility wins at the document boundary. The\n// classic agent mistake (`styleOverride: { scale }` — annotation scale is\n// the object's top-level `scale` field) is caught loudly at the SDK/tool\n// mutation boundary instead, via unknownStyleOverrideKeys below.\nexport const DimStyleOverrideSchema = z.object({\n font: z.string().optional(),\n widthFactor: z.number().positive().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().optional(),\n textOffset: z.number().optional(),\n arrowType: ArrowTypeSchema.optional(),\n arrowSize: z.number().positive().optional(),\n extensionType: z.enum([\"long\", \"short\"]).optional(),\n extensionOffset: z.number().optional(),\n extensionOvershoot: z.number().optional(),\n precision: z.number().int().min(0).max(6).optional(),\n});\n\n/**\n * Unknown keys in a raw object INPUT's `styleOverride` — the SDK and agent\n * tools call this before parsing so a wrong key (the classic\n * `styleOverride: { scale }`; annotation scale is the object's TOP-LEVEL\n * `scale` field) errors loudly instead of being silently stripped by the\n * deliberately lenient schema.\n */\nexport const unknownStyleOverrideKeys = (\n input: Record<string, unknown>,\n): string[] => {\n const so = input.styleOverride;\n if (so === null || typeof so !== \"object\" || Array.isArray(so)) return [];\n const shape =\n input.type === \"dimension\"\n ? DimStyleOverrideSchema.shape\n : input.type === \"text\"\n ? TextStyleOverrideSchema.shape\n : null;\n if (!shape) return [];\n return Object.keys(so).filter((k) => !(k in shape));\n};\n\n/** Throwing form of unknownStyleOverrideKeys for mutation boundaries (the\n * SDK and the editor's agent tools). `where` prefixes the error. */\nexport const assertKnownStyleOverrideKeys = (\n input: Record<string, unknown>,\n where: string,\n): void => {\n const unknown = unknownStyleOverrideKeys(input);\n if (unknown.length === 0) return;\n const hint = unknown.includes(\"scale\")\n ? ' — annotation scale is the TOP-LEVEL \"scale\" field (scale: 50 for 1:50), not a style key'\n : \"\";\n throw new Error(\n `${where}: styleOverride: unknown key(s) ${unknown\n .map((k) => `\"${k}\"`)\n .join(\", \")}${hint}`,\n );\n};\n\n/** The dim style a dimension references: by `styleId`, else the document's\n * first (absent/dangling ids degrade gracefully). */\nexport const dimStyleFor = (\n obj: { styleId?: string },\n styles: readonly DimStyle[],\n): DimStyle =>\n styles.find((s) => s.id === obj.styleId) ?? styles[0] ?? DEFAULT_DIM_STYLE;\n\n/** A (resolved) dim style's text font FACE — font id + bold/italic as one\n * face string (model/fonts.ts), like effectiveTextFont for texts. */\nexport const dimFontFace = (\n style: Pick<DimStyle, \"font\" | \"bold\" | \"italic\">,\n): string => fontFace(style.font, style.bold, style.italic)!;\n\n/** The token in a label's `content` that stands for the measurement. */\nexport const DIM_VALUE_TOKEN = \"{value}\";\n\n/**\n * One measured segment's label: where its text sits and what it says\n * (docs/dimension-labels.md). All fields optional — an empty object, or a\n * missing entry, means fully automatic.\n */\nexport const DimLabelSchema = z.object({\n /** mm along the dimension line from the segment's origin (linear: the\n * foot of the segment's first point; angular: where ray a meets the arc,\n * as arc length; radial/diameter: the center). Undefined = automatic\n * placement: centered when the text fits, else outside. */\n along: z.number().optional(),\n /** mm perpendicular to the dimension line, positive on the side the\n * dimension line is on (linear/angular) or to the left of `along`\n * (radial/diameter). Undefined or 0 = on the line; otherwise the text\n * floats, with a leader when it no longer overlaps its segment. */\n across: z.number().optional(),\n /** Text; `{value}` is replaced by the formatted measurement. Undefined =\n * the kind's default template (\"{value}\", \"{value}°\", \"R{value}\",\n * \"Ø{value}\"). */\n content: z.string().optional(),\n /** Character formatting over `content` (the TEMPLATE: a span covering\n * `{value}` formats the measurement). Needs `content` set. */\n spans: z.array(TextSpanSchema).optional(),\n});\nexport type DimLabel = z.infer<typeof DimLabelSchema>;\n\n/** Static (non-associative) definition points; placement as scalars and\n * per-segment labels — docs/dimension-labels.md. The plain shape; the\n * per-kind rules live in `dimensionRefinement` (zod can't `.omit()` a\n * refined object, and the block DTOs omit the base fields), and\n * `DimensionSchema` is the two combined. */\nexport const DimensionShapeSchema = ObjectBaseSchema.extend({\n type: z.literal(\"dimension\"),\n kind: DimensionKindSchema.default(\"linear\"),\n /**\n * Measured points. linear: 2+ (more than two render as a CHAIN — one\n * measurement per consecutive pair sharing the dimension line);\n * angular: [vertex, a, b]; radial: [center, curve point]; diameter:\n * [p1, p2] opposite on the curve.\n */\n points: z.array(Vec2Schema).min(2),\n /**\n * linear only: the measuring direction, radians CCW from +X (DXF's\n * \"rotated\" dimension, code 50). Undefined = aligned to\n * points[0] → points[last] (DXF \"aligned\"), so dragging a point turns the\n * dimension; set, the direction is locked and a point drag only changes\n * the measurement.\n */\n rotation: z.number().optional(),\n /**\n * linear: signed distance of the dimension line from points[0] along the\n * LEFT perpendicular of the measuring direction. angular: the arc radius,\n * positive for the arc running CCW from a to b, negative for the\n * complementary arc. radial/diameter: absent — the line's direction comes\n * from the points and the text position is labels[0].along.\n */\n offset: z.number().optional(),\n /** One label per measured segment (linear chain: points.length − 1,\n * every other kind: 1). Missing or short = automatic. */\n labels: z.array(DimLabelSchema).default([]),\n /** The document dimension style this dimension follows (absent/dangling =\n * the document's first style). */\n styleId: z.string().optional(),\n styleOverride: DimStyleOverrideSchema.optional(),\n /** Annotation size multiplier (text/arrows/offsets — same idea as\n * Text.scale; rides as DIMSCALE in DXF). */\n scale: z.number().positive().default(1),\n});\n\n/** Per-kind rules: point count, `offset` only (and always) on linear /\n * angular, `rotation` only on linear. */\nexport const dimensionRefinement = (\n d: Pick<\n z.infer<typeof DimensionShapeSchema>,\n \"kind\" | \"points\" | \"offset\" | \"rotation\"\n >,\n ctx: z.RefinementCtx,\n): void => {\n const need = d.kind === \"angular\" ? 3 : 2;\n if (d.points.length < need)\n ctx.addIssue({\n code: \"custom\",\n path: [\"points\"],\n message: `a ${d.kind} dimension needs at least ${need} points`,\n });\n if (d.kind !== \"linear\" && d.kind !== \"angular\") {\n if (d.offset !== undefined)\n ctx.addIssue({\n code: \"custom\",\n path: [\"offset\"],\n message: `offset does not apply to a ${d.kind} dimension (the text position is labels[0].along)`,\n });\n } else if (d.offset === undefined)\n ctx.addIssue({\n code: \"custom\",\n path: [\"offset\"],\n message: `a ${d.kind} dimension needs offset`,\n });\n if (d.kind !== \"linear\" && d.rotation !== undefined)\n ctx.addIssue({\n code: \"custom\",\n path: [\"rotation\"],\n message: \"rotation applies to linear dimensions only\",\n });\n};\n\nexport const DimensionSchema =\n DimensionShapeSchema.superRefine(dimensionRefinement);\nexport type Dimension = z.infer<typeof DimensionSchema>;\n\n/** The label `content` a kind shows when none is set. */\nexport const DIM_DEFAULT_CONTENT: Record<Dimension[\"kind\"], string> = {\n linear: DIM_VALUE_TOKEN,\n angular: `${DIM_VALUE_TOKEN}°`,\n radial: `R${DIM_VALUE_TOKEN}`,\n diameter: `Ø${DIM_VALUE_TOKEN}`,\n};\n\nexport const BlockSchema = ObjectBaseSchema.extend({\n type: z.literal(\"block\"),\n definitionId: z.string(),\n /** Applied LAST, about the pivot (the first point input). */\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n /** Per-instance parameter values (merged over the definition defaults). */\n params: z\n .record(\n z.string(),\n z.union([\n z.number(),\n z.string(),\n z.boolean(),\n // numberList / stringList parameters.\n z.array(z.number()),\n z.array(z.string()),\n // `data` parameters: any JSON value.\n z.json(),\n ]),\n )\n .default({}),\n /**\n * The values the script's `place` acquired at insertion, in pick\n * order: points in WORLD coords, or referenced object ids (strings —\n * phase 2). The first point is the instance's PIVOT — it plays the role\n * of the insertion point: `draw` receives inputs localized against it,\n * rotation/scale apply about it, and it snaps as an endpoint.\n * Transforms map the points and the script recomputes, which is what\n * makes mirror correct for script-derived geometry.\n */\n inputs: StoredInputsSchema.default([]),\n});\nexport type Block = z.infer<typeof BlockSchema>;\n\n/**\n * Review note pinned to a point. Pure editor chrome: the EDITOR paints it as\n * a screen-fixed speech-bubble marker (lucide MessageCircle outline, tail tip\n * at `position`) and hit-tests it in screen scale — there is no shared-path\n * painter, so comments never reach PDF/SVG/PNG exports or viewport\n * projections, and DXF export skips them explicitly.\n */\nexport const CommentSchema = ObjectBaseSchema.extend({\n type: z.literal(\"comment\"),\n /** Tail tip of the bubble (world/sheet mm). */\n position: Vec2Schema,\n text: z.string().default(\"\"),\n tags: z.array(z.string()).default([]),\n});\nexport type Comment = z.infer<typeof CommentSchema>;\n\n/** A raw cell as written: a bare string is its content, and the pre-v22\n * `text` key (old files, block scripts, agents) reads as `content`. */\nconst cellInput = (v: unknown): unknown => {\n if (typeof v === \"string\") return { content: v };\n if (v && typeof v === \"object\" && \"text\" in v && !(\"content\" in v)) {\n const { text, ...rest } = v as Record<string, unknown>;\n return { ...rest, content: text };\n }\n return v;\n};\n\n/** One table cell (docs/table-object.md). Style keys absent = the table's,\n * then the document text style. */\nexport const TableCellSchema = z.object({\n /** Plain text; \"\\n\" = line break. Long lines wrap at the cell width.\n * (Named `text` before document v22 — still read, see `cellInput`.) */\n content: z.string().default(\"\"),\n /** Character formatting over `content` (core/table.ts `cellWithContent`\n * keeps it consistent when the content changes). */\n spans: z.array(TextSpanSchema).optional(),\n /** Merge, set on the ANCHOR (top-left) cell. Covered cells stay in the\n * grid with their content ignored — AutoCAD's model. */\n span: z\n .object({\n cols: z.number().int().min(1),\n rows: z.number().int().min(1),\n })\n .optional(),\n /** Where the text sits in the cell; absent = left / center. */\n hAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n vAlign: z.enum([\"top\", \"center\", \"bottom\"]).optional(),\n styleId: z.string().optional(),\n styleOverride: TextStyleOverrideSchema.optional(),\n /** Text color; absent = the table's. */\n color: ColorSchema.optional(),\n});\nexport type TableCell = z.infer<typeof TableCellSchema>;\n\n/**\n * A table: a grid of text cells hanging right/down from `position` (the\n * top-left corner). Sizes are sheet mm before `scale`, like text. Rows grow\n * to fit their wrapped text (`minHeight` is the floor); the derived geometry\n * — rules + one text per cell, in world space — comes from paint/tableLayout\n * and feeds every consumer (painter, snapping, DXF).\n */\n/** The table's fields without the grid refinement — block children reuse\n * it (zod cannot `.omit()` a refined object; same split as dimensions). */\nexport const TableShapeSchema = ObjectBaseSchema.extend({\n type: z.literal(\"table\"),\n position: Vec2Schema,\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n /** Column widths (mm). */\n columns: z.array(z.number().positive()).min(1),\n /** Per-row settings. Input may give a row COUNT (all auto-height). */\n rows: z.preprocess(\n (v) => (typeof v === \"number\" ? Array.from({ length: v }, () => ({})) : v),\n z.array(z.object({ minHeight: z.number().positive().optional() })).min(1),\n ),\n /** Row-major: `cells[row][column]`, exactly rows × columns. Input may\n * give a cell as a plain string (= `{ text }`). */\n cells: z.array(\n z.array(\n z.preprocess(cellInput, TableCellSchema),\n ),\n ),\n /** Rows above the heavier header rule. */\n headerRows: z.number().int().min(0).default(0),\n /** Text inset from the cell edges (mm). */\n cellMargin: z.number().min(0).default(1),\n borders: z.enum([\"all\", \"outer\", \"rows\", \"none\"]).default(\"all\"),\n /** Document text style for every cell (cells may override). */\n styleId: z.string().optional(),\n styleOverride: TextStyleOverrideSchema.optional(),\n});\n/** Grid consistency: cells are rows × columns and merges tile the grid. */\nexport const tableRefinement = (\n t:\n | z.infer<typeof TableShapeSchema>\n | Omit<z.infer<typeof TableShapeSchema>, \"id\" | \"layerId\">,\n ctx: z.RefinementCtx,\n): void => {\n const issue = (message: string) => ctx.addIssue({ code: \"custom\", message });\n const nr = t.rows.length;\n const nc = t.columns.length;\n if (t.cells.length !== nr || t.cells.some((row) => row.length !== nc)) {\n issue(`cells must be ${nr} rows × ${nc} columns`);\n return;\n }\n // Every grid slot is covered by at most one merge, inside the grid.\n const owner: (string | null)[][] = t.cells.map((row) => row.map(() => null));\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n const s = cell.span;\n if (!s || (s.cols === 1 && s.rows === 1)) return;\n if (r + s.rows > nr || c + s.cols > nc) {\n issue(`cell ${r},${c}: span leaves the grid`);\n return;\n }\n for (let i = r; i < r + s.rows; i++)\n for (let j = c; j < c + s.cols; j++) {\n if (owner[i][j]) issue(`cell ${i},${j}: overlapping merges`);\n owner[i][j] = `${r},${c}`;\n }\n }),\n );\n};\nexport const TableSchema = TableShapeSchema.superRefine(tableRefinement);\nexport type Table = z.infer<typeof TableSchema>;\n\n/** The instance's pivot: its first point input, or the origin if none. */\nexport const blockPivot = (b: Block): { x: number; y: number } =>\n inputPoints(b.inputs)[0] ?? { x: 0, y: 0 };\n\n/**\n * Paper-space window into model space (DXF VIEWPORT). Only meaningful inside\n * a layout's object collection — never in model space or block children.\n */\nexport const ViewportSchema = ObjectBaseSchema.extend({\n type: z.literal(\"viewport\"),\n /** Placement on the sheet, mm, origin bottom-left of sheet. */\n rect: z.object({\n x: z.number(),\n y: z.number(),\n w: z.number().positive(),\n h: z.number().positive(),\n }),\n /** World point shown at the center of the rect. */\n modelCenter: Vec2Schema.default({ x: 0, y: 0 }),\n /** Drawing-scale denominator (model mm per paper mm); 1:50 => 50. */\n scale: z.number().positive().default(1),\n /** Pinned: no pan/zoom-through, no move/resize handles. */\n locked: z.boolean().default(false),\n hiddenLayerIds: z.array(z.string()).default([]),\n});\nexport type Viewport = z.infer<typeof ViewportSchema>;\n\n/** File formats a reference can link (docs/references.md). */\nexport const REFERENCE_FORMATS = [\n \"linea\",\n \"dxf\",\n \"dwg\",\n \"pdf\",\n \"png\",\n \"jpg\",\n] as const;\nexport type ReferenceFormat = (typeof REFERENCE_FORMATS)[number];\n\n/**\n * Where a reference's file lives. `path`: stored relative to the document's\n * folder when inside it (POSIX separators), else absolute; on the web, where\n * paths can't be read, the file's NAME plus `cacheKey` — this browser's copy\n * of the bytes. `url`: fetched. `asset`: EMBEDDED — the file's bytes are a\n * data URL in the holding document's `assets` (docs/adr/0005).\n */\nexport const ReferenceSourceSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"path\"),\n path: z.string().min(1),\n cacheKey: z.string().min(1).optional(),\n }),\n z.object({ kind: z.literal(\"url\"), url: z.string().url() }),\n z.object({ kind: z.literal(\"asset\"), assetId: z.string().min(1) }),\n]);\nexport type ReferenceSource = z.infer<typeof ReferenceSourceSchema>;\n\n/**\n * A LINKED file drawn in place (an xref): the document holds this record,\n * never the file. The file's model space lands with its origin at\n * `position`, rotated, scaled and optionally mirrored (about its X axis).\n */\nexport const ReferenceSchema = ObjectBaseSchema.extend({\n type: z.literal(\"reference\"),\n format: z.enum(REFERENCE_FORMATS),\n name: z.string().min(1),\n source: ReferenceSourceSchema,\n position: Vec2Schema,\n /** Radians CCW about `position`. */\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n mirrored: z.boolean().optional(),\n /** PDF: the 1-based page drawn, and how (vector lines + text / raster). */\n pdfPage: z.number().int().positive().optional(),\n pdfMode: z.enum([\"vector\", \"raster\"]).optional(),\n /** The FILE's layers not drawn, by name (stable across reloads). */\n hiddenLayers: z.array(z.string()).default([]),\n /** Switched off in the References panel: not drawn, picked or snapped. */\n hidden: z.boolean().optional(),\n /** Locked in the References panel: drawn and snapped, but never hovered\n * or picked on the canvas — select it from the panel instead. */\n locked: z.boolean().optional(),\n /** Crop rectangle in FILE coordinates: only content inside is drawn and\n * snapped (AutoCAD's XCLIP, rectangular). */\n clip: z\n .object({\n minX: z.number(),\n minY: z.number(),\n maxX: z.number(),\n maxY: z.number(),\n })\n .optional(),\n /**\n * The content's bounds in file coordinates, recorded on each successful\n * load: a missing file still has a frame to draw, pick and snap to.\n */\n extent: z\n .object({\n minX: z.number(),\n minY: z.number(),\n maxX: z.number(),\n maxY: z.number(),\n })\n .optional(),\n});\nexport type Reference = z.infer<typeof ReferenceSchema>;\n\n/**\n * The property clipboard's cross-type transferable look: the shared\n * ObjectBase style fields. Never `id`, never geometry. There are NO per-type\n * property schemas — the clipboard payload is validated as a whole document\n * and apply only copies values between already-valid objects, so all that's\n * needed is these key lists (typed against the model so a renamed field\n * fails the compile). See docs/clipboard-copy-paste.md.\n */\nexport const BASE_PROPERTY_KEYS = [\n \"color\",\n \"lineType\",\n \"lineTypeScale\",\n \"lineWidth\",\n \"opacity\",\n] as const satisfies readonly (keyof ObjectBase)[];\n\n/**\n * Type-specific look keys — transfer ONLY between objects of the SAME type\n * (shared key names lie across types: text/dimension `styleId` index\n * different style arrays; `scale` means pattern spacing / annotation size /\n * instance scale depending on type). Types not listed transfer base keys\n * only.\n */\nexport const EXTRA_PROPERTY_KEYS: {\n [K in ModelObjectType]?: readonly (keyof Extract<ModelObject, { type: K }>)[];\n} = {\n text: [\"hAlign\", \"vAlign\", \"frame\", \"styleId\", \"styleOverride\", \"scale\"],\n dimension: [\"styleId\", \"styleOverride\", \"scale\"],\n hatch: [\"fill\", \"scale\"],\n};\n\nexport const ModelObjectSchema = z.discriminatedUnion(\"type\", [\n PointSchema,\n LineSchema,\n PolylineSchema,\n CircleSchema,\n ArcSchema,\n EllipseSchema,\n HatchSchema,\n TextSchema,\n DimensionSchema,\n BlockSchema,\n ViewportSchema,\n CommentSchema,\n TableSchema,\n ReferenceSchema,\n]);\nexport type ModelObject = z.infer<typeof ModelObjectSchema>;\nexport type ModelObjectType = ModelObject[\"type\"];\n\n/** An object before an id is assigned (creation input). */\nexport type ModelObjectDto = {\n [K in ModelObjectType]: Omit<Extract<ModelObject, { type: K }>, \"id\">;\n}[ModelObjectType];\n","// The bundled font registry. Documents store font NAMES (ids), never font\n// data — same model as DXF/DWG, where a text style references \"arial.ttf\"\n// and missing fonts substitute. Unknown ids resolve to the default font for\n// display but are preserved in the model, so foreign names round-trip.\n// Background + the full design: docs/fonts.md.\n\nexport type FontId =\n | \"arial\"\n | \"osifont\"\n | \"osifont-italic\"\n | \"jetbrains-mono\"\n | \"source-serif\"\n | \"roboto-condensed\"\n | \"noto-sans\"\n | \"architects-daughter\"\n | \"comic-neue\";\n\nexport interface FontDef {\n id: FontId;\n /** User-facing name (property panel, dialogs). */\n label: string;\n /** CSS font-family stack for canvas/SVG rendering. */\n cssStack: string;\n /**\n * Cap height as a fraction of the em (OS/2 sCapHeight / unitsPerEm).\n * Text heights in the model are CAP heights (CAD convention: 2.5 mm text\n * has 2.5 mm capitals), so sinks set the font size to height/capHeight.\n */\n capHeight: number;\n /** STYLE table font file name (group 3) for DXF export. */\n dxfFontFile: string;\n /**\n * PDF strategy: a jsPDF built-in font name, or \"embed\" (the exporting\n * host must register the TTF via addFileToVFS/addFont under this font's\n * id before rendering).\n */\n pdf: \"helvetica\" | \"embed\";\n}\n\nexport const DEFAULT_FONT: FontId = \"arial\";\n\nexport const FONTS: Record<FontId, FontDef> = {\n arial: {\n id: \"arial\",\n label: \"Arial\",\n // Liberation Sans is the metric-compatible substitute on Linux.\n cssStack: \"Arial, 'Liberation Sans', 'Helvetica Neue', sans-serif\",\n capHeight: 1467 / 2048, // Arial OS/2 metrics\n dxfFontFile: \"arial.ttf\",\n // Embedded as Liberation Sans (SIL OFL, advance-identical to Arial, full\n // Cyrillic) so PDFs are self-contained and non-WinAnsi text survives.\n // When the host registers no TTF, the sink degrades to base-14 Helvetica\n // exactly as before.\n pdf: \"embed\",\n },\n osifont: {\n id: \"osifont\",\n label: \"osifont (ISO 3098)\",\n cssStack: \"osifont, Arial, sans-serif\",\n capHeight: 0.7397, // gen:fonts, from the bundled TTF\n dxfFontFile: \"osifont.ttf\",\n pdf: \"embed\",\n },\n \"osifont-italic\": {\n id: \"osifont-italic\",\n label: \"osifont Italic (ISO 3098)\",\n // Registered under its own family name; italic osifont text resolves\n // here (fontFace). The SVG sink adds font-style=\"italic\" so resvg, which\n // matches the TTF family \"osifont\", picks this file too.\n cssStack: \"'osifont-italic', osifont, Arial, sans-serif\",\n capHeight: 0.7397, // gen:fonts, from the bundled TTF\n dxfFontFile: \"osifont-italic.ttf\",\n pdf: \"embed\",\n },\n \"jetbrains-mono\": {\n id: \"jetbrains-mono\",\n label: \"JetBrains Mono\",\n cssStack: \"'JetBrains Mono', Consolas, monospace\",\n capHeight: 0.73, // gen:fonts, from the bundled TTF\n dxfFontFile: \"JetBrainsMono-Regular.ttf\",\n pdf: \"embed\",\n },\n \"source-serif\": {\n id: \"source-serif\",\n label: \"Source Serif 4\",\n cssStack: \"'Source Serif 4', Georgia, 'Times New Roman', serif\",\n capHeight: 0.67, // gen:fonts, from the bundled TTF\n dxfFontFile: \"SourceSerif4-Regular.ttf\",\n pdf: \"embed\",\n },\n \"roboto-condensed\": {\n id: \"roboto-condensed\",\n label: \"Roboto Condensed\",\n cssStack: \"'Roboto Condensed', 'Arial Narrow', Arial, sans-serif\",\n capHeight: 0.7109, // gen:fonts, from the bundled TTF\n dxfFontFile: \"RobotoCondensed-Regular.ttf\",\n pdf: \"embed\",\n },\n \"noto-sans\": {\n id: \"noto-sans\",\n label: \"Noto Sans\",\n cssStack: \"'Noto Sans', Arial, sans-serif\",\n capHeight: 0.714, // gen:fonts, from the bundled TTF\n dxfFontFile: \"NotoSans-Regular.ttf\",\n pdf: \"embed\",\n },\n \"architects-daughter\": {\n id: \"architects-daughter\",\n label: \"Architects Daughter\",\n cssStack: \"'Architects Daughter', 'Comic Sans MS', cursive\",\n capHeight: 0.6592, // gen:fonts, from the bundled TTF\n dxfFontFile: \"ArchitectsDaughter-Regular.ttf\",\n pdf: \"embed\",\n },\n \"comic-neue\": {\n id: \"comic-neue\",\n label: \"Comic Neue\",\n cssStack: \"'Comic Neue', 'Comic Sans MS', cursive\",\n capHeight: 0.67, // gen:fonts, from the bundled TTF\n dxfFontFile: \"ComicNeue-Regular.ttf\",\n pdf: \"embed\",\n },\n};\n\n// ---- faces (bold / italic) ---------------------------------------------------\n//\n// The model stores `font` plus `bold` / `italic` flags; everything downstream\n// of style resolution (measurers, sinks, exporters) receives ONE face string\n// in place of the bare font id: \"arial\", \"arial;b\", \"arial;i\", \"arial;bi\".\n// Code that only needs the font definition keeps calling resolveFont (it\n// strips the suffix); the style-aware places — canvas font string, measurer\n// tables, PDF face selection, SVG attributes, DXF STYLE flags — read it back\n// with parseFontFace.\n\n/** Font id + style → face string. osifont's italic is its own bundled face,\n * so italic osifont resolves to \"osifont-italic\" rather than a flag. */\nexport const fontFace = (\n font: string | undefined,\n bold = false,\n italic = false,\n): string | undefined => {\n let id = font;\n let i = italic;\n if (italic && resolveFont(font).id === \"osifont\") {\n id = \"osifont-italic\";\n i = false;\n }\n const suffix = (bold ? \"b\" : \"\") + (i ? \"i\" : \"\");\n return suffix ? `${id ?? DEFAULT_FONT};${suffix}` : id;\n};\n\n/** Face string → font id + style flags (the inverse of fontFace). */\nexport const parseFontFace = (\n face?: string,\n): { font: string | undefined; bold: boolean; italic: boolean } => {\n const at = face?.indexOf(\";\") ?? -1;\n if (!face || at === -1) return { font: face, bold: false, italic: false };\n const suffix = face.slice(at + 1);\n return {\n font: face.slice(0, at),\n bold: suffix.includes(\"b\"),\n italic: suffix.includes(\"i\"),\n };\n};\n\n/** Styled faces with their own bundled TTF (real bold / italic outlines).\n * Every other styled face is SYNTHESIZED by the sink from the regular one\n * (canvas: the browser; PDF: fill+stroke / skew), so all outputs agree. */\nexport const REAL_FACES: ReadonlySet<string> = new Set([\n \"arial;b\",\n \"arial;i\",\n \"arial;bi\",\n]);\n\n/** The face key a styled face renders with: itself when bundled (REAL_FACES),\n * else null (synthesized from the regular font). */\nexport const realFace = (face?: string): string | null => {\n const { font, bold, italic } = parseFontFace(face);\n if (!bold && !italic) return null;\n const key = `${resolveFont(font).id};${bold ? \"b\" : \"\"}${italic ? \"i\" : \"\"}`;\n return REAL_FACES.has(key) ? key : null;\n};\n\n/** Known id (or face string) → its definition; unknown/absent → the default\n * font. */\nexport const resolveFont = (font?: string): FontDef => {\n const id = font?.includes(\";\") ? font.slice(0, font.indexOf(\";\")) : font;\n return (id && FONTS[id as FontId]) || FONTS[DEFAULT_FONT];\n};\n\n/** TrueType typeface (family) name — the first family of the CSS stack.\n * The DXF export writes it as the STYLE record's ACAD xdata so CAD apps\n * resolve installed fonts by FAMILY instead of our bundle's file names. */\nexport const fontTypeface = (def: FontDef): string =>\n def.cssStack.split(\",\")[0].replace(/[\"']/g, \"\").trim();\n\n/** Font picker entries. osifont-italic is left out: osifont + the Italic\n * toggle IS that face (fontFace); stored values still resolve and show. */\nexport const FONT_OPTIONS: { value: FontId; label: string }[] = Object.values(\n FONTS,\n)\n .filter((f) => f.id !== \"osifont-italic\")\n .map((f) => ({ value: f.id, label: f.label }));\n\n/**\n * DXF STYLE record → the font it renders in here (docs/fonts.md §8.5). The\n * record names a font FILE (group 3) and, when AutoCAD wrote it, the\n * TrueType family (ACAD xdata 1000); either resolves a bundled font by its\n * own file / typeface, then by family heuristics (narrow → Roboto\n * Condensed, mono → JetBrains Mono, serif → Source Serif, comic → Comic\n * Neue). SHX stroke fonts all read as ISO lettering (osifont — `italic*`\n * faces slanted). Windows' Arial face files (arialbd/ariali/arialbi) keep\n * their bold/italic. An unknown TrueType family is PRESERVED as the font\n * id: it renders in the default and round-trips by name.\n */\n/** AutoCAD's stock stroke fonts, by file stem. */\nconst SHX_STEMS: ReadonlySet<string> = new Set([\n \"txt\",\n \"monotxt\",\n \"simplex\",\n \"complex\",\n \"romans\",\n \"romand\",\n \"romanc\",\n \"romant\",\n \"italic\",\n \"italicc\",\n \"italict\",\n \"scripts\",\n \"scriptc\",\n \"gothice\",\n \"gothicg\",\n \"gothici\",\n \"greeks\",\n \"greekc\",\n \"isocp\",\n \"isocp2\",\n \"isocp3\",\n \"isoct\",\n \"isoct2\",\n \"isoct3\",\n \"iso\",\n \"amgdt\",\n \"gdt\",\n \"symap\",\n \"syastro\",\n \"symath\",\n \"symeteo\",\n \"symusic\",\n \"bigfont\",\n \"ltypeshp\",\n \"swiss\",\n \"swissb\",\n \"swissi\",\n \"swissbi\",\n \"sansserif\",\n \"sanss\",\n \"sansserifb\",\n \"sanssb\",\n \"arc\",\n \"ic-romans\",\n \"ic-simplex\",\n \"txtalt\",\n]);\n\nexport const fontFromDxfStyle = (\n fontFile: string | undefined,\n typeface?: string,\n): { font: string; bold?: true; italic?: true } => {\n const file = (fontFile ?? \"\").trim();\n const stem = file.replace(/\\.[a-z0-9]+$/i, \"\").toLowerCase();\n const family = (typeface ?? \"\").trim();\n const familyLower = family.toLowerCase();\n for (const def of Object.values(FONTS)) {\n if (\n (file && def.dxfFontFile.toLowerCase() === file.toLowerCase()) ||\n (familyLower && fontTypeface(def).toLowerCase() === familyLower)\n )\n // osifont's italic is a face of its own in the registry; the model's\n // authoring form is osifont + italic (fontFace maps it back).\n return def.id === \"osifont-italic\"\n ? { font: \"osifont\", italic: true }\n : { font: def.id };\n }\n const arialFace = /^arial(bd|bi|i)$/.exec(stem);\n if (arialFace)\n return {\n font: \"arial\",\n ...(arialFace[1].includes(\"b\") ? { bold: true as const } : {}),\n ...(arialFace[1].includes(\"i\") ? { italic: true as const } : {}),\n };\n const key = `${familyLower} ${stem}`;\n if (/narrow|condensed|arialn/.test(key)) return { font: \"roboto-condensed\" };\n if (/mono|courier|\\bcour\\b|consola|lucon|menlo/.test(key))\n return { font: \"jetbrains-mono\" };\n if (/times|georgia|cambria|garamond|serif|\\bbook/.test(key))\n return { font: \"source-serif\" };\n if (/comic/.test(key)) return { font: \"comic-neue\" };\n // SHX by extension, or by name — DWG transcodes drop the extension.\n if (/\\.shx$/i.test(file) || (!file && !family) || SHX_STEMS.has(stem))\n return {\n font: \"osifont\",\n ...(/italic/.test(stem) ? { italic: true as const } : {}),\n };\n // Unknown TrueType: keep the name (family when AutoCAD wrote it).\n return { font: family || stem };\n};\n","// A block instance's stored inputs come in two shapes\n// (docs/block-inputs-and-handles.md §1):\n// - POSITIONAL: `(Vec2 | id)[]` in pick order — modules with `place`\n// labels, a `place` function returning an array, or no inputs table.\n// - NAMED: `{ [name]: Vec2 | Vec2[] | id | id[] }` — modules declaring an\n// `inputs` table. Keys are written in TABLE order, and that order is\n// the order everything below walks (JS keeps string-key insertion order\n// through JSON and zod).\n// Everything that only needs \"the points\" or \"the references\" goes through\n// these helpers, so it never cares which shape it holds. Points are WORLD\n// coordinates in both shapes; the pivot is the first point in walk order.\n\nimport { z } from \"zod\";\nimport { Vec2Schema } from \"./common\";\nimport type { Vec2 } from \"../geometry/vec2\";\n\n/** One stored value: a world point or a referenced object id. */\nexport type InputValue = Vec2 | string;\n\n/** One named slot's stored value. */\nexport type NamedInputValue = Vec2 | Vec2[] | string | string[];\n\nexport type StoredInputs =\n | InputValue[]\n | { [name: string]: NamedInputValue };\n\nconst ValueSchema = z.union([Vec2Schema, z.string()]);\n\nexport const StoredInputsSchema = z.union([\n z.array(ValueSchema),\n z.record(\n z.string(),\n z.union([\n Vec2Schema,\n z.string(),\n z.array(Vec2Schema),\n z.array(z.string()),\n ]),\n ),\n]);\n\nexport const isNamedInputs = (\n inputs: StoredInputs,\n): inputs is { [name: string]: NamedInputValue } => !Array.isArray(inputs);\n\n/** Every stored value in walk order, lists flattened. */\nexport const inputValues = (inputs: StoredInputs): InputValue[] => {\n if (!isNamedInputs(inputs)) return inputs;\n const out: InputValue[] = [];\n for (const v of Object.values(inputs))\n if (Array.isArray(v)) out.push(...v);\n else out.push(v);\n return out;\n};\n\n/** The stored points in walk order. */\nexport const inputPoints = (inputs: StoredInputs): Vec2[] =>\n inputValues(inputs).filter((v): v is Vec2 => typeof v !== \"string\");\n\n/** The referenced object ids in walk order. */\nexport const inputRefs = (inputs: StoredInputs): string[] =>\n inputValues(inputs).filter((v): v is string => typeof v === \"string\");\n\n/**\n * Map every stored value, keeping the shape. `index` is the value's flat\n * position in walk order (the index handles address).\n */\nexport const mapInputValues = <T extends StoredInputs>(\n inputs: T,\n fn: (value: InputValue, index: number) => InputValue,\n): T => {\n let i = 0;\n if (!isNamedInputs(inputs))\n return inputs.map((v) => fn(v, i++)) as T;\n const out: Record<string, NamedInputValue> = {};\n for (const [name, v] of Object.entries(inputs))\n out[name] = Array.isArray(v)\n ? (v as InputValue[]).map((x) => fn(x, i++)) as Vec2[] | string[]\n : (fn(v, i++) as Vec2 | string);\n return out as T;\n};\n\n/** Map the points only (references pass through). */\nexport const mapInputPoints = <T extends StoredInputs>(\n inputs: T,\n fn: (p: Vec2) => Vec2,\n): T => mapInputValues(inputs, (v) => (typeof v === \"string\" ? v : fn(v)));\n","// Named line types — the .lin dash model. A line type is a repeating\n// sequence of dash lengths: >0 pen-down, <0 gap, 0 dot. Lengths are mm PER\n// 1 MM OF LINE WIDTH — the paint layer multiplies them by the resolved\n// lineweight (ISO 128 style: pattern size tracks stroke weight), so a\n// 0.25 mm line gets quarter-size dashes. The curated set\n// (continuous/dashed/…) is kept for back-compat and takes precedence; the\n// built-in catalogue (builtin.lin — DXF-compatible LTYPE names, standards-\n// derived dash data) is embedded and merged in by name.\n//\n// Objects/layers store a line type by NAME (a plain string, resolved here);\n// unknown names fall back to continuous at paint time — mirrors hatchPatterns.\n\nimport { z } from \"zod\";\nimport { BUILTIN_LIN } from \"./builtinLin\";\n\nexport interface LinePattern {\n /** Canonical name as stored on objects/layers (curated names are lowercase). */\n name: string;\n /** Human label for the dropdown. */\n label: string;\n /**\n * Signed dash sequence, mm per 1 mm of line width: >0 dash, <0 gap, 0 dot.\n * Empty = continuous (no dashing).\n */\n dashesMm: number[];\n /** DXF LTYPE name for export (defaults to the catalogue name). */\n dxfName?: string;\n /**\n * Resolvable and DXF-exported but not offered in pickers — the catalogue's\n * `NAME2` (half) / `NAMEX2` (double) scale variants, which lineTypeScale\n * makes redundant as picker entries.\n */\n hidden?: boolean;\n}\n\n/**\n * Parse acad .lin text. Each entry is a `*NAME,description` header followed by\n * an `A,d1,d2,…` definition line (alignment code + signed dash lengths).\n * Dash lengths are taken as world mm (builtin.lin is already mm). Complex\n * linetypes (embedded shapes/text in `[...]`) are skipped — we can't render\n * SHX shapes, and dropping the shape would misrepresent them.\n */\nexport interface ParsedLinePattern {\n name: string;\n description?: string;\n dashesMm: number[];\n}\n\nexport const parseLinDefinitions = (text: string): ParsedLinePattern[] => {\n const out: ParsedLinePattern[] = [];\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line.startsWith(\"*\")) continue;\n const comma = line.indexOf(\",\");\n const name = (comma >= 0 ? line.slice(1, comma) : line.slice(1)).trim();\n const description = comma >= 0 ? line.slice(comma + 1).trim() : undefined;\n // The definition is the next non-blank, non-comment line.\n let j = i + 1;\n while (j < lines.length) {\n const d = lines[j].trim();\n if (d && !d.startsWith(\";\")) break;\n j++;\n }\n if (j >= lines.length) break;\n const def = lines[j].trim();\n if (def.startsWith(\"*\")) continue; // header with no body → skip\n i = j;\n if (def.includes(\"[\") || def.includes('\"')) continue; // complex → skip\n const tokens = def.split(\",\").map((t) => t.trim());\n // tokens[0] is the alignment code (always \"A\"); the rest are dash lengths.\n const nums = tokens\n .slice(1)\n .filter((t) => t.length > 0)\n .map(Number);\n if (nums.some((n) => Number.isNaN(n))) continue;\n out.push({ name, description, dashesMm: nums });\n }\n return out;\n};\n\n// Curated set — the historical defaults. Stored signed so they render exactly\n// as before (the render conversion turns 0 into a visible dot). These win over\n// the catalogue on name collision.\nconst CURATED: LinePattern[] = [\n { name: \"continuous\", label: \"Continuous\", dashesMm: [] },\n {\n name: \"dashed\",\n label: \"Dashed\",\n dashesMm: [12.7, -6.35],\n dxfName: \"DASHED\",\n },\n { name: \"dotted\", label: \"Dotted\", dashesMm: [0, -6.35], dxfName: \"DOT\" },\n {\n name: \"dashdot\",\n label: \"Dash-dot\",\n dashesMm: [12.7, -6.35, 0, -6.35],\n dxfName: \"DASHDOT\",\n },\n {\n name: \"center\",\n label: \"Center\",\n dashesMm: [31.75, -6.35, 6.35, -6.35],\n dxfName: \"CENTER\",\n },\n {\n name: \"hidden\",\n label: \"Hidden\",\n dashesMm: [6.35, -3.175],\n dxfName: \"HIDDEN\",\n },\n {\n name: \"phantom\",\n label: \"Phantom\",\n dashesMm: [31.75, -6.35, 6.35, -6.35, 6.35, -6.35],\n dxfName: \"PHANTOM\",\n },\n {\n name: \"border\",\n label: \"Border\",\n dashesMm: [12.7, -6.35, 12.7, -6.35, 0, -6.35],\n dxfName: \"BORDER\",\n },\n {\n name: \"divide\",\n label: \"Divide\",\n dashesMm: [12.7, -6.35, 0, -6.35, 0, -6.35],\n dxfName: \"DIVIDE\",\n },\n];\n\n// Fold the separator drift between .lin names, the DXF table, and AutoCAD\n// output (hyphens/dots/spaces → `_`) so lookups resolve regardless of style.\nconst normalizeName = (name: string): string =>\n name\n .trim()\n .toUpperCase()\n .replace(/[\\s.-]+/g, \"_\");\n\n/**\n * ~26-char ASCII depiction of a dash cycle, generated from the data itself so\n * it can never lie: >0 → underscores, <0 → spaces, 0 → a dot. Scaled per\n * pattern (longest element ≈ 5 chars) so long/short contrast survives both\n * the fine curated dashes and the coarse catalogue ones. Empty = solid line.\n */\nconst asciiPreview = (dashesMm: number[]): string => {\n const WIDTH = 15;\n if (!dashesMm.length) return \"_\".repeat(WIDTH * 0.8);\n const unit = Math.max(1.5875, Math.max(...dashesMm.map(Math.abs)) / 5);\n let out = \"\";\n while (out.length < WIDTH) {\n for (const d of dashesMm) {\n const n = Math.max(1, Math.min(10, Math.round(Math.abs(d) / unit)));\n out += d > 0 ? \"_\".repeat(n) : d < 0 ? \" \".repeat(n) : \".\";\n if (out.length >= WIDTH) break;\n }\n }\n return out.slice(0, WIDTH).trimEnd();\n};\n\n/** name → label without the ASCII preview (the pickers draw an SVG one). */\nconst PLAIN_LABELS: Record<string, string> = {};\n\n/** Label exported as the DXF LTYPE description. */\nconst withPreview = (p: LinePattern): LinePattern => {\n PLAIN_LABELS[p.name] = p.label;\n return { ...p, label: `${p.label} ${asciiPreview(p.dashesMm)}` };\n};\n\nconst BUILT_IN: LinePattern[] = CURATED.map(withPreview);\nconst BY_NAME = new Map(BUILT_IN.map((p) => [normalizeName(p.name), p]));\nfor (const p of parseLinDefinitions(BUILTIN_LIN)) {\n const key = normalizeName(p.name);\n if (BY_NAME.has(key)) continue; // curated precedence + dedup\n const pattern = withPreview({\n name: p.name,\n label: p.description || p.name,\n dashesMm: p.dashesMm,\n dxfName: p.name,\n });\n BY_NAME.set(key, pattern);\n BUILT_IN.push(pattern);\n}\n\n// Hide the .lin scale-variant convention (NAME2 = half, NAMEX2 = double) from\n// pickers: lineTypeScale covers scaling, so the variants are clutter there —\n// but they stay resolvable so imported DXF, old documents, and round-trips\n// keep rendering with their exact catalogue dashes.\nconst scaleVariantBase = (name: string): string | undefined => {\n if (/x2$/i.test(name)) return name.slice(0, -2);\n if (/2$/.test(name)) return name.slice(0, -1);\n return undefined;\n};\nfor (const p of BUILT_IN) {\n const base = scaleVariantBase(p.name);\n const target = base ? BY_NAME.get(normalizeName(base)) : undefined;\n if (target && target !== p) p.hidden = true;\n}\n\n/** Ordered picker line-type names (hidden scale variants excluded). */\nexport const LINE_TYPE_NAMES: string[] = BUILT_IN.filter((p) => !p.hidden).map(\n (p) => p.name,\n);\n\n/**\n * Every definition including hidden scale variants — DXF export emits them\n * all so any LTYPE a document references stays defined.\n */\nexport const LINE_TYPE_DEFS: readonly LinePattern[] = BUILT_IN;\n\n/** name → display label (covers hidden entries so stored values still show). */\nexport const LINE_TYPE_LABELS: Record<string, string> = PLAIN_LABELS;\n\n/** Default line type (solid). */\nexport const DEFAULT_LINE_TYPE = \"continuous\";\n\n/** Resolve a line-type name (case- and punctuation-insensitive) to its definition. */\nexport const getLineType = (name: string): LinePattern | undefined =>\n BY_NAME.get(normalizeName(name));\n\n/**\n * Render dash array (canvas/PDF style: all-positive mm, a 0-length dot becomes\n * a short 0.1 mm mark that reads as a dot with round caps). undefined = a solid\n * (continuous) line.\n */\nexport const renderDashes = (pattern: LinePattern): number[] | undefined =>\n pattern.dashesMm.length\n ? pattern.dashesMm.map((v) => (v === 0 ? 0.1 : Math.abs(v)))\n : undefined;\n\n// ---- document-defined line types --------------------------------------------\n//\n// A document may carry its own named line types (`document.lineTypes`): the\n// definitions a DXF/DWG file brought along, or ones a user imported from a\n// .lin file. Same dash model and the same per-mm-of-width convention as the\n// catalogue; objects and layers keep referencing by NAME. Resolution:\n// document first (a document entry shadows a catalogue name — the file's own\n// table is authoritative for that file), then the built-in catalogue.\n\nexport const LineTypeSchema = z.object({\n /** Stored on objects/layers as `lineType`; case-insensitive, unique per\n * document. */\n name: z.string().min(1),\n description: z.string().optional(),\n /** Signed dash cycle, mm per 1 mm of line width: >0 dash, <0 gap, 0 dot.\n * Empty = continuous. */\n dashesMm: z.array(z.number()),\n});\nexport type LineType = z.infer<typeof LineTypeSchema>;\n\n/** The key two line type names compare by (case- and punctuation-insensitive,\n * like DXF LTYPE names). */\nexport const lineTypeKey = (name: string): string => normalizeName(name);\n\n/** A document line type as the catalogue's pattern shape. */\nexport const lineTypeAsPattern = (t: LineType): LinePattern => ({\n name: t.name,\n label: t.description ?? t.name,\n dashesMm: t.dashesMm,\n dxfName: t.name.toUpperCase(),\n});\n\n/** Name → definition: the document's own line types first, then the\n * built-in catalogue; undefined = unknown (paints continuous). */\nexport const resolveLineType = (\n name: string | undefined,\n lineTypes?: readonly LineType[],\n): LinePattern | undefined => {\n if (!name) return undefined;\n if (lineTypes && lineTypes.length > 0) {\n const key = normalizeName(name);\n const own = lineTypes.find((t) => normalizeName(t.name) === key);\n if (own) return lineTypeAsPattern(own);\n }\n return getLineType(name);\n};\n\n/** Objects (every space) and layers whose line type is `name`. */\nexport const lineTypeUsers = (\n doc: {\n objects: readonly { lineType?: string }[];\n layouts: readonly { objects: readonly { lineType?: string }[] }[];\n layers: readonly { lineType: string }[];\n },\n name: string,\n): { objects: number; layers: number } => {\n const key = normalizeName(name);\n const uses = (o: { lineType?: string }) =>\n o.lineType !== undefined && normalizeName(o.lineType) === key;\n let objects = doc.objects.filter(uses).length;\n for (const l of doc.layouts) objects += l.objects.filter(uses).length;\n return {\n objects,\n layers: doc.layers.filter((l) => normalizeName(l.lineType) === key).length,\n };\n};\n\n/** `.lin` text for document line types (acad format: `*NAME,description`\n * then `A,` + the signed dash lengths). */\nexport const formatLinDefinitions = (lineTypes: readonly LineType[]): string =>\n lineTypes\n .map(\n (t) =>\n `*${t.name},${t.description ?? \"\"}\\nA,${t.dashesMm.map((d) => +d.toFixed(6)).join(\",\")}\\n`,\n )\n .join(\"\");\n","// GENERATED — do not edit. Mirror of builtin.lin (the built-in line type\n// library, lengths in mm). Regenerate with:\n// npm run gen:linetypes -w @lineadraw/core\n\nexport const BUILTIN_LIN = `;; Linea built-in line type library.\n;;\n;; Format: .lin syntax - a \\`*NAME,description\\` header line followed by an\n;; \\`A,...\\` definition (alignment code, then signed dash lengths: >0 pen-down,\n;; <0 gap, 0 dot). All lengths are millimeters, sized for a 1 mm pen (ISO\n;; scaling); scale the line type to suit other pen widths.\n;;\n;; The dash sequences are functional interchange data, kept name- and\n;; value-compatible with the DXF LTYPE identifiers other CAD applications\n;; resolve: the general set follows long-standing drafting conventions, the\n;; ACAD_ISO* set implements the ISO 128 line types, and the JIS_* set\n;; follows JIS Z 8312. Descriptions and organization are Linea's own.\n;;\n;; After editing, regenerate the embedded TS mirror:\n;; npm run gen:linetypes -w @lineadraw/core\n;;\n\n;; ISO 128 line types (1 mm pen width base).\n\n*ACAD_ISO02W100,ISO 1\nA,12,-3\n*ACAD_ISO03W100,ISO 2\nA,12,-18\n*ACAD_ISO04W100,ISO 3\nA,24,-3,0,-3\n*ACAD_ISO05W100,ISO 4\nA,24,-3,0,-3,0,-3\n*ACAD_ISO06W100,ISO 5\nA,24,-3,0,-3,0,-3,0,-3\n*ACAD_ISO07W100,ISO 6\nA,0,-3\n*ACAD_ISO08W100,ISO 7\nA,24,-3,6,-3\n*ACAD_ISO09W100,ISO 8\nA,24,-3,6,-3,6,-3\n*ACAD_ISO10W100,ISO 9\nA,12,-3,0,-3\n*ACAD_ISO11W100,ISO 10\nA,12,-3,12,-3,0,-3\n*ACAD_ISO12W100,ISO 11\nA,12,-3,0,-3,0,-3\n*ACAD_ISO13W100,ISO 12\nA,12,-3,12,-3,0,-3,0,-3\n*ACAD_ISO14W100,ISO 13\nA,12,-3,0,-3,0,-3,0,-3\n*ACAD_ISO15W100,ISO 14\nA,12,-3,12,-3,0,-3,0,-3,0,-3\n\n;; JIS Z 8312 line types.\n\n*JIS_08_11,JIS 1SASEN11\nA,11,-.60,.60,-.60\n*JIS_08_15,JIS 1SASEN15\nA,15,-.75,.75,-.75\n*JIS_08_25,JIS 1SASEN25\nA,25,-1.125,.75,-1.125\n*JIS_08_37,JIS 1SASEN37\nA,37.5,-1.125,.75,-1.125\n*JIS_08_50,JIS 1SASEN50\nA,50,-1.125,.75,-1.125\n*JIS_02_0.7,JIS HIDDEN0.75\nA,.75,-.60\n*JIS_02_1.0,JIS HIDDEN01\nA,1,-1\n*JIS_02_1.2,JIS HIDDEN01.25\nA,1.25,-1.25\n*JIS_02_2.0,JIS HIDDEN02\nA,2,-1\n*JIS_02_4.0,JIS HIDDEN04\nA,4,-1.5\n*JIS_09_08,JIS 2SASEN8\nA,8,-.55,.55,-.55,.55,-.55\n*JIS_09_15,JIS 2SASEN15\nA,15,-.90,.60,-.90,.60,-.90\n*JIS_09_29,JIS 2SASEN29\nA,29,-1.2,.70,-1.2,.70,-1.2\n*JIS_09_50,JIS 2SASEN50\nA,50,-1.2,.70,-1.2,.70,-1.2\n`;\n","// Pure 2D vector math. World units are millimeters, angles are radians, Y is up.\n\nexport interface Vec2 {\n x: number;\n y: number;\n}\n\nexport const vec2 = (x: number, y: number): Vec2 => ({ x, y });\n\nexport const add = (a: Vec2, b: Vec2): Vec2 => ({ x: a.x + b.x, y: a.y + b.y });\nexport const sub = (a: Vec2, b: Vec2): Vec2 => ({ x: a.x - b.x, y: a.y - b.y });\nexport const scale = (a: Vec2, s: number): Vec2 => ({ x: a.x * s, y: a.y * s });\nexport const neg = (a: Vec2): Vec2 => ({ x: -a.x, y: -a.y });\n\nexport const dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n/** 2D cross product (z component of the 3D cross). Positive when b is CCW from a. */\nexport const cross = (a: Vec2, b: Vec2): number => a.x * b.y - a.y * b.x;\n\nexport const lenSq = (a: Vec2): number => a.x * a.x + a.y * a.y;\nexport const len = (a: Vec2): number => Math.hypot(a.x, a.y);\nexport const distSq = (a: Vec2, b: Vec2): number => lenSq(sub(b, a));\nexport const dist = (a: Vec2, b: Vec2): number =>\n Math.hypot(b.x - a.x, b.y - a.y);\n\n/** Normalize; returns the zero vector unchanged. */\nexport const norm = (a: Vec2): Vec2 => {\n const l = len(a);\n return l === 0 ? a : { x: a.x / l, y: a.y / l };\n};\n\nexport const lerp = (a: Vec2, b: Vec2, t: number): Vec2 => ({\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n});\n\nexport const mid = (a: Vec2, b: Vec2): Vec2 => lerp(a, b, 0.5);\n\n/** Angle of the vector from +X axis, CCW, in (-π, π]. */\nexport const angle = (a: Vec2): number => Math.atan2(a.y, a.x);\n\n/** Rotate a vector by an angle (radians, CCW). */\nexport const rot = (a: Vec2, angle: number): Vec2 => {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { x: a.x * c - a.y * s, y: a.x * s + a.y * c };\n};\n\n/** Rotate point p around center by angle (radians, CCW). */\nexport const rotAround = (p: Vec2, center: Vec2, angle: number): Vec2 =>\n add(center, rot(sub(p, center), angle));\n\n/** Perpendicular vector, 90° CCW. */\nexport const perp = (a: Vec2): Vec2 => ({ x: -a.y, y: a.x });\n\n/** Unit vector at the given angle. */\nexport const fromAngle = (angle: number): Vec2 => ({\n x: Math.cos(angle),\n y: Math.sin(angle),\n});\n\n/** Point at distance d from origin p in direction angle (polar). */\nexport const polar = (angle: number, d: number, p: Vec2): Vec2 => ({\n x: Math.cos(angle) * d + p.x,\n y: Math.sin(angle) * d + p.y,\n});\n\nexport const eq = (a: Vec2, b: Vec2, epsilon = 1e-9): boolean =>\n Math.abs(a.x - b.x) <= epsilon && Math.abs(a.y - b.y) <= epsilon;\n\n/** Normalize an angle into [0, 2π). */\nexport const normAngle = (angle: number): number => {\n const t = angle % (Math.PI * 2);\n return t < 0 ? t + Math.PI * 2 : t;\n};\n","// The text form of list parameters (`numberList` / `stringList`): what the\n// properties panel shows and parses, and how legacy string values of a list\n// parameter are read. Space-separated, like a command line:\n//\n// stringList [\"yes\", \"hello sir\"] ⇄ yes \"hello sir\"\n// double quotes group words; \\\" and \\\\ escape inside quotes\n// numberList [0, 7200, 7200] ⇄ 0 2*7200\n// Tekla-style `N*d` repeats d N times (runs format back to it);\n// a decimal comma is accepted (\"2,5\")\n//\n// Pure — no DOM, shared by the editor, headless callers and scripts' hosts.\n\nconst NUMBER = /^[+-]?(\\d+([.,]\\d*)?|[.,]\\d+)(e[+-]?\\d+)?$/i;\nconst REPEAT = /^(\\d+)\\*(.+)$/;\n\nconst parseNumber = (token: string): number | null =>\n NUMBER.test(token) ? Number(token.replace(\",\", \".\")) : null;\n\n/** \"0 2*7200\" → [0, 7200, 7200]; null when any token isn't a number. */\nexport const parseNumberList = (text: string): number[] | null => {\n const out: number[] = [];\n for (const token of text.trim().split(/\\s+/).filter(Boolean)) {\n const repeat = REPEAT.exec(token);\n const count = repeat ? Number(repeat[1]) : 1;\n const value = parseNumber(repeat ? repeat[2] : token);\n if (value === null || !Number.isFinite(value) || count < 1) return null;\n for (let i = 0; i < count; i++) out.push(value);\n }\n return out;\n};\n\n/** Shortest exact-enough decimal: no float noise (0.1 + 0.2 → \"0.3\"). */\nconst formatNumber = (n: number): string => String(Number(n.toPrecision(12)));\n\n/** [0, 7200, 7200] → \"0 2*7200\" (consecutive equal values become N*d). */\nexport const formatNumberList = (nums: readonly number[]): string => {\n const parts: string[] = [];\n for (let i = 0; i < nums.length;) {\n let j = i + 1;\n while (j < nums.length && nums[j] === nums[i]) j++;\n const n = formatNumber(nums[i]);\n parts.push(j - i > 1 ? `${j - i}*${n}` : n);\n i = j;\n }\n return parts.join(\" \");\n};\n\n/** 'yes \"hello sir\"' → [\"yes\", \"hello sir\"]; null on an unclosed quote. */\nexport const parseStringList = (text: string): string[] | null => {\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n if (/\\s/.test(text[i])) {\n i++;\n continue;\n }\n let item = \"\";\n if (text[i] === '\"') {\n i++;\n let closed = false;\n while (i < text.length) {\n const c = text[i++];\n if (c === \"\\\\\" && i < text.length) item += text[i++];\n else if (c === '\"') {\n closed = true;\n break;\n } else item += c;\n }\n if (!closed) return null;\n } else {\n while (i < text.length && !/\\s/.test(text[i])) item += text[i++];\n }\n out.push(item);\n }\n return out;\n};\n\n/** [\"yes\", \"hello sir\"] → 'yes \"hello sir\"' (quoted only when needed). */\nexport const formatStringList = (strs: readonly string[]): string =>\n strs\n .map((s) =>\n s === \"\" || /[\\s\"\\\\]/.test(s)\n ? `\"${s.replace(/[\\\\\"]/g, (c) => `\\\\${c}`)}\"`\n : s,\n )\n .join(\" \");\n\n/**\n * A stored value read as a list parameter: arrays pass through (filtered to\n * the element type), and a STRING — what a parameter held before its block\n * switched to a list type — is parsed in the list syntax. Anything else, or\n * text that doesn't parse, yields null (callers fall back to the default).\n */\nexport const readListParam = (\n type: \"numberList\" | \"stringList\",\n value: unknown,\n): number[] | string[] | null => {\n if (type === \"numberList\") {\n if (Array.isArray(value))\n return value.every((v) => typeof v === \"number\" && Number.isFinite(v))\n ? (value as number[])\n : null;\n return typeof value === \"string\" ? parseNumberList(value) : null;\n }\n if (Array.isArray(value))\n return value.every((v) => typeof v === \"string\")\n ? (value as string[])\n : null;\n return typeof value === \"string\" ? parseStringList(value) : null;\n};\n","import { z } from \"zod\";\n\n// Discriminated by `type` so the default (and per-type constraints like\n// min/max or enum options) can't disagree with the declared type.\nconst paramBase = {\n name: z.string().regex(/^[a-zA-Z_]\\w*$/),\n label: z.string().optional(),\n /** What the parameter means: the label's tooltip in the panel. */\n hint: z.string().optional(),\n};\n\n/** `#rrggbb` — a color parameter's value. */\nexport const HEX_COLOR = /^#[0-9a-f]{6}$/i;\n\n/**\n * One enum choice: `value` is what the script receives, `label` what the\n * properties panel shows (falls back to the value). Plain strings — the\n * pre-label form still written by older documents — normalize to\n * `{ value }`.\n */\nexport const EnumOptionSchema = z.preprocess(\n (raw) => (typeof raw === \"string\" ? { value: raw } : raw),\n z.object({\n value: z.string(),\n label: z.string().optional(),\n /** A `#rrggbb` color square before the option's label. */\n swatch: z.string().regex(HEX_COLOR).optional(),\n }),\n);\nexport type EnumOption = z.infer<typeof EnumOptionSchema>;\n\nconst NumberParam = z.object({\n ...paramBase,\n type: z.literal(\"number\"),\n default: z.number(),\n min: z.number().optional(),\n max: z.number().optional(),\n /** Whole numbers only. */\n integer: z.boolean().optional(),\n /** ArrowUp / ArrowDown increment in the panel (default 1). */\n step: z.number().positive().optional(),\n /** Shown inside the field before / after the value (\"1:\", \"mm\"). */\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n /** Standard values offered in the field's dropdown; typing stays free. */\n presets: z.array(z.number()).optional(),\n});\nconst StringParam = z.object({\n ...paramBase,\n type: z.literal(\"string\"),\n default: z.string(),\n placeholder: z.string().optional(),\n /** A textarea; Shift+Enter starts a new line. */\n multiline: z.boolean().optional(),\n presets: z.array(z.string()).optional(),\n});\nconst BooleanParam = z.object({\n ...paramBase,\n type: z.literal(\"boolean\"),\n default: z.boolean(),\n /** \"toggle\": a toggle button showing the label (compact, e.g. in a row\n * beside a picker) instead of a switch. */\n display: z.enum([\"switch\", \"toggle\"]).optional(),\n});\n// Lists edit as space-separated text (extensions/paramLists.ts): numbers\n// with Tekla `N*d` repeats, words with \"quoted phrases\".\nconst NumberListParam = z.object({\n ...paramBase,\n type: z.literal(\"numberList\"),\n default: z.array(z.number()),\n /** Shown while the list is empty. */\n placeholder: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n presets: z.array(z.array(z.number())).optional(),\n});\nconst StringListParam = z.object({\n ...paramBase,\n type: z.literal(\"stringList\"),\n default: z.array(z.string()),\n /** Shown while the list is empty. */\n placeholder: z.string().optional(),\n presets: z.array(z.array(z.string())).optional(),\n});\n// A `#rrggbb` color: swatch + picker in the panel, presets as a palette.\nconst ColorParam = z.object({\n ...paramBase,\n type: z.literal(\"color\"),\n default: z.string().regex(HEX_COLOR),\n presets: z.array(z.string().regex(HEX_COLOR)).optional(),\n});\nconst EnumParam = z.object({\n ...paramBase,\n type: z.literal(\"enum\"),\n default: z.string(),\n options: z.array(EnumOptionSchema).min(1),\n /** \"buttons\": a segmented toggle group of the options (short choices);\n * the panel falls back to the dropdown when they don't fit. */\n display: z.enum([\"dropdown\", \"buttons\"]).optional(),\n});\n// Pickers over the document's resources. Values are ids / names (strings):\n// a style id (\"\" or unknown → the document's first style, the rule objects\n// follow), a font id, a linetype or hatch pattern name.\nconst resourceParam = <T extends string>(type: T, fallback: string) =>\n z.object({\n ...paramBase,\n type: z.literal(type),\n default: z.string().default(fallback),\n });\nconst TextStyleParam = resourceParam(\"textStyle\", \"\");\nconst DimStyleParam = resourceParam(\"dimStyle\", \"\");\nconst FontParam = resourceParam(\"font\", \"arial\");\nconst LineTypeParam = resourceParam(\"lineType\", \"continuous\");\nconst HatchPatternParam = resourceParam(\"hatchPattern\", \"ANSI31\");\n\n// A section label between rows in the properties panel — no value, no\n// default; never present in the `params` record scripts receive.\nconst LabelParam = z.object({ ...paramBase, type: z.literal(\"label\") });\n\n// Structured data the module owns (docs/block-inputs-and-handles.md §5.1):\n// any JSON value — per-wall overrides, a list of openings. No panel row; it\n// is edited through handles, handle menus and actions (and by agents, as\n// any param). The module validates the contents itself.\nconst DataParam = z.object({\n ...paramBase,\n type: z.literal(\"data\"),\n default: z.json(),\n});\n\nconst enumDefaultIsAnOption = (p: { type: string }): boolean =>\n p.type !== \"enum\" ||\n (p as z.infer<typeof EnumParam>).options.some(\n (o) => o.value === (p as z.infer<typeof EnumParam>).default,\n );\nconst ENUM_DEFAULT = { message: \"enum default must be one of its options\" };\n\n/** What a `row` may hold: compact, single-line kinds. */\nexport const RowItemSchema = z\n .discriminatedUnion(\"type\", [\n NumberParam,\n StringParam,\n BooleanParam,\n EnumParam,\n ColorParam,\n TextStyleParam,\n DimStyleParam,\n FontParam,\n LineTypeParam,\n HatchPatternParam,\n ])\n .refine(enumDefaultIsAnOption, ENUM_DEFAULT);\n\n/** Layout only: 2–3 params on one panel row, each item's label shown as a\n * short prefix (\"W\", \"H\"). The values stay flat — `params.w`, `params.h` —\n * so a row never changes the stored shape (see valueParams). */\nconst RowParam = z.object({\n ...paramBase,\n type: z.literal(\"row\"),\n items: z.array(RowItemSchema).min(2).max(3),\n});\n\nexport const ParamDefSchema = z\n .discriminatedUnion(\"type\", [\n NumberParam,\n StringParam,\n BooleanParam,\n NumberListParam,\n StringListParam,\n ColorParam,\n EnumParam,\n TextStyleParam,\n DimStyleParam,\n FontParam,\n LineTypeParam,\n HatchPatternParam,\n DataParam,\n LabelParam,\n RowParam,\n ])\n .refine(enumDefaultIsAnOption, ENUM_DEFAULT);\nexport type ParamDef = z.infer<typeof ParamDefSchema>;\n\n/** A param that carries a value (not a label heading, not a row container). */\nexport type ValueParamDef = Exclude<ParamDef, { type: \"label\" | \"row\" }>;\n\n/** The value-carrying params of a table, row items flattened in place —\n * what defaults, `params` records, checks and visibility work on. */\nexport const valueParams = (\n defs: readonly ParamDef[],\n): ValueParamDef[] =>\n defs.flatMap((d): ValueParamDef[] =>\n d.type === \"label\" ? [] : d.type === \"row\" ? d.items : [d],\n );\n\n/** Why `value` doesn't fit `def`, or null when it does. */\nexport const paramMismatch = (def: ValueParamDef, value: unknown): string | null => {\n switch (def.type) {\n case \"number\":\n if (typeof value !== \"number\" || !Number.isFinite(value))\n return \"expected a number\";\n if (def.integer && !Number.isInteger(value))\n return \"expected a whole number\";\n if (def.min !== undefined && value < def.min)\n return `below the minimum ${def.min}`;\n if (def.max !== undefined && value > def.max)\n return `above the maximum ${def.max}`;\n return null;\n case \"string\":\n case \"textStyle\":\n case \"dimStyle\":\n case \"font\":\n case \"lineType\":\n case \"hatchPattern\":\n // Resource ids / names: an unknown one falls back where it's used\n // (first style, default font…), like a stored object's would.\n return typeof value === \"string\" ? null : \"expected a string\";\n case \"boolean\":\n return typeof value === \"boolean\" ? null : \"expected true or false\";\n case \"numberList\": {\n if (\n !Array.isArray(value) ||\n !value.every((v) => typeof v === \"number\" && Number.isFinite(v))\n )\n return \"expected an array of numbers\";\n const low = value.find((v) => def.min !== undefined && v < def.min);\n if (low !== undefined) return `${low} is below the minimum ${def.min}`;\n const high = value.find((v) => def.max !== undefined && v > def.max);\n if (high !== undefined) return `${high} is above the maximum ${def.max}`;\n return null;\n }\n case \"color\":\n return typeof value === \"string\" && HEX_COLOR.test(value)\n ? null\n : 'expected a \"#rrggbb\" color';\n case \"stringList\":\n return Array.isArray(value) && value.every((v) => typeof v === \"string\")\n ? null\n : \"expected an array of strings\";\n case \"enum\":\n return def.options.some((o) => o.value === value)\n ? null\n : `expected one of ${def.options.map((o) => JSON.stringify(o.value)).join(\", \")}`;\n case \"data\":\n return z.json().safeParse(value).success ? null : \"expected JSON data\";\n default:\n return \"a label carries no value\";\n }\n};\n\n// ---------------------------------------------------------------------------\n// Declared inputs — the NAMED input table blocks and commands share\n// (docs/block-inputs-and-handles.md §1). Kept in step with calculus's\n// InputDefSchema. A module with a table stores/receives its inputs as a\n// record keyed by name; the older label forms (a block's `place` labels,\n// a command's `inputs: [\"Start\", \"End\"]`) normalize to a POSITIONAL table\n// of `point` inputs and keep the array shape.\n// ---------------------------------------------------------------------------\n\nconst inputBase = {\n /** JS identifier — read as `inputs.<name>`. */\n name: z.string().regex(/^[a-zA-Z_]\\w*$/),\n /** Pick prompt / panel caption (default: the name). */\n label: z.string().optional(),\n description: z.string().optional(),\n};\n/** Every ModelObject `type` (the drift check pins it to the union). */\nexport const OBJECT_TYPE_NAMES = [\n \"point\",\n \"line\",\n \"polyline\",\n \"circle\",\n \"arc\",\n \"ellipse\",\n \"hatch\",\n \"text\",\n \"dimension\",\n \"block\",\n \"comment\",\n \"table\",\n \"viewport\",\n \"reference\",\n] as const;\n\n/** `types` filters picks by ModelObject `type`; empty accepts any object. */\nconst objectTypes = z.array(z.enum(OBJECT_TYPE_NAMES)).default([]);\n\nexport const InputDefSchema = z.discriminatedUnion(\"type\", [\n z.object({\n ...inputBase,\n type: z.literal(\"point\"),\n /** Enter skips it at insertion; absent → `undefined` in `draw`. */\n optional: z.boolean().optional(),\n }),\n z.object({\n ...inputBase,\n type: z.literal(\"points\"),\n min: z.number().int().min(0).default(1),\n max: z.number().int().min(1).optional(),\n /** A polygon (closing segment previewed + editable) vs an open chain. */\n closed: z.boolean().default(false),\n }),\n z.object({\n ...inputBase,\n type: z.literal(\"object\"),\n types: objectTypes,\n /** Enter skips it at insertion; absent → `null` in `draw`. */\n optional: z.boolean().optional(),\n }),\n z.object({\n ...inputBase,\n type: z.literal(\"objects\"),\n types: objectTypes,\n min: z.number().int().min(0).default(1),\n max: z.number().int().min(1).optional(),\n }),\n // The block instance this one LIVES ON (docs/block-inputs-and-handles.md\n // §6): stored as its id; this instance draws in the host's frame, the\n // host's draw sees it in `hosted`. `types` = accepted DEFINITION ids.\n z.object({\n ...inputBase,\n type: z.literal(\"host\"),\n types: z.array(z.string()).default([]),\n }),\n]);\nexport type InputDef = z.infer<typeof InputDefSchema>;\n\nconst InputTableSchema = z\n .array(InputDefSchema)\n .superRefine((defs, ctx) => {\n const seen = new Set<string>();\n defs.forEach((d, i) => {\n if (seen.has(d.name))\n ctx.addIssue({\n code: \"custom\",\n path: [i, \"name\"],\n message: `duplicate input name \"${d.name}\"`,\n });\n seen.add(d.name);\n if (d.type === \"host\" && defs.findIndex((x) => x.type === \"host\") !== i)\n ctx.addIssue({\n code: \"custom\",\n path: [i, \"type\"],\n message: \"a block lives on ONE host — declare one `host` input\",\n });\n if (\n (d.type === \"points\" || d.type === \"objects\") &&\n d.max !== undefined &&\n d.max < d.min\n )\n ctx.addIssue({\n code: \"custom\",\n path: [i, \"max\"],\n message: \"max is below min\",\n });\n });\n });\n\n/**\n * A module's `inputs` table, validated with an author-facing error. Names\n * must not clash with the module's param names (the Properties panel shows\n * both). Absent → undefined (the module uses the positional forms).\n */\nexport const parseInputTable = (\n raw: unknown,\n params: readonly ParamDef[],\n): InputDef[] | undefined => {\n if (raw === undefined) return undefined;\n const parsed = InputTableSchema.safeParse(raw);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n throw new Error(\n `Invalid \\`inputs\\` table${\n issue ? ` — ${issue.path.join(\".\") || \"inputs\"}: ${issue.message}` : \"\"\n }`,\n );\n }\n const paramNames = new Set(valueParams(params).map((p) => p.name));\n for (const d of parsed.data)\n if (paramNames.has(d.name))\n throw new Error(\n `Input \"${d.name}\" has the same name as a parameter — rename one`,\n );\n return parsed.data;\n};\n\n/** The positional table a list of point labels stands for. */\nexport const labelsToInputTable = (labels: readonly string[]): InputDef[] =>\n labels.map((label, i) => ({ name: `p${i}`, label, type: \"point\" }));\n\n// NOTE: there is no BlockDefinition record anymore — a block IS an ES module\n// (JavaScript or TypeScript) whose source string lives in\n// `LineaDocument.blockDefinitions`. Identity and metadata (`id`, `name`,\n// `params`) are the module's own exports, derived via `getBlockMeta`\n// (blocks/evalBlock.ts). The schemas here only describe the shape of the\n// `params` export.\n","// Segment / line utilities. All in world mm.\n\nimport type { Vec2 } from \"./vec2\";\nimport { add, cross, dist, dot, lenSq, scale, sub } from \"./vec2\";\n\nexport interface Segment {\n a: Vec2;\n b: Vec2;\n}\n\n/** Parameter t of the projection of p onto the infinite line through a-b (t=0 at a, t=1 at b). */\nexport const projectParam = (p: Vec2, a: Vec2, b: Vec2): number => {\n const ab = sub(b, a);\n const l2 = lenSq(ab);\n if (l2 === 0) return 0;\n return dot(sub(p, a), ab) / l2;\n};\n\n/** Closest point to p on the infinite line through a-b. */\nexport const projectOntoLine = (p: Vec2, a: Vec2, b: Vec2): Vec2 =>\n add(a, scale(sub(b, a), projectParam(p, a, b)));\n\n/** Closest point to p on the segment a-b. */\nexport const closestPointOnSegment = (p: Vec2, a: Vec2, b: Vec2): Vec2 => {\n const t = Math.max(0, Math.min(1, projectParam(p, a, b)));\n return add(a, scale(sub(b, a), t));\n};\n\nexport const distToSegment = (p: Vec2, a: Vec2, b: Vec2): number =>\n dist(p, closestPointOnSegment(p, a, b));\n\n/**\n * Intersection of infinite lines (p1-p2) and (p3-p4).\n * Returns null when parallel.\n */\nexport const lineLineIntersection = (\n p1: Vec2,\n p2: Vec2,\n p3: Vec2,\n p4: Vec2,\n): Vec2 | null => {\n const d1 = sub(p2, p1);\n const d2 = sub(p4, p3);\n const denom = cross(d1, d2);\n if (Math.abs(denom) < 1e-12) return null;\n const t = cross(sub(p3, p1), d2) / denom;\n return add(p1, scale(d1, t));\n};\n\n/**\n * Intersection point of segments a1-a2 and b1-b2, or null.\n * Endpoint touches count as intersections.\n */\nexport const segSegIntersection = (\n a1: Vec2,\n a2: Vec2,\n b1: Vec2,\n b2: Vec2,\n): Vec2 | null => {\n const d1 = sub(a2, a1);\n const d2 = sub(b2, b1);\n const denom = cross(d1, d2);\n if (Math.abs(denom) < 1e-12) return null;\n const t = cross(sub(b1, a1), d2) / denom;\n const u = cross(sub(b1, a1), d1) / denom;\n const eps = 1e-9;\n if (t < -eps || t > 1 + eps || u < -eps || u > 1 + eps) return null;\n return add(a1, scale(d1, t));\n};\n\n/** Reflect a point across the infinite line through a-b. */\nexport const reflectAcrossLine = (p: Vec2, a: Vec2, b: Vec2): Vec2 => {\n const foot = projectOntoLine(p, a, b);\n return { x: 2 * foot.x - p.x, y: 2 * foot.y - p.y };\n};\n\n/** Does segment a1-a2 intersect the axis-aligned rect (used by crossing selection)? */\nexport const segIntersectsRect = (\n a: Vec2,\n b: Vec2,\n min: Vec2,\n max: Vec2,\n): boolean => {\n // Either endpoint inside\n const inside = (p: Vec2) =>\n p.x >= min.x && p.x <= max.x && p.y >= min.y && p.y <= max.y;\n if (inside(a) || inside(b)) return true;\n // Or the segment crosses one of the 4 edges\n const corners = [\n { x: min.x, y: min.y },\n { x: max.x, y: min.y },\n { x: max.x, y: max.y },\n { x: min.x, y: max.y },\n ];\n for (let i = 0; i < 4; i++) {\n if (segSegIntersection(a, b, corners[i], corners[(i + 1) % 4])) return true;\n }\n return false;\n};\n","import type { Hatch, ModelObject, ModelObjectDto } from \"./model/objects\";\nimport type { Vec2 } from \"./geometry/vec2\";\nimport {\n add,\n angle,\n fromAngle,\n normAngle,\n rot,\n rotAround,\n scale,\n sub,\n} from \"./geometry/vec2\";\nimport { reflectAcrossLine } from \"./geometry/line\";\nimport {\n inputPoints,\n inputRefs,\n mapInputPoints,\n mapInputValues,\n} from \"./model/blockInputs\";\n\n/** Clone an object without its id (the funnel stamps a fresh one on add). */\nexport const stripId = (obj: ModelObject): ModelObjectDto => {\n const clone: Partial<ModelObject> = { ...obj };\n delete clone.id;\n return clone as ModelObjectDto;\n};\n\n/**\n * Remap a block instance's object-reference inputs through an old→new id\n * map (ids absent from the map pass through untouched). Non-block objects\n * return unchanged.\n */\nexport const remapBlockInputRefs = (\n obj: ModelObject,\n idMap: ReadonlyMap<string, string>,\n): ModelObject => {\n if (obj.type !== \"block\") return obj;\n if (!inputRefs(obj.inputs).some((v) => idMap.has(v))) return obj;\n return {\n ...obj,\n inputs: mapInputValues(obj.inputs, (v) =>\n typeof v === \"string\" ? (idMap.get(v) ?? v) : v,\n ),\n };\n};\n\n/**\n * Clone a batch for duplication (copy / array / mirror-copy / paste): fresh\n * ids, with block object-reference inputs that point INSIDE the batch\n * following to the clones — a copied annotation tracks the copied geometry,\n * not the original. References to objects outside the batch keep pointing\n * at the originals (dangling ones stay dangling and evaluate as null).\n */\nexport const duplicateObjects = (\n objects: readonly ModelObject[],\n): ModelObject[] => {\n const idMap = new Map(objects.map((o) => [o.id, crypto.randomUUID()]));\n return objects.map((o) => ({\n ...remapBlockInputRefs(o, idMap),\n id: idMap.get(o.id) ?? o.id,\n }));\n};\n\ntype BlockObj = Extract<ModelObject, { type: \"block\" }>;\n\n/**\n * Map a block's input points (world coords) through a point transform.\n * Instances carry their pose IN these points — transforms move the points\n * and the script re-derives direction/size, which is also what makes mirror\n * come out right for script-derived geometry. Reference values (strings)\n * pass through untouched.\n */\nconst mapBlockInputPoints = (\n obj: BlockObj,\n fn: (p: Vec2) => Vec2,\n): BlockObj[\"inputs\"] => mapInputPoints(obj.inputs, fn);\n\n/**\n * With ≥2 point inputs the pose is fully determined by the points — the\n * rotation/scale fields stay untouched under transforms (accumulating them\n * on top would double-apply). A single-point instance is a classic symbol:\n * its point only carries position, so rotate/scale/mirror ALSO accumulate\n * the instance fields (applied last, about that point). ANY object-reference\n * input also disqualifies accumulation: geometry derived from the referenced\n * object already follows it, so accumulating rotation/scale on top would\n * double-apply when the reference transforms along (e.g. rotating a\n * selection holding both the instance and its referenced object).\n */\nconst pointsCarryPose = (obj: BlockObj): boolean =>\n inputRefs(obj.inputs).length > 0 || inputPoints(obj.inputs).length >= 2;\n\n/**\n * Map every point field of an object through `fn` (polyline/hatch vertices\n * keep their bulges; viewports pass through untouched). The four transforms\n * layer their per-type scalar/angle/bulge fixups on top.\n */\nconst mapObjectPoints = (\n obj: ModelObject,\n fn: (p: Vec2) => Vec2,\n): ModelObject => {\n switch (obj.type) {\n case \"line\":\n return { ...obj, a: fn(obj.a), b: fn(obj.b) };\n case \"point\":\n return { ...obj, p: fn(obj.p) };\n case \"polyline\":\n return { ...obj, points: obj.points.map((v) => ({ ...v, ...fn(v) })) };\n case \"circle\":\n case \"arc\":\n case \"ellipse\":\n return { ...obj, center: fn(obj.center) };\n case \"hatch\":\n return {\n ...obj,\n // The pattern frame moves with its region, as in AutoCAD — an\n // unanchored fill's frame is the drawing origin, which moves along\n // too (else the pattern would swim inside a moved hatch).\n fill:\n obj.fill.kind === \"pattern\"\n ? { ...obj.fill, origin: fn(obj.fill.origin ?? { x: 0, y: 0 }) }\n : obj.fill,\n loops: obj.loops.map((loop) => ({\n points: loop.points.map((v) => ({ ...v, ...fn(v) })),\n })),\n };\n case \"text\":\n return {\n ...obj,\n position: fn(obj.position),\n leaderLines: obj.leaderLines.map((l) => l.map(fn)),\n };\n case \"dimension\":\n // offset is anchor-relative — the caller decides how it maps.\n return { ...obj, points: obj.points.map(fn) };\n case \"block\":\n return { ...obj, inputs: mapBlockInputPoints(obj, fn) };\n case \"viewport\":\n return obj;\n case \"comment\":\n // The marker stays upright (screen-chrome-like): only the pin moves.\n return { ...obj, position: fn(obj.position) };\n case \"table\":\n return { ...obj, position: fn(obj.position) };\n case \"reference\":\n return { ...obj, position: fn(obj.position) };\n }\n};\n\n/** Pure translation of any model object by a world-space delta. */\nexport const translateObject = (obj: ModelObject, delta: Vec2): ModelObject => {\n const mapped = mapObjectPoints(obj, (p) => add(p, delta));\n return mapped.type === \"viewport\"\n ? {\n ...mapped,\n rect: {\n ...mapped.rect,\n x: mapped.rect.x + delta.x,\n y: mapped.rect.y + delta.y,\n },\n }\n : mapped;\n};\n\n/** Translate a viewport so its frame center lands on `newCenter` of `map`. */\nconst moveViewportCenter = (\n obj: Extract<ModelObject, { type: \"viewport\" }>,\n map: (p: Vec2) => Vec2,\n): ModelObject => {\n const c = {\n x: obj.rect.x + obj.rect.w / 2,\n y: obj.rect.y + obj.rect.h / 2,\n };\n const nc = map(c);\n return translateObject(obj, sub(nc, c));\n};\n\n/** A hatch fill with its line angle remapped (pattern and lines fills have\n * one; solid and gradient fills are direction-free). */\nconst turnFill = (\n fill: Hatch[\"fill\"],\n f: (angle: number) => number,\n): Hatch[\"fill\"] =>\n fill.kind === \"pattern\" || fill.kind === \"lines\"\n ? { ...fill, angle: f(fill.angle) }\n : fill;\n\n/** Pure rotation of any model object around a center by `ang` radians CCW. */\nexport const rotateObject = (\n obj: ModelObject,\n center: Vec2,\n ang: number,\n): ModelObject => {\n const r = (p: Vec2) => rotAround(p, center, ang);\n const mapped = mapObjectPoints(obj, r);\n switch (mapped.type) {\n case \"arc\":\n return {\n ...mapped,\n startAngle: normAngle(mapped.startAngle + ang),\n endAngle: normAngle(mapped.endAngle + ang),\n };\n case \"ellipse\":\n return { ...mapped, majorAxis: rot(mapped.majorAxis, ang) };\n case \"text\":\n case \"table\":\n return { ...mapped, rotation: mapped.rotation + ang };\n case \"dimension\":\n // Labels live in the segments' own frames; only a locked measuring\n // axis has to turn with the geometry.\n return mapped.rotation === undefined\n ? mapped\n : { ...mapped, rotation: mapped.rotation + ang };\n case \"block\":\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, rotation: mapped.rotation + ang };\n case \"viewport\":\n // Frames stay axis-aligned: the placement orbits, content unrotated.\n return moveViewportCenter(mapped, r);\n case \"reference\":\n return { ...mapped, rotation: normAngle(mapped.rotation + ang) };\n case \"hatch\":\n // The pattern turns with its region (CAD semantics: a hatch's lines\n // are part of the object, not of the drawing's frame).\n return { ...mapped, fill: turnFill(mapped.fill, (a) => a + ang) };\n case \"line\":\n case \"point\":\n case \"polyline\":\n case \"circle\":\n case \"comment\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n\n/** Pure uniform scale of any model object about the origin. */\nexport const scaleObjectUniform = (\n obj: ModelObject,\n s: number,\n): ModelObject => {\n const m = (p: Vec2): Vec2 => ({ x: p.x * s, y: p.y * s });\n const mapped = mapObjectPoints(obj, m);\n switch (mapped.type) {\n case \"circle\":\n case \"arc\":\n return { ...mapped, radius: mapped.radius * s };\n case \"ellipse\":\n return { ...mapped, majorAxis: m(mapped.majorAxis) };\n case \"hatch\":\n return {\n ...mapped,\n fill:\n mapped.fill.kind === \"lines\"\n ? { ...mapped.fill, spacing: mapped.fill.spacing * s }\n : mapped.fill.kind === \"pattern\"\n ? { ...mapped.fill, scale: mapped.fill.scale * s }\n : mapped.fill,\n };\n case \"text\":\n case \"table\":\n // `scale` multiplies textHeight/arrowSize/width at paint time\n // (textGeometry), covering own AND inherited sizes — scaling\n // styleOverride or width here too would apply s twice.\n return { ...mapped, scale: mapped.scale * s };\n case \"dimension\":\n return {\n ...mapped,\n ...(mapped.offset === undefined ? {} : { offset: mapped.offset * s }),\n labels: mapped.labels.map((l) => ({\n ...l,\n ...(l.along === undefined ? {} : { along: l.along * s }),\n ...(l.across === undefined ? {} : { across: l.across * s }),\n })),\n scale: mapped.scale * s,\n };\n case \"block\":\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, scale: mapped.scale * s };\n case \"viewport\":\n // Frame and view scale together: the same model window, s× larger.\n return {\n ...mapped,\n rect: {\n x: mapped.rect.x * s,\n y: mapped.rect.y * s,\n w: mapped.rect.w * s,\n h: mapped.rect.h * s,\n },\n // Same model window through an s× frame: the 1:N denominator (model\n // mm per paper mm) shrinks as the frame grows.\n scale: mapped.scale / s,\n };\n case \"reference\":\n return { ...mapped, scale: mapped.scale * s };\n case \"point\":\n // The point dot's size is a lineweight, not geometry — position only.\n return mapped;\n case \"line\":\n case \"polyline\":\n case \"comment\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n\n/**\n * Pure mirror of any model object across the line a-b. Reflection reverses\n * orientation: bulges negate and CCW angle ranges swap ends.\n * Block instances only reflect their insertion point/rotation (their child\n * geometry is not handed — documented v1 limitation).\n */\nexport const mirrorObject = (\n obj: ModelObject,\n a: Vec2,\n b: Vec2,\n): ModelObject => {\n const m = (p: Vec2) => reflectAcrossLine(p, a, b);\n const axisAngle = angle(sub(b, a));\n const mirrorAngle = (t: number) => normAngle(2 * axisAngle - t);\n if (obj.type === \"ellipse\") {\n const center = m(obj.center);\n const majorAxis = sub(m(add(obj.center, obj.majorAxis)), center);\n return {\n ...obj,\n center: center,\n majorAxis,\n startAngle: normAngle(-obj.endAngle),\n endAngle: normAngle(-obj.startAngle),\n };\n }\n if (obj.type === \"reference\") {\n // A true reflection: the insertion point reflects and the left-right\n // flip toggles — Ref(α)·R(θ) = R(2α−θ+π)·flipX, and flipX² = I either\n // way — content, text included, mirrors.\n return {\n ...obj,\n position: m(obj.position),\n rotation: normAngle(mirrorAngle(obj.rotation) + Math.PI),\n mirrored: !obj.mirrored,\n };\n }\n if (obj.type === \"table\") {\n // Readable like text (MIRRTEXT=0): the TOP EDGE reflects and the table\n // keeps hanging down from it. When the reflected baseline is flipped\n // 180° to stay readable, the reflected top-RIGHT becomes the new\n // top-left. Only the width is needed (the height depends on measured\n // text, which transforms can't see).\n const width = obj.columns.reduce((a, w) => a + w, 0) * obj.scale;\n const topRight = add(obj.position, scale(fromAngle(obj.rotation), width));\n const reflected = normAngle(mirrorAngle(obj.rotation));\n const readable =\n reflected <= Math.PI / 2 + 1e-9 || reflected > (3 * Math.PI) / 2 + 1e-9;\n return {\n ...obj,\n position: m(readable ? obj.position : topRight),\n rotation: readable ? reflected : normAngle(reflected + Math.PI),\n };\n }\n const mapped = mapObjectPoints(obj, m);\n switch (mapped.type) {\n case \"polyline\":\n return {\n ...mapped,\n points: mapped.points.map((v) => ({ ...v, bulge: -v.bulge })),\n };\n case \"arc\":\n return {\n ...mapped,\n startAngle: mirrorAngle(mapped.endAngle),\n endAngle: mirrorAngle(mapped.startAngle),\n };\n case \"hatch\":\n return {\n ...mapped,\n fill: turnFill(mapped.fill, mirrorAngle),\n loops: mapped.loops.map((loop) => ({\n points: loop.points.map((v) => ({ ...v, bulge: -v.bulge })),\n })),\n };\n case \"text\": {\n // Keep glyphs READABLE (CAD MIRRTEXT=0): the anchor and leaders\n // reflect, but when the reflected baseline would run upside-down\n // (outside the (-90°, 90°] reading band) it flips 180° and the\n // horizontal alignment swaps so the text covers the mirrored extent.\n const reflected = normAngle(mirrorAngle(mapped.rotation));\n const readable =\n reflected <= Math.PI / 2 + 1e-9 || reflected > (3 * Math.PI) / 2 + 1e-9;\n const swap = { left: \"right\", center: \"center\", right: \"left\" } as const;\n return {\n ...mapped,\n rotation: readable ? reflected : normAngle(reflected + Math.PI),\n hAlign: readable ? mapped.hAlign : swap[mapped.hAlign],\n };\n }\n case \"dimension\": {\n // Reflection flips handedness: a locked axis reflects, the signed\n // offset (which side the line is on / which arc) negates, and the\n // handed label frames of radial and diameter dims negate `across`\n // (linear and angular frames follow the offset, so theirs hold).\n const handed = mapped.kind === \"radial\" || mapped.kind === \"diameter\";\n return {\n ...mapped,\n ...(mapped.rotation === undefined\n ? {}\n : { rotation: mirrorAngle(mapped.rotation) }),\n ...(mapped.offset === undefined ? {} : { offset: -mapped.offset }),\n labels: handed\n ? mapped.labels.map((l) =>\n l.across === undefined ? l : { ...l, across: -l.across },\n )\n : mapped.labels,\n };\n }\n case \"block\":\n // Multi-point: reflected points make script-derived geometry mirror\n // correctly (single-point child geometry still can't reflect — the\n // rotation flip below only orbits it).\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, rotation: mirrorAngle(mapped.rotation) };\n case \"viewport\":\n // Frames stay axis-aligned: only the placement reflects.\n return moveViewportCenter(mapped, m);\n case \"line\":\n case \"point\":\n case \"circle\":\n case \"comment\":\n return mapped;\n // Mirrored above, before the point map.\n case \"ellipse\":\n case \"reference\":\n case \"table\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n","// The named input table at runtime (docs/block-inputs-and-handles.md §1),\n// shared by blocks and commands:\n// - acquireInputTable: walk the table with the HOST's pickers (editor\n// picks, dry-run stand-ins) into a stored record, in table order.\n// - checkNamedInputs: strict validation of a record someone SUPPLIED (a\n// headless caller, an agent, a `place` function's return) — unknown\n// names, wrong kinds, counts outside min/max throw before anything runs.\n// - resolveNamedInputs: a stored record → what `draw` receives (points\n// pivot-localized, references resolved).\n// Optional `point` / `object` inputs are acquired as a list of at most one\n// (Enter skips), so hosts need no extra picker for them.\n\nimport { Vec2Schema } from \"../model/common\";\nimport type { InputDef } from \"../model/blockDefinition\";\nimport type {\n InputValue,\n NamedInputValue,\n StoredInputs,\n} from \"../model/blockInputs\";\nimport { isNamedInputs } from \"../model/blockInputs\";\nimport type { ModelObject } from \"../model/objects\";\nimport { sub, type Vec2 } from \"../geometry/vec2\";\nimport { translateObject } from \"../transform\";\n\nexport type NamedInputs = Record<string, NamedInputValue>;\n\ntype Def<T extends InputDef[\"type\"]> = Extract<InputDef, { type: T }>;\n\n/** How a host acquires each kind of input. Rejections (the user pressing\n * Escape) propagate and cancel the whole acquisition. */\nexport interface InputPickers {\n /** One point. `ref` = the previous picked point (rubber band). */\n point(def: Def<\"point\">, ref: Vec2 | undefined): Promise<Vec2>;\n /** A list of points, finished by Enter / right-click once `min` is met\n * (`max` ends it automatically). */\n points(\n def: { label: string; min: number; max?: number; closed: boolean },\n ref: Vec2 | undefined,\n ): Promise<Vec2[]>;\n /** One object id, filtered by `types`. */\n object(def: Def<\"object\">): Promise<string>;\n /** Several object ids — hosts take the current selection when it fits\n * (see `selectionFits`), otherwise pick until Enter. */\n objects(def: {\n label: string;\n types: readonly string[];\n min: number;\n max?: number;\n }): Promise<string[]>;\n /** The block instance to live on: a click on a block of an accepted\n * definition (`types` = definition ids) — its id and the clicked point\n * (world), which `attach` turns into params. */\n host?(def: Def<\"host\">): Promise<{ id: string; point: Vec2 }>;\n /** Called before each input is acquired — for previews. */\n progress?(acquired: Readonly<NamedInputs>, next: InputDef): void;\n}\n\n/** Extra results of a walk: where the host was clicked (world). */\nexport interface AcquireExtras {\n hostPoint?: Vec2;\n}\n\nexport const inputLabel = (def: InputDef): string => def.label ?? def.name;\n\n/** Does a selection satisfy an `objects` input (calculus's rule: every\n * object passes the type filter and the count is within min/max)? */\nexport const selectionFits = (\n def: { types: readonly string[]; min: number; max?: number },\n selected: readonly ModelObject[],\n): boolean =>\n selected.length > 0 &&\n selected.length >= def.min &&\n (def.max === undefined || selected.length <= def.max) &&\n selected.every((o) => def.types.length === 0 || def.types.includes(o.type));\n\n/** Walk the table, in order, into a stored record (table key order). */\nexport const acquireInputTable = async (\n table: readonly InputDef[],\n pickers: InputPickers,\n extras: AcquireExtras = {},\n): Promise<NamedInputs> => {\n const out: NamedInputs = {};\n let last: Vec2 | undefined;\n for (const def of table) {\n pickers.progress?.(out, def);\n const label = inputLabel(def);\n switch (def.type) {\n case \"point\":\n if (def.optional) {\n const [p] = await pickers.points(\n { label, min: 0, max: 1, closed: false },\n last,\n );\n if (p) out[def.name] = last = p;\n } else out[def.name] = last = await pickers.point(def, last);\n break;\n case \"points\": {\n const pts = await pickers.points({ ...def, label }, last);\n out[def.name] = pts;\n last = pts[pts.length - 1] ?? last;\n break;\n }\n case \"object\":\n if (def.optional) {\n const [id] = await pickers.objects({\n label,\n types: def.types,\n min: 0,\n max: 1,\n });\n if (id !== undefined) out[def.name] = id;\n } else out[def.name] = await pickers.object(def);\n break;\n case \"objects\":\n out[def.name] = await pickers.objects({ ...def, label });\n break;\n case \"host\": {\n if (!pickers.host)\n throw new Error(`\"${def.name}\" needs a host block — pick it in the editor`);\n const picked = await pickers.host(def);\n out[def.name] = picked.id;\n extras.hostPoint = picked.point;\n break;\n }\n }\n }\n return out;\n};\n\n/** Must a caller supply it (no Enter-skip, list `min` above 0)? */\nexport const isRequiredInput = (def: InputDef): boolean =>\n def.type === \"host\"\n ? true\n : def.type === \"point\" || def.type === \"object\"\n ? !def.optional\n : def.min > 0;\n\nconst countIssue = (\n def: { min: number; max?: number },\n n: number,\n): string | null =>\n n < def.min\n ? `needs at least ${def.min}`\n : def.max !== undefined && n > def.max\n ? `takes at most ${def.max}`\n : null;\n\n/**\n * Validate SUPPLIED named inputs against the table — strictly, with errors\n * naming `who` and the input. Points accept [x, y]; references must\n * resolve (when `lookup` is given) and pass the type filter. Every input\n * NOT supplied is returned in `missing` (table order) — an editor picks\n * them all (optional ones skippable), a headless caller rejects only the\n * required ones (isRequiredInput) and leaves the rest absent / empty.\n */\nexport const checkNamedInputs = (\n who: string,\n table: readonly InputDef[],\n given: unknown,\n lookup?: (id: string) => ModelObject | undefined,\n): { inputs: NamedInputs; missing: InputDef[] } => {\n if (given === undefined || given === null) given = {};\n if (typeof given !== \"object\" || Array.isArray(given))\n throw new Error(\n `${who}: inputs must be passed by name (${\n table.map((d) => d.name).join(\", \") || \"none declared\"\n })`,\n );\n const record = given as Record<string, unknown>;\n for (const name of Object.keys(record))\n if (!table.some((d) => d.name === name))\n throw new Error(\n `${who}: unknown input \"${name}\"${\n table.length ? ` (declares ${table.map((d) => d.name).join(\", \")})` : \"\"\n }`,\n );\n const point = (name: string, v: unknown): Vec2 => {\n const parsed = Vec2Schema.safeParse(v);\n if (!parsed.success)\n throw new Error(`${who}: input \"${name}\" — expected a point [x, y]`);\n return parsed.data;\n };\n const ref = (def: Def<\"object\"> | Def<\"objects\">, v: unknown): string => {\n if (typeof v !== \"string\")\n throw new Error(`${who}: input \"${def.name}\" — expected an object id`);\n if (lookup) {\n const obj = lookup(v);\n if (!obj)\n throw new Error(`${who}: input \"${def.name}\" — no object with id ${v}`);\n if (def.types.length > 0 && !def.types.includes(obj.type))\n throw new Error(\n `${who}: input \"${def.name}\" — ${obj.type} is not one of ${def.types.join(\", \")}`,\n );\n }\n return v;\n };\n const inputs: NamedInputs = {};\n const missing: InputDef[] = [];\n for (const def of table) {\n const v = record[def.name];\n if (v === undefined) {\n missing.push(def);\n continue;\n }\n switch (def.type) {\n case \"point\":\n inputs[def.name] = point(def.name, v);\n break;\n case \"object\":\n inputs[def.name] = ref(def, v);\n break;\n case \"host\": {\n if (typeof v !== \"string\")\n throw new Error(`${who}: input \"${def.name}\" — expected a block id`);\n const host = lookup?.(v);\n if (lookup && host?.type !== \"block\")\n throw new Error(`${who}: input \"${def.name}\" — no block with id ${v}`);\n if (\n host?.type === \"block\" &&\n def.types.length > 0 &&\n !def.types.includes(host.definitionId)\n )\n throw new Error(\n `${who}: input \"${def.name}\" — a \"${host.definitionId}\" can't host this (takes ${def.types.join(\", \")})`,\n );\n inputs[def.name] = v;\n break;\n }\n case \"points\":\n case \"objects\": {\n if (!Array.isArray(v))\n throw new Error(`${who}: input \"${def.name}\" — expected an array`);\n const issue = countIssue(def, v.length);\n if (issue) throw new Error(`${who}: input \"${def.name}\" ${issue}`);\n inputs[def.name] =\n def.type === \"points\"\n ? v.map((p) => point(def.name, p))\n : v.map((id) => ref(def, id));\n break;\n }\n }\n }\n return { inputs, missing };\n};\n\n/** Absent list inputs as empty lists (what `ctx.inputs` promises). */\nexport const withEmptyLists = (\n table: readonly InputDef[],\n inputs: NamedInputs,\n): NamedInputs => {\n const out: NamedInputs = {};\n for (const def of table) {\n const v =\n inputs[def.name] ??\n (def.type === \"points\" || def.type === \"objects\" ? [] : undefined);\n if (v !== undefined) out[def.name] = v;\n }\n return out;\n};\n\n/**\n * A POSITIONAL array stored before its module declared a table: values are\n * dealt to the table in order — `point` / `object` take the next value of\n * their kind, `points` / `objects` take the run of that kind that follows.\n */\nexport const namedFromPositional = (\n table: readonly InputDef[],\n values: readonly InputValue[],\n): NamedInputs => {\n const out: NamedInputs = {};\n let i = 0;\n const isPoint = (v: InputValue | undefined): v is Vec2 =>\n v !== undefined && typeof v !== \"string\";\n const isRef = (v: InputValue | undefined): v is string =>\n typeof v === \"string\";\n for (const def of table) {\n if (def.type === \"point\") {\n if (isPoint(values[i])) out[def.name] = values[i++] as Vec2;\n } else if (def.type === \"object\" || def.type === \"host\") {\n if (isRef(values[i])) out[def.name] = values[i++] as string;\n } else if (def.type === \"points\") {\n const run: Vec2[] = [];\n while (isPoint(values[i])) run.push(values[i++] as Vec2);\n out[def.name] = run;\n } else {\n const run: string[] = [];\n while (isRef(values[i])) run.push(values[i++] as string);\n out[def.name] = run;\n }\n }\n return out;\n};\n\n/** A stored record (or a pre-table positional array) as named values. */\nexport const namedInputsOf = (\n table: readonly InputDef[],\n stored: StoredInputs,\n): NamedInputs =>\n isNamedInputs(stored) ? stored : namedFromPositional(table, stored);\n\n/** What one named input looks like in `draw`. */\nexport type ResolvedNamedInput =\n | Vec2\n | Vec2[]\n | ModelObject\n | ModelObject[]\n | null\n | undefined;\n\n/**\n * Stored named inputs → `draw`'s `inputs`: points localized against the\n * pivot, references resolved to the object (pivot-local) or null; lists\n * drop dangling references. A REQUIRED input that is missing (or a list\n * below its `min`) throws — the instance shows its evaluation error.\n */\nexport const resolveNamedInputs = (\n table: readonly InputDef[],\n stored: NamedInputs,\n pivot: Vec2,\n resolve: ((id: string) => ModelObject | undefined) | undefined,\n): Record<string, ResolvedNamedInput> => {\n const neg = { x: -pivot.x, y: -pivot.y };\n const obj = (id: string): ModelObject | null => {\n const o = resolve?.(id);\n return o ? translateObject(o, neg) : null;\n };\n const out: Record<string, ResolvedNamedInput> = Object.create(null);\n for (const def of table) {\n const v = stored[def.name];\n switch (def.type) {\n case \"point\":\n if (v !== undefined && typeof v === \"object\" && !Array.isArray(v))\n out[def.name] = sub(v, pivot);\n else if (!def.optional)\n throw new Error(`Missing input \"${def.name}\" — re-insert the block`);\n else out[def.name] = undefined;\n break;\n case \"object\":\n if (typeof v === \"string\") out[def.name] = obj(v);\n else if (!def.optional)\n throw new Error(`Missing input \"${def.name}\" — re-insert the block`);\n else out[def.name] = null;\n break;\n case \"points\": {\n const pts = Array.isArray(v)\n ? (v as InputValue[]).filter((p): p is Vec2 => typeof p !== \"string\")\n : [];\n if (pts.length < def.min)\n throw new Error(\n `Input \"${def.name}\" needs at least ${def.min} point${def.min === 1 ? \"\" : \"s\"}`,\n );\n out[def.name] = pts.map((p) => sub(p, pivot));\n break;\n }\n case \"host\":\n // Not an input `draw` reads: the host's EXPOSED data arrives as\n // `host` (evalBlock), and the frame is the host's.\n break;\n case \"objects\": {\n const ids = Array.isArray(v)\n ? (v as InputValue[]).filter((id): id is string => typeof id === \"string\")\n : [];\n out[def.name] = ids\n .map(obj)\n .filter((o): o is ModelObject => o !== null);\n break;\n }\n }\n }\n return out;\n};\n\n/** The host id dry runs and previews place a hosted block on: no real\n * instance — the block draws in its own frame and reads its module's\n * `previewHost` as `host` (evalBlock.ts). */\nexport const PREVIEW_HOST_ID = \"dry-run-host\";\n\n/** Stand-in pickers for dry runs / previews: points walk a small grid,\n * lists take `max(min, 2)` (3 for closed) capped at `max`, references get\n * a stand-in id the dry-run resolver serves. After `limit` single picks\n * they reject, so a `place` collecting \"until cancel\" terminates the way a\n * user's Escape would. */\nexport const dryRunInputPickers = (limit = 16): InputPickers => {\n let n = 0;\n let picks = 0;\n const guard = () => {\n if (picks++ >= limit)\n throw new Error(`Input picking canceled (dry-run limit of ${limit})`);\n };\n const next = (): Vec2 => {\n const i = n++;\n return { x: (i % 4) * 500, y: Math.floor(i / 4) * 500 };\n };\n const count = (d: { min: number; max?: number }, base: number) =>\n Math.min(Math.max(d.min, base), d.max ?? Infinity);\n return {\n point: async () => (guard(), next()),\n points: async (d) =>\n Array.from({ length: count(d, d.closed ? 3 : 2) }, next),\n object: async () => (guard(), \"dry-run-object\"),\n host: async () => ({ id: PREVIEW_HOST_ID, point: { x: 0, y: 0 } }),\n objects: async (d) =>\n Array.from({ length: count(d, 1) }, (_, i) => `dry-run-object-${i}`),\n };\n};\n\n/** `previewInputs` for a table module: the stored record shape, points as\n * [x, y] or {x, y}. Checked strictly against the table. */\nexport const parsePreviewNamedInputs = (\n table: readonly InputDef[],\n raw: unknown,\n): NamedInputs => {\n const { inputs, missing: absent } = checkNamedInputs(\n \"previewInputs\",\n table,\n raw,\n );\n const missing = absent.filter(isRequiredInput);\n if (missing.length > 0)\n throw new Error(\n `previewInputs is missing ${missing.map((d) => `\"${d.name}\"`).join(\", \")}`,\n );\n return inputs;\n};\n\n/** Where a flat value index (handle order, see mapInputValues) falls: the\n * named list holding it and the position inside — null for a single value\n * or a positional array. */\nexport const listInputAt = (\n inputs: StoredInputs,\n flatIndex: number,\n): { name: string; at: number } | null => {\n if (!isNamedInputs(inputs)) return null;\n let i = 0;\n for (const [name, v] of Object.entries(inputs)) {\n const n = Array.isArray(v) ? v.length : 1;\n if (flatIndex < i + n) return Array.isArray(v) ? { name, at: flatIndex - i } : null;\n i += n;\n }\n return null;\n};\n\n/**\n * Edit one `points` list of a stored record (docs/block-inputs-and-handles.md\n * §2): insert `p` BEFORE position `at` (at = length appends), or remove the\n * point at `at`. Returns null when the edit would leave the list outside\n * the input's `min` / `max` — callers never offer it then.\n */\nexport const editListInput = (\n inputs: NamedInputs,\n def: { name: string; min: number; max?: number },\n op: { insert: number; p: Vec2 } | { remove: number },\n): NamedInputs | null => {\n const list = inputs[def.name];\n if (!Array.isArray(list)) return null;\n const pts = list as Vec2[];\n if (\"insert\" in op) {\n if (def.max !== undefined && pts.length >= def.max) return null;\n if (op.insert < 0 || op.insert > pts.length) return null;\n return {\n ...inputs,\n [def.name]: [...pts.slice(0, op.insert), op.p, ...pts.slice(op.insert)],\n };\n }\n if (pts.length <= def.min || op.remove < 0 || op.remove >= pts.length)\n return null;\n return {\n ...inputs,\n [def.name]: pts.filter((_, i) => i !== op.remove),\n };\n};\n","// Parametric block evaluation. A block IS an ES module (JavaScript or\n// TypeScript): the document stores raw module sources, and everything the\n// app knows about a block derives from the module's exports —\n// id → identity (instances reference it via `definitionId`)\n// name → list/panel label\n// params → optional parameter declarations (ParamDef[], default []) — a\n// table literal OR a zero-arg pure function returning one (the\n// function form lets const data tables live at the end of the\n// file; it runs once per compiled module version)\n// draw({ params, inputs }) → child DTOs in block-LOCAL coordinates\n// (pure; runs on every evaluation). Object-id\n// inputs arrive RESOLVED: the referenced\n// object localized against the pivot, or null\n// when the reference is gone.\n// place({ params, pickPoint, pickObject })\n// → optional; runs ONCE at insertion and\n// interactively acquires the instance's\n// inputs array (points / object ids).\n// May instead be an ARRAY of point labels\n// (one pick per label, in order).\n// Absent → a single \"Insertion point\" pick.\n// paramVisibility({ params }) → optional; pure, re-run per properties-\n// panel render: which parameter rows to show\n// given the current values. Omitted names\n// stay visible; hidden values are KEPT and\n// still reach `draw`.\n// previewInputs → optional; author-curated inputs array for\n// previews/thumbnails (dryRunBlockInputs\n// prefers it over the stand-in pickers).\n// The pre-rename export names `main` (→ draw) and `defineInput` (→ place)\n// are FROZEN aliases, resolved at compile like the \"linea\" import\n// specifiers — documents and .block.ts files carrying them keep evaluating\n// forever.\n// A module may also `export default defineBlock({...})` (defineBlock is a\n// runtime identity from \"lineadraw\"; its overloads give full cross-member\n// type inference) — the default-exported spec carries the same members and\n// is normalized over the named exports at compile.\n// Scripts are transpiled with sucrase (typescript + imports → CJS) and\n// executed with `new Function` (calculus getProfile pattern — the user's own\n// code, same-origin, no sandbox by design) against a `require` shim that\n// resolves only the virtual modules: \"lineadraw/helpers\" (named geometry\n// helpers; \"lineadraw\" itself carries only types, plus the legacy `helpers`\n// object migration-wrapped scripts import) and their pre-rename \"linea\"\n// aliases. Output is zod-validated and\n// cached. Evaluation is\n// SYNC so render/snap paths can evaluate lazily without stalls; sucrase\n// itself is lazy-loaded — until it arrives evaluation reports a transient\n// error and `setScriptTranspilerReadyCallback` lets the host re-render.\n//\n// Instance pose: `inputs` is a flat array of world points (or id strings).\n// The PIVOT is the first point input. `draw` receives the points localized\n// against the pivot; its output is scaled, rotated (the instance fields,\n// applied last) and translated back to the pivot. Transforms map the input\n// points and the script recomputes — pose lives in the points.\n//\n// Object references: an id input resolves at evaluation time through the\n// caller-supplied resolver (the mutation owner's document lookup) into the\n// referenced object localized against the pivot — or null when it no longer\n// resolves. Which instance references which objects is recorded here\n// (instanceDeps) so the mutation owner can EXPAND its invalidation id lists\n// via `expandWithBlockDependents`: editing a referenced object then drops the\n// dependent instances' memo/snap entries and they re-evaluate on next paint.\n//\n// KERNEL SEAM: this module owns the caches but has no store. The mutation\n// owner (the editor's modelStore, a headless SDK session) calls\n// `invalidateBlockCache` from its own invalidation path, and the document's\n// script list is passed into `getEvaluatedWorldChildren` rather than read\n// from a global.\n\nimport { readListParam } from \"./paramLists\";\nimport {\n ParamDefSchema,\n labelsToInputTable,\n parseInputTable,\n valueParams,\n type InputDef,\n type ParamDef,\n} from \"../model/blockDefinition\";\nimport {\n inputPoints,\n inputRefs,\n inputValues,\n isNamedInputs,\n type StoredInputs,\n} from \"../model/blockInputs\";\nimport {\n acquireInputTable,\n checkNamedInputs,\n dryRunInputPickers,\n isRequiredInput,\n PREVIEW_HOST_ID,\n type AcquireExtras,\n namedInputsOf,\n parsePreviewNamedInputs,\n resolveNamedInputs,\n type InputPickers,\n type ResolvedNamedInput,\n} from \"./inputTable\";\nimport {\n blockPivot,\n DEFAULT_DIM_STYLE,\n DEFAULT_TEXT_STYLE,\n dimStyleFor,\n textStyleFor,\n type Block,\n type DimStyle,\n type ModelObject,\n type TextStyle,\n} from \"../model/objects\";\nimport { Vec2Schema } from \"../model/common\";\nimport { z } from \"zod\";\nimport { sub, type Vec2 } from \"../geometry/vec2\";\nimport {\n rotateObject,\n scaleObjectUniform,\n translateObject,\n} from \"../transform\";\nimport { BlockScriptResultSchema, type BlockChild } from \"./blockDtos\";\nimport {\n actionPatch,\n applyHandlePatch,\n blockOwnPose,\n poseToLocal,\n type BlockPose,\n clickPatch,\n dragPatch,\n menuFieldPatch,\n parseBlockActions,\n parseBlockHandles,\n type BlockAction,\n type BlockHandle,\n type HandlePatch,\n type HandleState,\n} from \"./blockHandles\";\nimport {\n ensureScriptTranspiler,\n executeScriptModule,\n scanScriptId,\n scriptTranspilerReady,\n transpilerLoadingError,\n} from \"./scriptRuntime\";\n\nconst hashString = (s: string): number => {\n let h = 5381;\n for (let i = 0; i < s.length; i++) h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n return h;\n};\n\n/** One acquired block input: a world point or a referenced object id. */\nexport type BlockInputValue = Vec2 | string;\n\n/**\n * One input as `draw` receives it: a pivot-local point, the referenced\n * object (localized against the pivot), or null for a dangling reference.\n */\nexport type ResolvedBlockInput = Vec2 | ModelObject | null;\n\n/**\n * Looks up a referenced object by id — supplied by whoever owns the\n * document (ids are document-unique, so a document-wide lookup is correct).\n */\nexport type BlockObjectResolver = ((id: string) => ModelObject | undefined) & {\n /** Every block instance in the document (all spaces) — how a host finds\n * what lives on it (hostedOf). Absent → hosts see no `hosted`. */\n blocks?: () => readonly Block[];\n};\n\n/** What `draw` receives as `inputs`: positional (pick order) for modules\n * without an inputs table, a record by name for modules with one. */\nexport type DrawInputs =\n | ResolvedBlockInput[]\n | Record<string, ResolvedNamedInput>;\n\n/** Identity + metadata derived from a block module's exports. The optional\n * fields are marketplace/listing metadata (docs/block-marketplace.md) —\n * absent ones change nothing about evaluation. */\nexport interface BlockMeta {\n id: string;\n name: string;\n params: ParamDef[];\n description?: string;\n version?: string;\n authors?: string[];\n tags?: string[];\n /** Ids of block definitions this block's `draw` emits instances of.\n * Declared (a param-dependent path may emit only sometimes), but the\n * save-time dry run REJECTS emitted instances that are not declared. */\n dependencies?: string[];\n /** The declared input table (`inputs` member) — instances of a module\n * with one store their inputs as a record by name. Absent for the\n * positional forms (`place` labels / function, or no `place`). */\n inputs?: InputDef[];\n}\n\n/**\n * The well-known exports of a compiled block script module, NORMALIZED: the\n * transpiler resolves the frozen legacy export names (`main` → `draw`,\n * `defineInput` → `place`) and spreads a default-exported BlockSpec\n * (`export default defineBlock({...})`) over the named exports, so\n * everything downstream reads only one shape. `place` may be an array of\n * point labels — the declarative \"pick one point per label\" form.\n */\ntype BlockScriptModule = {\n draw: (props: {\n params: Record<string, unknown>;\n inputs: DrawInputs;\n }) => unknown;\n place?:\n | ((\n props: {\n params: Record<string, unknown>;\n } & ScriptPickers,\n ) => unknown)\n | readonly string[];\n paramVisibility?: (props: { params: Record<string, unknown> }) => unknown;\n /** Custom handles (blockHandles.ts) — pure, block-local, re-run with the\n * same keys as `draw`. */\n handles?: (props: {\n params: Record<string, unknown>;\n inputs: DrawInputs;\n }) => unknown;\n /** Instance context-menu actions (blockHandles.ts BlockAction[]). */\n actions?: unknown;\n /** Hosting (§6): JSON published for hosted blocks / the host to read —\n * own params only. */\n expose?: (props: { params: Record<string, unknown> }) => unknown;\n /** Hosted blocks: the exposed data of a STAND-IN host for previews,\n * thumbnails and the dry run (JSON, like a real host's `expose`). */\n previewHost?: unknown;\n /** Hosted blocks: a click on the host (host-local) → this instance's\n * params, given the host's exposed data. */\n attach?: (props: {\n host: unknown;\n point: Vec2;\n params: Record<string, unknown>;\n }) => unknown;\n /** Optional author-curated inputs for previews/thumbnails (points may be\n * [x, y] tuples; strings are object refs the stand-in resolver serves). */\n previewInputs?: unknown;\n};\n\n/** The declarative `place` form: point labels, one pick per entry. */\nconst isLabelArray = (v: unknown): v is readonly string[] =>\n Array.isArray(v) && v.every((s) => typeof s === \"string\");\n\ninterface CompiledBlock {\n mod: BlockScriptModule;\n meta: BlockMeta;\n /** The source's hash — the script part of every memo key. */\n hash: number;\n}\n\n/**\n * Compile cache keyed by the raw SOURCE (collision-free — the sources live\n * in the document anyway). Bounded because live editing (the block editor's\n * preview debounce) mints an entry per keystroke burst; eviction is\n * insertion-ordered with a get-refresh, i.e. LRU-ish.\n */\nconst compileCache = new Map<string, CompiledBlock>();\nconst COMPILE_CACHE_MAX = 200;\n\n/** Shared results for input-less evaluations (cross-instance reuse pays). */\nconst resultCache = new Map<string, BlockChild[]>();\nconst RESULT_CACHE_MAX = 500;\n\n/**\n * Per-instance memo for evaluations WITH inputs: input points make keys\n * unique per instance, so a shared cache would just thrash (it's FIFO, and\n * painting re-evaluates every dirty frame). Entries drop via model\n * invalidation.\n */\nconst instanceMemo = new Map<string, { key: string; children: BlockChild[] }>();\n\n/**\n * Which objects each instance's inputs REFERENCE (instance id → referenced\n * ids). ACCUMULATED, never replaced: several documents can share one\n * process (MCP server, SDK, a Save As copy keeps object ids), and the union\n * can only over-expand an invalidation list — harmless — never miss a\n * dependent. Entries are only dropped wholesale (a per-id drop would have to\n * be ordered against `expandWithBlockDependents`, which reads this map).\n */\nconst instanceDeps = new Map<string, Set<string>>();\n\n/**\n * Expand a mutation's invalidation id list with every block instance whose\n * inputs reference one of the mutated objects. The mutation owner calls this\n * BEFORE fanning out to `invalidateBlockCache` and its cache listeners, so\n * dependent instances' memo/snap entries drop and they re-evaluate against\n * the fresh referenced object on the next paint.\n */\nexport const expandWithBlockDependents = (ids: string[]): string[] => {\n if (instanceDeps.size === 0) return ids;\n const idSet = new Set(ids);\n let extra: string[] | null = null;\n for (const [instanceId, deps] of instanceDeps) {\n if (idSet.has(instanceId)) continue;\n for (const d of deps)\n if (idSet.has(d)) {\n (extra ??= []).push(instanceId);\n break;\n }\n }\n return extra ? [...ids, ...extra] : ids;\n};\n\n/**\n * Drop cached instance evaluations + volatile errors. Called by whoever owns\n * mutations, exactly where the funnel fires invalidation listeners today:\n * `null` clears everything, otherwise the given instance ids are dropped.\n */\nexport const invalidateBlockCache = (ids: string[] | null): void => {\n if (ids === null) {\n instanceMemo.clear();\n handleMemo.clear();\n exposeMemo.clear();\n evalErrors.clear();\n instanceDeps.clear();\n return;\n }\n for (const id of ids) {\n instanceMemo.delete(id);\n handleMemo.delete(id);\n exposeMemo.delete(id);\n evalErrors.delete(id);\n }\n};\n\n/** Volatile per-instance evaluation errors (never persisted, not in history). */\nconst evalErrors = new Map<string, string>();\nexport const getBlockError = (instanceId: string): string | undefined =>\n evalErrors.get(instanceId);\n\nconst defaultParams = (meta: BlockMeta): Record<string, unknown> => {\n // Null prototype: a param named `constructor`/`__proto__` must stay a\n // plain property, not clobber the prototype chain.\n const params: Record<string, unknown> = Object.create(null);\n // Labels are panel chrome with no value — scripts never see them; row\n // items are ordinary params (a row is layout only).\n for (const param of valueParams(meta.params))\n params[param.name] = param.default;\n return params;\n};\n\n/** An instance's stored params over the defaults. A list parameter is read\n * through readListParam: a STRING stored before its block switched to a\n * list type is parsed, an unreadable value falls back to the default. */\nconst instanceParams = (\n meta: BlockMeta,\n stored: Readonly<Record<string, unknown>>,\n): Record<string, unknown> => {\n const params = defaultParams(meta);\n for (const [name, value] of Object.entries(stored)) params[name] = value;\n for (const p of valueParams(meta.params))\n if (\n (p.type === \"numberList\" || p.type === \"stringList\") &&\n p.name in stored\n )\n params[p.name] = readListParam(p.type, stored[p.name]) ?? p.default;\n return params;\n};\n\n// The transpiler + executor live in ./scriptRuntime (shared with command\n// modules); re-exported here so `@lineadraw/core` keeps one flat surface.\nexport {\n ensureScriptTranspiler,\n executeScriptModule,\n scriptTranspilerReady,\n setScriptTranspilerReadyCallback,\n type ModuleExecutor,\n} from \"./scriptRuntime\";\n\n/** Resolve the frozen legacy export aliases (`main` → `draw`, `defineInput`\n * → `place`) and validate the block-module shape. */\nconst toBlockModule = (mod: Record<string, unknown>): BlockScriptModule => {\n const draw = mod.draw ?? mod.main;\n if (typeof draw !== \"function\")\n throw new Error(\"Block script must export a `draw` function\");\n const place = mod.place ?? mod.defineInput;\n if (\n place !== undefined &&\n typeof place !== \"function\" &&\n !isLabelArray(place)\n )\n throw new Error(\n \"Block script export `place` must be a function or an array of point labels\",\n );\n if (\n mod.paramVisibility !== undefined &&\n typeof mod.paramVisibility !== \"function\"\n )\n throw new Error(\"Block script export `paramVisibility` must be a function\");\n if (mod.handles !== undefined && typeof mod.handles !== \"function\")\n throw new Error(\n \"Block script export `handles` must be a function returning handle records\",\n );\n // Context-menu actions are static records: checked at compile.\n parseBlockActions(mod.actions);\n for (const name of [\"expose\", \"attach\"] as const)\n if (mod[name] !== undefined && typeof mod[name] !== \"function\")\n throw new Error(`Block script export \\`${name}\\` must be a function`);\n if (mod.previewHost !== undefined && !z.json().safeParse(mod.previewHost).success)\n throw new Error(\n \"Block script export `previewHost` must be JSON (what a host's `expose` returns)\",\n );\n if (mod.inputs !== undefined && isLabelArray(place))\n throw new Error(\n \"Block script declares both an `inputs` table and `place` labels — the table replaces the labels\",\n );\n if (\n mod.previewInputs !== undefined &&\n (mod.previewInputs === null || typeof mod.previewInputs !== \"object\")\n )\n throw new Error(\n \"Block script export `previewInputs` must be an array of points / object ids, or a record by input name\",\n );\n return { ...mod, draw, place } as BlockScriptModule;\n};\n\nconst ParamsExportSchema = z.array(ParamDefSchema);\n\n/** Optional listing metadata (same surface as command modules, plus the\n * block-only `dependencies` — commands don't nest). */\nconst OptionalBlockMetaSchema = z.object({\n description: z.string().optional(),\n version: z.string().optional(),\n authors: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n dependencies: z.array(z.string()).optional(),\n});\n\n/**\n * A module's `params` export — the table itself or a zero-arg function\n * returning it (the function form lets const data tables live below it in\n * the file) — validated with author-facing errors. Shared by blocks and\n * commands; absent → [].\n */\nexport const parseParamsExport = (paramsExport: unknown): ParamDef[] => {\n if (typeof paramsExport === \"function\") {\n try {\n paramsExport = (paramsExport as () => unknown)();\n } catch (e) {\n throw new Error(\n `\\`params\\` function threw — ${e instanceof Error ? e.message : String(e)}`,\n { cause: e },\n );\n }\n }\n if (paramsExport === undefined) return [];\n const parsed = ParamsExportSchema.safeParse(paramsExport);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n throw new Error(\n `Invalid \\`params\\` export${\n issue ? ` — ${issue.path.join(\".\") || \"params\"}: ${issue.message}` : \"\"\n }`,\n );\n }\n // Names are unique across the table AND inside rows (row items share the\n // flat `params` record with everything else).\n const seen = new Set<string>();\n const names = parsed.data.flatMap((d) =>\n d.type === \"row\" ? [d.name, ...d.items.map((i) => i.name)] : [d.name],\n );\n for (const name of names) {\n if (seen.has(name))\n throw new Error(`Duplicate parameter name \"${name}\" in \\`params\\``);\n seen.add(name);\n }\n return parsed.data;\n};\n\n/** Validate a module's identity/metadata exports with author-facing errors. */\nconst extractMeta = (mod: Record<string, unknown>): BlockMeta => {\n if (typeof mod.id !== \"string\" || mod.id.trim() === \"\")\n throw new Error(\"Block script must export a non-empty string `id`\");\n if (typeof mod.name !== \"string\" || mod.name.trim() === \"\")\n throw new Error(\"Block script must export a non-empty string `name`\");\n const optional = OptionalBlockMetaSchema.safeParse(mod);\n if (!optional.success) {\n const issue = optional.error.issues[0];\n throw new Error(\n `Invalid block metadata${\n issue ? ` — ${issue.path.join(\".\")}: ${issue.message}` : \"\"\n }`,\n );\n }\n const params = parseParamsExport(mod.params);\n const inputs = parseInputTable(mod.inputs, params);\n return {\n id: mod.id,\n name: mod.name,\n params,\n ...optional.data,\n ...(inputs ? { inputs } : {}),\n };\n};\n\nconst compileBlock = (script: string): CompiledBlock => {\n const cached = compileCache.get(script);\n if (cached) {\n // Refresh recency so live-edited drafts don't evict the document's defs.\n compileCache.delete(script);\n compileCache.set(script, cached);\n return cached;\n }\n const mod = toBlockModule(executeScriptModule(script));\n const meta = extractMeta(mod as unknown as Record<string, unknown>);\n if (compileCache.size >= COMPILE_CACHE_MAX) {\n const oldest = compileCache.keys().next().value;\n if (oldest !== undefined) compileCache.delete(oldest);\n }\n const compiled = { mod, meta, hash: hashString(script) };\n compileCache.set(script, compiled);\n return compiled;\n};\n\n/**\n * Identity/metadata of a block module. Sync; throws the transient\n * \"Compiling block script…\" until the lazy transpiler is loaded, and a\n * descriptive error for invalid modules (missing exports, bad params).\n */\nexport const getBlockMeta = (script: string): BlockMeta =>\n compileBlock(script).meta;\n\n/** Non-throwing meta lookup for list UIs. */\nexport type BlockMetaResult =\n | { ok: true; meta: BlockMeta }\n | {\n ok: false;\n error: string;\n /** True while the transient transpiler load is the only problem. */\n loading: boolean;\n };\n\nexport const getBlockMetaResult = (script: string): BlockMetaResult => {\n try {\n return { ok: true, meta: compileBlock(script).meta };\n } catch (e) {\n return {\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n loading: !scriptTranspilerReady(),\n };\n }\n};\n\n/** Meta for each script in a document's library (invalid entries report). */\nexport const listBlockMeta = (scripts: readonly string[]): BlockMetaResult[] =>\n scripts.map(getBlockMetaResult);\n\n/** Source-level `export const id = \"…\"` matcher (broken-module fallback). */\nconst BLOCK_SPEC_OPENER = /defineBlock\\s*\\(|export\\s+default\\s*\\{/;\n\n/**\n * The script whose exported `id` matches — the definition lookup behind\n * `instance.definitionId`. Throws the transient loading error while the\n * transpiler is absent (a missing transpiler must read as \"compiling\", not\n * \"missing definition\"). A module that FAILS to compile still matches via a\n * source-level id scan, so its instances report the actual script error\n * instead of \"unknown definition\".\n */\nexport const findBlockScript = (\n scripts: readonly string[],\n id: string,\n): string | undefined => {\n if (!scriptTranspilerReady()) throw transpilerLoadingError();\n for (const script of scripts) {\n try {\n if (compileBlock(script).meta.id === id) return script;\n } catch {\n if (scanScriptId(script, BLOCK_SPEC_OPENER) === id) return script;\n }\n }\n return undefined;\n};\n\n/**\n * A module's exported id without requiring it to be valid: compiled meta\n * when possible, source-level scan otherwise. Undefined only when neither\n * yields one (including while the transpiler still loads and no literal id\n * export is present).\n */\nexport const blockScriptId = (script: string): string | undefined => {\n try {\n return compileBlock(script).meta.id;\n } catch {\n return scanScriptId(script, BLOCK_SPEC_OPENER);\n }\n};\n\n/**\n * Transitive dependency closure of the given definition ids, following each\n * module's declared `dependencies` against the library. Returns the input\n * ids plus every reachable dependency id — INCLUDING ids that don't resolve\n * to a module (the caller decides whether a missing dep is an error or just\n * has nothing to bundle). Cycle-safe. Throws the transient loading error\n * while the transpiler is absent (callers ship the whole library instead).\n */\nexport const blockDependencyClosure = (\n scripts: readonly string[],\n ids: Iterable<string>,\n): Set<string> => {\n const closure = new Set<string>();\n const queue = [...ids];\n while (queue.length > 0) {\n const id = queue.pop()!;\n if (closure.has(id)) continue;\n closure.add(id);\n const script = findBlockScript(scripts, id);\n if (script === undefined) continue;\n try {\n for (const dep of compileBlock(script).meta.dependencies ?? [])\n queue.push(dep);\n } catch {\n // Broken module — its declared deps are unreadable; ship what we have.\n }\n }\n return closure;\n};\n\n/**\n * Does any script in the library export this id? PERMISSIVE while the\n * transpiler is still loading (returns true) — used by ops validation,\n * where \"cannot verify yet\" must not reject a valid document.\n */\nexport const blockDefinitionExists = (\n scripts: readonly string[],\n id: string,\n): boolean => {\n if (!scriptTranspilerReady()) return true;\n return findBlockScript(scripts, id) !== undefined;\n};\n\n/**\n * Deep-clone + freeze the props handed to a script: freezing alone is\n * shallow, and a script mutating a Vec2 input would otherwise corrupt\n * cached state.\n */\nconst scriptProps = <T extends Record<string, unknown>>(props: T): T => {\n const cloned = structuredClone(props);\n for (const value of Object.values(cloned))\n if (value !== null && typeof value === \"object\") Object.freeze(value);\n return Object.freeze(cloned);\n};\n\n/** Run the script's `draw` and validate the result. */\nconst runScript = (\n script: string,\n params: Record<string, unknown>,\n inputs: DrawInputs,\n styles: BlockStyleSources,\n hosting: { host: unknown; hosted: unknown[] } = { host: null, hosted: [] },\n): BlockChild[] => {\n const { mod } = compileBlock(script);\n // `styles` joins AFTER the deep clone (functions don't clone); what its\n // methods return is a frozen copy, like everything else a script sees.\n const props = Object.freeze({\n ...scriptProps({ params, inputs, ...hosting }),\n styles: stylesResolver(styles),\n });\n const raw = mod.draw(props);\n return BlockScriptResultSchema.parse(raw);\n};\n\n/** The document styles a block's `draw` can read (`styles.text(id)` /\n * `styles.dim(id)`), so a block can lay out with real text sizes. */\nexport interface BlockStyleSources {\n textStyles: readonly TextStyle[];\n dimStyles: readonly DimStyle[];\n /** The document's layers, so a child's `layer` NAME resolves; absent →\n * a named child sits on the instance's layer. */\n layers?: readonly { id: string; name: string }[];\n}\n\n/** What a block sees without a document (dry runs, previews, headless\n * callers that pass none): the standard styles. */\nexport const DEFAULT_BLOCK_STYLES: BlockStyleSources = {\n textStyles: [DEFAULT_TEXT_STYLE],\n dimStyles: [DEFAULT_DIM_STYLE],\n};\n\n/** `draw`'s `styles`: id → the document style (\"\" / unknown → the first,\n * the same rule a stored object's `styleId` follows). */\nconst stylesResolver = (s: BlockStyleSources) =>\n Object.freeze({\n text: (id?: string) =>\n Object.freeze(\n structuredClone(textStyleFor({ styleId: id }, s.textStyles)),\n ),\n dim: (id?: string) =>\n Object.freeze(structuredClone(dimStyleFor({ styleId: id }, s.dimStyles))),\n });\n\n/** A short signature of the styles for evaluation cache keys — editing a\n * style re-evaluates blocks (they may read it). Hashed once per array. */\nconst styleSigs = new WeakMap<object, string>();\nconst stylesSig = (s: BlockStyleSources): string => {\n const sig = (styles: readonly object[]) => {\n let v = styleSigs.get(styles);\n if (v === undefined) {\n v = String(hashString(JSON.stringify(styles)));\n styleSigs.set(styles, v);\n }\n return v;\n };\n return `${sig(s.textStyles)}.${sig(s.dimStyles)}`;\n};\n\nconst ParamVisibilityResultSchema = z.record(z.string(), z.boolean());\n\n/**\n * Evaluate the module's optional `paramVisibility` export with the given\n * effective param values: per-parameter visibility flags for the properties\n * panel (names missing from the record stay visible). NON-THROWING — an\n * absent export, a compiling/broken module, a throwing function, or a bad\n * return shape all yield {} (everything visible); the save-time dry run is\n * where authors get those errors reported.\n */\nexport const getParamVisibility = (\n script: string,\n params: Record<string, unknown>,\n): Record<string, boolean> => {\n try {\n const { mod } = compileBlock(script);\n if (!mod.paramVisibility) return {};\n const raw = mod.paramVisibility(scriptProps({ params }));\n const parsed = ParamVisibilityResultSchema.safeParse(raw);\n return parsed.success ? parsed.data : {};\n } catch {\n return {};\n }\n};\n\nconst paramsKey = (params: Record<string, unknown>): string =>\n JSON.stringify(Object.entries(params).sort(([a], [b]) => a.localeCompare(b)));\n\n// ---------------------------------------------------------------------------\n// Input localization + cache signature\n// ---------------------------------------------------------------------------\n\n/** Round for the cache KEY only — kills float jitter without touching data. */\nconst r6 = (v: number): number => Math.round(v * 1e6) / 1e6;\nconst sigOf = (v: BlockInputValue): string =>\n typeof v === \"string\" ? `#${v}` : `${r6(v.x)},${r6(v.y)}`;\n\n/** Values grouped the way they are stored, for the cache key: a named\n * record keys its groups by name (moving a point between two lists must\n * change the key). */\nconst storedGroups = (inputs: StoredInputs): [string, BlockInputValue[]][] =>\n isNamedInputs(inputs)\n ? Object.entries(inputs).map(([name, v]) => [\n name,\n Array.isArray(v) ? (v as BlockInputValue[]) : [v],\n ])\n : [[\"\", inputs]];\n\n/** A serial per referenced object RECORD. The kernel replaces an object on\n * every edit (and undo restores the old record), so the serial changes\n * exactly when the referenced content can have — and another document's\n * object under the same id is another record, another serial. */\nconst recordSerials = new WeakMap<object, number>();\nlet nextRecordSerial = 0;\nconst recordSig = (obj: ModelObject | undefined): string => {\n if (!obj) return \"-\";\n let n = recordSerials.get(obj);\n if (n === undefined) recordSerials.set(obj, (n = ++nextRecordSerial));\n return `@${n}`;\n};\n\n/**\n * The memo-key signature of the instance's inputs, localized against the\n * pivot. Object references contribute their id AND the resolved record's\n * identity (an O(1) index lookup): the memo is per instance id, which two\n * documents in one process can share — keying on the reference id alone\n * served one document the other's geometry.\n */\nconst inputsSig = (\n instance: Block,\n resolve: BlockObjectResolver | undefined,\n): string => {\n const pivot = blockPivot(instance);\n return storedGroups(instance.inputs)\n .map(\n ([name, values]) =>\n `${name}:` +\n values\n .map((v) =>\n typeof v === \"string\"\n ? sigOf(v) + recordSig(resolve?.(v))\n : sigOf(sub(v, pivot)),\n )\n .join(\"|\"),\n )\n .join(\";\");\n};\n\n/**\n * Resolve + localize inputs for a `draw` run: points localize against the\n * pivot (the pivot itself becomes {0,0}); id inputs resolve to the\n * referenced object translated into the same pivot-local frame, or null\n * when the reference no longer resolves.\n */\nconst resolveInputs = (\n inputs: readonly BlockInputValue[],\n pivot: Vec2,\n resolve: BlockObjectResolver | undefined,\n): ResolvedBlockInput[] => {\n const neg = { x: -pivot.x, y: -pivot.y };\n return inputs.map((v) => {\n if (typeof v !== \"string\") return sub(v, pivot);\n const obj = resolve?.(v);\n return obj ? translateObject(obj, neg) : null;\n });\n};\n\n/** `draw`'s inputs for a stored value: by name when the module declares a\n * table (a pre-table positional array is dealt onto it), else positional\n * (a record stored before the module dropped its table is flattened). */\nconst drawInputsFor = (\n meta: BlockMeta,\n stored: StoredInputs,\n pivot: Vec2,\n resolve: BlockObjectResolver | undefined,\n): DrawInputs =>\n meta.inputs\n ? resolveNamedInputs(\n meta.inputs,\n namedInputsOf(meta.inputs, stored),\n pivot,\n resolve,\n )\n : resolveInputs(inputValues(stored), pivot, resolve);\n\n/** What a positional `place` must produce: an array of points / object ids. */\nconst BlockInputsSchema = z.array(z.union([Vec2Schema, z.string()]));\n\n/** The pickers a `place` FUNCTION receives — built over the host's\n * InputPickers, rubber-banding from the previous picked point. */\nexport interface ScriptPickers {\n pickPoint: (label?: string) => Promise<Vec2>;\n pickObject: (\n label?: string,\n opts?: { types?: readonly string[] },\n ) => Promise<string>;\n pickPoints: (\n label?: string,\n opts?: { min?: number; max?: number; closed?: boolean },\n ) => Promise<Vec2[]>;\n pickObjects: (\n label?: string,\n opts?: { types?: readonly string[]; min?: number; max?: number },\n ) => Promise<string[]>;\n}\n\nconst scriptPickers = (host: InputPickers): ScriptPickers => {\n let last: Vec2 | undefined;\n return {\n pickPoint: async (label) =>\n (last = await host.point(\n { name: \"pick\", type: \"point\", label: label ?? \"Point\" },\n last,\n )),\n pickObject: (label, opts) =>\n host.object({\n name: \"pick\",\n type: \"object\",\n label: label ?? \"Pick object\",\n // Unknown names simply never match a pick.\n types: [...(opts?.types ?? [])] as Extract<\n InputDef,\n { type: \"object\" }\n >[\"types\"],\n }),\n pickPoints: async (label, opts) => {\n const pts = await host.points(\n {\n label: label ?? \"Points\",\n min: opts?.min ?? 1,\n max: opts?.max,\n closed: opts?.closed ?? false,\n },\n last,\n );\n last = pts[pts.length - 1] ?? last;\n return pts;\n },\n pickObjects: (label, opts) =>\n host.objects({\n label: label ?? \"Pick objects\",\n types: opts?.types ?? [],\n min: opts?.min ?? 1,\n max: opts?.max,\n }),\n };\n};\n\n/**\n * Acquire an instance's inputs at insertion with the host's pickers.\n * - With an `inputs` table: a `place` function (conditional / chained\n * picks) returns the record, checked strictly against the table;\n * without one the table is walked in order (acquireInputTable).\n * - Positional: `place` labels pick one point each, a `place` function\n * returns the array, no `place` is one \"Insertion point\" pick.\n * Await `ensureScriptTranspiler` before calling from a flow that cannot\n * tolerate the transient compile error. Picker rejections (user cancel)\n * propagate.\n */\nexport const acquireBlockInputs = async (\n script: string,\n pickers: InputPickers,\n): Promise<StoredInputs> =>\n (await acquireBlockPlacement(script, pickers)).inputs;\n\n/**\n * acquireBlockInputs plus what a HOSTED block's `attach` makes of the host\n * click (§6): `params` for the new instance — the click in the host's\n * frame, the host's exposed data and the defaults go to `attach`, its\n * result is checked like any patch (unknown names dropped, numbers\n * clamped). `ctx` gives the document (scripts + resolver) the host lives\n * in; without it, or without `attach`, params stay empty.\n */\nexport const acquireBlockPlacement = async (\n script: string,\n pickers: InputPickers,\n ctx?: { scripts: readonly string[]; resolveObject?: BlockObjectResolver },\n): Promise<{ inputs: StoredInputs; params: Block[\"params\"] }> => {\n const { mod, meta } = compileBlock(script);\n const extras: AcquireExtras = {};\n const inputs = await acquireInputs(mod, meta, pickers, extras);\n const hostDef = meta.inputs?.find((d) => d.type === \"host\");\n const hostId =\n hostDef && isNamedInputs(inputs) ? inputs[hostDef.name] : undefined;\n if (!ctx || !extras.hostPoint || typeof hostId !== \"string\")\n return { inputs, params: {} };\n const host = ctx.resolveObject?.(hostId);\n const pose =\n host?.type === \"block\" && instancePose(host, ctx.scripts, ctx.resolveObject);\n if (!pose) return { inputs, params: {} };\n return {\n inputs,\n params: attachedParams(\n mod,\n meta,\n getBlockExposed(host as Block, ctx.scripts),\n poseToLocal(pose, extras.hostPoint),\n ),\n };\n};\n\n/** A hosted module's `attach` result for a click at host-local `point`,\n * checked like any patch (unknown names dropped, numbers clamped); {}\n * without an `attach`. */\nconst attachedParams = (\n mod: BlockScriptModule,\n meta: BlockMeta,\n host: unknown,\n point: Vec2,\n): Block[\"params\"] => {\n if (!mod.attach) return {};\n const raw = mod.attach(\n scriptProps({ host, point, params: { ...defaultParams(meta) } }),\n );\n const stub = { params: {}, inputs: {} } as unknown as Block;\n return applyHandlePatch(stub, meta.params, meta.inputs, {\n params: (raw ?? {}) as Record<string, unknown>,\n }).instance.params;\n};\n\n/** The one acquisition path: a `place` function (a record checked against\n * the table, or a positional array), else the table walked in order, else\n * the `place` labels (default one \"Insertion point\") as a positional\n * table whose picks are stored as an array. */\nconst acquireInputs = async (\n mod: BlockScriptModule,\n meta: BlockMeta,\n pickers: InputPickers,\n extras: AcquireExtras,\n): Promise<StoredInputs> => {\n if (typeof mod.place === \"function\") {\n const raw = await mod.place({\n params: scriptProps({ ...defaultParams(meta) }),\n ...scriptPickers(pickers),\n });\n if (!meta.inputs) return BlockInputsSchema.parse(raw);\n const { inputs, missing: absent } = checkNamedInputs(\n \"place\",\n meta.inputs,\n raw,\n );\n const missing = absent.filter(isRequiredInput);\n if (missing.length > 0)\n throw new Error(\n `place returned no ${missing.map((d) => `\"${d.name}\"`).join(\", \")}`,\n );\n return inputs;\n }\n if (meta.inputs) return acquireInputTable(meta.inputs, pickers, extras);\n const labels = isLabelArray(mod.place) ? mod.place : [\"Insertion point\"];\n return Object.values(\n await acquireInputTable(labelsToInputTable(labels), pickers),\n ) as Vec2[];\n};\n\n/**\n * Stand-in resolver for dry runs and previews: hands every reference a\n * plausible object (a short line) so scripts that derive geometry from a\n * pick exercise their happy path instead of hitting null.\n */\nconst dryRunObjects = new Map<string, ModelObject>();\nexport const dryRunObjectResolver: BlockObjectResolver = (id) => {\n // One stable record per id, so previews keep their memo hits.\n let obj = dryRunObjects.get(id);\n if (!obj) {\n obj = {\n id,\n layerId: \"dry-run\",\n type: \"line\",\n a: { x: 0, y: 0 },\n b: { x: 100, y: 0 },\n };\n dryRunObjects.set(id, obj);\n }\n return obj;\n};\n\n/**\n * Acquire a module's inputs with the bounded stand-in pickers — the input\n * half of a dry run, shared by save-time testing and previews (a preview\n * instance built on these inputs paints exactly what inserting the block\n * would). An author-curated `previewInputs` export wins over the generic\n * stand-in picks, so previews/thumbnails can show the block at its best\n * (\"[x, y]\" tuples accepted; validated with an author-facing error).\n * Awaits the transpiler; script errors propagate.\n */\nexport const dryRunBlockInputs = async (\n script: string,\n): Promise<StoredInputs> => {\n await ensureScriptTranspiler();\n const { mod, meta } = compileBlock(script);\n if (mod.previewInputs !== undefined && meta.inputs)\n return parsePreviewNamedInputs(meta.inputs, mod.previewInputs);\n if (mod.previewInputs !== undefined) {\n const parsed = BlockInputsSchema.safeParse(mod.previewInputs);\n if (!parsed.success)\n throw new Error(\n \"`previewInputs` must be an array of points ([x, y] or {x, y}) and/or object-id strings\",\n );\n return parsed.data;\n }\n return acquireBlockInputs(script, dryRunInputPickers());\n};\n\n/**\n * dryRunBlockInputs plus the params a preview should show: a HOSTED module\n * with `previewHost` and `attach` is laid out as if clicked at the stand-in\n * host's origin (its `attach` result, checked like any patch). Other\n * modules: no params (their defaults).\n */\nexport const dryRunBlockPlacement = async (\n script: string,\n): Promise<{ inputs: StoredInputs; params: Block[\"params\"] }> => {\n const inputs = await dryRunBlockInputs(script);\n const { mod, meta } = compileBlock(script);\n const hostDef = meta.inputs?.find((d) => d.type === \"host\");\n const hosted =\n hostDef !== undefined &&\n isNamedInputs(inputs) &&\n inputs[hostDef.name] === PREVIEW_HOST_ID;\n if (!hosted || mod.previewHost === undefined) return { inputs, params: {} };\n return {\n inputs,\n params: attachedParams(mod, meta, mod.previewHost, { x: 0, y: 0 }),\n };\n};\n\n/**\n * Dry-run a block module (editor's save): validate the identity exports,\n * acquire inputs via `place` with stand-in pickers, then run `draw`\n * on them with default params.\n */\nexport const testBlockDefinition = async (\n script: string,\n): Promise<{ ok: true } | { ok: false; error: string }> => {\n try {\n await ensureScriptTranspiler();\n const { mod, meta } = compileBlock(script);\n // `previewInputs` shortcuts the picker path for previews — but the dry\n // run must still exercise `place` (its errors would otherwise surface\n // only at insertion).\n if (mod.previewInputs !== undefined && mod.place !== undefined)\n await acquireBlockInputs(script, dryRunInputPickers());\n const { inputs, params: placed } = await dryRunBlockPlacement(script);\n const pivot = inputPoints(inputs)[0] ?? { x: 0, y: 0 };\n const local = drawInputsFor(meta, inputs, pivot, dryRunObjectResolver);\n const children = runScript(\n script,\n { ...defaultParams(meta), ...placed },\n local,\n DEFAULT_BLOCK_STYLES,\n // A hosted module draws on its preview host (when it declares one).\n { host: mod.previewHost ?? null, hosted: [] },\n );\n // Emitted nested instances must be DECLARED — dependencies is what\n // install/copy/export use to bundle the closure, so an undeclared one\n // would break every one of those paths silently.\n const declared = new Set(meta.dependencies ?? []);\n for (const child of children) {\n if (child.type === \"block\" && !declared.has(child.definitionId))\n throw new Error(\n `draw emits an instance of \"${child.definitionId}\" — declare it in \\`dependencies\\``,\n );\n }\n // Handles: the editor evaluates them non-throwing (no handles on an\n // error), so the dry run is where authors see what's wrong.\n if (mod.handles)\n parseBlockHandles(\n mod.handles(scriptProps({ params: { ...defaultParams(meta) }, inputs: local })),\n meta.params,\n meta.inputs,\n defaultParams(meta),\n );\n // The panel-facing paramVisibility is non-throwing (falls back to\n // all-visible), so the dry run is where its errors reach the author.\n if (mod.paramVisibility) {\n const raw = mod.paramVisibility(\n scriptProps({ params: { ...defaultParams(meta) } }),\n );\n if (!ParamVisibilityResultSchema.safeParse(raw).success)\n throw new Error(\n \"`paramVisibility` must return an object of boolean flags keyed by parameter name\",\n );\n }\n return { ok: true };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n};\n\n/**\n * Child DTO → full pseudo model object in block-LOCAL coordinates.\n * BlockChild is the model schema minus {id, hidden} with an OPTIONAL\n * layerId (blockDtos): a child without one follows the instance's layer;\n * one that names a layer keeps it (imported DXF blocks draw across\n * layers), falling back to the instance's when the id is not a layer of\n * this document.\n */\nconst childToObject = (\n child: BlockChild,\n instance: Block,\n index: number,\n layers: BlockStyleSources[\"layers\"],\n): ModelObject => {\n const { layer, ...rest } = child;\n // `layer` names the layer by id or name; an unknown one → the instance's.\n const named =\n layer === undefined\n ? undefined\n : (layers?.find((l) => l.id === layer) ??\n layers?.find((l) => l.name === layer))?.id;\n return {\n color: instance.color,\n lineType: instance.lineType,\n lineTypeScale: instance.lineTypeScale,\n lineWidth: instance.lineWidth,\n ...rest,\n id: `${instance.id}:${index}`,\n layerId: named ?? child.layerId ?? instance.layerId,\n } as ModelObject;\n};\n\n// ---------------------------------------------------------------------------\n// Hosted blocks (docs/block-inputs-and-handles.md §6, ADR 0008). A module\n// with a `host` input LIVES ON another instance: it draws in the host's\n// frame, reads the host's `expose` as `host`; the host's draw receives the\n// `expose` of everything hosted on it as `hosted`. Evaluation is two-step —\n// `expose` sees only the module's own params, `draw` sees exposes — so a\n// door and its plan can't loop. Invalidation both ways: a hosted instance\n// records its host as a reference (instanceDeps), a host records its\n// hosted ids, and invalidationIds adds a changed instance's references.\n// ---------------------------------------------------------------------------\n\n/** A resolution step's outcome: the value, or the error message every\n * per-instance export reports (draw records it, the rest return nothing). */\ntype Resolved<T> = ({ ok: true } & T) | { ok: false; error: string };\n\nconst errorText = (e: unknown): string =>\n e instanceof Error ? e.message : String(e);\n\n/** Stage 1 of resolving an instance: its module and params. Never touches\n * hosting — `expose` and the host index read only this (ADR 0008). */\ninterface DefinitionStage {\n script: string;\n mod: BlockScriptModule;\n meta: BlockMeta;\n /** Defaults overlaid with the instance's own values (lazy). */\n readonly params: Record<string, unknown>;\n /** Memo key of everything this stage determines (lazy). */\n readonly key: string;\n}\n\nconst resolveDefinition = (\n instance: Block,\n scripts: readonly string[],\n): Resolved<DefinitionStage> => {\n try {\n if (!scriptTranspilerReady()) throw transpilerLoadingError();\n const script = findBlockScript(scripts, instance.definitionId);\n if (!script)\n return {\n ok: false,\n error: `Unknown block definition (${instance.definitionId})`,\n };\n const { mod, meta, hash } = compileBlock(script);\n let params: Record<string, unknown> | undefined;\n let key: string | undefined;\n return {\n ok: true,\n script,\n mod,\n meta,\n get params() {\n return (params ??= instanceParams(meta, instance.params));\n },\n get key() {\n return (key ??= `${meta.id}:${hash}:${paramsKey(this.params)}`);\n },\n };\n } catch (e) {\n return { ok: false, error: errorText(e) };\n }\n};\n\n/** The host id an instance stores under its module's `host` input. */\nconst hostIdOf = (instance: Block, def: DefinitionStage): string | undefined => {\n if (!isNamedInputs(instance.inputs)) return undefined;\n const name = def.meta.inputs?.find((d) => d.type === \"host\")?.name;\n const v = name !== undefined ? instance.inputs[name] : undefined;\n return typeof v === \"string\" ? v : undefined;\n};\n\n/** The id of the instance this one lives on — undefined unless its module\n * declares a `host` input and the instance stores one. */\nexport const blockHostId = (\n instance: Block,\n scripts: readonly string[],\n): string | undefined => {\n if (!isNamedInputs(instance.inputs)) return undefined;\n const def = resolveDefinition(instance, scripts);\n return def.ok ? hostIdOf(instance, def) : undefined;\n};\n\n/** Hosting chains deeper than this are refused (a door in a wall in a plan\n * is 2) — it also stops a host loop. */\nconst MAX_HOST_DEPTH = 2;\n\nconst framePose = (\n instance: Block,\n hostId: string | undefined,\n scripts: readonly string[],\n resolveObject: BlockObjectResolver | undefined,\n depth: number,\n): BlockPose | null => {\n // No host, or the preview stand-in: the instance's own frame.\n if (hostId === undefined || hostId === PREVIEW_HOST_ID)\n return blockOwnPose(instance);\n if (depth >= MAX_HOST_DEPTH) return null;\n const host = resolveObject?.(hostId);\n if (host?.type !== \"block\") return null;\n return framePose(host, blockHostId(host, scripts), scripts, resolveObject, depth + 1);\n};\n\n/**\n * The frame an instance draws in: its own pose, or — for a hosted one —\n * its host's (recursively). Null when the host is gone, isn't a block, or\n * the chain is too deep / loops.\n */\nexport const instancePose = (\n instance: Block,\n scripts: readonly string[],\n resolveObject?: BlockObjectResolver,\n): BlockPose | null =>\n framePose(instance, blockHostId(instance, scripts), scripts, resolveObject, 0);\n\n/** Per-instance memo of `expose` results (dropped with the block cache). */\nconst exposeMemo = new Map<string, { key: string; value: unknown }>();\n\n/**\n * An instance's `expose({ params })` result — JSON its hosted blocks (or its\n * host) read. Own params only: that is what makes evaluation acyclic. Null\n * without an `expose` export; NON-THROWING (the dry run reports errors).\n */\nexport const getBlockExposed = (\n instance: Block,\n scripts: readonly string[],\n): unknown => {\n const def = resolveDefinition(instance, scripts);\n if (!def.ok || !def.mod.expose) return null;\n try {\n const hit = exposeMemo.get(instance.id);\n if (hit && hit.key === def.key) return hit.value;\n const value = z.json().parse(\n def.mod.expose(scriptProps({ params: def.params })),\n );\n exposeMemo.set(instance.id, { key: def.key, value });\n return value;\n } catch {\n return null;\n }\n};\n\n/** One instance living on a host, as the host's `draw` sees it. */\nexport interface HostedInfo {\n id: string;\n definitionId: string;\n exposed: unknown;\n}\n\n/** Host id → the instances on it, per (blocks list, scripts) pair. */\nconst hostedIndex = new WeakMap<\n readonly Block[],\n { scripts: readonly string[]; byHost: Map<string, Block[]> }\n>();\n\nconst hostIndexOf = (\n blocks: readonly Block[],\n scripts: readonly string[],\n): Map<string, Block[]> => {\n let idx = hostedIndex.get(blocks);\n if (!idx || idx.scripts !== scripts) {\n // ponytail: rebuilt per document revision (O(blocks)); an incremental\n // host index in the kernel if plans grow to thousands of openings.\n const byHost = new Map<string, Block[]>();\n for (const b of blocks) {\n const h = blockHostId(b, scripts);\n if (h !== undefined) byHost.set(h, [...(byHost.get(h) ?? []), b]);\n }\n idx = { scripts, byHost };\n hostedIndex.set(blocks, idx);\n }\n return idx.byHost;\n};\n\n/**\n * The instances hosted on `hostId`, from the resolver's document-wide\n * block list (`resolveObject.blocks`). Empty without one.\n */\nexport const hostedOf = (\n hostId: string,\n scripts: readonly string[],\n resolveObject?: BlockObjectResolver,\n): Block[] => {\n const blocks = resolveObject?.blocks?.();\n return blocks ? (hostIndexOf(blocks, scripts).get(hostId) ?? []) : [];\n};\n\n/**\n * `ids` plus every instance hosted on them, transitively — what deleting\n * or copying them takes along (a plan's doors go with the plan).\n */\nexport const hostedClosure = (\n ids: Iterable<string>,\n scripts: readonly string[],\n blocks: readonly Block[],\n): Set<string> => {\n const out = new Set(ids);\n const byHost = hostIndexOf(blocks, scripts);\n const queue = [...out];\n while (queue.length > 0) {\n for (const { id } of byHost.get(queue.pop()!) ?? [])\n if (!out.has(id)) {\n out.add(id);\n queue.push(id);\n }\n }\n return out;\n};\n\n/** What a module's `draw` / `handles` receive about hosting. */\ninterface HostingProps {\n host: unknown;\n hosted: HostedInfo[];\n}\n\nconst hostingProps = (\n instance: Block,\n def: DefinitionStage,\n scripts: readonly string[],\n resolveObject?: BlockObjectResolver,\n): HostingProps => {\n const hostId = hostIdOf(instance, def);\n if (hostId === PREVIEW_HOST_ID)\n return { host: def.mod.previewHost ?? null, hosted: [] };\n const host = hostId !== undefined ? resolveObject?.(hostId) : undefined;\n return {\n host: host?.type === \"block\" ? getBlockExposed(host, scripts) : null,\n hosted: hostedOf(instance.id, scripts, resolveObject).map((h) => ({\n id: h.id,\n definitionId: h.definitionId,\n exposed: getBlockExposed(h, scripts),\n })),\n };\n};\n\n/** Stage 2 of resolving an instance, built on stage 1: where it sits and\n * what it sees. Pure — dependency registration and the recursion guard\n * stay in draw. */\ninterface PlacedStage {\n def: DefinitionStage;\n /** The frame it draws in (a hosted instance: its host's). */\n pose: BlockPose;\n hosting: HostingProps;\n /** \"\" when there is no host data and nothing hosted. */\n hostingSig: string;\n /** Memo key: the definition key + inputs + hosting. Each memo appends\n * only what its own output adds (draw: styles; handles: the pose). */\n key: string;\n /** `draw`'s inputs, resolved on first use (throws a missing input). */\n inputs(): DrawInputs;\n /** What `draw`-adjacent functions receive: params, inputs, hosting. */\n state(): { params: Record<string, unknown>; inputs: DrawInputs } & HostingProps;\n}\n\nconst HOST_GONE =\n \"Its host is gone (or hosts too deep) — delete it or re-insert it on a host\";\n\nconst resolvePlaced = (\n def: DefinitionStage,\n instance: Block,\n scripts: readonly string[],\n resolveObject: BlockObjectResolver | undefined,\n): Resolved<PlacedStage> => {\n const pose = framePose(\n instance,\n hostIdOf(instance, def),\n scripts,\n resolveObject,\n 0,\n );\n if (!pose) return { ok: false, error: HOST_GONE };\n const hosting = hostingProps(instance, def, scripts, resolveObject);\n const hostingSig =\n hosting.host === null && hosting.hosted.length === 0\n ? \"\"\n : String(hashString(JSON.stringify(hosting)));\n let inputs: DrawInputs | undefined;\n const drawInputs = () =>\n (inputs ??= drawInputsFor(def.meta, instance.inputs, pose.pivot, resolveObject));\n return {\n ok: true,\n def,\n pose,\n hosting,\n hostingSig,\n key: `${def.key}:${inputsSig(instance, resolveObject)}:${hostingSig}`,\n inputs: drawInputs,\n state: () =>\n scriptProps({ params: def.params, inputs: drawInputs(), ...hosting }),\n };\n};\n\n/** Both stages, for callers with nothing to do between them. */\nconst resolveInstance = (\n instance: Block,\n scripts: readonly string[],\n resolveObject: BlockObjectResolver | undefined,\n): Resolved<PlacedStage> => {\n const def = resolveDefinition(instance, scripts);\n return def.ok ? resolvePlaced(def, instance, scripts, resolveObject) : def;\n};\n\n/**\n * Evaluated children of an instance in WORLD coordinates (pseudo objects with\n * synthetic ids). Painters, snapping, hit-testing, and Explode all consume\n * this. Errors are recorded volatile and yield an empty list. The document's\n * block module sources are passed in (the kernel holds no store).\n */\n// Blocks may contain nested block instances; guard against definition cycles\n// (a script emitting an instance of an ancestor def would recurse forever).\nconst evaluating = new Set<string>();\n\nexport const getEvaluatedWorldChildren = (\n instance: Block,\n scripts: readonly string[],\n resolveObject?: BlockObjectResolver,\n /** The document's styles, readable in `draw` (`styles.text(id)`). */\n styles: BlockStyleSources = DEFAULT_BLOCK_STYLES,\n): ModelObject[] => {\n // Keep the dependency registry current on EVERY call (cheap): expansion\n // must know about references even when this call ends as a memo hit.\n const refs = inputRefs(instance.inputs);\n if (refs.length > 0) {\n const deps = instanceDeps.get(instance.id);\n if (deps) for (const r of refs) deps.add(r);\n else instanceDeps.set(instance.id, new Set(refs));\n }\n\n const def = resolveDefinition(instance, scripts);\n if (!def.ok) {\n evalErrors.set(instance.id, def.error);\n return [];\n }\n const { meta, script } = def;\n if (evaluating.has(meta.id)) {\n evalErrors.set(instance.id, `Recursive block definition (${meta.name})`);\n return [];\n }\n evaluating.add(meta.id);\n try {\n const placed = resolvePlaced(def, instance, scripts, resolveObject);\n if (!placed.ok) {\n evalErrors.set(instance.id, placed.error);\n return [];\n }\n const { pose, hosting } = placed;\n if (hosting.hosted.length > 0) {\n // A hosted instance changing / going away must re-evaluate its host.\n const deps = instanceDeps.get(instance.id);\n const ids = hosting.hosted.map((h) => h.id);\n if (deps) for (const id of ids) deps.add(id);\n else instanceDeps.set(instance.id, new Set(ids));\n }\n const run = () =>\n runScript(script, def.params, placed.inputs(), styles, hosting);\n let children: BlockChild[];\n if (inputValues(instance.inputs).length > 0) {\n const key = `${placed.key}:${stylesSig(styles)}`;\n const hit = instanceMemo.get(instance.id);\n if (hit && hit.key === key) {\n children = hit.children;\n } else {\n children = run();\n instanceMemo.set(instance.id, { key, children });\n }\n } else {\n // Input-less instances share results across instances.\n const key = `${def.key}:${stylesSig(styles)}:${placed.hostingSig}`;\n const cached = resultCache.get(key);\n if (cached) {\n children = cached;\n } else {\n children = run();\n if (resultCache.size >= RESULT_CACHE_MAX) {\n const oldest = resultCache.keys().next().value;\n if (oldest !== undefined) resultCache.delete(oldest);\n }\n resultCache.set(key, children);\n }\n }\n evalErrors.delete(instance.id);\n return children.map((child, i) => {\n let obj = childToObject(child, instance, i, styles.layers);\n if (pose.scale !== 1) obj = scaleObjectUniform(obj, pose.scale);\n if (pose.rotation !== 0)\n obj = rotateObject(obj, { x: 0, y: 0 }, pose.rotation);\n return translateObject(obj, pose.pivot);\n });\n } catch (e) {\n evalErrors.set(instance.id, errorText(e));\n return [];\n } finally {\n evaluating.delete(meta.id);\n }\n};\n\n// ---------------------------------------------------------------------------\n// Custom handles (docs/block-inputs-and-handles.md §3, blockHandles.ts)\n// ---------------------------------------------------------------------------\n\n/** An instance's evaluated handles (block-local) + the state their\n * functions receive. */\nexport interface BlockHandleSet {\n handles: BlockHandle[];\n state: HandleState;\n meta: BlockMeta;\n /** The frame the handles are in (a hosted instance: its host's). */\n pose: BlockPose;\n}\n\n/** Per-instance memo, keyed like `draw`'s (dropped by invalidateBlockCache\n * through the same ids — see handleMemo.delete there). */\nconst handleMemo = new Map<string, { key: string; set: BlockHandleSet }>();\n\n/**\n * Evaluate an instance's `handles` export. NON-THROWING: an absent export,\n * a compiling or broken module, a throw or an invalid result all yield\n * null (the save-time dry run reports them).\n */\nexport const getBlockHandles = (\n instance: Block,\n scripts: readonly string[],\n resolveObject?: BlockObjectResolver,\n): BlockHandleSet | null => {\n const def = resolveDefinition(instance, scripts);\n if (!def.ok || !def.mod.handles) return null;\n try {\n const placed = resolvePlaced(def, instance, scripts, resolveObject);\n if (!placed.ok) return null;\n const { pose } = placed;\n const key = `${placed.key}:${pose.pivot.x},${pose.pivot.y},${pose.rotation},${pose.scale}`;\n const hit = handleMemo.get(instance.id);\n if (hit && hit.key === key) return hit.set;\n const state = placed.state();\n const handles = parseBlockHandles(\n def.mod.handles(state),\n def.meta.params,\n def.meta.inputs,\n def.params,\n );\n const set = { handles, state, meta: def.meta, pose };\n handleMemo.set(instance.id, { key, set });\n return set;\n } catch {\n return null;\n }\n};\n\nconst applyPatch = (\n instance: Block,\n set: { meta: BlockMeta; pose: BlockPose },\n patch: HandlePatch | null,\n): Block =>\n patch\n ? applyHandlePatch(\n instance,\n set.meta.params,\n set.meta.inputs,\n patch,\n set.pose,\n ).instance\n : instance;\n\n/**\n * The instance after dragging handle `id` to `world` (constrained, then\n * the patch applied). The module's `drag` may throw — that propagates;\n * hosts painting a live preview catch it.\n */\nexport const dragBlockHandle = (\n instance: Block,\n scripts: readonly string[],\n id: string,\n world: Vec2,\n resolveObject?: BlockObjectResolver,\n): Block => {\n const set = getBlockHandles(instance, scripts, resolveObject);\n const h = set?.handles.find((x) => x.id === id);\n if (!set || !h) return instance;\n const local = poseToLocal(set.pose, world);\n return applyPatch(instance, set, dragPatch(h, set.state, local));\n};\n\n/** The instance after clicking button handle `id` (its `click` patch). */\nexport const clickBlockHandle = (\n instance: Block,\n scripts: readonly string[],\n id: string,\n resolveObject?: BlockObjectResolver,\n): Block => {\n const set = getBlockHandles(instance, scripts, resolveObject);\n const h = set?.handles.find((x) => x.id === id);\n if (!set || !h) return instance;\n return applyPatch(instance, set, clickPatch(h, set.state));\n};\n\n/** The module's top-level `actions` (the instance's context menu); [] when\n * it declares none or doesn't compile. */\nexport const getBlockActions = (\n instance: Block,\n scripts: readonly string[],\n): BlockAction[] => {\n const def = resolveDefinition(instance, scripts);\n return def.ok ? parseBlockActions(def.mod.actions) : [];\n};\n\n/**\n * The instance after running its context-menu action `index`. `world` is\n * the picked point for an action with `pick` (handed to `run` block-local).\n * Throws what `run` throws (the caller reports it).\n */\nexport const runBlockAction = (\n instance: Block,\n scripts: readonly string[],\n index: number,\n world?: Vec2,\n resolveObject?: BlockObjectResolver,\n): Block => {\n const action = getBlockActions(instance, scripts)[index];\n const placed = action && resolveInstance(instance, scripts, resolveObject);\n if (!action || !placed?.ok) return instance;\n const ctx = { meta: placed.def.meta, pose: placed.pose, state: placed.state() };\n const point = world && poseToLocal(ctx.pose, world);\n return applyPatch(instance, ctx, actionPatch(action, ctx.state, point));\n};\n\n/** The instance after running action `index` of handle `id`'s menu. */\nexport const runBlockHandleAction = (\n instance: Block,\n scripts: readonly string[],\n id: string,\n index: number,\n world?: Vec2,\n resolveObject?: BlockObjectResolver,\n): Block => {\n const set = getBlockHandles(instance, scripts, resolveObject);\n const action = set?.handles.find((h) => h.id === id)?.actions[index];\n if (!set || !action) return instance;\n const point = world && poseToLocal(set.pose, world);\n return applyPatch(instance, set, actionPatch(action, set.state, point));\n};\n\n/** The instance after editing field `index` of handle `id`'s menu. */\nexport const setBlockHandleMenuField = (\n instance: Block,\n scripts: readonly string[],\n id: string,\n index: number,\n value: unknown,\n resolveObject?: BlockObjectResolver,\n): Block => {\n const set = getBlockHandles(instance, scripts, resolveObject);\n const field = set?.handles.find((h) => h.id === id)?.menu[index];\n if (!set || !field) return instance;\n return applyPatch(instance, set, menuFieldPatch(field, value));\n};\n","// Schema for what a block script may RETURN: model objects minus identity\n// (id/layerId/hidden), in block-local coordinates (mm, y-up, origin at the\n// insertion point). Derived from the model schemas so the two cannot drift.\n// Points accept both {x, y} and [x, y] (see Vec2Schema/PolylineVertexSchema).\n// Children inherit the instance's layer/color/lineWidth unless they carry\n// their own.\n\nimport { z } from \"zod\";\nimport { inputRefs } from \"../model/blockInputs\";\nimport {\n ArcSchema,\n BlockSchema,\n CircleSchema,\n DimensionShapeSchema,\n dimensionRefinement,\n EllipseSchema,\n HatchSchema,\n LineSchema,\n PointSchema,\n PolylineSchema,\n ReferenceSchema,\n TableShapeSchema,\n tableRefinement,\n TextSchema,\n} from \"../model/objects\";\nimport {\n dimensionRawToLabels,\n dimensionRawToOffset,\n dimRawScaleToField,\n leaderRawToText,\n textRawStyleToOverride,\n} from \"../model/migrations\";\n\n/** Identity comes from the block instance, not the script. A child MAY\n * name a document layer — `layer` (name or id) or `layerId`; absent = the\n * instance's layer — the common case, and what keeps a definition portable\n * between documents. */\nconst CHILD_OMIT = { id: true, layerId: true } as const;\nconst CHILD_LAYER = {\n layerId: z.string().optional(),\n layer: z.string().optional(),\n};\n\n// Every model object type except viewport (sheet furniture, never block\n// geometry) and comment. Block children allow nested instances via\n// `definitionId`, and references (a linked or embedded file — an `asset`\n// source resolves in the document the instance lives in).\n// Nested instances MAY carry point input values (parent-local; the parent's\n// transform pass carries them to world) but never REFERENCE values (strings)\n// — script-emitted references to real model ids would evade dependency\n// tracking.\nexport const BlockChildSchema = z.preprocess(\n // Back-compat: scripts written before document v6 may still emit \"leader\"\n // children (→ text with leaderLines), pre-v9 scripts may emit dimensions\n // in the linePoint/rotation shape (→ offset), pre-v17 scripts may put\n // style fields (font/widthFactor/textHeight/arrowSize) directly on a text\n // (→ styleOverride), and pre-v18 scripts may put a dimension's scale in\n // its styleOverride (→ the direct field) — convert like the migrations do\n // (scripts are user code we can't rewrite).\n (raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n let obj = raw as Record<string, unknown>;\n if (obj.type === \"leader\") obj = leaderRawToText(obj);\n if (obj.type === \"dimension\")\n // v21 labels last (pre-v21 scripts emit a vector offset / textOverride).\n return dimensionRawToLabels(\n dimRawScaleToField(dimensionRawToOffset(obj)),\n );\n if (obj.type === \"text\") return textRawStyleToOverride(obj);\n return obj;\n },\n z.discriminatedUnion(\"type\", [\n LineSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n PointSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n PolylineSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n CircleSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n ArcSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n EllipseSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n HatchSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n TextSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n TableShapeSchema.omit(CHILD_OMIT)\n .extend(CHILD_LAYER)\n .superRefine(tableRefinement),\n DimensionShapeSchema.omit(CHILD_OMIT)\n .extend(CHILD_LAYER)\n .superRefine(dimensionRefinement),\n ReferenceSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n BlockSchema.omit(CHILD_OMIT)\n .extend(CHILD_LAYER)\n .refine((b) => inputRefs(b.inputs).length === 0, {\n message: \"nested block instances may not carry object references\",\n }),\n ]),\n);\nexport type BlockChild = z.infer<typeof BlockChildSchema>;\n\nexport const BlockScriptResultSchema = z.array(BlockChildSchema);\n","// JS-literal serialization: generated block-script fragments should read like\n// hand-written JavaScript (unquoted keys, inline {x, y} points), not JSON.\n// Used by the BLOCK command's captured-geometry script and the v14 document\n// migration that folds stored definition metadata into module exports.\n\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nconst jsKey = (k: string): string =>\n IDENTIFIER.test(k) ? k : JSON.stringify(k);\n\nexport const toJsLiteral = (value: unknown, indent: string): string => {\n if (typeof value === \"number\") return String(Math.round(value * 1e6) / 1e6);\n if (value === null || typeof value === \"boolean\") return String(value);\n if (typeof value === \"string\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n const inner = indent + \" \";\n return `[\\n${value.map((item) => inner + toJsLiteral(item, inner)).join(\",\\n\")}\\n${indent}]`;\n }\n if (typeof value === \"object\") {\n // Own keys explicitly set to undefined (e.g. a \"by layer\" reset stored\n // as `{ ...o, color: undefined }`) mean the same as absent — omit them\n // instead of printing `key: undefined`.\n const entries = Object.entries(value).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return \"{}\";\n // Small flat objects ({x, y}, vertices) stay on one line.\n const flat = entries.every(([, v]) => typeof v !== \"object\" || v === null);\n if (flat && entries.length <= 4) {\n return `{ ${entries.map(([k, v]) => `${jsKey(k)}: ${toJsLiteral(v, indent)}`).join(\", \")} }`;\n }\n const inner = indent + \" \";\n return `{\\n${entries\n .map(([k, v]) => `${inner}${jsKey(k)}: ${toJsLiteral(v, inner)}`)\n .join(\",\\n\")}\\n${indent}}`;\n }\n return \"undefined\";\n};\n","/**\n * djb2 over the data URL, plus its length — the assets-map content key.\n * Content-keyed so re-adding the same bytes reuses the existing entry.\n */\nexport const hashAsset = (data: string): string => {\n let h = 5381;\n for (let i = 0; i < data.length; i++)\n h = ((h << 5) + h + data.charCodeAt(i)) | 0;\n return `${(h >>> 0).toString(16)}-${data.length.toString(16)}`;\n};\n\n/** A data URL's MIME type (\"\" when it isn't one). */\nexport const dataUrlMime = (dataUrl: string): string =>\n /^data:([^;,]*)/.exec(dataUrl)?.[1] ?? \"\";\n\n/** A data URL's bytes (base64 or percent-encoded payload). */\nexport const dataUrlBytes = (dataUrl: string): Uint8Array => {\n const comma = dataUrl.indexOf(\",\");\n const payload = dataUrl.slice(comma + 1);\n if (!/;base64$/.test(dataUrl.slice(0, comma)))\n return new TextEncoder().encode(decodeURIComponent(payload));\n const bin = atob(payload);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n};\n\n/** Bytes → a base64 data URL of `mime`. */\nexport const bytesToDataUrl = (bytes: Uint8Array, mime: string): string => {\n let bin = \"\";\n for (let i = 0; i < bytes.length; i += 0x8000)\n bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return `data:${mime};base64,${btoa(bin)}`;\n};\n\n/** A PNG's / JPEG's pixel size from its header (no decoder — Node has\n * none); null when the bytes aren't one. */\nexport const imagePixelSize = (\n b: Uint8Array,\n): { width: number; height: number } | null => {\n const u32 = (i: number) =>\n ((b[i] << 24) | (b[i + 1] << 16) | (b[i + 2] << 8) | b[i + 3]) >>> 0;\n const u16 = (i: number) => (b[i] << 8) | b[i + 1];\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)\n return { width: u32(16), height: u32(20) }; // IHDR\n if (b[0] !== 0xff || b[1] !== 0xd8) return null;\n // JPEG: walk the segments to the first start-of-frame (SOF0..SOF15\n // except DHT/JPG/DAC), whose payload holds height then width.\n for (let i = 2; i + 9 < b.length; ) {\n if (b[i] !== 0xff) return null;\n const marker = b[i + 1];\n const len = u16(i + 2);\n if (\n marker >= 0xc0 &&\n marker <= 0xcf &&\n marker !== 0xc4 &&\n marker !== 0xc8 &&\n marker !== 0xcc\n )\n return { width: u16(i + 7), height: u16(i + 5) };\n i += 2 + len;\n }\n return null;\n};\n\n/** CSS px → mm: an image's natural size at 96 dpi. */\nexport const PX_TO_MM = 25.4 / 96;\n\n/** The asset an object embeds (an `asset`-source reference), else undefined —\n * the ONE place asset users are counted from (copy, remove-in-use, Assets). */\nexport const embeddedAssetId = (o: {\n type: string;\n source?: { kind: string; assetId?: string };\n}): string | undefined =>\n o.type === \"reference\" && o.source?.kind === \"asset\"\n ? o.source.assetId\n : undefined;\n","/**\n * Document migrations. Runs inside the LineaDocument z.preprocess, so it is\n * shared by file load and working-copy load.\n *\n * Discipline (from calculus-app): prefer .optional()/.default() on new schema\n * fields; bump CURRENT_DOCUMENT_VERSION and add a migration step here only\n * when a field's shape actually changes.\n */\n\nimport { toJsLiteral } from \"../extensions/jsLiteral\";\nimport {\n PX_TO_MM,\n dataUrlBytes,\n dataUrlMime,\n imagePixelSize,\n} from \"./assets\";\n\nexport const CURRENT_DOCUMENT_VERSION = 24;\n\n/**\n * A raw v5 \"leader\" object → v6 \"text\" with leaderLines. Exported because\n * block scripts may still EMIT leader child DTOs (user code we can't\n * rewrite) — blockDtos runs the same conversion. The text position/alignment\n * reproduce the old painter's derived anchor (gap past the last point,\n * facing the last segment's direction), so documents render identically.\n */\nexport const leaderRawToText = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n const points = Array.isArray(raw.points)\n ? (raw.points as { x: number; y: number }[])\n : [];\n const extraLines = Array.isArray(raw.extraLines) ? raw.extraLines : [];\n const textHeight =\n typeof raw.textHeight === \"number\" && raw.textHeight > 0\n ? raw.textHeight\n : 2.5;\n const last = points[points.length - 1] ?? { x: 0, y: 0 };\n const prev = points[points.length - 2] ?? last;\n const rightward = last.x - prev.x >= 0;\n const gap = textHeight * 0.6;\n const rest = { ...raw };\n delete rest.points;\n delete rest.extraLines;\n delete rest.textHeight;\n return {\n ...rest,\n type: \"text\",\n position: { x: last.x + (rightward ? gap : -gap), y: last.y },\n height: textHeight,\n rotation: 0,\n // Model semantics name where the text SITS: past the last point.\n hAlign: rightward ? \"right\" : \"left\",\n vAlign: \"center\",\n leaderLines: points.length >= 2 ? [points, ...extraLines] : extraLines,\n scale: 1,\n };\n};\n\n/**\n * v1 → v2: paper-space viewports move from `layout.viewports` into\n * `layout.objects` as first-class \"viewport\" objects (they gain the object\n * base fields: layerId).\n */\nconst migrateV1toV2 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const layers = Array.isArray(doc.layers) ? doc.layers : [];\n const firstLayerId = (layers[0] as { id?: string } | undefined)?.id;\n const defaultLayerId =\n typeof doc.currentLayerId === \"string\" && doc.currentLayerId !== \"\"\n ? doc.currentLayerId\n : (firstLayerId ?? \"\");\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n const viewports = Array.isArray(layout.viewports)\n ? layout.viewports\n : [];\n const objects = Array.isArray(layout.objects) ? layout.objects : [];\n const migrated = viewports.map((vp) => ({\n ...(vp as Record<string, unknown>),\n type: \"viewport\",\n layerId: defaultLayerId,\n }));\n const rest = { ...layout, objects: [...migrated, ...objects] };\n return rest;\n })\n : doc.layouts;\n\n return { ...doc, layouts, version: 2 };\n};\n\n/**\n * v2 → v3: ellipse `startParam`/`endParam` renamed to `startAngle`/`endAngle`\n * (matching arcs, dxf-parser, and AutoCAD's property palette — the value is\n * still the DXF parametric angle).\n */\nconst migrateV2toV3 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameEllipse = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"ellipse\") return raw;\n const { startParam, endParam, ...rest } = obj;\n return {\n ...rest,\n startAngle: obj.startAngle ?? startParam ?? 0,\n endAngle: obj.endAngle ?? endParam ?? Math.PI * 2,\n };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameEllipse) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 3 };\n};\n\n/**\n * v3 → v4: `strokeWidth` renamed to `lineWidth` on layers and objects.\n * Block definition SCRIPTS are user code emitting child DTOs — they get a\n * textual rename (the token has no other meaning in block scripts; zod's\n * strip mode would otherwise silently drop the old key on evaluation).\n */\nconst migrateV3toV4 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameKey = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (!(\"strokeWidth\" in obj)) return raw;\n const { strokeWidth, ...rest } = obj;\n return { ...rest, lineWidth: obj.lineWidth ?? strokeWidth };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameKey) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? {\n ...def,\n script: def.script.replaceAll(\"strokeWidth\", \"lineWidth\"),\n }\n : def;\n })\n : doc.blockDefinitions;\n\n return {\n ...doc,\n layers: mapObjects(doc.layers),\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 4,\n };\n};\n\n/**\n * v4 → v5: text alignment semantics inverted — the value now names where the\n * text SITS relative to its anchor point (\"left\" = text left of the point)\n * instead of which edge is anchored. Stored values swap (left↔right,\n * top↔bottom) so existing documents render pixel-identically. Block scripts\n * emitting non-center text alignments are NOT rewritten (values are computed\n * data, not renameable tokens) and will render mirrored — acceptable, rare.\n */\n/** Every text object's alignment flipped (left↔right, top↔bottom), in\n * model space and every layout — the same rendering under the inverse\n * convention. Used by v4→v5 and, reversing it, v19→v20. */\nconst swapTextAlignments = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const swapH: Record<string, string> = { left: \"right\", right: \"left\" };\n const swapV: Record<string, string> = { top: \"bottom\", bottom: \"top\" };\n const swapAlign = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"text\") return raw;\n return {\n ...obj,\n ...(typeof obj.hAlign === \"string\" && swapH[obj.hAlign]\n ? { hAlign: swapH[obj.hAlign] }\n : {}),\n ...(typeof obj.vAlign === \"string\" && swapV[obj.vAlign]\n ? { vAlign: swapV[obj.vAlign] }\n : {}),\n };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(swapAlign) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts };\n};\n\nconst migrateV4toV5 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...swapTextAlignments(doc), version: 5 });\n\n/**\n * v5 → v6: the standalone \"leader\" type merges into \"text\" (which gains\n * leaderLines/arrowSize/scale). Existing text objects pick the new fields up\n * via schema defaults. Dimension styleOverrides are also cleaned: zod's\n * partial() used to bake ALL default values into any override, freezing the\n * object against document-style edits — override keys still equal to the\n * historic defaults are dropped (identical rendering, styles unfrozen).\n */\nconst DIM_OVERRIDE_HISTORIC_DEFAULTS: Record<string, number> = {\n textHeight: 2.5,\n arrowSize: 2.5,\n extensionOffset: 1,\n extensionOvershoot: 1.25,\n precision: 1,\n scale: 1,\n};\n\nconst migrateV5toV6 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type === \"leader\") return leaderRawToText(obj);\n if (\n obj.type === \"dimension\" &&\n obj.styleOverride !== null &&\n typeof obj.styleOverride === \"object\"\n ) {\n const cleaned = Object.fromEntries(\n Object.entries(obj.styleOverride).filter(\n ([k, v]) => DIM_OVERRIDE_HISTORIC_DEFAULTS[k] !== v,\n ),\n );\n return {\n ...obj,\n styleOverride: Object.keys(cleaned).length > 0 ? cleaned : undefined,\n };\n }\n return raw;\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 6 };\n};\n\n/**\n * v6 → v7: dimension `defPoints` renamed to `points` (consistent with\n * polylines). Block definition scripts get the same textual rename as the\n * v3→v4 strokeWidth migration — the token has no other meaning in scripts,\n * and zod's strip mode would otherwise silently drop the old key.\n */\nconst migrateV6toV7 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameKey = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"dimension\" || !(\"defPoints\" in obj)) return raw;\n const { defPoints, ...rest } = obj;\n return { ...rest, points: obj.points ?? defPoints };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameKey) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? { ...def, script: def.script.replaceAll(\"defPoints\", \"points\") }\n : def;\n })\n : doc.blockDefinitions;\n\n return {\n ...doc,\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 7,\n };\n};\n\n/**\n * v7 → v8: `dimStyle.scale` (the document-level annotation scale) is removed;\n * scale is per-dimension only (`styleOverride.scale`, absent = 1). A non-1\n * document scale is baked into every dimension that doesn't override it, so\n * existing drawings render identically. Block-script-emitted dimensions can't\n * be baked (their DTOs are recomputed on eval) — acceptable, rare.\n */\nconst migrateV7toV8 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const dimStyle =\n doc.dimStyle !== null && typeof doc.dimStyle === \"object\"\n ? { ...(doc.dimStyle as Record<string, unknown>) }\n : undefined;\n const docScale =\n dimStyle && typeof dimStyle.scale === \"number\" && dimStyle.scale > 0\n ? dimStyle.scale\n : 1;\n if (dimStyle) delete dimStyle.scale;\n\n const bake = (raw: unknown): unknown => {\n if (docScale === 1) return raw;\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"dimension\") return raw;\n const override =\n obj.styleOverride !== null && typeof obj.styleOverride === \"object\"\n ? (obj.styleOverride as Record<string, unknown>)\n : {};\n if (typeof override.scale === \"number\") return raw; // own scale wins\n return { ...obj, styleOverride: { ...override, scale: docScale } };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(bake) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return {\n ...doc,\n ...(dimStyle ? { dimStyle } : {}),\n objects: mapObjects(doc.objects),\n layouts,\n version: 8,\n };\n};\n\n/**\n * A raw legacy dimension → the current `offset` shape. Handles BOTH old\n * forms: the pre-v9 linePoint + rotation (\"aligned\" kind) placement, and\n * the v9–v12 `upVector` field (renamed to `offset` in v13). For\n * linear/aligned dims the offset is PERPENDICULAR to the measuring axis\n * (the axis is perp(offset) at paint time), so the conversion is\n * lossless — old axis-locked linear dims keep their points AND their\n * axis. Exported because block scripts may still EMIT legacy dimension\n * DTOs and the DXF importer builds them — blockDtos and the import\n * funnel run the same conversion.\n */\nexport const dimensionRawToOffset = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"dimension\") return raw;\n if (\"upVector\" in raw && !(\"offset\" in raw)) {\n const rest = { ...raw };\n delete rest.upVector;\n return { ...rest, offset: raw.upVector };\n }\n if (!(\"linePoint\" in raw)) return raw;\n const linePoint = raw.linePoint as { x: number; y: number };\n const points = (raw.points ?? []) as { x: number; y: number }[];\n let kind = typeof raw.kind === \"string\" ? raw.kind : \"linear\";\n if (points.length < 1 || typeof linePoint?.x !== \"number\") return raw;\n\n let offset: { x: number; y: number };\n if (kind === \"linear\" || kind === \"aligned\") {\n // Old measuring axis: the stored rotation (linear) or first→last\n // (aligned). offset = the perpendicular part of linePoint − first.\n const first = points[0];\n const last = points[points.length - 1];\n let ux = 1;\n let uy = 0;\n if (kind === \"aligned\") {\n const d = Math.hypot(last.x - first.x, last.y - first.y);\n if (d > 1e-9) {\n ux = (last.x - first.x) / d;\n uy = (last.y - first.y) / d;\n }\n } else {\n const rot = typeof raw.rotation === \"number\" ? raw.rotation : 0;\n ux = Math.cos(rot);\n uy = Math.sin(rot);\n }\n const h = -(linePoint.x - first.x) * uy + (linePoint.y - first.y) * ux;\n offset = { x: -uy * h + 0, y: ux * h + 0 }; // \"+ 0\" folds -0 into 0\n kind = \"linear\";\n } else {\n const anchor =\n kind === \"diameter\" && points.length >= 2\n ? {\n x: (points[0].x + points[1].x) / 2,\n y: (points[0].y + points[1].y) / 2,\n }\n : points[0];\n offset = { x: linePoint.x - anchor.x, y: linePoint.y - anchor.y };\n }\n\n const rest = { ...raw };\n delete rest.linePoint;\n delete rest.rotation;\n return { ...rest, kind, points, offset };\n};\n\n/**\n * v8 → v9: the dimension \"aligned\" kind merges into \"linear\" (which now\n * measures point to point), and `linePoint`/`rotation` are replaced by an\n * anchored offset vector (direction fixed at creation; the field lands\n * directly in its final v13 `offset` name).\n */\nconst migrateV8toV9 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToOffset(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 9 };\n};\n\n// The exact wrapper the v9→v10 migration produced (inputs were a RECORD\n// keyed by declared input name back then) — v10→v11 detects it to re-wrap.\n// Frozen bytes: real v10 files carry the pre-rename \"linea\" specifier, and\n// detection is a string match — never update this to \"lineadraw\".\nconst V10_WRAPPER_HEADER = `import { helpers } from \"linea\";\n\nexport const main = ({ params, inputs }) => {\n const p = { ...params, ...inputs };\n`;\nconst V10_WRAPPER_FOOTER = `\n};\n`;\n\n/**\n * v9 → v10: block scripts become ES modules — the stored string is no longer\n * a bare function body but a module exporting `main`, importing `helpers`\n * from the virtual module. Frozen historical form (pre-rename \"linea\"\n * specifier included): the wrapper it emits is the v10 (record-inputs)\n * shape; v10→v11 re-wraps it.\n */\nconst migrateV9toV10 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? {\n ...def,\n script: `${V10_WRAPPER_HEADER}${def.script}${V10_WRAPPER_FOOTER}`,\n }\n : def;\n })\n : doc.blockDefinitions;\n\n return { ...doc, blockDefinitions, version: 10 };\n};\n\n/** A pre-v11 declared input (from the definition's dropped inputs table). */\nexport interface LegacyBlockInput {\n name: string;\n repeat?: boolean;\n}\n\n/** Declared inputs of a RAW pre-v11 definition (invalid entries skipped). */\nconst legacyDeclaredInputs = (\n rawDef: Record<string, unknown>,\n): LegacyBlockInput[] => {\n if (!Array.isArray(rawDef.inputs)) return [];\n const out: LegacyBlockInput[] = [];\n for (const raw of rawDef.inputs) {\n if (raw === null || typeof raw !== \"object\") continue;\n const inp = raw as Record<string, unknown>;\n if (typeof inp.name !== \"string\" || !/^[a-zA-Z_]\\w*$/.test(inp.name))\n continue;\n out.push({ name: inp.name, repeat: inp.repeat === true });\n }\n return out;\n};\n\n/**\n * A legacy block script BODY (the pre-v10 `(p, helpers) => children` form) →\n * a v11 ES-module script. Purely mechanical: the instance's inputs array is\n * destructured back into the old declared input names (a trailing `repeat`\n * input collects the rest), and the body keeps reading `p` via a shim that\n * reproduces the old merged params+inputs object. Inputs arrive localized\n * against the pivot (the first point), which matches the old localization\n * against the insertion point. Exported because `.block` library files carry\n * the same scripts (blockFile.ts migrates old envelopes).\n */\nexport const blockScriptToModule = (\n body: string,\n declared: LegacyBlockInput[] = [],\n): string => {\n const bindings = declared.map((inp, i) =>\n inp.repeat && i === declared.length - 1 ? `...${inp.name}` : inp.name,\n );\n const destructure =\n bindings.length > 0 ? ` const [${bindings.join(\", \")}] = inputs;\\n` : \"\";\n const pSpread =\n declared.length > 0\n ? `{ ...params, ${declared.map((inp) => inp.name).join(\", \")} }`\n : \"{ ...params }\";\n return `import { helpers } from \"lineadraw\";\n\nexport const main = ({ params, inputs }) => {\n${destructure} const p = ${pSpread};\n${body}\n};\n`;\n};\n\n/**\n * A raw pre-v11 block definition → v11: the migration-generated v10 wrapper\n * is re-wrapped into the array-inputs form (other scripts pass through\n * unchanged) and the declared-inputs table is dropped. Exported because\n * `.block` library files carry the same definitions.\n */\nconst blockDefRawToV11 = (\n rawDef: Record<string, unknown>,\n): Record<string, unknown> => {\n let script = rawDef.script;\n if (\n typeof script === \"string\" &&\n script.startsWith(V10_WRAPPER_HEADER) &&\n script.endsWith(V10_WRAPPER_FOOTER)\n ) {\n const body = script.slice(\n V10_WRAPPER_HEADER.length,\n script.length - V10_WRAPPER_FOOTER.length,\n );\n script = blockScriptToModule(body, legacyDeclaredInputs(rawDef));\n }\n const rest: Record<string, unknown> = { ...rawDef, script };\n delete rest.inputs;\n return rest;\n};\n\n/**\n * v10 → v11: the block instance loses its own frame origin — `insert` is\n * replaced by the inputs array (the first point is the pivot), `args` is\n * renamed to `params`, and the record-of-named-values `inputs` flattens to\n * an array in declared order (repeat arrays splice in). Classic instances\n * become single-point instances (`inputs: [insert]`), so their pose —\n * including rotation/scale, which now apply about the pivot — survives\n * losslessly. Definitions drop the declared-inputs table (the script's\n * `place` — `defineInput` at the time — owns acquisition now) and\n * migration-shaped scripts are re-wrapped for array inputs.\n */\nconst migrateV10toV11 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const rawDefs = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.filter(\n (d): d is Record<string, unknown> =>\n d !== null && typeof d === \"object\",\n )\n : [];\n const declaredOf = new Map<string, LegacyBlockInput[]>();\n for (const def of rawDefs)\n if (typeof def.id === \"string\")\n declaredOf.set(def.id, legacyDeclaredInputs(def));\n\n const isPoint = (v: unknown): v is { x: number; y: number } =>\n v !== null &&\n typeof v === \"object\" &&\n typeof (v as { x?: unknown }).x === \"number\" &&\n typeof (v as { y?: unknown }).y === \"number\";\n\n const convert = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"block\") return raw;\n\n const declared =\n typeof obj.definitionId === \"string\"\n ? (declaredOf.get(obj.definitionId) ?? [])\n : [];\n const record =\n obj.inputs !== null &&\n typeof obj.inputs === \"object\" &&\n !Array.isArray(obj.inputs)\n ? (obj.inputs as Record<string, unknown>)\n : {};\n\n const inputs: unknown[] = [];\n if (declared.length === 0) {\n // Classic instance: the insertion point becomes the single input.\n if (isPoint(obj.insert)) inputs.push(obj.insert);\n } else {\n for (const inp of declared) {\n const v = record[inp.name];\n if (v === undefined) continue;\n if (Array.isArray(v)) inputs.push(...v);\n else inputs.push(v);\n }\n }\n\n const rest = { ...obj };\n delete rest.insert;\n delete rest.args;\n return { ...rest, params: obj.params ?? obj.args ?? {}, inputs };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) =>\n raw !== null && typeof raw === \"object\"\n ? blockDefRawToV11(raw as Record<string, unknown>)\n : raw,\n )\n : doc.blockDefinitions;\n\n return {\n ...doc,\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 11,\n };\n};\n\n/**\n * v11 → v12: viewport `scale` flips meaning from paper mm per model mm\n * (1:50 = 0.02) to the drawing-scale denominator, model mm per paper mm\n * (1:50 = 50). The stored value inverts; the projection is unchanged.\n */\nconst migrateV11toV12 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n if (!Array.isArray(layout.objects)) return raw;\n const objects = layout.objects.map((o) => {\n if (o === null || typeof o !== \"object\") return o;\n const obj = o as Record<string, unknown>;\n if (obj.type !== \"viewport\") return o;\n const scale =\n typeof obj.scale === \"number\" && obj.scale > 0 ? 1 / obj.scale : 1;\n return { ...obj, scale };\n });\n return { ...layout, objects };\n })\n : doc.layouts;\n return { ...doc, layouts, version: 12 };\n};\n\n/**\n * v12 → v13: dimension `upVector` renamed to `offset` (same anchored\n * placement vector; the old name suggested a unit direction).\n */\nconst migrateV12toV13 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToOffset(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 13 };\n};\n\n/**\n * A stored pre-v14 block definition record → a self-contained module source:\n * the record's id/name/params fold into the script as exports. Also used to\n * convert legacy `.block` library entries at import.\n */\nexport const blockDefRecordToModule = (raw: unknown): string | null => {\n if (typeof raw === \"string\") return raw; // already a module source\n if (raw === null || typeof raw !== \"object\") return null;\n const def = raw as Record<string, unknown>;\n if (typeof def.script !== \"string\") return null;\n const header: string[] = [\n `export const id = ${JSON.stringify(\n typeof def.id === \"string\" && def.id !== \"\"\n ? def.id\n : crypto.randomUUID(),\n )};`,\n `export const name = ${JSON.stringify(\n typeof def.name === \"string\" && def.name !== \"\" ? def.name : \"Block\",\n )};`,\n ];\n if (Array.isArray(def.params) && def.params.length > 0)\n header.push(`export const params = ${toJsLiteral(def.params, \"\")};`);\n return `${header.join(\"\\n\")}\\n\\n${def.script}`;\n};\n\n/**\n * v13 → v14: block definitions become raw ES-module sources — the stored\n * {id, name, params, script} record folds into the script as exports\n * (mechanical, same spirit as the v9→v11 script wrappers). Instances are\n * untouched: `definitionId` still matches the now-exported id.\n */\nconst migrateV13toV14 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions\n .map(blockDefRecordToModule)\n .filter((s): s is string => s !== null)\n : [];\n return { ...doc, blockDefinitions, version: 14 };\n};\n\n/**\n * v14 → v15: the format tag `type: \"linea\"` becomes `\"lineadraw\"` (the app\n * rename; the pre-rename tag is set unconditionally — files that predate the\n * field default-filled \"linea\" on parse).\n */\nconst migrateV14toV15 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...doc, type: \"lineadraw\", version: 15 });\n\n/**\n * A raw pre-v16 text's `arrowSize` field → `styleOverride.arrowSize`. The\n * historic per-object default (2.5) equals the new document-style default,\n * so a value still at it is dropped instead of frozen into an override —\n * identical rendering, style edits keep applying.\n */\nconst textRawArrowToOverride = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"text\" || !(\"arrowSize\" in raw)) return raw;\n const { arrowSize, ...rest } = raw;\n if (typeof arrowSize !== \"number\" || arrowSize === 2.5) return rest;\n const override =\n rest.styleOverride !== null && typeof rest.styleOverride === \"object\"\n ? (rest.styleOverride as Record<string, unknown>)\n : {};\n return {\n ...rest,\n styleOverride: { arrowSize, ...override }, // an existing key wins\n };\n};\n\n/**\n * A raw text with pre-v17 direct style fields (`font`, `widthFactor`,\n * `textHeight` — plus `arrowSize` and the `height` alias some early leader\n * conversions/scripts used) → the `styleOverride` form. Present keys fold in\n * unconditionally (they were explicit); existing override keys win.\n * `inheritTextHeight` drops a height equal to what inheritance would resolve\n * to anyway (the v16→v17 migration passes the document style's height so\n * unedited text stays unfrozen; script DTOs pass nothing — a script's height\n * is always intentional). Exported because block scripts may still EMIT the\n * old shapes (user code we can't rewrite) — blockDtos runs this conversion.\n */\nexport const textRawStyleToOverride = (\n raw: Record<string, unknown>,\n inheritTextHeight?: number,\n): Record<string, unknown> => {\n if (raw.type !== \"text\") return raw;\n const { font, widthFactor, textHeight, height, arrowSize, ...rest } = raw;\n const override: Record<string, unknown> = {};\n if (typeof font === \"string\") override.font = font;\n if (typeof widthFactor === \"number\") override.widthFactor = widthFactor;\n const h =\n typeof textHeight === \"number\"\n ? textHeight\n : typeof height === \"number\"\n ? height\n : undefined;\n if (h !== undefined && h !== inheritTextHeight) override.textHeight = h;\n if (typeof arrowSize === \"number\") override.arrowSize = arrowSize;\n const existing =\n rest.styleOverride !== null && typeof rest.styleOverride === \"object\"\n ? (rest.styleOverride as Record<string, unknown>)\n : {};\n const merged = { ...override, ...existing };\n return {\n ...rest,\n ...(Object.keys(merged).length > 0 ? { styleOverride: merged } : {}),\n };\n};\n\n/**\n * v15 → v16: text leader arrows join the document text style — the\n * per-object `arrowSize` field becomes an optional `styleOverride` entry\n * (mirroring dimensions), and the style gains `arrowSize`/`arrowType`.\n */\nconst migrateV15toV16 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? textRawArrowToOverride(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 16 };\n};\n\n/**\n * v16 → v17: the remaining direct text style fields (`font`, `widthFactor`,\n * `textHeight`) join `styleOverride`, completing the DimStyle-shaped split.\n * `textHeight` was required per-object before; a value equal to the\n * document style's height is dropped (inheritance resolves to the same\n * number — identical rendering, style edits keep applying), anything else\n * becomes an override.\n */\nconst migrateV16toV17 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const styleHeight =\n doc.textStyle !== null &&\n typeof doc.textStyle === \"object\" &&\n typeof (doc.textStyle as Record<string, unknown>).textHeight === \"number\"\n ? ((doc.textStyle as Record<string, unknown>).textHeight as number)\n : 2.5;\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? textRawStyleToOverride(raw as Record<string, unknown>, styleHeight)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 17 };\n};\n\n/**\n * A raw dimension with the pre-v18 `styleOverride.scale` key → the direct\n * `scale` field (a size multiplier is object pose, not a style override —\n * matching Text/Hatch/Block). An existing field wins; an emptied override\n * is dropped. Exported because block scripts may still EMIT the old shape\n * (user code we can't rewrite) — blockDtos runs the same conversion.\n */\nexport const dimRawScaleToField = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (\n raw.type !== \"dimension\" ||\n raw.styleOverride === null ||\n typeof raw.styleOverride !== \"object\" ||\n !(\"scale\" in raw.styleOverride)\n )\n return raw;\n const { scale, ...override } = raw.styleOverride as Record<string, unknown>;\n return {\n ...raw,\n styleOverride: Object.keys(override).length > 0 ? override : undefined,\n ...(typeof raw.scale === \"number\" || typeof scale !== \"number\"\n ? {}\n : { scale }),\n };\n};\n\n/**\n * v17 → v18: the dimension annotation scale moves from\n * `styleOverride.scale` to a direct `scale` field on the object.\n */\nconst migrateV17toV18 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimRawScaleToField(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 18 };\n};\n\n/**\n * v18 → v19: the single document `textStyle`/`dimStyle` become ARRAYS of\n * named styles (`textStyles`/`dimStyles`); the old singleton folds into the\n * first entry with a stable id (\"standard\") and name. Objects need no\n * change: `styleId` is optional and absent resolves to the first style.\n */\nconst migrateV18toV19 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const wrap = (style: unknown): Record<string, unknown>[] => [\n {\n id: \"standard\",\n name: \"Standard\",\n ...(style !== null && typeof style === \"object\"\n ? (style as Record<string, unknown>)\n : {}),\n },\n ];\n const { textStyle, dimStyle, ...rest } = doc;\n return {\n ...rest,\n textStyles: wrap(textStyle),\n dimStyles: wrap(dimStyle),\n version: 19,\n };\n};\n\n/**\n * v19 → v20: text alignment back to JUSTIFICATION — which edge sits on the\n * point, the AutoCAD / DXF meaning (\"right\" = text left of the point,\n * \"bottom\" = above it); v5 had inverted it to \"where the text sits\". The\n * swap keeps every document pixel-identical. Block scripts can't be\n * rewritten: their non-center text alignments render mirrored until the\n * block is updated (docs/adr/0002).\n */\nconst migrateV19toV20 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...swapTextAlignments(doc), version: 20 });\n\n/** Points a dimension kind needs (mirrors the schema's refinement). */\nconst dimensionPointCount = (kind: string): number =>\n kind === \"angular\" ? 3 : 2;\n\nconst wrapAngle = (a: number): number => {\n const twoPi = 2 * Math.PI;\n const r = a % twoPi;\n return r < 0 ? r + twoPi : r;\n};\n\n/**\n * A raw v20 dimension (vector `offset`, single `textOverride`) → the v21\n * shape (docs/dimension-labels.md): scalar `rotation` + `offset` for\n * linear/angular, `labels[0].along` for radial/diameter, `textOverride`\n * → per-segment label `content` (a stored `<>` becomes the kind's\n * template). Lossless for what rendered: every mapping is the projection\n * the v20 geometry applied. Returns null for a dimension with too few\n * points for its kind (it rendered nothing). Already-v21 input passes\n * through, so block scripts and agents emitting either shape are accepted\n * (blockDtos and the DXF importer run this after `dimensionRawToOffset`).\n */\nexport const dimensionRawToLabels = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"dimension\") return raw;\n // The v20 vector, as stored ({x, y}) or as a script/agent tuple.\n const legacyOffset = Array.isArray(raw.offset)\n ? { x: Number(raw.offset[0]), y: Number(raw.offset[1]) }\n : raw.offset !== null && typeof raw.offset === \"object\"\n ? (raw.offset as { x: number; y: number })\n : null;\n if (legacyOffset === null && !(\"textOverride\" in raw)) return raw;\n const kind = typeof raw.kind === \"string\" ? raw.kind : \"linear\";\n const points = (Array.isArray(raw.points) ? raw.points : []) as {\n x: number;\n y: number;\n }[];\n // Too few points for the kind: convert what can be (so the schema's\n // point-count message is the one error left), place nothing.\n const tooFew = points.length < dimensionPointCount(kind);\n\n const out: Record<string, unknown> = { ...raw };\n delete out.textOverride;\n const labels: Record<string, unknown>[] = Array.isArray(raw.labels)\n ? (raw.labels as Record<string, unknown>[]).map((l) => ({ ...l }))\n : [];\n const label = (i: number): Record<string, unknown> => (labels[i] ??= {});\n\n if (legacyOffset) {\n const v = legacyOffset;\n const vLen = Math.hypot(v.x, v.y);\n if (kind === \"linear\") {\n delete out.rotation;\n if (vLen < 1e-9 || tooFew) out.offset = 0;\n else {\n // v20 measured along perp(offset); keep that axis, normalized into\n // (-90°, 90°] so a horizontal dimension reads rotation 0 and the\n // offset's sign says which side (positive = left of the axis).\n let ux = -v.y / vLen;\n let uy = v.x / vLen;\n if (ux < 0 || (ux === 0 && uy < 0)) {\n ux = -ux;\n uy = -uy;\n }\n out.rotation = Math.atan2(uy, ux);\n out.offset = v.x * -uy + v.y * ux; // dot(v, perp(u))\n }\n } else if (kind === \"angular\") {\n if (tooFew) out.offset = vLen;\n else {\n const [vertex, a, b] = points;\n const angA = Math.atan2(a.y - vertex.y, a.x - vertex.x);\n const angB = Math.atan2(b.y - vertex.y, b.x - vertex.x);\n const angL = Math.atan2(v.y, v.x);\n const inAB = wrapAngle(angL - angA) <= wrapAngle(angB - angA);\n out.offset = inAB ? vLen : -vLen;\n }\n } else {\n delete out.offset;\n const [p0, p1] = points;\n const d = tooFew ? 0 : Math.hypot(p1.x - p0.x, p1.y - p0.y);\n if (d > 1e-9) {\n const ux = (p1.x - p0.x) / d;\n const uy = (p1.y - p0.y) / d;\n // radial: from the center along the ray; diameter: the v20 anchor\n // was the midpoint, which is the v21 origin (the center).\n label(0).along = v.x * ux + v.y * uy;\n }\n }\n }\n\n if (typeof raw.textOverride === \"string\") {\n const template: Record<string, string> = {\n linear: \"{value}\",\n angular: \"{value}°\",\n radial: \"R{value}\",\n diameter: \"Ø{value}\",\n };\n const content = raw.textOverride.replaceAll(\n \"<>\",\n template[kind] ?? \"{value}\",\n );\n const segments = kind === \"linear\" ? Math.max(1, points.length - 1) : 1;\n for (let i = 0; i < segments; i++) label(i).content = content;\n }\n\n if (labels.length > 0) out.labels = labels;\n return out;\n};\n\n/**\n * v20 → v21: dimension placement as scalars and per-segment labels\n * (docs/dimension-labels.md): `offset` vector → `rotation` + signed\n * `offset` (linear), signed radius (angular), `labels[0].along` (radial /\n * diameter); `textOverride` → `labels[i].content`. Dimensions with too few\n * points for their kind are dropped (they rendered nothing).\n */\nconst migrateV20toV21 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const degenerate = (raw: Record<string, unknown>): boolean =>\n raw.type === \"dimension\" &&\n (Array.isArray(raw.points) ? raw.points.length : 0) <\n dimensionPointCount(typeof raw.kind === \"string\" ? raw.kind : \"linear\");\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list)\n ? list\n .filter(\n (raw) =>\n raw === null ||\n typeof raw !== \"object\" ||\n !degenerate(raw as Record<string, unknown>),\n )\n .map((raw) =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToLabels(raw as Record<string, unknown>)\n : raw,\n )\n : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 21 };\n};\n\n/**\n * v21 → v22: no data change. Texts, table cells and dimension labels gained\n * optional `spans` (rich text, docs/rich-text.md §11.1), and table cells'\n * `text` became `content` — the cell schema still reads `text`\n * (objects.ts `cellInput`), so old bodies need no rewrite here. The bump\n * makes older builds REFUSE these files instead of silently dropping the\n * formatting / losing every cell's text on their next save.\n */\nconst migrateV21toV22 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...doc, version: 22 });\n\n/**\n * A raw v22 `image` object → a v23 `reference` embedding the same asset\n * (docs/adr/0005). The reference draws the file at its natural size (px at\n * 96 dpi) scaled UNIFORMLY: the image's width is kept, a stretched image's\n * height follows the pixel aspect. Base fields (layer, color, opacity…)\n * carry over.\n */\nconst imageRawToReference = (\n raw: Record<string, unknown>,\n assets: Record<string, unknown>,\n): Record<string, unknown> => {\n const rest = { ...raw };\n delete rest.assetId;\n delete rest.origin;\n delete rest.width;\n delete rest.height;\n const assetId = typeof raw.assetId === \"string\" ? raw.assetId : \"\";\n const data = assets[assetId];\n const width = typeof raw.width === \"number\" && raw.width > 0 ? raw.width : 1;\n const height =\n typeof raw.height === \"number\" && raw.height > 0 ? raw.height : 1;\n let px: { width: number; height: number } | null;\n try {\n px = typeof data === \"string\" ? imagePixelSize(dataUrlBytes(data)) : null;\n } catch {\n px = null; // not a decodable data URL\n }\n // Natural size in mm; unknown pixels → the stored size at scale 1.\n const w = px ? px.width * PX_TO_MM : width;\n const h = px ? px.height * PX_TO_MM : height;\n return {\n ...rest,\n type: \"reference\",\n format:\n typeof data === \"string\" && dataUrlMime(data) === \"image/jpeg\"\n ? \"jpg\"\n : \"png\",\n name: \"Image\",\n source: { kind: \"asset\", assetId: assetId || \"missing\" },\n position: raw.origin ?? { x: 0, y: 0 },\n rotation: typeof raw.rotation === \"number\" ? raw.rotation : 0,\n scale: width / w,\n extent: { minX: 0, minY: 0, maxX: w, maxY: h },\n };\n};\n\n/** v22 → v23: `image` objects become embedded references (docs/adr/0005). */\nconst migrateV22toV23 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const assets =\n doc.assets !== null && typeof doc.assets === \"object\"\n ? (doc.assets as Record<string, unknown>)\n : {};\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list)\n ? list.map((raw) =>\n raw !== null &&\n typeof raw === \"object\" &&\n (raw as Record<string, unknown>).type === \"image\"\n ? imageRawToReference(raw as Record<string, unknown>, assets)\n : raw,\n )\n : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 23 };\n};\n\n/**\n * v24 adds shapes, nothing to convert: block instances of a module with an\n * `inputs` table store their inputs as a record by name, and a `data`\n * param holds any JSON value (docs/block-inputs-and-handles.md §1, §5.1).\n * The bump only makes an older app refuse such a file instead of dropping\n * what it can't read.\n */\nconst migrateV23toV24 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...doc, version: 24 });\n\n/** Step N-1 migrates version N to N+1 (so the array has CURRENT-1 entries). */\nconst MIGRATION_STEPS = [\n migrateV1toV2,\n migrateV2toV3,\n migrateV3toV4,\n migrateV4toV5,\n migrateV5toV6,\n migrateV6toV7,\n migrateV7toV8,\n migrateV8toV9,\n migrateV9toV10,\n migrateV10toV11,\n migrateV11toV12,\n migrateV12toV13,\n migrateV13toV14,\n migrateV14toV15,\n migrateV15toV16,\n migrateV16toV17,\n migrateV17toV18,\n migrateV18toV19,\n migrateV19toV20,\n migrateV20toV21,\n migrateV21toV22,\n migrateV22toV23,\n migrateV23toV24,\n];\n\nexport function migrateDocument(raw: unknown): unknown {\n if (raw === null || typeof raw !== \"object\") return raw;\n let doc = raw as Record<string, unknown>;\n const version =\n typeof doc.version === \"number\" ? doc.version : CURRENT_DOCUMENT_VERSION;\n if (\n !Number.isInteger(version) ||\n version < 1 ||\n version > CURRENT_DOCUMENT_VERSION\n ) {\n // Loading a newer (or unknown) format \"as-is\" silently drops whatever\n // that version added, then SAVES the mangled result as the current\n // version — refuse instead and let the caller surface it.\n throw new Error(\n `Unsupported Linea document version ${version} (this build reads up to ${CURRENT_DOCUMENT_VERSION}). Open it with a newer Linea instead.`,\n );\n }\n for (let v = version; v < CURRENT_DOCUMENT_VERSION; v++) {\n doc = MIGRATION_STEPS[v - 1](doc);\n }\n return doc;\n}\n","// Custom handles on block instances (docs/block-inputs-and-handles.md §3,\n// ADR 0007): a module's `handles({ params, inputs })` returns handle\n// records in block-LOCAL coordinates; the editor interprets them. This file\n// is the pure part — the record schema + author-facing checks, constraint\n// projection, turning a drag / click into a PATCH, and applying a patch to\n// an instance (unknown names dropped, numbers clamped). Evaluation (calling\n// the module, memoized beside `draw`) lives in evalBlock.ts.\n\nimport { z } from \"zod\";\nimport { Vec2Schema } from \"../model/common\";\nimport {\n ParamDefSchema,\n paramMismatch,\n valueParams,\n type InputDef,\n type ParamDef,\n type ValueParamDef,\n} from \"../model/blockDefinition\";\nimport { blockPivot, type Block } from \"../model/objects\";\nimport { isNamedInputs, type NamedInputValue } from \"../model/blockInputs\";\nimport {\n add,\n dist,\n dot,\n mid,\n norm,\n perp,\n rot,\n scale,\n sub,\n type Vec2,\n} from \"../geometry/vec2\";\n\n/** Marker shapes the overlay paints (cosmetic: triangle/arrow = \"pull this\n * way\", double-arrow = \"slides both ways\", diamond = \"options here\",\n * plus/minus = \"add/remove\"). */\nexport const HANDLE_SHAPES = [\n \"square\",\n \"circle\",\n \"diamond\",\n \"triangle\",\n \"arrow\",\n \"double-arrow\",\n \"plus\",\n \"minus\",\n] as const;\n\n/** Icons a handle may show — a small allowlist of lucide glyphs the overlay\n * draws without the DOM (editor canvas/handleIcons.ts). */\nexport const HANDLE_ICONS = [\n \"plus\",\n \"minus\",\n \"x\",\n \"check\",\n \"flip-horizontal\",\n \"flip-vertical\",\n \"rotate-cw\",\n \"rotate-ccw\",\n \"refresh-cw\",\n \"arrow-left-right\",\n \"arrow-up-down\",\n \"settings-2\",\n \"ellipsis\",\n] as const;\n\nconst fn = z.custom<(...args: never[]) => unknown>(\n (v) => typeof v === \"function\",\n { message: \"expected a function\" },\n);\n\n/** A button in a handle's hover menu, or in the instance's context menu\n * (the module's top-level `actions`). */\nconst ActionSchema = z.strictObject({\n label: z.string().min(1),\n icon: z.enum(HANDLE_ICONS).optional(),\n /** Pick a point first; `run` receives it (block-local) as `point`. */\n pick: z.literal(\"point\").optional(),\n run: fn,\n});\nexport type BlockAction = z.infer<typeof ActionSchema>;\n\n/** A hover-menu field: a param by name, or a field bound to any value the\n * handles function computed, with `set(v)` returning the patch. */\nconst MenuFieldSchema = z.union([\n z.string(),\n z.strictObject({\n field: z.record(z.string(), z.unknown()),\n value: z.unknown(),\n set: fn,\n }),\n]);\n\nconst RawHandleSchema = z\n .strictObject({\n id: z.string().min(1),\n kind: z.enum([\"point\", \"line\"]).default(\"point\"),\n /** Point handles: where it sits. */\n at: Vec2Schema.optional(),\n /** Line handles: the segment. */\n from: Vec2Schema.optional(),\n to: Vec2Schema.optional(),\n label: z.string().optional(),\n shape: z.enum(HANDLE_SHAPES).optional(),\n /** Radians — points a triangle / arrow (default: the constraint's axis). */\n direction: z.number().optional(),\n along: z\n .strictObject({\n /** Point handles: required. Line handles: defaults to `from`. */\n origin: Vec2Schema.optional(),\n direction: Vec2Schema,\n min: z.number().optional(),\n max: z.number().optional(),\n })\n .optional(),\n around: z.strictObject({ center: Vec2Schema }).optional(),\n fixed: z.boolean().optional(),\n param: z.string().optional(),\n input: z\n .union([\n z.string(),\n z.strictObject({ name: z.string(), index: z.number().int().min(0) }),\n ])\n .optional(),\n drag: fn.optional(),\n click: fn.optional(),\n icon: z.enum(HANDLE_ICONS).optional(),\n menu: z.array(MenuFieldSchema).optional(),\n actions: z.array(ActionSchema).optional(),\n })\n .superRefine((h, ctx) => {\n const issue = (message: string) => ctx.addIssue({ code: \"custom\", message });\n const behaviours = [h.param, h.input, h.drag].filter(\n (b) => b !== undefined,\n ).length;\n if (h.kind === \"point\") {\n if (!h.at) issue(\"a point handle needs `at`\");\n if (h.along && !h.along.origin) issue(\"`along` needs an `origin`\");\n } else {\n if (!h.from || !h.to) issue(\"a line handle needs `from` and `to`\");\n if (h.around) issue(\"a line handle drags along a direction, not `around`\");\n if (h.input !== undefined) issue(\"a line handle can't move an `input`\");\n }\n if (behaviours > 1) issue(\"give a handle ONE of `param`, `input` or `drag`\");\n if (h.along && h.around)\n issue(\"`along` and `around` are alternative constraints — pick one\");\n if (\n !h.fixed &&\n behaviours === 0 &&\n !h.click &&\n !h.menu?.length &&\n !h.actions?.length\n )\n issue(\n \"the handle does nothing — add `param`, `input`, `drag`, `click`, `menu` or `actions`, or mark it `fixed`\",\n );\n if (h.kind === \"point\" && h.param !== undefined && !h.along && !h.around)\n issue(\"a `param` handle needs `along` or `around` (what value it measures)\");\n if (h.along && Math.hypot(h.along.direction.x, h.along.direction.y) === 0)\n issue(\"`along.direction` is zero\");\n });\n\n/** One hover-menu field, resolved: the field definition, its current value,\n * and what an edit writes (the named param, or `set`). */\nexport interface BlockMenuField {\n def: ValueParamDef;\n value: unknown;\n /** A param field: edits write this param. */\n param?: string;\n /** A value-bound field: edits call this for the patch. */\n set?: (value: never) => unknown;\n}\n\n/** One evaluated handle, block-local. A line handle's `at` is its\n * midpoint; `drag` / `click` / `set` / `run` are the module's own functions\n * (called only through the patch helpers below). */\nexport type BlockHandle = Omit<\n z.infer<typeof RawHandleSchema>,\n \"at\" | \"along\" | \"menu\" | \"actions\"\n> & {\n at: Vec2;\n along?: { origin: Vec2; direction: Vec2; min?: number; max?: number };\n menu: BlockMenuField[];\n actions: BlockAction[];\n};\n\n/** What a drag / click / action changes. `inputs` are block-local (the host\n * maps them to world) and only apply to instances storing inputs by name. */\nexport interface HandlePatch {\n params?: Record<string, unknown>;\n inputs?: Record<string, unknown>;\n}\n\nconst PatchSchema = z.strictObject({\n params: z.record(z.string(), z.unknown()).optional(),\n inputs: z.record(z.string(), z.unknown()).optional(),\n});\n\n/** Can it be dragged (vs a button / menu-only marker)? */\nexport const isDraggableHandle = (h: BlockHandle): boolean =>\n !h.fixed &&\n (h.param !== undefined || h.input !== undefined || h.drag !== undefined);\n\nconst author = (where: string, e: z.ZodError): Error => {\n const issue = e.issues[0];\n const path = [where, ...(issue?.path ?? [])].join(\".\");\n return new Error(`Invalid ${path}: ${issue?.message ?? \"invalid\"}`);\n};\n\n/** A module's top-level `actions` (the instance's context menu). */\nexport const parseBlockActions = (raw: unknown): BlockAction[] => {\n if (raw === undefined) return [];\n const parsed = z.array(ActionSchema).safeParse(raw);\n if (!parsed.success) throw author(\"actions\", parsed.error);\n return parsed.data;\n};\n\nconst resolveMenuField = (\n handleId: string,\n raw: z.infer<typeof MenuFieldSchema>,\n params: readonly ParamDef[],\n values: Readonly<Record<string, unknown>>,\n j: number,\n): BlockMenuField => {\n if (typeof raw === \"string\") {\n const def = valueParams(params).find((p) => p.name === raw);\n if (!def || def.type === \"data\")\n throw new Error(\n `Handle \"${handleId}\": menu field \"${raw}\" is not an editable parameter`,\n );\n return { def, value: values[raw], param: raw };\n }\n const parsed = ParamDefSchema.safeParse({\n label: \"Value\",\n ...raw.field,\n name: `field${j}`,\n default: raw.value,\n });\n if (!parsed.success)\n throw author(`handle \"${handleId}\" menu.${j}.field`, parsed.error);\n const def = parsed.data;\n if (def.type === \"label\" || def.type === \"row\" || def.type === \"data\")\n throw new Error(\n `Handle \"${handleId}\": menu field ${j} must be a value field (not ${def.type})`,\n );\n return { def, value: raw.value, set: raw.set as BlockMenuField[\"set\"] };\n};\n\n/**\n * Validate a module's `handles(...)` result against its tables, with\n * author-facing errors: unique ids, every `param` a NUMBER param, every\n * `input` a declared point / points input, every menu field editable.\n * `values` are the instance's current params (a param menu field's value).\n */\nexport const parseBlockHandles = (\n raw: unknown,\n params: readonly ParamDef[],\n inputs: readonly InputDef[] | undefined,\n values: Readonly<Record<string, unknown>> = {},\n): BlockHandle[] => {\n if (!Array.isArray(raw))\n throw new Error(\"`handles` must return an array of handle records\");\n const seen = new Set<string>();\n return raw.map((r, i): BlockHandle => {\n const parsed = RawHandleSchema.safeParse(r);\n if (!parsed.success) throw author(`handle ${i}`, parsed.error);\n const h = parsed.data;\n if (seen.has(h.id)) throw new Error(`Duplicate handle id \"${h.id}\"`);\n seen.add(h.id);\n if (h.param !== undefined) {\n const def = valueParams(params).find((p) => p.name === h.param);\n if (!def || def.type !== \"number\")\n throw new Error(\n `Handle \"${h.id}\": \\`param\\` \"${h.param}\" is not a number parameter`,\n );\n }\n if (h.input !== undefined) {\n const name = typeof h.input === \"string\" ? h.input : h.input.name;\n const def = inputs?.find((d) => d.name === name);\n const ok =\n typeof h.input === \"string\"\n ? def?.type === \"point\"\n : def?.type === \"points\";\n if (!ok)\n throw new Error(\n `Handle \"${h.id}\": \\`input\\` \"${name}\" must name a declared ${\n typeof h.input === \"string\" ? \"point\" : \"points\"\n } input`,\n );\n }\n const at = h.kind === \"line\" ? mid(h.from!, h.to!) : h.at!;\n return {\n ...h,\n at,\n along: h.along && {\n ...h.along,\n origin: h.along.origin ?? h.from ?? at,\n },\n menu: (h.menu ?? []).map((m, j) =>\n resolveMenuField(h.id, m, params, values, j),\n ),\n actions: h.actions ?? [],\n };\n });\n};\n\n/**\n * The cursor (block-local) under the handle's constraint: `along` projects\n * onto the axis (value = signed distance from `origin`, clamped by\n * min/max), `around` onto the circle through `at` (value = the angle,\n * radians); a LINE handle without `along` moves along its normal (value =\n * the signed offset from the line, left of from → to positive); a free\n * point passes through (no value).\n */\nexport const constrainHandle = (\n h: BlockHandle,\n p: Vec2,\n): { point: Vec2; value: number | undefined } => {\n if (h.along) {\n const d = norm(h.along.direction);\n let t = dot(sub(p, h.along.origin), d);\n if (h.along.min !== undefined) t = Math.max(h.along.min, t);\n if (h.along.max !== undefined) t = Math.min(h.along.max, t);\n return { point: add(h.along.origin, scale(d, t)), value: t };\n }\n if (h.around) {\n const c = h.around.center;\n const angle = Math.atan2(p.y - c.y, p.x - c.x);\n const r = dist(h.at, c);\n return {\n point: { x: c.x + r * Math.cos(angle), y: c.y + r * Math.sin(angle) },\n value: angle,\n };\n }\n if (h.kind === \"line\" && h.from && h.to) {\n const n = norm(perp(sub(h.to, h.from)));\n const value = dot(sub(p, h.from), n);\n return { point: add(h.at, scale(n, value)), value };\n }\n return { point: p, value: undefined };\n};\n\n/** The values a handle's functions receive (draw's params / inputs). */\nexport interface HandleState {\n params: Readonly<Record<string, unknown>>;\n inputs: unknown;\n}\n\nconst checkPatch = (who: string, raw: unknown): HandlePatch | null => {\n if (raw === undefined || raw === null) return null;\n const parsed = PatchSchema.safeParse(raw);\n if (!parsed.success)\n throw new Error(\n `${who} must return { params?, inputs? } — ${parsed.error.issues[0]?.message ?? \"invalid\"}`,\n );\n return parsed.data;\n};\n\n/** A drag to block-local `p` → the patch it makes (null: nothing). */\nexport const dragPatch = (\n h: BlockHandle,\n state: HandleState,\n p: Vec2,\n): HandlePatch | null => {\n if (!isDraggableHandle(h)) return null;\n const { point, value } = constrainHandle(h, p);\n if (h.param !== undefined)\n return value === undefined ? null : { params: { [h.param]: value } };\n if (typeof h.input === \"string\") return { inputs: { [h.input]: point } };\n if (h.input) {\n const list = (state.inputs as Record<string, unknown>)[h.input.name];\n if (!Array.isArray(list) || h.input.index >= list.length) return null;\n const next = [...(list as Vec2[])];\n next[h.input.index] = point;\n return { inputs: { [h.input.name]: next } };\n }\n return checkPatch(\n `Handle \"${h.id}\" drag`,\n h.drag!({ ...state, point, start: h.at, value } as never),\n );\n};\n\n/** A click on a button handle → its patch. */\nexport const clickPatch = (\n h: BlockHandle,\n state: HandleState,\n): HandlePatch | null =>\n h.click\n ? checkPatch(`Handle \"${h.id}\" click`, h.click(state as never))\n : null;\n\n/** A hover-menu field edit → its patch. */\nexport const menuFieldPatch = (\n field: BlockMenuField,\n value: unknown,\n): HandlePatch | null =>\n field.param !== undefined\n ? { params: { [field.param]: value } }\n : checkPatch(\"A menu field's `set`\", field.set!(value as never));\n\n/** Running an action (handle menu or context menu) → its patch. `point`\n * is the picked point, block-local, for an action with `pick`. */\nexport const actionPatch = (\n action: BlockAction,\n state: HandleState,\n point?: Vec2,\n): HandlePatch | null =>\n checkPatch(\n `Action \"${action.label}\"`,\n action.run({ ...state, point } as never),\n );\n\n/** Where an instance's block-local frame sits in the world. */\nexport interface BlockPose {\n pivot: Vec2;\n rotation: number;\n scale: number;\n}\n\n/** An instance's OWN pose (pivot = its first point). */\nexport const blockOwnPose = (b: Block): BlockPose => ({\n pivot: blockPivot(b),\n rotation: b.rotation,\n scale: b.scale,\n});\n\n/** Block-local → world through a pose. */\nexport const poseToWorld = (pose: BlockPose, p: Vec2): Vec2 =>\n add(pose.pivot, rot(scale(p, pose.scale), pose.rotation));\n\n/** World → block-local through a pose. */\nexport const poseToLocal = (pose: BlockPose, p: Vec2): Vec2 =>\n scale(rot(sub(p, pose.pivot), -pose.rotation), 1 / pose.scale);\n\n/** Block-local → world through the instance's OWN pose (a hosted\n * instance draws in its host's — see evalBlock instancePose). */\nexport const blockLocalToWorld = (b: Block, p: Vec2): Vec2 =>\n poseToWorld(blockOwnPose(b), p);\n\n/** World → block-local (inverse of blockLocalToWorld). */\nexport const blockWorldToLocal = (b: Block, p: Vec2): Vec2 =>\n poseToLocal(blockOwnPose(b), p);\n\n/**\n * Apply a patch to an instance, checked against the module's tables:\n * unknown params / inputs are dropped (and named in `dropped`), numbers are\n * clamped to min / max (and rounded for `integer`), other mismatched values\n * dropped. Inputs apply only to instances storing them by name; points are\n * mapped block-local → world with the PRE-patch pose.\n */\nexport const applyHandlePatch = (\n instance: Block,\n params: readonly ParamDef[],\n inputs: readonly InputDef[] | undefined,\n patch: HandlePatch,\n /** The frame the patch's points are in (default: the instance's own). */\n pose: BlockPose = blockOwnPose(instance),\n): { instance: Block; dropped: string[] } => {\n const dropped: string[] = [];\n const nextParams: Block[\"params\"] = { ...instance.params };\n for (const [name, raw] of Object.entries(patch.params ?? {})) {\n const def = valueParams(params).find((p) => p.name === name);\n let v = raw;\n if (def?.type === \"number\" && typeof v === \"number\" && Number.isFinite(v)) {\n if (def.min !== undefined) v = Math.max(def.min, v as number);\n if (def.max !== undefined) v = Math.min(def.max, v as number);\n if (def.integer) v = Math.round(v as number);\n }\n if (!def || paramMismatch(def, v) !== null) {\n dropped.push(`params.${name}`);\n continue;\n }\n nextParams[name] = v as Block[\"params\"][string];\n }\n let nextInputs = instance.inputs;\n if (patch.inputs) {\n if (!isNamedInputs(instance.inputs)) {\n dropped.push(...Object.keys(patch.inputs).map((n) => `inputs.${n}`));\n } else {\n const rec: Record<string, NamedInputValue> = { ...instance.inputs };\n const toWorld = (p: unknown): Vec2 | null => {\n const parsed = Vec2Schema.safeParse(p);\n return parsed.success ? poseToWorld(pose, parsed.data) : null;\n };\n for (const [name, raw] of Object.entries(patch.inputs)) {\n const def = inputs?.find((d) => d.name === name);\n let v: NamedInputValue | null = null;\n if (def?.type === \"point\") v = toWorld(raw);\n else if (def?.type === \"points\" && Array.isArray(raw)) {\n const pts = raw.map(toWorld);\n const okCount =\n pts.length >= def.min &&\n (def.max === undefined || pts.length <= def.max);\n v = okCount && pts.every((p) => p !== null) ? (pts as Vec2[]) : null;\n } else if (def?.type === \"object\" && typeof raw === \"string\") v = raw;\n else if (\n def?.type === \"objects\" &&\n Array.isArray(raw) &&\n raw.every((id) => typeof id === \"string\")\n )\n v = raw as string[];\n if (v === null) dropped.push(`inputs.${name}`);\n else rec[name] = v;\n }\n nextInputs = rec;\n }\n }\n return {\n instance: { ...instance, params: nextParams, inputs: nextInputs },\n dropped,\n };\n};\n","// The geometry helpers block scripts import from the virtual \"lineadraw/helpers\"\n// module. SELF-CONTAINED ON PURPOSE: this file is a typings source for the\n// generated lineadraw.d.ts (npm run gen:lineadraw-dts) — no imports allowed; every\n// exported declaration lands verbatim inside `declare module \"lineadraw/helpers\"`,\n// so IntelliSense derives from the implementation and cannot drift.\n\n/** A 2D point (mm, y-up). A type ALIAS so editor hovers expand its shape. */\nexport type Vec2 = {\n x: number;\n y: number;\n};\n\n/** [0, 1, ..., n-1] — handy for repeating geometry. */\nexport const range = (n: number): number[] => [\n ...Array(Math.max(0, Math.floor(n))).keys(),\n];\n\n/** Point at `distance` from `p` in direction `angle` (radians, CCW). */\nexport const polar = (angle: number, distance: number, p?: Vec2): Vec2 => ({\n x: Math.cos(angle) * distance + (p ? p.x : 0),\n y: Math.sin(angle) * distance + (p ? p.y : 0),\n});\n\n/** Radians → degrees. */\nexport const toDeg = (r: number): number => (r * 180) / Math.PI;\n\n/** Degrees → radians. */\nexport const toRad = (d: number): number => (d * Math.PI) / 180;\n\n/** Length of a vector/point. */\nexport const len = (p: Vec2): number => Math.hypot(p.x, p.y);\n\n/** Distance between two points. */\nexport const dist = (a: Vec2, b: Vec2): number =>\n Math.hypot(b.x - a.x, b.y - a.y);\n\n/** Vector/point sum. */\nexport const add = (a: Vec2, b: Vec2): Vec2 => ({\n x: a.x + b.x,\n y: a.y + b.y,\n});\n\n/** Vector/point difference (a − b). */\nexport const sub = (a: Vec2, b: Vec2): Vec2 => ({\n x: a.x - b.x,\n y: a.y - b.y,\n});\n\n/** Scale a vector by a factor. */\nexport const scale = (p: Vec2, s: number): Vec2 => ({\n x: p.x * s,\n y: p.y * s,\n});\n\n/** Unit vector (a zero vector stays zero). */\nexport const norm = (p: Vec2): Vec2 => {\n const length = Math.hypot(p.x, p.y);\n return length === 0 ? { x: 0, y: 0 } : { x: p.x / length, y: p.y / length };\n};\n\n/** Dot product. */\nexport const dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n\n/** Rotate vector by `angle` (radians, CCW). */\nexport const rotate = (p: Vec2, angle: number): Vec2 => {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return { x: p.x * cos - p.y * sin, y: p.x * sin + p.y * cos };\n};\n","// Polygon booleans for block scripts — part of the virtual \"lineadraw/helpers\"\n// module (docs/block-inputs-and-handles.md §5.4): `union`, `difference`,\n// `intersection` over polygon-clipping. The generator appends this file's\n// declarations to the helpers module, so the EXPORTED signatures must use\n// only types declared here (implementation-only imports are elided from\n// the declarations; a declared name must not clash with scriptHelpers.ts).\n\nimport polygonClipping, {\n type Geom,\n type Polygon as ClipPolygon,\n type Ring as ClipRing,\n} from \"polygon-clipping\";\n\n/** A point as scripts write it: [x, y] or { x, y }. */\nexport type PointLike =\n | readonly [number, number]\n | { readonly x: number; readonly y: number };\n\n/** A polygon: one ring of points (implicitly closed), or several rings —\n * the first the outer boundary, the rest holes. */\nexport type PolygonLike =\n | readonly PointLike[]\n | readonly (readonly PointLike[])[];\n\n/** A result ring: closed implicitly (the first point is not repeated). */\nexport type Ring = { x: number; y: number }[];\n\nconst isPointLike = (v: unknown): v is PointLike =>\n Array.isArray(v)\n ? typeof v[0] === \"number\"\n : typeof v === \"object\" && v !== null && \"x\" in v;\n\nconst toXY = (p: PointLike): [number, number] =>\n \"x\" in p ? [p.x, p.y] : [p[0], p[1]];\n\nconst toClipPolygon = (poly: PolygonLike): ClipPolygon => {\n const rings = (\n poly.length > 0 && isPointLike(poly[0]) ? [poly] : poly\n ) as readonly (readonly PointLike[])[];\n return rings\n .filter((r) => r.length >= 3)\n .map((r): ClipRing => r.map(toXY));\n};\n\nconst fromGeom = (multi: [number, number][][][]): Ring[] =>\n multi.flatMap((polygon) =>\n polygon.map((ring) => {\n const pts = ring.map(([x, y]) => ({ x, y }));\n const [first, last] = [pts[0], pts[pts.length - 1]];\n // polygon-clipping repeats the first point at the end.\n if (pts.length > 1 && first.x === last.x && first.y === last.y)\n pts.pop();\n return pts;\n }),\n );\n\nconst geoms = (polys: readonly PolygonLike[]): Geom[] =>\n polys.map(toClipPolygon).filter((p) => p.length > 0);\n\n/**\n * The union of polygons: overlapping walls become one outline. Returns\n * every ring of the result — outer boundaries and holes alike. Draw them as\n * closed polylines, or hand them all to ONE hatch (`loops: rings.map((r) =>\n * ({ points: r }))`): hatches fill even-odd, so holes stay holes.\n */\nexport const union = (...polygons: PolygonLike[]): Ring[] => {\n const gs = geoms(polygons);\n if (gs.length === 0) return [];\n return fromGeom(polygonClipping.union(gs[0], ...gs.slice(1)));\n};\n\n/** `subject` minus every clip polygon (openings cut from a wall). Same\n * result rings as `union`. */\nexport const difference = (\n subject: PolygonLike,\n ...clips: PolygonLike[]\n): Ring[] => {\n const [s] = geoms([subject]);\n if (!s) return [];\n return fromGeom(polygonClipping.difference(s, ...geoms(clips)));\n};\n\n/** Where ALL the polygons overlap. Same result rings as `union`. */\nexport const intersection = (...polygons: PolygonLike[]): Ring[] => {\n const gs = geoms(polygons);\n if (gs.length === 0) return [];\n return fromGeom(polygonClipping.intersection(gs[0], ...gs.slice(1)));\n};\n","\nexport default class Node<Key, Value> {\n public key:Key;\n public data:any;\n public left:Node<Key, Value>|null;\n public right:Node<Key, Value>|null;\n public next:Node<Key, Value>|null = null;\n\n constructor (key:Key, data?:any) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}","import Node from \"./node\";\nimport { Key, Value } from \"./types\";\n\nexport type Comparator<Key> = (a: Key, b: Key) => number;\nexport type Visitor<Key, Value> = (\n node: Node<Key, Value>\n) => undefined | boolean | void;\nexport type NodePrinter<Key, Value> = (node: Node<Key, Value>) => string;\n\n/* follows \"An implementation of top-down splaying\"\n * by D. Sleator <sleator@cs.cmu.edu> March 1992\n */\n\nfunction DEFAULT_COMPARE(a: Key, b: Key): number {\n return a > b ? 1 : a < b ? -1 : 0;\n}\n\ntype TreeNodeList<Key, Value> = { head: Node<Key, Value> | null };\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n */\nfunction splay(\n i: Key,\n t: Node<Key, Value>,\n comparator: Comparator<Key>\n): Node<Key, Value> {\n const N = new Node(null, null);\n let l = N;\n let r = N;\n\n while (true) {\n const cmp = comparator(i, t!.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t!.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n const y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n const y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else break;\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\nfunction insert(\n i: Key,\n data: Value,\n t: Node<Key, Value>,\n comparator: Comparator<Key>\n): Node<Key, Value> {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\nfunction split(\n key: Key,\n v: Node<Key, Value>,\n comparator: Comparator<Key>\n): {\n left: Node<Key, Value> | null;\n right: Node<Key, Value> | null;\n} {\n let left = null;\n let right = null;\n if (v) {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\nfunction merge(\n left: Node<Key, Value> | null,\n right: Node<Key, Value> | null,\n comparator: Comparator<Key>\n) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\ntype StringCollector = (s: string) => void;\n\n/**\n * Prints level of the tree\n */\nfunction printRow(\n root: Node<Key, Value>,\n prefix: string,\n isTail: boolean,\n out: StringCollector,\n printNode: NodePrinter<Key, Value>\n) {\n if (root) {\n out(`${prefix}${isTail ? \"└── \" : \"├── \"}${printNode(root)}\\n`);\n const indent = prefix + (isTail ? \" \" : \"│ \");\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\nexport default class Tree<Key = number, Value = any> {\n private _comparator: Comparator<Key>;\n private _root: Node<Key, Value> | null = null;\n private _size: number = 0;\n\n constructor(comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n }\n\n /**\n * Inserts a key, allows duplicates\n */\n public insert(key: Key, data?: Value): Node<Key, Value> {\n this._size++;\n return (this._root = insert(key, data, this._root!, this._comparator));\n }\n\n /**\n * Adds a key, if it is not present in the tree\n */\n public add(key: Key, data?: Value): Node<Key, Value> {\n const node = new Node(key, data);\n\n if (this._root === null) {\n node.left = node.right = null;\n this._size++;\n this._root = node;\n }\n\n const comparator = this._comparator;\n const t = splay(key, this._root, comparator);\n const cmp = comparator(key, t.key);\n if (cmp === 0) this._root = t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n this._size++;\n this._root = node;\n }\n\n return this._root;\n }\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n public remove(key: Key): void {\n this._root = this._remove(key, this._root!, this._comparator);\n }\n\n /**\n * Deletes i from the tree if it's there\n */\n private _remove(i: Key, t: Node<Key, Value>, comparator: Comparator<Key>) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) {\n /* found it */\n if (t.left === null) {\n x = t.right!;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n this._size--;\n return x;\n }\n return t; /* It wasn't there */\n }\n\n /**\n * Removes and returns the node with smallest key\n */\n public pop(): { key: Key; data: Value } | null {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root!, this._comparator);\n this._root = this._remove(node.key, this._root, this._comparator);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n /**\n * Find without splaying\n */\n public findStatic(key: Key): Node<Key, Value> | null {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n public find(key: Key): Node<Key, Value> | null {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n public contains(key: Key): boolean {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n public forEach(visitor: Visitor<Key, Value>, ctx?: any): Tree<Key, Value> {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop()!;\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n */\n public range(\n low: Key,\n high: Key,\n fn: Visitor<Key, Value>,\n ctx?: any\n ): Tree<Key, Value> {\n const Q = [];\n const compare = this._comparator;\n let node = this._root;\n let cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop()!;\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n /**\n * Returns array of keys\n */\n public keys(): Key[] {\n const keys: Key[] = [];\n this.forEach(({ key }) => {\n keys.push(key);\n });\n return keys;\n }\n\n /**\n * Returns array of all the data in the nodes\n */\n public values(): Value[] {\n const values: Value[] = [];\n this.forEach(({ data }) => {\n values.push(data);\n });\n return values;\n }\n\n public min(): Key | null {\n if (this._root) return this.minNode(this._root)!.key;\n return null;\n }\n\n public max(): Key | null {\n if (this._root) return this.maxNode(this._root)!.key;\n return null;\n }\n\n public minNode(t = this._root): Node<Key, Value> | null {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n public maxNode(t = this._root): Node<Key, Value> | null {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n /**\n * Returns node at given index\n */\n public at(index: number): Node<Key, Value> | null {\n let current = this._root;\n let done = false;\n let i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop()!;\n if (i === index) return current;\n i++;\n current = current.right!;\n } else done = true;\n }\n }\n return null;\n }\n\n public next(d: Node<Key, Value>): Node<Key, Value> | null {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n public prev(d: Node<Key, Value>): Node<Key, Value> | null {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n public clear(): Tree<Key, Value> {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n public toList() {\n return toList(this._root!);\n }\n\n /**\n * Bulk-load items. Both array have to be same size\n */\n public load(keys: Key[], values: Value[] = [], presort: boolean = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) {\n // empty tree\n this._root = loadRecursive(keys, values, 0, size);\n this._size = size;\n } else {\n // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(\n this.toList(),\n createList(keys, values),\n comparator\n );\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n public isEmpty(): boolean {\n return this._root === null;\n }\n\n get size(): number {\n return this._size;\n }\n get root(): Node<Key, Value> | null {\n return this._root;\n }\n\n public toString(\n printNode: NodePrinter<Key, Value> = (n) => String(n.key)\n ): string {\n const out: string[] = [];\n printRow(this._root!, \"\", true, (v) => out.push(v), printNode);\n return out.join(\"\");\n }\n\n public update(key: Key, newKey: Key, newData?: Value): void {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root!, comparator);\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right!, comparator);\n } else {\n left = insert(newKey, newData, left!, comparator);\n }\n this._root = merge(left, right, comparator);\n }\n\n public split(key: Key) {\n return split(key, this._root!, this._comparator);\n }\n\n *[Symbol.iterator]() {\n let current = this._root;\n const Q: Node<Key, Value>[] = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop()!;\n yield current;\n\n current = current.right;\n } else done = true;\n }\n }\n }\n}\n\nfunction loadRecursive(\n keys: Key[],\n values: Value[],\n start: number,\n end: number\n): Node<Key, Value> | null {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = new Node(key, data);\n node.left = loadRecursive(keys, values, start, middle);\n node.right = loadRecursive(keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\nfunction createList(keys: Key[], values: Value[]): Node<Key, Value> {\n const head = new Node<Key, Value>(null, null);\n let p: Node<Key, Value> = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = new Node(keys[i], values[i]);\n }\n p.next = null;\n return head.next!;\n}\n\nfunction toList(root: Node<Key, Value>): Node<Key, Value> {\n let current = root;\n const Q = [];\n let done = false;\n\n const head = new Node<Key, Value>(null, null);\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left!;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop()!;\n current = current.right!;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next!;\n}\n\nfunction sortedListToBST(\n list: TreeNodeList<Key, Value>,\n start: number,\n end: number\n) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root!.left = left;\n\n list.head = list.head!.next;\n\n root!.right = sortedListToBST(list, middle + 1, end);\n return root!;\n }\n return null;\n}\n\nfunction mergeLists<Key, Value>(\n l1: Node<Key, Value>,\n l2: Node<Key, Value>,\n compare: Comparator<Key>\n): Node<Key, Value> {\n const head: Node<Key, Value> = new Node<Key, Value>(null as Key, null); // dummy\n let p = head;\n\n let p1: Node<Key, Value> = l1;\n let p2: Node<Key, Value> = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next!;\n } else {\n p.next = p2;\n p2 = p2.next!;\n }\n p = p.next;\n }\n\n if (p1 !== null) {\n p.next = p1;\n } else if (p2 !== null) {\n p.next = p2;\n }\n\n return head.next!;\n}\n\nfunction sort(\n keys: Key[],\n values: Value[],\n left: number,\n right: number,\n compare: Comparator<Key>\n) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++;\n while (compare(keys[i], pivot) < 0);\n do j--;\n while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from original code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(16);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n finlen = sum(finlen, fin, alen, a, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n if (xtail === 0) {\n if (ytail === 0) {\n a[0] = 0;\n b[0] = 0;\n return 1;\n }\n negate = -ytail;\n s1 = negate * ax;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n if (ytail === 0) {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n negate = -xtail;\n s1 = negate * by;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ytail * ax;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n a[3] = u3;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = xtail * by;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n b[3] = u3;\n return 4;\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n s1 = a * b;\n c = splitter * a;\n ahi = c - (c - a);\n alo = a - ahi;\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n c = splitter * k;\n bhi = c - (c - k);\n blo = k - bhi;\n _i = s0 * k;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * k;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n if (z !== 0) {\n c = splitter * z;\n bhi = c - (c - z);\n blo = z - bhi;\n _i = s0 * z;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * z;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n }\n return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail;\n let adytail, bdytail, cdytail;\n let adztail, bdztail, cdztail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n scale(4, bc, adz, _8), _8,\n scale(4, ca, bdz, _8b), _8b, _16), _16,\n scale(4, ab, cdz, _8), _8, fin);\n\n let det = estimate(finlen, fin);\n let errbound = o3derrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n bvirt = az - adz;\n adztail = az - (adz + bvirt) + (bvirt - dz);\n bvirt = bz - bdz;\n bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n bvirt = cz - cdz;\n cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n adytail === 0 && bdytail === 0 && cdytail === 0 &&\n adztail === 0 && bdztail === 0 && cdztail === 0) {\n return det;\n }\n\n errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n det +=\n adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n if (adztail !== 0) {\n finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n }\n if (bdztail !== 0) {\n finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n }\n if (cdztail !== 0) {\n finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n }\n\n if (adxtail !== 0) {\n if (bdytail !== 0) {\n finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n }\n if (cdytail !== 0) {\n finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n }\n }\n if (bdxtail !== 0) {\n if (cdytail !== 0) {\n finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n }\n if (adytail !== 0) {\n finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n }\n }\n if (cdxtail !== 0) {\n if (adytail !== 0) {\n finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n }\n if (bdytail !== 0) {\n finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n\n const det =\n adz * (bdxcdy - cdxbdy) +\n bdz * (cdxady - adxcdy) +\n cdz * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n const errbound = o3derrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n\n return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n return adx * (bdy * cdz - bdz * cdy) +\n bdx * (cdy * adz - cdz * ady) +\n cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n finlen = sum(finlen, fin, a, alen, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n let abtlen, bctlen, catlen;\n let abttlen, bcttlen, cattlen;\n let n1, n0;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n sum(\n scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n sum(\n scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n sum(\n scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n let det = estimate(finlen, fin);\n let errbound = iccerrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n return det;\n }\n\n errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = adx * adx;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = ady * ady;\n c = splitter * ady;\n ahi = c - (c - ady);\n alo = ady - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n aa[3] = u3;\n }\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = bdx * bdx;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = bdy * bdy;\n c = splitter * bdy;\n ahi = c - (c - bdy);\n alo = bdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bb[3] = u3;\n }\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = cdx * cdx;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = cdy * cdy;\n c = splitter * cdy;\n ahi = c - (c - cdy);\n alo = cdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cc[3] = u3;\n }\n\n if (adxtail !== 0) {\n axtbclen = scale(4, bc, adxtail, axtbc);\n finlen = finadd(finlen, sum_three(\n scale(axtbclen, axtbc, 2 * adx, _16), _16,\n scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n }\n if (adytail !== 0) {\n aytbclen = scale(4, bc, adytail, aytbc);\n finlen = finadd(finlen, sum_three(\n scale(aytbclen, aytbc, 2 * ady, _16), _16,\n scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n }\n if (bdxtail !== 0) {\n bxtcalen = scale(4, ca, bdxtail, bxtca);\n finlen = finadd(finlen, sum_three(\n scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n }\n if (bdytail !== 0) {\n bytcalen = scale(4, ca, bdytail, bytca);\n finlen = finadd(finlen, sum_three(\n scale(bytcalen, bytca, 2 * bdy, _16), _16,\n scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n }\n if (cdxtail !== 0) {\n cxtablen = scale(4, ab, cdxtail, cxtab);\n finlen = finadd(finlen, sum_three(\n scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n }\n if (cdytail !== 0) {\n cytablen = scale(4, ab, cdytail, cytab);\n finlen = finadd(finlen, sum_three(\n scale(cytablen, cytab, 2 * cdy, _16), _16,\n scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n }\n\n if (adxtail !== 0 || adytail !== 0) {\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = bdxtail * cdy;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * cdytail;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n s1 = cdxtail * -bdy;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * -bdy;\n bhi = c - (c - -bdy);\n blo = -bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * -bdytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * -bdytail;\n bhi = c - (c - -bdytail);\n blo = -bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n bctlen = sum(4, u, 4, v, bct);\n s1 = bdxtail * cdytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdxtail * bdytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bctt[3] = u3;\n bcttlen = 4;\n } else {\n bct[0] = 0;\n bctlen = 1;\n bctt[0] = 0;\n bcttlen = 1;\n }\n if (adxtail !== 0) {\n const len = scale(bctlen, bct, adxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(axtbclen, axtbc, adxtail, _16), _16,\n scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * adx, _16), _16,\n scale(len2, _8, adxtail, _16b), _16b,\n scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n }\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n }\n }\n if (adytail !== 0) {\n const len = scale(bctlen, bct, adytail, _16c);\n finlen = finadd(finlen, sum(\n scale(aytbclen, aytbc, adytail, _16), _16,\n scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * ady, _16), _16,\n scale(len2, _8, adytail, _16b), _16b,\n scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n }\n }\n if (bdxtail !== 0 || bdytail !== 0) {\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = cdxtail * ady;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * adytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -cdy;\n n0 = -cdytail;\n s1 = adxtail * n1;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * n0;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n catlen = sum(4, u, 4, v, cat);\n s1 = cdxtail * adytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adxtail * cdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n catt[3] = u3;\n cattlen = 4;\n } else {\n cat[0] = 0;\n catlen = 1;\n catt[0] = 0;\n cattlen = 1;\n }\n if (bdxtail !== 0) {\n const len = scale(catlen, cat, bdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(bxtcalen, bxtca, bdxtail, _16), _16,\n scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdx, _16), _16,\n scale(len2, _8, bdxtail, _16b), _16b,\n scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n }\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n }\n }\n if (bdytail !== 0) {\n const len = scale(catlen, cat, bdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(bytcalen, bytca, bdytail, _16), _16,\n scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdy, _16), _16,\n scale(len2, _8, bdytail, _16b), _16b,\n scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);\n }\n }\n if (cdxtail !== 0 || cdytail !== 0) {\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = adxtail * bdy;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * bdytail;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -ady;\n n0 = -adytail;\n s1 = bdxtail * n1;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * n0;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n abtlen = sum(4, u, 4, v, abt);\n s1 = adxtail * bdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdxtail * adytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n abtt[3] = u3;\n abttlen = 4;\n } else {\n abt[0] = 0;\n abtlen = 1;\n abtt[0] = 0;\n abttlen = 1;\n }\n if (cdxtail !== 0) {\n const len = scale(abtlen, abt, cdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(cxtablen, cxtab, cdxtail, _16), _16,\n scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdx, _16), _16,\n scale(len2, _8, cdxtail, _16b), _16b,\n scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n }\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n }\n }\n if (cdytail !== 0) {\n const len = scale(abtlen, abt, cdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(cytablen, cytab, cdytail, _16), _16,\n scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdy, _16), _16,\n scale(len2, _8, cdytail, _16b), _16b,\n scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n const alift = adx * adx + ady * ady;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n const blift = bdx * bdx + bdy * bdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n const clift = cdx * cdx + cdy * cdy;\n\n const det =\n alift * (bdxcdy - cdxbdy) +\n blift * (cdxady - adxcdy) +\n clift * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n const errbound = iccerrboundA * permanent;\n\n if (det > errbound || -det > errbound) {\n return det;\n }\n return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const ady = ay - dy;\n const bdx = bx - dx;\n const bdy = by - dy;\n const cdx = cx - dx;\n const cdy = cy - dy;\n\n const abdet = adx * bdy - bdx * ady;\n const bcdet = bdx * cdy - cdx * bdy;\n const cadet = cdx * ady - adx * cdy;\n const alift = adx * adx + ady * ady;\n const blift = bdx * bdx + bdy * bdy;\n const clift = cdx * cdx + cdy * cdy;\n\n return alift * bcdet + blift * cadet + clift * abdet;\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale, negate} from './util.js';\n\nconst isperrboundA = (16 + 224 * epsilon) * epsilon;\nconst isperrboundB = (5 + 72 * epsilon) * epsilon;\nconst isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;\n\nconst ab = vec(4);\nconst bc = vec(4);\nconst cd = vec(4);\nconst de = vec(4);\nconst ea = vec(4);\nconst ac = vec(4);\nconst bd = vec(4);\nconst ce = vec(4);\nconst da = vec(4);\nconst eb = vec(4);\n\nconst abc = vec(24);\nconst bcd = vec(24);\nconst cde = vec(24);\nconst dea = vec(24);\nconst eab = vec(24);\nconst abd = vec(24);\nconst bce = vec(24);\nconst cda = vec(24);\nconst deb = vec(24);\nconst eac = vec(24);\n\nconst adet = vec(1152);\nconst bdet = vec(1152);\nconst cdet = vec(1152);\nconst ddet = vec(1152);\nconst edet = vec(1152);\nconst abdet = vec(2304);\nconst cddet = vec(2304);\nconst cdedet = vec(3456);\nconst deter = vec(5760);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _8c = vec(8);\nconst _16 = vec(16);\nconst _24 = vec(24);\nconst _48 = vec(48);\nconst _48b = vec(48);\nconst _96 = vec(96);\nconst _192 = vec(192);\nconst _384x = vec(384);\nconst _384y = vec(384);\nconst _384z = vec(384);\nconst _768 = vec(768);\n\nfunction sum_three_scale(a, b, c, az, bz, cz, out) {\n return sum_three(\n scale(4, a, az, _8), _8,\n scale(4, b, bz, _8b), _8b,\n scale(4, c, cz, _8c), _8c, _16, out);\n}\n\nfunction liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {\n const len = sum(\n sum(alen, a, blen, b, _48), _48,\n negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);\n\n return sum_three(\n scale(scale(len, _96, x, _192), _192, x, _384x), _384x,\n scale(scale(len, _96, y, _192), _192, y, _384y), _384y,\n scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);\n}\n\nfunction insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n s1 = ax * by;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ay;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n s1 = bx * cy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * by;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cx * dy;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * cy;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cd[3] = u3;\n s1 = dx * ey;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * dy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n de[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n de[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n de[2] = _j - (u3 - bvirt) + (_i - bvirt);\n de[3] = u3;\n s1 = ex * ay;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * ey;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ea[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ea[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ea[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ea[3] = u3;\n s1 = ax * cy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * ay;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ac[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ac[3] = u3;\n s1 = bx * dy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * by;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bd[3] = u3;\n s1 = cx * ey;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * cy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ce[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ce[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ce[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ce[3] = u3;\n s1 = dx * ay;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * dy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n da[2] = _j - (u3 - bvirt) + (_i - bvirt);\n da[3] = u3;\n s1 = ex * by;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ey;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n eb[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n eb[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n eb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n eb[3] = u3;\n\n const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);\n const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);\n const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);\n const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);\n const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);\n const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);\n const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);\n const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);\n const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);\n const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);\n\n const deterlen = sum_three(\n liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,\n liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,\n sum_three(\n liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,\n liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,\n liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);\n\n return deter[deterlen - 1];\n}\n\nconst xdet = vec(96);\nconst ydet = vec(96);\nconst zdet = vec(96);\nconst fin = vec(1152);\n\nfunction liftadapt(a, b, c, az, bz, cz, x, y, z, out) {\n const len = sum_three_scale(a, b, c, az, bz, cz, _24);\n return sum_three(\n scale(scale(len, _24, x, _48), _48, x, xdet), xdet,\n scale(scale(len, _24, y, _48), _48, y, ydet), ydet,\n scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);\n}\n\nfunction insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {\n let ab3, bc3, cd3, da3, ac3, bd3;\n\n let aextail, bextail, cextail, dextail;\n let aeytail, beytail, ceytail, deytail;\n let aeztail, beztail, ceztail, deztail;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;\n\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n s1 = aex * bey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bex * aey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ab3 = _j + _i;\n bvirt = ab3 - _j;\n ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);\n ab[3] = ab3;\n s1 = bex * cey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * bey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bc3 = _j + _i;\n bvirt = bc3 - _j;\n bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);\n bc[3] = bc3;\n s1 = cex * dey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * cey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n cd3 = _j + _i;\n bvirt = cd3 - _j;\n cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);\n cd[3] = cd3;\n s1 = dex * aey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = aex * dey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n da3 = _j + _i;\n bvirt = da3 - _j;\n da[2] = _j - (da3 - bvirt) + (_i - bvirt);\n da[3] = da3;\n s1 = aex * cey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * aey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ac3 = _j + _i;\n bvirt = ac3 - _j;\n ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);\n ac[3] = ac3;\n s1 = bex * dey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * bey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bd3 = _j + _i;\n bvirt = bd3 - _j;\n bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);\n bd[3] = bd3;\n\n const finlen = sum(\n sum(\n negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,\n liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,\n sum(\n negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,\n liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);\n\n let det = estimate(finlen, fin);\n let errbound = isperrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - aex;\n aextail = ax - (aex + bvirt) + (bvirt - ex);\n bvirt = ay - aey;\n aeytail = ay - (aey + bvirt) + (bvirt - ey);\n bvirt = az - aez;\n aeztail = az - (aez + bvirt) + (bvirt - ez);\n bvirt = bx - bex;\n bextail = bx - (bex + bvirt) + (bvirt - ex);\n bvirt = by - bey;\n beytail = by - (bey + bvirt) + (bvirt - ey);\n bvirt = bz - bez;\n beztail = bz - (bez + bvirt) + (bvirt - ez);\n bvirt = cx - cex;\n cextail = cx - (cex + bvirt) + (bvirt - ex);\n bvirt = cy - cey;\n ceytail = cy - (cey + bvirt) + (bvirt - ey);\n bvirt = cz - cez;\n ceztail = cz - (cez + bvirt) + (bvirt - ez);\n bvirt = dx - dex;\n dextail = dx - (dex + bvirt) + (bvirt - ex);\n bvirt = dy - dey;\n deytail = dy - (dey + bvirt) + (bvirt - ey);\n bvirt = dz - dez;\n deztail = dz - (dez + bvirt) + (bvirt - ez);\n if (aextail === 0 && aeytail === 0 && aeztail === 0 &&\n bextail === 0 && beytail === 0 && beztail === 0 &&\n cextail === 0 && ceytail === 0 && ceztail === 0 &&\n dextail === 0 && deytail === 0 && deztail === 0) {\n return det;\n }\n\n errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);\n\n const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);\n const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);\n const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);\n const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);\n const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);\n const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);\n det +=\n (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +\n (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *\n ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -\n ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +\n (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *\n ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +\n 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +\n (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -\n ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +\n (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);\n}\n\nexport function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const aexbey = aex * bey;\n const bexaey = bex * aey;\n const ab = aexbey - bexaey;\n const bexcey = bex * cey;\n const cexbey = cex * bey;\n const bc = bexcey - cexbey;\n const cexdey = cex * dey;\n const dexcey = dex * cey;\n const cd = cexdey - dexcey;\n const dexaey = dex * aey;\n const aexdey = aex * dey;\n const da = dexaey - aexdey;\n const aexcey = aex * cey;\n const cexaey = cex * aey;\n const ac = aexcey - cexaey;\n const bexdey = bex * dey;\n const dexbey = dex * bey;\n const bd = bexdey - dexbey;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n const det =\n (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +\n (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));\n\n const aezplus = Math.abs(aez);\n const bezplus = Math.abs(bez);\n const cezplus = Math.abs(cez);\n const dezplus = Math.abs(dez);\n const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);\n const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);\n const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);\n const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);\n const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);\n const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);\n const permanent =\n (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +\n (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +\n (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +\n (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;\n\n const errbound = isperrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);\n}\n\nexport function inspherefast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const ab = aex * bey - bex * aey;\n const bc = bex * cey - cex * bey;\n const cd = cex * dey - dex * cey;\n const da = dex * aey - aex * dey;\n const ac = aex * cey - cex * aey;\n const bd = bex * dey - dex * bey;\n\n const abc = aez * bc - bez * ac + cez * ab;\n const bcd = bez * cd - cez * bd + dez * bc;\n const cda = cez * da + dez * ac + aez * cd;\n const dab = dez * ab + aez * bd + bez * da;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);\n}\n","import SplayTree from 'splaytree';\nimport { orient2d } from 'robust-predicates';\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\n\nconst isInBbox = (bbox, point) => {\n return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;\n};\n\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\nconst getBboxOverlap = (b1, b2) => {\n // check if the bboxes overlap at all\n if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) return null;\n\n // find the middle two X values\n const lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;\n const upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x;\n\n // find the middle two Y values\n const lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;\n const upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y;\n\n // put those middle values together to get the overlap\n return {\n ll: {\n x: lowerX,\n y: lowerY\n },\n ur: {\n x: upperX,\n y: upperY\n }\n };\n};\n\n/* Javascript doesn't do integer math. Everything is\n * floating point with percision Number.EPSILON.\n *\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON\n */\n\nlet epsilon = Number.EPSILON;\n\n// IE Polyfill\nif (epsilon === undefined) epsilon = Math.pow(2, -52);\nconst EPSILON_SQ = epsilon * epsilon;\n\n/* FLP comparator */\nconst cmp = (a, b) => {\n // check if they're both 0\n if (-epsilon < a && a < epsilon) {\n if (-epsilon < b && b < epsilon) {\n return 0;\n }\n }\n\n // check if they're flp equal\n const ab = a - b;\n if (ab * ab < EPSILON_SQ * a * b) {\n return 0;\n }\n\n // normal comparison\n return a < b ? -1 : 1;\n};\n\n/**\n * This class rounds incoming values sufficiently so that\n * floating points problems are, for the most part, avoided.\n *\n * Incoming points are have their x & y values tested against\n * all previously seen x & y values. If either is 'too close'\n * to a previously seen value, it's value is 'snapped' to the\n * previously seen value.\n *\n * All points should be rounded by this class before being\n * stored in any data structures in the rest of this algorithm.\n */\n\nclass PtRounder {\n constructor() {\n this.reset();\n }\n reset() {\n this.xRounder = new CoordRounder();\n this.yRounder = new CoordRounder();\n }\n round(x, y) {\n return {\n x: this.xRounder.round(x),\n y: this.yRounder.round(y)\n };\n }\n}\nclass CoordRounder {\n constructor() {\n this.tree = new SplayTree();\n // preseed with 0 so we don't end up with values < Number.EPSILON\n this.round(0);\n }\n\n // Note: this can rounds input values backwards or forwards.\n // You might ask, why not restrict this to just rounding\n // forwards? Wouldn't that allow left endpoints to always\n // remain left endpoints during splitting (never change to\n // right). No - it wouldn't, because we snap intersections\n // to endpoints (to establish independence from the segment\n // angle for t-intersections).\n round(coord) {\n const node = this.tree.add(coord);\n const prevNode = this.tree.prev(node);\n if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {\n this.tree.remove(coord);\n return prevNode.key;\n }\n const nextNode = this.tree.next(node);\n if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {\n this.tree.remove(coord);\n return nextNode.key;\n }\n return coord;\n }\n}\n\n// singleton available by import\nconst rounder = new PtRounder();\n\n/* Cross Product of two vectors with first point at origin */\nconst crossProduct = (a, b) => a.x * b.y - a.y * b.x;\n\n/* Dot Product of two vectors with first point at origin */\nconst dotProduct = (a, b) => a.x * b.x + a.y * b.y;\n\n/* Comparator for two vectors with same starting point */\nconst compareVectorAngles = (basePt, endPt1, endPt2) => {\n const res = orient2d(basePt.x, basePt.y, endPt1.x, endPt1.y, endPt2.x, endPt2.y);\n if (res > 0) return -1;\n if (res < 0) return 1;\n return 0;\n};\nconst length = v => Math.sqrt(dotProduct(v, v));\n\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\nconst sineOfAngle = (pShared, pBase, pAngle) => {\n const vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n const vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\nconst cosineOfAngle = (pShared, pBase, pAngle) => {\n const vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n const vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nconst horizontalIntersection = (pt, v, y) => {\n if (v.y === 0) return null;\n return {\n x: pt.x + v.x / v.y * (y - pt.y),\n y: y\n };\n};\n\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nconst verticalIntersection = (pt, v, x) => {\n if (v.x === 0) return null;\n return {\n x: x,\n y: pt.y + v.y / v.x * (x - pt.x)\n };\n};\n\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nconst intersection$1 = (pt1, v1, pt2, v2) => {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x);\n if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x);\n if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y);\n if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y);\n\n // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n const kross = crossProduct(v1, v2);\n if (kross == 0) return null;\n const ve = {\n x: pt2.x - pt1.x,\n y: pt2.y - pt1.y\n };\n const d1 = crossProduct(ve, v1) / kross;\n const d2 = crossProduct(ve, v2) / kross;\n\n // take the average of the two calculations to minimize rounding error\n const x1 = pt1.x + d2 * v1.x,\n x2 = pt2.x + d1 * v2.x;\n const y1 = pt1.y + d2 * v1.y,\n y2 = pt2.y + d1 * v2.y;\n const x = (x1 + x2) / 2;\n const y = (y1 + y2) / 2;\n return {\n x: x,\n y: y\n };\n};\n\nclass SweepEvent {\n // for ordering sweep events in the sweep event queue\n static compare(a, b) {\n // favor event with a point that the sweep line hits first\n const ptCmp = SweepEvent.comparePoints(a.point, b.point);\n if (ptCmp !== 0) return ptCmp;\n\n // the points are the same, so link them if needed\n if (a.point !== b.point) a.link(b);\n\n // favor right events over left\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1;\n\n // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n return Segment.compare(a.segment, b.segment);\n }\n\n // for ordering points in sweep line order\n static comparePoints(aPt, bPt) {\n if (aPt.x < bPt.x) return -1;\n if (aPt.x > bPt.x) return 1;\n if (aPt.y < bPt.y) return -1;\n if (aPt.y > bPt.y) return 1;\n return 0;\n }\n\n // Warning: 'point' input will be modified and re-used (for performance)\n constructor(point, isLeft) {\n if (point.events === undefined) point.events = [this];else point.events.push(this);\n this.point = point;\n this.isLeft = isLeft;\n // this.segment, this.otherSE set by factory\n }\n link(other) {\n if (other.point === this.point) {\n throw new Error(\"Tried to link already linked events\");\n }\n const otherEvents = other.point.events;\n for (let i = 0, iMax = otherEvents.length; i < iMax; i++) {\n const evt = otherEvents[i];\n this.point.events.push(evt);\n evt.point = this.point;\n }\n this.checkForConsuming();\n }\n\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n\n // Compare each pair of events to see if other events also match\n const numEvents = this.point.events.length;\n for (let i = 0; i < numEvents; i++) {\n const evt1 = this.point.events[i];\n if (evt1.segment.consumedBy !== undefined) continue;\n for (let j = i + 1; j < numEvents; j++) {\n const evt2 = this.point.events[j];\n if (evt2.consumedBy !== undefined) continue;\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue;\n evt1.segment.consume(evt2.segment);\n }\n }\n }\n getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n const events = [];\n for (let i = 0, iMax = this.point.events.length; i < iMax; i++) {\n const evt = this.point.events[i];\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt);\n }\n }\n return events;\n }\n\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n getLeftmostComparator(baseEvent) {\n const cache = new Map();\n const fillCache = linkedEvent => {\n const nextEvent = linkedEvent.otherSE;\n cache.set(linkedEvent, {\n sine: sineOfAngle(this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(this.point, baseEvent.point, nextEvent.point)\n });\n };\n return (a, b) => {\n if (!cache.has(a)) fillCache(a);\n if (!cache.has(b)) fillCache(b);\n const {\n sine: asine,\n cosine: acosine\n } = cache.get(a);\n const {\n sine: bsine,\n cosine: bcosine\n } = cache.get(b);\n\n // both on or above x-axis\n if (asine >= 0 && bsine >= 0) {\n if (acosine < bcosine) return 1;\n if (acosine > bcosine) return -1;\n return 0;\n }\n\n // both below x-axis\n if (asine < 0 && bsine < 0) {\n if (acosine < bcosine) return -1;\n if (acosine > bcosine) return 1;\n return 0;\n }\n\n // one above x-axis, one below\n if (bsine < asine) return -1;\n if (bsine > asine) return 1;\n return 0;\n };\n }\n}\n\n// Give segments unique ID's to get consistent sorting of\n// segments and sweep events when all else is identical\nlet segmentId = 0;\nclass Segment {\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n static compare(a, b) {\n const alx = a.leftSE.point.x;\n const blx = b.leftSE.point.x;\n const arx = a.rightSE.point.x;\n const brx = b.rightSE.point.x;\n\n // check if they're even in the same vertical plane\n if (brx < alx) return 1;\n if (arx < blx) return -1;\n const aly = a.leftSE.point.y;\n const bly = b.leftSE.point.y;\n const ary = a.rightSE.point.y;\n const bry = b.rightSE.point.y;\n\n // is left endpoint of segment B the right-more?\n if (alx < blx) {\n // are the two segments in the same horizontal plane?\n if (bly < aly && bly < ary) return 1;\n if (bly > aly && bly > ary) return -1;\n\n // is the B left endpoint colinear to segment A?\n const aCmpBLeft = a.comparePoint(b.leftSE.point);\n if (aCmpBLeft < 0) return 1;\n if (aCmpBLeft > 0) return -1;\n\n // is the A right endpoint colinear to segment B ?\n const bCmpARight = b.comparePoint(a.rightSE.point);\n if (bCmpARight !== 0) return bCmpARight;\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return -1;\n }\n\n // is left endpoint of segment A the right-more?\n if (alx > blx) {\n if (aly < bly && aly < bry) return -1;\n if (aly > bly && aly > bry) return 1;\n\n // is the A left endpoint colinear to segment B?\n const bCmpALeft = b.comparePoint(a.leftSE.point);\n if (bCmpALeft !== 0) return bCmpALeft;\n\n // is the B right endpoint colinear to segment A?\n const aCmpBRight = a.comparePoint(b.rightSE.point);\n if (aCmpBRight < 0) return 1;\n if (aCmpBRight > 0) return -1;\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return 1;\n }\n\n // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n\n // consider the lower left-endpoint to come first\n if (aly < bly) return -1;\n if (aly > bly) return 1;\n\n // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n\n // is the A right endpoint more left-more?\n if (arx < brx) {\n const bCmpARight = b.comparePoint(a.rightSE.point);\n if (bCmpARight !== 0) return bCmpARight;\n }\n\n // is the B right endpoint more left-more?\n if (arx > brx) {\n const aCmpBRight = a.comparePoint(b.rightSE.point);\n if (aCmpBRight < 0) return 1;\n if (aCmpBRight > 0) return -1;\n }\n if (arx !== brx) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n const ay = ary - aly;\n const ax = arx - alx;\n const by = bry - bly;\n const bx = brx - blx;\n if (ay > ax && by < bx) return 1;\n if (ay < ax && by > bx) return -1;\n }\n\n // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n if (arx > brx) return 1;\n if (arx < brx) return -1;\n\n // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n\n // consider the lower right-endpoint to come first\n if (ary < bry) return -1;\n if (ary > bry) return 1;\n\n // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1;\n\n // identical segment, ie a === b\n return 0;\n }\n\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n constructor(leftSE, rightSE, rings, windings) {\n this.id = ++segmentId;\n this.leftSE = leftSE;\n leftSE.segment = this;\n leftSE.otherSE = rightSE;\n this.rightSE = rightSE;\n rightSE.segment = this;\n rightSE.otherSE = leftSE;\n this.rings = rings;\n this.windings = windings;\n // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n static fromRing(pt1, pt2, ring) {\n let leftPt, rightPt, winding;\n\n // ordering the two points according to sweep line ordering\n const cmpPts = SweepEvent.comparePoints(pt1, pt2);\n if (cmpPts < 0) {\n leftPt = pt1;\n rightPt = pt2;\n winding = 1;\n } else if (cmpPts > 0) {\n leftPt = pt2;\n rightPt = pt1;\n winding = -1;\n } else throw new Error(`Tried to create degenerate segment at [${pt1.x}, ${pt1.y}]`);\n const leftSE = new SweepEvent(leftPt, true);\n const rightSE = new SweepEvent(rightPt, false);\n return new Segment(leftSE, rightSE, [ring], [winding]);\n }\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n replaceRightSE(newRightSE) {\n this.rightSE = newRightSE;\n this.rightSE.segment = this;\n this.rightSE.otherSE = this.leftSE;\n this.leftSE.otherSE = this.rightSE;\n }\n bbox() {\n const y1 = this.leftSE.point.y;\n const y2 = this.rightSE.point.y;\n return {\n ll: {\n x: this.leftSE.point.x,\n y: y1 < y2 ? y1 : y2\n },\n ur: {\n x: this.rightSE.point.x,\n y: y1 > y2 ? y1 : y2\n }\n };\n }\n\n /* A vector from the left point to the right */\n vector() {\n return {\n x: this.rightSE.point.x - this.leftSE.point.x,\n y: this.rightSE.point.y - this.leftSE.point.y\n };\n }\n isAnEndpoint(pt) {\n return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;\n }\n\n /* Compare this segment with a point.\n *\n * A point P is considered to be colinear to a segment if there\n * exists a distance D such that if we travel along the segment\n * from one * endpoint towards the other a distance D, we find\n * ourselves at point P.\n *\n * Return value indicates:\n *\n * 1: point lies above the segment (to the left of vertical)\n * 0: point is colinear to segment\n * -1: point lies below the segment (to the right of vertical)\n */\n comparePoint(point) {\n if (this.isAnEndpoint(point)) return 0;\n const lPt = this.leftSE.point;\n const rPt = this.rightSE.point;\n const v = this.vector();\n\n // Exactly vertical segments.\n if (lPt.x === rPt.x) {\n if (point.x === lPt.x) return 0;\n return point.x < lPt.x ? 1 : -1;\n }\n\n // Nearly vertical segments with an intersection.\n // Check to see where a point on the line with matching Y coordinate is.\n const yDist = (point.y - lPt.y) / v.y;\n const xFromYDist = lPt.x + yDist * v.x;\n if (point.x === xFromYDist) return 0;\n\n // General case.\n // Check to see where a point on the line with matching X coordinate is.\n const xDist = (point.x - lPt.x) / v.x;\n const yFromXDist = lPt.y + xDist * v.y;\n if (point.y === yFromXDist) return 0;\n return point.y < yFromXDist ? -1 : 1;\n }\n\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n getIntersection(other) {\n // If bboxes don't overlap, there can't be any intersections\n const tBbox = this.bbox();\n const oBbox = other.bbox();\n const bboxOverlap = getBboxOverlap(tBbox, oBbox);\n if (bboxOverlap === null) return null;\n\n // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n const tlp = this.leftSE.point;\n const trp = this.rightSE.point;\n const olp = other.leftSE.point;\n const orp = other.rightSE.point;\n\n // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n const touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;\n const touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;\n const touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;\n const touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0;\n\n // do left endpoints match?\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp;\n if (!touchesThisRSE && touchesOtherRSE) return orp;\n // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n return null;\n }\n\n // does this left endpoint matches (other doesn't)\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x === orp.x && tlp.y === orp.y) return null;\n }\n // t-intersection on left endpoint\n return tlp;\n }\n\n // does other left endpoint matches (this doesn't)\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x === olp.x && trp.y === olp.y) return null;\n }\n // t-intersection on left endpoint\n return olp;\n }\n\n // trivial intersection on right endpoints\n if (touchesThisRSE && touchesOtherRSE) return null;\n\n // t-intersections on just one right endpoint\n if (touchesThisRSE) return trp;\n if (touchesOtherRSE) return orp;\n\n // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n const pt = intersection$1(tlp, this.vector(), olp, other.vector());\n\n // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n if (pt === null) return null;\n\n // is the intersection found between the lines not on the segments?\n if (!isInBbox(bboxOverlap, pt)) return null;\n\n // round the the computed point if needed\n return rounder.round(pt.x, pt.y);\n }\n\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n split(point) {\n const newEvents = [];\n const alreadyLinked = point.events !== undefined;\n const newLeftSE = new SweepEvent(point, true);\n const newRightSE = new SweepEvent(point, false);\n const oldRightSE = this.rightSE;\n this.replaceRightSE(newRightSE);\n newEvents.push(newRightSE);\n newEvents.push(newLeftSE);\n const newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice());\n\n // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {\n newSeg.swapEvents();\n }\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents();\n }\n\n // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n if (alreadyLinked) {\n newLeftSE.checkForConsuming();\n newRightSE.checkForConsuming();\n }\n return newEvents;\n }\n\n /* Swap which event is left and right */\n swapEvents() {\n const tmpEvt = this.rightSE;\n this.rightSE = this.leftSE;\n this.leftSE = tmpEvt;\n this.leftSE.isLeft = true;\n this.rightSE.isLeft = false;\n for (let i = 0, iMax = this.windings.length; i < iMax; i++) {\n this.windings[i] *= -1;\n }\n }\n\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n consume(other) {\n let consumer = this;\n let consumee = other;\n while (consumer.consumedBy) consumer = consumer.consumedBy;\n while (consumee.consumedBy) consumee = consumee.consumedBy;\n const cmp = Segment.compare(consumer, consumee);\n if (cmp === 0) return; // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n if (cmp > 0) {\n const tmp = consumer;\n consumer = consumee;\n consumee = tmp;\n }\n\n // make sure a segment doesn't consume it's prev\n if (consumer.prev === consumee) {\n const tmp = consumer;\n consumer = consumee;\n consumee = tmp;\n }\n for (let i = 0, iMax = consumee.rings.length; i < iMax; i++) {\n const ring = consumee.rings[i];\n const winding = consumee.windings[i];\n const index = consumer.rings.indexOf(ring);\n if (index === -1) {\n consumer.rings.push(ring);\n consumer.windings.push(winding);\n } else consumer.windings[index] += winding;\n }\n consumee.rings = null;\n consumee.windings = null;\n consumee.consumedBy = consumer;\n\n // mark sweep events consumed as to maintain ordering in sweep event queue\n consumee.leftSE.consumedBy = consumer.leftSE;\n consumee.rightSE.consumedBy = consumer.rightSE;\n }\n\n /* The first segment previous segment chain that is in the result */\n prevInResult() {\n if (this._prevInResult !== undefined) return this._prevInResult;\n if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult();\n return this._prevInResult;\n }\n beforeState() {\n if (this._beforeState !== undefined) return this._beforeState;\n if (!this.prev) this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: []\n };else {\n const seg = this.prev.consumedBy || this.prev;\n this._beforeState = seg.afterState();\n }\n return this._beforeState;\n }\n afterState() {\n if (this._afterState !== undefined) return this._afterState;\n const beforeState = this.beforeState();\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: []\n };\n const ringsAfter = this._afterState.rings;\n const windingsAfter = this._afterState.windings;\n const mpsAfter = this._afterState.multiPolys;\n\n // calculate ringsAfter, windingsAfter\n for (let i = 0, iMax = this.rings.length; i < iMax; i++) {\n const ring = this.rings[i];\n const winding = this.windings[i];\n const index = ringsAfter.indexOf(ring);\n if (index === -1) {\n ringsAfter.push(ring);\n windingsAfter.push(winding);\n } else windingsAfter[index] += winding;\n }\n\n // calcualte polysAfter\n const polysAfter = [];\n const polysExclude = [];\n for (let i = 0, iMax = ringsAfter.length; i < iMax; i++) {\n if (windingsAfter[i] === 0) continue; // non-zero rule\n const ring = ringsAfter[i];\n const poly = ring.poly;\n if (polysExclude.indexOf(poly) !== -1) continue;\n if (ring.isExterior) polysAfter.push(poly);else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly);\n const index = polysAfter.indexOf(ring.poly);\n if (index !== -1) polysAfter.splice(index, 1);\n }\n }\n\n // calculate multiPolysAfter\n for (let i = 0, iMax = polysAfter.length; i < iMax; i++) {\n const mp = polysAfter[i].multiPoly;\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp);\n }\n return this._afterState;\n }\n\n /* Is this segment part of the final result? */\n isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false;\n if (this._isInResult !== undefined) return this._isInResult;\n const mpsBefore = this.beforeState().multiPolys;\n const mpsAfter = this.afterState().multiPolys;\n switch (operation.type) {\n case \"union\":\n {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n const noBefores = mpsBefore.length === 0;\n const noAfters = mpsAfter.length === 0;\n this._isInResult = noBefores !== noAfters;\n break;\n }\n case \"intersection\":\n {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n let least;\n let most;\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length;\n most = mpsAfter.length;\n } else {\n least = mpsAfter.length;\n most = mpsBefore.length;\n }\n this._isInResult = most === operation.numMultiPolys && least < most;\n break;\n }\n case \"xor\":\n {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n const diff = Math.abs(mpsBefore.length - mpsAfter.length);\n this._isInResult = diff % 2 === 1;\n break;\n }\n case \"difference\":\n {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n const isJustSubject = mps => mps.length === 1 && mps[0].isSubject;\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);\n break;\n }\n default:\n throw new Error(`Unrecognized operation type found ${operation.type}`);\n }\n return this._isInResult;\n }\n}\n\nclass RingIn {\n constructor(geomRing, poly, isExterior) {\n if (!Array.isArray(geomRing) || geomRing.length === 0) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\");\n }\n this.poly = poly;\n this.isExterior = isExterior;\n this.segments = [];\n if (typeof geomRing[0][0] !== \"number\" || typeof geomRing[0][1] !== \"number\") {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\");\n }\n const firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);\n this.bbox = {\n ll: {\n x: firstPoint.x,\n y: firstPoint.y\n },\n ur: {\n x: firstPoint.x,\n y: firstPoint.y\n }\n };\n let prevPoint = firstPoint;\n for (let i = 1, iMax = geomRing.length; i < iMax; i++) {\n if (typeof geomRing[i][0] !== \"number\" || typeof geomRing[i][1] !== \"number\") {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\");\n }\n let point = rounder.round(geomRing[i][0], geomRing[i][1]);\n // skip repeated points\n if (point.x === prevPoint.x && point.y === prevPoint.y) continue;\n this.segments.push(Segment.fromRing(prevPoint, point, this));\n if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x;\n if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y;\n if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x;\n if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y;\n prevPoint = point;\n }\n // add segment from last to first if last is not the same as first\n if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {\n this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));\n }\n }\n getSweepEvents() {\n const sweepEvents = [];\n for (let i = 0, iMax = this.segments.length; i < iMax; i++) {\n const segment = this.segments[i];\n sweepEvents.push(segment.leftSE);\n sweepEvents.push(segment.rightSE);\n }\n return sweepEvents;\n }\n}\nclass PolyIn {\n constructor(geomPoly, multiPoly) {\n if (!Array.isArray(geomPoly)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\");\n }\n this.exteriorRing = new RingIn(geomPoly[0], this, true);\n // copy by value\n this.bbox = {\n ll: {\n x: this.exteriorRing.bbox.ll.x,\n y: this.exteriorRing.bbox.ll.y\n },\n ur: {\n x: this.exteriorRing.bbox.ur.x,\n y: this.exteriorRing.bbox.ur.y\n }\n };\n this.interiorRings = [];\n for (let i = 1, iMax = geomPoly.length; i < iMax; i++) {\n const ring = new RingIn(geomPoly[i], this, false);\n if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x;\n if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y;\n if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x;\n if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y;\n this.interiorRings.push(ring);\n }\n this.multiPoly = multiPoly;\n }\n getSweepEvents() {\n const sweepEvents = this.exteriorRing.getSweepEvents();\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringSweepEvents = this.interiorRings[i].getSweepEvents();\n for (let j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j]);\n }\n }\n return sweepEvents;\n }\n}\nclass MultiPolyIn {\n constructor(geom, isSubject) {\n if (!Array.isArray(geom)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\");\n }\n try {\n // if the input looks like a polygon, convert it to a multipolygon\n if (typeof geom[0][0][0] === \"number\") geom = [geom];\n } catch (ex) {\n // The input is either malformed or has empty arrays.\n // In either case, it will be handled later on.\n }\n this.polys = [];\n this.bbox = {\n ll: {\n x: Number.POSITIVE_INFINITY,\n y: Number.POSITIVE_INFINITY\n },\n ur: {\n x: Number.NEGATIVE_INFINITY,\n y: Number.NEGATIVE_INFINITY\n }\n };\n for (let i = 0, iMax = geom.length; i < iMax; i++) {\n const poly = new PolyIn(geom[i], this);\n if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x;\n if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y;\n if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x;\n if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y;\n this.polys.push(poly);\n }\n this.isSubject = isSubject;\n }\n getSweepEvents() {\n const sweepEvents = [];\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polySweepEvents = this.polys[i].getSweepEvents();\n for (let j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j]);\n }\n }\n return sweepEvents;\n }\n}\n\nclass RingOut {\n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n static factory(allSegments) {\n const ringsOut = [];\n for (let i = 0, iMax = allSegments.length; i < iMax; i++) {\n const segment = allSegments[i];\n if (!segment.isInResult() || segment.ringOut) continue;\n let prevEvent = null;\n let event = segment.leftSE;\n let nextEvent = segment.rightSE;\n const events = [event];\n const startingPoint = event.point;\n const intersectionLEs = [];\n\n /* Walk the chain of linked events to form a closed ring */\n while (true) {\n prevEvent = event;\n event = nextEvent;\n events.push(event);\n\n /* Is the ring complete? */\n if (event.point === startingPoint) break;\n while (true) {\n const availableLEs = event.getAvailableLinkedEvents();\n\n /* Did we hit a dead end? This shouldn't happen.\n * Indicates some earlier part of the algorithm malfunctioned. */\n if (availableLEs.length === 0) {\n const firstPt = events[0].point;\n const lastPt = events[events.length - 1].point;\n throw new Error(`Unable to complete output ring starting at [${firstPt.x},` + ` ${firstPt.y}]. Last matching segment found ends at` + ` [${lastPt.x}, ${lastPt.y}].`);\n }\n\n /* Only one way to go, so cotinue on the path */\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE;\n break;\n }\n\n /* We must have an intersection. Check for a completed loop */\n let indexLE = null;\n for (let j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j;\n break;\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n if (indexLE !== null) {\n const intersectionLE = intersectionLEs.splice(indexLE)[0];\n const ringEvents = events.splice(intersectionLE.index);\n ringEvents.unshift(ringEvents[0].otherSE);\n ringsOut.push(new RingOut(ringEvents.reverse()));\n continue;\n }\n /* register the intersection */\n intersectionLEs.push({\n index: events.length,\n point: event.point\n });\n /* Choose the left-most option to continue the walk */\n const comparator = event.getLeftmostComparator(prevEvent);\n nextEvent = availableLEs.sort(comparator)[0].otherSE;\n break;\n }\n }\n ringsOut.push(new RingOut(events));\n }\n return ringsOut;\n }\n constructor(events) {\n this.events = events;\n for (let i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this;\n }\n this.poly = null;\n }\n getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n let prevPt = this.events[0].point;\n const points = [prevPt];\n for (let i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n const pt = this.events[i].point;\n const nextPt = this.events[i + 1].point;\n if (compareVectorAngles(pt, prevPt, nextPt) === 0) continue;\n points.push(pt);\n prevPt = pt;\n }\n\n // ring was all (within rounding error of angle calc) colinear points\n if (points.length === 1) return null;\n\n // check if the starting point is necessary\n const pt = points[0];\n const nextPt = points[1];\n if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift();\n points.push(points[0]);\n const step = this.isExteriorRing() ? 1 : -1;\n const iStart = this.isExteriorRing() ? 0 : points.length - 1;\n const iEnd = this.isExteriorRing() ? points.length : -1;\n const orderedPoints = [];\n for (let i = iStart; i != iEnd; i += step) orderedPoints.push([points[i].x, points[i].y]);\n return orderedPoints;\n }\n isExteriorRing() {\n if (this._isExteriorRing === undefined) {\n const enclosing = this.enclosingRing();\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;\n }\n return this._isExteriorRing;\n }\n enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing();\n }\n return this._enclosingRing;\n }\n\n /* Returns the ring that encloses this one, if any */\n _calcEnclosingRing() {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n let leftMostEvt = this.events[0];\n for (let i = 1, iMax = this.events.length; i < iMax; i++) {\n const evt = this.events[i];\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt;\n }\n let prevSeg = leftMostEvt.segment.prevInResult();\n let prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null;\n\n // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n if (!prevPrevSeg) return prevSeg.ringOut;\n\n // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut;\n } else return prevSeg.ringOut.enclosingRing();\n }\n\n // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n prevSeg = prevPrevSeg.prevInResult();\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n }\n }\n}\nclass PolyOut {\n constructor(exteriorRing) {\n this.exteriorRing = exteriorRing;\n exteriorRing.poly = this;\n this.interiorRings = [];\n }\n addInterior(ring) {\n this.interiorRings.push(ring);\n ring.poly = this;\n }\n getGeom() {\n const geom = [this.exteriorRing.getGeom()];\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (geom[0] === null) return null;\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringGeom = this.interiorRings[i].getGeom();\n // interior ring was all (within rounding error of angle calc) colinear points\n if (ringGeom === null) continue;\n geom.push(ringGeom);\n }\n return geom;\n }\n}\nclass MultiPolyOut {\n constructor(rings) {\n this.rings = rings;\n this.polys = this._composePolys(rings);\n }\n getGeom() {\n const geom = [];\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polyGeom = this.polys[i].getGeom();\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (polyGeom === null) continue;\n geom.push(polyGeom);\n }\n return geom;\n }\n _composePolys(rings) {\n const polys = [];\n for (let i = 0, iMax = rings.length; i < iMax; i++) {\n const ring = rings[i];\n if (ring.poly) continue;\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else {\n const enclosingRing = ring.enclosingRing();\n if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing));\n enclosingRing.poly.addInterior(ring);\n }\n }\n return polys;\n }\n}\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nclass SweepLine {\n constructor(queue) {\n let comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare;\n this.queue = queue;\n this.tree = new SplayTree(comparator);\n this.segments = [];\n }\n process(event) {\n const segment = event.segment;\n const newEvents = [];\n\n // if we've already been consumed by another segment,\n // clean up our body parts and get out\n if (event.consumedBy) {\n if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment);\n return newEvents;\n }\n const node = event.isLeft ? this.tree.add(segment) : this.tree.find(segment);\n if (!node) throw new Error(`Unable to find segment #${segment.id} ` + `[${segment.leftSE.point.x}, ${segment.leftSE.point.y}] -> ` + `[${segment.rightSE.point.x}, ${segment.rightSE.point.y}] ` + \"in SweepLine tree.\");\n let prevNode = node;\n let nextNode = node;\n let prevSeg = undefined;\n let nextSeg = undefined;\n\n // skip consumed segments still in tree\n while (prevSeg === undefined) {\n prevNode = this.tree.prev(prevNode);\n if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key;\n }\n\n // skip consumed segments still in tree\n while (nextSeg === undefined) {\n nextNode = this.tree.next(nextNode);\n if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key;\n }\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n let prevMySplitter = null;\n if (prevSeg) {\n const prevInter = prevSeg.getIntersection(segment);\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter;\n if (!prevSeg.isAnEndpoint(prevInter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, prevInter);\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n }\n }\n\n // Check for intersections against the next segment in the sweep line\n let nextMySplitter = null;\n if (nextSeg) {\n const nextInter = nextSeg.getIntersection(segment);\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter;\n if (!nextSeg.isAnEndpoint(nextInter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, nextInter);\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n }\n }\n\n // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n if (prevMySplitter !== null || nextMySplitter !== null) {\n let mySplitter = null;\n if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else {\n const cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);\n mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;\n }\n\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n this.queue.remove(segment.rightSE);\n newEvents.push(segment.rightSE);\n const newEventsFromSplit = segment.split(mySplitter);\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.remove(segment);\n newEvents.push(event);\n } else {\n // done with left event\n this.segments.push(segment);\n segment.prev = prevSeg;\n }\n } else {\n // event.isRight\n\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n const inter = prevSeg.getIntersection(nextSeg);\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, inter);\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n if (!nextSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, inter);\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n }\n }\n this.tree.remove(segment);\n }\n return newEvents;\n }\n\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n _splitSafely(seg, pt) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.remove(seg);\n const rightSE = seg.rightSE;\n this.queue.remove(rightSE);\n const newEvents = seg.split(pt);\n newEvents.push(rightSE);\n // splitting can trigger consumption\n if (seg.consumedBy === undefined) this.tree.add(seg);\n return newEvents;\n }\n}\n\n// Limits on iterative processes to prevent infinite loops - usually caused by floating-point math round-off errors.\nconst POLYGON_CLIPPING_MAX_QUEUE_SIZE = typeof process !== \"undefined\" && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1000000;\nconst POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS = typeof process !== \"undefined\" && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1000000;\nclass Operation {\n run(type, geom, moreGeoms) {\n operation.type = type;\n rounder.reset();\n\n /* Convert inputs to MultiPoly objects */\n const multipolys = [new MultiPolyIn(geom, true)];\n for (let i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n multipolys.push(new MultiPolyIn(moreGeoms[i], false));\n }\n operation.numMultiPolys = multipolys.length;\n\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n if (operation.type === \"difference\") {\n // in place removal\n const subject = multipolys[0];\n let i = 1;\n while (i < multipolys.length) {\n if (getBboxOverlap(multipolys[i].bbox, subject.bbox) !== null) i++;else multipolys.splice(i, 1);\n }\n }\n\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n if (operation.type === \"intersection\") {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const mpA = multipolys[i];\n for (let j = i + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return [];\n }\n }\n }\n\n /* Put segment endpoints in a priority queue */\n const queue = new SplayTree(SweepEvent.compare);\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const sweepEvents = multipolys[i].getSweepEvents();\n for (let j = 0, jMax = sweepEvents.length; j < jMax; j++) {\n queue.insert(sweepEvents[j]);\n if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n throw new Error(\"Infinite loop when putting segment endpoints in a priority queue \" + \"(queue size too big).\");\n }\n }\n }\n\n /* Pass the sweep line over those endpoints */\n const sweepLine = new SweepLine(queue);\n let prevQueueSize = queue.size;\n let node = queue.pop();\n while (node) {\n const evt = node.key;\n if (queue.size === prevQueueSize) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n const seg = evt.segment;\n throw new Error(`Unable to pop() ${evt.isLeft ? \"left\" : \"right\"} SweepEvent ` + `[${evt.point.x}, ${evt.point.y}] from segment #${seg.id} ` + `[${seg.leftSE.point.x}, ${seg.leftSE.point.y}] -> ` + `[${seg.rightSE.point.x}, ${seg.rightSE.point.y}] from queue.`);\n }\n if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n throw new Error(\"Infinite loop when passing sweep line over endpoints \" + \"(queue size too big).\");\n }\n if (sweepLine.segments.length > POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n throw new Error(\"Infinite loop when passing sweep line over endpoints \" + \"(too many sweep line segments).\");\n }\n const newEvents = sweepLine.process(evt);\n for (let i = 0, iMax = newEvents.length; i < iMax; i++) {\n const evt = newEvents[i];\n if (evt.consumedBy === undefined) queue.insert(evt);\n }\n prevQueueSize = queue.size;\n node = queue.pop();\n }\n\n // free some memory we don't need anymore\n rounder.reset();\n\n /* Collect and compile segments we're keeping into a multipolygon */\n const ringsOut = RingOut.factory(sweepLine.segments);\n const result = new MultiPolyOut(ringsOut);\n return result.getGeom();\n }\n}\n\n// singleton available by import\nconst operation = new Operation();\n\nconst union = function (geom) {\n for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n moreGeoms[_key - 1] = arguments[_key];\n }\n return operation.run(\"union\", geom, moreGeoms);\n};\nconst intersection = function (geom) {\n for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n moreGeoms[_key2 - 1] = arguments[_key2];\n }\n return operation.run(\"intersection\", geom, moreGeoms);\n};\nconst xor = function (geom) {\n for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n moreGeoms[_key3 - 1] = arguments[_key3];\n }\n return operation.run(\"xor\", geom, moreGeoms);\n};\nconst difference = function (subjectGeom) {\n for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n clippingGeoms[_key4 - 1] = arguments[_key4];\n }\n return operation.run(\"difference\", subjectGeom, clippingGeoms);\n};\nvar index = {\n union: union,\n intersection: intersection,\n xor: xor,\n difference: difference\n};\n\nexport { index as default };\n","// The shared script runtime under BLOCK and COMMAND modules: lazy sucrase\n// transpilation (typescript + ESM→CJS) and `new Function` execution against\n// a `require` shim that resolves only the virtual \"lineadraw\" /\n// \"lineadraw/helpers\" modules (plus their frozen pre-rename \"linea\" aliases).\n// The user's own code, same-origin, no sandbox by design (calculus\n// getProfile pattern). Kind-specific normalization/validation stays with\n// evalBlock (blocks) and commandModules (commands).\n\n// The script-facing helpers live in their own SELF-CONTAINED module that\n// doubles as a typings source for the generated lineadraw.d.ts. The namespace\n// import IS what `require(\"lineadraw/helpers\")` hands to a compiled script, so\n// the typings match the runtime by construction.\nimport * as scriptHelperFns from \"./scriptHelpers\";\nimport * as scriptBooleans from \"./scriptBooleans\";\n\n/** Everything \"lineadraw/helpers\" exports. */\nconst scriptHelpers = Object.freeze({ ...scriptHelperFns, ...scriptBooleans });\n\n/**\n * All helpers as one object — what migration-wrapped legacy scripts receive\n * via `import { helpers } from \"lineadraw\"` (typed there as deprecated). New\n * scripts import the named functions from \"lineadraw/helpers\".\n */\nexport const helpers = Object.freeze({ ...scriptHelpers });\n\n/**\n * Optional hook a reactive host registers so a re-render/re-evaluation is\n * triggered once the lazily-loaded transpiler finishes (scripts report a\n * transient error until then). No-op by default (headless).\n */\nlet onTranspilerReady: (() => void) | null = null;\nexport const setScriptTranspilerReadyCallback = (\n cb: (() => void) | null,\n): void => {\n onTranspilerReady = cb;\n};\n\n// Every script goes through sucrase: import/export syntax is a SyntaxError\n// to plain `new Function`, so there is no untranspiled fast path anymore.\n// sucrase is lazy-loaded so hosts without script documents never pay for it;\n// while it loads, evaluation reports a transient error and everything\n// re-evaluates on arrival (a reactive host should call\n// `ensureScriptTranspiler` eagerly to hide the flash).\nexport type ModuleExecutor = (script: string) => Record<string, unknown>;\nlet transpiler: ModuleExecutor | null = null;\nlet transpilerLoading: Promise<ModuleExecutor> | null = null;\n\n/** Load the script transpiler (idempotent). Awaited by save/insert flows.\n * Shared by block AND command modules. */\nexport const ensureScriptTranspiler = (): Promise<ModuleExecutor> => {\n if (transpiler) return Promise.resolve(transpiler);\n transpilerLoading ??= import(\"sucrase\").then(({ transform }) => {\n transpiler = (script: string) => {\n // ESM → CJS + type-stripping in one pass, then run the module body\n // once. Top-level code executes here (per script version, cached);\n // the exported functions run per evaluation.\n const code = transform(script, {\n transforms: [\"typescript\", \"imports\"],\n }).code;\n const moduleShim = { exports: {} as Record<string, unknown> };\n new Function(\"exports\", \"require\", \"module\", code)(\n moduleShim.exports,\n (spec: string) => {\n // \"linea\"/\"linea/helpers\" are the pre-rename specifiers — resolved\n // silently so documents and .block.ts files from before the\n // Lineadraw rename keep evaluating.\n if (spec === \"lineadraw/helpers\" || spec === \"linea/helpers\")\n return scriptHelpers;\n // \"lineadraw\" carries the runtime spec identities (defineBlock /\n // defineCommand — the types do all the work) plus the legacy\n // `helpers` object for migration-wrapped scripts; everything else\n // it declares is types, elided at transpile time.\n if (spec === \"lineadraw\" || spec === \"linea\")\n return {\n helpers,\n defineBlock: <T>(blockSpec: T): T => blockSpec,\n defineCommand: <T>(commandSpec: T): T => commandSpec,\n };\n throw new Error(\n `Cannot import \"${spec}\" — scripts may only import from \"lineadraw\" and \"lineadraw/helpers\"`,\n );\n },\n moduleShim,\n );\n const exported = moduleShim.exports;\n // A default-exported spec (`export default defineBlock({...})` or\n // `defineCommand({...})`) carries the same members as the named\n // exports — spread it over them so downstream reads one shape (spec\n // fields win).\n const spec = exported.default;\n return spec !== null && typeof spec === \"object\" && !Array.isArray(spec)\n ? { ...exported, ...(spec as Record<string, unknown>) }\n : exported;\n };\n // Scripts that failed while the transpiler loaded re-evaluate now.\n onTranspilerReady?.();\n return transpiler;\n });\n return transpilerLoading;\n};\n\n/**\n * Execute a raw script module: the transpiled exports with a default-exported\n * spec spread in, no kind-specific normalization or validation. The shared\n * lower layer under block and command compilation. Throws the transient\n * \"compiling\" error until the lazy transpiler has loaded.\n */\nexport const executeScriptModule = (\n script: string,\n): Record<string, unknown> => {\n if (!transpiler) throw transpilerLoadingError();\n return transpiler(script);\n};\n\n/** Whether the lazy transpiler has loaded (distinguishes \"compiling…\" from\n * a real script error in non-throwing meta lookups). */\nexport const scriptTranspilerReady = (): boolean => transpiler !== null;\n\n/** The transient not-yet-loaded error — kicks the load off as a side effect. */\nexport const transpilerLoadingError = (): Error => {\n void ensureScriptTranspiler();\n return new Error(\"Compiling block script…\");\n};\n\n/**\n * A module's id read from its SOURCE — the fallback for a module that no\n * longer compiles (or before the transpiler loads), so lookups by id and\n * merge/replace still find it. Matches the named form\n * (`export const id = \"…\"`), else the first `id: \"…\"` after the spec opener\n * (`defineBlock(` / `defineCommand(` / `export default {`).\n */\nexport const scanScriptId = (\n script: string,\n specOpener: RegExp,\n): string | undefined => {\n const named = /export\\s+const\\s+id\\s*=\\s*[\"']([^\"']+)[\"']/.exec(script);\n if (named) return named[1];\n const call = script.search(specOpener);\n if (call === -1) return undefined;\n return /\\bid\\s*:\\s*[\"']([^\"']+)[\"']/.exec(script.slice(call))?.[1];\n};\n","// Document-wide object lookup by id — model space plus every layout. Object\n// ids are uuids, unique across the whole document, so this is the correct\n// resolver for block object-reference inputs regardless of which space the\n// referencing instance lives in (BlockObjectResolver, blocks/evalBlock.ts).\n\nimport type { LineaDocument } from \"./document\";\nimport type { Block, ModelObject } from \"./objects\";\n\n// One index per document VALUE: documents are replaced (never mutated) on\n// every change, so a WeakMap keyed by the document is self-invalidating.\n// Built lazily on the first miss-path lookup, not per mutation.\nconst indexCache = new WeakMap<LineaDocument, Map<string, ModelObject>>();\n\nconst indexOf = (doc: LineaDocument): Map<string, ModelObject> => {\n let index = indexCache.get(doc);\n if (!index) {\n index = new Map();\n for (const obj of doc.objects) index.set(obj.id, obj);\n for (const layout of doc.layouts)\n for (const obj of layout.objects) index.set(obj.id, obj);\n indexCache.set(doc, index);\n }\n return index;\n};\n\n/** Find an object anywhere in the document; undefined when absent. */\nexport const resolveDocumentObject = (\n doc: LineaDocument,\n id: string,\n): ModelObject | undefined => indexOf(doc).get(id);\n\nconst blocksCache = new WeakMap<LineaDocument, Block[]>();\n\n/** Every block instance of the document, all spaces (cached per document\n * value) — what a host searches for the instances living on it. */\nexport const documentBlocks = (doc: LineaDocument): readonly Block[] => {\n let blocks = blocksCache.get(doc);\n if (!blocks) {\n blocks = [...indexOf(doc).values()].filter(\n (o): o is Block => o.type === \"block\",\n );\n blocksCache.set(doc, blocks);\n }\n return blocks;\n};\n\n/** The lookup bound to one document — the shape block evaluation consumes\n * (BlockObjectResolver: by id, plus the document's block list). */\nexport const documentObjectResolver = (\n doc: LineaDocument,\n): ((id: string) => ModelObject | undefined) & {\n blocks: () => readonly Block[];\n} =>\n Object.assign((id: string) => resolveDocumentObject(doc, id), {\n blocks: () => documentBlocks(doc),\n });\n","// Text measurement in world mm, independent of any render sink (used for\n// bounds, hit-testing, and alignment).\n//\n// The kernel cannot measure glyphs on its own — that needs either a canvas\n// (`measureText`) or precomputed font metrics — so measurement is INJECTED\n// via `TextMeasurer`. The editor supplies a canvas-backed implementation; a\n// Node consumer supplies an opentype.js / precomputed-Inter implementation.\n// `GeometrySink` already exposes a compatible `measureText`, so a sink can be\n// adapted to this interface directly.\n\n// AutoCAD's default MTEXT single line spacing: 1.66 × cap height.\nexport const LINE_HEIGHT_FACTOR = 1.66;\n\n// Tab stops every 4 × cap height (CAD convention). Tabs align columns WITHIN\n// one text object; separate objects line up because the interval convention\n// is shared — same as MTEXT.\nexport const TAB_SIZE_FACTOR = 4;\n\n/** Measures the on-screen width of a single line of text at a cap height. */\nexport interface TextMeasurer {\n /** Width of a single line in mm for the given cap height. Implementations\n * must honor `font` (id from model/fonts.ts) and `widthFactor`\n * (horizontal glyph scale) when provided. */\n measureTextWidth(\n text: string,\n heightMm: number,\n font?: string,\n widthFactor?: number,\n ): number;\n}\n\n/** A measurer with a font assignment baked in — lets object-aware callers\n * bind `(obj.font, obj.widthFactor)` once instead of threading them through\n * every wrap/width call. */\nexport const boundMeasurer = (\n measure: TextMeasurer,\n font?: string,\n widthFactor?: number,\n): TextMeasurer =>\n font === undefined && widthFactor === undefined\n ? measure\n : {\n measureTextWidth: (text, heightMm) =>\n measure.measureTextWidth(text, heightMm, font, widthFactor),\n };\n\nexport interface TextBlock {\n lines: string[];\n /** Widest line, mm. */\n width: number;\n /** Total block height, mm. */\n height: number;\n lineHeight: number;\n}\n\n/** One tab-delimited run of a line: its text and start offset from the\n * line's left edge (mm). */\nexport interface LineSegment {\n text: string;\n x: number;\n}\n\n/**\n * Split one line at tabs into positioned segments: each tab advances to the\n * next multiple of `TAB_SIZE_FACTOR × heightMm` past the previous segment's\n * measured end. Tab-less lines come back as one segment at x = 0.\n */\nexport const lineSegments = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n): LineSegment[] => {\n if (!line.includes(\"\\t\")) return [{ text: line, x: 0 }];\n const tab = heightMm * TAB_SIZE_FACTOR;\n const out: LineSegment[] = [];\n let x = 0;\n const parts = line.split(\"\\t\");\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) x = (Math.floor(x / tab + 1e-9) + 1) * tab;\n out.push({ text: parts[i], x });\n x += measure.measureTextWidth(parts[i], heightMm);\n }\n return out;\n};\n\n/** Width of one line in mm, tab stops expanded. */\nexport const lineWidthWithTabs = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n): number => {\n const segs = lineSegments(line, heightMm, measure);\n const last = segs[segs.length - 1];\n return last.x + measure.measureTextWidth(last.text, heightMm);\n};\n\n/** Greedy word-wrap of tab-less text to a max width (mm). Words wider than\n * the limit overflow on their own line rather than breaking mid-word. */\nconst wrapWords = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n maxWidthMm: number,\n): string[] => {\n const words = line.split(\" \");\n const out: string[] = [];\n let cur = \"\";\n for (const w of words) {\n const trial = cur ? `${cur} ${w}` : w;\n if (cur && measure.measureTextWidth(trial, heightMm) > maxWidthMm) {\n out.push(cur);\n cur = w;\n } else {\n cur = trial;\n }\n }\n out.push(cur);\n return out;\n};\n\n/** Word-wrap of one logical line to a max width (mm). */\nconst wrapLine = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n maxWidthMm: number,\n): string[] => {\n if (!line.includes(\"\\t\"))\n return wrapWords(line, heightMm, measure, maxWidthMm);\n // Tabbed line. A tabular row that FITS passes through unwrapped (breaking\n // a table row would misalign its columns). One that overflows is the MTEXT\n // bullet shape — \"-<tab>long paragraph\" — so wrap the text after the LAST\n // tab and hang continuation lines at its stop by re-prefixing the tabs\n // (stops are a fixed grid, so a leading tab run lands on the same stop).\n if (lineWidthWithTabs(line, heightMm, measure) <= maxWidthMm) return [line];\n const segs = lineSegments(line, heightMm, measure);\n const x0 = segs[segs.length - 1].x;\n if (maxWidthMm - x0 <= heightMm) return [line]; // stop ~past the box: give up\n const cut = line.lastIndexOf(\"\\t\") + 1;\n const tabs = \"\\t\".repeat(segs.length - 1);\n return wrapWords(line.slice(cut), heightMm, measure, maxWidthMm - x0).map(\n (l, i) => (i === 0 ? line.slice(0, cut) + l : tabs + l),\n );\n};\n\nexport const textBlock = (\n content: string,\n heightMm: number,\n measure: TextMeasurer,\n /** Word-wrap boundary in mm; also fixes the block width. */\n maxWidthMm?: number,\n): TextBlock => {\n const wrap = maxWidthMm !== undefined && maxWidthMm > 0;\n const lines = wrap\n ? content\n .split(\"\\n\")\n .flatMap((l) => wrapLine(l, heightMm, measure, maxWidthMm))\n : content.split(\"\\n\");\n const lineHeight = heightMm * LINE_HEIGHT_FACTOR;\n return {\n lines,\n // A fixed max width defines the box; otherwise it hugs the widest line.\n width: wrap\n ? maxWidthMm\n : Math.max(\n ...lines.map((l) => lineWidthWithTabs(l, heightMm, measure)),\n 0,\n ),\n height: heightMm + (lines.length - 1) * lineHeight,\n lineHeight,\n };\n};\n","// Rich text (docs/rich-text.md): character spans over a text's plain\n// `content` — normalization, range formatting, and the layout the painter,\n// bounds and snapping share. Texts without spans never come here; they keep\n// textMetrics' plain path, so their output cannot move.\n\nimport type { TextSpan } from \"../model/objects\";\nimport { fontFace, parseFontFace } from \"../model/fonts\";\nimport {\n LINE_HEIGHT_FACTOR,\n TAB_SIZE_FACTOR,\n type TextMeasurer,\n} from \"./textMetrics\";\n\n/** A span's formatting without its range. */\nexport type SpanAttrs = Omit<TextSpan, \"start\" | \"end\">;\n\nconst ATTR_KEYS = [\n \"font\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"color\",\n \"height\",\n \"script\",\n] as const satisfies readonly (keyof SpanAttrs)[];\n\n/** Sub/superscript glyphs: size and baseline shift, × the run's cap height.\n * The field (TextInputOverlay) renders with the same constants. */\nexport const SCRIPT_SCALE = 0.6;\nexport const SUPER_RISE = 0.45;\nexport const SUB_DROP = 0.2;\n\nconst attrsOf = (s: Partial<SpanAttrs>): SpanAttrs => {\n const out: Record<string, unknown> = {};\n for (const k of ATTR_KEYS) if (s[k] !== undefined) out[k] = s[k];\n return out as SpanAttrs;\n};\nconst sameAttrs = (a: SpanAttrs, b: SpanAttrs): boolean =>\n ATTR_KEYS.every((k) => a[k] === b[k]);\nconst isEmpty = (a: SpanAttrs): boolean =>\n ATTR_KEYS.every((k) => a[k] === undefined);\n\n/** Never put a boundary between the halves of a surrogate pair. */\nconst snap = (i: number, content: string): number => {\n const c = Math.max(0, Math.min(content.length, Math.round(i)));\n const code = content.charCodeAt(c);\n return c > 0 && code >= 0xdc00 && code <= 0xdfff ? c - 1 : c;\n};\n\ninterface Interval {\n start: number;\n end: number;\n attrs: SpanAttrs;\n}\n\n/** [0, length) cut at every span boundary (plus `extra` cuts), each piece\n * with the attributes of the spans covering it — later spans win. */\nconst toIntervals = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n extra: number[] = [],\n): Interval[] => {\n const cuts = new Set([0, content.length]);\n for (const s of spans ?? []) {\n cuts.add(snap(s.start, content));\n cuts.add(snap(s.end, content));\n }\n for (const c of extra) cuts.add(snap(c, content));\n const sorted = [...cuts].sort((a, b) => a - b);\n const out: Interval[] = [];\n for (let i = 0; i + 1 < sorted.length; i++) {\n const start = sorted[i];\n const end = sorted[i + 1];\n let attrs: SpanAttrs = {};\n for (const s of spans ?? [])\n if (snap(s.start, content) <= start && snap(s.end, content) >= end)\n attrs = { ...attrs, ...attrsOf(s) };\n out.push({ start, end, attrs });\n }\n return out;\n};\n\nconst fromIntervals = (intervals: Interval[]): TextSpan[] => {\n const out: TextSpan[] = [];\n for (const iv of intervals) {\n if (iv.end <= iv.start || isEmpty(iv.attrs)) continue;\n const last = out[out.length - 1];\n if (last && last.end === iv.start && sameAttrs(attrsOf(last), iv.attrs))\n last.end = iv.end;\n else out.push({ start: iv.start, end: iv.end, ...iv.attrs });\n }\n return out;\n};\n\n/** The canonical form: sorted, non-overlapping (later spans win), clamped\n * to the content, no empty or attribute-less spans, equal neighbours\n * merged. */\nexport const normalizeSpans = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n): TextSpan[] => fromIntervals(toIntervals(spans, content));\n\n/** Set (or, with `undefined`, clear) attributes over [start, end). */\nexport const formatSpans = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n start: number,\n end: number,\n patch: Partial<SpanAttrs>,\n): TextSpan[] => {\n const a = snap(Math.min(start, end), content);\n const b = snap(Math.max(start, end), content);\n return fromIntervals(\n toIntervals(spans, content, [a, b]).map((iv) => {\n if (iv.start < a || iv.end > b) return iv;\n const attrs: Record<string, unknown> = { ...iv.attrs, ...patch };\n for (const k of ATTR_KEYS) if (attrs[k] === undefined) delete attrs[k];\n return { ...iv, attrs: attrs as SpanAttrs };\n }),\n );\n};\n\n/** Attributes shared by every character of [start, end) — what a format\n * bar shows as \"on\". An empty range reads the character before it. */\nexport const spanAttrsAt = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n start: number,\n end: number,\n): SpanAttrs => {\n const a = end > start ? start : Math.max(0, start - 1);\n const b = end > start ? end : a + 1;\n const hit = toIntervals(spans, content).filter(\n (iv) => iv.end > a && iv.start < b,\n );\n if (hit.length === 0) return {};\n const out: Record<string, unknown> = { ...hit[0].attrs };\n for (const iv of hit.slice(1))\n for (const k of ATTR_KEYS) if (out[k] !== iv.attrs[k]) delete out[k];\n return out as SpanAttrs;\n};\n\n/** The spans over [start, end), clipped to it and moved to start at `to`\n * — for text cut, joined or re-flowed (table wraps, merged cells). */\nexport const sliceSpans = (\n spans: readonly TextSpan[] | undefined,\n start: number,\n end: number,\n to = 0,\n): TextSpan[] =>\n (spans ?? [])\n .filter((s) => s.end > start && s.start < end)\n .map((s) => ({\n ...s,\n start: Math.max(s.start, start) - start + to,\n end: Math.min(s.end, end) - start + to,\n }));\n\n// ---- layout -----------------------------------------------------------------\n\n/** The text's resolved base style (what spans inherit). */\nexport interface RichBase {\n /** Face string (model/fonts.ts fontFace). */\n face: string | undefined;\n /** Cap height, mm, scale applied. */\n heightMm: number;\n widthFactor: number;\n}\n\n/** One drawn piece: uniform formatting, left edge at `x` (mm from the\n * line's left edge), baseline shifted `dy` (mm, up) for scripts. */\nexport interface RichPiece {\n text: string;\n x: number;\n width: number;\n dy: number;\n heightMm: number;\n face: string | undefined;\n color?: string;\n underline?: boolean;\n}\n\nexport interface RichLine {\n /** The content range this line shows. */\n start: number;\n end: number;\n pieces: RichPiece[];\n width: number;\n /** Tabbed / hanging lines run from the BLOCK's left edge whatever the\n * alignment (the plain painter's rule); others align on their own. */\n fromBlockEdge: boolean;\n /** Baseline, mm below the block's top edge (positive down). */\n baseline: number;\n}\n\nexport interface RichBlock {\n lines: RichLine[];\n width: number;\n height: number;\n}\n\ninterface Run extends Interval {\n face: string | undefined;\n /** The cap height the run's line is spaced by (scripts: their parent's). */\n cap: number;\n /** Drawn glyph cap height. */\n glyph: number;\n dy: number;\n}\n\n/**\n * Lay out formatted text: paragraphs at \"\\n\", tab stops every\n * TAB_SIZE_FACTOR × base height from the block's left edge (advanced with\n * `tabMeasure`, the deterministic measurer, like the plain painter), greedy\n * word wrap at `maxWidthMm` with a tabbed paragraph's continuation hanging\n * at its last tab stop. Lines are spaced LINE_HEIGHT_FACTOR × the mean cap\n * height of each neighbouring pair (uniform text: the plain spacing).\n */\nexport const richTextBlock = (\n content: string,\n spans: readonly TextSpan[] | undefined,\n base: RichBase,\n measure: TextMeasurer,\n tabMeasure: TextMeasurer,\n maxWidthMm?: number,\n): RichBlock => {\n const h = base.heightMm;\n const baseFace = parseFontFace(base.face);\n const runs: Run[] = toIntervals(spans, content).map((iv) => {\n const a = iv.attrs;\n const cap = h * (a.height ?? 1);\n return {\n ...iv,\n face: fontFace(\n a.font ?? baseFace.font,\n a.bold ?? baseFace.bold,\n a.italic ?? baseFace.italic,\n ),\n cap,\n glyph: a.script ? cap * SCRIPT_SCALE : cap,\n dy:\n a.script === \"super\"\n ? cap * SUPER_RISE\n : a.script === \"sub\"\n ? -cap * SUB_DROP\n : 0,\n };\n });\n const runsIn = (a: number, b: number) =>\n runs.filter((r) => r.end > a && r.start < b);\n const widthOf = (a: number, b: number, m: TextMeasurer) =>\n runsIn(a, b).reduce(\n (w, r) =>\n w +\n m.measureTextWidth(\n content.slice(Math.max(a, r.start), Math.min(b, r.end)),\n r.glyph,\n r.face,\n base.widthFactor,\n ),\n 0,\n );\n const tab = h * TAB_SIZE_FACTOR;\n const nextStop = (x: number) => (Math.floor(x / tab + 1e-9) + 1) * tab;\n\n /** Tab-split segments of [a, b) with their x (stops via tabMeasure). */\n const segments = (a: number, b: number) => {\n const out: { start: number; end: number; x: number }[] = [];\n let x = 0;\n let s = a;\n for (let i = a; i <= b; i++) {\n if (i < b && content[i] !== \"\\t\") continue;\n out.push({ start: s, end: i, x });\n x = nextStop(x + widthOf(s, i, tabMeasure));\n s = i + 1;\n }\n return out;\n };\n\n /** Greedy word wrap of [a, b) (no tabs) to `max`: [start, end) lines,\n * the breaking space dropped — textMetrics' wrapWords over ranges. */\n const wrapWords = (a: number, b: number, max: number) => {\n const out: [number, number][] = [];\n let lineStart = a;\n let cur = -1;\n for (let i = a; i <= b; i++) {\n if (i < b && content[i] !== \" \") continue;\n if (cur >= 0 && widthOf(lineStart, i, measure) > max) {\n out.push([lineStart, cur]);\n lineStart = cur + 1;\n }\n cur = i;\n }\n out.push([lineStart, b]);\n return out;\n };\n\n interface Raw {\n start: number;\n end: number;\n /** Continuation of a tabbed paragraph: hangs at this x. */\n hang?: number;\n tabbed: boolean;\n }\n const raw: Raw[] = [];\n let p0 = 0;\n for (const para of content.split(\"\\n\")) {\n const p1 = p0 + para.length;\n const tabbed = para.includes(\"\\t\");\n const wrap = maxWidthMm !== undefined && maxWidthMm > 0;\n if (!wrap) raw.push({ start: p0, end: p1, tabbed });\n else if (!tabbed)\n for (const [s, e] of wrapWords(p0, p1, maxWidthMm))\n raw.push({ start: s, end: e, tabbed });\n else {\n const segs = segments(p0, p1);\n const last = segs[segs.length - 1];\n const width = last.x + widthOf(last.start, last.end, measure);\n if (width <= maxWidthMm || maxWidthMm - last.x <= h)\n raw.push({ start: p0, end: p1, tabbed });\n else\n wrapWords(last.start, p1, maxWidthMm - last.x).forEach(([s, e], i) =>\n raw.push(\n i === 0\n ? { start: p0, end: e, tabbed }\n : { start: s, end: e, hang: last.x, tabbed },\n ),\n );\n }\n p0 = p1 + 1;\n }\n\n const lines: RichLine[] = [];\n let baseline = 0;\n let prevCap = 0;\n for (const r of raw) {\n const segs =\n r.hang !== undefined\n ? [{ start: r.start, end: r.end, x: r.hang }]\n : segments(r.start, r.end);\n const pieces: RichPiece[] = [];\n for (const seg of segs) {\n let x = seg.x;\n for (const run of runsIn(seg.start, seg.end)) {\n const text = content.slice(\n Math.max(seg.start, run.start),\n Math.min(seg.end, run.end),\n );\n const width = measure.measureTextWidth(\n text,\n run.glyph,\n run.face,\n base.widthFactor,\n );\n pieces.push({\n text,\n x,\n width,\n dy: run.dy,\n heightMm: run.glyph,\n face: run.face,\n ...(run.attrs.color ? { color: run.attrs.color } : {}),\n ...(run.attrs.underline ? { underline: true } : {}),\n });\n x += width;\n }\n }\n // An empty line spaces by the run at its position (or the base).\n const at = runsIn(r.start, Math.max(r.end, r.start + 1));\n const cap = Math.max(...at.map((run) => run.cap), at.length ? 0 : h);\n baseline +=\n lines.length === 0 ? cap : (LINE_HEIGHT_FACTOR * (prevCap + cap)) / 2;\n prevCap = cap;\n const last = pieces[pieces.length - 1];\n lines.push({\n start: r.start,\n end: r.end,\n pieces,\n width: last ? last.x + last.width : 0,\n fromBlockEdge: r.tabbed,\n baseline,\n });\n }\n return {\n lines,\n width:\n maxWidthMm !== undefined && maxWidthMm > 0\n ? maxWidthMm\n : Math.max(...lines.map((l) => l.width), 0),\n height: baseline,\n };\n};\n","// GENERATED — do not edit. Per-font advance widths (em units — ASCII,\n// Latin-1, Cyrillic, typography/CAD extras) and cap-height ratios,\n// extracted from the real TTFs for the headless measurer and the PDF\n// coverage checks. Regenerate with: npm run gen:fonts -w @lineadraw/core\nexport interface AdvanceTable {\n /** OS/2 sCapHeight / unitsPerEm. */\n capHeight: number;\n /** Fallback for characters outside the table (em). */\n defaultAdvance: number;\n /** Advance per character (em). */\n advances: Readonly<Record<string, number>>;\n}\n\n/** Codepoint ranges the tables extract — a char inside these but absent\n * from a font's table is a REAL coverage gap in that font. */\nexport const EXTRACTED_RANGES: readonly (readonly [number, number])[] = [\n [32, 126],\n [160, 255],\n [1024, 1119],\n];\nexport const EXTRACTED_EXTRAS = \"‐–—‘’‚“”„…‰•€™⌀№\";\n\n/** Keyed by font id, plus the bundled styled faces (\"arial;b\", …). */\nexport const ADVANCE_TABLES: Record<string, AdvanceTable> = {\n arial: {\n capHeight: 0.7163,\n defaultAdvance: 0.527,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.2778,\n '\"': 0.355,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.667,\n \"'\": 0.1909,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.2778,\n \";\": 0.2778,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.5562,\n \"@\": 1.0151,\n A: 0.667,\n B: 0.667,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5,\n K: 0.667,\n L: 0.5562,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.2778,\n \"\\\\\": 0.2778,\n \"]\": 0.2778,\n \"^\": 0.4692,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.5562,\n c: 0.5,\n d: 0.5562,\n e: 0.5562,\n f: 0.2778,\n g: 0.5562,\n h: 0.5562,\n i: 0.2222,\n j: 0.2222,\n k: 0.5,\n l: 0.2222,\n m: 0.833,\n n: 0.5562,\n o: 0.5562,\n p: 0.5562,\n q: 0.5562,\n r: 0.333,\n s: 0.5,\n t: 0.2778,\n u: 0.5562,\n v: 0.5,\n w: 0.7222,\n x: 0.5,\n y: 0.5,\n z: 0.5,\n \"{\": 0.334,\n \"|\": 0.2598,\n \"}\": 0.334,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2598,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5371,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.667,\n Á: 0.667,\n Â: 0.667,\n Ã: 0.667,\n Ä: 0.667,\n Å: 0.667,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.5562,\n ñ: 0.5562,\n ò: 0.5562,\n ó: 0.5562,\n ô: 0.5562,\n õ: 0.5562,\n ö: 0.5562,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.5562,\n ú: 0.5562,\n û: 0.5562,\n ü: 0.5562,\n ý: 0.5,\n þ: 0.5562,\n ÿ: 0.5,\n Ѐ: 0.667,\n Ё: 0.6675,\n Ђ: 0.8647,\n Ѓ: 0.5415,\n Є: 0.7188,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5,\n Љ: 1.0571,\n Њ: 1.0103,\n Ћ: 0.854,\n Ќ: 0.5825,\n Ѝ: 0.7188,\n Ў: 0.6353,\n Џ: 0.7188,\n А: 0.667,\n Б: 0.6563,\n В: 0.667,\n Г: 0.5415,\n Д: 0.6772,\n Е: 0.667,\n Ж: 0.9233,\n З: 0.604,\n И: 0.7188,\n Й: 0.7188,\n К: 0.5825,\n Л: 0.6563,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7188,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6353,\n Ф: 0.7603,\n Х: 0.667,\n Ц: 0.7397,\n Ч: 0.6665,\n Ш: 0.9165,\n Щ: 0.9375,\n Ъ: 0.7915,\n Ы: 0.8853,\n Ь: 0.6563,\n Э: 0.7188,\n Ю: 1.0103,\n Я: 0.7222,\n а: 0.5562,\n б: 0.5728,\n в: 0.5313,\n г: 0.3647,\n д: 0.5835,\n е: 0.5562,\n ж: 0.6689,\n з: 0.4585,\n и: 0.5586,\n й: 0.5586,\n к: 0.4375,\n л: 0.5835,\n м: 0.6875,\n н: 0.5522,\n о: 0.5562,\n п: 0.5415,\n р: 0.5562,\n с: 0.5,\n т: 0.458,\n у: 0.5,\n ф: 0.8228,\n х: 0.5,\n ц: 0.5728,\n ч: 0.521,\n ш: 0.8022,\n щ: 0.8228,\n ъ: 0.625,\n ы: 0.7188,\n ь: 0.521,\n э: 0.5103,\n ю: 0.75,\n я: 0.5415,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.5562,\n ѓ: 0.3647,\n є: 0.5103,\n ѕ: 0.5,\n і: 0.2222,\n ї: 0.2778,\n ј: 0.2222,\n љ: 0.9063,\n њ: 0.8125,\n ћ: 0.5562,\n ќ: 0.4375,\n ѝ: 0.5586,\n ў: 0.5,\n џ: 0.5522,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2222,\n \"’\": 0.2222,\n \"‚\": 0.2222,\n \"“\": 0.333,\n \"”\": 0.333,\n \"„\": 0.333,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.0728,\n },\n },\n \"arial;b\": {\n capHeight: 0.7163,\n defaultAdvance: 0.5513,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.333,\n '\"': 0.4741,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.7222,\n \"'\": 0.2378,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.333,\n \";\": 0.333,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.6108,\n \"@\": 0.9751,\n A: 0.7222,\n B: 0.7222,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5562,\n K: 0.7222,\n L: 0.6108,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.333,\n \"\\\\\": 0.2778,\n \"]\": 0.333,\n \"^\": 0.584,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.6108,\n c: 0.5562,\n d: 0.6108,\n e: 0.5562,\n f: 0.333,\n g: 0.6108,\n h: 0.6108,\n i: 0.2778,\n j: 0.2778,\n k: 0.5562,\n l: 0.2778,\n m: 0.8892,\n n: 0.6108,\n o: 0.6108,\n p: 0.6108,\n q: 0.6108,\n r: 0.3892,\n s: 0.5562,\n t: 0.333,\n u: 0.6108,\n v: 0.5562,\n w: 0.7778,\n x: 0.5562,\n y: 0.5562,\n z: 0.5,\n \"{\": 0.3892,\n \"|\": 0.2798,\n \"}\": 0.3892,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2798,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5562,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.7222,\n Á: 0.7222,\n Â: 0.7222,\n Ã: 0.7222,\n Ä: 0.7222,\n Å: 0.7222,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5562,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.6108,\n ñ: 0.6108,\n ò: 0.6108,\n ó: 0.6108,\n ô: 0.6108,\n õ: 0.6108,\n ö: 0.6108,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.6108,\n ú: 0.6108,\n û: 0.6108,\n ü: 0.6108,\n ý: 0.5562,\n þ: 0.6108,\n ÿ: 0.5562,\n Ѐ: 0.667,\n Ё: 0.6689,\n Ђ: 0.8853,\n Ѓ: 0.5669,\n Є: 0.7114,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2759,\n Ј: 0.5562,\n Љ: 1.0938,\n Њ: 1.0625,\n Ћ: 0.875,\n Ќ: 0.6104,\n Ѝ: 0.7188,\n Ў: 0.6221,\n Џ: 0.7188,\n А: 0.7222,\n Б: 0.7188,\n В: 0.7222,\n Г: 0.5669,\n Д: 0.7124,\n Е: 0.667,\n Ж: 0.9038,\n З: 0.6265,\n И: 0.7188,\n Й: 0.7188,\n К: 0.6104,\n Л: 0.7017,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7188,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6221,\n Ф: 0.8535,\n Х: 0.667,\n Ц: 0.7305,\n Ч: 0.7026,\n Ш: 1.0049,\n Щ: 1.019,\n Ъ: 0.8696,\n Ы: 0.979,\n Ь: 0.7188,\n Э: 0.7114,\n Ю: 1.0313,\n Я: 0.7188,\n а: 0.5562,\n б: 0.6177,\n в: 0.6147,\n г: 0.4165,\n д: 0.6348,\n е: 0.5562,\n ж: 0.709,\n з: 0.4971,\n и: 0.6147,\n й: 0.6147,\n к: 0.5005,\n л: 0.6353,\n м: 0.7397,\n н: 0.604,\n о: 0.6108,\n п: 0.604,\n р: 0.6108,\n с: 0.5562,\n т: 0.4897,\n у: 0.5562,\n ф: 0.875,\n х: 0.5562,\n ц: 0.6147,\n ч: 0.5806,\n ш: 0.8335,\n щ: 0.8438,\n ъ: 0.729,\n ы: 0.854,\n ь: 0.6147,\n э: 0.5522,\n ю: 0.854,\n я: 0.5835,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.6108,\n ѓ: 0.4165,\n є: 0.5522,\n ѕ: 0.5562,\n і: 0.2778,\n ї: 0.2813,\n ј: 0.2778,\n љ: 0.9688,\n њ: 0.9063,\n ћ: 0.6108,\n ќ: 0.5005,\n ѝ: 0.6147,\n ў: 0.5562,\n џ: 0.604,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2778,\n \"’\": 0.2778,\n \"‚\": 0.2778,\n \"“\": 0.5,\n \"”\": 0.5,\n \"„\": 0.5,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.1147,\n },\n },\n \"arial;i\": {\n capHeight: 0.7163,\n defaultAdvance: 0.527,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.2778,\n '\"': 0.355,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.667,\n \"'\": 0.1909,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.2778,\n \";\": 0.2778,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.5562,\n \"@\": 1.0151,\n A: 0.667,\n B: 0.667,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5,\n K: 0.667,\n L: 0.5562,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.2778,\n \"\\\\\": 0.2778,\n \"]\": 0.2778,\n \"^\": 0.4692,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.5562,\n c: 0.5,\n d: 0.5562,\n e: 0.5562,\n f: 0.2778,\n g: 0.5562,\n h: 0.5562,\n i: 0.2222,\n j: 0.2222,\n k: 0.5,\n l: 0.2222,\n m: 0.833,\n n: 0.5562,\n o: 0.5562,\n p: 0.5562,\n q: 0.5562,\n r: 0.333,\n s: 0.5,\n t: 0.2778,\n u: 0.5562,\n v: 0.5,\n w: 0.7222,\n x: 0.5,\n y: 0.5,\n z: 0.5,\n \"{\": 0.334,\n \"|\": 0.2598,\n \"}\": 0.334,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2598,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5371,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.667,\n Á: 0.667,\n Â: 0.667,\n Ã: 0.667,\n Ä: 0.667,\n Å: 0.667,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.5562,\n ñ: 0.5562,\n ò: 0.5562,\n ó: 0.5562,\n ô: 0.5562,\n õ: 0.5562,\n ö: 0.5562,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.5562,\n ú: 0.5562,\n û: 0.5562,\n ü: 0.5562,\n ý: 0.5,\n þ: 0.5562,\n ÿ: 0.5,\n Ѐ: 0.667,\n Ё: 0.667,\n Ђ: 0.8428,\n Ѓ: 0.5439,\n Є: 0.7075,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5,\n Љ: 1.0659,\n Њ: 0.9824,\n Ћ: 0.8442,\n Ќ: 0.5894,\n Ѝ: 0.7153,\n Ў: 0.6392,\n Џ: 0.7236,\n А: 0.667,\n Б: 0.6509,\n В: 0.667,\n Г: 0.5439,\n Д: 0.7041,\n Е: 0.667,\n Ж: 0.917,\n З: 0.6138,\n И: 0.7153,\n Й: 0.7153,\n К: 0.5894,\n Л: 0.6855,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7246,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6392,\n Ф: 0.7949,\n Х: 0.667,\n Ц: 0.7271,\n Ч: 0.6733,\n Ш: 0.9204,\n Щ: 0.9229,\n Ъ: 0.8052,\n Ы: 0.8862,\n Ь: 0.6509,\n Э: 0.6938,\n Ю: 1.0225,\n Я: 0.6816,\n а: 0.5562,\n б: 0.5625,\n в: 0.522,\n г: 0.4932,\n д: 0.5527,\n е: 0.5562,\n ж: 0.688,\n з: 0.4648,\n и: 0.5562,\n й: 0.5562,\n к: 0.4722,\n л: 0.564,\n м: 0.6855,\n н: 0.5503,\n о: 0.5562,\n п: 0.5503,\n р: 0.5562,\n с: 0.5,\n т: 0.833,\n у: 0.5,\n ф: 0.8354,\n х: 0.5,\n ц: 0.5718,\n ч: 0.5176,\n ш: 0.8301,\n щ: 0.8511,\n ъ: 0.6211,\n ы: 0.7358,\n ь: 0.5259,\n э: 0.4917,\n ю: 0.752,\n я: 0.5342,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.5562,\n ѓ: 0.3779,\n є: 0.4956,\n ѕ: 0.5,\n і: 0.2222,\n ї: 0.2222,\n ј: 0.2222,\n љ: 0.9102,\n њ: 0.8276,\n ћ: 0.5562,\n ќ: 0.4722,\n ѝ: 0.5562,\n ў: 0.5,\n џ: 0.5562,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2222,\n \"’\": 0.2222,\n \"‚\": 0.2222,\n \"“\": 0.333,\n \"”\": 0.333,\n \"„\": 0.333,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.083,\n },\n },\n \"arial;bi\": {\n capHeight: 0.7163,\n defaultAdvance: 0.5513,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.333,\n '\"': 0.4741,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.7222,\n \"'\": 0.2378,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.333,\n \";\": 0.333,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.6108,\n \"@\": 0.9751,\n A: 0.7222,\n B: 0.7222,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5562,\n K: 0.7222,\n L: 0.6108,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.333,\n \"\\\\\": 0.2778,\n \"]\": 0.333,\n \"^\": 0.584,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.6108,\n c: 0.5562,\n d: 0.6108,\n e: 0.5562,\n f: 0.333,\n g: 0.6108,\n h: 0.6108,\n i: 0.2778,\n j: 0.2778,\n k: 0.5562,\n l: 0.2778,\n m: 0.8892,\n n: 0.6108,\n o: 0.6108,\n p: 0.6108,\n q: 0.6108,\n r: 0.3892,\n s: 0.5562,\n t: 0.333,\n u: 0.6108,\n v: 0.5562,\n w: 0.7778,\n x: 0.5562,\n y: 0.5562,\n z: 0.5,\n \"{\": 0.3892,\n \"|\": 0.2798,\n \"}\": 0.3892,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2798,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5562,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.7222,\n Á: 0.7222,\n Â: 0.7222,\n Ã: 0.7222,\n Ä: 0.7222,\n Å: 0.7222,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5562,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.6108,\n ñ: 0.6108,\n ò: 0.6108,\n ó: 0.6108,\n ô: 0.6108,\n õ: 0.6108,\n ö: 0.6108,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.6108,\n ú: 0.6108,\n û: 0.6108,\n ü: 0.6108,\n ý: 0.5562,\n þ: 0.6108,\n ÿ: 0.5562,\n Ѐ: 0.667,\n Ё: 0.667,\n Ђ: 0.8857,\n Ѓ: 0.6138,\n Є: 0.7188,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5562,\n Љ: 1.0942,\n Њ: 1.042,\n Ћ: 0.8535,\n Ќ: 0.6147,\n Ѝ: 0.7192,\n Ў: 0.6772,\n Џ: 0.7192,\n А: 0.7222,\n Б: 0.708,\n В: 0.7222,\n Г: 0.6138,\n Д: 0.7222,\n Е: 0.667,\n Ж: 0.9272,\n З: 0.6426,\n И: 0.7192,\n Й: 0.7192,\n К: 0.6147,\n Л: 0.687,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7192,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6772,\n Ф: 0.7808,\n Х: 0.667,\n Ц: 0.729,\n Ч: 0.708,\n Ш: 0.979,\n Щ: 0.9888,\n Ъ: 0.854,\n Ы: 1,\n Ь: 0.708,\n Э: 0.7188,\n Ю: 1.042,\n Я: 0.729,\n а: 0.5562,\n б: 0.6191,\n в: 0.604,\n г: 0.5337,\n д: 0.6182,\n е: 0.5562,\n ж: 0.7363,\n з: 0.5103,\n и: 0.6108,\n й: 0.6108,\n к: 0.5068,\n л: 0.6221,\n м: 0.7397,\n н: 0.604,\n о: 0.6108,\n п: 0.6108,\n р: 0.6108,\n с: 0.5562,\n т: 0.8892,\n у: 0.5562,\n ф: 0.8848,\n х: 0.5562,\n ц: 0.646,\n ч: 0.583,\n ш: 0.8892,\n щ: 0.9351,\n ъ: 0.707,\n ы: 0.854,\n ь: 0.5938,\n э: 0.5518,\n ю: 0.8647,\n я: 0.5889,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.6108,\n ѓ: 0.4692,\n є: 0.563,\n ѕ: 0.5562,\n і: 0.2778,\n ї: 0.2778,\n ј: 0.2778,\n љ: 0.9692,\n њ: 0.9058,\n ћ: 0.6108,\n ќ: 0.5068,\n ѝ: 0.6108,\n ў: 0.5562,\n џ: 0.6108,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2778,\n \"’\": 0.2778,\n \"‚\": 0.2778,\n \"“\": 0.5,\n \"”\": 0.5,\n \"„\": 0.5,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.146,\n },\n },\n osifont: {\n capHeight: 0.7397,\n defaultAdvance: 0.4659,\n advances: {\n \"0\": 0.4678,\n \"1\": 0.3418,\n \"2\": 0.4663,\n \"3\": 0.4805,\n \"4\": 0.5132,\n \"5\": 0.4971,\n \"6\": 0.4946,\n \"7\": 0.478,\n \"8\": 0.5156,\n \"9\": 0.5029,\n \" \": 0.4346,\n \"!\": 0.2197,\n '\"': 0.3911,\n \"#\": 0.6133,\n $: 0.4658,\n \"%\": 0.7637,\n \"&\": 0.6143,\n \"'\": 0.2036,\n \"(\": 0.2549,\n \")\": 0.2549,\n \"*\": 0.4639,\n \"+\": 0.4648,\n \",\": 0.2329,\n \"-\": 0.4648,\n \".\": 0.2012,\n \"/\": 0.4912,\n \":\": 0.2222,\n \";\": 0.2549,\n \"<\": 0.4648,\n \"=\": 0.4639,\n \">\": 0.4648,\n \"?\": 0.4644,\n \"@\": 0.8105,\n A: 0.6143,\n B: 0.582,\n C: 0.4902,\n D: 0.5884,\n E: 0.4897,\n F: 0.4897,\n G: 0.5796,\n H: 0.5908,\n I: 0.2207,\n J: 0.4136,\n K: 0.564,\n L: 0.4917,\n M: 0.666,\n N: 0.5869,\n O: 0.5874,\n P: 0.5625,\n Q: 0.5967,\n R: 0.564,\n S: 0.5396,\n T: 0.5376,\n U: 0.5889,\n V: 0.6147,\n W: 0.7612,\n X: 0.6162,\n Y: 0.6143,\n Z: 0.54,\n \"[\": 0.2656,\n \"\\\\\": 0.4619,\n \"]\": 0.2656,\n \"^\": 0.3896,\n _: 0.4648,\n \"`\": 0.3154,\n a: 0.4814,\n b: 0.5029,\n c: 0.4048,\n d: 0.5034,\n e: 0.4956,\n f: 0.439,\n g: 0.5024,\n h: 0.5034,\n i: 0.2183,\n j: 0.2178,\n k: 0.4917,\n l: 0.2676,\n m: 0.6421,\n n: 0.4937,\n o: 0.4927,\n p: 0.5073,\n q: 0.5073,\n r: 0.4072,\n s: 0.4658,\n t: 0.3472,\n u: 0.4941,\n v: 0.4658,\n w: 0.6118,\n x: 0.4644,\n y: 0.4644,\n z: 0.4639,\n \"{\": 0.3145,\n \"|\": 0.2207,\n \"}\": 0.3145,\n \"~\": 0.4658,\n \" \": 0.4346,\n \"¡\": 0.2197,\n \"¢\": 0.4785,\n \"£\": 0.5649,\n \"¤\": 0.5313,\n \"§\": 0.5205,\n \"©\": 0.668,\n \"«\": 0.5391,\n \"®\": 0.668,\n \"°\": 0.3906,\n \"±\": 0.4648,\n \"²\": 0.3213,\n \"³\": 0.3281,\n \"´\": 0.3154,\n µ: 0.5488,\n \"¶\": 0.5942,\n \"·\": 0.2207,\n \"¹\": 0.293,\n \"»\": 0.5391,\n \"¼\": 0.6416,\n \"½\": 0.6172,\n \"¾\": 0.6572,\n \"¿\": 0.4644,\n À: 0.6143,\n Á: 0.6143,\n Â: 0.6143,\n Ã: 0.6143,\n Ä: 0.6143,\n Å: 0.6143,\n Æ: 0.7637,\n Ç: 0.4902,\n È: 0.4897,\n É: 0.4897,\n Ê: 0.4897,\n Ë: 0.4897,\n Ì: 0.2207,\n Í: 0.2207,\n Î: 0.2207,\n Ï: 0.2207,\n Ð: 0.6274,\n Ñ: 0.5869,\n Ò: 0.5874,\n Ó: 0.5874,\n Ô: 0.5874,\n Õ: 0.5874,\n Ö: 0.5874,\n \"×\": 0.4673,\n Ø: 0.5913,\n Ù: 0.5889,\n Ú: 0.5889,\n Û: 0.5889,\n Ü: 0.5889,\n Ý: 0.6143,\n Þ: 0.5029,\n ß: 0.5879,\n à: 0.4814,\n á: 0.4814,\n â: 0.4814,\n ã: 0.4814,\n ä: 0.4814,\n å: 0.4814,\n æ: 0.6387,\n ç: 0.4048,\n è: 0.4956,\n é: 0.4956,\n ê: 0.4956,\n ë: 0.4956,\n ì: 0.2183,\n í: 0.2183,\n î: 0.2183,\n ï: 0.2183,\n ð: 0.4946,\n ñ: 0.4937,\n ò: 0.4927,\n ó: 0.4927,\n ô: 0.4927,\n õ: 0.4927,\n ö: 0.4927,\n \"÷\": 0.4663,\n ø: 0.5454,\n ù: 0.4941,\n ú: 0.4941,\n û: 0.4941,\n ü: 0.4941,\n ý: 0.4644,\n þ: 0.5029,\n ÿ: 0.4644,\n Ѐ: 0.5,\n Ё: 0.5,\n Ђ: 0.6689,\n Ѓ: 0.5093,\n Є: 0.4902,\n Ѕ: 0.5396,\n І: 0.2207,\n Ї: 0.2969,\n Ј: 0.4136,\n Љ: 0.96,\n Њ: 0.9414,\n Ћ: 0.6689,\n Ќ: 0.5234,\n Ѝ: 0.5967,\n Ў: 0.4155,\n Џ: 0.6416,\n А: 0.6143,\n Б: 0.5591,\n В: 0.5713,\n Г: 0.5093,\n Д: 0.6157,\n Е: 0.5,\n Ж: 0.793,\n З: 0.4805,\n И: 0.5967,\n Й: 0.5967,\n К: 0.5234,\n Л: 0.6226,\n М: 0.6719,\n Н: 0.6045,\n О: 0.5337,\n П: 0.6045,\n Р: 0.5615,\n С: 0.458,\n Т: 0.4839,\n У: 0.4155,\n Ф: 0.6733,\n Х: 0.5293,\n Ц: 0.6416,\n Ч: 0.5015,\n Ш: 0.7891,\n Щ: 0.8145,\n Ъ: 0.7197,\n Ы: 0.7544,\n Ь: 0.5029,\n Э: 0.4492,\n Ю: 0.769,\n Я: 0.5386,\n а: 0.4814,\n б: 0.4487,\n в: 0.4775,\n г: 0.4463,\n д: 0.5425,\n е: 0.4468,\n ж: 0.5664,\n з: 0.4063,\n и: 0.6138,\n й: 0.6138,\n к: 0.4683,\n л: 0.52,\n м: 0.6025,\n н: 0.5273,\n о: 0.436,\n п: 0.5283,\n р: 0.4766,\n с: 0.3403,\n т: 0.4771,\n у: 0.3906,\n ф: 0.6021,\n х: 0.3804,\n ц: 0.54,\n ч: 0.4697,\n ш: 0.5913,\n щ: 0.6313,\n ъ: 0.4883,\n ы: 0.6509,\n ь: 0.4814,\n э: 0.4302,\n ю: 0.6201,\n я: 0.4497,\n ѐ: 0.4468,\n ё: 0.4468,\n ђ: 0.5259,\n ѓ: 0.4463,\n є: 0.4048,\n ѕ: 0.4658,\n і: 0.2183,\n ї: 0.2969,\n ј: 0.2178,\n љ: 0.7783,\n њ: 0.7622,\n ћ: 0.5259,\n ќ: 0.4683,\n ѝ: 0.6138,\n ў: 0.3906,\n џ: 0.54,\n \"–\": 0.5,\n \"—\": 0.6421,\n \"’\": 0.2329,\n \"‰\": 1.1665,\n \"•\": 0.3477,\n \"€\": 0.8516,\n \"™\": 0.8394,\n \"⌀\": 0.668,\n \"№\": 0.9233,\n },\n },\n \"osifont-italic\": {\n capHeight: 0.7397,\n defaultAdvance: 0.425,\n advances: {\n \"0\": 0.4326,\n \"1\": 0.3154,\n \"2\": 0.4316,\n \"3\": 0.4443,\n \"4\": 0.4756,\n \"5\": 0.4595,\n \"6\": 0.457,\n \"7\": 0.4419,\n \"8\": 0.4766,\n \"9\": 0.4648,\n \" \": 0.395,\n \"!\": 0.2012,\n '\"': 0.3613,\n \"#\": 0.5684,\n $: 0.4312,\n \"%\": 0.708,\n \"&\": 0.5688,\n \"'\": 0.187,\n \"(\": 0.2344,\n \")\": 0.2344,\n \"*\": 0.4292,\n \"+\": 0.4302,\n \",\": 0.2139,\n \"-\": 0.4302,\n \".\": 0.1841,\n \"/\": 0.4541,\n \":\": 0.2036,\n \";\": 0.2339,\n \"<\": 0.4302,\n \"=\": 0.4292,\n \">\": 0.4302,\n \"?\": 0.4297,\n \"@\": 0.7505,\n A: 0.5688,\n B: 0.5381,\n C: 0.4531,\n D: 0.5439,\n E: 0.4526,\n F: 0.4526,\n G: 0.5361,\n H: 0.5464,\n I: 0.2021,\n J: 0.3818,\n K: 0.522,\n L: 0.4546,\n M: 0.6162,\n N: 0.5425,\n O: 0.543,\n P: 0.5205,\n Q: 0.5532,\n R: 0.522,\n S: 0.4995,\n T: 0.4976,\n U: 0.5444,\n V: 0.5693,\n W: 0.7056,\n X: 0.5708,\n Y: 0.5688,\n Z: 0.5,\n \"[\": 0.2441,\n \"\\\\\": 0.4272,\n \"]\": 0.2441,\n \"^\": 0.3604,\n _: 0.4302,\n \"`\": 0.291,\n a: 0.4224,\n b: 0.4414,\n c: 0.354,\n d: 0.4424,\n e: 0.4351,\n f: 0.3853,\n g: 0.4419,\n h: 0.4424,\n i: 0.1963,\n j: 0.188,\n k: 0.4292,\n l: 0.2378,\n m: 0.563,\n n: 0.4331,\n o: 0.4321,\n p: 0.4458,\n q: 0.4458,\n r: 0.3584,\n s: 0.4082,\n t: 0.3018,\n u: 0.4336,\n v: 0.4058,\n w: 0.5303,\n x: 0.4146,\n y: 0.4146,\n z: 0.4141,\n \"{\": 0.29,\n \"|\": 0.2021,\n \"}\": 0.29,\n \"~\": 0.4312,\n \" \": 0.395,\n \"¡\": 0.2012,\n \"¢\": 0.4424,\n \"£\": 0.5244,\n \"¤\": 0.4922,\n \"§\": 0.4819,\n \"©\": 0.6191,\n \"«\": 0.499,\n \"®\": 0.6191,\n \"°\": 0.3613,\n \"±\": 0.4302,\n \"²\": 0.2964,\n \"³\": 0.3027,\n \"´\": 0.3154,\n µ: 0.4795,\n \"¶\": 0.5503,\n \"·\": 0.2021,\n \"¹\": 0.27,\n \"»\": 0.499,\n \"¼\": 0.5952,\n \"½\": 0.5718,\n \"¾\": 0.6094,\n \"¿\": 0.4297,\n À: 0.5688,\n Á: 0.5688,\n Â: 0.5688,\n Ã: 0.5688,\n Ä: 0.5688,\n Å: 0.5688,\n Æ: 0.708,\n Ç: 0.4531,\n È: 0.4526,\n É: 0.4526,\n Ê: 0.4526,\n Ë: 0.4526,\n Ì: 0.2021,\n Í: 0.2021,\n Î: 0.2021,\n Ï: 0.2021,\n Ð: 0.582,\n Ñ: 0.5425,\n Ò: 0.543,\n Ó: 0.543,\n Ô: 0.543,\n Õ: 0.543,\n Ö: 0.543,\n \"×\": 0.4326,\n Ø: 0.5498,\n Ù: 0.5444,\n Ú: 0.5444,\n Û: 0.5444,\n Ü: 0.5444,\n Ý: 0.5688,\n Þ: 0.4648,\n ß: 0.5151,\n à: 0.4224,\n á: 0.4224,\n â: 0.4224,\n ã: 0.4224,\n ä: 0.4224,\n å: 0.4224,\n æ: 0.5601,\n ç: 0.354,\n è: 0.4351,\n é: 0.4351,\n ê: 0.4351,\n ë: 0.4351,\n ì: 0.1963,\n í: 0.1963,\n î: 0.1963,\n ï: 0.1963,\n ð: 0.4341,\n ñ: 0.4331,\n ò: 0.4321,\n ó: 0.4321,\n ô: 0.4321,\n õ: 0.4321,\n ö: 0.4321,\n \"÷\": 0.4316,\n ø: 0.4727,\n ù: 0.4336,\n ú: 0.4336,\n û: 0.4336,\n ü: 0.4336,\n ý: 0.4146,\n þ: 0.4414,\n ÿ: 0.4146,\n Ѐ: 0.4619,\n Ё: 0.4619,\n Ђ: 0.6206,\n Ѓ: 0.4712,\n Є: 0.4531,\n Ѕ: 0.4995,\n І: 0.2021,\n Ї: 0.2759,\n Ј: 0.3818,\n Љ: 0.8916,\n Њ: 0.8726,\n Ћ: 0.6206,\n Ќ: 0.4849,\n Ѝ: 0.5513,\n Ў: 0.3853,\n Џ: 0.5928,\n А: 0.5688,\n Б: 0.5176,\n В: 0.5283,\n Г: 0.4712,\n Д: 0.5718,\n Е: 0.4619,\n Ж: 0.7373,\n З: 0.4443,\n И: 0.5513,\n Й: 0.5513,\n К: 0.4849,\n Л: 0.5771,\n М: 0.6216,\n Н: 0.5586,\n О: 0.5337,\n П: 0.5586,\n Р: 0.5195,\n С: 0.4238,\n Т: 0.4487,\n У: 0.3853,\n Ф: 0.6245,\n Х: 0.4917,\n Ц: 0.5942,\n Ч: 0.4634,\n Ш: 0.7305,\n Щ: 0.7549,\n Ъ: 0.6685,\n Ы: 0.6982,\n Ь: 0.4648,\n Э: 0.416,\n Ю: 0.7124,\n Я: 0.499,\n а: 0.4224,\n б: 0.3931,\n в: 0.4185,\n г: 0.3882,\n д: 0.4751,\n е: 0.3911,\n ж: 0.4912,\n з: 0.355,\n и: 0.5366,\n й: 0.5415,\n к: 0.4077,\n л: 0.4536,\n м: 0.5269,\n н: 0.4624,\n о: 0.3813,\n п: 0.4634,\n р: 0.418,\n с: 0.2954,\n т: 0.4121,\n у: 0.3472,\n ф: 0.5254,\n х: 0.3379,\n ц: 0.4741,\n ч: 0.4121,\n ш: 0.521,\n щ: 0.5547,\n ъ: 0.4233,\n ы: 0.5708,\n ь: 0.4414,\n э: 0.373,\n ю: 0.5425,\n я: 0.3936,\n ѐ: 0.3911,\n ё: 0.3931,\n ђ: 0.457,\n ѓ: 0.3882,\n є: 0.354,\n ѕ: 0.4082,\n і: 0.1963,\n ї: 0.2607,\n ј: 0.188,\n љ: 0.6753,\n њ: 0.6636,\n ћ: 0.457,\n ќ: 0.4077,\n ѝ: 0.5366,\n ў: 0.3472,\n џ: 0.4785,\n \"–\": 0.4629,\n \"—\": 0.5947,\n \"’\": 0.2139,\n \"‰\": 1.082,\n \"•\": 0.3203,\n \"€\": 0.7905,\n \"™\": 0.7778,\n \"⌀\": 0.6191,\n \"№\": 0.856,\n },\n },\n \"jetbrains-mono\": {\n capHeight: 0.73,\n defaultAdvance: 0.6,\n advances: {\n \"0\": 0.6,\n \"1\": 0.6,\n \"2\": 0.6,\n \"3\": 0.6,\n \"4\": 0.6,\n \"5\": 0.6,\n \"6\": 0.6,\n \"7\": 0.6,\n \"8\": 0.6,\n \"9\": 0.6,\n \" \": 0.6,\n \"!\": 0.6,\n '\"': 0.6,\n \"#\": 0.6,\n $: 0.6,\n \"%\": 0.6,\n \"&\": 0.6,\n \"'\": 0.6,\n \"(\": 0.6,\n \")\": 0.6,\n \"*\": 0.6,\n \"+\": 0.6,\n \",\": 0.6,\n \"-\": 0.6,\n \".\": 0.6,\n \"/\": 0.6,\n \":\": 0.6,\n \";\": 0.6,\n \"<\": 0.6,\n \"=\": 0.6,\n \">\": 0.6,\n \"?\": 0.6,\n \"@\": 0.6,\n A: 0.6,\n B: 0.6,\n C: 0.6,\n D: 0.6,\n E: 0.6,\n F: 0.6,\n G: 0.6,\n H: 0.6,\n I: 0.6,\n J: 0.6,\n K: 0.6,\n L: 0.6,\n M: 0.6,\n N: 0.6,\n O: 0.6,\n P: 0.6,\n Q: 0.6,\n R: 0.6,\n S: 0.6,\n T: 0.6,\n U: 0.6,\n V: 0.6,\n W: 0.6,\n X: 0.6,\n Y: 0.6,\n Z: 0.6,\n \"[\": 0.6,\n \"\\\\\": 0.6,\n \"]\": 0.6,\n \"^\": 0.6,\n _: 0.6,\n \"`\": 0.6,\n a: 0.6,\n b: 0.6,\n c: 0.6,\n d: 0.6,\n e: 0.6,\n f: 0.6,\n g: 0.6,\n h: 0.6,\n i: 0.6,\n j: 0.6,\n k: 0.6,\n l: 0.6,\n m: 0.6,\n n: 0.6,\n o: 0.6,\n p: 0.6,\n q: 0.6,\n r: 0.6,\n s: 0.6,\n t: 0.6,\n u: 0.6,\n v: 0.6,\n w: 0.6,\n x: 0.6,\n y: 0.6,\n z: 0.6,\n \"{\": 0.6,\n \"|\": 0.6,\n \"}\": 0.6,\n \"~\": 0.6,\n \" \": 0.6,\n \"¡\": 0.6,\n \"¢\": 0.6,\n \"£\": 0.6,\n \"¤\": 0.6,\n \"¥\": 0.6,\n \"¦\": 0.6,\n \"§\": 0.6,\n \"¨\": 0.6,\n \"©\": 0.6,\n ª: 0.6,\n \"«\": 0.6,\n \"¬\": 0.6,\n \"®\": 0.6,\n \"¯\": 0.6,\n \"°\": 0.6,\n \"±\": 0.6,\n \"²\": 0.6,\n \"³\": 0.6,\n \"´\": 0.6,\n µ: 0.6,\n \"¶\": 0.6,\n \"·\": 0.6,\n \"¸\": 0.6,\n \"¹\": 0.6,\n º: 0.6,\n \"»\": 0.6,\n \"¼\": 0.6,\n \"½\": 0.6,\n \"¾\": 0.6,\n \"¿\": 0.6,\n À: 0.6,\n Á: 0.6,\n Â: 0.6,\n Ã: 0.6,\n Ä: 0.6,\n Å: 0.6,\n Æ: 0.6,\n Ç: 0.6,\n È: 0.6,\n É: 0.6,\n Ê: 0.6,\n Ë: 0.6,\n Ì: 0.6,\n Í: 0.6,\n Î: 0.6,\n Ï: 0.6,\n Ð: 0.6,\n Ñ: 0.6,\n Ò: 0.6,\n Ó: 0.6,\n Ô: 0.6,\n Õ: 0.6,\n Ö: 0.6,\n \"×\": 0.6,\n Ø: 0.6,\n Ù: 0.6,\n Ú: 0.6,\n Û: 0.6,\n Ü: 0.6,\n Ý: 0.6,\n Þ: 0.6,\n ß: 0.6,\n à: 0.6,\n á: 0.6,\n â: 0.6,\n ã: 0.6,\n ä: 0.6,\n å: 0.6,\n æ: 0.6,\n ç: 0.6,\n è: 0.6,\n é: 0.6,\n ê: 0.6,\n ë: 0.6,\n ì: 0.6,\n í: 0.6,\n î: 0.6,\n ï: 0.6,\n ð: 0.6,\n ñ: 0.6,\n ò: 0.6,\n ó: 0.6,\n ô: 0.6,\n õ: 0.6,\n ö: 0.6,\n \"÷\": 0.6,\n ø: 0.6,\n ù: 0.6,\n ú: 0.6,\n û: 0.6,\n ü: 0.6,\n ý: 0.6,\n þ: 0.6,\n ÿ: 0.6,\n Ё: 0.6,\n Ђ: 0.6,\n Ѓ: 0.6,\n Є: 0.6,\n Ѕ: 0.6,\n І: 0.6,\n Ї: 0.6,\n Ј: 0.6,\n Љ: 0.6,\n Њ: 0.6,\n Ћ: 0.6,\n Ќ: 0.6,\n Ў: 0.6,\n Џ: 0.6,\n А: 0.6,\n Б: 0.6,\n В: 0.6,\n Г: 0.6,\n Д: 0.6,\n Е: 0.6,\n Ж: 0.6,\n З: 0.6,\n И: 0.6,\n Й: 0.6,\n К: 0.6,\n Л: 0.6,\n М: 0.6,\n Н: 0.6,\n О: 0.6,\n П: 0.6,\n Р: 0.6,\n С: 0.6,\n Т: 0.6,\n У: 0.6,\n Ф: 0.6,\n Х: 0.6,\n Ц: 0.6,\n Ч: 0.6,\n Ш: 0.6,\n Щ: 0.6,\n Ъ: 0.6,\n Ы: 0.6,\n Ь: 0.6,\n Э: 0.6,\n Ю: 0.6,\n Я: 0.6,\n а: 0.6,\n б: 0.6,\n в: 0.6,\n г: 0.6,\n д: 0.6,\n е: 0.6,\n ж: 0.6,\n з: 0.6,\n и: 0.6,\n й: 0.6,\n к: 0.6,\n л: 0.6,\n м: 0.6,\n н: 0.6,\n о: 0.6,\n п: 0.6,\n р: 0.6,\n с: 0.6,\n т: 0.6,\n у: 0.6,\n ф: 0.6,\n х: 0.6,\n ц: 0.6,\n ч: 0.6,\n ш: 0.6,\n щ: 0.6,\n ъ: 0.6,\n ы: 0.6,\n ь: 0.6,\n э: 0.6,\n ю: 0.6,\n я: 0.6,\n ё: 0.6,\n ђ: 0.6,\n ѓ: 0.6,\n є: 0.6,\n ѕ: 0.6,\n і: 0.6,\n ї: 0.6,\n ј: 0.6,\n љ: 0.6,\n њ: 0.6,\n ћ: 0.6,\n ќ: 0.6,\n ў: 0.6,\n џ: 0.6,\n \"‐\": 0.6,\n \"–\": 0.6,\n \"—\": 0.6,\n \"‘\": 0.6,\n \"’\": 0.6,\n \"‚\": 0.6,\n \"“\": 0.6,\n \"”\": 0.6,\n \"„\": 0.6,\n \"…\": 0.6,\n \"‰\": 0.6,\n \"•\": 0.6,\n \"€\": 0.6,\n \"™\": 0.6,\n \"№\": 0.6,\n },\n },\n \"source-serif\": {\n capHeight: 0.67,\n defaultAdvance: 0.5169,\n advances: {\n \"0\": 0.5,\n \"1\": 0.5,\n \"2\": 0.5,\n \"3\": 0.5,\n \"4\": 0.5,\n \"5\": 0.5,\n \"6\": 0.5,\n \"7\": 0.5,\n \"8\": 0.5,\n \"9\": 0.5,\n \" \": 0.233,\n \"!\": 0.289,\n '\"': 0.356,\n \"#\": 0.526,\n $: 0.5,\n \"%\": 0.88,\n \"&\": 0.72,\n \"'\": 0.183,\n \"(\": 0.339,\n \")\": 0.339,\n \"*\": 0.439,\n \"+\": 0.53,\n \",\": 0.3,\n \"-\": 0.312,\n \".\": 0.3,\n \"/\": 0.33,\n \":\": 0.3,\n \";\": 0.3,\n \"<\": 0.53,\n \"=\": 0.53,\n \">\": 0.53,\n \"?\": 0.416,\n \"@\": 0.835,\n A: 0.664,\n B: 0.629,\n C: 0.631,\n D: 0.71,\n E: 0.603,\n F: 0.579,\n G: 0.682,\n H: 0.788,\n I: 0.371,\n J: 0.374,\n K: 0.667,\n L: 0.596,\n M: 0.902,\n N: 0.735,\n O: 0.707,\n P: 0.589,\n Q: 0.707,\n R: 0.651,\n S: 0.512,\n T: 0.604,\n U: 0.727,\n V: 0.674,\n W: 0.962,\n X: 0.648,\n Y: 0.633,\n Z: 0.551,\n \"[\": 0.32,\n \"\\\\\": 0.33,\n \"]\": 0.32,\n \"^\": 0.531,\n _: 0.512,\n \"`\": 0.4,\n a: 0.509,\n b: 0.577,\n c: 0.488,\n d: 0.567,\n e: 0.51,\n f: 0.354,\n g: 0.518,\n h: 0.601,\n i: 0.298,\n j: 0.277,\n k: 0.547,\n l: 0.298,\n m: 0.901,\n n: 0.606,\n o: 0.549,\n p: 0.583,\n q: 0.557,\n r: 0.423,\n s: 0.434,\n t: 0.325,\n u: 0.583,\n v: 0.505,\n w: 0.764,\n x: 0.526,\n y: 0.512,\n z: 0.456,\n \"{\": 0.344,\n \"|\": 0.291,\n \"}\": 0.344,\n \"~\": 0.53,\n \" \": 0.233,\n \"¡\": 0.289,\n \"¢\": 0.5,\n \"£\": 0.5,\n \"¤\": 0.502,\n \"¥\": 0.5,\n \"¦\": 0.291,\n \"§\": 0.491,\n \"¨\": 0.4,\n \"©\": 0.755,\n ª: 0.351,\n \"«\": 0.487,\n \"¬\": 0.53,\n \"\": 0.312,\n \"®\": 0.459,\n \"¯\": 0.4,\n \"°\": 0.328,\n \"±\": 0.53,\n \"²\": 0.37,\n \"³\": 0.37,\n \"´\": 0.4,\n µ: 0.569,\n \"¶\": 0.598,\n \"·\": 0.3,\n \"¸\": 0.4,\n \"¹\": 0.37,\n º: 0.377,\n \"»\": 0.487,\n \"¼\": 0.85,\n \"½\": 0.88,\n \"¾\": 0.85,\n \"¿\": 0.416,\n À: 0.664,\n Á: 0.664,\n Â: 0.664,\n Ã: 0.664,\n Ä: 0.664,\n Å: 0.664,\n Æ: 0.92,\n Ç: 0.631,\n È: 0.603,\n É: 0.603,\n Ê: 0.603,\n Ë: 0.603,\n Ì: 0.371,\n Í: 0.371,\n Î: 0.371,\n Ï: 0.371,\n Ð: 0.71,\n Ñ: 0.735,\n Ò: 0.707,\n Ó: 0.707,\n Ô: 0.707,\n Õ: 0.707,\n Ö: 0.707,\n \"×\": 0.53,\n Ø: 0.707,\n Ù: 0.727,\n Ú: 0.727,\n Û: 0.727,\n Ü: 0.727,\n Ý: 0.633,\n Þ: 0.611,\n ß: 0.592,\n à: 0.509,\n á: 0.509,\n â: 0.509,\n ã: 0.509,\n ä: 0.509,\n å: 0.509,\n æ: 0.786,\n ç: 0.488,\n è: 0.51,\n é: 0.51,\n ê: 0.51,\n ë: 0.51,\n ì: 0.298,\n í: 0.298,\n î: 0.298,\n ï: 0.298,\n ð: 0.546,\n ñ: 0.606,\n ò: 0.549,\n ó: 0.549,\n ô: 0.549,\n õ: 0.549,\n ö: 0.549,\n \"÷\": 0.53,\n ø: 0.549,\n ù: 0.583,\n ú: 0.583,\n û: 0.583,\n ü: 0.583,\n ý: 0.512,\n þ: 0.554,\n ÿ: 0.512,\n Ѐ: 0.603,\n Ё: 0.603,\n Ђ: 0.701,\n Ѓ: 0.56,\n Є: 0.615,\n Ѕ: 0.512,\n І: 0.371,\n Ї: 0.371,\n Ј: 0.374,\n Љ: 0.894,\n Њ: 1.002,\n Ћ: 0.755,\n Ќ: 0.653,\n Ѝ: 0.797,\n Ў: 0.67,\n Џ: 0.769,\n А: 0.664,\n Б: 0.618,\n В: 0.629,\n Г: 0.56,\n Д: 0.691,\n Е: 0.603,\n Ж: 0.918,\n З: 0.55,\n И: 0.797,\n Й: 0.797,\n К: 0.653,\n Л: 0.693,\n М: 0.902,\n Н: 0.788,\n О: 0.707,\n П: 0.775,\n Р: 0.589,\n С: 0.631,\n Т: 0.604,\n У: 0.67,\n Ф: 0.721,\n Х: 0.648,\n Ц: 0.769,\n Ч: 0.701,\n Ш: 1.043,\n Щ: 1.044,\n Ъ: 0.697,\n Ы: 0.914,\n Ь: 0.609,\n Э: 0.612,\n Ю: 0.995,\n Я: 0.642,\n а: 0.509,\n б: 0.543,\n в: 0.517,\n г: 0.447,\n д: 0.567,\n е: 0.51,\n ж: 0.758,\n з: 0.43,\n и: 0.645,\n й: 0.645,\n к: 0.553,\n л: 0.577,\n м: 0.742,\n н: 0.633,\n о: 0.549,\n п: 0.626,\n р: 0.583,\n с: 0.488,\n т: 0.528,\n у: 0.512,\n ф: 0.735,\n х: 0.526,\n ц: 0.622,\n ч: 0.554,\n ш: 0.856,\n щ: 0.858,\n ъ: 0.615,\n ы: 0.75,\n ь: 0.505,\n э: 0.48,\n ю: 0.8,\n я: 0.532,\n ѐ: 0.51,\n ё: 0.51,\n ђ: 0.535,\n ѓ: 0.447,\n є: 0.488,\n ѕ: 0.434,\n і: 0.298,\n ї: 0.298,\n ј: 0.277,\n љ: 0.754,\n њ: 0.818,\n ћ: 0.601,\n ќ: 0.553,\n ѝ: 0.645,\n ў: 0.512,\n џ: 0.634,\n \"‐\": 0.312,\n \"–\": 0.512,\n \"—\": 0.812,\n \"‘\": 0.212,\n \"’\": 0.212,\n \"‚\": 0.212,\n \"“\": 0.415,\n \"”\": 0.415,\n \"„\": 0.415,\n \"…\": 0.82,\n \"‰\": 1.25,\n \"•\": 0.305,\n \"€\": 0.5,\n \"™\": 0.722,\n \"№\": 1.009,\n },\n },\n \"roboto-condensed\": {\n capHeight: 0.7109,\n defaultAdvance: 0.453,\n advances: {\n \"0\": 0.4937,\n \"1\": 0.4937,\n \"2\": 0.4937,\n \"3\": 0.4937,\n \"4\": 0.4937,\n \"5\": 0.4937,\n \"6\": 0.4937,\n \"7\": 0.4937,\n \"8\": 0.4937,\n \"9\": 0.4937,\n \" \": 0.2295,\n \"!\": 0.2461,\n '\"': 0.3203,\n \"#\": 0.5479,\n $: 0.4937,\n \"%\": 0.6328,\n \"&\": 0.5439,\n \"'\": 0.1748,\n \"(\": 0.314,\n \")\": 0.3188,\n \"*\": 0.4307,\n \"+\": 0.4971,\n \",\": 0.1968,\n \"-\": 0.248,\n \".\": 0.2637,\n \"/\": 0.3711,\n \":\": 0.2334,\n \";\": 0.2026,\n \"<\": 0.4458,\n \"=\": 0.479,\n \">\": 0.4604,\n \"?\": 0.4224,\n \"@\": 0.769,\n A: 0.5767,\n B: 0.5459,\n C: 0.5669,\n D: 0.5708,\n E: 0.4971,\n F: 0.481,\n G: 0.5908,\n H: 0.6201,\n I: 0.25,\n J: 0.4834,\n K: 0.5454,\n L: 0.4756,\n M: 0.7554,\n N: 0.6196,\n O: 0.6011,\n P: 0.5542,\n Q: 0.6011,\n R: 0.5308,\n S: 0.5186,\n T: 0.5205,\n U: 0.5615,\n V: 0.5605,\n W: 0.7617,\n X: 0.5513,\n Y: 0.5249,\n Z: 0.5229,\n \"[\": 0.2505,\n \"\\\\\": 0.3696,\n \"]\": 0.2505,\n \"^\": 0.3711,\n _: 0.4048,\n \"`\": 0.3091,\n a: 0.479,\n b: 0.4932,\n c: 0.4619,\n d: 0.4961,\n e: 0.4688,\n f: 0.3164,\n g: 0.4932,\n h: 0.4829,\n i: 0.2295,\n j: 0.2241,\n k: 0.4507,\n l: 0.2295,\n m: 0.7529,\n n: 0.4844,\n o: 0.502,\n p: 0.4932,\n q: 0.5005,\n r: 0.3047,\n s: 0.4561,\n t: 0.2959,\n u: 0.4834,\n v: 0.4277,\n w: 0.6499,\n x: 0.439,\n y: 0.4165,\n z: 0.439,\n \"{\": 0.3066,\n \"|\": 0.2441,\n \"}\": 0.3066,\n \"~\": 0.5894,\n \" \": 0.2295,\n \"¡\": 0.2319,\n \"¢\": 0.48,\n \"£\": 0.5112,\n \"¤\": 0.7134,\n \"¥\": 0.4639,\n \"¦\": 0.2402,\n \"§\": 0.5376,\n \"¨\": 0.4185,\n \"©\": 0.7856,\n ª: 0.3965,\n \"«\": 0.418,\n \"¬\": 0.4873,\n \"\": 0.248,\n \"®\": 0.7861,\n \"¯\": 0.4146,\n \"°\": 0.3735,\n \"±\": 0.4702,\n \"²\": 0.3296,\n \"³\": 0.3296,\n \"´\": 0.3135,\n µ: 0.4985,\n \"¶\": 0.4346,\n \"·\": 0.2437,\n \"¸\": 0.2295,\n \"¹\": 0.3296,\n º: 0.4033,\n \"»\": 0.418,\n \"¼\": 0.6377,\n \"½\": 0.6777,\n \"¾\": 0.6733,\n \"¿\": 0.4219,\n À: 0.5767,\n Á: 0.5767,\n Â: 0.5767,\n Ã: 0.5767,\n Ä: 0.5767,\n Å: 0.5767,\n Æ: 0.8125,\n Ç: 0.5669,\n È: 0.4971,\n É: 0.4971,\n Ê: 0.4971,\n Ë: 0.4971,\n Ì: 0.25,\n Í: 0.25,\n Î: 0.25,\n Ï: 0.25,\n Ð: 0.5854,\n Ñ: 0.6196,\n Ò: 0.6011,\n Ó: 0.6011,\n Ô: 0.6011,\n Õ: 0.6011,\n Ö: 0.6011,\n \"×\": 0.4707,\n Ø: 0.6011,\n Ù: 0.5615,\n Ú: 0.5615,\n Û: 0.5615,\n Ü: 0.5615,\n Ý: 0.5249,\n Þ: 0.5151,\n ß: 0.522,\n à: 0.479,\n á: 0.479,\n â: 0.479,\n ã: 0.479,\n ä: 0.479,\n å: 0.479,\n æ: 0.7285,\n ç: 0.4619,\n è: 0.4688,\n é: 0.4688,\n ê: 0.4688,\n ë: 0.4688,\n ì: 0.2354,\n í: 0.2354,\n î: 0.2354,\n ï: 0.2354,\n ð: 0.5137,\n ñ: 0.4844,\n ò: 0.502,\n ó: 0.502,\n ô: 0.502,\n õ: 0.502,\n ö: 0.502,\n \"÷\": 0.5,\n ø: 0.4985,\n ù: 0.4834,\n ú: 0.4834,\n û: 0.4834,\n ü: 0.4834,\n ý: 0.4165,\n þ: 0.5083,\n ÿ: 0.4165,\n Ѐ: 0.4971,\n Ё: 0.4971,\n Ђ: 0.6509,\n Ѓ: 0.4883,\n Є: 0.5903,\n Ѕ: 0.5186,\n І: 0.25,\n Ї: 0.25,\n Ј: 0.4834,\n Љ: 0.9243,\n Њ: 0.9272,\n Ћ: 0.7061,\n Ќ: 0.5454,\n Ѝ: 0.6196,\n Ў: 0.5479,\n Џ: 0.6211,\n А: 0.5767,\n Б: 0.5498,\n В: 0.5459,\n Г: 0.4883,\n Д: 0.6602,\n Е: 0.4971,\n Ж: 0.791,\n З: 0.5176,\n И: 0.6196,\n Й: 0.6196,\n К: 0.5605,\n Л: 0.6157,\n М: 0.7554,\n Н: 0.6201,\n О: 0.6011,\n П: 0.6206,\n Р: 0.5542,\n С: 0.5669,\n Т: 0.5205,\n У: 0.5479,\n Ф: 0.6772,\n Х: 0.5513,\n Ц: 0.6396,\n Ч: 0.6006,\n Ш: 0.8149,\n Щ: 0.8418,\n Ъ: 0.6519,\n Ы: 0.7559,\n Ь: 0.5513,\n Э: 0.5903,\n Ю: 0.7656,\n Я: 0.5625,\n а: 0.479,\n б: 0.4849,\n в: 0.5034,\n г: 0.3716,\n д: 0.5361,\n е: 0.4688,\n ж: 0.6626,\n з: 0.4468,\n и: 0.5093,\n й: 0.5093,\n к: 0.4805,\n л: 0.5103,\n м: 0.646,\n н: 0.5088,\n о: 0.502,\n п: 0.5093,\n р: 0.4932,\n с: 0.4619,\n т: 0.4253,\n у: 0.4165,\n ф: 0.6289,\n х: 0.439,\n ц: 0.5244,\n ч: 0.48,\n ш: 0.7041,\n щ: 0.7227,\n ъ: 0.5381,\n ы: 0.6802,\n ь: 0.4785,\n э: 0.4722,\n ю: 0.7061,\n я: 0.4824,\n ѐ: 0.4688,\n ё: 0.4688,\n ђ: 0.4829,\n ѓ: 0.3716,\n є: 0.4722,\n ѕ: 0.4561,\n і: 0.2295,\n ї: 0.2354,\n ј: 0.2241,\n љ: 0.73,\n њ: 0.7432,\n ћ: 0.4985,\n ќ: 0.4805,\n ѝ: 0.5093,\n ў: 0.4165,\n џ: 0.5093,\n \"‐\": 0.2485,\n \"–\": 0.5723,\n \"—\": 0.6782,\n \"‘\": 0.1948,\n \"’\": 0.1948,\n \"‚\": 0.1953,\n \"“\": 0.334,\n \"”\": 0.3374,\n \"„\": 0.3267,\n \"…\": 0.5903,\n \"‰\": 0.8188,\n \"•\": 0.3374,\n \"€\": 0.4937,\n \"™\": 0.5479,\n \"№\": 0.8862,\n },\n },\n \"noto-sans\": {\n capHeight: 0.714,\n defaultAdvance: 0.5336,\n advances: {\n \"0\": 0.572,\n \"1\": 0.572,\n \"2\": 0.572,\n \"3\": 0.572,\n \"4\": 0.572,\n \"5\": 0.572,\n \"6\": 0.572,\n \"7\": 0.572,\n \"8\": 0.572,\n \"9\": 0.572,\n \" \": 0.26,\n \"!\": 0.269,\n '\"': 0.408,\n \"#\": 0.646,\n $: 0.572,\n \"%\": 0.831,\n \"&\": 0.732,\n \"'\": 0.225,\n \"(\": 0.3,\n \")\": 0.3,\n \"*\": 0.551,\n \"+\": 0.572,\n \",\": 0.268,\n \"-\": 0.322,\n \".\": 0.268,\n \"/\": 0.372,\n \":\": 0.268,\n \";\": 0.268,\n \"<\": 0.572,\n \"=\": 0.572,\n \">\": 0.572,\n \"?\": 0.434,\n \"@\": 0.899,\n A: 0.639,\n B: 0.65,\n C: 0.632,\n D: 0.73,\n E: 0.556,\n F: 0.519,\n G: 0.728,\n H: 0.741,\n I: 0.339,\n J: 0.273,\n K: 0.619,\n L: 0.524,\n M: 0.907,\n N: 0.76,\n O: 0.781,\n P: 0.605,\n Q: 0.781,\n R: 0.622,\n S: 0.549,\n T: 0.556,\n U: 0.731,\n V: 0.6,\n W: 0.93,\n X: 0.586,\n Y: 0.566,\n Z: 0.572,\n \"[\": 0.329,\n \"\\\\\": 0.372,\n \"]\": 0.329,\n \"^\": 0.572,\n _: 0.444,\n \"`\": 0.281,\n a: 0.561,\n b: 0.615,\n c: 0.48,\n d: 0.615,\n e: 0.564,\n f: 0.344,\n g: 0.615,\n h: 0.618,\n i: 0.258,\n j: 0.258,\n k: 0.534,\n l: 0.258,\n m: 0.935,\n n: 0.618,\n o: 0.605,\n p: 0.615,\n q: 0.615,\n r: 0.413,\n s: 0.479,\n t: 0.361,\n u: 0.618,\n v: 0.508,\n w: 0.786,\n x: 0.529,\n y: 0.51,\n z: 0.47,\n \"{\": 0.38,\n \"|\": 0.551,\n \"}\": 0.38,\n \"~\": 0.572,\n \" \": 0.26,\n \"¡\": 0.269,\n \"¢\": 0.572,\n \"£\": 0.572,\n \"¤\": 0.572,\n \"¥\": 0.572,\n \"¦\": 0.551,\n \"§\": 0.513,\n \"¨\": 0.58,\n \"©\": 0.832,\n ª: 0.357,\n \"«\": 0.509,\n \"¬\": 0.572,\n \"\": 0.322,\n \"®\": 0.832,\n \"¯\": 0.5,\n \"°\": 0.428,\n \"±\": 0.572,\n \"²\": 0.35,\n \"³\": 0.35,\n \"´\": 0.281,\n µ: 0.623,\n \"¶\": 0.655,\n \"·\": 0.268,\n \"¸\": 0.225,\n \"¹\": 0.35,\n º: 0.376,\n \"»\": 0.509,\n \"¼\": 0.745,\n \"½\": 0.771,\n \"¾\": 0.781,\n \"¿\": 0.434,\n À: 0.639,\n Á: 0.639,\n Â: 0.639,\n Ã: 0.639,\n Ä: 0.639,\n Å: 0.639,\n Æ: 0.881,\n Ç: 0.632,\n È: 0.556,\n É: 0.556,\n Ê: 0.556,\n Ë: 0.556,\n Ì: 0.339,\n Í: 0.339,\n Î: 0.339,\n Ï: 0.339,\n Ð: 0.73,\n Ñ: 0.76,\n Ò: 0.781,\n Ó: 0.781,\n Ô: 0.781,\n Õ: 0.781,\n Ö: 0.781,\n \"×\": 0.572,\n Ø: 0.781,\n Ù: 0.731,\n Ú: 0.731,\n Û: 0.731,\n Ü: 0.731,\n Ý: 0.566,\n Þ: 0.605,\n ß: 0.631,\n à: 0.561,\n á: 0.561,\n â: 0.561,\n ã: 0.561,\n ä: 0.561,\n å: 0.561,\n æ: 0.864,\n ç: 0.48,\n è: 0.564,\n é: 0.564,\n ê: 0.564,\n ë: 0.564,\n ì: 0.258,\n í: 0.258,\n î: 0.258,\n ï: 0.258,\n ð: 0.605,\n ñ: 0.618,\n ò: 0.605,\n ó: 0.605,\n ô: 0.605,\n õ: 0.605,\n ö: 0.605,\n \"÷\": 0.572,\n ø: 0.605,\n ù: 0.618,\n ú: 0.618,\n û: 0.618,\n ü: 0.618,\n ý: 0.51,\n þ: 0.615,\n ÿ: 0.51,\n Ѐ: 0.556,\n Ё: 0.556,\n Ђ: 0.716,\n Ѓ: 0.509,\n Є: 0.639,\n Ѕ: 0.549,\n І: 0.284,\n Ї: 0.284,\n Ј: 0.273,\n Љ: 1.01,\n Њ: 1.027,\n Ћ: 0.715,\n Ќ: 0.625,\n Ѝ: 0.756,\n Ў: 0.616,\n Џ: 0.731,\n А: 0.638,\n Б: 0.614,\n В: 0.65,\n Г: 0.509,\n Д: 0.729,\n Е: 0.556,\n Ж: 0.905,\n З: 0.577,\n И: 0.756,\n Й: 0.756,\n К: 0.625,\n Л: 0.698,\n М: 0.907,\n Н: 0.743,\n О: 0.761,\n П: 0.733,\n Р: 0.605,\n С: 0.64,\n Т: 0.556,\n У: 0.616,\n Ф: 0.817,\n Х: 0.588,\n Ц: 0.74,\n Ч: 0.673,\n Ш: 1.035,\n Щ: 1.026,\n Ъ: 0.685,\n Ы: 0.849,\n Ь: 0.607,\n Э: 0.647,\n Ю: 0.999,\n Я: 0.638,\n а: 0.556,\n б: 0.597,\n в: 0.564,\n г: 0.438,\n д: 0.607,\n е: 0.551,\n ж: 0.759,\n з: 0.488,\n и: 0.621,\n й: 0.621,\n к: 0.531,\n л: 0.587,\n м: 0.768,\n н: 0.614,\n о: 0.594,\n п: 0.606,\n р: 0.608,\n с: 0.493,\n т: 0.465,\n у: 0.509,\n ф: 0.737,\n х: 0.511,\n ц: 0.612,\n ч: 0.589,\n ш: 0.894,\n щ: 0.897,\n ъ: 0.623,\n ы: 0.759,\n ь: 0.545,\n э: 0.494,\n ю: 0.799,\n я: 0.577,\n ѐ: 0.551,\n ё: 0.551,\n ђ: 0.619,\n ѓ: 0.438,\n є: 0.493,\n ѕ: 0.468,\n і: 0.258,\n ї: 0.258,\n ј: 0.258,\n љ: 0.859,\n њ: 0.89,\n ћ: 0.621,\n ќ: 0.531,\n ѝ: 0.621,\n ў: 0.509,\n џ: 0.606,\n \"‐\": 0.322,\n \"–\": 0.5,\n \"—\": 1,\n \"‘\": 0.175,\n \"’\": 0.175,\n \"‚\": 0.25,\n \"“\": 0.359,\n \"”\": 0.359,\n \"„\": 0.416,\n \"…\": 0.791,\n \"‰\": 1.177,\n \"•\": 0.376,\n \"€\": 0.572,\n \"™\": 0.773,\n \"№\": 1.02,\n },\n },\n \"architects-daughter\": {\n capHeight: 0.6592,\n defaultAdvance: 0.5163,\n advances: {\n \"0\": 0.6309,\n \"1\": 0.1279,\n \"2\": 0.5723,\n \"3\": 0.5088,\n \"4\": 0.6807,\n \"5\": 0.708,\n \"6\": 0.627,\n \"7\": 0.6152,\n \"8\": 0.6484,\n \"9\": 0.5693,\n \" \": 0.4004,\n \"!\": 0.1348,\n '\"': 0.2363,\n \"#\": 0.6377,\n $: 0.5566,\n \"%\": 0.5186,\n \"&\": 0.6699,\n \"'\": 0.1621,\n \"(\": 0.2979,\n \")\": 0.3516,\n \"*\": 0.5078,\n \"+\": 0.5244,\n \",\": 0.1777,\n \"-\": 0.3105,\n \".\": 0.1406,\n \"/\": 0.4551,\n \":\": 0.167,\n \";\": 0.124,\n \"<\": 0.4756,\n \"=\": 0.4922,\n \">\": 0.4717,\n \"?\": 0.5059,\n \"@\": 1.043,\n A: 0.6406,\n B: 0.7109,\n C: 0.708,\n D: 0.6484,\n E: 0.5918,\n F: 0.6924,\n G: 0.6924,\n H: 0.6055,\n I: 0.1514,\n J: 0.5293,\n K: 0.6055,\n L: 0.6924,\n M: 0.8271,\n N: 0.627,\n O: 0.6699,\n P: 0.6377,\n Q: 0.7129,\n R: 0.7129,\n S: 0.6426,\n T: 0.623,\n U: 0.5615,\n V: 0.627,\n W: 0.9404,\n X: 0.5996,\n Y: 0.5342,\n Z: 0.7842,\n \"[\": 0.4248,\n \"\\\\\": 0.502,\n \"]\": 0.541,\n \"^\": 0.3066,\n _: 0.6865,\n \"`\": 0.1719,\n a: 0.5088,\n b: 0.5615,\n c: 0.6328,\n d: 0.5127,\n e: 0.541,\n f: 0.5938,\n g: 0.5156,\n h: 0.4951,\n i: 0.1514,\n j: 0.1777,\n k: 0.6143,\n l: 0.1572,\n m: 0.7783,\n n: 0.5,\n o: 0.5625,\n p: 0.5566,\n q: 0.5137,\n r: 0.5518,\n s: 0.502,\n t: 0.4043,\n u: 0.5078,\n v: 0.5186,\n w: 0.8086,\n x: 0.4707,\n y: 0.5488,\n z: 0.4951,\n \"{\": 0.3525,\n \"|\": 0.1455,\n \"}\": 0.4785,\n \"~\": 0.4443,\n \" \": 0.4004,\n \"¡\": 0.1348,\n \"¢\": 0.6328,\n \"£\": 0.5391,\n \"¤\": 0.5625,\n \"¥\": 0.5342,\n \"¦\": 0.1279,\n \"§\": 0.502,\n \"¨\": 0.3711,\n \"©\": 0.6309,\n ª: 0.249,\n \"«\": 0.7012,\n \"¬\": 0.5996,\n \"®\": 0.6309,\n \"¯\": 0.3105,\n \"°\": 0.2197,\n \"±\": 0.5244,\n \"²\": 0.375,\n \"³\": 0.3281,\n \"´\": 0.1719,\n µ: 0.4902,\n \"¶\": 0.3789,\n \"·\": 0.1406,\n \"¸\": 0.2666,\n \"¹\": 0.1123,\n º: 0.2715,\n \"»\": 0.6543,\n \"¼\": 0.6201,\n \"½\": 0.6484,\n \"¾\": 0.8623,\n \"¿\": 0.4844,\n À: 0.6406,\n Á: 0.6406,\n Â: 0.6406,\n Ã: 0.6406,\n Ä: 0.6406,\n Å: 0.6406,\n Æ: 0.877,\n Ç: 0.708,\n È: 0.5918,\n É: 0.5918,\n Ê: 0.5918,\n Ë: 0.5918,\n Ì: 0.1514,\n Í: 0.1514,\n Î: 0.1514,\n Ï: 0.1514,\n Ð: 0.6816,\n Ñ: 0.627,\n Ò: 0.6699,\n Ó: 0.6699,\n Ô: 0.6699,\n Õ: 0.6699,\n Ö: 0.6699,\n \"×\": 0.4707,\n Ø: 0.6699,\n Ù: 0.5615,\n Ú: 0.5615,\n Û: 0.5615,\n Ü: 0.5615,\n Ý: 0.5342,\n Þ: 0.5059,\n ß: 0.7109,\n à: 0.5088,\n á: 0.5088,\n â: 0.5088,\n ã: 0.5088,\n ä: 0.5088,\n å: 0.5088,\n æ: 0.9238,\n ç: 0.6328,\n è: 0.541,\n é: 0.541,\n ê: 0.541,\n ë: 0.541,\n ì: 0.1514,\n í: 0.1514,\n î: 0.1514,\n ï: 0.1514,\n ð: 0.5801,\n ñ: 0.5,\n ò: 0.5625,\n ó: 0.5625,\n ô: 0.5625,\n õ: 0.5625,\n ö: 0.5625,\n \"÷\": 0.3438,\n ø: 0.5625,\n ù: 0.5078,\n ú: 0.5078,\n û: 0.5078,\n ü: 0.5078,\n ý: 0.5488,\n þ: 0.5186,\n ÿ: 0.5488,\n \"–\": 0.3105,\n \"—\": 0.4111,\n \"‘\": 0.1621,\n \"’\": 0.1621,\n \"‚\": 0.1621,\n \"“\": 0.2363,\n \"”\": 0.2363,\n \"„\": 0.2803,\n \"…\": 0.4229,\n \"•\": 0.1924,\n \"€\": 0.7949,\n \"™\": 1.21,\n },\n },\n \"comic-neue\": {\n capHeight: 0.67,\n defaultAdvance: 0.4919,\n advances: {\n \"0\": 0.609,\n \"1\": 0.396,\n \"2\": 0.523,\n \"3\": 0.506,\n \"4\": 0.484,\n \"5\": 0.542,\n \"6\": 0.542,\n \"7\": 0.473,\n \"8\": 0.515,\n \"9\": 0.531,\n \" \": 0.334,\n \"!\": 0.245,\n '\"': 0.275,\n \"#\": 0.74,\n $: 0.602,\n \"%\": 0.72,\n \"&\": 0.644,\n \"'\": 0.196,\n \"(\": 0.346,\n \")\": 0.346,\n \"*\": 0.394,\n \"+\": 0.444,\n \",\": 0.164,\n \"-\": 0.402,\n \".\": 0.153,\n \"/\": 0.436,\n \":\": 0.181,\n \";\": 0.199,\n \"<\": 0.511,\n \"=\": 0.462,\n \">\": 0.541,\n \"?\": 0.501,\n \"@\": 0.832,\n A: 0.581,\n B: 0.62,\n C: 0.614,\n D: 0.629,\n E: 0.603,\n F: 0.577,\n G: 0.716,\n H: 0.723,\n I: 0.392,\n J: 0.457,\n K: 0.56,\n L: 0.5,\n M: 0.838,\n N: 0.658,\n O: 0.643,\n P: 0.56,\n Q: 0.708,\n R: 0.596,\n S: 0.552,\n T: 0.522,\n U: 0.691,\n V: 0.536,\n W: 0.867,\n X: 0.685,\n Y: 0.594,\n Z: 0.582,\n \"[\": 0.318,\n \"\\\\\": 0.549,\n \"]\": 0.318,\n \"^\": 0.504,\n _: 0.494,\n \"`\": 0.181,\n a: 0.516,\n b: 0.535,\n c: 0.482,\n d: 0.53,\n e: 0.501,\n f: 0.279,\n g: 0.53,\n h: 0.536,\n i: 0.227,\n j: 0.236,\n k: 0.484,\n l: 0.219,\n m: 0.827,\n n: 0.553,\n o: 0.529,\n p: 0.531,\n q: 0.52,\n r: 0.397,\n s: 0.416,\n t: 0.286,\n u: 0.511,\n v: 0.418,\n w: 0.598,\n x: 0.473,\n y: 0.447,\n z: 0.434,\n \"{\": 0.373,\n \"|\": 0.197,\n \"}\": 0.373,\n \"~\": 0.615,\n \" \": 0.334,\n \"¡\": 0.245,\n \"¢\": 0.48,\n \"£\": 0.661,\n \"¤\": 0.507,\n \"¥\": 0.494,\n \"¦\": 0.223,\n \"§\": 0.421,\n \"¨\": 0.265,\n \"©\": 0.547,\n ª: 0.302,\n \"«\": 0.563,\n \"¬\": 0.478,\n \"\": 0.402,\n \"®\": 0.555,\n \"¯\": 0.263,\n \"°\": 0.247,\n \"±\": 0.445,\n \"²\": 0.249,\n \"³\": 0.245,\n \"´\": 0.181,\n µ: 0.504,\n \"¶\": 0.557,\n \"·\": 0.176,\n \"¸\": 0.172,\n \"¹\": 0.176,\n º: 0.281,\n \"»\": 0.559,\n \"¼\": 0.685,\n \"½\": 0.741,\n \"¾\": 0.734,\n \"¿\": 0.485,\n À: 0.581,\n Á: 0.581,\n Â: 0.581,\n Ã: 0.581,\n Ä: 0.581,\n Å: 0.581,\n Æ: 1.044,\n Ç: 0.614,\n È: 0.603,\n É: 0.603,\n Ê: 0.603,\n Ë: 0.603,\n Ì: 0.392,\n Í: 0.392,\n Î: 0.392,\n Ï: 0.392,\n Ð: 0.634,\n Ñ: 0.658,\n Ò: 0.643,\n Ó: 0.643,\n Ô: 0.643,\n Õ: 0.643,\n Ö: 0.643,\n \"×\": 0.376,\n Ø: 0.635,\n Ù: 0.691,\n Ú: 0.691,\n Û: 0.691,\n Ü: 0.691,\n Ý: 0.594,\n Þ: 0.542,\n ß: 0.526,\n à: 0.516,\n á: 0.516,\n â: 0.516,\n ã: 0.516,\n ä: 0.516,\n å: 0.516,\n æ: 0.822,\n ç: 0.482,\n è: 0.501,\n é: 0.501,\n ê: 0.501,\n ë: 0.501,\n ì: 0.228,\n í: 0.228,\n î: 0.228,\n ï: 0.228,\n ð: 0.47,\n ñ: 0.553,\n ò: 0.529,\n ó: 0.529,\n ô: 0.529,\n õ: 0.529,\n ö: 0.529,\n \"÷\": 0.432,\n ø: 0.529,\n ù: 0.511,\n ú: 0.511,\n û: 0.511,\n ü: 0.511,\n ý: 0.447,\n þ: 0.531,\n ÿ: 0.447,\n \"–\": 0.6,\n \"—\": 0.824,\n \"‘\": 0.185,\n \"’\": 0.185,\n \"‚\": 0.265,\n \"“\": 0.308,\n \"”\": 0.326,\n \"„\": 0.373,\n \"…\": 0.664,\n \"•\": 0.313,\n \"€\": 0.667,\n \"™\": 0.487,\n },\n },\n};\n","// Headless TextMeasurer implementation. The editor measures text with a\n// canvas (`ctx.measureText`); Node has no canvas, so measurement runs off\n// per-glyph advance-width tables extracted from the real TTFs\n// (advanceTables.ts, regenerated via `npm run gen:fonts`).\n//\n// approximateTextMeasurer is ZERO-CONFIG and per-font accurate on advances,\n// but APPROXIMATE overall: no kerning/shaping, ASCII table only (other\n// characters use the font's average advance). Good enough for bounds /\n// hit-testing / preview; NOT pixel-exact. When a sink is available its own\n// measureText is preferred (the painters already use it), so this mainly\n// serves sink-less calls (buildSnapEntry bounds).\n\nimport type { TextMeasurer } from \"./textMetrics\";\nimport { realFace, resolveFont } from \"../model/fonts\";\nimport { ADVANCE_TABLES } from \"./advanceTables\";\n\n/**\n * Zero-config headless measurer. Model text heights are CAP heights, so\n * measurement scales the em advances by heightMm / capHeight.\n */\nexport const approximateTextMeasurer: TextMeasurer = {\n measureTextWidth: (text, heightMm, font, widthFactor = 1) => {\n // A bundled bold/italic face has its own advances; a synthesized one\n // keeps the regular font's (synthesis doesn't change advances).\n const table = ADVANCE_TABLES[realFace(font) ?? resolveFont(font).id];\n let em = 0;\n for (const ch of text) em += table.advances[ch] ?? table.defaultAdvance;\n return (em * heightMm * widthFactor) / table.capHeight;\n },\n};\n","// Dimension geometry derivation, all kinds: linear (2+ chained points,\n// measuring along `rotation` or, unset, along the points), angular (3\n// points: vertex + two rays; `offset` = signed arc radius), radial (center +\n// curve point), and diameter (two opposite curve points). Pure — the\n// sink-bound painter, snap/hit-testing and DXF explosion reuse exactly what\n// is drawn. Label placement (docs/dimension-labels.md): each measured\n// segment carries a frame (`along` the line, `across` it); a label with no\n// position is placed automatically — centered when it fits between the\n// arrows, else outside (or raised, inside a chain) — and a label pulled off\n// the line gets a leader once it no longer overlaps its segment. Text is\n// measured with the headless `approximateTextMeasurer` so every sink (and\n// Node) places labels identically.\n\nimport type { Dimension, DimLabel, DimStyle, TextSpan } from \"../model/objects\";\nimport { normalizeSpans, richTextBlock } from \"./richText\";\nimport {\n DIM_DEFAULT_CONTENT,\n DIM_VALUE_TOKEN,\n dimFontFace,\n dimStyleFor,\n} from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport {\n add,\n angle,\n dist,\n dot,\n fromAngle,\n len,\n norm,\n normAngle,\n perp,\n scale,\n sub,\n} from \"../geometry/vec2\";\nimport type { Segment } from \"../geometry/line\";\nimport { approximateTextMeasurer } from \"./textMeasurer\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nexport interface DimArc {\n center: Vec2;\n radius: number;\n /** Radians, CCW from startAngle to endAngle (canvas/DXF convention). */\n startAngle: number;\n endAngle: number;\n}\n\nexport interface DimText {\n content: string;\n /** Character formatting over `content` (the label's spans, mapped). */\n spans?: TextSpan[];\n anchor: Vec2;\n rotation: number;\n height: number;\n /** Advance width of `content` in mm (the headless measurer's). */\n width: number;\n /** Font id + width factor from the resolved dimension style. */\n font?: string;\n widthFactor?: number;\n /** Index of the measured segment this label belongs to (`labels[i]`). */\n segment: number;\n /** The resolved placement, in the segment's label frame. */\n along: number;\n across: number;\n}\n\nexport interface DimGeometry {\n extensionLines: Segment[];\n /** Dimension lines, including any extension under an outside label. */\n dimLines: Segment[];\n /** Angular dimensions draw an arc instead of a straight dimension line. */\n dimArc: DimArc | null;\n /** Leader + landing segments of labels pulled away from their segment. */\n leaders: Segment[];\n arrows: { tip: Vec2; toward: Vec2; size: number }[];\n arrowType: DimStyle[\"arrowType\"];\n /** One entry per measured segment (chains carry several). */\n labels: DimText[];\n /** Primary measurement: total span / angle in radians / radius / diameter. */\n value: number;\n}\n\nexport const formatDimValue = (value: number, precision: number): string => {\n const fixed = value.toFixed(precision);\n return fixed.includes(\".\") ? fixed.replace(/\\.?0+$/, \"\") : fixed;\n};\n\n/** A label's shown text and its character formatting. */\nexport interface DimLabelText {\n content: string;\n spans?: TextSpan[];\n}\n\n/** A label's text: its template (or the kind's default) with `{value}`\n * replaced by the formatted measurement, and the template's spans moved\n * onto the result — a span covering the token formats the value. */\nexport const dimLabelContent = (\n kind: Dimension[\"kind\"],\n label: DimLabel | undefined,\n formatted: string,\n): DimLabelText => {\n const parts = (label?.content ?? DIM_DEFAULT_CONTENT[kind]).split(\n DIM_VALUE_TOKEN,\n );\n const content = parts.join(formatted);\n if (!label?.spans?.length || label.content === undefined) return { content };\n const T = DIM_VALUE_TOKEN.length;\n /** Template offset → content offset; inside a token, the value's start\n * (span start) or end (span end). */\n const map = (p: number, end: boolean): number => {\n let t = 0;\n let c = 0;\n for (let i = 0; i < parts.length; i++) {\n if (p <= t + parts[i].length) return c + (p - t);\n t += parts[i].length;\n c += parts[i].length;\n if (i === parts.length - 1) break;\n if (p < t + T) return end ? c + formatted.length : c;\n t += T;\n c += formatted.length;\n }\n return content.length;\n };\n const spans = normalizeSpans(\n label.spans.map((s) => ({\n ...s,\n start: map(s.start, false),\n end: map(s.end, true),\n })),\n content,\n );\n return spans.length ? { content, spans } : { content };\n};\n\n/** A label's advance width (mm), formatted runs measured per run. */\nconst labelWidth = (\n label: DimLabelText,\n h: number,\n font: string | undefined,\n widthFactor: number,\n): number =>\n label.spans?.length\n ? richTextBlock(\n label.content,\n label.spans,\n { face: font, heightMm: h, widthFactor },\n approximateTextMeasurer,\n approximateTextMeasurer,\n ).width\n : approximateTextMeasurer.measureTextWidth(\n label.content,\n h,\n font,\n widthFactor,\n );\n\n/** Referenced document style + per-object overrides, with the object's\n * annotation `scale` along for the ride (there is no document-level scale). */\nexport type ResolvedDimStyle = DimStyle & { scale: number };\n\nconst resolveDimStyle = (\n obj: Dimension,\n styles: readonly DimStyle[],\n): ResolvedDimStyle => ({\n ...dimStyleFor(obj, styles),\n ...obj.styleOverride,\n scale: obj.scale,\n});\n\n/** Readable text rotation for a direction: never upside down. */\nconst readableRotation = (u: Vec2): number => {\n const raw = normAngle(angle(u));\n const flipped = raw > Math.PI / 2 + 1e-9 && raw <= (3 * Math.PI) / 2 + 1e-9;\n return flipped ? raw - Math.PI : raw;\n};\n\n// ---- Label frames -----------------------------------------------------------\n\n/**\n * One measured segment's label frame: `along` runs with the dimension line\n * (arc length on an angular dimension) from the segment's origin, `across`\n * is perpendicular to it. `s0..s1` is the measured span in `along` units.\n */\nexport interface DimLabelFrame {\n s0: number;\n s1: number;\n toWorld(along: number, across: number): Vec2;\n fromWorld(p: Vec2): { along: number; across: number };\n /** Unit reading direction of the line at `along`. */\n tangent(along: number): Vec2;\n}\n\nconst straightFrame = (\n origin: Vec2,\n u: Vec2,\n n: Vec2,\n s0: number,\n s1: number,\n): DimLabelFrame => ({\n s0,\n s1,\n toWorld: (along, across) =>\n add(origin, add(scale(u, along), scale(n, across))),\n fromWorld: (p) => {\n const d = sub(p, origin);\n return { along: dot(d, u), across: dot(d, n) };\n },\n tangent: () => u,\n});\n\n/** The measuring direction of a linear dimension and the left perpendicular\n * its `offset` is measured along. */\nexport const linearAxis = (\n obj: Pick<Dimension, \"points\" | \"rotation\">,\n): { u: Vec2; n: Vec2 } => {\n const first = obj.points[0];\n const last = obj.points[obj.points.length - 1];\n const u =\n obj.rotation !== undefined\n ? fromAngle(obj.rotation)\n : dist(first, last) > 1e-9\n ? norm(sub(last, first))\n : { x: 1, y: 0 };\n return { u, n: perp(u) };\n};\n\n/** Feet of a linear dimension's points on its dimension line. */\nconst linearFeet = (obj: Dimension): { feet: Vec2[]; u: Vec2; n: Vec2 } => {\n const { u, n } = linearAxis(obj);\n const first = obj.points[0];\n const h = obj.offset ?? 0;\n const feet = obj.points.map((p) =>\n add(p, scale(n, h - dot(sub(p, first), n))),\n );\n return { feet, u, n };\n};\n\n/** The frames of a dimension's measured segments (one per label); empty\n * for a degenerate definition. Handles, import and export translate label\n * positions through these. */\nexport const dimensionLabelFrames = (obj: Dimension): DimLabelFrame[] => {\n switch (obj.kind) {\n case \"linear\": {\n if (obj.points.length < 2) return [];\n const { feet, u, n } = linearFeet(obj);\n const across = (obj.offset ?? 0) >= 0 ? n : scale(n, -1);\n const frames: DimLabelFrame[] = [];\n for (let i = 0; i + 1 < feet.length; i++) {\n const L = dot(sub(feet[i + 1], feet[i]), u);\n if (Math.abs(L) < 1e-9) continue;\n // Segments run in point order; a chain laid out against `u` still\n // reads left to right along u.\n const dir = L > 0 ? u : scale(u, -1);\n frames.push(straightFrame(feet[i], dir, across, 0, Math.abs(L)));\n }\n return frames;\n }\n case \"angular\": {\n const polar = angularFrame(obj);\n return polar ? [polar.frame] : [];\n }\n case \"radial\": {\n if (obj.points.length < 2) return [];\n const [center, p] = obj.points;\n const r = dist(center, p);\n if (r < 1e-9) return [];\n const u = norm(sub(p, center));\n return [straightFrame(center, u, perp(u), 0, r)];\n }\n case \"diameter\": {\n if (obj.points.length < 2) return [];\n const [p1, p2] = obj.points;\n const d = dist(p1, p2);\n if (d < 1e-9) return [];\n const u = norm(sub(p2, p1));\n const center = add(p1, scale(u, d / 2));\n return [straightFrame(center, u, perp(u), -d / 2, d / 2)];\n }\n }\n};\n\ninterface AngularFrame {\n vertex: Vec2;\n radius: number;\n start: number;\n sweep: number;\n frame: DimLabelFrame;\n}\n\nconst angularFrame = (obj: Dimension): AngularFrame | null => {\n if (obj.points.length < 3) return null;\n const [vertex, a, b] = obj.points;\n const signed = obj.offset ?? 0;\n const radius = Math.abs(signed);\n if (radius < 1e-9 || dist(vertex, a) < 1e-9 || dist(vertex, b) < 1e-9)\n return null;\n const angA = angle(sub(a, vertex));\n const angB = angle(sub(b, vertex));\n // Positive radius: the arc CCW from a to b; negative: the complement.\n const start = signed >= 0 ? angA : angB;\n const sweep = signed >= 0 ? normAngle(angB - angA) : normAngle(angA - angB);\n if (sweep < 1e-9) return null;\n const frame: DimLabelFrame = {\n s0: 0,\n s1: radius * sweep,\n toWorld: (along, across) =>\n add(vertex, scale(fromAngle(start + along / radius), radius + across)),\n fromWorld: (p) => {\n const d = sub(p, vertex);\n let w = normAngle(angle(d) - start);\n if (w > Math.PI) w -= 2 * Math.PI;\n return { along: w * radius, across: len(d) - radius };\n },\n tangent: (along) => perp(fromAngle(start + along / radius)),\n };\n return { vertex, radius, start, sweep, frame };\n};\n\n// ---- Label placement --------------------------------------------------------\n\n/** Where an automatically placed label goes when it does not fit: past the\n * segment's end, past its start, or raised above it (inside a chain). */\ntype OutsideMode = \"end\" | \"start\" | \"raise\";\n\ninterface PlacedLabel {\n text: DimText;\n /** `along` range the dimension line must cover for this label (an\n * outside label on the line), or null. */\n cover: [number, number] | null;\n leaders: Segment[];\n}\n\nconst overlaps = (a: [number, number], b: [number, number]): boolean =>\n a[0] < b[1] - 1e-9 && b[0] < a[1] - 1e-9;\n\nconst placeLabel = (\n frame: DimLabelFrame,\n spec: DimLabel | undefined,\n index: number,\n label: DimLabelText,\n style: ResolvedDimStyle,\n arrowCount: 1 | 2,\n mode: OutsideMode,\n stack: { row: number; interval: [number, number] } | null,\n): PlacedLabel & { row: number } => {\n const s = style.scale;\n const h = style.textHeight * s;\n const gap = style.textOffset * s;\n const A = style.arrowSize * s;\n const font = dimFontFace(style);\n const width = labelWidth(label, h, font, style.widthFactor);\n const L = frame.s1 - frame.s0;\n const arrowsInside = L >= arrowCount * A - 1e-9;\n let along = spec?.along;\n let across = spec?.across ?? 0;\n let row = 0;\n if (along === undefined) {\n const fits = L >= width + 2 * gap + arrowCount * A - 1e-9;\n const push = (arrowsInside ? 0 : A) + gap + width / 2;\n if (fits) along = (frame.s0 + frame.s1) / 2;\n else if (mode === \"end\") along = frame.s1 + push;\n else if (mode === \"start\") along = frame.s0 - push;\n else {\n along = (frame.s0 + frame.s1) / 2;\n row = 1;\n const interval: [number, number] = [along - width / 2, along + width / 2];\n if (stack && stack.row >= 1 && overlaps(interval, stack.interval))\n row = stack.row + 1;\n across = row * (h + gap);\n }\n }\n const interval: [number, number] = [along - width / 2, along + width / 2];\n\n let cover: [number, number] | null = null;\n if (across === 0 && (interval[1] > frame.s1 || interval[0] < frame.s0))\n cover = [\n Math.min(frame.s0, interval[0] - gap),\n Math.max(frame.s1, interval[1] + gap),\n ];\n\n // A label the user lifted off the line (a stored, non-zero `across`)\n // always gets its leader — even over its own segment; an automatically\n // raised one does not.\n const leaders: Segment[] = [];\n if (spec?.across !== undefined && spec.across !== 0) {\n const landingA = frame.toWorld(interval[0], across);\n const landingB = frame.toWorld(interval[1], across);\n const from = frame.toWorld((frame.s0 + frame.s1) / 2, 0);\n const to =\n dist(from, landingA) <= dist(from, landingB) ? landingA : landingB;\n leaders.push({ a: from, b: to }, { a: landingA, b: landingB });\n }\n\n const tangent = frame.tangent(along);\n const rotation = readableRotation(tangent);\n const textUp = perp(fromAngle(rotation));\n const text: DimText = {\n content: label.content,\n ...(label.spans ? { spans: label.spans } : {}),\n anchor: add(frame.toWorld(along, across), scale(textUp, gap)),\n rotation,\n height: h,\n width,\n font,\n widthFactor: style.widthFactor,\n segment: index,\n along,\n across,\n };\n return { text, cover, leaders, row };\n};\n\n// ---- Kinds ------------------------------------------------------------------\n\n/** Linear: 2+ points chained along one dimension line. */\nconst linearGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n if (obj.points.length < 2) return null;\n const s = style.scale;\n const A = style.arrowSize * s;\n const { feet, u } = linearFeet(obj);\n const frames = dimensionLabelFrames(obj);\n if (frames.length === 0) return null;\n\n const extensionLines: Segment[] = [];\n obj.points.forEach((p, i) => {\n const f = feet[i];\n const gap = dist(p, f);\n if (gap < 1e-9) return;\n const w = norm(sub(f, p));\n // \"short\": just a 2×overshoot tick across the dimension line.\n extensionLines.push({\n a:\n style.extensionType === \"short\"\n ? sub(f, scale(w, style.extensionOvershoot * s))\n : add(p, scale(w, Math.min(style.extensionOffset * s, gap))),\n b: add(f, scale(w, style.extensionOvershoot * s)),\n });\n });\n\n const dimLines: Segment[] = [];\n const arrows: DimGeometry[\"arrows\"] = [];\n const labels: DimText[] = [];\n const leaders: Segment[] = [];\n let stack: { row: number; interval: [number, number] } | null = null;\n frames.forEach((frame, i) => {\n const L = frame.s1 - frame.s0;\n const value = L;\n const mode: OutsideMode =\n frames.length === 1 || i === frames.length - 1\n ? \"end\"\n : i === 0\n ? \"start\"\n : \"raise\";\n const placed = placeLabel(\n frame,\n obj.labels[i],\n i,\n dimLabelContent(\n obj.kind,\n obj.labels[i],\n formatDimValue(value, style.precision),\n ),\n style,\n 2,\n mode,\n stack,\n );\n stack =\n placed.row > 0\n ? {\n row: placed.row,\n interval: [\n placed.text.along - placed.text.width / 2,\n placed.text.along + placed.text.width / 2,\n ],\n }\n : null;\n labels.push(placed.text);\n leaders.push(...placed.leaders);\n\n const a = frame.toWorld(frame.s0, 0);\n const b = frame.toWorld(frame.s1, 0);\n const arrowsInside = L >= 2 * A - 1e-9;\n let from = frame.s0;\n let to = frame.s1;\n if (!arrowsInside) {\n from -= 2 * A;\n to += 2 * A;\n }\n if (placed.cover) {\n from = Math.min(from, placed.cover[0]);\n to = Math.max(to, placed.cover[1]);\n }\n dimLines.push({ a: frame.toWorld(from, 0), b: frame.toWorld(to, 0) });\n arrows.push(\n arrowsInside\n ? { tip: a, toward: b, size: A }\n : { tip: a, toward: frame.toWorld(from, 0), size: A },\n arrowsInside\n ? { tip: b, toward: a, size: A }\n : { tip: b, toward: frame.toWorld(to, 0), size: A },\n );\n });\n\n return {\n extensionLines,\n dimLines,\n dimArc: null,\n leaders,\n arrows,\n arrowType: style.arrowType,\n labels,\n value: Math.abs(dot(sub(feet[feet.length - 1], feet[0]), u)),\n };\n};\n\n/** Angular: [vertex, a, b]; `offset` is the signed arc radius. */\nconst angularGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n const polar = angularFrame(obj);\n if (!polar) return null;\n const { vertex, radius, start, sweep, frame } = polar;\n const s = style.scale;\n const A = style.arrowSize * s;\n const [, a, b] = obj.points;\n\n // Extension lines: along each ray from the point out to the arc\n // (\"short\": just a 2×overshoot tick across it).\n const extensionLines: Segment[] = [];\n for (const p of [a, b]) {\n const d = dist(vertex, p);\n const w = norm(sub(p, vertex));\n const inner =\n style.extensionType === \"short\"\n ? radius - style.extensionOvershoot * s\n : Math.min(d + style.extensionOffset * s, radius);\n const outer = radius + style.extensionOvershoot * s;\n if (outer - inner > 1e-9)\n extensionLines.push({\n a: add(vertex, scale(w, inner)),\n b: add(vertex, scale(w, outer)),\n });\n }\n\n const placed = placeLabel(\n frame,\n obj.labels[0],\n 0,\n dimLabelContent(\n obj.kind,\n obj.labels[0],\n formatDimValue(sweep * RAD2DEG, style.precision),\n ),\n style,\n 2,\n \"end\",\n null,\n );\n\n const L = frame.s1;\n const arrowsInside = L >= 2 * A - 1e-9;\n let from = 0;\n let to = L;\n if (!arrowsInside) {\n from -= 2 * A;\n to += 2 * A;\n }\n if (placed.cover) {\n from = Math.min(from, placed.cover[0]);\n to = Math.max(to, placed.cover[1]);\n }\n // Arrow bodies point a short way along the arc (tangent-ish).\n const step = Math.min(sweep / 3, (A * 2) / radius) * radius;\n const at = (along: number): Vec2 => frame.toWorld(along, 0);\n\n return {\n extensionLines,\n dimLines: [],\n dimArc: {\n center: vertex,\n radius,\n startAngle: start + from / radius,\n endAngle: start + to / radius,\n },\n leaders: placed.leaders,\n arrows: [\n { tip: at(0), toward: at(arrowsInside ? step : -step), size: A },\n { tip: at(L), toward: at(arrowsInside ? L - step : L + step), size: A },\n ],\n arrowType: style.arrowType,\n labels: [placed.text],\n value: sweep,\n };\n};\n\n/** Radial: [center, point on curve]; the label sits on the ray (inside the\n * curve when it fits, else past it with the line extended). */\nconst radialGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n const [frame] = dimensionLabelFrames(obj);\n if (!frame) return null;\n const s = style.scale;\n const A = style.arrowSize * s;\n const [center, p] = obj.points;\n const r = frame.s1;\n const spec = obj.labels[0];\n const content = dimLabelContent(\n obj.kind,\n spec,\n formatDimValue(r, style.precision),\n );\n // Automatic: inside, just within the arrow, when the text fits the\n // radius; else outside (placeLabel's \"end\" rule).\n const width = labelWidth(\n content,\n style.textHeight * s,\n dimFontFace(style),\n style.widthFactor,\n );\n const gap = style.textOffset * s;\n const autoInside =\n spec?.along === undefined && r >= width + 2 * gap + A - 1e-9\n ? { ...spec, along: r - A - gap - width / 2 }\n : spec;\n const placed = placeLabel(\n frame,\n autoInside,\n 0,\n content,\n style,\n 1,\n \"end\",\n null,\n );\n const outside = placed.text.along > r + 1e-9;\n let to = r;\n if (placed.cover) to = Math.max(to, placed.cover[1]);\n return {\n extensionLines: [],\n dimLines: [{ a: center, b: frame.toWorld(to, 0) }],\n dimArc: null,\n leaders: placed.leaders,\n // Head at the curve: pointing outward with the text inside, inward\n // (body on the outside) with the text outside.\n arrows: [\n { tip: p, toward: outside ? frame.toWorld(r + A, 0) : center, size: A },\n ],\n arrowType: style.arrowType,\n labels: [placed.text],\n value: r,\n };\n};\n\n/** Diameter: [p1, p2] opposite points on the curve; the label sits on the\n * line through them, centered when it fits. */\nconst diameterGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n const [frame] = dimensionLabelFrames(obj);\n if (!frame) return null;\n const s = style.scale;\n const A = style.arrowSize * s;\n const [p1, p2] = obj.points;\n const d = frame.s1 - frame.s0;\n const placed = placeLabel(\n frame,\n obj.labels[0],\n 0,\n dimLabelContent(\n obj.kind,\n obj.labels[0],\n formatDimValue(d, style.precision),\n ),\n style,\n 2,\n \"end\",\n null,\n );\n const arrowsInside = d >= 2 * A - 1e-9;\n let from = frame.s0;\n let to = frame.s1;\n if (!arrowsInside) {\n from -= 2 * A;\n to += 2 * A;\n }\n if (placed.cover) {\n from = Math.min(from, placed.cover[0]);\n to = Math.max(to, placed.cover[1]);\n }\n return {\n extensionLines: [],\n dimLines: [{ a: frame.toWorld(from, 0), b: frame.toWorld(to, 0) }],\n dimArc: null,\n leaders: placed.leaders,\n arrows: arrowsInside\n ? [\n { tip: p1, toward: p2, size: A },\n { tip: p2, toward: p1, size: A },\n ]\n : [\n { tip: p1, toward: frame.toWorld(from, 0), size: A },\n { tip: p2, toward: frame.toWorld(to, 0), size: A },\n ],\n arrowType: style.arrowType,\n labels: [placed.text],\n value: d,\n };\n};\n\n/**\n * Derive the drawn geometry of a dimension (all kinds).\n * Returns null for degenerate definitions.\n */\nexport const dimensionGeometry = (\n obj: Dimension,\n styles: readonly DimStyle[],\n): DimGeometry | null => {\n const style = resolveDimStyle(obj, styles);\n switch (obj.kind) {\n case \"linear\":\n return linearGeometry(obj, style);\n case \"angular\":\n return angularGeometry(obj, style);\n case \"radial\":\n return radialGeometry(obj, style);\n case \"diameter\":\n return diameterGeometry(obj, style);\n }\n};\n","// Pure text geometry: alignment involutions and the corner points of a\n// text box, used by bounds, snapping, and hit-testing. Measurement is\n// injected (see textMetrics.ts); the sink-bound painter stays editor-side.\n\nimport type {\n ArrowType,\n PolylineVertex,\n Text,\n TextStyle,\n} from \"../model/objects\";\nimport { effectiveTextFont, textStyleFor } from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { add, fromAngle, perp, scale, sub } from \"../geometry/vec2\";\nimport { boundMeasurer, textBlock, type TextMeasurer } from \"./textMetrics\";\nimport { richTextBlock } from \"./richText\";\nimport { approximateTextMeasurer } from \"./textMeasurer\";\n\n// Text alignment is JUSTIFICATION — which edge of the text sits on its\n// point, the AutoCAD / DXF and canvas meaning (\"right\" = the text lies left\n// of the point, \"bottom\" = above it). Model, sinks and DXF share it, so no\n// mapping between them (docs/adr/0002).\n\n/** Effective cap height (override, else the referenced style's) with the\n * object's scale applied (like DimStyle.scale). */\nexport const textHeight = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): number =>\n (obj.styleOverride?.textHeight ?? textStyleFor(obj, textStyles).textHeight) *\n obj.scale;\n\n/** Effective leader arrowhead size (override, else the referenced style's)\n * with the object's scale applied. */\nexport const textArrowSize = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): number =>\n (obj.styleOverride?.arrowSize ?? textStyleFor(obj, textStyles).arrowSize) *\n obj.scale;\n\n/** Effective leader arrowhead style (override, else the referenced\n * style's). */\nexport const textArrowType = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): ArrowType =>\n obj.styleOverride?.arrowType ?? textStyleFor(obj, textStyles).arrowType;\n\n/** Wrap/box width with the object's scale applied, or undefined for no wrap. */\nexport const textWidth = (obj: Text): number | undefined =>\n obj.width === undefined ? undefined : obj.width * obj.scale;\n\n/** Frame border inset from the text box, proportional to cap height. */\nconst FRAME_MARGIN_FACTOR = 0.35;\n\n/** The rotated local frame + anchor-relative extents of a text's box. */\nconst textBoxLocal = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n) => {\n // Bind the object's effective font (own, else document style) — callers\n // pass generic measurers. (Already-bound measurers ignore the extra args,\n // so this can't double.)\n const { font, widthFactor } = effectiveTextFont(obj, textStyles);\n const block = obj.spans?.length\n ? // Formatted: per-run fonts, so the measurer stays unbound.\n richTextBlock(\n obj.content,\n obj.spans,\n {\n face: font,\n heightMm: textHeight(obj, textStyles),\n widthFactor,\n },\n measure,\n approximateTextMeasurer,\n textWidth(obj),\n )\n : textBlock(\n obj.content,\n textHeight(obj, textStyles),\n boundMeasurer(measure, font, widthFactor),\n textWidth(obj),\n );\n const u = fromAngle(obj.rotation);\n const vUp = perp(u);\n const hA = obj.hAlign;\n const vA = obj.vAlign;\n // Anchor-relative extents by (anchor-edge) alignment.\n const left =\n hA === \"left\" ? 0 : hA === \"center\" ? -block.width / 2 : -block.width;\n const top =\n vA === \"top\" ? 0 : vA === \"center\" ? block.height / 2 : block.height;\n const at = (dx: number, dy: number): Vec2 =>\n add(add(obj.position, scale(u, dx)), scale(vUp, dy));\n return {\n block,\n u,\n vUp,\n left,\n right: left + block.width,\n top,\n bottom: top - block.height,\n at,\n };\n};\n\n/** Corner points of the (rotated) text box, for bounds/hit-testing. */\nexport const textBoxCorners = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): Vec2[] => {\n const { left, right, top, bottom, at } = textBoxLocal(\n obj,\n measure,\n textStyles,\n );\n return [at(left, top), at(right, top), at(right, bottom), at(left, bottom)];\n};\n\n/**\n * Change a text's alignment and keep its box where it is (AutoCAD): the\n * position moves to the box's new justification point.\n */\nexport const realignText = (\n obj: Text,\n align: Partial<Pick<Text, \"hAlign\" | \"vAlign\">>,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): Text => {\n const next = { ...obj, ...align };\n const before = textBoxCorners(obj, measure, textStyles)[0];\n const after = textBoxCorners(next, measure, textStyles)[0];\n return { ...next, position: add(obj.position, sub(before, after)) };\n};\n\n/** A frame part: a vertex chain with DXF bulges (arcs), like a polyline. */\nexport interface TextFramePart {\n points: PolylineVertex[];\n closed: boolean;\n}\n\n/**\n * The text frame as polyline-shaped chains (none → empty), offset outward\n * from the text box by a cap-height-proportional margin: \"rectangle\" a box,\n * \"circle\" the circle around the box, \"slot\" a box with semicircular ends,\n * \"bottom\" a line under the text, \"firstLine\" one under its first line.\n */\nexport const textFrameGeometry = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): TextFramePart[] => {\n if (!obj.frame || obj.frame === \"none\") return [];\n const { left, right, top, bottom, at } = textBoxLocal(\n obj,\n measure,\n textStyles,\n );\n const h = textHeight(obj, textStyles);\n const m = h * FRAME_MARGIN_FACTOR;\n const l = left - m;\n const r = right + m;\n const t = top + m;\n const b = bottom - m;\n const v = (dx: number, dy: number, bulge = 0): PolylineVertex => ({\n ...at(dx, dy),\n bulge,\n });\n const line = (y: number) => [{ points: [v(l, y), v(r, y)], closed: false }];\n switch (obj.frame) {\n case \"bottom\":\n return line(b);\n case \"firstLine\":\n return line(top - h - m);\n case \"circle\": {\n // Circumscribes the box; bulge 1 = a half circle per vertex.\n const cy = (top + bottom) / 2;\n const rad = Math.hypot((right - left) / 2, (top - bottom) / 2) + m;\n const cx = (left + right) / 2;\n return [\n { points: [v(cx - rad, cy, 1), v(cx + rad, cy, 1)], closed: true },\n ];\n }\n case \"slot\":\n // Straight over the text, half circles past its ends (CCW chain).\n return [\n {\n points: [v(right, b, 1), v(right, t), v(left, t, 1), v(left, b)],\n closed: true,\n },\n ];\n default:\n return [{ points: [v(l, b), v(r, b), v(r, t), v(l, t)], closed: true }];\n }\n};\n","// Table layout: the ONE derivation of a table's geometry (docs/table-object.md).\n// A table resolves to world-space child objects — grid rules as `line`s and\n// one `text` per cell — so the painter, snapping and DXF export reuse their\n// existing per-type code (the block-instance pattern).\n//\n// Layout (wrapping and row heights) is measured with the DETERMINISTIC\n// approximate measurer, not a sink's: every output must agree on where rows\n// fall, so the cell text is pre-wrapped here and handed to the text painter\n// as explicit lines (the same reason the text painter lays out tab stops\n// with it). A canvas glyph run may over/underfill a line by the\n// approximation error instead.\n\nimport type {\n ModelObject,\n Table,\n Text,\n TextSpan,\n TextStyle,\n} from \"../model/objects\";\nimport { effectiveTextFont } from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { add, fromAngle, perp, scale } from \"../geometry/vec2\";\nimport { approximateTextMeasurer } from \"./textMeasurer\";\nimport { boundMeasurer, textBlock, type TextMeasurer } from \"./textMetrics\";\nimport { textHeight } from \"./textGeometry\";\nimport { richTextBlock, sliceSpans } from \"./richText\";\n\n/** One rule of the grid, in table-local coordinates (x right, y DOWN from\n * the top-left corner, scaled mm). */\ninterface LocalRule {\n a: Vec2;\n b: Vec2;\n header: boolean;\n}\n\nexport interface TableLayout {\n /** Column boundaries, local x (n + 1 values, from 0). */\n colX: number[];\n /** Row boundaries, local y downward (m + 1 values, from 0). */\n rowY: number[];\n /** World corners: top-left, top-right, bottom-right, bottom-left. */\n outline: Vec2[];\n /** Rules + cell texts as world objects (rules first, under the text). */\n children: ModelObject[];\n /** Anchor cells with their merged extents (merge-aware cell lookup). */\n anchors: { row: number; col: number; rows: number; cols: number }[];\n}\n\n/** Header rule weight when the table sets no lineWidth (ISO thick pen). */\nconst HEADER_RULE_MM = 0.5;\n\n/** Table-local point → world. */\nconst toWorld = (t: Table, p: Vec2): Vec2 => {\n const u = fromAngle(t.rotation);\n return add(add(t.position, scale(u, p.x)), scale(perp(u), -p.y));\n};\n\n/** The anchor index covering each grid slot (merges claim their area). */\nconst ownerGrid = (t: Table): number[][] => {\n const owner = t.cells.map((row) => row.map(() => -1));\n let next = 0;\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n if (owner[r][c] !== -1) return; // covered by an earlier merge\n const id = next++;\n const rows = cell.span?.rows ?? 1;\n const cols = cell.span?.cols ?? 1;\n for (let i = r; i < Math.min(r + rows, t.rows.length); i++)\n for (let j = c; j < Math.min(c + cols, t.columns.length); j++)\n if (owner[i][j] === -1) owner[i][j] = id;\n }),\n );\n return owner;\n};\n\n/** A cell's text as a stand-alone Text (styles merged over the table's),\n * not yet positioned. */\nconst cellText = (t: Table, row: number, col: number): Text => {\n const cell = t.cells[row][col];\n return {\n type: \"text\",\n id: `${t.id}:${row}:${col}`,\n layerId: t.layerId,\n position: { x: 0, y: 0 },\n content: cell.content,\n leaderLines: [],\n hAlign: \"center\",\n vAlign: \"center\",\n rotation: t.rotation,\n scale: t.scale,\n styleId: cell.styleId ?? t.styleId,\n styleOverride: { ...t.styleOverride, ...cell.styleOverride },\n ...(cell.color ? { color: cell.color } : {}),\n ...(t.opacity !== undefined ? { opacity: t.opacity } : {}),\n };\n};\n\n/** Word wrap leaves a single word wider than the cell on its own line,\n * running through the border; a cell breaks such a line between characters\n * instead (text objects keep word-only wrapping). */\nconst breakLongLines = (\n lines: string[],\n h: number,\n measure: TextMeasurer,\n width: number,\n): string[] =>\n lines.flatMap((line) => {\n if (measure.measureTextWidth(line, h) <= width) return [line];\n const out: string[] = [];\n let cur = \"\";\n for (const ch of line) {\n if (cur && measure.measureTextWidth(cur + ch, h) > width) {\n out.push(cur.trimEnd());\n cur = ch.trimStart();\n } else cur += ch;\n }\n if (cur) out.push(cur);\n return out;\n });\n\n/** Where a cell's text sits: its aligned anchor point inside the (merged)\n * cell rect, in world space, with the model alignment for it. */\nconst cellAnchor = (\n t: Table,\n colX: number[],\n rowY: number[],\n a: TableLayout[\"anchors\"][number],\n): Pick<Text, \"position\" | \"hAlign\" | \"vAlign\"> => {\n const cell = t.cells[a.row][a.col];\n const margin = t.cellMargin * t.scale;\n const x0 = colX[a.col] + margin;\n const x1 = colX[a.col + a.cols] - margin;\n const y0 = rowY[a.row] + margin;\n const y1 = rowY[a.row + a.rows] - margin;\n const h = cell.hAlign ?? \"left\";\n const v = cell.vAlign ?? \"center\";\n return {\n position: toWorld(t, {\n x: h === \"left\" ? x0 : h === \"right\" ? x1 : (x0 + x1) / 2,\n y: v === \"top\" ? y0 : v === \"bottom\" ? y1 : (y0 + y1) / 2,\n }),\n // The cell's justification is the text's: same edge on the point.\n hAlign: h,\n vAlign: v,\n };\n};\n\n/** A cell's editable frame: its text (styles merged, positioned as the\n * painter places it) and the wrap width inside the margins — what an\n * in-place editor needs to sit exactly over the painted text. `row`/`col`\n * may name any slot; a covered slot resolves to its merge anchor. */\nexport const tableCellFrame = (\n t: Table,\n textStyles: readonly TextStyle[],\n row: number,\n col: number,\n): { row: number; col: number; text: Text; innerWidth: number } => {\n const { colX, rowY, anchors } = tableLayout(t, textStyles);\n const a = anchors.find(\n (a) =>\n row >= a.row &&\n row < a.row + a.rows &&\n col >= a.col &&\n col < a.col + a.cols,\n ) ?? { row, col, rows: 1, cols: 1 };\n return {\n row: a.row,\n col: a.col,\n text: { ...cellText(t, a.row, a.col), ...cellAnchor(t, colX, rowY, a) },\n innerWidth: colX[a.col + a.cols] - colX[a.col] - 2 * t.cellMargin * t.scale,\n };\n};\n\nconst cache = new WeakMap<\n Table,\n { styles: readonly TextStyle[]; layout: TableLayout }\n>();\n\nexport const tableLayout = (\n t: Table,\n textStyles: readonly TextStyle[],\n): TableLayout => {\n const hit = cache.get(t);\n if (hit && hit.styles === textStyles) return hit.layout;\n\n const s = t.scale;\n const margin = t.cellMargin * s;\n const colX = [0];\n for (const w of t.columns) colX.push(colX[colX.length - 1] + w * s);\n\n // Anchors with their wrapped text.\n const owner = ownerGrid(t);\n const anchors: TableLayout[\"anchors\"] = [];\n const wrapped: { text: Text; lines: string[]; height: number }[] = [];\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n if (owner[r][c] !== anchors.length) return;\n const rows = Math.min(cell.span?.rows ?? 1, t.rows.length - r);\n const cols = Math.min(cell.span?.cols ?? 1, t.columns.length - c);\n anchors.push({ row: r, col: c, rows, cols });\n const text = cellText(t, r, c);\n const h = textHeight(text, textStyles);\n const { font, widthFactor } = effectiveTextFont(text, textStyles);\n const inner = colX[c + cols] - colX[c] - 2 * margin;\n if (cell.spans?.length) {\n // Formatted: wrap with per-run metrics, then join the lines like\n // the plain path with the spans carried over to the joined text.\n // ponytail: no mid-word breaking (breakLongLines) here — a word\n // wider than the cell overflows; port it to ranges if it bites.\n const rich = richTextBlock(\n cell.content,\n cell.spans,\n { face: font, heightMm: h, widthFactor },\n approximateTextMeasurer,\n approximateTextMeasurer,\n inner > 0 ? inner : undefined,\n );\n let content = \"\";\n const spans: TextSpan[] = [];\n rich.lines.forEach((l, k) => {\n if (k > 0) content += \"\\n\";\n spans.push(...sliceSpans(cell.spans, l.start, l.end, content.length));\n content += cell.content.slice(l.start, l.end);\n });\n wrapped.push({\n text: { ...text, spans },\n lines: [content],\n height: rich.height + 2 * margin,\n });\n return;\n }\n const measure = boundMeasurer(approximateTextMeasurer, font, widthFactor);\n const block = textBlock(\n cell.content,\n h,\n measure,\n inner > 0 ? inner : undefined,\n );\n const lines =\n inner > 0\n ? breakLongLines(block.lines, h, measure, inner)\n : block.lines;\n wrapped.push({\n text,\n lines,\n // An empty cell still reserves one line of its text height.\n height:\n (cell.content ? h + (lines.length - 1) * block.lineHeight : h) +\n 2 * margin,\n });\n }),\n );\n\n // Row heights: the floor, then single-row cells, then merges that still\n // don't fit grow their LAST row (in order of that row).\n const heights = t.rows.map((r) => (r.minHeight ?? 0) * s);\n anchors.forEach((a, i) => {\n if (a.rows === 1)\n heights[a.row] = Math.max(heights[a.row], wrapped[i].height);\n });\n anchors\n .map((a, i) => ({ a, need: wrapped[i].height }))\n .filter(({ a }) => a.rows > 1)\n .sort((x, y) => x.a.row + x.a.rows - (y.a.row + y.a.rows))\n .forEach(({ a, need }) => {\n let have = 0;\n for (let r = a.row; r < a.row + a.rows; r++) have += heights[r];\n if (have < need) heights[a.row + a.rows - 1] += need - have;\n });\n // Rows nobody sized (all covered by merges that fit) get the table's\n // one-line height so the grid never collapses.\n const oneLine = textHeight(cellText(t, 0, 0), textStyles) + 2 * margin;\n const rowY = [0];\n for (const h of heights) rowY.push(rowY[rowY.length - 1] + (h || oneLine));\n\n // Rules: boundaries between different owners (merges suppress their\n // interior), per the borders preset; collinear runs joined.\n const nr = t.rows.length;\n const nc = t.columns.length;\n const inner = t.borders === \"all\";\n const innerRows = t.borders === \"all\" || t.borders === \"rows\";\n const outer = t.borders !== \"none\";\n const rules: LocalRule[] = [];\n const run = (\n on: boolean[],\n seg: (k: number) => [Vec2, Vec2],\n header: boolean,\n ) => {\n let start = -1;\n for (let k = 0; k <= on.length; k++) {\n if (k < on.length && on[k]) {\n if (start === -1) start = k;\n continue;\n }\n if (start !== -1) {\n rules.push({ a: seg(start)[0], b: seg(k - 1)[1], header });\n start = -1;\n }\n }\n };\n for (let j = 0; j <= nc; j++) {\n const edge = j === 0 || j === nc;\n const on = Array.from({ length: nr }, (_, r) =>\n edge ? outer : inner && owner[r][j - 1] !== owner[r][j],\n );\n run(\n on,\n (r) => [\n { x: colX[j], y: rowY[r] },\n { x: colX[j], y: rowY[r + 1] },\n ],\n false,\n );\n }\n for (let i = 0; i <= nr; i++) {\n const edge = i === 0 || i === nr;\n const header = !edge && i === t.headerRows && outer;\n const on = Array.from({ length: nc }, (_, c) =>\n edge ? outer : (innerRows || header) && owner[i - 1][c] !== owner[i][c],\n );\n run(\n on,\n (c) => [\n { x: colX[c], y: rowY[i] },\n { x: colX[c + 1], y: rowY[i] },\n ],\n header,\n );\n }\n\n const children: ModelObject[] = rules.map((r, k) => ({\n type: \"line\",\n id: `${t.id}:rule:${k}`,\n layerId: t.layerId,\n a: toWorld(t, r.a),\n b: toWorld(t, r.b),\n ...(t.color ? { color: t.color } : {}),\n ...(t.opacity !== undefined ? { opacity: t.opacity } : {}),\n ...(r.header\n ? { lineWidth: t.lineWidth ? t.lineWidth * 2 : HEADER_RULE_MM }\n : t.lineWidth\n ? { lineWidth: t.lineWidth }\n : {}),\n }));\n\n // Cell texts at their aligned anchor points inside the merged rect.\n anchors.forEach((a, i) => {\n const { text, lines } = wrapped[i];\n if (!t.cells[a.row][a.col].content) return;\n children.push({\n ...text,\n ...cellAnchor(t, colX, rowY, a),\n content: lines.join(\"\\n\"),\n });\n });\n\n const w = colX[nc];\n const hTotal = rowY[nr];\n const layout: TableLayout = {\n colX,\n rowY,\n outline: [\n toWorld(t, { x: 0, y: 0 }),\n toWorld(t, { x: w, y: 0 }),\n toWorld(t, { x: w, y: hTotal }),\n toWorld(t, { x: 0, y: hTotal }),\n ],\n children,\n anchors,\n };\n cache.set(t, { styles: textStyles, layout });\n return layout;\n};\n","// AutoCAD Color Index mapping. Exports carry BOTH the nearest ACI (group 62,\n// legacy viewers) and the exact true color (group 420, wins where supported);\n// import resolves either back to hex.\n\nexport const hexToRgb = (hex: string): [number, number, number] | null => {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex);\n if (!m) return null;\n return [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16)];\n};\n\nexport const rgbToHex = (r: number, g: number, b: number): string =>\n `#${[r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\"),\n )\n .join(\"\")}`;\n\n// Full AutoCAD Color Index → hex palette (index 0 = ByBlock, 256 = ByLayer are\n// reserved and never looked up). Used on import to resolve an entity's ACI to a\n// concrete color. Generated from the standard ACAD palette.\nconst ACI_HEX: string[] = [\n \"#000000\",\n \"#ff0000\",\n \"#ffff00\",\n \"#00ff00\",\n \"#00ffff\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#ffffff\",\n \"#808080\",\n \"#c0c0c0\",\n \"#ff0000\",\n \"#ff7f7f\",\n \"#cc0000\",\n \"#cc6666\",\n \"#990000\",\n \"#994c4c\",\n \"#7f0000\",\n \"#7f3f3f\",\n \"#4c0000\",\n \"#4c2626\",\n \"#ff3f00\",\n \"#ff9f7f\",\n \"#cc3300\",\n \"#cc7f66\",\n \"#992600\",\n \"#995f4c\",\n \"#7f1f00\",\n \"#7f4f3f\",\n \"#4c1300\",\n \"#4c2f26\",\n \"#ff7f00\",\n \"#ffbf7f\",\n \"#cc6600\",\n \"#cc9966\",\n \"#994c00\",\n \"#99724c\",\n \"#7f3f00\",\n \"#7f5f3f\",\n \"#4c2600\",\n \"#4c3926\",\n \"#ffbf00\",\n \"#ffdf7f\",\n \"#cc9900\",\n \"#ccb266\",\n \"#997200\",\n \"#99854c\",\n \"#7f5f00\",\n \"#7f6f3f\",\n \"#4c3900\",\n \"#4c4226\",\n \"#ffff00\",\n \"#ffff7f\",\n \"#cccc00\",\n \"#cccc66\",\n \"#989800\",\n \"#98984c\",\n \"#7f7f00\",\n \"#7f7f3f\",\n \"#4c4c00\",\n \"#4c4c26\",\n \"#bfff00\",\n \"#dfff7f\",\n \"#99cc00\",\n \"#b2cc66\",\n \"#729800\",\n \"#85984c\",\n \"#5f7f00\",\n \"#6f7f3f\",\n \"#394c00\",\n \"#424c26\",\n \"#7fff00\",\n \"#bfff7f\",\n \"#66cc00\",\n \"#99cc66\",\n \"#4c9800\",\n \"#72984c\",\n \"#3f7f00\",\n \"#5f7f3f\",\n \"#264c00\",\n \"#394c26\",\n \"#3fff00\",\n \"#9fff7f\",\n \"#33cc00\",\n \"#7fcc66\",\n \"#269800\",\n \"#5f984c\",\n \"#1f7f00\",\n \"#4f7f3f\",\n \"#134c00\",\n \"#2f4c26\",\n \"#00ff00\",\n \"#7fff7f\",\n \"#00cc00\",\n \"#66cc66\",\n \"#009800\",\n \"#4c984c\",\n \"#007f00\",\n \"#3f7f3f\",\n \"#004c00\",\n \"#264c26\",\n \"#00ff3f\",\n \"#7fff9f\",\n \"#00cc33\",\n \"#66cc7f\",\n \"#009826\",\n \"#4c985f\",\n \"#007f1f\",\n \"#3f7f4f\",\n \"#004c13\",\n \"#264c2f\",\n \"#00ff7f\",\n \"#7fffbf\",\n \"#00cc66\",\n \"#66cc99\",\n \"#00984c\",\n \"#4c9872\",\n \"#007f3f\",\n \"#3f7f5f\",\n \"#004c26\",\n \"#264c39\",\n \"#00ffbf\",\n \"#7fffdf\",\n \"#00cc99\",\n \"#66ccb2\",\n \"#009872\",\n \"#4c9885\",\n \"#007f5f\",\n \"#3f7f6f\",\n \"#004c39\",\n \"#264c42\",\n \"#00ffff\",\n \"#7fffff\",\n \"#00cccc\",\n \"#66cccc\",\n \"#009898\",\n \"#4c9898\",\n \"#007f7f\",\n \"#3f7f7f\",\n \"#004c4c\",\n \"#264c4c\",\n \"#00bfff\",\n \"#7fdfff\",\n \"#0099cc\",\n \"#66b2cc\",\n \"#007298\",\n \"#4c8598\",\n \"#005f7f\",\n \"#3f6f7f\",\n \"#00394c\",\n \"#26424c\",\n \"#007fff\",\n \"#7fbfff\",\n \"#0066cc\",\n \"#6699cc\",\n \"#004c98\",\n \"#4c7298\",\n \"#003f7f\",\n \"#3f5f7f\",\n \"#00264c\",\n \"#26394c\",\n \"#003fff\",\n \"#7f9fff\",\n \"#0033cc\",\n \"#667fcc\",\n \"#002698\",\n \"#4c5f98\",\n \"#001f7f\",\n \"#3f4f7f\",\n \"#00134c\",\n \"#262f4c\",\n \"#0000ff\",\n \"#7f7fff\",\n \"#0000cc\",\n \"#6666cc\",\n \"#000098\",\n \"#4c4c98\",\n \"#00007f\",\n \"#3f3f7f\",\n \"#00004c\",\n \"#26264c\",\n \"#3f00ff\",\n \"#9f7fff\",\n \"#3300cc\",\n \"#7f66cc\",\n \"#260098\",\n \"#5f4c98\",\n \"#1f007f\",\n \"#4f3f7f\",\n \"#13004c\",\n \"#2f264c\",\n \"#7f00ff\",\n \"#bf7fff\",\n \"#6600cc\",\n \"#9966cc\",\n \"#4c0098\",\n \"#724c98\",\n \"#3f007f\",\n \"#5f3f7f\",\n \"#26004c\",\n \"#39264c\",\n \"#bf00ff\",\n \"#df7fff\",\n \"#9900cc\",\n \"#b266cc\",\n \"#720098\",\n \"#854c98\",\n \"#5f007f\",\n \"#6f3f7f\",\n \"#39004c\",\n \"#42264c\",\n \"#ff00ff\",\n \"#ff7fff\",\n \"#cc00cc\",\n \"#cc66cc\",\n \"#980098\",\n \"#984c98\",\n \"#7f007f\",\n \"#7f3f7f\",\n \"#4c004c\",\n \"#4c264c\",\n \"#ff00bf\",\n \"#ff7fdf\",\n \"#cc0099\",\n \"#cc66b2\",\n \"#980072\",\n \"#984c85\",\n \"#7f005f\",\n \"#7f3f6f\",\n \"#4c0039\",\n \"#4c2642\",\n \"#ff007f\",\n \"#ff7fbf\",\n \"#cc0066\",\n \"#cc6699\",\n \"#98004c\",\n \"#984c72\",\n \"#7f003f\",\n \"#7f3f5f\",\n \"#4c0026\",\n \"#4c2639\",\n \"#ff003f\",\n \"#ff7f9f\",\n \"#cc0033\",\n \"#cc667f\",\n \"#980026\",\n \"#984c5f\",\n \"#7f001f\",\n \"#7f3f4f\",\n \"#4c0013\",\n \"#4c262f\",\n \"#333333\",\n \"#5b5b5b\",\n \"#848484\",\n \"#adadad\",\n \"#d6d6d6\",\n \"#ffffff\",\n];\n\n/** Concrete ACI index (1–255) → hex; ByBlock/ByLayer/out-of-range → undefined. */\nexport const aciToHex = (index: number): string | undefined =>\n index > 0 && index < 256 ? ACI_HEX[index] : undefined;\n\n// RGB triples for the palette above, decoded once (index 0 stays unused).\nconst ACI_RGB: [number, number, number][] = ACI_HEX.map(\n (hex) => hexToRgb(hex) ?? [0, 0, 0],\n);\n\n/** Nearest ACI index (1–255, full palette) for a hex color. */\nexport const nearestAci = (hex: string): number => {\n const rgb = hexToRgb(hex);\n if (!rgb) return 7;\n let best = 7;\n let bestD = Infinity;\n for (let index = 1; index < 256; index++) {\n const c = ACI_RGB[index];\n const d =\n (rgb[0] - c[0]) ** 2 + (rgb[1] - c[1]) ** 2 + (rgb[2] - c[2]) ** 2;\n if (d < bestD) {\n bestD = d;\n best = index;\n }\n }\n return best;\n};\n\n/** Hex → packed 24-bit true color (DXF group 420); null for invalid hex. */\nexport const hexToTrueColor = (hex: string): number | null => {\n const rgb = hexToRgb(hex);\n return rgb ? (rgb[0] << 16) | (rgb[1] << 8) | rgb[2] : null;\n};\n","// DXF codecs: each mapping between a DXF value and the Linea model, BOTH\n// directions in one place, so an export reads back as what was written\n// (codecs.test.ts round-trips them). The import (import/dxf) decodes, the\n// export (export/dxf) encodes.\n\nimport type { TextSpan } from \"../../model/objects\";\nimport {\n fontFromDxfStyle,\n fontTypeface,\n parseFontFace,\n resolveFont,\n} from \"../../model/fonts\";\nimport { normalizeSpans, type SpanAttrs } from \"../../paint/richText\";\nimport { aciToHex, nearestAci } from \"./aci\";\n\n// --- lineweight (group 370, 1/100 mm) ---------------------------------------\n\n/** The DXF lineweight enum. */\nexport const LINE_WEIGHTS = [\n 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106,\n 120, 140, 158, 200, 211,\n];\n\n/** Group 370 → mm. Negative values inherit; 0 (\"thinnest\") is the finest\n * ISO pen, 0.05 mm. */\nexport const lineWeightToMm = (\n lineWeight: number | undefined,\n): number | undefined =>\n lineWeight === undefined || lineWeight < 0\n ? undefined\n : Math.max(lineWeight, 5) / 100;\n\n/** mm → the nearest enum value. */\nexport const mmToLineWeight = (mm: number): number =>\n LINE_WEIGHTS.reduce((best, w) =>\n Math.abs(w - mm * 100) < Math.abs(best - mm * 100) ? w : best,\n );\n\n// --- TEXT / MTEXT content ----------------------------------------------------\n\n/** Escape MTEXT specials, encode line breaks as \\P and tabs as ^I (the\n * caret control code AutoCAD stores tabs as — cleanText decodes it back).\n * A literal caret is \"^ \" (the DXF convention), so \"^I\" typed as text\n * reads back as written.\n * ponytail: a literal \"%%d\"/\"%%p\"/\"%%c\" still reads back as °/±/Ø — escaping\n * it (\"%%%\") would show as \"%%%\" in AutoCAD's MTEXT; worth it only if\n * someone types those codes as text. */\nexport const encodeMtext = (s: string): string =>\n s\n // A Windows line ending (pasted or agent-written text) is ONE break; a\n // stray CR is dropped — a raw CR inside a DXF value ends the line for a\n // strict reader (AutoCAD), shifting every following group code.\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\")\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\{/g, \"\\\\{\")\n .replace(/\\}/g, \"\\\\}\")\n .replace(/\\^/g, \"^ \")\n .replace(/\\n/g, \"\\\\P\")\n .replace(/\\t/g, \"^I\");\n\n/** Decode classic %%-escapes used in TEXT (°, ±, Ø; %%u/%%o toggles drop). */\nexport const decodeTextEscapes = (text: string): string =>\n text.replace(/%%([dpcuo%])/gi, (_, ch: string) => {\n switch (ch.toLowerCase()) {\n case \"d\":\n return \"°\";\n case \"p\":\n return \"±\";\n case \"c\":\n return \"Ø\";\n case \"u\":\n case \"o\":\n return \"\";\n default:\n return \"%\";\n }\n });\n\nconst SUPERSCRIPT: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"+\": \"⁺\",\n \"-\": \"⁻\",\n \"=\": \"⁼\",\n \"(\": \"⁽\",\n \")\": \"⁾\",\n n: \"ⁿ\",\n i: \"ⁱ\",\n};\nconst SUBSCRIPT: Record<string, string> = {\n \"0\": \"₀\",\n \"1\": \"₁\",\n \"2\": \"₂\",\n \"3\": \"₃\",\n \"4\": \"₄\",\n \"5\": \"₅\",\n \"6\": \"₆\",\n \"7\": \"₇\",\n \"8\": \"₈\",\n \"9\": \"₉\",\n \"+\": \"₊\",\n \"-\": \"₋\",\n \"=\": \"₌\",\n \"(\": \"₍\",\n \")\": \"₎\",\n};\n/** Script form when every character has one, else the plain text. */\nconst toScript = (s: string, map: Record<string, string>): string =>\n [...s].every((c) => map[c]) ? [...s].map((c) => map[c]).join(\"\") : s;\n\n/**\n * MTEXT stack `\\Stop^bottom;` / `\\Stop#bottom;` / `\\Stop/bottom;`. An empty\n * bottom is AutoCAD's superscript (`m\\S2^;` = m²), an empty top its subscript\n * (`λ\\S^D;` = λ with subscript D); both present is a fraction or tolerance\n * stack → \"a/b\".\n */\nconst stackText = (body: string): string => {\n const m = /^(.*?)([\\^#/])(.*)$/s.exec(body);\n if (!m) return body;\n const top = m[1].trim();\n const bottom = m[3].trim();\n if (top && !bottom) return toScript(top, SUPERSCRIPT);\n if (!top && bottom) return toScript(bottom, SUBSCRIPT);\n return `${top}/${bottom}`;\n};\n\n/** Symbol-font (symbol.ttf / \\fSymbol) code points → the glyphs they draw. */\nconst SYMBOL_FONT: Record<string, string> = {\n a: \"α\",\n b: \"β\",\n c: \"χ\",\n d: \"δ\",\n e: \"ε\",\n f: \"φ\",\n g: \"γ\",\n h: \"η\",\n i: \"ι\",\n k: \"κ\",\n l: \"λ\",\n m: \"μ\",\n n: \"ν\",\n p: \"π\",\n q: \"θ\",\n r: \"ρ\",\n s: \"σ\",\n t: \"τ\",\n u: \"υ\",\n w: \"ω\",\n x: \"ξ\",\n y: \"ψ\",\n z: \"ζ\",\n D: \"Δ\",\n F: \"Φ\",\n G: \"Γ\",\n L: \"Λ\",\n P: \"Π\",\n Q: \"Θ\",\n S: \"Σ\",\n W: \"Ω\",\n X: \"Ξ\",\n Y: \"Ψ\",\n \"£\": \"≤\",\n \"³\": \"≥\",\n \"¹\": \"≠\",\n \"»\": \"≈\",\n \"¥\": \"∞\",\n \"´\": \"×\",\n \"¸\": \"÷\",\n Ö: \"√\",\n \"®\": \"→\",\n \"¬\": \"←\",\n Æ: \"∅\",\n Î: \"∈\",\n \"¶\": \"∂\",\n};\n/** True for an inline \\f font code naming the Symbol font (\"Symbol|b0|i0\"). */\nconst isSymbolFont = (fontCode: string): boolean =>\n /^symbol(\\.ttf)?$/i.test(fontCode.split(\"|\")[0].trim());\n\n/** Formatting state while scanning MTEXT (one per `{…}` scope). */\ninterface MtextState {\n symbol: boolean;\n font?: string;\n bold?: boolean;\n italic?: boolean;\n /** × the entity height. */\n height?: number;\n color?: string;\n underline?: boolean;\n}\n\n/** One decoded stretch of MTEXT with uniform formatting. */\ninterface MtextChunk {\n text: string;\n attrs: SpanAttrs;\n}\n\n/**\n * Scan MTEXT inline codes. Without `opts`: the plain-text reduction (stacks\n * as Unicode super/subscripts, formatting dropped). With `opts`: formatting\n * kept per chunk — font (\\f), height (\\H, as a ratio of `heightMm`), ACI\n * colour (\\C), underline (\\L…\\l) and \\S super/subscripts as `script`.\n * ponytail: true colour (\\c) and oblique/tracking/width (\\Q \\T \\W) inside a\n * run are dropped; map them when a drawing needs it.\n */\nconst scanMtext = (text: string, opts?: { heightMm: number }): MtextChunk[] => {\n const chunks: MtextChunk[] = [];\n let st: MtextState = { symbol: false };\n const stack: MtextState[] = [];\n const attrs = (extra?: Partial<SpanAttrs>): SpanAttrs =>\n opts\n ? {\n ...(st.font !== undefined ? { font: st.font } : {}),\n ...(st.bold !== undefined ? { bold: st.bold } : {}),\n ...(st.italic !== undefined ? { italic: st.italic } : {}),\n ...(st.height !== undefined ? { height: st.height } : {}),\n ...(st.color !== undefined ? { color: st.color } : {}),\n ...(st.underline ? { underline: true } : {}),\n ...extra,\n }\n : {};\n const emit = (t: string, extra?: Partial<SpanAttrs>) => {\n if (!t) return;\n const a = attrs(extra);\n const last = chunks[chunks.length - 1];\n if (!extra && last && JSON.stringify(last.attrs) === JSON.stringify(a))\n last.text += t;\n else chunks.push({ text: t, attrs: a });\n };\n /** A `\\X…;` code's body starting at i; [body, index after \";\"], or\n * [\"\", i] when unterminated. */\n const codeBody = (i: number): [string, number] => {\n const end = text.indexOf(\";\", i);\n return end === -1 ? [\"\", i] : [text.slice(i, end), end + 1];\n };\n let i = 0;\n while (i < text.length) {\n const ch = text[i];\n if (ch === \"{\") {\n stack.push(st);\n st = { ...st };\n i++;\n } else if (ch === \"}\") {\n st = stack.pop() ?? st;\n i++;\n } else if (ch !== \"\\\\\") {\n emit(st.symbol ? (SYMBOL_FONT[ch] ?? ch) : ch);\n i++;\n } else {\n const next = text[i + 1] ?? \"\";\n if (next === \"\\\\\" || next === \"{\" || next === \"}\") {\n emit(next); // escaped literal\n i += 2;\n } else if (next === \"P\") {\n emit(\"\\n\"); // paragraph break\n i += 2;\n } else if (next === \"~\") {\n emit(\" \"); // non-breaking space\n i += 2;\n } else if (next === \"L\" || next === \"l\") {\n st = { ...st, underline: next === \"L\" };\n i += 2;\n } else if (\"OoKk\".includes(next)) {\n i += 2; // overline/strike toggles (no \";\")\n } else if (next === \"S\") {\n // Stack: fraction \\S1^2; / \\S1#2; → \"1/2\"; superscript \\S2^; and\n // subscript \\S^2; → a script span, or \"²\" / \"₂\" in plain text.\n const [body, at] = codeBody(i + 2);\n const m = /^(.*?)([\\^#/])(.*)$/s.exec(body);\n const top = m?.[1].trim() ?? \"\";\n const bottom = m?.[3].trim() ?? \"\";\n if (opts && m && m[2] === \"^\" && top && !bottom)\n emit(top, { script: \"super\" });\n else if (opts && m && m[2] === \"^\" && !top && bottom)\n emit(bottom, { script: \"sub\" });\n else emit(stackText(body));\n i = at === i + 2 ? i + 2 : at;\n } else if (\n (next === \"U\" || next === \"u\") &&\n /^\\+[0-9a-fA-F]{4}/.test(text.slice(i + 2, i + 7))\n ) {\n // Unicode escape \\U+2265 → \"≥\". It has no \";\" terminator, so the\n // generic branch below would swallow the text up to the next \";\".\n emit(String.fromCodePoint(parseInt(text.slice(i + 3, i + 7), 16)));\n i += 7;\n } else if (next === \"f\" || next === \"F\") {\n // Font switch \\fSymbol|b0|i0;… — Symbol glyphs need mapping.\n const [body, at] = codeBody(i + 2);\n st = { ...st, symbol: isSymbolFont(body) };\n if (opts && !st.symbol && body) {\n const [name, ...flags] = body.split(\"|\");\n const file = name.includes(\".\");\n const face = fontFromDxfStyle(\n file ? name : undefined,\n file ? undefined : name,\n );\n const flag = (k: string) => flags.find((f) => f[0] === k)?.slice(1);\n st.font = face.font;\n st.bold = flag(\"b\") !== undefined ? flag(\"b\") === \"1\" : face.bold;\n st.italic = flag(\"i\") !== undefined ? flag(\"i\") === \"1\" : face.italic;\n }\n i = at === i + 2 ? i + 2 : at;\n } else if (opts && next === \"H\") {\n // \\H2.5; absolute height, \\H0.7x; relative to the current one.\n const [body, at] = codeBody(i + 2);\n const v = Number.parseFloat(body);\n if (Number.isFinite(v) && v > 0)\n st = {\n ...st,\n height: /x$/i.test(body)\n ? (st.height ?? 1) * v\n : v / (opts.heightMm > 0 ? opts.heightMm : v),\n };\n i = at === i + 2 ? i + 2 : at;\n } else if (opts && next === \"C\") {\n const [body, at] = codeBody(i + 2);\n st = { ...st, color: aciToHex(Number.parseInt(body, 10)) };\n i = at === i + 2 ? i + 2 : at;\n } else {\n // Other \\X…; formatting codes (\\H… \\C… \\p…) — skip through \";\".\n const end = text.indexOf(\";\", i + 1);\n i = end === -1 ? i + 2 : end + 1;\n }\n }\n }\n return chunks;\n};\n\n/** Reduce MTEXT inline formatting codes to plain text (line breaks kept). */\nconst stripMtextCodes = (text: string): string =>\n scanMtext(text)\n .map((c) => c.text)\n .join(\"\");\n\n/** First inline \\W width-factor code, if any (\"\\W0.8;\" -> 0.8). */\nexport const mtextWidthFactor = (text: string): number | undefined => {\n const m = /\\\\W([0-9.]+);/.exec(text);\n const v = m ? Number(m[1]) : NaN;\n return Number.isFinite(v) && v > 0 && v !== 1 ? v : undefined;\n};\n\n/** Bold / italic from the first inline \\f font code\n * (\"{\\fArial|b1|i0|c0|p34;…}\" → { bold: true }); only flags that are ON. */\nexport const mtextFontFlags = (\n text: string,\n): { bold?: true; italic?: true } => {\n const m = /\\\\f[^|;]*((?:\\|[a-z]\\d+)*)/.exec(text);\n if (!m) return {};\n return {\n ...(/\\|b1/.test(m[1]) ? { bold: true as const } : {}),\n ...(/\\|i1/.test(m[1]) ? { italic: true as const } : {}),\n };\n};\n\n/**\n * Decode the caret control codes AutoCAD embeds in TEXT/MTEXT: `^I` is a tab,\n * `^J`/`^M` are line breaks, `^ ` a literal caret. Undecoded, the `^I` shows\n * up as a stray \"^|\" (the capital I reads as a pipe). Literal CR/LF are\n * normalized to \"\\n\" as well. One left-to-right pass, so \"^ I\" stays \"^I\".\n */\nconst decodeControlCodes = (text: string): string =>\n text.replace(/\\^M\\^J|\\^[IJM ]|\\r\\n?/g, (m) =>\n m === \"^I\" ? \"\\t\" : m === \"^ \" ? \"^\" : \"\\n\",\n );\n\n/**\n * Full TEXT/MTEXT content cleanup: MTEXT inline codes (MTEXT only) → classic\n * %%-escapes → caret control codes. Decoded tabs (`^I` → `\\t`) are KEPT:\n * the renderer aligns them at tab stops (paint/textMetrics), so imported\n * tabular text stays tabular. Exported for unit testing.\n */\nexport const cleanText = (raw: string, mtext: boolean): string =>\n decodeControlCodes(decodeTextEscapes(mtext ? stripMtextCodes(raw) : raw));\n\n/**\n * MTEXT → plain text + character spans (docs/rich-text.md §7): cleanText's\n * decoding per formatted chunk, offsets into the decoded text. `heightMm`\n * is the entity height (\\H absolute heights become ratios of it).\n */\nexport const cleanRichText = (\n raw: string,\n heightMm: number,\n): { content: string; spans: TextSpan[] } => {\n let content = \"\";\n const spans: TextSpan[] = [];\n for (const c of scanMtext(raw, { heightMm })) {\n const text = decodeControlCodes(decodeTextEscapes(c.text));\n spans.push({\n start: content.length,\n end: content.length + text.length,\n ...c.attrs,\n });\n content += text;\n }\n return { content, spans: normalizeSpans(spans, content) };\n};\n\n/** Stack text: MTEXT escapes plus the stack separators and terminator. */\nconst encodeStack = (s: string): string =>\n encodeMtext(s).replace(/[#/;]/g, (c) => `\\\\${c}`);\n\n/**\n * Text + spans → MTEXT inline codes: each formatted run in its own `{…}`\n * group (\\f font|b|i, \\H<ratio>x, \\C nearest ACI, \\L underline, \\S stacks\n * for scripts). `face` is the text's base face (bold/italic a run doesn't\n * set come from it).\n */\nexport const encodeRichMtext = (\n content: string,\n spans: readonly TextSpan[],\n face: string | undefined,\n): string => {\n const base = parseFontFace(face);\n let out = \"\";\n let at = 0;\n for (const s of normalizeSpans(spans, content)) {\n out += encodeMtext(content.slice(at, s.start));\n const fontCode =\n s.font !== undefined || s.bold !== undefined || s.italic !== undefined\n ? `\\\\f${fontTypeface(resolveFont(s.font ?? base.font))}|b${\n (s.bold ?? base.bold) ? 1 : 0\n }|i${(s.italic ?? base.italic) ? 1 : 0};`\n : \"\";\n const codes =\n fontCode +\n (s.height !== undefined ? `\\\\H${s.height}x;` : \"\") +\n (s.color ? `\\\\C${nearestAci(s.color)};` : \"\") +\n (s.underline ? \"\\\\L\" : \"\");\n const body = content.slice(s.start, s.end);\n // A stack holds one line: scripts over line breaks / tabs stay plain.\n const text =\n s.script && !/[\\n\\t]/.test(body)\n ? s.script === \"super\"\n ? `\\\\S${encodeStack(body)}^;`\n : `\\\\S^${encodeStack(body)};`\n : encodeMtext(body);\n out += codes || s.script ? `{${codes}${text}}` : text;\n at = s.end;\n }\n return out + encodeMtext(content.slice(at));\n};\n","// Hand-rolled DXF pieces @tarikjabiri/dxf lacks: the paper-space VIEWPORT\n// entity, LAYOUT objects (ACAD_LAYOUT dictionary), and MULTILEADER +\n// MLEADERSTYLE. All hook into the writer through its public extension points\n// (EntitiesManager.addEntity / DxfObjectsSection.addObject) so handles and\n// owner wiring stay consistent. The MULTILEADER tag stream mirrors ezdxf's\n// output (AutoCAD-validated) field for field.\n\nimport { Point, DxfObject, type Dxfier } from \"@tarikjabiri/dxf\";\n\n/** Raw AutoCAD color values (0xC?000000 method markers). */\nconst RAW_COLOR_BY_BLOCK = -1056964608;\nconst RAW_COLOR_NONE = -939524096;\n\n/** Zoom-lock bit of the VIEWPORT status flags (group 90). */\nconst VIEWPORT_LOCKED_FLAG = 16384;\n\ninterface ViewportEntityArgs {\n /** Viewport center on the sheet (paper mm). */\n center: { x: number; y: number };\n /** Frame size on the sheet (paper mm). */\n width: number;\n height: number;\n /** Model-space point shown at the viewport center. */\n viewCenter: { x: number; y: number };\n /** Model-space height visible through the frame (sets the scale). */\n viewHeight: number;\n /** 1 is the layout's own paper view; real viewports count from 2. */\n id: number;\n /** Stacking status; > 0 means on. */\n status: number;\n locked: boolean;\n /** Handles of layers frozen in this viewport (group 331). */\n frozenLayerHandles: string[];\n}\n\n/**\n * Paper-space VIEWPORT entity. Extends the writer's Point only to inherit the\n * Entity plumbing (handle, owner block record, common-group emission) — the\n * whole AcDbViewport body is emitted by dxfyChild.\n */\nexport class ViewportEntity extends Point {\n private readonly args: ViewportEntityArgs;\n\n constructor(args: ViewportEntityArgs) {\n super(args.center.x, args.center.y, 0);\n this.args = args;\n // The base Entity emits these (0 VIEWPORT … 100 AcDbViewport).\n this.type = \"VIEWPORT\";\n this.subclassMarker = \"AcDbViewport\";\n }\n\n override dxfyChild(dx: Dxfier): void {\n const a = this.args;\n dx.push(10, a.center.x);\n dx.push(20, a.center.y);\n dx.push(30, 0);\n dx.push(40, a.width);\n dx.push(41, a.height);\n dx.push(68, a.status);\n dx.push(69, a.id);\n dx.push(12, a.viewCenter.x);\n dx.push(22, a.viewCenter.y);\n dx.push(13, 0);\n dx.push(23, 0);\n dx.push(14, 10);\n dx.push(24, 10);\n dx.push(15, 10);\n dx.push(25, 10);\n dx.push(16, 0);\n dx.push(26, 0);\n dx.push(36, 1);\n dx.push(17, 0);\n dx.push(27, 0);\n dx.push(37, 0);\n dx.push(42, 50);\n dx.push(43, 0);\n dx.push(44, 0);\n dx.push(45, a.viewHeight);\n dx.push(50, 0);\n dx.push(51, 0);\n dx.push(72, 100);\n for (const handle of a.frozenLayerHandles) dx.push(331, handle);\n dx.push(90, a.locked ? VIEWPORT_LOCKED_FLAG : 0);\n dx.push(281, 0);\n dx.push(71, 1);\n dx.push(74, 0);\n }\n}\n\ninterface LayoutObjectArgs {\n name: string;\n /** 0 = Model tab; paper layouts count from 1, in tab order. */\n tabOrder: number;\n /** Sheet size in mm (PlotSettings always stores mm). */\n paperWidth: number;\n paperHeight: number;\n /** BLOCK_RECORD handle of the space this layout owns. */\n blockRecordHandle: string;\n}\n\n/**\n * LAYOUT object (AcDbPlotSettings + AcDbLayout) for the OBJECTS section.\n * The writer only provides generic dictionaries, so the body is emitted by\n * hand; margins and plot flags use plain defaults.\n */\nexport class LayoutObject extends DxfObject {\n private readonly args: LayoutObjectArgs;\n\n constructor(args: LayoutObjectArgs) {\n super(\"LAYOUT\");\n this.args = args;\n }\n\n override dxfy(dx: Dxfier): void {\n const a = this.args;\n dx.push(0, \"LAYOUT\");\n dx.push(5, this.handle);\n dx.push(330, this.ownerObjecthandle);\n dx.push(100, \"AcDbPlotSettings\");\n dx.push(1, \"\");\n dx.push(2, \"none_device\");\n dx.push(4, \"\");\n dx.push(6, \"\");\n dx.push(40, 0);\n dx.push(41, 0);\n dx.push(42, 0);\n dx.push(43, 0);\n dx.push(44, a.paperWidth);\n dx.push(45, a.paperHeight);\n dx.push(46, 0);\n dx.push(47, 0);\n dx.push(48, 0);\n dx.push(49, 0);\n dx.push(140, 0);\n dx.push(141, 0);\n dx.push(142, 1);\n dx.push(143, 1);\n dx.push(70, 688);\n dx.push(72, 1); // plot paper units: millimeters\n dx.push(73, 0);\n dx.push(74, 5);\n dx.push(7, \"\");\n dx.push(75, 16);\n dx.push(147, 1);\n dx.push(148, 0);\n dx.push(149, 0);\n dx.push(100, \"AcDbLayout\");\n dx.push(1, a.name);\n dx.push(70, 1);\n dx.push(71, a.tabOrder);\n dx.push(10, 0);\n dx.push(20, 0);\n dx.push(11, a.paperWidth);\n dx.push(21, a.paperHeight);\n dx.push(12, 0);\n dx.push(22, 0);\n dx.push(32, 0);\n dx.push(14, 0);\n dx.push(24, 0);\n dx.push(34, 0);\n dx.push(15, a.paperWidth);\n dx.push(25, a.paperHeight);\n dx.push(35, 0);\n dx.push(146, 0);\n dx.push(13, 0);\n dx.push(23, 0);\n dx.push(33, 0);\n dx.push(16, 1);\n dx.push(26, 0);\n dx.push(36, 0);\n dx.push(17, 0);\n dx.push(27, 1);\n dx.push(37, 0);\n dx.push(76, 0);\n dx.push(330, a.blockRecordHandle);\n }\n}\n\ninterface MultiLeaderArgs {\n /**\n * Leader lines in local order (primary first). Vertices run arrow tip →\n * junction; the shared junction itself is NOT included (it's the LEADER\n * node's \"last point\").\n */\n lines: { x: number; y: number }[][];\n /** Common junction where all lines meet (primary line's last point). */\n junction: { x: number; y: number };\n /** Dogleg from the junction toward the text (unit direction + length). */\n doglegDirection: { x: number; y: number };\n doglegLength: number;\n /** MTEXT-escaped note content. */\n content: string;\n /**\n * Base sizes BEFORE scale. The writer multiplies them by overallScale for\n * the stored tags — CONTEXT_DATA and entity-level override sizes hold\n * FINAL values in DXF; group 40/45 record the factor for later edits.\n */\n textHeight: number;\n arrowSize: number;\n overallScale: number;\n /** Text insertion point (past the dogleg). */\n textLocation: { x: number; y: number };\n /** Handles resolved by the exporter. */\n styleHandle: string;\n textStyleHandle: string;\n lineTypeHandle: string;\n /** Text attachment point 1–9 (TL TC TR / ML MC MR / BL BC BR, like MTEXT\n * group 71): which corner of the note sits at the text location. */\n attachment: number;\n}\n\n/**\n * MULTILEADER entity (mtext content + N leader lines). Tag order mirrors\n * ezdxf's writer output; the entity-level property-override mask is all-ones\n * so the values here win over the referenced MLEADERSTYLE.\n */\nexport class MultiLeaderEntity extends Point {\n private readonly args: MultiLeaderArgs;\n\n constructor(args: MultiLeaderArgs) {\n super(args.junction.x, args.junction.y, 0);\n this.args = args;\n this.type = \"MULTILEADER\";\n this.subclassMarker = \"AcDbMLeader\";\n }\n\n override dxfyChild(dx: Dxfier): void {\n const a = this.args;\n dx.push(270, 2); // version\n dx.push(300, \"CONTEXT_DATA{\");\n dx.push(40, a.overallScale); // overall scale (multiplies all sizes)\n // Content base point = end of the dogleg.\n dx.push(10, a.junction.x + a.doglegDirection.x * a.doglegLength);\n dx.push(20, a.junction.y + a.doglegDirection.y * a.doglegLength);\n dx.push(30, 0);\n dx.push(41, a.textHeight * a.overallScale);\n dx.push(140, a.arrowSize * a.overallScale);\n dx.push(145, 2 * a.overallScale); // landing gap\n dx.push(174, 1);\n dx.push(175, 1);\n dx.push(176, 0);\n dx.push(177, 0);\n dx.push(290, 1); // has mtext content\n dx.push(304, a.content);\n dx.push(11, 0);\n dx.push(21, 0);\n dx.push(31, 1); // text normal\n dx.push(340, a.textStyleHandle);\n dx.push(12, a.textLocation.x);\n dx.push(22, a.textLocation.y);\n dx.push(32, 0);\n dx.push(13, 1);\n dx.push(23, 0);\n dx.push(33, 0); // text direction\n dx.push(42, 0); // rotation\n dx.push(43, 0); // width\n dx.push(44, 0);\n dx.push(45, 1);\n dx.push(170, 1);\n dx.push(90, RAW_COLOR_BY_BLOCK); // text color\n dx.push(171, a.attachment); // text attachment point\n dx.push(172, 1); // flow direction\n dx.push(91, RAW_COLOR_NONE); // background fill color\n dx.push(141, 1.5);\n dx.push(92, 0);\n dx.push(291, 0);\n dx.push(292, 0);\n dx.push(173, 0);\n dx.push(293, 0);\n dx.push(142, 0);\n dx.push(143, 0);\n dx.push(294, 0);\n dx.push(295, 1);\n dx.push(296, 0);\n dx.push(110, 0);\n dx.push(120, 0);\n dx.push(130, 0); // plane origin\n dx.push(111, 1);\n dx.push(121, 0);\n dx.push(131, 0); // plane x axis\n dx.push(112, 0);\n dx.push(122, 1);\n dx.push(132, 0); // plane y axis\n dx.push(297, 0);\n dx.push(302, \"LEADER{\");\n dx.push(290, 1); // has last leader point\n dx.push(291, 1); // has dogleg\n dx.push(10, a.junction.x);\n dx.push(20, a.junction.y);\n dx.push(30, 0);\n dx.push(11, a.doglegDirection.x);\n dx.push(21, a.doglegDirection.y);\n dx.push(31, 0);\n dx.push(90, 0); // branch index\n dx.push(40, a.doglegLength);\n a.lines.forEach((line, i) => {\n dx.push(304, \"LEADER_LINE{\");\n for (const p of line) {\n dx.push(10, p.x);\n dx.push(20, p.y);\n dx.push(30, 0);\n }\n dx.push(91, i); // line index\n dx.push(92, RAW_COLOR_BY_BLOCK);\n dx.push(305, \"}\");\n });\n dx.push(303, \"}\");\n dx.push(301, \"}\");\n dx.push(340, a.styleHandle);\n dx.push(90, 2147483647); // property override flags: entity values win\n dx.push(170, 1); // straight leader lines\n dx.push(91, RAW_COLOR_BY_BLOCK);\n dx.push(341, a.lineTypeHandle);\n dx.push(171, -2); // lineweight ByBlock\n dx.push(290, 1); // landing enabled\n dx.push(291, 1); // dogleg enabled\n dx.push(41, a.doglegLength);\n dx.push(42, a.arrowSize * a.overallScale);\n dx.push(172, 2); // content type: mtext\n dx.push(343, a.textStyleHandle);\n dx.push(173, 1);\n dx.push(95, 1);\n dx.push(174, 1);\n dx.push(175, 0);\n dx.push(92, RAW_COLOR_BY_BLOCK);\n dx.push(292, 0);\n dx.push(93, RAW_COLOR_BY_BLOCK);\n dx.push(10, 1);\n dx.push(20, 1);\n dx.push(30, 1); // block content scale\n dx.push(43, 0);\n dx.push(176, 0);\n dx.push(293, 0);\n dx.push(294, 0);\n dx.push(178, 0);\n dx.push(179, 1);\n dx.push(45, a.overallScale); // entity scale, consistent with context 40\n }\n}\n\ninterface MLeaderStyleArgs {\n name: string;\n textStyleHandle: string;\n arrowSize: number;\n textHeight: number;\n /** ACAD_MLEADERSTYLE dictionary handle (owner + reactor). */\n dictionaryHandle: string;\n}\n\n/**\n * Minimal MLEADERSTYLE (mirrors ezdxf's \"Standard\"). Entities override every\n * property anyway (mask above), so the style mostly satisfies referential\n * integrity.\n */\nexport class MLeaderStyleObject extends DxfObject {\n private readonly args: MLeaderStyleArgs;\n\n constructor(args: MLeaderStyleArgs) {\n super(\"MLEADERSTYLE\");\n this.args = args;\n }\n\n override dxfy(dx: Dxfier): void {\n const a = this.args;\n dx.push(0, \"MLEADERSTYLE\");\n dx.push(5, this.handle);\n dx.push(102, \"{ACAD_REACTORS\");\n dx.push(330, a.dictionaryHandle);\n dx.push(102, \"}\");\n dx.push(330, a.dictionaryHandle);\n dx.push(100, \"AcDbMLeaderStyle\");\n dx.push(179, 2);\n dx.push(170, 2);\n dx.push(171, 1);\n dx.push(172, 0);\n dx.push(90, 2);\n dx.push(40, 0);\n dx.push(41, 0);\n dx.push(173, 1);\n dx.push(91, RAW_COLOR_BY_BLOCK);\n dx.push(92, -2);\n dx.push(290, 1);\n dx.push(42, 2); // landing gap\n dx.push(291, 1);\n dx.push(43, 8); // dogleg length\n dx.push(3, a.name);\n dx.push(44, a.arrowSize);\n dx.push(300, \"\");\n dx.push(342, a.textStyleHandle);\n dx.push(174, 1);\n dx.push(175, 1);\n dx.push(176, 0);\n dx.push(178, 1);\n dx.push(93, RAW_COLOR_BY_BLOCK);\n dx.push(45, a.textHeight);\n dx.push(292, 0);\n dx.push(297, 0);\n dx.push(46, a.textHeight);\n dx.push(94, RAW_COLOR_BY_BLOCK);\n dx.push(47, 1);\n dx.push(49, 1);\n dx.push(140, 1);\n dx.push(294, 1);\n dx.push(141, 0);\n dx.push(177, 0);\n dx.push(142, 1);\n dx.push(295, 0);\n dx.push(296, 0);\n dx.push(143, 3.75);\n dx.push(271, 0);\n dx.push(272, 9);\n dx.push(273, 9);\n }\n}\n\n/** One cell of a native ACAD_TABLE (row-major; a merge's covered cells are\n * listed too, `merged`). */\nexport interface AcadTableCellArgs {\n /** The cell's MTEXT (font / height inline); \"\" = empty. */\n text: string;\n /** Merge extent on the anchor cell (1 × 1 otherwise). */\n cols: number;\n rows: number;\n /** Covered by another cell's merge. */\n merged: boolean;\n /** Attachment 1–9 (TL TC TR / ML MC MR / BL BC BR). */\n alignment: number;\n}\n\ninterface AcadTableArgs {\n /** The anonymous `*T<n>` block holding the drawn table. */\n blockName: string;\n blockRecordHandle: string;\n tableStyleHandle: string;\n /** Top-left corner. */\n position: { x: number; y: number };\n /** Rotation as the table's horizontal direction. */\n direction: { x: number; y: number };\n rowHeights: number[];\n colWidths: number[];\n cells: AcadTableCellArgs[];\n}\n\n/**\n * ACAD_TABLE with the legacy AcDbTable payload — the self-contained grid +\n * cells every AutoCAD still writes next to its TABLECONTENT objects, and\n * reads alone. Tag order and the flag values mirror AutoCAD 2018's own DXF\n * output field for field (cell formatting rides inline in the MTEXT, as\n * AutoCAD writes it there). The `*T` block carries the drawn table for\n * readers that don't regenerate tables.\n */\nexport class AcadTableEntity extends Point {\n private readonly args: AcadTableArgs;\n\n constructor(args: AcadTableArgs) {\n super(args.position.x, args.position.y, 0);\n this.args = args;\n this.type = \"ACAD_TABLE\";\n this.subclassMarker = \"AcDbBlockReference\";\n }\n\n override dxfyChild(dx: Dxfier): void {\n const a = this.args;\n dx.push(2, a.blockName);\n dx.push(10, a.position.x);\n dx.push(20, a.position.y);\n dx.push(30, 0);\n dx.push(100, \"AcDbTable\");\n dx.push(280, 0); // table data version\n dx.push(342, a.tableStyleHandle);\n dx.push(343, a.blockRecordHandle);\n dx.push(11, a.direction.x);\n dx.push(21, a.direction.y);\n dx.push(31, 0);\n dx.push(90, 22); // table value flags (as AutoCAD writes them)\n dx.push(91, a.rowHeights.length);\n dx.push(92, a.colWidths.length);\n dx.push(93, 2); // override flags\n dx.push(94, 0); // border color overrides\n dx.push(95, 0); // border lineweight overrides\n dx.push(96, 0); // border visibility overrides\n dx.push(281, 1);\n for (const h of a.rowHeights) dx.push(141, h);\n for (const w of a.colWidths) dx.push(142, w);\n for (const c of a.cells) {\n dx.push(171, 1); // text cell\n dx.push(172, 0);\n dx.push(173, c.merged ? 1 : 0);\n dx.push(174, 0); // autofit\n dx.push(175, c.cols);\n dx.push(176, c.rows);\n dx.push(91, 1); // override flags: alignment\n dx.push(178, 0); // virtual edge\n dx.push(145, 0); // rotation\n dx.push(170, c.alignment);\n dx.push(92, 0);\n dx.push(301, \"CELL_VALUE\");\n if (c.text === \"\") {\n dx.push(93, 3);\n dx.push(90, 0); // unknown / empty\n } else {\n dx.push(93, 6);\n dx.push(90, 4); // string\n // ponytail: one group-1 value, unchunked — AutoCAD reads up to 2049\n // bytes per value; chunk (as MTEXT does with 3s) if longer cells\n // show up.\n dx.push(1, c.text);\n }\n dx.push(94, 0);\n dx.push(300, \"\");\n dx.push(302, c.text);\n dx.push(304, \"ACVALUE_END\");\n }\n }\n}\n\ninterface TableStyleArgs {\n name: string;\n /** STYLE record name the cell styles use. */\n textStyleName: string;\n textHeight: number;\n /** Horizontal / vertical cell margin. */\n margin: number;\n /** ACAD_TABLESTYLE dictionary handle (owner + reactor). */\n dictionaryHandle: string;\n}\n\n/**\n * Minimal TABLESTYLE (data / header / title cell styles, all borders on),\n * mirroring AutoCAD's \"Standard\". Tables carry their own formatting, so the\n * style mostly satisfies referential integrity.\n */\nexport class TableStyleObject extends DxfObject {\n private readonly args: TableStyleArgs;\n\n constructor(args: TableStyleArgs) {\n super(\"TABLESTYLE\");\n this.args = args;\n }\n\n override dxfy(dx: Dxfier): void {\n const a = this.args;\n dx.push(0, \"TABLESTYLE\");\n dx.push(5, this.handle);\n dx.push(102, \"{ACAD_REACTORS\");\n dx.push(330, a.dictionaryHandle);\n dx.push(102, \"}\");\n dx.push(330, a.dictionaryHandle);\n dx.push(100, \"AcDbTableStyle\");\n dx.push(280, 0);\n dx.push(3, a.name);\n dx.push(70, 0); // flow down\n dx.push(71, 0);\n dx.push(40, a.margin);\n dx.push(41, a.margin);\n dx.push(280, 0);\n dx.push(281, 0);\n // Data, header, title.\n for (const [height, alignment] of [\n [a.textHeight, 2],\n [a.textHeight, 5],\n [a.textHeight, 5],\n ]) {\n dx.push(7, a.textStyleName);\n dx.push(140, height);\n dx.push(170, alignment);\n dx.push(62, 0);\n dx.push(63, 7);\n dx.push(283, 0);\n dx.push(90, 4);\n dx.push(91, 0);\n dx.push(1, \"\");\n for (const [lw, vis, color] of [\n [274, 284, 64],\n [275, 285, 65],\n [276, 286, 66],\n [277, 287, 67],\n [278, 288, 68],\n [279, 289, 69],\n ]) {\n dx.push(lw, -2); // lineweight ByBlock\n dx.push(vis, 1); // visible\n dx.push(color, 0); // color ByBlock\n }\n }\n }\n}\n\n/** CLASS records for the non-fixed object types the exporter writes, as\n * AutoCAD declares them (the writer emits an empty CLASSES section; spliced\n * in after stringify). [dxf name, C++ class, application, proxy flags, is\n * an entity]. */\nexport const DXF_CLASSES = [\n [\"ACAD_TABLE\", \"AcDbTable\", \"ObjectDBX Classes\", 1025, 1],\n [\"TABLESTYLE\", \"AcDbTableStyle\", \"ObjectDBX Classes\", 4095, 0],\n [\"MULTILEADER\", \"AcDbMLeader\", \"ACDB_MLEADER_CLASS\", 1025, 1],\n [\"MLEADERSTYLE\", \"AcDbMLeaderStyle\", \"ACDB_MLEADERSTYLE_CLASS\", 4095, 0],\n] as const;\n\n/** The CLASS records of the types `content` (the written DXF) uses. */\nexport const classesSection = (content: string): string =>\n DXF_CLASSES.filter(([name]) => content.includes(`\\n0\\n${name}\\n`))\n .map(([name, cpp, app, proxy, isEntity]) =>\n [0, \"CLASS\", 1, name, 2, cpp, 3, app, 90, proxy, 91, 0, 280, 0, 281, isEntity]\n .map((v) => `${v}\\n`)\n .join(\"\"),\n )\n .join(\"\");\n","// Shared by DXF export and import (kept dependency-free so the lazy import\n// chunk doesn't pull in the writer library).\n\n/**\n * ANSI31 base: parallel lines at 45° spaced 3.175 mm at scale 1. Line-fill\n * hatches export as ANSI31 with angle = fill.angle − 45° and scale =\n * spacing / 3.175, which is exactly how AutoCAD renders them; the importer\n * inverts the same formula for any ANSI31 hatch.\n */\nexport const ANSI31_BASE_SPACING = 3.175;\nexport const ANSI31_BASE_ANGLE_DEG = 45;\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MAC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A;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,WAAW,CAACC,WACvBA,SAAQ,KAAKA,SAAQ,MAAM,QAAQA,MAAK,IAAI;AAG9C,IAAM,UAAsC,QAAQ;AAAA,EAClD,CAAC,QAAQ,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;AACpC;AAGO,IAAM,aAAa,CAAC,QAAwB;AACjD,QAAM,MAAM,SAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,WAASA,SAAQ,GAAGA,SAAQ,KAAKA,UAAS;AACxC,UAAMC,KAAI,QAAQD,MAAK;AACvB,UAAME,MACH,IAAI,CAAC,IAAID,GAAE,CAAC,MAAM,KAAK,IAAI,CAAC,IAAIA,GAAE,CAAC,MAAM,KAAK,IAAI,CAAC,IAAIA,GAAE,CAAC,MAAM;AACnE,QAAIC,KAAI,OAAO;AACb,cAAQA;AACR,aAAOF;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGO,IAAM,iBAAiB,CAAC,QAA+B;AAC5D,QAAM,MAAM,SAAS,GAAG;AACxB,SAAO,MAAO,IAAI,CAAC,KAAK,KAAO,IAAI,CAAC,KAAK,IAAK,IAAI,CAAC,IAAI;AACzD;;;ACtSO,IAAM,eAAe;AAAA,EAC1B;AAAA,EAAG;AAAA,EAAG;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EACtE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AACtB;AAIO,IAAM,iBAAiB,CAC5B,eAEA,eAAe,UAAa,aAAa,IACrC,SACA,KAAK,IAAI,YAAY,CAAC,IAAI;AAGzB,IAAM,iBAAiB,CAAC,OAC7B,aAAa;AAAA,EAAO,CAAC,MAAMG,OACzB,KAAK,IAAIA,KAAI,KAAK,GAAG,IAAI,KAAK,IAAI,OAAO,KAAK,GAAG,IAAIA,KAAI;AAC3D;AAWK,IAAM,cAAc,CAAC,MAC1B,EAIG,QAAQ,SAAS,IAAI,EACrB,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,IAAI,EACnB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,IAAI;AAGjB,IAAM,oBAAoB,CAAC,SAChC,KAAK,QAAQ,kBAAkB,CAACC,IAAG,OAAe;AAChD,UAAQ,GAAG,YAAY,GAAG;AAAA,IACxB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF,CAAC;AAEH,IAAM,cAAsC;AAAA,EAC1C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,YAAoC;AAAA,EACxC,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,IAAM,WAAW,CAAC,GAAW,QAC3B,CAAC,GAAG,CAAC,EAAE,MAAM,CAACC,OAAM,IAAIA,EAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAACA,OAAM,IAAIA,EAAC,CAAC,EAAE,KAAK,EAAE,IAAI;AAQrE,IAAM,YAAY,CAAC,SAAyB;AAC1C,QAAMC,KAAI,uBAAuB,KAAK,IAAI;AAC1C,MAAI,CAACA,GAAG,QAAO;AACf,QAAM,MAAMA,GAAE,CAAC,EAAE,KAAK;AACtB,QAAM,SAASA,GAAE,CAAC,EAAE,KAAK;AACzB,MAAI,OAAO,CAAC,OAAQ,QAAO,SAAS,KAAK,WAAW;AACpD,MAAI,CAAC,OAAO,OAAQ,QAAO,SAAS,QAAQ,SAAS;AACrD,SAAO,GAAG,GAAG,IAAI,MAAM;AACzB;AAGA,IAAM,cAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAG;AAAA,EACH,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAK;AACP;AAEA,IAAM,eAAe,CAAC,aACpB,oBAAoB,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC;AA4BxD,IAAM,YAAY,CAAC,MAAc,SAA8C;AAC7E,QAAM,SAAuB,CAAC;AAC9B,MAAI,KAAiB,EAAE,QAAQ,MAAM;AACrC,QAAM,QAAsB,CAAC;AAC7B,QAAM,QAAQ,CAAC,UACb,OACI;AAAA,IACE,GAAI,GAAG,SAAS,SAAY,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC;AAAA,IACjD,GAAI,GAAG,SAAS,SAAY,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC;AAAA,IACjD,GAAI,GAAG,WAAW,SAAY,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,IACvD,GAAI,GAAG,WAAW,SAAY,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,IACvD,GAAI,GAAG,UAAU,SAAY,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;AAAA,IACpD,GAAI,GAAG,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IAC1C,GAAG;AAAA,EACL,IACA,CAAC;AACP,QAAM,OAAO,CAAC,GAAW,UAA+B;AACtD,QAAI,CAAC,EAAG;AACR,UAAMC,KAAI,MAAM,KAAK;AACrB,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,QAAI,CAAC,SAAS,QAAQ,KAAK,UAAU,KAAK,KAAK,MAAM,KAAK,UAAUA,EAAC;AACnE,WAAK,QAAQ;AAAA,QACV,QAAO,KAAK,EAAE,MAAM,GAAG,OAAOA,GAAE,CAAC;AAAA,EACxC;AAGA,QAAM,WAAW,CAACC,OAAgC;AAChD,UAAM,MAAM,KAAK,QAAQ,KAAKA,EAAC;AAC/B,WAAO,QAAQ,KAAK,CAAC,IAAIA,EAAC,IAAI,CAAC,KAAK,MAAMA,IAAG,GAAG,GAAG,MAAM,CAAC;AAAA,EAC5D;AACA,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,QAAQ;AACtB,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,OAAO,KAAK;AACd,YAAM,KAAK,EAAE;AACb,WAAK,EAAE,GAAG,GAAG;AACb;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,WAAK,MAAM,IAAI,KAAK;AACpB;AAAA,IACF,WAAW,OAAO,MAAM;AACtB,WAAK,GAAG,SAAU,YAAY,EAAE,KAAK,KAAM,EAAE;AAC7C;AAAA,IACF,OAAO;AACL,YAAM,OAAO,KAAK,IAAI,CAAC,KAAK;AAC5B,UAAI,SAAS,QAAQ,SAAS,OAAO,SAAS,KAAK;AACjD,aAAK,IAAI;AACT,aAAK;AAAA,MACP,WAAW,SAAS,KAAK;AACvB,aAAK,IAAI;AACT,aAAK;AAAA,MACP,WAAW,SAAS,KAAK;AACvB,aAAK,GAAG;AACR,aAAK;AAAA,MACP,WAAW,SAAS,OAAO,SAAS,KAAK;AACvC,aAAK,EAAE,GAAG,IAAI,WAAW,SAAS,IAAI;AACtC,aAAK;AAAA,MACP,WAAW,OAAO,SAAS,IAAI,GAAG;AAChC,aAAK;AAAA,MACP,WAAW,SAAS,KAAK;AAGvB,cAAM,CAAC,MAAM,EAAE,IAAI,SAAS,IAAI,CAAC;AACjC,cAAMF,KAAI,uBAAuB,KAAK,IAAI;AAC1C,cAAM,MAAMA,KAAI,CAAC,EAAE,KAAK,KAAK;AAC7B,cAAM,SAASA,KAAI,CAAC,EAAE,KAAK,KAAK;AAChC,YAAI,QAAQA,MAAKA,GAAE,CAAC,MAAM,OAAO,OAAO,CAAC;AACvC,eAAK,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAAA,iBACtB,QAAQA,MAAKA,GAAE,CAAC,MAAM,OAAO,CAAC,OAAO;AAC5C,eAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC;AAAA,YAC3B,MAAK,UAAU,IAAI,CAAC;AACzB,YAAI,OAAO,IAAI,IAAI,IAAI,IAAI;AAAA,MAC7B,YACG,SAAS,OAAO,SAAS,QAC1B,oBAAoB,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GACjD;AAGA,aAAK,OAAO,cAAc,SAAS,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACjE,aAAK;AAAA,MACP,WAAW,SAAS,OAAO,SAAS,KAAK;AAEvC,cAAM,CAAC,MAAM,EAAE,IAAI,SAAS,IAAI,CAAC;AACjC,aAAK,EAAE,GAAG,IAAI,QAAQ,aAAa,IAAI,EAAE;AACzC,YAAI,QAAQ,CAAC,GAAG,UAAU,MAAM;AAC9B,gBAAM,CAAC,MAAM,GAAG,KAAK,IAAI,KAAK,MAAM,GAAG;AACvC,gBAAM,OAAO,KAAK,SAAS,GAAG;AAC9B,gBAAM,OAAO;AAAA,YACX,OAAO,OAAO;AAAA,YACd,OAAO,SAAY;AAAA,UACrB;AACA,gBAAM,OAAO,CAACG,OAAc,MAAM,KAAK,CAACC,OAAMA,GAAE,CAAC,MAAMD,EAAC,GAAG,MAAM,CAAC;AAClE,aAAG,OAAO,KAAK;AACf,aAAG,OAAO,KAAK,GAAG,MAAM,SAAY,KAAK,GAAG,MAAM,MAAM,KAAK;AAC7D,aAAG,SAAS,KAAK,GAAG,MAAM,SAAY,KAAK,GAAG,MAAM,MAAM,KAAK;AAAA,QACjE;AACA,YAAI,OAAO,IAAI,IAAI,IAAI,IAAI;AAAA,MAC7B,WAAW,QAAQ,SAAS,KAAK;AAE/B,cAAM,CAAC,MAAM,EAAE,IAAI,SAAS,IAAI,CAAC;AACjC,cAAME,KAAI,OAAO,WAAW,IAAI;AAChC,YAAI,OAAO,SAASA,EAAC,KAAKA,KAAI;AAC5B,eAAK;AAAA,YACH,GAAG;AAAA,YACH,QAAQ,MAAM,KAAK,IAAI,KAClB,GAAG,UAAU,KAAKA,KACnBA,MAAK,KAAK,WAAW,IAAI,KAAK,WAAWA;AAAA,UAC/C;AACF,YAAI,OAAO,IAAI,IAAI,IAAI,IAAI;AAAA,MAC7B,WAAW,QAAQ,SAAS,KAAK;AAC/B,cAAM,CAAC,MAAM,EAAE,IAAI,SAAS,IAAI,CAAC;AACjC,aAAK,EAAE,GAAG,IAAI,OAAO,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC,EAAE;AACzD,YAAI,OAAO,IAAI,IAAI,IAAI,IAAI;AAAA,MAC7B,OAAO;AAEL,cAAM,MAAM,KAAK,QAAQ,KAAK,IAAI,CAAC;AACnC,YAAI,QAAQ,KAAK,IAAI,IAAI,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,IAAM,kBAAkB,CAAC,SACvB,UAAU,IAAI,EACX,IAAI,CAACN,OAAMA,GAAE,IAAI,EACjB,KAAK,EAAE;AAGL,IAAM,mBAAmB,CAAC,SAAqC;AACpE,QAAMC,KAAI,gBAAgB,KAAK,IAAI;AACnC,QAAMK,KAAIL,KAAI,OAAOA,GAAE,CAAC,CAAC,IAAI;AAC7B,SAAO,OAAO,SAASK,EAAC,KAAKA,KAAI,KAAKA,OAAM,IAAIA,KAAI;AACtD;AAIO,IAAM,iBAAiB,CAC5B,SACmC;AACnC,QAAML,KAAI,6BAA6B,KAAK,IAAI;AAChD,MAAI,CAACA,GAAG,QAAO,CAAC;AAChB,SAAO;AAAA,IACL,GAAI,OAAO,KAAKA,GAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAc,IAAI,CAAC;AAAA,IACnD,GAAI,OAAO,KAAKA,GAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAc,IAAI,CAAC;AAAA,EACvD;AACF;AAQA,IAAM,qBAAqB,CAAC,SAC1B,KAAK;AAAA,EAAQ;AAAA,EAA0B,CAACA,OACtCA,OAAM,OAAO,MAAOA,OAAM,OAAO,MAAM;AACzC;AAQK,IAAM,YAAY,CAAC,KAAa,UACrC,mBAAmB,kBAAkB,QAAQ,gBAAgB,GAAG,IAAI,GAAG,CAAC;AAOnE,IAAM,gBAAgB,CAC3B,KACA,aAC2C;AAC3C,MAAI,UAAU;AACd,QAAM,QAAoB,CAAC;AAC3B,aAAWD,MAAK,UAAU,KAAK,EAAE,SAAS,CAAC,GAAG;AAC5C,UAAM,OAAO,mBAAmB,kBAAkBA,GAAE,IAAI,CAAC;AACzD,UAAM,KAAK;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ,SAAS,KAAK;AAAA,MAC3B,GAAGA,GAAE;AAAA,IACP,CAAC;AACD,eAAW;AAAA,EACb;AACA,SAAO,EAAE,SAAS,OAAO,eAAe,OAAO,OAAO,EAAE;AAC1D;AAGA,IAAM,cAAc,CAAC,MACnB,YAAY,CAAC,EAAE,QAAQ,UAAU,CAACA,OAAM,KAAKA,EAAC,EAAE;AAQ3C,IAAM,kBAAkB,CAC7B,SACA,OACA,SACW;AACX,QAAM,OAAO,cAAc,IAAI;AAC/B,MAAI,MAAM;AACV,MAAI,KAAK;AACT,aAAW,KAAK,eAAe,OAAO,OAAO,GAAG;AAC9C,WAAO,YAAY,QAAQ,MAAM,IAAI,EAAE,KAAK,CAAC;AAC7C,UAAM,WACJ,EAAE,SAAS,UAAa,EAAE,SAAS,UAAa,EAAE,WAAW,SACzD,MAAM,aAAa,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,KACjD,EAAE,QAAQ,KAAK,OAAQ,IAAI,CAC9B,KAAM,EAAE,UAAU,KAAK,SAAU,IAAI,CAAC,MACtC;AACN,UAAM,QACJ,YACC,EAAE,WAAW,SAAY,MAAM,EAAE,MAAM,OAAO,OAC9C,EAAE,QAAQ,MAAM,WAAW,EAAE,KAAK,CAAC,MAAM,OACzC,EAAE,YAAY,QAAQ;AACzB,UAAM,OAAO,QAAQ,MAAM,EAAE,OAAO,EAAE,GAAG;AAEzC,UAAM,OACJ,EAAE,UAAU,CAAC,SAAS,KAAK,IAAI,IAC3B,EAAE,WAAW,UACX,MAAM,YAAY,IAAI,CAAC,OACvB,OAAO,YAAY,IAAI,CAAC,MAC1B,YAAY,IAAI;AACtB,WAAO,SAAS,EAAE,SAAS,IAAI,KAAK,GAAG,IAAI,MAAM;AACjD,SAAK,EAAE;AAAA,EACT;AACA,SAAO,MAAM,YAAY,QAAQ,MAAM,EAAE,CAAC;AAC5C;;;AC1bA,SAAS,OAAO,iBAA8B;AAG9C,IAAM,qBAAqB;AAC3B,IAAM,iBAAiB;AAGvB,IAAM,uBAAuB;AA0BtB,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACvB;AAAA,EAEjB,YAAY,MAA0B;AACpC,UAAM,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,CAAC;AACrC,SAAK,OAAO;AAEZ,SAAK,OAAO;AACZ,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAES,UAAU,IAAkB;AACnC,UAAMO,KAAI,KAAK;AACf,OAAG,KAAK,IAAIA,GAAE,OAAO,CAAC;AACtB,OAAG,KAAK,IAAIA,GAAE,OAAO,CAAC;AACtB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,KAAK;AACnB,OAAG,KAAK,IAAIA,GAAE,MAAM;AACpB,OAAG,KAAK,IAAIA,GAAE,MAAM;AACpB,OAAG,KAAK,IAAIA,GAAE,EAAE;AAChB,OAAG,KAAK,IAAIA,GAAE,WAAW,CAAC;AAC1B,OAAG,KAAK,IAAIA,GAAE,WAAW,CAAC;AAC1B,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,UAAU;AACxB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,GAAG;AACf,eAAW,UAAUA,GAAE,mBAAoB,IAAG,KAAK,KAAK,MAAM;AAC9D,OAAG,KAAK,IAAIA,GAAE,SAAS,uBAAuB,CAAC;AAC/C,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AAAA,EACf;AACF;AAkBO,IAAM,eAAN,cAA2B,UAAU;AAAA,EACzB;AAAA,EAEjB,YAAY,MAAwB;AAClC,UAAM,QAAQ;AACd,SAAK,OAAO;AAAA,EACd;AAAA,EAES,KAAK,IAAkB;AAC9B,UAAMA,KAAI,KAAK;AACf,OAAG,KAAK,GAAG,QAAQ;AACnB,OAAG,KAAK,GAAG,KAAK,MAAM;AACtB,OAAG,KAAK,KAAK,KAAK,iBAAiB;AACnC,OAAG,KAAK,KAAK,kBAAkB;AAC/B,OAAG,KAAK,GAAG,EAAE;AACb,OAAG,KAAK,GAAG,aAAa;AACxB,OAAG,KAAK,GAAG,EAAE;AACb,OAAG,KAAK,GAAG,EAAE;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,UAAU;AACxB,OAAG,KAAK,IAAIA,GAAE,WAAW;AACzB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,GAAG;AACf,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,GAAG,EAAE;AACb,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,YAAY;AACzB,OAAG,KAAK,GAAGA,GAAE,IAAI;AACjB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,QAAQ;AACtB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,UAAU;AACxB,OAAG,KAAK,IAAIA,GAAE,WAAW;AACzB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,UAAU;AACxB,OAAG,KAAK,IAAIA,GAAE,WAAW;AACzB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAKA,GAAE,iBAAiB;AAAA,EAClC;AACF;AAwCO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC1B;AAAA,EAEjB,YAAY,MAAuB;AACjC,UAAM,KAAK,SAAS,GAAG,KAAK,SAAS,GAAG,CAAC;AACzC,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAES,UAAU,IAAkB;AACnC,UAAMA,KAAI,KAAK;AACf,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,eAAe;AAC5B,OAAG,KAAK,IAAIA,GAAE,YAAY;AAE1B,OAAG,KAAK,IAAIA,GAAE,SAAS,IAAIA,GAAE,gBAAgB,IAAIA,GAAE,YAAY;AAC/D,OAAG,KAAK,IAAIA,GAAE,SAAS,IAAIA,GAAE,gBAAgB,IAAIA,GAAE,YAAY;AAC/D,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,aAAaA,GAAE,YAAY;AACzC,OAAG,KAAK,KAAKA,GAAE,YAAYA,GAAE,YAAY;AACzC,OAAG,KAAK,KAAK,IAAIA,GAAE,YAAY;AAC/B,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAKA,GAAE,OAAO;AACtB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAKA,GAAE,eAAe;AAC9B,OAAG,KAAK,IAAIA,GAAE,aAAa,CAAC;AAC5B,OAAG,KAAK,IAAIA,GAAE,aAAa,CAAC;AAC5B,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,kBAAkB;AAC9B,OAAG,KAAK,KAAKA,GAAE,UAAU;AACzB,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,cAAc;AAC1B,OAAG,KAAK,KAAK,GAAG;AAChB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,SAAS;AACtB,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAIA,GAAE,SAAS,CAAC;AACxB,OAAG,KAAK,IAAIA,GAAE,SAAS,CAAC;AACxB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,gBAAgB,CAAC;AAC/B,OAAG,KAAK,IAAIA,GAAE,gBAAgB,CAAC;AAC/B,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,YAAY;AAC1B,IAAAA,GAAE,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC3B,SAAG,KAAK,KAAK,cAAc;AAC3B,iBAAWC,MAAK,MAAM;AACpB,WAAG,KAAK,IAAIA,GAAE,CAAC;AACf,WAAG,KAAK,IAAIA,GAAE,CAAC;AACf,WAAG,KAAK,IAAI,CAAC;AAAA,MACf;AACA,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,IAAI,kBAAkB;AAC9B,SAAG,KAAK,KAAK,GAAG;AAAA,IAClB,CAAC;AACD,OAAG,KAAK,KAAK,GAAG;AAChB,OAAG,KAAK,KAAK,GAAG;AAChB,OAAG,KAAK,KAAKD,GAAE,WAAW;AAC1B,OAAG,KAAK,IAAI,UAAU;AACtB,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,kBAAkB;AAC9B,OAAG,KAAK,KAAKA,GAAE,cAAc;AAC7B,OAAG,KAAK,KAAK,EAAE;AACf,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAIA,GAAE,YAAY;AAC1B,OAAG,KAAK,IAAIA,GAAE,YAAYA,GAAE,YAAY;AACxC,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAKA,GAAE,eAAe;AAC9B,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,kBAAkB;AAC9B,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,kBAAkB;AAC9B,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAIA,GAAE,YAAY;AAAA,EAC5B;AACF;AAgBO,IAAM,qBAAN,cAAiC,UAAU;AAAA,EAC/B;AAAA,EAEjB,YAAY,MAAwB;AAClC,UAAM,cAAc;AACpB,SAAK,OAAO;AAAA,EACd;AAAA,EAES,KAAK,IAAkB;AAC9B,UAAMA,KAAI,KAAK;AACf,OAAG,KAAK,GAAG,cAAc;AACzB,OAAG,KAAK,GAAG,KAAK,MAAM;AACtB,OAAG,KAAK,KAAK,gBAAgB;AAC7B,OAAG,KAAK,KAAKA,GAAE,gBAAgB;AAC/B,OAAG,KAAK,KAAK,GAAG;AAChB,OAAG,KAAK,KAAKA,GAAE,gBAAgB;AAC/B,OAAG,KAAK,KAAK,kBAAkB;AAC/B,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,kBAAkB;AAC9B,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,GAAGA,GAAE,IAAI;AACjB,OAAG,KAAK,IAAIA,GAAE,SAAS;AACvB,OAAG,KAAK,KAAK,EAAE;AACf,OAAG,KAAK,KAAKA,GAAE,eAAe;AAC9B,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAI,kBAAkB;AAC9B,OAAG,KAAK,IAAIA,GAAE,UAAU;AACxB,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,IAAIA,GAAE,UAAU;AACxB,OAAG,KAAK,IAAI,kBAAkB;AAC9B,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,IAAI;AACjB,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AAAA,EAChB;AACF;AAsCO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACxB;AAAA,EAEjB,YAAY,MAAqB;AAC/B,UAAM,KAAK,SAAS,GAAG,KAAK,SAAS,GAAG,CAAC;AACzC,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAES,UAAU,IAAkB;AACnC,UAAMA,KAAI,KAAK;AACf,OAAG,KAAK,GAAGA,GAAE,SAAS;AACtB,OAAG,KAAK,IAAIA,GAAE,SAAS,CAAC;AACxB,OAAG,KAAK,IAAIA,GAAE,SAAS,CAAC;AACxB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,WAAW;AACxB,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAKA,GAAE,gBAAgB;AAC/B,OAAG,KAAK,KAAKA,GAAE,iBAAiB;AAChC,OAAG,KAAK,IAAIA,GAAE,UAAU,CAAC;AACzB,OAAG,KAAK,IAAIA,GAAE,UAAU,CAAC;AACzB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,EAAE;AACd,OAAG,KAAK,IAAIA,GAAE,WAAW,MAAM;AAC/B,OAAG,KAAK,IAAIA,GAAE,UAAU,MAAM;AAC9B,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,KAAK,CAAC;AACd,eAAW,KAAKA,GAAE,WAAY,IAAG,KAAK,KAAK,CAAC;AAC5C,eAAWE,MAAKF,GAAE,UAAW,IAAG,KAAK,KAAKE,EAAC;AAC3C,eAAWC,MAAKH,GAAE,OAAO;AACvB,SAAG,KAAK,KAAK,CAAC;AACd,SAAG,KAAK,KAAK,CAAC;AACd,SAAG,KAAK,KAAKG,GAAE,SAAS,IAAI,CAAC;AAC7B,SAAG,KAAK,KAAK,CAAC;AACd,SAAG,KAAK,KAAKA,GAAE,IAAI;AACnB,SAAG,KAAK,KAAKA,GAAE,IAAI;AACnB,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,KAAK,CAAC;AACd,SAAG,KAAK,KAAK,CAAC;AACd,SAAG,KAAK,KAAKA,GAAE,SAAS;AACxB,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,KAAK,YAAY;AACzB,UAAIA,GAAE,SAAS,IAAI;AACjB,WAAG,KAAK,IAAI,CAAC;AACb,WAAG,KAAK,IAAI,CAAC;AAAA,MACf,OAAO;AACL,WAAG,KAAK,IAAI,CAAC;AACb,WAAG,KAAK,IAAI,CAAC;AAIb,WAAG,KAAK,GAAGA,GAAE,IAAI;AAAA,MACnB;AACA,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,KAAK,EAAE;AACf,SAAG,KAAK,KAAKA,GAAE,IAAI;AACnB,SAAG,KAAK,KAAK,aAAa;AAAA,IAC5B;AAAA,EACF;AACF;AAkBO,IAAM,mBAAN,cAA+B,UAAU;AAAA,EAC7B;AAAA,EAEjB,YAAY,MAAsB;AAChC,UAAM,YAAY;AAClB,SAAK,OAAO;AAAA,EACd;AAAA,EAES,KAAK,IAAkB;AAC9B,UAAMH,KAAI,KAAK;AACf,OAAG,KAAK,GAAG,YAAY;AACvB,OAAG,KAAK,GAAG,KAAK,MAAM;AACtB,OAAG,KAAK,KAAK,gBAAgB;AAC7B,OAAG,KAAK,KAAKA,GAAE,gBAAgB;AAC/B,OAAG,KAAK,KAAK,GAAG;AAChB,OAAG,KAAK,KAAKA,GAAE,gBAAgB;AAC/B,OAAG,KAAK,KAAK,gBAAgB;AAC7B,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,GAAGA,GAAE,IAAI;AACjB,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAI,CAAC;AACb,OAAG,KAAK,IAAIA,GAAE,MAAM;AACpB,OAAG,KAAK,IAAIA,GAAE,MAAM;AACpB,OAAG,KAAK,KAAK,CAAC;AACd,OAAG,KAAK,KAAK,CAAC;AAEd,eAAW,CAAC,QAAQ,SAAS,KAAK;AAAA,MAChC,CAACA,GAAE,YAAY,CAAC;AAAA,MAChB,CAACA,GAAE,YAAY,CAAC;AAAA,MAChB,CAACA,GAAE,YAAY,CAAC;AAAA,IAClB,GAAG;AACD,SAAG,KAAK,GAAGA,GAAE,aAAa;AAC1B,SAAG,KAAK,KAAK,MAAM;AACnB,SAAG,KAAK,KAAK,SAAS;AACtB,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,KAAK,CAAC;AACd,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,IAAI,CAAC;AACb,SAAG,KAAK,GAAG,EAAE;AACb,iBAAW,CAAC,IAAI,KAAK,KAAK,KAAK;AAAA,QAC7B,CAAC,KAAK,KAAK,EAAE;AAAA,QACb,CAAC,KAAK,KAAK,EAAE;AAAA,QACb,CAAC,KAAK,KAAK,EAAE;AAAA,QACb,CAAC,KAAK,KAAK,EAAE;AAAA,QACb,CAAC,KAAK,KAAK,EAAE;AAAA,QACb,CAAC,KAAK,KAAK,EAAE;AAAA,MACf,GAAG;AACD,WAAG,KAAK,IAAI,EAAE;AACd,WAAG,KAAK,KAAK,CAAC;AACd,WAAG,KAAK,OAAO,CAAC;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,cAAc;AAAA,EACzB,CAAC,cAAc,aAAa,qBAAqB,MAAM,CAAC;AAAA,EACxD,CAAC,cAAc,kBAAkB,qBAAqB,MAAM,CAAC;AAAA,EAC7D,CAAC,eAAe,eAAe,sBAAsB,MAAM,CAAC;AAAA,EAC5D,CAAC,gBAAgB,oBAAoB,2BAA2B,MAAM,CAAC;AACzE;AAGO,IAAM,iBAAiB,CAAC,YAC7B,YAAY,OAAO,CAAC,CAAC,IAAI,MAAM,QAAQ,SAAS;AAAA;AAAA,EAAQ,IAAI;AAAA,CAAI,CAAC,EAC9D;AAAA,EAAI,CAAC,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MACpC,CAAC,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,OAAO,IAAI,GAAG,KAAK,GAAG,KAAK,QAAQ,EAC1E,IAAI,CAACI,OAAM,GAAGA,EAAC;AAAA,CAAI,EACnB,KAAK,EAAE;AACZ,EACC,KAAK,EAAE;;;ACtlBL,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;;;AxC4ErC,IAAMC,WAAU,MAAM,KAAK;AAK3B,IAAM,oBAAoB,CAAC,SACzB,KAAK,QAAQ,qBAAqB,GAAG,EAAE,KAAK,KAAK;AAEnD,IAAM,KAAK,CAACC,QAAa,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,GAAG,GAAG,EAAE;AAEhD,IAAM,kBAAkB;AAExB,IAAM,UAA2D;AAAA,EAC/D,MAAM,wBAAwB;AAAA,EAC9B,QAAQ,wBAAwB;AAAA,EAChC,OAAO,wBAAwB;AACjC;AAGA,IAAM,kBAAkB,CACtB,QACA,WACyB;AACzB,QAAM,MAAM,WAAW,QAAQ,IAAI,WAAW,WAAW,IAAI;AAC7D,QAAM,MAAM,WAAW,SAAS,IAAI,WAAW,WAAW,IAAI;AAC9D,SAAQ,MAAM;AAChB;AAIA,IAAM,kBAAkB,CACtB,UACA,cACuB;AACvB,MAAI,CAAC,SAAU,QAAO;AACtB,QAAMA,KAAI,gBAAgB,UAAU,SAAS;AAC7C,MAAI,CAACA,MAAKA,GAAE,SAAS,WAAW,EAAG,QAAO;AAC1C,SAAOA,GAAE,WAAWA,GAAE,KAAK,YAAY;AACzC;AAoEA,IAAM,gBAAgB,CACpB,QACA,WACS;AACT,QAAM,OAAO,OAAO,KAAK,KAAK,MAAM;AACpC,SAAO,OAAO,CAAC,OAAO;AACpB,UAAM,QAAQ,GAAG,MAAM;AACvB,SAAK,EAAE;AACP,UAAM,QAAQ,GAAG;AACjB,aAAS,IAAI,OAAO,IAAI,MAAM,QAAQ,KAAK;AACzC,UAAI,MAAM,CAAC,MAAM,KAAK;AACpB,cAAM,IAAI,CAAC,IAAI;AACf;AAAA,MACF;AACF,QAAI,UAAU;AACd,aAAS,IAAI,OAAO,IAAI,MAAM,QAAQ,KAAK;AACzC,UAAI,MAAM,CAAC,MAAM,OAAO,EAAE,YAAY,GAAG;AACvC,cAAM,OAAO,GAAG,GAAG,KAAK,MAAM;AAC9B;AAAA,MACF;AACF,UAAM,KAAK,KAAK,MAAM;AAAA,EACxB;AACF;AAEA,IAAM,aAAa,CAAC,KAAkB,QAAuB;AAM3D,QAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO;AAC7D,QAAM,UACH,gBAAgB,IAAI,YAAY,OAAO,YAAY,IAAI,IAAI,IAAI,SAAS,GACrE,SAAS,UAAU,KAAK;AAC9B,QAAM,iBACH,IAAI,iBAAiB,MAAM,IAAI,aAAa,OAAO,aAAa;AACnE,QAAM,YAAY,IAAI,QAAQ,eAAe,IAAI,KAAK,IAAI;AAC1D,SAAO;AAAA,IACL,WAAW,IAAI,WAAW,IAAI,IAAI,OAAO,KAAK;AAAA;AAAA;AAAA,IAG9C,GAAI,IAAI,QAAQ,EAAE,aAAa,WAAW,IAAI,KAAK,EAAE,IAAI,CAAC;AAAA,IAC1D,GAAI,cAAc,OAAO,EAAE,WAAW,OAAO,SAAS,EAAE,IAAI,CAAC;AAAA,IAC7D,GAAI,gBAAgB,IAAI,UAAU,IAAI,IAAI,SAAS,IAC/C,EAAE,UAAU,gBAAgB,IAAI,UAAU,IAAI,IAAI,SAAS,EAAE,IAC7D,CAAC;AAAA,IACL,GAAI,UAAU,kBAAkB,IAAI,EAAE,cAAc,IAAI,CAAC;AAAA,EAC3D;AACF;AAGA,IAAM,eAAe,CACnB,OACA,KACA,QACA,MACA,MACA,SACG;AACH,MAAI,SAAS,OAAQ;AACrB,QAAM,MAAM,KAAK,IAAI,QAAQ,GAAG,CAAC;AACjC,MAAI,IAAI,MAAM,KAAK,IAAI,MAAM,EAAG;AAChC,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AACb,YAAM,OAAO,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;AACtC,YAAM,OAAO,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC;AACtC,YAAM;AAAA,QACJ;AAAA,UACE,EAAE,OAAO,GAAG,GAAG,EAAE;AAAA,UACjB,EAAE,OAAO,GAAG,IAAI,MAAM,IAAI,CAAC,EAAE;AAAA,UAC7B,EAAE,OAAO,GAAG,IAAI,MAAM,IAAI,CAAC,EAAE;AAAA,QAC/B;AAAA,QACA,EAAE,OAAO,gBAAgB,QAAQ,GAAG,KAAK;AAAA,MAC3C;AACA;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,OAAO,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;AACtC,YAAM,OAAO,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC;AACtC,YAAM;AAAA,QACJ;AAAA,UACE,EAAE,OAAO,GAAG,IAAI,MAAM,IAAI,CAAC,EAAE;AAAA,UAC7B,EAAE,OAAO,GAAG,GAAG,EAAE;AAAA,UACjB,EAAE,OAAO,GAAG,IAAI,MAAM,IAAI,CAAC,EAAE;AAAA,QAC/B;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,OAAO,MAAM,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;AACtD,YAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI;AAC1D;AAAA,IACF;AAAA,IACA,KAAK;AACH,YAAM,UAAU,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI;AACvC;AAAA,EACJ;AACF;AAGA,IAAM,kBAAkB,CAAC,OAAoB,SAAyB;AACpE,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,MAAM,IAAI,KAAK,YAAY,CAAC,GAAG,IAAK,QAAO,GAAG,IAAI,IAAI,CAAC;AACvE,QAAM,IAAI,KAAK,YAAY,CAAC;AAC5B,SAAO;AACT;AAKA,IAAM,eAAe,CACnB,SACyE;AACzE,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,EAAE,MAAM,MAAM,MAAM,OAAO,IAAI,cAAc,IAAI;AACvD,QAAM,UAAU,SAAS,UAAa,SAAS,MAAM,SAAS,IAAI;AAClE,QAAM,SAAS,UAAU,OAAO,IAAI;AACpC,SAAO;AAAA,IACL,MAAM,SAAS,QAAQ,MAAM,MAAM;AAAA,IACnC,UAAU,UAAU,GAAG,MAAM,SAAS,IAAI;AAAA,IAC1C;AAAA,IACA;AAAA,EACF;AACF;AAMA,IAAM,iBAAiB,CACrB,KACA,KACA,MACA,MACA,cAAc,GACd,cAAc,MACE;AAChB,QAAM,EAAE,MAAM,SAAS,IAAI,aAAa,IAAI;AAC5C,QAAM,QAAQ,IAAI,OAAO,SAAS,OAAO;AACzC,QAAM,aACJ,KAAK,YAAY,MAAM,cAAc,CAAC,IAAI,WAAW,IAAI,UAAU,IAC/D,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,UAAU,IAC7D;AACN,QAAM,QACJ,cAAc,MAAM,SAAS,gBAAgB,IAAI,YAAY,IAAI,CAAC;AACpE,MAAI,WAAY,KAAI,WAAW,IAAI,UAAU;AAC7C,QAAM,eAAe;AACrB,QAAM,cAAc;AAGpB,QAAM,kBAAkB;AACxB,QAAM,MAAM,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAC3D,MAAI,WAAW,IAAI,KAAK,GAAG;AAC3B,SAAO;AACT;AAKA,IAAM,sBAAsB,CAAC,QAA6B;AACxD,aAAW,KAAK,IAAI,IAAI;AACtB;AAAA,MACE;AAAA,MACA,OAAO,EAAE,EAAE;AAAA,MACX,kBAAkB,EAAE,IAAI;AAAA,MACxB,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;AAAA,MACjC,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AACJ;AAMA,IAAM,kBAAkB,CACtB,KACA,MACA,gBACgB;AAChB,QAAM,OAAO,aAAa,IAAI,EAAE;AAChC,QAAM,MAAM,IAAI,IAAI,WAAW;AAAA,IAC7B,CAAC,MACC,aAAa,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,QAC1D,KAAK,IAAI,EAAE,cAAc,WAAW,IAAI;AAAA,EAC5C;AACA,QAAM,SAAS,OAAO,IAAI,WAAW,IAAI,OAAO,IAAI,EAAE,EAAE;AACxD,MAAI,OAAQ,QAAO;AACnB,MAAI,KAAK,IAAI,cAAc,CAAC,IAAI,KAAM,QAAOC,cAAa,KAAK,IAAI;AACnE,QAAM,MAAM,GAAG,IAAI,KAAK,WAAW;AACnC,SACE,IAAI,WAAW,IAAI,GAAG,KACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA,GAAGA,cAAa,KAAK,IAAI,EAAE,IAAI,KAAK,KAAK,MAAM,cAAc,GAAG,CAAC;AAAA,IACjE;AAAA,IACA;AAAA,EACF;AAEJ;AAIA,IAAMA,gBAAe,CACnB,KACA,SACgB;AAChB,QAAM,EAAE,MAAM,QAAQ,QAAQ,IAAI,aAAa,IAAI;AACnD,QAAM,EAAE,MAAM,OAAO,IAAI,cAAc,IAAI;AAC3C,QAAM,UAAU,OAAO,MAAM,OAAO,SAAS,MAAM;AACnD,SACE,IAAI,WAAW,IAAI,IAAI,KACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA,UAAU,UAAU,OAAO,QAAQ,mBAAmB,GAAG,IAAI,QAAQ,YAAY,CAAC,GAAG,SAAS,IAAI,MAAM,KAAK,EAAE;AAAA,IAC/G;AAAA,EACF;AAEJ;AAKA,IAAM,gBAAgB,CACpB,KACA,KACA,SACgB;AAChB,QAAM,OAAO,aAAgB,KAAK,IAAI,IAAI,UAAU;AACpD,QAAM,MAAM,IAAI,WAAW,IAAI,OAAO,KAAK,EAAE,EAAE;AAC/C,SAAO,OACL,aAAa,SAAS,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC,EAAE,SACxD,aAAa,IAAI,EAAE,OACnB,MACAA,cAAa,KAAK,IAAI;AAC5B;AAUA,IAAM,eAAe,CACnB,OACA,SACA,UACA,QACA,UACA,QACA,QACA,MACA,SAEA,YACA,WAAyB,CAAC,MACvB;AACH,QAAM,EAAE,WAAW,MAAM,cAAc,GAAG,MAAM,IAAI;AAEpD,QAAMC,KAAI,cAAc,SAAS,MAAM,WAAW;AAClD,QAAM,QAAQ,UAAU,SAAS,QAAQA,IAAG,UAAU;AACtD,MACE,MAAM,MAAM,SAAS,KACpB,eAAe,UAAa,aAAa,KAC1C,QAAQ,SAAS,GAAI,KACrB,CAAC,CAAC,OAAO,QACT;AAMA,UAAM,SACH,gBAAgB,IAAI,MAAM,WAAW,MAAM,OAC3C,OAAO,SACJ,gBAAgB,SAAS,OAAO,IAAI,IACpC,YAAY,OAAO;AACzB,UAAM,QAAQ,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,OAAO;AAAA,MACxD,UAAU,WAAWH;AAAA,MACrB,iBAAiB,gBAAgB,QAAQ,MAAM;AAAA,MAC/C,GAAI,eAAe,UAAa,aAAa,IACzC,EAAE,OAAO,WAAW,IACpB,CAAC;AAAA,MACL,GAAG;AAAA,IACL,CAAC;AACD,QAAI,UAAW,OAAM,YAAY;AACjC;AAAA,EACF;AACA,QAAM,OAAO,MAAM,KAAK,UAAU,QAAQ,CAAC,GAAG,EAAE;AAChD,QAAM,MAAM,QAAQ,CAAC,KAAK,MAAM;AAE9B,UAAM,OAAO,IAAI,QAAQ,OAAO,EAAE;AAClC,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,IAAI,UAAU,MAAM,MAAM,IAAI,MAAM,UAAU,CAAC;AAC9D,UAAM,OAAO,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,MAAM;AAAA,MACnD,UAAU,WAAWA;AAAA,MACrB,qBAAqB,QAAQ,MAAM;AAAA,MACnC,mBACE,WAAW,WACP,sBAAsB,SACtB,WAAW,QACT,sBAAsB,MACtB,sBAAsB;AAAA;AAAA,MAE9B,sBAAsB,GAAG,MAAM;AAAA,MAC/B,GAAI,gBAAgB,IAAI,EAAE,sBAAsB,YAAY,IAAI,CAAC;AAAA,MACjE,GAAG;AAAA,IACL,CAAC;AACD,QAAI,UAAW,MAAK,YAAY;AAAA,EAClC,CAAC;AACH;AAQA,IAAM,kBAAkB,CACtB,KACA,SAEA,IAAI,IAAI,cAAc;AAAA,EACpB,CAACC,OAAM,gBAAgBA,GAAE,IAAI,MAAM,gBAAgB,IAAI;AACzD;AAeF,IAAM,0BAA0B,CAC9B,SACA,QACW;AACX,MAAI,CAAC,QAAQ,SAAS,cAAc,EAAG,QAAO;AAC9C,QAAM,MAAgB,CAAC;AACvB,MAAI,MAAM;AACV,aAAS;AACP,UAAM,QAAQ,QAAQ,QAAQ,gBAAgB,GAAG;AACjD,QAAI,UAAU,GAAI;AAGlB,UAAM,OAAO,QAAQ,MAAM,QAAQ,CAAC;AACpC,UAAME,KAAI,6BAA6B,KAAK,IAAI;AAChD,UAAM,MAAMA,KAAI,QAAQ,IAAIA,GAAE,QAAQ,QAAQ;AAC9C,QAAI,SAAS,QAAQ,MAAM,OAAO,GAAG;AACrC,UAAM,SAAS,wBAAwB,KAAK,MAAM,IAAI,CAAC;AAGvD,UAAM,SAAS,OAAO,QAAQ,eAAe;AAC7C,UAAM,OAAO,WAAW,KAAK,SAAS,OAAO,MAAM,MAAM;AACzD,UAAM,OAAO,kBAAkB,KAAK,IAAI,IAAI,CAAC;AAC7C,UAAM,SAAS,SAAS,IAAI,aAAa,IAAI,MAAM,IAAI;AAGvD,UAAM,MAAM,OAAO,gBAAgB,KAAK,IAAI,IAAI;AAChD,UAAM,MAAM,QAAQ,OAAO,oBAAoB,MAAM,CAAC,CAAC,IAAI;AAC3D,UAAM,MAAM,MAAM,iBAAiB,KAAK,IAAI,IAAI;AAChD,QAAI,OAAO,OAAO,WAAW,IAAI;AAC/B,YAAMC,SACH,OAAO,mBAAmB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAM;AAChE,YAAMC,SAAQ,OAAO,mBAAmB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;AACjE,YAAM,MAAM,KAAK,IAAID,MAAK;AAC1B,YAAM,MAAM,KAAK,IAAIA,MAAK;AAC1B,YAAM,OAAO,CAACE,IAAWC,OAAc;AAAA,SACpC,MAAMD,KAAI,MAAMC,MAAKF;AAAA,SACrB,MAAMC,KAAI,MAAMC,MAAKF;AAAA,MACxB;AACA,YAAM,QAAQ,IAAI,MACf,IAAI,CAAC,MAAM;AACV,cAAM,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAC5C,cAAM,KAAK,MAAM,QAAQ,KAAK;AAC9B,cAAM,KAAK,MAAM,QAAQ,KAAK;AAI9B,cAAM,aAAa,EAAE,QAAQD;AAC7B,cAAM,MACH,KAAK,IAAI,UAAU,IAAI,EAAE,SACxB,KAAK,IAAI,UAAU,IAAI,EAAE,UAC3BC;AACF,cAAM,MACH,KAAK,IAAI,UAAU,IAAI,EAAE,SACxB,KAAK,IAAI,UAAU,IAAI,EAAE,UAC3BA;AACF,cAAM,SAAS,EAAE,YAAY,CAAC;AAC9B,eACE;AAAA,GAAS,EAAE,QAAQ,MAAO,KAAK,KAAMD,SAAQ,MAAO,KAAK,IAAI,QAAQ,CAAC,CAAC;AAAA;AAAA,EAChE,GAAG,QAAQ,CAAC,CAAC;AAAA;AAAA,EAAS,GAAG,QAAQ,CAAC,CAAC;AAAA;AAAA,EAAS,GAAG,QAAQ,CAAC,CAAC;AAAA;AAAA,EAAS,GAAG,QAAQ,CAAC,CAAC;AAAA;AAAA,EAC/E,OAAO,MAAM;AAAA,IACpB,OAAO,IAAI,CAACI,OAAM;AAAA,GAAQA,KAAIH,QAAO,QAAQ,CAAC,CAAC;AAAA,CAAI,EAAE,KAAK,EAAE;AAAA,MAEhE,CAAC,EACA,KAAK,EAAE;AAGV,YAAM,KAAK,SAAS,IAAI,QAAQ,IAAI,CAAC,EAAE;AACvC,YAAM,OAAO,OAAO,MAAM,EAAE;AAC5B,YAAM,cAAc,KAAK,WAAW,MAAM,KACrC,MAAM;AACL,cAAM,OAAO,gBAAgB,KAAK,IAAI;AACtC,eAAO,OAAO,KAAK,QAAQ,IAAI,KAAK;AAAA,MACtC,GAAG,IACH;AACJ,eACE,OAAO,MAAM,GAAG,EAAE,IAClB;AAAA,EAAO,IAAI,MAAM,MAAM;AAAA,IACvB,QACA,KAAK,MAAM,WAAW;AACxB,UAAI,IAAK,UAAS,OAAO,QAAQ,aAAa,WAAW;AAAA,eAGhD,QAAQ,SAAS,IAAI,KAAK,YAAY,GAAG;AAChD,cAAM,SAAS,OAAO,QAAQ;AAAA;AAAA,EAAQ,IAAI;AAAA,GAAM,MAAM;AACtD,YAAI,WAAW;AACb,mBACE,OAAO,MAAM,GAAG,MAAM,IACtB;AAAA;AAAA,EAAQ,IAAI,KAAK,YAAY,CAAC;AAAA,IAC9B,OAAO,MAAM,SAAS,KAAK,SAAS,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,MAAM,KAAK,KAAK,GAAG,MAAM;AAC1C,UAAM;AAAA,EACR;AACA,MAAI,KAAK,QAAQ,MAAM,GAAG,CAAC;AAC3B,SAAO,IAAI,KAAK,EAAE;AACpB;AAEA,IAAM,iBAAiB,CAAC,SAA0C;AAChE,QAAM,MAAM,KACT,YAAY,EACZ,QAAQ,MAAM,GAAG,EACjB,QAAQ,OAAO,GAAG;AACrB,SAAO,wBAAwB,GAAG,KAAK,wBAAwB;AACjE;AAEA,IAAM,aAAa,CACjB,OACA,KACA,MACA,QACG;AACH,MAAI,IAAI,SAAS,QAAS;AAI1B,MAAI,IAAI,KAAK,SAAS,YAAY;AAChC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,aAAa,WAAW,IAAI,KAAK,MAAM;AAAA,MACvC,WAAW,OAAO,eAAe,IAAI,KAAK,MAAM,CAAC;AAAA,IACnD;AAAA,EACF;AACA,QAAM,WAAW,IAAI,mBAAmB;AACxC,aAAW,QAAQ,IAAI,OAAO;AAC5B,aAAS;AAAA,MACP,IAAI;AAAA,QACF,KAAK,OAAO,IAAI,CAACI,QAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,GAAG,OAAOA,GAAE,MAAM,EAAE;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACA,QAAM;AAAA;AAAA;AAAA;AAAA,IAIJ,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,SAAS,aAC3C,QAAQ,EAAE,MAAM,wBAAwB,MAAM,CAAC,IAC/C,IAAI,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMhB,QAAQ;AAAA,QACN,MAAO,gBAAgB,KAAK,IAAI,KAAK,IAAI,IACrC,IAAI,KAAK,KAAK,YAAY,IAC1B,eAAe,IAAI,KAAK,IAAI;AAAA,QAChC,OAAO,IAAI,KAAK,QAAQT;AAAA,QACxB,OAAO,IAAI,KAAK,QAAQ,IAAI;AAAA,MAC9B,CAAC;AAAA,QACD,QAAQ;AAAA,MACN,MAAM,wBAAwB;AAAA,MAC9B,OAAO,IAAI,KAAK,QAAQA,WAAU;AAAA;AAAA,MAElC,OAAQ,IAAI,KAAK,UAAU,IAAI,QAAS;AAAA,IAC1C,CAAC;AAAA;AACT,QAAM,UAAU,MAAM,SAAS,UAAU,MAAM,IAAI;AACnD,MAAI,IAAI,KAAK,SAAS,aAAa,IAAI,KAAK;AAC1C,QAAI,aAAa,IAAI,QAAQ,QAAQ,IAAI,KAAK,MAAM;AACxD;AAIA,IAAM,yBAAyB,CAC7B,QACA,MACA,MACA,QACS;AACT,aAAW,OAAO,CAAC,GAAG,KAAK,gBAAgB,GAAG,KAAK,UAAU,GAAG,KAAK,OAAO;AAC1E,WAAO,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI;AAC3C,MAAI,KAAK;AACP,WAAO;AAAA,MACL,GAAG,KAAK,OAAO,MAAM;AAAA,MACrB,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO,aAAaA;AAAA,MACzB,KAAK,OAAO,WAAWA;AAAA,MACvB;AAAA,IACF;AACF,aAAW,SAAS,KAAK;AACvB;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL;AAAA,IACF;AACF,aAAW,QAAQ,KAAK;AACtB;AAAA,MACE;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,QACE,WAAWE,cAAa,KAAK,KAAK,IAAI,EAAE;AAAA,QACxC,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,OAAO,KAAK;AAAA,MACd;AAAA,IACF;AACJ;AAKA,IAAM,oBAAoB,CACxB,KACA,MACA,UACW;AACX,QAAM,QAAQ,IAAI,OAAO,SAAS,OAAO;AACzC,QAAM,aACJ,KAAK,YAAY,MAAM,cAAc,CAAC,IAAI,cAAc,IAAI,UAAU,IAClE,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,UAAU,IAC7D;AACN,QAAM,MACJ,cACA,IAAI,OAAO,YAAY,gBAAgB,IAAI,eAAe,IAAI,CAAC;AACjE,MAAI,WAAY,KAAI,cAAc,IAAI,UAAU;AAChD,QAAMG,SAAQ,MAAM,SAAS;AAC7B,MAAI,SAAS,MAAM;AACnB,MAAI,SAAS,MAAM;AACnB,MAAI,SAAS,MAAM;AACnB,MAAI,SAAS,MAAM;AACnB,MAAI,SAAS,MAAM;AACnB,MAAI,SAAS,MAAM;AACnB,MAAIA,WAAU,EAAG,KAAI,WAAWA;AAChC,MAAI,MAAM,cAAc,SAAU,KAAI,SAAS,aAAa,MAAM,SAAS;AAC3E,MAAI,WAAW;AAAA,IACb;AAAA,IACA,YAAY,KAAK;AAAA,IACjB,MAAM;AAAA,EACR,EAAE;AACF,SAAO,IAAI;AACb;AAIA,IAAM,qBAAqB,CAAC,QAA6B;AACvD,aAAW,KAAK,IAAI,IAAI;AACtB,QAAI,gBAAgB;AAAA,MAClB,EAAE;AAAA,MACF,kBAAkB,KAAK,kBAAkB,EAAE,IAAI,GAAG,CAAC;AAAA,IACrD;AACJ;AAIA,IAAM,sBAAsB,CAC1B,KACA,MACA,UACW;AACX,QAAM,WACJ,IAAI,gBAAgB,IAAI,KAAK,EAAE,KAC/B,IAAI,gBAAgB,OAAO,EAAE,KAAK,EAAE,SACpC;AACF,QAAM,MAAM,KAAK,UAAU;AAAA,IACzB;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,KAAK;AAAA,IACjB,MAAM,SAAS;AAAA,EACjB,CAAC;AACD,QAAM,SAAS,IAAI,UAAU,IAAI,GAAG;AACpC,MAAI,OAAQ,QAAO;AACnB,QAAM,KAAK,IAAI,kBAAkB,IAAI,QAAQ,KAAK,KAAK;AACvD,MAAI,kBAAkB,IAAI,UAAU,CAAC;AACrC,QAAM,OAAO,kBAAkB,KAAK,GAAG,QAAQ,IAAI,CAAC,IAAI,KAAK;AAC7D,MAAI,UAAU,IAAI,KAAK,IAAI;AAC3B,SAAO;AACT;AAGA,IAAM,eAAsD;AAAA,EAC1D,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;AAEA,IAAM,iBAAiB,CACrB,OACA,KACA,MACA,QACY;AACZ,MAAI,IAAI,SAAS,YAAa,QAAO;AAIrC,MAAI,IAAI,SAAS,YAAY,IAAI,OAAO,SAAS,GAAG;AAClD,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC9C,YAAM,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,GAAG,IAAI,CAAC,EAAE;AAC1D,YAAM,eAAe,OAAO,MAAM,MAAM,GAAG,KAAK;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,kBAAkB,KAAK,IAAI,IAAI,SAAS;AACrD,MAAI,CAAC,KAAM,QAAO;AAIlB,QAAM,YAAY,aAAa,IAAI,eAAe;AAClD,QAAM,QAAQ,IAAI,OAAO,SAAS,SAAS;AAC3C,yBAAuB,OAAO,MAAM,MAAM,GAAG;AAM7C,QAAM,YAAY,YAAe,KAAK,IAAI,IAAI,SAAS;AACvD,QAAM,cACJ,IAAI,kBAAkB,UACtB,OAAO,OAAO,IAAI,aAAa,EAAE,KAAK,CAACI,OAAMA,OAAM,MAAS;AAC9D,QAAM,YACJ,eAAe,IAAI,UAAU,IACzB,oBAAoB,KAAK,WAAW;AAAA,IAClC,GAAG;AAAA,IACH,GAAG,IAAI;AAAA,IACP,OAAO,IAAI;AAAA,EACb,CAAC,IACA,IAAI,gBAAgB,IAAI,UAAU,EAAE,KACrC,oBAAoB,KAAK,WAAW,SAAS;AAMnD,QAAM,UAAU,IAAI,OAAO,CAAC,GAAG;AAC/B,QAAM,YAAY;AAAA,IAChB,GAAG,YAAe,KAAK,IAAI,IAAI,SAAS;AAAA,IACxC,GAAG,IAAI;AAAA,EACT,EAAE;AACF,QAAM,OACJ,YAAY,SACR,SACA,QACG,MAAM,oBAAoB,IAAI,IAAI,CAAC,EACnC,KAAK,IAAI,EACT,MAAM,eAAe,EACrB;AAAA,IACC,IAAI,SAAS,YAAY,IAAI,SAAS,aAClC,eAAe,KAAK,OAAO,SAAS,IACpC;AAAA,EACN;AACR,QAAM,UAAU;AAAA,IACd;AAAA,IACA,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC;AAAA;AAAA;AAAA,IAGA,GAAI,KAAK,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,IACnE,GAAG;AAAA,EACL;AACA,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK,WAAW;AACd,YAAM,CAAC,QAAQC,IAAG,CAAC,IAAI,IAAI;AAC3B,YAAM,CAAC,KAAK,IAAI,qBAAqB,GAAG;AACxC,YAAM,oBAAoB,GAAG,MAAM,GAAG,GAAGA,EAAC,GAAG,GAAG,CAAC,GAAG;AAAA,QAClD,GAAG;AAAA;AAAA,QAEH,iBAAiB,GAAG,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC;AAAA,MACjE,CAAC;AACD;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AAEb,YAAM,CAAC,QAAQT,EAAC,IAAI,IAAI;AACxB,YAAM,aAAa,GAAGA,EAAC,GAAG,GAAG,MAAM,GAAG,OAAO;AAC7C;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,YAAM,CAAC,IAAI,EAAE,IAAI,IAAI;AACrB,YAAM,eAAe,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO;AAC5C;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AAGb,YAAM,CAAC,IAAI,EAAE,IAAI,IAAI;AACrB,YAAM,EAAE,GAAAU,GAAE,IAAI,WAAW,GAAG;AAC5B,YAAM,aAAa,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG;AAAA,QACjC,GAAG;AAAA,QACH,iBAAiB,GAAG,KAAK,SAAS,CAAC,EAAE,CAAC;AAAA,QACtC,OAAO,KAAK,MAAMA,GAAE,GAAGA,GAAE,CAAC,IAAIX;AAAA,MAChC,CAAC;AACD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,IAAM,iBAAiB,CAAC,MAAY,QAA+B;AACjE,MAAI,KAAK,QAAQ,KAAK,MAAM,GAAI,QAAO;AACvC,QAAM,MAAM,iBAAiB,MAAM,IAAI,IAAI,UAAU;AACrD,QAAM,OAAO,SAAS,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM;AACpD,QAAM,EAAE,MAAM,MAAM,OAAO,IAAI,cAAc,IAAI;AACjD,QAAM,SAAS,IAAI,aAAa,KAAK;AACrC,QAAM,OAAO,KAAK,OAAO,SACrB,gBAAgB,KAAK,SAAS,KAAK,OAAO,IAAI,IAC9C,YAAY,KAAK,OAAO;AAC5B,SACE,OAAO,aAAa,YAAY,IAAI,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,cACpE,CAAC,OAAO,QAAQ,CAAC,CAAC,OACvB,IAAI,gBAAgB,IAAI,MAAM,IAAI,WAAW,MAAM,MACpD,GAAG,IAAI;AAEX;AAGA,IAAM,eAAe,CACnB,QACA,YAEC,WAAW,QAAQ,IAAI,WAAW,WAAW,IAAI,MACjD,WAAW,SAAS,IAAI,WAAW,WAAW,IAAI;AAQrD,IAAM,mBAAmB,CACvB,OACA,KACA,QACS;AACT,QAAM,SAAS,YAAY,KAAK,IAAI,IAAI,UAAU;AAClD,QAAM,OAAO,KAAK,EAAE,IAAI,eAAe;AAEvC,QAAM,QAAQ,IAAI,OAAO,SAAS,OAAO;AAAA,IACvC;AAAA,IACA,IAAI,OAAO,SAAS;AAAA,IACpB;AAAA,EACF;AACA,QAAM,QAAQ;AACd,QAAM,SAAS,IAAI;AACnB,QAAM,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE;AAC5B,aAAW,SAAS,OAAO;AACzB;AAAA,MACE;AAAA,MACA;AAAA,QACE,gBAAgB,OAAO,EAAE,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;AAAA,QACjE;AAAA,QACA,CAAC,IAAI;AAAA,MACP;AAAA,MACA;AAAA,IACF;AACF,MAAI,WAAW;AACf,QAAM,oBACJ,IAAI,OAAO,SAAS,OAAO,iBAAiB,QAAQ;AAAA,IAClD,CAAC,MAAM,EAAE,SAAS;AAAA,EACpB,GAAG,UAAU;AAEf,QAAM,OAAO,IAAI,KAAK;AACtB,QAAM,OAAO,IAAI,QAAQ;AACzB,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,QAAQ,IAAI,CAACU,OAAM,CAAC,GAAGA,GAAE,GAAG,IAAIA,GAAE,GAAG,IAAIA,EAAC,CAAU;AAAA,EAC7D;AACA,QAAM,QAA6B,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,MAAM;AACxB,aAASE,KAAI,GAAGA,KAAI,MAAMA,MAAK;AAC7B,YAAMF,KAAI,SAAS,IAAI,GAAG,CAAC,IAAIE,EAAC,EAAE;AAClC,UAAI,CAACF,IAAG;AACN,cAAM,KAAK,EAAE,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ,MAAM,WAAW,EAAE,CAAC;AACrE;AAAA,MACF;AACA,YAAM,EAAE,KAAK,IAAI,eAAe,KAAK,IAAI,IAAI,YAAY,GAAGE,EAAC;AAC7D,YAAM,KAAK;AAAA,QACT,MAAM,eAAe,MAAM,GAAG;AAAA,QAC9B,MAAMF,GAAE;AAAA,QACR,MAAMA,GAAE;AAAA,QACR,QAAQ;AAAA,QACR,WAAW,aAAa,KAAK,QAAQ,KAAK,MAAM;AAAA,MAClD,CAAC;AAAA,IACH;AACF,QAAM,QAAQ,CAAC,OAAiB,GAAG,MAAM,CAAC,EAAE,IAAI,CAACJ,IAAG,MAAMA,KAAI,GAAG,CAAC,CAAC;AACnE,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,WAAW;AAAA,IACX;AAAA,IACA,kBAAkB,IAAI;AAAA,IACtB,UAAU,IAAI;AAAA,IACd,WAAW,EAAE,GAAG,KAAK,IAAI,IAAI,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,QAAQ,EAAE;AAAA,IAClE,YAAY,MAAM,OAAO,IAAI;AAAA,IAC7B,WAAW,MAAM,OAAO,IAAI;AAAA,IAC5B;AAAA,EACF,CAAC;AACD,SAAO,YAAY,IAAI,WAAW,IAAI,IAAI,OAAO,KAAK;AACtD,MAAI,IAAI,OAAO;AACb,WAAO,cAAc,WAAW,IAAI,KAAK;AACzC,UAAM,KAAK,eAAe,IAAI,KAAK;AACnC,QAAI,OAAO,KAAM,QAAO,YAAY,OAAO,EAAE;AAAA,EAC/C;AACA,QAAM,UAAU,MAAM;AACxB;AAEA,IAAM,cAAc,CAClB,OACA,KACA,QACS;AACT,QAAM,SAAS,MAAM,SAAS;AAC9B,sBAAoB,OAAO,KAAK,GAAG;AAGnC,MAAI,IAAI,cAAc;AACpB,eAAW,UAAU,MAAM,SAAS,MAAM,MAAM;AAC9C,oBAAc,QAAQ,eAAe,IAAI,SAAS,CAAC;AACzD;AAEA,IAAM,sBAAsB,CAC1B,OACA,KACA,QACS;AACT,QAAM,OAAO,WAAW,KAAK,GAAG;AAChC,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,YAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI;AACxC;AAAA,IACF,KAAK;AACH,YAAM,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI;AACxC;AAAA,IACF,KAAK;AACH,YAAM;AAAA,QACJ,IAAI,OAAO,IAAI,CAACG,QAAO;AAAA,UACrB,OAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,EAAE;AAAA,UACxB,OAAOA,GAAE;AAAA,QACX,EAAE;AAAA,QACF;AAAA,UACE,OAAO,IAAI,SAAS,gBAAgB,SAAS,gBAAgB;AAAA,UAC7D,GAAG;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM,UAAU,GAAG,IAAI,MAAM,GAAG,IAAI,QAAQ,IAAI;AAChD;AAAA,IACF,KAAK;AACH,YAAM;AAAA,QACJ,GAAG,IAAI,MAAM;AAAA,QACb,IAAI;AAAA,QACJ,IAAI,aAAaT;AAAA,QACjB,IAAI,WAAWA;AAAA,QACf;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM;AAAA,QACJ,GAAG,IAAI,MAAM;AAAA,QACb,GAAG,IAAI,SAAS;AAAA;AAAA,QAChB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,iBAAW,OAAO,KAAK,MAAM,GAAG;AAChC;AAAA,IACF,KAAK,QAAQ;AAGX,YAAM,MAAM,iBAAiB,KAAK,IAAI,IAAI,UAAU;AACpD,YAAM,EAAE,WAAW,UAAU,IAAI;AACjC,YAAM,OAAO,SAAS,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM;AAIpD,iBAAW,QAAQ;AAAA,QACjB;AAAA,QACA,IAAI;AAAA,QACJ,IAAI,IAAI;AAAA,MACV;AACE,cAAM;AAAA,UACJ,KAAK,OAAO,IAAI,CAACS,QAAO;AAAA,YACtB,OAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,EAAE;AAAA,YACxB,OAAOA,GAAE;AAAA,UACX,EAAE;AAAA,UACF;AAAA,YACE,OAAO,KAAK,SAAS,gBAAgB,SAAS,gBAAgB;AAAA,YAC9D,GAAG;AAAA,UACL;AAAA,QACF;AACF,UAAI,IAAI,YAAY,SAAS,KAAK,IAAI,gBAAgB;AAGpD,mBAAW,QAAQ,IAAI,aAAa;AAClC,gBAAM;AAAA,YACJ,KAAK,IAAI,CAACA,QAAO,EAAE,OAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,EAAE,EAAE,EAAE;AAAA,YAC/C;AAAA,UACF;AACA;AAAA,YACE;AAAA,YACA,KAAK,CAAC;AAAA,YACN,KAAK,CAAC;AAAA,YACN,YAAY,IAAI;AAAA,YAChB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,WAAW,IAAI,YAAY,SAAS,GAAG;AAKrC,cAAM,QAAQ,IAAI,YAAY,CAAC;AAC/B,cAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,cAAM,SAAS;AAAA,UACb,GAAG,IAAI,SAAS,IAAI,SAAS;AAAA,UAC7B,GAAG,IAAI,SAAS,IAAI,SAAS;AAAA,QAC/B;AACA,cAAM,MAAM,KAAK,IAAI,KAAK,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI;AACzD,cAAM,QAAQ,IAAI,YAAY,IAAI,CAAC,SAAS;AAC1C,gBAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,gBAAM,QACJ,KAAK,MAAM,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,CAAC,IAAI;AACzD,iBAAO,SAAS,KAAK,SAAS,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AAAA,QACxD,CAAC;AACD,cAAM,SAAS,IAAI,kBAAkB;AAAA,UACnC;AAAA,UACA;AAAA,UACA,iBAAiB,EAAE,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,IAAI;AAAA,UACxD,cAAc;AAAA,UACd,SAAS,IAAI,OAAO,SAChB,gBAAgB,IAAI,SAAS,IAAI,OAAO,IAAI,IAC5C,YAAY,IAAI,OAAO;AAAA,UAC3B,YAAY,IAAI;AAAA,UAChB;AAAA,UACA,cAAc,IAAI;AAAA,UAClB,cAAc,IAAI;AAAA;AAAA,UAElB,YACE,IACA,IAAI,CAAC,OAAO,UAAU,QAAQ,EAAE,QAAQ,IAAI,MAAM,IAClD,CAAC,QAAQ,UAAU,OAAO,EAAE,QAAQ,IAAI,MAAM;AAAA,UAChD,aAAa,IAAI;AAAA,UACjB,iBAAiB,cAAc,KAAK,KAAK,IAAI,EAAE;AAAA,UAC/C,gBAAgB,IAAI;AAAA,QACtB,CAAC;AACD,eAAO,YAAY,IAAI,WAAW,IAAI,IAAI,OAAO,KAAK;AACtD,YAAI,IAAI,OAAO;AACb,iBAAO,cAAc,WAAW,IAAI,KAAK;AACzC,gBAAM,KAAK,eAAe,IAAI,KAAK;AACnC,cAAI,OAAO,KAAM,QAAO,YAAY,OAAO,EAAE;AAAA,QAC/C;AACA,cAAM,UAAU,MAAM;AACtB;AAAA,MACF;AAIA;AAAA,QACE;AAAA,QACA,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,aAAa,IAAI;AAAA,QACrB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,QACA,IAAI;AAAA,QACJ,IAAI,UAAU,SAAY,SAAY,IAAI,QAAQ,IAAI;AAAA,QACtD;AAAA,UACE,WAAW,cAAc,KAAK,KAAK,IAAI,EAAE;AAAA,UACzC,MAAM;AAAA,UACN,aAAa,IAAI;AAAA,UACjB,OAAO,IAAI;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK;AACH,UAAI,CAAC,eAAe,OAAO,KAAK,MAAM,GAAG,GAAG;AAC1C,aAAK,KAAK,WAAW;AACrB;AAAA,MACF;AACA;AAAA,IACF,KAAK,SAAS;AAMZ,UAAI,IAAI,WAAW,SAAS,IAAI,YAAY,GAAG;AAC7C,aAAK,KAAK,OAAO;AACjB;AAAA,MACF;AACA,YAAM,WAAW;AAAA,QACf;AAAA,QACA,IAAI,IAAI;AAAA,QACR,uBAAuB,IAAI,GAAG;AAAA,QAC9B,IAAI;AAAA,MACN;AACA,UAAI,SAAS,WAAW,GAAG;AACzB,aAAK,KAAK,OAAO;AACjB;AAAA,MACF;AACA,YAAM,SAAS,IAAI;AACnB,UAAI,WAAW,KAAK,IAAI,YAAY;AACpC,UAAI;AACF,mBAAW,SAAS,UAAU;AAC5B,cAAI,MAAM,SAAS,WAAY;AAC/B,sBAAY,OAAO,OAAO,GAAG;AAAA,QAC/B;AAAA,MACF,UAAE;AACA,YAAI,WAAW,IAAI;AAAA,MACrB;AACA,UAAI,WAAW;AACf;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AAIZ,UAAI,CAAC,IAAI,eAAe;AACtB,yBAAiB,OAAO,KAAK,GAAG;AAChC;AAAA,MACF;AACA,YAAM,SAAS,IAAI;AACnB,iBAAW,SAAS,YAAY,KAAK,IAAI,IAAI,UAAU,EAAE;AACvD,oBAAY,OAAO,OAAO,GAAG;AAC/B,UAAI,WAAW;AACf;AAAA,IACF;AAAA,IACA,KAAK;AAEH,WAAK,KAAK,UAAU;AACpB;AAAA,IACF,KAAK,aAAa;AAMhB,UACE,IAAI,UACH,IAAI,WAAW,SAAS,IAAI,WAAW,SACxC,IAAI,OAAO,SAAS,QACpB;AACA,aAAK,KAAK,WAAW;AACrB;AAAA,MACF;AACA,YAAM,OAAO,IAAI,OAAO;AACxB,UAAI,YAAY,IAAI,WAAW,IAAI,IAAI;AACvC,UAAI,CAAC,WAAW;AACd,oBAAY,GAAG,kBAAkB,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,OAAO,IAAI,IAAI,IAAI,WAAW,IAAI,KAAK,EAAE;AACrG,cAAM,QAAQ,IAAI,OAAO,SAAS,SAAS;AAC3C,cAAM,QAAQ;AACd,cAAM,eAAe;AACrB,YAAI,WAAW,IAAI,MAAM,SAAS;AAAA,MACpC;AACA,YAAM,UAAU,WAAW,GAAG,IAAI,QAAQ,GAAG;AAAA,QAC3C,GAAG;AAAA,QACH,aAAa;AAAA,UACX,GAAG,IAAI,WAAW,CAAC,IAAI,QAAQ,IAAI;AAAA,UACnC,GAAG,IAAI;AAAA,UACP,GAAG,IAAI;AAAA,QACT;AAAA,QACA,eAAgB,IAAI,WAAW,MAAO,KAAK;AAAA,MAC7C,CAAC;AACD;AAAA,IACF;AAAA,IACA,KAAK;AAEH,WAAK,KAAK,SAAS;AACnB;AAAA,IACF;AACE,WAAK,KAAM,IAAoB,IAAI;AACnC;AAAA,EACJ;AACA,MAAI;AACN;AAEA,IAAM,OAAO,CAAC,KAAoB,SAChC,IAAI,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC;AAExD,IAAM,gBAAgB,CACpB,OACA,IACA,IACA,QACS;AACT,QAAM;AAAA,IACJ,IAAI,eAAe;AAAA,MACjB,QAAQ,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE;AAAA,MACrE,OAAO,GAAG,KAAK;AAAA,MACf,QAAQ,GAAG,KAAK;AAAA,MAChB,YAAY,GAAG;AAAA;AAAA;AAAA,MAGf,YAAY,GAAG,KAAK,IAAI,GAAG;AAAA,MAC3B;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,GAAG;AAAA,MACX,oBAAoB,GAAG,eACpB,IAAI,CAAC,YAAY,IAAI,aAAa,IAAI,OAAO,GAAG,MAAM,EACtD,OAAO,CAAC,MAAmB,MAAM,MAAS;AAAA,IAC/C,CAAC;AAAA,EACH;AACA,MAAI;AACN;AAmBO,IAAM,kBAAoC;AAAA,EAC/C,gBAAgB;AAAA,EAChB,eAAe;AACjB;AAOO,IAAM,WAAW,CACtB,KACA,SACA,UAA4B,CAAC,MACT;AACpB,QAAM,SAAS,IAAI,UAAU;AAC7B,SAAO,SAAS,MAAM,WAAW;AAMjC,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,aAAW,KAAK,IAAI,WAAW;AAC7B,QAAI,EAAE,SAAS,WAAW,EAAG;AAC7B,UAAM,UAAU,EAAE,KAAK,YAAY;AACnC,QAAI,cAAc,IAAI,OAAO,EAAG;AAChC,kBAAc,IAAI,OAAO;AACzB,UAAM,eAAe,EAAE,eAAe,EAAE,MACrC,QAAQ,iBAAiB,EAAE,EAC3B,MAAM,GAAG,EAAE;AACd,WAAO,SAAS,SAAS,aAAa,EAAE,QAAQ;AAAA,EAClD;AACA,aAAWR,MAAK,gBAAgB;AAC9B,QAAIA,GAAE,SAAS,WAAW,EAAG;AAC7B,UAAM,UAAUA,GAAE,WAAWA,GAAE,KAAK,YAAY;AAChD,QAAI,cAAc,IAAI,OAAO,EAAG;AAChC,kBAAc,IAAI,OAAO;AACzB,UAAM,cAAcA,GAAE,MAAM,QAAQ,iBAAiB,EAAE,EAAE,MAAM,GAAG,EAAE;AACpE,WAAO,SAAS,SAAS,aAAaA,GAAE,QAAQ;AAAA,EAClD;AAGA,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,eAAe,oBAAI,IAAsB;AAK/C,QAAM,QAAQ,oBAAI,IAAY,CAAC,GAAG,CAAC;AACnC,aAAW,SAAS,IAAI,QAAQ;AAC9B,QAAI,OAAO,kBAAkB,MAAM,IAAI;AACvC,QAAI,SAAS,KAAK;AAChB,YAAM,OAAO;AACb,eAAS,IAAI,GAAG,MAAM,IAAI,KAAK,YAAY,CAAC,GAAG,IAAK,QAAO,GAAG,IAAI,IAAI,CAAC;AACvE,YAAM,IAAI,KAAK,YAAY,CAAC;AAAA,IAC9B;AACA,eAAW,IAAI,MAAM,IAAI,IAAI;AAC7B,QAAI,SAAS,KAAK;AAChB,YAAM,OAAO,OAAO,MAAM,GAAG;AAC7B,UAAI,MAAM;AACR,sBAAc,MAAM,eAAe,MAAM,SAAS,CAAC;AACnD,qBAAa,IAAI,MAAM,IAAI,IAAI;AAAA,MACjC;AACA;AAAA,IACF;AACA,UAAM,SACH,MAAM,UAAU,IAAI,WAAW,WAC/B,MAAM,SAAS,WAAW,SAAS;AACtC,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,MACA,WAAW,MAAM,KAAK;AAAA,MACtB,gBAAgB,MAAM,UAAU,IAAI,SAAS,KAAK;AAAA,MAClD,SAAS;AAAA,IACX;AACA,UAAM,KAAK,eAAe,MAAM,KAAK;AACrC,QAAI,OAAO,KAAM,QAAO,YAAY;AACpC,kBAAc,QAAQ,eAAe,MAAM,SAAS,CAAC;AACrD,iBAAa,IAAI,MAAM,IAAI,MAAM;AAAA,EACnC;AAIA,QAAM,kBACJ,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,GACvE,UAAU;AAChB,QAAM,iBACJ,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,GACtE,UAAU;AAChB,QAAM,cAAc,OAAO,SAAS,QAAQ,cAAc;AAC1D,SAAO,SAAS,QAAQ;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,EACd;AACA,QAAM,eAAe,OAAO,SAAS,QAAQ;AAAA,IAC3C,IAAI,mBAAmB;AAAA,MACrB,MAAM;AAAA,MACN;AAAA,MACA,WAAW,IAAI,UAAU,CAAC,EAAE;AAAA,MAC5B,YAAY,IAAI,UAAU,CAAC,EAAE;AAAA,MAC7B,kBAAkB,YAAY;AAAA,IAChC,CAAC;AAAA,EACH;AACA,eAAa,oBAAoB,YAAY;AAC7C,cAAY,eAAe,YAAY,aAAa,MAAM;AAI1D,QAAM,iBAAiB,OAAO,SAAS,QAAQ,cAAc;AAC7D,SAAO,SAAS,QAAQ;AAAA,IACtB;AAAA,IACA,eAAe;AAAA,EACjB;AACA,QAAM,aAAa,OAAO,SAAS,QAAQ;AAAA,IACzC,IAAI,iBAAiB;AAAA,MACnB,MAAM;AAAA,MACN,eAAe;AAAA,MACf,YAAY,IAAI,WAAW,CAAC,GAAG,cAAc;AAAA,MAC7C,QAAQ;AAAA,MACR,kBAAkB,eAAe;AAAA,IACnC,CAAC;AAAA,EACH;AACA,aAAW,oBAAoB,eAAe;AAC9C,iBAAe,eAAe,YAAY,WAAW,MAAM;AAE3D,QAAM,MAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,oBAAI,IAAI;AAAA,IACjB,UAAU;AAAA,IACV,eAAe;AAAA,IACf,YAAY,oBAAI,IAAI;AAAA,IACpB,YAAY,CAAC;AAAA,IACb,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,eAAe,QAAQ,iBAAiB;AAAA,IACxC,kBAAkB,WAAW;AAAA,IAC7B,iBAAiB;AAAA,IACjB,oBAAoB,aAAa;AAAA,IACjC;AAAA,IACA;AAAA,IACA,YAAY,oBAAI,IAAI;AAAA,IACpB,YAAY,oBAAI,IAAI;AAAA,IACpB,iBAAiB,oBAAI,IAAI;AAAA,IACzB,eAAe,oBAAI,IAAI;AAAA,IACvB,WAAW,oBAAI,IAAI;AAAA,IACnB,mBAAmB,oBAAI,IAAI;AAAA,IAC3B,cAAc,oBAAI,IAAI;AAAA,EACxB;AAGA,sBAAoB,GAAG;AACvB,qBAAmB,GAAG;AAGtB,aAAW,OAAO,IAAI;AACpB,gBAAY,OAAO,SAAS,OAAO,YAAY,KAAK,GAAG;AAIzD,QAAM,gBAKA,CAAC;AACP,MAAI,QAAQ,QAAQ,CAAC,QAAQ,MAAM;AACjC,UAAM,QACJ,MAAM,IAAI,OAAO,SAAS,OAAO,aAAa,OAAO,cAAc;AACrE,UAAM,SAAS,OAAO,SAAS,OAAO,iBAAiB,QAAQ;AAAA,MAC7D,CAAC,MAAM,EAAE,SAAS,MAAM;AAAA,IAC1B;AAGA;AAAA,MACE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,OAAO,GAAG,OAAO,MAAM,OAAO;AAAA,QAClE,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,QAC1B,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB,CAAC;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI;AAEJ,QAAI,aAAa;AACjB,eAAW,OAAO,OAAO,SAAS;AAChC,UAAI,IAAI,SAAS,WAAY,eAAc,OAAO,KAAK,cAAc,GAAG;AAAA,UACnE,aAAY,OAAO,KAAK,GAAG;AAAA,IAClC;AAEA,QAAI,QAAQ;AACV,oBAAc,KAAK;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,mBAAmB,OAAO;AAAA,QAC1B,OAAO,OAAO,MAAM;AAAA,QACpB,QAAQ,OAAO,MAAM;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,OAAO,SAAS;AAChC,QAAM,aAAa,QAAQ,cAAc;AACzC,UAAQ,eAAe,eAAe,WAAW,MAAM;AACvD,QAAM,cAAc,OAAO,SAAS,OAAO,iBAAiB,QAAQ;AAAA,IAClE,CAAC,MAAM,EAAE,SAAS;AAAA,EACpB;AACA,QAAM,UAAU;AAAA,IACd;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,mBAAmB,aAAa,UAAU;AAAA,IAC5C;AAAA,IACA,GAAG,cAAc,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,UAAU,IAAI,EAAE,EAAE;AAAA,EAC5D;AACA,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,QAAQ;AAAA,MACxB,IAAI,aAAa;AAAA,QACf,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA,QAClB,aAAa,MAAM;AAAA,QACnB,mBAAmB,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AACA,cAAU,oBAAoB,WAAW;AACzC,eAAW,eAAe,MAAM,MAAM,UAAU,MAAM;AAEtD,UAAM,SAAS,OAAO,SAAS,OAAO,iBAAiB,QAAQ;AAAA,MAC7D,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,IAC5B;AACA,QAAI,OAAQ,QAAO,eAAe,UAAU;AAAA,EAC9C;AAEA,QAAM,UAAU;AAAA,IACd,qBAAqB,OAAO,UAAU,GAAG,IAAI,UAAU;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AAAA;AAAA;AAAA,IAGL,SAAS,QAAQ;AAAA,MACf;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAA6B,eAAe,OAAO,CAAC;AAAA;AAAA;AAAA,IACtD;AAAA,IACA,UAAU,IAAI;AAAA,IACd,SAAS,IAAI;AAAA,EACf;AACF;AAWA,IAAM,uBAAuB,CAC3B,SACA,eACW;AACX,MAAI,MAAM;AACV,aAAW,OAAO,WAAW,OAAO,GAAG;AACrC,UAAM,SAAS,IAAI;AACnB,UAAM,EAAE,MAAM,KAAK,IAAI,cAAc,MAAM;AAC3C,UAAM,MAAM,YAAY,MAAM;AAC9B,UAAM,WACJ,SAAS,UAAa,SAAS,IAAI,KAAK,OAAO,aAAa,GAAG;AAEjE,UAAM,EAAE,MAAM,OAAO,IAAI,cAAc,MAAM;AAC7C,UAAM,SAAS,SAAS,WAAY,MAAM,OAAO,WAAY;AAG7D,UAAM,SAAS;AAAA;AAAA;AAAA,EAAkC,IAAI,IAAI;AAAA;AACzD,UAAM,KAAK,IAAI,QAAQ,MAAM;AAC7B,QAAI,OAAO,GAAI;AAGf,UAAM,OAAO,KAAK,OAAO;AACzB,UAAM,YAAY,KAAK;AAAA,MACrB,GAAG,CAAC,cAAc,aAAa,EAC5B,IAAI,CAACE,OAAM,IAAI,QAAQA,IAAG,IAAI,CAAC,EAC/B,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,IAC3B;AACA,QAAI,CAAC,OAAO,SAAS,SAAS,EAAG;AACjC,UACE,IAAI,MAAM,GAAG,SAAS,IACtB;AAAA;AAAA;AAAA;AAAA,EAAuB,QAAQ;AAAA;AAAA,EAAW,KAAK,KAC/C,IAAI,MAAM,SAAS;AAAA,EACvB;AACA,SAAO;AACT;","names":["z","v","m","p","k","v","u","a","x","y","angle","len","d","w","d","v","angle","x","y","p","pattern","scale","p","perp","a","angle","c","d","z","z","f","z","z","v","fn","x","z","v","k","d","c","z","z","d","normalizeName","p","pattern","normalizeName","pattern","v","z","a","a","a","a","angle","c","p","angle","c","v","z","p","d","v","x","p","a","ab","p","a","v","fn","v","p","c","f","a","m","w","p","d","v","_","z","z","k","v","len","textHeight","k","v","rest","d","rot","scale","a","w","z","z","z","v","z","def","p","d","m","p","p","v","toWorld","d","add","dist","dot","len","norm","scale","sub","angle","p","d","a","length","difference","intersection","union","Node","key","data","DEFAULT_COMPARE","a","b","splay","i","comparator","N","r","cmp","y","insert","t","node","split","v","left","right","merge","printRow","root","prefix","isTail","out","printNode","indent","Tree","x","current","compare","visitor","ctx","Q","done","low","high","fn","keys","values","index","d","successor","predecessor","toList","presort","size","sort","loadRecursive","mergedList","mergeLists","createList","sortedListToBST","n","newKey","newData","start","end","middle","head","p","list","l1","l2","p1","p2","pivot","j","tmp","f","u","c","u3","u","bc","ca","ab","u","abt","bct","cat","_8","_16","fin","fin2","ab","bc","_8","_8b","_16","_48","fin","epsilon","a","ab","x","y","z","v","cache","cmp","index","pt","nextPt","evt","v","p","x","y","union","difference","intersection","spec","v","d","p","z","v","z","a","v","z","d","index","index","x","w","k","a","c","a","m","w","x","wrapWords","p","c","u","d","polar","a","w","index","interval","f","u","m","v","y","p","u","c","a","v","w","inner","k","x","y","_","m","g","v","index","c","d","w","_","c","m","a","i","k","f","v","a","p","w","c","v","RAD2DEG","p","textStyleFor","m","angle","scale","x","y","d","v","a","u","c"]}
|